混淆矩阵实战

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()

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

政安晨:【Keras机器学习示例演绎】(四十一)—— 使用预先训练的词嵌入

目录 设置 简介 下载新闻组 20 数据 让我们来看看这些数据 清洗数据并将数据分成训练集和验证集 创建词汇索引 加载预训练的词嵌入 建立模型 训练模型 导出端到端模型 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与…

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

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

TCP/UDP通信中的部分函数

UDP(User Datagram Protocol,用户数据报协议)和TCP(Transmission Control Protocol,传输控制协议)是互联网协议套件中最常用的两种传输层协议,它们负责在互联网中端到端地传输数据。尽管它们服务…

链表常见OJ题

目录 题目一:移除链表元素 (1)题目链接 (2)题目要求 (3)题解 题目二:反转链表 (1)题目链接 (2)题目要求​编辑 (3…

【PostgreSQL里的子查询解析】

什么是子查询? 子查询是一种嵌套在其他SQL查询中的查询方式,也可以称作内查询或嵌套查询。当一个查询是另一个查询的条件时,就称之为子查询。子查询的语法格式与普通查询相同,但其在查询过程中起着临时结果集的作用,为…

冰川秘境:全球冰川可视化大屏带你穿越冰原

在浩瀚无垠的宇宙中,地球以其独特的蓝色光环吸引着人们的目光。而在这颗蓝色星球上,冰川这一大自然的杰作,更是以其壮美与神秘,让人们心驰神往。 从阿尔卑斯山脉的冰川到南极洲的冰盖,从格陵兰岛的冰山到喜马拉雅山脉的…

Visual Studio生成C++的DLL文件(最简单版)

前言 当你在使用C编写一些可重用的代码时,将其打包成一个动态链接库(DLL)可以使其更容易地被其他项目或者程序调用和使用。Visual Studio提供了一种简单的方式来生成C的DLL文件。下面是一个关于如何在Visual Studio中生成C的DLL文件的简单教…

基于ChatGPT 和 OpenAI 模型的现代生成式 AI

书籍:Modern Generative AI with ChatGPT and OpenAI Models: Leverage the capabilities of OpenAIs LLM for productivity and innovation with GPT3 and GPT4 作者:Valentina Alto 出版:Packt Publishing 书籍下载-《基于ChatGPT 和 Op…

【Unity】 HTFramework框架(四十八)使用Location设置Transform位置、旋转、缩放

更新日期:2024年5月14日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Location定义Location复制Location变量的值复制Transform组件的Location值粘贴Location变量的值粘贴Location值到Transform组件在代码中使用Location Loc…

2.3 应用集成技术

第2章 信息技术知识 2.3 应用集成技术 2.3.1 数据库与数据仓库技术 数据库 以单一的数据源即数据库为中心进行事务处理、批处理、决策分析等各种数据处理工作操作型处理也称事务处理,指的是对联机数据库的日常操作,通常是对数据库中记录的查询和修改…

微信小程序主体变更的操作教程

小程序迁移变更主体有什么作用?进行小程序主体迁移变更,那可是益处多多呀!比方说,能够解锁更多权限功能;在公司变更或注销时,还能保障账号的正常使用;此外,收购账号后,也…

Nat Plants | 植物抽核单细胞!多组学探究大豆根瘤成熟过程

发表时间:2023-04 发表期刊:Nature Plants 影响因子:17.352 DOI:10.1038/s41477-023-01387-z 研究背景 根瘤菌是亲和互作寄主植物,感染宿主并在根部形成共生器官根瘤,具有固氮…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中,提升用户体验一直是开发者们追求的目标之一。其中,一个常见的场景就是在用户与应用程序进行交互时,特别是当进行异步操作时(如网络请求),为用户提供即时的反馈,避免用户因…

docker实验

1.Docker安装部署 (1).关闭防火墙 (2).更新源 (3)设置Docker仓库 (4)启动docker (5)查看版本: 2.Docker pull 容器并运行服务; 拉取…

项目9-网页聊天室1(注册+Bycrpt加密)

1.准备工作 1.1.前端页面展示 1.2 数据库的建立 我们通过注册页面,考虑如何设计用户表数据库。 用户id,userId用户名,唯一,username用户密码,password(包括密码和确认密码ensurePssword【数据库没有该字段…

PXI/PXIe规格 A429/717 航电总线适配卡

A429是一款标准的PXI/PXIe1规格的多协议总线适配卡。该产品最多支持36个A429通道,或32个A429通道加4个A717通道,每个A429和A717通道可由软件配置成接收或发送,可满足A429总线和A717总线的通讯、测试和数据分析等应用需求。 该产品的每个A429通…

儿童身高成长:关注每一厘米的成长

引言: 儿童的身高发育是家长和教育者普遍关注的问题,它不仅关乎孩子的外貌形象,更与孩子的健康成长密切相关。本文将深入探讨儿童身高的注意事项,为家长和教育者提供科学的指导,帮助孩子健康成长。 1. 身高发育的基本知…

BM11 链表相加(二)

描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0≤𝑛,𝑚≤10000000≤n,m≤1000000,链表任意值 0≤…

前端面试:项目细节|项目重难点|已工作|做分享

面试官提问:分享一个项目中记忆比较深刻的需求?说说你是怎么解决的?解决过程有没有遇到什么困难? 答:我的回答(我分点写思路,便于大家观看): (1&#xff09…

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…