9.XGBoost

本教程是机器学习系列的一部分。 在此步骤中,您将学习如何使用功能强大的xgboost库构建和优化模型。

What is XGBoost

XGBoost是处理标准表格数据的领先模型(您在Pandas DataFrames中存储的数据类型,而不是像图像和视频这样的更奇特的数据类型)。 XGBoost模型在许多Kaggle比赛中占据主导地位。

为了达到峰值精度,XGBoost模型比Random Forest等技术需要更多的知识和模型调整。 在本教程之后,你将能够

  •      遵循XGBoost的完整建模工作流程
  •      微调XGBoost模型以获得最佳性能

XGBoost是Gradient Boosted决策树算法的一种实现(scikit-learn有另一个版本的算法,但XGBoost有一些技术优势。)什么是Gradient Boosted决策树? 我们将通过一个图表。

我们经历了重复构建新模型的循环,并将它们组合成一个整体模型。 我们通过计算数据集中每个观察的误差来开始循环。 然后我们构建一个新模型来预测。 我们将此误差预测模型的预测添加到“模型集合”中。

为了进行预测,我们添加了以前所有模型的预测。 我们可以使用这些预测来计算新误差,构建下一个模型,并将其添加到整体中。

那个周期之外还有一件。 我们需要一些基础预测来开始循环。 在实践中,最初的预测可能非常幼稚。 即使它的预测非常不准确,随后对整体的添加将解决这些错误。

这个过程可能听起来很复杂,但使用它的代码很简单。 我们将在下面的模型调整部分填写一些额外的解释性细节。

Example

我们将从预先加载到train_X,test_X,train_y,test_x的数据开始。

[1]

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Imputer

data = pd.read_csv('../input/train.csv')
data.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = data.SalePrice
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])
train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)

my_imputer = Imputer()
train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)
/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:9: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.
  if __name__ == '__main__':
/opt/conda/lib/python3.6/site-packages/sklearn/utils/deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.
  warnings.warn(msg, category=DeprecationWarning)

我们像在scikit-learn建立模型和拟合。

【2】

from xgboost import XGBRegressor

my_model = XGBRegressor()
# Add silent=True to avoid printing out updates with each cycle
my_model.fit(train_X, train_y, verbose=False)

我们同样评估模型并像在scikit-learn中那样进行预测。

【3】

# make predictions
predictions = my_model.predict(test_X)

from sklearn.metrics import mean_absolute_error
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))
Mean Absolute Error : 17543.750299657535

Model Tuning

XGBoost有一些参数可以显着影响您的模型的准确性和训练速度。您应该了解的第一个参数是:
n_estimators 和 early_stopping_rounds

n_estimators指定完成上述建模周期的次数。

在欠拟合vs过拟合图中,n_estimators将您向右移动。值太低会导致欠拟合,这对训练数据和新数据的预测都是不准确的。太大的值会导致过度拟合,这时对训练数据的预测准确,但对新数据的预测不准确(这是我们关心的)。您可以试验数据集以找到理想值。典型值范围从100到1000,但这很大程度上取决于下面讨论的学习率。

参数early_stopping_rounds提供了一种自动查找理想值的方法。过早停止会导致模型在验证分数停止改善时停止迭代,即使我们不是n_estimators的硬停止。为n_estimators设置一个高值然后使用early_stopping_rounds找到停止迭代的最佳时间是明智的。

由于随机机会有时会导致单轮,其中验证分数没有提高,因此您需要指定一个数字,以确定在停止前允许多少轮直线恶化。 early_stopping_rounds = 5是一个合理的值。因此,我们在连续5轮恶化的验证分数后停止。

以下是适合early_stopping的代码:

【4】

my_model = XGBRegressor(n_estimators=1000)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
       colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,
       max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,
       n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
       silent=True, subsample=1)

使用early_stopping_rounds时,您需要留出一些数据来检查要使用的轮数。 如果您以后想要使用所有数据拟合模型,请将n_estimators设置为在过早停止运行时发现的最佳值。

learning_rate

对于更好的XGBoost模型,这是一个微妙但重要的技巧:

我们不是通过简单地将每个组件模型中的预测相加来获得预测,而是将每个模型的预测乘以一个小数字,然后再添加它们。这意味着我们添加到集合中的每个树都会减少我们的预测。 在实践中,这降低了模型过度拟合的倾向。

因此,您可以使用更高的n_estimators值而不会过度拟合。 如果使用过早停止,将自动设置适当数量的树。

一般来说,较小的学习率(以及大量的估算器)将产生更准确的XGBoost模型,尽管它也会使模型更长时间进行训练,因为它在整个循环中进行了更多的迭代。

修改上面的示例以包含学习率将产生以下代码:

【5】

my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
       colsample_bytree=1, gamma=0, learning_rate=0.05, max_delta_step=0,
       max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,
       n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
       silent=True, subsample=1)

n_jobs

在较大数据集上需要考虑运行时间,您可以使用并行性来更快地构建模型。通常将参数n_jobs设置为等于计算机上的核心数。在较小的数据集上,这无济于事。

由此产生的模型将不会更好,因此对于拟合时间的微优化通常只是分散注意力。但是,它在大型数据集中非常有用,否则您将在fit命令期间等待很长时间。

XGBoost有许多其他参数,但这些参数将消耗更长时间帮助您微调XGBoost模型以获得最佳性能。

Conclusion


XGBoost是目前用于在传统数据(也称为表格或结构数据)上构建精确模型的主要算法。去应用它来改进你的模型!

Your Turn


使用XGBoost转换你的模型。
使用提前停止为n_estimators找到一个好的值。然后使用所有训练数据和n_estimators的值重新估计模型。
完成后,返回学习机器学习,继续改进。

你可能感兴趣的:(Machine,Learning)