常用的特征选取方法

一、去掉取值变化小的特征

考察某个特征下,样本的方差值,可以人为给定一个阈值,抛开那些小于这个阈值的特征。

二、单变量特征选择

单变量特征选择的出发点是计算某一特征和分类变量之间的关系,以此计算每一特征的得分,抛开那些排名靠后的特征。比较经典的方法是卡方检验。

  • peason相关系数,缺点:只对线性相关系数敏感。优点:距离相关系数比较,第一、Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。第二、Pearson相关系数的取值区间是[-1,1],距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。Pearson相关系数等价于线性回归里的标准化回归系数。

  • 基于学习模型的特征排序

    这种方法的思路是直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。

线性模型和正则化

单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,另一种主流的特征选择方法是基于机器学习模型的方法。可以对特征打分叫做wrapper类型,不能打分的称为filter类型。

多重共线性:多个互相关联的特征,这时候模型就会变得不稳定,数据中细微的变化就可能导致模型的巨大变化,这会让模型的预测变得困难。

  • 正则化模型

正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。

L2正则化将系数向量的L2范数添加到了损失函数中。由于L2惩罚项中系数是二次方的,这使得L2和L1有着诸多差异,最明显一点就是,L2正则化会让系数的取值变得平均。对于关联特征,这意味着他们能够获得更相近的对应系数。还是以Y=X1+X2为例,假设X1和X2具有很强的关联,如果用L1正则化,不论学到的模型是Y=X1+X2还是Y=2X1,惩罚都是一样的,都是2alpha。但是对于L2来说,第一个模型的惩罚项是2alpha,但第二个模型的是4*alpha。可以看出,系数之和为常数时,各系数相等时惩罚是最小的,所以才有了L2会让各个系数趋于相同的特点。

可以看出,L2正则化对于特征选择来说一种稳定的模型,不像L1正则化那样,系数会因为细微的数据变化而波动。所以L2正则化和L1正则化提供的价值是不同的,L2正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。

from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
size = 100#We run the method 10 times with different random seeds
for i in range(10):print "Random seed %s" % inp.random.seed(seed=i)X_seed = np.random.normal(0, 1, size)X1 = X_seed + np.random.normal(0, .1, size)X2 = X_seed + np.random.normal(0, .1, size)X3 = X_seed + np.random.normal(0, .1, size)Y = X1 + X2 + X3 + np.random.normal(0, 1, size)X = np.array([X1, X2, X3]).Tlr = LinearRegression()lr.fit(X,Y)print "Linear model:", pretty_print_linear(lr.coef_)#####################
#沟通交流Q群 116712023
#####################

随机森林

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

  • 平均不纯度减少

这里特征得分实际上采用的是Gini Importance。使用基于不纯度的方法的时候,要记住:1、这种方法存在偏向,对具有更多类别的变量会更有利;2、对于存在关联的多个特征,其中任意一个都可以作为指示器(优秀的特征),并且一旦某个特征被选择之后,其他特征的重要度就会急剧下降,因为不纯度已经被选中的那个特征降下来了,其他的特征就很难再降低那么多不纯度了,这样一来,只有先被选中的那个特征重要度很高,其他的关联特征重要度往往较低。在理解数据时,这就会造成误解,导致错误的认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用确实非常接近的(这跟Lasso是很像的)。

需要注意的一点是,关联特征的打分存在不稳定的现象,这不仅仅是随机森林特有的,大多数基于模型的特征选择方法都存在这个问题。

  • 平均精确率减少

另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。

from sklearn.cross_validation import ShuffleSplit
from sklearn.metrics import r2_score
from collections import defaultdictX = boston["data"]
Y = boston["target"]rf = RandomForestRegressor()
scores = defaultdict(list)#crossvalidate the scores on a number of different random splits of the data
for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):X_train, X_test = X[train_idx], X[test_idx]Y_train, Y_test = Y[train_idx], Y[test_idx]r = rf.fit(X_train, Y_train)acc = r2_score(Y_test, rf.predict(X_test))for i in range(X.shape[1]):X_t = X_test.copy()np.random.shuffle(X_t[:, i])shuff_acc = r2_score(Y_test, rf.predict(X_t))scores[names[i]].append((acc-shuff_acc)/acc)
print "Features sorted by their score:"
print sorted([(round(np.mean(score), 4), feat) forfeat, score in scores.items()], reverse=True)
#####################
#沟通交流Q群 116712023
#####################

两种顶层特征算法特征选择

  • 稳定性选择

稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。

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)#####################
#沟通交流Q群 116712023
#####################
  • 递归特征消除

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

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))#####################
#沟通交流Q群 116712023
#####################

