机器学习数据预处理全流程:从缺失值处理到特征编码
在机器学习项目中,数据预处理是决定模型效果的关键步骤 —— 未经清洗和标准化的数据,即使使用复杂模型也难以达到理想效果。本文基于实战案例,详细讲解数据预处理的核心环节(缺失值处理、数据标准化、特征编码、数据二值化),并提供 Pandas 与 Scikit-learn 的完整代码示例,适合初学者快速上手。
一、数据预处理整体框架
数据预处理的核心目标是将原始数据转换为模型可接受的格式,主要包含四大模块,各模块职责如下:
- 缺失值处理:识别并填充 / 删除数据中的空值,避免模型报错或偏差。
- 数据标准化:消除特征间的量纲差异(如 “年龄”(0-100)与 “收入”(0-100000)),避免方差大的特征主导模型。
- 特征编码:将非数值型特征(如 “性别”“学历”)转换为数值,满足模型输入要求。
- 数据二值化:将连续特征按阈值分为 0/1 两类,简化模型计算(如将 “年龄> 30” 标记为 1,否则为 0)。
二、缺失值处理:识别与修复数据漏洞
原始数据中常存在 “NaN”“n/a”“na” 等缺失值,需先统一识别,再通过 “删除” 或 “填充” 处理。
2.1 缺失值识别:Pandas.isnull ()
Pandas 默认仅识别 “NaN” 为缺失值,需手动指定其他缺失值标记(如 “n/a”“na”),再用isnull()
判断单元格是否为空
输出说明:
- 原始数据中 “n/a”“na” 会被转换为 “NaN”;
isnull()
返回布尔值数组,True
表示对应位置为缺失值。
2.2 缺失值处理方案
根据数据量和业务场景,选择不同处理方式:
方案 1:删除含缺失值的行(dropna ())
适用于数据量较大、缺失值占比低的场景,直接剔除含空值的行,避免干扰模型。
语法参数:
参数 | 说明 |
---|---|
axis | 默认为 0,删除含空值的行;若为 1,删除含空值的列 |
how | "any"(默认):有一个空值就删除;"all":所有值为空才删除 |
subset | 指定需检查的列(如subset=['NUM_BEDROOMS'] 仅检查卧室数量列) |
inplace | True:直接修改原数据;False:返回新数据(默认) |
方案 2:填充缺失值(fillna ()/ 均值 / 中位数 / 众数)
适用于数据量较小、缺失值需保留的场景,用合理数值填充空值,常见填充方式如下:
填充方式 | 适用场景 | 代码示例 |
---|---|---|
固定值 | 无明显规律的分类特征 | df.fillna(666, inplace=True) (用 666 填充所有空值) |
均值 | 连续特征(无异常值) | x = df["ST_NUM"].mean() df["ST_NUM"].fillna(x, inplace=True) |
中位数 | 连续特征(含异常值) | x = df["ST_NUM"].median() df["ST_NUM"].fillna(x, inplace=True) |
众数 | 分类特征(如 “性别”“血型”) | 用 Scikit-learn 的 SimpleImputer 实现(见下文) |
三、数据标准化:消除量纲差异
标准化的核心是将特征转换为均值为 0、方差为 1的标准正态分布(或固定范围),确保各特征对模型的影响均衡。
3.1 标准化的核心价值
- 无量纲化:将 “身高(cm)”“体重(kg)” 等不同单位的特征转为同一规格;
- 提升模型效率:避免方差大的特征(如 “收入”)主导梯度下降等优化过程;
- 保证可比性:让不同特征的权重更新更公平。
3.2 常用标准化工具(Scikit-learn)
工具 1:MinMaxScaler(最大最小值标准化)
将特征压缩到指定范围(默认 [0,1]),公式为:
X_scaled = (X - X_min) / (X_max - X_min)
特征编码:非数值特征转数值
机器学习模型仅接受数值输入,需将 “性别”“学历” 等分类特征编码,按特征类型选择不同方案:
4.1 特征类型划分
特征类型 | 定义 | 示例 |
---|---|---|
名义变量 | 无顺序关系,仅用于分类 | 性别(男 / 女)、血型(A/B/AB/O) |
有序变量 | 有顺序关系,但无法计算 | 学历(小学 / 初中 / 高中)、成绩(高 / 中 / 低) |
有距变量 | 有顺序且可计算 | 分数(100/90/60)、年龄(20/30/40) |
常用预处理函数速查表
为方便实战查阅,整理 Scikit-learn 核心预处理函数:
函数 | 功能描述 |
---|---|
preprocessing.scale() | 快速实现 Z 值标准化(单次使用) |
preprocessing.MinMaxScaler() | 最大最小值标准化(支持自定义范围) |
preprocessing.StandardScaler() | Z 值标准化(支持拟合后复用) |
preprocessing.RobustScaler() | 抗异常值标准化(基于中位数和四分位数) |
preprocessing.OneHotEncoder() | 独热编码(适用于名义变量) |
preprocessing.OrdinalEncoder() | 序号编码(适用于有序变量) |
preprocessing.LabelEncoder() | 目标标签编码(仅用于 y) |
preprocessing.Binarizer() | 特征二值化(按阈值分 0/1) |
sklearn.impute.SimpleImputer() | 缺失值填充(均值 / 中位数 / 众数 / 固定值) |
总结
数据预处理是机器学习的 “地基”,核心流程可总结为:
- 查缺失:用
isnull()
识别空值,指定缺失值标记; - 补 / 删空值:小数据量用填充(均值 / 中位数 / 众数),大数据量用删除;
- 标准化:用 MinMaxScaler/StandardScaler 消除量纲;
- 编特征:名义变量用独热编码,有序变量用序号编码;
- 二值化:按需简化连续特征。
掌握以上步骤,可应对 80% 以上的机器学习数据预处理场景。实际项目中需结合数据特点灵活选择方案,后续可进一步学习特征选择、数据降维等进阶内容。