​​​​​​特征选择作用:

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

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

特征选择方法:

Pearson相关系数——单变量选择

该方法衡量变量之间的线性相关性,取值范围为【-1,1】、

-1表示完全负相关;0表示完全没有线性关系;+1表示完全正相关。

优点:速度快,易于计算

缺点:只能衡量线性相关性

Python代码:使用scipy.stats的 pearsonr函数:

import numpy as np
from scipy.stats import pearsonrnp.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
y = x + np.random.normal(0, 1, size)
print("Pearsonr", pearsonr(x, y))

随机森林回归——单变量选择

思路:直接使用机器学习算法针对每个单独的特征和因变量建立预测模型。

Python代码:

import numpy as np
from sklearn.model_selection import KFold,cross_val_score,ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor#Load boston housing dataset as an example
boston = 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))

其中,RandomForestRegressor函数就是随机森林回归算法,从sklearn.ensemble库中调用;函数为:

classsklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,max_features='auto', max_leaf_nodes=None, min_impurity_split=1e-07,bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0,warm_start=False, class_weight=None)
  • n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数,默认是10。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。对Random Forest来说,增加“子模型数”(n_estimators)可以明显降低整体模型的方差,且不会对子模型的偏差和方差有任何影响。模型的准确度会随着“子模型数”的增加而提高,由于减少的是整体模型方差公式的第二项,故准确度的提高有一个上限。在实际应用中,可以以10为单位,考察取值范围在1至201的调参情况。
  • 对比,Random Forest的子模型都拥有较低的偏差,整体模型的训练过程旨在降低方差,故其需要较少的子模型(n_estimators默认值为10)且子模型不为弱模型(max_depth的默认值为None);Gradient Tree Boosting的子模型都拥有较低的方差,整体模型的训练过程旨在降低偏差,故其需要较多的子模型(n_estimators默认值为100)且子模型为弱模型(max_depth的默认值为3)。

此处参考https://blog.csdn.net/chaochaopang0/article/details/78604014

cross_val_score函数是做K折交叉验证,函数体为:
sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)
参数:estimator: 需要使用交叉验证的算法
X: 输入样本数据
y: 样本标签
groups: 将数据集分割为训练/测试集时使用的样本的组标签(一般用不到)
scoring: 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果。具体如下:

ShuffleSplit函数是用来划分数据集的,用于将样本集合随机“打散”后划分为训练集、测试集(可理解为验证集,下同),类申明如下:

class sklearn.model_selection.ShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=None)
  • n_splits:int, 划分训练集、测试集的次数,默认为10
  • test_size:float, int, None, default=0.1; 测试集比例或样本数量,该值为[0.0, 1.0]内的浮点数时,表示测试集占总样本的比例;该值为整型值时,表示具体的测试集样本数量;train_size不设定具体数值时,该值取默认值0.1,train_size设定具体数值时,test_size取剩余部分
  • train_size:float, int, None; 训练集比例或样本数量,该值为[0.0, 1.0]内的浮点数时,表示训练集占总样本的比例;该值为整型值时,表示具体的训练集样本数量;该值为None(默认值)时,训练集取总体样本除去测试集的部分
  • random_state:int, RandomState instance or None;随机种子值,默认为None

注意:

1. 树的深度不要过大

2. 最好用交叉验证

递归特征消除法

递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

Sklearn提供了RFE包,可以用于特征消除,还提供了RFECV,可以通过交叉验证来对的特征进行排序。

引用自https://mp.weixin.qq.com/s/8LMRVcxZsuJGXbj4AF-MIg

import numpy as np
from sklearn.datasets import load_boston
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegressionboston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]#use linear regression as the model
lr = LinearRegression()
#rank all features, i.e continue the elimination until the last one
rfe = RFE(lr, n_features_to_select=1)
rfe.fit(X,Y)print("Features sorted by their rank:")
print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names)))

稳定性选择(Stability selection)

稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

sklearn在随机lasso和随机逻辑回归中有对稳定性选择的实现。

from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()#using the Boston housing data.
#Data gets scaled automatically by sklearn's implementation
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]rlasso = RandomizedLasso(alpha=0.025)
rlasso.fit(X, Y)print "Features sorted by their score:"
print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), names), reverse=True)

稳定性选择对于克服过拟合和对数据理解来说都是有帮助的:总的来说,好的特征不会因为有相似的特征、关联特征而得分为0。对于特征选择任务,在许多数据集和环境下,稳定性选择往往是性能最好的方法之一。

PS.

1. 数据预处理:去掉变化较小的特征:

例如,某特征的特征值只有0和1,在所有输入样本中,95%的特征取值为1,认为该特征作用不大。此时应该去掉该特征。

参考资料:https://www.cnblogs.com/hhh5460/p/5186226.html

【Python】特征选择方法相关推荐

  1. python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  2. python特征选择的过程_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

    花费了很长时间整理编辑,转载请联系作者授权,违者必究. 特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程.它是机器学习中非常重要的一步并在很大程度上可以提高 ...

  3. Python机器学习实战:掌握这四个特征选择方法,提升模型预测性能

    机器学习实战:这里没有艰深晦涩的数学理论,我们将用简单的案例和大量的示例代码,向大家介绍机器学习的核心概念.我们的目标是教会大家用Python构建机器学习模型,解决现实世界的难题. 当数据集包含很多特 ...

  4. 一文介绍机器学习中的三种特征选择方法

    作者 | luanhz 来源 | 小数志 导读 机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.也正因如此,特征工程在机器学习流程中占有着重要地位.广义的特征 ...

  5. 数据维度爆炸怎么办?详解5大常用的特征选择方法

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Edwin Jarvis,cnblog博客整理 在许多机器学习相关 ...

  6. 数据维度爆炸怎么办?详解 5 大常用的特征选择方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在许多机器学习相关的书里,很难找到关于特征选择的内容,因为特征选择 ...

  7. 1个Python特征选择工具,助力实现高效机器学习

    文章最后有免费的Python资料,获取方式,关注头条号,私信回复资料获取下载链接.资料目录在文章底部,欢迎评论转发收藏下载. 鉴于特征选择在机器学习过程中的重要性,数据科学家 William Koeh ...

  8. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  9. 【机器学习基础】一文归纳Python特征生成方法(全)

    创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间.机器学习应用的本质基本上就是特征工程.--Andrew Ng 业内常说数据决定了模型效果上限,而机器学习算法是通过数据特征做出预测的, ...

最新文章

  1. linux - command - iftop
  2. Smarty 中的 if 语句条件修饰词
  3. 【步态识别】基于CNN、步态能量图+HOG特征提取的步态识别算法的MATLAB仿真
  4. Python字典数据类型及基本操作
  5. 封装caffe-windows-cpu(支持模型有多个输出)
  6. 汉字乱码_彻底搞懂这烦人的编码与乱码!
  7. javadoc源码获取
  8. python机器学习--sklearn数据集使用
  9. java 常量变量使用_java常量和变量入门教程
  10. 团队Alpha冲刺(三)
  11. Solr连接MYSQL导入源数据生成索引
  12. 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
  13. Silverlight使用WCF实现数据通信
  14. ACdream 1417 Numbers
  15. SQL Server 列存储索引强化
  16. 不能注册DLL/OCX:RegSvr32失败 0x5
  17. openrasp-iast 灰盒扫描工具
  18. 【Unity】天气特效:打雷下雨
  19. 读《半世烟雨,半世桃花 李清照词传》有感
  20. 阿里双十一 11 年:购物狂欢背后的技术演进

热门文章

  1. C#中的信号量---Semaphore
  2. Storm的acker确认机制
  3. 如何将已有mdf文件导入到SQL 2000 或者 SQL 2005
  4. ASP生成随机密码的源代码
  5. Redis允许远程访问
  6. 2020总结--惟愿人间花满天
  7. windows下网络丢包模拟软件(Network Emulator for Windows Toolkit)
  8. 面试题目--MPEG4与H.264的区别
  9. 用好 Java 中的枚举,真的没有那么简单!
  10. 这个程序员如何以一己之力阻止了 Bug 代码的提交并改变整个 DevOps 世界?