文章目录
- 模型开发流程
- 1. 数据准备
- 2. 数据探查
-
- 2.1. 评估数据质量
- 2.2. 理解数据分布与特征特性
- 2.3. 指导特征工程与模型选择
- 3. 特征工程
-
- 3.1. 特征工程常用技巧总结
- 3.2. 特征工程详细步骤与代码
-
- 3.2.1. 加载数据与基础处理
- 3.2.2. 缺失值处理
- 3.2.3. 特征编码
- 3.2.4. 特征构造
- 3.2.5. 特征分箱(离散化)
- 3.2.6. 特征交互
- 3.2.7. 特征选择
- 4.模型训练
-
- 4.1. 模型训练基础流程()
- 4.2. 核心调参方法详解
-
- 4.2.1. 网格搜索(Grid Search)
- 4.2.2. 随机搜索(Random Search)
- 4.2.3. 贝叶斯优化(Bayesian Optimization)
- 4.3. LGBM核心参数调优指南
-
- 4.3.1. 必调核心参数
- 4.3.2. 调参优先级顺序
- 4.3.3. 参数间依赖关系
- 4.4. 调参效果验证方法
-
- 4.4.1. 学习曲线分析
- 4.4.2. 特征重要性可视化
- 4.4.3. SHAP值解释
- 4.5. 调参最佳实践
- 4.6. 性能对比总结
-
- 4.6.1. 最终调参代码模板:
- 5. 模型预测
- 6. 模型效果验证
-
- 6.1. 模型效果常用评判值
-
- 6.1.1. 查准率 (Precision)
- 6.1.2. 查全率 (Recall)
- 6.1.3. F1 分数 (F1 Score)
- 6.1.4. 自然转化率 (Natural Conversion Rate)
- 6.1.5. 提升度 (Lift)
- 6.2. 二分类模型效果验证
- 6.3. 回归模型效果验证
- 6.4. 交叉验证
-
- 6.4.1. 二分类交叉验证
- 6.4.1. 回归交叉验证
模型开发流程
步骤 | 作用 |
---|---|
数据准备 | 基于业务场景专家经验初步筛选模型训练的参数 |
数据探查 | 包括数据的结构、类型、分布、缺失值、异常值等方面的检查 |
特征工程 | 基于数据探查结果筛除部分无用字段; 对入模字段进行预处理(数据类型、缺失值、异常值处理);基于数据分析结果进行特征衍生、标准化、离散化 |
模型训练(调参) | 使用预处理后的数据训练模型(多次调参训练寻找最优模型) |
模型预测 | 使用训练好的数据对全量数据预测,输出预测结果 |
模型效果验证 | 将模型效果和实际结果对比输出模型效果 |
1. 数据准备
数据是构建模型的基石。
在使用算法去挖掘数据中的规律时,离不开准确的数据支撑。然而在不同场景挖掘模型中,使用的训练数据也有着很大区别,选择恰当的入模特征,对模型最终效果起着决定性作用。数据选择步骤
- 基于业务场景分析其可行性
- 结合业务专家经验分析得出重要特征
- 对接相关数据开发人员获得相关数据,并评估数据质量,确保数据质量达标
- 进行模型开发。
2. 数据探查
数据探查的目的主要是为了对数据集进行初步的分析和理解,帮助开发人员发现数据中的潜在问题、特征以及趋势
2.1. 评估数据质量
-
发现问题数据:识别缺失值、重复值、异常值(Outliers)或噪声数据,判断是否需要清洗或修正。
-
验证数据一致性:检查字段格式(如日期、数值类型)、单位是否统一,避免因数据错误导致模型偏差。
-
识别数据偏差:发现数据分布不平衡(如分类任务中类别不均衡)、采样偏差或时间序列中的断档问题。
2.2. 理解数据分布与特征特性
-
统计特征分析:计算均值、方差、分位数、偏度(Skewness)、峰度(Kurtosis)等,了解数据的集中趋势和离散程度。
-
可视化分布:通过直方图、箱线图、密度图等工具,直观观察特征的分布形态(如正态分布、长尾分布、多峰分布)。
-
探索特征间关系:分析特征之间的相关性(如皮尔逊相关系数、热力图)、因果关系或潜在的多重共线性,为特征工程提供依据。
2.3. 指导特征工程与模型选择
-
识别重要特征:通过单变量分析(如目标变量与特征的关联性)筛选高价值特征,减少冗余或无关变量。
-
发现非线性关系:通过散点图或交互式可视化,捕捉特征与目标变量之间的非线性关联,指导特征变换(如多项式扩展、分箱)。
-
适配模型需求:根据数据特性(如线性可分性、稀疏性)选择合适模型(如线性模型、树模型、神经网络)。
3. 特征工程
特征工程的目的是为了提升模型表现,通过更有信息量的特征帮助模型捕捉数据规律;降低计算成本,减少冗余特征,加速模型训练;增强可解释性,通过可理解的特征提高模型透明度;适应模型需求,满足不同算法对数据分布的要求。
3.1. 特征工程常用技巧总结
类别 | 常用方法 |
---|---|
数值特征 | 标准化/归一化、分箱、多项式特征、对数变换、异常值处理 |
类别特征 | 独热编码、目标编码、频率编码、嵌入编码 |
时间特征 | 提取年月日、计算时间间隔、周期编码(sin/cos) |
文本特征 | TF-IDF、词嵌入、N-gram、主题模型 |
特征选择 | 方差阈值、单变量统计、递归特征消除、基于模型的重要性评估 |
维度约减 | PCA、t-SNE、UMAP、LDA |
3.2. 特征工程详细步骤与代码
3.2.1. 加载数据与基础处理
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
# 加载数据
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df = pd.read_csv(url)
# 删除无关列
df = df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
# 划分数据集
X = df.drop('Survived', axis=1)
y = df['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3.2.2. 缺失值处理
# 查看缺失值
print(X_train.isnull().sum())
# 定义填充策略
num_imputer = SimpleImputer(strategy='median') # 数值列用中位数填充
cat_imputer = SimpleImputer(strategy='most_frequent') # 类别列用众数填充
3.2.3. 特征编码
# 数值型特征标准化
num_features = ['Age', 'Fare']
num_transformer = Pipeline(steps=[
('imputer', num_imputer),
('scaler', StandardScaler())
])
# 类别型特征独热编码
cat_features = ['Sex', 'Embarked']
cat_transformer = Pipeline(steps=[
('imputer', cat_imputer),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# 组合处理流程
preprocessor = ColumnTransformer(
transformers=[
('num', num_transformer, num_features),
('cat', cat_transformer, cat_features)
])
3.2.4. 特征构造
# 创建新特征:家庭规模
X_train['FamilySize'] = X_train['SibSp'] + X_train['Parch'] + 1
X_test['FamilySize'] = X_test['SibSp'] + X_test['Parch'] + 1
# 创建新特征:称呼提取
X_train['Title'] = X_train['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
X_test['Title'] = X_test