在篮球赛事DataFrame数据集上实现RNN时出现KeyError:23如何解决
问题根因
- 直接触发KeyError的原因:你传入
TimeseriesGenerator的yTrain是Pandas Series类型,保留了原始数据集的非连续索引,而生成器读取目标值时使用的是0起始的连续整数下标,当下标对应的索引不存在(比如报错里的23)就会抛出异常。 - 隐藏的逻辑错误:时序预测任务不能使用
train_test_split做随机拆分,会打乱比赛的时间顺序,导致训练集泄露未来数据,完全不符合你用历史表现预测未来胜负的需求。另外你当前的实现是把所有队伍的比赛行直接按全局顺序滑动生成序列,会把不同队伍的比赛混在同一个时间步窗口里,无法实现「提取特定队伍历史表现」的目标。
修复方案
- 首先对全量数据集按比赛时间列升序排序,按顺序拆分训练集和测试集,禁止随机打乱:
# 假设你的时间列名为match_time,替换为你实际的时间列名 data = data.sort_values('match_time', ascending=True).reset_index(drop=True) target_name = "win_bool" y = data[target_name] X = data.drop(columns=[target_name, "winner"]) # 按时间切分前80%为训练集,后20%为测试集 train_size = int(len(X) * 0.8) XTrain, XTest = X.iloc[:train_size], X.iloc[train_size:] yTrain, yTest = y.iloc[:train_size], y.iloc[train_size:]
- 把yTrain、yTest转为numpy数组,规避Pandas索引匹配问题:
scalar = StandardScaler() XTrain = scalar.fit_transform(XTrain) XTest = scalar.transform(XTest) # 转成numpy数组,按位置取值即可解决索引不匹配的KeyError yTrain = yTrain.values yTest = yTest.values
- (可选但必须满足你的业务需求)如果要提取单支队伍的历史表现,需要先按队伍ID分组,对每个队伍单独生成时序样本,再合并所有队伍的样本做训练,避免不同队伍的数据混在同一个窗口里。
完成以上修改后原有训练、预测代码即可正常运行。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

