其定義是: 對於給定的測試資料集,分類器正確分類的樣本數與總樣本數之比。也就是損失函式是0-1損失時測試資料集上的準確率。
由準確率,我們可以在一些場合,從某種意義上得到乙個分類器是否有效,但它並不總是能有效的評價乙個分類器的工作。
比如 搜尋引擎 抓取了 csdn 100個頁面,而它索引中共有10,000,000個頁面,隨機抽乙個頁面,如果以 accuracy 來判斷我的工作,而 accuracy 已經到了99.999%(9,999,900/10,000,000),所以我會把所有的頁面都判斷為"不是 csdn 的頁面"。
那怎麼解決呢?這就需要用到precision,recall 和 f1-score 了。
precision精確率的公式:p=tpt
p+fp
\frac
tp+fpt
p它計算的是所有"正確被檢索的結果(tp)"佔所有"實際被檢索到的(tp+fp)"的比例。
recall召回率的公式:r=tpt
p+fn
\frac
tp+fnt
p它計算的是所有"正確被檢索的結果(tp)"佔所有"應該檢索到的結果(tp+fn)"的比例。
f1-score就是精確率和召回率的調和均值,也就是
2 f1
\frac
f12
=1
p\frac
p1+1
r\frac
r1亦即
f1=2pr
p+
r\frac
p+r2pr
=2tp2
tp+f
p+fn
\frac
2tp+fp
+fn2
tp在f1-score中,我們認為精確率和召回率的權重相等。
fβ=(β^2+1)*prβ
2+p+
r\frac
β2+p+r
pr是一般化公式
通過調整β可以改變精確率和召回率的權重。
def divide_information(predictions, y):
tp = 0 # 正確判定正類
fp = 0 # 錯誤判斷正類,實際為負類
tn = 0 # 正確判定負類
fn = 0 # 錯誤判定負類,實際為正類
for i in range(len(predictions)):
if predictions[i] == 1:
if y[i] == 1:
tp += 1
else:
fp += 1
else:
if y[i] == 1:
fn += 1
else:
tn += 1
return tp, fp, tn, fn
def getaccuracy(predictions, y):
return (predictions == y).sum()/len(y)
def getprecision(predictions, y):
# tp/(tp+fp)
tp, fp, tn, fn = divide_information(predictions, y)
precision = tp/(tp + fp)
return precision
def getrecall(predictions, y):
# tp/(tp+fn)
tp, fp, tn, fn = divide_information(predictions, y)
recall = tp / (tp + fn)
return recall
def getf1score(predictions, y):
# 2p*r/(p+r)
# 2tp/(2tp+fp+fn)
precision = getprecision(predictions, y)
recall = getrecall(predictions, y)
f1score = 2 * precision * recall / (precision + recall)
return f1score
機器學習評估方法
訓練 測試集的劃分要盡可能保持資料分布的一致性,避免因資料劃分過程引入額外的偏差而對最終結果產生影響,例如 在分類任務中,至少要保持樣本的類別比例類似。如果從取樣的角度來看待資料集的劃分過程,則保留類別比例的取樣方式稱為 分層取樣 單詞使用留出法得到的估計結果往往不夠穩定可靠,在使用留出法,一般要採...
機器學習模型評估方法
分類模型評價度量 概率輸出型 這個有邏輯回歸 隨機森林 梯度提公升 adaboost等演算法,都是以概率作為輸出的。要想把概率型輸出變為分型別輸出,只要為其設立乙個閾值即可。positive predictive value 陽性 值 or precision 精度 陽性 值被 正確的比例。nega...
機器學習方法 機器學習模型評估方法
通常我們採用實驗測試的方法對模型的泛化誤差做出評估。為此我們就需要乙個測試集用來測試訓練好的模型。通常情況下,在我們拿到資料之後,在正式開始訓練模型前,就會將資料劃分為訓練集合測試集。需要注意的是 訓練集與測試集應盡可能互斥,也就是盡量不要重複。測試集要符合真實樣本的分布,也就是說在劃分時要隨機抽樣...