介紹
從嚴重不平衡的訓練數據集中生成有價值的分類模型在機器學習中可能具有挑戰性。在本文中,我將介紹一種簡單但有效的方法,ML工程師可以使用它從不平衡數據集中生成有效的分類模型。我還將概述ML工程師在處理嚴重不平衡的數據集時所犯的一些最常見的錯誤。
機器學習工程師經常遇到需要根據可用特徵將實例分類為兩個類別之一的問題。常見用例包括:
- 電郵垃圾郵件過濾
- 欺詐識別
- 根據X射線圖像預測患者是否患有癌性腫瘤
這三個例子共同具有積極的類別(垃圾郵件,欺詐或腫瘤存在),在人群中通常嚴重不足。例如,應用程序的用戶中只有不到1%會嘗試欺詐行為,其中絕大多數都參與正常的日常使用。
示例 - Weebly的不平衡數據集用例
場景: 想象一下,您是一家新僱用的機器學習工程師,可以完全訪問下面提供的訓練數據集。您的首要任務是開發一個模型,該模型可以識別用戶使用這兩個基於活動的特性儘可能準確地支付費用的可能性。
主要目標:預測最近創建的免費增值帳戶在不久的將來成為Weebly付費服務的用戶的可能性。
示例數據集:假設您已完成示例數據集的定量分析,並瞭解Weebly的用戶中只有不到2%的用戶沒有付費計劃。圖1(下面)顯示了這種不平衡數據集的外觀。在此圖中,付費用戶顯示為綠色標記,而保留免費服務的用戶顯示為紅色。
圖1:轉換和非轉換用戶的示意性不平衡數據集,為每個用戶繪製了兩個基於動作的特徵。最終支付計劃費用的用戶以綠色顯示,而繼續使用免費服務的用戶則顯示為紅色。
每個用戶,即每個數據點,嵌入到一個二維平面中,該平面跨越兩個可能重要的特徵,用於預測未來轉換為付費服務的可能性:
- 用戶在線與Weebly產品交互的總次數(例如點擊次數,登錄次數或編輯設置)
- 用戶最近一次操作與現在之間的小時數。
只有1%,即5萬個數據點中的500個,是正的,導致數據集嚴重失衡。
注意:實際構建的模型考慮了用戶屬性和實際數據的複雜結構。圖1所示的數據僅用於說明目的。
準確性陷阱
如果您對機器學習相對陌生,那麼您可能以前只使用過平衡良好的數據集,您的第一反應可能是直接插入並向訓練數據拋出一個標準分類器,而不做任何修改。
當您在圖1中的數據上訓練一個隨機森林分類器並在測試集上評估它的性能時,您會發現該模型在預測用戶是否會轉換方面的準確率為99%。您對此非常興奮,因此您立即向一些消費者展示了該模型。稍後,這些模型使用者要求您提供一個混淆矩陣,以幫助他們理解模型所犯錯誤的類型。當你把矩陣打印出來的時候,你會看到以下內容:
您意識到該模型從未預測用戶將在近20,000個用戶的整個測試集中進行轉換。相反,它會佔用每個用戶,無論該用戶採取的操作總數和上次活動的時間如何,並將其歸入“未轉換”類別。為什麼會這樣?圖1是否清楚地顯示了轉換和非轉換之間這兩個特徵分佈的差異?
上述場景中模型的行為是模型底層算法性質的直接結果。當訓練集中的陽性和陰性實例的數量之間存在平衡時,標準機器學習二元分類器通常最有效。當訓練發生時,模型會調整內部參數或生成決策邊界,以優化訓練集的整體預測準確性。因為每個實例同樣有助於模型的準確性,並且因為負實例遠遠超過數量上的正數,所以模型發現它可以通過簡單地為每個實例輸出“未轉換”來最大化準確性,而不管其輸入特徵如何。通過這種方式,算法“學到”的是,永遠不值得嘗試將正的實例識別為正的實例,因為這樣做可能會損害模型正確分類負實例的能力,這將使總體準確率比正的實例高出近100倍。
對於任何一個分類模型來說,幾乎總是存在一種權衡,即通過“召回”準確地識別正的事例,以及通過“sensitivity”準確地識別負的事例。一個給定的模型將有偏差,以優化與大多數類相對應的精度參數。在上面的示例中,模型的調用最終為(0)/(0 + 169)= 0%,這意味著,當呈現正實例時,模型將始終無法對它們進行正分類。另一方面,sensitivity為(16,497)/(0 + 16,497)= 1.0或100%,這意味著模型將始終正確地將負實例分類為負數。如果模型在召回期間增加1%,sensitivity降低1%,那麼所得到的準確度將是(0.01 * 200 + 0.99 * 19,800)/(20,000)= 19,604 / 20,000 = 98.02%,
如果你讀到這裡,還在想,
“是的,但99%的準確度非常棒”
但考慮到模型除基本統計數據外沒有提供任何信息。
ML工程師的工作是更深層次。
快速修復 - 欠採樣
在你的老闆發現你的第一個模型沒有為公司增加任何新價值之前,你需要訓練一個可以提供一些有用預測的新模型。
在由“分類器始終輸出零”字樣組成的搜索中,您會發現Stack Overflow帖子提到如果您對多數類進行隨機欠採樣,您的二元分類器可能會表現得更好,這樣您最終會得到相同數量的正面和負面實例在您的訓練數據集中。為了實現這一點,您知道完整數據集中有500個轉換器實例,因此您需要添加這些從非轉換器實例集合中隨機抽樣的500個實例,從而形成新的訓練集。這個平衡訓練集有1,000個實例,其中50%是正類,如圖3所示。
您在此新數據集上訓練第二個隨機森林分類器,並通過交叉驗證,您發現您的模型在預測用戶是否轉換時準確率為79%。這個數字聽起來幾乎不到99%,但此時你對60%以上的任何東西感到滿意。您檢查混淆矩陣以查看錯誤的分佈:
從這個矩陣中可以看出,該模型不再將所有實例集合到“未轉換”類別中。相反,它通過平衡的努力來識別正負類的實例,就像幾乎對稱的混淆矩陣所證明的那樣。您還注意到,召回增加到(128)/(36+128)= 78%,靈敏度降低到(135)/(42+135)= 76%。在最後的測試中,您將查看保存的數據集中的模型的準確性,其中包含原始的、不平衡的分佈。這似乎是明智的,因為當你將你的模型投入生產時,它會看到一個嚴重不平衡的數據集,與平衡的數據集非常不同。
從這個矩陣中,您可以看到,即使您的模型現在可以正確地從512個轉換用戶中挑選出414個,但它錯誤地預測10491個非轉換用戶將轉換。看來你的模特做了一個很壞的交易。為了正確識別數百個用戶,模型錯誤地識別了數千個用戶!在這一點上,重要的不是沮喪,而是退一步問自己,‘我的模型的最終目標是什麼?這個問題的答案將告知使用不平衡數據集的最後一步,即在正確識別陽性實例與陰性實例之間設置平衡。
不可避免的權衡
在處理分類問題時,人們總是可以在準確預測正類和準確預測負類之間做出權衡。在上面的示例中,對大多數類的採樣不足使得模型更關注於正確地預測積極實例。與原始樣本相比,它有效地表示了陽性情況。抽樣不足只是促成這種權衡的眾多方法之一。如何設置取捨平衡取決於誰將使用該模型以及出於什麼目的。
想象一下,你的模型的消費者突然告訴你,他們想用它來提供折扣券來激勵用戶購買產品。他們特別提到,他們不希望向那些似乎已經對購買感興趣的用戶發送報價,他們需要一種模式,為他們提供一大批用戶,而這些用戶幾乎不太可能進入付費服務。
這對您來說是個好消息,因為您使用平衡數據集構建的第二個模型在選擇要轉換的用戶集方面幾乎成功了80%。由於您的工作,您現在可以向涉眾提供一個包含將近40,000個不太可能購買產品的用戶的列表。事實上,只有大約96/ 40000 = 0.24%的用戶最終會轉換。儘管您的模型錯誤地識別了大約24%的非轉換器,但是模型使用者並不關心這種類型的錯誤。他們並不擔心給每個人發優惠券,他們只是一個龐大的群體,如果沒有外部動機,他們是不太可能支付的。如果你在一個不平衡的數據集上訓練你的初始模型,你將會使優惠券發送給所有的用戶,甚至是1%的用戶,導致一些相當憤怒的利益相關者!
最後……
與平衡數據相比,處理嚴重不平衡的數據會帶來額外的挑戰,但是理解一些簡單的概念可以幫助我們避免常見的錯誤。
一個訓練在未修改的不平衡數據集上的標準模型可能會導致一個幾乎完全專注於獲得大多數類正確的分類器。一個簡單的方法來推動模型更準確地識別少數群體是在訓練集中的大多數類。
在總體的準確性和分類器識別少數類的能力之間總有一種權衡,這兩個目標之間的平衡應該由模型用例的優先級決定。
閱讀更多 不靠譜的貓 的文章