Ինչու չեք կարող անտեսել դասի անհավասարակշռությունը և ինչպես լուծել դրանք

Եթե ​​դուք աշխատում եք դասակարգման մոդելի վրա, հավասարակշռված դասերը հաճախ անհրաժեշտ են, որպեսզի մոդելն աշխատի այնպես, ինչպես սպասվում էր: Ցավոք, մենք միշտ չէ, որ կարող ենք ընտրել մեր տվյալները, և տվյալների գիտության շատ նախագծեր ներառում են տվյալներ անհավասարակշռված դասերով: Սկսած խարդախության հայտնաբերումից մինչև հաճախորդի մերժում, սպամի հայտնաբերում և անոմալիաների հայտնաբերում, որպես տվյալների գիտաշխատող, դուք, ամենայն հավանականությամբ, կենթարկվեք տվյալների հավաքածուների, որոնք չեն համապատասխանում ձեր կանխատեսող մոդելի բնորոշ պահանջներին:

Այսօր մենք պատրաստվում ենք անցնել մի օրինակով, թե ինչպես անհավասարակշռված դասերը կարող են ազդել լոգիստիկ ռեգրեսիայի ալգորիթմի վրա, որն օգտագործվում է վարկային քարտի խարդախության հայտնաբերման համար:

Այս օրինակում օգտագործված տվյալները Kaggle-ից են և կարելի է ներբեռնել այստեղ:

Տվյալների մասին

Տվյալների հավաքածուն, որը մենք պատրաստվում ենք օգտագործել, ներկայացնում է 284,807 վարկային քարտով գործարքներ: Այս բոլոր գործարքներից 492-ը ներկայացնում են խարդախ գանձումներ, ինչը նշանակում է, որ տվյալները խիստ անհավասարակշռված են և խարդախությունները կազմում են ընդհանուր գործարքների 0,2%-ից պակաս: Հատկանիշները թվային մուտքային փոփոխականներ են, որոնք առաջացել են PCA փոխակերպման արդյունքում:

Նպատակ

Նախքան սուզվելը, եկեք համառոտ բացահայտենք այս ձեռնարկի մեր նպատակները: Ի վերջո, այստեղ մեր նպատակը կլինի հասկանալ, թե ինչպես անհավասարակշռված դասերը կարող են ազդել լոգիստիկ ռեգրեսիայի մոդելի աշխատանքի վրա:

Օրինակ, որոշ հարցեր, որոնք մենք կտանք, հետևյալն են.

  1. Ինչպե՞ս են անհավասարակշռված տվյալները ազդում իմ կատարողականության ցուցանիշների վրա:
  2. Վերանմուշավորման ո՞ր մեթոդները կարող եմ օգտագործել անհավասարակշռված տվյալների հետևանքների դեմ պայքարելու համար:
  3. Ինչպե՞ս կարող եմ իմ մոդելը հարմարեցնել անհավասարակշռված դասերի համար:

Տվյալների վերլուծության գործընթաց

Մեր մոդելի վրա անհավասարակշռված դասերի ազդեցությունը ցույց տալու համար մենք նախ պետք է ցույց տանք, թե ինչպիսին է բազային մոդելը՝ առանց հաշվի առնելու խարդախ վճարների այս անհավասար բաշխումը:

Մենք կսկսենք ցուցադրելով խարդախ և ոչ խարդախ գանձումների քանակը:

df.Class.value_counts().plot(kind='pie')

Ինչպես տեսնում եք, խարդախության համար դրական (դաս = 1) դեպքերը գրեթե բացակայում են մեծամասնության դասի համեմատ (դաս=0):

Մենք տվյալները բաժանում ենք հատկանիշների (X) և թիրախային փոփոխականի (y) ստորև նշված կոդով.

X=df.drop('Class', axis=1)
y=df['Class']

Հաջորդը, մենք կբաժանենք մեր տվյալները վերապատրաստման և թեստավորման հավաքածուների՝ մեր տվյալների 30%-ը հատկացնելով մեր թեստային հավաքածուին: Նկատի ունեցեք, որ մենք ՉԵՆ շերտավորում խմբերը, ինչը նշանակում է, որ դասերի հարաբերակցությունը համարժեք չէ վերապատրաստման և թեստավորման հավաքածուների միջև.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, 
                                                    y, 
                                                    test_size=0.3, 
                                                    random_state=42)

