首页 > 其他分享 >时间序列分析和集成学习

时间序列分析和集成学习

时间:2024-08-01 09:54:05浏览次数:13  
标签:集成 plt 预测 模型 学习 test 序列 import data

时间序列分析(Time Series Analysis)

原理

时间序列分析是一种针对时间序列数据的统计和预测方法。时间序列数据是按照时间顺序排列的一组观测值,其分析方法主要包括识别数据模式(如趋势、季节性、周期性等)、构建预测模型和进行未来数据的预测。常用的时间序列模型有自回归移动平均模型(ARIMA)、季节性自回归综合移动平均模型(SARIMA)等。

公式
  1. 自回归模型(AR, Autoregressive Model)

其中,yt 是时间 t 的观测值,c 是常数项,ϕi 是自回归系数,ϵt 是误差项。

  1. 移动平均模型(MA, Moving Average Model)

    其中,μ 是均值,θi 是移动平均系数,ϵt 是误差项。
  2. 自回归移动平均模型(ARMA, Autoregressive Moving Average Model)

结合了AR和MA模型:

  1. 自回归综合移动平均模型(ARIMA, Autoregressive Integrated Moving Average Model)

ARIMA 模型在 ARMA 模型的基础上引入差分操作以处理非平稳时间序列:

其中,L 是滞后算子,d 是差分阶数。

生活场景应用的案例

销售量预测:时间序列分析可以用于商店的销售量预测。假设我们有一个包含过去几年的销售数据的时间序列,我们可以使用时间序列模型来预测未来的销售量。这可以帮助商店优化库存管理,避免过多或过少的库存。

案例描述

假设我们有一个包含过去五年某商店每月销售量的数据集,我们希望通过这些历史数据来预测未来几个月的销售量。我们可以使用ARIMA模型进行训练和预测。训练完成后,我们可以使用模型来预测未来的销售量,并评估模型的性能。

代码解析

下面是一个使用Python实现上述销售量预测案例的示例,使用了 statsmodels 库。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_squared_error

# 创建示例数据(假设我们有过去5年的月度销售数据)
np.random.seed(42)
date_range = pd.date_range(start='2015-01-01', periods=60, freq='M')
sales_data = np.random.poisson(lam=200, size=len(date_range)) + np.linspace(0, 50, len(date_range))
data = pd.DataFrame({'date': date_range, 'sales': sales_data})
data.set_index('date', inplace=True)

# 可视化数据
data.plot(figsize=(12, 6))
plt.title('Monthly Sales Data')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.show()

# 拆分训练集和测试集
train_data = data[:48]  # 前48个月为训练集
test_data = data[48:]   # 后12个月为测试集

