python学习12之梯度推进
在本此学习中,我们将学习如何使用梯度增强来构建和优化模型。这种方法在Kaggle的许多竞争中占据主导地位,并在各种数据集上获得了最先进的结果。
1、摘要
我们已经使用随机森林方法进行了预测,该方法仅通过对许多决策树的预测进行平均就可以获得比单个决策树更好的性能。
我们把随机森林方法称为“集成方法”。根据定义,集成方法结合了几种模型的预测(例如,在随机森林的情况下,若干棵树)。
接下来,我们将学习另一种称为梯度增强的集成方法。
2、梯度推进的介绍
梯度增强是一种通过循环迭代将模型添加到集成中的方法。
它首先用一个模型初始化集成,该模型的预测可能相当天真。(即使它的预测非常不准确,后续的补充将解决这些错误。)
然后,我们开始这个循环:首先,我们使用当前集成来为数据集中的每个观察结果生成预测。
为了做出预测,我们将所有模型的预测相加。这些预测用于计算损失函数(例如,均方误差)。
然后,我们使用损失函数来拟合一个将被添加到集成中的新模型。
具体地说,我们确定模型参数,以便将这个新模型添加到集成中将减少损失。(注:“梯度增强”中的“梯度”指的是我们将在损失函数上使用梯度下降来确定新模型中的参数。)
最后,我们将新的模型加入到集成中,并且……重复
3、举例说明
在本例中,我们将使用XGBoost库。XGBoost是extreme gradient boost的缩写,它是梯度增强的一种实现,还有几个额外的特性侧重于性能和速度。
(Scikit-learn有另一个梯度增强版本,但XGBoost有一些技术优势。)
在下一个代码单元中,我们将导入用于XGBoost (XGBoost . xgbregressor)的scikit-learn API。
这使我们能够像在scikit-learn中一样构建和适应一个模型。正如您将在输出中看到的,XGBRegressor类有许多可调参数——您很快就会了解这些参数!
from xgboost import XGBRegressor my_model = XGBRegressor() my_model.fit(X_train, y_train)
接着我们需要做一些预测和评估模式:
predictions = my_model.predict(X_valid) print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))
4、参数调整
参数调优XGBoost有几个参数会显著影响精度和训练速度。
我们应该理解的第一个参数是:n_estimators n_estimators指定了经过上面描述的建模周期的次数,它等于我们在集合中包含的模型的数量。
过低的值会导致拟合不足,导致对训练数据和测试数据的预测不准确。
过高的值会导致过度拟合,从而导致对训练数据的准确预测,但对测试数据的预测不准确(这正是我们所关心的)。典型值的范围为100-1000,不过这在很大程度上取决于下面讨论的learning_rate参数。
下面是设置集成中的模型数量的代码:
my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train)
early_stopping_rounds提供了一种自动查找n_estimators的理想值的方法。早期停止导致模型在验证分数停止改进时停止迭代,即使我们还没有达到n_estimators的硬停止。
明智的做法是为n_estimators设置一个高值,然后使用early_stopping_rounds来找到停止迭代的最佳时间。
由于随机机会有时会导致验证分数没有提高的单轮测试,因此需要在停止测试前指定允许进行多少轮直接恶化的测试。
设置early_stopping_rounds=5是一个合理的选择。
在这种情况下,我们在连续5轮验证分数下降后停止。在使用early_stopping_rounds时,还需要留出一些数据来计算验证分数——这是通过设置eval_set参数来完成的。
我们可以修改上面的例子来包含早期停止:
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不是通过简单地将每个组件模型的预测相加来获得预测,我们可以在将每个模型的预测相加之前将其乘以一个小数字(称为学习率)。
这意味着我们添加到集合中的每棵树对我们的帮助更少。因此,我们可以在不过度拟合的情况下为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设置为您机器上的内核数量。对于较小的数据集,这没有帮助。
得到的模型不会更好,所以对拟合时间的微优化通常只是分散注意力。但是,它在大型数据集中非常有用,否则您将在fit命令期间花费很长时间等待。
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4)
my_model.fit(X_train. y_train,early_stopping_round=5,eval_set=[(X_valid, y_valid)],verbose=False)
5、总结
XGBoost是处理标准表格数据(存储在panda数据流中的数据类型,而不是图像和视频等更奇特的数据类型)的领先软件库。
通过仔细的参数调优,您可以训练高度精确的模型。
6、代码总结
import pandas as pd from sklearn.model_selection import train_test_split from xgboost import XGBRegressor from sklearn.metrics import mean_absolute_error data = pd.read_csv('E:/data_handle/melb_data.csv') cols_to_uses = ['Rooms', 'Distance', 'Landsize', 'BuildingArea', 'YearBuilt'] X = data[cols_to_uses] y=data.Price X_train, X_valid, y_train, y_valid = train_test_split(X,y) my_model = XGBRegressor() my_model.fit(X_train, y_train) predictions = my_model.predict(X_valid) print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid))) # my_model = XGBRegressor(n_estimators=500) # my_model.fit(X_train, y_train) # 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) # 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) my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4) my_model.fit(X_train. y_train,early_stopping_round=5,eval_set=[(X_valid, y_valid)],verbose=False)
这一章节并没有很好的理解,后面仍需要查看其他资料来理解,感觉缺少了什么,就是不求甚解,还需要多加琢磨。
本次学习到此结束!!!!!