使用 joblib 存储模型时使用什么分数指标?

What score metric is used when using joblib to store a model?

我已经使用joblib.dump存储了一个机器学习模型(21类)。 当我调用模型并使用保留集对其进行测试时,我得到一个值,我不知道它是什么指标(准确度、精确度、召回率等)?!! 0.952380952381

  1. 所以我计算了混淆矩阵和FP、FN、TN、TP。 我使用了这个

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

我比较了两个结果(1 和 2)。两者都给出相同的精度值 = 0.995464852608。但是这个结果和上面的不一样!!!

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

我的混淆矩阵

[[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.

你的例子有点令人困惑。如果您提供一些数字,将更容易理解和回答。例如,只打印 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 对不起乳胶,但希望有一天 Whosebug 会实现它。

两者都是准确度。

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

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