混淆矩阵实战

news2025/1/21 5:50:30

2.实战

1.加载数据

#加载数据
import pandas as pd
import numpy as np
data = pd.read_csv('data_class_raw.csv')
data.head()

请添加图片描述
2.data.loc得到样本属性,并进行样本数据可视化

#可视化数据
%matplotlib inline
from matplotlib import pyplot as plt

#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']

fig1 = plt.figure(figsize=(10,10))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

请添加图片描述

3.建立模型进行异常检测(设置污染系数contamination=0.02)

#异常检测
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope(contamination=0.02)#可以自己试着改变此处的值看看有什么变化
ad_model.fit(X[y==0]) # 拟合bad样本
y_predict_bad = ad_model.predict(X[y==0]) # 根据bad样本进行预测
print(y_predict_bad)  

请添加图片描述

这里并不把X全给到模型进行训练,这是因为好的数据点和坏的数据点实际上距离是很短的,如果全给就很难找到异常点,所以要将好的数据点和坏的数据点分开来给到模型进而来寻找异常点。(这里的-1就是异常点)

4.根据预测结果画出异常点

#可视化异常点
fig2 = plt.figure(figsize=(5,5))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0]) # 画出数据点
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='x',s=150) # 根据训练集的模型进行预测,画出预测的bad点
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

请添加图片描述
如图,绿叉处就是寻找出的异常点. 至此,任务第一步完成,下面进行第二步。

第二步:进行PCA主分析

1.读取数据然后得到样本属性

data = pd.read_csv('data_class_processed.csv')
data.head()
#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']

2.进行PCA主分析,对样本特征进行降维
特征方差比例实际上指的就是:线性无关的特征向量的无关程度,目的就是衡量每个主成分所解释的比例,这些特征会根据方差大小进行降序排序,方差比例可以帮助我们理解每个主成分对总方差的贡献程度,进而确定保留多少主成分以达到对数据集信息的有效压缩,进而确定保留多少主成分以达到对数据集信息的有效压缩。

# 导入所需的库
from sklearn.preprocessing import StandardScaler  # 导入数据标准化模块
from sklearn.decomposition import PCA  # 导入主成分分析(PCA)模块
import matplotlib.pyplot as plt  # 导入绘图模块

# 对特征数据进行标准化处理
X_norm = StandardScaler().fit_transform(X)  # 使用StandardScaler对特征数据进行标准化处理

# 创建PCA对象并进行降维
pca = PCA(n_components=2)  # 创建PCA对象,指定降维后的维度为2
X_reduced = pca.fit_transform(X_norm)  # 对标准化后的特征数据进行PCA降维

# 获取主成分解释的方差比例
var_ratio = pca.explained_variance_ratio_  # 获取每个主成分解释的方差比例
print(var_ratio)  # 打印主成分解释的方差比例

# 绘制方差比例条形图
fig4 = plt.figure(figsize=(5, 5))  # 创建绘图窗口
plt.bar([1, 2], var_ratio)  # 绘制方差比例的条形图
plt.show()  # 显示图形

请添加图片描述
第三步:进行数据隔离

# 导入所需的库
from sklearn.model_selection import train_test_split  # 导入数据分割模块

# 使用train_test_split函数将数据集分割为训练集和测试集
# 参数解释:
# X: 特征数据
# y: 目标数据
# random_state: 随机数种子,用于确保每次分割结果一致
# test_size: 测试集所占比例,这里设置为0.4,即测试集占总数据集的40%
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4, test_size=0.4)

# 打印分割后的数据集形状
print(X_train.shape, X_test.shape, X.shape)

请添加图片描述
第四步:建立KNN模型
利用KNN模型进行训练,然后计算训练集和测试集的评分

#knn 模型
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
knn_10=KNeighborsClassifier(n_neighbors=10)
knn_10.fit(X_train,y_train)
y_train_predict=knn_10.predict(X_train)
y_test_predict=knn_10.predict(X_test)

#计算准确率
accuracy_train=accuracy_score(y_train,y_train_predict)
accuracy_test=accuracy_score(y_test,y_test_predict)
print("training accuracy:",accuracy_train)
print("testing accuracy:",accuracy_test)

请添加图片描述
然后可视化分类边界,0~10,以0.05为间隔设置200个间隔(目的是弄非常多的数据填充两个分类)

