Вопрос или проблема
Я работаю над задачей предсказания дохода, который может сгенерировать фильм. Некоторые из доступных характеристик в наборе данных – это 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 ГБ ОЗУ. Давайте рассмотрим детали проблемы и возможные решения.
Анализ проблемы
-
Размерность массива: Вы отметили, что у вас 3000 строк и 1835 столбцов, однако сообщение об ошибке указывает на 1686366 столбцов. Это может быть связано с применением метода
PolynomialFeatures(degree=2)
, который генерирует новые признаки, поднимая самые разные комбинации исходных признаков до второго порядка. Если мы посмотрим на формулу, то количество сгенерированных признаков может значительно возрастать при увеличении степени, особенно если у вас много исходных признаков. -
Необходимость в использовании float64: В вашем случае, вы используете тип данных
float64
, который потребляет больше памяти. Проверьте, действительно ли вам нужна такая высокая точность. Для многих задач машинного обучения использованиеfloat32
может быть более чем достаточным и существенно сократит затраты памяти.
Решения для устранения нехватки памяти
-
Сокращение числа признаков:
- Избегайте избыточной генерации признаков: Вместо использования полиномиальных признаков до второго порядка, рассмотрите возможность применения более низкой степени или использования методов отбора признаков (например, регуляризация).
- Отбор признаков: Используйте методы, такие как Lasso или другие регуляризованные алгоритмы, чтобы уменьшить количество признаков до действительно значимых. Это поможет избежать создания слишком больших массивов.
-
Использование минимально необходимой точности:
- Попробуйте использовать
float32
вместоfloat64
. Это может помочь существенно сэкономить память.
- Попробуйте использовать
-
Оптимизация данных:
- Проверьте наличие пропусков в данных. Применяйте методы заполнения пропусков или удаления ненужных записей/столбцов, чтобы уменьшить общий объем данных.
- Используйте метод PCA (анализ главных компонент) более эффективно, поэкспериментируйте с процентом объясненной дисперсии, чтобы получить меньшее количество значимых компонент.
-
Параллельное вычисление:
- Проверьте, что при использовании
n_jobs=4
в методеcross_val_score
, вы не перегружаете память. Возможно, стоит снизить уровень параллелизации, чтобы уменьшить нагрузку на оперативную память.
- Проверьте, что при использовании
-
Использование специализированных библиотек:
- Рассмотрите возможность использования библиотек для интеллектуальной обработки данных, таких как Dask или CuPy, которые умеют работать с данными, превышающими размеры оперативной памяти вашего компьютера, путем их распределенной обработки.
Заключение
Проблема нехватки памяти при выполнении полиномиальной регрессии может быть решена несколькими способами, включая уменьшение размерности данных, оптимизацию типов данных и применение методов отбора признаков. Ваши данные требуют тщательной обработки и анализа, чтобы избежать затратных вычислений и излишней памяти. Удачи в ваших дальнейших экспериментах с моделью прогнозирования и анализом данных!