特征选择之python实战(一)
来源:互联网 发布:古诗欣赏的软件 编辑:程序博客网 时间:2024/06/05 14:12
特征选择主要有两个功能:
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’)]
- 特征选择之python实战(一)
- 机器学习(一): python三种特征选择方法
- 文本挖掘之特征选择(python实现)
- 文本挖掘之特征选择(python 实现)
- Python GUI之tkinter 实战(一)
- 机器学习实战之决策树(2)---选择最好的特征来划分数据集
- 特征选择之基于相关性的特征选择(CFS)
- Python 文本挖掘:使用机器学习方法进行情感分析(一、特征提取和选择)
- 特征选择方法学习笔记(一)
- Python实战(一)
- 模型选择之特征选择
- 特征选择之词频
- Spark之特征选择
- 文本之特征选择
- Python爬虫实战之抓取淘宝MM照片(一)
- Python爬虫实战(一)
- python爬虫实战(一)
- Python与机器学习之实战(一)
- 昂贵的聘礼
- 天气案例
- 机器视觉缺陷检测-边学边做-OpenCV + Visiual Studio 2017 C++环境搭建
- UML核心视图
- 组合数在线
- 特征选择之python实战(一)
- java的序列化或Serializable接口的作用
- 并查集&&压缩路径
- Elasticsearch聚合 之 Date Histogram聚合
- Java 源程序与编译型运行区别
- stm32 待机模式
- Gradle 多项目管理
- 快速排序(quick sort) C ~
- elasticsearch