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

技術(shù)分享:數(shù)據(jù)不平衡問題

大數(shù)據(jù)
在學(xué)術(shù)研究與教學(xué)中,很多算法都有一個基本假設(shè),那就是數(shù)據(jù)分布是均勻的。當(dāng)我們把這些算法直接應(yīng)用于實(shí)際數(shù)據(jù)時,大多數(shù)情況下都無法取得理想的結(jié)果。因?yàn)閷?shí)際數(shù)據(jù)往往分布得很不均勻,都會存在“長尾現(xiàn)象”,也就是數(shù)據(jù)不平衡”。

在學(xué)術(shù)研究與教學(xué)中,很多算法都有一個基本假設(shè),那就是數(shù)據(jù)分布是均勻的。當(dāng)我們把這些算法直接應(yīng)用于實(shí)際數(shù)據(jù)時,大多數(shù)情況下都無法取得理想的結(jié)果。因?yàn)閷?shí)際數(shù)據(jù)往往分布得很不均勻,都會存在“長尾現(xiàn)象”,也就是數(shù)據(jù)不平衡”。

[[243245]]

以下幾種方法是針對數(shù)據(jù)不平衡問題所做的處理,具體包括:

  1. smote采樣
  2. adasyn采樣
  3. 欠采樣
  4. 一分類
  5. 改進(jìn)的adaboost方法

一、smote采樣

SMOTE全稱是Synthetic Minority Oversampling Technique即合成少數(shù)類過采樣技術(shù),它是基于隨機(jī)過采樣算法的一種改進(jìn)方案,由于隨機(jī)過采樣采取簡單復(fù)制樣本的策略來增加少數(shù)類樣本,這樣容易產(chǎn)生模型過擬合的問題,即使得模型學(xué)習(xí)到的信息過于特別(Specific)而不夠泛化(General),SMOTE算法的基本思想是對少數(shù)類樣本進(jìn)行分析并根據(jù)少數(shù)類樣本人工合成新樣本添加到數(shù)據(jù)集中,算法流程如下。

  1. 對于少數(shù)類中每一個樣本x,以歐氏距離為標(biāo)準(zhǔn)計(jì)算它到少數(shù)類樣本集中所有樣本的距離,得到其k近鄰。
  2. 根據(jù)樣本不平衡比例設(shè)置一個采樣比例以確定采樣倍率N,對于每一個少數(shù)類樣本x,從其k近鄰中隨機(jī)選擇若干個樣本,假設(shè)選擇的近鄰為xn。
  3. 對于每一個隨機(jī)選出的近鄰xn,分別與原樣本按照如下的公式構(gòu)建新的樣本 xnew=x+rand(0,1)∗|x−xn|

部分代碼如下: 

  1. df=get_data()  
  2. x, y = load_creditcard_data(df)  
  3. X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(x, y) # print(y_resampled_smote)  
  4. X_train, X_test, y_train, y_test = train_test_split(X_resampled_smote, y_resampled_smote, test_size=0.3,random_state=0) 

二、adasyn采樣

本文介紹的是 ADASYN: 自適應(yīng)綜合過采樣方法。

算法步驟如下:

(1)計(jì)算不平衡度

記少數(shù)類樣本為ms,多數(shù)類為ml,則不平衡度為 d = ms / ml,則d∈(0,1]。(作者在這里右邊用了閉區(qū)間,我覺得應(yīng)該用開區(qū)間,若是d = 1,則少數(shù)類與多數(shù)類樣本數(shù)量一致,此時數(shù)據(jù)應(yīng)該平衡的)

(2)計(jì)算需要合成的樣本數(shù)量

G = (ml - ms)* b,b∈[0,1],當(dāng)b = 1時,即G等于少數(shù)類和多數(shù)類的差值,此時合成數(shù)據(jù)后的多數(shù)類個數(shù)和少數(shù)類數(shù)據(jù)正好平衡

(3)對每個屬于少數(shù)類的樣本用歐式距離計(jì)算k個鄰居,為k個鄰居中屬于多數(shù)類的樣本數(shù)目,記比例r為r = / k,r∈[0,1]

(4)在(3)中得到每一個少數(shù)類樣本的 ri ,

用 計(jì)算每個少數(shù)類樣本的周圍多數(shù)類的情況

(5)對每個少數(shù)類樣本計(jì)算合成樣本的數(shù)目 (6)在每個待合成的少數(shù)類樣本周圍k個鄰居中選擇1個少數(shù)類樣本,根據(jù)下列等式進(jìn)行合成

重復(fù)合成直到滿足需要步驟(5)合成的數(shù)目為止。

部分代碼如下: 

  1. df=get_data()  
  2. x, y = load_creditcard_data(df)  
  3. X_resampled_smote, y_resampled_smote = ADASYN().fit_sample(x, y) 

三、欠采樣

以下兩種方法都屬于欠抽樣,不同于直接欠抽樣,他們將信息的丟失程度盡量降低。兩者的核心思想為:

1. EasyEnsemble 核心思想是:

  • 首先通過從多數(shù)類中獨(dú)立隨機(jī)抽取出若干子集
  • 將每個子集與少數(shù)類數(shù)據(jù)聯(lián)合起來訓(xùn)練生成多個基分類器
  • 最終將這些基分類器組合形成一個集成學(xué)習(xí)系統(tǒng)

EasyEnsemble 算法被認(rèn)為是非監(jiān)督學(xué)習(xí)算法,因此它每次都獨(dú)立利用可放回隨機(jī)抽樣機(jī)制來提取多數(shù)類樣本

