Hay una propuesta para implementar esto en Sklearn
#15075, pero mientras tanto, eli5
se sugiere como solución. Sin embargo, no estoy seguro de si lo estoy usando de la manera correcta. Este es mi código:
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_'
Hay algunos problemas:
No estoy seguro si estoy usando la validación cruzada de la manera correcta. PermutationImportance
está utilizando cv
para validar la importancia en el conjunto de validación, o la validación cruzada debe ser solo con RFECV
? (en el ejemplo, usé cv=3
en ambos casos, pero no estoy seguro si eso es lo correcto)
Si elimino el comentario de la última línea, obtendré un AttributeError: 'PermutationImportance'...
¿es esto porque encajo usando RFECV
? lo que estoy haciendo es similar al último fragmento aquí: https://eli5.readthedocs.io/en/latest/blackbox/permutation_importance.html
cv
como un problema menos importante, esto me da una advertencia cuando configuro eli5.sklearn.PermutationImportance
:
.../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 "
Todo el proceso es un poco vago. ¿Hay alguna manera de hacerlo directamente en Sklearn
? por ejemplo, mediante la adición de un feature_importances
atributo?
Solución del problema
Dado que el objetivo es seleccionar el número óptimo de funciones con importancia de permutación y eliminación recursiva de funciones, sugiero usar RFECV
y PermutationImportance
junto con un divisor de CV como KFold
. El código entonces podría verse así:
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_)
Con respecto a sus problemas:
PermutationImportance
calculará la importancia de la característica y RFECV
la puntuación r2 con la misma estrategia de acuerdo con las divisiones proporcionadas por KFold
.
Llamaste al objeto show_weights
no ajustado. PermutationImportance
Por eso tienes un error. En su lugar, debe acceder al objeto ajustado con el estimator_
atributo.
Se puede ignorar.
No hay comentarios:
Publicar un comentario