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

特征工程是提升模型性能的关键步骤,主要包括特征标准化(消除量纲影响)和特征编码(处理类别数据)。以下使用sklearn完整实现流程:


一、特征标准化

目标:将数值特征缩放到统一量纲

  1. Z-score标准化(均值为0,方差为1)
    公式:$$ z = \frac{x - \mu}{\sigma} $$

    from sklearn.preprocessing import StandardScaler
    
    # 示例数据
    X = [[10, 2.5], [5, 1.8], [15, 3.0]]
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)  # 输出标准化后的数组
    

  2. Min-Max归一化(缩放到[0,1]区间)
    公式:$$ x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}} $$

    from sklearn.preprocessing import MinMaxScaler
    
    minmax_scaler = MinMaxScaler()
    X_minmax = minmax_scaler.fit_transform(X)  # 输出归一化后的数组
    


二、特征编码

目标:将类别特征转换为数值形式

  1. 独热编码(One-Hot Encoding)
    适用场景:无序类别特征(如颜色、城市)

    from sklearn.preprocessing import OneHotEncoder
    
    # 示例数据
    colors = [['红'], ['蓝'], ['绿'], ['红']]
    
    encoder = OneHotEncoder(sparse_output=False)
    colors_encoded = encoder.fit_transform(colors)  # 输出如[[1,0,0],[0,1,0],[0,0,1],[1,0,0]]
    

  2. 标签编码(Label Encoding)
    适用场景:有序类别特征(如学历等级:小学、中学、大学)

    from sklearn.preprocessing import LabelEncoder
    
    education = ['小学', '大学', '中学', '大学']
    
    le = LabelEncoder()
    education_encoded = le.fit_transform(education)  # 输出如[0,2,1,2]
    

  3. 有序编码(Ordinal Encoding)
    手动指定类别顺序(需配合OrdinalEncoder

    from sklearn.preprocessing import OrdinalEncoder
    
    size = [['S'], ['L'], ['M'], ['S']]
    categories = [['S', 'M', 'L']]  # 显式定义顺序
    
    ordinal_encoder = OrdinalEncoder(categories=categories)
    size_encoded = ordinal_encoder.fit_transform(size)  # 输出[[0],[2],[1],[0]]
    


三、完整流程示例
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# 创建示例数据集
data = pd.DataFrame({
    'age': [25, 40, 30],
    'income': [50000, 80000, 60000],
    'city': ['北京', '上海', '广州']
})

# 定义转换器:数值列标准化 + 类别列独热编码
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), ['age', 'income']),
        ('cat', OneHotEncoder(), ['city'])
    ])

# 执行转换
X_transformed = preprocessor.fit_transform(data)
print(X_transformed)

关键说明

  • 标准化优先选择StandardScaler(对异常值敏感时用RobustScaler
  • 无序类别数据必须用独热编码避免引入虚假顺序
  • 使用ColumnTransformer可对不同列应用不同转换

通过标准化和编码,特征满足$ \text{同分布} $要求,显著提升线性模型、距离度量模型(如KNN、SVM)的性能。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