特征选择之python实战(一)

来源:互联网 发布:古诗欣赏的软件 编辑:程序博客网 时间:2024/06/05 14:12
前言:实际应用中特征作用远大于模型。
声明:本文为读书笔记,原文地址:http://www.tuicool.com/articles/ieUvaq

特征选择主要有两个功能:

1.减少特征数量、降维,使模型泛化能力更强,减少过拟合

2.增强对特征和特征值之间的理解


特征选择方法总览


1 去掉取值变化小的特征 Removing features with low variance

在所有输入样本中,绝大部分的实例的该特征取值都是相同,那就可以认为这个特征作用不大。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。

2 单变量特征选择 Univariate feature selection

单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征

对于回归和分类问题可以采用卡方检验等方式对特征进行测试。

这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果。但对特征优化、提高泛化能力来说不一定有效

2.1 Pearson相关系数 Pearson Correlation

皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关(这个变量下降,那个就会上升),+1表示完全的正相关,0表示没有线性相关

Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的 pearsonr 方法能够同时计算相关系数和p-value,

import numpy as npfrom scipy.stats import pearsonrnp.random.seed(0)size = 300x = np.random.normal(0, 1, size)print "Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))#x+较小的噪音print "Higher noise", pearsonr(x, x + np.random.normal(0, 10, size))#x+较大的噪音

Lower noise (0.71824836862138386, 7.3240173129992273e-49) 

Higher noise (0.057964292079338148, 0.31700993885324746)

#当噪音比较小的时候,相关性很强,p-value很低。


Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。


2.2 互信息和最大信息系数 Mutual information and maximal information coefficient (MIC)


缺点:1、它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较;2、对于连续变量的计算不是很方便(X和Y都是集合,x,y都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感

解决上述缺点的方法:最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1] 。

反过头来看y=x^2这个例子,MIC算出来的互信息值为1(最大的取值)。

from minepy import MINEm = MINE()x = np.random.uniform(-1, 1, 10000)m.compute_score(x, x**2)print m.mic()

1.0

MIC的统计能力遭到了 一些质疑 ,当零假设不成立时,MIC的统计就会受到影响。在有的数据集上不存在这个问题,但有的数据集上就存在这个问题。

2.3 距离相关系数 (Distance correlation)

距离相关系数是为了克服Pearson相关系数的弱点而生的。在x和x^2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。

> x = runif (1000, -1, 1)> dcor(x, x**2)[1] 0.4943864

2.4 基于学习模型的特征排序 (Model based ranking)

思路:先选择机器学习算法,再针对每个单独的特征和响应变量建立预测模型。


某个特征和响应变量之间的关系是:

(1)线性的:其实Pearson相关系数等价于线性回归里的标准化回归系数。

(2)非线性的:可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。


在 波士顿房价数据集 上使用sklearn的 随机森林回归 给出一个单变量选择的例子:

from sklearn.cross_validation import cross_val_score, ShuffleSplitfrom sklearn.datasets import load_bostonfrom sklearn.ensemble import RandomForestRegressor#Load boston housing dataset as an exampleboston = load_boston()X = boston["data"]Y = boston["target"]names = boston["feature_names"]rf = RandomForestRegressor(n_estimators=20, max_depth=4) #树的深度不要太大,防止过拟合scores = []for i in range(X.shape[1]):     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",                              cv=ShuffleSplit(len(X), 3, .3)) #交叉验证     scores.append((round(np.mean(score), 3), names[i]))print sorted(scores, reverse=True)  #根据得分结果对特征排序

[(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]