2012-04-30 46 views
7

Tôi đang cố gắng chọn các tính năng tốt nhất bằng cách sử dụng chi-square (scikit-learn 0.10). Từ tổng số 80 tài liệu đào tạo, tôi đã trích xuất 227 tính năng đầu tiên và từ 227 tính năng này, tôi muốn chọn 10 tính năng hàng đầu.scikit tìm hiểu: số lượng các tính năng tốt nhất (k) không được chọn

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 

Kết quả như sau.

(80, 227) 
(80, 14) 

Chúng giống nhau nếu tôi đặt k bằng 100.

(80, 227) 
(80, 227) 

Tại sao điều này xảy ra?

* EDIT: Một ví dụ đầu ra đầy đủ, bây giờ mà không cần cắt, nơi tôi yêu cầu 30 và có 32 thay vì:

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... 

Một ví dụ khác mà không cần cắt, nơi tôi yêu cầu 10 và nhận được 11 thay vì:

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... 

Trả lời

5

Bạn đã kiểm tra những gì được trả về từ hàm get_support() (ch2 phải có chức năng thành viên này)? Điều này trả về các chỉ số được chọn trong số các k tốt nhất.

Giả thuyết của tôi là có mối quan hệ do dữ liệu mà bạn đang thực hiện (hoặc do vectơ đặc trưng lặp lại, nếu vectơ tính năng của bạn phân loại và có khả năng lặp lại) và chức năng quét sẽ trả về tất cả các mục được gắn cho các điểm k đầu. Ví dụ bổ sung nơi bạn đặt k = 100 thực hiện một số nghi ngờ về giả thuyết này, nhưng đáng xem.

Xem nội dung get_support() trả về và kiểm tra xem X_train trông như thế nào trên các chỉ mục đó, xem liệu có cắt bớt kết quả trùng lặp hay không, tạo mối quan hệ trong xếp hạng chi^p p2.

Nếu điều này xảy ra, bạn nên gửi lỗi/vấn đề với scikits.learn, bởi vì hiện tại tài liệu của họ không cho biết những gì SelectKBest sẽ thực hiện trong trường hợp quan hệ. Rõ ràng nó không thể chỉ mất một số các chỉ số bị ràng buộc và không phải những người khác, nhưng người sử dụng ít nhất nên được cảnh báo rằng các mối quan hệ có thể dẫn đến giảm kích thước tính năng bất ngờ.

+0

Cảm ơn bạn đã trả lời. Tôi đã thử gỡ bỏ các clipping nhưng vẫn không hoạt động như mong đợi ... Tôi đã chỉnh sửa câu hỏi của tôi với một đầu ra đầy đủ (bao gồm get_support), bạn có thể vui lòng xem nó? –

+0

Phá vỡ Tie thực sự là vấn đề. Tôi sẽ thảo luận với các nhà phát triển khác cho dù điều này nên được thay đổi trong mã hoặc trong tài liệu. –

+2

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

Các vấn đề liên quan