Данная статья рассчитана для новичков в машинном обучении. Используются следующие инструменты: Python Random forest classifier Google Colab Upsampling data Каждый дата саентист хоть раз сталкивался с проблемой несбалансированности данных для классификации: какой-то класс превосходит другие. Существует далеко не один способ борьбы с этой проблемой. Наибольшую известность имеет преобразование гиперпараметров, например: class_weight, но его можно использовать при незначительной несбалансированности: соотношении данных разных классов, например, 4:3 (подробнее можно прочесть тут) warm_start, который позволяет батчами (частями датасета) обучать данные (подробнее можно прочесть тут) Однако в данной статье мы рассмотрим метод, не связанный с гиперпараметрами модели: upsampling data. Мы преувеличим количество наименьших классов ещё до обучения модели: продублируем n (отношение количества преобладающего класс к интересующему) раз наименьший класс. В качестве данных выбраны данные соревнования на kaggle: https://www.kaggle.com/arashnic/banking-loan-prediction. В качестве алгоритма обучения возьмём случайные лес. Начнём! Импортируем необходимые библиотеки: Загружаем данные (в качестве среды разработки мной использовался Google Colab, а данные располагались на Google Drive): Посмотрим на исходные данные train (их мы будем использовать для тренировки и теста, в данных test отсутствует таргетированный столбец)  Gender DOB Lead_Creation_Date City_Code City_Category Employer_Code Employer_Category1 Employer_Category2 Monthly_Income Customer_Existing_Primary_Bank_Code Primary_Bank_Type Contacted Source Source_Category Existing_EMI Loan_Amount Loan_Period Interest_Rate EMI Var1 Approved 0 APPC90493171225 Female 23/07/79 15/07/16 C10001 A COM0044082 A 4.0 2000.0 B001 P N S122 G 0.0 NaN NaN NaN NaN 0 0 1 APPD40611263344 Male 07/12/86 04/07/16 C10003 A COM0000002 C 1.0 3500.0 B002 P Y S122 G 0.0 20000.0 2.0 13.25 953.0 10 0 2 APPE70289249423 Male 10/12/82 19/07/16 C10125 C COM0005267 C 4.0 2250.0 B003 G Y S143 B 0.0 45000.0 4.0 NaN NaN 0 0 3 APPF80273865537 Male 30/01/89 09/07/16 C10477 C COM0004143 A 4.0 3500.0 B003 G Y S143 B 0.0 92000.0 5.0 NaN NaN 7 0 4 APPG60994436641 Male 19/04/85 20/07/16 C10002 A COM0001781 A 4.0 10000.0 B001 P Y S134 B 2500.0 50000.0 2.0 NaN NaN 10 0 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 69708 APPU90955789628 Female 31/07/83 30/09/16 C10006 A COM0000010 A 1.0 4900.0 B002 P N S122 G 0.0 NaN NaN NaN NaN 10 0 69709 APPV80989824738 Female 27/01/71 30/09/16 C10116 C COM0045789 A 4.0 7190.1 B002 P N S122 G 1450.0 NaN NaN NaN NaN 7 0 69710 APPW50697209842 Female 01/02/92 30/09/16 C10022 B COM0013284 C 4.0 1600.0 B030 P Y S122 G 0.0 24000.0 4.0 35.50 943.0 2 0 69711 APPY50870035036 Male 27/06/78 30/09/16 C10002 A COM0000098 C 3.0 9893.0 B002 P Y S122 G 1366.0 80000.0 5.0 NaN NaN 10 0 69712 APPZ60733046119 Male 31/12/89 30/09/16 C10003 A COM0000056 A 1.0 4230.0 NaN NaN Y S122 G 0.0 69000.0 4.0 13.99 1885.0 10 0 69713 rows × 22 columns Как можно заметить, данные необходимо предобработать перед обучением: создать новые признаки на основе старых: возраст вместо даты рождения, день в году вместо даты заявки на заём (только июль-сентябрь 2016) обработать nan: заменить nan на моды (категориальные признаки) и медианы (численные признаки) преобразовать категориальные признаки в числовые (случайный лес обучается на integer, float, boolean) Для удобства обработки обоих наборов данных создадим функцию предобработки: Nan нет, а что же с распределением классов? Создадим новый train датасет методом upsampling: возьмём все данные с классом 1 продублируем его rat раз присоединим к данным класса 0 продублированный класс 1 и перемещаем Посмотрим на новое распределение классов: Приступаем к обучению. Будем использовать случайный лес, а также его тюнинг (подбор наиболее качественных гиперпараметров) Значения метрик f1 получились достаточно высокие (90%+), что может говорить качественности модели классификации. Таким образом, работать с несбалансированными данными можно не только через гиперпараметры, но и методом upsampling. Он позволяет метрикам наименьшего класса от 0.0 достичь значений более 0.8 Полный код можно скачать здесь.