2016-10-03 151 views
9

我想进行监督式学习。在Scikit中运行SelectKBest后获取功能名称的最简单方法了解

直到现在我知道要做监督学习所有功能。

但是,我还想进行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) 

回答

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

以下代码将帮助您找到具有F分数的顶级K功能。设X是熊猫数据框,其列是所有的特征,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

对于我这个代码工作正常,更 'Python化':

mask = select_k_best_classifier.get_support() 
new_features = features_dataframe.columns[mask] 
相关问题