分层抽样原理及Oracle实现

(作者:陈玓玏)

一、为什么要进行抽样?

在实际的数据挖掘应用中,我们往往会从各方收集很多的数据,这些数据每分每秒都在增加,但我们如果用所有的这些数据并无益处。一是数据量过大,处理起来难度会大非常多,要求你的基础计算平台性能很好,甚至需要用到并行计算,有时是没有必要的;二是数据都是基于人及人的行为所产生的影响的,而人是会发生变化的,所以久远的数据我们可能用不到;三是建模的过程并不一定都是在内部进行,可能会与别的部门或公司合作,选择全部数据对于合作方式会产生不利影响。所以,我们常常需要对数据进行抽样。

二、常见的抽样方法

那么抽样的方法也有很多种,随机抽样、分层抽样、系统抽样、整群抽样等。随机抽样当然就是在整体中随机抽取一定比例的样本;系统抽样是将总体样本按照某顺序分成N个分组后,从第一部分随机抽取第K个样本,并依次抽取之后每个部分的第K个样本组成样本空间;整群抽样是根据样本的聚类结果,抽取其中某些类的所有样本进行分析,适合样本间特征相差较大的时候,分群进行建模或分析;分层抽样则是将样本按照某个特征分为多个类别,在每个类别中进行随机抽样,最后再组合成新的样本。这里我们只详细讨论分层抽样。

分层抽样最适合用于样本不均衡的情况,说句老实话,这样的情况在实际应用中是非常非常广泛的,比如你的分类结果是好客户和坏客户,又或者你的分类结果是预测用户使用优惠券的概率,在这些情况下,坏客户比例必然远低于好客户比例,而很多优惠券的使用概率也是要远低于不使用概率的。

假设原始样本中正样本有9000个,负样本有1000个,如果直接进行比例为50%的随机抽样,并划分训练集和测试集,那么有可能抽到的正样本和负样本比例会发生变化,而这样的变化会导致抽取的样本分布和原始样本分布不一致,从而导致建立的模型对原始样本的预测产生偏差。

三、分层抽样的Oracle实现

那么怎么实现分层抽样呢?我用的是Oracle实现分层抽样。假设是按照注册时间来划分样本,然后在每个时间段分好坏客户进行一定比例的随机抽样,或者计算好每个层需要抽取的样本个数进行抽样,这里要说明一下,如果你想要固定个数的样本,推荐第二种方法,因为用第一种方法由于小数点后面四舍五入的影响,容易造成最后取出来的样本和你想要的样本个数有偏差。

1. 按比例抽样
下面的代码是从时间为2018年2月的未违约客户中随机抽取16%的客户,注意sample函数中的参数表示的是16%,不是1600%。

select * from tablename sample(16)
where datechar=to_char(to_date('2018-02','yyyy-mm'),'yyyy-mm') and y=0

2. 按数量抽样
下面的代码是先向时间为2018年2月的未违约客户赋予一个随机数,然后根据随机数排序,最后取前8000个。

 select * from (
  select * from tablename
  where datechar=to_char(to_date('2018-02','yyyy-mm'),'yyyy-mm') and y=0
  order by dbms_random.value
) where rownum<=8000

只要根据需要的样本比例和分布计算好每个层正负样本中需要抽取的样本比例,或者样本个数,以上面两种方法对各层进行随机抽样,最后再union这些表,就能实现分层抽样了,so easy~

猜你喜欢

转载自blog.csdn.net/weixin_39750084/article/details/81349802