🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 无量纲化(缩放)

2. 缺失值处理

3. 类别特征编码

4. 离散化(分箱)

5. 生成多项式特征

6. 自定义转换

最佳实践与流程

总结


img

Sklearn 中的数据预处理是机器学习流程中至关重要的一步,它通过一系列技术将原始数据转换为更适合模型训练的形式,从而提升模型的性能、收敛速度和可解释性。

以下是 sklearn.preprocessing 模块中常用的数据预处理方法、适用场景及代码示例。

1. 无量纲化(缩放)

无量纲化旨在消除特征之间的量纲差异,使不同规格的数据转换到同一规格。

  • ​标准化 (Standardization)​​ 📏

    • ​原理​​:将数据转换为均值为0,标准差为1的标准正态分布。计算公式为:x_scaled = (x - mean) / std
    • ​适用场景​​:适用于许多机器学习算法(如SVM、逻辑回归、线性回归等),尤其是那些假设数据服从正态分布或基于梯度优化的模型。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import StandardScaler
      import numpy as np
      
      X = np.array([[1, 2], [3, 4], [5, 6]])
      scaler = StandardScaler()
      X_scaled = scaler.fit_transform(X)
      使用 StandardScaler 类的好处在于可以保存训练集的参数(均值、标准差),然后直接用于转换测试集数据,确保处理方式一致。
  • ​归一化 (Normalization)​​ 🔢

    • ​原理​​:将数据缩放到一个指定的最小值和最大值之间(通常是[0, 1])。计算公式为:x_scaled = (x - min) / (max - min)
    • ​适用场景​​:当需要将特征值限制在特定范围内时(如图像处理中的像素值),或者数据的标准差非常小、含有大量零值时(稀疏数据)。对于使用距离度量的算法(如KNN、K-Means)有好处。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import MinMaxScaler
      
      scaler = MinMaxScaler(feature_range=(0, 1)) # 也可以指定其他范围,如[0, 1]
      X_scaled = scaler.fit_transform(X)
  • ​最大绝对值缩放 (MaxAbsScaler)​​ ⚖️

    • ​原理​​:将每个特征按其最大绝对值的比例进行缩放,因此数据会落在 [-1, 1] 的范围内。
    • ​适用场景​​:适用于已经中心化过的数据或稀疏数据。
  • ​鲁棒缩放 (RobustScaler)​​ 🛡️

    • ​原理​​:使用中位数和四分位数(IQR)进行缩放,对异常值不敏感。
    • ​适用场景​​:当数据中包含异常值时,鲁棒缩放通常能提供更好的结果。

2. 缺失值处理

现实世界的数据集常常包含缺失值,需要进行处理。

  • ​SimpleImputer​​ 🧩
    • ​策略​​:可以使用均值(mean)、中位数(median)、众数(most_frequent)或常量(constant)来填充缺失值。
    • ​Sklearn 实现​​:
      from sklearn.impute import SimpleImputer
      import numpy as np
      
      X = np.array([[1, 2], [np.nan, 3], [7, 6]])
      imp = SimpleImputer(strategy='mean')
      X_imputed = imp.fit_transform(X)

3. 类别特征编码

机器学习模型无法直接处理类别型(文字)数据,需要将其转换为数值型。

  • ​标签编码 (LabelEncoder)​​ 🏷️

    • ​原理​​:为每个类别分配一个唯一的整数。
    • ​注意​​:可能会给模型带来“类别间有大小顺序”的误解,适用于有序分类变量或树模型。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import LabelEncoder
      
      y = ['cat', 'dog', 'fish', 'dog']
      le = LabelEncoder()
      y_encoded = le.fit_transform(y) # 输出: array([0, 1, 2, 1])
  • ​独热编码 (OneHotEncoder)​​ 🔥

    • ​原理​​:为每个类别创建一个新的二进制特征(0/1)。
    • ​适用场景​​:适用于名义分类变量(无内在顺序),是最常用的处理分类特征的方法。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import OneHotEncoder
      
      X = [['cat'], ['dog'], ['fish'], ['dog']]
      ohe = OneHotEncoder(sparse_output=False) # sparse_output=False 得到密集数组
      X_encoded = ohe.fit_transform(X)
      Pandas 中也提供了简便的 get_dummies 方法进行独热编码。

