这是一篇机器学习的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。
适用人群:机器学习初学者,转AI的开发人员。
编程语言:Python

自己在项目中拿到数据,大部分情况下都是自己切分训练集、测试集,对于训练集,经常会遇到正负样本比例很不均衡的情况,即偏斜类Skewed Class)问题,有些时候往往还很严重,比如数据量上负样本:正样本>=100,这是比较严重的偏斜类问题,下面针对这种问题,探讨一下:

解决方式

解决样本分布不平衡问题

对于偏斜类问题,主要有三种方式解决:

  1. 过采样/重采样(over-sampling):通过增加分类中少数类样本的数量来实现样本均衡,比较好的方法有SMOTE算法、ADASYN(自适应综合过采样)。缺点:这种方式可能导致过拟合。
  2. 欠采样(under-sampling):通过减少分类中多数类样本的数量来实现样本均衡。缺点:可能丢失多数类的重要信息。
  3. 调整权重:对于分类中不同样本数量的类别分别赋予不同的权重,一般是小样本量类别权重高,大样本量类别权重低。

除了上面三种常见的方式外,还可以转化问题思考角度:例如我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。异常点检测即是对那些罕见事件进行识别。如:银行信用卡诈骗识别,几十万中样本中可能有几百个诈骗用户。这些事件相对于正常情况是很少见的。变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。

分类中常见的类别不平衡问题解决方法

衡量指标

对于偏斜类问题,不再用精度accuracy作为模型好坏的衡量指标,因为数据量多的那个分类已经严重影响了整个accuracy,具体要看各个分类的召回率recall(一般我们关注正样本,即1的recall值),更推荐使用roc曲线的auc值(在sklearn中用roc_auc表示)作为衡量指标。

上层领导可能只知道精度,即准确率,即accuracy,并不知道recall、auc等,所以精度是领导关注的问题。

关于衡量指标的问题,以后会单独写一篇来介绍。

实际背景

经历的两个项目,都有严重的偏斜类问题。

第一个项目是正负样本数据量都足够(总量120w左右),且正样本:负样本=96:4,由于有足够的正样本,这不是什么棘手的问题,采用欠采样的方式就可以解决,按照原数据量的分布96:4共取了25w数据作为训练集(按原始数据量的分布是为了尽量符合线上场景,这样得出的accuracy更接近实际情况,取了数据量25w是由学习曲线得出,学习曲线后续篇章会单独介绍)左右的正样本和1,并且模型会有较好的表现。

第二个项目是正样本过少,只有1000左右,而负样本有100多万,这种正样本过少,是比较棘手的问题,对于这种问题,先尽量多采集些正样本,但是注意不能用太旧的数据(由于是投资问题,涉及到产品的更替等受时间影响),采集近半年或三个月(推荐)的数据,但是即便如此,正样本依旧很少,那么上述三种方式均可采用。下面先说一下训练集正负样本划分比例带来的影响。

训练集正负样本划分比例影响

对于正样本过少的偏斜类问题,我们每次采取不同量的负样本与全量的正样本,带来的效果如下(采用的xgboost算法,同样,也试用了svm,但是即便在数据量很少的情况下,xgboost的得分更高,当然,不排除过拟合的情况):

  • 数据量:负2w/正1k recall(1):30% accuracy:98%
  • 数据量:负1w/正1k recall(1):37% accuracy:96%
  • 数据量:负5k/正1k recall(1):48% accuracy:93.5%
  • 数据量:负1k/正1k recall(1):62% accuracy:91%
  • 数据量:负500/正1k recall(1):80% accuracy:89%

如上,负样本量越少,整体精度accuracy越少,但是正样本的recall越高。实际上,从accuracy和recall的计算公式来看,accuracy由量多的决定,虽然不断降低负样本量,正样本的recall会越高,但是整体数据量越少,对于整体模型的置信度(可靠性)就越少,毕竟,人们更愿意相信大数据,模型也会从大数据学到更多信息。

