特征选择

特征选择简介

特征选择(Feature Selection) 在机器学习当中通常指在构建模型之前,从原本很多的特征当中,选择更富有信息更能做出好的预测结果的特征,即一个特征数量从多到少的过程。与之对应的是特征工程,在原本不多的特征当中,通过各种方法,生成更多更好的特征,即一个特征数量少到多的过程。本文主要讨论特征选择的策略和方法,其他降维技术如PCA, t-SNE不在本文讨论之列。

特征选择的前提是训练数据包含许多冗余或无关的特征,因而移除这些特征并不会导致丢失信息。当我们说某个特征冗余这里并不代表这个特征无用,但如果这个特征与另一个有用特征强相关,且那个特征也出现在数据中,比如特征X1和X2线性相关,且X1是个好特征,那么X2的存在本身就是冗余的, 即使X2也是一个好特征,我们没必要两个都留着,X1和X2挑一个选择就可以了。无关这里是指某些变量完全和预测结果没关系,或者是某些特征的方差特别低,比如一整列都是1,那这一类特征我们就都可以扔掉,因为他们为我们提供不了任何有用的信息。

特征选择的目的主要有三个:

  1. 简化模型,易于理解,高维度数据的问题详见维度灾难
  2. 优化模型训练速度。
  3. 改善通用性(Generalization)、降低过拟合。

特征选择的策略

特征的选择从目标上看分为有监督和无监督,从变量上分为单特征分析和多特征分析。以下方法默认已经通过背景知识(Domain Knowledge)进行了初步的特征选择。

单特征分析多特征分析
有监督相关性分析(特征与目标的关系)GBM,随机森林
无监督方差分析, 相关性分析(特征与特征间的关系)LASSO 回归

特征选择的方法

名称:相关性分析

过程:对比单个特征和目标的相关性,或者两个特征之间的相关性来判断改特征是否冗余。相关性包括线性相关(Pearson correlation coefficient)和非线性相关(Spearman’s rank correlation coefficient)。比如某个特征X1和目标Y之间不存在任何线性或者非线性的相关性,那么就可以把这个特征抛弃。或者某两个特征X1,X2之间存在强相关,那么同理可以抛弃一个留下一个,具体抛弃哪个需要具体分析,一般情况下可以参照LASSO回归的结果并结合背景知识,甚至随机丢弃一个。实践上并不会产生较大的区别。

优点:可解释性强;开发难度低。

缺点:并没有考虑多特征之间的关系,或许某个特征单独并不和目标相关,但是与其他特征的组合起来和目标强相关。

常用函数:pandas.DataFrame.corr(method='pearson','kendall','spearman')


名称:方差分析

过程:查看单个特征的方差,并设置阈值,将阈值以下的特征抛弃。阈值的选择可以采用“手肘选择法”(Elbow Method)

优点:可解释性强;开发难度低;可以快速降低特征数量;阈值选择并无较好的方法。

缺点:并没有考虑多特征之间的关系。

常用函数:sklearn.feature_selection.VarianceThreshold(threshold=0.0)


名称:GBM,随机森林

过程:通过GBM或者随机森林使用所有特征对目标建模,然后将特征重要性(Feature importance)从高到底排列并设置阈值,将阈值以下的特征抛弃。对于特征重要性的计算方法依模型和机器学习库的不同而不同;sklearn 使用基尼重要性(Gini importance)来计算, 即该特征带来的标准(信息增益、基尼指数)减少的总和(需要经过标准化),因为经过标准化,该基尼重要性对于所有的特征的和为1;除非该随机森林的所有子树只有一个节点,则该重要性为一堆0。

优点:考虑到了多特征之间的关系。

缺点:开发、运行速度较慢;阈值选择并无较好的方法。

常用函数:

sklearn.ensemble.RandomForestClassifier.feature_importances_

h2o.estimators import H2OGradientBoostingEstimator.permutation_importance()

名称: LASSO 回归

过程:建立一个线性模型并使用L1正则化,利用L1正则化的特性来为我们选择特征。

具体过程,和数学细节可以看这篇文章

优点:开发速度快,往往在没有更好选择的情况下可以有比较好的效果。

缺点:丢掉的特征可能需要参照Ridge回归的结果来判断是否真的要丢弃。

常用函数:sklearn.linear_model.Lasso

推荐流程

  1. 使用背景知识和单特征方差进行初步的筛选。
  2. 对于余下的特征使用Lasso回归进行选择。
  3. 将余下的特征使用GBM或者随机森林进行特征重要性的排序,选出Top N进行建模。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