不忘初心

记录大学,记录生活,天道殷勤,请多关注!

真诚、坚定不移!
  menu
63 文章
0 评论
3768 浏览
0 当前访客
ღゝ◡╹)ノ❤️

分类问题中非平衡数据的处理

非平衡数据:分类问题中类别型的因变量可能存在着严重的偏倚,其实就是类别之间的比例严重失调。如:客户流失问题中忠实的客户往往只占很少一部分。

如果数据存在严重的不平衡,预测得出的结论往往是有偏的,即分类结果会偏向于较多观测的类。

解决方法1(简单粗暴的方式就是构造1:1的数据):
* 将多的数据砍掉一部分;会导致某些隐含信息的丢失。
* 将少的一部分进行Bootsrap采用(过采样);会导致模型产生过拟合。

解决方法2(SMOTE算法): 即合成少数过采样技术,基于随机过采样算法的一种改进方法。

SMOTE算法的基本思想是对少数类别样本进行分析和模拟,并将人工模拟的新样本添加到数据集中,从而使原始数据中的类别不再严重失调,算法的模拟过程采用了KNN技术,模拟生成新样本的推导过程如下;
* 假设有两个类别,其中一个类别明显多于另一个类别,样本点x1为少类别的样本点。
* 选择离样本点x1最近的K个同类样本点。
* 从最近的K个同类样本点中随机挑选M个样本点。(提醒一下,M值也可以人为指定,但M的值选择依赖于最终所希望的平衡率【意思就是M值会影响到平衡率】)
* 对于每一个随机选中的样本点,构造新的样本点需要满足公式: Xnew = Xi + rand(0,1)(Xj-Xi) , j = 1,2,3…M; 其中,Xi表示少数类别中的一个样本点(如x1),Xj表示从K近邻中随机挑选的样本点j;rand(0,1)表示生成0~1的随机数。
* 假设 x1为(2,4,9,7);从5个近邻随机挑选2个样本点,这两个样本点的观测值为(1,2,5,8)、(2,1,6,7),由此得到的两个样本点为:
* Xnew1 = (2,4,9,7) + rand(0,1)
((1,2,5,8)-(2,4,9,7)) = (1.8,2.3,6.7,7.8)
* Xnew2 = (2,4,9,7) + rand(0,1)*((2,1,6,7)-(2,4,9,7)) = (1.9,2.1,8.7,7.2)
* 重复前面的步骤,就可以通过迭代少数类别样本中的每一个样本Xi,最终将原始的少数类别样本量扩大为理想的比例。

SMOTE算法实现采样的原理并不复杂,可以自己编写一个函数来实现,也可以调库直接实现。
可以借助于imblearn模块里的子模块over_sampling中的SMOTE类实现新样本的生成,该类语法和参数解释如下:
* over_sampling.SMOTE(ratio=‘auto’,random_state=None,k_neighbors=5,m_neighbors=10,out_step=0.5,kind=‘regular’,svm_estimator=None,n_jobs=1)

参数解释:

  • ratio : 用于指定重抽样的比例。如果指定字符型的值、可以是’minority’表示对少数样本进行抽样;如果是’majority’表示对多数类别的样本进行抽样;如果是’not minority’则表示采用欠采样方法;如果是’all’则表示采用过采样方法;如果是默认的’auto’则等同于’all’和’not minority’。如果指定字典型的值,其中键为各个类别标签,值为类别下的样本量。
  • random_state=None,
  • k_neighbors=5,指定近邻个数,默认为5个。
  • m_neighbors=10,指定从近邻样本中随机挑选的样本个数,默认为10个。
  • out_step=0.5,
  • kind 用于指定SMOTE算法在生成新样本时所使用的选项,默认为’regular’表示对少数类别的样本进行随机采样,也可以时’borderline1’、‘borderline2’、和’svm’。
  • svm_estimator:用于指定SVM分类器,默认为sklearn.svm.SVM,该参数目的是利用支持向量机分类器生成支持向量,然后生成新的少数类别的样本。
  • n_jobs=1,用于指定计算时所用的CPU数量,默认为1表示不使用并行计算功能。

[howto:http://imbalanced-learn.org/en/stable/introduction.html#api-s-of-imbalanced-learn-samplers]


标题:分类问题中非平衡数据的处理
作者:chenruhai
地址:http://www.love520.ltd/articles/2019/08/17/1566024431520.html

评论