- 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
设置为你在提前停止运行时发现的最佳值。
我们不需要简单地将每个组件模型的预测相加,而是可以将每个模型的预测乘以一个小数字(称为学习率),然后再将它们相加。
这意味着我们添加到集合中的每棵树对我们的帮助都较小。因此,我们可以在不过度拟合的情况下为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_estimators
和learn_rate
)以获得更好的结果。 - 然后,将该模型与
X_train
和y_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_estimators
和learning_rate)
),以设计一个模型来获得较高的MAE。 - 然后,将该模型与
X_train
和y_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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)