所以,需要找到合数的训练量,这一点可以从经验和学习曲线得到。

三种方式的解决

针对上面提到的第二个项目,尝试着用三种方式处理,并实际测试:

对正样本过采样

分两种思路:
a.将正样本复制累加
经过验证,这种方式是有效的,通过复杂少数样本,提高了少数样本的recall,进入提高了auc
b.SMOTE算法ADASYN(自适应综合过采样)
这里以SMOTE算法为例,SMOTE算法在sklearn中没有集成,需要单独下载lmblearn包,使用如下:

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)  #随机因子,每次随机生成不要和上次一样
X_res,y_res = sm.fit_sample(X_train,y_train)

如上述代码,会将正样本生成新的值,使得num(正样本):num(负样本)=1:1

对负样本欠采样

这种方式会减少很多负样本的信息,为了保留这种信息,将负样本按1k或500切分10份,每份分别与全量正样本进行进行训练得到分类器,然后集成学习assemble的方式进行组合成一个分类器

调整权重

在训练的时候调节权重:
a.对于xgboost,因为xgboost不属于sklearn,需调节scale_pos_weight参数值,实测结果——改善不大,需要自己不断尝试权重值;
b.针对sklearn中的分类方法,如svm,调节class_weight参数

 from sklearn.svm import SVCmodel_svm=SVC(class_weight='balanced') #算法权衡权重model_svm.fit(x,y)

实测——将class_weight设置为‘balanced’,效果改善不明显

 from sklearn.svm import SVCmodel_svm=SVC(class_weight={0:1,1:10})  #自己设定正负样本权重model_svm.fit(x,y)

实测——将class_weight指定权重,会比设置为‘balanced’效果改善,但具体权重的值设定为什么数值,需要测试,可以结合网格搜索来找最优权重

XGBoost、LightGBM的详细对比介绍

总结

对于正样本量足够、负样本不足的偏斜类问题,由于有足够的正样本,采用欠采样的方式就可以解决;

对于正样本量严重不足、负样本过多的偏斜类问题,由于严重缺少正样本,可以采用上述的三种方式解决,如果采用调整权重的方式,权重的值需要不断尝试,若采用过采样方式,可以通过单纯的复制少数样本数据,也可以通过SMOTE算法生成少数样本,大家都可以尝试。

