【问题标题】:Calculate evaluation metrics using cross_val_predict sklearn使用 cross_val_predict sklearn 计算评估指标
【发布时间】:2019-04-30 14:57:12
【问题描述】:

sklearn.model_selection.cross_val_predictpage 中声明:

为每个输入数据点生成交叉验证的估计值。它是 不适合将这些预测传递到评估指标中。

谁能解释一下这是什么意思?如果这给出了每个 Y(真实 Y)的 Y(y 预测)估计值,为什么我不能使用这些结果计算 RMSE 或决定系数等指标?

【问题讨论】:

    标签: python scikit-learn cross-validation


    【解决方案1】:

    为了更清楚一点,如果您考虑非线性评分函数(例如最大绝对误差)而不是平均绝对误差之类的东西,则更容易理解差异。

    cross_val_score() 将计算 3 倍的最大绝对误差(假设 3 倍交叉验证器)并报告 3 个这样的分数的总和(比如平均值?)。也就是说,类似于 (a, b, c) 的平均值,其中 a , b, c 分别是 3 折的最大绝对误差。我想在平均或一般情况下,将返回值推断为估计器的最大绝对误差是安全的。

    使用 cross_val_predict() 您将获得对应于 3 倍的 3 组预测,并且在这 3 组预测的聚合(连接)上取最大绝对误差肯定与上述不同。即使两种情况下的预测值相同,您最终得到的是 (a, b,c ) 的最大值。此外, max(a,b,c) 将是模型的最大绝对误差分数的不合理且过于悲观的表征。

    【讨论】:

    • 您知道 cross_val_predict 返回的折叠和索引集是否与各种 K-Fold 方法返回的相匹配?如果他们这样做,可以计算出与 cross_val_score 相同的结果。
    【解决方案2】:

    这似乎是基于样本的分组和预测方式。来自cross_val_predict 文档中链接的user guide

    关于不恰当使用 cross_val_predict 的警告说明

    结果 cross_val_predict 可能与使用获得的不同 cross_val_score 因为元素以不同的方式分组。这 函数 cross_val_score 对交叉验证折叠取平均值, 而 cross_val_predict 只返回标签(或概率) 从几个不同的模型无法区分。因此,cross_val_predict 不是泛化误差的适当度量。

    cross_val_score 似乎表示它是所有折叠的平均值,而 cross_val_predict 将单个折叠和不同的模型分组但不是全部,因此它不一定会概括.例如,使用 sklearn 页面中的示例代码:

    from sklearn import datasets, linear_model
    from sklearn.model_selection import cross_val_predict, cross_val_score
    from sklearn.metrics import mean_squared_error, make_scorer
    diabetes = datasets.load_diabetes()
    X = diabetes.data[:200]
    y = diabetes.target[:200]
    lasso = linear_model.Lasso()
    y_pred = cross_val_predict(lasso, X, y, cv=3)
    
    print("Cross Val Prediction score:{}".format(mean_squared_error(y,y_pred)))
    
    print("Cross Val Score:{}".format(np.mean(cross_val_score(lasso, X, y, cv=3, scoring = make_scorer(mean_squared_error)))))
    
    Cross Val Prediction score:3993.771257795029
    Cross Val Score:3997.1789145156217
    

    【讨论】:

    • 我读过它,但我不确定我是否完全理解......这就是为什么我首先发布这个问题,如果有人可以用不同的词来解释它。是不是因为每个折叠都基于稍微不同的模型(例如,PCA 中的不同 PC),因此计算例如 RMSE 不是最新的,因为它将基于稍微不同的模型的预测?
    • 查看我上面的编辑。无需深入研究 sklearn 源代码(您可以在 github 上进行操作),您可以查看结果,如图所示。差异很小,但很明显
    • 谢谢你,这是我想的,你的回答有助于确认。
    猜你喜欢
    • 2021-11-16
    • 2016-05-21
    • 2020-12-07
    • 2014-08-02
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2015-05-11
    相关资源
    最近更新 更多