sklearn重的“特征选择”方法

背景

为什么用进行特征选择,个人理解主要包括以下几个方面:

1、减少特征数量可以防止维度灾难,降低算力的负担,减少训练时间;

2、增强模型泛化能力,降低模型过拟合的风险;

3、增强模型对特征维度和特征值的理解。

方法

特征选择的方法有很多,这里就基于sklearn中集成的feature_selection方法来进行讲解。

1、删除低方差的特征

先解释以下什么是“低方差”,所谓的低方差,也就说在一堆样本,计算所得到的方差值比较低,意味着这些样本的分布比较集中。同比,“高方差”也就是样本分布比较分散。而低方差特征删除的方法就是预先设置了某一个阈值,然后计算所有样本中不同特征的方差,将计算所得未达到阈值的特征进行剔除。也就是说保留下来的都是“高方差”(离散程度较高)的特征。

举个例子,假如我们有一个基于伯努利分布(0、1分布)的数据集,我们想要删除70%以上相同特征值的数据特征列(比如70%都是0),这里有个前提,我们认为样本重复的越多,特征对模型最终贡献度越低,所以要把这些特征删除。因为是基于伯努利分布,所以使用的方差计算方法采用如下公式:

二项式分布方差计算

基于公式和目标,我们的方差计算方法为0.7 x (1 - 0.7)。sklearn中调用的方法为“VarianceThreshold”。

2、单变量特征选择

sklearn给出的解释是我们可以把该方法理解为估算器的预处理步骤,然而对该解释我表示我很迷(内心千万只***奔腾而过)。然后往下看,发现官方给出了几个单变量选择的方法,如下所示:

1、SelectKBest :该方法需要传入两个参数score_func(特征打分结果),k(倒排后选择特征数量)

2、SelectPercentile :该方法需要传入两个参数score_func(特征打分结果),percentile(倒排后选择特征百分比)

3、GenericUnivariateSelect:该方法需要传入两个参数score_func(特征打分结果)mode(单变量统计检验方式),param(超参)

其中1和2中的特征打分方式官方已经进行了集成,只是需要玩家自行进行区分即可,结果如下:

对于回归:f_regressionmutual_info_regression

对于分类:chi2f_classifmutual_info_classif

第三种方法重的mode官方也给出了内置的方法{'percentile','k_best','fpr','fdr','fwe'}。

上述方法中的细节若展开内容太多,不是本篇幅的重点,若有需要请自行官网获取。

这里官网给出了一个重要的警示⚠️ :当心不要在分类问题上使用回归评分功能,您将获得无用的结果。

3、递归特征消除

先说一下“特征消除”,也就是通过某种方法对原有的特征进行剔除,然后使用剩下的特征。基于上述的条件下,引入递归的概念,也就是通过逐层筛选的形式,一个一个的将特征进行剔除。只不过这里不是随机删除,而是采用了特定属性(特征权重或特征重要度)的形式对其中影响因素不大的特征进行逐步剔除。这里官网采用的是RFE模型对其进行筛选,该模型对特征保留的方法主要是通过预设需要保留的特征数量或特征计算得分阈值来对特征进行保留判断。由于是采用的递归,该方法也可操作每一次迭代中需要删除的特征数量或需要删除的特征百分比来进行设定。具体的操作方法可参考递归特征消除API

而上述方法中有一个较大的弊端,就是人工提前的预设。如果我们不能很好的制定预设值,最终的剔除结果可能也不是最优的。官方给出了基于RFE的演进方法RFECV,也就是基于CV(交叉验证)的RFE。使用RFECF的时候,我们可以提前预设交叉验证的数量对RFE进行特征交叉计算,其交叉验证的方法可采用StratifiedKFold(KFold变种)进行计算,以达到自动计算最终需要保留的特征数量。

4、使用SelectFromModel特征选择

顾名思义,想要知道选择哪些特征,就需要通过模型训练之后才能知道。例如官网给出的例子,先使用数据集通过某个模型(lasso)进行训练得到训练的模型,再通过调用SelectFromModel方法传入模型,并预设想要保留的特征数量,在进行SelectFromModel计算,通过调用get_support方法就能够获取到最后计算出来的特征。官方还给出了另一个方法SequentialFeatureSelector,该方法采用前向或后项的贪心算法形式对特征进行交叉计算,并根据每一次计算的得分进行特征保留。

5、使用管道(pipeline)结合特征选择与模型

这里就不做解释了,直接上代码

clf = Pipeline([

        ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),

        ('classification', RandomForestClassifier())

])

clf.fit(X, y)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容