机器学习:评价分类结果(实现混淆矩阵、精准率、召回率)

一、实例

 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
原文地址:https://www.cnblogs.com/volcao/p/9394909.html