Hola a todos
Soy Yusuke Ono, tester en JMP Japón.
Me parece que cuando se usa la validación de k-fold, los valores predichos a veces se vuelven muy ruidosos. Vea la captura de pantalla a continuación. Esta es una gráfica de valores predichos para un modelo con una variable X. Se utiliza la validación de 5 veces.

Me gustaría sugerir que los valores predichos se calculen simplemente como se muestra a continuación.
(0 + :Name( "y Predictor FoldA==1" ) + :Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) + :Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
La fórmula de predicción actual es la siguiente.
If( :N Val > 0,
(0 + :Name( "FoldA==1" ) * :Name( "y Predictor FoldA==1" ) + :Name( "FoldA==2" )
* :Name( "y Predictor FoldA==2" ) + :Name( "FoldA==3" ) *
:Name( "y Predictor FoldA==3" ) + :Name( "FoldA==4" ) *
:Name( "y Predictor FoldA==4" ) + :Name( "FoldA==5" ) *
:Name( "y Predictor FoldA==5" )) / :N Val,
(0 + (1 - :Name( "FoldA==1" )) * :Name( "y Predictor FoldA==1" ) + (1 -
:Name( "FoldA==2" )) * :Name( "y Predictor FoldA==2" ) + (1 -
:Name( "FoldA==3" )) * :Name( "y Predictor FoldA==3" ) + (1 -
:Name( "FoldA==4" )) * :Name( "y Predictor FoldA==4" ) + (1 -
:Name( "FoldA==5" )) * :Name( "y Predictor FoldA==5" )) / :N Trn
);
¿Podrías decirme tu opinión?
Pasos para reproducir este fenómeno
(1) Ejecute el siguiente script para crear un conjunto de datos de muestra.
Names Default To Here(1);
Random Reset(111111111);
n = 10000;
x = J(n, 1, Random Uniform(-10, 10));
y = Sin(x) + J(n, 1, Random Normal());
As Table(x||y,<<COLUMN names=""></COLUMN>
(2) Seleccione [Complementos] > [XGBoost] > [Hacer columnas K-Fold] .
2-1. Escriba "1" para [Número de columnas K-Fold para crear] .
2-2. Especifique "y" para [Y, respuesta] .
2-3. Hacer clic [Vamos] .
(3) Ejecute el siguiente script.
XGBoost(
Y( :y ), X( :x ),
Validation( :FoldA ),
Fit( max_depth( 3 ), alpha( 10 ), lambda( 10 ), iterations( 50 ) ),
);
(4) Seleccione [Guardar fórmula de predicción] en el menú del triángulo rojo en el contorno del "Modelo 1".
(5) Ejecute el siguiente script para ver los valores predichos guardados.
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y Predictor ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
(6) Ejecute el siguiente script para ver el diagrama de mi sugerencia.
New Column( "My Suggestion",
Formula(
(:Name( "y Predictor FoldA==1" ) +
:Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) +
:Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
)
);
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :My Suggestion ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
La tabla de datos adjunta tiene estos resultados. Ejecute los scripts de la tabla para ver los gráficos.
Gracias por su opinión de antemano.
Estas son buenas preguntas para hacerle a Yusuke. Si dividimos el proceso general en dos pasos principales, el primero es determinar uno o más modelos XGBoost razonables. Para esta validación cruzada de k-fold o algo similar es invaluable. El segundo es hacer predicciones, y dividámoslo en hacer predicciones sobre los datos de entrenamiento actuales y sobre nuevos datos de prueba. Para las predicciones sobre los datos de entrenamiento, el uso de cualquier modelo que haya sido entrenado con los mismos datos dará como resultado predicciones que suelen estar sobreajustadas y poco realistas, por lo que las predicciones fuera de línea tienen más sentido. Para nuevos datos de prueba, promediar las predicciones de todos los modelos que no han visto que los datos son buenos como sugirió. (De hecho, el complemento ya hace esto para todas las filas en las que falta Y). También está bien realizar un ajuste final posterior a los datos completos sin validación, utilizando parámetros determinados por validación cruzada. Mi experiencia ha sido que las predicciones de promediar k veces ("ensacado") y las de un ajuste de datos completos tienden a ser muy similares, aunque incluso podría promediarlas, por ejemplo 0.5 * (predicciones de k-veces empaquetadas) + 0,5 * (predicciones del ajuste completo de datos). No creo que valga la pena intentar encontrar el "mejor" entre los ajustes del modelo k-fold, ya que son operacionalmente equivalentes y se corre el riesgo de sobreajustar con tal elección.
Gracias por tu respuesta, Russ.
Ahora entiendo que estas predicciones de desdoblamiento de XGBoost de JMP se pueden usar para evaluar modelos, detectar valores atípicos y hacer modelos de conjuntos.
Creo que hay varias formas de crear modelos predictivos finales cuando usamos k validación cruzada.
- Reajuste un modelo con los parámetros de ajuste seleccionados para todos los datos. (
- Modelos k promedio. (
- Utilice sólo el "mejor" modelo entre k modelos.
¿Cree que el primer método suele ser mejor que el segundo y el tercero para obtener un modelo predictivo final?
Gracias Yusuke por la pregunta y muy buena descripción de cómo reproducirlo con JSL. Ha encontrado una diferencia importante entre la forma en que funciona el complemento al calcular los valores predichos en comparación con otras plataformas de modelado predictivo en JMP. Las predicciones del complemento están "fuera del pliegue", es decir, cada valor predicho se calcula solo a partir de los ajustes del modelo que excluyen esa observación.
Tome 5 veces básico como ejemplo y suponga que la primera fila de los datos está asignada a 3 veces. El complemento se ajusta a cinco modelos, manteniendo cada pliegue por turno, pero el valor predicho para esa primera fila solo se basará en el tercer ajuste que excluye el pliegue 3. Se utiliza una lógica similar para todas las filas. ¿Por qué hacer esto? Muchas rasones:
1. Las predicciones fuera del pliegue proporcionan una evaluación realista de cómo funcionará el modelo en datos futuros no vistos. De hecho, todas las estadísticas y gráficos de salida etiquetados como "Validación" se basan en las predicciones fuera del pliegue. Como ha observado, la variabilidad de estas predicciones puede ser mucho mayor que las predicciones calculadas con datos "in-fold", es decir, cuando se utilizan los mismos datos para el entrenamiento y la predicción.
2. La columna de predicción fuera del pliegue es una excelente manera de buscar valores atípicos y errores que puede haber cometido el modelo en todo el conjunto de entrenamiento. K-fold es bueno porque cada observación se realiza exactamente una vez y, por lo tanto, tenemos una predicción fuera del pliegue para cada fila.
3. La columna de predicción de desdoblamiento se puede usar para ensamblar con columnas similares creadas a partir de otros buenos modelos. Esto se puede hacer simplemente promediando o usando las columnas fuera del pliegue como nuevos predictores en un modelo de segundo nivel en una técnica a menudo llamada "apilamiento". El modelo de segundo nivel suele ser más simple que los modelos de primer nivel, por ejemplo, un modelo de lazo de Regresión generalizada o incluso otro modelo XGBoost con menor profundidad. Los modelos de conjuntos apilados tienden a tener un mejor rendimiento predictivo que cualquiera de los modelos de primer nivel.
Para obtener las predicciones sencillas basadas en entrenamiento que sugiere, una buena manera es ajustar un nuevo modelo XGBoost sin una columna de Validación especificada. Otra forma relacionada es hacer una copia de la tabla de datos, establecer todos los valores de Y como perdidos y concatenarlos con los datos originales. En este caso, las predicciones para las filas en las que faltan Y serán el promedio de predicciones en todos los modelos ajustados, una técnica denominada "ensacado".
Por último, quería mencionar que la fórmula compleja que muestra es el resultado de cubrir todos los casos. Por ejemplo, si a una fila de los datos originales le falta una Y, entonces queremos usar la predicción empaquetada en todos los modelos.