一种特征选择算法。

BorutaShap的Python项目详细描述


PyPI version

勃鲁塔形状

BorutaShap是一种结合了Boruta特征选择算法和shapley值的包装器特征选择方法。这种组合方法在速度和特征子集质量上都优于原来的置换重要性方法。该算法不仅提供了一个更好的特征子集,而且可以同时提供最精确和一致的全局特征排名,可用于模型推理。与基于树的学习者选择任意形状树不同的是,用户可以在基于树的模型中选择任意形状。在

尽管BorutaShap对运行时进行了改进,但SHAP TreeExplainer随观测值的数量呈线性增长,因此对于大型数据集来说,它的使用非常麻烦。为了解决这一问题,BorutaShap包含了一个采样过程,该过程使用算法每次迭代时可用的最小可能子样本。它通过比较样本的隔离林产生的分布和使用ks检验的数据来找到这个样本。从实验来看,这个过程可以将运行时间减少到80%,同时仍然可以创建整个数据集的有效近似值。即使有了这些改进,用户仍可能需要一个更快的解决方案,因此BorutaShap已经包含了一个使用基尼杂质平均减少量的选项。这个重要性度量独立于数据集的大小,因为它使用树的结构来计算全局特征排序,使得它在较大的数据集中比SHAP快得多。尽管这个度量返回了一些可比较的特性子集,但它并不是一个可靠的度量全局特性重要性的方法,尽管它被广泛使用。因此,我建议尽可能使用SHAP度量。在

算法

  1. 首先创建数据集中所有特性的新副本,并将它们命名为shadow+feature_name,然后对这些新添加的特性进行无序处理,以消除它们与响应变量的相关性。在

  2. 对包含随机阴影特征的扩展数据运行分类器。然后使用特征重要性度量对特征进行排序,原始算法使用置换重要性作为其选择的度量。在

  3. 使用阴影特征的最大重要性得分创建一个阈值。然后为超过此阈值的任何特性分配命中率。在

  4. 对于每一个未赋值的特征,进行一个双侧T检验。在

  5. 重要度显著低于阈值的属性被视为“不重要”,并将其从流程中移除。将重要性显著高于阈值的属性视为“重要”。在

  6. 移除所有阴影属性并重复此过程,直到为每个特征指定了重要性,或者算法达到了先前设置的运行限制。在

如果算法已达到其设定的运行限制,并且没有为每个功能分配重要性,则用户有两个选择。要么增加运行次数,要么使用试探性的粗略修复函数,该函数比较未分配特征和最大阴影特征之间的中间重要性值,以作出决定。在

安装

使用包管理器pip安装foobar。在

pip install BorutaShap

使用

对于更多的用例,例如替代模型、抽样或更改重要性度量,请查看笔记本here。在

使用Shap和基本随机森林

^{pr2}$
# no model selected default is Random Forest, if classification is True it is a Classification problemFeature_Selector=BorutaShap(importance_measure='shap',classification=False)'''Sample: Boolean	if true then a rowise sample of the data will be used to calculate the feature importance valuessample_fraction: float	The sample fraction of the original data used in calculating the feature importance values only        used if Sample==True.train_or_test: string	Decides whether the feature improtance should be calculated on out of sample data see the dicussion here.        https://compstat-lmu.github.io/iml_methods_limitations/pfi-data.html#introduction-to-test-vs.training-datanormalize: boolean            if true the importance values will be normalized using the z-score formulaverbose: Boolean	a flag indicator to print out all the rejected or accepted features.'''Feature_Selector.fit(X=X,y=y,n_trials=100,sample=False,train_or_test='test',normalize=True,verbose=True)
# Returns Boxplot of featuresFeature_Selector.plot(which_features='all')
# Returns a subset of the original data with the selected featuressubset=Feature_Selector.Subset()

将BorutaShap与另一款XGBoost

fromBorutaShapimportBorutaShap,load_datafromxgboostimportXGBClassifierX,y=load_data(data_type='classification')X.head()
model=XGBClassifier()# if classification is False it is a Regression problemFeature_Selector=BorutaShap(model=model,importance_measure='shap',classification=True)Feature_Selector.fit(X=X,y=y,n_trials=100,sample=False,train_or_test='test',normalize=True,verbose=True)
# Returns Boxplot of featuresFeature_Selector.plot(which_features='all')
# Returns a subset of the original data with the selected featuressubset=Feature_Selector.Subset()

贡献

欢迎拉取请求。对于重大变化,请先打开一个问题来讨论什么哟你想改变。在

许可证

MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java调用外部进程exe   java跨源请求阻止Spring REST服务+AJAX   运行Eclipse创建的JAR时未显示java图像   带有自定义适配器的TimerTask期间的java更新列表视图   Java Netbeans 7.01中的swing注册表单空指针异常   java如何向所有HttpClient请求方法添加参数?   为什么在将json映射到JavaBean的过程中,Spring MVC将参数[“”]转换为[null]?   创建名为“messageDispatcher”的bean时发生java错误   java Apache骆驼线程JDBC   java Spring引导请求添加bean,即使存在   java如何以正确的方式编写单例?   JavaSpringBoot试图使用@JsonTest注释在测试中创建mongo存储库   java Android将gmt时间转换为可读日期   java“Serializable无法解析为类型”   spring我可以在Java注释中使用ScopedProxy模式时访问JobExecutionContext吗   java slf4j apache tomcat eclipse   通过HashMap的java循环   java无法在两个活动之间更改TextView?