Python下GradientBoostingMachine(GBM)调参完整指导

更新时间:2023-05-15 07:47:05 阅读: 评论:0

Python下GradientBoostingMachine(GBM)调参完整指导Python下Gradient Boosting Machine(GBM)调参完整指导
再别康桥原文简介:如果你现在仍然将GBM作为⼀个⿊盒使⽤,或许你应该点开这篇⽂章,看看他是如何⼯作的。
Boosting 算法在平衡偏差和⽅差⽅⾯扮演了重要⾓⾊。和bagging算法仅仅只能处理模型⾼⽅差不同,boosting在处理这两个⽅⾯都⼗分有效。真正地理解GBM能够给你处理这些关键问题的信⼼。
在这篇⽂章中,我将使⽤python去揭⽰GBM背后的科学知识,最重要的是你将学会如何调节这些参数并获得难以置信的结果。
内容⽬录:
1. Boosting是如何⼯作的?
2. 理解boosting参数
3. 结合实例调参
⼀、Boosting是如何⼯作的?
精神病的表现Boosting是⼀个序列的集成算法,他整合了⼀系列弱分类器给出⼀个提升的预测精度。任何t时刻的输出结果是对之前t-1时刻输出结果的加权。正确分类的样本被赋予⼀个更低的权重,错误分类的样本被赋予⼀个更⼤的权重。回归问题采⽤相似的策略。
我们来进⾏⼀个更直观的理解:
注解:
1. Box 1:第⼀个弱分类器(左起)
初始化所有点,具有相同的权值(通过⼤⼩来表⽰)
决策边界正确预测了2个正类和5个负类
1. Box 2:第⼆个弱分类器
在Box 1中正确分类的样本被赋予更⼩的权值,反之亦然。
现在模型更关注⾼权重的点并将他们正确分类,但是现在其他点⼜被错误分类
相同的趋势可以在Box 3中观察到。进⾏多次迭代后,模型根据每个弱分类器的正确率对其预测结果进⾏加权整合输出。
GBM参数
所有参数可以被分为三类:
1. 树特定参数:这些参数影响模型中每棵独⽴的树。
2. Boosting参数:这些参数影响模型的Boosting操作。
3. 其他参数:其他的参数影响模型整体性能。
我将从树特定参数开始。⾸先,我们来看⼀棵决策树的⼀般结构:
定义⼀棵树的参数在后⾯会进⼀步解释。现在我将使⽤scikit-learn来进⾏说明。
1. min_samples_split
定义在分裂时考虑的⼀个节点中的最⼩样本数量
⽤于控制过拟合。⼀个⾼的值将阻⽌模型学习⼀棵树中选择的特定样本所具有的⾼特异性关系。
太⾼的值可能会导致⽋拟合,因此这个参数应该使⽤交叉验证来调节。
1. min_samples_leaf
定义终端节点或叶⼦节点的最⼩样本数
和min_samples_split⼀样⽤于控制过拟合
⼀般会选择⼀个较低的值以处理样本类别不均衡问题,因为在多数类别中少数类别数量⾮常少。
1. min_weight_fraction_leaf
和min_samples_leaf相似,只是min_samples_leaf为int值,⽽该参数为百分数。
1. max_depth
定义⼀棵树的最⼤深度
⽤于控制过拟合,由于⼀个⾼的深度允许模型去学习特定样本具有的特异关系。
应该使⽤交叉验证调节
5、max_leaf_nodes
定义⼀棵树中终端节点或叶⼦节点的最⼤数量
可以代替max_depth参数定义,因为对于⼀个⼆叉树,⼀颗深度为n的树,将产⽣最多2^n个叶⼦。 如果这个参数被定义,GBM将忽略max_depth参数。
6、max_features
定义最优分裂时搜索的特征数⽬。
根据经验,⼀般设置为特征总数⽬的平⽅根,但我们应该最少对总特征数⽬的30%~40%进⾏搜索。
更⾼的值可能导致过拟合,视具体情况⽽定。
青苹果幼儿园在讲解其他参数之前,我们先看看⽤于2分类的GBM算法的整体伪码:
1、初始化输出
2、从1迭代到模型中树的数⽬
2.1基于前⾯的预测结果更新样本权值
2.2在选择的⼦采样数据上拟合模型
2.3对所有测试集进⾏预测
2.4调整学习率,根据当前结果来更新输出结果
3、返回最终输出
这是对GBM⼯作原理的⼀个及其简单的阐述。上⾯我们已经介绍的参数将影响2.2步骤,即模型构建。下⾯我们将介绍管理Boosting的参数:
1. learning_rate
该参数决定了对于每棵树的最终输出的影响(步骤2.4)。GBM以⼀个初始化的预测开始⼯作,然后根据每棵树的输出更进⾏新。学习率控制预测中这种变化的幅度。
较低的值通常是优选的,因为它们使模型对树的特定特性具有鲁棒性,从⽽使其具有更好的泛化性。
较低的值将会使模型需要更多的树来拟合所有的关系,并且将花费更⾼的计算代价。
1. n_estimators
模型中序列化树的数⽬(步骤2)
虽然GBM在⼤量树上⾜够鲁棒,但是任然可能在⼀点上过拟合。因此,这个参数应该在⼀个特定学习率下使⽤交叉验证来调节。
3、Subsample
每⼀颗树选择的样本数(百分⽐),选择通常是随机采样
当值接近1时,通过减少⽅差来使模型更健壮
典型的值0.8可以⼯作的很好,但也可以进⼀步调节。
剩下的还有⼀些其他参数影响整体性能:
1. Loss
定义每次分裂的最⼩损失函数
对于分类和回归情况,该参数有很多值。⼀般默认值就可以⼯作的很好。其他的值,如果你理解他对模型整体的影响,你也可以选择。
1. Init
定义输出的初始化
如果我们使⽤另⼀个模型的输出作为GBM的初始化预测,则要使⽤这个参数
1. random_state
定义随机数种⼦以保证每次产⽣相同的种⼦数
这对于参数调节⾮常重要。如果我们不固定种⼦数,对于相同的参数,我们的运⾏会得到不同的结果
1. verbo
当模型拟合的时候,打印输出的类型,不同的值代表:
0:没有产⽣输出(默认)
1:在⼀定间隔时间树的产⽣输出
>1:所有树的产⽣输出
1. warm_start
如何使⽤恰当,这个参数将有⼀个有趣的应⽤,并可以产⽣很⼤的帮助
使⽤这个参数,我们可以在之前拟合的模型上去拟合额外的树。这将节约很多时间,
1. Presort
选择是否为更快的分割预置数据
该参数通过默认值进⾏⾃动选择,也可以根据需要来改变
结合实例的参数调节
我进⾏了以下步骤的处理:
1、因为取值太多⽽去掉了City变量
霜重鼓寒声不起
2、DOB被转换成了Age,去掉DOB
3、EMI_Loan_Submitted_Missing:如果EMI_Loan_Submitted的值缺失,取值为1,否则取0。去掉原始的EMI_Loan_Submitted变量
4、因为太多取值,去掉EmployerName
5、因为仅有111个值缺失,对Existing_EMI采⽤0(中值)填充
6、Interest_Rate_Missing:如果Interest_Rate的值缺失,取值为1,否则取0,去掉原始Interest_Rate变量
7、因为对结果没有直观的影响,去掉Lead_Creation_Date
8、对Loan_Amount_Applied、Loan_Tenure_Applied进⾏中值填充
9、Loan_Amount_Submitted_Missing:如果Loan_Amount_Submitted的值缺失,取值为1,否则取0,去掉原始的
Loan_Amount_Submitted变量
10、Loan_Tenure_Submitted_Missing:如果Loan_Tenure_Submitted的值缺失,取值为1,否则取0,去掉原始的
Loan_Tenure_Submitted变量
11、去掉LoggedIn、Salary_Account变量
高考宾馆12、Processing_Fee_Missing:如果Processing_Fee的值缺失,取值为1,否则取0,去掉原始的Processing_Fee变量
13、Source:排名前2位的保持不变,其余的组合成不同类别
14、采⽤数值和独热编码
下⾯上代码:
#Import libraries:
import pandas as pd
import numpy as np
ble import GradientBoostingClassifier  #GBM algorithm
from sklearn import cross_validation, metrics  #Additional scklearn functions
id_arch import GridSearchCV  #Perforing grid arch
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4
train = pd.read_csv('train_modified.csv')
target = 'Disburd'
IDcol = 'ID'
在进⼀步处理之前,先定义⼀个函数帮助我们创建GBM模型和进⾏交叉验证。
def modelfit(alg, dtrain, predictors, performCV=True, printFeatureImportance=True, cv_folds=5):
异曲同工#Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain['Disburd'])
#Predict training t:怎样拉人进群
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
#Perform cross-validation:
if performCV:
cv_score = ss_val_score(alg, dtrain[predictors], dtrain['Disburd'], cv=cv_folds, scoring='roc_auc')
#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disburd'].values, dtrain_predictions)
print "AUC Score (Train): %f" % _auc_score(dtrain['Disburd'], dtrain_predprob)
if performCV:
print "CV Score : Mean - %.7g | Std - %.7g | Min - %.7g | Max - %.7g" % (np.mean(cv_score),np.std(cv_score),np.min(cv_score),np.max(cv_score))
#Print Feature Importance:
if printFeatureImportance:
feat_imp = pd.Series(alg.feature_importances_, predictors).sort_values(ascending=Fal)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')
⾸先创建⼀个基准模型,在这种情况下,评价度量是AUC,因此使⽤任何常数值将给出0.5的结果。通常,良好的基线可以是具有默认参数的GBM模型,即没有任何调参。让我们来看看它的结果:
#Choo all predictors except target & IDcols
predictors = [x for x lumns if x not in [target, IDcol]]
gbm0 = GradientBoostingClassifier(random_state=10)
江西高考modelfit(gbm0, train, predictors)

本文发布于:2023-05-15 07:47:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/898779.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   参数   预测   拟合
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图