Python特征选择神器BorutaPy的完整使用指南
BorutaPy是Boruta特征选择方法的Python实现,它是一个全相关特征选择算法,与大多数最小最优特征选择方法不同。Boruta致力于找到所有对预测有用的特征,而不仅仅是找到一个在某种分类器上误差最小的可能紧凑特征子集。
项目概述
BorutaPy项目提供了Boruta特征选择方法的Python实现,该项目遵循scikit-learn的接口设计,使得用户可以像使用其他scikit-learn方法一样使用它。
安装方法
使用pip安装
pip install Boruta
使用conda安装
conda install -c conda-forge boruta_py
依赖环境
BorutaPy需要以下Python库的支持:
- numpy >= 1.10.4
- scikit-learn >= 0.17.1
- scipy >= 0.17.0
核心功能
BorutaPy类的主要方法
BorutaPy类提供了三个主要方法,与scikit-learn接口保持一致:
fit(X, y): 在提供的数据上训练特征选择器transform(X): 将输入数据转换为选定的特征fit_transform(X, y): 训练特征选择器并转换数据
参数详解
estimator: 对象
一个监督学习估计器,具有返回feature_importances_属性的'fit'方法。重要特征必须对应feature_importances_中的高绝对值。
n_estimators: 整数或字符串,默认=1000
如果是整数,设置所选集成方法中的估计器数量。如果是'auto',则根据数据集的大小自动确定。
perc: 整数,默认=100
使用用户定义的百分位数来选择阴影特征和真实特征之间的比较阈值,而不是使用最大值。最大值往往过于严格,这提供了更精细的控制。
alpha: 浮点数,默认=0.05
在两个校正步骤中拒绝校正p值的水平。
two_step: 布尔值,默认=True
如果您只想使用具有Bonferroni校正的Boruta原始实现,请将其设置为False。
max_iter: 整数,默认=100
执行的最大迭代次数。
verbose: 整数,默认=0
控制输出的详细程度。
使用示例
以下是一个完整的使用示例,展示如何使用BorutaPy进行特征选择:
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from boruta import BorutaPy
# 加载X和y
# 注意:BorutaPy只接受numpy数组,因此需要使用.values属性
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()
# 定义随机森林分类器,利用所有核心并按y标签比例进行采样
rf = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5)
# 定义Boruta特征选择方法
feat_selector = BorutaPy(rf, n_estimators='auto', verbose=2, random_state=1)
# 找到所有相关特征 - 应该选择5个特征
feat_selector.fit(X, y)
# 检查选定的特征 - 前5个特征被选中
print(feat_selector.support_)
# 检查特征排名
print(feat_selector.ranking_)
# 对X调用transform()以将其过滤为选定的特征
X_filtered = feat_selector.transform(X)
核心优势
相比原始R包的改进
BorutaPy相比原始R包实现具有多个重要改进:
更快的运行时间:得益于scikit-learn的快速集成方法实现
类scikit-learn接口:可以像其他scikit-learn学习器一样使用BorutaPy
模块化设计:可以使用任何集成方法:随机森林、极端随机树分类器,甚至梯度提升树
两步校正:原始Boruta代码以过于保守的方式进行多重测试校正。在此实现中,使用Benjamini Hochberg FDR在每个迭代中对活跃特征进行校正。
百分位数阈值:用户可指定使用哪个百分位数,而不是使用阴影特征的最大值。
自动树数确定:将n_estimator设置为'auto'将根据正在调查的特征数量计算每次迭代中的树数。
特征排名:拟合BorutaPy后,它会为用户提供特征排名。
属性说明
n_features_ : 整数
选定特征的数量。
support_ : 形状为[n_features]的数组
选定特征的掩码 - 只有已确认的特征为True。
support_weak_ : 形状为[n_features]的数组
选定暂定特征的掩码,这些特征在max_iter次迭代期间未能获得足够的支持。
ranking_ : 形状为[n_features]的数组
特征排名,使得
ranking_[i]对应于第i个特征的排名位置。选定特征被分配为排名1,暂定特征被分配为排名2。
使用建议
我们强烈建议使用深度在3-7之间的修剪树。经过大量实验,我们发现使用原始代码时,Bonferroni校正可能过于严格,特别是在生物数据中。
百分位数作为阈值
原始方法使用阴影特征的最大值作为阈值,决定哪些真实特征比阴影特征表现更好。这可能过于严格。
为了控制这一点,我们添加了perc参数,它设置算法用作阈值的阴影特征重要性的百分位数。默认值100相当于取最大值,就像R版本的Boruta一样,但它可以放宽。
多重测试的两步校正
通过使其成为两步过程而不是严格的单步Bonferroni校正,放宽了多重测试的校正。
我们首先需要校正,因为在每次迭代中,我们测试许多特征与零假设。为此,原始代码中使用了Bonferroni校正,已知在这种情况下过于严格。
技术细节
BorutaPy使用随机森林算法创建"影子特征",通过与这些随机生成的特征比较来判断真实特征的重要性。这种方法能够有效避免过拟合,找到真正对预测有贡献的特征。
该实现特别适合处理高维数据,能够在大规模特征集中准确识别出相关信息。
总结
BorutaPy是一个强大而灵活的特征选择工具,特别适合需要理解数据背后现象的应用场景。与最小最优特征选择方法不同,它致力于找到所有对预测有贡献的因素,而不仅仅是在特定分类器上误差最小的特征子集。
通过其改进的算法设计和用户友好的接口,BorutaPy为Python用户提供了一个高效可靠的特征选择解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



