赞
踩
目录
Sklearn中集成学习模块
XGBoost的参数一共分为三类:
Note: 下面介绍的参数都是个人觉得比较重要的。
booster
:我们有两种参数选择,gbtree
和gblinear
。gbtree是采用树的结构来运行数据,而gblinear是基于线性模型。silent
:静默模式,为1
时模型运行不输出。nthread
: 使用线程数,一般我们设置成-1
,使用所有线程。如果有需要,我们设置成多少就是用多少线程。n_estimator
: 也作num_boosting_rounds
这是生成的最大树的数目,也是最大的迭代次数。
learning_rate
: 有时也叫作eta
,系统默认值为0.3
,。每一步迭代的步长,很重要。太大了运行准确率不高,太小了运行速度慢。我们一般使用比默认值小一点,0.1
左右就很好。
gamma
:系统默认为0
,我们也常用0
。在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。gamma
指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。因为gamma
值越大的时候,损失函数下降更多才可以分裂节点。所以树生成的时候更不容易分裂节点。范围: [0,∞]
subsample
:系统默认为1
。这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1
,0.5
代表平均采样,防止过拟合. 范围: (0,1]
,注意不可取0
colsample_bytree
:系统默认值为1。我们一般设置成0.8左右。用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1
范围: (0,1]
colsample_bylevel
:默认为1,我们也设置为1.这个就相比于前一个更加细致了,它指的是每棵树每次节点分裂的时候列采样的比例
max_depth
: 系统默认值为6
我们常用3-10
之间的数字。这个值为树的最大深度。这个值是用来控制过拟合的。max_depth
越大,模型学习的更加具体。设置为0
代表没有限制,范围: [0,∞]
max_delta_step
:默认0
,我们常用0
.这个参数限制了每棵树权重改变的最大步长,如果这个参数的值为0
,则意味着没有约束。如果他被赋予了某一个正值,则是这个算法更加保守。通常,这个参数我们不需要设置,但是当个类别的样本极不平衡的时候,这个参数对逻辑回归优化器是很有帮助的。
lambda
:也称reg_lambda
,默认值为0
。权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。
alpha
:也称reg_alpha
默认为0
,scale_pos_weight
:默认为1
objective [缺省值=reg:linear]
reg:linear
– 线性回归reg:logistic
– 逻辑回归binary:logistic
– 二分类逻辑回归,输出为概率binary:logitraw
– 二分类逻辑回归,输出的结果为wTxcount:poisson
– 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7 (used to safeguard optimization)multi:softmax
– 设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)multi:softprob
– 如同softmax,但是输出结果为ndata*nclass的向量,其中的值是每个数据分为每个类的概率。eval_metric [缺省值=通过目标函数选择]
rmse
: 均方根误差mae
: 平均绝对值误差logloss
: negative log-likelihooderror
: 二分类错误率。其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。 error@t: 不同的划分阈值可以通过 ‘t’进行设置merror
: 多分类错误率,计算公式为(wrong cases)/(all cases)mlogloss
: 多分类log损失auc
: 曲线下的面积ndcg
: Normalized Discounted Cumulative Gainmap
: 平均正确率一般来说,我们都会使用xgboost.train(params, dtrain)函数来训练我们的模型。这里的params指的是booster参数。
- import xgboost as xgb
- import pandas as pd
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import roc_auc_score
-
- train_data = pd.read_csv('train.csv') # 读取数据
- y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
- col = train_data.columns
- x = train_data[col].values # 剩下的列作为训练数据
- train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
- # 这里不需要Dmatrix
-
- parameters = {
- 'max_depth': [5, 10, 15, 20, 25],
- 'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
- 'n_estimators': [500, 1000, 2000, 3000, 5000],
- 'min_child_weight': [0, 2, 5, 10, 20],
- 'max_delta_step': [0, 0.2, 0.6, 1, 2],
- 'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],
- 'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],
- 'reg_alpha': [0, 0.25, 0.5, 0.75, 1],
- 'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
- 'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]
-
- }
-
- xlf = xgb.XGBClassifier(max_depth=10,
- learning_rate=0.01,
- n_estimators=2000,
- silent=True,
- objective='binary:logistic',
- nthread=-1,
- gamma=0,
- min_child_weight=1,
- max_delta_step=0,
- subsample=0.85,
- colsample_bytree=0.7,
- colsample_bylevel=1,
- reg_alpha=0,
- reg_lambda=1,
- scale_pos_weight=1,
- seed=1440,
- missing=None)
-
- # 有了gridsearch我们便不需要fit函数
- gsearch = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3)
- gsearch.fit(train_x, train_y)
-
- print("Best score: %0.3f" % gsearch.best_score_)
- print("Best parameters set:")
- best_parameters = gsearch.best_estimator_.get_params()
- for param_name in sorted(parameters.keys()):
- print("\t%s: %r" % (param_name, best_parameters[param_name]))
-

