2017-09-24 350 views
0

我对机器学习是全新的,我试图用scikit-learn用1个输入变量(X)和一个二元结果(Y)来建立一个简单的逻辑回归模型。我的数据包含325个样本,39个成功和286个失败。数据分成训练和测试(30%)。如何确定sklearn逻辑回归的预测概率是否准确?

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

但是,我很难理解我的模型是否适合数据,或者如果计算的概率实际上是准确的。

我得到以下数据:

  • 分类精度:metrics.accuracy_score(Y_test,预测的) = 0.92。 我对这一指标的理解是,该模型有很高的机会做出正确的预测,所以它在我看来很像模型。

  • 登录损失:cross_val_score(逻辑回归(),X,Y,得分= '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,预测) =

     [ 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%的时间内找到正数?这听起来像是一个非常不适合的数据。

我真的很感激,如果有人可以澄清,我interpeting这些指标以正确的方式 - 也许阐明我的模型是否是好还是假的一些情况。另外,如果还有其他测试可以做,以确定计算出的概率是否准确,请让我知道。

如果这些都不是很好的公制分数,我真的很感谢下一步的改进方向。

谢谢!

回答

4

您的数据集处于不平衡状态,因为失败的成功率远高于成功率。一个只能猜测失败的分类器会获得86%的分数,所以92%的精度并不令人印象深刻。

然后混淆矩阵显示发生了什么。 88次正确预测失败,8次错误预测失败。它只有两次才能真正预测成功。

精度是它所做出的猜测数量是正确的:所以(88 + 2)/ 98 = 0.92%。成功召回只有(8 + 2)次成功(或20%)中的2次。

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

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以及更多技术。