Несбалансированная классификация

I. Взвешивание классов.

В случае, если имеет место разное количество экземпляров классов, можно использовать взвешивание классов с помощью аргумента class_weight библиотеки sklearn.

Аргумент class_weight есть у решающего дерева, случайного леса, логистической регрессии.

class_weight='balanced'

model = LogisticRegression(random_state=5678, solver='liblinear', class_weight='balanced')

II. Увеличение выборки (upsampling) с помощью синтаксиса умножения списков:
name_x_n = name * n

pd.concat([name1 + name2 * n]) # чтобы размножить строки таблицы name2, нужно вместо n nодставить нужный множитель

Чтобы перемешать 

df1_upsampled, df2_upsampled = shuffle(df1_upsampled, df2_upsampled, random_state=56789)

 

III. Уменьшение выборки (downsampling).

Функция sample(). Возвращает выбранные случайным образом экземпляры (строки), в результате общее количество строк уменьшается.
Желаемое количество полученных таким образом строк указывают как долю от исходной таблицы с помощью аргумента frac:
 

df_sample = df.sample(frac=0.1, random_state=56789)

Если нужно сделать уменьшение для определенного класса выборки, то создают отдельные таблицы с помощью логической индексации и потом для одной применяют sample() и объединяют таблицы :
 
new_df_downsampled = pd.concat([feature_0.sample(frac=0.1, random_state=56789)] + [feature_1])