preprocessingScikit-learn 库中的一个 数据预处理模块,提供了许多数据转换工具,主要用于标准化、归一化、编码和特征工程等任务。数据预处理对于机器学习来说非常重要,因为原始数据可能存在不同的尺度、不均衡的分布或类别特征,需要进行转换以提高模型的效果。


1. 主要功能

(1) 数据标准化(Standardization)

方法:StandardScaler()

  • 作用:将数据转换为均值为 0,标准差为 1 的标准正态分布。
  • 适用场景:适用于 大多数机器学习模型,特别是基于梯度下降的算法(如线性回归、逻辑回归、SVM、神经网络等)。

示例

from sklearn.preprocessing import StandardScaler
import numpy as np

# 创建数据
data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])

# 初始化 StandardScaler
scaler = StandardScaler()

# 进行标准化
data_scaled = scaler.fit_transform(data)

print(data_scaled)

标准化公式

  • image-20250306170850467

(2) 数据归一化(Normalization)

方法:MinMaxScaler()

  • 作用:将数据缩放到 指定范围(默认是 [0,1])。
  • 适用场景:适用于 深度学习、KNN、SVM 等对数据范围敏感的模型。

示例

from sklearn.preprocessing import MinMaxScaler

# 初始化 MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))

# 归一化数据
data_normalized = scaler.fit_transform(data)

print(data_normalized)

归一化公式

  • image-20250306170910143

(3) 归一化处理(Normalization for Samples)

方法:normalize()

  • 作用:按 归一化,使每个样本的 L2 范数(欧几里得长度) 变为 1。
  • 适用场景:用于文本处理(如 TF-IDF)、KNN、深度学习等。

示例

from sklearn.preprocessing import normalize

# 进行归一化
data_l2_normalized = normalize(data, norm='l2')

print(data_l2_normalized)

L2 归一化公式

image-20250306170823763


(4) 独热编码(One-Hot Encoding)

方法:OneHotEncoder()

  • 作用:将分类变量转换为 独热编码(One-Hot Encoding)。
  • 适用场景:适用于类别型数据(如性别、城市、职业等)。

示例

from sklearn.preprocessing import OneHotEncoder

# 创建类别数据
categories = np.array([["red"], ["green"], ["blue"], ["red"]])

# 初始化 OneHotEncoder
encoder = OneHotEncoder(sparse=False)

# 进行独热编码
encoded_categories = encoder.fit_transform(categories)

print(encoded_categories)

输出:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]]

(5) 标签编码(Label Encoding)

方法:LabelEncoder()

  • 作用:将类别变量转换为整数索引(0, 1, 2...)。
  • 适用场景:适用于类别变量,但一般只用于有序类别,否则可能导致模型误解类别间的关系。

示例

from sklearn.preprocessing import LabelEncoder

# 创建类别数据
labels = np.array(["red", "green", "blue", "red"])

# 初始化 LabelEncoder
encoder = LabelEncoder()

# 进行标签编码
encoded_labels = encoder.fit_transform(labels)

print(encoded_labels)

输出:

[2 1 0 2]

注意:

  • LabelEncoder 将类别变量 按照字母顺序 转换为数值,如 blue -> 0, green -> 1, red -> 2
  • 如果类别是无序的(如“城市名”),请使用 OneHotEncoder() 而不是 LabelEncoder()

(6) 生成多项式特征

方法:PolynomialFeatures(degree=n)

  • 作用:生成 多项式特征,用于非线性回归特征交互
  • 适用场景:用于线性模型扩展到非线性场景

示例

from sklearn.preprocessing import PolynomialFeatures

# 创建示例数据
X = np.array([[2, 3]])

# 初始化 PolynomialFeatures,degree=2
poly = PolynomialFeatures(degree=2)

# 进行特征扩展
X_poly = poly.fit_transform(X)

print(X_poly)

输出:

[[1. 2. 3. 4. 6. 9.]]

解释:

  • X = [[2, 3]]
  • 生成的新特征:
    • 1(常数项)
    • 2(原始特征 1)
    • 3(原始特征 2)
    • 42^2
    • 62*3
    • 93^2

2. 预处理的选用建议

任务 推荐方法 适用场景
归一化(Normalization) MinMaxScaler() 适用于深度学习、KNN、SVM
标准化(Standardization) StandardScaler() 适用于线性回归、SVM、神经网络
归一化处理(L2 范数) normalize() 文本处理、KNN、推荐系统
独热编码(One-Hot Encoding) OneHotEncoder() 类别变量(无序)
标签编码(Label Encoding) LabelEncoder() 类别变量(有序)
多项式特征扩展 PolynomialFeatures() 非线性回归

3. 总结

  • preprocessing 模块主要用于数据标准化、归一化、编码、特征工程等任务。
  • StandardScaler() 适用于大多数机器学习算法(如线性回归、SVM)。
  • MinMaxScaler() 适用于神经网络、KNN对数值范围敏感的模型。
  • OneHotEncoder() 适用于类别变量(无序)LabelEncoder() 适用于类别变量(有序)
  • PolynomialFeatures() 用于生成多项式特征,扩展线性模型的能力