文章目录
- 数据项目分析标准化流程
-
- 目录结构
- 核心结论
-
- [1. 数据加载](#1. 数据加载)
- [2. 数据预处理(Data Preprocessing)](#2. 数据预处理(Data Preprocessing))
-
- [2.1 数据清洗(Data Cleaning)](#2.1 数据清洗(Data Cleaning))
-
- [2.1.1 重复值处理](#2.1.1 重复值处理)
- [2.1.2 缺失值探索与处理](#2.1.2 缺失值探索与处理)
- [2.1.3 异常值探索与处理](#2.1.3 异常值探索与处理)
- [2.2 数据格式标准化(可选,补充项)](#2.2 数据格式标准化(可选,补充项))
- [3. 探索性数据分析(EDA)](#3. 探索性数据分析(EDA))
-
- [3.1 描述性统计分析](#3.1 描述性统计分析)
- [3.2 单变量分布可视化](#3.2 单变量分布可视化)
- [3.3 双变量关系分析](#3.3 双变量关系分析)
-
- [3.3.1 统计检验方法汇总表(有监督特征筛选专用)](#3.3.1 统计检验方法汇总表(有监督特征筛选专用))
- [3.3.2 检验代码实现与结果](#3.3.2 检验代码实现与结果)
- [3.4 多变量关系分析(可选)](#3.4 多变量关系分析(可选))
- [4. 特征工程(Feature Engineering)](#4. 特征工程(Feature Engineering))
-
- [4.1 特征筛选](#4.1 特征筛选)
-
- [4.1.1 有监督特征筛选](#4.1.1 有监督特征筛选)
- [4.1.2 无监督特征筛选](#4.1.2 无监督特征筛选)
- [4.1.3 组合使用策略](#4.1.3 组合使用策略)
- [4.2 类别型特征和数值型特征区分](#4.2 类别型特征和数值型特征区分)
- [4.3 缺失值处理(进阶)](#4.3 缺失值处理(进阶))
-
- [4.4 异常值处理(进阶)](#4.4 异常值处理(进阶))
-
- [4.5 数据分桶](#4.5 数据分桶)
- [4.6 特征构造(可选)](#4.6 特征构造(可选))
- [4.7 特征转换](#4.7 特征转换)
- [4.8 特征交互和特征编码](#4.8 特征交互和特征编码)
- [4.9 特征降维(可选)](#4.9 特征降维(可选))
- [5. 模型构建与评估](#5. 模型构建与评估)
-
- [5.1 数据集划分](#5.1 数据集划分)
- [5.2 模型选择与训练](#5.2 模型选择与训练)
- [5.3 模型评估指标计算](#5.3 模型评估指标计算)
-
- [5.3.1 分类任务评估指标](#5.3.1 分类任务评估指标)
- [5.3.2 回归任务评估指标](#5.3.2 回归任务评估指标)
- [5.3.3 无监督任务评估指标(补充)](#5.3.3 无监督任务评估指标(补充))
- [5.4 模型调优](#5.4 模型调优)
- [5.5 模型解释与落地(可选)](#5.5 模型解释与落地(可选))
- 补充:常见的命名误区
-
数据项目分析标准化流程
目录结构
bash
复制代码
项目分析流程
├─ 数据加载
├─ 数据预处理(Data Preprocessing)
│ └─ 数据清洗(重复值、缺失值、异常值处理)、数据格式标准化
├─ 探索性数据分析(EDA)
│ ├─ 描述性统计分析
│ ├─ 单变量分布可视化
│ ├─ 双变量关系分析(统计检验为主)
│ │ └─ 统计检验方法汇总表、检验代码实现与结果输出
│ └─ 多变量关系分析(可选)
├─ 特征工程(Feature Engineering)
│ ├─ 特征筛选
│ │ ├─ 有监督特征筛选(基于EDA统计检验结果)
│ │ └─ 无监督特征筛选(无目标变量/前置降噪)
│ ├─ 特征类型区分(类别型/数值型)
│ ├─ 缺失值/异常值处理(进阶)
│ ├─ 数据分桶
│ ├─ 特征构造(可选)
│ ├─ 特征转换/编码
│ └─ 特征降维(可选)
└─ 模型构建与评估
├─ 数据集划分
├─ 模型选择与训练
├─ 模型评估指标计算
├─ 模型调优
└─ 模型解释与落地(可选)
核心结论
- 从技术本质来看,统计检验 优先归属到 探索性数据分析(EDA) 阶段;从业务目的(特征筛选)来看,它是特征工程的前置依赖步骤。
- 规范划分方式:统计检验的代码和结果放在EDA部分,有监督特征筛选的操作放在特征工程部分。
- 特征筛选分为有监督 和无监督两类:有监督适用于有明确目标变量的场景,无监督适用于无目标变量的场景,或作为有监督筛选的前置降噪步骤。
- 数据预处理和特征工程阶段均涉及缺失值/异常值处理,但目标、粒度、方法完全不同:预处理是"基础清洗",特征工程是"业务/模型导向的进阶优化";进阶优化的深度需根据"效率-效果"目标、数据特性、模型类型灵活调整。
补充:常见误区
- 很多人将"特征筛选"直接等同于"统计检验":统计检验是有监督特征筛选的一种基础方法,特征筛选还包含无监督方法和其他有监督方法(如基于模型的特征重要性、RFE)。
- 无监督特征筛选≠特征降维:筛选是直接删除无效特征 ,降维是将多个特征映射为少数新特征,二者是互补关系。
- 认为"预处理做了缺失值/异常值处理,特征工程就无需再做":二者目标不同,预处理是"通用清洗",特征工程是"定制化优化",缺一不可;仅数据质量极高+树模型+快速验证场景可简化进阶处理。
1. 数据加载
python
复制代码
# 大文件分块加载示例
chunks = []
for chunk in pd.read_csv(path, chunksize=xxx):
chunks.append(chunk)
chunks_df = pd.concat(chunks)
2. 数据预处理(Data Preprocessing)
数据预处理为独立大模块,核心目标是解决数据"可用性"问题,对全量数据做通用、基础的清洗,让数据满足后续分析的基本要求。
2.1 数据清洗(Data Cleaning)
2.1.1 重复值处理
- 代码:
data_train.duplicated().sum()
- 操作:删除完全重复的行 / 保留第一条
- 核心目标:消除数据冗余,避免重复计算对后续统计分析的干扰。
2.1.2 缺失值探索与处理
- 代码:
data_train.isnull().sum() / 缺失率计算
- 可视化:缺失率柱状图 / 热力图
- 处理方案:
- 数值型特征:均值/中位数/插值填充(通用策略,不区分特征重要性)
- 分类型特征:众数/缺失值单独编码(通用策略,不结合业务场景)
- 核心目标:填补"空值",保证数据结构完整,避免后续EDA/建模时因空值报错。
- 局限性:仅解决"有没有值"的问题,不考虑"值是否合理""是否适配业务/模型"。
2.1.3 异常值探索与处理
- 检测方法:箱线图(IQR法)、3σ法则、Z-score(通用统计方法,全量特征统一检测)
- 处理方案:删除极端异常值 / 盖帽法(替换为上下限) / 保留(根据业务逻辑判断是合理值)
- 核心目标:识别并处理明显违背统计规律的"极端值",避免其对EDA阶段描述性统计的干扰。
- 局限性:仅从统计角度处理,不结合特征的业务含义、不考虑模型对异常值的敏感度。
2.2 数据格式标准化(可选,补充项)
- 数据类型转换:如将字符串格式的日期转为datetime类型、将数字编码的分类特征转为category类型
- 列名标准化:如统一小写、替换空格为下划线、删除特殊字符
- 核心目标:统一数据格式,提升后续操作的便捷性。
3. 探索性数据分析(EDA)
EDA为独立大模块,核心目标是理解数据特征,挖掘变量分布、变量间关系,为后续特征工程和建模提供依据。
3.1 描述性统计分析
- 代码:
data_train.describe()(连续变量:均值、中位数、标准差、分位数)
- 代码:
data_train.describe(include='object')(分类变量:频数、唯一值数量)
3.2 单变量分布可视化
- 连续变量:直方图 + 核密度图(看分布是否正态)、箱线图
- 分类变量:条形图、饼图(看类别分布是否均衡)
3.3 双变量关系分析
3.3.1 统计检验方法汇总表(有监督特征筛选专用)
| 分类序号 |
分析场景(变量类型) |
常用检验方法 |
适用条件 |
原假设(H₀) |
核心用途 |
| 1 |
两个分类变量的关系(如:性别 vs 是否违约) |
卡方检验 |
列联表中大部分单元格频数 ≥ 5 |
两个分类变量相互独立,无关联 |
筛选与目标分类变量相关的分类特征 |
| 1 |
两个分类变量的关系 |
Fisher精确检验 |
列联表中存在单元格频数 < 5(小样本) |
两个分类变量相互独立,无关联 |
卡方检验的补充,小样本场景下的分类特征筛选 |
| 2 |
单分类变量(两组) vs 连续变量(如:是否违约 vs 收入) |
独立样本t检验 |
连续变量正态分布 、方差齐、样本独立 |
两组连续变量的均值无差异 |
筛选与目标二分类变量相关的连续特征 |
| 2 |
单分类变量(两组) vs 连续变量 |
Welch's t检验 |
连续变量正态分布、方差不齐、样本独立 |
两组连续变量的均值无差异 |
t检验的修正版,方差不齐时的替代方案 |
| 2 |
单分类变量(两组) vs 连续变量 |
Mann-Whitney U检验 |
连续变量非正态分布、样本独立(非参数检验) |
两组连续变量的分布无差异 |
不满足正态分布时,替代t检验的特征筛选 |
| 3 |
单分类变量(多组) vs 连续变量(如:学历等级 vs 收入) |
单因素方差分析(ANOVA) |
连续变量正态分布、方差齐、样本独立 |
多组连续变量的均值全部相等 |
筛选与目标多分类变量相关的连续特征 |
| 3 |
单分类变量(多组) vs 连续变量 |
Kruskal-Wallis H检验 |
连续变量非正态分布、样本独立(非参数检验) |
多组连续变量的分布无差异 |
不满足正态分布时,替代ANOVA的特征筛选 |
| 4 |
两个连续变量的关系(如:年龄 vs 贷款金额) |
Pearson相关分析 |
两个连续变量均服从正态分布 |
两个连续变量无线性相关 |
筛选与目标连续变量线性相关的连续特征 |
| 4 |
两个连续变量的关系 |
Spearman秩相关分析 |
两个连续变量非正态分布(非参数检验) |
两个连续变量无秩相关 |
不满足正态分布时,替代Pearson的特征筛选 |
3.3.2 检验代码实现与结果
- 分类变量 vs 目标变量:卡方检验 / Fisher精确检验
- 连续变量 vs 目标变量:t检验 / Mann-Whitney U检验
- 输出:各变量的显著性检验结果表(p值、是否显著)
3.4 多变量关系分析(可选)
- 相关性热力图:连续变量之间的相关系数矩阵
- 分组箱线图:不同分类下连续变量的分布对比
4. 特征工程(Feature Engineering)
特征工程的核心目标是提升数据"有效性",针对筛选后的特征,结合业务逻辑和模型特性做定制化优化,让数据更适配建模需求。
4.1 特征筛选
4.1.1 有监督特征筛选
- 适用场景:有明确目标变量的分类/回归任务(如预测是否违约、预测销售额)。
- 核心依据:
- EDA阶段的统计检验结果(基础方法);
- 基于模型的特征重要性 (进阶方法,如树模型
feature_importances_、线性模型系数);
- 递归特征消除(RFE)、递归特征消除交叉验证(RFECV)。
- 操作规则(统计检验法):
- 保留:p < 0.05 的显著相关特征;
- 删除:p ≥ 0.05 的无关特征。
- 代码示例(基于模型的特征重要性):
python
复制代码
from sklearn.ensemble import RandomForestClassifier
# 训练随机森林模型,获取特征重要性
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
# 特征重要性排序
feature_importance = pd.DataFrame({
'feature': X_train.columns,
'importance': rf.feature_importances_
}).sort_values(by='importance', ascending=False)
# 筛选前N个重要特征(或按阈值筛选)
top_features = feature_importance[feature_importance['importance'] > 0.01]['feature'].tolist()
X_train_selected = X_train[top_features]
X_test_selected = X_test[top_features]
4.1.2 无监督特征筛选
- 适用场景:
- 无目标变量的任务(如聚类、异常检测);
- 有监督任务中前置降噪(在有监督筛选前,先删除无效特征,提升后续步骤效率)。
- 核心方法:
- 方差阈值法:删除方差小于阈值的特征(无区分度,如全为0的特征);
- 高相关性筛选:删除特征之间相关系数过高的冗余特征(如相关系数>0.9的两个特征,保留其中一个);
- 缺失率阈值法:删除缺失率过高的特征(如缺失率>80%的特征,无有效信息)。
- 操作规则:
- 方差阈值:通常设置为0(删除常量特征),或根据业务调整;
- 相关系数阈值:通常设置为0.8~0.9(删除高度冗余特征);
- 缺失率阈值:通常设置为0.7~0.8(删除无有效信息的特征)。
- 代码示例(组合方法):
python
复制代码
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
import numpy as np
# 1. 缺失率筛选:删除缺失率>80%的特征
missing_rate = X.isnull().sum() / len(X)
X_filtered = X.loc[:, missing_rate <= 0.8]
# 2. 方差阈值筛选:删除常量/低方差特征
vt = VarianceThreshold(threshold=0) # threshold=0 表示删除方差为0的特征
X_filtered = vt.fit_transform(X_filtered)
# 恢复列名(VarianceThreshold返回的是numpy数组)
X_filtered = pd.DataFrame(X_filtered, columns=X.columns[vt.get_support()])
# 3. 高相关性筛选:删除相关系数>0.9的冗余特征
corr_matrix = X_filtered.corr().abs()
# 构建上三角矩阵,避免重复计算
upper_triangle = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
# 找到相关系数>0.9的特征列
to_drop = [column for column in upper_triangle.columns if any(upper_triangle[column] > 0.9)]
X_filtered = X_filtered.drop(columns=to_drop)
4.1.3 组合使用策略
- 无监督任务:仅使用无监督特征筛选;
- 有监督任务:先无监督筛选(降噪),后有监督筛选(精准筛选),既提升效率,又保证筛选的精准性。
4.2 类别型特征和数值型特征区分
- 类别型特征:需结合业务判断是否具有数值关系,是否是单纯的分类
- 数值型特征:
- 包含连续型和离散型,针对连续型数据需查看每一列是否符合正态分布
- 查看某一个数值型变量的分布,若不符合正态分布可log化后再次验证
- 若需统一标准化一批数据,需剔除已正态化的数据
- 正态化原因:部分场景下可加快模型收敛,部分模型(如GMM、KNN)要求数据正态;无需严格正态,保证数据不过度偏态即可,过度偏态可能影响模型预测结果
4.3 缺失值处理(进阶)
核心差异:与预处理阶段的对比
| 维度 |
预处理阶段(基础清洗) |
特征工程阶段(进阶优化) |
| 处理目标 |
保证数据"可用",填补空值即可 |
保证特征"有效",填补值需适配业务/模型 |
| 处理粒度 |
全量特征统一策略(如所有数值特征用中位数填充) |
按特征重要性/业务含义定制策略 |
| 处理方法 |
通用统计方法(均值、中位数、众数) |
业务导向/模型导向方法 |
进阶处理深度选择(效率 vs 效果)
| 目标优先级 |
适用场景 |
处理程度 |
具体操作 |
耗时 |
| 效率优先 |
快速原型验证(POC)、1天内出demo、初步验证数据建模价值 |
极简处理(仅修正核心特征明显问题) |
1. 核心特征(Top3):按业务分组填充(如按职业填收入中位数); 2. 非核心特征:沿用预处理策略 |
10-20分钟 |
| 平衡效率与效果 |
企业常规业务建模(用户流失预测、销量预测等)、需保证模型可用且有一定精度 |
中等深度(聚焦核心特征优化) |
1. 核心特征(Top5):分箱填充/简单模型填充(随机森林单特征预测); 2. 非核心特征:分组填充/沿用预处理 |
1-2小时 |
| 效果优先 |
数据竞赛冲榜、高精度业务建模(风控、医疗、金融定价)、需极致模型精度 |
深度处理(全维度最小化信息损失) |
1. 核心特征:多模型融合填充+缺失标记(新增"是否缺失"特征); 2. 非核心特征:模型填充/分组填充 |
3-6小时 |
进阶处理方法示例
- 高重要性数值特征:分箱填充 (如按年龄分组,用每组的中位数填充)、模型预测填充(用其他特征训练模型预测缺失值);
- 高重要性分类特征:业务规则填充(如"婚姻状态"缺失,结合"是否有配偶贷款"字段填充);
- 模型适配优化:树模型对缺失值不敏感,可保留缺失值编码;线性模型需精准填充,避免引入偏差。
代码示例(模型预测填充)
python
复制代码
from sklearn.ensemble import RandomForestRegressor
# 选择高重要性特征(如income)作为待填充特征
# 分离有值和无值的样本
train_income = X_filtered[X_filtered['income'].notnull()]
test_income = X_filtered[X_filtered['income'].isnull()]
# 用其他特征预测income的缺失值
X_train = train_income.drop('income', axis=1)
y_train = train_income['income']
X_test = test_income.drop('income', axis=1)
# 训练填充模型
fill_model = RandomForestRegressor(n_estimators=100, random_state=42)
fill_model.fit(X_train, y_train)
# 预测并填充
pred_income = fill_model.predict(X_test)
X_filtered.loc[X_filtered['income'].isnull(), 'income'] = pred_income
4.4 异常值处理(进阶)
核心差异:与预处理阶段的对比
| 维度 |
预处理阶段(基础清洗) |
特征工程阶段(进阶优化) |
| 处理目标 |
消除统计极端值对EDA的干扰 |
消除异常值对模型拟合的负面影响 |
| 处理粒度 |
全量特征统一检测(如3σ法则) |
按特征业务含义/模型敏感度定制策略 |
| 处理方法 |
通用方法(删除、盖帽法) |
业务适配/模型适配方法 |
进阶处理深度选择(效率 vs 效果)
| 目标优先级 |
适用场景 |
处理程度 |
具体操作 |
耗时 |
| 效率优先 |
快速原型验证(POC)、1天内出demo、初步验证数据建模价值 |
极简处理(仅修正核心特征明显错误) |
1. 核心特征:简单业务规则修正(如年龄限0-100); 2. 非核心特征:轻度盖帽(99分位数) |
10-20分钟 |
| 平衡效率与效果 |
企业常规业务建模(用户流失预测、销量预测等)、需保证模型可用且有一定精度 |
中等深度(聚焦核心特征优化) |
1. 核心特征:业务适配处理(收入对数变换、金额缩尾); 2. 非核心特征:盖帽法(95/99分位数) |
1-2小时 |
| 效果优先 |
数据竞赛冲榜、高精度业务建模(风控、医疗、金融定价)、需极致模型精度 |
深度处理(精准识别+业务适配) |
1. 核心特征:异常检测(IQR+孤立森林)+ 业务适配处理; 2. 非核心特征:模型适配处理(线性缩尾、树模型保留) |
3-6小时 |
进阶处理方法示例
- 业务适配:"收入"字段的极端值可能是高净值用户,不删除,而是对数变换降低偏态;"年龄"字段的150岁值是错误值,需替换为合理上限(如100岁);
- 模型适配:线性模型对异常值敏感,需严格盖帽;树模型对异常值不敏感,可保留或轻度处理。
代码示例(业务导向的异常值处理)
python
复制代码
# 收入字段:对数变换降低极端值影响(保留高收入用户信息)
X_filtered['income_log'] = np.log1p(X_filtered['income'])
# 年龄字段:错误值替换(150岁以上替换为100岁)
X_filtered['age'] = X_filtered['age'].apply(lambda x: 100 if x > 100 else x)
4.5 数据分桶
4.6 特征构造(可选)
- 示例:收入/负债比、逾期次数汇总、年龄分组、消费频率
4.7 特征转换
- 数值型特征:标准化(StandardScaler)、归一化(MinMaxScaler)
- 分类型特征:独热编码(One-Hot Encoding)、标签编码(Label Encoding)
4.8 特征交互和特征编码
- 编码方式:labelencode
- 数值转换:归一化
4.9 特征降维(可选)
- 主成分分析(PCA)、线性判别分析(LDA)
- 注意:降维是无监督特征筛选的补充,而非替代。降维后生成的新特征失去了原有的业务解释性,适用于对解释性要求不高的场景。
5. 模型构建与评估
5.1 数据集划分
- 核心逻辑:将处理后的特征数据划分为训练集、验证集(可选)、测试集,避免数据泄露
- 常用比例:训练集70%-80%,测试集20%-30%;若需验证集,可从训练集中再拆分10%-20%
- 代码示例:
python
复制代码
from sklearn.model_selection import train_test_split
# 特征与目标变量分离
X = data_train_filtered.drop('target', axis=1)
y = data_train_filtered['target']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y # stratify保证目标变量分布一致
)
# 可选:划分验证集
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.1, random_state=42, stratify=y_train
)
5.2 模型选择与训练
- 分类任务常用模型:逻辑回归、决策树、随机森林、XGBoost、LightGBM、神经网络等
- 回归任务常用模型:线性回归、岭回归、Lasso回归、随机森林回归、XGBoost回归等
- 无监督任务常用模型:K-Means、DBSCAN、层次聚类、孤立森林(异常检测)等
- 代码示例(以分类任务为例):
python
复制代码
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
# 基础模型训练(随机森林)
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 进阶模型训练(XGBoost)
xgb_model = XGBClassifier(learning_rate=0.1, n_estimators=100, random_state=42)
xgb_model.fit(X_train, y_train, eval_set=[(X_val, y_val)], early_stopping_rounds=10)
5.3 模型评估指标计算
5.3.1 分类任务评估指标
- 基础指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1值、AUC-ROC、混淆矩阵
- 代码示例:
python
复制代码
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix
# 模型预测
y_pred = xgb_model.predict(X_test)
y_pred_proba = xgb_model.predict_proba(X_test)[:, 1]
# 计算指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"准确率:{accuracy:.4f}")
print(f"精确率:{precision:.4f}")
print(f"召回率:{recall:.4f}")
print(f"F1值:{f1:.4f}")
print(f"AUC值:{auc:.4f}")
print("混淆矩阵:\n", conf_matrix)
5.3.2 回归任务评估指标
- 基础指标:均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、决定系数(R²)
- 代码示例:
python
复制代码
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 模型预测(回归)
y_pred_reg = xgb_reg_model.predict(X_test)
# 计算指标
mse = mean_squared_error(y_test, y_pred_reg)
rmse = mean_squared_error(y_test, y_pred_reg, squared=False)
mae = mean_absolute_error(y_test, y_pred_reg)
r2 = r2_score(y_test, y_pred_reg)
print(f"MSE:{mse:.4f}")
print(f"RMSE:{rmse:.4f}")
print(f"MAE:{mae:.4f}")
print(f"R²:{r2:.4f}")
5.3.3 无监督任务评估指标(补充)
- 聚类任务:轮廓系数(Silhouette Score)、Calinski-Harabasz指数、Davies-Bouldin指数
- 异常检测任务:精确率、召回率、F1值、AUC-ROC(若有标注数据)
5.4 模型调优
- 常用方法:网格搜索(GridSearchCV)、随机搜索(RandomizedSearchCV)、贝叶斯优化
- 代码示例(网格搜索):
python
复制代码
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.2]
}
# 网格搜索
grid_search = GridSearchCV(
estimator=XGBClassifier(random_state=42),
param_grid=param_grid,
cv=5, # 5折交叉验证
scoring='roc_auc', # 分类任务以AUC为评分标准
n_jobs=-1
)
grid_search.fit(X_train, y_train)
print("最优参数:", grid_search.best_params_)
print("最优交叉验证得分:", grid_search.best_score_)
# 最优模型
best_model = grid_search.best_estimator_
5.5 模型解释与落地(可选)
- 模型解释:SHAP值、特征重要性、部分依赖图(PDP)等,解释模型决策逻辑
- 模型落地:模型保存(pickle/joblib)、部署为API、离线批量预测等
- 代码示例(模型保存与加载):
python
复制代码
import joblib
# 保存模型
joblib.dump(best_model, 'best_xgb_model.pkl')
# 加载模型
loaded_model = joblib.load('best_xgb_model.pkl')
# 离线预测
new_data_pred = loaded_model.predict(new_data)
补充:常见的命名误区
| 不规范的命名 |
规范的命名 |
归属层级 |
| 数据处理 |
数据预处理 |
独立大模块 |
| 缺失值处理 |
数据清洗 |
数据预处理的子模块 |
| 统计检验 |
探索性数据分析(EDA) |
独立大模块 |
| 特征筛选 |
特征工程 |
独立大模块 |
| 模型调参 |
模型调优 |
模型构建与评估的子模块 |
| 无监督降维 |
无监督特征筛选/特征降维 |
特征工程的子模块 |
总结
- 核心流程划分:数据加载→数据预处理→EDA→特征工程→模型构建与评估,各模块边界清晰,前序模块为后序模块提供数据/结果支撑;
- 特征筛选是特征工程的核心步骤,分为有监督 和无监督两类,需根据任务类型选择合适的方法,有监督任务建议组合使用(先无监督降噪,后有监督精准筛选);
- 统计检验归属EDA,是有监督特征筛选的基础方法;无监督特征筛选适用于无目标变量的场景,或作为有监督筛选的前置步骤;
- 缺失值/异常值处理在预处理和特征工程阶段的核心差异:预处理解决"可用性"(通用清洗),特征工程解决"有效性"(定制化优化);进阶优化深度需按"效率优先/平衡/效果优先"选择,仅数据质量极高+树模型+快速验证场景可简化;
- 模型构建与评估需注重数据集划分的合理性,选择适配任务类型的评估指标,通过调优提升模型性能,可选做模型解释与落地。