Мне нужно обучить линейный классификатор на моем ноутбуке с сотнями тысяч точек данных и около десяти тысяч функций. Какие у меня варианты? Каково современное состояние для такого рода проблем?
Кажется, что стохастический градиентный спуск является перспективным направлением, и я чувствую, что это состояние дел:
«Pegasos: первичный оцененный субградиентный раствор для SVM» Шай Шалев-Шварц, Йорам Сингер, Натан Сребро, Эндрю Коттер. «Математическое программирование, серия B, 127 (1): 3-30, год: 2007».
Это консенсус? Должен ли я смотреть в другом направлении?
classification
carlosdc
источник
источник
Ответы:
Я думаю, что вы должны смотреть на методы онлайн-обучения . Персептрон и персептрон ядро очень легко кода и работать очень хорошо на практике, и существует целый ряд других онлайновых методов. Обратите внимание, что любой метод онлайн-обучения может быть преобразован в алгоритм пакетного обучения, и в этом случае они очень похожи на методы стохастического градиентного спуска.
Если вы используете Matlab, есть действительно хороший набор инструментов под названием DOGMA от Francesco Orabona, который содержит ряд алгоритмов онлайн-обучения, и вы можете оценить несколько различных методов, используя это. Я использовал это в некоторых своих исследованиях и нашел, что это очень полезно (обратите внимание, что, насколько я помню, данные ожидаются как [функции x примеров], поэтому вам, возможно, придется их транспонировать).
Как уже упоминалось, вы можете попробовать уменьшить размерность. PCA может быть не очень хорошим вариантом, так как вам нужно вычислить ковариационную матрицу, которая будет очень дорогой. Вы можете попробовать посмотреть на случайные проекции . Теория жесткая, но принцип очень прост. Он основан на Джонсон-Линденштраус лемме , если вы заинтересованы, но основная идея заключается в том, что если вы случайно проецировать в нижнее пространство, то расстояние между точками сохраняются до некоторых е . Если вы используете ядро РФБ, то ℓ 2 расстояния все , что вы заинтересованы в!ℓ2 ϵ ℓ2
источник
Во-первых, я хотел бы спросить вас, как вы знаете, линейный классификатор является лучшим выбором? Интуитивно понятно, что для такого большого пространства (R ^ 10000) возможно, что какой-то другой нелинейный классификатор является лучшим выбором.
Я предлагаю вам попробовать несколько разных классификаторов и наблюдать ошибки предсказания (я бы попробовал несколько регуляризованных моделей классификации).
Если вам не хватает памяти, уменьшите размер с помощью PCA
источник
Вы также можете использовать PCA для уменьшения размеров без вычисления ковариационной матрицы - с помощью нейронного эквивалента Newtork PCA.
Вот документ, который описывает это (но я рекомендую сделать свой собственный поиск): http://users.ics.tkk.fi/oja/Oja1982.pdf , и вот ссылка на кое-что, что может работать с реализацией matlab: http : //www.cs.purdue.edu/homes/dgleich/projects/pca_neural_nets_website/index.html .
источник
Как предположил jb, я думаю, что лучше использовать метод «Уменьшение размеров». Принципиальный компонентный анализ (PCA) является популярным выбором. Также вы можете попробовать неконтролируемые методы обучения. Для получения дополнительной информации об обучении неконтролируемой функции можно найти по адресу http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial
источник