机器学习中级教程 6.梯度提升

机器学习中级教程 6.梯度提升,第1张

机器学习中级教程
  • 1.介绍
  • 2.缺失值
  • 3.分类变量
  • 4.管道(Pipelines)
  • 5.交叉验证
  • 6.梯度提升(XGBoost)
  • 7.数据泄漏

在本教程中,您将学习如何使用渐变增强构建和优化模型。该方法在许多Kaggle竞赛中占据主导地位,并在各种数据集上获得最先进的结果。

正文 介绍

在本课程的大部分内容中,您已经使用随机森林方法进行了预测,该方法通过对多个决策树的预测求平均值,就可以获得比单个决策树更好的性能。
我们将随机森林方法称为“集成方法”。根据定义,集成方法结合了多个模型的预测(例如,在随机森林的情况下,多棵树)。
接下来,我们将学习另一种称为梯度增强的集合方法。

梯度增强

梯度增强是一种通过循环将模型迭代添加到集合中的方法。
它首先用一个模型初始化集合,这个模型的预测可能非常幼稚。(即使它的预测非常不准确,但随后对该集合的添加将解决这些错误。)
然后,我们开始循环:

  • 首先,我们使用当前集合为数据集中的每个观测生成预测。为了进行预测,我们将集合中所有模型的预测相加。
  • 这些预测用于计算损失函数(例如,均方误差 MSE)。
  • 然后,我们使用损失函数来拟合一个新模型,该模型将被添加到集合中。具体来说,我们确定模型参数,以便将此新模型添加到集合中将减少损失。(旁注:《梯度提升》中的“梯度”指的是我们将使用损失函数的梯度下降来确定这个新模型中的参数。)
  • 最后,我们将新模型添加到集合中,并且。。。
  • … 重复

举例

我们首先在X_train、X_valid、y_train和y_valid中加载训练和验证数据。

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代表极端梯度增强,它是渐变增强的一种实现,具有一些专注于性能和速度的附加功能。(Scikit-learn有另一个版本的梯度增强,但XGBoost有一些技术优势。)
在下一个代码单元中,我们为XGBoost(XGBoost.xGBRegressionor)导入scikit-learn API。这使我们能够像在scikit-learn中一样构建和拟合模型。正如您将在输出中看到的,XGBRegressionor类有许多可调参数——您很快就会了解这些参数!

from xgboost import XGBRegressor

my_model = XGBRegressor()
my_model.fit(X_train, y_train)
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

调整参数

XGBoost有几个参数可以显著影响准确性和训练速度。您应该了解的第一个参数是:

n_estimators

n_estimators指定了经过上述建模周期的次数。它等于我们在集合中包含的模型数量。

  • 值过低会导致拟合不足,从而导致对训练数据和测试数据的预测不准确。
  • 值过高会导致过度拟合,这会导致对训练数据的准确预测,但对测试数据的不准确预测(这正是我们所关心的)。

典型值范围为100-1000,但这在很大程度上取决于下面讨论的学习率参数。
下面是设置集合中模型数量的代码:

my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train)
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=500, 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)
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 (学习率)

我们不需要简单地将每个组件模型的预测相加,而是可以将每个模型的预测乘以一个小数字(称为学习率),然后再将它们相加。
这意味着我们添加到集合中的每棵树对我们的帮助都较小。因此,我们可以在不过度拟合的情况下为n_estimators设置更高的值。如果我们使用提前停止,将自动确定适当的树数。
一般来说,较小的学习率和大量的估计器将产生更精确的XGBoost模型,尽管由于模型在整个周期中进行了更多的迭代,因此也需要更长的时间来训练。默认情况下,XGBoost将学习率设置为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)
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.05, max_delta_step=0,
             max_depth=6, min_child_weight=1, missing=nan,
             monotone_constraints='()', n_estimators=1000, 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)
n_job

在需要考虑运行时的大型数据集上,可以使用并行性更快地构建模型。将参数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_rounds=5, 
             eval_set=[(X_valid, y_valid)], 
             verbose=False)
结论

XGBoost是一个领先的软件库,用于处理标准表格数据(存储在Pandas DataFrames中的数据类型,而不是图像和视频等更奇特的数据类型)。通过仔细调整参数,可以训练出高精度的模型。

轮到你了

在下一个练习中,使用XGBoost训练您自己的模型!


练习部分

在本练习中,您将使用新知识训练具有梯度增强的模型。

设置

下面的问题将为你的工作提供反馈。运行以下单元格设置反馈系统。

# Set up code checking
import os
if not os.path.exists("../input/train.csv"):
    os.symlink("../input/home-data-for-ml-course/train.csv", "../input/train.csv")  
    os.symlink("../input/home-data-for-ml-course/test.csv", "../input/test.csv") 
from learntools.core import binder
binder.bind(globals())
from learntools.ml_intermediate.ex6 import *
print("Setup Complete")

Setup Complete

您将使用来自 Housing Prices Competition for Kaggle Learn Users 案例.

在不做任何更改的情况下运行以下代码单元,以加载X_train、X_valid、y_train和y_valid中的训练集和验证集。测试集在X_test中加载。

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the data
X = pd.read_csv('../input/train.csv', index_col='Id')
X_test_full = pd.read_csv('../input/test.csv', index_col='Id')

# Remove rows with missing target, separate target from predictors
X.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X.SalePrice              
X.drop(['SalePrice'], axis=1, inplace=True)

# Break off validation set from training data
X_train_full, X_valid_full, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2,
                                                                random_state=0)

