机器学习特征工程:缺失值填充、归一化与特征筛选全流程
·
机器学习特征工程全流程详解
特征工程是提升模型性能的关键步骤,主要包括缺失值填充、归一化和特征筛选三个核心环节。以下为完整流程及实践方法:
一、缺失值填充
目的:解决数据不完整问题,避免模型训练偏差
常用方法:
-
统计量填充(适合数值特征)
- 均值填充:$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) -
模型预测填充(适合复杂关系)
- 使用KNN或随机森林预测缺失值
from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer(random_state=0) X_filled = imputer.fit_transform(X) -
业务逻辑填充
- 例如用"未知"类别填充分类特征缺失值
注意事项:
- 连续型特征优先用中位数,分类特征用众数
- 缺失率超过80%的特征建议直接删除
二、归一化/标准化
目的:消除特征量纲差异,加速模型收敛
核心方法:
-
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) -
Z-Score标准化(适用于高斯分布特征)
$$x_{\text{std}} = \frac{x - \mu}{\sigma}$$from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) -
鲁棒标准化(抗离群点干扰)
$$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
- 数据含离群点时用鲁棒标准化
三、特征筛选
目的:降低维度、减少噪声、提升泛化能力
核心方法:
-
过滤法(基于统计指标)
- 方差阈值:删除低方差特征
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}$$
- 方差阈值:删除低方差特征
-
包裹法(基于模型性能)
- 递归特征消除(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)
- 递归特征消除(RFE)
-
嵌入法(模型内置选择)
- 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_
- L1正则化(Lasso)
筛选流程:
- 先用过滤法快速剔除无关特征
- 再用包裹法/嵌入法精细化选择
- 最终通过交叉验证确认效果
四、全流程示例
# 完整特征工程流程
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)
关键建议:
- 缺失值填充→归一化→特征筛选需严格按序执行
- 每次处理后验证特征分布变化
- 树模型(如XGBoost)对归一化不敏感,但线性模型必需
- 特征筛选后需重新评估模型性能
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)