Ajustar datos con una red neuronal superficial
Las redes neuronales son buenas para ajustar funciones. De hecho, existen evidencias de que una red neuronal bastante simple puede ajustar cualquier función práctica.
Por ejemplo, supongamos que cuenta con datos de una clínica y desea diseñar una red que pueda predecir el porcentaje de grasa corporal de una persona a partir de 13 medidas anatómicas. Dispone de un total de 252 personas de ejemplo de las cuales tiene esos 13 datos y sus porcentajes asociados de grasa corporal.
Puede resolver este problema de dos maneras distintas:
Utilizando la app Neural Net Fitting tal como se describe en Ajustar datos con la app Neural Net Fitting.
Utilizando la funciones de línea de comandos tal como se describe en Ajustar datos usando funciones de línea de comandos.
Generalmente, lo mejor es empezar con la app y luego usar la app para generar scripts de línea de comandos de forma automática. Antes de utilizar uno de los dos métodos, defina el problema seleccionando un conjunto de datos. Cada una de las apps de redes neuronales tiene acceso a muchos conjuntos de datos de muestra que puede utilizar para experimentar con la toolbox (consulte Conjuntos de datos de muestra para redes neuronales superficiales). Si tiene un problema concreto que desea resolver, puede cargar sus propios datos en el espacio de trabajo. En la sección siguiente se describe el formato de datos.
Sugerencia
Para crear y visualizar redes neuronales de deep learning de forma interactiva, utilice la app Deep Network Designer. Para obtener más información, consulte Introducción a Deep Network Designer.
Definir un problema
Para definir un problema de ajuste (regresión) para la toolbox, disponga un conjunto de vectores de entrada (predictores) como columnas en una matriz. Luego, disponga un conjunto de respuestas (los vectores de salida correctos para cada uno de los vectores de entrada) en una segunda matriz. Por ejemplo, puede definir un problema de regresión con cuatro observaciones, cada una con dos características de entrada y una sola respuesta, de la manera siguiente:
predictors = [0 1 0 1; 0 0 1 1]; responses = [0 0 0 1];
En la sección siguiente se muestra cómo entrenar una red para ajustar un conjunto de datos usando la app Neural Net Fitting. En este ejemplo se usa un conjunto de datos de ejemplo proporcionado con la toolbox.
Ajustar datos con la app Neural Net Fitting
En este ejemplo se muestra cómo entrenar una red neuronal superficial para que ajuste datos con la app Neural Net Fitting.
Abra la app Neural Net Fitting usando nftool
.
nftool
Seleccionar los datos
La app Neural Net Fitting cuenta con datos de ejemplo para ayudarle a empezar a entrenar una red neuronal.
Para importar datos de grasa corporal de ejemplo, seleccione Import > Import Body Fat Data Set. Puede usar este conjunto de datos para entrenar una red neuronal para que estime el porcentaje de grasa corporal de alguien a partir de varias medidas. Si importa sus propios datos desde un archivo o desde el espacio de trabajo, debe especificar los predictores y las respuestas, y si las observaciones están en filas o columnas.
En el resumen del modelo encontrará información sobre los datos importados. Este conjunto de datos incluye 252 observaciones, cada una con 13 características. Las respuestas contienen el porcentaje de grasa corporal de cada observación.
Divida los datos en conjuntos de entrenamiento, validación y prueba. Conserve la configuración predeterminada. Los datos se dividen en:
70% para entrenamiento.
15% para validar que la red está generalizando y para detener el entrenamiento antes de que se dé un sobreajuste.
15% para probar de forma independiente la generalización de la red.
Para obtener más información sobre la división de los datos, consulte Dividir datos para realizar un entrenamiento de red neuronal óptimo.
Crear una red
La red es una red prealimentada de dos capas con una función de transferencia sigmoide en la capa oculta y una función de transferencia lineal en la capa de salida. El valor del tamaño de la capa define el número de neuronas ocultas. Conserve el tamaño de capa predeterminado, 10. Puede ver la arquitectura de la red en el panel Network. La gráfica de la red se actualiza para reflejar los datos de entrada. En este ejemplo, los datos tienen 13 entradas (características) y una salida.
Entrenar la red
Para entrenar la red, seleccione Train > Train with Levenberg-Marquardt. Este es el algoritmo de entrenamiento predeterminado, y es el mismo que si se hace clic en Train.
Para la mayoría de los problemas, recomendamos Train with Levenberg-Marquardt (trainlm
). Para problemas pequeños o con ruido, la regularización bayesiana (trainbr
) puede ofrecer una solución mejor, pero tardará más tiempo. Para problemas grandes, se recomienda el gradiente conjugado escalado (trainscg
), ya que utiliza cálculos de gradientes que son más eficientes que los cálculos jacobianos que utilizan los otros dos algoritmos.
En el panel Training puede ver el progreso del entrenamiento. El entrenamiento continúa hasta que se cumple uno de los criterios. En este ejemplo, el entrenamiento continúa hasta que el error de validación es mayor o igual que el error de validación previamente más pequeño durante seis iteraciones de validación consecutivas ("Met validation criterion").
Analizar los resultados
En el resumen del modelo se incluye información sobre el algoritmo de entrenamiento y los resultados de entrenamiento de cada conjunto de datos.
Puede continuar analizando los resultados generando gráficas. Para representar la regresión lineal, en la sección Plots, haga clic en Regression. La gráfica de regresión muestra las predicciones de la red (salida) con respecto a las respuestas (objetivo) para los conjuntos de entrenamiento, validación y prueba.
Para obtener un ajuste perfecto, los datos deberían aparecer dispuestos a lo largo de una línea de 45 grados, donde las salidas de la red son iguales a las respuestas. Para resolver este problema, el ajuste es razonablemente bueno para todos los conjuntos de datos. Si necesita resultados más precisos, vuelva a entrenar la red haciendo clic en Train. Cada entrenamiento tendrá diferentes pesos y sesgos iniciales de la red y puede producir una red mejorada después del nuevo entrenamiento.
Consulte el histograma de errores para obtener una verificación adicional del rendimiento de la red. En la sección Plots, haga clic en Error Histogram.
Las barras azules representan los datos de entrenamiento, las verdes representan los datos de validación y las rojas representan los datos de prueba. El histograma proporciona una indicación de valores atípicos, que son los puntos de datos en los que el ajuste es significativamente peor que la mayoría de los datos. Es recomendable revisar los valores atípicos para determinar si los datos son deficientes o si esos puntos de datos son diferentes al resto de los datos. Si los valores atípicos son puntos de datos válidos, pero son diferentes al resto de los datos, entonces la red está extrapolando estos puntos. Debería recopilar más datos que se parezcan a los puntos atípicos y volver a entrenar la red.
Si no le satisface el rendimiento de la red, puede llevar a cabo una de las operaciones siguientes:
Entrenar la red de nuevo.
Aumentar el número de neuronas ocultas.
Usar un conjunto de datos de entrenamiento más extenso.
Si el rendimiento en el conjunto de entrenamiento es bueno, pero el rendimiento en el conjunto de pruebas es deficiente, esto puede indicar que el modelo está sobreajustando. Reducir el número de neuronas puede reducir el sobreajuste.
También puede evaluar el rendimiento de la red en un conjunto de pruebas adicional. Para cargar datos de pruebas adicionales con los que evaluar la red, en la sección Test, haga clic en Test. En el resumen del modelo se muestran los resultados de la prueba adicional. También se pueden generar gráficas para analizar los resultados de los datos de las pruebas adicionales.
Generar código
Seleccione Generate Code > Generate Simple Training Script para crear código de MATLAB con el fin de reproducir los pasos anteriores de la línea de comandos. Crear código de MATLAB puede ser útil si desea aprender a utilizar la funcionalidad de la línea de comandos de la toolbox para personalizar el proceso de entrenamiento. En Ajustar datos usando funciones de línea de comandos puede investigar los scripts generados con más detalle.
Exportar la red
Puede exportar la red entrenada al espacio de trabajo o a Simulink®. También puede desplegar la red con las herramientas de MATLAB Compiler™ y otras herramientas de generación de código de MATLAB. Para exportar la red entrenada y los resultados, seleccione Export Model > Export to Workspace.
Ajustar datos usando funciones de línea de comandos
La forma más sencilla de aprender a usar la funcionalidad de la línea de comandos de la toolbox es generar scripts a partir de las aplicaciones y luego modificarlos para personalizar el entrenamiento de la red. Como ejemplo, observe el script simple que se ha creado en la sección anterior usando la app Neural Net Fitting.
% Solve an Input-Output Fitting problem with a Neural Network % Script generated by Neural Fitting app % Created 15-Mar-2021 10:48:13 % % This script assumes these variables are defined: % % bodyfatInputs - input data. % bodyfatTargets - target data. x = bodyfatInputs; t = bodyfatTargets; % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation. % Create a Fitting Network hiddenLayerSize = 10; net = fitnet(hiddenLayerSize,trainFcn); % Setup Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Train the Network [net,tr] = train(net,x,t); % Test the Network y = net(x); e = gsubtract(t,y); performance = perform(net,t,y) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotregression(t,y) %figure, plotfit(net,x,t)
Puede guardar el script y luego ejecutarlo desde la línea de comandos para reproducir los resultados de la sesión de entrenamiento anterior. También puede editar el script para personalizar el proceso de entrenamiento. En este caso, siga todos los pasos del script.
Seleccionar los datos
El script asume que los vectores predictores y de respuesta ya están cargados en el espacio de trabajo. Si los datos no están cargados, puede cargarlos de la forma siguiente:
load bodyfat_dataset
Este comando carga los predictores bodyfatInputs
y las respuestas bodyfatTargets
en el espacio de trabajo.
Este es uno de los conjuntos de datos de ejemplo de la toolbox. Para obtener información sobre los conjuntos de datos disponibles, consulte Conjuntos de datos de muestra para redes neuronales superficiales. También puede ver una lista de todos los conjuntos de datos disponibles introduciendo el comando help nndatasets
. Puede cargar las variables de cualquiera de estos conjuntos de datos utilizando sus propios nombres de variables. Por ejemplo, el comando
[x,t] = bodyfat_dataset;
cargará los predictores de grasa corporal en el arreglo x
y las respuestas de grasa corporal en el arreglo t
.
Elegir un algoritmo de entrenamiento
Elija un algoritmo de entrenamiento. La red usa el algoritmo predeterminado de Levenberg-Marquardt (trainlm
) para el entrenamiento.
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
Para problemas en los que Levenberg-Marquardt no genera los resultados precisos deseados, o para problemas de datos grandes, considere establecer la función de entrenamiento de la red en regularización bayesiana (trainbr
) o gradiente conjugado escalado (trainscg
), respectivamente, con uno de los siguientes comandos:
net.trainFcn = 'trainbr'; net.trainFcn = 'trainscg';
Crear una red
Cree una red. La red predeterminada para problemas de ajuste de funciones (o regresión), fitnet
, es una red prealimentada con la función de transferencia sigmoide tangencial predeterminada en la capa oculta y la función de transferencia lineal en la capa de salida. La red tiene una sola capa oculta con diez neuronas (valor predeterminado). La red tiene una sola neurona de salida porque solo hay un valor de respuesta asociado con cada vector de entrada.
hiddenLayerSize = 10; net = fitnet(hiddenLayerSize,trainFcn);
Nota
Más neuronas requieren más cálculos y tienen tendencia a sobreajustar los datos cuando el número establecido es demasiado alto, pero permiten que la red resuelva problemas más complicados. Más capas requieren más cálculos, pero mediante su uso la red podría resolver problemas complejos de manera más eficiente. Para utilizar más de una capa oculta, introduzca los tamaños de las capas ocultas como elementos de un arreglo en el comando fitnet
.
Dividir datos
Configure la división de datos.
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
Con esta configuración, los vectores predictores y los vectores de respuesta se dividen aleatoriamente, con un 70% para entrenamiento, un 15% para validación y un 15% para prueba. Para obtener más información sobre el proceso de división de datos, consulte Dividir datos para realizar un entrenamiento de red neuronal óptimo.
Entrenar la red
Entrene la red.
[net,tr] = train(net,x,t);
Durante el entrenamiento, se abre la ventana de progreso del entrenamiento. El entrenamiento se puede interrumpir en cualquier momento haciendo clic en el botón de detener .
El entrenamiento finaliza cuando el error de validación es mayor o igual que el error de validación previamente más pequeño durante seis iteraciones de validación consecutivas. Si hace clic en Performance en la ventana de entrenamiento, aparece una gráfica de los errores de entrenamiento, validación y prueba, tal como se muestra en la figura siguiente. En este ejemplo, el resultado es razonable debido a las consideraciones siguientes:
El error cuadrático medio final es pequeño.
El error del conjunto de prueba y el error del conjunto de validación presentan características similares.
No se ha producido ningún sobreajuste significativo en la época 13 (donde se produce el mejor rendimiento de validación).
Probar la red
Realice pruebas con la red. Una vez que se ha entrenado la red, puede usarla para calcular las salidas de la red. Con el código siguiente se pueden calcular las salidas, los errores y el rendimiento general de la red.
y = net(x); e = gsubtract(t,y); performance = perform(net,t,y)
performance = 16.2815
También es posible calcular el rendimiento de la red solo en el conjunto de prueba usando los índices de prueba, que se encuentran en el registro de entrenamiento. Para obtener más información, consulte Analyze Shallow Neural Network Performance After Training.
tInd = tr.testInd; tstOutputs = net(x(:,tInd)); tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform = 20.1698
Visualizar la red
Visualice el diagrama de la red.
view(net)
Analizar los resultados
Analice los resultados. Para realizar una regresión lineal entre las predicciones de la red (salidas) y las respuestas correspondientes (objetivos), en la ventana de entrenamiento, haga clic en Regression.
La salida realiza el seguimiento de las respuestas de los conjuntos de entrenamiento, prueba y validación, y el valor R es superior a 0,87 para el conjunto de datos total. Si necesita resultados aún más precisos, puede probar alguno de estos métodos:
Restablecer los pesos y sesgos iniciales de la red a nuevos valores con
init
y volver a entrenar.Aumentar el número de neuronas ocultas.
Usar un conjunto de datos de entrenamiento más extenso.
Aumentar el número de valores de entrada, si existe más información relevante disponible.
Probar un algoritmo de entrenamiento diferente (consulte Training Algorithms).
En este caso, la respuesta de la red es satisfactoria y ahora puede empezar a usar datos nuevos en ella.
Siguientes pasos
Para adquirir más experiencia en operaciones de línea de comandos, intente realizar algunas de estas tareas:
Durante el entrenamiento, abra una ventana de gráfica (como la gráfica de regresión) y observe cómo se anima.
Puede generar gráficas desde la línea de comandos con funciones tales como
plotfit
,plotregression
,plottrainstate
yplotperform
.
Además, consulte el script avanzado para obtener más opciones cuando realice el entrenamiento desde la línea de comandos.
Cada vez que se entrena una red neuronal, puede dar como resultado una solución diferente debido a valores iniciales de pesos y sesgos aleatorios, así como a diferentes divisiones de los datos en conjuntos de entrenamiento, validación y prueba. Como resultado, diferentes redes neuronales entrenadas para el mismo problema pueden dar diferentes salidas para la misma entrada. Para asegurarse de que se ha encontrado una red neuronal con una buena precisión, vuelva a entrenarla varias veces.
Existen varias técnicas para mejorar las soluciones iniciales si se desea una mayor precisión. Para obtener más información, consulte Improve Shallow Neural Network Generalization and Avoid Overfitting.
Consulte también
Neural Net Fitting | Neural Net Time Series | Neural Net Pattern Recognition | Neural Net Clustering | Deep Network Designer | trainlm
| fitnet