# "Cardinality" means the number of unique values in a column
# Select categorical columns with relatively low cardinality (convenient but arbitrary)
low_cardinality_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique() < 10 and 
                        X_train_full[cname].dtype == "object"]

# Select numeric columns
numeric_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]

# Keep selected columns only
my_cols = low_cardinality_cols + numeric_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
X_test = X_test_full[my_cols].copy()

# One-hot encode the data (to shorten the code, we use pandas)
X_train = pd.get_dummies(X_train)
X_valid = pd.get_dummies(X_valid)
X_test = pd.get_dummies(X_test)
X_train, X_valid = X_train.align(X_valid, join='left', axis=1)
X_train, X_test = X_train.align(X_test, join='left', axis=1)
第1步:建立模型 A 部分

在这一步中,您将使用梯度提升建并训练第一个模型。
首先将my_model_1设置为XGBoost 模型。使用XGBRegressor类,并将随机种子设置为0(random_state=0)。将所有其他参数保留为默认值。
然后,将该模型与X_train 和y_train 中的训练数据进行拟合。

from xgboost import XGBRegressor

# 定义模型
my_model_1 = ____ # Your code here

# 拟合模型
____ # Your code here

# Check your answer
step_1.a.check()
B 部分

predictions_1设置为验证数据的模型预测值。回想一下,验证功能存储在X_valid中。

from sklearn.metrics import mean_absolute_error

# 获得预测值
predictions_1 = ____ # Your code here

# Check your answer
step_1.b.check()
C 部分

最后,使用mean_absolute_error()函数计算与验证集预测相对应的平均绝对误差(MAE)。回想一下,验证数据的标签存储在y_valid中。

# 计算 MAE
mae_1 = ____ # Your code here

# 打印 MAE
# print("Mean Absolute Error:" , mae_1)

# Check your answer
step_1.c.check()

Mean Absolute Error: 17662.736729452055

第2步:改进模型

现在,您已经将默认模型训练为基数,是时候修改参数了,看看是否可以获得更好的性能!

  • 首先,使用XGBRegressor类将my_model_2设置为XGBoost模型。使用您在上一个教程中学习的内容,了解如何更改默认参数(如n_estimatorslearn_rate)以获得更好的结果。
  • 然后,将该模型与X_trainy_train中的训练数据进行拟合。
  • predictions_2设置为验证数据的模型预测值。回想一下,验证功能存储在X_valid中。
  • 最后,使用mean_absolute_error()函数计算与验证集上的预测相对应的平均绝对误差(MAE)。回想一下,验证数据的标签存储在y_valid中。

为了将此步骤标记为正确,my_model_2中的模型必须比my_model_1中的模型获得更低的MAE。

# Define the model
my_model_2 = ____ # Your code here

# Fit the model
____ # Your code here

# Get predictions
predictions_2 = ____ # Your code here

# Calculate MAE
mae_2 = ____ # Your code here

# Uncomment to print MAE
# print("Mean Absolute Error:" , mae_2)

# Check your answer
step_2.check()

Mean Absolute Error: 16688.691513270547

第3步:打破模式

在本步骤中,您将创建一个性能比步骤1中的原始模型差的模型。这将有助于你培养如何设置参数的直觉。你甚至可能会发现你意外地获得了更好的表现,这最终是一个很好的问题,也是一次宝贵的学习经历!

  • 首先,使用XGBRegressor类将my_model_3设置为XGBoost模型。使用您在上一个教程中学习的内容,了解如何更改默认参数(如n_estimatorslearning_rate)),以设计一个模型来获得较高的MAE。
  • 然后,将该模型与X_trainy_train中的训练数据进行拟合。
  • predictions_3设置为验证数据的模型预测值。回想一下,验证功能存储在X_valid中。
  • 最后,使用mean_absolute_error()函数计算与验证集上的预测相对应的平均绝对误差(MAE)。回想一下,验证数据的标签存储在y_valid中。

为了将此步骤标记为正确,my_model_3中的模型必须比my_model_1中的模型获得更高的MAE。

# Define the model
my_model_3 = ____

# Fit the model
____ # Your code here

# Get predictions
predictions_3 = ____

# Calculate MAE
mae_3 = ____

# Uncomment to print MAE
# print("Mean Absolute Error:" , mae_3)

# Check your answer
step_3.check()

Mean Absolute Error: 127895.0828807256

继续前进

继续了解数据泄漏。这是数据科学家需要理解的一个重要问题,它有可能以微妙而危险的方式破坏你的模型!

答案
# step 1_a 
# Define the model
my_model_1 = XGBRegressor(random_state=0)

# Fit the model
my_model_1.fit(X_train, y_train)

# step 1_b
# Get predictions
predictions_1 = my_model_1.predict(X_valid)

# step 1_c
# Calculate MAE
mae_1 = mean_absolute_error(predictions_1, y_valid)
print("Mean Absolute Error:" , mae_1)

# step 2
# Define the model
my_model_2 = XGBRegressor(n_estimators=1000, learning_rate=0.05)

# Fit the model
my_model_2.fit(X_train, y_train)

# Get predictions
predictions_2 = my_model_2.predict(X_valid)

# Calculate MAE
mae_2 = mean_absolute_error(predictions_2, y_valid)
print("Mean Absolute Error:" , mae_2)

# step 3
# Define the model
my_model_3 = XGBRegressor(n_estimators=1)

# Fit the model
my_model_3.fit(X_train, y_train)

# Get predictions
predictions_3 = my_model_3.predict(X_valid)

# Calculate MAE
mae_3 = mean_absolute_error(predictions_3, y_valid)
print("Mean Absolute Error:" , mae_3)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/799427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存