【Python】 剪辑法欠采样 CNN压缩近邻法欠采样
借鉴关于K近邻KNN看这一篇就够了算法原理kd树球树KNN解决样本不平衡剪辑法压缩近邻法 - 知乎但是不要看他里面的代码因为作者把代码里的一些符号故意颠倒了 比如“”改成“!”还有乱加“~”看明白逻辑才能给他改过来一、剪辑法当训练集数据中存在一部分不同类别数据的重叠时在一部分程度上说明这部分数据的类别比较模糊这部分数据会对模型造成一定的过拟合那么一个简单的想法就是将这部分数据直接剔除掉即可也就是剪辑法。剪辑法将训练集 D 随机分成两个部分一部分作为新的训练集 Dtrain一部分作为测试集 Dtest然后基于 Dtrain使用 KNN 的方法对 Dtest 进行分类并将其中分类错误的样本从整体训练集 D 中剔除掉得到 Dnew。由于对训练集 D 的划分是随机划分难以保证数据重叠部分的样本在第一次剪辑时就被剔除因此在得到 Dnew 后可以对 Dnew 继续进行上述操作数次这样可以得到一个比较清爽的类别分界。效果如下图附上可直接运行的代码from sklearn import datasets import matplotlib.pyplot as pyplot from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier as KNN import numpy as np from collections import Counter from numpy import where # make_classification用于手动构造数据 # 1000个样本分成4类 X, y datasets.make_classification(n_samples1000, n_features2, n_informative2, n_redundant0, n_repeated0, n_classes4, n_clusters_per_class1) # # # 画出二维散点图 # for label, _ in counter.items(): # row_ix where(y label)[0] # pyplot.scatter(X[row_ix, 0], X[row_ix, 1], labelstr(label)) # pyplot.legend() # pyplot.show() # 剪辑10次 for i in range(10): x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.5) k 5 KNN_clf KNN(n_neighborsk) KNN_clf.fit(x_train, y_train) # 用训练集训练KNN y_predict KNN_clf.predict(x_test) # 用测试集测试 cond y_predict y_test x_test x_test[cond] # 把预测错误的从整体数据集中剔除掉 y_test y_test[cond] # 把预测错误的从整体数据集中剔除掉 X np.vstack([x_train, x_test]) # 为下一次循环做准备剔除掉本轮预测错误的 y np.hstack([y_train, y_test]) # 为下一次循环做准备剔除掉本轮预测错误的 # summarize the new class distribution counter Counter(y) print(counter) # 画出二维散点图 for label, _ in counter.items(): row_ix where(y label)[0] pyplot.scatter(X[row_ix, 0], X[row_ix, 1], labelstr(label)) pyplot.legend() pyplot.show()以上使用了k20的参数进行剪辑的结果循环了10次一般而言k越大被抛弃的样本会越多因为被分类的错误的概率更大。二、CNN压缩近邻法欠采样压缩近邻法的想法是认为同一类型的样本大量集中在类簇的中心而这些集中在中心的样本对分类没有起到太大的作用因此可以舍弃掉这些样本。其做法是将训练集随机分为两个部分第一个部分为 store占所有样本的 10% 左右第二个部分为 grabbag占所有样本的 90% 左右然后将 store 作为训练集训练 KNN 模型grabbag 作为测试集将分类错误的样本从 grabbag 中移动到 store 里然后继续用增加了样本的 store 和减少了样本的 grabbag 再次训练和测试 KNN 模型直到 grabbag 中所有样本被分类正确或者 grabbag 中样本数为0。在压缩结束之后store 中存储的是初始化时随机选择的 10% 左右的样本以及在之后每一次循环中被分类错误的样本这些被分类错误的样本集中在类簇的边缘认为是对分类作用较大的样本。CNN欠采样已经有相应的Python实现库了相应的方法是CondensedNearestNeighbour下面是可直接运行的代码。# Undersample and plot imbalanced dataset with the Condensed Nearest Neighbor Rule from collections import Counter from sklearn.datasets import make_classification from imblearn.under_sampling import CondensedNearestNeighbour from matplotlib import pyplot from numpy import where # make_classification方法用于生成分类任务的人造数据集 # X是数据几维都可以n_features4表示4维 # y用0/1表示类别weights调整0和1的占比 X, y make_classification(n_samples500, n_classes2, n_features3, n_redundant0, # n_clusters_per_class表示每个类别多少簇 # flip_y噪声增加分类难度 n_clusters_per_class2, weights[0.5], flip_y0, random_state1) # summarize class distribution counter Counter(y) # {0: 990, 1: 10} counter是一个字典value存储类别key存储类别个数 print(counter) # CNN有直接可以调用的包 n_neighbors设置k值,k值越小越省时间,就设置为1吧 undersample CondensedNearestNeighbour(n_neighbors1) # transform the dataset X, y undersample.fit_resample(X, y) # summarize the new class distribution counter Counter(y) print(counter) # scatter plot of examples by class label for label, _ in counter.items(): row_ix where(y label)[0] pyplot.scatter(X[row_ix, 0], X[row_ix, 1], labelstr(label)) pyplot.legend() pyplot.show()但是我觉得这个CondensedNearestNeighbour()方法的可操作性太低所以没用这个方法而是根据CNN的原理CNN底层是训练KNN去写的from sklearn import datasets import matplotlib.pyplot as pyplot from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier as KNN import numpy as np from collections import Counter from numpy import where # make_classification用于手动构造数据 # 1000个样本分成4类 X, y datasets.make_classification(n_samples1000, n_features2, n_informative2, n_redundant0, n_repeated0, n_classes4, n_clusters_per_class1, random_state1) counter Counter(y) # 画出二维散点图 for label, _ in counter.items(): row_ix where(y label)[0] pyplot.scatter(X[row_ix, 0], X[row_ix, 1], labelstr(label)) pyplot.legend() pyplot.show() # 10%作为训练集90%作为测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.9) while True: k 1 KNN_clf KNN(n_neighborsk) KNN_clf.fit(x_train, y_train) y_predict KNN_clf.predict(x_test) cond y_predict y_test # cond记录分类的对与错分类错是False正确是True # 都分类正确退出 if cond.all(): print(所有测试集都分类正确CNN正常结束) break x_train np.vstack([x_train, x_test[~cond]]) # 把分类错误(cond的值是False的移动到训练集里 y_train np.hstack([y_train, y_test[~cond]]) x_test x_test[cond] # 把分类对的继续作为下一轮的测试集 y_test y_test[cond] if len(x_test) 0: print(所有样本都能做到分类错误也就是结果集原始数据集一般不会出现这种情况) break # summarize the new class distribution counter Counter(y_train) print(counter) # 画出二维散点图 for label, _ in counter.items(): row_ix where(y_train label)[0] pyplot.scatter(x_train[row_ix, 0], x_train[row_ix, 1], labelstr(label)) pyplot.legend() pyplot.show()2.1 改进版——指定压缩后样本大小的CNN在如下代码中用sampleNum指定全体样本数量用endNum指定压缩后样本数量from sklearn import datasets import matplotlib.pyplot as pyplot from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier as KNN import numpy as np from collections import Counter from numpy import where sampleNum 1000 endNum 500 k 1 # KNN算法的K值 # make_classification用于手动构造数据 # 1000个样本分成4类 X, y datasets.make_classification(n_samplessampleNum, n_features2, n_informative2, n_redundant0, n_repeated0, n_classes4, n_clusters_per_class1, random_state1) # counter Counter(y) # # 画出二维散点图 # for label, _ in counter.items(): # row_ix where(y label)[0] # pyplot.scatter(X[row_ix, 0], X[row_ix, 1], labelstr(label)) # pyplot.legend() # pyplot.show() # 10%作为训练集90%作为测试集 x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.9) # print(x_train.shape[0]) # 100 nowNum x_train.shape[0] # 用来控制 训练集/筛选后的样本数 满足resultNum就停下, 初始有x_train这么多个 while True: KNN_clf KNN(n_neighborsk) KNN_clf.fit(x_train, y_train) y_predict KNN_clf.predict(x_test) cond y_predict y_test # cond记录分类的对与错分类错是False正确是True # 都分类正确退出 if cond.all(): print(所有测试集都分类正确CNN自动结束但是结果集没凑够呢) break # 如果结果集数量不够要求的endNum继续下一轮 if nowNumy_test[~cond].shape[0] endNum: nowNum nowNumy_test[~cond].shape[0] print(目前结果集数量, nowNum) x_train np.vstack([x_train, x_test[~cond]]) # 把分类错误(cond的值是False的移动到训练集里 y_train np.hstack([y_train, y_test[~cond]]) x_test x_test[cond] # 把分类对的继续作为下一轮的测试集 y_test y_test[cond] # 如果结果集数量超过endNum我们只要测试集里分类错误的前endNum-nowNum个 else: # 记录前endNum-nowNum个的位置(截取位置 condCut 0 # 记录截取位置 for i in range(cond.shape[0]): if not cond[i]: nowNum nowNum 1 if nowNum endNum: condCut i # 在cond[condCut]处刚好是我们要的第endNum个结果集样本 break # 把cond[condCut]后面的都设置成True cond[condCut1:] True x_train np.vstack([x_train, x_test[~cond]]) # 把分类错误(cond的值是False的移动到训练集里 y_train np.hstack([y_train, y_test[~cond]]) print(结果集的数量为, x_train.shape[0], 满足endNum, endNum) break if len(x_test) 0: print(所有样本都能做到分类错误也就是结果集原始数据集一般不会出现这种情况) break # summarize the new class distribution counter Counter(y_train) print(counter) # 画出二维散点图 for label, _ in counter.items(): row_ix where(y_train label)[0] pyplot.scatter(x_train[row_ix, 0], x_train[row_ix, 1], labelstr(label)) pyplot.legend() pyplot.show()

