2015-11-19 22 views
2

我試圖使用scikit學習Randomized Logistic Regression特徵選擇的方法,但我一直運行到的情況下,它殺死所有的功能,同時安裝,並返回:如何在scikit-learn中使用隨機Logistic迴歸找到最低正則化參數(C)?

ValueError: Found array with 0 feature(s) (shape=(777, 0)) while a minimum of 1 is required.

這是符合市場預期,顯然,因爲我正在將正則化參數 - C - 降低到可笑的低水平(請注意,這是數學正則化參數lambda的倒數,即C = 1/lambda,因此C越低,正則化越極端)。

我的問題是,我怎麼能提前找到最低的C我可以選擇,而不需要手動測試多個值並將那些拋出這個錯誤的值刪除?

在我的情況下(從250個功能開始),我知道C = 0.5是我可以走的最低。 0.1,0.4甚至0.49拋出一個錯誤,因爲他們把我的功能設置爲0(並給出我上面粘貼的shape = (blah, 0)錯誤)。

另一個說明(也許這應該是一個不同的問題) - 更高的我的C(也就是我的lambda或正則化參數) - 我的機器花費的時間越長。再加上我通常在RLR和SVM或RF之後通過帶有StandardScaler的管線運行RLR,並且還使用交叉驗證,使得在我的機器上運行所需的總時間以指數方式爆炸。

回答

0

正如我在Leb的回答中所提到的,正確答案是它取決於數據。對於sklearn.pipeline.Pipelinesklearn.grid_search.GridSearchCV來說,目前沒有辦法(截至目前)來捕獲這個特定情況。如果正則化參數足夠緊湊,以至於它剔除輸入數據集中的所有要素,並且沒有剩下要訓練的內容,則當GridSearchCV正在搜索最佳參數時,Pipeline中即將出現的分類器將會失敗(顯然)。

我在這種情況下處理這種情況的方式是,在向Pipeline中添加任何形式的特徵選擇之前,全面瞭解和瀏覽我的數據。

作爲一個示例,我使用Pipeline以外的特徵選擇變換器,並手動將它應用於不同的一組值。我特別關注極端情況(非常高的正規化和非常低的正常化)。這給了我一個關於何時特徵選擇變換器剔除所有特徵,以及何時完全不選擇特徵的想法。然後將我的特徵選擇變壓器加回到Pipeline中,並將其轉換爲GridSearchCV。在這裏,我確保搜索到的特徵選擇變壓器的參數在我之前發現的兩個極端情況下都很舒適 - 這可以防止我的GridSearchCV碰到零功能情況並導致故障。

0

沒有代碼有點難以查明問題,原因是我不相信這個錯誤與您的C值有關。但要回答這個問題,你需要GridSearchCV

的例子在那裏是不夠好,讓您開始:

>>> from sklearn import svm, grid_search, datasets 
>>> iris = datasets.load_iris() 
>>> parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} 
>>> svr = svm.SVC() 
>>> clf = grid_search.GridSearchCV(svr, parameters) 
>>> clf.fit(iris.data, iris.target) 
...        
GridSearchCV(cv=None, error_score=..., 
     estimator=SVC(C=1.0, cache_size=..., class_weight=..., coef0=..., 
        decision_function_shape=None, degree=..., gamma=..., 
        kernel='rbf', max_iter=-1, probability=False, 
        random_state=None, shrinking=True, tol=..., 
        verbose=False), 
     fit_params={}, iid=..., n_jobs=1, 
     param_grid=..., pre_dispatch=..., refit=..., 
     scoring=..., verbose=...) 

你可以一直把它進一步通過指定cross-validationcv變量。另外,如果您的數據很大,請不要忘記更改n_jobs,非常有幫助。

現在我不認爲這是C的價值,但與您將數據呈現給迴歸的方式更相關。再次,沒有代碼,很難清楚地看到它。

+0

是的,我用'n_jobs = -1'來進行所有訓練。 此外,我做了一些測試,錯誤肯定與'C'值有關。 RLR的不同數量特徵給了我不同的'C'值,可以導致所有變量的擠出。畢竟,這是L1/Lasso式的迴歸,它傾向於將特徵係數降低到0(與L2壓制所有這一切的情況相反)。 我想答案是,它確實取決於輸入數據以及試圖實現的內容。 – alichaudry