SMOTE算法解决样本不平衡
首先,看下Smote算法之前,我們先看下當正負樣本不均衡的時候,我們通常用的方法:
抽樣
常規的包含過抽樣、欠抽樣、組合抽樣
過抽樣:將樣本較少的一類sample補齊
欠抽樣:將樣本較多的一類sample壓縮
組合抽樣:約定一個量級N,同時進行過抽樣和欠抽樣,使得正負樣本量和等于約定量級N
這種方法要么丟失數據信息,要么會導致較少樣本共線性,存在明顯缺陷
權重調整
常規的包括算法中的weight,weight matrix
改變入參的權重比,比如boosting中的全量迭代方式、邏輯回歸中的前置的權重設置
這種方式的弊端在于無法控制合適的權重比,需要多次嘗試
核函數修正
通過核函數的改變,來抵消樣本不平衡帶來的問題
這種使用場景局限,前置的知識學習代價高,核函數調整代價高,黑盒優化
模型修正
通過現有的較少的樣本類別的數據,用算法去探查數據之間的特征,判讀數據是否滿足一定的規律
比如,通過線性擬合,發現少類樣本成線性關系,可以新增線性擬合模型下的新點
實際規律比較難發現,難度較高
算法基本原理:
(1)對于少數類中每一個樣本x,以歐氏距離為標準計算它到少數類樣本集中所有樣本的距離,得到其k近鄰。
(2)根據樣本不平衡比例設置一個采樣比例以確定采樣倍率N,對于每一個少數類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為xn。
(3)對于每一個隨機選出的近鄰xn,分別與原樣本按照如下的公式構建新的樣本。
Smote算法的思想其實很簡單,先隨機選定n個少類的樣本,如下圖
再找出最靠近它的m個少類樣本,如下圖
再任選最臨近的m個少類樣本中的任意一點,
偽代碼:
function SMOTE(T, N, k)
Input: T; N; k # T:少數類樣本數目
# N:過采樣的數目
# K:最近鄰的數量
Output: (N/100) * T # 合成的少數類樣本
Variables: Sample[][] # 存放原始少數類樣本
newindex #控制合成數量
initialized to 0;
Synthetic[][]
if N < 100 then
Randomize the T minority class samples
T = (N/100)*T
N = 100
end if
N = (int)N/100 # 假定SMOTE的數量是100的整數倍
for i = 1 to T do
Compute k nearest neighbors for i, and save the indices in the nnarray
POPULATE(N, i, nnarray)
end for
end function
Algorithm 2 Function to generate synthetic samples
function POPULATE(N, i, nnarray)
Input: N; i; nnarray # N:生成的樣本數量
# i:原始樣本下標
# nnarray:存放最近鄰的數組
Output: N new synthetic samples in Synthetic array
while N != 0 do
nn = random(1,k)
for attr = 1 to numattrs do # numattrs:屬性的數量
Compute: dif = Sample[nnarray[nn]][attr] − Sample[i][attr]
Compute: gap = random(0, 1)
Synthetic[newindex][attr] = Sample[i][attr] + gap * dif
end for
newindex + +
N − −
end while
end function
項目經驗:
1.采樣方法比直接調整閾值的方法要好。
2.使用采樣方法可以提高模型的泛化能力,存在過擬合風險,最好聯合正則化同時使用。
3.過采樣結果比欠采樣多數時間穩定,但是還是要具體問題具體分析,主要還是看數據的分布,SMOTE效果還是不錯的。
4.和SMOTE算法使用的模型最好是可以防止過擬合的模型,隨機森林,L2正則+邏輯回歸,XGBoost等模型。
總結
以上是生活随笔為你收集整理的SMOTE算法解决样本不平衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加载中做法
- 下一篇: 数据库之间数据转换最快方法