单变量过滤方法主要是基于特征变量和目标变量之间的相关性、互信息等计算出来的,总结如下:
1、最简单的方差选择法
from sklearn.feature_selection import VarianceThreshold
result=VarianceThreshold(threshold=0.5).fit_transform(data.data)
#然后根据各个特征的方差的结果来删除方差太小的特征
#如果嫌人工看麻烦可以使用selectkbest或者selectprecentile来自动选择
这种方法虽然简单,但是最大的问题是将特征的重要性完全归结于统计学上的方差,然而问题在于在实际的业务场景中,可能方差很小的特征携带了非常重要的信息。举个例子,比如正负样本非常不均衡的二分类问题中,正样本有10个,负样本有10000个,我们的建模目标是尽量用模型将这10个正样本分辨出来,假设我们存在某个特征恰好正样本在该特征上取值为1,负样本在该特征上取值为0,则这个特征的方差会很小,但是确具有重要的意义,另外,方差的计算还会受到异常值的影响所以使用前可能还需要事先对异常值进行相应的处理。所以,个人一般倾向于使用这种方法来筛选方差为0或者极其接近于0的特征。
2、覆盖率
from《美团机器学习实战》,主要是针对类别型特征来计算的一个衡量指标,假设样本个数一共有10000个,某个类别特征f1一共有“A”,“B”,“C”三种,并且分别有8000个“A”,1950个“B”以及50个“C”,则“A”,“B”,“C”的覆盖率分别为:8000/10000,1950/10000,50/10000。类似的,覆盖率小的特征更容易被剔除。
#假设f1为类别型特征则:
from collections import Counter
Counter(f1) #即可计算出不同的类别特征的数量,然后分别除以总样本数量即可
这个其实简单说就是根据类别特征中各个子类别的数量来进行处理,比如100000个样本某些类别出现的次数很小例如就5次或者10次,这这些出现次数很少的类别可以合并为“other”类,这样进行onehot展开的时候一方面能降低高基数类别特征的onehot展开之后维度太高的问题,一方面能够降低过拟合的风险。是高基类类别特征的一种比较常规常见而且简单好理解的处理方式,问题在于到底出现多少次算是“少数类”要合并到“other”中去?这个目前没有什么明确的标准,个人经验是根据分布图的情况来人工尝试划分几次然后比较最终的模型评价的结果。
3、互信息
简单回归一下信息论的知识:
信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”。也就是说衡量信息量大小就看这个信息消除不确定性的程度。(习惯上对数的底数我们取2或者是e,下面是2的情况)
1、信息量
![7a26fefd74121d8f9a6561a4e5d658d2.png](https://i-blog.csdnimg.cn/blog_migrate/e8af9ed37af5725f96a030059767cb96.jpeg)
很好理解,“太阳每天从东方升起”这个事件的概率为1,则信息量I=0,因为这是一件确定性的事件,所以不确定性为0,则信息量为0。
2、信息熵
![11163391a05b9ce1fc6e9b1ffbd0d07a.png](https://i-blog.csdnimg.cn/blog_migrate/50bfec6445e6f94c4a75820b2428411f.jpeg)
看公式,以扔硬币为例子,假设硬币均匀正反改为均为0.5,则扔均匀硬币根据公式可得信息熵就是-(1/2log2(1/2)+1/2*log2(1/2),其实就是加权平均信息量。这个和id3决策树里面用的信息熵是一个东西。信息熵用来衡量事物不确定性。信息熵越大,事物越具不确定性,事物越复杂,具有的总的信息量越大。
3、联合熵与条件熵
![18d4783d044381fb3531c15ca748fd4c.png](https://i-blog.csdnimg.cn/blog_migrate/bee126af923547be90d352ed9d3d6db3.jpeg)
上面是联合熵的公式,其实如果把(x,y)当做一个整体z,其形式和信息熵的公式是差不多的。
![2ab8e6c33e73df2714a45d01416adc39.png](https://i-blog.csdnimg.cn/blog_migrate/79f0a615a6b7c044c091e561406858dd.jpeg)
上面是条件熵,含义很直观,就是已知Y的情况下,X的信息熵的大小,举一个极端的例子,如果X和Y相互独立,则以Y为先验的X的联合熵在数值上等于X的信息熵。联合熵和信息熵的关系为:
![f772c368b53c2bf984a22f0822beee51.png](https://i-blog.csdnimg.cn/blog_migrate/d8322133e0e463d049cd4ce9e3eb8a9c.png)
4、互信息(信息增益)
![69db67ecd46431ab7b058da2e993510a.png](https://i-blog.csdnimg.cn/blog_migrate/14541593987162bb7d0aa2ba19df9319.png)
从公式来看,互信息就是衡量引入X之后,Y的信息熵的变化量,如果信息熵变化很大,说明X的引入让Y的不确定性提高了,那么就说明这个特征X相对于target Y是很重要的。
这个其实就是ID3用到的信息增益,对,两个是一个东西。
下面详细展开:
https://www.douban.com/note/621588501/ 发现了一篇关于互信息的讨论很深刻的文章,作者真是非常细心和专业!下面的代码部分就是直接根据这个网址里的内容写的
正式地,两个离散随机变量 X 和 Y 的互信息可以定义为:
其中 p(x,y) 是 X 和 Y 的联合概率分布函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率分布函数。
![fafca632a0b66c6c1403c2b720ceec81.png](https://i-blog.csdnimg.cn/blog_migrate/740641eafd2871a8ab2e54334af970d9.jpeg)
在连续随机变量的情形下,求和被替换成了二重定积分:
![a7f207aef5ec3108c977637e9e0443fa.png](https://i-blog.csdnimg.cn/blog_migrate/0fc206735e63cc1135a4b1b88f0d9eea.png)
其中 p(x,y) 当前是 X 和 Y 的联合概率密度函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率密度函数。但是尴尬的是,“ X 和 Y 的联合概率密度函数”以及“ X 和 Y 的边缘概率密度函数”我们事先是不知道的,它不像两个变量都是离散变量的情况那样可以直接通过计数的方式进行计算,所以更常见的是对离散的特征和目标值来计算互信息的值(当然可以对连续值进行分箱离散化之后计算互信息,决策树之所以能对连续特征进行互信息-信息增益的计