2013-03-18 36 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做同樣的事情,但沒有重採樣的好處,但速度更快。