Scikit-learn回归数据特征选择

7 投票
2 回答
10037 浏览
提问于 2025-04-17 19:32

我正在尝试使用Python的scikit-learn模块来对一个回归数据集(也就是连续值的响应值)应用单变量特征选择方法,这个数据集是svmlight格式的。

我使用的是scikit-learn的0.11版本。

我尝试了两种方法——第一种失败了,第二种在我的玩具数据集上有效,但我觉得在真实数据集上可能会得到没有意义的结果。

我希望能得到一些建议,关于适合的单变量特征选择方法,以便我能选出回归数据集中的前N个特征。我想要么是(a)弄清楚如何让f_regression函数正常工作,要么是(b)听听其他的建议。

上面提到的两种方法:

  1. 我尝试使用了sklearn.feature_selection.f_regression(X,Y)。

这失败了,出现了以下错误信息: "TypeError: copy() takes exactly 1 argument (2 given)"

  1. 我尝试使用chi2(X,Y)。这个“有效”,但我怀疑这是因为我玩具数据集中的两个响应值0.1和1.8被当作类标签处理了?显然,这在真实数据集上不会产生有意义的卡方统计量,因为真实数据集可能有很多不同的响应值,而每个单元格中(特定响应值和被测试属性值)可能的数量会很少?

请在这条消息的末尾找到我的玩具数据集。

以下代码片段应该能给出我上面描述的结果。

from sklearn.datasets import load_svmlight_file

X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to the name of my toy dataset file

from sklearn.feature_selection import SelectKBest
featureSelector = SelectKBest(score_func="one of the two functions I refer to above",k=2) #sorry, I hope this message is clear
featureSelector.fit(X_train_data,Y_train_data)
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))] #This should print the indices of the top 2 features

提前谢谢你。

理查德

我构造的svmlight文件内容——为了清晰起见,插入了额外的空行:

1.8 1:1.000000 2:1.000000 4:1.000000 6:1.000000#mA

1.8 1:1.000000 2:1.000000#mB

0.1 5:1.000000#mC

1.8 1:1.000000 2:1.000000#mD

0.1 3:1.000000 4:1.000000#mE

0.1 3:1.000000#mF

1.8 2:1.000000 4:1.000000 5:1.000000 6:1.000000#mG

1.8 2:1.000000#mH

2 个回答

1

你也可以尝试用L1/Lasso正则化来进行特征选择。专门为这个目的设计的类是 RandomizedLasso,它会在你数据的多个子样本上训练Lasso回归,并选择那些被这些模型最常选中的特征。你也可以直接使用 LassoLassoLarsSGDClassifier 来做同样的事情,虽然没有重新抽样的好处,但速度会更快。

5

正如larsmans提到的,chi2不能用于回归数据的特征选择。

在更新到scikit-learn版本0.13后,下面的代码为上面提到的玩具数据集选择了前两个特征(根据f_regression测试)。

def f_regression(X,Y):
   import sklearn
   return sklearn.feature_selection.f_regression(X,Y,center=False) #center=True (the default) would not work ("ValueError: center=True only allowed for dense data") but should presumably work in general

from sklearn.datasets import load_svmlight_file

X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to  the name of my toy dataset file

from sklearn.feature_selection import SelectKBest
featureSelector = SelectKBest(score_func=f_regression,k=2)
featureSelector.fit(X_train_data,Y_train_data)
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))]

撰写回答