У меня есть набор данных около 5000 функций. Для этих данных я сначала использовал тест Chi Square для выбора функции; после этого я получил около 1500 переменных, которые показали связь значимости с переменной отклика.
Теперь мне нужно приспособить логистическую регрессию к этому. Я использую пакет glmulti для R (пакет glmulti обеспечивает эффективный выбор подмножества для vlm), но он может использовать только 30 функций одновременно, иначе его производительность снижается, так как число строк в моем наборе данных составляет около 20000.
Есть ли другой подход или методы для решения вышеуказанных проблем? Если я воспользуюсь описанным выше методом, это займет слишком много времени, чтобы соответствовать модели.
sklearn
s,LogisticRegression
и это решает проблему 4000 функций, 20000 строк примерно за минуту на моем ноутбуке.Ответы:
Нецелесообразно делать скрининг функций, а затем вводить уцелевшие функции в метод, который не понимает, сколько данных пытали ранее. Лучше использовать метод, который может обрабатывать все потенциальные особенности (например, эластичная сеть). Другие предложения об использовании сокращения данных также отличные идеи.
источник
Первый подход заключается в использовании PCA для уменьшения размерности набора данных. Постарайтесь сохранить ~ 97% от общей дисперсии, это может немного помочь.
Другой вариант - использовать что-то вроде стохастического градиентного спуска, это может быть гораздо более быстрый алгоритм и может поместиться в памяти R.
РЕДАКТИРОВАТЬ: Одна проблема с R в том, что вы можете использовать только вашу оперативную память, поэтому, если у вас есть только 8 ГБ памяти, то это то, что вы ограничены. Я столкнулся с множеством проблем, связанных с этим, и с тех пор перешел на использование Python Scikit-Learn, который, кажется, обрабатывает большие наборы данных намного лучше.
Очень хорошая диаграмма, которая дает некоторое представление о том, с чего начать в зависимости от размера набора данных, можно найти здесь: http://3.bp.blogspot.com/-dofu6J0sZ8o/UrctKb69QdI/AAAAAAAADfg/79ewPecn5XU/s1600/scikit-learn-flow -chart.jpg
источник
Как уже упоминал @Frank Harrell, использование эластичной сети или LASSO для выполнения регрессионной регрессии со всеми 5000 признаками ( p ) было бы хорошим началом для выбора признаков (нельзя просто удалить 3500 переменных, поскольку они не являются «статистически значимыми» с зависимая переменная интереса). Любой из этих методов может быть выполнено с использованием пакета R,
glmnet
.Чтобы учесть взаимосвязи между потенциальными интересующими переменными предиктора ( p = 5000), я бы порекомендовал запустить случайный лес с использованием
randomForest
пакета и / или повышение градиента с помощьюgbm
пакета, чтобы оценить относительную важность потенциальных переменных предиктора в отношении двоичного результата. С этой информацией вы будете гораздо более подготовлены к созданию более экономной модели логистической регрессии.источник
Я предполагаю, что вы не ограничены R, так как это большая проблема с данными, которой, вероятно, не должно быть. Вы можете попробовать MLlib , которая является масштабируемой библиотекой машинного обучения Apache Spark.
апаш Spark , в свою очередь, является быстрым и общим механизмом для крупномасштабной обработки данных в памяти. Они работают в среде Hadoop, которая позволяет распределенную обработку больших наборов данных по кластерам компьютеров с использованием простых моделей программирования. Он предназначен для масштабирования от отдельных серверов до тысяч машин, каждый из которых предлагает локальные вычисления и хранилище.
Обратите внимание, что «тысячи машин» необязательны (!), Вы также можете настроить их на своем локальном рабочем / домашнем рабочем столе.
Возвращаясь к MLlib, он поставляется с нижеприведенными алгоритмами из коробки:
Если вы регулярно работаете с большими данными, вам может потребоваться принять решение Hadoop.
источник
Вы можете попробовать Vowpal Wabbit: Vowpal Wabbit . Он хорошо работает с очень большими наборами данных и очень большим количеством функций.
по данным сайта:
источник