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