Regressão logística em Big Data

9

Eu tenho um conjunto de dados de cerca de 5000 recursos. Para esses dados, usei o teste Chi Square para seleção de recursos; depois disso, obtive cerca de 1500 variáveis ​​que mostraram relação de significância com a variável resposta.

Agora eu preciso ajustar a regressão logística nisso. Estou usando o pacote glmulti para R (o pacote glmulti fornece seleção eficiente de subconjuntos para vlm), mas ele pode usar apenas 30 recursos por vez; caso contrário, seu desempenho diminui à medida que o número de linhas no meu conjunto de dados é de cerca de 20000.

Existe alguma outra abordagem ou técnica para resolver os problemas acima? Se eu seguir o método acima, levará muito tempo para ajustar o modelo.

Vijay
fonte
8
Se você pode ajustar o seu conjunto de dados em memória de uma única máquina, eu não chamaria isso de "Big Data" problema, especialmente se você fizer isso no título da sua pergunta
logC
Eu estou usando sklearné LogisticRegressione ele resolve um 4000 recursos, problema 20.000 linhas em cerca de um minuto no meu laptop.
Thomas Ahle

Respostas:

13

Não é apropriado fazer a triagem de recursos e, em seguida, alimentar os recursos sobreviventes em um método que não entenda quanta tortura de dados foi feita anteriormente. É melhor usar um método que possa lidar com todos os recursos em potencial (por exemplo, rede elástica). Outras sugestões sobre o uso da redução de dados também são excelentes idéias.

Frank Harrell
fonte
Existe evidência para isso? O / w parece tão heurístico quanto a triagem de recursos.
Zubin
2
A estimativa de máxima verossimilhança penalizada leva em consideração o contexto, por exemplo, no laço, a estimativa do coeficiente de regressão de uma variável será menor se você considerar 1000 variáveis ​​não selecionadas do que se considerar 100 variáveis ​​não selecionadas. Caso contrário, as variáveis ​​são selecionadas de maneira tendenciosa e a reposição da variável em uma segunda etapa perde o contexto.
Frank Harrell
Você poderia elaborar o que você quer dizer com parcialidade aqui? Eu estou pensando, porque, em um sentido trivial, o laço é sempre tendencioso, então você precisa se referir a um viés adicional. Além disso, existem algumas abordagens de dois estágios com propriedades razoáveis, por exemplo, pdfs.semanticscholar.org/d90a/…
jmb
2
O laço direciona propositadamente os coeficientes para zero, a fim de evitar ajustes excessivos. Parâmetros não equalizados levam a valores previstos muito extremos. Ajustar variáveis ​​"selecionadas" em um modelo não compensado desfará o viés de laço necessário , criando muito excesso de ajuste dos valores previstos.
Frank Harrell
10

Uma primeira abordagem é usar o PCA para reduzir a dimensionalidade do conjunto de dados. Tente manter ~ 97% da variação total, isso pode ajudar bastante.

Outra opção é usar algo como descida de gradiente estocástico, este pode ser um algoritmo muito mais rápido e capaz de caber na memória de R.

EDIT: Um problema com o R é que você só pode usar sua RAM; portanto, se você tiver apenas 8 GB de memória, é a isso que você está limitado. Eu já tive muitos problemas com isso e, desde então, passei a usar o scikit-learn do python, que parece lidar com conjuntos de dados maiores muito melhor.

Um gráfico muito bom, que dá uma idéia de locais para começar com base no tamanho do seu conjunto de dados, pode ser encontrado aqui: http://3.bp.blogspot.com/-dofu6J0sZ8o/UrctKb69QdI/AAAAAAAAADfg/79ewPecn5XU/s1600/scikit-learn-flow -chart.jpg

insira a descrição da imagem aqui

