机器学习特征工程实战:缺失值处理与特征编码标准化流程

引言

特征工程是机器学习流程的核心环节,直接影响模型性能。其中缺失值处理特征编码是最关键的预处理步骤。本文将详解标准化流程,并附Python代码实现(基于Pandas和Scikit-learn)。


一、缺失值处理标准化流程
1. 缺失值识别
  • 计算缺失比例:$$ \text{缺失率} = \frac{\text{缺失值数量}}{\text{总样本数}} \times 100% $$
  • 可视化分析(使用Seaborn热力图)
import pandas as pd
import seaborn as sns

# 加载数据
data = pd.read_csv('dataset.csv')

# 计算缺失率
missing_ratio = data.isnull().mean() * 100
print("特征缺失率:\n", missing_ratio)

# 可视化
sns.heatmap(data.isnull(), cbar=False)

2. 处理策略选择
缺失率 处理方案 适用场景
< 5% 直接删除 样本量充足
5%-30% 填充处理 重要特征
> 30% 特征删除 高缺失特征
3. 常用填充方法
  1. 数值型特征

    • 均值填充:$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i $$
    • 中位数填充(抗异常值)
  2. 类别型特征

    • 众数填充:$$ \text{mode} = \arg\max_{x} \text{freq}(x) $$
    • 新增"缺失"类别
from sklearn.impute import SimpleImputer

# 数值特征:中位数填充
num_imputer = SimpleImputer(strategy='median')
data[['age','income']] = num_imputer.fit_transform(data[['age','income']])

# 类别特征:众数填充
cat_imputer = SimpleImputer(strategy='most_frequent')
data[['gender','city']] = cat_imputer.fit_transform(data[['gender','city']])


二、特征编码标准化流程
1. 类别型特征编码
方法 公式表示 适用场景
独热编码 $X \rightarrow {0,1}^k$ 无序特征(城市、颜色)
标签编码 $X \rightarrow {0,1,2,...,k}$ 有序特征(学历等级)
目标编码 $E[y|X=x_i]$ 高基数特征
from sklearn.preprocessing import OneHotEncoder, LabelEncoder

# 无序特征:独热编码
ohe = OneHotEncoder(sparse=False)
city_encoded = ohe.fit_transform(data[['city']])

# 有序特征:标签编码
le = LabelEncoder()
data['education'] = le.fit_transform(data['education'])

2. 数值型特征标准化
  1. Z-score标准化: $$ z = \frac{x - \mu}{\sigma} $$

  2. 最大最小值缩放: $$ x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}} $$

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# Z-score标准化
scaler = StandardScaler()
data[['age','income']] = scaler.fit_transform(data[['age','income']])

# 最大最小值缩放(0-1范围)
minmax = MinMaxScaler()
data[['height','weight']] = minmax.fit_transform(data[['height','weight']])


三、完整流程示例
# 完整特征工程管道
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

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

# 应用转换
processed_data = preprocessor.fit_transform(data)


总结

标准化特征工程流程需遵循:

  1. 缺失值处理三部曲:识别 → 策略选择 → 填充/删除
  2. 特征编码双路径
    • 类别型:按特征性质选择编码方案
    • 数值型:优先Z-score标准化
  3. 管道化实现:使用Scikit-learn的Pipeline确保可复现性

通过标准化处理,可使特征满足$$ \mathbb{E}[X]=0, \text{Var}[X]=1 $$的分布要求,显著提升模型收敛速度和泛化能力。

更多推荐