对分类的影响:分类模型中,模型更偏向对多数类的预测概率,从而导致少数类的预测精度大幅度下降,虽然整体来看精度很好,但这与实际工作不符。
通过make_classification方法创建随机的n类分类数据集
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=5000, #样本总数
n_features=2, #特征数(包含信息特征数、冗余特征数)
n_informative=2, #信息特征数
n_redundant=0, #冗余特征数
n_repeated=0, #从信息特征数和冗余特征数中重复抽取的数目
n_classes=3, #类别数
n_clusters_per_class=1, #每个类的聚类数
weights=[0.05, 0.1, 0.85], #每个类的概率
class_sep=0.8, #值越大,类与类之间分的越开
random_state=0) #随机种子
该数据集分布情况如下:
此时不同类的数据分布相对紧密,易于分类。
安装代码:
conda install -c conda-forge imbalanced-learn
注意一定要检查环境依赖,之前在深度学习的环境里安装的时候因为某几个库的版本过高,导致最后没安装成功。
网址:
https://imbalanced-learn.org/stable/references/index.html
imbalanced库中提供:
但是我们需要谨慎使用这些算法,因为它们往往会改变数据的原始分布。
目的:减少多数类的数量。
原理:从多数类中随机选择一些样样本组成样本集。
代码:
under_random = RandomUnderSampler(random_state = 1, sampling_strategy='auto')
原理:
代码:
under_nm1 = NearMiss(version = 1, n_neighbors = 3)
under_nm2 = NearMiss(version = 2, n_neighbors = 3)
under_nm3 = NearMiss(version = 3, n_neighbors = 3)
原理:遍历多数类的样本,如果他的大部分k近邻样本都跟他自己本身的类别不一样,我们就将他删除。
代码:
under_enn1 = EditedNearestNeighbours(kind_sel="all") #default
under_enn2 = EditedNearestNeighbours(kind_sel="mode")
参数kind_sel:
原理:重复以上ENN的过程直到没有样本可以被删除。
代码:
under_renn = RepeatedEditedNearestNeighbours()
原理:将组成Tomek link的两个样本,如果有一个属于多数类样本,就将该多数类样本删除掉。
![[Pasted image 20230308131428.png|300]]
代码:
under_tlr = TomekLinks()
目的:为少数类别增加新样本
原理:在少数类中选择部分样本进行复制,从而扩大少数累的样本量
代码:
over_random = RandomOverSampler(random_state = 1, sampling_strategy='auto')
原理:对随机过采样方法的一个改进算法,通过对少数类样本进行插值来产生更多的少数类样本。
缺点:
over_somte = SMOTE(sampling_strategy='auto', random_state = 1, k_neighbors = 3)
原理:将样本分为safe、danger、noise,仅对danger的样本进行smote采样
代码:
over_blsmote = BorderlineSMOTE(sampling_strategy='auto', random_state = 1, k_neighbors = 3)
原理:就是对不同的样本赋予不同的权重,从而通过smote算法生成不同数量的样本,往往样本k近邻上的多数类样本越多,该样本生成的样本也越多
代码:
over_adasyn = ADASYN(sampling_strategy='auto', random_state = 1, n_neighbors = 3)
以及部分数据增强的方法
原理:由于在过采样的过程中,会出现重复样本,因此需要欠采样中的数据清洗方法对重复样本进行剔除。先进行过采样,再通过欠采样中的算法对重复样本进行剔除
代码:
steps1 = [('o',over_somte),('u',under_tlr)]
pipeline1 = Pipeline(steps = steps1)
翻转,旋转,裁剪(Cutout),变形,缩放
噪声、模糊、颜色变换、擦除、填充