原文:HTML
作者:Samuele Mazzanti


文章目录

  • 1. It all starts with X and y
  • 2. Why Boruta?
    • 2.1 The first idea: shadow features
    • 2.2 The second idea: binomial distribution
  • 3. Using BorutaPy in Python
  • 4. Conclusion

特征选择(Feature selection)是许多机器学习管道中的基本步骤。你希望从一堆候选特征中只选择相关的特征,而丢弃其他特征。目的是通过去除无用的特征来简化问题,这些特征会引入不必要的噪声(Occam’s razor)。

Boruta 是一个非常智能的算法,可追溯到2010年,旨在自动对数据集执行特征选择。最初它是作为R语言的一个包而诞生的。现在,已经有人开发出了Python版本的Boruta,称为Borutapy。

本文将从零开始实现Boruta的简单Python代码——我相信从零开始构建是真正理解它的最好方法——在文章的最后,介绍BorutaPy的使用。


1. It all starts with X and y

首先构造一个简单的数据集:3个特征 (age, height and weight),一个目标变量(income),每个变量有5个观察值。

import pandas as pd
### make X and y
X = pd.DataFrame({'age': [25, 32, 47, 51, 62],'height': [182, 176, 174, 168, 181],'weight': [75, 71, 78, 72, 86]})y = pd.Series([20, 32, 45, 55, 61], name = 'income')

已知年龄、身高和体重,预测一个人的收入。这看起来可能很荒谬(至少在理论上是这样的:在实践中,身高已经被证明与工资有关),但总的来说,不受个人偏见的影响是明智的。

现实生活中,我们必须处理3个以上的特征(通常从数百到数千)。因此,遍历每个特征并决定是否保留它是不可行的。而且,有些关系(例如非线性关系和交互作用)即使经过精确的分析也不容易被人眼察觉。

理想情况下,我们希望找到一种能够自主决定X的给定特征是否具有关于y的预测值的算法。


2. Why Boruta?

sklearn的SelectFromModel是一种流行的特征选择算法。基本上,选择一种便利模型(能够捕获非线性关系和交互,如随机森林)来拟合y。然后,从该模型中提取每个特征的重要性,并仅保留高于给定重要性阈值的特征

这听起来很合理,但是这种方法的弱点是不言而喻的:谁来确定阈值,如何确定?其中有很多随意性

Boruta提出了应对之策。 Boruta是一种特征选择算法,该算法基于统计基础,即使没有用户的任何特定输入,也能非常出色地工作。

Boruta基于两个绝妙的idea!

2.1 The first idea: shadow features

在Boruta中,原始特征之间不会相互竞争。相反,原始特征与shuffle后的特征(shadow features)竞争,这是第一个绝妙的主意

实际上,从X开始,通过随机shuffle每个特征来创建另一个数据帧。这些被打乱顺序的原始特征称为阴影特征(shadow features)。此时,阴影数据帧将附加到原始数据帧以获得新的数据帧(我们将其称为X_boruta),该数据帧的列数是X的列数的两倍。

import numpy as np
### make X_shadow by randomly permuting each column of X
np.random.seed(42)
X_shadow = X.apply(np.random.permutation)
X_shadow.columns = ['shadow_' + feat for feat in X.columns]
### make X_boruta by appending X_shadow to X
X_boruta = pd.concat([X, X_shadow], axis = 1)

在我们的案例中,这是X_boruta的样子:

然后,在X_boruta和y上拟合一个随机森林。

现在,我们将每个原始特征的重要性与阈值进行比较。这次,将阈值定义为阴影特征中记录的最高特征重要性。当特征的重要性高于此阈值时,这称为“命中(hit)”。想法是,仅当某项特征的性能优于最佳随机化特征时,它才有用

代码如下:

from sklearn.ensemble import RandomForestRegressor### fit a random forest (suggested max_depth between 3 and 7)
forest = RandomForestRegressor(max_depth = 5, random_state = 42)
forest.fit(X_boruta, y)### store feature importances
feat_imp_X = forest.feature_importances_[:len(X.columns)]
feat_imp_shadow = forest.feature_importances_[len(X.columns):]### compute hits
hits = feat_imp_X > feat_imp_shadow.max()