相关新闻

Gitlab: 私有化部署

Gitlab: 私有化部署

目录 1. 说明 2. 服务器 3. 安装 4. 配置实践 4.1 人员与项目 4.2 部署准备 4.2.1 访问变量及用户账号设置 4.2.2 Gitlab Runner的设置 4.2.3 要点 5. 容器镜像(Container Registry) 5.1 准备 5.2 配置 5.3 测试 6. 应用项目 CI/CD 7. Version 17.6 安装 8. …

2026/7/23 18:16:56阅读更多 →
CentOS7 + 宝塔 Nginx + Java Jar:GitHub Actions 自动部署步骤

CentOS7 + 宝塔 Nginx + Java Jar:GitHub Actions 自动部署步骤

摘要:本文详细介绍了使用 GitHub Actions 实现前后端项目自动化部署的完整流程。从服务器环境准备、SSH 密钥生成、GitHub Secrets 配置,到部署文件编写、首次部署和日常发布,提供了全栈部署的一站式解决方案。文章包含具体的脚本示例、配置步…

2026/7/23 18:16:56阅读更多 →
esxi网卡直通

esxi网卡直通

ESXI设置网卡直通什么是直通?原理科普白话文解释:1.字面意思,很好理解,就是在虚拟机中,硬件不需要虚拟设备或者软件进行转换,虚拟机直接调用硬件,跟物理机一样。也就是某一个虚拟机,…

