基于机器学习的数据不平衡问题处理

为什么要处理数据不平衡问题

  数据不平衡问题是现实生活中十分常见的一个问题,如上市公司的破厂预测,冠心病人的预测,癌症患者的预测等等。这些问题的样本数据往往出现一边倒的形势,而若不做处理直接用传统的机器学习方法进行模型训练的话,容易使训练出来的模型偏向样本多的那一方,导致样本少的一方的预测效果很差,而这些问题中大部分都更加注重样本少的一方的准确率。
  以下是一组不平衡数据的训练展示,数据来源2021泰迪杯A题建筑业数据,空缺值用0补充:其中样本数为10631,两类样本量分别为10547、84.
  可以看到,这组数据是严重失衡的,然后我们直接将这组数据放入随机森林中训练,结果如下图:

在这里插入图片描述

  可以看到,我们最终测得的准确率为0.9922,准确率接近100%,显然结果是十分好的,但当我们分别测试两个类别各自的准确率时可以发现,其少样本的那一类准确率为0。
从上例可以看到,对不平衡数据进行模型训练时,模型往往会偏向于多样本的一类,从而导致我们更加重视的少数样本的那一类准确率过低。

数据不平衡问题的处理方法

  既然已经有上面的这些问题,那么如果解决这些问题便成了重点。前面也提到,这类问题都是由于数据的不平衡所引起的,那么,是不是我们只要解决了他们之间的失衡问题,那便是解决了此类问题呢?

欠采样

  欠采样是通过随机或某种规则对样本数量多的一方进行采样,使其样本数量与少的一方样本数相等,从而解决数据不平衡问题。但由于欠采样是从多数样本的一方选出一部分数据出来训练,而这一部分数据信息通常对于原数据信息有着过多的损失,这使得训练出来的模型效果很好,可测试的时候模型效果却惨不忍睹。
  同样以上面的数据为例,我们对样本多的一类进行欠采样,然后通过随机森林进行数据训练,观察总体的准确率

欠采样

  观察上图,发现随着两个类别样本数差距的减小,多样本的一类准确率在逐渐下降,少样本的一类准确率在逐渐上升,总体的准确率出现小幅度的波动。明显这个结果比起之前的处理要好很多。当然,随着比例的继续下降,少样本类别的准确率可能还会提升,但那样多样本类别准确率也会持续下降,直到降到0为止,而这显然不是我们所想要的。再回到图形里,会发现除了总体准确率、多样本准确率以及少样本准确率外还有一个丢弃数据的准确率,它是由被丢弃的多类别样本所组成的,用于测试数据的丢失情况。可以看到,随着两个类别的数量比例的下降,数据的损失也越来越严重,所以,确定好类别之间的比例也是十分重要的。

过采样

  过采样是通过某种方法对样本数量少的一方进行数据增强处理,使其样本数量扩充到与多的一方的样本数相等,从而解决数据不平衡问题。
  过采样有效的解决了欠采样数据信息损失的问题,让模型不会因为信息的损失而导致过拟合。但它的运算开销也是巨大的,而且因为数据是通过算法扩充的,与真实的数据有一定的差异,容易出现“可疑点”,引起重合或边缘化等问题,而这也会导致模型出现过拟合。
欠采样与过采样各有优点,但其缺点也同样明显,而其优缺点又刚好能够互补,所以也有学者提出两者相结合的想法,其实践也有不错的结果。
  常见的过采样算法有:SMOTE、ADASYN
  SMOTE是过采样算法里面的一个经典算法,有许多过采样算法都是在它的基础上进行延伸的。
依旧对上面数据进行过采样处理,采用smote算法,处理后少样本类与多样本类的样本数量比例分别为[0.2,0.4,0.6,0.8,1.0],进行模型训练,得到准确率变化趋势图,图像如下:

过采样

  从图像可以发现,随着两个类别样本量的接近,两者的准确率也在逐渐上升,其中,少样本类的准确率上升最为迅速。
  当然,过采样的缺点也十分明显,以SMOTE为例,对原始数据进行主成分分析,将其降至二维,然后进行可视化处理,结果如下:

