Kaggle-Intermediate Machine Learning(4)
Xgboost
在本课程的大部分课程中,您都是通过随机森林方法进行预测的,该方法比平均单个决策树获得的性能好于单个决策树。我们将随机森林方法称为“集成方法”。 根据定义,集成方法结合了几种模型的预测(例如,对于随机森林而言,是几棵树)。接下来,我们将学习另一种称为梯度增强的集成方法。
Gradient Boosting
梯度提升是一种通过循环将模型迭代添加到集合中的方法。
首先从用单个模型初始化整体开始,其预测可能很幼稚。 (即使其预测非常不准确,随后对该集合进行的添加也将解决这些错误。)
然后,我们开始循环:
1.首先,我们使用当前集合为数据集中的每个观测值生成预测。 为了进行预测,我们将集合中所有模型的预测相加。这些预测用于计算损失函数(例如,均方误差)。
2.然后,我们使用损失函数来拟合将要添加到集合中的新模型。 具体来说,我们确定模型参数,以便将此新模型添加到集合中将减少损失。 (附带说明:“梯度增强”中的“梯度”是指我们将对损失函数使用梯度下降来确定此新模型中的参数的事实。)
3.最后,我们将新模型添加到集合中,并...
4...重复!
Example
我们首先将训练和验证数据加载到X_train,X_valid,y_train和y_valid中。
在此示例中,您将使用XGBoost库。 XGBoost代表极限梯度增强,它是梯度增强的一种实现,它具有专注于性能和速度的其他几个功能。 (Scikit-learn具有梯度增强的另一个版本,但是XGBoost具有一些技术优势。)
在下一个代码单元中,我们导入用于XGBoost的scikit-learn API(xgboost.XGBRegressor)。 这使我们能够像在scikit-learn中一样构建和拟合模型。 正如您将在输出中看到的那样,XGBRegressor类具有许多可调参数-您将很快了解它们!
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)))
Parameter Tuning
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
由于随机机会有时会导致验证分数没有提高的单回合,因此您需要指定一个数字,以便在停止前允许连续回合恶化的次数。 设置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_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False)
Conclusion
XGBoost是用于处理标准表格数据(存储在Pandas DataFrames中的数据类型,而不是图像和视频等更奇特的数据类型)的领先软件库。 通过仔细的参数调整,您可以训练高度准确的模型。
练习
运行下一个代码单元,而不进行任何更改,以将训练和验证集加载到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)
Step 1: Build model
在此步骤中,您将使用渐变增强来构建和训练您的第一个模型。
首先将my_model_1设置为XGBoost模型。 使用XGBRegressor类,并将随机种子设置为0(random_state = 0)。 将所有其他参数保留为默认值。
然后,将模型拟合到X_train和y_train中的训练数据。
from xgboost import XGBRegressor # Define the model my_model_1 = XGBRegressor(random_state=0) # Your code here # Fit the model my_model_1.fit(X_train,y_train) # Your code here # Check your answer step_1.a.check()
将predictions_1设置为验证数据的模型预测。 回想一下,验证功能存储在X_valid中。
from sklearn.metrics import mean_absolute_error # Get predictions predictions_1 = my_model_1.predict(X_valid) # Your code here # Check your answer step_1.b.check()
最后,使用mean_absolute_error()函数来计算与验证集的预测相对应的平均绝对误差(MAE)。 回想一下,验证数据的标签存储在y_valid中。
# Calculate MAE mae_1 = mean_absolute_error(y_valid,predictions_1) # Your code here # Uncomment to print MAE print("Mean Absolute Error:" , mae_1) # Check your answer step_1.c.check()
Output:
Mean Absolute Error: 17662.736729452055
Step 2: Improve the model
现在,您已经训练了默认模型作为基准,现在该修改参数了,看看是否可以获得更好的性能!
首先使用XGBRegressor类将my_model_2设置为XGBoost模型。 使用您在上一教程中学到的知识来弄清楚如何更改默认参数(例如n_estimators和learning_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 = XGBRegressor(random_state=0,n_estimators=10000,learning_rate=0.05, n_jobs=4) # Your code here # Fit the model my_model_2.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False) # Your code here # Get predictions predictions_2 =my_model_2.predict(X_valid) # Your code here # Calculate MAE mae_2 = mean_absolute_error(predictions_2,y_valid) # Your code here # Uncomment to print MAE # print("Mean Absolute Error:" , mae_2) # Check your answer step_2.check()
Step 3: Break the model
在此步骤中,您将创建一个性能比第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 = XGBRegressor(random_state=0,n_estimators=1000,learning_rate=0.5, n_jobs=4) # Your code here # Fit the model my_model_3.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False) # Your code here # Your code here # Get predictions predictions_3 = my_model_3.predict(X_valid) # Your code here # Calculate MAE mae_3 = mean_absolute_error(predictions_3,y_valid) # Uncomment to print MAE # print("Mean Absolute Error:" , mae_3) # Check your answer step_3.check()