机器学习特征工程:特征标准化与编码实现

在机器学习中,特征工程是提升模型性能的关键步骤。以下是使用sklearn实现特征标准化和编码的完整指南,包含数学原理和代码示例。


一、特征标准化

标准化通过调整特征尺度,消除量纲影响。常见方法:

  1. Z-score 标准化
    数学原理:
    将特征转换为均值为0、标准差为1的分布:
    $$ z = \frac{x - \mu}{\sigma} $$
    其中 $\mu$ 为均值,$\sigma$ 为标准差。

    from sklearn.preprocessing import StandardScaler
    import numpy as np
    
    # 示例数据
    X = np.array([[30, 5000], [40, 8000], [25, 4000]])
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    print("标准化结果:\n", X_scaled)
    

  2. Min-Max 归一化
    数学原理:
    将特征缩放到 $[0,1]$ 区间:
    $$ x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}} $$

    from sklearn.preprocessing import MinMaxScaler
    
    scaler = MinMaxScaler()
    X_normalized = scaler.fit_transform(X)
    print("归一化结果:\n", X_normalized)
    


二、特征编码

编码将类别特征转换为数值形式,便于模型处理。

  1. 独热编码 (One-Hot Encoding)
    适用场景:无序类别特征(如颜色、城市)。
    原理:为每个类别创建二元特征列。

    from sklearn.preprocessing import OneHotEncoder
    
    # 示例数据
    colors = [['红'], ['蓝'], ['绿'], ['红']]
    
    encoder = OneHotEncoder(sparse_output=False)
    colors_encoded = encoder.fit_transform(colors)
    print("独热编码结果:\n", colors_encoded)
    

  2. 标签编码 (Label Encoding)
    适用场景:有序类别特征(如学历等级)。
    原理:为每个类别分配唯一整数:
    $ \text{高} \rightarrow 2, \text{中} \rightarrow 1, \text{低} \rightarrow 0 $

    from sklearn.preprocessing import LabelEncoder
    
    levels = ['高', '中', '低', '中', '高']
    encoder = LabelEncoder()
    levels_encoded = encoder.fit_transform(levels)
    print("标签编码结果:", levels_encoded)
    


三、完整流程示例

结合标准化与编码处理混合型数据:

import pandas as pd
from sklearn.compose import ColumnTransformer

# 创建示例数据
data = pd.DataFrame({
    '年龄': [30, 40, 25],
    '收入': [5000, 8000, 4000],
    '颜色': ['红', '蓝', '绿'],
    '等级': ['高', '中', '低']
})

# 定义转换器
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), ['年龄', '收入']),  # 数值列标准化
        ('cat', OneHotEncoder(), ['颜色'])            # 类别列独热编码
    ],
    remainder='passthrough'  # 保留未处理的列(如'等级')
)

# 应用转换
transformed_data = preprocessor.fit_transform(data)
print("最终特征矩阵:\n", transformed_data)

关键注意

  • 标准化需在拆分训练/测试集进行,避免数据泄露
  • 高基数类别特征(如邮编)优先用Target Encoding替代独热编码
  • 标签编码可能引入虚假顺序关系,需谨慎使用

通过标准化和编码,原始特征被转化为适合线性模型、树模型等算法的规范化输入,显著提升模型收敛速度和预测精度。

更多推荐