¿Hay alguna biblioteca disponible para métodos tipo CART que utilicen predictores y respuestas dispersas?

11

Estoy trabajando con algunos conjuntos de datos grandes usando el paquete gbm en R. Tanto mi matriz de predicción como mi vector de respuesta son bastante escasos (es decir, la mayoría de las entradas son cero). Esperaba construir árboles de decisión usando un algoritmo que aprovecha esta escasez, como se hizo aquí ). En ese documento, como en mi situación, la mayoría de los elementos tienen solo algunas de las muchas características posibles, por lo que pudieron evitar muchos cálculos desperdiciados al suponer que sus elementos carecían de una característica dada a menos que los datos indiquen explícitamente lo contrario. Mi esperanza es que pueda obtener una aceleración similar usando este tipo de algoritmo (y luego envolviendo un algoritmo de refuerzo para mejorar mi precisión predictiva).

Como no parecían publicar su código, me preguntaba si había paquetes o bibliotecas de código abierto (en cualquier idioma) que estén optimizados para este caso. Idealmente, me gustaría algo que pudiera tomar una matriz dispersa directamente del Matrixpaquete de R , pero tomaré lo que pueda obtener.

He mirado alrededor y parece que este tipo de cosas debería estar ahí afuera:

  • Los químicos parecen encontrarse mucho con este problema (el artículo que relacioné anteriormente trataba sobre aprender a encontrar nuevos compuestos de drogas), pero las implementaciones que pude encontrar fueron patentadas o altamente especializadas para el análisis químico. Sin embargo, es posible que uno de ellos sea rediseñado.

  • La clasificación de documentos también parece ser un área donde es útil aprender de espacios de características dispersos (la mayoría de los documentos no contienen la mayoría de las palabras). Por ejemplo, hay una referencia oblicua a una implementación escasa de C4.5 (un algoritmo tipo CART) en este documento , pero no hay código.

  • De acuerdo con la lista de correo , WEKA puede aceptar datos escasos, pero a diferencia del método en el documento que he vinculado anteriormente, WEKA no está optimizado para aprovecharlo en términos de evitar ciclos de CPU desperdiciados.

¡Gracias por adelantado!

David J. Harris
fuente
2
No R, pero Python scikits.learn tiene un soporte creciente para matrices dispersas.
chl
@ ch1 gracias. Parece que todavía no han agregado métodos de árbol. Alguien está trabajando en una implementación , pero no estoy seguro de si podrá usar datos dispersos. Sin embargo, definitivamente tendré en cuenta los escasos métodos SVM.
David J. Harris
Cuando dices "CART-like", ¿quieres específicamente árboles de decisión o algún tipo de modelo predictivo?
Michael McGowan
@Michael: me gustaría tener árboles, ya que los alimentaré a un procedimiento de refuerzo y tienen una gran variación.
David J. Harris
2
No sé de un modelos de árboles, pero glmnety e1071::svmtanto apoyo escasa Matrixobjetos. GAMboosty GLMboost(del paquete GAMboost) puede también.
Zach

Respuestas:

2

Me gustaría ver un punto de referencia de su implementación escasa frente a las implementaciones de CART modernas que se usan en los RF. Ese documento es bastante antiguo en términos de avances en esta área y me sorprendería si todavía proporcionara una aceleración significativa.

Parte de la razón es que el uso de un algoritmo de clasificación inteligente como Quicksort en la búsqueda dividida puede proporcionar un rendimiento cercano a O (n) para características casi constantes (incluidas las dispersas). Las implementaciones rápidas también rastrean cuándo una característica se ha vuelto constante dentro de una rama de un árbol y ya no se debe examinar. Las representaciones de características densas proporcionan búsquedas rápidas de una manera amigable con el caché de la CPU, por lo que necesitaría una representación escasa realmente inteligente para ganar en los ciclos de la CPU.

Esto se discute aquí , aquí , aquí .

De hecho, implementé una representación de datos dispersa de datos en un punto de mi paquete RF CloudForest, pero encontré que era más lenta que una representación densa de los datos y la abandoné, aunque proporcionaba algunas ventajas de memoria.

Mi recomendación sería probar scikit learn o cloudforest integrado en cosas de impulso y ver si es lo suficientemente rápido. Ambos se pueden ampliar con criterios de impulso personalizados si desea hacer algo no estándar. (En realidad, escribí Cloudforest originalmente para trabajar con grandes conjuntos de datos genéticos altamente dimensionales que son muy similares a lo que estás describiendo).

Ryan Bressler
fuente
1

Probablemente hay una pequeña posibilidad de que cualquier código se aproveche de eso; preferiría escribir algo por su cuenta.
Sin embargo, la otra opción es transformar sus datos para reducir el tamaño de sus datos eliminando información redundante. Es difícil saber cómo sin la información sobre sus datos, pero ¿tal vez pueda fusionar algunas características que sabe que no se superponen, partes de PCA o cambios en la representación de algunos descriptores? Además, si dice que su respuesta también es escasa, ¿tal vez sea razonable reducir la muestra de objetos con 0 en respuesta?


fuente
Gracias por la respuesta. La disminución de resolución suena como una idea interesante. Actualmente, estoy desestimando algunos aspectos de los datos por otras razones, pero esa también podría ser una buena idea. Pero, ¿por qué dice que es poco probable que exista código para esto? Me vinculé a un artículo de hace 12 años que parece haber abordado el mismo problema.
David J. Harris
@David En resumen, siento que esto no tiene sentido, este es un problema de "pregunta equivocada". La escasez muestra que los datos están en una forma extremadamente subóptima, y ​​un enfoque mucho más efectivo es tratar de convertirlos. El papel que vinculó es otro problema.
Me temo que no entiendo lo que estás diciendo. Convertir la forma de los datos es exactamente lo que quiero hacer, y por lo que puedo decir, es exactamente lo que hace este documento. No querían enumerar todas las características de las que carecía cada químico, solo las que tenía. Esto tenía sentido en su situación porque la mayoría de los productos químicos carecen de la mayoría de las características, como en mi caso. Entonces convirtieron sus características en una matriz dispersa y luego su algoritmo de partición recursiva en esa matriz dispersa directamente. Estoy buscando formas de código abierto para hacer lo mismo con mis datos. ¿Qué me estoy perdiendo? Gracias
David J. Harris
@David, creo que el punto de mbq es que una codificación grande de 1 de n (por ejemplo, un sitio web / identificador del cliente, etc.) o una lista de productos químicos presentes) a menudo es una muy mala representación para el aprendizaje. Es mejor cambiar a "características", por ejemplo, para un sitio web puede ser categorización: tienda / noticias / blog deporte / tecnología, etc.
seanv507
1

¿Has mirado el caretpaquete en R? Proporciona una interfaz que facilita el uso de una variedad de modelos, incluidos algunos para particiones recursivas como rpart, ctreey ctree2.

Pablo
fuente
Estoy familiarizado con esos paquetes / funciones, y ninguno de ellos funciona con datos escasos, por lo que puedo decir.
David J. Harris
1
El soporte para Matrixobjetos sería maravilloso, pero actualmente no existe. Todo se convierte en un marco de datos.
Zach
Puede intentar enviar un correo electrónico al desarrollador y preguntarle sobre esto. Envié él en otra cosa y proporcionó una respuesta útil - max.kuhn [at] pfizer.com
paul