從重采樣到數(shù)據(jù)合成:如何處理機(jī)器學(xué)習(xí)中的不平衡分類(lèi)問(wèn)題?
如果你研究過(guò)一點(diǎn)機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué),你肯定遇到過(guò)不平衡的類(lèi)分布(imbalanced class distribution)。這種情況是指:屬于某一類(lèi)別的觀測(cè)樣本的數(shù)量顯著少于其它類(lèi)別。
這個(gè)問(wèn)題在異常檢測(cè)是至關(guān)重要的的場(chǎng)景中很明顯,例如電力盜竊、銀行的欺詐交易、罕見(jiàn)疾病識(shí)別等。在這種情況下,利用傳統(tǒng)機(jī)器學(xué)習(xí)算法開(kāi)發(fā)出的預(yù)測(cè)模型可能會(huì)存在偏差和不準(zhǔn)確。
發(fā)生這種情況的原因是機(jī)器學(xué)習(xí)算法通常被設(shè)計(jì)成通過(guò)減少誤差來(lái)提高準(zhǔn)確率。所以它們并沒(méi)有考慮類(lèi)別的分布/比例或者是類(lèi)別的平衡。
這篇指南描述了使用多種采樣技術(shù)來(lái)解決這種類(lèi)別不平衡問(wèn)題的各種方法。本文還比較了每種技術(shù)的優(yōu)缺點(diǎn)。最后,本文作者還向我們展示了一種讓你可以創(chuàng)建一個(gè)平衡的類(lèi)分布的方法,讓你可以應(yīng)用專(zhuān)門(mén)為此設(shè)計(jì)的集成學(xué)習(xí)技術(shù)(ensemble learning technique)。
目錄
1. 不平衡數(shù)據(jù)集面臨的挑戰(zhàn)
2. 處理不平衡數(shù)據(jù)集的方法
3. 例證
4. 結(jié)論
一、不平衡數(shù)據(jù)集面臨的挑戰(zhàn)
當(dāng)今公用事業(yè)行業(yè)面臨的主要挑戰(zhàn)之一就是電力盜竊。電力盜竊是全球第三大盜竊形式。越來(lái)越多的公用事業(yè)公司傾向于使用高級(jí)的數(shù)據(jù)分析技術(shù)和機(jī)器學(xué)習(xí)算法來(lái)識(shí)別代表盜竊的消耗模式。
然而,最大的障礙之一就是海量的數(shù)據(jù)及其分布。欺詐性交易的數(shù)量要遠(yuǎn)低于正常和健康的交易,也就是說(shuō),它只占到了總觀測(cè)量的大約 1-2%。這里的問(wèn)題是提高識(shí)別罕見(jiàn)的少數(shù)類(lèi)別的準(zhǔn)確率,而不是實(shí)現(xiàn)更高的總體準(zhǔn)確率。
當(dāng)面臨不平衡的數(shù)據(jù)集的時(shí)候,機(jī)器學(xué)習(xí)算法傾向于產(chǎn)生不太令人滿意的分類(lèi)器。對(duì)于任何一個(gè)不平衡的數(shù)據(jù)集,如果要預(yù)測(cè)的事件屬于少數(shù)類(lèi)別,并且事件比例小于 5%,那就通常將其稱為罕見(jiàn)事件(rare event)。
1. 不平衡類(lèi)別的實(shí)例
讓我們借助一個(gè)實(shí)例來(lái)理解不平衡類(lèi)別。
例子:在一個(gè)公用事業(yè)欺詐檢測(cè)數(shù)據(jù)集中,你有以下數(shù)據(jù):
- 總觀測(cè) = 1000
- 欺詐觀測(cè) = 20
- 非欺詐觀測(cè) = 980
- 罕見(jiàn)事件比例 = 2%
這個(gè)案例的數(shù)據(jù)分析中面臨的主要問(wèn)題是:對(duì)于這些先天就是小概率的異常事件,如何通過(guò)獲取合適數(shù)量的樣本來(lái)得到一個(gè)平衡的數(shù)據(jù)集?
2. 使用標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)技術(shù)時(shí)面臨的挑戰(zhàn)
面臨不平衡數(shù)據(jù)集的時(shí)候,傳統(tǒng)的機(jī)器學(xué)習(xí)模型的評(píng)價(jià)方法不能精確地衡量模型的性能。
諸如決策樹(shù)和 Logistic 回歸這些標(biāo)準(zhǔn)的分類(lèi)算法會(huì)偏向于數(shù)量多的類(lèi)別。它們往往會(huì)僅預(yù)測(cè)占數(shù)據(jù)大多數(shù)的類(lèi)別。在總量中占少數(shù)的類(lèi)別的特征就會(huì)被視為噪聲,并且通常會(huì)被忽略。因此,與多數(shù)類(lèi)別相比,少數(shù)類(lèi)別存在比較高的誤判率。
對(duì)分類(lèi)算法的表現(xiàn)的評(píng)估是用一個(gè)包含關(guān)于實(shí)際類(lèi)別和預(yù)測(cè)類(lèi)別信息的混淆矩陣(Confusion Matrix)來(lái)衡量的。
如上表所示,模型的準(zhǔn)確率 = (TP+TN) / (TP+FN+FP+TP)
然而,在不平衡領(lǐng)域時(shí),準(zhǔn)確率并不是一個(gè)用來(lái)衡量模型性能的合適指標(biāo)。例如:一個(gè)分類(lèi)器,在包含 2% 的罕見(jiàn)事件時(shí),如果它將所有屬于大部分類(lèi)別的實(shí)例都正確分類(lèi),實(shí)現(xiàn)了 98% 的準(zhǔn)確率;而把占 2% 的少數(shù)觀測(cè)數(shù)據(jù)視為噪聲并消除了。
3. 不平衡類(lèi)別的實(shí)例
因此,總結(jié)一下,在嘗試?yán)貌黄胶鈹?shù)據(jù)集解決特定業(yè)務(wù)的挑戰(zhàn)時(shí),由標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)算法生成的分類(lèi)器可能無(wú)法給出準(zhǔn)確的結(jié)果。除了欺詐性交易,存在不平衡數(shù)據(jù)集問(wèn)題的常見(jiàn)業(yè)務(wù)問(wèn)題還有:
- 識(shí)別客戶流失率的數(shù)據(jù)集,其中絕大多數(shù)顧客都會(huì)繼續(xù)使用該項(xiàng)服務(wù)。具體來(lái)說(shuō),電信公司中,客戶流失率低于 2%。
- 醫(yī)療診斷中識(shí)別罕見(jiàn)疾病的數(shù)據(jù)集
- 自然災(zāi)害,例如地震
4. 使用的數(shù)據(jù)集
這篇文章中,我們會(huì)展示多種在高度不平衡數(shù)據(jù)集上訓(xùn)練一個(gè)性能良好的模型的技術(shù)。并且用下面的欺詐檢測(cè)數(shù)據(jù)集來(lái)精確地預(yù)測(cè)罕見(jiàn)事件:
- 總觀測(cè) = 1000
- 欺詐觀測(cè) = 20
- 非欺詐性觀測(cè) = 980
- 事件比例 = 2%
- 欺詐類(lèi)別標(biāo)志 = 0(非欺詐實(shí)例)
- 欺詐類(lèi)別標(biāo)志 = 1(欺詐實(shí)例)
二、處理不平衡數(shù)據(jù)集的方法
1. 數(shù)據(jù)層面的方法:重采樣技術(shù)
處理不平衡數(shù)據(jù)集需要在往機(jī)器學(xué)習(xí)算法輸入數(shù)據(jù)之前,制定諸如提升分類(lèi)算法或平衡訓(xùn)練數(shù)據(jù)的類(lèi)(數(shù)據(jù)預(yù)處理)的策略。后者因?yàn)閼?yīng)用范圍廣泛而更常使用。
平衡分類(lèi)的主要目標(biāo)不是增加少數(shù)類(lèi)的的頻率就是降低多數(shù)類(lèi)的頻率。這樣做是為了獲得大概相同數(shù)量的兩個(gè)類(lèi)的實(shí)例。讓我們一起看看幾個(gè)重采樣(resampling)技術(shù):
(1)隨機(jī)欠采樣(Random Under-Sampling)
隨機(jī)欠采樣的目標(biāo)是通過(guò)隨機(jī)地消除占多數(shù)的類(lèi)的樣本來(lái)平衡類(lèi)分布;直到多數(shù)類(lèi)和少數(shù)類(lèi)的實(shí)例實(shí)現(xiàn)平衡,目標(biāo)才算達(dá)成。
- 總觀測(cè) = 1000
- 欺詐性觀察 = 20
- 非欺詐性觀察 = 980
- 事件發(fā)生率 = 2%
這種情況下我們不重復(fù)地從非欺詐實(shí)例中取 10% 的樣本,并將其與欺詐性實(shí)例相結(jié)合。
隨機(jī)欠采樣之后的非欺詐性觀察 = 980 x 10% = 98
結(jié)合欺詐性與非欺詐性觀察之后的全體觀察 = 20+98 = 118
欠采樣之后新數(shù)據(jù)集的事件發(fā)生率 = 20/118 = 17%
優(yōu)點(diǎn)
- 它可以提升運(yùn)行時(shí)間;并且當(dāng)訓(xùn)練數(shù)據(jù)集很大時(shí),可以通過(guò)減少樣本數(shù)量來(lái)解決存儲(chǔ)問(wèn)題。
缺點(diǎn)
- 它會(huì)丟棄對(duì)構(gòu)建規(guī)則分類(lèi)器很重要的有價(jià)值的潛在信息。
- 被隨機(jī)欠采樣選取的樣本可能具有偏差。它不能準(zhǔn)確代表大多數(shù)。從而在實(shí)際的測(cè)試數(shù)據(jù)集上得到不精確的結(jié)果。
(2)隨機(jī)過(guò)采樣(Random Over-Sampling)
過(guò)采樣(Over-Sampling)通過(guò)隨機(jī)復(fù)制少數(shù)類(lèi)來(lái)增加其中的實(shí)例數(shù)量,從而可增加樣本中少數(shù)類(lèi)的代表性。
- 總觀測(cè) = 1000
- 欺詐性觀察 = 20
- 非欺詐性觀察 = 980
- 事件發(fā)生率 = 2%
這種情況下我們復(fù)制 20 個(gè)欺詐性觀察 20 次。
- 非欺詐性觀察 = 980
- 復(fù)制少數(shù)類(lèi)觀察之后的欺詐性觀察 = 400
- 過(guò)采樣之后新數(shù)據(jù)集中的總體觀察 = 1380
- 欠采樣之后新數(shù)據(jù)集的事件發(fā)生率 = 400/1380 = 29%
優(yōu)點(diǎn)
- 與欠采樣不同,這種方法不會(huì)帶來(lái)信息損失。
- 表現(xiàn)優(yōu)于欠采樣。
缺點(diǎn)
- 由于復(fù)制少數(shù)類(lèi)事件,它加大了過(guò)擬合的可能性。
(3)基于聚類(lèi)的過(guò)采樣(Cluster-Based Over Sampling)
在這種情況下,K-均值聚類(lèi)算法獨(dú)立地被用于少數(shù)和多數(shù)類(lèi)實(shí)例。這是為了識(shí)別數(shù)據(jù)集中的聚類(lèi)。隨后,每一個(gè)聚類(lèi)都被過(guò)采樣以至于相同類(lèi)的所有聚類(lèi)有著同樣的實(shí)例數(shù)量,且所有的類(lèi)有著相同的大小。
- 總觀測(cè) = 1000
- 欺詐性觀察 = 20
- 非欺詐性觀察 = 980
- 事件發(fā)生率 = 2%
多數(shù)類(lèi)聚類(lèi)
- 1. 聚類(lèi) 1:150 個(gè)觀察
- 2. 聚類(lèi) 2:120 個(gè)觀察
- 3. 聚類(lèi) 3:230 個(gè)觀察
- 4. 聚類(lèi) 4:200 個(gè)觀察
- 5. 聚類(lèi) 5:150 個(gè)觀察
- 6. 聚類(lèi) 6:130 個(gè)觀察
少數(shù)類(lèi)聚類(lèi)
- 1. 聚類(lèi) 1:8 個(gè)觀察
- 2. 聚類(lèi) 2:12 個(gè)觀察
每個(gè)聚類(lèi)過(guò)采樣之后,相同類(lèi)的所有聚類(lèi)包含相同數(shù)量的觀察。
多數(shù)類(lèi)聚類(lèi)
- 1. 聚類(lèi) 1:170 個(gè)觀察
- 2. 聚類(lèi) 2:170 個(gè)觀察
- 3. 聚類(lèi) 3:170 個(gè)觀察
- 4. 聚類(lèi) 4:170 個(gè)觀察
- 5. 聚類(lèi) 5:170 個(gè)觀察
- 6. 聚類(lèi) 6:170 個(gè)觀察
少數(shù)類(lèi)聚類(lèi)
- 1. 聚類(lèi) 1:250 個(gè)觀察
- 2. 聚類(lèi) 2:250 個(gè)觀察
基于聚類(lèi)的過(guò)采樣之后的事件率 = 500/ (1020+500) = 33 %
優(yōu)點(diǎn)
- 這種聚類(lèi)技術(shù)有助于克服類(lèi)之間不平衡的挑戰(zhàn)。表示正例的樣本數(shù)量不同于表示反例的樣本數(shù)量。
- 有助于克服由不同子聚類(lèi)組成的類(lèi)之間的不平衡的挑戰(zhàn)。每一個(gè)子聚類(lèi)不包含相同數(shù)量的實(shí)例。
缺點(diǎn)
- 正如大多數(shù)過(guò)采樣技術(shù),這一算法的主要缺點(diǎn)是有可能過(guò)擬合訓(xùn)練集。
(4)信息性過(guò)采樣:合成少數(shù)類(lèi)過(guò)采樣技術(shù)(SMOTE)
這一技術(shù)可用來(lái)避免過(guò)擬合——當(dāng)直接復(fù)制少數(shù)類(lèi)實(shí)例并將其添加到主數(shù)據(jù)集時(shí)。從少數(shù)類(lèi)中把一個(gè)數(shù)據(jù)子集作為一個(gè)實(shí)例取走,接著創(chuàng)建相似的新合成的實(shí)例。這些合成的實(shí)例接著被添加進(jìn)原來(lái)的數(shù)據(jù)集。新數(shù)據(jù)集被用作樣本以訓(xùn)練分類(lèi)模型。
- 總觀測(cè) = 1000
- 欺詐性觀察 = 20
- 非欺詐性觀察 = 980
- 事件發(fā)生率 = 2%
從少數(shù)類(lèi)中取走一個(gè)包含 15 個(gè)實(shí)例的樣本,并生成相似的合成實(shí)例 20 次。
生成合成性實(shí)例之后,創(chuàng)建下面的數(shù)據(jù)集
- 少數(shù)類(lèi)(欺詐性觀察)= 300
- 多數(shù)類(lèi)(非欺詐性觀察)= 980
- 事件發(fā)生率 = 300/1280 = 23.4 %
優(yōu)點(diǎn)
- 通過(guò)隨機(jī)采樣生成的合成樣本而非實(shí)例的副本,可以緩解過(guò)擬合的問(wèn)題。
- 不會(huì)損失有價(jià)值信息。
缺點(diǎn)
- 當(dāng)生成合成性實(shí)例時(shí),SMOTE 并不會(huì)把來(lái)自其他類(lèi)的相鄰實(shí)例考慮進(jìn)來(lái)。這導(dǎo)致了類(lèi)重疊的增加,并會(huì)引入額外的噪音。
- SMOTE 對(duì)高維數(shù)據(jù)不是很有效。
圖 1:合成少數(shù)類(lèi)過(guò)采樣算法,其中 N 是屬性的數(shù)量
圖 2:借助 SMOTE 的合成實(shí)例生成
(5)改進(jìn)的合成少數(shù)類(lèi)過(guò)采樣技術(shù)(MSMOTE)
這是 SMOTE 的改進(jìn)版本,SMOTE 沒(méi)有考慮數(shù)據(jù)集中少數(shù)類(lèi)和潛在噪聲的基本分布。所以為了提高 SMOTE 的效果,MSMOTE 應(yīng)運(yùn)而生。
該算法將少數(shù)類(lèi)別的樣本分為 3 個(gè)不同的組:安全樣本、邊界樣本和潛在噪聲樣本。分類(lèi)通過(guò)計(jì)算少數(shù)類(lèi)的樣本和訓(xùn)練數(shù)據(jù)的樣本之間的距離來(lái)完成。安全樣本是可以提高分類(lèi)器性能的那些數(shù)據(jù)點(diǎn)。而另一方面,噪聲是可以降低分類(lèi)器的性能的數(shù)據(jù)點(diǎn)。兩者之間的那些數(shù)據(jù)點(diǎn)被分類(lèi)為邊界樣本。
雖然 MSOMTE 的基本流程與 SMOTE 的基本流程相同,在 MSMOTE 中,選擇近鄰的策略不同于 SMOTE。該算法是從安全樣本出發(fā)隨機(jī)選擇 k-最近鄰的數(shù)據(jù)點(diǎn),并從邊界樣本出發(fā)選擇最近鄰,并且不對(duì)潛在噪聲樣本進(jìn)行任何操作。
2. 算法集成技術(shù)(Algorithmic Ensemble Techniques)
上述部分涉及通過(guò)重采樣原始數(shù)據(jù)提供平衡類(lèi)來(lái)處理不平衡數(shù)據(jù),在本節(jié)中,我們將研究一種替代方法:修改現(xiàn)有的分類(lèi)算法,使其適用于不平衡數(shù)據(jù)集。
集成方法的主要目的是提高單個(gè)分類(lèi)器的性能。該方法從原始數(shù)據(jù)中構(gòu)建幾個(gè)兩級(jí)分類(lèi)器,然后整合它們的預(yù)測(cè)。
圖 3:基于集成的方法
(1)基于 Bagging 的方法
Bagging 是 Bootstrap Aggregating 的縮寫(xiě)。傳統(tǒng)的 Bagging 算法包括生成「n」個(gè)不同替換的引導(dǎo)訓(xùn)練樣本,并分別訓(xùn)練每個(gè)自舉算法上的算法,然后再聚合預(yù)測(cè)。
Bagging 常被用于減少過(guò)擬合,以提高學(xué)習(xí)效果生成準(zhǔn)確預(yù)測(cè)。與 boosting 不同,bagging 方法允許在自舉樣本中進(jìn)行替換。
圖 4:Bagging 方法
- 總觀測(cè)= 1000
- 欺詐觀察= 20
- 非欺詐觀察= 980
- 事件率= 2%
從具有替換的群體中選擇 10 個(gè)自舉樣品。每個(gè)樣本包含 200 個(gè)觀察值。每個(gè)樣本都不同于原始數(shù)據(jù)集,但類(lèi)似于分布和變化上與該數(shù)據(jù)集類(lèi)似。機(jī)器學(xué)習(xí)算法(如 logistic 回歸、神經(jīng)網(wǎng)絡(luò)與決策樹(shù))擬合包含 200 個(gè)觀察的自舉樣本,且分類(lèi)器 c1,c2 ... c10 被聚合以產(chǎn)生復(fù)合分類(lèi)器。這種集成方法能產(chǎn)生更強(qiáng)的復(fù)合分類(lèi)器,因?yàn)樗M合了各個(gè)分類(lèi)器的結(jié)果。
優(yōu)點(diǎn)
- 提高了機(jī)器學(xué)習(xí)算法的穩(wěn)定性與準(zhǔn)確性
- 減少方差
- 減少了 bagged 分類(lèi)器的錯(cuò)誤分類(lèi)
- 在嘈雜的數(shù)據(jù)環(huán)境中,bagging 的性能優(yōu)于 boosting
缺點(diǎn)
- bagging 只會(huì)在基本分類(lèi)器效果很好時(shí)才有效。錯(cuò)誤的分類(lèi)可能會(huì)進(jìn)一步降低表現(xiàn)。
(2)基于 Boosting 的方法
Boosting 是一種集成技術(shù),它可以將弱學(xué)習(xí)器結(jié)合起來(lái)創(chuàng)造出一個(gè)能夠進(jìn)行準(zhǔn)確預(yù)測(cè)的強(qiáng)大學(xué)習(xí)器。Boosting 開(kāi)始于在訓(xùn)練數(shù)據(jù)上準(zhǔn)備的基本分類(lèi)器/弱分類(lèi)器。
基本學(xué)習(xí)器/分類(lèi)器是弱學(xué)習(xí)器,即預(yù)測(cè)準(zhǔn)確度僅略好于平均水平。弱是指當(dāng)數(shù)據(jù)的存在小變化時(shí),會(huì)引起分類(lèi)模型出現(xiàn)大的變化。
在下一次迭代中,新分類(lèi)器將重點(diǎn)放在那些在上一輪中被錯(cuò)誤分類(lèi)的案例上。
圖 5:Boosting 方法
a. 自適應(yīng) boosting——Ada Boost
Ada Boost 是最早的 boosting 技術(shù),其能通過(guò)許多弱的和不準(zhǔn)確的規(guī)則的結(jié)合來(lái)創(chuàng)造高準(zhǔn)確度的預(yù)測(cè)。其中每個(gè)訓(xùn)練器都是被串行地訓(xùn)練的,其目標(biāo)在每一輪正確分類(lèi)上一輪沒(méi)能正確分類(lèi)的實(shí)例。
對(duì)于一個(gè)學(xué)習(xí)過(guò)的分類(lèi)器,如果要做出強(qiáng)大的預(yù)測(cè),其應(yīng)該具備以下三個(gè)條件:
- 規(guī)則簡(jiǎn)單
- 分類(lèi)器在足夠數(shù)量的訓(xùn)練實(shí)例上進(jìn)行了訓(xùn)練
- 分類(lèi)器在訓(xùn)練實(shí)例上的訓(xùn)練誤差足夠低
每一個(gè)弱假設(shè)都有略優(yōu)于隨機(jī)猜測(cè)的準(zhǔn)確度,即誤差項(xiàng) € (t) 應(yīng)該略大約 ½-β,其中 β>0。這是這種 boosting 算法的基礎(chǔ)假設(shè),其可以產(chǎn)生一個(gè)僅有一個(gè)很小的誤差的最終假設(shè)。
在每一輪之后,它會(huì)更加關(guān)注那些更難被分類(lèi)的實(shí)例。這種關(guān)注的程度可以通過(guò)一個(gè)權(quán)重值(weight)來(lái)測(cè)量。起初,所有實(shí)例的權(quán)重都是相等的,經(jīng)過(guò)每一次迭代之后,被錯(cuò)誤分類(lèi)的實(shí)例的權(quán)重會(huì)增大,而被正確分類(lèi)的實(shí)例的權(quán)重則會(huì)減小。
圖 6:自適應(yīng) boosting 的方法
比如如果有一個(gè)包含了 1000 次觀察的數(shù)據(jù)集,其中有 20 次被標(biāo)記為了欺詐。剛開(kāi)始,所有的觀察都被分配了相同的權(quán)重 W1,基礎(chǔ)分類(lèi)器準(zhǔn)確分類(lèi)了其中 400 次觀察。
然后,那 600 次被錯(cuò)誤分類(lèi)的觀察的權(quán)重增大為 W2,而這 400 次被正確分類(lèi)的實(shí)例的權(quán)重減小為 W3。
在每一次迭代中,這些更新過(guò)的加權(quán)觀察都會(huì)被送入弱的分類(lèi)器以提升其表現(xiàn)。這個(gè)過(guò)程會(huì)一直持續(xù),直到錯(cuò)誤分類(lèi)率顯著降低,從而得到一個(gè)強(qiáng)大的分類(lèi)器。
優(yōu)點(diǎn)
非常簡(jiǎn)單就能實(shí)現(xiàn)
可以很好地泛化——適合任何類(lèi)型的分類(lèi)問(wèn)題且不易過(guò)擬合
缺點(diǎn)
- 對(duì)噪聲數(shù)據(jù)和異常值敏感
b. 梯度樹(shù) boosting
在梯度 Boosting(Gradient Boosting)中,許多模型都是按順序訓(xùn)練的。其是一種數(shù)值優(yōu)化算法,其中每個(gè)模型都使用梯度下降(Gradient Descent)方法來(lái)最小化損失函數(shù) y = ax+b+e。
在梯度 Boosting 中,決策樹(shù)(Decision Tree)被用作弱學(xué)習(xí)器。
盡管 Ada Boost 和梯度 Boosting 都是基于弱學(xué)習(xí)器/分類(lèi)器工作的,而且都是在努力使它們變成強(qiáng)大的學(xué)習(xí)器,但這兩種方法之間存在一些顯著的差異。Ada Boost 需要在實(shí)際的訓(xùn)練過(guò)程之前由用戶指定一組弱學(xué)習(xí)器或隨機(jī)生成弱學(xué)習(xí)器。其中每個(gè)學(xué)習(xí)器的權(quán)重根據(jù)其每步是否正確執(zhí)行了分類(lèi)而進(jìn)行調(diào)整。而梯度 Boosting 則是在訓(xùn)練數(shù)據(jù)集上構(gòu)建第一個(gè)用來(lái)預(yù)測(cè)樣本的學(xué)習(xí)器,然后計(jì)算損失(即真實(shí)值和第一個(gè)學(xué)習(xí)器的輸出之間的差),然后再使用這個(gè)損失在第二個(gè)階段構(gòu)建改進(jìn)了的學(xué)習(xí)器。
在每一個(gè)步驟,該損失函數(shù)的殘差(residual)都是用梯度下降法計(jì)算出來(lái)的,而新的殘差會(huì)在后續(xù)的迭代中變成目標(biāo)變量。
梯度 Boosting 可以通過(guò) R 語(yǔ)言使用 SAS Miner 和 GBM 軟件包中的 Gradient Boosting Node 實(shí)現(xiàn)。
圖 7:梯度 Boosting 方法
比如,如果有一個(gè)包含了 1000 次觀察的訓(xùn)練數(shù)據(jù)集,其中有 20 次被標(biāo)記為了欺詐,并且還有一個(gè)初始的基礎(chǔ)分類(lèi)器。目標(biāo)變量為 Fraud,當(dāng)交易是欺詐時(shí),F(xiàn)raud=1;當(dāng)交易不是欺詐時(shí),F(xiàn)raud=0.
比如說(shuō),決策樹(shù)擬合的是準(zhǔn)確分類(lèi)僅 5 次觀察為欺詐觀察的情況。然后基于該步驟的實(shí)際輸出和預(yù)測(cè)輸出之間的差,計(jì)算出一個(gè)可微的損失函數(shù)。該損失函數(shù)的這個(gè)殘差是下一次迭代的目標(biāo)變量 F1。
類(lèi)似地,該算法內(nèi)部計(jì)算該損失函數(shù),并在每個(gè)階段更新該目標(biāo),然后在初始分類(lèi)器的基礎(chǔ)上提出一個(gè)改進(jìn)過(guò)的分類(lèi)器。
缺點(diǎn)
- 梯度增強(qiáng)過(guò)的樹(shù)比隨機(jī)森林更難擬合
- 梯度 Boosting 算法通常有 3 個(gè)可以微調(diào)的參數(shù):收縮(shrinkage)參數(shù)、樹(shù)的深度和樹(shù)的數(shù)量。要很好擬合,每個(gè)參數(shù)都需要合適的訓(xùn)練。如果這些參數(shù)沒(méi)有得到很好的調(diào)節(jié),那么就可能會(huì)導(dǎo)致過(guò)擬合。
c. XGBoost
XGBoost(Extreme Gradient Boosting/極限梯度提升)是 Gradient Boosting 算法的一種更先進(jìn)和更有效的實(shí)現(xiàn)。
相對(duì)于其它 Boosting 技術(shù)的優(yōu)點(diǎn):
- 速度比普通的 Gradient Boosting 快 10 倍,因?yàn)槠淇梢詫?shí)現(xiàn)并行處理。它是高度靈活的,因?yàn)橛脩艨梢宰远x優(yōu)化目標(biāo)和評(píng)估標(biāo)準(zhǔn),其具有內(nèi)置的處理缺失值的機(jī)制。
- 和遇到了負(fù)損失就會(huì)停止分裂節(jié)點(diǎn)的 Gradient Boosting 不同,XGBoost 會(huì)分裂到指定的最大深度,然后會(huì)對(duì)其樹(shù)進(jìn)行反向的剪枝(prune),移除僅有一個(gè)負(fù)損失的分裂。
XGBoost 可以使用 R 和 Python 中的 XGBoost 包實(shí)現(xiàn)。
三、實(shí)際案例
1. 數(shù)據(jù)描述
這個(gè)例子使用了電信公司的包含了 47241 條顧客記錄的數(shù)據(jù)集,每條記錄包含的信息有 27 個(gè)關(guān)鍵預(yù)測(cè)變量
罕見(jiàn)事件數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)如下,缺失值刪除、異常值處理以及降維
從這里下載數(shù)據(jù)集:
https://static.analyticsvidhya.com/wp-content/uploads/2017/03/17063705/SampleData_IMC.csv
2. 方法描述
使用合成少數(shù)類(lèi)過(guò)采樣技術(shù)(SMOTE)來(lái)平衡不平衡數(shù)據(jù)集——該技術(shù)是試圖通過(guò)創(chuàng)建合成實(shí)例來(lái)平衡數(shù)據(jù)集。下面以 R 代碼為例,示范使用 Gradient Boosting 算法來(lái)訓(xùn)練平衡數(shù)據(jù)集。
- R 代碼
- # 加載數(shù)據(jù)
- rareevent_boost <- read.table("D:/Upasana/RareEvent/churn.txt",sep="|", header=TRUE)
- dmy<-dummyVars("~.",data=rareevent_boost)
- rareeventTrsf<-data.frame(predict(dmy,newdata= rareevent_boost))
- set.seed(10)
- sub <- sample(nrow(rareeventTrsf), floor(nrow(rareeventTrsf) * 0.9))
- sub1 <- sample(nrow(rareeventTrsf), floor(nrow(rareeventTrsf) * 0.1))
- training <- rareeventTrsf [sub, ]
- testing <- rareeventTrsf [-sub, ]
- training_sub<- rareeventTrsf [sub1, ]
- tables(training_sub)
- head(training_sub)
- # 對(duì)于不平衡的數(shù)據(jù)集 #
- install.packages("unbalanced")
- library(unbalanced)
- data(ubIonosphere)
- n<-ncol(rareevent_boost)
- output<- rareevent_boost $CHURN_FLAG
- output<-as.factor(output)
- input<- rareevent_boost [ ,-n]
- View(input)
- # 使用 ubSMOTE 來(lái)平衡數(shù)據(jù)集 #
- data<-ubBalance(X= input, Y=output, type="ubSMOTE", percOver=300, percUnder=150, verbose=TRUE
- View(data)
- # 平衡的數(shù)據(jù)集 #
- balancedData<-cbind(data$X,data$Y)
- View(balancedData)
- table(balancedData$CHURN_FLAG)
- # 寫(xiě)入平衡的數(shù)據(jù)集來(lái)訓(xùn)練模型 #
- write.table(balancedData,"D:/ Upasana/RareEvent /balancedData.txt", sep="\t", row.names=FALSE)
- # 創(chuàng)建 Boosting 樹(shù)模型 #
- repalceNAsWithMean <- function(x) {replace(x, is.na(x), mean(x[!is.na(x)]))}
- training <- repalceNAsWithMean(training)
- testing <- repalceNAsWithMean(testing)
- # 重采樣技術(shù) #
- View(train_set)
- fitcontrol<-trainControl(method="repeatedcv",number=10,repeats=1,verbose=FALSE)
- gbmfit<-train(CHURN_FLAG~.,data=balancedData,method="gbm",verbose=FALSE)
- # 為測(cè)試數(shù)據(jù)評(píng)分 #
- testing$score_Y=predict(gbmfit,newdata=testing,type="prob")[,2]
- testing$score_Y=ifelse(testing$score_Y>0.5,1,0)
- head(testing,n=10)
- write.table(testing,"D:/ Upasana/RareEvent /testing.txt", sep="\t", row.names=FALSE)
- pred_GBM<-prediction(testing$score_Y,testing$CHURN_FLAG)
- # 模型的表現(xiàn) #
- model_perf_GBM <- performance(pred_GBM, "tpr", "fpr")
- model_perf_GBM1 <- performance(pred_GBM, "tpr", "fpr")
- model_perf_GBM
- pred_GBM1<-as.data.frame(model_perf_GBM)
- auc.tmp_GBM <- performance(pred_GBM,"auc")
- AUC_GBM <- as.numeric(auc.tmp_GBM@y.values)
- auc.tmp_GBM
結(jié)果
這個(gè)在平衡數(shù)據(jù)集上使用了 SMOTE 并訓(xùn)練了一個(gè) gradient boosting 算法的平衡數(shù)據(jù)集的辦法能夠顯著改善預(yù)測(cè)模型的準(zhǔn)確度。較之平常分析建模技術(shù)(比如 logistic 回歸和決策樹(shù)),這個(gè)辦法將其 lift 提升了 20%,精確率也提升了 3 到 4 倍。
四、結(jié)論
遇到不平衡數(shù)據(jù)集時(shí),沒(méi)有改善預(yù)測(cè)模型準(zhǔn)確性的一站式解決方案。你可能需要嘗試多個(gè)辦法來(lái)搞清楚最適合數(shù)據(jù)集的采樣技術(shù)。在絕大多數(shù)情況下,諸如 SMOTE 以及 MSMOTE 之類(lèi)的合成技術(shù)會(huì)比傳統(tǒng)過(guò)采樣或欠采樣的辦法要好。
為了獲得更好的結(jié)果,你可以在使用諸如 Gradeint boosting 和 XGBoost 的同時(shí)也使用 SMOTE 和 MSMOTE 等合成采樣技術(shù)。
通常用于解決不平衡數(shù)據(jù)集問(wèn)題的先進(jìn) bagging 技術(shù)之一是 SMOTE bagging。這個(gè)辦法采取了一種完全不同于傳統(tǒng) bagging 技術(shù)的辦法來(lái)創(chuàng)造每個(gè) Bag/Bootstrap。通過(guò)每次迭代時(shí)設(shè)置一個(gè) SMOTE 重采樣率,它可以借由 SMOTE 算法生成正例。每次迭代時(shí),負(fù)例集會(huì)被 bootstrap。
不平衡數(shù)據(jù)集的特點(diǎn)不同,最有效的技術(shù)也會(huì)有所不同。對(duì)比模型時(shí)要考慮相關(guān)評(píng)估參數(shù)。
在對(duì)比通過(guò)全面地結(jié)合上述技術(shù)而構(gòu)建的多個(gè)預(yù)測(cè)模型時(shí),ROC 曲線下的 Lift & Area 將會(huì)在決定最優(yōu)模型上發(fā)揮作用。
本文作者為來(lái)自 KPMG 的數(shù)據(jù)分析顧問(wèn) Upasana Mukherjee。
原文地址:https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/
【本文是51CTO專(zhuān)欄機(jī)構(gòu)機(jī)器之心的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】