4. 离散化(分箱)

将连续特征划分为离散的区间(箱子),有时能更好地捕捉非线性关系或减少异常值影响。

  • ​KBinsDiscretizer​​ 📦
    • ​策略​​:可以按等宽(uniform)、等频(quantile)或聚类(kmeans)方式进行分箱。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import KBinsDiscretizer
      
      X = np.array([[1.2], [3.4], [5.6], [7.8], [9.0]])
      est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
      X_binned = est.fit_transform(X)

5. 生成多项式特征

通过创建原始特征的高阶项和交互项,来增加模型的复杂度,以捕捉特征间的非线性关系。

  • ​PolynomialFeatures​​ ➕✖️
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import PolynomialFeatures
      
      X = np.arange(6).reshape(3, 2)
      poly = PolynomialFeatures(degree=2, include_bias=False)
      X_poly = poly.fit_transform(X)
      # 原始特征 [a, b] 会变为 [a, b, a^2, ab, b^2]

6. 自定义转换

有时你需要根据业务逻辑进行特定的数据转换。

  • ​FunctionTransformer​​ 🔧
    • ​原理​​:将用户自定义的函数(如对数变换、平方根变换等)包装成一个转换器,以便融入Sklearn的流水线(Pipeline)。
    • ​Sklearn 实现​​:
      from sklearn.preprocessing import FunctionTransformer
      import numpy as np
      
      transformer = FunctionTransformer(np.log1p) # 使用 log(1+x) 转换
      X_transformed = transformer.fit_transform(X)

最佳实践与流程

  1. ​始终先划分训练集和测试集​​:在进行任何拟合(fit)操作之前,首先使用 train_test_split 将数据划分为训练集和测试集。所有预处理参数(如 StandardScaler 的均值、标准差,SimpleImputer 的填充值,OneHotEncoder 的类别等)都应​​仅从训练集中学习(fit)​​,然后​​同时应用于(transform)训练集和测试集​​。这样可以避免数据泄露(Data Leakage),确保模型评估的公正性。

    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, random_state=42)
    # 在 X_train 上 fit, 然后 transform X_train 和 X_test
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test) # 注意这里只用 transform,不要 fit_transform
  2. ​使用 Pipeline​​:Sklearn 的 Pipeline 可以将多个预处理步骤和一个最终的估计器(模型)串联起来。这极大地简化了代码,确保了流程的一致性,并避免了在交叉验证或调参时发生数据泄露。

    from sklearn.pipeline import Pipeline
    from sklearn.impute import SimpleImputer
    from sklearn.preprocessing import StandardScaler, OneHotEncoder
    from sklearn.compose import ColumnTransformer
    from sklearn.linear_model import LogisticRegression
    
    # 定义数值型特征的预处理步骤
    numeric_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='median')),
        ('scaler', StandardScaler())
    ])
    
    # 定义分类型特征的预处理步骤
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder(handle_unknown='ignore'))
    ])
    
    # 将不同的预处理步骤应用到不同的特征类型上
    preprocessor = ColumnTransformer(
        transformers=[
            ('num', numeric_transformer, numeric_features),
            ('cat', categorical_transformer, categorical_features)
        ])
    
    # 创建一个包含预处理和最终模型的完整流水线
    clf = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('classifier', LogisticRegression())
    ])
    
    # 现在可以直接用这个流水线进行训练和预测
    clf.fit(X_train, y_train)
    clf.score(X_test, y_test)

总结

选择何种预处理方法取决于你的数据特性和将要使用的模型。标准化和独热编码是非常通用和常用的起点。始终通过交叉验证等方法来评估预处理策略是否真正提升了模型的性能。

记住,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。因此,投入时间进行有效的数据预处理是非常值得的。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