😆 机器学习采样方法大全

🚙 Index

  • 数据采样的原因
  • 常见的采样算法
  • 失衡样本的采样
  • 采样的Python实现

📚 数据采样的原因

其实我们在训练模型的过程,都会经常进行数据采样,为了就是让我们的模型可以更好的去学习数据的特征,从而让效果更佳。但这是比较浅层的理解,更本质上,数据采样就是对随机现象的模拟,根据给定的概率分布从而模拟一个随机事件。另一说法就是用少量的样本点去近似一个总体分布,并刻画总体分布中的不确定性。

因为我们在现实生活中,大多数数据都是庞大的,所以总体分布可能就包含了无数多的样本点,模型是无法对这些海量的数据进行直接建模的(至少目前而言),而且从效率上也不推荐。

因此,我们一般会从总体样本中抽取出一个子集来近似总体分布,这个子集被称为“训练集”,然后模型训练的目的就是最小化训练集上的损失函数,训练完成后,需要另一个数据集来评估模型,也被称为“测试集”

采样的一些高级用法,比如对样本进行多次重采样,来估计统计量的偏差与方法,也可以对目标信息保留不变的情况下,不断改变样本的分布来适应模型训练与学习(经典的应用如解决样本不均衡的问题)。

📚 常见的采样算法

采样的原因在上面已经阐述了,现在我们来了解一下采样的一些算法:

01 逆变换采样

有的时候一些分布不好直接采样,可以用函数转换法,如果存在随机变量x和u的变换关系:u=ϕ(x),则它们的概率密度函数如下所示:

p(u)|ϕ′(x)|=p(x)

因此,如果从目标分布p(x)中不好采样x,可以构造一个变换u=ϕ(x),使得从变换后地分布p(u)中采样u比较容易,这样可以通过对u进行采样然后通过反函数x = \phi ^{-1}(u) 来间接得到x。如果是高维空间地随机变量,则ϕ′(x)对应Jacobian行列式。

而且,如果变换关系ϕ(·)是x的累积分布函数的话,则就是我们说的 逆变换采样(Inverse Transform Sampling), 我们假设待采样的目标分布的概率密度函数为p(x), 它的累积分布函数为:
u = \phi(x)=\int_{-\infty}^x p(t) dt
逆变换采样法的过程:

  • 从均匀分布U(0,1)产生一个随机数 u_i
  • 计算逆函数 x_i = \phi ^{-1}(u_i) 来间接得到x
file

但并不是所有的目标分布的累积分布函数的逆函数都是可以求解的(or容易计算),这个时候逆变换采样法就不太适用,可以考虑拒绝采样(Rejection Sampling)和重要度采样(Importance Sampling)。

02 拒绝采样(Rejection Sampling)

拒绝采样,也被称为接受采样(Accept Sampling),对于目标分布p(x),选取一个容易采样的参考分布q(x),使得对于任意的x都有 p(x) \leq M \cdot q(x) ,其采样过程如下:
1)从参考分布q(x)中随机抽取一个样本x_i
2)从均匀分布U(0,1)产生一个随机数u_i
3)如果 u_i < \frac {p(x_i)}{M \cdot q(x_i)} , 则接受样本x_i,否则拒绝,一直重复1-3步骤,直到新产生的样本量满足要求。
其实,拒绝采样的关键就是为我们的目标分布p(x)选取一个合适的包络函数 M \cdot q(x),如下图所示的正态分布的函数:

file

可以知道,包络函数越“紧”,p(x_i)M \cdot q(x_i)的大小越接近,那么\frac {p(x_i)}{M \cdot q(x_i)}就越接近1,那么更容易接受采样样本A,这样子采样的效率就越高。

除了上面的形式,还有一种叫自适应拒绝采样(Adaptive Rejection Sampling),在目标分布是对数凹函数时,用分段的线性函数来做包络函数,如下图所示:

file

03 重要性采样(Importance Sampling)

还有一种采样方法,是计算函数f(x)在目标分布p(x)上的积分(函数期望),即:
E[f] = \int f(x)p(x)dx
我们先找一个比较容易抽样的参考分布q(x),并令 w(x)=\frac {P(x)}{q(x)},则存在:
E[f] = \int {f(x)w(x)q(x)} dx
这里的w(x)我们可以理解为权重,我们就可以从参考分布q(x)中抽取N个样本x_i ,并且利用如下公式来估计E[f]
E[f] \approx \hat{E}_N[f] = \sum_{i=1}^n f(x_i) w(x_i)
下图就是重要性采样的示意图:

file

04 马尔科夫蒙特卡洛采样法

在高维空间中,拒绝采样和重要性采样很难寻找到合适参考分布,而且采样的效率是很低的,这个时候是可以考虑一下马尔科夫蒙特卡洛(Markov Chain Monte Carlo,MCMC)采样法

