Automatizar la red neuronalHola a todos,
Estoy trabajando en un proyecto que utiliza un modelo de red neuronal para predecir la humedad del suelo en diferentes lugares (alrededor de 1000) definidos por sus coordenadas únicas.La misma estructura para la red neuronal en JMP se puede aplicar a todos los sitios. Entonces, estoy pensando en automatizar el trabajo. Puede ser un script JMP que pueda encontrar el coordinador de ubicación (X, Y), extraer las entradas de datos necesarias y ejecutar la red neuronal. Al final, el script puede guardar informes de los modelos. ¿Tienes algún consejo o consejo que puedas compartir conmigo?
Gracias de antemano.
Cualquier sugerencia o discusión es apreciada.
Re: Automatizar la red neuronalHola @Marco1 ,
No estoy seguro de entender por qué querría pronosticar una cierta cantidad de períodos sin tener una columna de salida. Si sabe que tiene un buen conjunto de predictores para su modelo, ya sea NN o basado en árboles, o kNN, entonces no creo que realmente importe, se trata de si el modelo hace un buen trabajo de predicción o no. los próximos eventos. Debe alimentar una columna Y a los modelos o, de lo contrario, no tendrán ningún resultado para intentar predecir para el entrenamiento y la validación del modelo. Las plataformas le permiten guardar la fórmula de predicción en la tabla de datos o publicarla en Depot para compararla con otras predicciones que genere, para que pueda probarla con nuevos datos y ver cuál es el mejor modelo, eso depende de la métrica que utilice. está mirando y si está haciendo clasificación o regresión.
Tendré que buscar en el borde de Pareto cuando tenga algo de tiempo extra, gracias por el complemento.
Si bien sería excelente que una GUI integral ejecutara todas las diferentes plataformas de modelado dentro de JMP, eso es demasiado para mí en este momento. Quizás en futuras versiones pueda agregar plataformas adicionales. En este momento, puede ejecutar NN, boosted tree, bootstrap forest y XGBoost. También planeo agregar kNN, naive Bayes y SVM a la lista. Se necesita tiempo para solucionar errores y otras cosas, especialmente cuando se llama a múltiples plataformas diferentes.
¡Gracias!,
SD
Re: Automatizar la red neuronalHola Diedrich,
Buena explicación, una consulta: Sobre la predicción de series temporales con redes neuronales JMP, como se podría lograr una predicción de los próximos 2, 3, 4, 5 o más periodos en el futuro, con 1, 2, 3 o más columnas de entrada ? ... es decir, sin columnas de salida.
Con respecto a la optimización multiobjetivo (borde de Pareto), he adjuntado una GUI muy buena que se puede descargar de la comunidad JMP, tal vez ayude a actualizar la GUI en la que está trabajando.
Sería genial que la GUI pudiera optimizar los parámetros de cualquier plataforma que tenga JMP, incluyendo Time Series (ARIMA, Winter...) evitando que el usuario tenga que hacer el trabajo que podría hacer alguna optimización.
¡Gracias por tu ayuda!
Saludos,
marco
Re: Automatizar la red neuronalHola @giaMSU ,
Si realmente desea comparar diferentes NN con diferentes esquemas de validación, establecería la semilla aleatoria en algún número, digamos 12345. De esa forma, siempre partirá del mismo punto. A dónde va desde allí depende de los parámetros utilizados en el modelo y el conjunto de validación, pero al menos todo comenzará desde el mismo lugar.En mi experiencia, tener un buen esquema de validación es muy importante. Si al seleccionar ejemplos específicos para el entrenamiento o la validación, puede crear un conjunto de datos muy desequilibrado que prefiera un resultado sobre otro, lo que terminaría sobreajustándose al entrenamiento y no prediciendo bien el conjunto de validación, o viceversa. Incluso podría considerar hacer columnas de validación de K-fold, que es una especie de esquema de validación de K-fold anidado, luego podría ver las predicciones de ajuste e incluso las estadísticas de ajuste para cada una de las columnas anidadas. Solo un pensamiento.
¡Buena suerte!,
SD
Re: Automatizar la red neuronalHola @Marco1 ,
No estoy seguro de qué plataforma en JMP se usaría para hacer la generación DOE del borde de Pareto. En mi GUI que estoy actualizando ahora, llamo a la plataforma Space Filling DOE, que llena de manera óptima el espacio de hiperparámetros con puntos basados en los valores de entrada altos y bajos para Space Filling DOE. La tabla de datos resultante que se genera guarda todas las estadísticas de ajuste para que uno pueda evaluar cada ajuste e incluso volver atrás y ejecutarlas manualmente en las plataformas más adelante.
Que yo sepa, JMP no admite más de dos capas. No recuerdo los detalles, pero fue mencionado durante una de las sesiones en el Discover Summit Americas de la semana pasada. Creo que se debe a que al evaluar el rendimiento (especialmente el rendimiento predictivo), más de dos capas no agregaron mucho por el tiempo de cálculo adicional en la construcción del modelo. Además, tenga en cuenta que al aumentar con NN, solo se permite una capa. A menudo, el número de nodos es más significativo que el número de capas.
Por lo que sé, debería poder modelar series temporales con la plataforma NN. No veo ninguna limitación allí. El único desafío, por supuesto, es la interpretabilidad del modelo NN. Es mucho más difícil interpretar las transformaciones de X -> Y en NN.
Adjunto una tabla de ajuste NN básica (Ajuste NN) y un DOE de llenado de espacio para explorar el espacio de hiperparámetros. Tenga en cuenta que solo tengo dos de los cuatro métodos de penalización en mi DOE. Además, permití que todas las variables (excepto el ajuste robusto) varíen, pero dado que el impulso solo se permite para un modelo de una sola capa, el código elimina automáticamente las opciones de dos capas y vuelve a una opción de impulso. Como nota final, las 13 columnas deben estar presentes en la tabla de ajuste que seleccione al ejecutar la GUI. Si no están presentes, arrojará un error.
Las plataformas DOE eliminarán cualquier factor que sea una constante de forma predeterminada. Si falta una columna después de generar el DOE, debe volver a copiarla desde su tabla de factores (y completar el valor hasta el final de la tabla), de ahí el ejemplo donde Robust Fit se mantiene constante en 0. Usé una semilla aleatoria de 1234, con 120 ejecuciones para generar el DOE de relleno de espacio.
Espero que esto ayude,
SD
Re: Automatizar la red neuronalHola Diedrich,
Me alegro de saludarlos, sería excelente que la GUI pudiera realizar una optimización multiobjeto (borde de Pareto) en todos los hiperparámetros que el usuario tiene que ajustar y crear más de 2 capas (aprendizaje profundo)
Una consulta: ¿es posible hacer predicción de series temporales con las redes neuronales JMP?
El ejemplo que envié, es decir, la tabla de ajuste fue creada por el DOE personalizado de JMP, recién estoy aprendiendo a usar el NN y el DOE, ¿qué columnas elimina el DOE? ¿Qué columnas debo colocar y en qué tabla? Es decir, ¿la tabla de datos o la tabla de ajuste?
Por favor, ¿podría enviar un ejemplo?
Gracias por tu respuesta y ayuda!!!
Saludos,
marco
Re: Automatizar la red neuronalHola @Marco1 ,
Gracias. De hecho, estoy en el proceso de actualizar el JSL aún más para que genere la tabla de ajuste para el usuario. El problema de hacerlo manualmente es que sí, necesitas conocer bastante bien los entresijos del código. El problema que tiene es que el código espera que ciertas columnas estén en la tabla de datos de ajuste, incluso si son constantes porque cada fila contiene los parámetros que se alimentan a la plataforma de modelado.
Supongo que cuando creó la tabla de ajuste, JMP eliminó automáticamente los términos constantes. La tabla de ajuste resultante no tiene las columnas correctas y, por lo tanto, generará un error. No soy el mejor programador, por lo que tratar de abordar todos los escenarios posibles lleva algo de tiempo.
Mientras tanto, antes de que salga mi próxima versión, le sugiero que vuelva a copiar las columnas que dejó caer JMP y luego complete los valores hasta el final de la tabla. Esto debería ponerte en marcha. Si tiene más problemas, hágamelo saber.
¡Espero que esto ayude!,
SD
Re: Automatizar la red neuronalHola Diedrich Schmidt,
Los felicito por la GUI Gen_AT_v3.0, aparentemente no se como usarla, me sale un error:
¿Hay un manual o ejemplos?
Se adjunta tabla de series temporales y tabla de parámetros.
Gracias por su apoyo.
Saludos,
marco





