LogisticRegression: fit, predict и classes_
Содержание курса
clf.predict: дискретные метки и требования к схеме X_new
После обучения получаем предсказания:
y_pred = clf.predict(X_test)
print(y_pred) # например: array([0, 1, 0, 1])
y_pred — NumPy-массив целых чисел длиной, равной числу строк X_test. При 20 строках и test_size=0.2 в X_test окажется четыре объекта, поэтому и y_pred содержит четыре элемента. Каждый из них — одна из меток из classes_: либо 0, либо 1. Никаких дробей, никакого «0.73». Это жёсткое решение: модель уже выбрала класс за вас.
Типичная ошибка. Иногда после predict пишут что-то вроде y_pred > 0.5, чтобы «применить порог». Это бессмысленно: элементы y_pred уже равны 0 или 1, порог встроен в логику predict. Если нужна вероятность, чтобы двигать порог самостоятельно, это делается через predict_proba — тема следующего урока.
Теперь о схеме столбцов. Когда вы передаёте в predict не X_test, а данные о новой поставке, важно помнить: X_train — это уже преобразованный NumPy-массив с dummy-столбцами для warehouse_zone, а не исходный DataFrame с сырым признаком. Поэтому новую строку нужно пропустить через тот же обученный preprocessor, прежде чем передавать её в clf.predict.
Правильный способ:
import pandas as pd
# Новая строка в сыром виде — те же столбцы, что в X_train_raw.
X_new_raw = pd.DataFrame({
'distance_km': [80.0],
'weight_kg': [3.5],
'warehouse_zone': [2]
})
# Применяем обученный preprocessor — он создаёт те же dummy-столбцы,
# что и при fit. Используем transform, а не fit_transform.
X_new = preprocessor.transform(X_new_raw)
print(clf.predict(X_new)) # например: array([0])
preprocessor.transform (а не fit_transform) применяет схему, зафиксированную при обучении: те же категории warehouse_zone, тот же порядок выходных столбцов. Переобучать preprocessor на новой строке нельзя — fit_transform пересмотрит схему по одной строке и разрушит соответствие с тем, что видел классификатор. Если в X_new_raw передать неизвестное значение warehouse_zone, handle_unknown='ignore' не вызовет ошибку, но прогноз останется ненадёжным: такого вектора модель при обучении не видела.
