2013-03-18 37 views
7

我想使用Python模块scikit-learn以svmlight格式回归(即连续值响应值)数据集应用单变量特征选择方法。回归数据的Scikit学习功能选择

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

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

我想咨询一下适用的单变量特征选择方法,我可以将其应用于选择回归数据集的前N个特征。我想或者(a)想出如何使f_regression函数起作用,或者(b)听取其他建议。

上面提到的两种方法:

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

这失败,出现以下错误消息: “类型错误:复制()正好需要1个参数(2给出)”

  1. 我尝试使用χ2(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#毫安

1.8 1: 1.000000 2:1.000000#的mB

0.1 5:1.000000#三菱商事

1.8 1:1.000000 2:1.000000#毫达西

0.1 3:1.000000 4:1.000000#ME

0.1 3:1.000000#μF的

1.8 2:1.000000 4:1.000000 5:1.000000 6:1.000000#毫克

1.8 2:1.000000# mH

+1

'chi2'仅用于分类。要使其在回归设置中工作,您必须存储Y值。 – 2013-03-19 13:05:20

+0

谢谢larsmans。我认为是这种情况,但是在猜测chi2可能会在内部回归y值“幕后”。我意识到我目前的scikit-learn安装是旧的,所以我会在再次提出问题之前尝试使用最新版本的f_regression。 – user1735732 2013-03-20 09:20:44

回答

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))] 
1

您还可以尝试通过L1/Lasso正则化进行特征选择。专门为此设计的课程是RandomizedLasso,该课程将对您的数据的多个子样本进行LassoRegression训练,并选择这些模型最常选择的特征。您也可以使用Lasso,LassoLarsSGDClassifier做同样的事情,但没有重采样的好处,但速度更快。