特征工程之特征选择(一)

特征工程之特征选择(一)

在上一讲的数据预处理后,我们可以进行有意义的特征进行选择。

1、Filter Method

1.1 方差(Variance)选择法

方差:在概率学里,方差是衡量随机变量或一组数据的离散程度,值越大,离散程度越大。
那么在数据分析/机器学习中,某个特征的数据的方差值越小,则说明这个值的离散程度很小,变化程度小,因此有很多大概率对target的影响没那么大,因此可以选择舍弃此特征。相反,如果方差值越大,则说明特征值在不同样本里的变化程度也大,有很大概率对target有很大的详细程度,应保留。

from sklearn.feature_selection import VarianceThreshold

# 设定阈值threshold,方差大于阈值,则选择
VT = VarianceThreshold(threshold=3)
vt_data = VT.fit_transform(iris.data)
# 从下面值可以看出,特征选择之后,只保留了一个特征
# ((150, 4), (150, 1))
print(iris.data.shape, vt_data.shape)
1.2 相关系数法(pearson)

相关系数法:计算各个特征值对target值的相关系数的pearson值,公式为:

r = N x i y i x i y i N x i 2 ( x i ) 2 N y i 2 ( y i ) 2

这个公式计算出来的值的范围为[-1, 1],当值靠近-1或者1时强相关的,靠近0则若相关或不相关
局限性:因为pearson相关系数计算的结果是线性关系,所以该方法是只对两个存在线性关系的变量敏感,若存在非线性关系的话,Pearson是检验不出来的。

手写计算皮尔逊值的函数:

def pearson(vector1, vector2):
    n = len(vector1)
    #simple sums
    sum1 = sum(float(vector1[i]) for i in range(n))
    sum2 = sum(float(vector2[i]) for i in range(n))
    #sum up the squares
    sum1_pow = sum([pow(v, 2.0) for v in vector1])
    sum2_pow = sum([pow(v, 2.0) for v in vector2])
    #sum up the products
    p_sum = sum([vector1[i]*vector2[i] for i in range(n)])
    #分子num,分母den
    num = p_sum - (sum1*sum2/n)
    den = math.sqrt((sum1_pow-pow(sum1, 2)/n)*(sum2_pow-pow(sum2, 2)/n))
    if den == 0:
        return 0.0
    return num/den

当然,还是不要用自己的吧,不高效,哈哈。

from sklearn.feature_selection import SelectKBest  # 移除得分前K名以外的特征,即只保留TopK的特征
from scipy.stats import pearsonr   # scipy.stats.pearsonr库里计算的pearson相关系数
import numpy as np

# 创建一个计算多个特征的pearson系数的函数
def multiFeature_pearsonr(X, y):
    '''
    params: X: 输入特征
            y: 输入标签
    '''
    scores, p_values = [], []
    for ret in map(lambda x:pearsonr(x, y), X.T):
        scores.append(abs(ret[0]))
        p_values.append(ret[1])

    return (np.array(scores), np.array(p_values))

sk = SelectKBest(score_func=multiFeature_pearsonr, k=2)  # 选择top2
x_pearson = sk.fit_transform(iris.data, iris.target)   # 会自动调用multiFeature_pearsonr(X, y)函数

# (150, 2)
print(x_pearson.shape)

1.3 卡方检验方法(chi-square test method)

卡方检验:该方法就是检验定性自变量对因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

x 2 = ( A E ) 2 E = i = 1 k ( A i E i ) 2 E i = i = 1 k ( A i n p i ) 2 n p i

当然,三言两语是无法解释清楚卡方检测是如何在特征选择中起作用的。因为涉及到首先涉及到卡方分布和概率论中的假设检验证明。
但卡方检验是符合假设检验的思想:通过观察实际值和理论值的偏差来确定原假设是否成立。首先假设两个变量是独立的(此为原假设),然后观察实际值和理论值之间的偏差程度,若偏差足够小,则认为偏差是很自然的样本误差,接受原假设。若偏差大到一定程度,则否则原假设,接受备择假设。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

sk_chi2 = SelectKBest(score_func=chi2, k=2)
chi2_data = sk_chi2.fit_transform(iris.data, iris.target)

# (150, 2)
print(chi2_data.shape)
1.4 互信息法(Mutual Information)

互信息法:也是检验自变量与因变量之间的相互依赖性的亮度,不同于相关系数,互信息计算公式为:

I ( X ; Y ) = x X y Y p ( x , y ) log p ( x , y ) / p ( x ) p ( y )

1. p(x,y)是联合概率密度函数,p(x),p(y)分别为X,Y的边缘概率密度函数。
2.简答来说,互信息(mutual information)是用来评价一个事件的出现对于另一个事件的出现所贡献的信息量.
3.使用互信息理论进行特征抽取是基于如下假设:在某个特定类别出现频率高,但在其他类别出现频率比较低的词条与该类的互信息比较大。通常用互信息作为特征词和类别之问的测度,如果特征词属于该类的话,它们的互信息量最大。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif

sk_mi = SelectKBest(mutual_info_classif, k=2)
mi_data = sk_mi.fit_transform(iris.data, iris.target)

# (150, 2)
print(mi_data.shape)

编文不易,github地址,欢迎star/follow:https://github.com/Gary-Deeplearning/sklearn-study-note
微信公众号,感谢关注

猜你喜欢

转载自blog.csdn.net/Gary___/article/details/81566959