可能有一些同学对这个名词还是比较陌生,那么先来讲解一下MCMC。

1. 主要思想

MCMC采样法主要包括两个MC,即Monte Carlo和Markov Chain。Monte Carlo是指基于采样的数值型近似求解方法,Markov Chain则是用于采样,MCMC的基本思想是:针对待采样的目标分布,构造一个马尔科夫链,使得该马尔科夫链的平稳分布就是目标分布,然后从任何一个初始状态出发,沿着马尔科夫链进行状态转移,最终得到的状态转移序列会收敛到目标分布,由此得到目标分布的一系列样本。

MCMC有着不同的马尔科夫链(Markov Chain),不同的链对应不用的采样法,常见的两种就是Metropolis-Hastings采样法和吉布斯采样法

file

2. Metropolis-Hastings采样法

对于目标分布p(x),首先选择一个容易采样的参考条件分布 q(x^* | x) ,并令
A(x, x^*) = min \{ 1, \frac{p(x^*)q(x|x^*)}{p(x)q(x^*|x)} \}
然后根据如下过程进行采样:

1)随机选取一个初始样本 x^{(0)}

2)For t =1, 2, 3, ...:

{ 根据参考条件分布 q(x^*|x^{(t-1)})抽取一个样本 x^*

根据均匀分布U(0,1)产生随机数u

u < A(x^{(t-1)}, x^*),则令 x^{(t)}=x^*,否则令 x^{(t)}=x^{(t-1)} }

上面的图是Metropolis-Hastings的示意过程图,其中红线代表被拒绝的移动(维持旧样本),绿线代表被接受的移动(采纳新样本)。

3. 吉布斯采样法

吉布斯采样法是Metropolis-Hastings的一个特例,其核心是每次只对样本的一个维度进行采样和更新,对于目标分布p(x),其中 x=(x_1, x_2, ..., x_d) 是多维向量,按如下的过程进行采样:

1)随机选择初始状态 x^{(0)} = (x^{(0)}_1, x^{(0)}_2,..., x^{(0)}_d)

2)for t = 1, 2, 3, ...:

{ 对前一步产生的样本 x^{(t-1)} = (x^{(t-1)}_1, x^{(t-1)}_2,..., x^{(t-1)}_d),依次采样和更新每个维度的值,即依次抽取分量 x^{(t)}_1 p(x_1 | x^{(t-1)}_2, x^{(t-1)}_3,..., x^{(t-1)}_d)

形成新的样本 x^{(t)} = (x^{(t)}_1, x^{(t)}_2,..., x^{(t)}_d)

}

同样的上述过程得到的样本序列会收敛到目标分布p(x),另外步骤2中对样本每个维度的抽样和更新操作,不是必须要按照下标顺序进行的,可以是随机进行的。

拒绝采样中,如果在某一步得到的样本被拒绝,则该步不会产生新样本,需要重新进行采样,如在MCMC中,每一步都是会产生一个样本的,只是有的时候是保留旧样本罢了,而且MCMC是会在不断迭代过程中逐渐收敛到平稳分布的。

失衡样本的采样

我们在实际的建模中总会遇到很多失衡的数据集,比如点击率模型、营销模型、反欺诈模型等等,往往坏样本(or好样本)的占比才千分之几。虽然目前有些机器学习算法会解决失衡问题,比如XGBoost,但是很多时候还是需要我们去根据业务实际情况,对数据进行采样处理,主要还是分两种方式:

过采样(over-sampling):从占比较少的那一类样本中重复随机抽样,使得最终样本的目标类别不太失衡;

欠采样(under-sampling):从占比较多的那一类样本中随机抽取部分样本,使得最终样本的目标类别不太失衡;

科学家们根据上述两类,衍生出了很多方法,如下:

Over-Sampling类

1)Random Oversampling

也就是随机过采样,我们现在很少用它了,因为它是从样本少的类别中随机抽样,再将抽样得来的样本添加到数据集中,从而达到类别平衡的目的,这样子做很多时候会出现过拟合情况。

2)SMOTE

SMOTE,全称是Synthetic Minority Oversampling Technique,其思想就是在少数类的样本之间,进行插值操作来产生额外的样本。对于一个少数类样本\mathbf{x}_i,使用K-Mean法(K值需要人工确定)求出距离\mathbf{x}_i 距离最近的k个少数类样本,其中距离定义为样本之间n维特征空间的欧式距离,然后从k个样本点钟随机抽取一个,使用下面的公式生成新的样本点:
\mathbf{x}_{new}=\mathbf{x}_{i}+(\mathbf{\hat{x}}_{i}-\mathbf{x}_{i}) \times \delta
其中,\mathbf{\hat{x}} 为选出的k近邻点,\delta\in[0,1]是一个随机数。下图就是一个SMOTE生成样本的例子,使用的是3-近邻,可以看出SMOTE生成的样本一般就在 \mathbf{x}_{i}\mathbf{\hat{x}}_{i}相连的直线上:

