Main Content

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:

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 Stop button.

Neural network training progress window

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).

    Mean squared error against number of epochs for the training, validation, and test data. The best validation performance is 18.5252 at epoch 13.

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)

Graphical representation of the function fitting network. The network has input size 13, output size 1, and a single hidden layer of size 10.

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.

Output values against target values for the training, validation, test, and combined data.

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 y plotperform.

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

| | | | | |

Temas relacionados