簡體   English   中英

如何使用Logistic回歸和scikit學習進行回歸而不是分類

[英]How to do regression as opposed to classification using logistic regression and scikit learn

我需要預測的目標變量是probabilities (與標簽相反)。 我的訓練數據中的相應列也采用這種形式。 我不想通過對目標設定閾值來創建信息分類問題而丟失信息。

如果我使用二進制標簽訓練logistic regression classifier ,則sk-learn logistic回歸API允許在預測時獲得概率。 但是,我需要用概率來訓練它。 是否可以通過scikits-learn或適合的Python包將其縮放到1K維的100K數據點,來實現此目的。

這是一個很好的問題,因為(與人們可能相信的相反),邏輯回歸作為回歸有很多合法用途。

如果您堅持使用真正的邏輯回歸,可以使用三種基本方法,另外兩種方法也可以提供相似的結果。 它們都假設您的目標輸出在0到1之間。大多數時候,除非您有幸使用支持自定義內核和X-S的SGD-R平台,否則您將不得不“手動”生成訓練/測試集。開箱即用的驗證支持。

請注意,鑒於您的特定用例,可能需要“不是很正確的邏輯回歸”選項。 這些方法的缺點是,如果要通過刪除弱功能來減少特征空間,則需要花更多的精力來查看每個特征的權重/重要性。

使用優化的直接方法

如果您不介意進行一些編碼,則可以使用scipy優化功能。 這很簡單:

  1. 創建以下類型的函數:y_o =反邏輯(a_0 + a_1x_1 + a_2x_2 + ...)

其中反邏輯(z)= exp ^(z)/(1 + exp ^ z)

  1. 使用scipy最小化可最小化所有數據點上的-1 * [y_t * log(y_o)+(1-y_t)* log(1-y_o)]之和。 為此,您必須設置一個以(a_0,a_1,...)作為參數的函數,然后創建該函數,然后計算損耗。

具有自定義損失的隨機梯度下降

如果您碰巧正在使用具有自定義損失的SGD回歸的平台,則可以使用它,指定損失y_t * log(y_o)+(1-y_t)* log(1-y_o)

一種方法是僅進行sci-kit學習並將對數損失添加到回歸SGD求解器中。

轉換為分類問題

您可以按照@ jo9k的描述通過過采樣將問題轉換為分類問題。 但是請注意,即使在這種情況下,也不應使用標准的X驗證,因為數據不再獨立。 您將需要手動將數據分解為訓練/測試集,並且僅在將它們分解后才進行超采樣。

轉換為SVM

(編輯:我進行了一些測試,發現我的測試集上的S形內核表現不佳。我認為它們需要進行一些特殊的預處理才能如預期的那樣工作。具有S形內核的SVM等效於2層tanh神經網絡,該網絡應適合於以訓練數據輸出為概率的結構進行的回歸任務。我可能會在進一步審查后再討論。)

使用帶有Sigmoid內核的SVM,應該獲得與邏輯回歸相似的結果。 您可以使用sci-kit Learn的SVR功能並將內核指定為Sigmoid。 您可能會在1000個功能中擁有100,000個數據點,從而遇到性能問題。...這導致了我的最終建議:

使用近似內核轉換為SVM

這種方法將使結果離真正的邏輯回歸還差一點,但它的性能非常好。 該過程如下:

  1. 使用sci-kit-learn的RBFsampler為數據集顯式構造一個近似rbf內核。

  2. 通過該內核處理數據,然后使用帶有鉸鏈損耗的sci-kit-learn的SGDRegressor在轉換后的數據上實現高性能SVM。

上面的代碼在這里布置

我希望回歸器使用問題的結構。 這樣的結構之一就是目標是概率

scikit-learn ,您不能與非指標概率產生交叉熵損失; API中未實現此功能,不支持此功能。 這是scikit-learn的限制。

通常,根據scikit-learn的文檔,損失函數的形式為Loss(prediction, target) ,其中預測是模型的輸出,而target是真實值。

在邏輯回歸的情況下,預測是(0,1)上的值(即“軟標簽”),而目標是01 (即“硬標簽”)。


對於邏輯回歸,您可以根據實例的標簽概率對實例進行過度采樣,從而將概率近似為目標。 例如,如果對於給定的樣本, class_1概率為0.2 ,而class_2 has probability 0.8 , then generate 10 training instances (copied sample): 8 with class_2的as "ground truth target label" and 2 with class_1`。

顯然,這是解決方法,效率不是很高,但是應該可以正常工作。

如果可以采用升采樣方法,則可以pip install eli5 ,並將eli5.lime.utils.fit_probascikit-learnLogistic Regression classifier一起使用。


替代解決方案是在Tensorflow中實現(或找到實現?) LogisticRegression ,您可以在其中定義損失函數。


在編譯此解決方案時,我使用了scikit-learn-多項式邏輯回歸的答案, 並以概率作為目標變量,在軟標簽上進行了scikit-learn分類 我建議那些人以獲得更多見解。

而不是在scikit學習庫中使用predict ,而是使用predict_proba函數

請參考此處: http : //scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.predict_proba

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM