从真实值和预测值中获取准确性
Posted
技术标签:
【中文标题】从真实值和预测值中获取准确性【英文标题】:Get accuracy from true and predicted values 【发布时间】:2018-11-04 15:06:29 【问题描述】:我有predicted_y
和real_y
。
有没有比以下更快的方法来获得准确性:
from keras import backend as K
accuracy_array = K.eval(keras.metrics.categorical_accuracy(real_y, predicted_y))
print(sum(accuracy_array)/len(accuracy_array))
【问题讨论】:
使用 scikit-learn 函数 (scikit-learn.org/stable/modules/generated/…) 【参考方案1】:我写了一个用于混淆矩阵分析的 Python 库,你可以将它用于你的目的。
>>> 从 pycm 导入 * >>> y_actu = [2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2] # 或者 y_actu = numpy.array([2, 0, 2, 2, 0, 1 , 1, 2, 2, 0, 1, 2]) >>> y_pred = [0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2] # 或者 y_pred = numpy.array([0, 0, 2, 1, 0, 2 , 1, 0, 2, 0, 2, 2]) >>> cm = ConfusionMatrix(actual_vector=y_actu, predict_vector=y_pred) # 从数据创建 CM >>> cm.classes [0, 1, 2] >>> cm.table 0:0:3、1:0、2:0、1:0:0、1:1、2:2、2:0:2、1:1、2:3 >>> 打印(厘米) 预测 0 1 2 实际的 0 3 0 0 1 0 1 2 2 2 1 3 总体统计: 95% 置信区间 (0.30439,0.86228) 贝内特_S 0.375 卡方 6.6 卡方 DF 4 条件熵 0.95915 Cramer_V 0.5244 交叉熵 1.59352 Gwet_AC1 0.38931 联合熵 2.45915 KL 背离 0.09352 卡伯 0.35484 Kappa 95% CI (-0.07708,0.78675) Kappa 无流行 0.16667 Kappa 标准误差 0.22036 Kappa 无偏 0.34426 拉姆达 A 0.16667 拉姆达 B 0.42857 互信息 0.52421 总体_ACC 0.58333 总体_RACC 0.35417 总体_RACCU 0.36458 PPV_宏 0.56667 PPV_Micro 0.58333 Phi 平方 0.55 参考熵 1.5 响应熵 1.48336 斯科特_PI 0.34426 标准错误 0.14232 Strength_Of_Agreement(奥特曼)公平 Strength_Of_Agreement(Cicchetti) 差 Strength_Of_Agreement(Fleiss) 差 Strength_Of_Agreement(Landis and Koch) Fair TPR_Macro 0.61111 TPR_Micro 0.58333 班级统计: 课程 0 1 2 ACC(精度) 0.83333 0.75 0.58333 BM(知情或博彩公司知情) 0.77778 0.22222 0.16667 DOR(诊断优势比) 无 4.0 2.0 ERR(错误率) 0.16667 0.25 0.41667 F0.5(F0.5分数) 0.65217 0.45455 0.57692 F1(F1 分数 - 精度和灵敏度的调和平均值) 0.75 0.4 0.54545 F2(F2 分数) 0.88235 0.35714 0.51724 FDR(错误发现率) 0.4 0.5 0.4 FN(假阴性/未命中/类型 2 错误)0 2 3 FNR(未命中率或假阴性率) 0.0 0.66667 0.5 FOR(误漏率) 0.0 0.2 0.42857 FP(误报/类型 1 错误/误报) 2 1 2 FPR(脱落率或误报率) 0.22222 0.11111 0.33333 G(G-测量精度和灵敏度的几何平均值) 0.7746 0.40825 0.54772 LR+(阳性似然比) 4.5 3.0 1.5 LR-(负似然比) 0.0 0.75 0.75 MCC(马修斯相关系数) 0.68313 0.2582 0.16903 MK(标记) 0.6 0.3 0.17143 N(条件否定) 9 9 6 NPV(负预测值) 1.0 0.8 0.57143 P(条件正) 3 3 6 POP(人口) 12 12 12 PPV(精确或阳性预测值) 0.6 0.5 0.6 PRE(患病率) 0.25 0.25 0.5 RACC(随机精度) 0.10417 0.04167 0.20833 RACCU(无偏随机精度)0.11111 0.0434 0.21007 TN(真阴性/正确拒绝) 7 8 4 TNR(特异性或真阴性率) 0.77778 0.88889 0.66667 TON(测试结果阴性) 7 10 7 TOP(检测结果阳性) 5 2 5 TP(真阳性/命中) 3 1 3 TPR(敏感度、召回率、命中率或真阳性率) 1.0 0.33333 0.5 >>> cm.matrix() 预测 0 1 2 实际的 0 3 0 0 1 0 1 2 2 2 1 3 >>> cm.normalized_matrix() 预测 0 1 2 实际的 0 1.0 0.0 0.0 1 0.0 0.33333 0.66667 2 0.33333 0.16667 0.5链接:PyCM
【讨论】:
考虑添加示例代码,说明如何使用您的库完成此操作。 @JeffLewis 好的 ;-)【参考方案2】:正如我在评论中提到的那样,我建议使用scikit-learn
来达到您的目的。
示例 1:
from sklearn import metrics
results = metrics.accuracy_score(real_y, predicted_y)
您还可以获得包括precision
、recall
、f1-scores
的分类报告。
示例 2:
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
precision recall f1-score support
class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3
avg / total 0.70 0.60 0.61 5
最后,对于混淆矩阵使用这个:
示例 3:
from sklearn.metrics import confusion_matrix
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
confusion_matrix(y_true, y_pred)
array([[1, 0, 0],
[1, 0, 0],
[0, 1, 2]])
【讨论】:
【参考方案3】:感谢 seralouk,我找到了:
from sklearn import metrics
metrics.accuracy_score(real_y.argmax(axis=1), predicted_y.argmax(axis=1))
【讨论】:
我很高兴能帮上忙。我发布了更详细的答案。请检查一下!【参考方案4】:从scikit-learn 尝试accuracy_score。
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
accuracy_score(y_true, y_pred, normalize=False)
【讨论】:
以上是关于从真实值和预测值中获取准确性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Tensorflow 创建预测标签和真实标签的混淆矩阵?