Поделите данные на тренировочную и тестовую выборки, сделайте стратификацию по целевому признаку. Затем подготовьте список строковых категорий для кодирования.
# импортируем нужные библиотеки и объявляем константы
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
RANDOM_STATE = 42
TEST_SIZE = 0.25
# считываем данные из CSV-файла в датафрейм и задаём id в качестве индексов
df = pd.read_csv('train_satisfaction.csv')
df = df.set_index('id')
# делим данные на входные и целевые
X = df.drop(['Удовлетворён предоставленной услугой'], axis=1)
y = df['Удовлетворён предоставленной услугой']
# Разделите данные на тренировочную и тестовую выборки:
# - используйте константы с размером тестовой выборки и random_state;
# - сделайте стратификацию по целевому признаку.
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=TEST_SIZE,
random_state=RANDOM_STATE,
stratify=y
)
# создайте список со строковыми категориями для кодирования
cols_ohe = X_train.select_dtypes(include=['object']).columns
# создаём экземпляр класса OneHotEncoder для кодирования
oh_encoder = OneHotEncoder(drop='first', sparse=False)
# обучаем OneHotEncoder на категориальных признаках из тренировочной выборки
oh_encoder.fit(X_train[cols_ohe])
# сохраняем в переменной encoder_col_names список названий новых столбцов
encoder_col_names = oh_encoder.get_feature_names()
# преобразовываем категориальные признаки в тренировочной и тестовой выборках
X_train[encoder_col_names] = oh_encoder.transform(X_train[cols_ohe])
X_test[encoder_col_names] = oh_encoder.transform(X_test[cols_ohe])
# удаляем преобразованные признаки
X_train = X_train.drop(cols_ohe, axis=1)
X_test = X_test.drop(cols_ohe, axis=1)
# выводим тренировочные данные
print(X_train.head())
Результат
Возраст Расстояние ... x3_плацкарт x3_св\
id ...
40366660 39 752 ... 1.0 0.0\
30521827 24 147 ... 1.0 0.0\
79417276 60 898 ... 0.0 0.0\
58392972 29 375 ... 0.0 0.0\
85633462 58 303 ... 0.0 0.0
[5 rows x 13 columns]