Ядро завершается или процесс зависает при выполнении предсказания LR на датафрейме с использованием apply.

Вопрос или проблема

Я пытаюсь сделать предсказания с помощью простой модели.

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 значений и обработайте их.
  • Убедитесь, что типы данных соответствуют (например, если вы передаете категориальные переменные, они должны быть закодированы так же, как и в обучающем наборе).

Заключение

Вам следует провести оптимизацию вашего кода, чтобы избежать проблем с замедлением и повреждением ядра. Использование векторизации, корректное применение модели на новых наблюдениях и оптимизация форматирования данных поможет вам существенно улучшить производительность и избежать ошибок.

Если проблема продолжает сохраняться и ядро по-прежнему умирает, возможно, стоит рассмотреть уменьшение размера данных или использование более мощного оборудования, так как в некоторых случаях это может быть связано с ограничениями по памяти.

Оцените материал
Добавить комментарий

Капча загружается...