2012-10-10 13 views
3

我正在使用sci-kit learn(版本0.11,Python版本2.7.3)从svmlight格式的二进制分类数据集中选择前K个特征。sci-kit学习:使用SelectKBest时识别相应的功能ID值

我想确定所选功能的功能ID值。我认为这很简单 - 很可能! (通过要素id,我指的是特征值描述here之前数)

下面的代码说明正是我如何一直在努力做到这一点:

from sklearn.datasets import load_svmlight_file 
from sklearn.feature_selection import SelectKBest 

svmlight_format_train_file = 'contrived_svmlight_train_file.txt' #I present the contents of this file below 

X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) 

featureSelector = SelectKBest(score_func=chi2,k=2) 

featureSelector.fit(X_train_data,Y_train_data) 

assumed_to_be_the_feature_ids_of_the_top_k_features = list(featureSelector.get_support(indices=True)) #indices=False just gives me a list of True,False etc... 

print assumed_to_be_the_feature_ids_of_the_top_k_features #this gives: [0, 2] 

显然,assumed_to_be_the_feature_ids_of_the_top_k_features不能对应特征ID值 - 因为(见下文)我的输入文件中的特征ID值从1开始。

现在,我怀疑assumed_to_be_the_feature_ids_of_the_top_k_features实际上可能对应于特征ID值的列表索引按增值顺序排序。在我的情况下,索引0将对应于feature-id=1等 - 使得代码告诉我已选择feature-id=1feature-id=3。但是,如果有人能够确认或否认这一点,我将不胜感激。

在此先感谢。

1 1:1.000000 2:1.000000 4:1.000000 6:1.000000#mA 
1 1:1.000000 2:1.000000#mB 
0 5:1.000000#mC 
1 1:1.000000 2:1.000000#mD 
0 3:1.000000 4:1.000000#mE 
0 3:1.000000#mF 
0 2:1.000000 4:1.000000 5:1.000000 6:1.000000#mG 
0 2:1.000000#mH 

附注:

contrived_svmlight_train_file.txt内容对于没有正确格式化的道歉(第一次在这里);我希望这是清晰可读的!

回答

2

显然,assumed_to_be_the_feature_ids_of_the_top_k_features不能对应要素id值 - 因为(见下文)在我输入文件开始的要素id值从1

事实上,他们是。 SVMlight格式加载器将检测到您的输入文件具有一个基于索引的索引,并会从每个索引中减去一个索引,以免浪费列。如果这不是你想要的,那么通过zero_based=Trueload_svmlight_file假装它实际上是从零开始并插入一个额外的列;详情请参阅its documentation

+0

太棒了;所以我的假设已被证实。为了简单起见,我认为我只需将1添加到assume_to_be_the_feature_ids_of_the_top_k_features中的每个值。感谢这样快速的回应。 (顺便说一句,我读过你之前提到的文档,但恐怕我误解了它的含义。) – user1735732

+0

@ user1735732:我承认这不是很清楚。我向dev版本推送了一个补丁,所以下一个版本将会有更好的文档。谢谢! –