数据预处理的四个步骤及优先级(附Python示例)
数据预处理是机器学习和数据分析的核心环节,目的是将原始数据转化为适合建模的格式。以下是 四个关键步骤,按 优先级从高到低 排序,并附带Python代码示例:
1. 数据清理(最高优先级)
目标:解决数据中的 错误、缺失、重复、异常值 问题,保证数据基础质量。
为什么优先:脏数据会导致后续步骤全盘失效(如模型误判)。
具体操作:
- 处理缺失值:删除或填充(均值、众数、插值)。
- 删除重复值:去除完全相同的行。
- 修正异常值:用Z-Score、IQR法过滤或截断。
Python示例:
import pandas as pd
# 删除缺失值过多的行(阈值50%)
df = df.dropna(thresh=df.shape*0.5, axis=0)
# 用均值填充数值列
df['income'] = df['income'].fillna(df['income'].mean())
# 删除重复行
df = df.drop_duplicates()
# 过滤异常值(如年龄>100为异常)
df = df[df['age'] <= 100]
2. 数据转换(次优先级)
目标:将数据转换为 模型可理解的格式,解决量纲、分布、类型问题。
为什么次优先:模型对数值敏感(如SVM受量纲影响,分类模型需要数值输入)。
具体操作:
- 标准化/归一化:
MinMaxScaler
(缩放到[0,1])、StandardScaler
(均值为0,方差为1)。 - 分类数据编码:
LabelEncoder
(标签编码)、OneHotEncoder
(独热编码)。 - 文本向量化:
TF-IDF
、Word2Vec
。 - 日期/时间解析:提取年、月、日等特征。
Python示例:
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# 数值标准化
scaler = StandardScaler()
df[['age', 'income']] = scaler.fit_transform(df[['age', 'income']])
# 分类数据独热编码
encoder = OneHotEncoder()
encoded_data = encoder.fit_transform(df[['city']]).toarray()
3. 特征工程(中优先级)
目标:通过 创建、选择、组合特征 提升模型性能。
为什么中优先:依赖干净且转换后的数据,但对结果影响显著(如特征决定模型上限)。
具体操作:
- 特征构造:从现有特征生成新特征(如“单价=总价/数量”)。
- 特征选择:用
方差阈值
、卡方检验
、L1正则化
筛选重要特征。 - 降维:
PCA
(主成分分析)、LDA
(线性判别分析)减少维度。
Python示例:
from sklearn.feature_selection import SelectKBest, chi2
# 选择Top 5重要特征(卡方检验)
selector = SelectKBest(chi2, k=5)
X_selected = selector.fit_transform(X, y)
# 特征构造(示例:电商数据)
df['price_per_item'] = df['total_price'] / df['item_count']
4. 数据分割(最后一步)
目标:将数据划分为 训练集、验证集、测试集,避免数据泄露。
为什么最后做:确保预处理操作仅在训练集上完成,防止测试集信息污染模型。
具体操作:
- 随机分割:
train_test_split
(常用比例:训练集70%,测试集30%)。 - 时间序列分割:按时间划分,防止未来数据影响历史训练。
- 分层抽样:保持类别分布一致(如分类任务中正负样本比例)。
Python示例:
from sklearn.model_selection import train_test_split
# 随机分割(分层抽样)
X_train, X_test, y_train, y_test = train_test_split
( X, y, test_size=0.3,
stratify=y, # 保持类别分布
random_state=42 )
优先级总结
步骤 | 优先级 | 原因 |
---|---|---|
数据清理 | 1 | 基础质量不解决,后续操作无意义(如异常值导致模型偏差)。 |
数据转换 | 2 | 模型依赖规范化的输入(如归一化加速梯度下降收敛)。 |
特征工程 | 3 | 依赖干净且转换后的数据,但直接影响模型效果(如特征决定模型上限)。 |
数据分割 | 4 | 必须在所有预处理之后,避免测试集信息泄露(如标准化包含测试集数据)。 |
完整流程示例(Python)
# 1. 数据清理
df = df.dropna(subset=['age']) # 删除年龄缺失的行
df = df[df['income'] > 0] # 删除收入为负的异常值
#2. 数据转换
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['age', 'income']] = scaler.fit_transform(df[['age', 'income']])
# 3. 特征工程
df['income_age_ratio'] = df['income'] / df['age'] # 构造新特征
# 4. 数据分割
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
注意事项
避免测试集污染:所有预处理(如标准化)应仅从训练集计算参数,再应用到测试集。
# 正确做法:用训练集的均值和标准差转换测试集
scaler.fit(X_train) # 只在训练集上拟合
X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) # 测试集使用相同的scaler
- 自动化管道:使用
sklearn.pipeline
封装流程,确保步骤可复用。from sklearn.pipeline import Pipeline
-
pipeline = Pipeline([
-
('imputer', SimpleImputer(strategy='mean')),
# 填充缺失值
-
('scaler', StandardScaler()), # 标准化
-
('classifier', LogisticRegression()) # 直接接模型 ])
-
pipeline.fit(X_train, y_train)
注: 以下是数据预处理四个步骤与上篇写的数据预处理4个概念区分,
数据预处理4个概念:数据清洗,数据转换,数据规约,数据集成
在数据预处理中,数据规约(Data Reduction)和 数据集成(Data Integration)确实是两个重要概念,但它们与 特征工程 和 数据分割 的范畴有所不同。以下是详细解释:
1. 特征工程 vs. 数据规约
特征工程(Feature Engineering)
- 定义:通过 创建新特征、选择关键特征、转换特征 来提升模型性能。
- 包含操作:
- 构造新特征(如“单价=总价/数量”)。
- 特征选择(过滤无关特征)。
- 降维(如PCA、LDA)。
- 与数据规约的关系:
- 部分重叠:降维(如PCA)既是特征工程,也属于数据规约(减少维度)。
- 差异:特征工程更侧重“增强特征表达力”,而数据规约更侧重“减少数据量”。
数据规约(Data Reduction)
- 定义:通过 压缩数据规模 来降低计算成本,同时保留关键信息。
- 包含操作:
- 维度规约(降维、删除低方差特征)。
- 数值规约(将连续值分箱为离散值)。
- 数据抽样(从大数据集中抽取代表性样本)。
- 示例:
# 使用PCA降维(属于特征工程和数据规约)
-
from sklearn.decomposition import PCA
-
pca = PCA(n_components=2)
-
X_pca = pca.fit_transform(X)
总结
- 特征工程 的降维操作属于 数据规约,但特征工程更广泛(还包含特征构造、选择等)。
- 数据规约 是独立的预处理步骤,目标更聚焦于“减少数据量”。
2. 数据分割 vs. 数据集成
数据分割(Data Splitting)
- 定义:将数据划分为 训练集、验证集、测试集,确保模型评估的可靠性。
- 目的:防止数据泄露(测试集信息影响训练过程)。
- 无关性:与数据集成、规约无直接关联,是独立步骤。
数据集成(Data Integration)
- 定义:将 多个数据源的数据合并,解决冗余、冲突和不一致。
- 包含操作:
- 实体识别(匹配不同数据源的同一实体)。
- 冗余处理(删除重复列)。
- 数据冲突解决(统一单位、格式)。
- 示例:
- 合并来自数据库和Excel表的数据。
- 统一用户ID在不同系统中的名称(如“User_ID”和“UID”)。
总结
- 数据分割 是模型训练前的必要步骤,与数据集成无关。
- 数据集成 是数据清理的扩展,解决多源数据整合问题。
完整数据预处理流程(补充版)
若将 数据规约 和 数据集成 加入之前的四个步骤,完整流程如下:
-
数据清理(最高优先级)
- 处理缺失值、重复值、异常值。
-
数据集成(如果需要多源数据)
- 合并数据源,解决冗余和冲突。
-
数据转换
- 标准化、编码、文本向量化。
-
特征工程(含数据规约)
- 构造特征、选择特征、降维。
-
数据分割(最后一步)
- 划分训练集、测试集。
关键结论
- 特征工程 和 数据规约 有部分重叠,但目标和范围不同。
- 数据分割 是独立步骤,与数据集成无关。
- 实际项目中,步骤可能交叉或合并,需根据数据特点灵活调整。
附:数据预处理全流程的Python工具链
# 数据集成示例(合并两个表)
df1 = pd.read_csv('sales.csv')
df2 = pd.read_excel('customer.xlsx')
merged_df = pd.merge(df1, df2, on='customer_id') # 根据客户ID合并
# 数据规约示例(分箱简化数据)
merged_df['age_bin'] = pd.cut(merged_df['age'],
bins=[0, 18, 35, 60, 100], labels=['child
l’, 'young', 'adult', 'senior'])
附:用经典的鸢尾花分类的模型训练及示例
基础步骤:
1️⃣ 准备数据(整理带标签的动物图集)
2️⃣ 选择学习方式(决定用哪种教科书)
3️⃣ 反复练习(调整脑回路)
4️⃣ 考试验收(用新图片测试)
关键点说明:
fit()
:训练时用的核心方法,相当于学习过程predict()
:用训练好的模型做预测- 数据拆分:防止死记硬背(过拟合)
- 准确率:评估模型好坏的核心指标
实际应用扩展:
- 复杂任务会用深度学习(如CNN识别图片)
- 数据需要预处理(如归一化、特征工程)
- 参数调优很重要(相当于调整学习方法)
- 常用库还有TensorFlow/PyTorch(处理更复杂任务)
就像学认字要先学笔画,模型训练就是让电脑通过大量例子学习数据中的规律,最终具备预测能力的人工智能基础技能。