python數據不平衡處理方法,python處理樣本不平衡

本文目錄一覽:

解決正負樣本數據不平衡

解決這一問題的基本思路是讓正負樣本在訓練過程中擁有相同的話語權,比如利用採樣與加權等方法。為了方便起見,我們把數據集中樣本較多的那一類稱為「大眾類」,樣本較少的那一類稱為「小眾類」。

採樣方法是通過對訓練集進行處理使其從不平衡的數據集變成平衡的數據集,在大部分情況下會對最終的結果帶來提升。

採樣分為 上(過)採樣(Oversampling) 和 下(欠)採樣(Undersampling) ,上採樣是把小眾類複製多份,下採樣是從大眾類中剔除一些樣本,或者說只從大眾類中選取部分樣本。

隨機採樣最大的優點是簡單,但缺點也很明顯。上採樣後的數據集中會反覆出現一些樣本,訓練出來的模型會有一定的過擬合;而下採樣的缺點顯而易見,那就是最終的訓練集丟失了數據,模型只學到了總體模式的一部分。

上採樣 會把小眾樣本複製多份,一個點會在高維空間中反覆出現,這會導致一個問題,那就是運氣好就能分對很多點,否則分錯很多點。為了解決這一問題,可以在每次生成新數據點時加入輕微的隨機擾動,經驗表明這種做法非常有效。

因為 下採樣 會丟失信息,如何減少信息的損失呢? 第一種方法叫做EasyEnsemble,利用模型融合的方法(Ensemble) :多次下採樣(放回採樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。 第二種方法叫做BalanceCascade ,利用增量訓練的思想(Boosting):先通過一次下採樣產生訓練集,訓練一個分類器,對於那些分類正確的大眾樣本不放回,然後對這個更小的大眾樣本下採樣產生訓練集,訓練第二個分類器,以此類推,最終組合所有分類器的結果得到最終結果。 第三種方法是利用KNN試圖挑選那些最具代表性的大眾樣本 ,叫做NearMiss,這類方法計算量很大。

數據合成方法是利用已有樣本生成更多樣本,這類方法在小數據場景下有很多成功案例,比如醫學圖像分析等。

SMOTE 為每個小眾樣本合成相同數量的新樣本,這帶來一些潛在的問題:一方面是增加了類之間重疊的可能性,另一方面是生成一些沒有提供有益信息的樣本。為了解決這個問題, 出現兩種方法:Borderline-SMOTE與ADASYN 。

Borderline-SMOTE 的解決思路是尋找那些應該為之合成新樣本的小眾樣本。即為每個小眾樣本計算K近鄰,只為那些K近鄰中有一半以上大眾樣本的小眾樣本生成新樣本。直觀地講,只為那些周圍大部分是大眾樣本的小眾樣本生成新樣本,因為這些樣本往往是邊界樣本。確定了為哪些小眾樣本生成新樣本後再利用SMOTE生成新樣本。

對不同類別分錯的代價不同。如下圖

橫向是真實分類情況,縱向是預測分類情況,C(i,j)是把真實類別為j的樣本預測為i時的損失,我們需要根據實際情況來設定它的值。

這種方法的難點在於設置合理的權重,實際應用中一般讓各個分類間的加權損失值近似相等。當然這並不是通用法則,還是需要具體問題具體分析。

對於正負樣本極不平衡的場景,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在於捕捉類間的差別,而是為其中一類進行建模,經典的工作包括One-class SVM等。

說明:對於正負樣本極不均勻的問題,使用異常檢測,或者一分類問題,也是一個思路。

1、在正負樣本都非常之少的情況下,應該採用數據合成的方式;

2、在負樣本足夠多,正樣本非常之少且比例及其懸殊的情況下,應該考慮一分類方法;

3、在正負樣本都足夠多且比例不是特別懸殊的情況下,應該考慮採樣或者加權的方法。

4、採樣和加權在數學上是等價的,但實際應用中效果卻有差別。尤其是採樣了諸如Random Forest等分類方法,訓練過程會對訓練集進行隨機採樣。在這種情況下,如果計算資源允許上採樣往往要比加權好一些。

5、另外,雖然上採樣和下採樣都可以使數據集變得平衡,並且在數據足夠多的情況下等價,但兩者也是有區別的。實際應用中,我的經驗是如果計算資源足夠且小眾類樣本足夠多的情況下使用上採樣,否則使用下採樣,因為上採樣會增加訓練集的大小進而增加訓練時間,同時小的訓練集非常容易產生過擬合。

6、對於下採樣,如果計算資源相對較多且有良好的並行環境,應該選擇Ensemble方法。

參考;dist_request_id=1328641.21496.16155984958537047depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

如何解決機器學習中數據不平衡問題

首先,數據集不平衡會造成怎樣的問題呢。一般的學習器都有下面的兩個假設:一個是使得學習器的準確率最高,另外一個是學習器應該用在與訓練集有相同分布的

測試集上。如果數據不平衡,那麼學習器使得它的準確率最高肯定是更偏向於預測結果為比例更大的類別。比如說陽性的比例為1%,陰性的比例為99%,很明顯

的是即使不學習,直接預測所有結果為陰性,這樣做的準確率也能夠達到99%,而如果建立學習器也很有可能沒有辦法達到99%。這就是數據比例不平衡所造成

的問題。這樣建立的模型即使準確率再高,在實際應用的時候效果肯定不好,而且也不是我們想要的模型。

明白了數據集的不平衡對於學習過程所造成的問題,相應的解決辦法也有不少。下面是一些常用的兩類方法。

1 從數據集入手。既然數據不平衡,那我們就人為的把數據集給平衡一下。可以通過隨機採樣比例大的類別使得訓練集中大類的個數與小類相當,也可以重複小類

使得小類的個數與大類相當。前者的問題是可能會丟失信息,因為只採用部分樣本。後者的問題是可能造成過擬合,因為有重複樣本。前者的問題可以通過

esemble的方法來解決,即每次形成訓練集的時候包括所有小類樣本,同時從大類樣本中隨機選擇樣本構成訓練集,這樣重複很多次得到很多訓練集和訓練模

型。在測試的時候使用投票的方法來判斷分類結果。

除了平衡數據集外,還可以通過分別在大類和小類中篩選特徵,然後組合起來構成學習器。這樣也可能提高效果。

2 從學習器入手。最簡單的是通過改變判斷類別的cutoff來改變類別樣本比例;也可以只學習一個類別。此外,在學習的時候考慮到誤判不同樣本的不同成本,使得學習器更偏向於預測小類。這樣也能夠改進模型。

數據不平衡怎麼辦?

使用正確的評估標準,當數據不平衡時可以採用精度,調用度,F1得分,MCC,AUC等評估指標。重新採樣數據集,如欠採樣和過採樣。欠採樣通過減少冗餘類的大小來平衡數據集。當數據量不足時採用過採樣,嘗試通過增加稀有樣本的數量來平衡數據集,通過使用重複,自舉,SMOTE等方法生成新的樣本。

以正確的方式使用K-fold交叉驗證,組合不同的重採樣數據集,對多數類進行聚類。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/285652.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 15:45
下一篇 2024-12-22 15:45

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29

發表回復

登錄後才能評論