对于我们的数据集,结果为:

阈值为14%(最大为11%,14%和8%),因​​此有2个特征受到影响,即年龄和身高(分别为39%和19%),而体重(8%)的得分低于阈值

显然,我们应该丢弃体重(weight)特征,保留年龄和身高特征。有多大把握相信结果不是随机的呢?

这就是Boruta的第二个绝妙想法发挥作用的地方。

2.2 The second idea: binomial distribution

正如机器学习中经常发生的,关键是迭代。毫不奇怪,20个试验比1个试验更可靠,100个试验比20个试验更可靠。例如,重复上述过程20次。

### initialize hits counter
hits = np.zeros((len(X.columns)))
### repeat 20 times
for iter_ in range(20):### make X_shadow by randomly permuting each column of Xnp.random.seed(iter_)X_shadow = X.apply(np.random.permutation)X_boruta = pd.concat([X, X_shadow], axis = 1)### fit a random forest (suggested max_depth between 3 and 7)forest = RandomForestRegressor(max_depth = 5, random_state = 42)forest.fit(X_boruta, y)### store feature importancefeat_imp_X = forest.feature_importances_[:len(X.columns)]feat_imp_shadow = forest.feature_importances_[len(X.columns):]### compute hits for this trial and add to counterhits += (feat_imp_X > feat_imp_shadow.max())

结果如下:

现在,我们如何设置决策标准?这是Boruta所包含的第二个绝妙的idea。

让我们来看看一个特征(年龄,身高或体重),我们完全不知道它是否有用。我们将其保留的可能性是多少?有关特征的最大不确定性级别由50%的概率表示,例如抛硬币。由于每个独立实验都可以给出二进制结果(命中或不命中),因此一系列n次试验遵循二项式分布(binomial distribution)。

在Python中,二项式分布的概率质量函数计算如下:

import scipytrials = 20
pmf = [scipy.stats.binom.pmf(x, trials, .5) for x in range(trials + 1)]

Binomial distribution and positioning of the features.

在Boruta,拒绝和接受区域之间没有硬性规定。相反,有3个区域:

  • 拒绝区域(红色区域):此处结束的要素被视为噪音,因此将其丢弃;
  • 一个无法解决的区域(蓝色区域):Boruta对于该区域中的特征犹豫不决;
  • 可接受区域(绿色区域):此处的特征被认为是可预测的,因此将其保留。

通过选择分布的两个最极端部分(称为分布的尾部)来定义面积(在我们的示例中,每个尾部占分布的0.5%)。

因此,我们对数据进行了20次迭代,最后得出一些基于统计的结论:

  • 为了预测一个人的收入,年龄是可预测的,应该保持,体重只是噪音,应该降低;
  • Boruta对身高的决定犹豫不决:选择权取决于我们,但是在保守的框架内,建议保持身高。

在本段中,我们已经实现了必要的代码,但是存在一个出色的Python优化库Boruta。


3. Using BorutaPy in Python

Boruta可以通过pip安装:

!pip install boruta
from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor
import numpy as np
###initialize Boruta
forest = RandomForestRegressor(n_jobs = -1, max_depth = 5
)boruta = BorutaPy(estimator = forest, n_estimators = 'auto',max_iter = 100 # number of trials to perform
)### fit Boruta (it accepts np.array, not pd.DataFrame)
boruta.fit(np.array(X), np.array(y))### print results
green_area = X.columns[boruta.support_].to_list()
blue_area = X.columns[boruta.support_weak_].to_list()
print('features in the green area:', green_area)
print('features in the blue area:', blue_area)

存储在 boruta.support_ 中的特征是在某些时候最终位于接受区域中的特征,因此你应将它们包括在模型中。存储在 boruta.support_weak_ 中的特征是Boruta无法接受或拒绝的特征(蓝色区域),选择权取决于数据科学家:根据使用情况,这些特征是否可以接受。


4. Conclusion

特征选择是机器学习流程的决定性部分:过于保守意味着引入不必要的噪音,而过于激进则意味着丢弃有用的信息。

在本文中,我们已经看到了如何使用Boruta对数据集执行可靠的,基于统计的特征选择。实际上,对特征做出重大决策对于确保预测模型的成功至关重要。

Boruta:one of the most effective feature selection algorithms相关推荐

  1. R语言基于Boruta进行机器学习特征筛选(Feature Selection)

    R语言基于Boruta进行机器学习特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(f ...

  2. Feature Selection: A Data Perspective --阅读笔记1 特征选择的概述

    摘要 INTRODUCTION Traditional Categorization of Feature Selection Algorithms Feature Selection Algorit ...

  3. R语言的特征选择(Feature Selection)包:Boruta和caret

    转载自:http://www.zhizhihu.com/html/y2011/3188.html 对于大数据的分析,特征选择Feature Selection和降维是必不可少的,R有很多做FS的包,这 ...

  4. R语言使用caret包的findCorrelation函数批量删除相关性冗余特征、实现特征筛选(feature selection)、剔除高相关的变量

    R语言使用caret包的findCorrelation函数批量删除相关性冗余特征.实现特征筛选(feature selection).剔除高相关的变量 目录

  5. R语言基于随机森林进行特征选择(feature selection)

    R语言基于随机森林进行特征选择(feature selection) 目录 R语言基于随机森林进行特征选择(feature selection)

  6. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据

    R语言常用线性模型特征筛选(feature selection)技术实战 目录 R语言常用线性模型特征筛选(feature selection)技术实战

  7. R语言基于线性回归(Linear Regression)进行特征筛选(feature selection)

    R语言基于线性回归(Linear Regression)进行特征筛选(feature selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为&qu ...

  8. R语言基于LASSO进行特征筛选(feature selection)

    R语言基于LASSO进行特征筛选(feature selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featur ...

  9. R语言基于机器学习算法进行特征筛选(Feature Selection)

    R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...

最新文章

  1. oracle卸载注意啥,关于oracle的安装,卸载以及其他注意事项
  2. 【 MATLAB 】使用 impz 函数计算并画出脉冲响应
  3. 经典的代码风格-来自微软
  4. 字节跳动2019暑期实习生算法岗笔试题
  5. 网易云首届渠道大会:多媒体通信助力互联网+
  6. 一对经典的时间获取客户/服务器程序
  7. 动态规划——买卖股票的最好时机(Leetcode 121)
  8. python栈应用_栈应用之 后缀表达式计算 (python 版)
  9. win10系统远程ubuntu(linux)桌面
  10. NOD32 2.7、3.0最新升级ID 每天实时同步更新
  11. cass简码大全_南方CASS简码.doc
  12. PHP站群系统小旋风万能蜘蛛池x6.3源码 pojie不限授权
  13. 截止失真放大电路_这些基本放大器的知识,你会了吗?
  14. RxJava详细解析
  15. <C语言>诸葛亮猜数算法(二分法)
  16. 使用python画简单的图
  17. 菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。
  18. 中国风网站建设设计的2大要素
  19. 一个神奇的资源网站「有趣网站收藏家」共有186个站点资源-北忘山修改版
  20. 成功,取决于你和什么样的人在一起

热门文章

  1. 使用OrthoMCL鉴定直系同源基因组
  2. R5 2600到R5 5600的性能提升
  3. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(五)-几种工作模式的区别】
  4. 使用ls命令查看Linux的目录结构,linux查看工作目录文件ls命令用法详解
  5. Python+Numpy+CV2/GDAL实现对图像的Wallis匀色
  6. Serv-U15.1.5安装配置和外网访问使用
  7. 批处理系统作业调度c语言,单道批处理系统作业调度.doc
  8. AR模型中的自相关系数和偏自相关系数
  9. 《Mastering the game of Go with deep neural networks and tree search》
  10. html5绘制菱形,HTML5 canvas 菱形动画齿轮 - 开源中国