梯度提升模型(gradient boosting):它是目前在结构化数据中表现最好的模型。和随机森林类似,都是集成学习的方法。随机森林是将多个决策树的预测值取平均。梯度提升梯度是一种通过循环迭代将模型添加到集合中集成的方法。它首先用单个模型初始化集合,其预测可能非常稚拙的。(即使它的预测非常不准确,随后对集合的添加也会解决这些错误。)
迭代过程:
首先,我们使用当前模型集合为数据集中的每个观测生成预测。为了进行预测,我们将集合中所有模型的预测相加。
用这些预测计算损失函数(例如,均方误差)。
然后我们用损失函数来拟合一个新模型,确定这个模型的参数,使这个模型集成到集合中能带来损失的下降。(梯度提升中的‘梯度’指我们对损失函数使用梯度下降以确定新模型中的参数。)
最后将这个模型集成到集合中。
重复以上步骤。
在本例中,您将使用XGBoost库。XGBoost代表极端梯度增强,它是梯度增强的一种实现,它的几个附加特性侧重于性能和速度。(Scikit-Learning有另一个版本的梯度增强,但XGBoost有一些技术优势。)
假设我们已经导入了训练数据和验证数据:X_train, X_valid, y_train, and y_valid.。
from xgboost import XGBRegressor
my_model = XGBRegressor()
my_model.fit(X_train, y_train)
进行预测:
from sklearn.metrics import mean_absolute_error
predictions = my_model.predict(X_valid)
print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))
XGBoost有一些参数可以极大地影响精度和训练速度.
n_estimators:即上述迭代的次数,等于我们集成的集合中包含的模型数。(过低的值会导致拟合不足,从而导致对训练数据和测试数据的不准确预测。过高的值会导致过拟合,会导致对训练数据的准确预测,但对测试数据预测不准确。典型的值从100到1000不等,尽管这在很大程度上取决于下面讨论的学习速率参数。
my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train)
early_stopping_rounds:提供一种自动找到n_estimators理想值的方法。当验证误差不再下降时,会使模型停止迭代,即使我们没有迭代到n_estimators设置的次数。明智的做法是我们给n_estimators设置一个较大得值,然后用early_stopping_round来找到最佳停止时间。有时在损失连续下降的迭代中间会出现一轮损失不下降的情况,我们设置损失连续 early_stopping_rounds轮没有下降就停止。如设置early_stopping_rounds=5.
my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train,
early_stopping_rounds=5,
eval_set=[(X_valid, y_valid)],
verbose=False)
如果以后要将模型与所有数据相匹配,请将n_estimators设置为在早期停止运行时发现的最优值。
learning_rate:除了简单地将每个模型的预测值相加,我们还可以将每个模型的预测乘以一个系数(learning_rate;0到1)再相加。这样意味着每个模型对损失的影响都变小,所以我们在不过拟合的情况下可以设置更高的n_estimators.如果我们使用早期停止,将自动确定合适的模型数。一般来说,较小的学习速度和大量的估计量将产生更精确的XGBoost模型,但由于它在整个循环中进行更多的迭代,所以训练该模型也需要更长的时间。默认情况下,XGBoost设置Learning_Rate=0.1。
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(X_train, y_train,
early_stopping_rounds=5,
eval_set=[(X_valid, y_valid)],
verbose=False)
n_jobs:在运行时为考虑的较大数据集中,您可以使用并行性来更快地构建模型。通常设置参数n_JOBS等于机器上的核数。在小数据集上是没有用的。
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4)
my_model.fit(X_train, y_train,
early_stopping_rounds=5,
eval_set=[(X_valid, y_valid)],
verbose=False)
XGBoost是一个用于处理标准表格数据的先进软件库(您在Pandas DataFrames中存储的数据类型,而不是更奇特的数据类型,如图像和视频)。通过仔细的参数调整,您可以训练出高精度的模型。