Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

17.1 Scikit-learn 与数据处理库协同

Scikit-learn 与 NumPy/Pandas/scipy.sparse 协同:从数据预处理到稀疏数据实战指南

Scikit-learn 中文教程

本教程章节详细讲解如何使用NumPy、Pandas进行数据预处理和特征构造,并结合Scikit-learn。同时介绍scipy.sparse处理稀疏数据,如文本和高维数据集,适合机器学习新手入门。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

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 的 CountVectorizerTfidfVectorizer

  • 向量化文本:将文本转换为数值特征矩阵。

    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. 完整实战流程

结合所有库,演示一个简单流程:

  1. 使用 Pandas 加载和预处理数据
  2. 构造特征并转换为 NumPy 数组
  3. 如果有稀疏需求(如文本),使用 scipy.sparse
  4. 用 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 准备数据,覆盖从基本预处理到复杂稀疏处理的需求。掌握这些基础,将为你的机器学习项目打下坚实基础。下一章,我们将深入探讨更高级的特征工程技巧。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包