使用 RFECV 和排列重要性的正确方法 - Sklearn
Right way to use RFECV and Permutation Importance - Sklearn
在 Sklearn
#15075 中提出了实施此方案的建议,但与此同时,建议将 eli5
作为解决方案。但是,我不确定我是否以正确的方式使用它。这是我的代码:
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
import eli5
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
perm = eli5.sklearn.PermutationImportance(estimator, scoring='r2', n_iter=10, random_state=42, cv=3)
selector = RFECV(perm, step=1, min_features_to_select=1, scoring='r2', cv=3)
selector = selector.fit(X, y)
selector.ranking_
#eli5.show_weights(perm) # fails: AttributeError: 'PermutationImportance' object has no attribute 'feature_importances_'
有几个问题:
我不确定我是否以正确的方式使用交叉验证。 PermutationImportance
正在使用 cv
来验证验证集的重要性,或者交叉验证应该只与 RFECV
一起使用? (在示例中,我在两种情况下都使用了 cv=3
,但不确定这样做是否正确)
如果我取消注释最后一行,我会得到一个 AttributeError: 'PermutationImportance' ...
这是因为我适合使用 RFECV
吗?我所做的与这里的最后一个片段类似:https://eli5.readthedocs.io/en/latest/blackbox/permutation_importance.html
作为一个不太重要的问题,当我在 eli5.sklearn.PermutationImportance
中设置 cv
时,这给了我一个警告:
.../lib/python3.8/site-packages/sklearn/utils/validation.py:68: FutureWarning: Pass classifier=False as keyword args. From version 0.25 passing these as positional arguments will result in an error warnings.warn("Pass {} as keyword args. From version 0.25 "
整个过程有点模糊。 有没有办法直接在 Sklearn
中执行此操作? 例如通过添加 feature_importances
属性?
由于 objective 是 select 具有排列重要性和递归特征消除的最佳特征数量,我建议结合使用 RFECV
和 PermutationImportance
像 KFold
这样的 CV 拆分器。代码可能如下所示:
import warnings
from eli5 import show_weights
from eli5.sklearn import PermutationImportance
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.model_selection import KFold
from sklearn.svm import SVR
warnings.filterwarnings("ignore", category=FutureWarning)
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
splitter = KFold(n_splits=3) # 3 folds as in the example
estimator = SVR(kernel="linear")
selector = RFECV(
PermutationImportance(estimator, scoring='r2', n_iter=10, random_state=42, cv=splitter),
cv=splitter,
scoring='r2',
step=1
)
selector = selector.fit(X, y)
selector.ranking_
show_weights(selector.estimator_)
关于您的问题:
PermutationImportance
会根据KFold
.
提供的splits,用同样的策略计算特征重要性和RFECV
r2得分
您在未拟合的 PermutationImportance
对象上调用了 show_weights
。这就是你出错的原因。您应该使用 estimator_
属性访问合适的对象。
可以忽略
在 Sklearn
#15075 中提出了实施此方案的建议,但与此同时,建议将 eli5
作为解决方案。但是,我不确定我是否以正确的方式使用它。这是我的代码:
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
import eli5
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
perm = eli5.sklearn.PermutationImportance(estimator, scoring='r2', n_iter=10, random_state=42, cv=3)
selector = RFECV(perm, step=1, min_features_to_select=1, scoring='r2', cv=3)
selector = selector.fit(X, y)
selector.ranking_
#eli5.show_weights(perm) # fails: AttributeError: 'PermutationImportance' object has no attribute 'feature_importances_'
有几个问题:
我不确定我是否以正确的方式使用交叉验证。
PermutationImportance
正在使用cv
来验证验证集的重要性,或者交叉验证应该只与RFECV
一起使用? (在示例中,我在两种情况下都使用了cv=3
,但不确定这样做是否正确)如果我取消注释最后一行,我会得到一个
AttributeError: 'PermutationImportance' ...
这是因为我适合使用RFECV
吗?我所做的与这里的最后一个片段类似:https://eli5.readthedocs.io/en/latest/blackbox/permutation_importance.html作为一个不太重要的问题,当我在
eli5.sklearn.PermutationImportance
中设置cv
时,这给了我一个警告:
.../lib/python3.8/site-packages/sklearn/utils/validation.py:68: FutureWarning: Pass classifier=False as keyword args. From version 0.25 passing these as positional arguments will result in an error warnings.warn("Pass {} as keyword args. From version 0.25 "
整个过程有点模糊。 有没有办法直接在 Sklearn
中执行此操作? 例如通过添加 feature_importances
属性?
由于 objective 是 select 具有排列重要性和递归特征消除的最佳特征数量,我建议结合使用 RFECV
和 PermutationImportance
像 KFold
这样的 CV 拆分器。代码可能如下所示:
import warnings
from eli5 import show_weights
from eli5.sklearn import PermutationImportance
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.model_selection import KFold
from sklearn.svm import SVR
warnings.filterwarnings("ignore", category=FutureWarning)
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
splitter = KFold(n_splits=3) # 3 folds as in the example
estimator = SVR(kernel="linear")
selector = RFECV(
PermutationImportance(estimator, scoring='r2', n_iter=10, random_state=42, cv=splitter),
cv=splitter,
scoring='r2',
step=1
)
selector = selector.fit(X, y)
selector.ranking_
show_weights(selector.estimator_)
关于您的问题:
提供的splits,用同样的策略计算特征重要性和PermutationImportance
会根据KFold
.RFECV
r2得分您在未拟合的
PermutationImportance
对象上调用了show_weights
。这就是你出错的原因。您应该使用estimator_
属性访问合适的对象。可以忽略