自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

人工智能 機(jī)器學(xué)習(xí)
當(dāng)一個(gè)類的觀察值高于其他類的觀察值時(shí),則存在類失衡。示例:檢測信用卡欺詐交易。如下圖所示,欺詐交易大約為400,而非欺詐交易大約為90000。

介紹

當(dāng)一個(gè)類的觀察值高于其他類的觀察值時(shí),則存在類失衡。

示例:檢測信用卡欺詐交易。如下圖所示,欺詐交易大約為400,而非欺詐交易大約為90000。

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

類不平衡是機(jī)器學(xué)習(xí)中的常見問題,尤其是在分類問題中。不平衡數(shù)據(jù)可能會(huì)長時(shí)間妨礙我們的模型準(zhǔn)確性。

類不平衡出現(xiàn)在許多領(lǐng)域,包括:

  • 欺詐識(shí)別
  • 垃圾郵件過濾
  • 疾病篩查
  • SaaS訂閱流失
  • 廣告點(diǎn)擊

類失衡問題

當(dāng)每個(gè)類別中的樣本數(shù)量大致相等時(shí),大多數(shù)機(jī)器學(xué)習(xí)算法效果最佳。這是因?yàn)榇蠖鄶?shù)算法都是為了最大化精確度和減少誤差而設(shè)計(jì)的。

然而,如果數(shù)據(jù)集不平衡,那么在這種情況下,僅僅通過預(yù)測多數(shù)類就可以獲得相當(dāng)高的準(zhǔn)確率,但是無法捕捉少數(shù)類,這通常是創(chuàng)建模型的首要目的。

信用卡欺詐檢測示例

假設(shè)我們有一個(gè)信用卡公司的數(shù)據(jù)集,我們必須找出信用卡交易是否是欺詐性的。

但是這里有個(gè)陷阱……欺詐交易相對(duì)罕見,只有6%的交易是欺詐行為。

現(xiàn)在,在你還沒有開始之前,你是否能想到問題應(yīng)該如何解決?想象一下,如果你根本不花時(shí)間訓(xùn)練模型。相反,如果你只編寫了一行總是預(yù)測“沒有欺詐性交易”的代碼,該怎么辦?

  1. def transaction(transaction_data): 
  2.     return 'No fradulent transaction' 

好吧,你猜怎么著?你的“解決方案”將具有94%的準(zhǔn)確性!

不幸的是,這種準(zhǔn)確性令人誤解。

所有這些非欺詐性的交易,你都將擁有100%的準(zhǔn)確性。

那些欺詐性的交易,你的準(zhǔn)確性為0%。

僅僅因?yàn)榇蠖鄶?shù)交易不是欺詐性的(不是因?yàn)槟愕哪P秃芎?,你的總體準(zhǔn)確性就很高。

這顯然是一個(gè)問題,因?yàn)樵S多機(jī)器學(xué)習(xí)算法都旨在最大程度地提高整體準(zhǔn)確性。在本文中,我們將看到處理不平衡數(shù)據(jù)的不同技術(shù)。

數(shù)據(jù)

我們將在本文中使用信用卡欺詐檢測數(shù)據(jù)集,你可以從此處找到該數(shù)據(jù)集。

https://www.kaggle.com/mlg-ulb/creditcardfraud

加載數(shù)據(jù)后,顯示數(shù)據(jù)集的前五行。

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

 

  1. check the target variable that is fraudulet and not fradulent transactiondata['Class'].value_counts()# 0 -> non fraudulent 
  2. # 1 -> fraudulent 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

 

  1. # visualize the target variable 
  2. g = sns.countplot(data['Class']) 
  3. g.set_xticklabels(['Not Fraud','Fraud']) 
  4. plt.show() 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

你可以清楚地看到數(shù)據(jù)集之間存在巨大差異。9000次非欺詐性交易和492次欺詐性交易。

指標(biāo)陷阱

