You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

封装TimeSeriesPredictor类调用绘图方法无法输出图像,求改进方案

解决ThymeBoost封装类绘图无输出问题

针对训练日志正常但无图像输出的问题,可通过以下几点改进:

  • 显式指定Matplotlib后端
    部分环境下Matplotlib默认后端不支持交互式显示,在导入matplotlib.pyplot后添加后端指定代码,适配不同运行环境:

    import matplotlib.pyplot as plt
    plt.switch_backend('TkAgg')  # 桌面环境可选'Qt5Agg',非交互式环境用'Agg'
    

    若在Jupyter环境运行,替换为%matplotlib inline。

  • 修正预测值的绘图索引
    原代码直接绘制预测值会导致其从x=0开始,与原始序列完全重叠,无法直观显示。修改plot_results方法,让预测值从原始序列的末尾位置开始绘制:

    def plot_results(self):
        plt.plot(self.y, label='原始序列')
        pred_x = np.arange(len(self.y), len(self.y) + len(self.predicted_output))
        plt.plot(pred_x, self.predicted_output, label='预测序列')
        plt.legend()
        plt.show()
    
  • 确保渲染流程完整
    部分环境需添加plt.pause(0.001)确保图像渲染完成,或检查代码是否在plt.show()前意外终止。

修改后的完整代码

import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')  # 添加后端指定
import seaborn as sns
from ThymeBoost import ThymeBoost as tb

class TimeSeriesPredictor:
    def __init__(self, y, seasonal_period=25, cost_penalty=.001, n_split_proposals=25, verbose=1):
        self.y = y
        self.seasonal_period = seasonal_period
        self.cost_penalty = cost_penalty
        self.n_split_proposals = n_split_proposals
        self.verbose = verbose
        self.boosted_model = None
        self.output = None
        self.predicted_output = None

    def fit_model(self, trend_estimator='linear', seasonal_estimator='fourier', split_cost='mse', global_cost='maicc', fit_type='local'):
        self.boosted_model = tb.ThymeBoost(
                            approximate_splits=True,
                            n_split_proposals=self.n_split_proposals,
                            verbose=self.verbose,
                            cost_penalty=self.cost_penalty,
                            )

        self.output = self.boosted_model.fit(self.y,
                           trend_estimator=trend_estimator,
                           seasonal_estimator=seasonal_estimator,
                           seasonal_period=self.seasonal_period,
                           split_cost=split_cost,
                           global_cost=global_cost,
                           fit_type=fit_type)

    def predict(self, n_steps):
        self.predicted_output = self.boosted_model.predict(self.output, n_steps)

    def plot_results(self):
        plt.plot(self.y, label='原始序列')
        pred_x = np.arange(len(self.y), len(self.y) + len(self.predicted_output))
        plt.plot(pred_x, self.predicted_output, label='预测序列')
        plt.title('时间序列预测结果')
        plt.legend()
        plt.show()

    def plot_components(self):
        self.boosted_model.plot_components(self.output)
        plt.show()

if __name__ == '__main__':

    #生成含季节性与轻微趋势的随机序列
    seasonality = ((np.cos(np.arange(1, 101))*10 + 50))
    np.random.seed(100)
    true = np.linspace(-1, 1, 100)
    noise = np.random.normal(0, 1, 100)
    y = true + noise + seasonality
    y = np.append(y, true + noise + seasonality)

    predictor = TimeSeriesPredictor(y)
    predictor.fit_model()
    predictor.predict(100)
    predictor.plot_results()
    predictor.plot_components()

内容的提问来源于stack exchange,提问作者ah bon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:38