2012-04-30 11 views
7

मैं ची-स्क्वायर (scikit-learn 0.10) का उपयोग करके सर्वोत्तम सुविधाओं का चयन करने की कोशिश कर रहा हूं। कुल 80 प्रशिक्षण दस्तावेजों में से मैंने पहली बार 227 फीचर निकाली, और इन 227 फीचर्स से मैं शीर्ष 10 लोगों का चयन करना चाहता हूं।विज्ञान सीखना: सर्वोत्तम सुविधाओं की वांछित राशि (के) चयनित नहीं

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) 

वे अगर मैं k बराबर सेट 100 के समान हैं।

(80, 227) 
(80, 227) 

ऐसा क्यों होता है?

* संपादित करें: एक पूर्ण उत्पादन उदाहरण के लिए, अब कतरन, जहां मैं 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, 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... 

एक और उदाहरण है, जहां मैं 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, 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 = 100 सेट किया है, इस अनुमान पर कुछ संदेह है, लेकिन यह एक लायक है।

देखें क्या get_support() रिटर्न, और जाँच क्या X_train उन सूचकांक पर की तरह लग रहा है, अगर सुविधा ओवरलैप का एक बहुत में कतरन परिणाम, ची^2 पी-मूल्य में संबंधों का निर्माण होगा शुमार है कि SelectKBest उपयोग कर रहा है।

यदि यह मामला सामने आता है, तो आपको scikits.learn के साथ एक बग/समस्या दर्ज करनी चाहिए, क्योंकि वर्तमान में उनके दस्तावेज़ यह नहीं कहते कि SelectKBest संबंधों की स्थिति में क्या करेंगे। स्पष्ट रूप से यह केवल कुछ बंधे हुए सूचकांक नहीं ले सकता है, न कि दूसरों को, लेकिन उपयोगकर्ताओं को कम से कम चेतावनी दी जानी चाहिए कि संबंधों के परिणामस्वरूप अप्रत्याशित विशेषता आयामी कमी हो सकती है।

+0

आपके उत्तर के लिए धन्यवाद। मैंने क्लिपिंग को हटाने का प्रयास किया लेकिन अभी भी उम्मीद के अनुसार काम नहीं करता है ... मैंने अपना प्रश्न एक पूर्ण आउटपुट (get_support सहित) के साथ संपादित किया है, क्या आप इसे देख सकते हैं? –

+0

टाई ब्रेकिंग वास्तव में समस्या है। मैं अन्य डेवलपर्स के साथ चर्चा करूंगा कि क्या इसे कोड में या दस्तावेज़ीकरण में बदला जाना चाहिए। –

+2

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