# 创建和训练ARIMA模型
model = SARIMAX(train_data['sales'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
model_fit = model.fit(disp=False)

# 预测
forecast = model_fit.forecast(steps=12)
forecast = pd.Series(forecast, index=test_data.index)

# 评估模型
mse = mean_squared_error(test_data['sales'], forecast)
print(f'Mean Squared Error: {mse}')

# 可视化预测结果
plt.figure(figsize=(12, 6))
plt.plot(train_data.index, train_data['sales'], label='Training Data')
plt.plot(test_data.index, test_data['sales'], label='Actual Sales')
plt.plot(test_data.index, forecast, label='Forecasted Sales', color='red')
plt.title('Sales Forecast')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.legend()
plt.show()

在这个示例中:

  1. 我们创建了一个包含过去5年的月度销售数据的示例数据集。
  2. 将数据集拆分为训练集和测试集。
  3. 创建并训练了一个SARIMA模型。SARIMA模型在ARIMA模型的基础上增加了季节性成分,以捕捉数据中的季节性模式。
  4. 使用训练好的模型对未来12个月的销售量进行预测。
  5. 计算并输出均方误差(MSE)来评估模型的性能。
  6. 可视化实际销售数据和预测结果,展示模型的预测效果。

这个案例展示了如何使用时间序列模型来预测商店的销售量,基于历史销售数据。模型训练完成后,可以用于预测未来的销售量,并帮助商店在库存管理和销售策略上做出更好的决策。

集成学习(Ensemble Learning)

原理

集成学习通过组合多个基学习器来提高预测性能。其核心思想是通过集成多个模型的预测结果,降低误差并提高泛化能力。常见的集成学习方法包括袋装(Bagging)、提升(Boosting)和堆叠(Stacking)。

  • 袋装(Bagging):通过对数据集进行多次有放回的采样,生成多个不同的训练集,并在每个训练集上训练一个基学习器。最终的预测结果通过对这些基学习器的预测结果进行平均或投票来确定。常见的袋装方法有随机森林(Random Forest)。
  • 提升(Boosting):通过顺序训练多个基学习器,每个基学习器在前一个学习器的错误基础上进行改进。常见的提升方法有梯度提升决策树(GBDT)、AdaBoost等。
  • 堆叠(Stacking):通过训练多个基学习器,并将这些基学习器的预测结果作为新的特征,再训练一个次级学习器进行最终的预测。
公式
  1. 袋装(Bagging)

其中,T 是基学习器的数量,ht 是第 t 个基学习器对样本 x 的预测结果。

  1. 提升(Boosting)

其中,T 是基学习器的数量,αt 是第 t 个基学习器的权重,ht 是第 t 个基学习器对样本 x 的预测结果。

生活场景应用的案例

垃圾邮件分类:集成学习可以用于电子邮件的垃圾邮件分类。假设我们有一个包含邮件内容、发件人、主题等特征的数据集。我们可以使用集成学习模型来预测一封新邮件是否为垃圾邮件。这可以帮助用户自动过滤掉不需要的垃圾邮件,提高工作效率。

案例描述

假设我们有一个包含邮件信息的数据集,包括以下特征:

  • 邮件内容
  • 发件人
  • 主题

我们希望通过这些特征预测一封邮件是否为垃圾邮件。我们可以使用集成学习中的堆叠方法进行训练和预测。训练完成后,我们可以使用模型来预测新邮件的垃圾邮件概率,并评估模型的性能。

代码解析

下面是一个使用Python实现上述垃圾邮件分类案例的示例,使用了 scikit-learn 库和堆叠集成方法。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
import seaborn as sns

# 创建示例数据
data = {
    'email_content': [
        'Win a free lottery prize now!',
        'Your order has been shipped',
        'Limited time offer, buy now!',
        'Meeting at 3 PM',
        'Get your free coupon',
        'Important update on your account',
        'Congratulations, you won!',
        'Can we reschedule our appointment?',
        'Special discount just for you',
        'Invoice for your recent purchase'
    ],
    'label': [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]  # 1: Spam, 0: Not Spam
}

# 转换为DataFrame
df = pd.DataFrame(data)

# 特征提取
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['email_content'])
y = df['label']

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 打印训练集和测试集的大小
print(f'Training set size: {X_train.shape}')
print(f'Test set size: {X_test.shape}')

# 定义基学习器
estimators = [
    ('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
    ('gb', GradientBoostingClassifier(n_estimators=100, random_state=42)),
    ('svm', SVC(probability=True, random_state=42))
]

# 创建堆叠模型
stacking_model = StackingClassifier(
    estimators=estimators,
    final_estimator=LogisticRegression(),
    cv=3  # 将cv值调整为较低的值
)

# 训练堆叠模型
stacking_model.fit(X_train, y_train)

# 预测
y_pred = stacking_model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
report = classification_report(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(cm)
print('Classification Report:')
print(report)

# 可视化混淆矩阵
plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()

在这个示例中:

  1. 我们创建了一个包含邮件内容的示例数据集。
  2. 使用 TfidfVectorizer 对邮件内容进行特征提取。
  3. 将数据集拆分为训练集和测试集。
  4. 定义了三个基学习器:随机森林(Random Forest)、梯度提升决策树(Gradient Boosting Decision Tree)和支持向量机(SVM)。
  5. 使用这些基学习器创建一个堆叠模型,并在训练集上进行训练。
  6. 使用训练好的堆叠模型对测试集进行预测。
  7. 计算并输出准确率(accuracy)、混淆矩阵(confusion matrix)和分类报告(classification report)。
  8. 可视化混淆矩阵,展示模型的分类效果。

这个案例展示了如何使用集成学习中的堆叠方法来进行垃圾邮件分类,基于邮件内容的特征。模型训练完成后,可以用于预测新邮件是否为垃圾邮件,并帮助用户自动过滤垃圾邮件,提高工作效率。

标签:集成,plt,预测,模型,学习,test,序列,import,data
From: https://blog.csdn.net/LS_Ai/article/details/140837807

相关文章

  • UDS学习总结
    1UDS简介1.1什么是UDSUDS(UnifiedDiagnosticServices)统一诊断服务,是车辆诊断的一种应用层协议,面向整车所有ECU,UDS协议ISO14229定义了应用层和会话层,在协议里面定义了诊断的请求,诊断响应的报文格式,以及ECU怎样处理诊断请求报文,以及诊断服务的应用。它不关心底层数据链路......
  • 为什么 functools.cache 装饰器不能在我的带有记忆功能的斐波那契序列函数上工作?
    我在python中搞乱了记忆,并使用了一个示例斐波那契序列函数作为模型。我将第一个fibonacci()函数编写为常规函数,无需记忆,它按预期工作。接下来,我编写了我的fibonacci_memo()函数,该函数使用带有输出的输入字典来利用记忆化,并且按预期工作。然后我想测试functo......
  • 面部识别 - 机器学习
    我正在尝试在GoogleColab上使用Tensorflow进行面部识别,但遇到错误。以前工作得很好,但现在却抛出了这个错误。完整的.ipynb文件已链接(请注意,您需要一个包含.jpg文件的负数、正数和锚文件夹才能运行程序。)使暹罗模型出错文件链接:https://www.mediafire.com......
  • 在 root 或 fsolve 中使用solve_ivp会给出ValueError:使用序列设置数组元素
    我需要求解具有特定参数p的方程组,然后需要找到能够给出所需结果的p值。我的代码看起来像(简化版本)importnumpyasnpfromscipy.integrateimportsolve_ivpfromscipy.optimizeimportrootdefsystem(t,y,alpha):phi,psi,N=ydphi_dt=psidpsi_......
  • 机器学习--神经网络
    什么是神经网络?         “神经网络是由具有适应性的简单单元组成广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。”##神经网络是一个很大的学科领域,此处仅讨论神经网络与机器学习的交集,即“神经网络学习",亦称“连接主义”学习......
  • FreeRTOS学习笔记(二)
    FreeRTOS移植一、获取FreeRTOS源码1.1官网下载进入官网直接下载官网:https://www.freertos.org/zh-cn-cmn-s/1.2正点原子网盘下载正点原子资料v10.4.6例程git:https://gitee.com/yuan-zhenbin/freertos-code-repository.gitFreeRTOS资料网盘:http://www.openedv.c......
  • 基于SpringBoot+Vue+uniapp的经典诗文学习爱好者学习交流平台(源码+lw+部署文档+讲解
    在这里插入图片描述@toc前言......
  • KLC 数点学习笔记
    KLC数点由KLC大神在模拟赛中发明。其算法复杂度与答案值域大小挂钩。其能解决的问题一般有着如下的特点:给定一个序列,每次询问一个区间有多少个子区间满足什么性质,数据随机生成。其算法流程为:通过某种方法预处理出所有满足性质的子区间将得到的区间表示在二维平面上......
  • 学习日记:一维字符型数组
    目录1.格式2.字符串长度3.字符数组的输入输出3.1gets函数3.2puts函数3.3scanf函数3.4printf函数4.字符串处理函数4.1strlen函数(计算数组长度)4.2strcpy函数(复制字符串)4.3strcat函数(拼接字符串)4.4strcmp函数(比较字符串)1.格式数据类型数组名[数......
  • 多输入多输出预测:在Scikit-Learn中打造灵活的机器学习模型
    多输入多输出预测:在Scikit-Learn中打造灵活的机器学习模型在机器学习领域,Scikit-learn(简称sklearn)是一个功能强大且广泛使用的Python库。它提供了众多简单而有效的工具,用于数据挖掘和数据分析。然而,sklearn大多数内置的模型仅支持单输入单输出(SISO)的预测。当面对多输入多输......