机器学习(八):样本分布不均衡问题的处理相关推荐

  1. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(八)

    上一节讲了决策树算法,虽然存在一些局限性,但是正是这种局限性造就了集成学习中的随机森林算法. 八.集成学习与随机森林   假设要解决一个复杂的问题,让众多学生去回答,然后汇总他们的答案.在许多情况下, ...

  2. Nginx(八)-- 负载均衡

    1.概念 负载均衡 建立在现有的网络结构上,提供一种廉价有效透明的方法来扩大网络设置和服务器的带宽.增加吞吐量.加强网络数据处理能力,以及提供网络的灵活性和可用性. 用得较多的负载均衡器硬件有F5 B ...

  3. scikit-learn机器学习八 (数据预处理)

    sk-learn机器学习之特征工程和数据预处理 特征工程和数据预处理的重要性 数据无量纲化 归一化 标准化 处理缺失值 分类特征处理:编码,哑变量 标签处理(LabelEncoder) 特征处理(Or ...

  4. 机器学习数据不平衡不均衡处理之SMOTE算法实现

    20201125 当多数类和少数类数量相差太大的时候,少数类不一定要补充到和多数类数量一致 最好的办法就是全部过采样到最大记录数的类别 调参 SMOTE:只是过采样 SMOTEENN:过采样的同时欠采 ...

  5. 入门机器学习(八)--神经网络参数的反向传播算法

    1. 代价函数(Cost Function) 假设我们拥有一个如下图所示的神经网络,一共有四层,分别是一层输入层,两层隐藏层,一层输出层.下面定义几个变量的意义: m:训练样本的个数,共有m个样本 L ...

  6. 机器学习(八)SVM支持向量机

    线性分类器: 支持向量 就像我们平时判断一个人是男还是女,就是很难出现分错的情况,这就是男. 女两个类别之间的间隙非常的大导致的,让我们可以更准确的进行分类.在SVM 中,称为Maximum Marg ...

  7. 机器学习(八) 生成对抗网络(GAN)

    文章目录 前言 1 GAN 1.1 相关介绍 1.2 原理 1.2.1 网络架构 1.2.2 网络训练 1.3 用GAN生成图像 1.3.1 判别器 1.3.2 生成器 1.3.3 训练模型 2 GA ...

  8. 【机器学习】最近邻算法KNN原理、流程框图、代码实现及优缺点

    通过机器学习教学视频,初识KNN算法,对原理和算法流程通过小应用进行Python实现,有了自己的一些理解.因此在此整理一下,既是对自己学习的阶段性总结,也希望能和更多的朋友们共同交流学习相关算法,如有 ...

  9. 【机器学习】机器学习中样本不平衡,怎么办?

    在银行要判断一个"新客户是否会违约",通常不违约的人VS违约的人会是99:1的比例,真正违约的人 其实是非常少的.这种分类状况下,即便模型什么也不做,全把所有人都当成不会违约的人, ...

  10. 机器学习中样本不平衡,怎么办?

    在银行要判断一个"新客户是否会违约",通常不违约的人VS违约的人会是99:1的比例,真正违约的人 其实是非常少的.这种分类状况下,即便模型什么也不做,全把所有人都当成不会违约的人, ...

最新文章

  1. gateway sentinel 熔断 不起作用_Sentinel 的一些概念与核心类介绍
  2. Statues(三维bfs)
  3. easyui label显示不全_easyui 元素遍历问题
  4. 聚合,组合,继承的区别
  5. docker build mysql,Docker创建MySQL容器的方法
  6. 已解决:Cannot find ./catalina.sh The file is absent or does not have execute permission This file is ne
  7. json获取key对应的值java_java 获取json字符串中key对应的值
  8. 计算机安装重装出现错误,一键重装失败怎么办?电脑重装系统失败的原因和解决方法...
  9. 不透明度16进制值对照表
  10. Hive分区修复msck repair
  11. #舍得Share#创业你必须知道的事-创业融资实战
  12. oracle 中dummy,layout设计中dummy的作用详解(上图。好贴好贴,讲的很仔细)
  13. 区块链技术要用到什么开发语言?
  14. ajax asp后台获取不到post数据,asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法...
  15. 全球网络安全论坛(GCF)将于2022年2月举行,众多全球领袖将亲临现场
  16. MISRA-C 2020
  17. 《当程序员的那些狗日日子》(五十五)另一种生存之道
  18. Luogu4147 玉蟾宫(单调栈求解最大子矩阵)
  19. 我的世界java1.16.3村庄种子,我的世界:1.16最神奇的种子,自然生成的石头雕像,基岩能用!...
  20. ecstore安装 mysql_windows下布署ecstore2.0实战教程

热门文章

  1. 小武与论文的bug -CUDA -CUDANN -YOLOV3
  2. 【转载】日本社会为啥没有“王思聪”
  3. IBM阿蒙克公司已经与纪念斯隆-凯特琳癌症中心合作,用“沃森”来帮助癌症治疗
  4. html5普通文本框代码,html 文本框代码
  5. 行亦谦ACM自闭之旅第七周
  6. 在北京拿40K的Java程序员,需要掌握哪些技术栈才能匹配阿里P7?
  7. 【Android Camera】SOF Freeze
  8. C++ 使用Poco库实现XML的读取和写入
  9. 数学中倒三角:梯度;正三角:拉普拉斯
  10. php网页 背景图片,CSS实现网页背景图片自适应全屏详解