Skip to content

Output features lists for transformers #366

Description

@hectorpatino

Is your feature request related to a problem? Please describe.
Hola @solegalli voy a escribir este issue en español, primero que todo felicidades por el último realease, me ha dado un poco duro el cambio entre la api y el user guide, pero entiendo que era necesario. Ahora si el issue, creo que es necesario que todos los transformadores tengan algo tipo features_in_, features_out_ donde se listen los features que entran y salen del transformador; la razón de esto son los pipelines, ultimamente he estado trabajando con muchos pipelines, algunos algo complejos y cuando quiero revisar el feature_importance_ (xgb o rf) de algunos algoritmos me es complejo acertar qué feature es el que el algoritmo dice x%.

Describe the solution you'd like
voy a suponer un pipeline algo así:

full_xgb1_pipeline= [
    ('add_miss_indicator', AddMissingIndicator()),
    ('impute_floats', MeanMedianImputer(imputation_method='mean', variables=float_columns)),
    ('impute_ints', SklearnTransformerWrapper(transformer=SimpleImputer(strategy='most_frequent'), variables=int_columns)),
    ('outliers', Winsorizer(capping_method='gaussian', tail='both', variables=float_columns)),
    ('nesses', MathematicalCombination(variables_to_combine=nesses,
                                       math_operations=['sum', 'prod', 'mean', 'std', 'max', 'min'],
                                       new_variables_names=['sum_ness', 'prod_ness', 'mean_ness', 'std_ness', 'max_ness', 'min_ness'])),
    ('xgb_1', xgb.XGBClassifier(booster='gbtree',  objective='binary:logistic', ...))
]
pipeline = Pipeline(pipeline_list)

cuando quiero conocer los mejores features realizaría algo así

full_xgb1_pipeline.named_steps['xgb_1'].feature_importances_

pero si quisiera los nombres pues, es algo complejo tenerlos, lo que usualmente estoy haciendo es que tomo el conjunto de entrenamiento, el hago un fit_transform().columns.to_list() (hasta el nesses en este caso). Desde luego esto resulta en un cálculo computacional que no siempre es ágil y pues no sé creo que es un poco innecesario.

Describe alternatives you've considered

pipeline_list = [
    ('add_miss_indicator', AddMissingIndicator()),
    ('impute_floats', MeanMedianImputer(imputation_method='mean', variables=float_columns)),
    ('impute_ints', SklearnTransformerWrapper(transformer=SimpleImputer(strategy='most_frequent'), variables=int_columns)),
    ('outliers', Winsorizer(capping_method='gaussian', tail='both', variables=float_columns)),
    ('nesses', MathematicalCombination(variables_to_combine=nesses,
                                       math_operations=['sum', 'prod', 'mean', 'std', 'max', 'min'],
                                       new_variables_names=['sum_ness', 'prod_ness', 'mean_ness', 'std_ness', 'max_ness', 'min_ness']))
)
columns = Pipeline(pipeline_list).fit_transform(X_train).columns.to_list()
pd.DataFrame({'feature': columns, 'importance': full_xgb1_pipeline.named_steps['xgb_1'].feature_importances_}).sort_values('importance', ascending=False)

Esto me implica:

  1. Separar el transformador de el algoritmo.
  2. Realizar un proceso que el pipeline ya realiza.

Si crees que vale la pena me avisas y podría dedicarle unos minutos cada día.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions