XGBoost(极限梯度提升)是一种开源算法,它实现了梯度提升树,并通过额外的改进来提高性能和速度。该算法快速准确地进行预测的能力使其成为许多比赛(如Kaggle比赛)中的首选模型。
XGBoost应用的常见情况是分类预测,如欺诈检测,或回归预测,如房价预测。然而,将XGBoost算法扩展到时间序列数据的预测也是可能的。它是如何工作的呢?让我们进一步探讨一下。
时间序列预测
数据科学和机器学习中的预测是一种根据随时间收集的历史数据来预测未来数值的技术,无论是在规律或不规律的时间间隔内。
与常见的机器学习训练数据不同,其中每个观察结果都是独立的,用于时间序列预测的数据必须按顺序连续,并与每个数据点相关。例如,时间序列数据可以包括每月股票、每周天气、每日销售额等。
让我们来看看来自Kaggle的示例时间序列数据——每日气候数据。
import pandas as pd
train = pd.read_csv('DailyDelhiClimateTrain.csv')
test = pd.read_csv('DailyDelhiClimateTest.csv')
train.head()
如果我们查看上面的数据帧,每个特征都是每天记录的。日期列表示数据观测的时间,并且每个观测结果都是相关的。
时间序列预测经常利用数据中的趋势、季节性和其他模式来创建预测。一个简单的方法是通过可视化它们来查看模式。例如,我将从我们的示例数据集中可视化平均温度数据。
train["date"] = pd.to_datetime(train["date"])
test["date"] = pd.to_datetime(test["date"])
train = train.set_index("date")
test = test.set_index("date")
train["meantemp"].plot(style="k", figsize=(10, 5), label="train")
test["meantemp"].plot(style="b", figsize=(10, 5), label="test")
plt.title("Mean Temperature Dehli Data")
plt.legend()
从上图中,我们很容易看出每年都有一个共同的季节性模式。通过整合这些信息,我们可以理解数据的工作方式,并决定哪种模型可能适合我们的预测模型。
典型的预测模型包括ARIMA、向量自回归、指数平滑和Prophet。然而,我们也可以利用XGBoost来进行预测。
XGBoost预测
在准备使用XGBoost进行预测之前,我们必须先安装该软件包。
pip install xgboost
安装完成后,我们会为模型训练准备数据。理论上,XGBoost预测将根据单个或多个特征实现回归模型,以预测未来的数值。这就是为什么数据训练必须是数值。此外,为了在XGBoost模型中考虑时间的变化,我们需要将时间数据转换为多个数值特征。
让我们首先创建一个从日期中创建数值特征的函数。
def create_time_feature(df):
df['dayofmonth'] = df['date'].dt.day
df['dayofweek'] = df['date'].dt.dayofweek
df['quarter'] = df['date'].dt.quarter
df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year
df['dayofyear'] = df['date'].dt.dayofyear
df['weekofyear'] = df['date'].dt.weekofyear
return df
接下来,我们将此函数应用于训练数据和测试数据。
train = create_time_feature(train)
test = create_time_feature(test)
train.head()
现在,所有所需的信息都已经准备好了。接下来,我们将定义我们想要预测的内容。在这个例子中,我们将预测平均温度,并根据上述数据创建训练数据。
X_train = train.drop('meantemp', axis =1)
y_train = train['meantemp']
X_test = test.drop('meantemp', axis =1)
y_test = test['meantemp']
我仍然会使用其他信息,例如湿度,以证明XGBoost也可以使用多变量方法进行预测。然而,在实践中,我们只会在尝试进行预测时才整合我们已知存在的数据。
让我们通过将数据拟合到模型中来开始训练过程。对于当前的示例,除了树的数量外,我们不会进行太多超参数优化。
import xgboost as xgb
reg = xgb.XGBRegressor(n_estimators=1000)
reg.fit(X_train, y_train, verbose = False)
训练完成后,让我们来看看模型的特征重要性。
xgb.plot_importance(reg)
最初的三个特征对于预测并不奇怪,但时间特征也有助于预测。让我们尝试对测试数据进行预测并将其可视化。
test['meantemp_Prediction'] = reg.predict(X_test)
train['meantemp'].plot(style='k', figsize=(10,5), label = 'train')
test['meantemp'].plot(style='b', figsize=(10,5), label = 'test')
test['meantemp_Prediction'].plot(style='r', figsize=(10,5), label = 'prediction')
plt.title('Mean Temperature Dehli Data')
plt.legend()
从上图中可以看出,预测可能略有偏差,但仍然遵循总体趋势。让我们尝试根据误差指标评估模型。
from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error
print('RMSE: ', round(mean_squared_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAE: ', round(mean_absolute_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAPE: ', round(mean_absolute_percentage_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
均方根误差(RMSE):11.514
平均绝对误差(MAE):2.655
平均绝对百分比误差(MAPE):0.133
结果显示,我们的预测可能有约13%的误差,RMSE也显示出了略微的预测误差。通过超参数优化,模型可以进一步改进,但我们已经了解了如何使用XGBoost进行预测。
结论
XGBoost是一种常用于许多数据科学案例和Kaggle比赛的开源算法。通常,使用情况是普通的分类案例,如欺诈检测,或回归案例,如房价预测,但XGBoost也可以扩展到时间序列预测。通过使用XGBoost回归器,我们可以创建一个可以预测未来数值的模型。