封装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
相关产品推荐
相关产品推荐

