MLB球员数据预测后MinMaxScaler反缩放报错求助
MLB球员数据预测项目:MinMaxScaler反缩放维度不匹配问题解决
项目背景
我正在开展1970-2022年MLB球员数据预测项目,拥有两个数据集:
- 击球手数据集:20个特征,预测5项数据
- 投手数据集:25个特征,预测6项数据
当前使用决策树模型,后续计划尝试线性回归与LSTM模型。
预处理流程与错误场景
预处理阶段先移除无关列:
remove_bat_cols = ['Name', 'Tm', 'Year', 'Nxt_BA', 'Nxt_RBI', 'Nxt_HR', 'Nxt_BB', 'Nxt_SO'] remove_pitch_cols = ['Name', 'Tm', 'Year', 'Nxt_ERA', 'Nxt_SO', 'Nxt_WHIP', 'Nxt_BB', 'Nxt_W', 'Nxt_SV'] bat_cols = batting.columns[~batting.columns.isin(remove_bat_cols)] pitch_cols = pitching.columns[~pitching.columns.isin(remove_pitch_cols)]
随后使用MinMaxScaler缩放数据,尝试反缩放时触发错误:
scaler = MinMaxScaler() batting.loc[:, bat_cols] = scaler.fit_transform(batting[bat_cols]) pitching.loc[:, pitch_cols] = scaler.fit_transform(pitching[pitch_cols]) # 反缩放尝试 batting.loc[:, bat_cols] = scaler.inverse_transform(batting[bat_cols]) pitching.loc[:, pitch_cols] = scaler.inverse_transform(pitching[pitch_cols])
错误信息:
ValueError: operands could not be broadcast together with shapes (26768,29) (31,) (26768,29)
尝试添加预测列、仅处理预测列,仍出现相同错误。
问题根源
你使用了同一个MinMaxScaler实例先后对击球手(20个特征)和投手(25个特征)的数据执行fit操作。scaler的内部参数(如min_、scale_)会在第二次fit时被覆盖,变为对应投手数据集的25个特征维度。后续用该scaler反缩放击球手的20维数据时,就会出现维度不匹配的广播错误。
解决方法
为击球手和投手分别创建独立的Scaler实例,各自维护对应数据集的缩放参数:
1. 初始化独立Scaler
scaler_bat = MinMaxScaler() scaler_pitch = MinMaxScaler()
2. 分别执行缩放
# 处理击球手数据 batting.loc[:, bat_cols] = scaler_bat.fit_transform(batting[bat_cols]) # 处理投手数据 pitching.loc[:, pitch_cols] = scaler_pitch.fit_transform(pitching[pitch_cols])
3. 对应执行反缩放
# 反缩放击球手数据 batting.loc[:, bat_cols] = scaler_bat.inverse_transform(batting[bat_cols]) # 反缩放投手数据 pitching.loc[:, pitch_cols] = scaler_pitch.inverse_transform(pitching[pitch_cols])
额外验证步骤
执行前可先确认特征列长度,确保与数据集维度匹配:
print(f"击球手特征列数量:{len(bat_cols)}") # 应输出20 print(f"投手特征列数量:{len(pitch_cols)}") # 应输出25
通过这种方式,每个scaler仅对应自身数据集的维度,即可避免广播不匹配的问题。
内容的提问来源于stack exchange,提问作者DJB17
相关产品推荐
相关产品推荐

