居然阿 2025-01-14 11:12 采纳率: 0%
浏览 19

TimeGPT预测数据效果很差是怎么回事

请问下,使用TimeGPT预测时序数据的效果很差是怎么回事?
原始数据有1150个数据点,几乎是一条直线,根据这些数据预测后面50个点,但是预测出来的数据偏差很大
这是我的原始代码

import pandas as pd
import numpy as np
from nixtla import NixtlaClient
from utilsforecast.losses import mae, smape
from utilsforecast.evaluation import evaluate
import matplotlib.pyplot as plt

# 读取xlsx文件
df = pd.read_excel('TimeGPT/2.xlsx')

# 获取所有列名
columns = df.columns.tolist()
time_col = columns[1]  # 第二列是时间

# 准备数据
train_size = 1150
train_df = pd.DataFrame({
    'unique_id': 'id1',
    'ds': df[time_col][:train_size],
    'y': df['y'][:train_size]  # 使用y列数据
})

# 准备测试数据
test_df = pd.DataFrame({
    'unique_id': 'id1',
    'ds': df[time_col][train_size:train_size+50],
    'y': df['y'][train_size:train_size+50]
})

# 初始化 NixtlaClient
client = NixtlaClient(api_key='apikey')

# 预测(使用长期预测模式)
fcst = client.forecast(
    df=train_df,
    h=50,  # 预测未来50个点
    freq='s',  # 频率为秒
    level=[90],  # 添加90%置信区间
    time_col='ds',
    target_col='y',
    finetune_steps=20,  
    model='timegpt-1-long-horizon'  # 使用长期预测模式
)

# 确保时间列是datetime类型
fcst['ds'] = pd.to_datetime(fcst['ds'])
test_df['ds'] = pd.to_datetime(test_df['ds'])

# 合并测试数据和预测结果
merged_df = pd.merge(test_df, fcst, 'left', ['unique_id', 'ds'])

# 评估预测性能
evaluation = evaluate(
    merged_df,
    metrics=[mae, smape],
    models=["TimeGPT"],
    target_col="y",
    id_col='unique_id'
)

# 打印评估结果
average_metrics = evaluation.groupby('metric')['TimeGPT'].mean()
print("\n预测评估结果:")
print(f"MAE (平均绝对误差): {average_metrics['mae']:.6f}")
print(f"SMAPE (对称平均绝对百分比误差): {average_metrics['smape']:.6f}%")

# 打印一些实际值和预测值的对比
print("\n实际值vs预测值对比(前5个点):")
comparison_df = pd.DataFrame({
    'Time': merged_df['ds'],
    'Actual': merged_df['y'],
    'Predicted': merged_df['TimeGPT']
})
print(comparison_df.head())

# 打印预测结果的列名
print("\n预测结果的列名:", fcst.columns.tolist())

# 计算时间秒数(用于绘图)
base_time = df[time_col].iloc[0]  # 使用第一个时间点作为基准
all_seconds = range(len(df))  # 使用简单的序号作为x轴
forecast_seconds = range(train_size, train_size + len(fcst))  # 预测点的序号

# 创建图表
plt.figure(figsize=(15, 8))

# 绘制预测区域
display_start = train_size - 20
plt.plot(range(display_start, train_size), 
         df['y'][display_start:train_size], 
         'o-', label='Training Data', color='blue', markersize=4)
plt.plot(range(train_size, train_size+50), 
         df['y'][train_size:train_size+50], 
         'o-', label='Actual Data', color='green', markersize=4)
plt.plot(forecast_seconds, fcst['TimeGPT'], 
         'o-', label='Forecast', color='red', markersize=4)

# 添加置信区间(如果存在)
if 'TimeGPT-lo-90' in fcst.columns:
    plt.fill_between(
        forecast_seconds,
        fcst['TimeGPT-lo-90'],
        fcst['TimeGPT-hi-90'],
        alpha=0.3,
        label='90% Confidence Interval'
    )

# 设置y轴范围,使用更精确的范围
display_data = pd.concat([
    df['y'][display_start:train_size+50],
    fcst['TimeGPT']
])
y_min = display_data.min()
y_max = display_data.max()
margin = (y_max - y_min) * 0.1  # 10%的边距
plt.ylim(y_min - margin, y_max + margin)

# 设置y轴刻度格式
plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter('%.6f'))

# 调整图表布局
plt.xlabel('Time Points')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.tight_layout()

# 保存高DPI的图片
plt.savefig('TimeGPT/forecast_2.png', dpi=300)
plt.close()

# 打印数值对比
print("\n数值对比详情:")
comparison_df['Difference'] = comparison_df['Actual'] - comparison_df['Predicted']
pd.set_option('display.float_format', lambda x: '%.8f' % x)
print(comparison_df)

# 保存预测结果
fcst.to_csv('TimeGPT/forecast_2.csv')

print("\n预测完成!图片和预测数据已保存到realData1目录下。") 

这是预测结果(我只画出预测的那段时间附近

img


  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的描述和代码来看,预测效果差的可能原因有很多,以下是一些可能的原因和解决方案:

    1. 数据特性问题:你的数据几乎是一条直线,这可能意味着数据中的变化非常小或者几乎没有变化。对于这样的数据,预测模型可能很难捕捉到任何有意义的模式或趋势。可以尝试在数据预处理阶段对数据进行处理,如差分或其他方法增加数据的变动性。
    2. 模型选择问题:TimeGPT是适合时序数据的模型,但是并不一定适用于所有情况。特别是在数据变化较小的情况下,可能不适合使用长期预测模型。你可能需要尝试其他类型的模型或调整模型的参数。
    3. 训练数据不足:你的训练数据只有1150个点,这在某些情况下可能不足以训练一个复杂的预测模型。可以尝试增加训练数据的数量或获取更多数据来增强模型的训练效果。
    4. 时间序列断裂问题:在实际应用中,数据的趋势、周期性等特性可能会随时间发生变化,称为时间序列的断裂。如果训练数据和测试数据的特性差异较大,可能会导致预测效果不佳。你需要确保训练和测试数据的特性尽可能一致。
    5. 参数设置问题:你可能需要检查模型的参数设置是否正确。例如,你可能需要调整模型的时间步长或其他参数以获得更好的预测结果。你也可以通过网格搜索等方法进行参数调优。

    你可以从以上几个方面入手尝试解决问题。同时,也可以考虑使用其他预测模型进行对比实验,以确认问题是否出在模型选择上。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月14日
  • 修改了问题 1月14日
  • 创建了问题 1月14日