深度學習二分類評估詳細解析與代碼實戰
如果你關心前面的深度學習二分類的實戰代碼,可以參考下述官方的技術文檔:使用 Trainer API 微調模型. https://huggingface.co/learn/nlp-course/zh-CN/chapter3/3
如果你剛接觸 自然語言處理,huggingface 是你繞不過去的坎。但是目前它已經被墻了,相信讀者的實力,自行解決吧。
設置代理,如果不設置的話,那么huggingface的包無法下載;
import os
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7890'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
在探討二分類問題時,經常會遇到四種基本的分類結果,它們根據樣例的真實類別與分類器的預測類別來定義。以下是對這些分類結果的詳細解釋:
這四個定義均由兩個字母組成,它們各自代表了不同的含義。
第一個字母(True/False)用于表示算法預測的正確性,而第二個字母(Positive/Negative)則用于表示算法預測的結果。
- 第1個字母(True/False):描述的是分類器是否預測正確。True表示分類器判斷正確,而False則表示分類器判斷錯誤。
- 第2個字母(Positive/Negative):表示的是分類器的預測結果。Positive代表分類器預測為正例,而Negative則代表分類器預測為負例。
- 真正例(True Positive,TP):當樣例的真實類別為正例時,如果分類器也預測其為正例,那么我們就稱這個樣例為真正例。簡而言之,真實情況與預測結果均為正例。
- 假正例(False Positive,FP):有時,分類器可能會將真實類別為負例的樣例錯誤地預測為正例。這種情況下,我們稱該樣例為假正例。它代表了分類器的“過度自信”或“誤報”現象。
- 假負例(False Negative,FN):與假正例相反,假負例指的是真實類別為正例的樣例被分類器錯誤地預測為負例。這種情況下的“遺漏”或“漏報”是分類器性能評估中需要重點關注的問題。
- 真負例(True Negative,TN):當樣例的真實類別和預測類別均為負例時,我們稱其為真負例。這意味著分類器正確地識別了負例。
數據準備
做深度學習的同學應該都默認裝了 torch,跳過 torch的安裝
!pip install evaluate
導包
import torch
import random
import evaluate
隨機生成二分類的預測數據 pred 和 label;
label = torch.tensor([random.choice([0, 1]) for i in range(20)])
pred = torch.tensor([random.choice([0, 1, label[i]]) for i in range(20)])
sum(label == pred)
下述是隨機生成的 label 和 pred
# label
tensor([0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0])
# pred
tensor([0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0])
使用 random.choice([0, 1, label[i]]? 是為了提高 pred 的 準確率;因為 label[i] 是真實的 label;
下述的是計算TP、TN、FP、FN的值:
Tips:
pred : 與第2個字母(Positive/Negative)保持一致,
label: 根據第一個字母是否預測正確,再判斷填什么
TP = sum((label == 1) & (pred == 1))
TN = sum((label == 0) & (pred == 0))
FP = sum((label == 0) & (pred == 1))
FN = sum((label == 1) & (pred == 0))
標簽 | Value |
TP | 6 |
TN | 8 |
FP | 2 |
FN | 4 |
準確率 Accuracy
準確率(Accuracy): 分母通常指的是所有樣本的數量,即包括真正例(True Positives, TP)、假正例(False Positives, FP)、假負例(False Negatives, FN)和真負例(True Negatives, TN)的總和。而分子中的第一個字母為“T”(True),意味著我們計算的是算法預測正確的樣本數量,即TP和TN的總和。
然而,準確率作為一個評價指標存在一個顯著的缺陷,那就是它對數據樣本的均衡性非常敏感。當數據集中的正負樣本數量存在嚴重不均衡時,準確率往往不能準確地反映模型的性能優劣。
例如,假設有一個測試集,其中包含90%正樣本和10%負樣本。若模型將所有樣本都預測為正樣本,那么它的準確率將輕松達到90%。從準確率這一指標來看,模型似乎表現得非常好。但實際上,這個模型對于負樣本的預測能力幾乎為零。
因此,在處理樣本不均衡的問題時,需要采用其他更合適的評價指標,如精確度(Precision)、召回率(Recall)、F1分數(F1 Score)等,來更全面地評估模型的性能。這些指標能夠更準確地反映模型在各類樣本上的預測能力,從而幫助我們做出更準確的決策。
精準率的公式如下:
accuracy = evaluate.load("accuracy")
accuracy.compute(
predictinotallow=pred,
references=label
)
Output:
{'accuracy': 0.7}
下述三種方法都可以用來計算 accuracy:
print(
(TP + TN) / (TP + TN + FP +FN),
(TP + TN) / len(label),
sum((label == pred)) / 20
)
Output:
tensor(0.7000) tensor(0.7000) tensor(0.7000)
使用公式計算出來的與通過evaluate庫,算出來的結果一致,都是 0.7。
precision 精準率
precision = evaluate.load("precision")
precision.compute(
predictinotallow=pred,
references=label
)
Output:
{'precision': 0.75}
TP / (TP + FP)
recall 召回率
recall = evaluate.load("recall")
recall.compute(
predictinotallow=pred,
references=label
)
Output:
{'recall': 0.6}
TP / (TP + FN)
F1
f1 = evaluate.load("f1")
f1.compute(
predictinotallow=pred,
references=label
)
Output:
{'f1': 0.6666666666666666}
2 * 0.7500 * 0.6000 / (0.7500 + 0.6000)
Output:
0.6666666666666665
參考資料
- 如何在python代碼中使用代理下載Hungging face模型. https://www.jianshu.com/p/209528bed023
- [機器學習] 二分類模型評估指標---精確率Precision、召回率Recall、ROC|AUC. https://blog.csdn.net/zwqjoy/article/details/78793162
- 使用 Trainer API 微調模型. https://huggingface.co/learn/nlp-course/zh-CN/chapter3/3
- Huggingface Evaluate 文檔. https://huggingface.co/docs/evaluate/index?
本文轉載自 ??AI悠閑區??,作者: JieShen
