1. 程式人生 > >SMOTE演算法及其python實現

SMOTE演算法及其python實現

SMOTE(Synthetic Minority Oversampling Technique),合成少數類過取樣技術.它是基於隨機過取樣演算法的一種改進方案,由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的資訊過於特別(Specific)而不夠泛化(General),SMOTE演算法的基本思想是對少數類樣本進行分析並根據少數類樣本人工合成新樣本新增到資料集中,具體如下圖所示,演算法流程如下。

(1)對於少數類中每一個樣本x,以歐氏距離為標準計算它到少數類樣本集中所有樣本的距離,得到其k近鄰。
(2)根據樣本不平衡比例設定一個取樣比例以確定取樣倍率N,對於每一個少數類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為xn。
(3)對於每一個隨機選出的近鄰xn,分別與原樣本按照如下的公式構建新的樣本。

這裡寫圖片描述

這裡寫圖片描述

smote演算法的虛擬碼如下:

這裡寫圖片描述

python程式碼實現如下:

import random
from sklearn.neighbors import NearestNeighbors
import numpy as np
class Smote:
    def __init__(self,samples,N=10,k=5):
        self.n_samples,self.n_attrs=samples.shape
        self.N=N
        self.k=k
        self.samples=samples
        self.newindex=0
# self.synthetic=np.zeros((self.n_samples*N,self.n_attrs)) def over_sampling(self): N=int(self.N/100) self.synthetic = np.zeros((self.n_samples * N, self.n_attrs)) neighbors=NearestNeighbors(n_neighbors=self.k).fit(self.samples) print 'neighbors',neighbors for
i in range(len(self.samples)): nnarray=neighbors.kneighbors(self.samples[i].reshape(1,-1),return_distance=False)[0] #print nnarray self._populate(N,i,nnarray) return self.synthetic # for each minority class samples,choose N of the k nearest neighbors and generate N synthetic samples. def _populate(self,N,i,nnarray): for j in range(N): nn=random.randint(0,self.k-1) dif=self.samples[nnarray[nn]]-self.samples[i] gap=random.random() self.synthetic[self.newindex]=self.samples[i]+gap*dif self.newindex+=1 a=np.array([[1,2,3],[4,5,6],[2,3,1],[2,1,2],[2,3,4],[2,3,4]]) s=Smote(a,N=100) print s.over_sampling()

SMOTE演算法的缺陷

該演算法主要存在兩方面的問題:一是在近鄰選擇時,存在一定的盲目性。從上面的演算法流程可以看出,在演算法執行過程中,需要確定K值,即選擇多少個近鄰樣本,這需要使用者自行解決。從K值的定義可以看出,K值的下限是M值(M值為從K個近鄰中隨機挑選出的近鄰樣本的個數,且有M< K),M的大小可以根據負類樣本數量、正類樣本數量和資料集最後需要達到的平衡率決定。但K值的上限沒有辦法確定,只能根據具體的資料集去反覆測試。因此如何確定K值,才能使演算法達到最優這是未知的。
另外,該演算法無法克服非平衡資料集的資料分佈問題,容易產生分佈邊緣化問題。由於負類樣本的分佈決定了其可選擇的近鄰,如果一個負類樣本處在負類樣本集的分佈邊緣,則由此負類樣本和相鄰樣本產生的“人造”樣本也會處在這個邊緣,且會越來越邊緣化,從而模糊了正類樣本和負類樣本的邊界,而且使邊界變得越來越模糊。這種邊界模糊性,雖然使資料集的平衡性得到了改善,但加大了分類演算法進行分類的難度.

針對SMOTE演算法的進一步改進

針對SMOTE演算法存在的邊緣化和盲目性等問題,很多人紛紛提出了新的改進辦法,在一定程度上改進了演算法的效能,但還存在許多需要解決的問題。

Han等人Borderline-SMOTE: A New Over-Sampling Method in Imbalanced Data Sets Learning 在SMOTE演算法基礎上進行了改進,提出了Borderhne.SMOTE演算法,解決了生成樣本重疊(Overlapping)的問題該演算法在執行的過程中,查詢一個適當的區域,該區域可以較好地反應資料集的性質,然後在該區域內進行插值,以使新增加的“人造”樣本更有效。這個適當的區域一般由經驗給定,因此演算法在執行的過程中有一定的侷限性。

我找到的smote相關論文請轉到我的另外一篇部落格

相關推薦

SMOTE演算法及其python實現

SMOTE(Synthetic Minority Oversampling Technique),合成少數類過取樣技術.它是基於隨機過取樣演算法的一種改進方案,由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的

經典查詢演算法及其Python實現

寫在前面上一篇介紹了幾大排序演算法,從基本原理解釋到Python程式碼實現,平時有空的話還需要經常翻出來複習複習。今天就主要來看看另外一大類演算法:經典查詢演算法。本篇相關python程式碼已上傳至Github:使勁兒點!1.基本概念查詢就是根據給定的某個值,在查詢表中確定一

資料結構與演算法:常見排序演算法及其python實現

0、 綜合分析 0.1 排序演算法的種類及時間限制 常見排序演算法一般分為非線性時間比較類排序和線性時間非比較類排序。 比較類排序演算法時間複雜度的下限為O(nlog⁡n)O(n\log n)O(nlogn),非比較類排序演算法不受比較式排序演算法的時間下

頻繁項集挖掘Apriori演算法及其Python實現

