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)