RandomForest 参数调优

随机森林参数记录

  • 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、最后用得到的参数再次带入模型,得到结果。

   
   
  1. #导入需要的库
  2. import pandas as pd
  3. import numpy as np
  4. from sklearn.ensemble import RandomForestClassifier
  5. from sklearn.grid_search import GridSearchCV
  6. from sklearn import cross_validation, metrics
  7. import matplotlib.pylab as plt
  8. %matplotlib inline
  9. #导入数据,顺便看看数据的类别分布
  10. train= pd.read_csv( ‘C:\\Users\\86349\\Desktop\\train_modified\\train_modified.csv’)
  11. target= ‘Disbursed’ # Disbursed的值就是二元分类的输出
  12. IDcol= ‘ID’
  13. train[ ‘Disbursed’].value_counts()
  14. #可以看到类别输出如下,也就是类别0的占大多数:
  15. 0 19680
  16. 1 320
  17. Name:Disbursed, dtype: int64
  18. #接着选择好样本特征和类别输出,样本特征为除去ID和输出类别的列
  19. x_columns = [x for x in train.columns if x not in [target,IDcol]]
  20. X = train[x_columns]
  21. y = train[ ‘Disbursed’]
  22. #不管任何参数,都用默认的,拟合下数据看看
  23. rf0 = RandomForestClassifier(oob_score= True, random_state= 10)
  24. rf0.fit(X,y)
  25. print rf0.oob_score_
  26. y_predprob = rf0.predict_proba(X)[:, 1]
  27. print “AUC Score (Train): %f” % metrics.roc_auc_score(y,y_predprob)
  28. #输出如下:0.98005 AUC Score (Train): 0.999833
  29. #可见袋外分数已经很高(理解为袋外数据作为验证集时的准确率,也就是模型的泛化能力), 而且AUC分数也很高(AUC是指从一堆样本中随机抽一个,抽到正样本的概率比 抽到负样本的概率 大的可能性)。相对于GBDT的默认参数输出,RF的默认参数拟合效果对本例要好一些。
  30. #首先对n_estimators进行网格搜索
  31. param_test1= { ‘n_estimators’:range( 10, 71, 10)}
  32. gsearch1= GridSearchCV(estimator = RandomForestClassifier(min_samples_split= 100,
  33. min_samples_leaf= 20,max_depth= 8,max_features= ‘sqrt’ ,random_state= 10),
  34. param_grid =param_test1, scoring= ‘roc_auc’,cv= 5)
  35. gsearch1.fit(X,y)
  36. gsearch1.grid_scores_,gsearch1.best_params_, gsearch1.best_score_
  37. #输出结果如下:
  38. ([mean: 0.80681, std: 0.02236, params: { ‘n_estimators’: 10},
  39. mean: 0.81600, std: 0.03275, params:{ ‘n_estimators’: 20},
  40. mean: 0.81818, std: 0.03136, params:{ ‘n_estimators’: 30},
  41. mean: 0.81838, std: 0.03118, params:{ ‘n_estimators’: 40},
  42. mean: 0.82034, std: 0.03001, params:{ ‘n_estimators’: 50},
  43. mean: 0.82113, std: 0.02966, params:{ ‘n_estimators’: 60},
  44. mean: 0.81992, std: 0.02836, params:{ ‘n_estimators’: 70}],
  45. { ‘n_estimators’: 60},
  46. 0.8211334476626017)
  47. #这样我们得到了最佳的弱学习器迭代次数,接着我们对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索。
  48. param_test2= { ‘max_depth’:range( 3, 14, 2), ‘min_samples_split’:range( 50, 201, 20)}
  49. gsearch2= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,
  50. min_samples_leaf= 20,max_features= ‘sqrt’ ,oob_score= True,random_state= 10),
  51. param_grid = param_test2,scoring= ‘roc_auc’,iid= False, cv= 5)
  52. gsearch2.fit(X,y)
  53. gsearch2.best_score_
  54. #输出如下:
  55. { ‘max_depth’: 13, ‘min_samples_split’: 110},
  56. 0.8242016800050813)
  57. #已经取了三个最优参数,看看现在模型的袋外分数:
  58. rf1= RandomForestClassifier(n_estimators= 60, max_depth= 13, min_samples_split= 110,
  59. min_samples_leaf= 20,max_features= ‘sqrt’ ,oob_score= True,random_state= 10)
  60. rf1.fit(X,y)
  61. printrf1.oob_score_
  62. #输出结果为:0.984
  63. #可见此时我们的袋外分数有一定的提高。也就是时候模型的泛化能力增强了。 对于内部节点再划分所需最小样本数min_samples_split,我们暂时不能一起定下来, 因为这个还和决策树其他的参数存在关联。下面我们再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。
  64. #再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参
  65. param_test3= { ‘min_samples_split’:range( 80, 150, 20), ‘min_samples_leaf’:range( 10, 60, 10)}
  66. gsearch3= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,max_depth= 13,
  67. max_features= ‘sqrt’ ,oob_score= True, random_state= 10),
  68. param_grid = param_test3,scoring= ‘roc_auc’,iid= False, cv= 5)
  69. gsearch3.fit(X,y)
  70. gsearch2.best_score_
  71. #输出如下:
  72. { ‘min_samples_leaf’: 20, ‘min_samples_split’: 120},
  73. 0.8248650279471544)
  74. #最后我们再对最大特征数max_features做调参:
  75. param_test4= { ‘max_features’:range( 3, 11, 2)}
  76. gsearch4= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60,max_depth= 13, min_samples_split= 120,
  77. min_samples_leaf= 20 ,oob_score= True, random_state= 10),
  78. param_grid = param_test4,scoring= ‘roc_auc’,iid= False, cv= 5)
  79. gsearch4.fit(X,y)
  80. gsearch4.grid_scores_,gsearch4.best_params_, gsearch4.best_score_
  81. #输出如下:
  82. ([mean: 0.81981, std: 0.02586, params: { ‘max_features’: 3},
  83. mean: 0.81639, std: 0.02533, params:{ ‘max_features’: 5},
  84. mean: 0.82487, std: 0.02110, params:{ ‘max_features’: 7},
  85. mean: 0.81704, std: 0.02209, params:{ ‘max_features’: 9}],
  86. { ‘max_features’: 7},
  87. 0.8248650279471544)
  88. #用我们搜索到的最佳参数,我们再看看最终的模型拟合:
  89. rf2= RandomForestClassifier(n_estimators= 60, max_depth= 13, min_samples_split= 120,
  90. min_samples_leaf= 20,max_features= 7 ,oob_score= True, random_state= 10)
  91. rf2.fit(X,y)
  92. printrf2.oob_score_
  93. #此时的输出为:0.984
  94. #可见此时模型的袋外分数基本没有提高,主要原因是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、调参步骤


   
   
  1. * 参数不大,采用GrideSearchCV来验证
  2. * 设置初始参数,比如全部默认参数
  3. * 保持learning rate 和其他booster参数不变,条件estimators参数
  4. * 固定estimator,调节learning rate
  5. * 固定learning rate,调节booste相关参数,首先从max_depth、min_child_weight开始,逐步调节可能有影响的booster参数
  6. * 固定booster参数,GridSearchCV learning rate ,得到最佳的learning rate值
  7. * 得到一组最终参数,过程类似上面描述的RandomForest的调参过程。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值