2017-06-21 66 views
0

我想從這個代碼片斷列名:的Python - sklearn管道SVC f_regression - 獲得列名

anova_filter = SelectKBest(f_regression, k=10) 
clf = svm.SVC(kernel='linear') 
anova_svm = make_pipeline(anova_filter, clf) 
f_reg_features = anova_svm.fit(df_train, df_train_y) 

我嘗試了一些其他建議,如這一個,但我沒能得到它的工作:

How to get feature names selected by feature elimination in sklearn pipeline?

在此先感謝。

+0

所以,你想要從SelectKBest中選擇的特性傳遞到svm上嗎? –

+0

正確,但我一直無法獲得其他方法的工作。 – dasvootz

+1

'df_train.columns [anova_svm.steps [0] [1] .get_support()]' –

回答

1

隨着eli5庫(免責聲明:我是作者之一),你可以做這樣的:

# the original example: 
from sklearn.feature_selection import SelectKBest, f_regression 
from sklearn import svm 
from sklearn.datasets import make_classification 
from sklearn.pipeline import make_pipeline 
import pandas as pd 

X, y = make_classification(n_features=5, n_informative=5, n_redundant=0) 
df_train = pd.DataFrame(X, columns=['A', 'B', 'C', 'D', 'E']) 
df_train_y = pd.DataFrame(y) 

anova_filter = SelectKBest(f_regression, k=3) 
clf = svm.SVC(kernel='linear') 
anova_svm = make_pipeline(anova_filter, clf) 
f_reg_features = anova_svm.fit(df_train, df_train_y) 

然後:

import eli5 
feat_names = eli5.transform_feature_names(anova_filter, list(df.columns)) 

它的工作原理類似於維韋克方式庫馬爾的建議;優點是統一的API - 不需要記住每個變壓器的這些片段。

如果您要更換SVC與sklearn.linear_model.LinearSVM(應該也快得多)(內核=「線性」),你可以這樣做:

eli5.show_weights(anova_svm, feature_names=list(df.columns)) 

,並得到像這樣的表:

enter image description here

+0

這很有用,謝謝你,就像你在哪裏找到答案一樣? – dasvootz

+0

我是eli5圖書館的作者之一; SelectKBest支持由Joel Nothman(scikit-learn開發人員之一)爲此庫貢獻。所以我知道eli5庫存在,我必須在合併pull請求之前查看實現。無論如何,'SelectKBest.get_support'方法記錄在scikit-learn文檔中 - 請參閱http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html#sklearn.feature_selection.SelectKBest.get_support。 –

+0

酷圖書館,我會確保告訴我的其他Python的朋友。再次感謝。 – dasvootz