Вопрос или проблема
Я попытался использовать алгоритм OMP, доступный в scikit-learn. Мой размер данных, который включает как целевой сигнал, так и словарь, составляет примерно 1 Гб. Однако, когда я запустил код, он завершился с ошибкой памяти. У машины 16 Гб ОЗУ, поэтому я не думаю, что это должно было произойти. Я попробовал добавить немного логирования, чтобы выяснить, откуда возникла ошибка, и обнаружил, что данные полностью загрузились в массивы numpy. И именно алгоритм вызвал ошибку. Может кто-то помочь с этим или предложить более эффективный по памяти алгоритм для выбора признаков, или является ли подвыборка данных моим единственным вариантом. Есть ли какие-то детерминированные хорошие техники подвыборки.
ИЗМЕНЕНИЕ:
Соответствующий фрагмент кода:
n=8;
y=mydata[:,0];
X=mydata[:,[1,2,3,4,5,6,7,8]];
#print y;
#print X;
print "здесь";
omp = OrthogonalMatchingPursuit(n_nonzero_coefs=5,copy_X = False, normalize=True);
omp.fit(X,y);
coef = omp.coef_;
print omp.coef_;
idx_r, = coef.nonzero();
for id in idx_r:
print coef[id], vars[id],"\n";
Ошибка, которую я получаю:
File "/usr/local/lib/python2.7/dist-packages/sklearn/base.py", line 324, in score
return r2_score(y, self.predict(X), sample_weight=sample_weight)
File "/usr/local/lib/python2.7/dist-packages/sklearn/metrics/metrics.py", line 2332, in r2_score
numerator = (weight * (y_true - y_pred) ** 2).sum(dtype=np.float64)
MemoryError
Один из вариантов – установить precompute в True
, что предварительно вычислит матрицы Грама и Xy. Это будет выглядеть так:
from sklearn.linear_model import OrthogonalMatchingPursuit
omp = OrthogonalMatchingPursuit(precompute=True, n_nonzero_coefs=5,copy_X = False, normalize=True)
Также обновление до Python 3 может помочь с проблемами памяти.
Ответ или решение
Проблема с ошибкой памяти (MemoryError), которую вы испытываете при использовании алгоритма OrthogonalMatchingPursuit (OMP) из библиотеки scikit-learn, может быть вызвана тем, что в процессе работы алгоритм использует больше памяти, чем доступно на вашем компьютере. Ваши данные, хотя и занимают 1 ГБ, могут потребовать значительно больше памяти в процессе вычислений, особенно если создаются дополнительные массивы для хранения результатов пересчетов.
Вот несколько рекомендаций по решению этой проблемы:
-
Использование параметра
precompute
: Как уже упоминалось, вы можете установить параметрprecompute
в значениеTrue
. Это позволит предварительно вычислить матрицы Грама и Xy, что может снизить потребление памяти в дальнейшем. Ваш код будет выглядеть следующим образом:from sklearn.linear_model import OrthogonalMatchingPursuit omp = OrthogonalMatchingPursuit(precompute=True, n_nonzero_coefs=5, copy_X=False, normalize=True) omp.fit(X, y) coef = omp.coef_
-
Оптимизация параметра
copy_X
: Установкаcopy_X=False
уже правильна, так как это позволит избежать копирования массиваX
в память, если он уже представлен в нужном формате. -
Обновление до Python 3: Если вы работаете под Python 2.7, considera обновить свою версию Python до 3.x. Python 3 может иметь лучшие оптимизации и управление памятью, что поможет более эффективно работать с большими массивами данных.
-
Уменьшение размерности данных: Если позволите, попробуйте уменьшить размерность ваших данных с помощью методов, таких как PCA (метод главных компонент) или другие техники отбора признаков (feature selection). Это может существенно снизить требуемый объем памяти при обработке.
-
Подвыборка данных: Если ваш алгоритм все еще вызывает проблемы с памятью, можно рассмотреть программную подвыборку (subsampling) данных. Однако при этом важно убедиться, что выборка является репрезентативной для всей совокупности данных. Некоторые детерминистические методы подвыборки:
- Случайная подвыборка (Random sampling): случайный выбор определённого процента или числа экземпляров из ваших данных.
- Стратифицированная подвыборка (Stratified sampling): используется, чтобы гарантировать, что различные классы (или категории) представлены в выборке пропорционально.
-
Параметры алгоритма: Следует рассмотреть изменения в параметрах OMP. Например, уменьшение значения
n_nonzero_coefs
может также помочь, так как уменьшение количества коэффициентов, которые вы хотите получить, приведёт к уменьшению вычислительных ресурсов.
Надеюсь, эти рекомендации помогут вам справиться с возникшей проблемой и эффективно использовать алгоритм OMP в ваших анализах. Если проблема сохранится, рассмотрите возможность использования распределённых вычислений или более мощных систем для обработки больших объёмов данных.