5 votos

Entrenamiento de un clasificador binario (xgboost) utilizando probabilidades en lugar de sólo 0 y 1 (frente al entrenamiento de un clasificador múltiple o el uso de la regresión)

Perdonad si el título parece un poco indirecto, pero dejadme que os explique lo que intento hacer. Estoy entrenando un XGBClassifier (en python) en las muestras que no son estrictamente en la clase de 0 y 1, pero tienen un poco de granularidad de rango - en cualquier lugar de [0, 1], [.25, .75], [.5 .5], [.75, .25], [1, 0] para cada una de las dos clases, donde [0, 1] significa que es un 0% de clase A y 100% de clase B .

La razón por la que prefiero no utilizar la regresión es que los valores de entrenamiento no son técnicamente continuos, sino discretos dentro del espectro de 0 a 1, y estoy tratando de combinar el poder de hacer una clasificación multiclase sólo dentro del marco de que todas las clases son simplemente diferentes combinaciones de clase puramente A y la clase B . Tal vez la regresión es todavía una mejor opción, o hacer reg:linear como el objetivo - pero eso no resuelve exactamente mi problema.

Por ejemplo, para medir el sentimiento no en términos de "negativo o positivo" sino de "25% positivo 75% negativo" utilizando predict_proba() .

Estoy tratando de averiguar cuál es la mejor manera de hacerlo. Sé que la clase base del XGBClassifier es binary:logistic, y podría intentar esto también usando multi:softmax, pero me gusta la idea de usar el predict_proba() entre 0 y 1 como una medida de dónde cae una muestra en una escala entre la clase A y la clase B (o realmente, entre 0 y 1 ), lo que sería más difícil utilizando 5 "clases" distintas.

(Para el siguiente ejemplo, estoy utilizando las letras A y B pero realmente significa 0 y 1 . Es menos confuso de esta manera).

Mi primera inclinación es forzar las probabilidades de clasificación utilizando ratios de A y B en el conjunto de entrenamiento para cada muestra, esencialmente enviando cada uno a través de cuatro veces con diferentes clasificaciones - pero no estoy seguro de si hay una manera más fácil o si está haciendo lo que creo que es.

