CatBoost多输出回归报错:All train targets are equal 求助
CatBoost多输出回归报错「All train targets are equal」解决办法
问题场景
你的数据集尺寸:
x_train=(60,20) y_train=(60,17657) x_test=(15,20) y_test=(15,17657)
训练代码:
cat_model=CatBoostRegressor(loss_function="MultiRMSE",n_estimators=5,max_depth=4, eval_metric="MultiRMSE").fit(x_train,y_train, eval_set=(x_test,y_test) )
运行后触发错误:All train targets are equal
错误原因
这个错误说明y_train中存在至少一个输出维度的所有样本值完全相同,CatBoost无法对这种无波动的目标进行回归拟合——没有差异就没有可学习的信息。
解决步骤
- 第一步:定位方差为0的输出维度
用numpy计算每个输出维度的方差,找出所有值完全相同的列:import numpy as np variances = np.var(y_train, axis=0) zero_var_cols = np.where(variances == 0)[0] print(f"发现{len(zero_var_cols)}个方差为0的输出维度") print(f"部分维度索引示例:{zero_var_cols[:10]}") - 第二步:处理无效维度
- 直接删除:如果这些维度本身就是无意义的常数输出,直接从训练集和测试集中移除:
# 筛选出方差不为0的维度 valid_cols = np.where(variances != 0)[0] y_train_clean = y_train[:, valid_cols] y_test_clean = y_test[:, valid_cols] - 检查数据源头:如果这些维度理论上应该有波动,那大概率是数据采集或预处理时出错了(比如批量填充了同一个值),需要回溯修正数据。
- 直接删除:如果这些维度本身就是无意义的常数输出,直接从训练集和测试集中移除:
- 第三步:重新训练模型
用清理后的目标变量重新运行训练代码:cat_model=CatBoostRegressor(loss_function="MultiRMSE",n_estimators=5,max_depth=4, eval_metric="MultiRMSE").fit(x_train,y_train_clean, eval_set=(x_test,y_test_clean) )
内容的提问来源于stack exchange,提问作者omer_tb
相关产品推荐
相关产品推荐

