分類算法-1.準確度的問題

分類準確度的問題

假若有一個癌症預測系統,輸入體檢信息,能夠判斷是否有癌症,準確度爲99.9%,這個系統是好仍是壞?
若是癌症產生的機率原本就只有0.1%,那麼即便不採用此預測系統,對於任何輸入的體檢信息,都預測全部人都是健康的,便可達到99.9%的準確率。若是癌症產生的機率原本就只有0.01%,預測全部人都是健康的機率可達99.99%,比預測系統的準確率還要高,這種狀況下,準確率99.9%的預測系統是失敗的。
由此能夠得出結論:對於極度偏斜(Skewed Data)的數據,只使用分類準確度是遠遠不夠的git

混淆矩陣 Confusion Matrix

對於二分類問題:算法

行表明真實值,列表明預測值
0表明陰性(Negative),1表明陽性(Positive)
預測陽性正確TP,預測陽性錯誤FP,預測陰性正確TN,預測陰性錯誤FNdom

精準率\(Precision = \frac{TP}{TP+FP}\)
召回率\(Recall = \frac{TP}{TP+FN}\)測試

在癌症預測系統中,精準率表示預測得癌症的總人數中預測對的比例,召回率表示實際得癌症的總人數中預測對的比例spa

假設有10000我的,有10我的患有癌症,咱們預測全部的人都是健康的,獲得混淆矩陣:
code

算法各指標計算:blog

準確率=99.9%
精準率=0/(0+0)無心義
召回率=0/(10+0)=0ci

手寫數據集下實現混淆矩陣、精準率和召回率

加載數據集get

import numpy
from sklearn import datasets

digits = datasets.load_digits()
x = digits.data
y = digits.target.copy()

# 處理數據,使數據極度偏斜
y[digits.target==9] = 1
y[digits.target!=9] = 0

# 測試訓練數據分離
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=666)

# 加載邏輯迴歸算法
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(x_train,y_train)
y_predict = log_reg.predict(x_test)

混淆矩陣

def TN(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return numpy.sum((y_true==0)&(y_predict==0))
    
def TP(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return numpy.sum((y_true==1)&(y_predict==1))

def FN(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return numpy.sum((y_true==1)&(y_predict==0))

def FP(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return numpy.sum((y_true==0)&(y_predict==1))

def confusion_matrix(y_true,y_predict):
    assert len(y_true)==len(y_predict)
    return numpy.array([
        [TN(y_true,y_predict),FP(y_true,y_predict)],
        [FN(y_true,y_predict),TP(y_true,y_predict)]
    ])

精準率和召回率

def precision_score(y_true,y_predict):
    tp = TP(y_test,y_predict)
    fp = FP(y_test,y_predict)
    try:
        return tp/(fp+tp)
    except:
        return 0

def recall_score(y_true,y_predict):
    tp = TP(y_test,y_predict)
    fn = FN(y_test,y_predict)
    try:
        return tp/(fn+tp)
    except:
        return 0

scikit-learn中的混淆矩陣及其精準率和召回率

from sklearn.metrics import confusion_matrix,precision_score,recall_score

相關文章
相關標籤/搜索