特征选择——互信息量
最近做了一个数据比赛,由于对数据背后的业务不太了解,所以特征工程大多采取了“暴力”提取的方式,最终特征过多直接导致模型存在过拟合问题。所以赛后总结在做特征工程的过程中就要考虑特征的取舍问题,主要通过特征与因变量Y之间的相关性分析做出判断。
衡量单变量的相关性指标有很多,比如Pearson相关系数、Pearson卡方检验、Fisher得分、互信息等。
目录
- 信息量
- 信息熵
- 条件熵
- 互信息量
- 用于特征选择(Python)
信息量
对于随机离散变量X,假设其概率分布为\{P(X=1)=p_1, P(X=2)=p_2,...P(X=n)=p_n\},则定义“A=i”这一事件包含的信息量I(X=i)为:
I(X=i)=-log_mP(X=i)=log_m{\frac{1}{p_i}}
当对数的底m取2时,信息量单位为比特(bit);m取自然常数e时,单位为奈特(nat)。本文后续内容均以比特 作为计算单位,并在书写log时默认以2为底。
采用对数函数定义的信息量符合以下3点逻辑:
(1)必然事件包含的信息量为0
假如把离散变量A看成是太阳升起的方向,那么X只能是东边,即P(X=“东边”)=1,得到“太阳从东边升起”这一事件的信息量为:I(“太阳从东边升起”)=I(X=“东边”)=-logP(X=“东边”)=0
(2)可能性越小的事件,其包含的信息越多
在信息量的定义式中,信息量的大小与事件发生的概率成反比,符合这一逻辑:
0
(3)两个相互独立事件同时发生时获得的信息量应该等于事件各自发生时获得的信息之和
假设相互独立的事件X和Y,发生的概率分别为p_X和p_Y,则有:
I(X)+I(Y)=-log(p_X)-log(p_Y)=-log(p_X·p_Y)=-log(p_{XY})=I(X,Y)
信息熵
如果信息量表示的是随机离散变量X取某一特定值时的信息,那么信息熵就可以理解为是随机离散变量X取所有可能值时的期望信息量,所以关于变量X的信息熵H(X)定义为:
H(X)=E(I(X))=\sum_{i=1}^{n}p_i·I(X=i)=-\sum_{i=1}^{n}p_i·log(p_i)
信息熵另一个比较形象的解释是,表示随机变量X不确定性的度量,我们计算下在什么情况下X的不确定性最大。
max \quad H(X) \\ s.t. \quad \sum_{i=1}^{n}p_i =1
引入拉格朗日乘子\lambda并改写目标函数F:
F=\lambda(\sum_{i=1}^{n}p_i-1)-\sum_{i=1}^{n}p_i·log(p_i)
对所有未知数求偏导可得:
\frac{\partial F}{\partial p_i}=\lambda-1-log(p_i)=0\quad,\quad i=1,2,...,n \\ \frac{\partial F}{\partial \lambda}=\sum_{i=1}^{n}p_i-1=0
求解以上方程组得:
\begin{cases} p_i=\frac{1}{n}\quad, \quad i=1,2,...n\\ \lambda = 1-log(n)\\ \end{cases}
说明X的所有取值都是等概率出现时,随机离散变量X的不确定性(信息熵)达到最大。
信息量和信息熵最大的区别在于对象不同;前者针对的是一件具体的事件,或者说是离散变量X一种可能的取值(分类水平);而信息熵针对的是离散变量X自身的不确定性,包含了所有的取值。
条件熵
假设两个随机离散变量X和Y的概率分布分别为:
P(X=x_i)=p_i , P(Y=y_j)=p_j , i=1,2,..,n \quad , j=1,2,...,m
条件熵H(Y|X)表示在已知随机变量X的条件下变量Y的不确定性,定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
H(Y|X)=\sum_{i=1}^{n}p_i·H(Y|X=x_i)
互信息量
在给出互信息定义前先看下这张关系图:

有两种说法:
(1)直观上看,互信息度量两个随机变量X、Y之间共享的信息 ,互信息越大则表明X和Y的相关性越高;
(2)也可以表示为由于X的引入而使Y的不确定度减少的量 ,减少的量越大说明X更有利于对Y的确定.
利用图中X、Y之间的互信息和信息熵、条件信息熵之间的数值关系给出互信息I(X;Y)的计算公式:
I(X;Y)=H(Y)-H(Y|X) \\ \quad \quad=-\sum_{j=1}^{m}p_j·log(p_j)-\sum_{i=1}^{n}p_i·H(Y|X=x_i) \\ \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad=-\sum_{j=1}^{m}p_j·log(p_j)+\sum_{i=1}^{n}\sum_{j=1}^{m}p_i·P(Y=y_j|X=x_i)·log(P(Y=y_j|X=x_i)) \\ \quad\quad =-\sum_{j=1}^{m}p_j·log(p_j)+\sum_{i=1}^{n}\sum_{j=1}^{m}p_{ij}·log \left( \frac{p_{ij}}{p_i} \right)
其中p_{ij}=P(X=x_i,Y=y_j),表示X和Y联合分布的概率。利用边缘概率和联合概率的关系\sum_{i=1}^{n}p_{ij}=p_j简化上述式子得:
I(X;Y)=\sum_{i=1}^{n}\sum_{j=1}^{m}p_{ij}·log \left( \frac{p_{ij}}{p_i·p_j} \right)
用于特征选择(Python)
做特征选择时需要根据特征变量X和因变量Y的类型来选取合适的相关性指标,这里互信息适用于特征和因变量都是分类变量的情况。公式中的概率均用各分类水平出现的频率来替代:
p_i=\frac{n(X=x_i)}{N},p_j=\frac{n(Y=y_j)}{N},p_{ij}=\frac{n(X=x_i,Y=y_j)}{N}
import pandas as pd
import numpy as np
def mutual_infor(X, y):
'''
Mutual Information
X and y are both categorical variables.
Input : {
X : one-dimensional array、list or series from Pandas
y : one-dimensional array、list or series from Pandas
}
'''
X = np.array(X).reshape(-1)
y = np.array(y).reshape(-1)
if len(X) != len(y):
print('Length of X and y are inconsistent !')
X_level = list(set(X))
y_level = list(set(y))
N = X.shape[0]
I = 0
for i in X_level:
for j in y_level:
p_xy = np.sum(X == i) & (y == j) / N
p_x = np.sum(X == i) /N
p_y = np.sum(y == j) /N
I += p_xy * np.log(p_xy / (p_y * p_x))
return I
python

