特征清洗是机器学习项目中最耗时但最关键的一步,它直接决定模型性能的上限,没有干净的数据,再好的算法也无法发挥作用,行业共识认为数据准备占据项目60%以上的时间。
为什么特征清洗如此重要?
原始数据很少是完美的,问题包括缺失值、异常值、重复记录和格式不一致,这些噪声会误导模型,导致预测偏差,业内专家指出,特征清洗的质量直接影响模型在生产环境中的表现,忽略这一步会导致后期调试成本剧增。
- 缺失值让模型无法处理,常见方式包括删除或填充。
- 异常值如果来自录入错误,必须修正或剔除。
- 重复数据相当于给某些样本加倍权重,影响模型泛化。
- 格式不一致(如日期格式、文本大小写)会破坏特征的一致性。
特征清洗的目标是消除这些隐患,让数据真实反映业务规律。
特征清洗怎么做?完整步骤指南
第一步:数据概览与理解
拿到数据后,先不要急着处理,用pandas的info()和describe()查看基本统计量,关注:
- 数据类型是否符合预期(数值型、类别型)
- 缺失值的数量和比例
- 数值特征的分布情况(均值、标准差、四分位数)
- 明显的异常值,如年龄列出现200
这一步能快速发现明显问题,比如某列全是空值,或某列数值范围异常,建议同时绘制直方图和箱线图辅助判断。
第二步:处理缺失值
缺失值是最常见的问题,处理策略取决于缺失比例和业务含义:
- 删除:当缺失比例较小(低于5%)且样本充足时,直接删除缺失行或列,如果某列缺失超过50%,通常删除该列。
- 填充:数值型可用均值、中位数填充;类别型用众数填充。注意填充值不能泄露未来信息,在时间序列中要用前向填充或插值。
- 预测填充:利用其他特征预测缺失值,如KNN插值、回归插值,复杂度高但效果更好。
- 标记缺失:对于树模型,可以直接将缺失作为一个类别,或使用
MissingIndicator生成新特征。

选择策略需结合业务:收入字段缺失可能代表不愿透露,与收入本身相关,填充特定值可能更合理。
第三步:处理异常值
异常值检测常用方法:
- 统计方法:Z-score(绝对值大于3视为异常,适合正态分布)或IQR(低于Q1-1.5IQR或高于Q3+1.5IQR,更稳健)。
- 业务规则:如年龄在0-120之外,价格小于0。
- 可视化:箱线图、散点图直观发现异常。
处理方式:
- 删除:若确认是录入错误,可以删除。
- 修正:若知道合理范围,用边界值替换。
- 保留:异常值可能代表特殊模式,如欺诈检测中的异常交易。
第四步:重复数据处理
使用df.duplicated()检测完全重复的行,df.drop_duplicates()删除,但注意,某些场景下重复是合理的(如时间序列相同时间点不同传感器数据),需要结合上下文。
第五步:编码与标准化
类别特征编码:
- 独热编码:适用于无序类别,如城市、颜色,但会增加维度,高基数特征需要降频或目标编码。
- 标签编码:适用于有序类别,如教育程度,注意,对无序类别使用标签编码会引入虚假顺序。
- 目标编码:用目标变量均值编码,但需防止过拟合,常用交叉验证方法。
数值特征标准化:
- Z-score标准化:均值为0,标准差为1,适合数据近似正态分布。
- Min-Max归一化:缩放到[0,1],适合有边界的数据。
- RobustScaler:使用中位数和IQR,对异常值鲁棒。
标准化有助于基于距离的模型(如SVM、KNN)和梯度下降优化。
特征清洗和特征选择,先做哪个?
必须先做特征清洗,再做特征选择。 特征选择算法(如方差阈值、卡方检验、互信息)依赖于特征的统计量,如果数据含有缺失或异常,这些统计量会失真,缺失值填充后方差会被压缩,影响选择。
实践中,特征清洗和特征选择可以迭代:先粗清洗,进行初步特征选择,再针对保留特征做更精细的清洗,但

总体顺序不能颠倒。
特征清洗在房价预测中的实际应用
以房价预测为例,典型数据集包含特征:area、bedrooms、bathrooms、year_built、price、location。
常见问题及清洗步骤:
- 缺失值:
area缺失5%,用同bedrooms数目的均值填充;year_built缺失10%,删除该列(因为其他特征可以替代)。 - 异常值:
price出现人民币1元(明显错误),删除该行;area出现0平方米,视为缺失并填充。 - 重复数据:删除完全重复的记录。
- 编码:
location是文本,如"北京朝阳",用独热编码,但类别过多时先合并低频类别。 - 标准化:
area、price等数值特征标准化,让模型收敛更快。
经过这些清洗,模型在测试集上的表现通常有显著提升。数据质量比模型选择更重要。
特征清洗工具与技巧
推荐Python库
- pandas:数据处理核心,提供
dropna()、fillna()、replace()等。 - numpy:数值计算,辅助异常值检测。
- scikit-learn:预处理模块包含
SimpleImputer、StandardScaler、OneHotEncoder、KBinsDiscretizer等。 - feature-engine:专注于特征工程和清洗,提供
MeanMedianImputer、CategoricalEncoder等。 - ydata-profiling:自动生成数据概览报告,快速发现异常。
自动化流程
使用Pipeline确保清洗步骤在训练和预测时一致。
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
numeric_features = ['area', 'price']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median'
;)),
('scaler', StandardScaler())
])
categorical_features = ['location']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
这样,将清洗和预处理整合,避免数据泄露,也便于维护。
特征清洗的常见误区
- 过早删除数据:很多初学者看到缺失值就删除,其实有些缺失是信息,用户没有填写收入,可能收入低,缺失本身就是一个特征。
- 忽略数据分布:标准化前不检查分布,对偏态分布直接标准化,仍然会保持偏态,可以先做对数变换或Box-Cox变换。
- 时间序列数据中错误填充:用未来均值填充过去缺失,会造成数据泄露,必须用前向填充或滚动统计。
- 过度清洗:清洗掉正常变异,导致模型过拟合,在分类任务中,某些异常值其实是稀有类别,删除后模型无法识别。
特征清洗常见问题解答
特征清洗中缺失值太多怎么办?
评估缺失比例:若超过50%,通常删除该特征;若30%-50%,可尝试用其他特征预测;若低于30%,填充或加入缺失指示器。关键是要结合业务,比如某些特征缺失代表'无',此时填充一个特殊值更有意义。
特征清洗和特征工程有什么区别?
特征清洗聚焦于数据质量,修复错误、处理缺失和异常;特征工程聚焦于创造新特征,如组合、聚合、分解,清洗是特征工程的前提,但清洗本身也可以视为特征工程的一部分,比如缺失值填充就是创造新特征的过程。
特征清洗需要多少时间?
在工业界,数据科学家通常花费60%到80%的时间在数据准备上,包括清洗、整合、标注。这个比例是正常的,因为数据质量决定了模型的天花板。
特征清洗不是一次性的工作,而是随着数据理解深入反复迭代的过程。 每一次清洗都能让模型更接近真实规律,最终提升业务价值。