幾個概念
- 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這些是判斷分類模型總體的標準。我們可以根據實際需要,得出不同的效果。