我们都知道,XGBoost 一共有三类参数通用参数,学习目标参数,Booster参数,那么对于LightGBM,我们有核心参数,学习控制参数,IO参数,目标参数,度量参数,网络参数,GPU参数,模型参数,这里我常修改的便是核心参数,学习控制参数,度量参数等。更详细的请看LightGBM中文文档(https://lightgbm.apachecn.org/#/docs/6)
关键参数一览表
LGB里面的boosting参数要比xgb多不少,我们有传统的gbdt,也有rf,dart,doss,最后两种不太深入理解,但是试过,还是gbdt的效果比较经典稳定
这里官方文档提到,数字设置成cpu内核数比线程数训练效更快(考虑到现在cpu大多超线程)。并行学习不应该设置成全部线程,这反而使得训练速度不佳。
总的来说,我还是觉得LightGBM比XGBoost用法上差距不大。参数也有很多重叠的地方。
很多XGBoost的核心原理放在LightGBM上同样适用。 同样的,Lgb也是有train()函数和LGBClassifier()与LGBRegressor()函数。后两个主要是为了更加贴合sklearn的用法,这一点和XGBoost一样。
- import pandas as pd
- import lightgbm as lgb
- from sklearn.grid_search import GridSearchCV # Perforing grid search
- from sklearn.model_selection import train_test_split
-
- train_data = pd.read_csv('train.csv') # 读取数据
- y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
- col = train_data.columns
- x = train_data[col].values # 剩下的列作为训练数据
- train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
- train = lgb.Dataset(train_x, train_y)
- valid = lgb.Dataset(valid_x, valid_y, reference=train)
-
-
- parameters = {
- 'max_depth': [15, 20, 25, 30, 35],
- 'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
- 'feature_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
- 'bagging_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
- 'bagging_freq': [2, 4, 5, 6, 8],
- 'lambda_l1': [0, 0.1, 0.4, 0.5, 0.6],
- 'lambda_l2': [0, 10, 15, 35, 40],
- 'cat_smooth': [1, 10, 15, 20, 35]
- }
- gbm = lgb.LGBMClassifier(boosting_type='gbdt',
- objective = 'binary',
- metric = 'auc',
- verbose = 0,
- learning_rate = 0.01,
- num_leaves = 35,
- feature_fraction=0.8,
- bagging_fraction= 0.9,
- bagging_freq= 8,
- lambda_l1= 0.6,
- lambda_l2= 0)
- # 有了gridsearch我们便不需要fit函数
- gsearch = GridSearchCV(gbm, param_grid=parameters, scoring='accuracy', cv=3)
- gsearch.fit(train_x, train_y)
-
- print("Best score: %0.3f" % gsearch.best_score_)
- print("Best parameters set:")
- best_parameters = gsearch.best_estimator_.get_params()
- for param_name in sorted(parameters.keys()):
- print("\t%s: %r" % (param_name, best_parameters[param_name]))

max_bin
num_leaves
min_data_in_leaf
和 min_sum_hessian_in_leaf
bagging_fraction
和 bagging_freq
来使用 baggingfeature_fraction
<1来使用特征抽样lambda_l1
, lambda_l2
和 min_gain_to_split
来使用正则max_depth
来避免生成过深的树 XGBoost | LightGBM | 范围 | |
叶子数 | num_leaves,默认为 | num_leaves | range(35,65,5) |
树深 | max_depth,默认为6 | max_depth | range(3,10,2) |
样本抽样 | subsample | bagging_fraction,subsample | [i/10.0 for i in range(6,10)] |
特征抽样 | colsample_bytree | feature_fraction,colsample_bytree | [i/10.0 for i in range(6,10)] |
L1正则化 | alpha,reg_alpha | lambda_l2,reg_alpha | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
L2正则化 | lambda,reg_lambda | lambda_l1,reg_lambda | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
参考:https://www.jianshu.com/p/1100e333fcab
1. n_estimators: 也就是最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。
2. oob_score :即是否采用袋外样本来评估模型的好坏。默认识False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。
3. criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。
重要参数情况一览表
参考:https://www.cnblogs.com/yujingwei/p/11074613.html
1. max_features: RF划分时考虑的最大特征数。可以使用很多种类型的值,默认是"auto",意味着划分时最多考虑N−−√N个特征;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般我们用默认的"auto"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
2. max_depth: 决策树最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
3. min_samples_split: 内部节点再划分所需最小样本数。这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
4. min_samples_leaf: 叶子节点最少样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
5. min_weight_fraction_leaf:叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
6. max_leaf_nodes: 最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
7. min_impurity_split: 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。
- 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
- #导入数据
- train = pd.read_csv('train_modified.csv')
- target='Disbursed' # Disbursed的值就是二元分类的输出
- IDcol = 'ID'
- train['Disbursed'].value_counts()
-
- 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)
-
- 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_
-
- 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.grid_scores_, gsearch2.best_params_, gsearch2.best_score_
-
- 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)
- print rf1.oob_score_
-
-
- 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)
- gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_
-
- 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_
-
- # 看最终的模型拟合
- 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)
- print rf2.oob_score_

参考:https://www.cnblogs.com/pinard/p/6160412.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。