2014-04-09 44 views
6

有沒有在scikit-learn中做蠻力特徵選擇的內置方法?即徹底評估輸入要素的所有可能組合,然後找出最佳子集。我熟悉「遞歸特徵消除」類,但我特別感興趣的是依次評估輸入特徵的所有可能組合。在scikit-learn中進行全面的功能選擇?

+0

像貪婪的功能選擇一樣? –

+0

@AbhishekThakur謝謝。但是不,我想要一個「愚蠢的」蠻力特徵選擇 - 實際上我可以在所有組合的循環中完成。但是如果存在這樣的話,更喜歡內置的方法/管道? – Dov

回答

5

不,最佳子集選擇未實現。最簡單的方法是自己寫。這應該讓你開始:

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 

該執行循環內ķ倍交叉驗證,因此與p功能給數據時,它會適合ķᵖ估計。

+0

感謝您的回答! – Dov

+2

代碼中有錯誤。它應該是'組合(xrange(n_features))'。 – nopper

+0

性能提示 - 在相同尺寸k的不同模型之間進行比較時,不需要執行cv - 僅比較列車集合統計量(如R^2)就足夠了。只有在比較不同尺寸的最佳候選人時,CV纔是必要的。見這本優秀書中的第6章:http://www-bcf.usc.edu/~gareth/ISL/ – ihadanny

0

如果您在Python 3中運行此代碼3 xrange()已更名爲range()