construir múltiples modelos de redes neuronalesEstoy usando la plataforma neuronal para hacer predicciones y, como soy nuevo en las redes neuronales, estoy ligeramente familiarizado con todos los parámetros de entrada: número de capas ocultas, número de nodos/capa oculta, modelos de impulso, tasa de aprendizaje y recorridos. Lo que quiero hacer es intentar minimizar el RMSE y la tasa de clasificación errónea del modelo de validación. Lo que he estado haciendo es cambiar iterativamente cada parámetro uno por uno, guardar los parámetros de rendimiento del modelo y pegarlos en una nueva tabla JMP, pero esto llevará días ya que hay tantas combinaciones de capas, nodos, recorridos, etc. ¿Sería posible escribir un script en el que JMP Pro construya, digamos, 1000 modelos y vuelque los datos en una tabla para que no tenga que cambiar manualmente cada parámetro de entrada del modelo?
#Capas ocultas: 1 o 2
#Nodos sigmoidales: 0, 1, 2, 3 o 4
#Nodos lineales: 0, 1, 2, 3 o 4
#Nodos radiales: 0, 1, 2, 3 o 4
#modelos de impulso: ni idea, ¿1-5 tal vez?
#tasa de aprendizaje: 0-0,5 en incrementos de 0,1
#tours: 1, 5, 10, 20, 100
Entonces eso sería 2 x 5 x 5 x 5 x 5 x 5 x 5 = ~ 30,000.
Supongo que podría reducir algunos de estos una vez que esté más familiarizado con el conjunto de datos. Por supuesto, tener muchos nodos y una gran cantidad de modelos de refuerzo no tiene sentido (ni tampoco otras combinaciones), pero todavía estamos hablando de cientos de modelos potenciales que vale la pena probar. Seguramente este tipo de selección/comparación de modelos podría programarse, ¿verdad?
Modelado predictivo y aprendizaje automáticoRe: construir múltiples modelos de redes neuronales@SDF1 Vi tu mensaje, pero recibí un mensaje de error extraño al intentar responder: abm64@miami.edu .
Por cierto, después de semanas de no usarlo, la última versión de la GUI ahora funciona en mi Macbook Pro de 16 pulgadas sin ninguno de esos problemas relacionados con el cuadro de límites (usando Y continua y categórica con todos los diferentes tipos de validación). No recuerdo haber actualizado nada en mi computadora, pero bueno, me alegra que también funcione en esta computadora (siempre funcionó en mi Macbook Air, ¡está en sus últimas!).
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Interesante, bueno, ciertamente parece que este problema está realmente relacionado con la Macbook Pro (y quizás con el sistema operativo que está ejecutando). Posiblemente podría estar relacionado con el sistema operativo o incluso con el hardware, por ejemplo, la forma en que JMP usa la unidad de procesamiento de gráficos en un Pro es de alguna manera diferente a cómo la usa en un Air. Tal vez verifique si Mac fabricó las dos computadoras con la misma GPU o si podría haber un problema de hardware. En cualquier caso, me imagino que los desarrolladores de JMP querrían saber más sobre los detalles específicos a los que se enfrenta, y sería útil comunicárselos en la Cumbre Discover. ¡Al menos no es mi incompetencia! 
Me alegra que todavía puedas ejecutarlo en tu Air. Espero que tu Air siga funcionando para que puedas hacer tu video y enviarlo a la Cumbre. Déjame saber cuál es tu horario para la charla, me gustaría verla.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronales¿Sabes lo que he estado aprendiendo esta semana, que es literalmente la mayor cantidad de tiempo que he pasado en mi Macbook Pro de trabajo? Hay MUCHOS errores pequeños, molestos, pero en su mayoría triviales, en JMP Pro 16.1 que están completamente ausentes en mi Macbook Air. Y todos tienen que ver con la estética. Por ejemplo, ¿sabe cómo puede agrupar scripts a la izquierda y luego hacer clic para expandir la carpeta agrupada? Eso no funciona. Bueno, a veces funciona. Debe hacer clic en la flecha de expandir, luego hacer clic en otro lugar de la pantalla, regresar, hacer clic nuevamente y finalmente se expandirá. Hay otras cosas pequeñas y raras como estas que nunca noté en el mismo sistema operativo y la misma versión de JMP Pro en mi otra Mac, por lo que debe haber algún problema con JMP y esta computadora en particular comunicándose entre sí, lo que luego afecta su secuencia de comandos. ya que parece tener algo que ver con la apariencia. En otras palabras, no creo que sea por tu incompetencia, jaja, y espero seguir usando la nueva GUI en mi otra computadora. De hecho, está ejecutando 2000 modelos NN mientras escribo esto en la computadora de mi trabajo. Solo necesito resolver estos problemas de Macbook Pro dada la naturaleza decadente de mi Macbook Air. De hecho, puedo empezar a registrar todos estos pequeños errores y peculiaridades e intentar hablar con algunos desarrolladores en Discovery Summit. Me pregunto si es realmente MI computadora o un problema general de Macbook Pro. No quiero actualizar al sistema operativo Mac más nuevo (Big Sur), pero me pregunto si esta podría ser la solución.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Lamento saber que continúa recibiendo el error. El archivo "GenAT_ver3.0.jsl" que subí es el que estoy usando. Lo probé en mi trabajo (JMP 16.0 Pro) y en mi PC personal (JMP EA17), y funciona en ambos. No recibo el error en ninguna de las PC cuando intento ajustar sus datos. Debe ser algo sobre cómo la Macbook Pro maneja la ventana del informe de ajuste. No sé cómo solucionarlo sin tener acceso a la computadora específica. Tendría que mirar la estructura de árbol de la ventana del informe e intentar descubrir cuál es la diferencia entre una PC, una Macbook y una Macbook Pro.
Regresé y miré más de cerca su archivo de registro y pensé que tal vez era algo sobre el DOE específico que generó, pero incluso cuando ejecuto ese DOE y hago una tabla de sintonización basada en él, funciona. Al menos funciona en las PC que estoy usando.
Eso es una lástima, ya que parece que es posible que no puedas hacer una demostración de la GUI para tu charla si no se está ejecutando en la Macbook Pro. Ojalá pudiera ser de más ayuda en este tema.
DS
Re: construir múltiples modelos de redes neuronalesOtra cosa que podría ser informativa: incluso si tengo una Y continua, recibo el mismo mensaje (independientemente del tipo de validación). ¡Extraño!
Re: construir múltiples modelos de redes neuronalesLo probé en la Macbook Pro y obtuve el mismo error de cuadro de esquema/arg 1, pero noté algo: la versión de julio se llamaba "3.0". ¿Crees que lo actualizaste pero luego subiste accidentalmente la versión anterior?
Re: construir múltiples modelos de redes neuronales¡Impresionante! Déjame Pruébalo ahora e infórmanos. Resulta que el soporte de JMP llegó a la misma conclusión, por lo que estoy seguro de que funcionará ahora.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Gracias por los archivos, me ayudó a descubrir de dónde venían los errores. Tiene que ver con mi programación mediocre y mi completo conocimiento de las estructuras de árbol dentro de JMP (soy autodidacta en esto). De todos modos, la fecha de la última versión es casi correcta, actualicé las cosas a principios de julio para tener en cuenta el hecho de que las estadísticas de ajuste cambian su posición en la estructura de árbol según el tipo de datos de modelado que sean los valores Y, por ejemplo, numéricos. , ordinal o categórico. Trabajo con respuestas puramente numéricas casi el 100% del tiempo, por lo que no veo este error con regularidad. Para proporcionar correctamente información sobre las estadísticas de ajuste para otros tipos de datos de modelado, necesitaba modificar la forma en que asigna esa variable. Afortunadamente, todo era bastante lógico por parte de JMP, por lo que las modificaciones no fueron tan difíciles.
Se adjunta la versión 3.0 que debería solucionar este problema sin importar el sistema operativo o la versión de JMP que tenga. No creo que el soporte pueda ayudar mucho ya que, en cierto sentido, se trata de un código de "terceros". De todos modos, pruebe esta versión 3.0 y avíseme si continúa comportándose mal.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronalesProbé JMP Pro 15 y todavía recibí el mismo mensaje de error:
carácter esperado arg 1 en el acceso o evaluación de 'Outline Box', Outline Box/*###*/(o_box)
Estoy usando la versión 3 de la GUI desde aproximadamente el 10 de julio. Ese fue el más reciente, ¿verdad?
Cuando ejecuté el depurador, me dijo: "Object Button Box no reconoce el mensaje enviado; tal vez te refieres a uno de estos..." y luego enumera algunas alternativas. Pero el cuadro de botones se forma bien y todos los botones funcionan.
Creo que el argumento de la estructura de árbol PODRÍA ser el problema, pero es el mismo sistema operativo (Catalina). Voy a comunicarme con el soporte técnico.
Re: construir múltiples modelos de redes neuronalesAdjunto el registro y la tabla con la GUI (el último script). Probé todos los tipos de validación que tenían sentido para varias de las cosas que intento predecir (las Y). Normalmente, haría todo en mi Macbook personal (donde todo funciona), pero a esa computadora le faltan semanas para morder el polvo, así que espero poder hacer que todo funcione en esta Macbook Pro más nueva y mejor. Mientras tanto, voy a probar algunas cosas. Existe una pequeña posibilidad de que haya copiado una versión anterior de la GUI (que aún tenía errores), lo cual sería una solución sencilla, aunque no creo que ese sea el problema ya que, de todos modos, funcionó en el otro computadora. Tendré curiosidad si encuentras algo extraño y gracias de nuevo por investigar esto.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Debo decir que es un comportamiento extraño que funcione con un Air y no con un Pro. Si no recuerdo mal, esa llamada a o_box es para extraer algunas de las estadísticas del ajuste y puede cambiar según el tipo de método de validación que esté utilizando: retención, filas excluidas, etc. No parece que sea una versión JMP ya que estás ejecutando 16.1 en ambos. ¿Está utilizando el mismo método de validación para ambas computadoras? ¿Qué método(s) estás usando?
Mi única suposición es que si no funciona de un modelo de Macbook a otro, debe haber un cambio en la estructura de árbol del informe y el código JSL busca un valor para estar en una ubicación específica, pero regresa. vacío o NAN, o algo así y arroja el error. Esto tal vez esté un poco más allá de mis habilidades de codificación; hacerlo independiente del sistema operativo podría estar más allá de mi alcance. Lo estoy ejecutando en una PC, Windows10. No tengo ninguna duda de que hay programadores más capacitados en JMP que podrían descubrir cómo solucionar este problema para que pueda ejecutarse en diferentes sistemas operativos, etc.
Si puedo reproducir el error, entonces me resultará relativamente fácil solucionarlo, pero no tengo acceso a la Macbook Pro. Mientras tanto, ¿puedes ejecutarlo en la Macbook Pro y verificar el archivo de registro para ver si te indica en qué línea de código se está descomponiendo? Esto podría ayudarme a delimitar la ubicación del error y tal vez ver cómo solucionarlo.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronalesGRAMO r comer. Muchas gracias. Noté algo wei Tercero hoy: en mi Macbook Air de 13 pulgadas con Catalina y JMP Pro 16.1, todo funciona. Luego migré a mi Macbook Pro de 16 pulgadas de trabajo, que también ejecuta Catalina y JMP Pro 16.1, usé exactamente la misma tabla de datos y su GUI, y obtengo ese extraño "carácter esperado arg 1 en el acceso o evaluación del 'Cuadro de esquema'. , Outline Box/*###*/(o_box)" independientemente de lo que introduzca. ¿Crees que realmente podría estar vinculado a la pantalla (es decir, a la pantalla más grande)? Seguramente no. Parece extraño que un script se ejecute en una computadora y no en la otra. ¿Algunas ideas?
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
No hay problema, me alegra que pueda ayudar. Sí, ajustar el XGBoost puede ser un poco más complicado. encontré un blog aquí eso es muy útil: la última entrada del blog en esa página, pero por alguna razón el enlace al artículo del blog realmente no responde. Da un ejemplo de cómo se puede hacer en Python, pero es esencialmente lo mismo en JMP, una vez que haya descubierto la jerga de los parámetros del modelo. También encontré esto sitio y la documentación adjunta MUY útil para leer sobre lo que hace XGBoost y qué parámetros lo hacen más o menos conservador de un modelo. Una cosa que me gusta de él es que es mucho más estable que un árbol impulsado o un bosque aleatorio. Ambos tienen cierto comportamiento estocástico en R^2, lo que da como resultado modelos que difieren ligeramente cada vez que se ejecuta el ajuste con todos los parámetros iguales. XGBoost le brinda la misma calidad de ajuste cada vez que ejecuta el mismo conjunto de parámetros.
No dude en mencionar la GUI de NN en su charla de descubrimiento. Planeo asistir virtualmente e iba a intentar asistir a la visita en persona en Cary (estoy a solo una hora de distancia), pero creo que con la Debido a los continuos problemas de la pandemia, suspendieron la reunión en persona. Publiqué la GUI en la página de complementos, así que técnicamente, supongo que está "publicada" y disponible. Gracias por preguntar y pensar en tal vez incluso hacer una demostración. ¡Espero que funcione sin problemas! No soy el mejor programador, pero puedo hacer que las cosas funcionen. Si tiene algún problema, hágamelo saber e intentaré corregirlo lo antes posible.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronales¡Guau! Muchas gracias por r la tabla y la explicación. Estaba pensando que, dado que finalmente estoy familiarizado con toda la jerga NN, XGBoost sería muy sencillo, ¡pero parece que todavía tengo mucho que aprender (solo para entender la jerga para empezar)! Parece que XGBoost es una especie de "favorito" del mundo del aprendizaje automático en este momento, pero, lo que es más importante, en realidad podría ser más adecuado para los tipos de datos que genero, por lo que definitivamente necesito profundizar en todo esto (por ejemplo, mientras su GUI se ejecuta en segundo plano). Hablando de eso, ¿te importaría si menciono la GUI de NN, y muy probablemente incluso la haga una demostración, en mi charla sobre JMP Discovery (que estoy grabando esta semana)? Me aseguraría de darte crédito, pero entiendo totalmente si quieres ser tú quien lo revele a una audiencia más amplia y no quieres "robarte el protagonismo". Estaría usando la plataforma neuronal solo porque dudo que sea el maestro de XGBoost el viernes (cuando grabe la charla), jaja.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Todavía no he actualizado a 16.1, por lo que no he experimentado el mismo error; sin embargo, mantendré los ojos abiertos en caso de que suceda y publicaré alguna actualización si es necesario.
En cuanto a XGBoost, tengo una tabla de ajuste para optimizarlo. Está adjunto aquí. La plataforma XGBoost tiene muchos parámetros de ajuste diferentes que se pueden modificar. Algunos son más influyentes que otros. Normalmente sigo un ajuste paso a paso del modelo porque es un espacio de parámetros muy grande. No tengo todos los parámetros posibles para la tabla de ajuste, sólo los más influyentes (siempre puedes agregar más con las columnas de nombres apropiados). Puede acceder a la lista completa de parámetros en la plataforma abriendo el submenú "Opciones avanzadas" en la ventana XGBoost. Como mencionaste que tienes un conjunto de datos muy desequilibrado, querrás asegurarte de que el parámetro scale_pos_weight esté establecido en 1.
De hecho, incluso puede ejecutar un diseño de ajuste desde la propia plataforma, donde utilizará el DOE de relleno de espacio para generar la tabla de ajuste. Es bastante práctico y flexible. Sin embargo, encuentro que para el uso de la CPU y la minimización de la RAM, ejecutarlo como funciona mi GUI es mejor desde JMP.
Descubrí que para mis situaciones, seguir estos pasos funciona muy bien para XGBoost:
1. Corrija la tasa de aprendizaje, max_profundidad, min_child_weight, gamma, subsample y colsample_bytree para encontrar primero la cantidad correcta de árboles. Estos otros parámetros se ajustarán más adelante. Al principio los configuré a sus valores predeterminados.
2. Ajuste max_profundidad y min_child_weight
3. Ajuste la gamma (es una buena idea volver a ajustar el número de árboles antes de pasar al paso 4)
4. Ajuste la submuestra y colsample_bytree
5 Tune alpha y lambda, los parámetros de regularización
6. Ajustar la tasa de aprendizaje: reduzca la tasa de aprendizaje y aumente la cantidad de árboles.
En cada paso, genero una tabla de sintonización para el parámetro que deseo sintonizar mientras mantengo los demás fijos en lo que eran para ese paso. Normalmente repito esta secuencia dos veces. Es fundamental que utilice validación cruzada (ya sea K-fold o columna de validación) cuando ejecute XGBoost. Puede ejecutar el ajuste sin validación cruzada, pero luego corre el riesgo de sobreajustar los datos y no tener un modelo predictivo tan bueno al final.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesNo importa el punto número 1. Creo que fue algo extraño por mi parte, o que se realizó una estratificación adecuada de las muestras en entrenamiento, validación y prueba. Básicamente, tengo un diseño totalmente desequilibrado en el que un grupo que intento predecir es mucho más común, así que creo que esto está causando el problema.
Re: construir múltiples modelos de redes neuronalesComencé a usar su GUI NN nuevamente después de actualizar a JMP Po 16.1 y dije que aparecía nuevamente el error de "rango de subíndices". ¿Ha encontrado este problema?
Por otra parte, ¿tiene un script DOE para la tabla de ajuste XGBoost? ¡También voy a explorar ese enfoque con su GUI! Muchas gracias
Re: construir múltiples modelos de redes neuronalesMuchas gracias por toda la información. De hecho, habría intentado construir toneladas de modelos sin tener idea de lo que estaba haciendo. Hace dos años hice esto con otro enfoque y estaba a punto de intentar escribir un artículo en Nature, pensando que había cambiado la biología marina tal como la conocemos, antes de darme cuenta de que estaba interpretando el modelo de manera completamente incorrecta, jaja. Afortunadamente, la IA y los modelos de aprendizaje automático están de moda en el momento en el que trabajo, así que, aunque mi motivación para usarlos fue impulsada por los enfoques tradicionales que NO son suficientes (en lugar de querer hacer IA porque es "sexy") Espero poder aprovechar esta ola de interés en este tipo de análisis para intentar conocer todos los entresijos.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
En cuanto al complemento XGBoost, deberá descargarlo e instalarlo por separado. Funciona desde JMP Pro 15 en adelante. Puedes encontrar el complemento. aquí . Asegúrese de leer la documentación y probar algunos de los modelos de prueba que Russ explica en la publicación antes de continuar con su propio modelado. En este momento, esa plataforma todavía requiere un poco más de comprensión por parte del usuario sobre cómo modificar/manipular los hiperparámetros del ajuste. encontré esto Blog resulta muy útil cuando se trata de ajustar la plataforma XGBoost (hay MUCHOS parámetros diferentes para ajustar, lo que hace que todo el espacio sea bastante engorroso). Aunque está escrito para usuarios de Python, la misma idea básica funciona bien para la plataforma JMP. Este video También es útil, y también querrás leer sobre qué hace cada parámetro en el modelo, cuáles son sus rangos de trabajo y por qué puedes o no querer modificarlo del valor predeterminado. aquí . Definitivamente no es una plataforma en la que simplemente sumergirse sin hacer algunos deberes previos. Descubrí esto de la manera más difícil al sumergirme primero y me di cuenta de que no sabía lo que estaba haciendo. Así que hice algunos deberes y me ayudó mucho. Ahora puedo ajustar modelos con bastante rapidez utilizando el marco del blog que mencioné anteriormente.
¡Buena suerte!,
DS
Re: construir múltiples modelos de redes neuronalesMuchas gracias por explicar eso y me alegro de haber preguntado porque mi suposición era incorrecta. Sin embargo, tiene más sentido que cada "ejecución" sea una mezcla aleatoria en términos de qué muestras están en el modelo de entrenamiento y cuáles se retienen. Como dijiste antes, con mi conjunto de datos pequeño y amplio, tiene más sentido excluir filas manualmente o crear una columna de validación, así que realmente solo estoy tratando de asegurarme de "dominar" todas las opciones, ya que espero que en el En el futuro, tendré un conjunto de datos en el que se podrían emplear retención y kfold. Especialmente creo que este último es atractivo/inteligente.
Tengo unos 15.000 modelos con su GUI, no exagero. Ahora creo que voy a jugar a comparar NN con XGBoost, una técnica de la que nunca había oído hablar hasta su GUI. ¡Ni siquiera sé si está en JMP Pro 16 (aunque tal vez esté escondido en alguna parte)!
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Perdón por responder tarde, estuve de vacaciones la semana pasada.
Con respecto a su pregunta sobre la parte de retención, tengo entendido que JMP seleccionará aleatoriamente el porcentaje de filas en función de su valor de retención. Entonces, si tiene 100 filas y selecciona 0,3 como parte de retención, cada vez que JMP ejecute la plataforma NN, seleccionará un nuevo conjunto aleatorio de 30 filas como parte de validación. Entonces, en términos de uso de la tabla de ajuste, la plataforma se denomina cada iteración en la que envía a la plataforma NN un nuevo conjunto de parámetros del modelo. Si eligió la opción de retención para la validación y puso un número entre 0 y 1, en cada nueva ejecución en la tabla de ajuste, JMP seleccionará un conjunto diferente de filas de acuerdo con la parte de retención. Sin embargo, si ejecuta varios recorridos durante un único ajuste del modelo NN, utilizará las mismas filas de retención durante cada recorrido. Cada vez que se llama a la plataforma NN, generará un nuevo subconjunto para su validación. Esto es lo que entiendo, al menos.
Para la situación anterior, no es posible saber qué filas se retienen (al menos no que yo sepa). Si quisiera hacer algo así, elegiría la opción de validación de retención de filas excluidas. Luego puede seleccionar qué filas de su tabla de datos deben excluirse y solo esas se usarán para la validación. Presumiblemente, podría alimentar a la plataforma NN con una semilla aleatoria específica, digamos 10191, para cada ejecución de ajuste con una porción de retención y usará ese número aleatorio cada vez para generar el subconjunto para la validación. Dado que se parte de la misma semilla aleatoria cada vez que se llama a la plataforma NN, en teoría, JMP debería terminar seleccionando las mismas filas para cada ejecución de ajuste. Sin embargo, en este caso aún no sabrías qué filas eran. Nuevamente, esta es mi comprensión de cómo funciona.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesAhora he ejecutado literalmente 10.000 modelos impares gracias a su GUI épica. Tenía una pregunta sobre la retención. Digamos que mi tabla de sintonización tiene 100 filas (es decir, diferentes modelos para probar). ¿Cada fila recibe una retención aleatoria basada en el porcentaje o se retiene el mismo número X de muestras para cada modelo? Supongo que es lo último. En otras palabras, si las muestras A, B, C y D se retienen del modelo n.° 1, esas mismas cuatro muestras se retienen del modelo n.° 2. Supongo que, independientemente, mi pregunta de seguimiento sería: ¿es posible SABER qué muestras se retienen? En cualquier caso, como comentamos, en mi caso tener una columna de validación estratificada realmente tiene más sentido porque puedo asegurar que al menos una muestra de cada tratamiento se incluya como entrenamiento, validación y prueba, mientras que una retención aleatoria del 30% podría teóricamente SÓLO retenga muestras del MISMO tratamiento (¡lo que sesgaría la predicción a favor de dicho tratamiento!
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Me alegra mucho saber que está funcionando para usted y espero que los errores se hayan solucionado. Desearía tener una mejor solución para el problema de la tabla de datos de la parte superior de la pila. Sinceramente, no sé cómo solucionarlo.
De todos modos, creo que tienes razón acerca de la validación de Kfold. Ese método normalmente funciona mejor con mesas altas y no tan bien con mesas anchas. Si tiene muy pocas entradas de datos, entonces es una buena idea utilizar una columna de validación estratificada según la respuesta. O, si utiliza la plataforma GenReg, puede utilizar el enfoque de dejar uno fuera. Pero, por lo general, Kfold no es el mejor si tiene pocos puntos de datos para considerar.
Definitivamente recomendaría buscar en XGBoost; puede descargar el complemento desde la página de complementos en JMP. Es un algoritmo muy estable y robusto. XGBoost funciona muy bien con una columna de validación.
También podría considerar buscar máquinas de vectores de soporte, que tiene JMP Pro. Fue desarrollado originalmente para problemas de clasificación, pero también puede manejar problemas de regresión. En cualquier caso, siempre es una buena idea comparar diferentes modelos utilizando un conjunto de datos reservados que no se haya utilizado en el entrenamiento o la validación del modelo. Normalmente construyo varios modelos diferentes y luego observo cómo se comparan en un conjunto de datos completamente nuevo para ver cuál es el mejor para predecir el resultado.
¡Me alegro de haber podido ayudar!,
DS
Re: construir múltiples modelos de redes neuronalesEsto es TAN asombroso. Estoy haciendo lotes de 100 iteraciones para cada método de validación y todavía no he encontrado ningún error. Todavía no he probado las "filas excluidas", pero estoy seguro de que funcionará.
kfold siempre me da la misma solución perfecta (¿sobreadaptada?), aunque creo que esto es un testimonio del tamaño/formato de mi conjunto de datos, en lugar de cualquier tipo de error con el script.
Científicamente, he estado investigando un poco y parece que mis conjuntos de datos "pequeños" (docenas de muestras y cientos de predictores potenciales) probablemente sean más susceptibles a XGBoost, o de lo contrario las redes neuronales pueden ser excesivas, así que voy a intentarlo. plataforma también. Ni siquiera sabía que XGBoost era compatible con JMP (mientras que he visto bosques aleatorios y probablemente el otro enfoque en su GUI). En otras palabras, ¡espero aprovechar TODOS los componentes de esta excelente herramienta de investigación! Muchas gracias por tu ayuda (nuevamente) y te avisaré si encuentro algún otro error.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Entonces descubrí cuál era el problema en mi codificación. No fue un problema de una versión de JMP a otra, tiene que ver con cuántos niveles hay para una respuesta nominal u ordinal. Esto cambia la ubicación del cuadro del número de columna en la ventana del informe. Necesitaba ajustar el código para reflejar que al pasar de una respuesta que tiene 2, 3, 4 o 6 niveles, las estadísticas del ajuste cambian de ubicación dentro del informe. Lo bueno es que los cambios se realizan en una cantidad fija relacionada con la cantidad de niveles que hay, por lo que pude arreglar el código con relativa facilidad. Sin embargo, me tomó un tiempo descubrir ese error porque había usado el archivo PowderMetallurgy de los datos de muestra, pero son solo dos niveles, no 4 como el suyo.
Se adjunta la versión actualizada que está más generalizada a diferentes niveles de la variable de respuesta. El código ya debería funcionar para columnas de validación de 2 o 3 niveles, así como para respuestas nominales, ordinales y continuas.
Probé todas las plataformas compatibles: NN, BT, Bootstrap Forest y XGBoost con su conjunto de datos y funciona correctamente en todos los tipos de datos y las diferentes opciones de validación. Tenga en cuenta que, en la actualidad, JMP solo puede ajustar una respuesta de dos niveles (nominal u ordinal) utilizando la plataforma de árbol potenciada. Las otras plataformas pueden manejar más niveles que ese.
Estoy bastante seguro de que ahora está funcionando según lo previsto (excepto por el valor predeterminado de la última tabla de datos abierta; no sé cómo solucionarlo). Sin embargo, si encuentra algún error, hágamelo saber.
¡Gracias y buena suerte!,
DS
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Tengo el mismo problema con mis tablas de datos. Creo que tienes razón, si no lo ejecutas directamente desde la tabla de datos desde la que modelas, de alguna manera el valor predeterminado es la última tabla de datos abierta en tu ventana de inicio de JMP. No sé cómo solucionar esto.
Hmm, el código debería funcionar con una columna de validación que sea solo entrenamiento y validación o las tres. Lo escribí para verificar el número de niveles en la columna de validación y ajustarlo en consecuencia, es decir, registrar las estadísticas de ajuste apropiadas, ya sea que haya dos niveles o 3. Lo comprobaré dos veces mañana. Creo que el error en el rango de subíndices probablemente se deba a los cambios entre 15 y 16. Cuando salió 16, no volví a verificar el código para asegurarme de que funcionaba, pero lo ejecuté a través de varias pruebas en 15 y todo funcionó. De todos modos, arreglaré esto y corregiré las cosas para que funcione como se esperaba, pero no tendré tiempo hasta el viernes por la mañana para hacerlo.
Nuevamente, gracias por ayudarme a depurar el código y disculpe las molestias. Me comunicaré con usted cuando haya verificado todos los tipos de datos y tipos de códigos, como lo hice para enviarlo como complemento JMP.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronales¡IMPRESIONANTE! Ahora estamos cocinando con fuego. Lo único que veo ahora es que, aunque la GUI te pide que le digas cuál es la tabla de datos y cuál es la tabla de ajuste, a veces todavía las confunde. Creo que el valor predeterminado es la mesa que esté más cerca de la "parte superior de la pila" (tiendo a tener entre 10 y 20 mesas abiertas, de lo contrario esto probablemente no sería un problema).
¿Sería posible agregar una "regla" simple que diga "Si la columna de validación solo tiene términos de entrenamiento y validación, no calcule los datos de prueba" o algo por el estilo? Supongo que la alternativa es revisar el código manualmente y poner "//" delante de todas las opciones de "prueba". Lo pregunto porque a veces uso SÓLO capacitación y validación, en lugar de capacitación/validación/prueba (ya que el tamaño de mi muestra es pequeño). Si ingresa una columna de validación SÓLO con términos de capacitación y validación ahora, obtendrá el error de "rango de subíndice", y creo que es porque está buscando datos de "prueba" que no están allí.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Gracias de nuevo por captar eso y hacérmelo saber: mis modelos tienden a tener respuestas numéricas, por lo que normalmente no necesito editar cosas para tipos de datos nominales.
De todos modos, creo que podría haber habido un cambio de JMP 15 a 16 que condujera a diferentes cuadros de columnas numéricas en las ventanas del informe porque necesitaba cambiar los mismos valores de lo que eran a lo que son ahora, y funcionó antes en JMP 15, recuerdo haberlo probado. Lo volví a verificar y esta versión actualizada se ejecuta correctamente con los diferentes métodos de validación para NN: retención de filas excluidas, retención, kfold y columna de validación. Disculpe una vez más las molestias. Me alegra que puedas probarlo y dejarme saber los errores para que pueda mejorar y ayudar a otros. ¡Avíseme si encuentra algo más!
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronalesGracias por investigar eso y ahora funciona con una columna de validación, pero obtengo el mismo código de error cuando uso retención o kfold. Me pregunto si es porque esos métodos no necesariamente estratifican los datos donde está representado cada contenedor que intento predecir. Lo intentaré con un conjunto de datos más grande y veré si aparece el mismo error de "rango de subíndice".
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Lamento que haya tardado un poco en responderte. Pude reproducir el error que estaba recibiendo y encontré dónde estaba el error en mi código. Las líneas 348 y 349 tenían valores incorrectos para las variables ncol_box_v y ncol_box test. Deberían ser 10 y 19, respectivamente. Lo corregí y volví a ejecutar el NN con la columna de validación, y funciona como debería. Adjunto el código corregido. Lo siento por los inconvenientes ocasionados. Gracias por detectarlo y, si encuentra algún otro error, hágamelo saber.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronales¡Guau, esta GUI realmente se ha actualizado! Lo único es que ahora me sale un error de: "
Rango de subíndice en el acceso o evaluación de 'V_stats[ /*###*/5]' , V_stats[/*###*/5" independientemente del tipo de validación que utilice. Me pregunto si es porque tengo un tamaño de muestra tan pequeño para intentar tener muestras de capacitación, validación y prueba para cada uno de los cuatro grupos (como Y).
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
No, supongo que se debe a que seleccionó tener una columna de validación para la selección del botón de opción (frente a la retención o la retención excluida, etc.) pero olvidó incluir la validación en la lista de columnas cuando las convirtió en sus columnas seleccionadas. roles. Esa es mi suposición, pero si no es así, es posible que necesite que me proporciones una descripción paso a paso.
También actualicé un poco el código para corregir algunos otros errores que se estaban cometiendo. Mi código incluye la ventana de progreso, que creo que no querías, pero de todos modos te adjunto el nuevo archivo GenAt.jsl para que puedas tener el código fuente. Lo uso todo el tiempo para ayudar con mi modelado: NN, árbol potenciado, bosque aleatorio y XGBoost. Me gusta, pero requiere cierto conocimiento/comprensión de lo que estás haciendo desde una perspectiva de modelado y lo que te permiten hacer las diferentes plataformas.
No sé si esto enlace funcionará, pero intenté escribir una descripción sobre cómo usarlo para el repositorio de complementos. Sé que puedo acceder a ese enlace a través de mi cuenta SAS, pero no estoy seguro de que otros puedan hacerlo. Sin embargo, aún no se ha hecho público en el repositorio.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronales¡Hola!
Regresé a este trabajo de NN después de una pausa de 6 meses y noté que cuando intento ejecutar la GUI de NN, aparece un nuevo mensaje de error: "Enviar espera objeto programable en el acceso de evaluación de 'lista', {/ *###*/"Validación"})." ¿Cree que esto podría deberse a algún cambio entre JMP 15 y 16 (es decir, ciertos scripts de JMP 15 deben modificarse para JMP 16?
Re: construir múltiples modelos de redes neuronales¡Eso es genial! Avísame cuando lo publiques. Definitivamente lo probaré, especialmente porque todavía estoy en las primeras etapas para descubrir este conjunto de datos (aunque NN fue el claro ganador sobre todos los demás tipos de modelos que probé en JMP Pro 16). Veo el valor de no ir DIRECTAMENTE a NN por las razones que mencionaste Y porque no es excelente para la reducción de la variable de respuesta. En mi caso, necesitaría medir repetidamente mi mismo conjunto de 30 a 40 proteínas en cada muestra (sin que falten datos, como usted señaló), lo que aumentará los costos en comparación con un enfoque de biomarcador candidato más tradicional (con un o sólo unos pocos predictores). Básicamente, hago modelos simples y simplificados con solo unos pocos biomarcadores (generalmente usando Gen-reg) y los comparo con el modelo NN optimizado de su script. En ESTE caso, NN es superior, ¡pero eso no quiere decir que SIEMPRE lo será de cada conjunto de datos futuro que recopile! Estoy deseando probar la GUI, con errores y todo.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Definitivamente estoy de acuerdo contigo en no tener modelos demasiado complejos. Ése es absolutamente un problema que debería evitarse.
Mi opinión es que el modelado NN no es muy diferente al de otras plataformas. Cada uno tiene sus ventajas y desventajas. Por ejemplo, las NN no son tan buenas para manejar datos faltantes, no son muy escalables computacionalmente y son notoriamente difíciles de interpretar. Para las personas que utilizan estos modelos para ayudar a construir teorías, esa interpretación es importante. Las NN tampoco pueden manejar todo tipo de conjuntos de datos o entradas irrelevantes. Pero no hay suposiciones en el modelo y tienden a tener una alta capacidad de predicción.
Pero, dado que cada método de modelado tiene un conjunto diferente de ventajas e inconvenientes, tiendo a modelar en diferentes plataformas y luego comparar los mejores modelos de cada plataforma entre sí en un nuevo conjunto de datos para ver cuál funciona mejor para predecir el nuevo conjunto de datos y utilizarlo.
Dicho esto, acabo de terminar la versión 1.0 de una interfaz GUI que se puede ejecutar desde un botón de acceso rápido del menú JMP (no solo desde la tabla de datos). Le proporciona su tabla de datos y su tabla de ajuste, y dependiendo de cuál de los cuatro métodos elija (NN, árbol impulsado, bosque de arranque, XGBoost), ejecutará la cantidad de ajustes que le envíe según la tabla de ajuste. Funcionará con los diferentes tipos de datos para la entrada Y y con diferentes tipos de columnas de validación, incluso con múltiples columnas de validación para la plataforma XGBoost. De ninguna manera está libre de errores, pero estoy muy emocionado de haberlo hecho funcionar aproximadamente una semana después de publicar la primera GUI para la plataforma NN. Requiere que el usuario tenga conocimiento de qué tabla de ajuste usar para cada plataforma y otros requisitos específicos de la plataforma, como por ejemplo que uno debe saber que la plataforma de árbol impulsada en JMP no funciona con datos nominales/ordinales de más de 2 niveles ( al menos con JMP 15) o que la plataforma XGBoost puede usar múltiples columnas de validación, pero cada una debe tener solo 2 niveles.
Fue divertido trabajar en este proyecto y me ayudará en esfuerzos futuros. ¡Gracias!
Buena suerte,
DS
Re: construir múltiples modelos de redes neuronalesCreo que parte de esto puede tener que ver con el hecho de que, para muchos tipos de modelado, construir modelos cada vez más complejos NO es lo que se desea hacer: si un modelo simple se ajusta bien a sus datos y los valores RSME de validación o prueba son bajo, entonces simplemente deténgase ahí. Pero para NN, agregar capas, nodos, impulsos, recorridos, etc., no es necesariamente algo MALO porque, aunque son más complejos, también son más flexibles. Así que puedo ver por qué tener esta GUI para TODAS las plataformas de modelado puede llevar a quienes no están familiarizados con el modelado a extraer datos de manera exhaustiva y en su detrimento. Sin embargo, desde mi comprensión limitada de NN, si un modelo tiene un RSME de validación respetable bajo las condiciones predeterminadas de TanH = 3, otro tiene 3 nodos TanH, 3 lineales y 3 gaussianos en dos capas ocultas, pero tiene un RSME similar. no rechazaría automáticamente este último modelo por ser más complejo pero igualmente adecuado en términos de RSME porque podría terminar siendo MÁS flexible para futuros conjuntos de datos de prueba. Por lo tanto, es muy posible que la mayoría de las personas HARÍAN bien en construir potencialmente cientos o miles de modelos NN. Es muy posible, sin embargo, que esté equivocado y NN no es diferente de otros tipos de modelado, en los que, en igualdad de condiciones, lo simple es mejor. Solo estoy diciendo por qué no ves más personas tratando de optimizar los parámetros de entrada de NN: ¿es por ignorancia o por miedo a la extracción de datos?
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Gracias por tus comentarios y amables palabras. Sí, yo también tuve ese problema: mostrar la tabla de datos incorrecta si no está "en la parte superior". No estoy seguro de por qué hace eso. También hay algo extraño en cómo responde cuando llamo ciertas cosas en la nueva ventana para pasarlas a la parte adecuada más tarde. El botón "cancelar" no funciona como pretendía y el botón "ayuda" no va a ninguna parte en este momento, ¡pero es un comienzo! Creo que un experto en secuencias de comandos podría corregir fácilmente esos errores y hacer que funcione según lo previsto. Quizás cuando tenga todo configurado para que se ejecute en más plataformas y no tenga esos errores, podría publicarlo en la página de complementos. Sería un honor incorporarlo a JMP.
Me ayuda con mi trabajo, ya que automatizará y simplificará aún más el proceso de ajuste de mis modelos. Quería hacer algo para la plataforma NN, pero lo pospuse hasta tu publicación, y ahora que hice la GUI, quiero ampliarla para hacerla más multifuncional. La capacidad de ajustar un gran conjunto de modelos y centrarse solo en las estadísticas realmente ayuda a reducir el espacio de hiperparámetros para que sea más fácil comparar modelos en diferentes plataformas y ver cuál es el mejor para predecir nuevos datos. Luego, puede regresar y ejecutar la configuración óptima en la plataforma estándar y obtener toda la información gráfica enriquecida que JMP proporciona para visualizar el modelo y todo lo demás.
¡Buena suerte!,
DS
Re: construir múltiples modelos de redes neuronales¡Guau! Esto es realmente genial. El único pequeño problema es que, si la ventana del script está directamente encima de la tabla de "ajuste", "llama" a la tabla de ajuste en la ventana del modelo en lugar de a la tabla de datos. Siempre que la tabla de datos y el script estén al frente de su pantalla, los términos del modelo se cargan correctamente. De hecho, ejecuté 100 modelos en tan solo unos minutos. Me pregunto si puede poner esto en el depósito de "complementos" (olvidé su nombre real) en el sitio web de JMP para que reciba una atención más generalizada. Estoy seguro de que esto ayudaría a MUCHAS personas (si no de inmediato, en el futuro, a medida que más personas vean la utilidad de NN en la construcción de modelos). Demonios, probablemente debería llegar de alguna forma a JMP Pro 17 (podría ser demasiado tarde para 16). Muchas gracias por toda su ayuda y espero que esto también ayude a su propia investigación.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Espero que el JMP y/o el reinicio de la computadora hayan funcionado. Si no, también volví y construí una GUI para el modelado NN; planeo expandirla para que funcione en diferentes plataformas. No funciona perfectamente y a veces recibo algunos errores extraños (un programador experto probablemente pueda depurarlo en segundos). Pero lo bueno es que funcionará con cualquier tipo de columna de datos de entrada (ordinal, nominal y continua) y funciona con los métodos de validación aceptables para NN: filas excluidas, retención, Kfold y columna de validación. Funcionará tanto con las columnas de validación que contienen datos de prueba como con las que no. Es el script llamado NN GUI en su tabla de datos (adjunta).
Para aquellos interesados, tomé prestado mucho de un blog del personal de JMP. .@juliagong (jubilado) aquí y una nota de apoyo de .@Wendy_Murphrey aquí . Planeo crear una GUI que pueda automatizar esto para las otras plataformas que también he automatizado desde tablas de datos: árbol impulsado, bosque de arranque y XGBoost. Planeo publicarlo en la comunidad, pero podría llevar algún tiempo, especialmente para asegurarme de que esté completamente depurado.
El único cambio del código siguiente a la GUI en la tabla de datos es cambiar dt = Tabla de datos ("...") a dt = Tabla de datos actual().
Espero que esto te ayude a avanzar en tu trabajo. ¡A mí me sirve porque puedo mejorar esto para que mis esfuerzos como modelo también sean más fáciles!
Buena suerte,
DS
Código GUI NN:
Names Default To Here( 1 );
//Clear Symbols();
dt = Data Table( "Neural networking Ofav 2017 dataset" );
dt_parms = Data Table( "NN Tuning 8" );
nc = N Col( dt );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
valid_list = {"Excluded Rows Holdback", "Holdback", "KFold", "Validation Column"};
//the width of the column list box in pixels
lbWidth = 110;
/* Expression to clear all current settings */
clearRoles = Expr(
colListY << RemoveAll;
colListV << RemoveAll;
);
/* Expression to store the current settings in global variables */
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::vcolRecall = colListV << GetItems;
);
VmethodDlg = New Window( "Choose Validation Type",
<<RETURN result=""> 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
);
If( VMeth == "Validation Column" & lvl == 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
);
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
^VMeth_insert^,
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt_name || " - " || "Neural of " || y_resp[1] );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
If( VMeth == "Validation Column" & lvl > 0,
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get
);
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
);</RETURN>Re: construir múltiples modelos de redes neuronalesHmmm, descargué tu nueva tabla y ahora aparece el error del cuadro de esquema cada vez. Voy a intentar reiniciar JMP y luego reiniciar la computadora. ¡Parece extraño que funcione por tu parte pero no por la mía!
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Estoy volviendo a publicar esto porque parece que mi publicación original que intenté editar se perdió de alguna manera. Gracias por compartir la tabla de datos, ayudó a solucionar los problemas.
De todos modos, hice algunos cambios, así que algunas cosas a tener en cuenta:
- Lo hice para que un único código pueda ejecutarse en tipos de modelado ordinal, nominal y continuo. Ya no se necesitan dos versiones diferentes.
- Deberá editar la variable y_resp, que es la columna de respuesta Y ingresando el nombre de la columna entre comillas (consulte la línea 8). Ya no es necesario editarlo en la llamada dentro de Neural(). Sin embargo, aún tendrás que editar la lista de X().
- Luego, el código prueba el tipo de modelado de la columna y_resp, establece algunas variables y genera las columnas apropiadas en la tabla de datos de salida.
- La tabla de datos de salida ahora recibe un nombre según el tipo de validación y la tabla de datos del host. De esta manera, puede ejecutar todos los tipos de validación y luego compararlos sin tener problemas extraños con los nombres de JMP.
- Edité cada uno de los diferentes scripts de tipo de validación que tiene en su tabla de datos y se pueden copiar y pegar fácilmente en nuevas tablas de datos. Probé esto en la tabla anterior que enviaste y funcionó bien.
- Solucioné el error que mi código escribía en el archivo de registro cada vez que se ejecutaba y tuve que mover un paréntesis a una nueva ubicación.
- Descubrí que la razón por la que su retención y mi k-fold en realidad no funcionaban correctamente es que cuando hace ese tipo, necesita cambiar Validación() a Método de validación(). Lo hice para sus diferentes métodos y los scripts están arreglados.
Está mejorando poco a poco, y eso es bueno. Realmente preferiría que probara el tipo de columna de respuesta y el método de validación antes de generar las columnas adicionales, pero no estoy seguro de cómo hacerlo todavía. ¡Quizás lo edite para el próximo lanzamiento!
A continuación se muestra el ejemplo de código para la validación de Kfold. También adjunté su nueva tabla de datos con los scripts corregidos guardados en ella.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "health designation";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with Kfold" || " for " || dt_name ), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
//dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
//dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation Method ( \!"Kfold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
//Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
//dt_results:R² Test[i] = Test_stats[1];
//dt_results:RMSE Test[i] = Test_stats[2];
//dt_results:Mean Abs Dev Test[i] = Test_stats[3];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
//dt_results:SSE Test[i] = Test_stats[5]
//dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
Avíseme si encuentra algún otro problema e intentaré solucionarlo.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Gracias por compartir la tabla de datos. Pude encontrar algunas cosas.
- Descubrí dónde estaba el error que sigue escribiendo en la ventana de registro y lo solucioné. Está en la llamada str. Tuve que mover un paréntesis a una ubicación diferente.
- Descubrí que al hacer K-fold o Holdback, es necesario cambiar Validation() a Validation Method(). Luego funciona y proporciona los datos adecuadamente.
- Recodifiqué cómo prueba el tipo de modelado de la columna e hice algunos cambios asociados.
- También lo escribí para que se pueda usar el mismo código para Nominal, Ordinal y Continuo. Esto se puede hacer simplemente cambiando la variable y_resp, el nombre de la columna de respuesta Y. Hace todo el resto automáticamente.
- También agregué un título a la tabla de datos de resultados que cambia con la tabla de datos del "host" y el tipo de validación para que pueda ejecutar los tres métodos y no haya interferencia de nombres por parte de JMP.
- Los tres scripts de ajuste NN en su tabla de datos ahora se pueden copiar y pegar de una tabla de datos a la siguiente sin problemas. Lo probé con la primera tabla de datos que enviaste y funcionó bien.
Ahora se está automatizando un poco más y ha mejorado un poco. Preferiría que verificara el método de validación y luego generara las columnas adicionales y asignara los valores correspondientes. ¡Quizás en el próximo lanzamiento!
Así es como se ve el código en general. Observe que estaba probando la columna de temperatura para verificar los tipos de modelado continuo.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "temperature (1, 2, 3)";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with (validation type)" || " for " || dt_name), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);Avíseme si hay más problemas.
¡Gracias!,
DS
Re: construir múltiples modelos de redes neuronalesEs raro. Si sigo ejecutando el script, ¡al final funcionará!
Otra cosa extraña: no importa a qué cambie el porcentaje de retención, siempre me da 11 de entrenamiento versus 9 de validación (~55/45%). ¿No es posible hacerlo, digamos, 70/30%? Tengo la fuerte sensación de que esto se debe a que simplemente ingresé el comando incorrectamente, ¡en lugar de que sea imposible!
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
El error del cuadro de esquema probablemente se debe a que intenta obtener los valores estadísticos de la ventana NN. ¿Puedes compartir conmigo la nueva tabla de datos y el código? Puedo solucionar el problema y ver si puedo facilitar la transferencia de una tabla de datos a otra.
Creo que podría tener que ver con cómo configuré la parte para verificar el tipo de columna de datos y hacer que la variable ncol_box tenga un valor diferente. Si es nominal este valor es diferente que si es ordinal o incluso numérico.
Si puede compartir la tabla de datos y el código con el que recibe este error, estoy seguro de que puedo solucionarlo. Si lo desea, puede anonimizar la tabla de datos: Tablas > Anonimizar.
DS
Re: construir múltiples modelos de redes neuronalesVale genial. Esto responde a algunas preguntas adicionales que tenía. Ahora, lo único con lo que tengo problemas es que, cuando copio, pego y ejecuto el script en una nueva tabla de datos, aparece un error en el cuadro de esquema, al que usted alude en los comentarios del script. "carácter esperado arg 1 en acceso o evaluación del cuadro de esquema". ¿¿Qué significa eso?? Aumenté y disminuí los números, pero siempre aparece el mismo mensaje de error y el script no se ejecuta. Ni siquiera sé qué es un cuadro de esquema. Es extraño que la estructura del árbol sea idéntica. Acabo de cambiar el nombre del archivo. El nombre del archivo es más largo. ¿Quizás eso significa que necesito un cuadro de contorno más grande?Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Si regresa y revisa el script, la segunda línea define qué tabla de datos se utilizará durante el análisis. El código JSL dt = Current Data Table() define una variable local "dt" que luego se usa en el resto del script en lugar de tener que llamar a la tabla de datos por su nombre. De manera similar, dt_parms es la variable local que se asigna a la tabla de sintonización NN, "NN tuning". Esas dos tablas son realmente las únicas cosas que ingresas al guión. El resto es todo interno.
Si copia/pega el código JSL en una nueva tabla de datos, debería funcionar automáticamente porque lo está ejecutando localmente en esa tabla de datos.
No debe modificar la llamada dt << Nerual(), excepto para definir sus Y() y X(), y tal vez el método Validation(). El código JSL dt << Nerual() es un comando que le indica a JMP que realice el modelado NN en la tabla de datos "dt". De ahí la definición de qué es dt al principio del código.
También deberá modificar la llamada w = Window() para reflejar cuál será el título de la ventana del informe NN, así como Regex() debajo de ella. Finalmente, dependiendo de si realmente tendrá o no los datos de "prueba" establecidos como parte de una columna de validación, entonces querrá comentar (con el comando // al comienzo de la línea) o eliminar el comentario. al principio del código cuando crea las columnas de resultados de la prueba, así como la definición Test_stats y donde el código escribe los resultados en la nueva tabla de datos de salida.
Aparte de eso, no deberías tener que editar mucho.
Con respecto a su última pregunta, depende de cómo implemente el código. Si lo está ejecutando desde la tabla de datos, es decir, si está guardado en la parte del script de la tabla de datos y lo está ejecutando a través del botón verde, entonces solo necesitará cambiar Y() y X( ) que está utilizando como predictores y respuesta para hacer coincidir los nombres de las columnas de la nueva tabla de datos. Por supuesto, necesitará tener abierta la tabla "Tuning NN". Por otro lado, si está ejecutando esto como un script independiente, es posible que desee cambiar la definición de dt de dt = Tabla de datos actuales() a dt = Tabla de datos (" "), donde insertaría el nombre de la nueva tabla de datos entre comillas.
El "Neural" al que te refieres no es una tabla de datos sino el comando JMP para ejecutar un modelo de Neural Net en una tabla de datos especificada. El comando "<<" significa realizar la acción que está a la derecha de << en el objeto de la izquierda. Cerca del inicio del código, puede verlo con el comando de nueva columna. Donde dice dt_results << New Column(), el código le dice a JMP que cree una nueva columna para el objeto dt_results, que son los datos del subconjunto generados a partir de la tabla de datos dt_parms.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesTengo una pregunta (probablemente simple) sobre secuencias de comandos. Digamos que quiero cambiar la entrada dt por otra. ¿No debería poder copiar y pegar el script y sustituir el dt de "Neural" por otra cosa?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
Si elimino el archivo "Neural" original y lo sustituyo por otra tabla con exactamente la misma información y un nombre diferente, ¡el script no funcionará! ¿Es necesario tener exactamente los mismos datos en dos tablas de datos, una de las cuales se denomina "Neural"? ¡Quizás me perdí esa parte!
Re: construir múltiples modelos de redes neuronalesMe alegra saber que te está funcionando. ¡Buena suerte con el modelaje! Es posible que desee comprobar también otras plataformas de modelos y luego comparar modelos en un conjunto de datos de prueba para ver cuál es el mejor predictor.
DSRe: construir múltiples modelos de redes neuronalesVaya, no puedo creer que haya ejecutado 300 modelos de redes neuronales antes del almuerzo gracias a tu ayuda con las secuencias de comandos. Espero que esto sea recogido y "felicitado", ya que me imagino que cuando más y más personas comiencen a ver el valor de la plataforma NN, gravitarán hacia algo como esto, especialmente si se trata de un conjunto de datos completamente nuevo y usted realmente no lo sabe. saber dónde "sumergirse" con respecto a la desconcertante cantidad de parámetros de entrada del modelo NN que pueden modificarse ligeramente (a veces dando como resultado grandes diferencias incluso cuando simplemente se aumenta, por ejemplo, la tasa de aprendizaje de 0,05 a 0,1). A continuación, jugaré con los diferentes enfoques de validación (columna de validación versus retención versus KFold). Definitivamente debo tener cuidado dado el tamaño de mi muestra (actualmente) pequeño (con la esperanza de utilizar estos datos preliminares para obtener fondos para agregar más "filas", es decir, corales).
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Kfold también es otra excelente manera de validar el conjunto de datos breve. Sí, la exclusión de fila la establecería como estado de fila, lo que podría hacer seleccionando el conjunto de datos de "prueba" y estableciendo el estado de fila en "excluido". Si utiliza Kfold o Holdback, JMP los utiliza para la validación de los datos, no para probarlos. Es de esperar que también tenga un conjunto de datos separado que pueda usar como datos de prueba y no tenerlo en la misma tabla de datos que los datos de entrenamiento y validación.
Simplemente usaría Kfold para la validación y luego comentaría las partes que no necesita para ejecutar el script. A continuación se muestra la versión editada con una configuración de validación de 5 veces para la plataforma NN.Debería funcionar, a mí me funcionó.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(:OFA...22_c0_g2_i1.p1 ),
Validation ( \!"KFold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
//ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
//Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
¡Buena suerte!,
DS
Re: construir múltiples modelos de redes neuronalesMás sugerencias excelentes, especialmente en cuanto al tipo de validación. Veo que Neural admite retención, Kfold o exclusión de filas (por lo que supongo que simplemente elegiría al azar algunas filas para omitir). Si quisiera cambiar el script para cambiar el tipo de validación, ¿cambiaría simplemente la línea "Validación (:Validación con prueba)"? ¿Y las muestras retenidas serían equivalentes a los ojos de JMP como muestras de validación? De lo contrario, necesitaría eliminar las columnas de validación (o cambiarles el nombre), y las columnas de prueba también tendrían que desaparecer.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Me alegra que haya solucionado tu problema.
Con el modelado basado en árboles (XGBoost, árboles impulsados y bosque de arranque), puede utilizar fácilmente la GUI de la tabla de ajuste dentro de JMP para ejecutar muchos modelos. Pero una desventaja es que consume mucha RAM. Lo bueno de ejecutarlo de esta manera es que puedes ejecutar decenas de miles de configuraciones de parámetros diferentes y no consume mucha memoria RAM, solo consumo de CPU. He ejecutado hasta 40.000 configuraciones diferentes con bosque de arranque (que es lento) y puede llevar algunos días en mi computadora portátil de trabajo (32 GB de RAM y CPU de 2 GHz).
También soy uno de los primeros en adoptar JMP 16 y la selección de modelos es buena, pero como usted señala, no ajusta ninguno de los modelos, lo que puede ser un poco engañoso. Simplemente utiliza la configuración predeterminada, que no siempre es la mejor configuración para crear un modelo predictivo. Al menos podría ayudarle a determinar qué plataformas vale la pena dedicar tiempo a sintonizar más y cuáles no vale la pena investigar.
Es posible que desee considerar también la plataforma SVM para modelar sus datos nominales, ya que se supone que también es un buen método para ese tipo de datos.
En cuanto al simulador, es algo diferente y pretende ser una forma de probar las estimaciones con diferentes condiciones iniciales (aleatorización). Esto proporciona una distribución de valores para la estimación y un intervalo de confianza para la estimación original y luego puede decidir si ese modelo con las estimaciones dadas es bueno o no.
En cuanto al DOE, se podría hacer un diseño factorial o incluso ejecutarlo como un diseño de relleno de espacio con los factores establecidos apropiadamente, y creo que esa plataforma también permite restricciones condicionales. Además, podría considerar realizar una evaluación de predictores o un arranque de los predictores para ver si realmente necesita los 89 o si realmente solo puede usar un subconjunto más pequeño.
Como última nota, dado que tiene una tabla de datos corta y amplia, es posible que desee considerar, en lugar de utilizar una columna de validación, aplicar un enfoque de dejar uno fuera para la validación. Si haces eso, tendrás que editar el script para eso.
¡Buena suerte!,
DS
Re: construir múltiples modelos de redes neuronales¡Ajá! Muchas gracias por volver a hacerlo por mí. Claramente no tengo conocimientos de secuencias de comandos, así que simplemente cambié "Neural" por el nombre de mi tabla de datos... lo que obviamente no funcionaría. Una vez que cambié el nombre de mi tabla de datos a "Neural", agregué las columnas de prueba e hice los otros cambios que recomendó, funcionó.
Ahora lo que podría hacer es usar DOE para hacer un diseño factorial condicional (ya que, como notó, no se puede aumentar con múltiples capas ocultas) y ejecutar unos cientos de modelos en la computadora de mi trabajo (para no sobrecargar mis 8 -GB RAM portátil).
Siento que su script necesita convertirse en una GUI o complemento (¿algún interesado?). JMP Pro 16, que estoy probando en versión beta, tiene una excelente herramienta de "detección de modelos", pero creo que prueba todos los tipos de modelado (por ejemplo, PLS versus Gen-Reg), no DENTRO de los miles de modelos potenciales que podrían ser construido dentro de cada tipo de modelado (de lo contrario, es posible que nunca deje de ejecutarse). He oído hablar del "simulador", pero creo que hace algo diferente (no generar toneladas de modelos simulados), aunque podría estar equivocado. Nuevamente, muchas gracias por tu ayuda. ¡Esto seguramente me ahorrará DÍAS de tiempo!
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Gracias por compartir la tabla de datos, ayudó a depurar los cambios que realizó en el script.
Algunas cosas que noté:
- Necesitaba agregar columnas adicionales para las estadísticas del conjunto de datos de "Prueba" que desea registrar.
- Eliminaste accidentalmente la definición de imax, que es el número de filas de la tabla de parámetros.
- También cambiaste accidentalmente la llamada a la plataforma NN donde en el script dice dt << Neural(), aquí es donde envía el comando para realizar el modelado de la red neuronal en la tabla de datos "dt". Lo habías cambiado por otra cosa.
- La definición de la ventana "w" debe tener el nombre completo de la ventana NN, y si solo está ejecutando una única X, aparentemente JMP la incluye como parte del nombre de la ventana, por lo que debe estar en ambas. el comando GetName y la declaración IF debajo de él. Pero eso sólo es cierto cuando se modela con una sola X. Si usa más de uno, no necesita tener "por..." en el nombre de la ventana o en la declaración IF.
- La última parte es asegurarse de que las estadísticas de los datos de entrenamiento, validación y prueba se llamen correctamente en el comando Number Col Box().
El siguiente código funciona en su tabla de datos (también se adjunta con un script modificado). Funciona con la tabla NN Tuning que proporcioné anteriormente.
Si realmente va a utilizar las 86 columnas, debe colocarlas manualmente en la parte X(col1, col2,...) del script. Luego también deberías editar la parte GetName porque no incluirá los 86 nombres, solo será el nombre de la ventana con la columna de respuesta.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(
:OFA...22_c0_g2_i1.p1
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesBueno, fallé, pero creo que probablemente se deba a algún pequeño error en el script. Utilicé su tabla de ajuste de NN con mis datos (adjunta) e hice todas las actualizaciones necesarias (utilicé tres muestras de entrenamiento+validación+prueba). Si ejecuta el último script ("comparación de redes neuronales"), creará la nueva tabla, pero no se ejecutará ningún análisis. Solo incluí algunos términos X, pero en realidad serán las 86 columnas del grupo "datos estandarizados". Cuando uso el depurador, dice que algo va mal con el
" Para (yo = 1 , i <= imax, i++," área. ¡Espero/supongo que un guionista más competente probablemente pueda encontrar el problema en segundos!
Re: construir múltiples modelos de redes neuronales¡Sí! Esto es exactamente lo que quiero: una tabla con todos los parámetros de entrada de NN (por ejemplo, número de nodos TanH, número de capas, etc.) que se sincronice con la plataforma NN. No lo he probado todavía y me imagino que llevará un tiempo, pero estoy usando un pequeño conjunto de datos de "práctica" de predictores de 20 muestras x 90, por lo que podría ser factible. En realidad, solo descubrí que el tipo de activación y la cantidad de nodos (así como la cantidad de recorridos) en realidad reducen mi RMSE, y el aumento no ayuda mucho. Pero incluso entonces, esto será mucho más rápido que hacer todos los ~500 modelos que planeé ejecutar (afortunadamente, no tantos como tenía intención de ejecutar ayer, ya que quiero permanecer por debajo de 4 nodos/tipo de activación). Lo probaré mañana y les contaré a todos cómo va.
Re: construir múltiples modelos de redes neuronalesHola @abmayfield ,
Esto era algo que quería escribir desde hacía tiempo y fue muy divertido, y tu publicación dio el impulso para ponerlo en marcha, ¡gracias! Hace tiempo que quiero tener una forma de ajustar la plataforma NN, ya que es muy sensible a las condiciones iniciales y es bastante lento hacerlo manualmente.
Entonces, adapté algunos scripts que hice para otras plataformas modelo para automatizar sus procesos de ajuste, por ejemplo, las plataformas Boosted Tree, Bootstrap Forest y XGBoost. Los scripts deben guardarse en su tabla de datos y ejecutarse con el botón verde.
Esperemos que sepa algo sobre secuencias de comandos y sepa dónde adaptar estas secuencias de comandos a sus situaciones/estructura de datos/nombres de columnas específicos, etc. He ingresado algunos comentarios para tratar de ayudar a explicar lo que estoy haciendo en cada grupo más grande. Adjunto dos guiones: uno para Y continuas y otro para Y nominales/ordinales. Tuve que incluir una prueba para ver si la salida Y es nominal u ordinal porque el valor de Number Col Box() cambia dependiendo de esto. Utilicé la tabla de datos Big Class Families.jmp en los datos de muestra como conjunto de datos de prueba. También incluyo dos tablas de datos de salida que genero usando el ajuste numérico NN o el ajuste NN nominal/ordinal. Hice nominal en :sex usando :age, :weight:, :height, y luego cambié :age de Ordinal a Continuo y modelé la edad con :weight y :sex para el ajuste continuo de NN.Los ajustes y las estadísticas son horribles, pero su único propósito es ver si el JSL funciona o no. También agregué una columna de validación a la tabla de datos estratificando por edad, solo para verificar que todo funcionó correctamente.
Estoy seguro de que alguien más podría crear un script de manera más elegante para probar que la columna de entrada Y() sea del tipo de modelado Continuo, Nominal u Ordinal y luego insertar el valor apropiado de Number Col Box() para extraer los datos apropiadamente usando solo un código JSL único.
Necesitará editar las entradas Y() y X() en la sección dt << Nerual() así como la parte donde obtiene el nombre de la ventana del informe, ya que lleva el nombre de la variable que está modelando.
En principio, las tablas de ajuste de NN podrían tratarse como un DOE que llena el espacio, donde las configuraciones inferior y superior son las que desee configurar, excepto algunas de ellas, como N_Layers solo puede ser 1 o 2 porque JMP solo permite 1 o 2. capas. Penalty_Method son solo las opciones que son válidas en la plataforma NN, y Transform Covariate y Robust Fit solo toman valores de 0 o 1 (activado o desactivado). También incluyo la tabla de sintonización NN.
Si tiene alguna pregunta, hágamelo saber.
Aquí está mi código para el tipo de modelado Nominal/Ordinal:
Names Default To Here( 1 );
dt = Data Table( "Big Class Families" );//enter the name of the current data table
dt_parms = Data Table( "NN Tuning" );//enter name of parameter data table for tuning the NN
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );//this copies the tuning table with all the different rows in it
//these commands create columns to record the fit results
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//This part just creates a separate modelling progress, delete if you don't want it.
i = 1;
imax = N Row( dt_parms );
dlgStatus = New Window( "Overall Modeling Progress",
V List Box(
Text Box( " Overall Modeling Progress ", <<SET font="" size=""></SET>
Una cosa que es extraña y que no entiendo es que recibo esta advertencia sobre la ventana de registro que creo cuando la ejecuto para la plataforma NN, pero nunca la recibí en mis otras plataformas. No puedo entender de dónde viene esa advertencia, pero aún así se ejecuta correctamente. ¿Quizás alguien pueda arreglar esa parte de mi código?
Inesperado ",". Quizás falte un ")".
Intentando analizar el operando para el operador "<<".
Línea 23 Columna 10: )) ►,
Como última nota: tenga cuidado con la configuración, ya que puede llevar MUCHO tiempo ejecutar el modelado si tiene una gran cantidad de mejoras, recorridos o funciones de transferencia. Sólo tenga cuidado de no exagerar.
¡Espero que esto ayude!,
DS
Re: construir múltiples modelos de redes neuronalesPor cierto, el truco de "opción" para que todas las funciones relevantes muestren la misma información que la función que estás seleccionando activamente es en realidad el truco de "comando" en una Mac (de ahí que no funcionara anteriormente).
Re: construir múltiples modelos de redes neuronalesMarcos, gracias por tus sugerencias. El segundo lo intenté y fallé. Conozco la opción "convertir en tabla combinada" de otras plataformas, pero tal vez se dejó fuera de la plataforma neuronal por alguna razón. Curiosamente, el truco de la "opción", mediante el cual se mantiene presionada la tecla de opción, se hace una selección y se aplica a todas las partes del informe, no funciona ni en la plataforma neuronal, o podría acelerar las cosas.
Sería genial si pudiera tener los parámetros de mi red neuronal (# nodos, #recorridos, etc.) como X en un DOE, con el objetivo de minimizar RSME, pero parece que no es posible debido a la forma en que se debe ingresar el parámetros en los cuadros particulares en el lanzamiento del modelo neuronal. Tendría que realizar algunas secuencias de comandos realmente avanzadas y, aun así, no estoy seguro de si DOE y Neural podrían comunicarse correctamente. Pero si alguien conoce alguna manera de hacer que la plataforma neuronal ejecute básicamente los modelos reflejados en esta captura de pantalla (siendo una subselección del total general), se lo agradecería mucho. En otras palabras, los valores de la primera tabla de captura de pantalla tendrían que ir a los cuadros de entrada correspondientes en la segunda captura de pantalla (es decir, el inicio del modelo neuronal).
Re: construir múltiples modelos de redes neuronalesPodría diseñar un experimento con menos niveles para ajustarse a un modelo de RMSE de segundo orden y luego usar el modelo para optimizar la configuración. Además, puede crear cada modelo por turno y luego extraer todos los resultados a la vez haciendo clic derecho en una de las tablas de resultados y seleccionando Convertir en tabla combinada.