17.1 Scikit-learn 与数据处理库协同
Scikit-learn 与 NumPy/Pandas/scipy.sparse 协同:从数据预处理到稀疏数据实战指南
本教程章节详细讲解如何使用NumPy、Pandas进行数据预处理和特征构造,并结合Scikit-learn。同时介绍scipy.sparse处理稀疏数据,如文本和高维数据集,适合机器学习新手入门。
Scikit-learn 与数据处理库协同:数据预处理与特征构造基础
介绍
在机器学习项目中,高质量的数据处理是关键第一步。Scikit-learn 本身专注于模型训练,但它可以与强大的数据处理库如 NumPy、Pandas 和 scipy.sparse 无缝协同工作。本章将带你入门这些库的基础,让你轻松为 Scikit-learn 模型准备数据。
1. NumPy 与 Pandas:数据预处理与特征构造基础
NumPy 的角色
NumPy 是 Python 中用于数值计算的核心库。它提供高效的数组操作,适合处理数值型数据。在 Scikit-learn 中,许多估计器(如分类器、回归器)直接接受 NumPy 数组作为输入。
- 基础操作:使用 NumPy 进行数据清洗,如处理缺失值(例如用平均值填充)。
import numpy as np data = np.array([1, 2, np.nan, 4]) data = np.nan_to_num(data, nan=np.mean(data[~np.isnan(data)])) # 用非NaN均值填充
Pandas 的角色
Pandas 提供数据框(DataFrame)结构,便于处理表格数据,特别适合数据预处理和特征工程。
-
数据加载与探索:使用
pd.read_csv()加载数据,用.head()查看前几行。 -
特征构造:从现有列创建新特征。例如,从日期列提取年份、月份。
import pandas as pd df = pd.DataFrame({'date': ['2023-01-01', '2023-02-01']}) df['year'] = pd.to_datetime(df['date']).dt.year # 构造年份特征 -
与 Scikit-learn 集成:将处理好的 Pandas 数据框转换为 NumPy 数组,或直接使用
.values属性。X = df.drop('target_column', axis=1).values # 转换为NumPy数组 y = df['target_column'].values from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
2. 稀疏数据处理:scipy.sparse 与 Scikit-learn 兼容
什么是稀疏数据?
稀疏数据指大部分元素为零的数据集,常见于文本数据(如词袋模型)或高维特征空间(如基因数据)。使用稀疏表示可以节省内存并加速计算。
scipy.sparse 简介
scipy.sparse 模块提供稀疏矩阵结构,与 Scikit-learn 高度兼容。Scikit-learn 的许多算法(如线性模型、聚类)支持稀疏输入。
应用示例:文本数据处理
文本数据通常以稀疏形式存储,使用 Scikit-learn 的 CountVectorizer 或 TfidfVectorizer。
-
向量化文本:将文本转换为数值特征矩阵。
from sklearn.feature_extraction.text import TfidfVectorizer corpus = ['This is a document.', 'Another document here.'] vectorizer = TfidfVectorizer() X_sparse = vectorizer.fit_transform(corpus) # 输出为稀疏矩阵 -
与 Scikit-learn 模型结合:直接传入稀疏矩阵。
from sklearn.svm import LinearSVC y = [0, 1] # 假设标签 model = LinearSVC() model.fit(X_sparse, y) # 稀疏矩阵适用于线性模型
稀疏数据的优势
- 高效性:减少内存使用和计算时间。
- 适用场景:文本分类、推荐系统等高维数据应用。
3. 完整实战流程
结合所有库,演示一个简单流程:
- 使用 Pandas 加载和预处理数据。
- 构造特征并转换为 NumPy 数组。
- 如果有稀疏需求(如文本),使用 scipy.sparse。
- 用 Scikit-learn 训练和评估模型。
示例代码片段:
import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 步骤1:数据加载与预处理
url = 'https://example.com/data.csv' # 假设数据源
df = pd.read_csv(url)
df = df.dropna() # 简单缺失值处理
# 步骤2:特征构造
if 'date' in df.columns:
df['year'] = pd.to_datetime(df['date']).dt.year
# 步骤3:准备输入
X = df.drop('target', axis=1).values
if X.shape[1] > 1000: # 假设高维数据,转换为稀疏
X = csr_matrix(X)
y = df['target'].values
# 步骤4:模型训练
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
print(f'模型准确率: {score}')
总结
通过协同使用 NumPy、Pandas 和 scipy.sparse,你可以高效地为 Scikit-learn 准备数据,覆盖从基本预处理到复杂稀疏处理的需求。掌握这些基础,将为你的机器学习项目打下坚实基础。下一章,我们将深入探讨更高级的特征工程技巧。