¿Agregar penalizaciones al número de divisiones en la plataforma Partition para reducir el número de hojas?Recientemente he pasado mucho tiempo en la plataforma Partition y actualmente estoy buscando una forma de automatizar los análisis.
Mi problema es este: generalmente he estado dividiendo el conjunto de datos 50/50 entrenamiento / validación y presionando "Ir", lo que maximiza la validación RSquare. Pero, Esto a menudo conduce a modelos que tienen un mayor número de divisiones de las que son realmente creíbles. , por ejemplo, aquí donde crea 5 divisiones para llegar a Validation RSquare 0.288, cuando con solo usar dos divisiones obtendría un ajuste casi igualmente bueno de 0.27.

Como resultado, generalmente siempre tengo que podar manualmente las divisiones para obtener un RSquare de validación aceptablemente bueno con un número aceptablemente bajo de términos del modelo.
¿Hay alguna manera de pedirle a JMP que aplique una penalización y cree algún tipo de Validación RSquare "regularizada" que penalice los criterios de selección del modelo en función del número de divisiones? Por ejemplo, la Validación RSquare "regularizada" podría ser [Validation RSquare] - 0.05 * [N Splits]. O tal vez haya una mejor manera de regularizar (por ejemplo, continuar agregando términos si pueden modelar al menos el 5% de la varianza residual, en lugar del 5% de la varianza absoluta).
Las soluciones JSL son bienvenidas, ya que esto sería principalmente para análisis automatizados.
AnalíticaScriptingRe: ¿Agregar penalizaciones a la cantidad de divisiones en la plataforma de partición para reducir la cantidad de hojas?Hola @markschwab ,
Con respecto a su inquietud, ¿es que la cantidad de divisiones es realmente creíble o que es una cantidad razonablemente baja de divisiones? Creo que la cantidad de divisiones creíbles son las filas en la tabla de datos menos 1, pero no el 100% en eso.
De todos modos, incluyo un fragmento de código que puede usar para hacer su partición automatizada. Hice esto con el archivo Boston Housing.jmp.
Si está familiarizado con JSL, debería poder modificarlo según sus necesidades. El código es bastante básico, se supone que tiene una columna de respuesta continua numérica. Ejecuta la partición para la cantidad máxima de particiones que defina desde la primera ventana y luego guarda las estadísticas de partición. Puede crear fácilmente su propia fórmula de columna para tener una validación RSquare "penalizada", por ejemplo, o como desee penalizar la partición. A continuación, puede seleccionar qué partición es la mejor para sus criterios y volver a ejecutarla con el número fijo de divisiones que determine. Tengo algunas ideas sobre cómo inventar el programa, pero eso es para más adelante.
En una nota al margen, podría considerar la creación de una columna de validación (si no tiene Pro, puede hacerlo buscándola en el Índice de secuencias de comandos) y estratificando por su columna de respuesta, esto le dará a los conjuntos de capacitación / validación un más igualdad de representación cuando se trata de divisiones no 50/50. De esta manera, puede tener más datos para entrenar su partición.
¡Espero que esto ayude!,
DS
Names Default To Here( 1 );
lbWidth = 168;
//dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>Re: ¿Agregar penalizaciones a la cantidad de divisiones en la plataforma de partición para reducir la cantidad de hojas?Gracias @DiedrichSchmidt para la respuesta detallada! Me llevará algún tiempo digerir el guión.
Por ahora, ¿podría darme una introducción rápida con un ejemplo de cómo usarlo? Esto es lo que probé y recibo un error:
1) Quite el comentario de la línea "dt = Open (" $ SAMPLE_DATA / Boston Housing.jmp ");" y ejecuta el script
2) Haga clic en "Seleccionar tabla de datos" -> "Vivienda de Boston" -> Aceptar
3) En "Acción", haga clic en "Aceptar".
4) En la ventana "JSL para ayudar con la partición", lanzo "nox" a Y y "edad" a X, y presiono "Aceptar".
5) Veo la alerta JMP " Problema de subíndice {20} en el acceso o evaluación de 'w [Outline Box ("Partición para" || ycols [1])]', w [/ * ### * / Outline Box ("Partición para" || ycols [ 1])] ". La tabla "Partition_Results" es nula a excepción de la columna "Split" que va de 1 a 20.
Re: ¿Agregar penalizaciones a la cantidad de divisiones en la plataforma de partición para reducir la cantidad de hojas?Hola @markschwab ,
Está utilizando el código según lo previsto, acababa de hacer algunas conjeturas que no eran lo suficientemente genéricas para funcionar bajo ninguna circunstancia. Pensé que tenías una columna de validación, así que la escribí para que se ejecutara con una. el script actualizado a continuación soluciona eso al permitirle ingresar la parte de validación, al igual que en la ventana de la plataforma de partición. Pero no use tanto una columna de validación como una parte de validación: el script aún no se ha codificado para tener en cuenta eso y, nuevamente, no es lo suficientemente genérico para todas las posibles entradas del usuario.
En cuanto al error que estaba obteniendo, nuevamente fue porque asumí que había más de un factor X en el proceso y, por lo tanto, escribí la referencia a la ventana del informe en consecuencia. Eso ahora está arreglado para que no importe si solo hay 1 X o varias X.
Nuevamente, este script no es lo suficientemente genérico para tener en cuenta la columna de respuesta no numérica / no continua, Y. Si la respuesta es categórica, este script no está diseñado para dar cuenta de eso. Se puede modificar fácilmente para hacerlo si es necesario.
Espero que esto ayude,
DS
ACTUALIZACIÓN: Ok, no pude evitar codificar más e incluí algunas columnas RSquare penalizadas y una columna RSquare de validación de entrenamiento. Puede cambiar la fórmula y el coeficiente del cálculo penalizado editando el código; lo configuré según su concepto de Rsquare-0.05 * Split. Además de eso, también incluí un código para mostrar gráficamente los resultados cuando terminé de ejecutar los cálculos.
ACTUALIZACIÓN 2: Regresé e hice que el código fuera un poco más divertido: ahora puede ver los resultados de la tabla junto con los resultados del gráfico y, al seleccionar el punto del gráfico que más le gusta, puede volver a ejecutar la partición para ese número de divisiones al hacer clic en "Aceptar". Como antes, no lo he hecho supergenérico para ningún tipo de entrada de usuario, pero he intentado que funcione para respuestas numéricas / continuas. Lo que tienes ahora debería ser suficiente para ponerte en marcha.
PD A medida que aprenda el código, use el Índice de secuencias de comandos en el menú Ayuda de JMP. Es muy útil para comprender algunas de las llamadas y cómo usarlas al crear secuencias de comandos.
Names Default To Here( 1 );
lbWidth = 168;
dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
::max_spRecall = max_sp_input << get;
::partVPRecall = partVP_input << Get;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>