您现在的位置是:首页 > 技术教程 正文

时间序列预测模型实战案例(四)(Xgboost)(Python)(机器学习)图解机制原理实现时间序列预测和分类(附一键运行代码资源下载和代码讲解)

admin 阅读: 2024-03-20
后台-插件-广告管理-内容页头部广告(手机)

目录图解机制原理

简介

Xgboost预测精度

实验一(回归)

实验二(分类)

Xgboost的数学机制原理

图解Xgboost运行机制原理 

决策树

决策树结构图

Xgboost

Xgboost的机制原理

贪心算法

Xgboost总结

数据格式需求

Xgboost运行代码

Xgboost时间序列预测及代码

Xgboost分类任务及代码

Xgboost运行资源下载地址

Xgboost总结

其它时间序列预测模型的讲解!

简介

在本次实战案例中,我们将使用Xgboost算法进行时间序列预测。Xgboost是一种强大的梯度提升树算法,适用于各种机器学习任务,它最初主要用于解决分类问题,在此基础上也可以应用于时间序列预测。

时间序列预测是通过分析过去的数据模式来预测未来的数值趋势。它在许多领域中都有广泛的应用,包括金融、天气预报、股票市场等。我们将使用Python编程语言来实现这个案例。

首先,我们需要准备时间序列数据集。这可以是一个CSV文件,其中包含了按时间顺序排列的数据点。我们将使用Pandas库来读取和处理数据。然后,我们将使用matplolib库对数据进行可视化,以便更好地了解其模式和趋势。

接下来,我们将使用Xgboost库来构建时间序列预测模型。我们将使用已知的过去数据来训练模型,并使用该模型来预测未来的数值。Xgboost算法通过逐步迭代地添加树模型,不断学习和优化模型的性能。

一旦我们完成了模型的训练,我们可以使用它来进行预测。我们将选择合适的输入特征,并根据模型的预测结果来生成未来的数值序列。最后,我们会将预测结果与实际观测值进行对比,评估模型的准确性和性能。

Xgboost预测精度

实验一(回归)

图示为Xgboost模型在回归任务当中预测值和真实值的对比图,

实验二(分类)

下图为Xgboost在分类问题当中的表现

在一个四分类的任务当中Xgboost的预测表现为图所示,其中0-1表示为预测错误,1-1表示为预测正确,可以看出准确率大概为91%

Xgboost的数学机制原理

XGBoost(Extreme Gradient Boosting)是一种基于决策树的集成学习算法,它通过串行地训练多个弱分类器,并将它们组合成一个强分类器,以提高预测性能。下面来详细介绍XGBoost的机制原理。

  1. 初始化

我们先定义一个模型,假设其初始化为\hat y_i^{(0)}

下面来解释这个图,帮助大家来理解决策树的机制原理,

其中在最上端有Dependent Variable:Play这是指在模型中作为因变量(被预测变量)的变量,即我们想要通过模型预测的结果。在这种情况下,"Play" 是依赖变量,即我们想要预测其状态(Play或者Don‘t Play)的变量 

其中橘色的菱形代表着一个判断,蓝色的直角矩形代表着一个状态,黑色的直角矩形代表着决策树的输出结果,

从图片中我们可以看到我门当前决策树的初始状态为Play:9  Don’t Play:5 这可以理解我们的初始值,

当经过橘色的菱形进行一个状态的判断(OUTLOOK代表外面天气的判断) ,有三种结果分别为:

  1. 当外部天气属性为Sunny时候我们的会更新状态为Play:2 Don‘t Play:3,
  2. 当外部天气为overcast(阴天)直接输出模型结果Play:4 Don't Play:0 ,
  3. 当外部天气为rain(下雨天)我们就更新当前状态为Play:3  Don’t Play:2,

当状态被更新以后我们就会往下执行

