机器学习特征工程:缺失值处理与特征缩放方法
在机器学习面试中,特征工程是必考的核心领域。数据预处理的质量直接决定了模型的性能上限。本文将深入探讨特征工程中两个关键环节:缺失值处理与特征缩放,并提供面试中常见的考察点与实用代码示例。
一、缺失值处理
缺失值是现实数据中的常见问题,处理不当会导致模型偏差或无法运行。面试官通常会考察候选人对不同缺失机制的理解和处理策略的选择。
1.1 缺失机制
- 完全随机缺失(MCAR):缺失与任何变量无关
- 随机缺失(MAR):缺失与已观测变量相关
- 非随机缺失(MNAR):缺失与未观测变量相关(最难处理)
1.2 常用处理方法
删除法
import pandas as pd
import numpy as np
# 创建示例数据
data = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, np.nan, 5],
'C': [1, 2, 3, 4, 5]
})
# 删除包含缺失值的行
data_drop_rows = data.dropna()
print("删除行后数据形状:", data_drop_rows.shape)
# 删除缺失值超过阈值的列
data_drop_cols = data.dropna(thresh=0.7*len(data), axis=1)
print("删除列后数据形状:", data_drop_cols.shape)
填充法
from sklearn.impute import SimpleImputer
# 均值填充
imputer_mean = SimpleImputer(strategy='mean')
data_mean = imputer_mean.fit_transform(data)
# 中位数填充(对异常值更鲁棒)
imputer_median = SimpleImputer(strategy='median')
data_median = imputer_median.fit_transform(data)
# 众数填充(适用于分类特征)
imputer_mode = SimpleImputer(strategy='most_frequent')
data_mode = imputer_mode.fit_transform(data)
# 常数填充
imputer_constant = SimpleImputer(strategy='constant', fill_value=-1)
data_constant = imputer_constant.fit_transform(data)
模型预测法
from sklearn.ensemble import RandomForestRegressor
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# 使用迭代插补(MICE算法)
imputer_iterative = IterativeImputer(
estimator=RandomForestRegressor(n_estimators=10, random_state=42),
max_iter=10,
random_state=42
)
data_iterative = imputer_iterative.fit_transform(data)
面试提示:当被问到如何处理缺失值时,不仅要给出方法,还要说明选择依据。例如,对于时间序列数据,可以使用前向填充或后向填充;对于数据库中的复杂缺失值分析,可以使用 dblens SQL编辑器 进行高效的数据探查和模式识别,其可视化界面能快速发现缺失值分布规律。
二、特征缩放
特征缩放是将不同量纲的特征转换到相同尺度,这对基于距离的算法(如KNN、SVM)和梯度下降优化至关重要。
2.1 为什么要特征缩放?
- 加速梯度下降收敛
- 防止某些特征主导模型
- 提高基于距离算法的准确性
2.2 常用缩放方法
标准化(Z-score标准化)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data_iterative) # 使用之前处理好的数据
print("标准化后均值:", X_scaled.mean(axis=0))
print("标准化后方差:", X_scaled.var(axis=0))
标准化将数据转换为均值为0、标准差为1的分布,适用于特征近似正态分布的情况。
归一化(Min-Max缩放)
from sklearn.preprocessing import MinMaxScaler
scaler_mm = MinMaxScaler(feature_range=(0, 1))
X_normalized = scaler_mm.fit_transform(data_iterative)
print("归一化后最小值:", X_normalized.min(axis=0))
print("归一化后最大值:", X_normalized.max(axis=0))
归一化将数据缩放到指定范围(默认[0,1]),对异常值敏感。
鲁棒缩放
from sklearn.preprocessing import RobustScaler
scaler_robust = RobustScaler()
X_robust = scaler_robust.fit_transform(data_iterative)
鲁棒缩放使用中位数和四分位数范围,对异常值不敏感。
最大绝对值缩放
from sklearn.preprocessing import MaxAbsScaler
scaler_maxabs = MaxAbsScaler()
X_maxabs = scaler_maxabs.fit_transform(data_iterative)
将每个特征除以该特征的最大绝对值,适用于稀疏数据。
2.3 缩放方法选择指南
| 方法 | 适用场景 | 注意事项 |
|---|---|---|
| 标准化 | 特征近似正态分布 | 受异常值影响 |
| 归一化 | 需要固定范围 | 对异常值敏感 |
| 鲁棒缩放 | 存在异常值 | 不保证固定范围 |
| 最大绝对值缩放 | 稀疏数据 | 范围[-1, 1] |
面试技巧:当被问到如何选择缩放方法时,可以结合具体业务场景回答。例如,在图像处理中常使用归一化到[0,1];在金融风控中,由于存在极端值,鲁棒缩放更合适。在实际工作中,可以使用 QueryNote 记录不同缩放策略的实验结果,方便团队协作和知识沉淀。
三、实战面试题解析
3.1 面试题示例
问题:在一个电商用户数据集中,年龄特征有10%的缺失值,收入特征有5%的缺失值且存在极端高值。你会如何处理这些特征?
参考答案:
-
年龄特征:
- 首先分析缺失机制,如果是随机缺失,可以使用均值/中位数填充
- 如果与其他特征相关(如注册渠道),可以使用模型预测填充
- 考虑添加“是否缺失年龄”的指示变量
-
收入特征:
- 对极端值进行缩尾处理(Winsorization)
- 使用鲁棒缩放而非标准化或归一化
- 考虑对收入取对数转换,使其分布更接近正态
# 综合处理示例
import numpy as np
from sklearn.preprocessing import RobustScaler
from sklearn.impute import SimpleImputer
# 假设df是原始数据框
# 处理年龄缺失
age_imputer = SimpleImputer(strategy='median')
df['age_filled'] = age_imputer.fit_transform(df[['age']])
df['age_missing'] = df['age'].isnull().astype(int)
# 处理收入异常值和缩放
# 缩尾处理(将超出99分位数的值替换为99分位数)
q99 = df['income'].quantile(0.99)
df['income_winsorized'] = np.where(df['income'] > q99, q99, df['income'])
# 鲁棒缩放
scaler = RobustScaler()
df['income_scaled'] = scaler.fit_transform(df[['income_winsorized']])
3.2 常见陷阱
- 数据泄露:在训练集上拟合scaler,然后在测试集上transform
- 忽略特征类型:对分类特征进行数值缩放
- 盲目填充:不考虑缺失机制直接填充
- 顺序错误:先拆分数据集再处理缺失值
四、总结
特征工程是机器学习项目成功的关键,而缺失值处理和特征缩放是其中最基础也最重要的环节。面试中考察这些知识点,不仅看技术实现,更看重候选人的思考过程和实际经验。
关键要点回顾:
- 缺失值处理需要先分析缺失机制,再选择合适的方法
- 特征缩放方法的选择取决于数据分布和算法需求
- 始终注意防止数据泄露,正确处理训练集和测试集
- 记录实验过程和结果至关重要,QueryNote 可以帮助团队高效协作
- 对于复杂的数据预处理流程,dblens SQL编辑器 提供了强大的数据探索和转换能力
掌握这些核心概念并能在面试中清晰表达,将大大增加获得机器学习相关职位的机会。记住,优秀的特征工程不仅需要技术知识,更需要业务理解和实践经验。
本文来自博客园,作者:DBLens数据库开发工具,转载请注明原文链接:https://www.cnblogs.com/dblens/p/19554454
浙公网安备 33010602011771号