Je voudrais faire un apprentissage supervisé.
Jusqu'à présent, je savais faire de l'apprentissage supervisé à toutes les fonctionnalités.
Cependant, je voudrais aussi mener une expérience avec les meilleures caractéristiques K.
J'ai lu la documentation et découvert dans Scikit qu'il existe une méthode SelectKBest.
Malheureusement, je ne sais pas comment créer un nouveau cadre de données après avoir trouvé ces meilleures fonctionnalités:
Supposons que je souhaite mener une expérience avec 5 meilleures fonctionnalités:
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)
Maintenant, si j'ajoutais la ligne suivante:
dataframe = pd.DataFrame(select_k_best_classifier)
Je vais recevoir un nouveau cadre de données sans nom de fonction (index seulement de 0 à 4).
Je devrais le remplacer pour:
dataframe = pd.DataFrame(fit_transofrmed_features, columns=features_names)
Ma question est de savoir comment créer la liste features_names ??
Je sais que je devrais utiliser: select_k_best_classifier.get_support ()
Ce qui retourne un tableau de valeurs booléennes.
La valeur vraie dans le tableau représente l'index dans la colonne de droite.
Comment utiliser ce tableau booléen avec le tableau de tous les noms d'entités que je peux obtenir via la méthode:
feature_names = list(features_dataframe.columns.values)
Vous pouvez faire ce qui suit:
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)
Puis changez le nom de vos fonctionnalités:
dataframe = pd.DataFrame(fit_transofrmed_features, columns=new_features)
Cela a fonctionné pour moi et ne nécessite pas de boucles.
# 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]
Pour moi, ce code fonctionne bien et est plus 'Pythonic':
mask = select_k_best_classifier.get_support()
new_features = features_dataframe.columns[mask]
Le code suivant vous aidera à trouver les meilleures caractéristiques de K avec leurs F-scores. Soit, X est le pandas dataframe, dont les colonnes représentent toutes les entités et y la liste des étiquettes de classe.
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)