2014-05-22 15 views
10

Tôi muốn thực hiện loại bỏ tính năng đệ quy với tìm kiếm lưới lồng nhau và xác thực chéo cho từng tập hợp con bằng cách sử dụng tính năng tìm hiểu. Từ RFECV tài liệu có vẻ như loại hình này hoạt động được hỗ trợ bằng cách sử dụng estimator_params tham số:Loại bỏ tính năng đệ quy và tìm kiếm lưới bằng cách sử dụng scikit-learn

estimator_params : dict 

    Parameters for the external estimator. Useful for doing grid searches. 

Tuy nhiên, khi tôi cố gắng để vượt qua một mạng lưới các siêu tham số cho đối tượng RFECV

from sklearn.datasets import make_friedman1 
from sklearn.feature_selection import RFECV 
from sklearn.svm import SVR 
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0) 
estimator = SVR(kernel="linear") 
selector = RFECV(estimator, step=1, cv=5, estimator_params={'C': [0.1, 10, 100, 1000]}) 
selector = selector.fit(X, y) 

tôi nhận được một lỗi như

File "U:/My Documents/Code/ModelFeatures/bin/model_rcc_gene_features.py", line 130, in <module> 
    selector = selector.fit(X, y) 
    File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", line 336, in fit 
    ranking_ = rfe.fit(X_train, y_train).ranking_ 
    File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", line 146, in fit 
    estimator.fit(X[:, features], y) 
    File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 178, in fit 
    fit(X, y, sample_weight, solver_type, kernel, random_seed=seed) 
    File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 233, in _dense_fit 
    max_iter=self.max_iter, random_seed=random_seed) 
    File "libsvm.pyx", line 59, in sklearn.svm.libsvm.fit (sklearn\svm\libsvm.c:1628) 
TypeError: a float is required 

Nếu bất cứ ai có thể chỉ cho tôi những gì tôi đang làm sai nó sẽ là g reatly đánh giá cao, cảm ơn!

EDIT:

Sau Andreas' điều phản ứng trở nên rõ ràng hơn, dưới đây là một ví dụ làm việc của RFECV kết hợp với tìm kiếm của lưới điện.

from sklearn.datasets import make_friedman1 
from sklearn.feature_selection import RFECV 
from sklearn.grid_search import GridSearchCV 
from sklearn.svm import SVR 
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0) 
param_grid = [{'C': 0.01}, {'C': 0.1}, {'C': 1.0}, {'C': 10.0}, {'C': 100.0}, {'C': 1000.0}, {'C': 10000.0}] 
estimator = SVR(kernel="linear") 
selector = RFECV(estimator, step=1, cv=4) 
clf = GridSearchCV(selector, {'estimator_params': param_grid}, cv=7) 
clf.fit(X, y) 
clf.best_estimator_.estimator_ 
clf.best_estimator_.grid_scores_ 
clf.best_estimator_.ranking_ 
+0

[Đọc câu trả lời này để tránh cảnh báo] (http://stackoverflow.com/questions/31784392/how-can-i-avoid-using-estimator-params-when-using-rfecv-nested-within -gridsearch/35560648 # 35560648) –

Trả lời

9

Thật không may, RFECV bị hạn chế để xác thực chéo số thành phần. Bạn không thể tìm kiếm thông số của SVM với nó. Lỗi này là do SVC đang mong đợi một float như C, và bạn đã cho nó một danh sách. Bạn có thể thực hiện một trong hai điều sau: Chạy GridSearchCV trên RFECV, kết quả là chia dữ liệu thành các nếp gấp hai lần (những cái bên trong GridSearchCV và một lần bên trong RFECV), nhưng tìm kiếm qua số lượng thành phần sẽ hiệu quả, HOẶC bạn có thể thực hiện GridSearchCV chỉ trên RFE, điều này sẽ dẫn đến việc tách một phần dữ liệu, nhưng trong quá trình quét không hiệu quả các tham số của bộ ước lượng RFE.

Nếu bạn muốn thực hiện các docstring ít mơ hồ, một yêu cầu kéo sẽ được hoan nghênh :)

+2

Ok cảm ơn sự trợ giúp, rõ ràng hơn nhiều. Tôi đã thêm một ví dụ về tìm kiếm lưới đang hoạt động với RFECV vào bài đăng gốc của tôi cho bất kỳ người nào khác có thể đang gặp khó khăn. Ngoài ra, gửi một yêu cầu kéo với một số tài liệu sửa đổi, hy vọng nó sẽ giúp. – DavidS

+0

Tôi cũng cảm ơn bạn đã giải thích, khi tôi chạy vào cùng một vấn đề. Đã có yêu cầu kéo để cải thiện tài liệu chưa? Tôi sẽ rất vui khi đóng góp nếu nó chưa được thực hiện. –

+0

Yup, yêu cầu kéo đã được gửi và được chấp nhận. – DavidS

1

Các mã được cung cấp bởi Davids đã không làm việc cho tôi (sklearn 0,18), nhưng đòi hỏi một sự thay đổi nhỏ để cụ thể param_grid và cách sử dụng của nó.

from sklearn.datasets import make_friedman1 
from sklearn.feature_selection import RFECV 
from sklearn.model_selection import GridSearchCV 
from sklearn.svm import SVR 
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0) 
param_grid = [{'estimator__C': [0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]}] 
estimator = SVR(kernel="linear") 
selector = RFECV(estimator, step=1, cv=4) 
clf = GridSearchCV(selector, param_grid, cv=7) 
clf.fit(X, y) 
clf.best_estimator_.estimator_ 
clf.best_estimator_.grid_scores_ 
clf.best_estimator_.ranking_ 
+0

Danke schoen)) hoạt động này giống như một sự quyến rũ. Tôi thậm chí sẽ thêm print() vào mỗi 3 câu lệnh cuối cùng để hiển thị đầu ra của tất cả. –

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