当前位置: 首页 > article >正文

机器学习中采样哪些事

在机器学习中采样主要分为两种,过采样(Oversample)和欠采样(Undersample)。过采样就是通过增加少数类样本的数量来平衡数据集。而欠采样就是通过减少多数类样本的数量来平衡数据集。

通常在进行采样中以下是几种常用的方法:

1. 随机采样

随机采样适用于过采样和欠采样。其操作方法就是随机复制增加少数类样本或者随机增加删除减少多数类样本。

下面是一个代码例子:

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler#创建一个不平衡的分类数据集
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=3, n_redundant=1,flip_y=0,n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)df = pd.DataFrame(X)
df['target'] = y
# 查看类别分布
print("Original dataset shape:", df['target'].value_counts())# 随机过采样
ros = RandomOverSampler(random_state=42)
X_resampled_ros, y_resampled_ros = ros.fit_resample(X, y)
df_ros = pd.DataFrame(X_resampled_ros)
df_ros['target'] = y_resampled_ros
# 查看过采样后的类别分布
print("Resampled dataset shape (Oversampling):", df_ros['target'].value_counts())#随机负采样
rus = RandomUnderSampler(random_state=42)
X_resampled_rus, y_resampled_rus = rus.fit_resample(X, y)
df_rus = pd.DataFrame(X_resampled_rus)
df_rus['target'] = y_resampled_rus
print("Resampled dataset shape (Undersampling):", df_rus['target'].value_counts())

2.SMOTE

通过在少数类样本之间插值生成合成样本,通常用于过采样。

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE# 省略df
#......
# 过采样
smote = SMOTE(random_state=42)X_resampled_smote, y_resampled_smote = smote.fit_resample(X, y)
df_smote = pd.DataFrame(X_resampled_smote)
df_smote['target'] = y_resampled_smote
print("Resampled dataset shape (SMOTE):", df_smote['target'].value_counts())

3.Tomek Links

这种方法是通过删除多数类中靠近少数类的边界样本来实现欠采样。工作原理如下:

计算最近邻:对于每个样本,计算其最近邻样本。

识别 Tomek Links:如果一个多数类样本的最近邻是一个少数类样本,那么这两个样本构成一个 Tomek Link。

移除多数类样本:从数据集中移除那些构成 Tomek Link 的多数类样本。

重复上述步骤:直到没有更多的 Tomek Links 

Tomek Links通过移除边界上的多数类样本,可以减少多数类样本的数量,同时尽量保留数据集的结构信息。适用于处理那些多数类样本与少数类样本紧密相连的情况。但是同时Tomek Links不能完全平衡数据集,因为移除的样本数量有限。

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from imblearn.under_sampling import TomekLinks# 初始化 TomekLinks
tomek = TomekLinks()# 欠采样
X_resampled_tomek, y_resampled_tomek = tomek.fit_resample(X, y)df_tomek = pd.DataFrame(X_resampled_tomek)
df_tomek['target'] = y_resampled_tomek
print("Resampled dataset shape (Tomek Links):", df_tomek['target'].value_counts())

4.NearMiss

NearMiss 是一种基于最近邻的欠采样方法,用于处理不平衡数据集。它的核心思想是通过移除多数类中与少数类样本距离较近的样本,或者移除多数类中距离最远的样本,从而减少多数类的样本数量。NearMiss 提供了多种策略来选择需要移除的样本。

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from imblearn.under_sampling import NearMiss# df#NearMiss 提供了三种策略:
#版本 1:移除多数类中与少数类样本距离最近的样本。
#版本 2:移除多数类中与少数类样本距离最远的样本。
#版本 3:移除多数类中距离最远的样本,但不考虑少数类样本。# 初始化 NearMiss,选择版本 1
nearmiss = NearMiss(version=1, random_state=42)X_resampled_nearmiss, y_resampled_nearmiss = nearmiss.fit_resample(X, y)df_nearmiss = pd.DataFrame(X_resampled_nearmiss)
df_nearmiss['target'] = y_resampled_nearmiss
print("Resampled dataset shape (NearMiss Version 1):", df_nearmiss['target'].value_counts())

http://www.lryc.cn/news/2380369.html

相关文章:

  • 初识css,css语法怎样学好css以及常见问题与避坑
  • MySQL如何快速删除数据库中所有表数据
  • 计算机视觉与深度学习 | Python实现ARIMA-LSTM时间序列预测(完整源码和数据)
  • Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)
  • vue2.0 组件生命周期
  • 从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
  • 在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问
  • GPU 超级节点:AWS Trainium2 UltraServer
  • 代码随想录算法训练营Day37 | 完全背包基础理论 518. 零钱兑换II 377. 组合总和Ⅳ 57. 爬楼梯(第八期模拟笔试)
  • git仓库中.git 文件很大,怎么清理掉一部分
  • MySQL安装实战指南:Mac、Windows与Docker全平台详解
  • Rocky Linux 远程服务器画面GUI传输到本地显示教程——Xming
  • 出现 org.apache.catalina.starup.HostConfig.deployDirectory 把web 应用程序部署到目录 解决方法
  • 游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念
  • React集成百度【JSAPI Three】教程(001):快速入门
  • python学习day2
  • VAPO:视觉-语言对齐预训练(对象级语义)详解
  • C语言学习笔记之函数
  • 集合进阶2
  • 2025云上人工智能安全发展研究
  • 【C++】模版(1)
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究
  • 5月19日day30打卡
  • 白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利
  • Windows软件插件-音视频捕获
  • go 与面向对象编程(OOP)
  • Mergekit——任务向量合并算法Ties解析
  • Java 应用中的身份认证与授权:OAuth2.0 实现安全的身份管理
  • 【氮化镓】偏置对GaN HEMT 单粒子效应的影响
  • Mysql 索引概述