假若有一個癌症預測系統,輸入體檢信息,能夠判斷是否有癌症,準確度爲99.9%,這個系統是好仍是壞?
若是癌症產生的機率原本就只有0.1%,那麼即便不採用此預測系統,對於任何輸入的體檢信息,都預測全部人都是健康的,便可達到99.9%的準確率。若是癌症產生的機率原本就只有0.01%,預測全部人都是健康的機率可達99.99%,比預測系統的準確率還要高,這種狀況下,準確率99.9%的預測系統是失敗的。
由此能夠得出結論:對於極度偏斜(Skewed Data)的數據,只使用分類準確度是遠遠不夠的。git
對於二分類問題:算法
行表明真實值,列表明預測值
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
from sklearn.metrics import confusion_matrix,precision_score,recall_score