Հենց այստեղ է, որ անհավասարակշռված տվյալների հետ կապված ամեն ինչ կարող է բարդանալ, քանի որ մենք չենք ապահովում որոշակի թվով կեղծ գանձումներ վերապատրաստման կամ թեստավորման հավաքածուում, բայց մենք դրան կհասնենք ավելի ուշ:

Այժմ, երբ մենք ունենք մեր վերապատրաստման և թեստավորման հավաքածուն, մենք կարող ենք առաջ գնալ և կառուցել մեր բազային մոդելը:

##build baseline logistic regression
from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression(solver='liblinear')
lr_model.fit(X_train, y_train)

Մեր մոդելը գնահատելու համար եկեք տպենք դասակարգման հաշվետվությունը.

from sklearn.metrics import (plot_confusion_matrix,
                            classification_report,
                            plot_precision_recall_curve,
                            plot_roc_curve)
def report(model):
    preds = model.predict(X_test)
    print(classification_report(preds, y_test))
    plot_confusion_matrix(model, X_test, y_test)
    
print("LOGISTIC REGRESSION MODEL")
report(lr_model)

Արդյունք:

Այժմ այս զեկույցի արդյունքները սկզբում հիանալի տեսք ունեն՝ 100% ճշգրտությամբ և հիշելով մեծամասնության դասի համար: Այնուամենայնիվ, երբ մենք նայում ենք փոքրամասնությանը, տեսնում ենք, որ մենք արձանագրում ենք դրական դեպքերի միայն 69% -ը, և մեր ճշգրտությունը նվազում է մինչև 60%:

Օգտագործելով պատշաճ կատարողականի չափումներ

Այստեղ մենք սկսում ենք նկատել, որ ամեն ինչ կարող է այնպես չլինել, ինչպես թվում է: Չնայած կշռված միջինը 100% է ճշգրտության, հիշողության և f1 գնահատականի համար, երբ մենք ուշադիր նայում ենք փոքրամասնության դասին (խարդախ մեղադրանքները), մենք տեսնում ենք, որ մեր մոդելը լավ աշխատանք չի կատարում դրանք նույնականացնելու հարցում, խարդախությունների 31%-ը բաց է թողնվել:

Սա դիտարկելու մեկ այլ եղանակ է ճշգրտության հետ կանչման կորը.

Ինչպես տեսնում եք վերևում, միջին ճշգրտությունը 0,58 է: Նախորդ հոդվածում Բհաջանդիպ Սինգհը վերանայում է ճշտության և հիշողության միջև ձգձգումը, ինչպես նաև ներառում է ճշգրտության հիշողության կորի լավ օրինակ.

Դուք կարող եք տեսնել մեր կորի և այս օրինակի տարբերությունը, այնպես չէ՞: Մեր կորը զգալիորեն իջնում ​​է մոտ .6 հետկանչման դեպքում, մինչդեռ օրինակի կորը մնում է կայուն: Սա նշանակում է, որ մեր մոդելի հետ կապված խարդախ մեղադրանքները բռնելու համար մենք հայտնվում ենք բազմաթիվ կեղծ պոզիտիվների հետ:

Խարդախ մեղադրանքներ բռնելու իրատեսական օրինակում կեղծ դրականը անլուրջ վերաբերմունք չէ: Մենք չենք ցանկանում որևէ մեկին մեղադրել խարդախության մեջ, եթե նա անմեղ է, բայց մենք նաև չենք ցանկանում բաց թողնել իսկապես խարդախ դեպքերը, երբ դրանք տեղի են ունենում:

Դա բարդ հավասարակշռություն է, բայց ես կարծում եմ, որ մենք կարող ենք ավելի լավ անել:

Comet Artifacts-ը թույլ է տալիս հետևել և վերարտադրել բարդ բազմափորձ սցենարներ, վերօգտագործել տվյալների կետերը և հեշտությամբ կրկնել տվյալների հավաքածուներում: «Կարդացեք Artifacts-ի այս արագ ակնարկը՝ ուսումնասիրելու այն ամենը, ինչ այն կարող է անել:

Անդրադառնալով դասի անհավասարակշռությանը