2026/7/23 18:16:56阅读更多 →
基于GFL_R101_FPN的肠球菌自动检测系统开发

基于GFL_R101_FPN的肠球菌自动检测系统开发

1. 项目背景与核心价值肠球菌检测在医疗诊断、食品安全和环境监测等领域具有重要应用价值。传统检测方法通常依赖人工镜检或培养法,存在耗时长、主观性强等局限性。我们基于GFL_R101_FPN_MS-2x_COCO模型开发的自动检测系统,将目标检测技术引入微生物识别…

2026/7/23 19:37:16阅读更多 →
从思科到软路由:深入理解网络世界的两种维度与身份

从思科到软路由:深入理解网络世界的两种维度与身份

最近刚研究了不少软路由相关的东西,回想起大学课程中有一门和网络工程师相关的思科网络的课程,从RIP协议到OSPF协议,分析网络拓扑图,给交换机路由器敲命令,我还记得那熟悉的命令ip running config,看似它们…

2026/7/23 19:37:16阅读更多 →
为什么你的OpenWrt软路由Web端口修改后无法访问?常见问题排查指南

为什么你的OpenWrt软路由Web端口修改后无法访问?常见问题排查指南

为什么你的OpenWrt软路由Web端口修改后无法访问?常见问题排查指南 最近在折腾软路由的朋友,估计不少人都遇到过这个情况:为了安全或者避开端口冲突,兴冲冲地修改了OpenWrt的Web管理端口,结果保存重启后,浏览器里输入新地址,迎接你的却是一个冷冰冰的“无法访问此网站”…

2026/7/23 19:37:16阅读更多 →
嵌入式系统硬件CRC与向量中断管理:高可靠实时应用的核心技术

嵌入式系统硬件CRC与向量中断管理:高可靠实时应用的核心技术

1. 项目概述与核心价值 在嵌入式系统,尤其是汽车电子、工业控制这类对可靠性要求极高的领域,数据在传输和存储过程中的完整性,以及系统对外部事件的实时响应能力,是决定产品成败的两个基石。前者关乎数据是否正确,后者…

2026/7/23 19:37:16阅读更多 →
DMA控制器原理与应用:从数据搬运到嵌入式系统性能优化

DMA控制器原理与应用:从数据搬运到嵌入式系统性能优化

1. DMA控制器核心价值与设计哲学 在嵌入式系统里,CPU的时间是宝贵的。想象一下,你正在用MCU处理一个实时音频流,每秒钟有数万个采样点需要从ADC搬运到内存缓冲区,然后再进行滤波、编码等运算。如果每个采样点的搬运都让CPU亲自执行…

2026/7/23 19:37:15阅读更多 →
深入解析TI F021 Flash控制器:寄存器配置与诊断模式实战指南

深入解析TI F021 Flash控制器:寄存器配置与诊断模式实战指南

1. F021 Flash控制器:嵌入式存储的“神经中枢” 在嵌入式系统,尤其是汽车电子和工业控制领域,Flash存储器扮演着“非易失性大脑”的角色,负责存储启动代码、应用程序、校准数据和用户配置。然而,直接操作Flash物理阵列…

2026/7/23 19:35:15阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →