机器学习(评价分类结果(实现混淆矩阵、精准率、召回率))
一、实例
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
- y = digits.target:y 和 digits.target 指向的是同一组数据,此处修改 y 时,digits.target 也会一起被修改,因为赋值符号 '=' 没有进行数据的 copy;
- 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
- 由于数据是极度偏斜的,即使模型预测所有的样本的类型都是 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.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
【机器学习(评价分类结果(实现混淆矩阵、精准率、召回率))】
- 混淆矩阵、精准率、召回率,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
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)
- 焦点学习田源分享第267天《来访》