python實現smote處理正負樣本失衡問題

       機器學習中難免遇到正負樣本不平衡問題,處理辦法通常有梁總,一:過採樣,增加正樣本數據;二:欠採樣,減少負樣本數據,缺點是會丟失一些重要信息。smote屬於過採樣。

代碼

# from imblearn.over_sampling import BorderlineSMOTE
# from imblearn.over_sampling import SMOTENC
# from imblearn.over_sampling import SVMSMOTE
# from imblearn.over_sampling import KMeansSMOTE
# from imblearn.over_sampling import ADASYN
# from imblearn.over_sampling import RandomOverSampler
import pandas as pd 
import numpy as np
from collections import Counter
from imblearn.over_sampling import SMOTE# 使用imlbearn庫中上採樣方法中的SMOTE接口
import matplotlib.pyplot as plt

# 生成一組0和1比例爲9比1的樣本,X爲特徵,y爲對應的標籤
x1=[np.random.randint(1,31) for i in range(90)]+[np.random.randint(50,81) for i in range(10)]
x2=[np.random.randint(1,31) for i in range(90)]+[np.random.randint(50,81) for i in range(10)]
y=[0 for i in range(90)]+[1 for i in range(10)]
x=pd.DataFrame({'x1':x1,'x2':x2})
y=pd.DataFrame(y)

# 查看所生成的樣本類別分佈,0和1樣本比例9比1,屬於類別不平衡數據
print(Counter(list(y[0])))
fig1=plt.figure(1)
plt.scatter(x['x1'],x['x2'])
plt.show

# 定義SMOTE模型,random_state相當於隨機數種子的作用
smo = SMOTE(sampling_strategy='auto',random_state=10)
x_smo, y_smo = smo.fit_sample(x, y)
print(Counter(list(y_smo[0])))
fig2=plt.figure(2)
plt.scatter(x_smo['x1'],x_smo['x2'])
plt.show

結果

處理前

處理後

如果對你有幫助,請點下贊,予人玫瑰手有餘香!

時時仰望天空,理想就會離現實越來越近!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章