cckchina 2018-09-15
在本教程中,我们将介绍XGBoost,这是一种机器学习算法,最近主导了应用的机器学习空间。
本文主要内容
什么是XGBoost?
XGBoost是一个开源库,为Python,Java和C ++,R和Julia 提供梯度增强。在本教程中,我们将重点介绍Python。Gradient Boosting是一种用于分类和回归问题的机器学习技术,可以从弱决策树集合中进行预测。
你为什么要用XGBoost?
您使用此算法的主要原因是其准确性,效率和可行性。它是一个线性模型和一个树学习算法,可以在一台机器上进行并行计算。它还具有用于进行交叉验证和计算特征重要性的额外功能。以下是该模型的一些主要特征:
提升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是默认值。
然后,我们使用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类的实例。参数说明如下:
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()实用程序所取的参数如下所示:
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()
您可以使用上述可视化为机器学习模型选择最相关的特征。
结论
您可以使用其他技术(如网格搜索)来改进机器学习模型。Grid Search的工作原理是对estimator的指定参数值进行详尽搜索。