重磅!8大策略讓你對抗機器學習數(shù)據(jù)集里的不均衡數(shù)據(jù)
你是不是也經(jīng)歷過這樣的事?
當你正在處理你的數(shù)據(jù)集的時候,你建立了一個分類模型并且它的精確度達到了90%,這時,你一定會想:這個結(jié)果太棒了!但是當你繼續(xù)更深地挖掘數(shù)據(jù)時你會發(fā)現(xiàn)這個90%的精確度只是一類數(shù)據(jù)的精確度,見鬼了!
以上是一個不均衡數(shù)據(jù)集的例子,這樣的不均衡數(shù)據(jù)集有時會引起這樣糟糕的結(jié)果。在這篇文章中你將可以領(lǐng)略一系列對抗上述例子的方法,在機器學習過程中,這些方法可以幫助你在挖掘或者訓練不均衡數(shù)據(jù)集時獲得一個比較好的結(jié)果。
在你的機器學習中發(fā)現(xiàn)一些平衡點
我們開始著手處理不均衡數(shù)據(jù)
我總是收到關(guān)于不均衡數(shù)據(jù)問題的郵件,例如:
“在我的訓練樣本里有一個二項分類問題,其中有一個數(shù)據(jù)集是比例為60:1的數(shù)據(jù)集,于是我對它運用了邏輯回歸的訓練方法,但是得到的結(jié)果是忽略這一個比率為60:1的數(shù)據(jù)集的訓練結(jié)果。
再例如:
“現(xiàn)在我正在運行一個分類模型。在我的數(shù)據(jù)集里面一共有3類數(shù)據(jù),這里我們稱它們分別為A,B和C,但是在我的訓練數(shù)據(jù)集里面A,B和C三類數(shù)據(jù)分別占了70%,25%和5%。在大多數(shù)情況下,結(jié)果都過度擬合A類數(shù)據(jù)。你能給我一些建議來解決這個問題嗎?
我嘗試寫了很多方法并且試圖找出最好的方式去解決這個問題。最終我采用了我一個學生的建議:
也許你即將推出的某一篇博客文章可以解決在訓練模型中表現(xiàn)出高度不平衡的數(shù)據(jù)的問題,并且概述其方法和期望。
挫敗感!
在運行模型時,不均衡數(shù)據(jù)會引起很多偏差和誤導(dǎo)。
當你發(fā)現(xiàn)你的研究里包含了不平衡類并且導(dǎo)致你所謂的好的結(jié)果成為了泡沫,你會感到非常沮喪。
當你在書籍,文章和博客里找不到你想要的可以解決不均衡數(shù)據(jù)的建議或方法時,打擊會再一次降臨。
放輕松點吧,這里有很多點子和方法可以解決這類不均衡數(shù)據(jù)的問題,你可以針對不均衡數(shù)據(jù)建立一個預(yù)測模型。
什么是不均衡數(shù)據(jù)?
不均衡數(shù)據(jù)通常是發(fā)生在分類數(shù)據(jù)不均衡的分類問題中。
打個比方說,現(xiàn)在有一個包含了100行數(shù)據(jù)的二項分類問題(兩類數(shù)據(jù))。其中有80行數(shù)據(jù)代表的是數(shù)據(jù)類型一,其余20行代表的是數(shù)據(jù)類型二。
這就是一個不均衡數(shù)據(jù)(不平衡類數(shù)據(jù)),它的一類數(shù)據(jù)和二類數(shù)據(jù)比是80:20或者說4:1.
你的不平衡類問題可能發(fā)生在二項分類問題或者多項分類問題中。大多數(shù)方法都可以運用在這兩種問題上。
因此,接下來的我們主要是針對二項分類問題進行分析討論,因為這樣比較容易去理解和描述。
不平衡現(xiàn)象是一種常見現(xiàn)象
大多數(shù)分類數(shù)據(jù)集是不會擁有完全相等的分類數(shù)據(jù)集,但小的差異往往是沒有影響的。
在這些問題中有些不平衡問題不僅僅是常見,而是人們可以預(yù)想到的。例如,在欺詐交易數(shù)據(jù)集分類問題中數(shù)據(jù)集是不平衡。該交易的絕大部分是屬于“不是詐騙”類,只有極少數(shù)會在“欺詐”級。
另一個例子是客戶流失的數(shù)據(jù)集,其中客戶絕大多數(shù)保持服務(wù)(“無流失”級)只有一小部分的顧客取消其認購(“流失”級)。
在上訴的例子中,如果有一種分類不平衡率達到4:1那么這個不平衡可能會導(dǎo)致結(jié)果出現(xiàn)誤差。
精度悖論
在這篇文章的介紹當中,精度悖論是一些特定情況的名稱。
這個準確性指標的例子告訴我們,有優(yōu)異的精度(如90%)但是這個準確性只是反映基本的類分布。
這是很常見的,因為在評估分類問題的模型時,分類精度通常是我們第一個采用的措施方法。
偏向一類數(shù)據(jù)!
當我們訓練的不均衡數(shù)據(jù)時,我們的模型怎么了?
正如你設(shè)想的一樣,在數(shù)據(jù)不均衡的情況下,我們得到90%的準確率(比如包含90%的數(shù)據(jù)類型一的實例)是因為我們的模型觀察數(shù)據(jù)并且智能地總是根據(jù)數(shù)據(jù)類型一的數(shù)據(jù)進行預(yù)測,并且盡量達到最高精度。
當我們規(guī)則基于這個方法進行的時候似乎得到的是最好的答案。但是如果你在最后的模型中仔細考察這個規(guī)則,你會發(fā)現(xiàn)似乎這個方法是忽略其他數(shù)據(jù)在對一類數(shù)據(jù)進行預(yù)測。
八大戰(zhàn)術(shù),對抗不平衡類數(shù)據(jù)
現(xiàn)在,我們已經(jīng)了解了什么是不均衡數(shù)據(jù)以及為什么他會引起分類精度的誤差。
所以我們的應(yīng)對解決方法是什么呢?
1) 可以擴大數(shù)據(jù)樣本嗎?
你可能會認為這樣做很愚蠢,但擴大樣本數(shù)據(jù)總是容易被忽視。
你能收集更多的數(shù)據(jù)嗎?花一秒鐘,想想你是否能夠收集更多和問題相關(guān)的數(shù)據(jù)。
在集合中,一個更大的數(shù)據(jù)集,就有可能挖掘出不同的或許更平衡的方面。
之后當我們尋找重復(fù)采集的數(shù)據(jù)樣本時,一些小樣本類數(shù)據(jù)的例子可能是有幫助的。
2) 試著改變你的績效標準
精度是一個不適用于不平衡的數(shù)據(jù)集的績效指標。正如我們已經(jīng)看到的,這是一種誤導(dǎo)。
在處理不平衡類時,有些更加理想的指標可以給你更加具有說服力的結(jié)果。
在我的文章中,我給更多的建議和措施去選擇不同的績效標準:“Classification Accuracy is Not Enough: More Performance Measures You Can Use”。
在這篇文章里我主要著重于講述如何對乳腺癌患者復(fù)發(fā)這個不均衡數(shù)據(jù)集進行分類。
這篇文章中我推薦了以下幾個績效標準,相比于傳統(tǒng)的精確度,這些績效標準可以更加深入地洞察模型的準確率:
- 混淆矩陣:將要預(yù)測的數(shù)據(jù)分到表里來顯示正確的預(yù)測(對角線),并了解其不正確的預(yù)測的類型(哪些類被分配了不正確的預(yù)測);
- 精度:一種分類準確性的處理方法;
- 召回率:一種分類完整性的處理方法;
- F1分數(shù)(或F-分):精度和召回率的加權(quán)平均。
同時,我還推薦你關(guān)注一下以下幾點:
- Kappa(或者Cohen’s kappa):根據(jù)數(shù)據(jù)中集合數(shù)據(jù)的不平衡點來標準化分類精度;
- ROC曲線:類似于精度和召回率,準確性被分為敏感性和特異性,并且可以基于這些值的平衡閾值來選擇模型。
在我們的文章“Assessing and Comparing Classifier Performance with ROC Curves”中你可以學到更多關(guān)于運用ROC曲線來比較分類準確度的方法。
你是不是仍然無法確定呢?試著運用Kappa,他會告訴你一些究竟如何處理分類準確度的建議和方法。
3)嘗試對你的數(shù)據(jù)重新抽樣
你可以改變將要用來建立預(yù)測模型的數(shù)據(jù)集來獲得更加平衡的數(shù)據(jù)集。
這種變化被稱為抽樣數(shù)據(jù)集,您主要可以運用以下兩種方法來使數(shù)據(jù)分類更加均衡:
1.您可以從代表性不足的類(又稱為過抽樣或者更加正式的抽樣來代替)添加實例的副本,或者
2.您可以從過度代表類里刪除實例,稱為抽樣不足。
這些方法往往很容易實現(xiàn),而且運行速度也很快。因此我認為他們都是不錯的出發(fā)點。
事實上,我會建議你最好嘗試以上提到的兩種不平衡數(shù)據(jù)集的處理方法,這樣便于你比較一下基于你的首選準確度處理方法上,另一種方法是否效果更好,或者是否有所促進作用。
你可以通過維基百科題為“Oversampling and undersampling in data analysis”的文章了解更多相關(guān)咨詢。
一些經(jīng)驗的規(guī)則
- 當你的數(shù)據(jù)量很大時可以考慮測試抽樣不足(一萬或者十萬條記錄或更多)
- 當你沒有大量的數(shù)據(jù)時可以考慮測試抽樣過度(一萬條記錄或更少)
- 考慮測試隨機和非隨機的抽樣方案(如分層)。
- 考慮用不同的重抽樣率進行測試(例如,在一個二元分類問題中,您不必一定要針對1:1的比例,可以嘗試其他比例)
4) 嘗試生成人工樣本
一種簡單生成人工樣本的方法是從在少數(shù)類的實例中隨機抽樣屬性。
在數(shù)據(jù)集中,你可以根據(jù)經(jīng)驗對它抽樣或者你可以使用類似于樸素貝葉斯這種可以在反向運行時,對每個屬性進行獨立抽樣的模型。你將有更多的不同的數(shù)據(jù),但可能不會保留其屬性之間的非線性關(guān)系。
這里有一些系統(tǒng)方法可以用來生成人工演變。其中最流行的算法被稱為SMOTE或Synthetic Minority Over-sampling技術(shù)。
正如其名,SMOTE是過度抽樣的方法。它的工作原理是從小類的數(shù)據(jù)中生成人工樣本,而不是創(chuàng)建副本。該算法選擇兩個或更多個類似的例子(使用距離度量),然后隨機干擾一個實例中的一個屬性,比較其差異。
想要了解更多關(guān)于SMOTE方法,請搜索2002年名為“SMOTE: Synthetic Minority Over-sampling Technique”的原文章。
現(xiàn)在有很多的SMOTE算法的實現(xiàn)方法,例如:
- 在Python,一起來看看在“UnbalancedDataset”模塊。它提供了許多SMOTE實現(xiàn)方法,以及各種其他再抽樣技術(shù),你都可以嘗試;
- 在R中,DMwR 包提供SMOTE的實現(xiàn)方法;
- 在Weka中,你可以使用SMOTE supervised filter。
5) Try Different Algorithms
通常來說,我會強烈建議你對于所有問題不要總是使用自己最喜歡的模型。對于所給的問題你至少應(yīng)該用不同類型的算法對其進行抽查。
欲了解更多關(guān)于抽查的方法,請參閱我的文章“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
話雖這么說,決策樹往往在處理不平衡類數(shù)據(jù)集表現(xiàn)不錯。在創(chuàng)建樹的過程中使用類變量的分裂規(guī)則,可以強制地將兩個類很好的進行處理。
如果有疑問,請嘗試一些流行的決策樹算法,如C4.5,C5.0,CART和隨機森林。
對于使用決策樹的一些R代碼,請參閱我的文章,標題為“Non-Linear Classification in R with Decision Trees”。
例如,對于Python和scikit-learn中使用CART的一個例子,請參考我的文篇,名為“Get Your Hands Dirty With Scikit-Learn Now”的文章。
6) 嘗試名義變量模型
您可以使用相同的算法,但是在不同問題中他們可能會給出不同的觀點。
因為在訓練過程中,對于小類數(shù)據(jù)會產(chǎn)生分類錯誤,因此名義變量分類會產(chǎn)生額外費用。這些名義變量會使模型偏向于更加注重少數(shù)類數(shù)據(jù)。
通常來說掌握一類名義變量或者權(quán)重是為了學習方法。例如一些方法的名義變量penalized-SVM和penalized-LDA。
另外,對于名義變量模型也具有通用框架。例如,Weka中有一個CostSensitiveClassifier,它可以封裝任何分類和自定義分類應(yīng)用中錯過的名義變量矩陣。
如果你鎖定到一個特定的算法并且無法重新取樣或是你得到的結(jié)果不好時,使用名義變量是可取的。它提供了另一種方法來“平衡”類。建立名義變量矩陣是很復(fù)雜的,也許您將不得不嘗試各種設(shè)置名義變量的方法,看看什么方法是最適合用來解決你的問題。
7) 嘗試從不同的觀點進行思考
對于研究不平衡數(shù)據(jù)集的鄰域。他們有自己的算法,措施和術(shù)語。
從這些觀點處罰,縱觀和思考你的問題,有時一些想法會有所改變。
兩個你可能想要考慮的是異常檢測和變化檢測。
異常檢測是罕見事件的檢測。這可能是根據(jù)一系列的系統(tǒng)調(diào)用,通過它的振動或一個由程序指示的惡意活動而產(chǎn)生的機器故障。這樣的事件相比正常操作是罕見的。
這種思維的轉(zhuǎn)變在于考慮以小類作為異常值類,它可以幫助你獲得一種新方法來分離和分類的樣本。
除了變化檢測是找尋找它的變化而不是差異以外,變化檢測類似于異常檢測。這可能是在觀察使用模式或銀行交易過程中用戶的行為變化。
對于分類的問題,這兩個轉(zhuǎn)變具有更加實時的角度,它可能會給你一些新的方式去思考你的問題以及讓你嘗試更多新的技術(shù)。
8) 嘗試一些新的創(chuàng)意
在你的問題里面挖掘并思考如何把它分解成更小的問題,這些問題更容易處理。
為了尋找靈感,看一看別人對于問題:“In classification, how do you handle an unbalanced training set?”給出的一些有創(chuàng)意的答案。
例如:
分解你的大類變成小類…
…使用一類分類…(比如像將其作為異常檢測對待)
…不是將不平衡類訓練集重抽樣成一組平衡集,而是一些平衡集。在這個集合中,同時運行所有集產(chǎn)生的結(jié)果可能比只運行一個集的結(jié)果更好。
這些只是一小部分你可以嘗試的有趣的和創(chuàng)造性的想法。
對于更多的想法,請搜索reddit 文章——“Classification when 80% of my training set is of one class”的評論。
選擇一種方法,然后實際操作它
你沒有必要去做一個精通所有方法的奇才或者統(tǒng)計學家建立一個精確并且可靠的不平衡類數(shù)據(jù)集模型。
以上我們已經(jīng)講述了許多可以用在不平衡類數(shù)據(jù)集模型的技術(shù)和方法。
但愿這里有一到兩個方法的模型你可以快速地較好地理解并且運用,例如:改變你精確度的指標和重新對你的數(shù)據(jù)集進行抽樣。這兩個方法都是比較快速的并且對問題影響會很明顯。
那么你想要嘗試哪一個方法呢?
總結(jié)
記住,我們不可能知道哪一個方法會得出最好的結(jié)果。
你可以發(fā)散地選擇這個方法或者那個方法,但是,在最后我給你的最好的建議是“變成科學家”并且根據(jù)經(jīng)驗測試每一個方法,選擇結(jié)果做好的那一個。
從點點滴滴開始做起,根據(jù)自己現(xiàn)有的知識一步一步完善。