簡體   English   中英

預測類別或類別概率?

[英]Predict classes or class probabilities?

我目前正在將 H2O 用於分類問題數據集。 我正在 python 3.6 環境中使用H2ORandomForestEstimator對其進行測試。 我注意到預測方法的結果給出了 0 到 1 之間的值(我假設這是概率)。

在我的數據集中,目標屬性是數字,即True值為 1, False值為 0。我確保將類型轉換為目標屬性的類別,但仍然得到相同的結果。

然后我修改了代碼,在 H2OFrame 上仍然使用asfactor()方法將目標列轉換為因子,結果沒有任何變化。

但是當我將目標屬性中的值分別更改為 1 和 0 的 True 和 False 時,我得到了預期的結果(即)輸出是分類而不是概率。

  • 得到分類預測結果的正確方法是什么?
  • 如果概率是數值目標值的結果,那么在多類分類的情況下如何處理它?

原則上和理論上,硬分類和軟分類(即分別返回類別概率)是不同的方法,每種方法都有自己的優點和缺點。 考慮以下示例,來自論文“硬分類還是軟分類?” 大型一體機

基於邊際的分類器在機器學習和分類問題的統計中都很流行。 在眾多的分類器中,有些是分類器,有些是分類器。 軟分類器顯式地估計類條件概率,然后根據估計的概率進行分類。 相比之下,硬分類器直接針對分類決策邊界而不產生概率估計。 這兩種分類器基於不同的哲學,各有各的優點。

也就是說,在實踐中,今天使用的大多數分類器,包括隨機森林(我能想到的唯一例外是 SVM 系列)實際上都是分類器:它們在下面實際產生的是類似概率的度量,隨后,結合隱式閾值(通常在二進制情況下默認為 0.5),給出了像0/1True/False這樣的硬類成員資格。

得到分類預測結果的正確方法是什么?

對於初學者來說,從概率到硬類總是可能的,但事實並非如此。

一般來說,考慮到你的分類器實際上是一個分類器,只得到最后的硬分類( True/False )會給過程帶來“黑匣子”的味道,原則上這應該是不可取的; 直接處理產生的概率,並且(重要!)明確控制決策閾值應該是這里的首選方法。 根據我的經驗,這些微妙之處往往被新從業者忽略; 例如考慮以下內容,來自交叉驗證線程降低分類概率閾值

當您為新樣本的每一類輸出概率時,您的練習的統計部分就結束了。 選擇一個閾值,超過該閾值,您將新觀察結果分類為 1 與 0 不再是統計數據的一部分。 它是決策組件的一部分。

除了像上面這樣的“軟”參數(無意識的雙關語),在某些情況下,您需要直接處理潛在的概率和閾值,即二進制分類中的默認閾值 0.5 會導致您誤入歧途,最明顯的是當您的類不平衡; 有關此類情況的具體示例,請參閱我在High AUC 中的回答, 但由於數據不平衡(以及其中的鏈接)而導致錯誤預測

老實說,我對你報告的 H2O 的行為感到相當驚訝(我個人沒有使用過它),即輸出的類型受輸入表示的影響; 這不應該是這種情況,如果確實如此,我們可能會遇到設計不良的問題。 比較例如 scikit-learn 中的隨機森林分類器,它包括兩種不同的方法, predictpredict_proba ,分別獲得硬分類和基礎概率(並檢查文檔,很明顯predict的輸出基於概率估計,之前已經計算過)。

如果概率是數值目標值的結果,那么在多類分類的情況下如何處理它?

除了簡單的閾值不再有意義之外,這里原則上沒有什么新東西; 再次,來自 scikit-learn 中的隨機森林predict文檔:

預測的類別是具有最高平均概率估計的類別

也就是說,對於 3 個類(0, 1, 2) ,您會得到[p0, p1, p2]的估計值(根據概率規則,元素總和為 1),並且預測的類是最高概率,例如對於[0.12, 0.60, 0.28]的情況,第 1 類。 這是一個具有 3 類 iris 數據集的可重現示例(用於 GBM 算法和 R,但基本原理相同)。

添加到@desertnaut 的答案中,並且由於您將此問題標記為 Python,因此您將如何處理問題的最后一部分:

如果概率是數值目標值的結果,那么在多類分類的情況下如何處理它?

y_pred = np.argmax(prob, axis=1)

這將一個轉換(num_examples, n_classes)的概率值的陣列,以一(num_examples, )預測的類數組。

暫無
暫無

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

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