boruta特征选择的python实现
Boruta的Python项目详细描述
Boruta_py
此项目托管了boruta所有相关功能选择方法的python实现
[相关博文](http://danielhomola.com/2015/05/08/borutapy-an-all-relevant-feature-selection-method/)
依赖关系
- 努比
- scipy
- SCIKIT学习
如何使用
下载、导入并执行与任何其他scikit学习方法相同的操作:
- 适合(X,Y)
- 变换(x)
- 拟合变换(x,y)
说明
Boruta R包的Python实现。
这个实现试图模拟scikit学习接口,所以使用fit, 变换或拟合变换,以运行功能选择。
有关更多信息,请参阅这些函数的文档和下面的示例。
原始代码和方法作者:Miron B Kursa,https://m2.icm.edu.pl/boruta/
Boruta是一种全相关的特征选择方法,而大多数其他方法都是 最小最优;这意味着它试图找到所有带有 可用于预测的信息,而不是找到可能的压缩 某些分类器误差最小的特征子集。
为什么要费心选择所有相关的功能? 当你试图理解产生数据的现象时,你应该 关心所有导致它的因素,而不仅仅是最明显的迹象 在你的方法论背景下(是的,最小的最佳特性集 根据定义,取决于分类器的选择。
波鲁塔派有什么不同?
它是用python重新编码的原始r包,并增加了一些额外的特性。 一些改进包括:
得益于scikit learn,更快的运行时间
scikit类学习界面
与scikit learn中的任何集成方法兼容
自动n_估计器选择
功能排序
有关详细信息,请查看文档字符串的顶部。
我们强烈建议使用深度在3-7之间的修剪过的树。
另外,在对原始代码进行了大量的研究之后,我确定了几个方面 其中核心算法可以改进/修改以使其不那么严格 更适用于生物数据,其中Bonferroni校正可能是 过于苛刻。
百分比作为阈值 原始方法使用阴影特征的最大值作为 决定哪一个真实的特征比影子的更好。这可能是 过于苛刻。
为了控制这个,我添加了perc参数,它设置 阴影特征重要性的百分位数,该算法用作 门槛。默认值为100,等于取最大值作为 R版的Boruta有,但可以放松。注意,因为这是 百分比,它随数据集的大小而变化。有几千个 它的功能不像Boruta跑步结束时的几十个那样严格。
多次测试的两步校正
将多次测试的校正简化为两步
过程,而不是严格的一步Bonferroni校正。
我们需要首先纠正,因为在每次迭代中,我们测试了 与零假设相反的特性(特性是否比 随机的)。为此,在原始的 已知在这种情况下过于严格的代码(至少对于 生物数据),以及原始代码修正n个特征,即使 我们在第50次迭代中只剩下k<;<;n个特性。为此 校正的第一步是广泛使用的Benjamini Hochberg FDR。
在那之后不过,我们也需要解释一下 在每次迭代中使用 同样的测试。在这种情况下,Bonferroni是完美的,因此它被应用于 用当前迭代索引偏离p值阈值。
如果不需要此两步校正,则必须使用 设置为false,则(perc=100)borutapy的行为与r版本完全相同。
参数
估计器:对象
< Buff行情>一种有监督的学习估计器,其"拟合"方法返回 重要特性。重要特征必须与 功能重要性中的高绝对值。
n_估计量:int或string,默认值=1000
< Buff行情>如果int设置所选系综方法中的估计数。 如果"auto",则根据 数据集。所用估计器的其他参数需要设置 初始化。
perc:int,默认值=100
< Buff行情>我们使用用户定义的百分比代替最大值来选择 我们比较阴影和真实特征的阈值。最大值 往往过于严格。这提供了一个更好的控制。这个 perc越低,误报率越高,但 此外,不太相关的功能也将被忽略。通常的权衡。 默认值基本上是香草波鲁塔,对应于最大值。
alpha:浮点,默认值=0.05
< Buff行情>校正后的p值在两次校正中均被拒绝的水平 步骤:
两步:布尔值,默认值=真
< Buff行情>如果您想使用Boruta与Bonferroni的原始实现 更正仅将此设置为false。
最大值:int,默认值=100
< Buff行情>要执行的最大迭代次数。
详细:int,默认值=0
< Buff行情>控制输出的详细程度。
属性
n_功能:int
< Buff行情>选定功能的数量。
支持:形状数组[n_功能]
< Buff行情>所选功能的掩码-只有确认的功能才为真。
支持弱:形状数组[n_功能]
< Buff行情>选定的尝试性特征的掩码,尚未获得足够的信息 在最大迭代次数期间支持..
排名:形状数组[n_特征]
< Buff行情>特征排序,使得排序与
第i个功能的排名位置。选定(即,估计
最佳)特征被分配到等级1和暂定特征被分配
等级2,
示例
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from boruta import BorutaPy
# load X and y
# NOTE BorutaPy accepts numpy arrays only, hence the .values attribute
X = pd.read_csv('examples/test_X.csv', index_col=0).values
y = pd.read_csv('examples/test_y.csv', header=None, index_col=0).values
y = y.ravel()
# define random forest classifier, with utilising all cores and
# sampling in proportion to y labels
rf = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5)
# define Boruta feature selection method
feat_selector = BorutaPy(rf, n_estimators='auto', verbose=2, random_state=1)
# find all relevant features - 5 features should be selected
feat_selector.fit(X, y)
# check selected features - first 5 features are selected
feat_selector.support_
# check ranking of features
feat_selector.ranking_
# call transform() on X to filter it down to selected features
X_filtered = feat_selector.transform(X)
参考文献
- Kursa M.,Rudnicki W.,"Boruta软件包的功能选择",统计软件杂志,第36卷,第11期,2010年9月