Apriori演算法是通過限制候選產生髮現頻繁項集。 Apriori演算法使用一種稱為逐層搜尋的迭代方法,其中k項集用於探索(k+1)項集。首先,通過掃描資料庫,累計每個項的計數,並收集滿足最小支援度的項,找出頻繁1項集的集合,記為L1。然後,使用L1找出頻繁

機器學習之深入理解神經網路理論基礎、BP演算法及其Python實現

  人工神經網路(Artificial Neural Networks,ANN)系統是 20 世紀 40 年代後出現的。它是由眾多的神經元可調的連線權值連線而成,具有大規模並行處理、分散式信 息儲存、良

高斯判別分析演算法及其python實現

高斯判別分析演算法(Gaussian discriminat analysis) 高斯判別演算法是一個典型的生成學習演算法(關於生成學習演算法可以參考我的另外一篇部落格)。在這個演算法中,我們假設p(x|y)服從多元正態分佈。 注:在判別學習演算法中,

K近鄰(KNN)演算法、KD樹及其python實現

1、k近鄰演算法 1.1 KNN基本思想 k近鄰法是基本且簡單的分類與迴歸方法,即對於輸入例項,依據給定的距離度量方式(歐式距離),以及選擇合適的k值(交叉驗證),在樣本集中找到最近鄰新例項的k個樣例,通過k個最近鄰樣例的類別表決出新例項的類別(多數表決)。

深入學習主成分分析(PCA)演算法原理及其Python實現

一:引入問題   首先看一個表格,下表是某些學生的語文,數學,物理,化學成績統計:   首先,假設這些科目成績不相關,也就是說某一科目考多少分與其他科目沒有關係,那麼如何判斷三個學生的優秀程度呢?首先我們一眼就能看出來,數學,物理,化學這三門課的成績構成了這組資料的主成分(很顯然,數學作為第一主成分,

KNN及其改進演算法python實現

一、馬氏距離 我們熟悉的歐氏距離雖然很有用,但也有明顯的缺點。它將樣品的不同屬性(即各指標或各變數)之間的差別等同看待,這一點有時不能滿足實際要求。例如,在教育研究中,經常遇到對人的分析和判別,個體的

常用距離演算法和相關係數及其Python實現

在機器學習的過程中,經常會遇到需要考察具有某些特徵的兩個樣本之間相似程度的情況。計相似程度的計算可以使用距離演算法或是相關係數,直觀來說,距離和相關係數的變化呈負相關,距離越小,相關係數越大,越相似,反之亦然。 接下來記錄幾種簡單實用的距離演算法和相關係數,以

Fuzzy C Means 算法及其 Python 實現——寫得很清楚,見原文

少包 均值 平均值 劃分 gin 及其 end 5% 指數 Fuzzy C Means 算法及其 Python 實現 轉自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5%8F%8A%E

(轉)梯度下降法及其Python實現

radi 減少 fill 叠代 bbs 方法 風險 ews 展示 梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解無約束最優化問題最常用的方法,它是一種叠代方法,每一步主要的操作是求解目標函數的梯度向量,將當前位置的負

Kmeans聚類算法及其 Python實現

lap pytho pan 鏈接 nbsp ade 不知道 ans details python Kmeans聚類之後如何給數據貼上聚類的標簽? 用了二分Kmeans 來聚類 質心和聚類的簇都得到了,不知道如何給每一條數據貼上具體的標簽? 這個鏈接下的代碼,可以作為參

常用algorithm及其Python實現

至少 圖片 gh值 com 下標 python 兩個 append exchange 冒泡排序 def bubble_sort(li): for i in range(len(li)-1): # i表示第幾趟 exchange = False

Kmeans 聚類 及其python實現

main chang pen wid matplot ret 步驟 -- name 主要參考 K-means 聚類算法及 python 代碼實現 還有 《機器學習實戰》 這本書,當然前面那個鏈接的也是參考這本書,懂原理,會用就行了。 1、概述 K-means 算

密碼傳紙條演算法訓練 -- python 實現

今天幫朋友解了一個很有意思的問題 -- 傳紙條,(要求用python實現)題目如下: 李雷和韓梅梅坐前後排,上課想說話怕被老師發現,所以改為傳小紙條。為了不被老師發現他們紙條上說的是啥,他們約定了如下方法傳遞資訊: 將26個英文字母(全為大寫),外加空格,一共27個字元分成3組,每組9個。也就是

MDS演算法及其matlab實現

問題背景: 在求解MTSP問題的時候,因為已知的為各個巡檢點之間路徑耗時長度,而這個具體描述採用無向圖結構可以很好的描述,在matlab中通過函式(graphallshortestpaths)可以得到任意兩個巡檢點之間的距離矩陣 1 %%得到任意兩個巡檢點之間的路徑時間長度 2 %W表示從一個巡

(轉)二十三種設計模式及其python實現

本文原始碼寄方於github:https://github.com/w392807287/Design_pattern_of_python 參考文獻: 《大話設計模式》——吳強 《Python設計模式》——pythontip.com 《23種設計模式》——http://www.cnblogs.com/

naive bayes 演算法Python實現與理解

在機器學習中,樸素貝葉斯演算法對於大家來說其實並不陌生,在我前面的部落格中,我也對樸素貝葉斯演算法的原理有所介紹,這篇文章我們一起來學習如何用Python來實現這個樸素貝葉斯演算法。 首先我們匯入numpy這個Python庫,來支援我們後續的一些數學運算。 from numpy i

usersig 生成演算法python 實現

  #! /usr/bin/python # coding:utf-8 # 此檔案是 tls sig api 的 python 另一種實現 # 使用了 python ecdsa 開發庫 __author__ = "[email protected]" __date__