相互控制配额抽样模型

21 4月

问题描述

 

在数据挖掘,或者普通数据筛选业务中,我们常常会遇到以下类似的问题:

例如:

我们有学生数据表,包含了学生的数据字段有[性别,年龄,身高,体重,血型],现在有需要在未知数据量(可能很多,可能很少)的数据池中筛选出90条数据,保证这90条数据满足以下条件:

  1. 男女比例各一半,也就是男生45条数据,女生45条数据
  2. 只需要身高在7米以下的学生
  3. 只需要年龄在15到20岁之间
  4. 学生体重在100斤以下的需要60个,100斤以上的需要30个
  5. 学生血型是A型血的需要 36个,是B型血的需要54个

我们可以看出,这些条件大部分都是相互交叉的,也就是说有些学生可能满足多条限制条件,因此简单的按照条件用数据库查询是很难办到的。其中的难点就在于,更改某个条件的学生人数的时候,这些学生很可能也满足其他条件,这样就会打破其他条件的平衡。

这里我们使用的方法是:相互控制配额抽样模型

 

模型介绍

 

              相互控制配额抽样又称“非独立控制配额抽样”,是指在按各类控制特性独立分配样本数额基础上,再采用交叉控制安排样本的具体数额的抽样方式。

具体方法

回到我们的例子,我们要完成目标条件,需要做以下几步

 

第一步:确定边界

 

              数据库里面的数据,可能包含了我们并不需要的数据,所以我们在第一步需要做第一层筛选,把完全不满足的数据过滤掉,这就叫确定数据边界。

比如

  1. 只需要身高在7米以下的学生(我们需要把身高在1.8米以上的学生过滤掉)
  2. 只需要年龄在15到20岁之间(我们需要把15岁以下,20岁以上的学生过滤掉)
  3. 学生血型是A型血的需要 36个,是B型血的需要54个(我们需要把其他血型的学生过滤掉)

这样我们的基础数据样本池就确定了

 

第二步:确定分层和比重

 

我们从满足的条件可以看出,有数据比例限制的只有3条:

  1. 男女比例各一半,也就是男生45条数据,女生45条数据
  2. 学生体重在100斤以下的需要60个,100斤以上的需要30个
  3. 学生血型是A型血的需要 36个,是B型血的需要54个

所以,在这个模型中,我们需要设定3层抽样(过滤)条件,以及比重

第一层:男1/2(45),女1/2(45)

第二层:<=100斤2/3(60),>100斤1/3(30)

第三层:A型2/5(36),B型3/5(54)

第三步:相互控制配额样本表

根据每层的占比,按照同样的占比一层一层划分下去,最终会形成这样的一张配额表

(总数)

90

(男)

45

(女)

45

(<=100斤)

30

(>100斤)

15

(<=100斤)

30

(>100斤)

15

(A型)

12

(B型)

18

(A型)

6

(B型)

9

(A型)

12

(B型)

18

(A型)

6

(B型)

9

 

可以看出,我们需要从数据库这样筛选出数据:

  1. 小于100斤A型血的男生,12名
  2. 小于100斤B型血的男生,18名
  3. 大于100斤A型血的男生,6名
  4. 大于100斤B型血的男生,9名
  5. 小于100斤A型血的女生,12名
  6. 小于100斤B型血的女生,18名
  7. 大于100斤A型血的女生,6名
  8. 大于100斤B型血的女生,9名

这样就能满足所有条件:

  1. 男女比例各一半,也就是男生45条数据,女生45条数据
  2. 学生体重在100斤以下的需要60个,100斤以上的需要30个
  3. 学生血型是A型血的需要 36个,是B型血的需要54个

 

第四步:二叉树动态规划

 

              这样预先设定了需要筛选的条件的目标数量,但是还这样的问题:

比如:

  1. 数据库小于100斤A型血的男生,根本不足12名呢?
  2. 或者因为特殊业务需求小于100斤A型血的男生,我们需要最少13名呢?

              从我们第三步的相互控制配额样本表给出的结果,我们可以把它称为理想值,或者最优解,但是并不代表这是唯一的结果,我们只需要动态调整数据,就能在不破坏整体条件的基础上,获得其他结果。

这里用到的是二叉树最小影响理论,我们可以把所有的分层想象成一颗二叉树:

二叉树的子节点都有两个属性,我们标记为蓝色和绿色

这样可以看出,每一层颜色的总和是满足一个条件的。

比如:

  1. 第二层蓝色之和是男生45,绿色之和是女生45
  2. 第三层蓝色之和是<=100斤为60,绿色之和是>100斤为30
  3. 第四层蓝色之和是A型血36,绿色之和是B型血54

              所以想要要调整数额,就要保证颜色之和不变,而所谓最小单元理论是从二叉树最底层开始调整,这样就不会把影响扩散到父级。

比如,如果A型血,<=100斤,男生只有11名

那么它所在的最小单元二叉树需要调整满足2个条件即可:

  1. 所在当前节点总和不变,所以同辈节点(也就是B型)需要调整
    因为A型少了1个,所以B型加一个即可

  1. 所在属性节点(蓝色)总和不变,所以找邻近的一个蓝色调整即可
    但邻近的蓝色节点,也必须满足条件1,所以最终调整如下

这样我们就完成了最小单元化的二叉树动态规划。

              然而新的问题也随之而来了,如果出现某个节点在变化数据之后,小于0了,或者大于数据库最大上限值了怎么办?

              我们可以用同样的理论,重新规划,只不过需要扩散最小单元的范围,把最小单元扩散至更上一层。我们忽略这一层,再更上一层去做同样的调整。

那么我们得到的调整数据将会出现在父节点的值上,这时候,我们只需要在同属性节点(比如这里少一个的是蓝色)的所有子节点上调整即可。

              如果还是没有合适的结果,那继续往父类扩散即可,直到无法扩散,那就找不到合理的结果。

 

第五步:从数据库筛选数据

 

              这里就涉及到数据分布的问题,要随机查询,还是想顺序查询,还是想均匀分布,动态分布?这就和业务需求挂钩了,不在本模型的讨论范围。

 

总结

 

              我们可以看出,利用这个模型,我们可以解决很多交叉条件,这些条件又相互制约的比例筛选数据场景。其中包含了数学模型和数据机构模型,统计学等相关知识。不理解的地方可以多多加深这方便的知识。

代码:

先看测试类:

vo

核心方法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注