Ошибка низкой памяти при выполнении регрессии полинома второй степени на массиве размером (3000*1835)

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

Я работаю над задачей предсказания дохода, который может сгенерировать фильм. Некоторые из доступных характеристик в наборе данных – это json-коллекция для команды, актеров, которые работали над фильмом. Я применил onehotencoding к этим столбцам.
В результате у меня получился массив размером (3000*1835). Это тоже я получил после извлечения только данных о режиссере из столбца ‘Crew’ и применения PCA с удержанием 60% дисперсии.
Но, когда я применяю полиномиальную регрессию, я получаю нижеупомянутую ошибку:

$\lib\site-packages\sklearn\model_selection_validation.py:532:
FitFailedWarning: Обучение оценщика не удалось. Результат на этом разбиении
обучения-тестирования для этих параметров будет установлен в nan. Подробности:
MemoryError: Не удалось выделить 30.2 GiB для массива с формой
(2400, 1686366) и типом данных float64

Я использую код, показанный ниже, для полиномиальной регрессии:

polyFeature = PolynomialFeatures(degree=2)
linearRegression = LinearRegression()
pipeline = Pipeline([('polyFeature',polyFeature),('linearRegression',linearRegression)])
score = cross_val_score(pipeline,XTrain,YTrain,n_jobs=4,cv=5)

Я использую систему с 6 ядрами, 32 ГБ ОЗУ.

Вы выделяете массив float64 (2400, 1686366) (очень большой!), не удивительно, что вы получаете ошибку по памяти.
Вы говорите, что у вас 1835 столбцов, но сообщение об ошибке говорит 1686366, так каков правильный номер столбцов? Если это 1835, то есть ошибка перед подачей вашего набора в модель.

Также вы уверены, что вам нужен тип данных float64? Вы можете снизить потребление памяти, используя float32 вместо float64 (если вам действительно не нужна такая точность)

Ответ или решение

Проблема с нехваткой памяти при выполнении полиномиальной регрессии

Вы столкнулись с серьезной проблемой нехватки памяти во время выполнения полиномиальной регрессии на массиве размером (3000, 1835). Сообщение об ошибке указывает на то, что вы пытаетесь выделить 30.2 ГБ памяти для массива с формой (2400, 1686366), что явно превышает возможности вашей системы с 32 ГБ ОЗУ. Давайте рассмотрим детали проблемы и возможные решения.

Анализ проблемы

  1. Размерность массива: Вы отметили, что у вас 3000 строк и 1835 столбцов, однако сообщение об ошибке указывает на 1686366 столбцов. Это может быть связано с применением метода PolynomialFeatures(degree=2), который генерирует новые признаки, поднимая самые разные комбинации исходных признаков до второго порядка. Если мы посмотрим на формулу, то количество сгенерированных признаков может значительно возрастать при увеличении степени, особенно если у вас много исходных признаков.

  2. Необходимость в использовании float64: В вашем случае, вы используете тип данных float64, который потребляет больше памяти. Проверьте, действительно ли вам нужна такая высокая точность. Для многих задач машинного обучения использование float32 может быть более чем достаточным и существенно сократит затраты памяти.

Решения для устранения нехватки памяти

  1. Сокращение числа признаков:

    • Избегайте избыточной генерации признаков: Вместо использования полиномиальных признаков до второго порядка, рассмотрите возможность применения более низкой степени или использования методов отбора признаков (например, регуляризация).
    • Отбор признаков: Используйте методы, такие как Lasso или другие регуляризованные алгоритмы, чтобы уменьшить количество признаков до действительно значимых. Это поможет избежать создания слишком больших массивов.
  2. Использование минимально необходимой точности:

    • Попробуйте использовать float32 вместо float64. Это может помочь существенно сэкономить память.
  3. Оптимизация данных:

    • Проверьте наличие пропусков в данных. Применяйте методы заполнения пропусков или удаления ненужных записей/столбцов, чтобы уменьшить общий объем данных.
    • Используйте метод PCA (анализ главных компонент) более эффективно, поэкспериментируйте с процентом объясненной дисперсии, чтобы получить меньшее количество значимых компонент.
  4. Параллельное вычисление:

    • Проверьте, что при использовании n_jobs=4 в методе cross_val_score, вы не перегружаете память. Возможно, стоит снизить уровень параллелизации, чтобы уменьшить нагрузку на оперативную память.
  5. Использование специализированных библиотек:

    • Рассмотрите возможность использования библиотек для интеллектуальной обработки данных, таких как Dask или CuPy, которые умеют работать с данными, превышающими размеры оперативной памяти вашего компьютера, путем их распределенной обработки.

Заключение

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

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

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