داده های نامتوازن 2
نحوه برخورد با داده های نا متعادل در پایتون
یکی از محبوب ترین کتاب خانه ها برای روش های نمونه گیری در پایتون بسته یادگیری نا متعادل می باشد. چندین روش برای بیش و کم نمونه گیری و همچنین برخی روش های ترکیبی ارائه می دهد. برای این آموزش، یک مثال برای هر یک از این 3 روش را بررسی می کنیم:
- کم نمونه گیری تصادفی با RandomUnderSampler
- بیش نمونه گیری با SMOTE (تکنیک بیش نمونه گیری اقلیت مصنوعی)
- ترکیبی از کم نمونه گیری تصادفی و بیش نمونه گیری با استفاده از pipeline
مجموعه داده مورد استفاده در این آموزش مبتنی بر داده های بازاریابی بانکی از مخزن UCI است. این یک مشکل طبقه بندی است که در آن هدف این است که پیش بینی شود آیا مشتری، مشترک یک سپرده مدت دار است یا خیر. تمام ستون های ویژگی طبقه بندی (متن) در فرم های عددی مناسب ماشین کد گذاری میشوند. مجموعه داده کد گذاری شده در Github میزبانی می شود. به منظور آزمایش این که پس از نمونه گیری مجدد، عملکرد داده ها چه مقدار بهتر می شود، مدل ماشین بردار پشتیبان را روی داده های نمونه گیری مجدد آموزش می دهیم تا عملکرد مدل را بررسی کنیم. کد های کامل پایتون را نیز می توان در همان مخزن Github یافت.
دلیل انتخاب این مجموعه داده این است که منعکس کننده مجموعه داده های نا متعادل رایج در برنامه های روزمره است. همانطور که انتظار می رود، داده ها بسیار نا متعادل هستند و تنها حدود 13٪ [5,289/(5,289+39,922)] از مشتریانی که با آن ها تماس گرفته شده، در واقع مشترک یک سپرده مدت دار هستند. در پایتون، تعداد هر طبقه پیش بینی شده را می توان با استفاده از روش value_counts() چاپ کرد.
توزیع طبقه های هدف. 0 اکثر مشتریان طبقه منفی با نام مستعار می باشد که هنوز به سپرده مدت دار تبدیل نکرده اند در حالی که 1 نشان دهنده اقلیت مشتریان طبقه مثبت با نام مستعار است که مشترک سپرده مدت دار شده اند.
- کم نمونه گیری تصادفی
همان طور که از نام آن پیداست، کم نمونه گیری تصادفی تعداد طبقات اکثریت را به طور تصادفی به نسبت مطلوب در برابر طبقه اقلیت کاهش می دهد. این احتمالا ساده ترین راه برای کم نمونه گیری است و اگر نمونه های طبقه اکثریت به هم نزدیک باشند، می تواند نتایج خوبی به همراه داشته باشد. برای یک روش آماری بیشتر برای کاهش طبقه اکثریت، می توانید به نزدیک ترین همسایه متراکم (معروف به CNN، بر اساس الگوریتم هارت (Hart) )، Tomek Links (پیشرفتی نسبت به تکنیک اصلی CNN)، NearMiss، و غیره فقط برای نام بردن یک مورد جدید. خوشبختانه، تمام تکنیک های ذکر شده در یک بسته یادگیری نا متعادل موجود هستند که می توانید به راحتی آن ها را وارد کنید و امتحان کنید.
قطعه کد به دو بخش تقسیم می شود: بخش 1 کد هایی را به شما نشان می دهد تا به طور تصادفی از کلاس اکثریت نمونه گیری کنید. بخش 2 داده های نمونه گیری مجدد را با ماشین بردار پشتیبان آموزش می دهد و امتیاز ROC AUC را به دست می آورد.
#PART 1
# import random undersampling and other necessary libraries
from collections import Counter
from imblearn.under_sampling import RandomUnderSampler
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter(action=’ignore’, category=FutureWarning)
#import data
url = “https://raw.githubusercontent.com/jackty9/Handling_Imbalanced_Data_in_Python/master/bank-full-encoded.csv”
df = pd.read_csv(url)
# Separating the independent variables from dependent variables
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
#Split train-test data
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.30)
# summarize class distribution
print(“Before undersampling: “, Counter(y_train))
# define undersampling strategy
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# fit and apply the transform
X_train_under, y_train_under = undersample.fit_resample(X_train, y_train)
# summarize class distribution
print(“After undersampling: “, Counter(y_train_under))
#PART 2
# import SVM libraries
from sklearn.svm import SVC
from sklearn.metrics import classification_report, roc_auc_score
model=SVC()
clf_under = model.fit(X_train_under, y_train_under)
pred_under = clf_under.predict(X_test)
print(“ROC AUC score for undersampled data: “, roc_auc_score(y_test, pred_under))
خروجی قطعه کد: خط 1 توزیع اصلی داده را نشان می دهد. خط 2 توزیع کم نمونه را نشان می دهد. خط 3 عملکرد مدل را با استفاده از داده های نمونه گیری شده نشان می دهد
- بیش نمونه گیری با استفاده از SMOTE
تصویری از بیش نمونه گیری با SMOTE با استفاده از 5 به عنوان k نزدیکترین همسایه. خود نگارنده توسط نویسنده.
برای تکنیک های بیش نمونه گیری، SMOTE (تکنیک بیش نمونه گیری اقلیت مصنوعی) به عنوان یکی از محبوب ترین و تاثیرگذار ترین الگوریتم های نمونه گیری داده در ML و داده کاوی در نظر گرفته می شود. با SMOTE، طبقه اقلیت با ایجاد نمونه های «مصنوعی» به جای بیش نمونه گیری با جایگزینی، بیش نمونه گیری میشود [2]. این نمونه های مصنوعی معرفی شده در امتداد بخش های خطی هستند که به تعداد مشخصی از طبقه اقلیت k نزدیک ترین همسایه ها می پیوندند، که در بسته imblearn به طور پیش فرض روی پنج تنظیم شده است.
قطعه کد به دو بخش تقسیم میشود: بخش 1 کد هایی را به شما نشان می دهد که می توانید از طبقه اقلیت با استفاده از SMOTE نمونه گیری کنید. بخش 2 داده های نمونه گیری مجدد را با ماشین بردار پشتیبان آموزش می دهد و امتیاز ROC AUC را به دست می آورد.
#PART 1
# import SMOTE oversampling and other necessary libraries
from collections import Counter
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter(action=’ignore’, category=FutureWarning)
#import data
url = “https://raw.githubusercontent.com/jackty9/Handling_Imbalanced_Data_in_Python/master/bank-full-encoded.csv”
df = pd.read_csv(url)
# Separating the independent variables from dependent variables
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
#Split train-test data
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.30)
# summarize class distribution
print(“Before oversampling: “,Counter(y_train))
# define oversampling strategy
SMOTE = SMOTE()
# fit and apply the transform
X_train_SMOTE, y_train_SMOTE = SMOTE.fit_resample(X_train, y_train)
# summarize class distribution
print(“After oversampling: “,Counter(y_train_SMOTE))
#PART 2
# import SVM libraries
from sklearn.svm import SVC
from sklearn.metrics import classification_report, roc_auc_score
model=SVC()
clf_SMOTE = model.fit(X_train_SMOTE, y_train_SMOTE)
pred_SMOTE = clf_SMOTE.predict(X_test)
خروجی قطعه کد: خط 1 توزیع اصلی داده را نشان می دهد. خط 2 توزیع بیش نمونه گیری شده را نشان می دهد. خط 3 عملکرد مدل را با استفاده از داده های نمونه گیری شده نشان می دهد
- ترکیبی از روش کم و بیش نمونه گیری با استفاده از خط لوله
قطعه کد به دو بخش تقسیم می شود: بخش 1 کد هایی را به شما نشان می دهد تا یک خط لوله برای نمونه گیری مجدد داده ها با استفاده از هر دو روش کم و بیش نمونه گیری، به شما نشان می دهد. بخش 2 داده های نمونه گیری مجدد را با ماشین بردار پشتیبان آموزش می دهد و میانگین امتیاز ROC AUC را پس از اعتبار سنجی متقاطع خروجی می دهد.
#PART 1
# import sampling and other necessary libraries
from collections import Counter
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter(action=’ignore’, category=FutureWarning)
from sklearn.svm import SVC
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline
#import data
url = “https://raw.githubusercontent.com/jackty9/Handling_Imbalanced_Data_in_Python/master/bank-full-encoded.csv”
خروجی قطعه کد که امتیازات ROC AUC را با استفاده از روش نمونه گیری ترکیبی نشان می دهد.
پاداش – چگونه بفهمم کدام نسبت نمونه گیری بهترین است؟
در آموزش بالا، داده ها را کم /یا بیش نمونه گیری می کنیم تا توزیع متعادل 50:50 از هر دو طبقه را داشته باشیم. اما اگر بخواهیم بهترین نسبت نمونه گیری را بر اساس عملکرد مدل پیدا کنیم، چگونه می توانیم این کار را انجام دهیم؟ ما می توانیم این کار را با پیاده سازی حلقه های for در پایتون انجام دهیم تا لیست احتمالی نسبت نمونه گیری را تکرار کنیم و ببینیم کدام ترکیب بهترین عملکرد را بر اساس میانگین امتیاز ROC AUC (یا سایر معیار های عملکرد انتخابی) پس از اعتبار سنجی متقابل را دارد.
قطعه کد، کد هایی را به شما نشان می دهد که یک خط لوله ایجاد کنید تا داده ها را با استفاده از هر دو روش نمونه گیری کم و بیش، نمونه گیری کنید. فهرست نسبت های ممکن برای بیش نمونه گیری [0.3,0.4,0.5] در حالی که برای کم نمونه گیری [0.7,0.6,0.5] است. این نسبت ها به طور تصادفی برای اهداف نمایشی انتخاب می شوند و می توانند پس از آزمایش و خطا با مقادیر دیگری جایگزین شوند. سپس ماشین بردار پشتیبان با داده های نمونه گیری مجدد برای هر جفت ترکیب نسبت ممکن، قبل از خروجی میانگین امتیاز ROC AUC و پس از اعتبار سنجی متقابل آموزش داده می شود.
# import necessary libraries
import numpy as np
from sklearn.svm import SVC
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_auc_score
from numpy import mean
#import data
url = “https://raw.githubusercontent.com/jackty9/Handling_Imbalanced_Data_in_Python/master/bank-full-encoded.csv”
df = pd.read_csv(url)
# Separating the independent variables from dependent variables
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
# values to evaluate
over_values = [0.3,0.4,0.5]
under_values = [0.7,0.6,0.5]
for o in over_values:
for u in under_values:
# define pipeline
model = SVC()
over = SMOTE(sampling_strategy=o)
under = RandomUnderSampler(sampling_strategy=u)
steps = [(‘over’, over), (‘under’, under), (‘model’, model)]
pipeline = Pipeline(steps=steps)
# evaluate pipeline
scores = cross_val_score(pipeline, X, y, scoring=’roc_auc’, cv=5, n_jobs=-1)
score = mean(scores)
print(‘SMOTE oversampling rate:%.1f, Random undersampling rate:%.1f , Mean ROC AUC: %.3f’ % (o, u, score))
خروجی قطعه کد برای میانگین امتیاز ROC AUC برای هر جفت ترکیب نسبت ممکن.
همان طور که در عکس خروجی مشاهده می شود، بهترین نسبت نمونه گیری در این مثال داشتن نسبت بیش نمونه گیری 0.5 است و پس از آن نسبت کم نمونه گیری از 0.7 برای بهترین میانگین امتیاز ROC AUC ممکن در 82.1٪ است.
دیدگاهتان را بنویسید