Existem bibliotecas disponíveis para métodos do tipo CART usando preditores e respostas esparsas?

11

Estou trabalhando com alguns conjuntos de dados grandes usando o pacote gbm em R. Tanto minha matriz preditora quanto meu vetor de resposta são muito escassos (ou seja, a maioria das entradas é zero). Eu esperava construir árvores de decisão usando um algoritmo que aproveitasse essa escassez, como foi feito aqui ). Nesse artigo, como na minha situação, a maioria dos itens possui apenas alguns dos muitos recursos possíveis; portanto, eles foram capazes de evitar muita computação desperdiçada assumindo que seus itens não possuíam um determinado recurso, a menos que os dados dissessem explicitamente o contrário. Minha esperança é que eu possa obter uma aceleração semelhante usando esse tipo de algoritmo (e, em seguida, envolvendo um algoritmo de reforço em torno dele para melhorar minha precisão preditiva).

Como eles não pareciam publicar seu código, fiquei pensando se havia algum pacote ou biblioteca de código aberto (em qualquer idioma) otimizados para esse caso. Idealmente, eu gostaria de algo que pudesse levar uma matriz esparsa diretamente do Matrixpacote de R , mas eu pegarei o que conseguir.

Eu olhei em volta e parece que esse tipo de coisa deveria estar por aí:

  • Os químicos parecem se deparar bastante com essa questão (o artigo que eu listei acima foi sobre aprender a encontrar novos compostos de drogas), mas as implementações que eu pude encontrar eram proprietárias ou altamente especializadas em análises químicas. É possível que um deles possa ser re-proposto, no entanto.

  • A classificação de documentos também parece ser uma área em que é útil aprender com espaços esparsos de recursos (a maioria dos documentos não contém muitas palavras). Por exemplo, há uma referência oblíqua a uma implementação esparsa do C4.5 (um algoritmo semelhante ao CART) neste documento , mas nenhum código.

  • De acordo com a lista de discussão , o WEKA pode aceitar dados esparsos, mas, diferentemente do método descrito no artigo acima, o WEKA não é otimizado para realmente tirar proveito dele em termos de evitar ciclos de CPU desperdiçados.

Desde já, obrigado!

David J. Harris
fonte
2
Não R, mas o Python scikits.learn tem um suporte crescente para matrizes esparsas.
chl
@ ch1 obrigado. Parece que eles ainda não adicionaram métodos de árvore. Alguém está trabalhando em uma implementação , mas não tenho certeza se será capaz de usar dados esparsos. Definitivamente vou manter os poucos métodos SVM em mente!
David J. Harris
Quando você diz "semelhante ao CART", deseja especificamente árvores de decisão ou qualquer tipo de modelo preditivo?
Michael McGowan
@ Michael - eu gostaria de árvores, já que vou alimentá-las com um procedimento de reforço e elas têm alta variação.
David J. Harris
2
Eu não sei de um modelos de árvore, mas glmnete e1071::svmtanto apoio escassa Matrixobjetos. GAMbooste GLMboost(do pacote GAMboost) também pode.
Zach

Respostas:

2

Eu gostaria de ver uma referência de sua implementação esparsa em relação às implementações modernas do CART usadas nas RF. Esse artigo é bastante antigo em termos de avanços nessa área e eu ficaria surpreso se ele ainda fornecesse uma velocidade significativa.

Parte do motivo é que o uso de um algoritmo de classificação inteligente como o Quicksort na pesquisa dividida pode fornecer desempenho próximo de O (n) para recursos quase constantes (incluindo os esparsos). Implementações rápidas também rastreiam quando um recurso se torna constante dentro de um ramo de uma árvore e não deve mais ser examinado. Representações de recursos densos fornecem pesquisas rápidas de maneira amigável ao cache da CPU, para que você precise de uma representação esparsa realmente inteligente para vencer nos ciclos da CPU.

Isso é discutido aqui , aqui , aqui .

Na verdade, implementei uma representação de dados esparsos em um ponto do pacote CloudForest, mas achei que era mais lento que uma representação densa dos dados e o abandonei, apesar de fornecer algumas vantagens de memória.

Minha recomendação seria tentar o scikit learn ou o cloudforest construído para impulsionar coisas e ver se é rápido o suficiente. Ambos podem ser estendidos com critérios de aumento personalizados, se você quiser fazer algo fora do padrão. (Na verdade, eu escrevi a floresta na nuvem originalmente para trabalhar com conjuntos de dados genéticos grandes e altamente dimensionais, muito parecidos com o que você está descrevendo).

Ryan Bressler
fonte
1

Provavelmente, existe uma pequena chance de qualquer código que tire proveito disso - você prefere escrever algo por conta própria.
No entanto, a outra opção é transformar seus dados para reduzir o tamanho dos dados, removendo informações redundantes. É difícil dizer como, sem as informações sobre seus dados, mas talvez você possa mesclar alguns recursos que você sabe que não se sobrepõem, partes do PCA ou alterar a representação de alguns descritores? Além disso, se você diz que sua resposta também é esparsa, talvez seja razoável reduzir a amostra de objetos com 0 em resposta?


fonte
Obrigado pela resposta. Reduzir a amostragem parece uma ideia interessante. Atualmente, estou ponderando alguns aspectos dos dados por outros motivos, mas isso também pode ser uma boa ideia. Mas por que você diz que o código para isso é improvável? Vinculei um artigo de 12 anos atrás que parece ter abordado o mesmo problema.
David J. Harris
@ David Em suma, eu sinto que isso não faz sentido - este é um problema de "pergunta errada". A escassez mostra que os dados estão em uma forma extremamente abaixo do ideal, e uma abordagem muito mais eficaz é tentar convertê-los. O artigo que você vinculou é outro problema.
Receio não entender o que você está dizendo. Converter o formato dos dados é exatamente o que eu quero fazer e, até onde eu sei, é exatamente o que este artigo faz. Eles não queriam listar todos os recursos que cada produto químico não possuía, apenas os que possuíam. Isso fazia sentido na situação deles, porque a maioria dos produtos químicos não possui muitos recursos, assim como no meu caso. Então, eles converteram seus recursos em uma matriz esparsa e, em seguida, em seu algoritmo de particionamento recursivo nessa matriz esparsa diretamente. Estou procurando maneiras de código aberto para fazer a mesma coisa com meus dados. o que estou perdendo? Graças
David J. Harris
@ David, acho que o ponto do mbq é que uma grande codificação 1-de-n (por exemplo, site / identificador de cliente etc) ou uma lista de produtos químicos presentes) geralmente é uma representação muito ruim para o aprendizado. É melhor mudar para "recursos", por exemplo, para um site, pode ser categorizado: loja / notícias / blog esporte / tecnologia etc.
#
1

Você já viu o caretpacote em R? Ele fornece uma interface que facilita o uso de uma variedade de modelos, incluindo alguns para particionamento recursivo, como rpart, ctreee ctree2.

Paulo
fonte
Eu estou familiarizado com esses pacotes / funções, e nenhum deles trabalha com dados esparsos, até onde eu sei.
David J. Harris
1
o suporte a Matrixobjetos para objetos seria maravilhoso, mas atualmente não existe. Tudo é coagido a um data.frame.
Zach
Você pode tentar enviar um email ao desenvolvedor e perguntar a ele sobre isso. Enviei um e-mail para ele com outra coisa e ele forneceu uma resposta útil - max.kuhn [at] pfizer.com
paul