【问题标题】:How to fetch R2 for each target in sklearn MultiOutputRegressor() rather than the overall R2?如何为 sklearn MultiOutputRegressor() 中的每个目标而不是整体 R2 获取 R2?
【发布时间】:2021-11-15 14:38:34
【问题描述】:

例如Xs有5个自变量,Ys有5个因变量:

x_train, x_test, y_train, y_test = train_test_split(Xs, Ys, test_size=0.2, random_state=2)

model = lgb.LGBMRegressor()
wrapper = MultiOutputRegressor(model)

model.fit(x_train, y_train)
model.score(x_test, y_test)

只能通过上面的代码得到整体的 R2,如果我想检查每个 Y 的 R2 怎么办? 有可能吗?

谢谢

【问题讨论】:

    标签: python scikit-learn regression


    【解决方案1】:

    您可以将 scikit-learn r2_scoremultioutput='raw_values' 一起使用:

    from sklearn.datasets import make_regression
    from sklearn.model_selection import train_test_split
    from sklearn.multioutput import MultiOutputRegressor
    from sklearn.metrics import r2_score
    import lightgbm as lgb
    
    # generate the data
    X, Y = make_regression(n_targets=5, n_features=10, n_samples=1000, random_state=42)
    
    # split the data
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
    
    # instantiate the model
    model = MultiOutputRegressor(estimator=lgb.LGBMRegressor())
    
    # fit the model
    model.fit(X_train, Y_train)
    
    # generate the model predictions
    Y_pred = model.predict(X_test)
    
    # calculate the individual R2's
    print(r2_score(Y_test, Y_pred, multioutput='raw_values'))
    # [0.907924 0.925267 0.906492 0.939653 0.881619]
    
    print([r2_score(Y_test[:, i], Y_pred[:, i]) for i in range(Y_test.shape[1])])
    # [0.907924, 0.925267, 0.906492, 0.939653, 0.881619]
    
    # calculate the overall R2
    print(model.score(X_test, Y_test))
    # 0.9121908184618046
    
    print(r2_score(Y_test, Y_pred, multioutput='uniform_average'))
    # 0.9121908184618046
    

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 2018-01-05
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多