classification - multiple - regresion logistica ordinal
Cómo realizar una regresión logística mediante el uso de la vocal wabbit en un conjunto de datos muy desequilibrado (2)
Estoy tratando de usar el vocal wabbit para la regresión logística. No estoy seguro de si esta es la sintaxis correcta para hacerlo
For training, I do
./vw -d ~/Desktop/new_data.txt --passes 20 --binary --cache_file cache.txt -f lr.vw --loss_function logistic --l1 0.05
For testing I do
./vw -d ~/libsvm-3.18_test/matlab/new_data_test.txt --binary -t -i lr.vw -p predictions.txt -r raw_score.txt
Aquí hay un fragmento de mis datos de tren
-1:1.00038 | 110:0.30103 262:0.90309 689:1.20412 1103:0.477121 1286:1.5563 2663:0.30103 2667:0.30103 2715:4.63112 3012:0.30103 3113:8.38411 3119:4.62325 3382:1.07918 3666:1.20412 3728:5.14959 4029:0.30103 4596:0.30103
1:2601.25 | 32:2.03342 135:3.77379 146:3.19535 284:2.5563 408:0.30103 542:3.80618 669:1.07918 689:2.25527 880:0.30103 915:1.98227 1169:5.35371 1270:0.90309 1425:0.30103 1621:0.30103 1682:0.30103 1736:3.98227 1770:0.60206 1861:4.34341 1900:3.43136 1905:7.54141 1991:5.33791 2437:0.954243 2532:2.68664 3370:2.90309 3497:0.30103 3546:0.30103 3733:0.30103 3963:0.90309 4152:3.23754 4205:1.68124 4228:0.90309 4257:1.07918 4456:0.954243 4483:0.30103 4766:0.30103
Aquí hay un fragmento de mis datos de prueba
-1 | 110:0.90309 146:1.64345 543:0.30103 689:0.30103 1103:0.477121 1203:0.30103 1286:2.82737 1892:0.30103 2271:0.30103 2715:4.30449 3012:0.30103 3113:7.99039 3119:4.08814 3382:1.68124 3666:0.60206 3728:5.154 3960:0.778151 4309:0.30103 4596:0.30103 4648:0.477121
Sin embargo, si miro los resultados, las predicciones son todas -1 y las puntuaciones brutas son todas 0s. Tengo alrededor de 200,000 ejemplos, de los cuales 100 son +1 y el resto son -1. Para manejar estos datos desequilibrados, di el peso positivo de los ejemplos de 200,000 / 100 y el peso negativo del ejemplo de 200,000 / (200000-100). ¿Es porque mis datos están realmente muy desequilibrados, aunque ajusto las ponderaciones que esto está ocurriendo?
Esperaba la salida de (P (y | x)) en el archivo de puntuación sin procesar. Pero tengo todos los ceros. Solo necesito las salidas probabilísticas. ¿Alguna sugerencia de lo que está pasando chicos?
Resumiendo la respuesta detallada por arielf.
Es importante saber cuál es la función de costo final (pérdida) prevista: pérdida logística, pérdida 0/1 (es decir, precisión), puntaje F1, área bajo la curva RO, ¿otra cosa?
Aquí hay un código Bash para una parte de la respuesta de arielf. Tenga en cuenta que primero deberíamos eliminar los extraños intentos de ponderación de importancia de train.txt (me refiero a ": 1.00038 " y ": 2601.25" en la pregunta).
A. Prepare the training data grep ''^-1'' train.txt | shuf > neg.txt grep ''^1'' train.txt | shuf > p.txt for i in `seq 2000`; do cat p.txt; done > pos.txt paste -d ''/n'' neg.txt pos.txt > newtrain.txt B. Train model.vw # Note that passes=1 is the default. # With one pass, holdout_off is the default. `vw -d newtrain.txt --loss_function=logistic -f model.vw` #average loss = 0.0953586 C. Compute test loss using vw `vw -d test.txt -t -i model.vw --loss_function=logistic -r raw_predictions.txt` #average loss = 0.0649306 D. Compute AUROC using http://osmot.cs.cornell.edu/kddcup/software.html cut -d '' '' -f 1 test.txt | sed -e ''s/^-1/0/'' > gold.txt $VW_HOME/utl/logistic -0 raw_predictions.txt > probabilities.txt perf -ROC -files gold.txt probabilities.txt #ROC 0.83484 perf -ROC -plot roc -files gold.txt probabilities.txt | head -n -2 > graph echo ''plot "graph"'' | gnuplot -persist
Una pregunta similar fue publicada en la lista de correo de vw. Trataré de resumir los puntos principales en todas las respuestas aquí para el beneficio de futuros usuarios.
La formación desequilibrada establece las mejores prácticas:
Su conjunto de entrenamiento está altamente desequilibrado (200,000 a 100). Esto significa que solo 0.0005 (0.05%) de los ejemplos tienen una etiqueta de 1
. Al predecir siempre -1
, el clasificador logra una precisión notable de 99,95%. En otras palabras, si el costo de un falso positivo es igual al costo de un falso negativo, este es en realidad un excelente clasificador. Si está buscando un resultado de igual peso, debe hacer dos cosas:
- Vuelve a medir tus ejemplos para que el grupo más pequeño tenga el mismo peso que el más grande
- Reordenar / barajar los ejemplos para que los aspectos positivos y negativos se mezclen.
El segundo punto es especialmente importante en el aprendizaje en línea donde la tasa de aprendizaje decae con el tiempo. De ello se deduce que el orden ideal, suponiendo que se le permite reordenar libremente (por ejemplo, sin dependencia de tiempo entre los ejemplos), para el aprendizaje en línea es una mezcla completamente uniforme (1, -1, 1, -1, ...)
También tenga en cuenta que la sintaxis de los pesos de ejemplo (suponiendo una proporción de prevalencia de 2000: 1) debe ser algo como lo siguiente:
1 2000 optional-tag| features ...
-1 1 optional-tag| features ...
Y como se mencionó anteriormente, descomponer el ejemplo ponderado de 2000
solo para tener solo un peso de 1
mientras se repite 2000 veces e intercalarlo con los 2000 ejemplos comunes (aquellos con la etiqueta -1
) en su lugar:
1 | ...
-1 | ...
1 | ... # repeated, very rare, example
-1 | ...
1 | ... # repeated, very rare, example
Debería dar lugar a mejores resultados en términos de convergencia más suave y menor pérdida de entrenamiento. * Advertencia: como regla general, repetir cualquier ejemplo demasiado, como en el caso de una relación 1: 2000, es muy probable que conduzca a un ajuste excesivo de la clase repetida. Es posible que desee contrarrestar eso mediante un aprendizaje más lento (utilizando --learning_rate ...
) y / o un muestreo aleatorio: (utilizando --bootstrap ...
)
Considere reducir el tamaño de la clase prevalente
Para evitar el ajuste excesivo: en lugar de sobreponderar la clase rara en 2000x, considere ir por el camino opuesto e "infraponderar" la clase más común desechando la mayoría de sus ejemplos. Si bien esto puede sonar sorprendente (¿de qué manera puede ser beneficioso arrojar datos que son perfectamente buenos?) Evitará el ajuste excesivo de la clase repetida como se describió anteriormente, y en realidad podría conducir a una mejor generalización . Dependiendo del caso, y los costos de una clasificación falsa, el factor de muestreo descendente óptimo puede variar (no es necesariamente 1/2000 en este caso, pero puede estar en cualquier lugar entre 1 y 1/2000). Otro enfoque que requiere cierta programación es usar el aprendizaje activo: capacitar en una parte muy pequeña de los datos, luego continuar prediciendo la clase sin aprendizaje ( -t
o peso cero); si la clase es la clase prevalente y el clasificador en línea está muy seguro del resultado (el valor pronosticado es extremo, o muy cercano a -1
cuando se usa --link glf1
), deseche el ejemplo redundante. IOW: enfoca tu entrenamiento solo en los casos de frontera .
Uso de --binary
(depende de su necesidad)
--binary
genera el signo de la predicción (y calcula la pérdida progresiva en consecuencia). Si desea probabilidades, no use --binary
y pipe vw
prediction output en utl/logistic
(en el árbol de origen). utl/logistic
la predicción bruta en probabilidades firmadas en el rango [-1, +1]
.
Un efecto de --binary
es la --binary
engañosa (optimista). Fijar las predicciones a {-1, +1}, puede aumentar dramáticamente la precisión aparente , ya que cada predicción correcta tiene una pérdida de 0.0. Esto puede ser engañoso, ya que simplemente agregar --binary
menudo hace que parezca que el modelo es mucho más preciso (a veces perfectamente preciso) que sin --binary
.
Actualización (septiembre de 2014): recientemente se agregó una nueva opción a vw
: --link logistic
que implementa el mapeo [0,1]
, mientras predice, dentro de vw
. De manera similar, --link glf1
implementa el mapeo [-1, 1]
más se necesita. mnemónico: glf1
significa "función logística generalizada con un rango [-1, 1]
"
Ir fácil en --l1
y --l2
Es un error común usar --l1
altos de --l1
y / o --l2
. Los valores se utilizan directamente por ejemplo, en lugar de, digamos, en relación con 1.0
. Más precisamente: en vw
: l1
y l2
aplican directamente a la suma de gradientes (o la "norma") en cada ejemplo. Trate de usar valores mucho más bajos, como --l1 1e-8
. utl/vw-hypersearch
puede ayudarlo a encontrar valores óptimos de varios hiper-parámetros.
Ten cuidado con los pases múltiples
Es un error común usar - --passes 20
para minimizar el error de entrenamiento. Recuerde que el objetivo es minimizar el error de generalización en lugar del error de entrenamiento. Incluso con la adición fresca de holdout
(gracias a Zhen Qin), donde vw
finaliza de forma automática cuando el error deja de aparecer en los datos retenidos automáticamente (de forma predeterminada, cada décimo ejemplo se está reteniendo), los pases múltiples eventualmente comenzarán de nuevo. -Ajustar los datos retenidos (el principio de "no comer gratis").