总结:

  • 对于理解数据、数据的结构、特点来说,单变量特征选择是个非常好的选择。尽管可以用它对特征进行排序来优化模型,但由于它不能发现冗余(例如假如一个特征子集,其中的特征之间具有很强的关联,那么从中选择最优的特征时就很难考虑到冗余的问题)。
  • 正则化的线性模型对于特征理解和特征选择来说是非常强大的工具。L1正则化能够生成稀疏的模型,对于选择特征子集来说非常有用;相比起L1正则化,L2正则化的表现更加稳定,由于有用的特征往往对应系数非零,因此L2正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用basis expansion的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。
  • 随机森林是一种非常流行的特征选择方法,它易于使用,一般不需要feature engineering、调参等繁琐的步骤,并且很多工具包都提供了平均不纯度下降方法。
    它的两个主要问题,1.重要的特征有可能得分很低(关联特征问题),2.这种方法对特征变量类别多的特征越有利(偏向问题)。尽管如此,这种方法仍然非常值得试一试。
  • 特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

欢迎各位大佬加群一起分享交流特征选取的更多经验~笔芯!

常用特征选取算法(转载)相关推荐

  1. [转载]SIFT(尺度不变特征变换)算法小结

    原文地址:SIFT(尺度不变特征变换)算法小结[转]作者:慕容天峰 最近一直在看SIFT算法.Sift是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善.S ...

  2. ML之FE:机器学习算法/数据挖掘中特征选取(变量筛选)的简介、常用方法(单变量分析并筛选—Filter/Wrapper/Embedded、多变量间相关性分析并筛选—PCC/MIC/IV)之详细攻略

    ML之FE:机器学习算法/数据挖掘中特征选取(变量筛选)的简介.常用方法(单变量分析并筛选-Filter/Wrapper/Embedded.多变量间相关性分析并筛选-PCC/MIC/IV)之详细攻略 ...

  3. 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一

    题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相 ...

  4. 算法总结---最常用的五大算法(算法题思路)

    算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...

  5. 常用特征工程方法总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 摘要:对于数据挖掘项目,本文将学习应该从哪些角度做特征工程?从哪些 ...

  6. 常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度                                           1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...

  7. 机器学习常用特征筛选方法

    文章目录 背景题目 特征筛选 Filter过滤法 方差过滤 相关性过滤 卡方过滤 F检验 互信息 灰色关联度分析(GRA) Wrapper包装法 Embedded嵌入法 使用SelectFromMod ...

  8. 【论文笔记】李盟, et al. 一种恶意代码特征选取和建模方法. 计算机应用与软件 08(2015):272-277.

    前言 论文笔记. 论文笔记 出处及年份 <计算机应用与软件 Computer Applications and SoftwareVol.>第32卷第8期2015年8月 论文标题 一种恶意代 ...

  9. C语言常用13种算法附源码

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105147802 常 ...

最新文章

  1. 极限编程 (Extreme Programming) - 迭代计划 (Iterative Planning)
  2. linux更换主板后无法启动网卡
  3. Cannot load 32-bit SWT libraries on 64-bit JVM
  4. 关于UIEdgeInsetsMake
  5. C和C++线性表基本概念
  6. 概率占据图(POM)算法理解
  7. Opencv 图像增强算法 图像检测结果及代码
  8. 60级怀旧服最新服务器人口排名,魔兽世界怀旧服10月最新人口普查详情 各大服务器阵营详细比例...
  9. 初学shell,今天遇到由wget下载到本地的网页源代码的乱码问题,无聊的写了一个转码的脚本...
  10. Java——can U do
  11. 【生信进阶练习1000days】day4-Annotation包中mapIds函数的使用
  12. ae万能弹性表达式_干货丨AE表达式知多少?4大常用表示式解决80%难题
  13. 铁路铁鞋UWB定位系统
  14. matlab 求股票斜率,股票线性回归斜率公式
  15. java bean ejb_EJB:企业JavaBean - 解道jdon
  16. Docker Desktop启动失败(Docker failed to initialize Docker Desktop is shutting down)
  17. 洛谷P1567 统计天数
  18. html点击超链接启动邮件客户端创建电子邮件
  19. try 和 catch 用法
  20. mysql客户端连接10060,Navicat远程连接MySQL出现10060解决办法小结

热门文章

  1. javascript语言简介
  2. 国美金融贷款进行内存管理,国美金融贷款负责分配和回收
  3. 电动汽车起火事故显著增加,再次说明能买燃油车就别买电动汽车
  4. 输入直角三角形的两直角边求斜边长
  5. 【销售易】计算字段函数拼接
  6. scrapy与mongoDB完美结合
  7. 3-1 郭老师的冰糖葫芦 c++
  8. 讯飞语音唤醒SDK集成流程
  9. 科技云报道:2022年,企业级科技将如何重塑世界新面貌?
  10. js复习:输出语句,js要不要写标点符号,let ,const(常量),JavaScript 数组,JavaScript 对象