人工智能-python-Sklearn 数据加载与处理实战
文章目录
- 1. 数据加载(Loading Datasets)
- 🎯 为什么要掌握这些技能?
- 如何做到?
- 代码实现:
- 1.1 从网络加载数据集
- 1.2 从本地加载数据集
- 1.3 加载自己的文件
- 2. 数据集的划分(Train-Test Split)
- 为什么要划分数据集?
- 如何做到?
- 代码实现:
- 3. 特征工程(Feature Engineering)
- 为什么要做特征工程?
- 如何做到?
- 3.1 字典特征处理
- 3.2 文本特征提取
- 3.3 中文文本特征提取
- 3.4TF-IDF文本加权
- 4. 无量纲化处理(Scaling)
- 为什么要进行无量纲化?
- 无量纲化选择指南
- 如何做到?
- 4.1 标准化
- 4.2 归一化
- 5. 总结
- 结果导向
- 6. 完整代码示例
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 字典特征处理
对于类别型变量,可以使用 LabelEncoder
或 OneHotEncoder
进行编码。
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 | 低 | 近似(-∞, +∞) | 含异常值的数据 |
如何做到?
可以使用 StandardScaler
或 MinMaxScaler
进行标准化或归一化处理。
4.1 标准化
适用场景:数据服从正态分布时
标准化使得特征均值为 0,标准差为 1。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
print(f"标准化后的数据: {X_scaled[:5]}")
4.2 归一化
归一化是将数据按比例缩放到 [0, 1] 区间。
from sklearn.preprocessing import MinMaxScalerscaler = 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}")
这样,你就完成了数据加载、划分、特征提取和无量纲化处理的全过程,并且解释了每个步骤为什么要做、如何做以及结果如何。