【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

news2024/11/23 1:21:44

【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

  • 加载数据
  • 可视化数据
  • 异常点检测
  • PCA降维
  • 使用KNN进行分类并可视化
  • 计算混淆矩阵
  • 调节n_neighbors参数找到最优值

加载数据

数据集:https://www.kaggle.com/datasets/yuanheqiuye/data-class-raw

# 加载数据
import numpy as np 
import pandas as pd 

data = pd.read_csv('/kaggle/input/data-class-raw/data_class_raw.csv')
X = data.drop(columns=['y'])
y = data.loc[:,'y']
data.head()

输出:

x1x2y
00.773.970
11.712.810
22.181.310
33.800.690
45.211.140

可视化数据

from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(5,5))
plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.show()

在这里插入图片描述

异常点检测

这里只找出了一个分类的,其他分类异常点可以类似处理

# 找出异常点
from sklearn.covariance import EllipticEnvelope
# 这里只找出了y=0点中的异常点,相同方法可以找出y=1中的异常点
X_bad = X.loc[y==0]
X_good = X.loc[y==1]
model = EllipticEnvelope(contamination=0.02).fit(X_bad)
y_predict = model.predict(X_bad)
print(y_predict)
# 输出:[ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1]

# 绘图
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==-1],X.loc[:,'x2'][y==0][y_predict==-1],marker='X',s=100)
plt.legend((bad,good),('bad','good'))
plt.show()

在这里插入图片描述

PCA降维

经过上一步将异常数据去掉之后,得到处理后的数据集:
https://www.kaggle.com/datasets/yuanheqiuye/data-class-processed
然后进行PCA主成分分析,尝试降维。

# pca降维
# 读取已经处理好的数据
data2 = pd.read_csv('/kaggle/input/data-class-processed/data_class_processed.csv')
data2.head()
X2 = data2.drop(columns=['y'])
y2 = data2.loc[:,'y']

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X2_norm = StandardScaler().fit_transform(X2)
pca = PCA(n_components=2)
pca.fit(X2_norm)
var_ratio = pca.explained_variance_ratio_
print(var_ratio)

输出:[0.5369408 0.4630592]
两个维度都很关键,不做降维处理。

使用KNN进行分类并可视化

此处先随机取值n_neighbors=10

# 基于KNN进行分类训练
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X_train,X_test,y_train,y_test = train_test_split(X2,y2,random_state=4,test_size=0.4)
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(X_train,y_train)
y_train_predict = knn.predict(X_train)
y_test_predict = knn.predict(X_test)
from sklearn.metrics import accuracy_score
acc_train = accuracy_score(y_train, y_train_predict)
acc_test = accuracy_score(y_test, y_test_predict)
print('acc_train=',acc_train,'acc_test=', acc_test)

# 可视化分类边界
# 数据准备
xx,yy = np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05))
xy_origin = np.c_[xx.ravel(),yy.ravel()]
# 因为训练的时候指定了列名,此处也指定,否则会有警告
xy = pd.DataFrame(xy_origin, columns=['x1', 'x2'])
xy_predict = knn.predict(xy)

# 画图
fig2 = plt.figure(figsize=(5,5))
predict_bad = plt.scatter(xy.loc[:,'x1'][xy_predict==0],xy.loc[:,'x2'][xy_predict==0])
predict_good = plt.scatter(xy.loc[:,'x1'][xy_predict==1],xy.loc[:,'x2'][xy_predict==1])
bad = plt.scatter(X2.loc[:,'x1'][y2==0],X2.loc[:,'x2'][y2==0])
good = plt.scatter(X2.loc[:,'x1'][y2==1],X2.loc[:,'x2'][y2==1])

plt.legend((bad,good,predict_bad,predict_good),('bad','good','predict_bad','predict_good'))
plt.show()

在这里插入图片描述

计算混淆矩阵

混淆矩阵图:
在这里插入图片描述

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

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

输出:

[[4 2]
 [3 5]]
 
