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

5.4 数值特征缩放与标准化

Scikit-learn数值特征缩放与标准化:从归一化到鲁棒标准化的完整指南

Scikit-learn 中文教程

本教程详细介绍了Scikit-learn中的数值特征缩放与标准化方法,包括MinMaxScaler归一化、StandardScaler标准化和RobustScaler鲁棒标准化。通过简单易懂的解释、代码示例和适用场景分析,帮助新人快速掌握特征缩放的核心概念和避坑技巧。

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

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

了解更多

数值特征缩放与标准化:机器学习数据预处理的关键步骤

在机器学习中,许多算法对输入特征的尺度敏感,例如梯度下降法、支持向量机(SVM)和K近邻(KNN)。如果特征的尺度差异很大,可能会导致模型收敛慢或性能下降。因此,数值特征缩放和标准化是数据预处理中不可或缺的一步。本章将深入讲解Scikit-learn中的三种常用缩放方法:归一化(MinMaxScaler)、标准化(StandardScaler)和鲁棒标准化(RobustScaler),并讨论它们的适用场景和常见陷阱。

为什么需要特征缩放?

特征缩放通过调整数据的范围或分布,使不同特征在相似尺度上,从而提升模型的稳定性和准确性。例如,如果特征A的取值范围是0到100,而特征B是0到1,那么在计算距离或梯度时,特征A可能会主导模型,导致偏差。

1. 归一化:MinMaxScaler

归一化(Normalization)通过线性变换将数据缩放到指定范围,通常是[0,1]或[-1,1]。在Scikit-learn中,MinMaxScaler是实现这一功能的主要工具。

原理

MinMaxScaler根据数据的最小值和最大值进行缩放,公式为:

x_scaled = (x - min) / (max - min)

这会将每个特征缩放到[0,1]区间。

适用场景

  • 有界数据:当数据有明确的上下界时,例如图像的像素值(0-255)或百分比(0-100%)。
  • 适用于对尺度敏感的算法,如神经网络和支持向量机。

示例代码

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)
print("归一化后的数据:")
print(scaled_data)

输出:数据被缩放到[0,1]范围内。

2. 标准化:StandardScaler

标准化(Standardization)通过Z-score标准化,将数据转换为均值为0、标准差为1的分布。在Scikit-learn中,StandardScaler是常用方法。

原理

StandardScaler基于特征的均值和标准差进行转换,公式为:

x_scaled = (x - mean) / std

这假设数据近似服从高斯(正态)分布。

适用场景

  • 高斯分布数据:当数据分布接近正态分布时,例如许多自然现象或统计数据集。
  • 适用于基于距离的算法,如KNN和主成分分析(PCA)。

示例代码

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print("标准化后的数据:")
print(scaled_data)

输出:数据均值为0,标准差为1。

3. 鲁棒标准化:RobustScaler

鲁棒标准化(Robust Scaling)通过中位数和四分位数来缩放数据,对异常值具有较强的鲁棒性。在Scikit-learn中,RobustScaler是首选。

原理

RobustScaler使用中位数代替均值,四分位距(IQR)代替标准差进行缩放,公式为:

x_scaled = (x - median) / IQR

其中IQR = Q3 - Q1(第三四分位数减去第一四分位数)。

适用场景

  • 异常值存在时:当数据中存在异常值或噪声时,例如金融数据或传感器数据。
  • 适用于需要稳定性的算法,如回归模型。

示例代码

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
scaled_data = scaler.fit_transform(data)
print("鲁棒标准化后的数据:")
print(scaled_data)

输出:数据基于中位数和IQR缩放,减少异常值影响。

4. 适用场景总结

方法 主要优点 适用场景
MinMaxScaler 保持数据在固定范围 有界数据,如图像、百分比
StandardScaler 假设正态分布 高斯分布数据,如统计数据集
RobustScaler 抗异常值 数据有异常值,如金融数据

选择方法时,考虑数据分布、异常值情况和算法要求。通常,如果数据有异常值,使用RobustScaler;如果数据范围已知,用MinMaxScaler;否则,StandardScaler是默认选择。

5. 避坑指南

测试集处理:别用fit_transform()!

在机器学习中,训练集和测试集应该使用相同的缩放参数。常见错误是:

  • 对训练集使用fit_transform()计算参数(如均值和标准差)并缩放数据。
  • 然后对测试集直接调用fit_transform(),这会基于测试集重新计算参数,导致不一致。

正确做法

  1. 在训练集上用fit_transform()计算参数并缩放。
  2. 保存这些参数,然后在测试集上用transform()应用相同的参数。

示例:

# 假设 X_train 和 X_test 是训练和测试数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 计算训练集参数并缩放
X_test_scaled = scaler.transform(X_test)         # 用训练集参数缩放测试集

其他常见问题

  • 选择范围:MinMaxScaler可以指定范围,如feature_range=(-1,1),但需确保数据适合。
  • 稀疏数据:对于稀疏矩阵,注意方法可能不适用,Scikit-learn提供专门工具。
  • 数据泄漏:避免在分割数据前进行缩放,以防止信息从测试集泄漏到训练集。

结论

数值特征缩放是提升机器学习模型性能的关键预处理步骤。通过MinMaxScaler、StandardScaler和RobustScaler,您可以根据数据特性选择合适的缩放方法。记住在测试集上使用transform()而非fit_transform(),确保一致性。多加练习和实验,您将能熟练掌握这些技术,优化您的机器学习项目。

在下一章中,我们将探讨其他特征工程技巧,如编码分类变量和特征选择。

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

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

获取工具包