boosting算法调参

算法调参

参考:XGBoost  https://blog.csdn.net/han_xiaoyang/article/details/52665396

GBM  https://blog.csdn.net/han_xiaoyang/article/details/52663170

0、网格搜索sklearn.model_selection.GridSearchCV

      

       参数:

              estimator:分类器,要传入除搜索参数外的其它参数(与scoring参数一起使用)

              param_grid:需要优化的参数的取值,值为字典或列表

scoring:模型评价指标,默认为None,这时需要使用score函数;或者scoring=’roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名,形如:score(estimator, X, y);如果是None,则使用estimator的误差估计函数。

 

              n_jobs:并行数。None表示为1,-1表示使用所有cpu核。

              cv:交叉验证参数,默认为None,使用3折交叉验证。

              verbose: 决定建模完成后对输出的打印方式。

                            0:不输出任何结果(默认)

                            1:打印特定区域的树的输出结果

                            >1:打印所有结果

              pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM。

                                      而设置pre_dispatch参数可以预先划分总共的job数量,使数据最多被复制pre_dispatch次。

 

              refit:默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,

                        作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。

 

              iid:默认为True,设为True时,各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。

             

       常用属性:

              best_score_:最佳模型下的份数

              best_params:最佳模型参数

              cv_results_:模型不同参数下交叉验证的结果(替换了20版本前的grid_scores_)

              best_estimator:最佳分类器

 

       常用函数:

              score(x_test, y_test):最佳模型在测试集下的分数

   

1、GBDT调参

 

(1)Boosting框架的重要参数

       n_estimators:弱学习器的最大迭代次数。太小,容易欠拟合;太大,容易过拟合。通常与learning_rate一起调参。

       learning_rate:每个弱学习器的权重衰减系数,称作步长。

       subsample:子采样,取值为(0,1]。这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本使用,相当于没有使用子采样;如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5,0.8]之间,默认是1.0,即不采用子采样。

       init:初始化的学习器。如果对数据有先验知识,则需要设置该值,否则可以不用管这个参数。

       loss:GBDT算法中的损失函数。对于分类模型,有对数似然损失函数“deviance”(默认值,对二元分离和多元分类较好)和指数损失函数“exponential”(Adaboost算法)。对于回归模型,有均方差“ls”,绝对损失“lad”,Huber损失“huber”和分位数损失“quantile”。默认是均方差“ls”;如果数据噪点很多,推荐用抗噪音的损失函数“huber”;如果需要对训练集进行分段进行预测的时候,则采用“quantile”。

       alpha:GradientBoostingRegressor函数有。当使用Huber损失“huber”和分位数损失“quantile”时,需要指定分位数的值。默认为0.9,如果噪音点较多,可适当降低这个分位数的值。

 

(2)CART回归树的重要参数

       max_features:划分时考虑的最大特征数。默认为“None”,意味着划分时考虑所有的特征数;如果为“log2”,意味着最多考虑log2N个特征;如果是整数,表示考虑的特征绝对数;如果是浮点数,表示考虑特征百分比,即考虑(百分比×N)取整后的特征数。如果特征数很多,可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

       max_depth:决策树最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。数据少或特征少的时候可以不管这个值。如果样本量大,特征量大的情况下,推荐限制这个最大深度,具体取值取决于数据的分布。常用的取值为10—100之间。

       min_samples_split:内部节点再划分所需最小样本数。这个值限制了子树继续划分的条件,如果节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认为2,如果样本量不大,可以不用管,如果样本量数量级非常大,则推荐增大这个值。

       min_samples_leaf:叶子节点最少样本数。这个值限制了叶子结点最少的样本数,如果某叶子结点数目小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需管这个值。如果样本量数量级非常大,则推荐增大这个值。

       min_weight_fraction_leaf:叶子节点最小的样本权重。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,表示不考虑权重问题。一般来说,如果有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时应该设置此值。

       max_leaf_nodes:最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是“None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征数不多,可以不考虑这个值,否则,需加以限制,具体的值可以通过交叉验证得到。

       min_impurity_split:节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,即为叶子节点,一般不推荐改动默认值1e-7。

 

(3)其它参数

       verbose:决定建模完成后对输出的打印方式。

              0:不输出任何结果(默认)

              1:打印特定区域的树的输出结果

              >1:打印所有结果

       warm_start:当设置为True时,重复使用之前的解法去拟合以及增加更多的学习器用于集成。否则的话,清除之前的解法。

       presort:决定是否对数据进行预排序,可以使得树分裂地更快。默认情况下是自动选择。

 

(4)调参过程

       (1)首先,用默认参数拟合数据,查看结果。

       (2)利用经验值初始化设置参数。设置一个较小的步长learning_rate来网格搜索最好的迭代次数n_estimators。

       (3)确定好较小的步长learning_rate和迭代次数n_estimators之后,网格搜索决策树的最大深度max_depth和内部节点再划分所需最小样本数min_samples_split。

       (4)确定好最大深度max_depth(在合理的范围之类),此时暂时不能确定min_samples_split,因为它和其它参数有关。网格搜索内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

       (5)确定好内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。网格搜索最大特征数max_features。

       (6)确定好最大特征数max_features。网格搜索子采样比subsample。

       (7)确定好子采样比subsample。将步长learning_rate减n倍,最大迭代次数n_estimators增加n倍来寻找能够增加模型泛化能力的最优解。

 

 

2、XGBoost调参

三种参数类型:

       General Parameters:调控整个方程

       Booster Parameters:调控每步树的相关变量

       Learning Task Parameters:调控优化表现的变量

 