mike1886
fonte
8
Uma grande preocupação com o uso do PCA dessa maneira é que todo o relacionamento entre a variável de resposta e as variáveis ​​independentes possa residir nos 3% da variação total que você negligencia. Também não parece haver nenhuma maneira geral de determinar quantos componentes principais usar, porque o menor componente pode ser proporcional à resposta em si e, portanto, constituir a escolha ideal de variáveis ​​a serem incluídas.
whuber
11
Eu acho que, de fato, se você é capaz de carregar o conjunto de dados na memória principal (o que eu suponho que seja o caso, considerando o que você explica), a descida estocástica do gradiente é o primeiro passo que você deve executar antes de tentar técnicas de redução de dimensionalidade. Com o Scikit-learn em python (ou R, mas eu não sou usuário dessa linguagem), isso funcionaria perfeitamente.
Bertrand R
Acho que essa é uma resposta útil, mas acho que o OP está perguntando sobre a regressão logística, e não a redução de recursos. Talvez você possa abordar essa parte da pergunta em uma edição?
logc
Não tenho certeza da utilidade do PCA para problemas de regressão. A questão é a seguinte: o PCA mantém os maiores valores singulares da matriz de entrada, mas o pseudo-inverso da matriz inverte os valores singulares, portanto, você realmente deseja manter o menor dos valores originais. Talvez seja melhor apenas esboçar os dados: arxiv.org/abs/1411.4357 #
Thomas Ahle
4

Como o @Frank Harrell já mencionou, o uso de rede elástica ou LASSO para executar regressão penalizada com todos os 5.000 recursos ( p ) seria um bom começo para a seleção de recursos (não se pode simplesmente remover 3500 variáveis ​​porque elas não são "estatisticamente significativas" com o variável de interesse dependente). Qualquer um desses métodos pode ser executado usando o pacote R glmnet,.

Para levar em conta os relacionamentos compartilhados entre as possíveis variáveis ​​preditoras de interesse ( p = 5000), eu recomendaria executar uma floresta aleatória usando o randomForestpacote e / ou aumentar o gradiente usando o gbmpacote para avaliar a importância relativa das possíveis variáveis ​​preditoras em relação ao resultado binário. Com essas informações, você estará muito mais preparado para construir um modelo de regressão logística mais parcimonioso.

Matt Reichenbach
fonte
3
Y
1

Suponho que você não esteja limitado ao R, pois esse é um problema de grande volume de dados que você provavelmente não deveria estar. Você pode experimentar o MLlib , que é a biblioteca de aprendizado de máquina escalável do Apache Spark.

O Apache Spark , por sua vez, é um mecanismo rápido e geral para processamento de dados em larga escala na memória. Eles operam em uma estrutura do Hadoop que permite o processamento distribuído de grandes conjuntos de dados entre clusters de computadores usando modelos de programação simples. Ele foi projetado para expandir de servidores únicos para milhares de máquinas, cada uma oferecendo computação e armazenamento local.

Observe que 'milhares de máquinas' é opcional (!), Você também pode configurá-lo na área de trabalho / área de trabalho local.

Voltando ao MLlib, ele vem com os algoritmos abaixo, prontos para uso:

  • K-significa agrupar com K-significa || inicialização.
  • Regressão linear regularizada com L1- e L2.
  • Regressão logística regularizada em L1- e L2.
  • Filtragem colaborativa de mínimos quadrados alternados, com classificações explícitas ou feedback implícito.
  • Classificação multinomial de Naive Bayes.
  • Descida de gradiente estocástico.

Se você trabalha regularmente com big data, pode ser necessário adotar uma solução Hadoop.

Zhubarb
fonte
0

Você pode experimentar o Vowpal Wabbit: Vowpal Wabbit . Funciona bem com conjuntos de dados muito grandes e um número muito grande de recursos.

de acordo com o site:

Este é um projeto iniciado no Yahoo! Pesquise e continue na Microsoft Research para projetar um algoritmo de aprendizado rápido, escalável e útil. A VW é a essência da velocidade no aprendizado de máquina, capaz de aprender com conjuntos de dados de terafeature com facilidade. Através do aprendizado paralelo, ele pode exceder o rendimento de qualquer interface de rede de uma única máquina ao realizar um aprendizado linear, o primeiro entre os algoritmos de aprendizado.

user765195
fonte