sklearn selectkbest mutual information importance from feature chi2 python pandas scikit-learn feature-selection

mutual - selectkbest python



La forma más fácil de obtener nombres de funciones después de ejecutar SelectKBest en Scikit Learn (4)

Me gustaría hacer un aprendizaje supervisado.

Hasta ahora sé hacer un aprendizaje supervisado de todas las características.

Sin embargo, también me gustaría realizar un experimento con las mejores características de K.

Leí la documentación y encontré que en Scikit aprendí que existe el método SelectKBest.

Desafortunadamente, no estoy seguro de cómo crear un nuevo marco de datos después de encontrar esas mejores características:

Supongamos que me gustaría realizar un experimento con las 5 mejores características:

from sklearn.feature_selection import SelectKBest, f_classif select_k_best_classifier = SelectKBest(score_func=f_classif, k=5).fit_transform(features_dataframe, targeted_class)

Ahora si quisiera agregar la siguiente línea:

dataframe = pd.DataFrame(select_k_best_classifier)

Recibiré un nuevo marco de datos sin nombres de características (solo índice desde 0 a 4).

Debería reemplazarlo por:

dataframe = pd.DataFrame(fit_transofrmed_features, columns=features_names)

Mi pregunta es ¿cómo crear la lista de nombres de características?

Sé que debería usar: select_k_best_classifier.get_support ()

Que devuelve matriz de valores booleanos.

El valor verdadero en la matriz representa el índice en la columna derecha.

¿Cómo debo usar esta matriz booleana con la matriz de todos los nombres de características que puedo obtener a través del método:

feature_names = list(features_dataframe.columns.values)


El siguiente código lo ayudará a encontrar las mejores características de K con sus puntajes F. Supongamos que X es el marco de datos de pandas, cuyas columnas son todas las características y y es la lista de etiquetas de clase.

import pandas as pd from sklearn.feature_selection import SelectKBest, f_classif #Suppose, we select 5 features with top 5 Fisher scores selector = SelectKBest(f_classif, k = 5) #New dataframe with the selected features for later use in the classifier. fit() method works too, if you want only the feature names and their corresponding scores X_new = selector.fit_transform(X, y) names = X.columns.values[selector.get_support()] scores = selector.scores_[selector.get_support()] names_scores = list(zip(names, scores)) ns_df = pd.DataFrame(data = names_scores, columns=[''Feat_names'', ''F_Scores'']) #Sort the dataframe for better visualization ns_df_sorted = ns_df.sort_values([''F_Scores'', ''Feat_names''], ascending = [False, True]) print(ns_df_sorted)


Esto funcionó para mí y no requiere bucles.

# Create and fit selector selector = SelectKBest(f_classif, k=5) selector.fit(features_df, target) # Get idxs of columns to keep cols = selector.get_support(indices=True) # Create new dataframe with only desired columns, or overwrite existing features_df_new = features_df[cols]


Para mí este código funciona bien y es más "pythonic":

mask = select_k_best_classifier.get_support() new_features = features_dataframe.columns[mask]


Puedes hacer lo siguiente:

mask = select_k_best_classifier.get_support() #list of booleans new_features = [] # The list of your K best features for bool, feature in zip(mask, feature_names): if bool: new_features.append(feature)

Luego cambia el nombre de tus características:

dataframe = pd.DataFrame(fit_transofrmed_features, columns=new_features)