Логистическая регрессия на больших данных


9

У меня есть набор данных около 5000 функций. Для этих данных я сначала использовал тест Chi Square для выбора функции; после этого я получил около 1500 переменных, которые показали связь значимости с переменной отклика.

Теперь мне нужно приспособить логистическую регрессию к этому. Я использую пакет glmulti для R (пакет glmulti обеспечивает эффективный выбор подмножества для vlm), но он может использовать только 30 функций одновременно, иначе его производительность снижается, так как число строк в моем наборе данных составляет около 20000.

Есть ли другой подход или методы для решения вышеуказанных проблем? Если я воспользуюсь описанным выше методом, это займет слишком много времени, чтобы соответствовать модели.


8
Если вы можете поместить свой набор данных в память одного компьютера, я бы не назвал это проблемой «больших данных», особенно если вы сделаете это в заголовке вашего вопроса
logc

Я использую sklearns, LogisticRegressionи это решает проблему 4000 функций, 20000 строк примерно за минуту на моем ноутбуке.
Томас Але

Ответы:


13

Нецелесообразно делать скрининг функций, а затем вводить уцелевшие функции в метод, который не понимает, сколько данных пытали ранее. Лучше использовать метод, который может обрабатывать все потенциальные особенности (например, эластичная сеть). Другие предложения об использовании сокращения данных также отличные идеи.


Есть ли доказательства для этого? Это кажется таким же эвристическим, как и скрининг функций.
Зубин

2
Оценка максимального правдоподобия с учетом штрафа учитывает контекст, например, в последнем случае оценка коэффициента регрессии переменной будет меньше, если вы рассмотрели 1000 невыбранных переменных, чем если бы вы рассмотрели 100 невыбранных переменных. В противном случае переменные выбираются смещенным образом, и повторная установка переменной на втором этапе теряет контекст.
Фрэнк Харрелл

Не могли бы вы уточнить, что вы подразумеваете под предвзятым здесь? Мне интересно, потому что в тривиальном смысле лассо всегда смещено, поэтому вы должны обратиться к дополнительному смещению. Кроме того, есть несколько двухэтапных подходов с приемлемыми свойствами, например, pdfs.semanticscholar.org/d90a/…
jmb

2
В лассо намеренно смещает коэффициенты приближаются к нулю , чтобы предотвратить переобучения. Непенализованные параметры приводят к предсказанным значениям, которые являются слишком экстремальными Подгонка «выбранных» переменных в непенализованной модели отменит необходимые лассо- смещения, создавая значительное переопределение прогнозируемых значений.
Фрэнк Харрелл

10

Первый подход заключается в использовании PCA для уменьшения размерности набора данных. Постарайтесь сохранить ~ 97% от общей дисперсии, это может немного помочь.

Другой вариант - использовать что-то вроде стохастического градиентного спуска, это может быть гораздо более быстрый алгоритм и может поместиться в памяти R.

РЕДАКТИРОВАТЬ: Одна проблема с R в том, что вы можете использовать только вашу оперативную память, поэтому, если у вас есть только 8 ГБ памяти, то это то, что вы ограничены. Я столкнулся с множеством проблем, связанных с этим, и с тех пор перешел на использование Python Scikit-Learn, который, кажется, обрабатывает большие наборы данных намного лучше.

Очень хорошая диаграмма, которая дает некоторое представление о том, с чего начать в зависимости от размера набора данных, можно найти здесь: http://3.bp.blogspot.com/-dofu6J0sZ8o/UrctKb69QdI/AAAAAAAADfg/79ewPecn5XU/s1600/scikit-learn-flow -chart.jpg

введите описание изображения здесь


8
Большая проблема с использованием PCA таким способом состоит в том, что все отношения между переменной отклика и независимыми переменными могут находиться в 3% от общей дисперсии, которой вы пренебрегаете. Похоже, не существует какого-либо общего способа определить, сколько основных компонентов использовать, потому что самый маленький компонент может быть пропорционален самому ответу и, таким образом, будет представлять собой оптимальный выбор переменных для включения.
whuber

