深度學習:混淆矩陣,準確率,top1,top5,每一類的準確率【轉載】

幾個概念

  • 1)正確率(accuracy)

正確率是我們最常見的評價指標,accuracy = (TP+TN)/(P+N),這個很容易理解,就是被分對的樣本數除以所有的樣本數,通常來說,正確率越高,分類器越好;

  • 2)錯誤率(error rate)

錯誤率則與正確率相反,描述被分類器錯分的比例,error rate = (FP+FN)/(P+N),對某一個實例來說,分對與分錯是互斥事件,所以accuracy =1 - error rate;

  • 3)靈敏度(sensitive)

sensitive = TP/P,表示的是所有正例中被分對的比例,衡量了分類器對正例的識別能力;

  • 4)特效度(specificity)

specificity = TN/N,表示的是所有負例中被分對的比例,衡量了分類器對負例的識別能力;

  • 5)精度(precision)

精度是精確性的度量,表示被分爲正例的示例中實際爲正例的比例,precision=TP/(TP+FP);

  • 6)召回率(recall)

召回率是覆蓋面的度量,度量有多個正例被分爲正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率與靈敏度是一樣的。

TP(True Positive): 真實爲0,預測也爲0

FN(False Negative): 真實爲0,預測爲1

FP(False Positive): 真實爲1,預測爲0

TN(True Negative): 真實爲1,預測也爲1

FN:False Negative,被判定爲負樣本,但事實上是正樣本。
FP:False Positive,被判定爲正樣本,但事實上是負樣本。
TN:True Negative,被判定爲負樣本,事實上也是負樣本。
TP:True Positive,被判定爲正樣本,事實上也是正樣本。

accuracy(總體準確率)

:分類模型總體判斷的準確率(包括了所有class的總體準確率)
在這裏插入圖片描述

precision(單一類準確率) : 預測爲0的準確率

在這裏插入圖片描述

迴歸率 : 真實爲0的準確率

在這裏插入圖片描述

: 真實爲1的準確率
在這裏插入圖片描述

: 預測爲1的準確率
在這裏插入圖片描述

: 對於某個分類,綜合了Precision和Recall的一個判斷指標,F1-Score的值是從0到1的,1是最好,0是最差

在這裏插入圖片描述

: 另外一個綜合Precision和Recall的標準,F1-Score的變形
在這裏插入圖片描述

混淆矩陣

在機器學習中尤其是統計分類中,混淆矩陣(confusion matrix),也被稱爲錯誤矩陣(error matrix)。

矩陣的每一列表達了分類器對於樣本的類別預測,二矩陣的每一行則表達了版本所屬的真實類別

之所以叫做’混淆矩陣‘,是因爲能夠很容易的看到機器學習有沒有將樣本的類別給混淆了。

接着二分類的舉例子:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

舉一個三分類的例子:
在這裏插入圖片描述
舉例子:
在這裏插入圖片描述

top1 和top5的計算

top1----- 就是你預測的label取最後概率向量裏面最大的那一個作爲預測結果,如過你的預測結果中概率最大的那個分類正確,則預測正確。否則預測錯誤
top5----- 就是最後概率向量最大的前五名中,只要出現了正確概率即爲預測正確。否則預測錯誤。

1 在每次迭代中計算top1和top5,然後求平均

計算代碼:
輸入是模型輸出(batch_size×num_of_class),目標label(num_of_class向量),元組(分別向求top幾)

def accuracy(output, target, topk=(1,)):
    """Computes the precision@k for the specified values of k"""
    maxk = max(topk)
    batch_size = target.size(0)
_, pred = output.topk(maxk, 1, True, True)  # 返回最大的k個結果(按最大到小排序)
pred = pred.t()  # 轉置
correct = pred.eq(target.view(1, -1).expand_as(pred))

res = []
for k in topk:
    correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)
    res.append(correct_k.mul_(100.0 / batch_size))
return res

計算代碼的使用:
改代碼中計算了top1和top5

def validate(val_loader, model, criterion):
    batch_time = AverageMeter()
    losses = AverageMeter()
    top1 = AverageMeter()
    top5 = AverageMeter()
# switch to evaluate mode
model.eval()

for i, (input, target) in enumerate(val_loader):
    target = target.cuda(async=True)
    input_var = torch.autograd.Variable(input, volatile=True)
    target_var = torch.autograd.Variable(target, volatile=True)

    # compute output
    output = model(input_var)
    loss = criterion(output, target_var)

    # measure accuracy and record loss
    prec1, prec5 = accuracy(output.data, target, topk=(1, 5))
    losses.update(loss.data[0], input.size(0))
    top1.update(prec1[0], input.size(0))
    top5.update(prec5[0], input.size(0))

return top1.mean()

2 在每次迭代中計算混淆矩陣,然後求top1(即爲準確率)

!!!需要注意,我們平時說的top1就是準確率

def val(model, dataloader):
    '''
    計算模型在驗證集上的準確率等信息,用以輔助訓練
    '''
opt = DefaultConfig()
# 把模型設爲驗證模式
model.eval()

confusion_matrix = meter.ConfusionMeter(opt.num_of_class)
for ii, data in enumerate(dataloader):
    input, label = data
    val_input = Variable(input, volatile=True)
    val_label = Variable(label.long(), volatile=True)
    if opt.use_gpu:
        val_input = val_input.cuda()
        val_label = val_label.cuda()
    score = model(val_input)
    confusion_matrix.add(score.data.squeeze(), label.long())

# 把模型恢復爲訓練模式
model.train()


cm_value = confusion_matrix.value()
accuracy = 0
for i in range(opt.num_of_class):
    accuracy += 100. * cm_value[i][i] / (cm_value.sum())
return confusion_matrix, accuracy

每一類的準確率

計算每一類的分類精度,進而求總體的平均精度是分類問題很常用的評價指標,當我們計算出混淆矩陣之後,需要對混淆矩陣進行量化分析,最明顯的指標就是計算分類精度,下面提供一種計算方面,使用sk-learn的api

在這裏插入圖片描述

在這裏插入圖片描述

np.diag是將對角線的值取出來,也就是正確分類的樣本數的分佈,axis=1,是行維度,實際就是預測樣本數分佈,np.sum就是將預測的每類樣本數進行求和。

在這裏插入圖片描述

nan_to_num是將部分真除之後會出現nan的數轉成0值,從each_acc可以看出每類的分類精度,第一類是1,第二個bird沒有正確分類的個數,第三個是2/3,得出每類精度之後再求平均精度。

總結

Specificity,Recall,Precision等只是計算某一分類的特性,而Accuracy和F1-Score這些是判斷分類模型總體的標準。我們可以根據實際需要,得出不同的效果。

發佈了14 篇原創文章 · 獲贊 4 · 訪問量 8512
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章