¿Crear un "puntaje de certeza" a partir de los votos en bosques aleatorios?

36

Estoy buscando entrenar un clasificador que discrimine entre Type Ay Type Bobjetos con un conjunto de entrenamiento razonablemente grande de aproximadamente 10,000 objetos, de los cuales aproximadamente la mitad son Type Ay la otra mitad Type B. El conjunto de datos consta de 100 características continuas que detallan las propiedades físicas de las celdas (tamaño, radio medio, etc.). La visualización de los datos en diagramas de dispersión por pares y diagramas de densidad nos dice que hay una superposición significativa en las distribuciones de las células cancerosas y normales en muchas de las características.

Actualmente estoy explorando bosques aleatorios como método de clasificación para este conjunto de datos, y he visto algunos buenos resultados. Usando R, los bosques aleatorios pueden clasificar correctamente alrededor del 90% de los objetos.

Una de las cosas que queremos probar y hacer es crear una especie de "puntaje de certeza" que cuantifique la confianza que tenemos en la clasificación de los objetos. Sabemos que nuestro clasificador nunca será 100% preciso, e incluso si se logra una alta precisión en las predicciones, querremos que técnicos capacitados identifiquen qué objetos son verdaderamente Type Ay Type B. Entonces, en lugar de proporcionar predicciones intransigentes de Type Ao Type B, queremos presentar una puntuación para cada objeto que describa cómo Ao cómo es Bun objeto. Por ejemplo, si diseñamos una puntuación que oscila entre 0 y 10, una puntuación de 0 puede indicar que un objeto es muy similar a los Type Aobjetos, mientras que una puntuación de 10 indicará que un objeto es muy parecido Type B.

Estaba pensando que podría usar los votos dentro de los bosques al azar para diseñar tal puntaje. Dado que la clasificación en bosques aleatorios se realiza por votación mayoritaria dentro del bosque de árboles generados, asumiría que los objetos que fueron votados por el 100% de los árboles Type Aserían diferentes de los objetos que fueron votados, por ejemplo, el 51% de los árboles para ser Type A.

Actualmente, he intentado establecer un umbral arbitrario para que la proporción de votos que un objeto debe recibir se clasifique como Type Ao Type B, y si el umbral no se supera, se clasificará como Uncertain. Por ejemplo, si fuerzo la condición de que el 80% o más de los árboles deben acordar una decisión para que se apruebe una clasificación, encuentro que el 99% de las predicciones de la clase son correctas, pero aproximadamente el 40% de los objetos están agrupados como Uncertain.

¿Tendría sentido, entonces, aprovechar la información de votación para calificar la certeza de las predicciones? ¿O me dirijo en la dirección equivocada con mis pensamientos?

ialm
fuente
Asegúrese de tener conjuntos de datos de capacitación y prueba separados. Asegúrese de utilizar su conjunto de pruebas lo menos posible (idealmente solo una vez).
Boris Gorelik
@bgbg Estoy usando un esquema de entrenamiento / validación / prueba, en una división 70/20/10. Estoy entrenando un modelo con el 70% de los datos y ajustando los parámetros en función de los resultados en el conjunto de validación del 20%. Después de ajustar los parámetros en estos dos conjuntos, evalúo el modelo en el conjunto de prueba del 10%. Aunque Breiman afirma que la tasa de error OOB incorporada hace que hacer un conjunto de pruebas por separado sea redundante, desconfío de su afirmación.
ialm

Respuestas:

19

Tiene mucho sentido, y todas las implementaciones de bosques aleatorios con los que he trabajado (como MATLAB) también proporcionan resultados probabilísticos para hacer precisamente eso.

No he trabajado con la implementación de R, pero me sorprendería si no hubiera una manera simple de obtener resultados suaves de los votos, así como la decisión difícil.

Editar: solo eché un vistazo a R, y predic.randomForest también genera probabilidades de salida.

