机器学习特征工程实战:缺失值处理与特征编码的标准化流程(附代码)
·
机器学习特征工程实战:缺失值处理与特征编码标准化流程
引言
特征工程是机器学习流程的核心环节,直接影响模型性能。其中缺失值处理和特征编码是最关键的预处理步骤。本文将详解标准化流程,并附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. 常用填充方法
-
数值型特征:
- 均值填充:$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i $$
- 中位数填充(抗异常值)
-
类别型特征:
- 众数填充:$$ \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. 数值型特征标准化
-
Z-score标准化: $$ z = \frac{x - \mu}{\sigma} $$
-
最大最小值缩放: $$ 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)
总结
标准化特征工程流程需遵循:
- 缺失值处理三部曲:识别 → 策略选择 → 填充/删除
- 特征编码双路径:
- 类别型:按特征性质选择编码方案
- 数值型:优先Z-score标准化
- 管道化实现:使用Scikit-learn的Pipeline确保可复现性
通过标准化处理,可使特征满足$$ \mathbb{E}[X]=0, \text{Var}[X]=1 $$的分布要求,显著提升模型收敛速度和泛化能力。
更多推荐
所有评论(0)