scikit-learn机器学习十三 (XGBOOST)

sk-learn机器学习-XGBOOST

  • 简述
  • 调用XGBOOST的两种方法
  • XGBOOST的基础——梯度提升树
  • 代码实战(波士顿数据集)
  • 重要参数
    • n_estimators
    • subsample
    • eta

简述

今天我们来看看机器学习的明星——XGBOOST

它由陈天奇设计,是一个集成运算的超强算法——当然这也决定了它背后的数学原理将非常深奥,这篇文章只是浅显的介绍一下这个大BOSS,更深的内容小伙伴可以自行挖掘哟!


调用XGBOOST的两种方法

在python中,我们可以通过两种方法调用xgboost

第一种:我们从xgboost的sklearn接口中调用,这样我们就可以使用sklearn建模的那一套流程

第二种:我们可以xgboost库来使用xgboost

安装指令一样很简单(使用pip安装)

pip install xgboost

如果安装了anaconda的小伙伴也可以从anaconda的指令安装

导入方式:

import xgboost as xgb
from xgboost import XGBRegressor as XGBR

这里讲讲xgboost自己的建模流程

xgb.DMatrix() # 导入数据
param = { } # 设置参数
model = xgb.train(param) # 训练模型
model.predict() # 预测结果

XGBOOST的基础——梯度提升树

前面在随机森林中提到过集成的含义,这里我们的XGBOOSG使用的是提升法,如果有不太理解的小伙伴可以参考下我的这篇文章

scikit-learn机器学习六 (决策树和随机森林)

集成算法通过构建多个弱评估器,汇总各个弱评估器的建模结果来获得比单个弱评估器要好的回归,分类表现。

弱评估器:定义为表现至少比随机猜测要好的模型,预测准确率不低于50%的模型

而XGBOOST就是基于二叉梯度提升树发展来的

这里使用的策略是迭代
每次建立一棵树,进行评估,然后将预测错的数据加上更大的权重,然后进行迭代,这些权重更大的数据——也就是被预测错的数据将是下一次模型建立时重点“培养对象”,每次预测错的数据都会被赋予更大的权重,经过一次次迭代,最后将模型最优化


代码实战(波士顿数据集)

下面我们就开始使用XGBOOST来建立模型吧!

首先导入我们需要的库

from xgboost import XGBRegressor as XGBR 
from sklearn.ensemble import RandomForestRegressor as RFR 
from sklearn.linear_model import LinearRegression as LinearR 
from sklearn.datasets import load_boston 
from sklearn.model_selection import KFold, cross_val_score as CVS, train_test_split as TTS 
from sklearn.metrics import mean_squared_error as MSE 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from time import time 
import datetime

导入我们的数据集

data = load_boston() 
# 波士顿数据集
x = data.data 
y = data.target

由于上次的博文已经探索过数据集了,所以这里不再探索数据集,我们直接将其放入xgboost进行训练

分割测试集和训练集进行训练

x_train,x_test,y_train,y_test = TTS(x,y,test_size=0.3,random_state=500)
 
reg = XGBR(n_estimators=100).fit(x_train,y_train) 

reg.predict(x_test) 
# 这里使用的是sklearn的那一套建模方法

重要参数feature_importances_
树模型的优势——查看参数的重要性

print(reg.feature_importances_)

输出结果:

array([0.01902167, 0.0042109 , 0.01478317, 0.00553536, 0.02222195,
       0.37914094, 0.01679687, 0.04698721, 0.04073574, 0.05491758,
       0.0668422 , 0.00869463, 0.32011184], dtype=float32)

接下来我们使用随机森林和线性回归与xgboost作个比较(使用方差作为衡量指标)

print(CVS(reg,Xtrain,Ytrain,cv=5,scoring='neg_mean_squared_error').mean())
# .mean取方差的平均数

#使用随机森林和线性回归进行一个对比 
rfr = RFR(n_estimators=100) 
 
print(CVS(rfr,Xtrain,Ytrain,cv=5,scoring='neg_mean_squared_error').mean())

lr = LinearR() 
 
print(CVS(lr,Xtrain,Ytrain,cv=5,scoring='neg_mean_squared_error').mean())

输出结果:

-16.215644658473447
-16.795004440684103
-25.3495074936485

可以看到果然xgboost在方差这项指标上是最好的


重要参数

n_estimators

这个参数是控制生成树的个数——也就是迭代的次数(默认100)

一般来说肯定是生成的树越多,模型的学习能力越强,性能提升越多——但是这容易造成过拟合——而且树的数量提升对模型的影响是有上限的

我们依然可以通过学习曲线还有细化学习曲线来取得最好的n_esitmators的值

subsample

这个参数是控制随机抽样的参数默认为1——也就是全部抽取,范围为(0, 1]

这里的随机抽样是有放回的随机抽样,所以如果我们使用该参数时,抽取的样本中包含相同的样本

当样本数量本来就很小时,一般我们不采用该参数,因为我们需要更多的样本来进行学习

eta

用于控制迭代速率,集成中的学习率,防止过拟合,默认0.3, 取值[0, 1]


感谢您的耐心阅读!一起努力变得更好吧!

你可能感兴趣的:(sklearn学习,python,机器学习,人工智能,xgboost,梯度提升树)