新開發(fā)人員用戶在處理不平衡數(shù)據(jù)集時(shí)遇到的一個(gè)主要問題與用于評(píng)估其模型的指標(biāo)有關(guān)。使用更簡單的指標(biāo),比如準(zhǔn)確度得分,可能會(huì)產(chǎn)生誤導(dǎo)。在具有高度不平衡類的數(shù)據(jù)集中,分類器總是在不進(jìn)行特征分析的情況下“預(yù)測”最常見的類,并且它的準(zhǔn)確率很高,顯然不是正確的。

讓我們做這個(gè)實(shí)驗(yàn),使用簡單的XGBClassifier和無特征工程:

  1. # import linrary 
  2. from xgboost import XGBClassifier 
  3. xgb_model = XGBClassifier().fit(x_train, y_train)# predictxgb_y_predict = xgb_model.predict(x_test)# accuracy scorexgb_score = accuracy_score(xgb_y_predict, y_test)print('Accuracy score is:', xbg_score)OUTPUT 
  4. Accuracy score is: 0.992 

我們可以看到99%的準(zhǔn)確度,我們得到的是非常高的準(zhǔn)確度,因?yàn)樗A(yù)測大多數(shù)類別為0(非欺詐性)。

重采樣技術(shù)

一種處理高度不平衡數(shù)據(jù)集的廣泛采用的技術(shù)稱為重采樣。它包括從多數(shù)類中刪除樣本(欠采樣)和/或從少數(shù)類中添加更多示例(過采樣)。

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

盡管平衡類有很多好處,但是這些技巧也有缺點(diǎn)。

過采樣最簡單的實(shí)現(xiàn)是復(fù)制少數(shù)群體類別的隨機(jī)記錄,這可能會(huì)導(dǎo)致過度捕撈。

欠采樣最簡單的實(shí)現(xiàn)涉及從多數(shù)類中刪除隨機(jī)記錄,這可能會(huì)導(dǎo)致信息丟失。

讓我們用信用卡欺詐檢測示例來實(shí)現(xiàn)它。

