基于GBDT的分类模型调参实战指南
引言
梯度提升决策树(GBDT)是一种强大的集成学习算法,在分类和回归问题上都表现出色。本文将详细介绍如何使用scikit-learn中的GradientBoostingClassifier进行二分类任务,并通过系统化的参数调优过程提升模型性能。
数据准备
我们使用的数据集包含一个二元分类目标变量"Disbursed",其中:
- 类别0有19680个样本
- 类别1有320个样本
这是一个典型的类别不平衡数据集,在建模时需要特别注意评估指标的选择。
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import cross_validation, metrics
from sklearn.grid_search import GridSearchCV
# 加载数据
train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'
# 查看类别分布
print(train['Disbursed'].value_counts())
# 准备特征和标签
x_columns = [x for x in train.columns if x not in [target, IDcol]]
X = train[x_columns]
y = train['Disbursed']
基准模型
首先建立一个默认参数的GBDT模型作为基准:
gbm0 = GradientBoostingClassifier(random_state=10)
gbm0.fit(X,y)
y_pred = gbm0.predict(X)
y_predprob = gbm0.predict_proba(X)[:,1]
print("Accuracy : %.4g" % metrics.accuracy_score(y.values, y_pred))
print("AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob))
基准模型在训练集上的表现:
- 准确率:98.52%
- AUC得分:0.9005
对于不平衡数据集,AUC是比准确率更可靠的评估指标。
参数调优策略
GBDT有多个重要参数需要调优,我们采用分阶段调参策略:
- 首先调优n_estimators(树的数量)
- 然后调优树的结构参数(max_depth, min_samples_split)
- 接着调优叶节点参数(min_samples_leaf)
- 然后调优特征采样参数(max_features)
- 最后调优样本采样参数(subsample)
1. 调优n_estimators
n_estimators控制集成模型中树的数量,是GBDT最重要的参数之一。
param_test1 = {'n_estimators':range(20,81,10)}
gsearch1 = GridSearchCV(
estimator=GradientBoostingClassifier(
learning_rate=0.1,
min_samples_split=300,
min_samples_leaf=20,
max_depth=8,
max_features='sqrt',
subsample=0.8,
random_state=10
),
param_grid=param_test1,
scoring='roc_auc',
iid=False,
cv=5
)
gsearch1.fit(X,y)
最佳参数为n_estimators=60,AUC得分为0.8175。
2. 调优max_depth和min_samples_split
max_depth控制每棵树的最大深度,min_samples_split控制节点分裂所需的最小样本数。
param_test2 = {
'max_depth':range(3,14,2),
'min_samples_split':range(100,801,200)
}
gsearch2 = GridSearchCV(
estimator=GradientBoostingClassifier(
learning_rate=0.1,
n_estimators=60,
min_samples_leaf=20,
max_features='sqrt',
subsample=0.8,
random_state=10
),
param_grid=param_test2,
scoring='roc_auc',
iid=False,
cv=5
)
gsearch2.fit(X,y)
最佳参数组合:
- max_depth=7
- min_samples_split=300 AUC提升至0.8214
3. 调优min_samples_leaf和min_samples_split
min_samples_leaf控制叶节点所需的最小样本数。
param_test3 = {
'min_samples_split':range(800,1900,200),
'min_samples_leaf':range(60,101,10)
}
gsearch3 = GridSearchCV(
estimator=GradientBoostingClassifier(
learning_rate=0.1,
n_estimators=60,
max_depth=7,
max_features='sqrt',
subsample=0.8,
random_state=10
),
param_grid=param_test3,
scoring='roc_auc',
iid=False,
cv=5
)
gsearch3.fit(X,y)
最佳参数组合:
- min_samples_split=1200
- min_samples_leaf=60 AUC进一步提升至0.8222
4. 调优max_features
max_features控制每棵树考虑的最大特征数量。
param_test4 = {'max_features':range(7,20,2)}
gsearch4 = GridSearchCV(
estimator=GradientBoostingClassifier(
learning_rate=0.1,
n_estimators=60,
max_depth=7,
min_samples_leaf=60,
min_samples_split=1200,
subsample=0.8,
random_state=10
),
param_grid=param_test4,
scoring='roc_auc',
iid=False,
cv=5
)
gsearch4.fit(X,y)
最佳max_features=9,AUC为0.8224
5. 调优subsample
subsample控制每棵树使用的样本比例。
param_test5 = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gsearch5 = GridSearchCV(
estimator=GradientBoostingClassifier(
learning_rate=0.1,
n_estimators=60,
max_depth=7,
min_samples_leaf=60,
min_samples_split=1200,
max_features=9,
random_state=10
),
param_grid=param_test5,
scoring='roc_auc',
iid=False,
cv=5
)
gsearch5.fit(X,y)
最佳subsample=0.7,AUC为0.8234
最终模型评估
经过上述调参过程,我们得到最优参数组合。为了进一步提升模型性能,我们可以降低学习率并增加树的数量:
# 学习率0.05,树数量120
gbm2 = GradientBoostingClassifier(
learning_rate=0.05,
n_estimators=120,
max_depth=7,
min_samples_leaf=60,
min_samples_split=1200,
max_features=9,
subsample=0.7,
random_state=10
)
gbm2.fit(X,y)
# 评估结果:AUC=0.9053
# 学习率0.01,树数量600
gbm3 = GradientBoostingClassifier(
learning_rate=0.01,
n_estimators=600,
max_depth=7,
min_samples_leaf=60,
min_samples_split=1200,
max_features=9,
subsample=0.7,
random_state=10
)
gbm3.fit(X,y)
# 评估结果:AUC=0.9086
可以看到,降低学习率并增加树的数量可以进一步提升模型性能。
调参经验总结
-
参数调优顺序:建议按照n_estimators→树结构参数→正则化参数→采样参数的顺序进行调优
-
学习率与树数量:较小的学习率通常需要更多的树来达到最优性能,但训练时间会增加
-
模型复杂度控制:通过max_depth、min_samples_split和min_samples_leaf等参数控制模型复杂度,防止过拟合
-
随机性引入:通过subsample和max_features引入随机性,可以增加模型的多样性,提高泛化能力
-
评估指标选择:对于不平衡数据集,AUC比准确率更适合作为评估指标
通过系统化的参数调优过程,我们成功将GBDT模型的AUC得分从初始的0.9005提升到了0.9086,显著改善了模型性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考