2015-10-27 13 views
6

tôi đã sử dụng đường ống và grid_search để chọn các thông số tốt nhất và sau đó sử dụng các thông số này để phù hợp với đường ống tốt nhất ('best_pipe'). Tuy nhiên, kể từ khi feature_selection (SelectKBest) là trong các đường ống đã không có phù hợp áp dụng cho SelectKBest.lựa chọn tính năng python trong đường ống: cách xác định tên đối tượng địa lý?

Tôi cần biết tên đối tượng địa lý của các đối tượng địa lý được chọn 'k'. Bất kỳ ý tưởng làm thế nào để lấy chúng? Cảm ơn bạn trước

from sklearn import (cross_validation, feature_selection, pipeline, 
        preprocessing, linear_model, grid_search) 
folds = 5 
split = cross_validation.StratifiedKFold(target, n_folds=folds, shuffle = False, random_state = 0) 

scores = [] 
for k, (train, test) in enumerate(split): 

    X_train, X_test, y_train, y_test = X.ix[train], X.ix[test], y.ix[train], y.ix[test] 

    top_feat = feature_selection.SelectKBest() 

    pipe = pipeline.Pipeline([('scaler', preprocessing.StandardScaler()), 
           ('feat', top_feat), 
           ('clf', linear_model.LogisticRegression())]) 

    K = [40, 60, 80, 100] 
    C = [1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001] 
    penalty = ['l1', 'l2'] 

    param_grid = [{'feat__k': K, 
        'clf__C': C, 
        'clf__penalty': penalty}] 

    scoring = 'precision' 

    gs = grid_search.GridSearchCV(estimator=pipe, param_grid = param_grid, scoring = scoring) 
    gs.fit(X_train, y_train) 

    best_score = gs.best_score_ 
    scores.append(best_score) 

    print "Fold: {} {} {:.4f}".format(k+1, scoring, best_score) 
    print gs.best_params_ 

best_pipe = pipeline.Pipeline([('scale', preprocessing.StandardScaler()), 
          ('feat', feature_selection.SelectKBest(k=80)), 
          ('clf', linear_model.LogisticRegression(C=.0001, penalty='l2'))]) 

best_pipe.fit(X_train, y_train) 
best_pipe.predict(X_test) 

Trả lời

5

Bạn có thể truy cập vào bộ chọn tính năng theo tên trong best_pipe:

features = best_pipe.named_steps['feat'] 

Sau đó, bạn có thể gọi transform() trên một mảng chỉ số để có được tên của các các cột đã chọn:

X.columns[features.transform(np.arange(len(X.columns)))] 

Đầu ra ở đây sẽ là tên cột tám mươi được chọn trong đường ống.

+0

Một điều trị thực sự để nhận được giải pháp từ bạn Jake, bạn thực sự đã giúp tôi tìm hiểu python với video hướng dẫn pycon của bạn. Tuy nhiên, tôi nhận được lỗi "không thể chuyển đổi chuỗi thành float: score_575-600" (score_575-600 là tên của một trong các cột) cách này có thể được giải quyết? – figgy

+0

Ah - Tôi quên rằng bộ chọn đối tượng địa lý không hoạt động trên chuỗi. Thử phiên bản cập nhật ở trên. Vui mừng khi biết các video hữu ích! – jakevdp

+0

vẫn không chắc chắn cách tránh lỗi ở trên, nhưng giải pháp bước đôi này ít nhất đã cho tôi tên cột cho k các tính năng tốt nhất: tính năng = best_pipe.named_steps ['feat']. Get_support() x_cols = X.columns .values ​​[features == True] x_cols – figgy

3

Đây có thể là giải pháp thay thế hướng dẫn: Tôi đã gặp phải một nhu cầu tương tự như những gì được OP yêu cầu. Nếu ai muốn để có được chỉ số k tính năng tốt nhất trực tiếp từ GridSearchCV:

finalFeatureIndices = gs.best_estimator_.named_steps["feat"].get_support(indices=True) 

Và qua index manipulation, có thể nhận được của bạn finalFeatureList: Câu trả lời

finalFeatureList = [initialFeatureList[i] for i in finalFeatureIndices] 
3

Jake hoàn toàn hoạt động. Nhưng tùy thuộc vào bộ chọn tính năng bạn đang sử dụng, có một tùy chọn khác mà tôi cho là sạch hơn. Người này đã làm việc cho tôi:

X.columns[features.get_support()] 

Nó đã cho tôi câu trả lời giống hệt câu trả lời của Jake. Và bạn có thể xem thêm về nó trong the docs, nhưng get_support trả về một mảng giá trị true/false cho dù cột có được sử dụng hay không. Ngoài ra, cần lưu ý rằng X phải có hình dạng giống hệt với dữ liệu đào tạo được sử dụng trên bộ chọn đối tượng địa lý.

+0

Chắc chắn thích câu trả lời này, 'features.transform (np.arange (len (X.columns)))' về cơ bản là dài hạn cho 'features.get_support()'. – andrew

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