原数据二维分布
原数据三维分布
经过smote处理后的数据二维分布
经过smote处理后的数据三维分布

  从图像可以看出,由于两个类别的数据数量差距过大,使得少样本的一类在图像中只占据的一小部分;但在经过smote算法进行数据扩充,将两个类别的样本数变成1:1以后,发现少样本的一类所占据的依旧是一小部分,这将出现一种现象:存在一个如下的圆圈,将少样本的一类给包裹起来,随着少数样本的一类数据的增加,那么势必会使得总体的准确率的得到上升,但实际上模型的真实准确率却是原地踏步,从而导致了模型的准确率虚高。这一切都是因为它的数据扩充始终在一个较小的区域里进行。
在这里插入图片描述

一分类算法

  一分类算法在数据不平衡问题中舍弃了传统的思想,把两个不平衡的数据中的其中一类舍弃,当然,这里并不是真正的舍弃,它通过对其中一类进行训练,试图找出一个界限,完美的将这组数据与外界隔开。它不同于其它的多分类算法的是,它只会返回1和0,即是与否;当测试的数据在界限内的话,则会返回1,否则返回0。
  它的优点在于,它是对数据的其中一类进行训练,寻找一个界限将这组数据给包起来,使其与外界“隔离”,所以并不用担心另一类数据样本数对模型的影响,从而解决了数据不平衡问题。
  当然,有优点必然会有缺点,它的缺点也很明显,它容易受到数据分布的影响。数据的分布会影响到模型的收敛速度,即模型的训练时间;而且当样本类别超过2时,随着类别的增加,误差将会呈指数增加。
  单分类算法中的其中一个经典算法:OneClassSVM

  对于二分类问题,其结果往往只有两个:要么属于第一类、要么属于第二类,所以针对这类问题,采用一分类往往能有一个很好的效果。
  同样的,对上面的数据,采用OneClassSVM对多样本的一类进行模型训练,得到结果如下:

在这里插入图片描述
  训练集和测试集均为多样本的一类,分别占整个类别样本数的70%和30%,异常数据集为少样本的一类的全部样本,通过上面结果可以看到,训练集与测试集的准确率还可以接受,而异常数据集的准确率却达到了100%。
  个人认为,一分类模型是解决二分类的数据不平衡问题的最佳方法,其原由在于它训练所采用的数据皆是原来的数据,即不会丢失原来的数据,也不会出现边缘化等问题,唯一的缺点便是模型容易受到数据分布的影响,从而出现难以收敛的现象。

其它

  上述的三种方法并不是全部的解决方法,只是比较常见而已;传统算法——如决策树、随机森林、SVM等在面对数据不平衡问题时模型都会偏向于样本多的一类,但这并不代表传统算法对于数据不平衡问题便束手无策。事实上,通过引入精确率、召回率等评估指标、通过给不同类别的样本设置权重、根据实际情况的不同,传统的算法也能出色的解决此类问题。

  最后附上python代码,感兴趣的可以去尝试一下

import pandas as pd
from pandas import DataFrame,Series
import numpy as np
from matplotlib import pyplot as plt
data = pd.read_csv(r'D:\office\数学建模\2021泰迪杯\数据\制造业数据0补全.csv')#导入数据
X = data.iloc[:,:-1]#样本数据
y = data.iloc[:,-1]#标签
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() # 标准化转换
scaler.fit(X)  # 训练标准化对象
X = scaler.transform(X)
x_train,x_test,y_train,y_test = train_test_split(X,y,train_size=0.6)#划分数据集,训练集测试集64分
clf = RandomForestClassifier()#随机森林实例化
clf.fit(x_train,y_train)
y_predict=clf.predict(x_test)#训练
score = clf.score(x_test,y_test)
less_true = sum(y_test[y_predict==1]==1)/len(y_test[y_test==1])#少类样本正确率
more_true = sum(y_test[y_predict==0]==0)/len(y_test[y_test==0])#多类样本正确率
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=[8,5])
plt.bar([1,2,3],[score,less_true,more_true],0.4,color=['red','blue','green'])
plt.ylabel("准确率",fontsize=20)
# plt.title("bar chart")
x = ['总体','少样本类',
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值