在 Scikit Learning 中运行 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 _ name 列表? ?

我知道我应该用:

 select_k_best_classifier.get_support()

返回布尔值数组。

数组中的真值表示右列中的索引。

我应该如何使用这个布尔数组和我可以通过这个方法得到的所有特性名称的数组:

feature_names = list(features_dataframe.columns.values)
93189 次浏览

你可以这样做:

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 and create new dataframe with those only
cols = selector.get_support(indices=True)
features_df_new = features_df.iloc[:,cols]

下面的代码将帮助您找到与他们的 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)

对我来说,这个代码工作得很好,而且更“ Python 化”:

mask = select_k_best_classifier.get_support()
new_features = features_dataframe.columns[mask]

还有另外一种方法,但是它不像上面的解决方案那样快。

# Use the selector to retrieve the best features
X_new = select_k_best_classifier.fit_transform(train[feature_cols],train['is_attributed'])


# Get back the kept features as a DataFrame with dropped columns as all 0s
selected_features = pd.DataFrame(select_k_best_classifier.inverse_transform(X_new),
index=train.index,
columns= feature_cols)
selected_columns = selected_features.columns[selected_features.var() !=0]

根据 chi2选择最佳10项功能;

from sklearn.feature_selection import SelectKBest, chi2


KBest = SelectKBest(chi2, k=10).fit(X, y)

使用 Get _ support ()获取特性

f = KBest.get_support(1) #the most important features

创建名为 X _ new 的新 df;

X_new = X[X.columns[f]] # final features`
# Fit the SelectKBest instance
select_k_best_classifier = SelectKBest(score_func=f_classif, k=5).fit(features_dataframe, targeted_class)


# Extract the required features
new_features  = select_k_best_classifier.get_feature_names_out(features_names)

在 Scikit-learn 1.0中,变压器使用 get_feature_names_out方法,这意味着您可以编写

dataframe = pd.DataFrame(fit_transformed_features, columns=transformer.get_features_names_out())