XGBoost模型理解(python实现)与GBDT/RF模型对比

目录

一、XGBoost模型理解

1、损失函数定义

2、正则项

3、树结构

4、XGBoost算法总结:

二、XGBoost、GBDT、RF三种集成模型比较

三、XGBoost模型Python实现


一、XGBoost模型理解

监督学习的目标函数定义:

XGBoost模型理解(python实现)与GBDT/RF模型对比

XGBoost模型理解(python实现)与GBDT/RF模型对比

1、损失函数定义

       损失函数通常有残差平方和(回归问题),log损失函数(分类问题),以下以残差平方和为例,log损失函数同理。

      树集成模型的最优化问题,通常是固定已训练的模型,每次增添一个树:

XGBoost模型理解(python实现)与GBDT/RF模型对比

    第t次迭代树的目标函数为:

XGBoost模型理解(python实现)与GBDT/RF模型对比

    考虑目标函数的二阶泰勒展开:

XGBoost模型理解(python实现)与GBDT/RF模型对比

        采用泰勒二阶展开式分解目标函数,意味着当损失函数为log函数等非残差平方和时,采用损失函数在当前模型的二阶泰勒展开为下颗树的目标函数。

 

2、正则项

    定义正则项为:

XGBoost模型理解(python实现)与GBDT/RF模型对比

    第一项指叶节点个数,第二项指叶节点分数的L2正则项

 

3、树结构

XGBoost模型理解(python实现)与GBDT/RF模型对比

XGBoost模型理解(python实现)与GBDT/RF模型对比

XGBoost模型理解(python实现)与GBDT/RF模型对比

    单颗树学习,选择划分的特征及特征值:

XGBoost模型理解(python实现)与GBDT/RF模型对比

    若Gain<0,节点划分后损失函数减少值小于正则项,停止划分。

 

4、XGBoost算法总结:

XGBoost模型理解(python实现)与GBDT/RF模型对比

 

二、XGBoost、GBDT、RF三种集成模型比较

 XGBoost与GBDT模型串行训练单颗树,不同点在于:

  1. XGBoost采用损失函数在当前模型的二阶泰勒展开式,作为下个模型训练的目标函数,GBDT采用损失函数在当前模型的负梯度值,作为下个模型训练的目标函数;
  2. XGBoost模型有正则项,GBDT没有正则项,更容易过拟合;
  3. 增益计算方式不同,GBDT采用的是Gini系数(分类决策树)或方差(回归决策树),XGBoost采用的是损失函数二阶泰勒展开优化公式;
  4. XGBoost支持并行,在训练前,预先对数据进行了排序,然后保存为block结构,在进行节点分裂时,XGBoost可以并行计算每个特征的最优划分值,最终选择增益最大的那个特征做分裂。
  5. XGBoost借鉴了随机森林的思想,支持列抽样和样本抽样,不仅能降低过拟合,还能减少计算。

    RF中每颗树的训练都是相互独立的,每棵树尽可能生长,达到最大精度,保证了RF具有较高的精度;每棵树的训练样本有放回地随机抽取,从特征集合中随机抽取特征子集,保证了RF有很好的泛化能力,不易过拟合。

 

三、XGBoost模型Python实现

    数据集准备:

from sklearn.datasets import load_boston
boston = load_boston()
import pandas as pd
data = pd.DataFrame(boston.data)
data.columns = boston.feature_names
data['PRICE'] = boston.target

data.head()
data.describe()

   模型训练和评估:

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
x,y = data.iloc[:,:-1],data.iloc[:,-1]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=123)
xg_reg = xgb.XGBRegressor(objective='reg:linear', max_depth = 5, n_estimators = 10, learning_rate = 0.1,subsample=1,colsample_bytree = 0.8, gamma=0,  reg_alpha = 0.1,reg_lambda=0.1)
xg_reg.fit(x_train,y_train)
preds = xg_reg.predict(x_test)
rmse = np.sqrt(mean_squared_error(y_test,preds))
print(rmse)
9.38916424696

 模型参数说明:

Objective:定义损失函数,'reg:linear'用于回归问题,’reg:logistic’用于分类问题获取分类结果,’binary:logistic’用于分类问题获取属于正样本的概率值。

Max_depth:树的最大深度

n_estimators:树的个数

Learning_rate:学习速率,[0,1]

Subsample:每棵树训练使用的样本比例,若太低,会导致欠拟合。

Colsample_bytree:每棵树训练使用的特征比例。

正则项

 Gamma:节点划分后,损失函数的减少值大于gamma

 Alpha:叶子节点个数的L1正则项

 Lambda:叶子节点得分的L2正则项。

 

 

参考资料:

https://xgboost.readthedocs.io/en/latest/tutorials/model.html

https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf

https://www.datacamp.com/community/tutorials/xgboost-in-python#hyperparameters