基于GBDT的分类模型调参实战指南

基于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有多个重要参数需要调优,我们采用分阶段调参策略:

  1. 首先调优n_estimators(树的数量)
  2. 然后调优树的结构参数(max_depth, min_samples_split)
  3. 接着调优叶节点参数(min_samples_leaf)
  4. 然后调优特征采样参数(max_features)
  5. 最后调优样本采样参数(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

可以看到,降低学习率并增加树的数量可以进一步提升模型性能。

调参经验总结

  1. 参数调优顺序:建议按照n_estimators→树结构参数→正则化参数→采样参数的顺序进行调优

  2. 学习率与树数量:较小的学习率通常需要更多的树来达到最优性能,但训练时间会增加

  3. 模型复杂度控制:通过max_depth、min_samples_split和min_samples_leaf等参数控制模型复杂度,防止过拟合

  4. 随机性引入:通过subsample和max_features引入随机性,可以增加模型的多样性,提高泛化能力

  5. 评估指标选择:对于不平衡数据集,AUC比准确率更适合作为评估指标

通过系统化的参数调优过程,我们成功将GBDT模型的AUC得分从初始的0.9005提升到了0.9086,显著改善了模型性能。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解佳岭Farley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值