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

Me gustaría hacer 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 dataframe 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 dataframe 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 ()

Lo que devuelve una 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) 

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) 

Esto funcionó para mí y no requiere bucles.

 # Create and fit selector selector = SelectKBest(f_classif, k=5) selector.fit(features_df, target) # Get 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 mi este código funciona bien y es más ‘pythonic’:

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

El siguiente código lo ayudará a encontrar las mejores características de K con sus puntajes F. Sea, X es el dataframe de pandas, cuyas columnas son todas las características y y es la lista de tags 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)