6.3 构建并评价分类模型

2023-09-21 12:41:19

  分类是指构造一个分类模型,输入样本的特征值,输出对应的类别,将每个样本映射到预先定义好的类别。分类模型建立在已有类标记的数据集上,属于有监督学习。在实际应用场景中,分类算法被用于行为分析,物品识别、图像检测等。

6.3.1 使用sklearn估计器构建分类模型

  在数据分析领域,分类算法有很多,其原理千差万别,有基于样本距离的最近邻算法,有基于特征信息熵的决策树,有基于bagging的随机森林,有基于boosting的梯度提升分类树,但其实现的过程相差不大。过程如图所示:
在这里插入图片描述
sklearn中提供的分类算法非常多,分别存在于不同的模块中。常用的分类算法如下表所示:
在这里插入图片描述

1、使用sklearn估计器构建SVM模型

代码在下面

2、分类结果的混淆矩阵与准确率

代码

# 1、使用sklearn估计器构建SVM模型
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

cancer = load_breast_cancer()
X = cancer['data']
y = cancer['target']
# 划分数据集测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 数据标准化
stdScaler = StandardScaler().fit(X_train)
X_trainstd = stdScaler.transform(X_train)
X_teststd = stdScaler.transform(X_test)
# 建立SVM模型
svm = SVC().fit(X_trainstd, y_train)
print(svm)
# 预测测试集结果
y_pre = svm.predict(X_teststd)
print(y_pre[:20])  # 打印前20个

# 2、分类结果的混淆矩阵与准确率
true = np.sum(y_test == y_pre)  # 预测对的
sum = y_test.shape[0]  # 总数
print("预测对的:", true)
print("预测错的:", sum - true)
print("准确率:", true / sum)
# 3、画混淆矩阵
from sklearn.metrics import ConfusionMatrixDisplay
import matplotlib.pyplot as plt

ConfusionMatrixDisplay.from_predictions(y_test, y_pre,
display_labels=["T", "F"], cmap=plt.cm.Greens, colorbar=True)
##  cmap=plt.cm.Reds设置为红色 cmap=plt.cm.Greens绿色  
##  cmap=plt.cm.Blues蓝色 cmap=plt.cm.gray 灰色
plt.title("Confusion Matrix")
# from matplotlib import rcParams
# rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
# plt.title("混淆矩阵")
plt.show()

在这里插入图片描述
在这里插入图片描述

6.3.2 评价分类模型

  分类模型对测试集进行预测而得出的准确率并不能很好地反映模型的性能,为了有效判断一个预测模型的性能表现,需要结合真实值,计算出精确率、召回率、F1值和Cohen’s Kappa系数等指标来衡量。常规分类模型的评价指标如表所示。分类模型评价方法前4种都是分值越高越好,其使用方法基本相同。
  sklearn的metrics模块还提供了一个能够输出分类模型评价报告的函数classfication_report。
在这里插入图片描述

# 使用sklearn估计器构建SVM模型
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, cohen_kappa_score
cancer = load_breast_cancer()
X = cancer['data']
y = cancer['target']
# 划分数据集测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)
# 数据标准化
stdScaler = StandardScaler().fit(X_train)
X_trainstd = stdScaler.transform(X_train)
X_teststd = stdScaler.transform(X_test)
# 建立SVM模型
svm = SVC().fit(X_trainstd, y_train)
# print(svm)
# 预测测试集结果
y_pre = svm.predict(X_teststd)
# print(y_pre[:20])  # 打印前20个

# 1、分类模型常用评价方法
print("准确率:", accuracy_score(y_test, y_pre))
print("精确率:", precision_score(y_test, y_pre))
print("召回率:", recall_score(y_test, y_pre))
print("F1:", f1_score(y_test, y_pre))
print("Cohen's Kappa系数:", cohen_kappa_score(y_test, y_pre))

# 2、分类模型评价报告
from sklearn.metrics import classification_report
print("分类报告:\n", classification_report(y_test, y_pre))

# 3、 绘制ROC曲线
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
## 求出ROC曲线的x轴和y轴
fpr, tpr, tthresholds = roc_curve(y_test, y_pre)
plt.figure(figsize=(10,6))
plt.xlim(0, 1)  # 设定x轴的范围
plt.ylim(0.0, 1.1)  # 设定y轴的范围
plt.xlabel('False')
plt.ylabel('True')
plt.plot(fpr, tpr, linewidth=2, color='red')
plt.show()

在这里插入图片描述
在这里插入图片描述

更多推荐

三相电机的烧毁原因以及如何保护

三相电动机,具有一定的过载能力,短时间过载对电动机的影响不大,但是,电动机的电流长时间超过额定电流,就会使电动机严重发热而损坏,如果电动机定子绕组内部发生短路,也会使绕组电流增加而烧毁电机。所以三相电动机需要有的保护装置包括,过载保护,短路保护、缺相保护,漏电保护,过热保护等。EOCR系列电机保护器由施耐德韩国公司生产

【C++】STL之list深度剖析及模拟实现

前言list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前

【数据结构】【项目】BitMap?40亿电话号码如何快速去重?

目录前言实现完整代码参考资料前言40亿电话号码如何快速去重?我们往往会想到bitmap数据结构中的Bitmap是一种位图索引非常高效的数据结构,用于存储处理大规模数据的位信息,其中每个位对应于一个元素,如果位为1,则表示该元素存在于集合中,否则表示不存在。如果要表示一个包含10个元素的数据集,可以创建一个包含10位的位

卡尔曼滤波(Kalman Filter)C#测试

一、操作过程刚学了一下卡尔曼滤波,具体原理还没细看,大致过程如下分为两步,第一步Predict,以下两个公式第二步Correct,以下三个公式公式看起来很复杂,其中是我们要处理的数据,是滤波之后的值,其他一些有些是需要给定的,有些是中间值。从t=1时刻开始,通过第一步,计算得到的值,给到第二步Correct里,第二步的

java入坑之Jsoup(待补充)

一、快速入门1.1配置<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.16.1</version></dependency>1.2解析xmlJsoup:jsoup是一款Java的HTML解析器,可直接解析某

C++宏的用法

​1.命名空间:这样可以把不同功能段的代码进一步封装起来#defineBEGINS(x)namesapcex{#defineENDS(x)}BEGINS(TEST1)voidfunc(){printf("helloworld");}intmain(){func();return0;}ENDS(TEST1)BEGINS(

19.组合模式(Composite)

意图:将对象组成树状结构以表示“部分-整体”的层次结构,使得Client对单个对象和组合对象的使用具有一致性。上下文:在树型结构的问题中,Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装,统一简单元素和复杂元素的概念,让对象容器自己来实现自身的复杂结构,让Client可以像处理简单元素一样来处理复杂

leetcode 332. Reconstruct Itinerary(重构行程)

有一些票tickets,tickets[i]=[from,to],每个出发到达城市名字都是3个大写英文字母,同一个出发城市时,优先去字母顺序较小的到达城市。必须先从“JFK”出发。每个ticket必须用且只用一次,所有ticket一定会形成至少一个有效的行程(出发至到达的一路上遍历所有城市)按顺序记录行程上的城市并返回

应用商店优化之关键词优化指南2

在寻找良好关键词的方法中,分析竞争对手是寻找关键词的最佳且最可靠的方法。查找排名最高的关键词或者是获得最多下载量的关键词,这样就可以准确的瞄准那些带来最大价值的关键词,从而带来更好的优化效果。1、选择正确的关键词。搜索分数用来衡量关键词流行度的分数。该分数是一个从1到100的数字,分数越高,对该关键词进行的搜索就越多。

MySQL索引,Explain,事务,锁与MVCC

MySQL的索引为什么不能为二叉树假如为二叉树,索引值插入顺序为1,2,3,4,5,6,那么形成的索引结构如图:搜索效率并不高。此时可以优化为红黑树(二叉平衡树),如图:但是红黑树也有问题,就是树的高度,如果数据过多,红黑树过高也会影响效率。为了控制高度,可以给每一个节点分配大一点的空间,例如上面的0002节点可以存储

css自学框架之图片懒加载

首先解释一下什么叫图片懒加载。图片懒加载是一种在页面加载时,延迟加载图片资源的技术,也就是说图片资源在需要的时候才会加载,就是在屏幕显示范围内加载图片,屏幕显示范围外图片不加载。一、关键函数用到的关键函数:globalThis.IntersectionObserver。varobserver=newIntersecti

热文推荐