Scikit-learn回归数据特征选择



我正在尝试使用Python模块scikit-learn将单变量特征选择方法应用于svmlight格式的回归(即连续值响应值)数据集。

我正在使用scikit-learn 0.11版本。

我尝试了两种方法-第一种方法失败了,第二种方法适用于我的玩具数据集,但我相信对于真实数据集会给出无意义的结果。

我想要关于适当的单变量特征选择方法的建议,我可以应用于选择回归数据集的前N个特征。我要么想(a)找出如何使f_regression函数工作,要么(b)听取其他建议。

上面提到的两种方法:

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

This failed with以下错误消息:"TypeError: copy()只接受1个参数(给定2个)"

    我尝试使用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:10 .000000 2:10 .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

正如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))]

你也可以尝试通过L1/Lasso正则化来进行特征选择。专门为此设计的课程是RandomizedLasso,它将在数据的多个子样本上训练LassoRegression,并选择这些模型最常选择的特征。您也可以使用Lasso, LassoLarsSGDClassifier来做同样的事情,而不需要重新采样,但速度更快。

相关内容

  • 没有找到相关文章

最新更新