今天我们来看看机器学习的明星——XGBOOST
它由陈天奇设计,是一个集成运算的超强算法——当然这也决定了它背后的数学原理将非常深奥,这篇文章只是浅显的介绍一下这个大BOSS,更深的内容小伙伴可以自行挖掘哟!
在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() # 预测结果
前面在随机森林中提到过集成的含义,这里我们的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在方差这项指标上是最好的
这个参数是控制生成树的个数——也就是迭代的次数(默认100)
一般来说肯定是生成的树越多,模型的学习能力越强,性能提升越多——但是这容易造成过拟合——而且树的数量提升对模型的影响是有上限的
我们依然可以通过学习曲线还有细化学习曲线来取得最好的n_esitmators的值
这个参数是控制随机抽样的参数默认为1——也就是全部抽取,范围为(0, 1]
这里的随机抽样是有放回的随机抽样,所以如果我们使用该参数时,抽取的样本中包含相同的样本
当样本数量本来就很小时,一般我们不采用该参数,因为我们需要更多的样本来进行学习
用于控制迭代速率,集成中的学习率,防止过拟合,默认0.3, 取值[0, 1]
感谢您的耐心阅读!一起努力变得更好吧!