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

构建时间序列Block RNN模型时预测值为NaN的问题排查

时间序列模型预测结果全为NaN的问题排查

问题背景

构建Block RNN时间序列模型时采用Datetime索引(而非整数索引),但预测结果全为NaN;测试NBEATS、Transformer、TCN模型时也出现相同情况。

数据集样式

数据集包含年、周、病例数(Cases)、降雨量(Rain)列,按周级日期索引组织。

实现代码

import pandas as pd
from darts import TimeSeries
from darts.utils.likelihood_models import Likelihood
from sklearn.model_selection import train_test_split
csv_file = 'data.csv'
df = pd.read_csv(csv_file)

# 构建日期索引
df['Year_Week'] = df['Year'].astype(str) + '-' + df['Week'].astype(str)

# 将Year_Week转换为周日起始的日期格式
df['Year_Week'] = pd.to_datetime(df['Year_Week'] + '-0', format='%Y-%U-%w')

# 设置日期为索引
df.set_index('Year_Week', inplace=True)

# 划分训练集和测试集
train_size = 0.8
test_size = 0.2

train_data, test_data = train_test_split(df, train_size=train_size, test_size=test_size, shuffle=False)

train_series = TimeSeries.from_dataframe(train_data[['Cases']], freq='W')
test_series = TimeSeries.from_dataframe(test_data[['Cases']], freq='W')
train_covariate_series = TimeSeries.from_dataframe(train_data[['Rain']], freq='W')
test_covariate_series = TimeSeries.from_dataframe(test_data[['Rain']], freq='W')

from darts.models import BlockRNNModel

block_rnn_model = BlockRNNModel(input_chunk_length=30, output_chunk_length=13, n_rnn_layers=2)
block_rnn_model.fit(train_series, past_covariates=train_covariate_series, epochs=100, verbose=True)

block_rnn_predictions = block_rnn_model.predict(7)
print(block_rnn_predictions)

输出结果

TimeSeries (DataArray) (Year_Week: 7, component: 1, sample: 1)>
array([[[nan]],

       [[nan]],

       [[nan]],

       [[nan]],

       [[nan]],

       [[nan]],

       [[nan]]])
Coordinates:
  * Year_Week  (Year_Week) datetime64[ns] 2008-09-14 2008-09-21 ... 2008-10-26
  * component  (component) object 'Cases'
Dimensions without coordinates: sample
Attributes:
    static_covariates:  None
    hierarchy:          None

问题原因及解决方案

1. 预测时协变量缺失

训练时使用了past_covariates(降雨量数据),但预测时未传入对应时间段的协变量数据,模型无法生成有效预测,返回NaN。

  • 解决方法:预测时传入包含训练+测试阶段的完整协变量序列:
    full_covariates = train_covariate_series.append(test_covariate_series)
    block_rnn_predictions = block_rnn_model.predict(7, past_covariates=full_covariates)
    
    若没有未来协变量数据,可先移除协变量训练模型,验证模型本身是否正常。

2. 输入输出窗口长度与训练数据量不匹配

input_chunk_length=30+output_chunk_length=13要求训练集样本数至少大于43,否则模型无法完成有效训练,权重未正确更新导致预测NaN。

  • 解决方法:检查训练集长度:
    print(len(train_data))
    
    若长度不足,缩小窗口参数(如input_chunk_length=10、output_chunk_length=5)或补充更多训练数据。

3. 原始数据存在缺失值

数据集本身的NaN会导致模型训练异常,最终输出NaN。

  • 解决方法:检查并处理缺失值:
    # 查看缺失值统计
    print(df.isna().sum())
    # 用前向填充处理缺失值
    df = df.fillna(method='ffill')
    

4. 时间序列频率不匹配

freq='W'未明确周日起始,可能与实际数据的时间频率不匹配,导致Darts内部处理出错。

  • 解决方法:指定准确的频率:
    train_series = TimeSeries.from_dataframe(train_data[['Cases']], freq='W-SUN')
    train_covariate_series = TimeSeries.from_dataframe(train_data[['Rain']], freq='W-SUN')
    

5. 模型训练不充分

epochs=100可能不足以让模型收敛,导致未学到有效特征。

  • 解决方法:增加训练轮次(如epochs=200),或调整模型学习率(通过optimizer_kwargs参数设置),同时观察训练损失变化,确认损失是否持续下降。

内容的提问来源于stack exchange,提问作者Shashank Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:22:05