39 votos

¿Crear una "puntuación de certeza" a partir de los votos en los bosques aleatorios?

Busco entrenar un clasificador que discrimine entre Type A y Type B objetos con un conjunto de entrenamiento razonablemente grande de aproximadamente 10.000 objetos, de los cuales aproximadamente la mitad son Type A y la mitad de los cuales son 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 gráficos de dispersión y de densidad por pares nos indica que hay un solapamiento significativo en las distribuciones de las células cancerosas y normales en muchas de las características.

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

Una de las cosas que queremos intentar hacer es crear una especie de "puntuación de certeza" que cuantifique el grado de confianza que tenemos en la clasificación de los objetos. Sabemos que nuestro clasificador nunca tendrá una precisión del 100%, e incluso si se consigue una alta precisión en las predicciones, querremos que los técnicos capacitados identifiquen qué objetos son realmente Type A y Type B . Así que en lugar de proporcionar predicciones inflexibles de Type A o Type B queremos presentar una puntuación para cada objeto que describa cómo A o B un objeto es. Por ejemplo, si diseñamos una puntuación que va de 0 a 10, una puntuación de 0 puede indicar que un objeto es muy similar a Type A objetos, mientras que una puntuación de 10 indicará que un objeto es muy parecido a Type B .

Estaba pensando que podría utilizar los votos dentro de los bosques aleatorios para idear dicha puntuación. Dado que la clasificación en los 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 para ser Type A diferiría de los objetos que fueron votados por, digamos, el 51% de los árboles para ser Type A .

Actualmente, he intentado establecer un umbral arbitrario para la proporción de votos que debe recibir un objeto para ser clasificado como Type A o Type B y si no se supera el umbral se clasificará como Uncertain . Por ejemplo, si fuerzo la condición de que el 80% o más de los árboles deben coincidir en una decisión para que se apruebe una clasificación, me encuentro con que el 99% de las predicciones de clase son correctas, pero alrededor del 40% de los objetos se clasifican como Uncertain .

¿Tendría sentido, entonces, aprovechar la información de las votaciones para puntuar la certeza de las predicciones? ¿O me estoy equivocando de dirección con mis pensamientos?

19voto

user3595 Puntos 29

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

No he trabajado con la implementación de R, pero me sorprendería que no hubiera una forma sencilla de obtener salidas suaves de los votos, así como la decisión dura.

Edición: Acabo de echar un vistazo a R, y predict.randomForest también emite probabilidades.

17voto

Boris Tsirelson Puntos 191

Si está utilizando R, el paquete de caretas le evitará reinventar la rueda. Por ejemplo, el siguiente código utiliza la validación cruzada para elegir los parámetros de ajuste de un modelo de bosque aleatorio y, a continuación, genera la media y la desviación estándar de la 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 facilita la comparación de diferentes modelos de predicción. Por ejemplo, si quiere probar un SVM, puede sustituir el texto method='rf' avec method='svmLinear' o method='svmRadial'. También puedes elegir los parámetros de ajuste en función de AUC en lugar de la precisión, añadiendo una línea al parámetro trainControl: summaryFunction=twoClassSummary .

Por último, 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.

2voto

shmuelp Puntos 1116

El randomForest en R es un paquete bastante decente para entrar en mayores detalles sobre su análisis. Le proporciona los votos (ya sea en forma de fracción o de recuentos en bruto) y ofrece capacidad incorporada para el ajuste y la validación cruzada, e incluso puede darle más información sobre sus características también (si quisiera saber cuáles de sus 100 son las más importantes en el análisis).

Si ya usas ese paquete, tal vez quieras echarle un vistazo más de cerca y si no lo haces, tal vez debas comprobarlo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X