机器学习作为数据分析的一种重要技术手段,正成为一家企业实现数据智能的关键,通过学术界和工业界对模型和算法的不断优化,通用的模型在部分领域的分类准确度已经超越了人类的水平。但是在信息化和智能化的道路上产生的自然数据往往将有用的信息掩藏较深,面对这样未经科学方法预先处理的数据即便是强大的神经网络都难以给出正确的决策,因此在机器学习中数据往往扮演着很重要的角色。
我们实践获得的需求中发现数据不均衡是实际分析数据时最常见的问题之一,接下来的篇幅中就和大家聊一聊数据集不均衡的问题给大家一些实际分析数据的一些建议和启发。
问题的定义
数据不均衡是指在待分析的数据中,不同类别的样本数量的比例失调的现象。这种现象高频的出现在实际生产和需求中。例如:
1.在信用卡欺诈的案件中,欺诈大约只占据信用卡业务中2%的比例。
2.电力公司在检查偷电漏电的事件中,发生的概率只有4.1%。
3.通过对硬件I/O口的监控实现判断硬件的工作状态,通常硬件发生故障的概率不足0.5%。
类似于上述情况的现象在生产环境中还会有很多,并且通常在这样的问题中我们的关注点主要集中在数量较少的那一方。在这样的数据中我们将较少的那一方称为正样本。一个常用的描述描述数据不均衡程度的指标IR(Imbalance Ratio)如下:
nMaj 分子(Majority)是多数样本的数量,nMin 分母(Minority)是少量样本的数量,通常大家会很自然的认为IR的数值越大分类器就越难从中学习并正确的分类正样本。然而数据的分类的效果其实和IR的值没有明显的依赖关系。
下图中展示了三种拥有同样IR值的数据,对于图a这样的分布独立的数据集基本不需要任何额外的处理方法就能使得分类器很好的将正样本和负样本区分开。
在图b中正样本和负样本完全均匀的重合在一起,这样的数据集无论采用什么策略来处理数据得到的最好的结果都只是分出一半的正样本,同时损失一半负样本的精度。
图c中正样本和负样本只有部分使重合的,在这种情况下如果采用合适的策略处理数据是可以将正样本正确的区分出来同时保证负样本的精度不会下降太多,在接下来提出的方法主要针对c图所处的条件下。
解决方法
在数据不均衡的场景中并没有什么固定的方法或者对所有情况都适用的策略,采取什么策略一切都得依据真实数据来定,更普遍的情况是在数据上尝试不同的方法最后根据科学的评估指标选取一种或者几种策略。基本考虑的几个思路的方向是采用一些策略使得正负样本更加均衡,调整不同类别的权重,在训练模型时对少量的样本施加更大的惩罚等。这些策略大体分为两个层面,分别是数据层面和算法层面,接下来展开讨论。
数据层面的策略
1.欠采样和过采样
过采样就是简单随机复制少数类别的样本,使得最终的数量和多数类别均衡。欠采样就是随机抽取数量较多类别的样本,使得最终的样本均衡。方法虽然简单但是也是最直接有效的办法。此处需要避开一个误区,有的读者可能认为欠采样是减少样本这样会减少正样本的有效信息而过采样不会产生这种情况,实际条件下真实数据中都会存在噪声,复制少量样本进行填充也会将噪声更多的引入也会影响分类器的决策。
2.构造新的样本
由于随机过采样只是简单复制样本的策略来增加少数类样本,这样的方法容易产生一些模型过拟合的问题,使得模型学到的特征依赖数据分布而不够泛化,于是提出了一些分析少数类别样本并通过已有的样本合成新数据添加入数据集训练的方法。比较有代表性的是SMOTE(Synthetic Minority Oversampling Technique),算法原理如下:
(1)对于少数类中每一个样本X,以欧氏距离为标准计算它到少数类样本集 Smin 中所有样本的距离,得到其k近邻。
(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本,X从其k近邻中随机选择若干个样本,假设选择的近邻为
(3)对于每一个随机选出的近邻 ,分别与原样本按照如下的公式构建新的样本。
降采样和过采样都会具有一定自身的局限性,降采样有概率遗失一些重要的数据信息,过采样会引使得数据自身的噪声放大,同时有风险产生模型过拟合,使用时需要结合实际数据,并使用科学的评估指标选择时候具体数据的处理方法和降采样和过采样的比例
算法层面的策略
在算法层面大体有以下的几种思路:1.通过不均衡的数据集指定特殊的模型训练策略。2.对现有的模型和决策方法引入代价敏感学习。3.改变思路将分类任务变为一个无监督的异常点检测任务。
接下来针对这三个方向做详细说明。
1.采用特殊的训练策略
(1)在训练神经网络时,假定多数类别样本是少数类别样本的N倍,在进行随机梯度下降优化时,遇到少数类别的样本可以将该样本重复训练N次。
(2)假定少数类有m个样本,对多数类样本聚成N个簇,从这N个簇中心点的周围抽出m个样本,并将其与少数类混合,这样就得到N个均衡的数据集,通过训练得到N个分类器,将这N个分类器的决策结果以投票的方式(少数服从多数)产生最终的分类。
(3)训练三个分类器分别用C1、C2、C3表示,首先使得第一个分类器的输出固定为多数类,之后将C1分错的样本提出,同时从分对的样本中等量的随机抽取样本合成新的训练集合D1,使用D1训练C2,接着在将C2分错数据和等量分对的数据打乱后合成集合D2,再使用D2训练C3。最后采样投票的方式产生决策结果,即只有当C2和C3的决策结果全为正样本时结果才为正样本,其他情况下为负样本。
2.代价敏感学习
代价敏感学习(Cost-sensitive learning)的启发来自分类问题中,错误的分类对现实造成的结果是不相同的,例如:在医学诊断中将一阳性病例确诊为阴性,和将阴性确诊为阳性造成的后果是不一样的。如何将现实中的后果转化成一种代价反馈给模型,这就是代价敏感学习的研究内容,通常代价被描述为一个代价矩阵如下所示:
通常情况下C00和C11位置表示分对结果所有代价为0,C01表示将第0类错分为第1类的代价,C10表示第1类错分为第0类的代价。从模型学习的角度出发学者们针对不同的分类器都提出了代价敏感的版本,例如:决策树的代价敏感剪枝、代价敏感深度置信网络、代价敏感支持向量机。还有基于模型的分类结果对最终的分类做代价敏感的后处理,和基于代价对训练样本施加权重,来获得代价敏感的模型。
(1)基于代价学习的AdaCost模型
AdaCost是AdaBoost的代价敏感版本,AdaBoost的算法流程主要流程如下:
•
为训练样本的权重初始化,m为样本的个数
• 之后循环训练个基础分类器,在第t轮中
为本次训练的基础分类器, 为该轮基础分类器分类的错误的概率(如果该概率大于0.5则表示此分类器没有任何效果就会退出循环),利用计算出该分类器占最后决策的比重 。
• 使
用来更新下一轮数据的样本的权重。
• 最后使用训练的T个分类器和T个决策系数 ,得出最终的分类结果。
了解了AdaBoost的原理后,任务就是要将代价系数 也加入到下一轮的样本权重的决策上,所以修改如下公式:
改为
就产生了AdaCost算法。
(2)训练模型时为样本增加代价系数可以使得分类的界限更加明确如下图所示是没有代价系数模型(左图)和增加代价系数(右图)的分类效果:
图中展示黑色和白色两种类别的分类效果,可以看出左图展示的模型分类使得类别分类的界限更加明确。
(3)同样可以使用代价矩阵中的代价系数去合理的选取不同分类器最终的决策阈值使得区分出更加重要的决策结果,优化的原理公式为:
其中 P(j|X)表示样本x被分类器分为j类的概率,C(i,j)表示代价矩阵中的系数。
代价敏感学习实质是一种思想和指导方法,可以将其应用在从数据选取到模型训练的各个阶段,每一种方法针对不同数据集的效果都可能会产生不等的差距,需要不断尝试在实际应用时科学评判不同的策略和算法.
在实际的应用中对于处理不平衡数据集的方法仍然还有很多,在面对实际数据时还有很多数据处理上的问题,需要大量的算法去尝试和解决,在偶数的LittleBoy自动化机器学习平台中已经集成了大量的数据预处理、模型训练、数据可视化的算法和工具,简化了数据分析和数据智能的门槛,欢迎读者来体验。
本文首发自公号“偶数科技”第一时间了解更多信息欢迎关注哦~
网友评论