人工智能-python-Sklearn 数据加载与处理实战

发布于:2025-08-08 ⋅ 阅读:(14) ⋅ 点赞:(0)


1. 数据加载(Loading Datasets)

🎯 为什么要掌握这些技能?

  • 数据质量决定模型上限:90%的机器学习时间花在数据预处理上
  • 避免「垃圾进垃圾出」:脏数据会导致模型失效
  • 适配算法需求:不同算法对数据格式有特定要求
  • 提升模型泛化力:规范处理让模型更适应新数据

如何做到?

sklearn 中,加载数据集的工具非常多。可以通过 sklearn.datasets 加载公开数据集,或者通过自定义文件加载本地数据。

代码实现:

1.1 从网络加载数据集

场景 :快速获取基准测试数据
API优势:自动缓存避免重复下载

sklearn 提供了许多常用的公开数据集,可以通过 fetch_* 方法来下载。

from sklearn.datasets import fetch_20newsgroups

# 加载新闻组数据集(网络)
news = fetch_20newsgroups(subset='all')
print(f"数据集大小: {len(news.data)}")
1.2 从本地加载数据集

如果你有本地的 CSV、Excel 文件等数据,可以用 pandas 读取数据,再转换成适合的格式。

import pandas as pd

# 从本地 CSV 文件加载数据
df = pd.read_csv('your_data.csv')
print(df.head())
1.3 加载自己的文件

场景:处理业务专属数据
技巧:搭配pandas预处理更高效

你还可以通过 sklearn 提供的 load_svmlight_file 等方法来加载格式特定的数据。

from sklearn.datasets import load_svmlight_file

# 加载svm-light格式的数据
X, y = load_svmlight_file("your_data.svm")

2. 数据集的划分(Train-Test Split)

处理方式 解决痛点 典型场景
简单划分 基础验证需求 小样本快速验证
分层划分 保持类别比例一致 分类不平衡数据集
时间序列划分 避免未来信息泄露 股价预测

为什么要划分数据集?

在机器学习中,通常将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。这样做是为了防止模型的过拟合,保证其泛化能力。

如何做到?

使用 train_test_split 函数将数据集划分为训练集和测试集。可以指定划分比例,例如 80% 用于训练,20% 用于测试。

代码实现:

from sklearn.model_selection import train_test_split

# 划分数据集,80% 训练集,20% 测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('target', axis=1), df['target'], test_size=0.2, random_state=42)
print(f"训练集大小: {len(X_train)}, 测试集大小: {len(X_test)}")

3. 特征工程(Feature Engineering)

为什么要做特征工程?

特征工程是机器学习中至关重要的一步。通过适当的特征提取和转换,可以极大提升模型的性能。常见的特征包括数字型特征、类别型特征、文本特征等。(将非数值特征转为算法可识别的矩阵

如何做到?

  • 字典特征:通过将类别数据转换为数字编码。
  • 文本特征:使用 TfidfVectorizer 将文本转换为向量。
  • 中文文本特征:需要做中文分词,然后进行 TF-IDF 转换。

3.1 字典特征处理

对于类别型变量,可以使用 LabelEncoderOneHotEncoder 进行编码。

from sklearn.preprocessing import LabelEncoder

# 假设 'category' 是一个分类变量
label_encoder = LabelEncoder()
df['category_encoded'] = label_encoder.fit_transform(df['category'])

3.2 文本特征提取

使用 TfidfVectorizer 将文本数据转换为数值特征。

from sklearn.feature_extraction.text import TfidfVectorizer

# 假设新闻数据存在 'data' 列中
vectorizer = TfidfVectorizer(stop_words='english')
X_tfidf = vectorizer.fit_transform(news.data)
print(f"TF-IDF 特征矩阵大小: {X_tfidf.shape}")

3.3 中文文本特征提取

中文文本处理需要使用分词工具,常见的有 jieba。然后,使用 TfidfVectorizer 来进行转换。

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

# 中文文本分词函数
def chinese_tokenizer(text):
    return list(jieba.cut(text))

# 假设中文数据存储在 'data' 列
vectorizer = TfidfVectorizer(tokenizer=chinese_tokenizer, stop_words=None)
X_chinese_tfidf = vectorizer.fit_transform(df['data'])
print(f"中文TF-IDF特征矩阵大小: {X_chinese_tfidf.shape}")

3.4TF-IDF文本加权

为什么用:降低高频但无意义词的权重

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['This is first document', 'This document is second']
tfidf = TfidfVectorizer(norm='l2')  # 使用L2归一化
X = tfidf.fit_transform(corpus)
print(tfidf.idf_)  # 查看各词的逆文档频率

4. 无量纲化处理(Scaling)

为什么要进行无量纲化?

无量纲化(标准化、归一化)可以使得不同尺度的特征有相同的权重,避免某些大尺度特征在模型训练时占据主导地位,影响模型的学习效果。标准化是指将数据转换为均值为 0、标准差为 1 的形式。

无量纲化选择指南

方法 受异常值影响 输出范围 适用算法
StandardScaler (-∞, +∞) SVM, 线性回归
MinMaxScaler [min, max] 神经网络, KNN
RobustScaler 近似(-∞, +∞) 含异常值的数据

如何做到?

可以使用 StandardScalerMinMaxScaler 进行标准化或归一化处理。

4.1 标准化

适用场景:数据服从正态分布时
标准化使得特征均值为 0,标准差为 1。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
print(f"标准化后的数据: {X_scaled[:5]}")

4.2 归一化

归一化是将数据按比例缩放到 [0, 1] 区间。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X_train)
print(f"归一化后的数据: {X_normalized[:5]}")

5. 总结

结果导向

通过 sklearn 提供的工具,我们可以轻松完成数据加载、划分、特征提取和无量纲化处理。这些操作在机器学习过程中至关重要,帮助我们将原始数据转换为模型可以处理的形式,提升模型的性能。

通过本文的介绍,你应该能够:

  • 从不同来源加载数据集;
  • 使用 train_test_split 划分训练集和测试集;
  • 对文本数据进行 TF-IDF 特征提取;
  • 对特征进行标准化和归一化处理,为模型训练做好准备。

6. 完整代码示例

最后,可以提供一段完整的代码,整合所有步骤,作为总结:

from sklearn.datasets import fetch_20newsgroups
from sklearn.decomposition import PCA
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 加载数据
news = fetch_20newsgroups(subset='all')
vectorizer = TfidfVectorizer(stop_words='english')
X_tfidf = vectorizer.fit_transform(news.data)

# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X_tfidf, news.target, test_size=0.2, random_state=42)

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)

# PCA降维
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X_scaled)

print(f"降维后的数据形状: {X_pca.shape}")

这样,你就完成了数据加载、划分、特征提取和无量纲化处理的全过程,并且解释了每个步骤为什么要做、如何做以及结果如何。


网站公告

今日签到

点亮在社区的每一天
去签到