一、SMOTE演算法的介紹
SMOTE,即Synthetic Minority Over-sampling Technique,是一種平衡不均衡數據集的演算法,主要用於處理分類問題中的不均衡類別。在一個不均衡數據集中,通常會有較多數量的正例(majority),而少量數量的反例(minority),這會給分類器的學習過程造成困難,因為分類器往往會擬合較多的majority類別而忽略少量的minority類別。而SMOTE演算法通過人工合成少量的反例,來增加minority類別的樣本數量,從而平衡了數據集。
SMOTE演算法的基本思想是,對於每一個少數類別樣本,從它的k個最近鄰中隨機選擇一個樣本,用少數類別樣本和它的k個最近鄰樣本之間的差向量乘以一個隨機數倍,然後加上少數類別樣本,從而得到新的合成樣本。這個過程被稱為「插值」,它保留了少數類別樣本的信息和特徵,同時增加了樣本的數量。
二、SMOTE演算法的代碼實現
import numpy as np def SMOTE(X, y, k): # X:原始的訓練數據 # y:原始訓練數據的標籤 # k:用戶指定的k值,表示從多少個樣本中抽取新的樣本 # 返回值:生成的新的合成數據 n_samples, n_features = X.shape X_minority = X[y == 1] # 少數類別樣本 # 將少數類別樣本的索引存入neighbors數組 from sklearn.neighbors import NearestNeighbors neighbors = NearestNeighbors(n_neighbors=k).fit(X_minority) distances, indices = neighbors.kneighbors(X_minority) # 生成新的合成數據 synthetic_ = [] for i in range(len(X_minority)): nn = np.random.randint(0, k) # 隨機選擇一個最近鄰 diff = X_minority[nn] - X_minority[i] # 計算向量差 gap = np.random.rand() # 隨機化插值倍數 synthetic = X_minority[i] + gap * diff # 插值 synthetic_.append(synthetic) return np.array(synthetic_)
以上是SMOTE演算法的Python代碼實現,其中需要注意的是,我們需要使用NearestNeighbors這個類來計算少數類別樣本到它的k個最近鄰的距離和索引。接下來是對SMOTE演算法的代碼實現細節進行的闡述。
三、SMOTE演算法實現細節解析
1、計算少數類別樣本的k個最近鄰
在SMOTE演算法中,需要計算每個少數類別樣本到它的k個最近鄰的距離和索引。這裡我們使用了sklearn中的NearestNeighbors這個類,它的使用方法非常簡單,只需要:
neighbors = NearestNeighbors(n_neighbors=k).fit(X_minority) distances, indices = neighbors.kneighbors(X_minority)
其中fit()函數表示擬合數據,即計算每個點到它的k個最近鄰的距離和索引;kneighbors()函數將返回距每個點的k個最近鄰的距離和索引。
2、生成新的合成數據
在計算少數類別樣本的k個最近鄰之後,就可以開始生成新的合成數據了。
對於每一個少數類別樣本,我們從它的k個最近鄰中隨機選擇一個樣本,用少數類別樣本和它的k個最近鄰樣本之間的差向量乘以一個隨機數倍,然後加上少數類別樣本,從而得到新的合成樣本。這個過程被稱為「插值」,它保留了少數類別樣本的信息和特徵,同時增加了樣本的數量。具體實現如下:
# 生成新的合成數據 synthetic_ = [] for i in range(len(X_minority)): nn = np.random.randint(0, k) # 隨機選擇一個最近鄰 diff = X_minority[nn] - X_minority[i] # 計算向量差 gap = np.random.rand() # 隨機化插值倍數 synthetic = X_minority[i] + gap * diff # 插值 synthetic_.append(synthetic)
這裡需要注意,由於隨機因素的存在,SMOTE演算法的結果並不完全相同,通常需要對過程進行多次模擬取平均值。
四、SMOTE演算法參考文獻
Chawla, N. V., Bowyer, K. W., Hall, L. O., & Kegelmeyer, W. P. (2002). SMOTE: Synthetic minority over-sampling technique. Journal of AI research, 16, 321-357.
以上是SMOTE演算法的Python實現詳解,通過對照代碼和實現細節,相信讀者已經對SMOTE演算法有了更深入的了解。在具體應用中,也可以根據實際情況對代碼進行修改和優化,以達到更好的效果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/295758.html