Вопрос или проблема
Я пытаюсь сделать предсказания с помощью простой модели.
model=LogisticRegression()
model.fit(X_train,y_train)
После подгонки я пытаюсь сделать предсказания. Пример значения X_test и код ниже.
X_train[41626]
array([-0.53668182, 0.57287544, -1.48834257, -0.6080626 , -0.86691148,
0.24336571, 0. , 0.53303864, -0.05081621, 0.17409271,
-0.21513622, -1.15424615, 0.74731522, 1.47161341])
Модель подгоняется за 5 секунд. После выполнения кода ниже, когда доходит до %5 или %6, она останавливается надолго (последняя точка остановки была 39938/326232). Иногда ядро умирает, иногда просто останавливается. Остановка происходит на случайной строке, кстати.
test['Predicted'] = test.progress_apply(lambda x: model.predict(X_train) ,axis=1)
Я обновил все библиотеки Python и пробовал этот код как на Windows, так и на Mac M1. Результат одинаковый.
В чем проблема? Я не могу разобраться.
Попробуйте это:
test['Predicted'] = test.apply(lambda x: model.predict(x.values.reshape(-1, len(test.columns))), axis=1)
Ответ или решение
К сожалению, возникает проблема, когда вы используете метод apply
для предсказания значений на большом наборе данных с помощью вашей модели логистической регрессии. При этом возникают несколько возможных причин, содержащиеся в вашем описании проблемы. Давайте рассмотрим это более подробно.
1. Проблемы с производительностью и ресурсами
При применении метода apply
к большому DataFrame, как в случае вашего кода, происходит итерация по каждой строке, что может негативно сказаться на производительности. Метод progress_apply()
из библиотеки tqdm
также не решает основные проблемы, и в результате вы сталкиваетесь с ситуацией, когда выполнение останавливается, а, иногда, даже ядро (Kernel) умирает.
Рекомендации:
- Векторизация: Вместо использования
apply
, попробуйте использовать векторизированные операции. Это намного быстрее для моделей логистической регрессии, так как они могут обрабатывать массивы данных непосредственно, без необходимости выполнять операции по строкам. - Пакетная обработка: Если полностью векторизовать код не представляется возможным, рассмотрите возможность пакетной обработки. Разделите ваш DataFrame на более мелкие части и делайте предсказания для каждой части. Например, используйте
numpy
для разделения массива на более мелкие кусочки.
2. Неправильная передача данных в model.predict()
Ваша текущая реализация lambda
пытается передавать всю X_train
вместо отдельных строк для предсказания:
test['Predicted'] = test.progress_apply(lambda x: model.predict(X_train), axis=1)
Здесь model.predict()
должен принимать только одну строку, представляющую наблюдение, а не весь обучающий набор данных (X_train
). Это может приводить к увеличению нагрузки на память и возникновению ошибок.
Правильный подход:
Обратите внимание, что передавать метод predict
следует именно текущую строку из test
, а не X_train
. Вот как это можно сделать:
import pandas as pd
# Пример задания X_test на основе тестовых данных
# Убедитесь, что X_test имеет тот же формат, что был использован в X_train
test['Predicted'] = test.apply(lambda x: model.predict(x.values.reshape(1, -1)), axis=1)
3. Оптимизация данных
Также важно убедиться, что структура и типы данных в test
соответствуют тем, что были использованы при обучении модели. Неправильные типы данных или пропуски могут привести к проблемам с производительностью или даже сбоям.
Проверка:
- Проверьте на наличие
NaN
значений и обработайте их. - Убедитесь, что типы данных соответствуют (например, если вы передаете категориальные переменные, они должны быть закодированы так же, как и в обучающем наборе).
Заключение
Вам следует провести оптимизацию вашего кода, чтобы избежать проблем с замедлением и повреждением ядра. Использование векторизации, корректное применение модели на новых наблюдениях и оптимизация форматирования данных поможет вам существенно улучшить производительность и избежать ошибок.
Если проблема продолжает сохраняться и ядро по-прежнему умирает, возможно, стоит рассмотреть уменьшение размера данных или использование более мощного оборудования, так как в некоторых случаях это может быть связано с ограничениями по памяти.