使用joblib存储模型时使用什么分数度量标准?

时间:2017-04-24 21:11:06

标签: python python-3.x scikit-learn confusion-matrix

我使用joblib.dump来存储机器学习模型(21个班级)。 当我调用模型并使用保持集测试它时,我得到一个值,我不知道它是什么度量标准(精度,精度,召回等)?!! 0.952380952381

  1. 所以我计算了混淆矩阵和FP,FN,TN,TP。 我使用了此Link

  2. 中的信息
  3. 我还从Github找到了一些代码。

  4. 我比较了两个结果(1和2)。两者都给出了Accuracy = 0.995464852608的相同值。但是这个结果与上面的结果不同!!!

    有什么想法吗?我是否正确计算了TP,FP,TN,FN?

    enter image description here

    MY CONFUSION MATRIX

    [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
     [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]]
    

    我的代码

     #Testing with the holdout set
     print(loaded_model.score(x_oos, y_oos))
     0.952380952381  <------IS IT ACCURACY?
    
    
     #Calculating the Confusion matrix
     cm = confusion_matrix(y_oos, y_oos_pred)
     cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] 
    
    #Calculating values according to link 2.
    FP = cm.sum(axis=0) - np.diag(cm)  
    FN = cm.sum(axis=1) - np.diag(cm)  
    TP = np.diag(cm)
    TN = (21 - (FP + FN + TP))  #I put 21 because I have 21 classes
    
    
    # Overall accuracy
    ACC = np.mean((TP+TN)/(TP+FP+FN+TN))
    
    
    print(ACC)
    0.995464852608   <----IT IS DIFFERENT FROM THE ABOVE ONE.
    

2 个答案:

答案 0 :(得分:0)

你的例子有点令人困惑。如果你提供一些数字,它会更容易理解和回答。例如,只打印cm会非常有用。

话虽如此。解构sklearn.metrics.confusion_matris的方法如下(对于二进制分类):

true_neg, false_pos, false_neg, false_pos = confusion_matrix(y_oos, y_oos_pred).ravel()

对于多个班级,我认为结果更接近你所拥有的,但总和的值。像这样:

trues = np.diag(cm).sum()
falses = (cm.sum(0) - np.diag(cm)).sum()

然后你可以用以下方法计算准确度:

ACC = trues / (trues + falses)

**更新**

从您编辑的问题我现在可以看到,在您的混淆矩阵中,您有21个样本,其中20个正确分类。在这种情况下,您的准确性是:

$ \ frac {20} {21} = 0.95238 $

这是model_score方法打印的值。所以你正在测量准确性。你只是没有正确地再现它。

n.b 对不起乳胶,但希望有一天StackOverflow会实现它。

答案 1 :(得分:0)

两者都是准确性。

第一个是整体准确度:All_True_Positives / All_classes(20/21)。

第二个是每个班级的平均准确度。所以我们将所有这些值相加并除以21。     [0.9524 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.9524 1 1 1]