我們將首先將類0和類1分開。

  1. # class count 
  2. class_count_0, class_count_1 = data['Class'].value_counts() 
  3. # Separate classclass_0 = data[data['Class'] == 0] 
  4. class_1 = data[data['Class'] == 1]# print the shape of the class 
  5. print('class 0:', class_0.shape) 
  6. print('class 1:', class_1.shape 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

1.隨機(jī)欠采樣

欠采樣可以定義為刪除多數(shù)類的觀察值。這是在多數(shù)類和少數(shù)類被平衡之前進(jìn)行的。

當(dāng)你擁有大量數(shù)據(jù)時(shí),欠采樣可能是一個(gè)不錯(cuò)的選擇,比如數(shù)百萬行。但是欠采樣的一個(gè)缺點(diǎn)是我們可能刪除了有價(jià)值的信息。

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

 

  1. class_0_under = class_0.sample(class_count_1) 
  2. test_under = pd.concat([class_0_under, class_1], axis=0) 
  3. print("total class of 1 and0:",test_under['Class'].value_counts())# plot the count after under-sampeling 
  4. test_under['Class'].value_counts().plot(kind='bar', title='count (target)'

2.隨機(jī)過采樣

過采樣可以定義為向少數(shù)類添加更多副本。當(dāng)你沒有大量數(shù)據(jù)要處理時(shí),過采樣可能是一個(gè)不錯(cuò)的選擇。

欠采樣時(shí)要考慮的一個(gè)弊端是,它可能導(dǎo)致過擬合并導(dǎo)致測試集泛化不佳。

  1. class_1_over = class_1.sample(class_count_0, replace=True
  2. test_over = pd.concat([class_1_over, class_0], axis=0) 
  3. print("total class of 1 and 0:",test_under['Class'].value_counts())# plot the count after under-sampeling 
  4. test_over['Class'].value_counts().plot(kind='bar', title='count (target)'

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

使用不平衡學(xué)習(xí)python模塊平衡數(shù)據(jù)

在科學(xué)文獻(xiàn)中已經(jīng)提出了許多更復(fù)雜的重采樣技術(shù)。

例如,我們可以將多數(shù)類的記錄聚類,并通過從每個(gè)聚類中刪除記錄來進(jìn)行欠采樣,從而尋求保留信息。在過采樣中,我們可以為這些副本引入較小的變化,從而創(chuàng)建更多樣的合成樣本,而不是創(chuàng)建少數(shù)群體記錄的精確副本。

讓我們使用Python庫 imbalanced-learn應(yīng)用其中一些重采樣技術(shù)。它與scikit-learn兼容,并且是scikit-learn-contrib項(xiàng)目的一部分。

  1. import imblearn 

3.使用imblearn進(jìn)行隨機(jī)欠采樣

RandomUnderSampler通過為目標(biāo)類別隨機(jī)選擇數(shù)據(jù)子集來平衡數(shù)據(jù)的快速簡便方法。通過隨機(jī)選擇有或沒有替代品的樣本對(duì)多數(shù)類別進(jìn)行欠采樣。

  1. # import library 
  2. from imblearn.under_sampling import RandomUnderSampler 
  3. rus = RandomUnderSampler(random_state=42, replacement=True)# fit predictor and target variable 
  4. x_rus, y_rus = rus.fit_resample(x, y)print('original dataset shape:', Counter(y)) 
  5. print('Resample dataset shape', Counter(y_rus)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

4.使用imblearn進(jìn)行隨機(jī)過采樣

解決不平衡數(shù)據(jù)的一種方法是在少數(shù)群體中生成新樣本。最幼稚的策略是通過隨機(jī)采樣替換當(dāng)前可用的采樣來生成新的采樣。隨機(jī)過采樣提供了這樣一個(gè)方案。

  1. # import library 
  2. from imblearn.over_sampling import RandomOverSampler 
  3. ros = RandomOverSampler(random_state=42) 
  4. # fit predictor and target variablex_ros, y_ros = ros.fit_resample(x, y)print('Original dataset shape', Counter(y)) 
  5. print('Resample dataset shape', Counter(y_ros)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

5.欠采樣:Tomek鏈接

Tomek鏈接是一對(duì)非常接近的實(shí)例,但類別相反。刪除每對(duì)多數(shù)類的實(shí)例會(huì)增加兩個(gè)類之間的空間,從而有助于分類過程。

如果兩個(gè)樣本是彼此的最近鄰,則存在Tomek的鏈接

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

在下面的代碼中,我們將用于ratio='majority'對(duì)多數(shù)類進(jìn)行重新采樣。

  1. # import library 
  2. from imblearn.under_sampling import TomekLinks 
  3. tl = RandomOverSampler(sampling_strategy='majority'
  4. # fit predictor and target variablex_tl, y_tl = ros.fit_resample(x, y)print('Original dataset shape', Counter(y)) 
  5. print('Resample dataset shape', Counter(y_ros)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

6. Synthetic Minority Oversampling Technique (SMOTE)

該技術(shù)為合成少數(shù)過采樣技術(shù)。

SMOTE(合成少數(shù)過采樣技術(shù))的工作原理是從少數(shù)類中隨機(jī)選取一個(gè)點(diǎn)并計(jì)算該點(diǎn)的k近鄰。合成點(diǎn)被添加到所選的點(diǎn)和它的相鄰點(diǎn)之間。

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

SMOTE算法通過以下四個(gè)簡單步驟工作:

  • 選擇少數(shù)類作為輸入向量
  • 查找其k個(gè)最近鄰(在SMOTE()函數(shù)中將k_neighbors指定為參數(shù))
  • 選擇這些鄰居中的一個(gè),并將合成點(diǎn)放置在連接考慮中的點(diǎn)及其所選鄰居的線上的任何位置
  • 重復(fù)這些步驟,直到數(shù)據(jù)平衡
  1. # import library 
  2. from imblearn.over_sampling import SMOTE 
  3. smote = SMOTE()# fit predictor and target variablex_smote, y_smote = smote.fit_resample(x, y)print('Original dataset shape', Counter(y)) 
  4. print('Resample dataset shape', Counter(y_ros)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

7. NearMiss

NearMiss是欠采樣技術(shù)。與其使用距離重新采樣少數(shù)類,不如將多數(shù)類等同于少數(shù)類。

  1. from imblearn.under_sampling import NearMiss 
  2. nm = NearMiss()x_nm, y_nm = nm.fit_resample(x, y)print('Original dataset shape:', Counter(y)) 
  3. print('Resample dataset shape:', Counter(y_nm)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

8.更改性能指標(biāo)

評(píng)估不平衡數(shù)據(jù)集時(shí),準(zhǔn)確性不是最佳的度量標(biāo)準(zhǔn),因?yàn)樗赡軙?huì)產(chǎn)生誤導(dǎo)。

可以提供更好洞察力的指標(biāo)是:

  • 混淆矩陣:顯示正確預(yù)測和錯(cuò)誤預(yù)測類型的表。
  • 精度:真實(shí)陽性的數(shù)目除以所有陽性預(yù)測。精度也稱為正預(yù)測值。它是分類器準(zhǔn)確性的度量。低精度表示大量誤報(bào)。
  • 召回率:真實(shí)陽性的數(shù)量除以測試數(shù)據(jù)中的陽性值的數(shù)量。召回也稱為敏感度或真實(shí)陽性率。它是分類器完整性的度量。較低的召回率表示大量假陰性。
  • F1:得分:準(zhǔn)確性和召回率的加權(quán)平均值。
  • ROC曲線下面積(AUROC):AUROC表示模型將觀測值與兩個(gè)類區(qū)分開來的可能性。

換句話說,如果你從每個(gè)類中隨機(jī)選擇一個(gè)觀察值,你的模型能夠正確“排序”它們的概率有多大?

9.懲罰算法(成本敏感訓(xùn)練)

下一個(gè)策略是使用懲罰性學(xué)習(xí)算法,該算法會(huì)增加少數(shù)類分類錯(cuò)誤的成本。

這項(xiàng)技術(shù)的一種流行算法是Penalized-SVM。

在訓(xùn)練過程中,我們可以使用參數(shù)class_weight='balanced'來懲罰少數(shù)類的錯(cuò)誤,懲罰量與代表性不足的程度成正比。

如果我們想為支持向量機(jī)算法啟用概率估計(jì),我們還希望包含參數(shù)probability=True。

讓我們?cè)谠疾黄胶鈹?shù)據(jù)集上使用Penalized-SVM訓(xùn)練模型:

  1. load library 
  2. from sklearn.svm import SVC 
  3. # we can add class_weight='balanced' to add panalize mistake 
  4. svc_model = SVC(class_weight='balanced', probability=True
  5. svc_model.fit(x_train, y_train)svc_predict = svc_model.predict(x_test)# check performanceprint('ROCAUC score:',roc_auc_score(y_test, svc_predict)) 
  6. print('Accuracy score:',accuracy_score(y_test, svc_predict)) 
  7. print('F1 score:',f1_score(y_test, svc_predict)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

10.更改算法

盡管在每個(gè)機(jī)器學(xué)習(xí)問題中,嘗試各種算法都是一個(gè)很好的經(jīng)驗(yàn)法則,但是對(duì)于不平衡的數(shù)據(jù)集而言,這尤其有利。

決策樹經(jīng)常在不平衡的數(shù)據(jù)上表現(xiàn)良好。在現(xiàn)代機(jī)器學(xué)習(xí)中,樹集成(隨機(jī)森林,梯度增強(qiáng)樹等)幾乎總是勝過單個(gè)決策樹,因此我們將直接跳到:

基于樹的算法通過學(xué)習(xí) if / else 問題的層次結(jié)構(gòu)來工作。這可以強(qiáng)制解決兩個(gè)類。

  1. load library 
  2. from sklearn.ensemble import RandomForestClassifier 
  3. rfc = RandomForestClassifier()# fit the predictor and targetrfc.fit(x_train, y_train)# predictrfc_predict = rfc.predict(x_test)# check performanceprint('ROCAUC score:',roc_auc_score(y_test, rfc_predict)) 
  4. print('Accuracy score:',accuracy_score(y_test, rfc_predict)) 
  5. print('F1 score:',f1_score(y_test, rfc_predict)) 

 

應(yīng)對(duì)機(jī)器學(xué)習(xí)中類不平衡的10種技巧

欠采樣的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn)

  • 當(dāng)訓(xùn)練數(shù)據(jù)集很大時(shí),它可以通過減少訓(xùn)練數(shù)據(jù)樣本的數(shù)量來幫助改善運(yùn)行時(shí)間和存儲(chǔ)問題。

缺點(diǎn)

  • 它可以丟棄可能有用的信息,這對(duì)于構(gòu)建規(guī)則分類器可能很重要。
  • 通過隨機(jī)欠采樣選擇的樣本可能是有偏差的樣本??赡軐?dǎo)致實(shí)際測試數(shù)據(jù)集的結(jié)果不準(zhǔn)確。

過采樣的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 與欠采樣不同,此方法不會(huì)導(dǎo)致信息丟失。
  • 在抽樣條件下表現(xiàn)更佳

缺點(diǎn)

  • 由于它復(fù)制了少數(shù)群體事件,因此增加了過度擬合的可能性。

你可以在我的GitHub存儲(chǔ)庫中檢查代碼的實(shí)現(xiàn)。

https://github.com/benai9916/Handle-imbalanced-data/tree/master

結(jié)論

總而言之,在本文中,我們已經(jīng)看到了處理數(shù)據(jù)集中的類不平衡的各種技術(shù)。處理不平衡數(shù)據(jù)時(shí),實(shí)際上有很多方法可以嘗試。希望本文對(duì)你有所幫助。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2019-03-27 08:51:38

機(jī)器學(xué)習(xí)類失衡算法

2019-02-25 08:35:22

機(jī)器學(xué)習(xí)數(shù)據(jù)模型

2024-10-18 07:10:43

2017-03-28 09:40:23

機(jī)器學(xué)習(xí)數(shù)據(jù)不平衡

2022-05-06 09:48:56

機(jī)器學(xué)習(xí)樣本不平衡

2025-01-20 09:00:00

2017-06-16 22:14:45

機(jī)器學(xué)習(xí)數(shù)據(jù)不平衡

2018-04-20 11:33:22

不平衡數(shù)據(jù)數(shù)據(jù)集模型

2018-09-11 13:47:35

數(shù)據(jù)不平衡數(shù)據(jù)分布數(shù)據(jù)集

2017-03-20 09:25:10

機(jī)器學(xué)習(xí)采樣數(shù)據(jù)合成

2016-12-13 11:48:05

數(shù)據(jù)處理不平衡數(shù)據(jù)

2021-01-04 10:40:37

Python不平衡數(shù)據(jù)機(jī)器學(xué)習(xí)

2021-06-06 22:41:30

人才技術(shù)預(yù)測不平衡

2020-10-06 10:44:16

機(jī)器學(xué)習(xí)不平衡數(shù)據(jù)算法

2023-09-29 22:51:22

數(shù)據(jù)不平衡Python機(jī)器學(xué)習(xí)

2023-12-26 15:32:25

不平衡數(shù)據(jù)過采樣機(jī)器學(xué)習(xí)

2013-04-23 11:17:47

Hadoop

2016-09-07 13:26:25

R語言不平衡數(shù)據(jù)

2018-06-11 16:20:22

數(shù)據(jù)不平衡數(shù)據(jù)集算法

2020-05-19 14:29:50

機(jī)器學(xué)習(xí)TensorFlow
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)