GOOGLE ADS

viernes, 22 de abril de 2022

Manera correcta de usar RFECV y Permutation Importance - Sklearn

Hay una propuesta para implementar esto en Sklearn #15075, pero mientras tanto, eli5se 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. PermutationImportanceestá utilizando cvpara validar la importancia en el conjunto de validación, o la validación cruzada debe ser solo con RFECV? (en el ejemplo, usé cv=3en 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


  • cvcomo 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_importancesatributo?


    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 RFECVy PermutationImportancejunto 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:

  • PermutationImportancecalculará la importancia de la característica y RFECVla puntuación r2 con la misma estrategia de acuerdo con las divisiones proporcionadas por KFold.


  • Llamaste al objeto show_weightsno ajustado. PermutationImportancePor 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

    Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

    Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...