Por ejemplo, si tengo una muestra que quiero representar como [.5, .5] así que básicamente, un sentimiento 50/50 o "neutro" (para que otras muestras que envié después salgan alrededor de [.5, .5] , lo entrenaría cuatro veces con un valor de A y cuatro veces con un valor de B . Entonces para algo que debería ser clasificado como [0, 1] lo entrenamos ocho veces con un valor de 1, y para algo que es [.75, .25] , lo entrenaríamos seis veces con un valor de 0 y dos veces con un valor de 1 .

Así es como entrenaría cada muestra entonces, donde " B B B B " significaría que entreno la misma muestra cuatro veces diciéndole al clasificador que es B etc:

[0.00, 1.00]: B B B B 
[0.25, 0.75]: A B B B 
[0.50, 0.50]: A A B B 
[0.75, 0.25]: A A A B 
[1.00, 0.00] :A A A A

Así que salvo que este enfoque sea incorrecto, ¿hay una forma mejor de hacer lo que estoy tratando de hacer? ¿Como un análogo para predict_proba() pero para entradas de entrenamiento? Sabiendo cómo funciona el algoritmo no creo que exista, pero de nuevo, estoy aquí para ser instruido.

¿Se trata de una bastardización de un clasificador binario que se presenta como un aspirante a la regresión? ¿O es una manera correcta de hacer lo que estoy tratando de hacer?

Gracias a todos.

1voto

user777 Puntos 10934

Tu instinto es correcto: esto sigue siendo un problema binario. Los vectores de características $x$ y etiquetas $y$ acaban de ser "comprimidos" en su representación. Considere un vector de características $x$ que tiene asociada la etiqueta $y = (0.25, 0.75)$ . Esto es exactamente lo mismo que tener $$ (X,Y)= \left(\begin{bmatrix} x \\ x \\ x \\ x \\ \end{bmatrix}, \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 0 & 1 \\ 0 & 1 \\ \end{bmatrix} \right) $$ como partes de su matriz de características y etiquetas.

Por supuesto, el orden no es importante, así que también podría escribir $$ Y= \begin{bmatrix} 0 & 1 \\ 1 & 0 \\ 0 & 1 \\ 0 & 1 \\ \end{bmatrix} ,$$ o cualquier otra ordenación, para sus etiquetas de un $(x,y)$ .

Si descomprimes tus datos con este método, es exactamente igual que el caso binario ordinario.

Tenga en cuenta que $(x,y)$ son sólo sustitutivos de cualquier tupla de vectores de características y etiquetas. Puede haber otro vector de características $z \neq x$ que también tiene la etiqueta $y = [0.25, 0.75]$ . Si descomprimimos esto y lo añadimos al resultado anterior, tenemos $$ (X,Y)= \left(\begin{bmatrix} x \\ x \\ x \\ x \\ z \\ z \\ z \\ z \\ \end{bmatrix}, \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ 0 & 1 \\ 0 & 1 \\ 0 & 1 \\ 0 & 1 \\ 1 & 0 \\ 0 & 1 \\ \end{bmatrix} \right) .$$

0 votos

¿No predecirá entonces el clasificador lo más probable que sea la clase cuando se le presente $x$ ? El último paso de un clasificador basado en probabilidades es típicamente a argmax, y los pasos antes de este punto son análogos a un regresor que intenta igualar números reales en [0,1] (modulo algún log-prob softmaxer como último paso).

0 votos

@pvlkmrv Es una forma muy indirecta de decirlo, en el vacío, $\mathbb{P}(y=1|x) > \mathbb{P}(y=0|x)$ que es lo que ya sabemos por la inspección. Pero si tenemos en cuenta todos los demás vectores de características y etiquetas, incluidos los de $z \neq x$ asociado a $y = [0.25, 0.75]$ Pero no es necesariamente cierto que el modelo produzca esa estimación, porque las etiquetas, las características y el modelo influyen en las probabilidades predichas.

1 votos

Me gusta esta explicación Confirma cómo estaba tratando de pensar en ello. Gracias. La naturaleza de este problema es el suministro de diferentes "tonos" de la clasificación binaria con el fin de informar al clasificador de los factores de confianza, que es lo que estoy tratando de encapsular, y lo has explicado muy bien.

0voto

aha Puntos 1

Como sólo tiene dos salidas A y B y 1 - A = B , puedes descartar una de ellas porque siempre puedes reconstruir cuál debe ser la otra a partir de una única respuesta.

Un clasificador considera que las clases son completamente disjuntas, que ningún par es más parecido que otro, así que no es exactamente lo que quieres. Es cierto que algunos clasificadores arrojan probabilidades o logaritmos de probabilidades, pero en realidad se trata de confidencias (¿cuál es la probabilidad de que la clasificación sea A ?), y quiere estar 100% seguro de que la respuesta es [0.5 0.5] no tener la confianza completamente dividida, que es lo que ocurriría si se entrenara como se esboza.

Si quieres que haya una relación entre los resultados que están "más cerca", entonces entrenaría un regresor univariante para llegar a ese valor. Como las respuestas son discretas, redondea el valor más cercano del conjunto de posibilidades.

-2voto

A Schembri Puntos 1

Vuelva a etiquetar sus datos de la siguiente manera:

[0.00, 1.00] = A
[0.25, 0.75] = B
[0.50, 0.50] = C
[0.75, 0.25] = D
[1.00, 0.00] = E

Y resolver un problema de varias clases utilizando la función objetivo = "multi:softmax" o "multi:softprob"

La pregunta que queda es ¿cómo va a evaluar su modelo?

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