file

从图中可以看出 {x}_{new} 就是我们新生成样本点,但是,SMOTE算法也是有缺点的:

(1)如果选取的少数类样本周围都是少数类样本,那么新合成的样本可能不会提供太多有用的信息;

(2)如果选取的少数类样本周围都是多数类样本,那么这可能会是噪声,也无法提升分类效果。

其实,最好的新样本最好是在两个类别的边界附近,这样子最有利于分类,所以下面介绍一个新算法——Border-Line SMOTE。

3)Border-Line SMOTE

这个算法一开始会先将少数类样本分成3类,分别DANGER、SAFE、NOISE,如下图:

file

而Border-line SMOTE算法只会在“DANGER”状态的少数类样本中去随机选择,然后利用SMOTE算法产生新样本。

4)ADASYN

ADASYN名为自适应合成抽样(Adaptive Synthetic Sampling),其最大的特点是采用某种机制自动决定每个少数类样本需要产生多少合成样本,而不是像SMOTE那样对每个少数类样本合成同数量的样本。ADASYN的缺点是易受离群点的影响,如果一个少数类样本的K近邻都是多数类样本,则其权重会变得相当大,进而会在其周围生成较多的样本。

Under-Sampling类

1)Random Undersampling

这类也是比较简单的,就是随机从多数类中删除一些样本,这样子的缺失也是很明显,那就是造成部分信息丢失,整体模型分类效果不理想。

2)EasyEnsemble 和 BalanceCascade

这两个算法放在一起的原因是因为都用到了集成思想来处理随机欠采样的信息丢失问题。

  • EasyEnsemble :将多数类样本随机划分成n份,每份的数据等于少数类样本的数量,然后对这n份数据分别训练模型,最后集成模型结果。
  • BalanceCascade:这类算法采用了有监督结合boosting的方式,在每一轮中,也是从多数类中抽取子集与少数类结合起来训练模型,然后下一轮中丢弃此轮被正确分类的样本,使得后续的基学习器能够更加关注那些被分类错误的样本。

3)NearMiss

NearMiss本质上是一种原型选择(prototype selection)方法,即从多数类样本中选取最具代表性的样本用于训练,主要是为了缓解随机欠采样中的信息丢失问题。NearMiss采用一些启发式的规则来选择样本,根据规则的不同可分为3类:

  • NearMiss-1:选择到最近的K个少数类样本平均距离最近的多数类样本
  • NearMiss-2:选择到最远的K个少数类样本平均距离最近的多数类样本
  • NearMiss-3:对于每个少数类样本选择K个最近的多数类样本,目的是保证每个少数类样本都被多数类样本包围

NearMiss-1和NearMiss-2的计算开销很大,因为需要计算每个多类别样本的K近邻点。另外,NearMiss-1易受离群点的影响,如下面第二幅图中合理的情况是处于边界附近的多数类样本会被选中,然而由于右下方一些少数类离群点的存在,其附近的多数类样本就被选择了。相比之下NearMiss-2和NearMiss-3不易产生这方面的问题。

file

📚 Reference

《百面机器学习》—— Chapter 7

机器学习之类别不平衡问题 (3) —— 采样方法

https://nbviewer.jupyter.org/github/massquantity/Class-Imbalance/blob/master/Code_Sampling.ipynb

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 前言 如果你能找到这里,真是我的幸运~这里是蓝白绛的学习笔记,本集合主要针对《百面机器学习——算法工程师带你去面试...
    蓝白绛阅读 3,021评论 0 5
  • 转载自 https://mp.weixin.qq.com/s/OXXtPoBrCADbwxVyEbfbYg 25....
    _龙雀阅读 1,645评论 0 0
  • 我是一个自尊心很强的人,从小就听不得别人说自己不好的人,像那些爱说别人的长短的人,从小就听着一些说那个怎么这么的,...
    云南啊帅阅读 80评论 0 1
  • ↑ 点击上方“小玉轩”关注我们 文末有福利哦~~~ 成长就是你哪怕难过的快死掉了, 但你第二天还是照常去上课上班。...
    KONG7592阅读 1,657评论 0 4
  • 刚刚过去的这个周末,真是个“母爱”泛滥的日子,昨天的母亲节,跟母亲和母爱有关的话题,足足了刷了一天屏。今天借着母亲...
    梦甜甜2011阅读 452评论 1 1