样本不均衡的一些处理技巧

原文

(1) 数据层次的方法

欠采样

欠采样(undersampling)法是去除训练集内一些多数样本,使得两类数据量级接近,然后在正常进行学习。这种方法的缺点是就是放弃了很多反例,这会导致平衡后的训练集小于初始训练集。而且如果采样随机丢弃反例,会损失已经收集的信息,往往还会丢失重要信息。

欠采样改进方法1

但是我们可以更改抽样方法来改进欠抽样方法,比如把多数样本分成核心样本和非核心样本,非核心样本为对预测目标较低概率达成的样本,可以考虑从非核心样本中删除而非随机欠抽样,这样保证了需要机器学习判断的核心样本数据不会丢失。 
举例来说依然是预测用户注册这个目标,我们可以将跳出率为100%的用户名下的所有会话都可以划分为非核心样本,因为跳出用户包含的信息量非常少(其他行为特征为空),将此部分用户样本排除可以最大可能的保留更多原始数据信息。

欠采样改进方法2

另外一种欠采样的改进方法是 EasyEnsemble 提出的继承学习制度,它将多数样本划分成若 N个集合,然后将划分过后的集合与少数样本组合,这样就形成了N个训练集合,而且每个训练结合都进行了欠采样,但从全局来看却没有信息丢失。

过采样

过采样(oversampling)是对训练集内的少数样本进行扩充,既增加少数样本使得两类数据数目接近,然后再进行学习。

简单粗暴的方法是复制少数样本,缺点是虽然引入了额外的训练数据,但没有给少数类样本增加任何新的信息,非常容易造成过拟合。

过采样改进方法1

通过抽样方法在少数类样本中加入白噪声(比如高斯噪声)变成新样本一定程度上可以缓解这个问题。如年龄,原年龄=新年龄+random(0,1)

过采样代表算法:SMOTE 算法

SMOTE[Chawla et a., 2002]是通过对少数样本进行插值来获取新样本的。比如对于每个少数类样本a,从 a最邻近的样本中选取 样本b,然后在对 ab 中随机选择一点作为新样本。

输入:少数类样本数目 T;少数类上采样倍数 N%;最近邻参数 k。 
输出:(N/100)*100 个合成少数类样本 
if N<100 
T=(N/100)*T 
N=100 
end if 
N=(int) (N/100) 
k=最近邻的参数 
num_attri=特征的维数 
Sample[][]:存放原始少数类样本的矩阵 
newindex : 计数人工合成的样本,初始化为 0 
for i=1 to T 
计算第 i 个少数类样本的 k 近邻并将索引存入 nnarray 
while N!=0 
随机生成一个 1 到 k 的整数,极为 nn。 
for attr=1 to num_attr 
计算 dif = Sample[nnarray[nn]][attr]-Sample[i][attr] 
计算 gap= 0 到 1 之间的随机实数 
Synthetic[newindex][attr]=Sample[i][attr]+gap*dif 
endfor 
newindex++ 
N=N-1 
endwhile 
endfor

(2) 算法层次的方法

调整样本分布(Stratification)

这是一种传统的方法,它根据错误分类的代价,按照比例变换训练集中类别的频率。其缺点是改变了样本的分布情况,有时会影响算法的性能。

元代价(MetaCost)

这是一种将一般分类模型转换成代价敏感模型的方法。它通过一个“元学习”过程,根据最小期望代价修改训练样本的类标记,并使用修改过的训练集重新学习新的模型。

代价敏感

代价敏感的学习方法是机器学习领域中的一种新方法,它主要考虑在分类中,当不同的分类错误会导致不同的惩罚力度时如何训练分类器。例如在医疗中,“将病人误诊为健康人的代价”与“将健康人误诊为病人的代价”不同;在金融信用卡盗用检测中,“将盗用误认为正常使用的代价”与将“正常使用误认为盗用的代价”也不同。通常,不同的代价被表示成为一个N×N的矩阵Cost中,其中N 是类别的个数。Cost[i, j]表示将一个i 类的对象错分到j 类中的代价。代价敏感分类就是为不同类型的错误分配不同的代价,使得在分类时,高代价错误产生的数量和错误分类的代价总和最小。常用的方法有如下几种。 
其中 按照对问题的解决方法的不同,代价敏感学习的算法研究又可以分成三类。

