XGBoost模型理解(python实现)与GBDT/RF模型对比
目录
一、XGBoost模型理解
监督学习的目标函数定义:
1、损失函数定义
损失函数通常有残差平方和(回归问题),log损失函数(分类问题),以下以残差平方和为例,log损失函数同理。
树集成模型的最优化问题,通常是固定已训练的模型,每次增添一个树:
第t次迭代树的目标函数为:
考虑目标函数的二阶泰勒展开:
采用泰勒二阶展开式分解目标函数,意味着当损失函数为log函数等非残差平方和时,采用损失函数在当前模型的二阶泰勒展开为下颗树的目标函数。
2、正则项
定义正则项为:
第一项指叶节点个数,第二项指叶节点分数的L2正则项
3、树结构
单颗树学习,选择划分的特征及特征值:
若Gain<0,节点划分后损失函数减少值小于正则项,停止划分。
4、XGBoost算法总结:
二、XGBoost、GBDT、RF三种集成模型比较
XGBoost与GBDT模型串行训练单颗树,不同点在于:
- XGBoost采用损失函数在当前模型的二阶泰勒展开式,作为下个模型训练的目标函数,GBDT采用损失函数在当前模型的负梯度值,作为下个模型训练的目标函数;
- XGBoost模型有正则项,GBDT没有正则项,更容易过拟合;
- 增益计算方式不同,GBDT采用的是Gini系数(分类决策树)或方差(回归决策树),XGBoost采用的是损失函数二阶泰勒展开优化公式;
- XGBoost支持并行,在训练前,预先对数据进行了排序,然后保存为block结构,在进行节点分裂时,XGBoost可以并行计算每个特征的最优划分值,最终选择增益最大的那个特征做分裂。
- 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