2014-04-09 10 views
6

Có cách nào được xây dựng để thực hiện lựa chọn tính năng brute-force trong scikit-learning không? I E. Đánh giá triệt để tất cả các kết hợp có thể có của các tính năng đầu vào, và sau đó tìm tập hợp con tốt nhất. Tôi quen thuộc với lớp "Loại bỏ tính năng đệ quy" nhưng tôi đặc biệt thú vị trong việc đánh giá tất cả các kết hợp có thể có của các tính năng đầu vào sau cái kia.Tính năng chọn lọc triệt để trong học tập bằng scikit?

+0

Điều gì đó giống như lựa chọn tính năng tham lam? –

+0

@AbhishekThakur Cảm ơn. nhưng Không, tôi muốn một lựa chọn tính năng bạo lực "ngu ngốc" - thực ra tôi có thể làm điều đó trong một vòng lặp trên tất cả các kết hợp. Nhưng thích một phương pháp xây dựng/đường ống nếu tồn tại như vậy ?? – Dov

Trả lời

5

Không, lựa chọn tập hợp con tốt nhất không được triển khai. Cách dễ nhất để làm điều đó là tự viết nó. Điều này sẽ giúp bạn bắt đầu:

from itertools import chain, combinations 
from sklearn.cross_validation import cross_val_score 

def best_subset_cv(estimator, X, y, cv=3): 
    n_features = X.shape[1] 
    subsets = chain.from_iterable(combinations(xrange(k), k + 1) 
            for k in xrange(n_features)) 

    best_score = -np.inf 
    best_subset = None 
    for subset in subsets: 
     score = cross_val_score(estimator, X[:, subset], y, cv=cv).mean() 
     if score > best_score: 
      best_score, best_subset = score, subset 

    return best_subset, best_score 

này thực hiện k -fold cross-validation bên trong vòng lặp, vì vậy nó sẽ phù hợp với k ᵖ ước lượng khi đưa ra dữ liệu với p tính năng.

+0

Cảm ơn câu trả lời của bạn !! – Dov

+2

Có lỗi trong mã. Nó phải là 'kết hợp (xrange (n_features))'. – nopper

+0

Mẹo hiệu suất - khi so sánh giữa các mô hình khác nhau có cùng kích thước k, không cần phải thực hiện cv - đủ để so sánh thống kê tập huấn như R^2. Chỉ khi so sánh các ứng cử viên tốt nhất với các kích cỡ khác nhau cv là cần thiết. Xem chương 6 trong cuốn sách tuyệt vời này: http://www-bcf.usc.edu/~gareth/ISL/ – ihadanny

0

Nếu bạn đang chạy mã này bằng Python 3 xrange() đã được đổi tên thành range().

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