机器学习特征工程全流程详解

特征工程是提升模型性能的关键步骤,主要包括缺失值填充、归一化和特征筛选三个核心环节。以下为完整流程及实践方法:


一、缺失值填充

目的:解决数据不完整问题,避免模型训练偏差
常用方法

  1. 统计量填充(适合数值特征)

    • 均值填充:$x_{\text{fill}} = \bar{x}$
    • 中位数填充:$x_{\text{fill}} = \text{median}(x)$(抗离群点干扰)
    from sklearn.impute import SimpleImputer
    imputer = SimpleImputer(strategy='median')  # 也可选 'mean' 或 'most_frequent'
    X_filled = imputer.fit_transform(X)
    

  2. 模型预测填充(适合复杂关系)

    • 使用KNN或随机森林预测缺失值
    from sklearn.experimental import enable_iterative_imputer
    from sklearn.impute import IterativeImputer
    imputer = IterativeImputer(random_state=0)
    X_filled = imputer.fit_transform(X)
    

  3. 业务逻辑填充

    • 例如用"未知"类别填充分类特征缺失值

注意事项

  • 连续型特征优先用中位数,分类特征用众数
  • 缺失率超过80%的特征建议直接删除

二、归一化/标准化

目的:消除特征量纲差异,加速模型收敛
核心方法

  1. Min-Max归一化(将特征缩放到[0,1])
    $$x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$$

    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    X_scaled = scaler.fit_transform(X)
    

  2. Z-Score标准化(适用于高斯分布特征)
    $$x_{\text{std}} = \frac{x - \mu}{\sigma}$$

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    

  3. 鲁棒标准化(抗离群点干扰)
    $$x_{\text{robust}} = \frac{x - \text{median}(x)}{\text{IQR}(x)}$$

    from sklearn.preprocessing import RobustScaler
    scaler = RobustScaler()
    X_scaled = scaler.fit_transform(X)
    

选择原则

  • 神经网络/SVM优先用Min-Max
  • 线性回归/逻辑回归优先用Z-Score
  • 数据含离群点时用鲁棒标准化

三、特征筛选

目的:降低维度、减少噪声、提升泛化能力
核心方法

  1. 过滤法(基于统计指标)

    • 方差阈值:删除低方差特征
      from sklearn.feature_selection import VarianceThreshold
      selector = VarianceThreshold(threshold=0.1)
      X_selected = selector.fit_transform(X)
      

    • 相关系数:保留与目标相关性强的特征
      $$\rho_{x,y} = \frac{\text{cov}(x,y)}{\sigma_x \sigma_y}$$
  2. 包裹法(基于模型性能)

    • 递归特征消除(RFE)
      from sklearn.feature_selection import RFE
      from sklearn.linear_model import LogisticRegression
      selector = RFE(LogisticRegression(), n_features_to_select=10)
      X_selected = selector.fit_transform(X, y)
      

  3. 嵌入法(模型内置选择)

    • L1正则化(Lasso)
      $$\min_w \left( \frac{1}{2n} |y - Xw|^2_2 + \alpha |w|_1 \right)$$
    • 树模型特征重要性
      from sklearn.ensemble import RandomForestClassifier
      model = RandomForestClassifier()
      model.fit(X, y)
      importance = model.feature_importances_
      

筛选流程

  1. 先用过滤法快速剔除无关特征
  2. 再用包裹法/嵌入法精细化选择
  3. 最终通过交叉验证确认效果

四、全流程示例
# 完整特征工程流程
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

# 定义预处理步骤
preprocessor = ColumnTransformer(
    transformers=[
        ('num', Pipeline(steps=[
            ('imputer', SimpleImputer(strategy='median')),
            ('scaler', StandardScaler())
        ]), numerical_features),
        ('cat', Pipeline(steps=[
            ('imputer', SimpleImputer(strategy='most_frequent')),
            ('encoder', OneHotEncoder())
        ]), categorical_features)
    ])

# 加入特征筛选
full_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('feature_selector', SelectFromModel(RandomForestClassifier()))
])

# 执行全流程
X_processed = full_pipeline.fit_transform(X, y)

关键建议

  1. 缺失值填充→归一化→特征筛选需严格按序执行
  2. 每次处理后验证特征分布变化
  3. 树模型(如XGBoost)对归一化不敏感,但线性模型必需
  4. 特征筛选后需重新评估模型性能
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