在机器学习模型中使用XGBoost

cckchina 2018-09-15

在机器学习模型中使用XGBoost

在本教程中,我们将介绍XGBoost,这是一种机器学习算法,最近主导了应用的机器学习空间。

本文主要内容

  • 什么是XGBoost?
  • 你为什么要用XGBoost?
  • 促进Vis-a-vis Bagging
  • 在Python中应用XGBoost
  • XGBoost的超参数
  • 使用XGBoost时的交叉验证
  • 在XGBoost中可视化特征的重要性
  • 结论

什么是XGBoost?

XGBoost是一个开源库,为Python,Java和C ++,R和Julia 提供梯度增强。在本教程中,我们将重点介绍Python。Gradient Boosting是一种用于分类和回归问题的机器学习技术,可以从弱决策树集合中进行预测。

你为什么要用XGBoost?

您使用此算法的主要原因是其准确性,效率和可行性。它是一个线性模型和一个树学习算法,可以在一台机器上进行并行计算。它还具有用于进行交叉验证和计算特征重要性的额外功能。以下是该模型的一些主要特征:

  • 稀疏性:它接受树booster 和线性booster 的稀疏输入。
  • 定制:它支持定制的目标和评估功能。
  • DMatrix:其优化的数据结构,可提高其性能和效率。

提升Vis-a-vis Bagging

Boosting是一种机器学习集成算法,它减少了将弱学习者转化为强学习者的偏差和方差。XGBoost是一个增强算法示例。另一方面,Bagging是一种技术,人们从数据中随机抽取样本,建立学习算法,找到Bagging概率。

在Python中应用XGBoost

接下来让我们展示一下如何将XGBoost应用到他们的机器学习模型中。如果您没有安装XGBoost,如果您正在使用pip包管理,可以通过在终端中键入以下命令来安装XGBoost:

pip3 install xgboost

我们将使用Scikit-learn附带的Boston Housing Dataset 。我们假设读者了解基本的科学包,如Pandas,Scikit-learn和numpy。

我们从sklearn.datasets加载数据集开始。然后我们导入pandas以使我们能够将Boston Housing Dataset转换为dataframe。接下来,我们使用feature_name 属性获取特征。我们使用target属性获取目标变量,在本例中为price列。

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

我们将使用XGBoost来预测数据集的price列。在这种情况下,数据集中的所有要素都是数字。值得注意的是,XGBoost仅适用于数值。如果我们有分类特征,我们必须使用诸如one-hot-encoding之类的技术将它们转换为数字。

接下来,我们导入XGBoost,numpy mean_squared_error,我们将其用作评估指标,以检查训练模型在测试数据集上的性能。然后,我们继续使用pandas iloc实用程序将特征变量与目标变量分开。

import xgboost as xgb
from sklearn.metrics import mean_squared_error
import numpy as np
X, y = data.iloc[:,:-1],data.iloc[:,-1]

为了充分利用XGBoost的性能和效率,我们将数据集转换为DMatrix。这是通过使用XGBoost的Dmatrix函数实现的。

data_dmatrix = xgb.DMatrix(data=X,label=y)

XGBoost的超参数

XGBoost为我们提供了一种调整参数的方法,以获得最佳结果。基于树的学习者(如XGBoost)最常见的调整参数是:

. Booster:指定使用哪种booster 。它可以是gbtree,gblinear或者dart。gbtree和dart使用基于树模型,而gblinear使用线性函数。gbtree是默认值。

  • silent:0表示打印运行消息。1表示静音模式。默认值为0。
  • nthread 是用于运行XGBoost的并行线程数。
  • disable_default_eval_metric是禁用默认度量标准的标志。设置为> 0以禁用。默认值为0。
  • num_pbuffer是预测缓冲区的大小,通常设置为训练实例的数量。缓冲区用于保存最后一个boosting 步骤的预测结果。它由XGBoost自动设置,因此无需由用户设置
  • num_feature是boosting中使用的特征尺寸,设置为特征的最大尺寸。它由XGBoost自动设置,因此不需要由用户设置

然后,我们使用model_selection模块中的train_test_split函数将数据集分割为训练和测试集。我们将测试大小设置为20%,并将随机状态设置为100,以确保得到相同的结果。

from sklearn.model_selection import train_test_split
 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)

下一步是创建XGBoost Regressor类的实例。参数说明如下:

  1. objective =’reg:linear’ 指定学习任务是线性的。
  2. colsample_bytree是构造每棵树时列的子采样率。子采样将在每次boosting迭代中发生一次。该数字的范围为0到1。
  3. learning_rate是步长shrinkage ,用于防止过度拟合。该数字的范围为0到1。
  4. max_depth指定树的最大深度。增加此数字会使模型复杂化并增加过度拟合的可能性。默认值为6。
  5. alpha是权重的L1正则化。增加这个数字使模型更加保守。
  6. n_estimators 是适合增强树木的数量
xg_reg = xgb.XGBRegressor(objective ='reg:linear', colsample_bytree = 0.3, learning_rate = 0.1, max_depth = 5,alpha = 10, n_estimators = 10)

下一步是调整回归量并使用它进行预测。

xg_reg.fit(X_train,y_train)
preds = xg_reg.predict(X_test)

在此之后,我们计算均方根误差,以评估我们模型的性能。

xg_reg.fit(X_train,y_train)
preds = xg_reg.predict(X_test)

使用XGBoost时的交叉验证

使用交叉验证使模型更加健壮是一种非常常见的做法。XGboost通过该cv() 函数支持K-fold验证。我们将使用它来对我们的模型应用交叉验证。

现在我们指定一个新的变量params来保存除n_estimators之外的所有参数,因为我们将使用cv()工具中的num_boost_rounds。cv()实用程序所取的参数如下所示:

  1. dtrain 是要训练的数据。
  2. params 指定booster 参数。
  3. nfold 是交叉验证函数中的folds 数。
  4. num_boost_round 是boosting迭代的数量。
  5. early_stopping_rounds 激活early stopping。CV error 需要至少每轮<early_stopping_rounds>)减少才能继续。
  6. metrics 是交叉验证中要观察的评估指标。
  7. as_pandas如果True将返回一个pandas dataframe; 如果为false,它将返回一个numpy数组。
params = {"objective":"reg:linear",'colsample_bytree': 0.3,'learning_rate': 0.1,
 'max_depth': 5, 'alpha': 10}
 
cv_results = xgb.cv(dtrain=data_dmatrix, params=params, nfold=5,
num_boost_round=50,early_stopping_rounds=10,metrics="rmse", as_pandas=True, seed=100

该cv_results变量将返回训练并测试每次boosting round的RMSE。最终 boosting round 指标可以如下获得:

print((cv_results["test-rmse-mean"]).tail(1))

在XGBoost中可视化特征重要性

您可能有兴趣查看数据集中最重要的特征。

XGBoost具有一个plot_importance()函数,使您可以查看数据集中按重要性排名的所有特征。Python代码如下:

import matplotlib.pyplot as plt
xgb.plot_importance(xg_reg)
plt.rcParams['figure.figsize'] = [5, 5]
plt.show()

在机器学习模型中使用XGBoost

您可以使用上述可视化为机器学习模型选择最相关的特征。

结论

您可以使用其他技术(如网格搜索)来改进机器学习模型。Grid Search的工作原理是对estimator的指定参数值进行详尽搜索。

相关推荐