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 常见问题与解决方案

18.1 数据层面优化

Scikit-learn数据优化实战:稀疏矩阵、采样与数据类型转换

Scikit-learn 中文教程

本章详细讲解Scikit-learn中的数据层面优化方法,包括利用scipy.sparse处理稀疏数据以减少内存和提升速度,随机采样和分层采样处理大数据集,以及float32替代float64优化数据类型,帮助新人快速掌握实战技巧。

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

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

了解更多

Scikit-learn数据层面优化指南:提升模型效率

在机器学习项目中,数据预处理是至关重要的一环。通过优化数据,我们可以减少内存占用、提升计算速度,并处理大规模数据集。本章将介绍三种常见的数据优化技术:稀疏数据利用、数据采样和数据类型优化,并提供简单易懂的示例,帮助新人快速上手。

1. 稀疏数据利用:使用scipy.sparse

什么是稀疏数据?

稀疏数据指的是数据集中大部分值为零或缺失的情况,例如文本数据的词袋表示。在内存中存储所有零值会浪费资源。scipy.sparse模块提供稀疏矩阵数据结构,只存储非零元素,从而显著减少内存占用。

为什么使用scipy.sparse

  • 减少内存占用:只存储非零值,适合大规模稀疏数据集。
  • 提升运算速度:优化矩阵操作,在Scikit-learn中许多算法天然支持稀疏矩阵。

在Scikit-learn中实现

Scikit-learn与scipy.sparse无缝集成。例如,使用TF-IDF向量化时,会生成稀疏矩阵。

代码示例:创建和操作稀疏矩阵

import numpy as np
from scipy.sparse import csr_matrix
from sklearn.datasets import make_classification

# 创建一个稀疏数据集
X, y = make_classification(n_samples=100, n_features=1000, n_informative=50, random_state=42)
# 将数据转换为稀疏矩阵
X_sparse = csr_matrix(X)

# 检查内存占用
print(f"原始数据大小: {X.nbytes} 字节")
print(f"稀疏矩阵大小: {X_sparse.data.nbytes} 字节")  # 只计算非零部分

# 在Scikit-learn中使用稀疏矩阵训练模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_sparse, y)  # 稀疏矩阵可以直接使用

注意事项

  • 确保算法支持稀疏矩阵(Scikit-learn文档中有标注)。
  • 对于密集操作,稀疏矩阵可能不如普通数组快,但整体优化效果好。

2. 数据采样:处理超大数据集

当数据集过大时,直接处理可能导致内存不足或训练时间过长。采样是一种有效策略。

随机采样

随机采样从数据集中随机选择一部分样本,适用于平衡数据集。

分层采样

分层采样在采样时保持类别比例,适用于分类任务中的类别不平衡。

在Scikit-learn中实现采样

使用train_test_split函数可以轻松实现采样。

代码示例:随机采样和分层采样

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

# 生成一个大数据集示例
X, y = make_classification(n_samples=100000, n_features=20, random_state=42)

# 随机采样:选择10%的数据
X_sampled, _, y_sampled, _ = train_test_split(X, y, test_size=0.9, random_state=42)
print(f"采样后样本数: {len(X_sampled)}")

# 分层采样:保持类别比例
X_stratified, _, y_stratified, _ = train_test_split(X, y, test_size=0.9, stratify=y, random_state=42)
print(f"分层采样后类别分布: {np.bincount(y_stratified)}")

最佳实践

  • 对于分类问题,优先使用分层采样以避免偏差。
  • 采样比例根据数据集大小和计算资源调整。

3. 数据类型优化:使用float32替代float64

默认情况下,Scikit-learn使用float64(双精度浮点数)进行计算,但内存占用较高。float32(单精度浮点数)可以减少一半内存,虽然精度略低,但在许多机器学习任务中影响不大。

为什么使用float32

  • 减少内存占用:例如,一个10000×100的矩阵,使用float32可节省约50%内存。
  • 提升计算速度:在某些硬件(如GPU)上,float32计算更快。

在Scikit-learn中实现数据类型转换

可以在加载数据后直接转换数据类型。

代码示例:转换数据集到float32

import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler

# 生成数据集
X, y = make_classification(n_samples=1000, n_features=100, random_state=42)

# 转换数据类型到float32
X_float32 = X.astype(np.float32)
print(f"float64内存: {X.nbytes} 字节")
print(f"float32内存: {X_float32.nbytes} 字节")

# 应用预处理和模型训练
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_float32)  # Scikit-learn支持float32

from sklearn.svm import SVC
model = SVC()
model.fit(X_scaled, y)

注意事项

  • 转换前检查数据范围,避免溢出或精度损失。
  • 某些算法可能需要float64,但多数Scikit-learn算法兼容float32

总结

通过本章学习,您应该掌握了Scikit-learn中数据优化的关键技巧:

  1. 利用稀疏矩阵处理稀疏数据,减少内存和提升速度。
  2. 使用采样策略(随机或分层)处理大数据集,平衡训练效率。
  3. 优化数据类型,使用float32减少内存占用,适用于大规模数据。

建议在实际项目中结合这些技术,根据数据特性和资源限制灵活应用,以提升模型训练和推理的效率。

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

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

获取工具包