Մենք փորձելու ենք դասակարգային անհավասարակշռության դեմ պայքարի մի քանի եղանակներ: Նախ, ինչպես ես ակնարկեցի ավելի վաղ, մենք պատրաստվում ենք շերտավորել մեր գնացքի/փորձարկման բաժանումը y արժեքով: Սա նշանակում է, որ մենք կարող ենք համոզվել, որ մեր ուսուցման և թեստավորման տվյալները մոտ են իրենց խարդախ գանձումների հարաբերակցությամբ: Դա անելու համար մենք պարզապես մեկ պարամետր ենք ավելացնում մեր կոդը.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y, 
                                                    test_size=0.3, 
                                                    stratify=y, 
                                                    random_state=42)

Հաջորդը, մենք առաջ կգնանք և նորից կմարզենք և փորձարկենք լոգիստիկ ռեգրեսիայի մոդելը: Կոդն ընդհանրապես չի փոխվում, ուստի ես չեմ վերարտադրի այն ստորև, բայց սա արդյունքն է.

Ինչպես տեսնում եք, մեր ճշգրտությունը, հետկանչումը և f1 միավորը բարելավվել է փոքրամասնության դասի համար, ինչը նշանակում է, որ մենք ավելի շատ ենք բռնում այդ խարդախ մեղադրանքներից:

Թեև սա բարելավում է, ես դեռ կարծում եմ, որ մենք կարող ենք ավելի լավ անել:

Միգուցե մենք կարող ենք փորձել վերանայել մեր տվյալները՝ դասերը հավասարակշռելու համար:

Մեր առաջին տարբերակն այն է, որ փոքրամասնության դասը գերընտրել SMOTE-ի նման փաթեթով: Ըստ էության, SMOTE-ն ներառում է հետևյալ քայլերը.

  • Գտի՛ր կետի և նրա մոտակա հարևանի տարբերությունը
  • Տարբերությունը բազմապատկեք պատահական թվով 0-ի և 1-ի միջև
  • Ավելացրե՛ք այս տարբերությունը սկզբնական կետին՝ նոր սինթետիկ օրինակ ստեղծելու համար
  • Շարունակեք ձեր հաջորդ ամենամոտ հարևանի հետ, մինչև հասնեք կրկնությունների ցանկալի քանակին

Եթե ​​ցանկանում եք ավելի շատ մանրամասներ այն մասին, թե ինչպես է աշխատում SMOTE-ը և դրա հիմքում ընկած մաթեմատիկան, ստուգեք այս հոդվածը: Մեկ այլ վերանմուշառման տեխնիկա, որը կարող է օգտագործվել, մեծամասնության դասի թերընտրանքն է՝ այնպիսի մեթոդով, ինչպիսին է Tomek Links:

Յուրաքանչյուր տեխնիկա ունի իր առավելությունները, ինչպես նաև իր թերությունները: SMOTE-ի միջոցով մենք չենք կորցնում մեր մեծամասնության դասի տվյալներից ոչ մեկը վերընտրման գործընթացում, բայց դա կարող է նաև հանգեցնել գերհամապատասխանեցման: Այնուամենայնիվ, եթե մենք Tomek Links-ով թերընտրենք մեծամասնության դասը, մենք վտանգի ենք ենթարկում կորցնելու կարևոր տվյալները: Բարեբախտաբար, կա SMOTE-ն ու Tomek Links-ը համատեղելու միջոց՝ այս խնդիրները հաղթահարելու համար:

Կա մի հմուտ python փաթեթ, որը կոչվում է SMOTETomek, որը նախ ներառում է փոքրամասնության դասի գերնմուշավորումը, այնուհետև փոքր նմուշառումը՝ դասի սահմանին մոտ գտնվող նմուշները հեռացնելու համար, ինչը թույլ է տալիս մեզ ավելի ճշգրիտ և ճշգրիտ սահմանել դասերը:

Մեր օրինակի համար մենք կփորձենք տարբեր նմուշառման մեթոդներ՝ տեսնելու, թե որն է լավագույնս աշխատում.

from imblearn.combine import SMOTETomek
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import TomekLinks
## first method 
s= SMOTE()
##second method
smt= SMOTETomek()
##Third method
tk= TomekLinks()
X_res, y_res= s.fit_resample(X_train, y_train)
X_res1, y_res1= smt.fit_resample(X_train, y_train)
X_res2, y_res2= tk.fit_resample(X_train, y_train)

Ստորընտրանքային մեթոդն այստեղ ակնհայտ հաղթողն է՝ 65% ճշգրտությամբ և 74% հետկանչմամբ, ինչը մեր նախկին մոդելների համեմատ որոշակի բարելավում է:

