2016-10-03 1 views
9

Я хотел бы получить контролируемое обучение.Самый простой способ получить имена функций после запуска SelectKBest в Scikit Learn

До сих пор я знаю, что нужно следить за всеми функциями.

Однако я хотел бы также провести эксперимент с лучшими функциями K.

Я прочитал документацию и нашел, что в Scikit вы узнаете, что есть метод SelectKBest.

К сожалению, я не знаю, как создать новый dataframe после обнаружения этих лучших черт:

Давайте предположим, что я хотел бы провести эксперимент с 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) 

я буду получать новый dataframe без названия компонентов (только индекс, начиная от 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) 

ответ

6

Вы можете сделать следующее:

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) 
11

Это работало для меня и не требует циклов.

# Create and fit selector 
selector = SelectKBest(f_classif, k=5) 
selector.fit(features_dataframe, target) 
# Get idxs of columns to keep 
idxs_selected = selector.get_support(indices=True) 
# Create new dataframe with only desired columns, or overwrite existing 
features_dataframe_new = features_dataframe[idxs_selected] 
1

Следующий код поможет вам найти лучшие функции 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) 
4

Для меня этот код работает отлично и более 'вещий':

mask = select_k_best_classifier.get_support() 
new_features = features_dataframe.columns[mask] 
Смежные вопросы