xx,yy=np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05)) #生成对应的数据组合
print(yy.shape)

x_range = np.c_[xx.ravel(),yy.ravel()] #转换成两列
print(x_range.shape)
y_range_predict=knn_10.predict(x_range)

请添加图片描述

KNN进行预测并绘图(根据x_range和y_range_predict绘制分界图)

y_range_predict=knn_10.predict(x_range)
fig4 = plt.figure(figsize=(10,10))
knn_bad = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0])
knn_good = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1])


bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad,knn_good,knn_bad),('good','bad','knn_good','knn_bad'))
plt.title('prediction result')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

请添加图片描述
第五步:计算混淆矩阵

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_test_predict)
print(cm)

请添加图片描述
请添加图片描述
这四个指标的取值参考上图

TP = cm[1,1]
TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]
print(TP,TN,FP,FN)

1.计算准确率:
请添加图片描述

accuracy = (TP + TN)/(TP + TN + FP + FN)
print(accuracy)

可以看到通过混淆矩阵计算出来的准确率和我们之前建立knn模型计算出的准确率是一样的请添加图片描述

2.计算召回率(灵敏度):
请添加图片描述

recall = TP/(TP + FN)
print(recall)

请添加图片描述
3.计算特异度:
请添加图片描述

specificity = TN/(TN + FP)
print(specificity)

请添加图片描述
4.计算精确率:
请添加图片描述

precision = TP/(TP + FP)
print(precision)

5.计算f1分数:
请添加图片描述

F1 = 2*precision*recall/(precision+recall)
print(F1)

请添加图片描述
执行最后一个任务:为KNN算法选取一个合适的neighbor

#尝试不同的n_neighbors(1-20),计算其在训练数据集、测试数据集上的准确率并作图
n = [i for i in range(1,21)]
accuracy_train = []
accuracy_test = []
for i in n:
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)
    y_train_predict = knn.predict(X_train)
    y_test_predict = knn.predict(X_test)
    accuracy_train_i = accuracy_score(y_train,y_train_predict)
    accuracy_test_i = accuracy_score(y_test,y_test_predict)
    accuracy_train.append(accuracy_train_i)
    accuracy_test.append(accuracy_test_i)
print(accuracy_train,accuracy_test)

请添加图片描述

fig5 = plt.figure(figsize=(12,5))
plt.subplot(121)
plt.plot(n,accuracy_train,marker='o')
plt.title('training accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')
plt.subplot(122)
plt.plot(n,accuracy_test,marker='o')
plt.title('testing accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')
plt.show()

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1673918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次ms17-010(永恒之蓝)漏洞复现

1.漏洞介绍: 永恒之蓝(ms17-010)爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日, 不法分子通过改造“永恒之蓝”制作了wannacry勒索病…

解锁!智能代码助手 Baidu Comate 硬核能力

近日,在全球软件开发大会上暨智能软件开发生态展上,来自 Baidu Comate 的资深研发工程师分享了精彩的专题演讲,小编整理了演讲精华,和大家一起玩转“大模型软件研发”。 今天带来——吴玮琦《智能代码助手 Baidu Comate 的核心能…

【MySQL数据库】初步认识数据库,实现基本操作

在信息爆炸的今天,数据无处不在,它们构成了互联网世界的基石。但数据本身若未经有效组织和管理,就如同散落在沙滩上的珍珠,难以发挥其真正的价值。这时,“数据库”这一概念便如同一根线,将这些珍珠串联起来…

黑马新出的SpringBoot3项目后端总结

基础篇-00_SpringBoot3_Vue3导学课程_哔哩哔哩_bilibili 这个是视频链接 这个新课程里面用了一些企业里会用的注解例如Validated这种,业务流程清晰明了简单上手,算是可以了解最基本的Springboot开发流程,方便上手和快速入门 主要是下面这几…

差异基因散点图绘制教程

差异基因散点图绘制教程 本期教程 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡事在社群同学,可免费获得自2021年11月份至今全部教程,教程配备事例数据和相…

Python---NumPy万字总结【此篇文章内容难度较大,线性代数模块】(3)

