背景:
在機器學習中,我們獲取的數據往往存在一個問題,就是樣本不均勻。比如你有一個樣本集合,正例有9900個,負例100個,訓練的結果往往是很差的,因為這個模型總趨近於是正例的。
就算全是正那么,也有99%的准確率,看起來挺不錯的,但是我們要預測的負樣本很可能一個都預測不出來。
這種情況,在機器學習中有三個處理辦法,過采樣、欠采樣、K-fold交叉驗證
一.一般經驗
1. 1:20以上是需要做均衡處理的 ,普通數據召回率低的話1:10就可以做均衡處理
2. 一般如果不是嚴重不平衡,或者不平衡既是業務的正常反應,則不需要做處理,非平衡樣本的處理方式不是必須的
3. 多分類樣本不均衡,只能過采樣處理 (一般實驗或比賽數據才會過采樣處理, 一般不會過采樣處理, 因為會有很多問題.)
二.處理方法
1. 過采樣:
對壞的人群提高權重,即復制壞樣本,提高壞樣本的占比。
優點:
簡單,對數據質量要求不高
缺點:容易過擬合
--SMOTE算法,合並少數類過采樣技術 KNN近鄰 增加的不是原始樣本也不是真實的樣本
2. 欠采樣:
對好的人群降低權重,通過抽樣,降低好樣本的占比
優點:
簡單,對數據質量要求不高
缺點:
丟失重要信息,容易欠擬合
3. Smote 合成少數過采樣技術
優點:
不易過擬合,保留信息
缺點:
不能對有缺失值和類別變量做處理(原始smote方法)
解決辦法:可以將類別型進行編碼或聚類,對缺失值進行處理后再使用
3、K-fold交叉驗證
其他https://blog.csdn.net/weixin_43996899/article/details/94171209
值得注意的是,使用過采樣方法來解決不平衡問題時應適當地應用交叉驗證。這是因為過采樣會觀察到罕見的樣本,並根據分布函數應用自舉生成新的隨機數據,如果在過采樣之后應用交叉驗證,那么我們所做的就是將我們的模型過擬合於一個特定的人工引導結果。這就是為什么在過度采樣數據之前應該始終進行交叉驗證,就像實現特征選擇一樣。只有重復采樣數據可以將隨機性引入到數據集中,以確保不會出現過擬合問題。
K-fold交叉驗證就是把原始數據隨機分成K個部分,在這K個部分中選擇一個作為測試數據,剩余的K-1個作為訓練數據。交叉驗證的過程實際上是將實驗重復做K次,每次實驗都從K個部分中選擇一個不同的部分作為測試數據,剩余的數據作為訓練數據進行實驗,最后把得到的K個實驗結果平均。
三.SMOTE-只針對二分類模型
SMOTE算法的基本思想就是對少數類別樣本進⾏分析和模擬,並將⼈⼯模
擬的新樣本添加到數據集中,進⽽使原始數據中的類別不再嚴重失衡。該
算法的模擬過程采⽤了KNN技術,模擬⽣成新樣本的步驟如下:
SMOTE算法步驟:
1. 隨機找一個少數類的觀測點
2. 用KNN計算觀測點最近的樣本
3. 隨機挑選離觀測點近鄰的其中一個樣本
4. 計算兩點的差值后進行隨機提取。所以這里的隨機體現在兩個方面,線性體現在求差值的運算上面。
# pip install imblearn
# 做平衡處理 from imblearn.over_sampling import SMOTE # 實例化 over_samples = SMOTE(random_state=1234) # fit數據結構 over_samples_x,over_samples_y = over_samples.fit_sample(Xtrain,Ytrain) over_test_x,over_test_y = over_samples.fit_sample(Xtest,Ytest) # 重采樣之后的比例 print(pd.Series(over_samples_y).value_counts()/len(over_samples_y)) # 重采樣之前的比例 print(Ytrain.value_counts()/len(Ytrain))