Re: Automatizar la red neuronalHola DS,
Gracias por ayudarme. Honestamente, me rendí y lo hice manualmente.
He probado el script muchas veces preguntando a la gente o autoaprendiendo con JMP Scripting Index. Por ejemplo, utilicé la opción Obtener validación de RSquare en el ajuste () o agregué rSquare = (report(obj)["Validation"]["mvalue"][NumberColBox(1)]< mostrar (rCuadrado);
Ambos no funcionaron.
Acerca de su sugerencia sobre seleccionar aleatoriamente el conjunto de datos de validación de K-fold. Es una gran idea. Sin embargo, quiero mantener la coherencia de la estructura de NN para poder comparar el rendimiento entre NN. La mayoría de los artículos que leí, usando NN artificial, no mencionan cómo seleccionan su conjunto de datos de validación durante las iteraciones.
Lo intentaré para ver alguna mejora en R2. Pronto les haré saber el resultado.
Mejor
Re: Automatizar la red neuronal¡Claro, me alegro de que te ayude!Re: Automatizar la red neuronalMuchas gracias.
Re: Automatizar la red neuronal¡Gracias, .@G_M!Re: Automatizar la red neuronalBuen trabajo, @SDF1 .
Re: Automatizar la red neuronalHola @giaMSU y @G_M ,
Anteriormente en este hilo, publiqué una sección del script que uso todo el tiempo cuando ejecuto miles de conjuntos de entrenamiento para guardar el R^2, RASE, etc.
Como @G_M mencionado, querrá ir a la estructura de árbol del informe para averiguar dónde están los valores para guardar. En la parte inferior de la secuencia de comandos, justo antes del final del bucle FOR, es donde extrae los valores de la estructura de árbol del informe.
Modifiqué mi secuencia de comandos anterior que automatiza el ajuste de NN e incluí la parte de mi publicación anterior que extraerá los valores de ajuste (R2 y RMSE). Si desea otros valores, también puede agregarlos. El script crea una nueva tabla de datos que tiene los resultados del ajuste NN para cada ID de ubicación. También modifiqué la parte en la que se genera cada tabla de datos en función de la identificación de la ubicación para que la tabla de datos tenga su propio identificador único en función de la identificación de la ubicación, aunque de todos modos simplemente cierro cada tabla de datos al final; en principio, puede mantenerlos todos abiertos comentando el comando de cierre al final del bucle FOR, pero entonces tendrá una gran cantidad de tablas de datos abiertas.
Antes de implementar el código, le sugiero que lea los comentarios y comprenda lo que está haciendo el script. Una vez que se familiarice con las secuencias de comandos, ¡cambiará su vida en JMP para siempre!
En una nota al margen, ¿realmente necesita tener siempre la misma semilla aleatoria? Recomiendo dejarlo en blanco para el ajuste para que realmente obtenga aleatoriedad con el ajuste, lo que puede hacerlo más robusto. Además, tiene suficientes observaciones en sus datos para que pueda crear una columna de validación con un conjunto de entrenamiento, validación (y prueba) para que pueda averiguar cuál de los modelos es realmente el mejor en predicción. Puede estratificar esta columna de validación según su columna :Y ("Humedad del suelo (kg.m-2) o (mm)"). También puede automatizar esto y tenerlo en la parte donde crea cada una de las tablas de datos después de resumir en: ID.
Al ejecutar el siguiente script en su tabla de datos, obtengo el siguiente resultado:

Names Default To Here( 1 ); //keeps variables local, not global
dt = Data Table( "Subset of 765-450" ); //defines your starting data table
Summarize( locs = BY( dt:ID ) ); //creates a list of the different location IDs
<BR />//This FOR loop creates all the different data tables based on location ID and also names them based on location ID
For( j = 1, j <= N Items( locs ), j++,
file = dt << Select Where( locs[j] == Char( :ID ) ) << Subset( file, Output Table Name( "Model Subject File Location ID " || locs[j] ) )
);
<BR />//this portion of the code generates the list of data tables that will be used to train the models for each location.
dt_list = {};
one_name = {};
For( m = 1, m <= N Table(), m++,
dt_temp = Data Table( m );
one_name = dt_temp << GetName;
If( Starts With( one_name, "Model" ),
Insert Into( dt_list, one_name )
);
);
<BR />//this portion of the code creates the fit result data table that will record the statistics for each fit, to be reviewed later. Also adds the label column property to the Loc_ID column.
dt_fit_results = New Table( "Fit Results", Add Rows( N Items( dt_list ) ), New Column( "Loc_ID", "Continuous" ) );
dt_fit_results << New Column( "R² Training" );
dt_fit_results << New Column( "R² Validation" );
dt_fit_results << New Column( "RMSE Training" );
dt_fit_results << New Column( "RMSE Validation" );<BR />dt_fit_results:Loc_ID << Label;
<BR />//this FOR loop makes sure that each row of the fit result table also includes the location ID
For( l = 1, l <= N Items( dt_list ), l++,
dt_fit_results:Loc_ID[l] = dt_list[l]:ID[l]
);
//this FOR loop is the fitting routine for each location data table.
For( i = 1, i <= N Items( dt_list ), i++,
NN = Data Table( dt_list[i] ) << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( ), //I took away the random seed, so your fits will be different from mine.
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 1 ) //I only did one tour just for proof of concept, so you'll want to change this
)
);
NNReport = NN << Report;<BR />//These next lines of code are what pull the actual values from the fit report and saves them to the fit results data table.
Train = NNreport["Training"][Number Col Box( 1 )] << Get;
Valid = NNreport["Validation"][Number Col Box( 1 )] << Get;
dt_fit_results:Name( "R² Training" )[i] = Train[1];
dt_fit_results:Name( "RMSE Training" )[i] = Train[2];
dt_fit_results:Name( "R² Validation" )[i] = Valid[1];
dt_fit_results:Name( "RMSE Validation" )[i] = valid[2];
Close( dt_list[i], no save );
);¡Buena suerte!,
SD
Re: Automatizar la red neuronalhola ds
Gracias por tu contribución.
Todavía tengo un pequeño problema con el problema. Guardé mil archivos pdf de los informes de NN. Luego, se convirtió en un problema ya que necesito leer manualmente muchos archivos pdf para obtener el R2 de cada NN.
Quiero ejecutar un script para extraerlos automáticamente. ¿Me puedes ayudar?
Atentamente
GN
Re: Automatizar la red neuronalHola @giaMSU ,
Gracias por publicar la tabla de datos más pequeña que tiene y el script con el que estaba trabajando. Lo modifiqué un poco y conseguí que funcionara. Pruebe lo siguiente. No me di cuenta de que estaba creando subconjuntos de tablas de datos y usándolos solo para el ajuste.
Aquí está el resultado que obtuve al ejecutar una versión modificada de su secuencia de comandos:

