如何获取sklearn的MultiOutputRegressor每个目标的R2而非整体R2
多输出回归单维度R2计算方案
完全可以实现,你可以通过以下两种方式计算每个因变量对应的单独R2值:
注意:你现有代码存在逻辑疏漏:已实例化
MultiOutputRegressor包装器wrapper,但后续训练、评分调用的仍是原始单输出LGBMRegressor对象model,不符合多输出训练逻辑,需要先修正为调用wrapper执行训练流程。
方法1:手动逐维度调用R2评估函数计算
引入sklearn.metrics下的r2_score接口,遍历每个因变量维度分别计算得分:
from sklearn.model_selection import train_test_split from sklearn.multioutput import MultiOutputRegressor import lightgbm as lgb from sklearn.metrics import r2_score # 数据切分 x_train, x_test, y_train, y_test = train_test_split(Xs, Ys, test_size=0.2, random_state=2) # 多输出模型训练 base_model = lgb.LGBMRegressor() wrapper = MultiOutputRegressor(base_model) wrapper.fit(x_train, y_train) # 测试集预测 y_pred = wrapper.predict(x_test) # 逐维度计算R2 output_num = y_test.shape[1] single_r2_scores = [] for i in range(output_num): score = r2_score(y_test[:, i], y_pred[:, i]) single_r2_scores.append(score) print(f"第{i+1}个因变量R2:{score:.4f}")
方法2:调用子模型自带评分方法
MultiOutputRegressor会为每个输出维度单独训练一个基模型,存储在estimators_属性中,可直接遍历调用每个子模型的score方法得到对应维度的R2:
for idx, sub_model in enumerate(wrapper.estimators_): score = sub_model.score(x_test, y_test[:, idx]) print(f"第{idx+1}个因变量R2:{score:.4f}")
两种方法计算得到的结果完全一致,可按需选择。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