第一类代价敏感的学习方法关注于如何直接构造一个代价敏感的学习模型,对不同的分类器模型研究者们提出了不同的解决办法,它们包括 
(1)决策树:Knoll 等和Bradford 等为决策树提出了代价敏感的剪枝方法,Bradford 等研究了在代价敏感的条件下如何对决策树进行剪枝使得损失达到最小,研究表明基于拉普拉斯方法的剪枝方法能够取得最好的 效果,Drummond 和Holte 研究了代价敏感学习的决策树的节点分裂方法。 
(2) Boosting:Fan 等研究着提出了代价敏感的Boosting 算法Ada-Cost 
(3)神经网络:Geibel 和Wysotzki 提出了基于Perceptron 分类算法的代价敏感的学习方法,在文章中作者对不可分的类提出了代价敏感的参数更新规则。例如Kukar和Kononenko为神经网络提出了新的后向传播算法,使之能够满足代价敏感学习的要求。 
(4) Fumera 和Roli[37]以及Bradford 等从结构风险最小的角度来看代价敏感问题,提出了代价敏感的支持向量机分类算法。

第二类代价敏感的学习方法基于对分类结果的后处理,即按照传统的学习方法学习一个分类模型,然后对其分类结果按照贝叶斯风险理论对结果进行调整,以达到最小的损失。和第一类代价敏感学习方法相比,这种方法的优点在于其不依赖于所使用的具体的分类器。Domingos 提出了一种叫做MetaCost 的过程,它把底层的分类器看成一个黑箱子,不对分类器做任何的假设和改变,MetaCost可以应用到任何个数的基分类器和任何形式的代价矩阵上。给定一个样例x,基分类器得出它属于第j个类的概率为Pr(j|x),这样,认为x 属于第i个类的贝叶斯最优预测的风险为:R(i|x) = ΣP(j|x)C(i,j)(C(i,j)是把属于类别j的分为类别i的代价)。

第三种代价敏感的学习方法基于传统的学习模型,通过改变原始训练数据的分布来训练得到代价敏感的模型。Chan 和Stolfo 提出了层次化模型(Stratification),把分布不均匀的训练数据调整为正负例均匀分布的数据。Zadrozny等研究者基于cost-proportionate 的思想,对训练数据调节权值,在实际应用中,其类似于Boosting 算法,可以通过为分类模型调节权值来进行实现,又可以通过采样(subsampleing)来实现。Abe 等提出了对多类分类问题中如何实现代价敏感的学习进行了探讨,提出了一种新的迭代学习方法。

阈值移动

这类方法的中心思想不是对样本集和做再平衡设置,而是对算法的决策过程进行改进。

举个简单的例子,通常我们对预测结果进行分类时,当预测y ( y代表正类可能性) 值>0.5时,判定预测结果为正,反之为负。规定决策规则

若 y/(1-y) > 1,则预测为正例

不难发现,只有当样本中正反比例为1:1时,阈值设置为0.5才是合理的。如果样本不平衡决策规则需要进行变更,另 m+ 代表正例个数, m- 代表负例个数,改进决策规则:

若 y/(1-y) > (m+) / (m-) ,则预测为正例

因为训练集是总体样本的无偏采样,观测几率就代表真实几率,决策规则中 ( (m+) / (m-) ) 代表样本中正例的观测几率,只要分类器中的预测几率高于观测几率达到改进判定结果的目标。

猜你喜欢

转载自blog.csdn.net/pilongjiao/article/details/80719024
今日推荐