benhamner
fuente
1
Gracias por su respuesta. Tienes razón, he creado un script que generará la proporción de votos que recibe cada objeto. Sin embargo, me pregunto qué tan útiles serán estos votos. ¿Hay algún próximo paso que recomiende? ¿Debería analizar la variabilidad de las proporciones de votación a través de corridas adicionales de RF? Entiendo que RF tiene un elemento estocástico. ¿Hay algún diagnóstico que deba mirar?
ialm
3
@ Jonathan Puedes intentar mirar una trama con la fracción de objeto real de alguna clase en función de una fracción de votos para esta clase del bosque. Estaba trabajando en un problema que requería un puntaje de confianza y resultó que logré obtener una curva logística muy agradable.
@mbq Lo siento, ¿puedes aclarar qué quieres decir con eso? ¡Estoy interesado en su sugerencia y la seguiré mañana!
ialm
1
Además, la variabilidad en un RF viene en la etapa de entrenamiento, por lo que ejecutar muestras de prueba varias veces a través del RF no cambiará los resultados. Observaría el AUC frente al número de árboles en RF, para asegurarme de que tiene suficientes árboles, y luego optimizaría el parámetro mínimo de hoja de acuerdo con AUC.
benhamner
2
@ Jonathan Creo que mbq se refiere a algo llamado calibración (aunque puede haber otros nombres). Consulte, por ejemplo, estas preguntas: Calibración de un clasificador potenciado multiclase , ¿a qué se refieren los "valores reales" en la clasificación supervisada?
steffen
17

Si está utilizando R, el paquete caret le evitará reinventar la rueda. Por ejemplo, el siguiente código utiliza la validación cruzada para elegir los parámetros de ajuste para un modelo de bosque aleatorio, y luego genera la desviación media y estándar de precisión para cada pliegue de validación cruzada. Finalmente, calcula las probabilidades de clase para el modelo.

library(caret)
library(PerformanceAnalytics)
data(iris)

#Make a yes/no dataset
Dataset <- iris
Dataset$Class <- ifelse(Dataset$Species=='versicolor','Yes','No')
Dataset$Class  <- as.factor(Dataset$Class)
Dataset$Species<- NULL
chart.Correlation(Dataset[-5], col= Dataset$Class)

#Fit an RF model
model <- train(Class~.,Dataset,
                method='rf',TuneLength=3,
                trControl=trainControl(
                    method='cv',number=10,
                    classProbs = TRUE))
model$results

#Predict class probabilities (i.e. 'certainty' scores)
pred <- predict(model,iris,"prob")
head(pred)

Lo bueno de caret es que hace que sea muy fácil comparar diferentes modelos predictivos. Por ejemplo, si quieres probar una SVM, se puede reemplazar el texto method='rf'con method='svmLinear'o method='svmRadial'. También puede elegir los parámetros de ajuste basado en el AUC en lugar de precisión mediante la adición de una línea para el parámetro trainControl: summaryFunction=twoClassSummary.

Finalmente, hay un poco de código del paquete PerformanceAnalytics chart.Correlation(Dataset[-5], col= Dataset$Class), que no es necesario para construir el modelo, pero proporciona una buena visualización de su conjunto de datos.

Zach
fuente
Me estás haciendo fanático del paquete caret. Creo que mantendré abierto un segundo hilo R solo para probar diferentes métodos de clasificación y me preocuparé de hacer el ajuste de CV y ​​parámetros por sí mismo y ver si obtengo resultados comparables.
ialm
@Jonathan contento de escucharlo! Es un paquete maravilloso. Pruebe el modelLookup()comando para obtener una lista de lo que es posible.
Zach
El probtipo de predicttambién está disponible al usar randomForestpara entrenar su modelo (con o sin el uso de otros paquetes como careto PerformanceAnalytics).
Hack-R
2

El paquete randomForest en R es un paquete bastante decente para entrar en mayores detalles sobre su análisis. Le proporciona los votos (ya sea como una fracción o recuentos sin procesar) y ofrece una capacidad incorporada para el ajuste y la validación cruzada e incluso puede brindarle más información sobre sus características (si desea saber cuáles de sus 100 son Lo más importante en el análisis).

Si ya está usando ese paquete, entonces tal vez desee echarle un vistazo más de cerca y si no lo está, tal vez échele un vistazo.

usuario4673
fuente