NumPy的应用(3) 向量 向量(vector)也叫矢量,是一个同时具有大小和方向,且满足平行四边形法则的几何对象。与向量相对的概念叫标量或数量,标量只有大小,绝大多数情况下没有方向。我们…

【JAVA】数组的定义与使用

前一篇我们讲述了方法的使用和递归,这一讲 我们来叙述一下数组相关知识点。最近更新较快,大家紧跟步伐哦~~ 1. 数组的基本概念 1.1 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩,并对其进行输出,按照之前掌握的知识点&…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日,Gooxi发布最新训推一体AI服务器,以大容量内存和灵活的高速互连选项满足各种AI应用场景,最大可能支持扩展插槽,从而大幅提升智能算力性能,以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

AICloud 分论坛 07-AI原生数据库与RAG【文档管理】

https://github.com/infiniflow/infinityhttps://infiniflow.org/视频观看:https://www.bilibili.com/video/BV16m411y7xW/?spm_id_from333.999.0.0&vd_sourceae7b192be069682aabc96350ba419fc5 简介 为LLM应用程序构建的AI原生数据库,提供令人难…

单元测试之TestNG知识点总结及代码示例

TestNG 是一个测试框架,用于自动化测试 Java 和 Scala 应用程序,它是 JUnit 和 NUnit 的一个强大替代品。TestNG 支持数据驱动测试、参数化测试、测试套件、依赖管理、多线程测试等特性。TestNG官网:TestNG Documentation 目录 1.TestNG 基…

think PHP导入导出excel

本地环境 think PHP5,PhpOffice/PhpSpreadsheet,composer PHP版本7.4,这个插件的最低版本要求7.2 配置PhpSpreadsheet 官网:https://phpspreadsheet.readthedocs.io/en/stable/ composer require phpoffice/phpspreadsheet数据库…

华强北宋仕强论道之项目管理

华强北宋仕强论道之项目管理,金航标和萨科微总经理宋仕强先生说,良好的项目管理是企业成功的关键之一,项目是公司最小的管理单元,而项目管理则是确保项目顺利完成的关键工作。在一个项目中,需要明确目标,合…

下载element-ui报错

此错误表示尝试从npm注册表下载“resize observer polyfill”包时超时。这可能是由于网络连接问题或npm注册表服务器的问题。 要解决此问题,您可以尝试以下步骤: 1.重试npm install命令:有时,网络问题会导致临时超时。再次运行npm…

用友NC printBill 任意文件读取/删除漏洞复现(XVE-2024-10609)

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC printBill 接口处存在任意文件读…

【Unity】为小球添加爆发力往前移动的代码

代码里的几个变量都需要在场景中提前创建好并赋值 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Shotobjt : MonoBehaviour {// 点击按钮,克隆一个prefab,然后给这个克隆后的对象添加往前方的力publi…

搭建Rust开发环境

Windows搭建 下载:https://www.rust-lang.org/zh-CN/tools/install Linux搭建 这里我更推荐基于Linux搭建。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh

如何用微信小程序实现远程控制4路控制器/断路器

如何用微信小程序实现远程控制4路控制器/断路器呢? 本文描述了使用微信小程序调用HTTP接口,实现控制4路控制器/断路器,支持4路输出,均可独立控制,可接入各种电器。 可选用产品:可根据实际场景需求&#xf…

最新小红书颜值打分项目,吸引小姐姐,刷爆后端收益

嘿,朋友们!今天我要给你们分享一个我自己都觉得挺诧异的项目,它叫做“颜值打分”。听起来有点搞笑对吧?但真的,这个项目已经帮助了很多人实现了月入万元的目标。你没听错,就是月入万元!所以&…

品牌出海新趋势:掌握“微创新”策略,快速适应海外市场

在全球化的今天,品牌出海已成为众多企业拓展业务、实现国际化发展的重要途径。然而,海外市场与本土市场在文化、消费习惯、法律法规等方面均存在显著差异,这要求品牌在海外市场中必须灵活应变,通过微小的、有针对性的创新来快速适…

node和npm版本太高导致项目无法正常安装依赖以及正常运行的解决办法:如何使用nvm对node和npm版本进行切换和管理

1,点击下载 nvm 并且安装 进入nvm的github: GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 这里下载发行版,Releases coreybutler/nvm-windows GitHub 找到 这个 nv…