随机森林及xgboost调参过程

随机森林参数记录

  • 1、先用默认参数看预测结果
  • 2、然后用gridsearchcv探索n_estimators的最佳值
  • 3、然后确定n_estimators,据此再搜索另外两个参数:再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参
    param_test3= {‘min_samples_split’:range(80,150,20), ‘min_samples_leaf’:range(10,60,10)}
  • 4、最后我们再对最大特征数max_features做调参: param_test4= {‘max_features’:range(3,11,2)}
  • 5、最后用得到的参数再次带入模型,得到结果。
#导入需要的库  
import pandas as pd  
import numpy as np  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.grid_search import GridSearchCV  
from sklearn import cross_validation, metrics  
import matplotlib.pylab as plt  
%matplotlib inline  

#导入数据,顺便看看数据的类别分布  
train= pd.read_csv('C:\\Users\\86349\\Desktop\\train_modified\\train_modified.csv')  
target='Disbursed' # Disbursed的值就是二元分类的输出  
IDcol= 'ID'  
train['Disbursed'].value_counts()  

#可以看到类别输出如下,也就是类别0的占大多数:  
0    19680  
1      320  
Name:Disbursed, dtype: int64  

#接着选择好样本特征和类别输出,样本特征为除去ID和输出类别的列  
x_columns = [x for x in train.columns if x not in [target,IDcol]]  
X = train[x_columns]  
y = train['Disbursed']  

#不管任何参数,都用默认的,拟合下数据看看  
rf0 = RandomForestClassifier(oob_score=True, random_state=10)  
rf0.fit(X,y)  
print rf0.oob_score_  
y_predprob = rf0.predict_proba(X)[:,1]  
print "AUC Score (Train): %f" % metrics.roc_auc_score(y,y_predprob)  
#输出如下:0.98005  AUC Score (Train): 0.999833  
#可见袋外分数已经很高(理解为袋外数据作为验证集时的准确率,也就是模型的泛化能力),而且AUC分数也很高(AUC是指从一堆样本中随机抽一个,抽到正样本的概率比抽到负样本的概率 大的可能性)。相对于GBDT的默认参数输出,RF的默认参数拟合效果对本例要好一些。  

#首先对n_estimators进行网格搜索  
param_test1= {'n_estimators':range(10,71,10)}  
gsearch1= GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,  
                                 min_samples_leaf=20,max_depth=8,max_features='sqrt' ,random_state=10),  
                       param_grid =param_test1, scoring='roc_auc',cv=5)  
gsearch1.fit(X,y)  
gsearch1.grid_scores_,gsearch1.best_params_, gsearch1.best_score_  
#输出结果如下:  
([mean:0.80681, std: 0.02236, params: {'n_estimators': 10},  
  mean: 0.81600, std: 0.03275, params:{'n_estimators': 20},  
  mean: 0.81818, std: 0.03136, params:{'n_estimators': 30},  
  mean: 0.81838, std: 0.03118, params:{'n_estimators': 40},  
  mean: 0.82034, std: 0.03001, params:{'n_estimators': 50},  
  mean: 0.82113, std: 0.02966, params:{'n_estimators': 60},  
  mean: 0.81992, std: 0.02836, params:{'n_estimators': 70}],  
{'n_estimators':60},  
0.8211334476626017)  

#这样我们得到了最佳的弱学习器迭代次数,接着我们对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索。  
param_test2= {'max_depth':range(3,14,2), 'min_samples_split':range(50,201,20)}  
gsearch2= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,  
                                 min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10),  
   param_grid = param_test2,scoring='roc_auc',iid=False, cv=5)  
gsearch2.fit(X,y)  
gsearch2.best_score_  
#输出如下:  
{'max_depth':13, 'min_samples_split': 110},  
0.8242016800050813)  

#已经取了三个最优参数,看看现在模型的袋外分数:  
rf1= RandomForestClassifier(n_estimators= 60, max_depth=13, min_samples_split=110,  
                                 min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10)  
rf1.fit(X,y)  
printrf1.oob_score_  
#输出结果为:0.984  
#可见此时我们的袋外分数有一定的提高。也就是时候模型的泛化能力增强了。对于内部节点再划分所需最小样本数min_samples_split,我们暂时不能一起定下来,因为这个还和决策树其他的参数存在关联。下面我们再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。  

#再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参  
param_test3= {'min_samples_split':range(80,150,20), 'min_samples_leaf':range(10,60,10)}  
gsearch3= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,max_depth=13,  
                                 max_features='sqrt' ,oob_score=True, random_state=10),  
   param_grid = param_test3,scoring='roc_auc',iid=False, cv=5)  
gsearch3.fit(X,y)  
gsearch2.best_score_  
#输出如下:  
{'min_samples_leaf':20, 'min_samples_split': 120},  
0.8248650279471544)  

#最后我们再对最大特征数max_features做调参:  
param_test4= {'max_features':range(3,11,2)}  
gsearch4= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,max_depth=13, min_samples_split=120,  
                                 min_samples_leaf=20 ,oob_score=True, random_state=10),  
   param_grid = param_test4,scoring='roc_auc',iid=False, cv=5)  
