Увеличение выборки предполагает увеличение количества меньших классов ещё до обучения модели: продублируем 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))