如何确定 sklearn 逻辑回归的预测概率是否准确?
How to determine if the predicted probabilities from sklearn logistic regresssion are accurate?
我是机器学习的新手,我正在尝试使用 scikit-learn 制作一个简单的逻辑回归模型,其中包含 1 个输入变量 (X) 和一个二元结果 (Y)。我的数据包含 325 个样本,其中 39 个成功,286 个失败。数据被分成训练和测试 (30%) 集。
我的目标实际上是根据我的数据获得任何给定 X 的预测成功概率,而不是分类预测本身。也就是说,我将在我正在构建的单独模型中使用预测概率,并且根本不会使用逻辑回归作为分类器。因此,预测概率实际适合数据很重要。
但是,我无法理解我的模型是否适合数据,或者计算的概率是否真的准确。
我得到以下指标:
分类精度:metrics.accuracy_score(Y_test, 预测) = 0.92。
我对这个指标的理解是该模型做出正确预测的可能性很高,所以在我看来该模型很合适。
对数损失:cross_val_score(LogisticRegression(), X, Y, scoring='neg_log_loss', cv=10) = -0.26
这对我来说可能是最令人困惑的指标,显然也是最重要的指标,因为它是预测概率的准确性。我知道分数越接近零越好——但有多接近才算足够接近?
AUC:metrics.roc_auc_score(Y_test,概率[:, 1]) = 0.9。同样,这看起来不错,因为 ROC 分数越接近 1 越好。
混淆矩阵:metrics.confusion_matrix(Y_test,预测) =
[ 88, 0]
[8, 2]
我的理解是对角线给出了训练集中正确预测的数量,所以这看起来没问题。
报告:metrics.classification_report(Y_test,预测)=
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% 的时间内找到阳性结果?这听起来很不符合数据。
如果有人可以澄清我以正确的方式解释这些指标,我将不胜感激 - 也许可以阐明我的模型是好的还是假的。另外,如果我可以做任何其他测试来确定计算的概率是否准确,请告诉我。
如果这些不是很好的指标分数,我非常感谢您就下一步的改进方向提供一些指导。
谢谢!!
您的数据集不平衡,因为失败的次数远远多于成功的次数。一直猜测失败的分类器将获得 86%,因此 92% 的精度并不那么令人印象深刻。
然后混淆矩阵显示了正在发生的事情。 88 次它正确预测失败,8 次错误预测失败。它实际上只有两次正确预测成功。
精度是它做出正确猜测的次数:因此 (88 + 2)/98 = 0.92% 总体。成功的召回率仅为 (8+2) 次总成功中的 2 次(或 20%)。
所以这个模型不太合适。有很多方法可以处理不平衡的数据集,例如对示例进行加权或在预测之前应用先验。混淆矩阵是查看实际情况的好方法。
您的数据存在 class 不平衡问题。在训练您的 classifier 时,您没有指定任何方式来处理它。然而,即使你的准确性很高,也可能是因为失败样本的数量非常大,因此你的测试集也可能被填充。
要处理它,您可以使用 Stratified split in sklearn 来洗牌和拆分数据以解决 class 不平衡问题。
您还可以尝试其他技术来改进您的 classifier,例如 GridSearch as well. You can read more about model evaluation here in this link. For model specific cross-validation techniques check this section in sklearn.。
您还可以做的一件事是,与其将准确性用作训练 classifier 的指标,不如将重点放在召回率和精确率上(在您的情况下甚至是真阳性率)。您将需要使用 make_scorer in sklearn. An example can be found here and 。您可能还想查看 F1 分数或 F_beta 分数。
您还可以查看 this Github repository 各种采样技术来解决 sklearn 中的 class 不平衡问题。
您还可以查看 this answer 以了解更多技巧。
我是机器学习的新手,我正在尝试使用 scikit-learn 制作一个简单的逻辑回归模型,其中包含 1 个输入变量 (X) 和一个二元结果 (Y)。我的数据包含 325 个样本,其中 39 个成功,286 个失败。数据被分成训练和测试 (30%) 集。
我的目标实际上是根据我的数据获得任何给定 X 的预测成功概率,而不是分类预测本身。也就是说,我将在我正在构建的单独模型中使用预测概率,并且根本不会使用逻辑回归作为分类器。因此,预测概率实际适合数据很重要。
但是,我无法理解我的模型是否适合数据,或者计算的概率是否真的准确。
我得到以下指标:
分类精度:metrics.accuracy_score(Y_test, 预测) = 0.92。 我对这个指标的理解是该模型做出正确预测的可能性很高,所以在我看来该模型很合适。
对数损失:cross_val_score(LogisticRegression(), X, Y, scoring='neg_log_loss', cv=10) = -0.26 这对我来说可能是最令人困惑的指标,显然也是最重要的指标,因为它是预测概率的准确性。我知道分数越接近零越好——但有多接近才算足够接近?
AUC:metrics.roc_auc_score(Y_test,概率[:, 1]) = 0.9。同样,这看起来不错,因为 ROC 分数越接近 1 越好。
混淆矩阵:metrics.confusion_matrix(Y_test,预测) =
[ 88, 0] [8, 2]
我的理解是对角线给出了训练集中正确预测的数量,所以这看起来没问题。
报告:metrics.classification_report(Y_test,预测)=
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% 的时间内找到阳性结果?这听起来很不符合数据。
如果有人可以澄清我以正确的方式解释这些指标,我将不胜感激 - 也许可以阐明我的模型是好的还是假的。另外,如果我可以做任何其他测试来确定计算的概率是否准确,请告诉我。
如果这些不是很好的指标分数,我非常感谢您就下一步的改进方向提供一些指导。
谢谢!!
您的数据集不平衡,因为失败的次数远远多于成功的次数。一直猜测失败的分类器将获得 86%,因此 92% 的精度并不那么令人印象深刻。
然后混淆矩阵显示了正在发生的事情。 88 次它正确预测失败,8 次错误预测失败。它实际上只有两次正确预测成功。
精度是它做出正确猜测的次数:因此 (88 + 2)/98 = 0.92% 总体。成功的召回率仅为 (8+2) 次总成功中的 2 次(或 20%)。
所以这个模型不太合适。有很多方法可以处理不平衡的数据集,例如对示例进行加权或在预测之前应用先验。混淆矩阵是查看实际情况的好方法。
您的数据存在 class 不平衡问题。在训练您的 classifier 时,您没有指定任何方式来处理它。然而,即使你的准确性很高,也可能是因为失败样本的数量非常大,因此你的测试集也可能被填充。
要处理它,您可以使用 Stratified split in sklearn 来洗牌和拆分数据以解决 class 不平衡问题。
您还可以尝试其他技术来改进您的 classifier,例如 GridSearch as well. You can read more about model evaluation here in this link. For model specific cross-validation techniques check this section in sklearn.。
您还可以做的一件事是,与其将准确性用作训练 classifier 的指标,不如将重点放在召回率和精确率上(在您的情况下甚至是真阳性率)。您将需要使用 make_scorer in sklearn. An example can be found here and
您还可以查看 this Github repository 各种采样技术来解决 sklearn 中的 class 不平衡问题。
您还可以查看 this answer 以了解更多技巧。