1. 程式人生 > >機器學習:評價分類結果(實現混淆矩陣、精準率、召回率)

機器學習:評價分類結果(實現混淆矩陣、精準率、召回率)

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==9] = 1 y[digits.target!=9] = 0
  1. y = digits.target:y 和 digits.target 指向的是同一組數據,此處修改 y 時,digits.target 也會一起被修改,因為賦值符號 ‘=‘ 沒有進行數據的 copy;
  2. y = digits.target.copy():改變 y 的數據時,不會改變 digits.target 的數據;

 2)直接使用二分類算法分類預測

  • LogisticRegression() 模塊使用默認參數
    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) log_reg.score(X_test, y_test) # 準確率:0.9755555555555555
  1. 由於數據是極度偏斜的,即使模型預測所有的樣本的類型都是 0,準確度也能達到 0.9 左右;
  2. 準確度只能說明模型對每一個樣本預測的準確程度,並不能真正能準確的找出類型為 1 的樣本;
  3. 找出類型為 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

機器學習:評價分類結果(實現混淆矩陣、精準率、召回率)