1
Я думаю, что действительно, если вы можете загрузить набор данных в основную память (что, я полагаю, имеет место с учетом того, что вы объясняете), стохастический градиентный спуск - это первый шаг, который вы должны сделать, прежде чем пытаться использовать методы уменьшения размерности. С Scikit-Learn на Python (или R, но я не пользователь этого языка), это будет работать просто отлично.
Бертран Р.

Я думаю, что это полезный ответ, но я думаю, что ОП задает вопрос о логистической регрессии, а не о сокращении возможностей. Может быть, вы можете обратиться к этой части вопроса в издании?
журнал

Я не уверен, насколько полезен PCA для проблем регрессии. Проблема заключается в следующем: PCA сохраняет наибольшие единичные значения входной матрицы, но псевдообратная матрица инвертирует сингулярные значения, поэтому вы действительно хотите оставить наименьшее из исходных значений. Может быть, лучше просто набросать данные: arxiv.org/abs/1411.4357
Томас Ахле

4

Как уже упоминал @Frank Harrell, использование эластичной сети или LASSO для выполнения регрессионной регрессии со всеми 5000 признаками ( p ) было бы хорошим началом для выбора признаков (нельзя просто удалить 3500 переменных, поскольку они не являются «статистически значимыми» с зависимая переменная интереса). Любой из этих методов может быть выполнено с использованием пакета R, glmnet.

Чтобы учесть взаимосвязи между потенциальными интересующими переменными предиктора ( p = 5000), я бы порекомендовал запустить случайный лес с использованием randomForestпакета и / или повышение градиента с помощью gbmпакета, чтобы оценить относительную важность потенциальных переменных предиктора в отношении двоичного результата. С этой информацией вы будете гораздо более подготовлены к созданию более экономной модели логистической регрессии.


3
Y

1

Я предполагаю, что вы не ограничены R, так как это большая проблема с данными, которой, вероятно, не должно быть. Вы можете попробовать MLlib , которая является масштабируемой библиотекой машинного обучения Apache Spark.

апаш Spark , в свою очередь, является быстрым и общим механизмом для крупномасштабной обработки данных в памяти. Они работают в среде Hadoop, которая позволяет распределенную обработку больших наборов данных по кластерам компьютеров с использованием простых моделей программирования. Он предназначен для масштабирования от отдельных серверов до тысяч машин, каждый из которых предлагает локальные вычисления и хранилище.

Обратите внимание, что «тысячи машин» необязательны (!), Вы также можете настроить их на своем локальном рабочем / домашнем рабочем столе.

Возвращаясь к MLlib, он поставляется с нижеприведенными алгоритмами из коробки:

  • K-средних кластеров с K-средних || инициализация.
  • L1- и L2-регуляризованная линейная регрессия.
  • L1- и L2-регуляризованная логистическая регрессия.
  • Совместная фильтрация по методу наименьших квадратов с явными оценками или неявной обратной связью.
  • Наивная байесовская полиномиальная классификация.
  • Стохастический градиентный спуск.

Если вы регулярно работаете с большими данными, вам может потребоваться принять решение Hadoop.


0

Вы можете попробовать Vowpal Wabbit: Vowpal Wabbit . Он хорошо работает с очень большими наборами данных и очень большим количеством функций.

по данным сайта:

Это проект, начатый в Yahoo! Исследуйте и продолжайте в Microsoft Research разрабатывать быстрый, масштабируемый и полезный алгоритм обучения. VW - это сущность скорости в машинном обучении, способная легко извлекать уроки из терафеатурных наборов данных. Благодаря параллельному обучению он может превысить пропускную способность любого сетевого интерфейса одной машины при линейном обучении, что является первым среди алгоритмов обучения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.