2. BalanceCascade 核心思想是:

  • 使用之前已形成的集成分類器來為下一次訓(xùn)練選擇多類樣本
  • 然后再進(jìn)行欠抽樣

四、一分類

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

我們只對一類進(jìn)行訓(xùn)練,模型的結(jié)果會聚集在某個范圍內(nèi),測試集進(jìn)行測試,則模型的輸出結(jié)果為1和-1兩種,當(dāng)落在這個區(qū)間,結(jié)果為1,不在這個區(qū)間,則結(jié)果為-1

部分代碼如下: 

  1. def MechanicalRupture_Model():  
  2. train = pd.read_excel(normal)  
  3. test = pd.read_excel(unnormal)  
  4. clf = svm.OneClassSVM(nu=0.1, kernel=rbf, gamma=0.1)  
  5. clf.fit(train)  
  6. y_pred_train = clf.predict(train)  
  7. y_pred_test = clf.predict(test) 

五、改進(jìn)的adaboost方法

AdaCost算法修改了Adaboost算法的權(quán)重更新策略,其基本思想是對于代價高的誤分類樣本大大地提高其權(quán)重,而對于代價高的正確分類樣 本適當(dāng)?shù)亟档推錂?quán)重,使其權(quán)重降低相對較小。總體思想是代價高樣本權(quán)重增加得大降低得慢。

具體adacost代碼如下: 

  1. #!/usr/bin/env python3# -*- coding:utf-8 -*-import numpy as npfrom numpy.core.umath_tests import inner1dfrom sklearn.ensemble import AdaBoostClassifierclass AdaCostClassifier(AdaBoostClassifier):#繼承AdaBoostClassifier 
  2. def _boost_real(self, iboost, X, y, sample_weight, random_state):  
  3. implement a single boost using the SAMME.R real algorithm.  
  4. :param iboost:  
  5. :param X:  
  6. :param random_state:  
  7. :param y: 
  8.  :return:sample_weight,estimator_error  
  9. estimator = self._make_estimator(random_state=random_state)  
  10. estimator.fit(X, y, sample_weight=sample_weight)  
  11. y_predict_proba = estimator.predict_proba(X) if iboost == 0:  
  12. self.classes_ = getattr(estimator, 'classes_', None)  
  13. self.n_classes_ = len(self.classes_)  
  14. y_predict = self.classes_.take(np.argmax(y_predict_proba, axis=1),axis=0)  
  15. incorrect = y_predict != y  
  16. estimator_error = np.mean(np.average(incorrect, weights=sample_weight, axis=0)) if estimator_error = 0: return sample_weight, 1., 0.  
  17. n_classes = self.n_classes_ 
  18.  classes = self.classes_  
  19. y_codes = np.array([-1. / (n_classes - 1), 1.])  
  20. y_coding = y_codes.take(classes == y[:, np.newaxis])  
  21. proba = y_predict_proba # alias for readability  
  22. proba[proba np.finfo(proba.dtype).eps] = np.finfo(proba.dtype).eps  
  23. estimator_weight = (-1. * self.learning_rate * (((n_classes - 1.) / n_classes) *  
  24. inner1d(y_coding, np.log(y_predict_proba)))) # 樣本更新的公式,只需要改寫這里  
  25. if not iboost == self.n_estimators - 1:  
  26. sample_weight *= np.exp(estimator_weight *  
  27. ((sample_weight 0) |  
  28. (estimator_weight 0)) *  
  29. self._beta(y, y_predict)) # 在原來的基礎(chǔ)上乘以self._beta(y, y_predict),即代價調(diào)整函數(shù)  
  30. return sample_weight, 1., estimator_error def _beta(self, y, y_hat):  
  31. adjust cost function weight  
  32. :param y:  
  33. :param y_hat:  
  34. :return:res  
  35. res = [] for i in zip(y, y_hat): if i[0] == i[1]:  
  36. res.append(1) # 正確分類,系數(shù)保持不變,按原來的比例減少  
  37. elif i[0] == 0 and i[1] == 1: # elif i[0] == 1 and i[1] == -1:  
  38. res.append(1) # 將負(fù)樣本誤判為正樣本代價應(yīng)該更大一些,比原來的增加比例要高  
  39. elif i[0] == 1 and i[1] == 0: # elif i[0] == -1 and i[1] == 1:  
  40. res.append(1.25) # 將正列判為負(fù)列,代價不變,按原來的比例增加  
  41. else: print(i[0], i[1]) return np.array(res) 

總結(jié):

其中

smote采樣 、adasyn采樣、欠采樣、一分類是針對數(shù)據(jù)集做出處理。

改進(jìn)的adaboost方法是對模型方法進(jìn)行的改進(jìn)。

具體采用哪種方式,需要結(jié)合具體情況。

責(zé)任編輯:未麗燕 來源: 搜狐
相關(guān)推薦

2017-03-28 09:40:23

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

2021-01-04 10:40:37

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

2023-12-26 15:32:25

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

2016-12-13 11:48:05

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

2017-06-16 22:14:45

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

2021-06-06 22:41:30

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

2018-04-20 11:33:22

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

2019-02-25 08:35:22

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

2023-09-29 22:51:22

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

2018-06-11 16:20:22

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

2020-10-06 10:44:16

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

2022-05-06 09:48:56

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

2024-10-18 07:10:43

2025-01-20 09:00:00

2017-03-20 09:25:10

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

2020-09-21 09:02:56

AI機(jī)器學(xué)習(xí)類不平衡

2019-03-27 08:51:38

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

2016-09-07 13:26:25

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

2016-09-19 14:52:12

Hadoophdfs磁盤

2013-04-23 11:17:47

Hadoop
點(diǎn)贊
收藏

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