Kaggle学习笔记之XGBoost

https://www.kaggle.com/code/alexisbcook/xgboost

sota:state-of-the-art

梯度提升 gradient boosting

XGBoost是结构化数据中最精确的建模技术。

介绍

在之前的课程中,使用随机森林方法进行预测,通过平均多个决策树的方式,实现比单个决策树更好的表现。随机森林就是一种集成方法(ensemble method)。根据定义,集成方法结合了多个模型的预测(如随机森林和决策树)。

梯度提升(gradient boosting)也是一种集成方法。

梯度提升

梯度提升是一种通过循环迭代地将模型添加到集成中的方法。

它首先使用单个模型初始化集成,其预测可能非常幼稚。 (即使它的预测非常不准确,随后对整体的添加也将解决这些错误。)

然后,我们开始循环:

  • 首先,我们使用当前集成为数据集中的每个观察结果生成预测。为了做出预测,我们将来自集成中所有模型的预测相加。
  • 这些预测用于计算损失函数(例如均方误差)。
  • 然后,我们使用损失函数来拟合将添加到集成中的新模型。具体来说,我们确定模型参数,让这个新模型在添加到集成中时能减少损失。 (旁注:“梯度提升”中的“梯度”指的是我们将在损失函数上使用梯度下降来确定这个新模型中的参数。)
  • 最后,我们将新模型添加到集成中,然后...
  • ... 重复!

举例

加载数据

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the data
data = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')

# Select subset of predictors
cols_to_use = ['Rooms', 'Distance', 'Landsize', 'BuildingArea', 'YearBuilt']
X = data[cols_to_use]

# Select target
y = data.Price

# Separate data into training and validation sets
X_train, X_valid, y_train, y_valid = train_test_split(X, y)

XGBoost

XGBoost是指极端梯度增强(extreme gradient boosting),这是一个梯度增强的实现,带有几个关注性能和速度的附加特性。

from xgboost import XGBRegressor

my_model = XGBRegressor()
my_model.fit(X_train, y_train)

XGBRegressor类有很多可以调整的参数:

XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
             colsample_bynode=1, colsample_bytree=1, enable_categorical=False,
             gamma=0, gpu_id=-1, importance_type=None,
             interaction_constraints='', learning_rate=0.300000012,
             max_delta_step=0, max_depth=6, min_child_weight=1, missing=nan,
             monotone_constraints='()', n_estimators=100, n_jobs=4,
             num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0,
             reg_lambda=1, scale_pos_weight=1, subsample=1, tree_method='exact',
             validate_parameters=1, verbosity=None)

预测和评估模型:

from sklearn.metrics import mean_absolute_error

predictions = my_model.predict(X_valid)
print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))
Mean Absolute Error: 239435.01260125183

参数调整

n_estimators

指定建模循环的次数,等于集成中模型的数量。

次数过低会导致欠拟合,次数过高则会导致过拟合。

一般范围在100-1000,也取决于参数学习速率learning_rate

early_stopping_rounds

early_stopping_rounds提供了一种自动找到n_estimators的理想值的方法。 提前停止会导致模型在验证分数停止提高时停止迭代,即使我们没有遇到 n_estimators 的硬停止。 明智的做法是为n_estimators设置一个较高的值,然后使用early_stopping_rounds来找到停止迭代的最佳时间。

由于随机数据有时会导致单轮验证分数没有提高,所以需要指定一个数字,以指定在停止之前允许验证分数恶化的轮数。 设置 early_stopping_rounds=5 是一个合理的选择。 在这种情况下,我们会在连续 5 轮验证分数恶化后停止。

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

一般来说,小的学习速率和大量的估算器可以获得更精确的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是一个领先的软件库,用于处理标准表格数据。通过仔细的参数调整,可以训练高精确度的模型。

posted @ 2022-03-19 16:44  ikventure  阅读(271)  评论(0编辑  收藏  举报