0/参数网址

blog.csdn.net/momokofly/a… blog.csdn.net/Amanda_pyth… blog.csdn.net/qq_36535820…

xgboost包含原生接口和 sklearn 风格接口两种,并且二者都实现了分类和回归的功用。
回归:label是个接连值
分类:label是离散值,二分类和多分类

1/xgboost原生库接口

陈天奇创造了XGBoost算法后,很快就和一群机器学习爱好者建立了专门的XGBoost库,名为xgboost
xgboost是一个独立的、开源的,并且专门供给梯度提高树以及XGBoost算法运用的算法库。
它和sklearn相似,有一个具体的官方网站能够供给学习资料,并且能够与C、Python、R、Julia等言语连用,但需求独自装置和下载。
装置或许更新xgboost原生库:
    pip install xgboost             # 装置xgboost库
    pip install --upgrade xgboost   # 更新xgboost库
运用xgboost原生库:
    import xgboost as xgb
建模流程:

机器学习:xgboost原生库接口(陈天奇) && xgboost的sklearn接口

从上图能够知道,xgboost原生库练习模型用的是train()函数,猜测用的是predict()函数。
xgboost原生库有必要先运用字典设置好参数,再用train()函数把参数集传入,然后再进行练习。
(sklearn是把一切的参数都写在类中)
xgboost原生库之所以要提前把参数写在一个字典中,是因为xgboost算法的参数实在是太多了,
假如全部写在xgb.train()函数中,不太漂亮,并且简单犯错。
DMatrix()类:用于封装数据,它是XGBoost自定义的一个数据矩阵类,
            目的是这种定义方法能够优化存储和运算速度。
            假如你想运用xgboost原生接口,你就有必要把你的数据传入这个DMatrix()类,
            然后把数据转化成必要的方法,然后经过train()函数进行模型的练习。
    import xgboost as xgb
    from sklearn.datasets import load_boston
    boston_data = load_boston()
    X = boston_data.data
    y = boston_data.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=420)
    # 原生接口和sklearn接口不同的一个地方是:
    # 原生接口的数据,需求经过xgb.DMatrix()函数进行转化
    dtrain = xgb.DMatrix(X_train, label=y_train)
    dtest = xgb.DMatrix(X_test, label=y_test)
    # params:弱评价器(booster)有关的参数
    params = {
        'eta': 0.1, # 学习率
        'max_depth':5 # 树的最大深度
    }
    num_round = 20 # 迭代轮数
    xgb_model = xgb.train(params=params,             # 设置模型参数
                          dtrain=dtrain,             # dtrain:练习数据集,包含特征和标签
                          num_boost_round = num_round  # 迭代轮数
                   ) 
    y_pred = xgb_model.predict(dtest)
    mean_squared_error(y_test, y_pred)
    # 也能够一边练习,一边测验 
    xgb_model = xgb_model.train(
                 params=params, 
                 dtrain=dtrain, 
                 num_boost_round = num_round, 
                 evals=[(dtrain, 'train'),(dtest, 'test')] # evals:验证数据集
    )  
    ```
    XGBoost原生接口有必要先运用字典设定参数集,再运用train()将参数输入,进行练习;
    以下是xgboost.train()函数的运用方法:
    params {eta, 
            gamma, 
            max_depth, 
            min_child_weight, 
            max_delta_step, 
            subsample, 
            colsample_bytree, 
            colsample_bylevel,
            colsample_bynode, 
            lambda, 
            alpha, 
            tree_method_string, 
            sketch_eps, 
            scale_pos_weight, 
            updater, 
            refresh_leaf, 
            process_type, 
            grow_policy, 
            max_leaves, 
            max_bin, 
            predictor, 
            num_parallel_tree}
    xgboost.train(params, 
                  dtrain, 
                  num_boost_round = 10, 
                  evals = (), 
                  obj = None, 
                  feval = None, 
                  maximize = False, 
                  early_stopping_rounds = None, 
                  evals_result = None, 
                  verbose_eval = True, 
                  xgb_model = None, 
                  callbacks = None, 
                  learning_rates = None)
    xgboost原生接口,数据需求经过:
          输入数据标准化(xgboost.DMatrix),
          label标准化(LabelEncoder().fit_transform),
          输出成果反标签标准化(LabelEncoder().inverse_transform).
    练习调用train()猜测调用predict()

2/xgboost中的sklearn中的接口

from xgboost.sklearn import XGBClassifier   # 分类
from xgboost.sklearn import XGBRegressor    # 回归
XGBRegressor(max_depth = 3, 
             learning_rate = 0.1, 
             n_estimators = 100, 
             silent = True, 
             objective = ‘reg:linear’, 
             booster = ‘gbtree’, 
             n_jobs = 1, 
             nthread = None, 
             gamma = 0, 
             min_child_weight = 1, 
             max_delta_step = 0, 
             subsample = 1,
             colsample_bytree = 1, 
             colsample_bylevel = 1, 
             reg_alpha = 0, 
             reg_lambda = 1, 
             scale_pos_weight = 1, 
             base_score = 0.5, 
             random_state = 0, 
             seed = None, 
             missing = None, 
             importance_type = ‘gain’, ∗ ∗ ** ∗∗kwargs)
xgboost原生库和sklearn中的接口,输入的参数有点不同,可是看起来很接近。
比方xgboost原生库中的字典params中的eta参数,其实就是XGBRegressor中的learning_rate,步长。
他们虽然名字不同,可是功用是相同的。只是sklearn的开发团队很友爱的把参数称号调整成了和sklearn中其它算法相似的姿态。
from xgboost.sklearn import XGBRegressor    # 回归
from sklearn.datasets import load_boston 
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error,
                  accuracy_score,precision_score, recall_score 
from sklearn.model_selection import train_test_split 
import math 
# 数据预备
boston_data = load_boston() 
X = boston_data.data 
y = boston_data.target 
# 区分练习集,测验集合
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=420)
# 先实例化一个模型
xgb_reg = XGBRegressor(n_estimators = 20, #迭代次数 l
                       earning_rate = 0.1, #学习率 
                       max_depth=5 )
# 然后经过fit()练习模型
# sklearn接口不同对数据进行格式的转化
xgb_reg.fit(X_train, y_train) 
ypred = xgb_reg.predict(X_test) 
mean_squared_error(y_test, ypred)
math.sqrt(mean_squared_error(y_test, ypred))
# 设置eval_set参数,能够一边练习,一边测验 
reg.fit(X_train, y_train, eval_set = [(X_train, y_train), (X_test, y_test)])

3/xgboost的3大核心

集成算法自身
弱学习期
核算速度(开启的线程数)

机器学习:xgboost原生库接口(陈天奇) && xgboost的sklearn接口

机器学习:xgboost原生库接口(陈天奇) && xgboost的sklearn接口

机器学习:xgboost原生库接口(陈天奇) && xgboost的sklearn接口

4/弱学习器的数量的作用,产生的影响论:

首要,XGB中的树的数量决定了模型的学习才干,树的数量越多,模型的学习才干越强。
只需XGB中树的数量足够了,即使只要很少的数据,模型也能够学到练习数据100%的信息,所以XGB也是天生过拟合的模型。但在这种情况下,模型会变得十分不稳定。
第二,XGB中树的数量很少的时分,对模型的影响较大,当树的数量现已许多的时分,对模型的影响比较小,只能有微弱的改变。当数据自身就处于过拟合的时分,再运用过多的树能抵达的效果甚微,反而糟蹋核算资源。当仅有方针 R 2 R^2 R2或许准确率给出的n_estimators看起来不太可靠的时分,能够改造学习曲线来协助挑选参数。
第三,树的数量提高对模型的影响有极限,最开端,模型的表现会跟着XGB的树的数量一同提高,但抵达某个点之后,树的数量越多,模型的效果会逐步下降,这也说明了暴力添加n_estimators不一定有效果。
这些都和随机森林中的参数n_estimators表现出一致的状态。
在随机森林中总是先调整n_estimators,当n_estimators的极限已抵达,才考虑其他参数,
但XGB中的情况显着更加复杂,当数据集不太寻常的时分会更加复杂,这是要给出的第一个超参数,因而仍是主张优先调整n_estimators,一般都不会主张一个太大的数目,300以下为佳。

5/subsample参数的作用

首要参数是每棵树用来练习的数据的数占总数据的份额。
能够削减过拟合。

6/总结

xgboost原生库的运算速度和参数设定,都要比sklearn简单。
一切,总的来说,仍是主张大家用xgboost原生库,import xgboost as xgb
先区分练习集和测验集
然后转化数据格式。
练习运用train(),猜测运用predict()
练习集上的表现展示了模型的学习才干,测验集上的表现展示了模型的泛化才干,通常模型在测验集上的表现不太可能超过练习集,因而希望测验集的学习曲线能够努力迫临练习集的学习曲线。

7/差异

两种运用方法的差异:
建模流程略有不同:原生库的数据有必要封装在DMatrix()中,再进行练习;sklearnAPI没有数据封装的进程;
原生XGBoost库的大部分参数经过params参数传递;sklearnAPI没有params这个参数,一切参数都是直接在类里边赋值,比方XGBRegressor()回归类,XGBClassifier()分类类。
原生XGBoost库的train()函数即可用来处理分类问题,也可用来处理回归问题,具体是处理什么问题,是经过params参数中的objective参数来指定的。
sklearnAPI别离封装了分类函数与回归函数,XGBRegressor()回归类,XGBClassifier()分类类。

8/怎么衡量模型的好坏

# 核算准确率
# 包含正样本和负样本,一切的样本都要核算准确率
from sklearn.metrics import accuracy_score    
# 核算准确率,只考虑正样本
# 在有些场景中,我们只需求考虑正样本,负样本猜测的对错没有太大的影响。
from sklearn.metrics import precision_score   
# 核算召回率
# 假如不是很介意召回,则能够不核算该方针
from sklearn.metrics import recall_score    
# 准确率和召回率的调和衡量方针
# f1score以为召回率和准确率相同重要,f0.5score以为召回率的重要程度是准确率的一半
# f2score以为召回率的重要程度是准确率的2倍。
from sklearn.metrics import f1_score          

9/二者的参数的差异

(1)重要参数

1.booster

用于指定弱学习器的类型,默认值为 ‘gbtree’,表明运用根据树的模型进行核算。还能够挑选为 ‘gblinear’ 表明运用线性模型作为弱学习器。

引荐设置为 ‘gbtree’,本文后面的相关参数设置都以booster设置为’gbtree’为条件。

2.eta / learning_rate

参考XGBoost算法的相关知识,不难发现XGBoost为了避免过拟合,引入了”Shrinkage”的思维,即不完全信赖每个弱学习器学到的残差值。为此需求给每个弱学习器拟合的残差值都乘上取值范围在(0, 1] 的 eta,设置较小的 eta 就能够多学习几个弱学习器来补偿缺乏的残差。

在XGBClassifier与XGBRegressor中,对应参数名为 learning_rate。

引荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]

3.gamma

指定叶节点进行分支所需的丢失削减的最小值,默认值为0。设置的值越大,模型就越保存。

引荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1] **

4.alpha / reg_alpha

L1正则化权重项,添加此值将使模型更加保存。

在XGBClassifier与XGBRegressor中,对应参数名为 reg_alpha 。

引荐的候选值为:[0, 0.01~0.1, 1]

5.lambda / reg_lambda

L2正则化权重项,添加此值将使模型更加保存。

在XGBClassifier与XGBRegressor中,对应参数名为 reg_lambda。

引荐的候选值为:[0, 0.1, 0.5, 1]

6.max_depth

指定树的最大深度,默认值为6,合理的设置能够避免过拟合。

引荐的数值为:[3, 5, 6, 7, 9, 12, 15, 17, 25]。

7.min_child_weight

指定孩子节点中最小的样本权重和,假如一个叶子节点的样本权重和小于min_child_weight则拆分进程完毕,默认值为1。

引荐的候选值为:[1, 3, 5, 7]

8.subsample

默认值1,指定采样出 subsample * n_samples 个样本用于练习弱学习器。留意这儿的子采样和随机森林不相同,随机森林运用的是放回抽样,而这儿是不放回抽样。 取值在(0, 1)之间,设置为1表明运用一切数据练习弱学习器。假如取值小于1,则只要一部分样本会去做GBDT的决策树拟合。挑选小于1的份额能够削减方差,即避免过拟合,可是会添加样本拟合的误差,因而取值不能太低。

引荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1]

9.colsample_bytree

构建弱学习器时,对特征随机采样的份额,默认值为1。

引荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1]

10.objective

用于指定学习使命及相应的学习方针,常用的可选参数值如下:
“reg:linear”,线性回归(默认值)。
“reg:logistic”,逻辑回归。
“binary:logistic”,二分类的逻辑回归问题,输出为概率。
“multi:softmax”,采用softmax函数处理多分类问题,一起需设置参数num_class指定类别个数。

11.num_class

用于设置多分类问题的类别个数。

12.eval_metric

用于指定评价方针,能够传递各种评价方法组成的list。常用的评价方针如下:

‘rmse’,用于回归使命

‘mlogloss’,用于多分类使命

‘error’,用于二分类使命

‘auc’,用于二分类使命

13.silent

数值型,表明是否输出运转进程的信息,默认值为0,表明打印信息。设置为1时,不输出任何信息。

引荐设置为 0 。

14.seed / random_state

指定随机数种子。

在XGBClassifier与XGBRegressor中,对应参数名为 random_state 。

(2)练习参数

以xgboost.train为主,参数及默认值如下:
xgboost.train(params, dtrain, num_boost_round=10, evals=(),

obj=None, feval=None, maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None)

 **1.params**

字典类型,用于指定各种参数,例如:{‘booster’:‘gbtree’,‘eta’:0.1}

2.dtrain

用于练习的数据,经过给下面的方法传递数据和标签来构造:

dtrain = xgb.DMatrix(data, label=label)

3.num_boost_round

指定最大迭代次数,默认值为10

4.evals

列表类型,用于指定练习进程中用于评价的数据及数据的称号。例如:[(dtrain,‘train’),(dval,‘val’)]

5.obj

能够指定二阶可导的自定义方针函数。

6.feval

自定义评价函数。

7.maximize

是否对评价函数最大化,默认值为False。

8.early_stopping_rounds

指定迭代多少次没有得到优化则中止练习,默认值为None,表明不提前中止练习。 假如设置了此参数,则模型会生成三个特点:

best_score
best_iteration
best_ntree_limit

留意:evals 有必要非空才干生效,假如有多个数据集,则以最终一个数据集为准。

9.verbose_eval

能够是bool类型,也能够是整数类型。假如设置为整数,则每距离verbose_eval次迭代就输出一次信息。

10.xgb_model

加载之前练习好的 xgb 模型,用于增量练习。

猜测函数

主要是下面的两个函数:

1.predict(data) :回来每个样本的猜测成果

2.predict_proba(data) :回来每个样本归于每个类别的概率

留意:data 是由 DMatrix 函数封装后的数据。

参数怎么调整

xgboost 调参思路
(1)挑选较高的学习率(**learning_rate**),例如0.1,这样能够削减迭代用时。
(2)然后对 max_depth , min_child_weight , gamma , subsample, colsample_bytree 这些参数进行调整。这些参数的适宜候选值为:

max_depth:[3, 5, 6, 7, 9, 12, 15, 17, 25]

min_child_weight:[1, 3, 5, 7]

gamma:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1]

subsample:[0.6, 0.7, 0.8, 0.9, 1]

colsample_bytree:[0.6, 0.7, 0.8, 0.9, 1]

3)调整正则化参数alpha,lambda , 这些参数的适宜候选值为:

alpha:[0, 0.01~0.1, 1] lambda :[0, 0.1, 0.5, 1]

(4)降低学习率,继续调整参数:

学习率(learning_rate)适宜候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]