Aquí está el script modificado:
Names Default To Here( 1 );
dt = Data Table( "Subset of 765-450" );
Summarize( locs = BY( dt:ID ) );
For( j = 1, j <= N Items( locs ), j++,
file = dt << Select Where( locs[j] == Char( :ID ) ) << Subset( file, Output Table Name( "Model Subject File" ) )
);
dt_list = {};
one_name = {};
For( m = 1, m <= N Table(), m++,
dt_temp = Data Table( m );
one_name = dt_temp << GetName;
If( Starts With( one_name, "Model" ),
Insert Into( dt_list, one_name )
);
);
For( i = 1, i <= N Items( dt_list ), i++,
NN = Data Table( dt_list[i] ) << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
NNReport = NN << Report;
NNReport << Save PDF("E:/Ready_for_ANN/result") // I actually didn't do this part.
);Si tiene muchos ID de ubicación diferentes, es posible que desee guardar cada resultado con el código de carácter de ID único para diferenciarlos. Tal vez modifique la línea "guardar" a algo como:
NNReport << Save PDF("E:/Ready_for_ANN/result_LocID_"|| Char(dt_list[i]:ID[1]));¡Espero que esto ayude!,
SD
Re: Automatizar la red neuronalHola @giaMSU ,
Me gusta la idea de automatizar el ajuste de NN y he hecho algo similar para otras plataformas. Creo que intentaré hacer algo similar para el NN para probar varios parámetros de ajuste en la plataforma NN para encontrar un ajuste óptimo.
He hecho algo muy similar, pero con una plataforma de modelado diferente (bosque aleatorio y árboles potenciados). Incluiré mi código a continuación con descripciones de lo que hacen las líneas principales.
Sin embargo, en general, no está alimentando la nueva información al ajuste NN cada vez que selecciona una nueva ubicación. El ajuste realmente debe ser adentro un bucle FOR. Tengo el mío como un código de secuencia de comandos dentro de mi tabla de datos y hago esto porque necesito ejecutar una tabla de ajuste muy grande para obtener el mejor ajuste, y cuando lo hago de esta manera, ahorra mucha memoria para mi computadora, además de usted puede hacer más de 24k+ filas en una tabla de datos de esta manera, dejándola funcionar durante la noche.
Por cierto, el concepto original de esto y la idea del bucle para el ajuste me llegaron a través de una publicación de gzmorgan0, pero no recuerdo la publicación original. Lo uso todo el tiempo.
Names Default To Here( 1 );//keeps all variables local<BR />
dt = Data Table( "My data table" ); //this is where you specify your data table with the :Y and :X columns
dt_pars = Data Table( "tuning table" ); //for me, this is my tuning table that has modified tuning parameters. For you, it might be the "Model Subject File" data table.
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //this just duplicate the above dt because I want to add columns for recording fit parameters.
<BR />//the below portion creates new columns for recording the fit parameters.<BR />dt_results << New Column("Overall In Bag RMSE");
dt_results << New Column("Overall Out of Bag RMSE");
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
<BR />//The FOR loop here is to actually run the fit with each of the different tuning parameters.
For( i = 1, i <= N Row( dt_pars ), i++,<BR /> //these next few lines pulls the NEW fit parameters to put into the model fit. This would be each new row of data (location) for your case
NumTrees = dt_pars:Number Trees[i];
NumTerms = dt_pars:Number Terms[i];
PortBoot = dt_pars:Portion Bootstrap[i];
MinSplpTr = dt_pars:Minimum Splits per Tree[i];
MaxSplpTr = dt_pars:Maximum Splits per Tree[i];
MinSplSz = dt_pars:Minimum Size Split[i];<BR /><BR /> //this next section is a string that will be evaluated below and represents what you would do via a normal GUI in JMP.
str = Eval Insert(
"report = (dt << Bootstrap Forest( //this is the fit method
Y( :Y_Response ), //whatever your response variable is
X(
:X_1, //these are all your x variables that you put in (which you want to be changing each time)
:X_2,
:X_3,
),
Minimum Size Split( ^MinSplSz^ ), //here is where something is changing and the new values are inserted via the ^ ^ and fed to the fit method. Here is where you'd want to do something similar, but above with the :X's
Validation Portion( 0.2 ), //this too can even be a variable and changed each time.
Set Random Seed( ),
Method( \!"Bootstrap Forest\!" ), //this again defines the method
Minimum Splits per Tree( ^MinSplpTr^ ),
Maximum Splits per Tree( ^MaxSplpTr^ ),
Portion Bootstrap( ^PortBoot^ ),
Number Terms( ^NumTerms^ ),
Number Trees( ^NumTrees^ ),
Early Stopping( 0 ),
Go,
invisible
)) << Report;"
); //this closes the Eval Insert() command<BR />
Eval( Parse( str ) ); //this actually runs the fit for each iteration<BR /><BR /> //The below lines, I pull out the relevant fit statistic I want to evaluate from the report and save it to the data table called dt_results. I can then analyze my multiple thousand data points later and not chew up too much RAM.
Overall=report["Overall Statistics"][Number Col Box( 1 )] << Get;
R2 = report["Overall Statistics"][Number Col Box( 2 )] << Get;
RMSE = report["Overall Statistics"][Number Col Box( 3 )] << Get;
report << Close Window;
dt_results:Name("Overall In Bag RMSE")[i]=Overall[1];
dt_results:Name("Overall Out of Bag RMSE")[i]=Overall[2];
dt_results:Name("R² Training")[i] = R2[1];
dt_results:Name("R² Validation")[i] = R2[2];
dt_results:Name("RMSE Training")[i] = RMSE[1];
dt_results:Name("RMSE Validation")[i] = RMSE[2];
);Me imagino que debería poder tomar el esquema de arriba y modificarlo según las necesidades específicas que tenga.
En una nota al margen, no olvide no solo realizar la validación de ajuste para no sobreajustar, sino también probar su capacidad predictiva en un conjunto de datos de prueba completamente sin usar que ha separado de los datos de ajuste. Además, si puede permitírselo, recomendaría aumentar el número de recorridos >=25. La plataforma NN a veces necesita muchos más intentos, como en DOE, para encontrar un ajuste óptimo para un conjunto de parámetros dado.
¡Buena suerte! Espero ver la solución final. Podría tomar una grieta en él también.
Gracias por comenzar este hilo.
SD
Re: Automatizar la red neuronalHola @giaMSU ,
Esto parece muy factible, pero su pregunta es bastante abierta.¿Cuáles son los obstáculos que estás viendo y con los que necesitas que la comunidad te ayude?
Comenzaría con el script de la red neuronal y vería dónde será necesario realizar sustituciones en el script para cada ubicación.Defina una función o expresión que extraiga la información específica de la ubicación, realice el análisis de la red neuronal y guarde el informe/scripts.Itere a través de las ubicaciones que ejecutan esa función/expresión cada vez.
Re: Automatizar la red neuronal@giaMSU , lo que planeas hacer es posible.Paso 1. Utilice la función Resumir para crear una lista de cada una de las J = 1000+ ubicaciones.Paso 2. Indexe las ubicaciones J en la lista.Paso 3. Utilice las funciones Seleccionar dónde y Subconjunto para crear un conjunto de datos para la j-ésima ubicación.Etapa 4. Ejecute el modelo de red neuronal j-ésima para la ubicación j-ésima.Paso 5. Guarde el informe de la plataforma NN en el formato que desee. Paso 6. Repita hasta llegar a la última ubicación.No lo probé, pero lo siguiente debería funcionar o acercarte mucho.
//assumes data table is "dt" and location is in a variable called "Location"
Summarize( locs = BY(dt:Location) );
For(
j=1, j<=NItems(locs), j++,
file = dt << Select Where(locs[j] == :Location) << Subset(
file,
Output Table Name("Model Subset File")
);
NN = file << Neural(
Y( :Name( "Y" ) ),
X( :Name( "X1" ), :Name( "X2" ) ),
Validation( :Validation ),
Informative Missing( 0 ),
Set Random Seed( 1121 ),
Fit( NTanH( 3 ) )
);
NNReport = NN << Report;
NNReport << Save PDF("Path")
);Re: Automatizar la red neuronal@G_M Me gusta tu enfoque.
Para @giaMSU , todo lo que tiene que hacer es ejecutar un caso de su red neuronal y guardar el script en la ventana del script (o en el portapapeles). (Menú del triángulo rojo superior, última opción de la lista, "Guardar script")
Tome el script que escribió G_M y reemplace esta parte:
Neural(
Y( :Name( "Y" ) ),
X( :Name( "X1" ), :Name( "X2" ) ),
Validation( :Validation ),
Informative Missing( 0 ),
Set Random Seed( 1121 ),
Fit( NTanH( 3 ) )
);
con su secuencia de comandos neuronal, y es posible que esté listo para comenzar, o al menos el 90% del camino.
Re: Automatizar la red neuronalGracias por su ayuda. Escribí un script con un conjunto de datos de 2 ubicaciones.
Primero, utilicé un script neuronal guardado de una ejecución de NN en JMP 14 Pro. Usé dos capas ocultas con seis nodos y tres nodos, respectivamente.
Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
Esta parte funciona bien. Luego agrego el bucle For como sugerencia de G_M.
dt = Open( "E:/Ready_for_ANN/Subset of 765-450.jmp" );
Summarize(locs=BY(dt:ID))
For (
j=1, j<=NItems(locs),j++,
file = dt << Select Where(locs[j])== :ID << Subset(
file,
Output Table Name ("Model Subject File"))
);
NN = file << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)"),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
NNReport = NN << Report;
NNReport << Save PDF("E:/Ready_for_ANN/result")Entonces, no funciona.
Según aprendí del script, For Loop creó un subconjunto que incluye todos los ID desde j=1 hasta j++. Entonces este subconjunto será utilizado por el script neuronal. Pero la parte neuronal no está incluida en el bucle For. Entonces, no es lo que quiero hacer.
Quiero crear un subconjunto de 1 datos de ubicación y ejecutar el sistema neuronal para este subconjunto en cada paso.Corrija si me equivoco.
Adjunté aquí mi subconjunto de datos (02 ubicaciones).
Por favor ayudame a resolver el problema.
Gracias de antemano.
Re: Automatizar la red neuronalHola buenos días,
Probé tu guión. Funciona bien pero no exactamente como deseo. Parece que el script extrae datos de todas las ubicaciones para crear un subconjunto y luego ejecuta el neural. Lo probé con un subconjunto de 02 ubicaciones. El neural funcionó dos veces. Sin embargo, sus informes son los mismos. Entonces creo que For Loop tiene algunos problemas. Me podría ayudar ? Adjunté mi script y mis datos en esta discusión en caso de que necesite usarlos.
GraciasRe: Automatizar la red neuronalCreo que el problema es que necesita agregar la función Char alrededor de :ID en la función Seleccionar dónde.
Select Where(loc[j] == Char(:ID))
Re: Automatizar la red neuronalEl guión funciona bien ahora.
Hay un pequeño problema en el guión. Dado que el nombre del archivo es "Archivo de subconjunto de modelo", el script reemplaza el archivo PDF en cada paso. Cuando termine, solo habrá un archivo en la carpeta. ¿Podría ayudarme a agregar el ID de ubicación al nombre del archivo para que el script pueda registrar cada informe con un nombre único?
Gracias
Re: Automatizar la red neuronalParece que el informe se está redactando demasiado. Intente concatenar el ID con el informe como se muestra a continuación:
Save PDF("C:\test\model_"|| Char(i) ||".pdf");Re: Automatizar la red neuronalHola buenos días
Como ayuda, realicé casi mil análisis de redes neuronales. Además, guardé mil archivos pdf de los informes de NN. Luego, se convirtió en un problema ya que necesito leer manualmente muchos archivos pdf para obtener el R2 de cada NN.
Intenté agregar Obtenga la prueba Rsquare al script para que pueda mostrar los valores de R2. Luego puedo guardarlos junto con un archivo usando
obj << Save (Get Gen RSquare Test)
El script todavía se está ejecutando, pero no guarda el valor de R2 en ninguna parte. No puedo ver el valor.
¿Podrías ayudarme con este problema?
Muchas gracias.
GN
Re: Automatizar la red neuronal@giaMSU , entonces la forma en que probablemente me acerque es acceder a la capa del informe y obtener el valor del cuadro de visualización apropiado en la estructura de árbol de la capa del informe. Una vez capturada, la estadística R^2_i del informe puede insertar el valor en una Lista y luego crear una tabla de datos a partir de la lista, o crear una tabla de datos y concatenar los valores en una sola tabla de datos. Busque Mostrar estructura de árbol en el índice de secuencias de comandos.
Re: Automatizar la red neuronalAprenda el guión.Re: Automatizar la red neuronalHola @giaMSU ,
Me gusta la idea de automatizar el ajuste NN y he hecho algo similar para otras plataformas. Creo que intentaré hacer algo similar para NN para probar varios parámetros de ajuste en la plataforma NN para encontrar un ajuste óptimo.
He hecho algo muy similar, pero con una plataforma de modelado diferente (bosque aleatorio y árboles potenciados). Incluiré mi código a continuación con descripciones de lo que hacen las líneas principales.
Sin embargo, en general, no estás proporcionando nueva información al NN fit cada vez que seleccionas una nueva ubicación. En realidad, el ajuste debe realizarse dentro de un bucle FOR. Tengo el mío como código de secuencia de comandos dentro de mi tabla de datos y hago esto porque necesito ejecutar una tabla de ajuste muy grande para obtener el mejor ajuste, y cuando lo hago de esta manera, ahorra mucha memoria para mi computadora, además de usted. Puede hacer más de 24k+ filas en una tabla de datos de esta manera, dejándola ejecutarse durante la noche.
Por cierto, el concepto original de esto y la idea del bucle para el ajuste me llegaron a través de una publicación de gzmorgan0, pero no recuerdo la publicación original. Lo uso todo el tiempo.
Names Default To Here( 1 );//keeps all variables local<BR />
dt = Data Table( "My data table" ); //this is where you specify your data table with the :Y and :X columns
dt_pars = Data Table( "tuning table" ); //for me, this is my tuning table that has modified tuning parameters. For you, it might be the "Model Subject File" data table.
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //this just duplicate the above dt because I want to add columns for recording fit parameters.
<BR />//the below portion creates new columns for recording the fit parameters.<BR />dt_results << New Column("Overall In Bag RMSE");
dt_results << New Column("Overall Out of Bag RMSE");
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
<BR />//The FOR loop here is to actually run the fit with each of the different tuning parameters.
For( i = 1, i <= N Row( dt_pars ), i++,<BR /> //these next few lines pulls the NEW fit parameters to put into the model fit. This would be each new row of data (location) for your case
NumTrees = dt_pars:Number Trees[i];
NumTerms = dt_pars:Number Terms[i];
PortBoot = dt_pars:Portion Bootstrap[i];
MinSplpTr = dt_pars:Minimum Splits per Tree[i];
MaxSplpTr = dt_pars:Maximum Splits per Tree[i];
MinSplSz = dt_pars:Minimum Size Split[i];<BR /><BR /> //this next section is a string that will be evaluated below and represents what you would do via a normal GUI in JMP.
str = Eval Insert(
"report = (dt << Bootstrap Forest( //this is the fit method
Y( :Y_Response ), //whatever your response variable is
X(
:X_1, //these are all your x variables that you put in (which you want to be changing each time)
:X_2,
:X_3,
),
Minimum Size Split( ^MinSplSz^ ), //here is where something is changing and the new values are inserted via the ^ ^ and fed to the fit method. Here is where you'd want to do something similar, but above with the :X's
Validation Portion( 0.2 ), //this too can even be a variable and changed each time.
Set Random Seed( ),
Method( \!"Bootstrap Forest\!" ), //this again defines the method
Minimum Splits per Tree( ^MinSplpTr^ ),
Maximum Splits per Tree( ^MaxSplpTr^ ),
Portion Bootstrap( ^PortBoot^ ),
Number Terms( ^NumTerms^ ),
Number Trees( ^NumTrees^ ),
Early Stopping( 0 ),
Go,
invisible
)) << Report;"
); //this closes the Eval Insert() command<BR />
Eval( Parse( str ) ); //this actually runs the fit for each iteration<BR /><BR /> //The below lines, I pull out the relevant fit statistic I want to evaluate from the report and save it to the data table called dt_results. I can then analyze my multiple thousand data points later and not chew up too much RAM.
Overall=report["Overall Statistics"][Number Col Box( 1 )] << Get;
R2 = report["Overall Statistics"][Number Col Box( 2 )] << Get;
RMSE = report["Overall Statistics"][Number Col Box( 3 )] << Get;
report << Close Window;
dt_results:Name("Overall In Bag RMSE")[i]=Overall[1];
dt_results:Name("Overall Out of Bag RMSE")[i]=Overall[2];
dt_results:Name("R² Training")[i] = R2[1];
dt_results:Name("R² Validation")[i] = R2[2];
dt_results:Name("RMSE Training")[i] = RMSE[1];
dt_results:Name("RMSE Validation")[i] = RMSE[2];
);Me imagino que deberías poder tomar el esquema de arriba y modificarlo según las necesidades específicas que tengas.
Como nota al margen, no olvide no solo realizar una validación de ajuste para no sobreajustar, sino también probar su capacidad predictiva en un conjunto de datos de prueba completamente no utilizado que haya separado de los datos de ajuste. Además, si te lo puedes permitir, recomendaría aumentar el número de tours >=25. La plataforma NN a veces necesita muchos más intentos, como en DOE, para encontrar un ajuste óptimo para un conjunto determinado de parámetros.
¡Buena suerte! Espero ver la solución final. Podría intentarlo también.
Gracias por comenzar este hilo.
DS