教師付き学習を行いたいです。
これまで、私はすべての機能について教師付き学習を行うことを知っていました。
ただし、Kの最適な機能を使用した実験も行いたいと思います。
ドキュメントを読んで、ScikitでSelectKBestメソッドがあることを学びました。
残念ながら、これらの最高の機能を見つけた後、新しいデータフレームを作成する方法はわかりません。
5つの最適な機能を使用して実験を行いたいと仮定しましょう。
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)
次の行を追加する場合:
dataframe = pd.DataFrame(select_k_best_classifier)
機能名のない新しいデータフレームを受け取ります(0から4までのインデックスのみ)。
交換する必要があります:
dataframe = pd.DataFrame(fit_transofrmed_features, columns=features_names)
私の質問は、features_namesリストを作成する方法ですか??
私は使用する必要があることを知っています:select_k_best_classifier.get_support()
ブール値の配列を返します。
配列の真の値は、右側の列のインデックスを表します。
メソッドを介して取得できるすべての機能名の配列でこのブール配列を使用するにはどうすればよいですか:
feature_names = list(features_dataframe.columns.values)
次のことができます。
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)
次に、機能の名前を変更します。
dataframe = pd.DataFrame(fit_transofrmed_features, columns=new_features)
これは私のために働いて、ループを必要としません。
# 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]
私にとって、このコードは問題なく機能し、より「Python的な」ものです。
mask = select_k_best_classifier.get_support()
new_features = features_dataframe.columns[mask]
次のコードは、Fスコアで上位K個の機能を見つけるのに役立ちます。 Xがpandasデータフレームであり、その列はすべての機能であり、yはクラスラベルのリストです。
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)