Найти тему
ЦифроПроф

Борьба с дисбалансом: увеличение выборки

Увеличение выборки предполагает увеличение количества меньших классов ещё до обучения модели: продублируем n (отношение количества преобладающего класс к интересующему) раз наименьший класс.

Задача 1

Мы разделили обучающую выборку на отрицательные и положительные объекты.

Объявите четыре переменные и запишите в них:

  • features_zeros — признаки объектов с ответом «0»;
  • features_ones — признаки объектов с ответом «1»;
  • target_zeros — целевой признак объектов, у которых ответы только «0»;
  • target_ones — целевой признак объектов, у которых ответы только «1».

Напечатайте на экране размеры таблиц, которые хранятся в четырёх переменных.

import pandas as pd
from sklearn.model_selection import train_test_split

data = pd.read_csv('/datasets/travel_insurance_preprocessed.csv')

target = data['Claim']
features = data.drop('Claim', axis=1)
features_train, features_valid, target_train, target_valid = train_test_split(
features, target, test_size=0.25, random_state=12345)

features_zeros=features_train[target_train==0]# < напишите код здесь >
features_ones=features_train[target_train==1]
target_zeros=target_train[target_train==0]
target_ones=target_train[target_train==1]
print(features_zeros.shape)
print(features_ones.shape)
print(target_zeros.shape)
print(target_ones.shape)

Задача 2

Продублируйте объекты положительного класса и объедините их с объектами отрицательного класса. Чтобы соединить таблицы, воспользуйтесь функцией pd.concat() (от англ. concatenate, «сцепить»). Поработайте с документацией.

Мы объединили таблицы с признаками и сохранили результат в переменной features_upsampled (признаки, преобразованные техникой upsampling). Сделайте то же самое для целевого признака и объявите переменную target_upsampled (целевой признак, преобразованный техникой upsampling).

Количество повторений уже сохранено в переменной repeat.

import pandas as pd
from sklearn.model_selection import train_test_split

data = pd.read_csv('/datasets/travel_insurance_preprocessed.csv')

target = data['Claim']
features = data.drop('Claim', axis=1)
features_train, features_valid, target_train, target_valid = train_test_split(
features, target, test_size=0.25, random_state=12345)

features_zeros = features_train[target_train == 0]
features_ones = features_train[target_train == 1]
target_zeros = target_train[target_train == 0]
target_ones = target_train[target_train == 1]

repeat = 10
features_upsampled = pd.concat([features_zeros] + [features_ones] * repeat)
target_upsampled = pd.concat([target_zeros]+[target_ones]*repeat)

print(features_upsampled.shape)
print(target_upsampled.shape)

Задача 3

Перемешайте данные. Импортируйте функцию shuffle() (англ. «перетасовать») из модуля sklearn.utils (от англ. «утилиты»).

Создайте функцию upsample() с тремя параметрами:

  • features — признаки,
  • target — целевой признак,
  • repeat — количество повторений.

Функция вернёт признаки и целевой признак после операции upsampling.

Вызовите функцию для обучающих данных. Если всё будет верно, размеры преобразованных выборок появятся на экране.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle

data = pd.read_csv('/datasets/travel_insurance_preprocessed.csv')

target = data['Claim']
features = data.drop('Claim', axis=1)
features_train, features_valid, target_train, target_valid = train_test_split(
features, target, test_size=0.25, random_state=12345)

def upsample(features, target, repeat):
features_zeros = features_train[target_train == 0]
features_ones = features_train[target_train == 1]
target_zeros = target_train[target_train == 0]
target_ones = target_train[target_train == 1]
repeat = 10

features_upsampled = pd.concat([features_zeros] + [features_ones] * repeat)
target_upsampled = pd.concat([target_zeros] + [target_ones] * repeat)
features_upsampled, target_upsampled = shuffle(
features_upsampled, target_upsampled, random_state=12345)
return features_upsampled, target_upsampled

features_upsampled, target_upsampled = upsample(features_train, target_train, 10)

print(features_upsampled.shape)
print(target_upsampled.shape)

Задача 4

Обучите на новых данных модель LogisticRegression. Найдите для неё значение F1-меры.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score

data = pd.read_csv('/datasets/travel_insurance_preprocessed.csv')

target = data['Claim']
features = data.drop('Claim', axis=1)
features_train, features_valid, target_train, target_valid = train_test_split(
features, target, test_size=0.25, random_state=12345)

def upsample(features, target, repeat):
features_zeros = features[target == 0]
features_ones = features[target == 1]
target_zeros = target[target == 0]
target_ones = target[target == 1]

features_upsampled = pd.concat([features_zeros] + [features_ones] * repeat)
target_upsampled = pd.concat([target_zeros] + [target_ones] * repeat)

features_upsampled, target_upsampled = shuffle(
features_upsampled, target_upsampled, random_state=12345)

return features_upsampled, target_upsampled

features_upsampled, target_upsampled = upsample(features_train, target_train, 10)

model=LogisticRegression(random_state=12345, solver='liblinear')
model.fit(features_upsampled, target_upsampled)
predicted_valid=model.predict(features_valid)

print("F1:", f1_score(target_valid, predicted_valid))

Фото автора
Фото автора