У меня есть большой набор данных (около 8 ГБ). Я хотел бы использовать машинное обучение для его анализа. Итак, я думаю, что я должен использовать SVD, а затем PCA, чтобы уменьшить размерность данных для эффективности. Однако MATLAB и Octave не могут загрузить такой большой набор данных.
Какие инструменты я могу использовать для SVD с таким большим объемом данных?
Ответы:
Прежде всего, уменьшение размерности используется, когда у вас много коваризованных измерений и вы хотите уменьшить размер проблемы, поворачивая точки данных в новую ортогональную основу и выбирая только оси с наибольшей дисперсией. С 8 переменными (столбцами) ваше пространство уже является низкоразмерным, дальнейшее уменьшение количества переменных вряд ли решит технические проблемы с объемом памяти, но может сильно повлиять на качество набора данных. В вашем конкретном случае более перспективно взглянуть на онлайн-обучениеметоды. Грубо говоря, вместо того, чтобы работать со всем набором данных, эти методы берут небольшую их часть (часто называемую «мини-пакетами») за раз и строят модель постепенно. (Лично мне нравится интерпретировать слово «онлайн» как ссылку на какой-то бесконечно длинный источник данных из Интернета, такой как канал Twitter, где вы просто не можете загрузить весь набор данных одновременно).
Но что, если вы действительно хотите применить технику уменьшения размерности, такую как PCA, к набору данных, который не помещается в память? Обычно набор данных представляется в виде матрицы данных X размером n x m , где n - количество наблюдений (строк), а m - количество переменных (столбцов). Обычно проблемы с памятью происходят только от одного из этих двух чисел.
Слишком много наблюдений (n >> m)
Если у вас слишком много наблюдений , но число переменных от маленького до среднего, вы можете строить ковариационную матрицу постепенно . Действительно, типичный PCA состоит из построения ковариационной матрицы размером m x m и применения к ней разложения по сингулярному значению. При m = 1000 переменных типа float64 ковариационная матрица имеет размер 1000 * 1000 * 8 ~ 8 Мб, которая легко помещается в память и может использоваться с SVD. Таким образом, вам нужно только построить ковариационную матрицу, не загружая весь набор данных в память - довольно трудоемкая задача .
Кроме того, вы можете выбрать небольшую репрезентативную выборку из вашего набора данных и приблизить ковариационную матрицу . Эта матрица будет иметь все те же свойства, что и обычные, только чуть менее точная.
Слишком много переменных (n << m)
С другой стороны, иногда, когда у вас слишком много переменных , сама ковариационная матрица не помещается в память. Например, если вы работаете с изображениями 640x480, каждое наблюдение имеет 640 * 480 = 307200 переменных, что приводит к ковариационной матрице 703 ГБ! Это определенно не то, что вы хотели бы сохранить в памяти вашего компьютера или даже в памяти вашего кластера. Таким образом, нам нужно уменьшить размеры без построения ковариационной матрицы.
Мой любимый метод для этого - случайная проекция . Короче говоря, если у вас есть набор данных X размером n x m , вы можете умножить его на некоторую разреженную случайную матрицу R размером m x k (с k << m ) и получить новую матрицу X ' гораздо меньшего размера n x k с примерно теми же свойствами, что и оригинал. Почему это работает? Ну, вы должны знать, что PCA стремится найти набор ортогональных осей (главных компонентов) и спроецировать ваши данные на первые kих. Оказывается, что разреженные случайные векторы являются почти ортогональными и, таким образом, также могут использоваться в качестве нового базиса.
И, конечно же, вам не нужно умножать весь набор данных X на R - вы можете перевести каждое наблюдение x в новый базис отдельно или в виде мини-пакетов.
Есть также несколько похожий алгоритм, который называется Random SVD . У меня нет никакого реального опыта с этим, но вы можете найти пример кода с объяснениями здесь .
В итоге, вот краткий контрольный список для уменьшения размерности больших наборов данных:
источник
Не беспокойся
Первое правило программирования, которое также применимо к науке о данных: заставьте все работать над небольшой проблемой теста.
поэтому возьмите случайную выборку ваших данных, скажем, 100 000 строк. попробуйте разные алгоритмы и т. д. Как только вы получите все, что работает, чтобы вы остались довольны, вы можете попробовать большие (и большие) наборы данных - и посмотреть, как уменьшается ошибка теста по мере добавления новых данных.
Более того, вы не хотите применять SVD только к 8 столбцам: вы применяете его, когда у вас много столбцов.
источник
PCA обычно реализуется путем вычисления SVD на ковариационной матрице.
Вычисление ковариационной матрицы является смущающей параллельной задачей, поэтому она масштабируется линейно с количеством записей и тривиально для распределения на нескольких машинах!
Просто сделайте один проход по вашим данным, чтобы вычислить средства. Затем второй проход для вычисления ковариационной матрицы. Это можно сделать с помощью map-Reduction легко - по сути, это то же самое, что снова вычислить средства. Условия суммирования, как в ковариации, тривиальны для распараллеливания! Вам может понадобиться обратить внимание только на цифры при суммировании многих значений одинаковой величины.
Все становится иначе, когда у вас есть огромное количество переменных . Но в системе 8 ГБ вы должны иметь возможность запускать PCA в памяти до 20 000 измерений с библиотеками BLAS. Но тогда вы можете столкнуться с проблемой, что PCA уже не так уж надежен, потому что у него слишком много степеней свободы. Другими словами: это легко перезаряжается. Я видел рекомендацию иметь как минимум 10 * d * d записей (или это было d ^ 3). Таким образом, для 10000 измерений у вас должно быть как минимум миллиард записей (из 10000 измерений ... это много!), Чтобы результат был статистически достоверным.
источник
Хотя вы, вероятно, можете найти некоторые инструменты, которые позволят вам сделать это на одной машине, вы попадаете в диапазон, где имеет смысл рассмотреть инструменты «больших данных», такие как Spark, особенно если вы думаете, что ваш набор данных может расти. В Spark есть компонент MLlib, который поддерживает PCA и SVD. В документации есть примеры .
источник
Мы внедрили SVD в больший набор данных, используя PySpark. Мы также сравнили согласованность разных пакетов. Вот ссылка.
источник
Я бы порекомендовал Python, если вы будете лениво оценивать файл, у вас будет минимальный объем памяти, а numpy / scipy предоставит вам доступ ко всем инструментам Octave / Matlab.
источник