构建时间序列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
相关产品推荐
相关产品推荐

