Note:我已经看过 SelectFromModel与RFE在Scikit学习中的差异 post,我的查询与的帖子不同
期望:SelectFromModel和RFE在使用它们的建议构建的模型中具有相似/可比较的性能。
怀疑:是否有任何已知的用例可以让RFE表现得更好?作为一个数据科学的学生(刚刚开始学习),这对我来说是个奇怪的观察。
代码:
# RecursiveFeatureElimination_ExtraTreesClassifier
from sklearn.feature_selection import RFE
from sklearn.ensemble import ExtraTreesClassifier
rfe_selector = RFE(estimator=ExtraTreesClassifier(), n_features_to_select=20, step=10)
rfe_selector.fit(x_raw, y_raw)
[x[0] for x in pandas.Series(rfe_selector.support_, index=x_raw.columns.values).items() if x[1]]
# returns
['loan_amnt','funded_amnt','funded_amnt_inv','term','int_rate','installment','grade','sub_grade','dti','initial_list_status','out_prncp','out_prncp_inv','total_pymnt','total_pymnt_inv','total_rec_prncp','total_rec_int','recoveries','collection_recovery_fee','last_pymnt_amnt','next_pymnt_d']# SelectFromModel_ExtraTreesClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel
selector = SelectFromModel(ExtraTreesClassifier(n_estimators=100), max_features=20)
selector.fit(x_raw, y_raw)
[x[0] for x in pandas.Series(selector.get_support(), index=x_raw.columns.values).items() if x[1]]
# prints
['loan_amnt','funded_amnt','funded_amnt_inv','term','installment','out_prncp','out_prncp_inv','total_pymnt','total_pymnt_inv','total_rec_prncp','total_rec_int','recoveries','collection_recovery_fee','last_pymnt_d','last_pymnt_amnt','next_pymnt_d']模型列车和试验规范
# internal code to select what variables I want
x_train, y_train, x_test, y_test = get_train_test(var_set_type=4)
model = ExtraTreesClassifier()
model.fit(x_train, y_train)
# then just print the confusion matrix来自ExtraTreesClassifier变量的SelectFromModel模型

来自ExtraTreesClassifier变量的<#>RFE模型

我的混淆矩阵是由这个开源项目:DTrimarchi10 /混淆_矩阵提供的。
发布于 2020-11-01 18:14:59
首先,让我在这里重复一遍我已经回答了另一个关于递归特征选择可能不会产生更高的性能?是否:
简单地说,no保证任何类型的特性选择(向后、向前、递归--您可以将其命名)实际上都会带来更好的性能。一点也没有。这些工具的存在只是为了方便--它们可能起作用,也可能不起作用。最好的引导和最终的判断永远是实验。除了线性或logistic回归中的一些非常具体的情况外,最显著的是Lasso (并非巧合,实际上来自统计),或者一些带有太多特征的极端情况(也就是维度性的诅咒),即使它起作用(或不起作用),也不一定需要解释为什么(或为什么不)。
澄清这一点之后,让我们更详细地了解一下您的情况。
这里的特征选择程序没有考虑到模型的性能;在分类设置中,特征被视为“重要”或不重要的唯一标准是通过分割各自的特征实现基尼杂质的平均减少;关于某些背景,请参阅以下线索(虽然它们是关于随机森林的,但理由是相同的):
虽然人们常常含蓄地假定,使用这种重要性作为标准的特性的减少可能会导致性能度量的提高,但这绝不是确定的,也远不是简单明了的(我实际上是在这里重复我的介绍)。
考虑到这一点,这里的实际问题似乎应该是,为什么这两种方法最终会选择不同的特性,您已经链接到自己的线程SelectFromModel与在在Scikit学习中的差异可以说是相关的。无论如何,他们应该提供类似结果的期望是没有充分根据的;当特征从模型中移除时,相对特征的重要性会发生变化,因此它不能与SelectFromModel方法直接比较(使用所有特性,删除那些低于阈值的特性)。同样,问题是“是否有任何已知的用例可以使RFE更好?”是不正确的-你没有显示RFE总是差的,一个单一数据集和一个参数设置(例如no )的单个实验的结果。对于所需的特性和SelectFromModel所涉及的阈值,不应轻率地加以概括。
无论如何,基于吉尼重要性(杂质平均减少- MDI)选择特征已开始过时,主要是因为计算出的重要性在基数较高的范畴特征中是假的(见学术论文吉尼重要性的复兴?);事实上,在包含“经典”feature_importances属性的scikit学习分类器中已经有了相关的D19:
警告:基于杂质的特征输入可能会误导高基数特征(许多独特的值)。将
sklearn.inspection.permutation_importance作为一种替代方案。
关于一个具体的例子,请参阅scikit--学习小片段排列重要性与随机森林特征重要性(MDI)。
与确切问题无关,如果数据集中的类不平衡(看起来是这样),您可以(而且应该)使用class_weight参数ExtraTreesClassifier (文档)将模型更改为
ExtraTreesClassifier(class_weight='balanced')(h/t )请本·雷尼格发表建设性意见,帮助改进答案)
https://datascience.stackexchange.com/questions/84793
复制相似问题