我正在使用sci-kit learn(版本0.11和Python版本2.7.3)从svmlight格式的二进制分类数据集中选择前K个特征。
我正在尝试识别所选要素的feature-id值。我认为这很简单 - 很可能! (通过feature-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
无法与feature-id值对应 - 因为(见下文)输入文件中的feature-id值从1开始。
现在,我怀疑assumed_to_be_the_feature_ids_of_the_top_k_features
实际上可能对应于按值增加的顺序排序的feature-id值的列表索引。在我的情况下,索引0将对应feature-id=1
等 - 这样代码就会告诉我feature-id=1
和feature-id=3
已被选中。
但是,如果有人能够确认或否认这一点,我将不胜感激。
提前致谢。
contrived_svmlight_train_file.txt 的内容:
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
P.S。抱歉没有正确格式化(第一次在这里);我希望这是清晰可辨的!
答案 0 :(得分:2)
显然,
assumed_to_be_the_feature_ids_of_the_top_k_features
无法与feature-id值对应 - 因为(见下文)输入文件中的feature-id值从1开始。
实际上,他们是。 SVMlight格式加载器将检测您的输入文件是否具有基于索引的索引,并将从每个索引中减去一个索引,以免浪费列。如果这不是你想要的,那么将zero_based=True
传递给load_svmlight_file
,假装它实际上是从零开始的,并插入一个额外的列;有关详细信息,请参阅its documentation。