Machine Learning: Какво означава извадката да не е балансирана?

Кога имаме небалансирана извадка?

В много от случаите при решаване на задачи за класификация с методите на машинното обучение попадаме на извадка, при която представителите на класовете в целевата променлива не са равномерно разпределени, т.е. броят на обектите, принадлежащи към един клас, е значително по-различен от на този на другите класове. Тогава казваме, че тя не е балансирана.

Защо е необходимо да работим с балансирана извадка?

Представете си, че имаме извадка с данни за студенти. Тя включва следните характеристики: брой отсъствия, изпратени домашни, оценки и целева променлива, съдържаща 2 класа – преминали в следващ курс и непреминали. На базата на тези данни трябва да се построи класификатор, който да определя дали преминава или не студентът в следващ курс.

  • Общо студенти: 130
  • Брой преминали студенти: 120
  • Брой непреминалите студенти: 10

В този случаи имаме много силно небалансирана извадка, защото студентите, които са преминали курса, представляват 92% от данните. Това означава, че без да се използват методи за машинно обучение, ако се опитаме сами да отгатнем на случаен принцип и кажем, че студентът преминава курса, в 92% от случаите ще бъдем прави. Това би обезсмислило използването на методи за машинно обучение.

В тази статия ще ви запозная с различните методи за балансиране на извадка, които предоставя библиотеката imblearn на Python.

За примерите, които ще видите по-надолу, ще използваме данни, които са синтетични. Те съдържат характеристики за възрастта и заплатата на служители, а целевата променлива се състои от 2 класа – дали са получили или не повишение, т.е. имаме случай на бинарна класификация.

df = pd.DataFrame({'Age': [28, 41, 60, 44, 24, 55, 50, 60, 70, 25, 52, 48, 58, 68, 36, 26, 39],
                   'Salary': [1600, 2550, 850, 1780, 1250, 1000, 2000, 1583, 580, 1488, 1055, 2450, 3560, 1700, 2425, 1450, 2230],
                    'Promotion': ['No','No','No','No','No','Yes','Yes','No','No','No','Yes', 'No', 'Yes', 'No', 'Yes','No','Yes']})

Резултат:

AgeSalaryPromotion
0281600No
1412550No
260850No
3441780No
4241250No
5551000Yes
6502000Yes
7601583No
870580No
9251488No
10521055Yes
11482450No
12583560Yes
13681700No
14362425Yes
15261450No
16392230Yes
  • Общо служители: 17
  • Брой получили повишение (клас Yes): 6
  • Брой неполучили повишение (клас No): 11
X=df.drop(['Promotion'], axis=1)
y=df['Promotion']

Разделяме данните в променливите X и y. В първата са отделните характеристики за всеки служител, а във втората е целевата променлива.

Библиотеката imblearn

Oversampling

Oversampling е техника за балансиране на извадка, при която се увеличава броят на обектите в по-малкото множество (minority), така че да се изравни с броя в по-голямото (majority).

  • SMOTE

SMOTE (Synthetic Minority Oversampling Technique) е често използван метод за балансиране на извадки. Той генерира синтетично нови обекти, като използва алгоритъма k най-близки съседи (kNN). Броят съседи предимно е 5 и методът работи, като произволно избира един от тях, след което се създава нов сходен запис за класа с по-малко представители.

sm = SMOTE(random_state=2)
X_res_smote, y_res_smote = sm.fit_sample(X, y.ravel())

Новите записи:

AgeSalaryPromotion
18473009Yes
19461494Yes
20501845Yes
21513218Yes
  • RandomOverSampler

Методът RandomOverSampler работи, като произволно дублира редове от по-малкото множество докато броя на представителите в класовете не се изравни. Прилагането на този метод би могло да доведе до преобучение (overfitting), тъй като моделът вижда повтарящи се записи, особено и ако те са много на брой.

ros = RandomOverSampler(random_state=2)
X_res_ros, y_res_ros = ros.fit_sample(X, y.ravel())

Новите записи:

AgeSalaryPromotion
18392230Yes
19551000Yes
20583560Yes
21521055Yes
  • ADASYN (Adaptive Synthetic)

Това е метод, който адаптивно генерира синтетични данни за класът с по-малко представители, използвайки алгоритъма k най-близки съседи. Разликата между този метод и SMOTE е фактът, че ADASYN взима плътността на разпределението на данните като критерий, за да прецени колко нови обекта да генерира.

ada = ADASYN(random_state=2)
X_res_ada, y_res_ada = ada.fit_sample(X, y.ravel())

Новите записи:

AgeSalaryPromotion
18462075Yes
19481335Yes
20493127Yes
21431861Yes

Обобщаваща визуализация:

oversampling при небалансирана извадка

Oversampling методите увеличават представителите на по-малкото множество, като в нашия случай това е положителният клас.

Разпределението на класовете:

  • Yes = 11
  • No = 11

Undersampling

Undersampling е техника, при която, се намаляват случаите в класа с повече представители до такава степен, че броят им да се изравни с този в класа с по-малко представители.

  • NearMiss

NearMiss е метод, който намалява броя на обектите на базата на определено правило. Алгоритъма има 3 версии, озаглавени NearMiss-1, NearMiss-2 и NearMiss-3, като коя да използва се задава чрез параметър на метода. Първата е зададена по подразбиране.

  • NearMiss-1 – Премахва записите, за които средното разстояние (по kNN) до обекти от класа с по-малко представители е най-ниско.
  • NearMiss-2 – Премахва тези записи, при които средното разстояние до най-далечните обекти от класа с по-малко представители е минимално.
  • NearMiss-3 – Премахва записите от класа с повече представители, които имат най-малко средно разстояние до всеки обект от по-малкото множество.
nm = NearMiss()
X_res_nm, y_res_nm = nm.fit_sample(X, y.ravel())

Резултат:

AgeSalaryPromotion
0482450No
1412550No
2241250No
3441780No
4261450No
5251488No
6551000Yes
7502000Yes
8521055Yes
9583560Yes
10362425Yes
11392230Yes
  • RandomUnderSampler

Методът RandomUnderSampler работи, като произволно премахва записи от по-голямото множество докато броя на представителите в класовете не се изравни. Недостатък на този метод е, че е възможно да се премахне някой обект, който всъщност да е важен и да е нужно да присъства в извадката.

rus = RandomUnderSampler()
X_res_rus, y_res_rus = rus.fit_sample(X, y.ravel())

Резултат:

AgeSalaryPromotion
060850No
1251488No
2412550No
3681700No
4441780No
5241250No
6551000Yes
7502000Yes
8521055Yes
9583560Yes
10362425Yes
11392230Yes

Обобщаваща визуализация:

undersampling при небалансирана извадка

Undersampling методите намаляват представителите на по-голямото множество, като в нашия случай това е отрицателният клас.

Разпределението на класовете:

  • Yes = 6
  • No = 6

Коя техника да използваме?

Необходимо е да се направят множество тестове с различните методи, за да се прецени кой е най-подходящ. При прилагане на oversampling за балансиране на извадка се запазват всички оригинални записи, докато при undersampling може да се изгубят ценни данни, тъй като се премахват редове от множеството с повече представители. Може също така да се приложи и комбинация от двете техники. Като цяло възможностите са много и избор на това коя техника да използваме зависи от данните, с които разполагаме, както и от самата задача.

Искате да научите повече за машинното обучение?

Включете се в курса по машинно обучение и анализ на данни с Python.

Научете повече

Автор: Десислава Христова