2013-03-18 9 views
7

Pythonモジュールscikit-learnを使用して単変量関数選択メソッドを適用して、回帰(すなわち連続値の応答値)データセットをsvmlight形式で適用しようとしています。回帰データのScikit-learn機能の選択

私はscikit-learnバージョン0.11で作業しています。

私は2つのアプローチを試みました。最初は失敗し、2番目は私のおもちゃのデータセットでは機能しましたが、実際のデータセットでは意味のない結果が得られると思います。

回帰データセットの上位N個の機能を選択するために適用できる適切な単変量機能の選択アプローチに関するアドバイスが必要です。私は、(a)f_regression関数をどのように働かせるか、(b)代替提案を聞くようにしたいと思います。

上記の2つのアプローチ:私はsklearn.feature_selection.f_regression(X、Y)を使用して試み

これは、次のエラーメッセージで失敗しました: :私はchi2(X、Y)を使用して試み

  1. "はTypeErrorコピー()正確に1引数(2所与)をとります"。私のおもちゃのデータセットの2つの応答値0.1と1.8がクラスラベルとして扱われていたためです。おそらく、これは多数の可能な応答値があり、各セル[特定の応答値と検査される属性の値を持つ]の数が実際のデータセットに対して意味のあるカイ2乗統計を生成しないと思われる低い?

私のおもちゃのデータセットがこのメッセージの最後に貼り付けられています。

次のコードスニペットは、私が上で説明した結果を与えるはずです。

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#ヘクトパスカル

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#ミリガウス

1.8 2:1.000000# mH

+1

'chi2'は分類用です。回帰の設定で動作させるには、Yの値をビンしなければなりません。 –

+0

ありがとうlarsmans。私はそれが当てはまると思ったが、chi2が内部的に回帰y値を「背後にある」ものにするかもしれないと推測していた。私は現在のscikit-learnインストールが古いことを認識しているので、問題を再起する前に最新のバージョンでf_regressionを試してみます。 – user1735732

答えて

5

larsmansが述べたように、chi2は回帰データを使った特徴選択には使用できません。

scikit-learnバージョン0.13に更新すると、次のコードでは、前述のおもちゃデータセットの上位2つのフィーチャ(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をトレーニングし、これらのモデルで最も頻繁に選択される機能を選択します。また、LassoLassoLarsまたはSGDClassifierを使用して、同じことを再サンプリングの利点なしに行うこともできますが、高速です。