TN= 4 FP= 2 FN= 3 TP= 5
# 准确率:整体样本中预测正确样本的比例 accuracy = (TP+TN)/(TP+TN+FP+FN)
accuracy = (TP+TN)/(TP+TN+FP+FN)
print(accuracy)

# 召回率:正样本中预测真确的比例 recall = TP/(TP+FN)
recall = TP/(TP+FN)
print('recall=',recall)

# 特异度:负样本中预测为负的比例 specificity = TN/(TN+FP)
specificity = TN/(TN+FP)
print('specificity=',specificity)

# 精确度: 预测结果为正的样本中,预测正确的比例 Precition = TP/(TP+FP)
precition = TP/(TP+FP)
print('precition=',precition)

# F1: 综合precition和recall的一个判断指标 F1 = 2 * precition * recall/(precition+recall)

F1 = 2*precition*recall/(precition+recall)
print('F1=',F1)

输出:

accuracy= 0.6428571428571429
recall= 0.625
specificity= 0.6666666666666666
precition= 0.7142857142857143
F1= 0.6666666666666666

调节n_neighbors参数找到最优值

# 尝试不同的n_neighbors,通过准确度来判断选用什么类型的值
accuary_train_arr = []
accuary_test_arr = []
for i in range(1,20):
    knn_i = KNeighborsClassifier(n_neighbors=i)
    knn_i.fit(X_train,y_train)
    y_i_train_predict = knn_i.predict(X_train)
    y_i_test_predict = knn_i.predict(X_test)
    accuary_i_train = accuracy_score(y_train, y_i_train_predict)
    accuary_i_test = accuracy_score(y_test, y_i_test_predict)
    accuary_train_arr.append(accuary_i_train)
    accuary_test_arr.append(accuary_i_test)

plt.figure(figsize=(10,5))
plt.subplot(121)
plt.plot(range(1,20),accuary_train_arr)
plt.scatter(range(1,20),accuary_train_arr)
plt.xlabel('train n_neighbors')
plt.ylabel('accuracy')
plt.title('train n_neighbors vs accuracy')
plt.subplot(122)
plt.plot(range(1,20),accuary_test_arr)
plt.scatter(range(1,20),accuary_test_arr)
plt.xlabel('test n_neighbors')
plt.ylabel('accuracy')
plt.title('test n_neighbors vs accuracy')
plt.show()

由下图可知:在neighbors=5的情况下取到最好的accuracy
在这里插入图片描述

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

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

相关文章

数据分析之描述性统计

当我们打开一份有十几列,几万行的明细数据时,那种感觉我相信用铺天盖地、头晕目眩来形容是再合适不过了。 面对如此令人崩溃的场景,必须要求我们要求能够快速找到数据的特征。描述性统计正是为此而生,它通过几个简单的分析方法就…

k8s——基于集群部署工具kubeadm部署k8s

角色和IP 通过网络镜像下载和配置k8s 操作系统初始化 关闭防火墙: $ systemctl stop firewalld $ systemctl disable firewalld关闭 selinux: $ sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 $ setenforce 0 # 临时关闭 swap&#xff1…

OpenCV C++实现 图片批量重命名、格式转换