Ցավոք սրտի, երկու մոդելներն էլ, որոնք օգտագործում էին SMOTE-ը, հանգեցրին վերապատրաստման տվյալներին գերազանցելու և փորձարկման տվյալների շատ ցածր հետկանչման:

Մոդելային կշիռներ

Անհավասարակշռված տվյալների հասցեագրման մեկ այլ տարբերակ էկշռվածլոգիստիկ ռեգրեսիայի օգտագործումը:

from sklearn.metrics import (accuracy_score, 
                             confusion_matrix,
                             roc_curve, 
                             roc_auc_score, 
                             precision_score, 
                             recall_score, 
                             precision_recall_curve)
from sklearn.metrics import f1_score
# define class weights
w = {0:1, 1:99} 
# define model
lg2 = LogisticRegression(random_state=13, class_weight=w)
# fit it
lg2.fit(X_train,y_train)
def report(model):
    preds = lg2.predict(X_test)
    print(classification_report(preds, y_test))
    plot_confusion_matrix(lg2, X_test, y_test)
    plot_precision_recall_curve(lg2, X_test, y_test)
    plot_roc_curve(lg2, X_test, y_test)
print("Weighted LOGISTIC REGRESSION MODEL")
report(lg2)

Երբ մենք գործարկում ենք այս կոդը, մենք ստանում ենք հետևյալ արդյունքը.

Կրկին, թվում է, թե մենք գերհարմարվելու խնդիր ունեինք, քանի որ մեր վերջնական հետկանչը բավականին ցածր է (12%):

Եզրակացություններ

Ձեր կանխատեսող մոդելներում անհավասարակշռված դասերը վարելու բազմաթիվ եղանակներ կան: Այսօր մենք լուսաբանեցինք շերտավորված նմուշառումը, գերընտրանքը, թերընտրանքը և մոդելային կշիռները:

Ելնելով մեր արդյունքներից՝ ցածր նմուշառման մեթոդը, որը զուգորդվում է շերտավորված գնացքի փորձարկման բաժանման հետ, ամենաարդյունավետն էր մեր մոդելի համար՝ ստանալով 0,82 միջին ճշգրտություն, միջին հետկանչում՝ 0,87 և F1 միջին գնահատականը՝ 0,85:

Անշուշտ, լոգիստիկ ռեգրեսիայի մոդելը, ըստ էության, այնքան էլ լավ չէ անհավասարակշռված տվյալների մշակման համար, այնպես որ ի սկզբանե մենք ավելի լավ կլիներ գնալ Աջակցող վեկտորի մեքենայի (SVM), K-մոտակա հարևանի (KNN) կամ պատահական անտառի հետ: մոդել.

Մենք անպայման կանդրադառնանք այդ տարբերակներին և ավելին ապագա հաղորդագրություններում, որոնք վերաբերում են անհավասարակշռված տվյալներին և հազվագյուտ իրադարձությունների կանխատեսմանը:

Խմբագրի նշում. Heartbeat-ը ներդրողների վրա հիմնված առցանց հրատարակություն է և համայնք, որը նվիրված է տվյալների գիտության, մեքենայական ուսուցման և խորը ուսուցման մասնագետների համար առաջնակարգ կրթական ռեսուրսների տրամադրմանը: Մենք պարտավորվում ենք աջակցել և ոգեշնչել ծրագրավորողներին և ինժեներներին կյանքի բոլոր ոլորտներից:

Խմբագրականորեն անկախ, Heartbeat-ը հովանավորվում և հրապարակվում է Comet MLOps հարթակի կողմից, որը տվյալների գիտնականներին և ML թիմերին հնարավորություն է տալիս հետևել, համեմատել, բացատրել և օպտիմալացնել իրենց փորձերը: Մենք վճարում ենք մեր ներդրողներին և գովազդ չենք վաճառում:

Եթե ցանկանում եք ներդրում ունենալ, անցեք մեր նպաստողների կոչին: Դուք կարող եք նաև գրանցվել՝ ստանալու մեր շաբաթական տեղեկագրերը (Deep Learning Weekly և Comet Newsletter), միանալ մեզ »«Slack-ում և հետևել Comet-ին Twitter-ում և LinkedIn-ում ռեսուրսների, իրադարձությունների և այլնի համար: շատ ավելին, որը կօգնի ձեզ ավելի արագ կառուցել ավելի լավ ML մոդելներ: