機器學習:評價分類結果(實現混淆矩陣、精準率、召回率)
阿新 • • 發佈:2018-07-31
test set 目的 mod 二分 參數 nbsp return try
一、實例
1)構造極度偏差的數據
-
import numpy as np from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target.copy() # 構造極度偏斜的數據 # y = digits.target:y 和 digits.target 指向的是同一組數據,此處修改 y 時,digits.target 也會一起被修改,因為賦值符號 ‘=‘ 沒有進行數據的 copy; # 如果想不改變 digits.target 的數據,需要更改賦值方式:y = digits.target.copy()digits.target.copy();
- y = digits.target:y 和 digits.target 指向的是同一組數據,此處修改 y 時,digits.target 也會一起被修改,因為賦值符號 ‘=‘ 沒有進行數據的 copy;
- y = digits.target.copy():改變 y 的數據時,不會改變 digits.target 的數據;
2)直接使用二分類算法分類預測
- LogisticRegression() 模塊使用默認參數
from sklearn.model_selection import
- 由於數據是極度偏斜的,即使模型預測所有的樣本的類型都是 0,準確度也能達到 0.9 左右;
- 準確度只能說明模型對每一個樣本預測的準確程度,並不能真正能準確的找出類型為 1 的樣本;
- 找出類型為 1 的樣本才是業務的要求,精準全面的找出類型為 1 的樣本才是算法模型要做的事,準確度並不能反映模型是否精準而全面的找出了類型為 1 的樣本;(要根據業務最根本的目的設計算法,以及選擇模型好壞的指標)
3)使用精準率和召回率做為判斷模型好壞的指標
-
求混淆矩陣
y_log_predict = log_reg.predict(X_test) def TN(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 0) & (y_predict == 0)) def FP(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 0) & (y_predict == 1)) def FN(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 1) & (y_predict == 0)) def TP(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 1) & (y_predict == 1)) def confusion_matrix(y_true, y_predict): return np.array([ [TN(y_test, y_log_predict), FP(y_test, y_log_predict)], [FN(y_test, y_log_predict), TP(y_test, y_log_predict)] ]) confusion_matrix(y_test, y_log_predict) # 混淆矩陣:array([[403, 2], [9, 36]]
-
求精準率
def precision_score(y_true, y_predict): tp = TP(y_test, y_log_predict) fp = FP(y_test, y_log_predict) try: return tp / (tp + fp) except: return 0.0 precision_score(y_test, y_log_predict) # 精準率:0.9473684210526315
-
求召回率
def recall_score(y_true, y_predict): tp = TP(y_test, y_log_predict) fn = FN(y_test, y_log_predict) # try...except:異常檢測; # 沒有異常,執行 try 後面的語句; # 出現異常,執行 except 後面的語句, try: return tp / (tp + fn) except: return 0.0 recall_score(y_test, y_log_predict) # 召回率:0.8
4)scikit-learn 中的混淆矩陣、精準率、召回率
- 混淆矩陣、精準率、召回率,3 者的包都封裝在了 sklearn.metrics 中,任何二分類算法都可以通過模塊下對應的方法直接得到混淆矩陣、精準率、召回率;
-
混淆矩陣
from sklearn.metrics import confusion_matrix confusion_matrix(y_test, y_log_predict) # 混淆矩陣:array([[403, 2], [9, 36]], dtype=int64)
-
精準率
from sklearn.metrics import precision_score precision_score(y_test, y_log_predict) # 精準率:0.9473684210526315
-
召回率
from sklearn.metrics import recall_score recall_score(y_test, y_log_predict) # 召回率:0.8
機器學習:評價分類結果(實現混淆矩陣、精準率、召回率)