方法一:以0~n数字序命名方法二:指定字长 数字序命名方法三:指定前缀 数字序重命名全部源码下载通常拍摄的一组数据集,图片命名会比较长,不方便人眼查看; 可以按照制定规则重命名, 本文方法,可以重命名,也可以格式转换(不是简单的换后缀,这样图片有时会出问题,而是以…

[JavaEE] 线程与进程的区别详解

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 认识线程(Thread) 1. 线程是什么? 2. 为什么要有…

java 对接百度AI文字识别第三方接口--(api方式以及sdk方式)

平时在工作当中难免会需要对接第三方接口。今天就带领大家来实践一下百度ai的文字识别技术。我使用的是文字识别中名片识别服务,别问为什么,因为是免费的,其他的服务要钱。。。。。。 一:准备工作 首先需要在百度ai官方网站注册账…

【案例实践】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法

【点击观看视频】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法 文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技…

如何定位线上问题?

面试官:「你是怎么定位线上问题的?」 这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路…

景联文科技2D3D融合标注案例分享|数据标注

在自动驾驶场景中,激光雷达生成的点云数据可用于测量物体的形状和轮廓,并估算出周围物体的位置和速度,但由于激光雷达生成的点云数据缺少RGB数据中存在的纹理和颜色信息,无法精确地识别出路上的汽车、行人、障碍物、信号灯等。而2…

网络流及几种算法FF、EK、Dinic

终于要开始学习&&复习这个知识点了,说句实话半年多之前就该写这篇文章来加强理解,但是一直没有落实,因为又去练习了很多学过的算法,感觉这个算法不太常用哦,传说中的省选算法,比赛比较少见&#xf…

在2022 CCF上获得两项大奖!

喜报!      在日前举行的      2022全国高性能计算学术年会上      戴尔科技集团      获得两项大奖!      戴尔科技PowerEdge绿色数据中心      液冷解决方案荣获“解决方案奖”    PowerEdge R750 DAOS      高性能分布式存储系统荣获“产品…

基于springboot+mybatis+mysql+jsp网上书城管理系统

基于 springbootmybatismysqljsp 网上书城管理系统一、系统介绍二、功能展示1.主页(客户)2.登陆(客户)3.我的购物车(客户)4.我的订单(客户)5.我的图书(商家)6.新书上架(商家)7.订单管…

股指期货是怎么交易的?3分钟教你从入门到精通

相对比投资于单一的产品而言,越来越多的投资者开始爱上股指期货,因为指数的波动速度特别的快,再加上里面的收益空间也特别的饱满,所以这是绝大多数希望赚快钱的投资者最喜欢的类似期货、股票等产品。而且很多进入到这个市场的投资…

CodeQL代码静态污点分析引擎排查漏洞模式

文章目录前言环境搭建1.1 codeql基础1.2 vscode插件1.3 生成数据库1.4 HelloWorldcodeql语法2.1 语法结构2.2 常用类库2.3 谓词介绍2.4 污点分析漏洞检测3.1 初步结果3.2 解决误报总结前言 对于代码审计的工作,最早期的安全人员会以人工审计的方式来审计项目代码&a…

【学习笔记】jenkins持续集成入门

jenkins持续集成入门 文章目录学习源一、jenkins简介和安装安装:插件:安装插件:二、配置Jenkins系统邮箱三、使用jenkins实现持续集成(一)使用Jenkins实现简单的本地Python项目代码执行准备工作:使用Jenkins管理-手动构…

PHP开发工具PhpStorm v2022.3——完全支持PHP 8.2

PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能。 PhpStorm v20…

PM说丨浅谈PDCA与Scrum的“异曲同工”之妙

文章目录一、前言二、PDCA与Scrum介绍1、 PDCA循环(戴明环)2、 Scrum三、PDCA与Scrum对比四、总结一、前言 笔者最近参与到一个生产制造型企业的ERP系统升级改造项目,实施过程中涉及到QMS与质量管理相关内容。 在了解质量管理体系的过程中发…

如何优雅地使用git?

文章目录Oh shit gitgitmojigit命令思维导图Oh shit git https://ohshitgit.com/ 这个网站针对一些在使用git中可能遇到的问题都做了详细介绍,并且形象生动。 例如:Oh shit,我想改个地方,但我已经提交(commited&#…

现代C++ 05

智能指针与内存管理 1.1 RAII 与引用计数 了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对…

云安全攻击手段及防御策略

恶意软件是我们必须面对的现实,我们每天都需要与蠕虫、病毒、间谍软件和其他行恶意软件作斗争,而云恶意软件是我们需要面对的又一种类别。它已经发展十多年,早在2011年就托管在亚马逊简单存储服务存储桶中。云安全提供商Netskope报告称&#…

SpringCloud01--黑马【上】

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…