随机森林参数记录
- 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的调参过程。