【问题标题】:How to determine if the predicted probabilities from sklearn logistic regresssion are accurate?如何确定 sklearn 逻辑回归的预测概率是否准确?
【发布时间】:2018-03-05 15:58:10
【问题描述】:

我对机器学习完全陌生,我正在尝试使用 scikit-learn 制作一个简单的逻辑回归模型,其中包含 1 个输入变量 (X) 和一个二元结果 (Y)。我的数据由 325 个样本组成,其中 39 次成功,286 次失败。数据被分成训练和测试(30%)集。

我的目标实际上是根据我的数据获得任何给定 X 的预测成功概率,而不是分类预测本身。也就是说,我将在我正在构建的单独模型中使用预测概率,并且根本不会使用逻辑回归作为分类器。因此,预测的概率实际上与数据相符是很重要的。

但是,我无法理解我的模型是否适合数据,或者计算出的概率是否真的准确。

我得到以下指标:

  • 分类准确度:metrics.accuracy_score(Y_test, predicted) = 0.92。 我对这个指标的理解是,该模型很有可能做出正确的预测,因此在我看来,该模型非常适合。

  • 对数损失:cross_val_score(LogisticRegression(), X, Y,scoring='neg_log_loss', cv=10) = -0.26 这对我来说可能是最令人困惑的指标,而且显然是最重要的,因为它是预测概率的准确性。我知道分数越接近零越好 - 但有多接近才足够接近?

  • AUC:metrics.roc_auc_score(Y_test, probs[:, 1]) = 0.9。同样,这看起来不错,因为 ROC 分数越接近 1 越好。

  • 混淆矩阵:metrics.confusion_matrix(Y_test, predicted) =

            [  88,  0]
               [8,  2]
    

    我的理解是,对角线给出了训练集中正确预测的数量,所以这看起来没问题。

  • 报告:metrics.classification_report(Y_test, predict) =

                precision    recall  f1-score   support
    
    0.0       0.92      1.00      0.96        88
    1.0       1.00      0.20      0.33        10
    
    avg / total       0.93      0.92      0.89        98
    

    根据这份分类报告,该模型具有良好的精度,因此非常适合。 我不确定如何解释召回,或者该报告是否对我的模型来说是个坏消息——sklearn 文档指出召回是一种模型能够找到所有正样本的能力——因此预测为 1 的得分为 0.2 意味着它只能在 20% 的时间里找到积极的一面?这听起来很不适合数据。

如果有人能澄清我正在以正确的方式解释这些指标,我将非常感激 - 或许能阐明我的模型是好还是假。另外,如果我可以做任何其他测试来确定计算的概率是否准确,请告诉我。

如果这些不是很好的指标分数,我真的很感激关于下一步改进的方向。

谢谢!!

【问题讨论】:

    标签: python machine-learning scikit-learn logistic-regression


    【解决方案1】:

    您的数据集不平衡,因为失败远多于成功。一个总是猜测失败的分类器会得到 86%,所以 92% 的精度并不是那么令人印象深刻。

    然后混淆矩阵显示正在发生的事情。 88 次正确预测失败,8 次错误预测失败。它实际上只有两次正确预测成功。

    精确度是它做出正确猜测的次数:因此 (88 + 2)/98 = 0.92% 总体。成功召回率仅占 (8+2) 总成功率中的 2 次(或 20%)。

    所以这个模型不太合适。有很多方法可以处理不平衡的数据集,例如对示例加权或在预测之前应用先验。混淆矩阵是查看实际情况的好方法。

    【讨论】:

      【解决方案2】:

      您的数据存在类别不平衡问题。在训练分类器时,您没有指定任何处理它的方法。但是,即使您的准确率很高,也可能是因为失败样本的数量非常大,因此您的测试集也可能会填充它。

      要处理它,您可以使用Stratified split in sklearn 对数据进行洗牌和拆分,以解决类不平衡问题。

      您也可以尝试其他技术来改进您的分类器,例如GridSearch。您可以阅读更多关于模型评估的信息here in this link。对于特定于模型的交叉验证技术,请查看this section in sklearn.

      您可以做的另一件事是,您可以专注于召回率和精度(甚至在您的情况下为真阳性率),而不是使用准确度作为训练分类器的指标。您将需要使用make_scorer in sklearn。可以在herehere 中找到一个示例。您可能还想查看 F1 分数或 F_beta 分数。

      您还可以查看this Github repository 了解各种采样技术来解决 sklearn 中的类不平衡问题。

      您也可以查看this answer 了解更多技术。

      【讨论】:

        猜你喜欢
        • 2015-05-04
        • 2013-12-24
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        • 2018-07-05
        • 2020-06-13
        • 2017-10-18
        • 1970-01-01
        相关资源
        最近更新 更多