基于支持向量机进行时间序列预测(Python)

1、导入库包

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import mean_absolute_error # 平方绝对误差

2、导入数据及预处理

由于时间的维数是一维的,因此需要创建滞后特征,选定滞后的期数
此示例中选定滞后期数为3

data = pd.read_excel()
# 2. 创建滞后特征
lookback =3  # 滞后的期数
X = []  # 输入特征矩阵
y = []  # 目标值
for i in range(lookback, len(data)):
    X.append(data.iloc[i-lookback:i, 0])  # 使用前lookback期的值作为特征
    y.append(data.iloc[i, 0])  # 当前期作为目标值
X = np.array(X)
y = np.array(y)

3. 划分数据集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

4. 创建和训练SVR模型

在使用支持向量机算法进行预测的基础上,再采用粒子群算法优化调整参数,建立调参后的SVR模型。
注:粒子群优化算法(PSO_SVR)在我的另一篇文章有介绍:

粒子群算法调参支持向量回归进行预测(PSO-SVR)Python实现

# 4. 创建和训练SVR模型
import PSO_SVR

svr_model = PSO_SVR.optimize_svm(X_train, y_train, X_test, y_test)

svr_model.fit(X_train, y_train)

5. 使用模型进行预测

x_next = [data[-lookback:].values[i, 0] for i in range(len(data[-lookback:]))]
y_next = svr_model.predict([x_next])

y_pred1 = svr_model.predict(X_train)
y_pred = svr_model.predict(X_test)
y_label_pre = list(y_pred1)
for i in y_pred:
    y_label_pre.append(i)
y_label_pre.append(y_next[0])
y_label_tru = list(y_train)
for i in y_test:
    y_label_tru.append(i)

6. 进行需要的评估和可视化操作

mse = mean_squared_error(y_test, y_pred)
print(f'均方误差:{mse}')
print("R2 = ", metrics.r2_score(y_test, y_pred))  # R2
print("MAE = ", mean_absolute_error(y_test, y_pred))  # R2
import matplotlib.pyplot as plt

plt.plot(y_label_tru, "o-k")
plt.plot(y_label_pre, "P--")
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend(['Actual', 'Predicted'])
plt.title('Actual vs Predicted')
plt.grid()
plt.show()

结果展示

最优参数及模型评估:
在这里插入图片描述
预测值与真实值对比:
在这里插入图片描述

Python中的支持向量机(Support Vector Machine,简称SVM)是一种基于统计学习理论的监督学习算法。它是一种二分类模型,但也可以用于多分类任务。 SVM在时间序列分析中表现出色,并且在解决时间序列预测和分类问题上有广泛的应用。 首先,SVM可以处理非线性关系。在时间序列中,往往存在非线性的关联,SVM通过使用各种核函数(如线性核、径向基函数等)来将数据映射到高维空间,从而能够更好地捕捉到非线性关系,提高预测的精度和准确性。 其次,SVM在处理小样本和噪声数据方面具有较好的鲁棒性。在时间序列分析中,样本数量有限且往往存在噪声,而SVM通过选择支持向量作为决策边界的关键点,从而有效地避免了对个别数据点的过度依赖,减小了对噪声数据的影响,提高了模型的鲁棒性。 此外,SVM还可以通过调整惩罚参数、核函数以及参数优化策略等来进一步提升模型的性能。例如,通过合理设置惩罚参数C的值,能够控制模型的复杂度和泛化能力;选择合适的核函数,能够将数据映射到高维空间,提高模型的拟合能力;使用交叉验证等技术,可以选择最优的参数组合。 总而言之,SVM在时间序列分析中的应用是有效的,它能够处理非线性关系、具有较好的鲁棒性,同时也可以通过参数调优进一步提高模型性能。然而,在实际应用过程中,我们还需结合具体问题和数据特征来选择合适的核函数和参数设置,以达到更好的预测和分类效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值