2012-04-30 6 views
7

カイ二乗(scikit-learn 0.10)を使用して最適なフィーチャを選択しようとしています。私は最初に227個のフィーチャを抽出した80個のトレーニング文書の中から、この227個のフィーチャから上位10個のフィーチャを選択したいと考えています。scikit learn:ベストフィーチャの望ましい量(k)が選択されていない

my_vectorizer = CountVectorizer(analyzer=MyAnalyzer())  
X_train = my_vectorizer.fit_transform(train_data) 
X_test = my_vectorizer.transform(test_data) 
Y_train = np.array(train_labels) 
Y_test = np.array(test_labels) 
X_train = np.clip(X_train.toarray(), 0, 1) 
X_test = np.clip(X_test.toarray(), 0, 1)  
ch2 = SelectKBest(chi2, k=10) 
print X_train.shape 
X_train = ch2.fit_transform(X_train, Y_train) 
print X_train.shape 

結果は以下の通りです。

(80, 227) 
(80, 14) 

私は100に等しいkを設定した場合、彼らは似ています。

(80, 227) 
(80, 227) 

どうしてですか?私は10を要求し、代わりに11を取得する場所、クリッピングなし

Train instances: 9 Test instances: 1 
Feature extraction... 
X_train: 
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0] 
[0 0 2 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0] 
[0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0]] 
Y_train: 
[0 0 0 0 0 0 0 0 1] 
32 features extracted from 9 training documents. 
Feature selection... 
(9, 32) 
(9, 32) 
Using 32(requested:30) best features from 9 training documents 
get support: 
[ True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True] 
get support with vocabulary : 
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28 29 30 31] 
Training... 
/usr/local/lib/python2.6/dist-packages/scikit_learn-0.10-py2.6-linux-x86_64.egg/sklearn/svm/sparse/base.py:23: FutureWarning: SVM: scale_C will be True by default in scikit-learn 0.11 
    scale_C) 
Classifying... 

もう一つの例:

* EDIT:フル出力例、今クリッピングなしで、私は30を要求し、代わりに32を得た

Train instances: 9 Test instances: 1 
Feature extraction... 
X_train: 
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0] 
[0 0 2 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0] 
[0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0]] 
Y_train: 
[0 0 0 0 0 0 0 0 1] 
32 features extracted from 9 training documents. 
Feature selection... 
(9, 32) 
(9, 11) 
Using 11(requested:10) best features from 9 training documents 
get support: 
[ True True True False False True False False False False True False 
False False True False False False True False True False True True 
False False False False True False False False] 
get support with vocabulary : 
[ 0 1 2 5 10 14 18 20 22 23 28] 
Training... 
/usr/local/lib/python2.6/dist-packages/scikit_learn-0.10-py2.6-linux-x86_64.egg/sklearn/svm/sparse/base.py:23: FutureWarning: SVM: scale_C will be True by default in scikit-learn 0.11 
    scale_C) 
Classifying... 

答えて

5

get_support()関数(ch2はこのメンバー関数を持つ必要があります)から返される内容を確認しましたか?これは、最良のkの中から選択されているインデックスを返します。

私は、あなたがやっているデータクリッピング(または特徴ベクトルがカテゴリにあり、繰り返しがある可能性が高い場合は繰り返される特徴ベクトルのために)があること、そしてscikits関数がすべて上位k個のスポットに結びついているエントリ。 k = 100を設定した特別な例は、この予想に疑問を投げかけていますが、一見価値があります。

カイ^ 2 p値でネクタイを作成する、何get_support()戻り、機能の重複の多くの結果をクリッピングかどうかを確認し、X_trainはこれらの指標にどのように見えるかをチェックしてくださいはSelectKBestが使用されていることをランク付けします。

この場合、scikits.learnでバグや問題を提出する必要があります。その理由は、現時点では、ドキュメントには同義の場合に何を行うのかが記述されていないためです。明らかに、それは単に束縛された指標の一部を取り上げるだけではなく、他の指標を取ることもできませんが、ユーザは、関係が予期しないフィーチャ次元の減少をもたらす可能性があることを少なくとも警告する必要があります。

+0

ご返信ありがとうございます。私はクリッピングを削除しようとしましたが、まだ期待どおりに動作しません...私は完全な出力(get_supportを含む)で私の質問を編集しました、あなたはそれを見てみることができますか? –

+0

本当にタイの折れが問題です。他の開発者とコードやドキュメントで変更する必要があるかどうかを議論します。 –

+2

https://github.com/scikit-learn/scikit-learn/issues/805 –