当判断为外部天气为Sunny时进行状态判断Humidity(湿度)

  1. 当Humidity<=70 更新状态并输出模型结果: Play:2 Don‘t Play:0,
  2. 当Humidity>70 更新状态并输出模型结果: Play:0 Don‘t Play:3,

 当判断为外部天气为rain时进行状态判断Windy(刮风)

  1.  当Windy为True时代表外部刮风,更新当前状态为: Play:0 Don‘t Play:2,
  2.  当Windy为False时代表外部刮风,更新当前状态为: Play:3 Don‘t Play:0,

到此我们对该决策树的所有结果都进行了模拟输出,到这里我门对决策树的概念有了一个大致的了解,本文讲到的模型Xgboost就是由多个决策树构成而来同时配合多种算法从而形成一个完整的模型 。

Xgboost

上面我们大致讲了一下Xgboost的基本结构单元为决策树,我们可以将Xgboost模型理解为一个强分类器,那么决策树就是构成他的弱分类器,

与传统的决策树不同,XGBoost采用了梯度提升算法,通过多次迭代的方式逐步提高模型的准确性。在每一次迭代中,XGBoost会计算出模型的负梯度,然后将其作为新的训练数据来训练下一个弱分类器。

(我们需要注意的是在XGBoost中,每个节点都是一个决策树,但不是每个节点都是单独的决策树。XGBoost采用的是梯度提升算法,每一次迭代都训练一个新的决策树模型,并将其加入到当前模型中。在训练过程中,每个节点都会分裂成两个子节点,每个子节点都对应一个新的决策树模型。因此,XGBoost中的每个节点都是一个决策树模型的一部分,而不是单独的决策树。这种方式可以有效地利用已有的决策树模型,加快模型的训练速度,提高模型的准确性和鲁棒性。

同时,在Xgboost当中我们初始的是一个目标函数,也可以称之为核函数,我们需要做到的就是求其最优解的一个过程, 根据前面的章节(Xgboost的机制原理)假设我们的目标函数为:

Obj^{(t)}=\sum_{i=1}^n(y_i-\hat y_i^{(t-1)}-f_t(x_i))^2+\Omega(f_t)

那么如何最小化损失函数来找到使目标函数最小的参数呢?

XGBoost中的决策树生成是通过贪心算法来进行的。

贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。

下面是一个例子帮助大家来简单理解贪心算法

假设我们从1进行出发,想要走到5,想要得到一个最优解,

那么我们的路径应该是 1→2→4→3→5

损失应该是10 +10 + 20 +10 = 40

这就是一个简单的贪心算法案例,由局部最优解→全局最优解。

在XGBoost中,决策树的生成包括两个主要步骤:分裂节点和剪枝。

  1. 决策树的生成(分裂):基于训练数据集生成决策树,生成的决策树要尽量大。在每个节点,XGBoost会计算出所有可能的切分,并选择最优的切分来分裂节点。这个最优的切分是通过计算每个切分对应的损失函数来找到的。具体而言,XGBoost会计算出每个切分对应的增益,然后选择增益最大的切分来分裂节点。这个过程一直重复,直到满足停止条件(如最大深度、最小样本分裂数等)。
  2. 决策树的剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。在剪枝的过程中,XGBoost会尝试将树中的一些叶子节点合并成新的内部节点,从而减少模型的复杂度。这个过程也是通过贪心算法进行的:在每个节点,XGBoost会计算出将该节点作为叶子节点或继续分裂所产生的损失函数,然后选择损失函数最小的方案作为该节点的最终方案。

为了提高决策树生成的效率,XGBoost还采用了一些其他的策略。例如,XGBoost会缓存之前生成的计算结果,以便在后续迭代中直接使用这些结果,避免重复计算。此外,XGBoost还使用了树结构的压缩技术,将树中的一些叶子节点合并成新的内部节点,从而减少模型的复杂度,并加速后续的预测过程。

下面的图表述了树的节点分裂的过程

贪心算法的基本原理可以概括为以下几点:

  1. 将问题分解为若干个子问题。
  2. 对于每个子问题,确定一个贪心策略,即在当前状态下选择最优的决策。
  3. 将所有子问题的最优解组合成原问题的解。

Xgboost总结

到此,我们已经知道了一棵完整的树是怎么生成的了,下面进行一个小的总结。

它的主要思想是通过不断迭代的方式训练多个决策树,将它们组合成一个强大的集成模型。在每一轮迭代中,XGBoost会根据前一轮的训练结果调整样本的权重,以使得模型更加关注那些被错误分类的样本。同时,XGBoost通过引入正则化项来控制模型的复杂度,防止过拟合。

XGBoost的优点主要体现在以下几个方面:

  1. 优秀的泛化能力:XGBoost采用了一系列的正则化技术,可以有效地避免过拟合,从而提高模型的泛化能力。

  2. 高效的训练速度:XGBoost采用了一些优化技术,如缓存访问、数据压缩等,可以加速训练过程,同时还支持并行计算,可以利用多核CPU进行加速。

  3. 准确的预测能力:XGBoost采用了一些特殊的技术,如缺失值处理、特征分桶等,可以有效地提高模型的预测能力。

总的来说,XGBoost是一种非常强大的机器学习算法,如果你需要解决一些复杂的分类或回归问题,XGBoost是一个非常值得尝试的算法。

数据格式需求

数据格式为8列,其中时间格式要对应,OT列为预测值。

Xgboost运行代码

Xgboost时间序列预测及代码

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from sklearn.model_selection import cross_val_score, TimeSeriesSplit
  5. from sklearn.preprocessing import StandardScaler
  6. from xgboost import XGBRegressor
  7. def timeseries_train_test_split(X, y, test_size):
  8. """
  9. Perform train-test split with respect to time series structure
  10. """
  11. # get the index after which test set starts
  12. test_index = int(len(X) * (1 - test_size))
  13. X_train = X.iloc[:test_index]
  14. y_train = y.iloc[:test_index]
  15. X_test = X.iloc[test_index:]
  16. y_test = y.iloc[test_index:]
  17. return X_train, X_test, y_train, y_test
  18. def code_mean(data, cat_feature, real_feature):
  19. """
  20. cat_feature:类别型特征,如星期几;
  21. real_feature:target字段
  22. """
  23. return dict(data.groupby(cat_feature)[real_feature].mean())
  24. def mean_absolute_percentage_error(y_true, y_pred):
  25. return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
  26. def plotModelResults(model, X_train, X_test, plot_intervals=False, plot_anomalies=False, scale=1.96):
  27. """
  28. Plots modelled vs fact values, prediction intervals and anomalies
  29. """
  30. prediction = model.predict(X_test)
  31. plt.figure(figsize=(15, 7))
  32. plt.plot(prediction, "g", label="prediction", linewidth=2.0)
  33. plt.plot(y_test.values, label="actual", linewidth=2.0)
  34. if plot_intervals:
  35. cv = cross_val_score(model, X_train, y_train,
  36. cv=tscv,
  37. scoring="neg_mean_squared_error")
  38. # mae = cv.mean() * (-1)
  39. deviation = np.sqrt(cv.std())
  40. lower = prediction - (scale * deviation)
  41. upper = prediction + (scale * deviation)
  42. plt.plot(lower, "r--", label="upper bond / lower bond", alpha=0.5)
  43. plt.plot(upper, "r--", alpha=0.5)
  44. if plot_anomalies:
  45. anomalies = np.array([np.NaN] * len(y_test))
  46. anomalies[y_test < lower] = y_test[y_test < lower]
  47. anomalies[y_test > upper] = y_test[y_test > upper]
  48. plt.plot(anomalies, "o", markersize=10, label="Anomalies")
  49. error = mean_absolute_percentage_error(prediction, y_test)
  50. plt.title("Mean absolute percentage error {0:.2f}%".format(error))
  51. plt.legend(loc="best")
  52. plt.tight_layout()
  53. plt.grid(True);
  54. plt.show()
  55. def prepareData(series, lag_start, lag_end, test_size, target_encoding=False):
  56. """
  57. series: pd.DataFrame
  58. dataframe with timeseries
  59. lag_start: int
  60. initial step back in time to slice target variable
  61. example - lag_start = 1 means that the model
  62. will see yesterday's values to predict today
  63. lag_end: int
  64. final step back in time to slice target variable
  65. example - lag_end = 4 means that the model
  66. will see up to 4 days back in time to predict today
  67. test_size: float
  68. size of the test dataset after train/test split as percentage of dataset
  69. target_encoding: boolean
  70. if True - add target averages to the dataset
  71. """
  72. # copy of the initial dataset
  73. data = pd.DataFrame(series.copy()).loc[:, ['OT']]
  74. data.columns = ["y"]
  75. # lags of series
  76. for i in range(lag_start, lag_end):
  77. data["lag_{}".format(i)] = data.y.shift(i)
  78. #
  79. # datetime features
  80. data.index = pd.to_datetime(data.index)
  81. data["hour"] = data.index.hour
  82. data["weekday"] = data.index.weekday
  83. data['is_weekend'] = data.weekday.isin([5, 6]) * 1
  84. if target_encoding:
  85. # calculate averages on train set only
  86. test_index = int(len(data.dropna()) * (1 - test_size))
  87. data['weekday_average'] = list(map(
  88. code_mean(data[:test_index], 'weekday', "y").get, data.weekday))
  89. # frop encoded variables
  90. data.drop(["weekday"], axis=1, inplace=True)
  91. # train-test split
  92. y = data.dropna().y
  93. X = data.dropna().drop(['y'], axis=1)
  94. X = pd.get_dummies(X)
  95. X_train, X_test, y_train, y_test = \
  96. timeseries_train_test_split(X, y, test_size=test_size)
  97. return X_train, X_test, y_train, y_test
  98. if __name__ == '__main__':
  99. """
  100. "XGBoost(机器学习)",
  101. """
  102. df = pd.read_csv('ETTh1.csv')
  103. df['OT'].fillna(0, inplace=True)
  104. df.set_index('date', inplace=True)
  105. hp_raw = df[['OT']]
  106. tscv = TimeSeriesSplit(n_splits=5)
  107. # reserve 30% of data for testing
  108. X_train, X_test, y_train, y_test = \
  109. prepareData(hp_raw, lag_start=1, lag_end=28, test_size=0.1, target_encoding=True)
  110. scaler = StandardScaler()
  111. X_train_scaled = scaler.fit_transform(X_train)
  112. X_test_scaled = scaler.transform(X_test)
  113. xgb = XGBRegressor()
  114. xgb.fit(X_train_scaled, y_train)
  115. plotModelResults(xgb,
  116. X_train=X_train_scaled,
  117. X_test=X_test_scaled,
  118. plot_intervals=True, plot_anomalies=True)

Xgboost分类任务及代码

  1. import pickle
  2. import pandas as pd
  3. import xgboost as xgb
  4. from sklearn.metrics import accuracy_score
  5. import numpy as np
  6. np.random.seed(0)
  7. df = pd.read_csv('ETTh1.csv')
  8. df = df.fillna(method='ffill') # 处理Nan值
  9. # 给ETTh1.csv文件的OT列打上标签
  10. # 将其中的值进行分组,作为其标签划分为四个组-10-10, 10-20, 20-30, 30-50,
  11. thresholds = [-10, 0, 10, 20, 30, 40, 50]
  12. df['truegroup'] = pd.cut(df['OT'], bins=thresholds, labels=['0', '1', '2', '3', '4', '5'])
  13. # 参数定义
  14. data_cycle_day = 24 # 我的数据当中一天有五十个数据,这里代表你一天当中数据有多少个
  15. numbers = list(range(data_cycle_day)) # 我的数据当中一天有五十个数据,这里代表你一天当中数据有多少个
  16. df['shift'] = [i % data_cycle_day for i in range(len(df))]
  17. # 特征工程
  18. averages = []
  19. # 生成过去同一时间段的平均值
  20. for num in numbers:
  21. average = df[df['shift'] == num]['OT'].mean()
  22. averages.append(average)
  23. df['OTmean'] = [averages[i % data_cycle_day] for i in range(len(df))]
  24. # 生成当天过去两天同一时间段的值
  25. df['cycle_index'] = (df.index % data_cycle_day) + 1
  26. df['prev_day_value'] = df.groupby('cycle_index')['OT'].shift(1)
  27. df['prev_two_days_value'] = df.groupby('cycle_index')['OT'].shift(2)
  28. df['prev_three_days_value'] = df.groupby('cycle_index')['OT'].shift(3)
  29. df = df.dropna() # 丢弃没有前三天值的行不进行分类
  30. train_data = df[['OTmean', 'prev_day_value', 'prev_two_days_value','prev_three_days_value','LULL','LUFL',
  31. 'MULL', 'MUFL', 'HUFL', 'HULL', 'OT']] # s
  32. label = df['truegroup']
  33. train_size = int(len(df) * 0.75) # 划分测试集和训练集分割比例
  34. # 准备训练数据集和测试数据集
  35. train_features, test_features = train_data[:train_size], train_data[train_size:]
  36. train_labels, test_labels = label[:train_size], label[train_size:]
  37. # 构建 DMatrix xgboost需要的数据格式
  38. dtrain = xgb.DMatrix(data=train_features, label=train_labels)
  39. dtest = xgb.DMatrix(data=test_features)
  40. # 定义参数
  41. params = {
  42. 'objective': 'multi:softmax',
  43. 'num_class': 6,
  44. 'max_depth': 10,
  45. 'eta': 0.05,
  46. 'eval_metric': 'merror'
  47. }
  48. train = True
  49. if train:
  50. # 训练模型
  51. num_rounds = 25
  52. model = xgb.train(params, dtrain, num_rounds)
  53. with open('Xgboostmodels.pkl', 'wb') as file:
  54. pickle.dump(model, file)
  55. with open('Xgboostmodels.pkl', 'rb') as f: # 加载模型
  56. model = pickle.load(f)
  57. # 预测结果
  58. pred_labels = model.predict(dtest)
  59. # 模型评估
  60. accuracy = accuracy_score(test_labels.astype('float'), pred_labels)
  61. print("Accuracy:", accuracy)
  62. results = test_labels.astype('float') == pred_labels
  63. print(results.sum()) # 打印统计正确总数

Xgboost运行资源下载地址

我在CSDN上传了Xgboost的运行文件大家可以下载运行试试,如果想要按照自己的数据集更改进行试验,我在代码上面进行了标注大家可以尝试一下。

Xgboost一键运行代码下载链接

全文总结

总之,XGBoost 是一种功能强大的机器学习算法,已经存在很多年了,但至今依然在很多工程项目上都在使用,其可用于分类和回归问题。

到此为止关于Xgboost分析就结束了,

后期我也会讲一些最新的预测模型包括Informer,TPA-LSTM,ARIMA,Attention-LSTM,LSTM-Xgboost,移动平均法,加权移动平均,指数平滑等等一系列关于时间序列预测的模型,包括深度学习和机器学习方向的模型我都会讲,你可以根据需求选取适合你自己的模型进行预测,如果有需要可以+个关注,包括本次模型我自己的代码大家有需要我也会放出百度网盘下载链接!!

其它时间序列预测模型的讲解!

-------------------------------------------------------LSTM-深度学习-----------------------------------------------------时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

--------------------------------------------------------MTS-Mixers---------------------------------------------------------

【全网首发】(MTS-Mixers)(Python)(Pytorch)最新由华为发布的时间序列预测模型实战案例(一)(包括代码讲解)实现企业级预测精度包括官方代码BUG修复Transform模型

 --------------------------------------------------------Holt-Winters--------------------------------------------------------

时间序列预测模型实战案例(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

如果大家有不懂的也可以评论区留言一些报错什么的大家可以讨论讨论看到我也会给大家解答如何解决!

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索