gsearch4.fit(X,y)  
gsearch4.grid_scores_,gsearch4.best_params_, gsearch4.best_score_  
#输出如下:  
([mean:0.81981, std: 0.02586, params: {'max_features': 3},  
  mean: 0.81639, std: 0.02533, params:{'max_features': 5},  
  mean: 0.82487, std: 0.02110, params:{'max_features': 7},  
  mean: 0.81704, std: 0.02209, params:{'max_features': 9}],  
{'max_features':7},  
0.8248650279471544)  

#用我们搜索到的最佳参数,我们再看看最终的模型拟合:  
rf2= RandomForestClassifier(n_estimators= 60, max_depth=13, min_samples_split=120,  
                                 min_samples_leaf=20,max_features=7 ,oob_score=True, random_state=10)  
rf2.fit(X,y)  
printrf2.oob_score_  
#此时的输出为:0.984  
#可见此时模型的袋外分数基本没有提高,主要原因是0.984已经是一个很高的袋外分数了,如果想进一步需要提高模型的泛化能力,我们需要更多的数据。 

logistic参数调优记录

  • 1、先用默认参数预测结果
  • 2、正则化参数选择,penalty,L1 or L2
  • 3、优化算法选择器:solver,liblinear,lbfgs、newton-cg、sag
  • 4、类型权重参数:class_weight,class_weight={0:0.9, 1:0.1}
    由于不同类别数量不同,因此调高权重,还有误分类代价很高情况等。
  • 5、正则化参数C

xgboost调参过程记录

1、xgboost参数主要分为三种:

  • General Parameters:控制总体的功能
  • Booster Parameters:控制单个学习器的属性
  • Learning Task Parameters:控制调优的步骤

2、General Parameters 参数

  • booster [default=gbtree]
    选择每一次迭代中,模型的种类,有两个选择,gbtree:基于树的选择,gblearnear:线性模型
  • silent[default=0]
    设置为1则不打印执行信息,0则打印信息
  • nthread [default to maximum number of threads available if not set]
    几个核并发

3、Booster Parameters 有两种booster,通常树的booster较为常用

  • eta [default=0.3] learning_rate
    • 类似GBM里面的学习率
    • 通过在每一步中缩小权重来让模型更加鲁棒
    • 一般常用的数值:0.01-0.2
  • min_child_weigh [default=1]
    • 这个参数用来控制过拟合
    • 定义每个child的最小权重
    • 如果太大导致欠拟合
  • max_depth[default=6]
    • 树的最大深度
    • 控制过拟合,如果深度太大导致过拟合
    • 用CV调节,设置3-10
  • max_lear_nodes
    • 叶节点的最大值
    • 如果叶节点确定了,二叉树高度也就确定了,以叶子树的高度为准
  • gamma [default=0]
    • 如果分裂能够使loss函数减小的值大于gamma,则这个节点才分裂,gamma设置了这个减小的最低阈值,如果gamma设置为0,表示只要使得loss函数减小,就分裂
    • 这个值和具体的loss函数相关,需要调节
  • max_delta_step[default=0]
    • 如果设置为0,表示没有限制,如果设置为正值,会使得更新更加谨慎。不常用
  • subsample[default=1]
    • subsample对原始数据集进行随机采样来构建单个数,0.8表示抽取80%的个体来构建树
    • 一般为0.5-1之间
  • colsample_bytree[default=1]
    • 创建树的时候,从所有列中选取的比例,0.8表示随机抽取80%的列来创建树
    • 一般为0.5-1之间
  • lambda[default=1] reg_lambda
    • L2正则化项,可以用来考虑降低过拟合,L2可以防止过分看重某个特定的特征
  • alpha[default=0] reg_alpha
    • L1正则,类似lasso
    • L2正则有助于产生稀疏的数据,有助于提升计算速度

4、Learning Task Parameters

  • objective [default=reg:linear]
    • 定义损失函数
    • binary:logistic——二分类逻辑回归,返回预测的概率
    • multi:softmax——多分类用softmax,需要设置num_class参数
    • multi:softprob——返回属于各个分类的概率
  • eval_metric[default according to objective]
    • 评价验证数据的参数,回归默认rmse,分类一般为error
    • rmse、mae、logloss、error、merror、mlogloss、auc
  • seed[default=0]
    • 为了产生能够重现的结果,如果不设置,每次产生的结果都不同

5、调参步骤

* 参数不大,采用GrideSearchCV来验证
* 设置初始参数,比如全部默认参数
* 保持learning rate 和其他booster参数不变,条件estimators参数
* 固定estimator,调节learning rate
* 固定learning rate,调节booste相关参数,首先从max_depth、min_child_weight开始,逐步调节可能有影响的booster参数
* 固定booster参数,GridSearchCV learning rate ,得到最佳的learning rate值
* 得到一组最终参数,过程类似上面描述的RandomForest的调参过程。

你可能感兴趣的:(机器学习)