混淆矩阵-confusion matrix

混淆矩阵-confusion matrix

概念:混淆矩阵是用来总结一个分类器结果的矩阵。对于k元分类,其实它就是一个k x k的表格,用来记录分类器的预测结果

我们以一个二分类问题举例说明:
X:x1,x2…x100
y_真实:1,0,0,0,1,1,1…(假设60个1,40个0)
y^_预测:0,1,0,1…(预测70个1,30个0)
假设我们预测中的70个正例中只有50个是真正例(即预测的真结果和实际情况一样),
假正例=70-50=20(故名思意,即预测的正例和实际情况不一样)
在这里插入图片描述
查准率:即我们想要知道预测结果中预测中真正例占预测结果正例的比例
P=a/a+c
查全率:即我们想知道预测结果中真正例占真实情况正例的比例
R=a/a+b

需要注意的是,查准率和查全率是一对矛盾的度量!
即P变大,R就变小,反之P变小,R变大,即PR成反比。
证明:
因为a+b=60是一个固定的值,不会改变
此时:P1=5/7=0.714, R1=5/6=0.833
第二次预测情况:
在这里插入图片描述
P2=55/90=0.611, R2=55/60=0.916
可见,P1>P2,R1<R2,P(查准率)下降了,R(查全率)提高了!

代码实现:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
import numpy as np
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
from sklearn.metrics import precision_score, recall_score, f1_score

# 导入数据
file = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data',
                 header=None)
df = file
X = df.loc[:, 2:].values    #读取文件中所有行,从第二列开始的数据
# print(X.shape)
y = df.loc[:, 1].values     #读取文件中所有行,从第一列的数据,即读取真实值
# print(y)
le = LabelEncoder()
y = le.fit_transform(y)     #类标整数化,输出0/1
# print(y)


# 划分训练集合测试集
#X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
# train_data:所要划分的样本特征集
# train_target:所要划分的样本结果
# test_size:测试集样本占比,如果是整数的话就是样本的数量
# random_state:是随机数的种子。
# 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
# 比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)

# 建立pipeline
#  Pipelines类只用来变换(transform)观测数据(X)
# Pipeline使用一系列 (key, value) 键值对来构建,其中 key 是你给这个步骤起的名字, value 是一个评估器对象
# Pipeline可以把多个评估器链接成一个。这个是很有用的,因为处理数据的步骤一般都是固定的。例如特征选择、标准化和分类
#管道中的所有评估器,除了最后一个评估器,管道的所有评估器必须是转换器。(例如,必须有 transform 方法). 最后一个评估器的类型不限(转换器、分类器等等)

pipe_svc = Pipeline([('scl', StandardScaler()), ('clf', SVC(random_state=1))])
pipe_svc.fit(X_train, y_train)
y_pred = pipe_svc.predict(X_test)
# 混淆矩阵并可视化
confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)  # 输出混淆矩阵
print(confmat)
fig, ax = plt.subplots(figsize=(2.5, 2.5))
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]):
    for j in range(confmat.shape[1]):
        ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')
plt.xlabel('predicted label')
plt.ylabel('true label')
plt.show()
# 召回率、准确率、F1
print('precision:%.3f' % precision_score(y_true=y_test, y_pred=y_pred))
print('recall:%.3f' % recall_score(y_true=y_test, y_pred=y_pred))
print('F1:%.3f' % f1_score(y_true=y_test, y_pred=y_pred))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值