Самый простой способ получить имена функций после запуска SelectKBest в Scikit Learn
Я хотел бы научиться контролировать.
До сих пор я знаю, что нужно следить за всеми функциями.
Однако я хотел бы также провести эксперимент с лучшими функциями 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)
Ответы
Ответ 1
Вы можете сделать следующее:
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)
Ответ 2
Это сработало для меня и не требует петель.
# 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]
Ответ 3
Для меня этот код работает отлично и более "pythonic":
mask = select_k_best_classifier.get_support()
new_features = features_dataframe.columns[mask]
Ответ 4
Следующий код поможет вам найти лучшие функции K с их F-баллами. Пусть, 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)