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

一、实例
1)构造极度偏差的数据

  • import numpy as np from sklearn import datasetsdigits = 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_splitX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)from sklearn.linear_model import LogisticRegressionlog_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.0precision_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.0recall_score(y_test, y_log_predict) # 召回率:0.8

    【机器学习(评价分类结果(实现混淆矩阵、精准率、召回率))】
4)scikit-learn 中的混淆矩阵、精准率、召回率
  • 混淆矩阵、精准率、召回率,3 者的包都封装在了 sklearn.metrics 中,任何二分类算法都可以通过模块下对应的方法直接得到混淆矩阵、精准率、召回率;
  • 混淆矩阵
    from sklearn.metrics import confusion_matrixconfusion_matrix(y_test, y_log_predict) # 混淆矩阵:array([[403, 2], [9, 36]], dtype=int64)


  • 精准率
    from sklearn.metrics import precision_scoreprecision_score(y_test, y_log_predict) # 精准率:0.9473684210526315


  • 召回率
    from sklearn.metrics import recall_scorerecall_score(y_test, y_log_predict) # 召回率:0.8


转载于:https://www.cnblogs.com/volcao/p/9394909.html

    推荐阅读