(1)通用参数

       booster:迭代的模型,gbtree(基于树的模型,默认值)和gbliner(线性模型)

       silent:已被移除。使用verbosity参数代替。

       verbosity:打印输出信息

              0:不打印任何信息    1:打印警告信息    2:打印输出信息  3:debug信息

       n_thread:并行任务数

 

(2)Booster Parameters

       tree booster的表现总是优于linear booster,下面讨论tree booster参数

       eta:与GBM中和学习率的概率相似。通过减少每一步的权重来使得boosting过程更加鲁棒。范围为(0, 1],默认值为0.3,通常最终的值的范围为[0.01, 0.2]

       gamma:定义一个节点进行分裂的最小loss function。gamma值越大,模型越鲁棒。

       max_depth:树的最大深度。树越深,模型越复杂且易overfit。一般范围[3, 10]

       min_child_weight:定义观测叶子节点中所有样本权重之和的最小值。如果树分裂导致叶子节点的样本权重之和少于          min_child_weight,则分裂停止。在线性回归任务中,这个仅仅对应于每个节点所需的最小样本数。min_child_weight值越大,模型越鲁棒。

       max_delta_step:定义每棵树的权重变化的最大步长,该参数使得更新更加平缓。值为0表示没有约束;值大于0,权重的变化将更加保守。

       subsample:和GBM中一样。控制生成每棵树的数据采样比例。值越大,模型易overfit。通常取值为[0.5, 1]

       colsample_bytree:列采样,和GBM中max_features类似。控制生成每棵树所需的特征数。通常取值为[0.5, 1]

       colsample_bylevel:控制节点分裂所需的特征数。效果和前两个参数共同作用一样。

       lambda:权重的L2正则化。值越大,越不容易过拟合。

       alpha:权重的L1正则化。值越大,越不容易过拟合。

       scale_pos_weight:值大于0时,在类别样本不平衡时,有助于快速收敛。典型值设置:负样本数总和/正样本数总和。

 

(3)学习目标参数

       objective:定义最小化损失函数类型。常用值有:

              binary:logistic 二分类的逻辑回归,返回预测的概率

              multi:softmax softmax多分类器,返回预测的概率,需要设置num_class

              multi:softprob 和softmax一样,但返回的是每个数据属于各个类别的概率

       eval_metric:用于衡量验证数据的评价标准。

       seed:随机数的种子,设置它可以复现随机数据的结果,也可用于调整参数。

 

(4)注意:有两种XGBoost:

       import xgboost as xgb:直接引用xgboost,会用到其中的“CV”函数,

       from xgboost.sklearn importXGBClassifier:xgboost的sklearn包。允许像GBM一样使用GridSearch和并行处理

# 建立XGBoost模型并进行交叉验证:modelfit函数
# 参数说明:  alg为定义的XGBClassifier分类器
#            dtrain为训练数据集
#			 predictors为所有特征属性名称
#			 target为类别名称


def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
    if useTrainCV:
	    # 获取XGBClassifier分类器中xgboost类型的所有参数
    	xgb_param = alg.get_xgb_params()
		# 构建xgboost自定义的数据矩阵类DMatrix,能优化存储和运算速度
    	xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
    	cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
        metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
    	
        # cvresult.shape[0]是用的树的个数,即设置迭代器的个数
        alg.set_params(n_estimators=cvresult.shape[0])  
    
    #Fit the algorithm on the data
    alg.fit(dtrain[predictors], dtrain[target],eval_metric='auc')
    
    #Predict training set:
    dtrain_predictions = alg.predict(dtrain[predictors])
    dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
        
    #Print model report:
    print ("\nModel Report")
    print ("Accuracy : %.4g" % metrics.accuracy_score(dtrain[target].values,                 dtrain_predictions))
    print ("AUC Score (Train): %f" % metrics.roc_auc_score(dtrain[target], dtrain_predprob))
                
    feat_imp = pd.Series(alg.feature_importances_).sort_values(ascending=False)
    feat_imp.plot(kind='bar', title='Feature Importances')
    plt.ylabel('Feature Importance Score')
    plt.show()

 

(5)参数调优的一般方法:

       1、选择较高的学习速率,一般位于[0.05, 0.3]之间,选择对应于此学习速率的理想决策树数量。

       2、对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。

       3、xgboost的正则化参数调优(lambda, alpha)。

       4、降低学习速率,确定理想参数。

 

(6)调参过程:

       (1)为了确定boosting参数,先设置初始值

                       learning_rate=0.1

                       n_estimators=1000           # 设置的是n_estimators的上限值

                       max_depth=5,起始值在4~6之间都是不错的选择

                       min_child_weight=1, 这里选了较小的值,因为是极不平衡分类问题,因此某些叶子节点下的值会比较小

                       gamma=0,也可以选[0.1,0.2]之间的值

                       subsample=0.8, colsample_bytree=0.8,典型值在0.5-0.9之间

                       scale_pos_weight=1,这个值是因为类别十分不平衡

                       seed=27

                在modelfit函数,利用xgboost中的cv函数来确定最佳的决策树数量n_estimator。

       (2)类似于GBM调参,使用GridSearchCV来调整max_depth和min_child_weight参数

       (3)类似于GBM调参,使用GridSearchCV来调整gamma参数

       (4)类似于GBM调参,使用GridSearchCV来调整subsample和colsample_bytree参数

       (5)类似于GBM调参,使用GridSearchCV来调整reg_alpha和reg_lambda参数

       (6)降低learning_rate,继续调整

 

最后,重要的是,数据清洗、特征选择、特征融合、模型融合等方法很重要。

 

发布了97 篇原创文章 · 获赞 40 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/NOT_GUY/article/details/88086930
今日推荐