Entrenar una red neuronal con datos tabulares
En este ejemplo se muestra cómo entrenar una red neuronal con datos tabulares.
Si tiene un conjunto de datos de características numéricas y categóricas (por ejemplo, datos tabulares sin dimensiones espaciales ni temporales), puede entrenar una red neuronal profunda utilizando una capa de entrada de características. En este ejemplo se entrena una red neuronal que predice la condición de los dientes de un engranaje con una tabla de lecturas numéricas y categóricas de sensores.
Cargar los datos de entrenamiento
Lea los datos de la caja de engranajes del archivo CSV "transmissionCasingData.csv"
.
filename = "transmissionCasingData.csv"; tbl = readtable(filename,TextType="String");
Convierta las etiquetas para la predicción en categóricas utilizando la función convertvars
.
labelName = "GearToothCondition"; tbl = convertvars(tbl,labelName,"categorical");
Visualice los nombres de las clases del conjunto de datos.
classNames = categories(tbl.(labelName))
classNames = 2×1 cell
{'No Tooth Fault'}
{'Tooth Fault' }
Para entrenar una red utilizando características categóricas, primero debe convertir las características categóricas al tipo de datos categórico. Convierta los predictores categóricos al tipo categórico con la función convertvars
especificando un arreglo de cadena que contenga los nombres de todas las variables de entrada categóricas. En este conjunto de datos, hay dos características categóricas con los nombres "SensorCondition"
y "ShaftCondition"
.
categoricalPredictorNames = ["SensorCondition" "ShaftCondition"]; tbl = convertvars(tbl,categoricalPredictorNames,"categorical");
Reserve datos para pruebas. Divida los datos en un conjunto de entrenamiento que contenga el 80% de los datos, un conjunto de validación que contenga el 10% de los datos y un conjunto de prueba que contenga el 10% restante de los datos. Para dividir los datos, use la función trainingPartitions
, incluida en este ejemplo como un archivo de soporte. Para acceder al archivo, abra el ejemplo como un script en vivo.
numObservations = size(tbl,1); [idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations,[0.80 0.1 0.1]); tblTrain = tbl(idxTrain,:); tblValidation = tbl(idxValidation,:); tblTest = tbl(idxTest,:);
Definir la arquitectura de una red neuronal
En este ejemplo se entrena la red neuronal para características de entrada categóricas haciendo una codificación one-hot. Para especificar el tamaño de entrada de la red neuronal, calcule el número de características de entrada que incluya los datos categóricos codificados one-hot. El número de características es el número de columnas numéricas de los datos de entrenamiento más el número total de categorías entre los predictores categóricos.
numCategoricalPredictors = numel(categoricalPredictorNames); numFeatures = size(tblTrain,2) - numCategoricalPredictors - 1; for name = categoricalPredictorNames numCategories = numel(categories(tblTrain.(name))); numFeatures = numFeatures + numCategories; end
Definir la arquitectura de la red neuronal.
Para la entrada de características, especifique una capa de entrada de características con un tamaño de entrada que coincida con el número de características.
Especifique una capa totalmente conectada con un tamaño de 16, seguida de una capa de normalización de capas y ReLU.
Para la salida de clasificación, especifique una capa totalmente conectada con un tamaño que coincida con el número de clases, seguida de una capa softmax.
hiddenSize = 16; numClasses = numel(classNames); layers = [ featureInputLayer(numFeatures) fullyConnectedLayer(hiddenSize) layerNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer];
Especificar las opciones de entrenamiento
Especifique las opciones de entrenamiento:
Entrenar usando el solver L-BFGS. Este solver es adecuado para tareas con redes pequeñas y cuando los datos caben en la memoria.
Entrenar usando la CPU. Dado que la red y los datos son pequeños, la CPU es más adecuada.
Hacer una codificación one-hot de las entradas categóricas.
Validar la red cada 5 iteraciones usando los datos de validación.
Devolver la red con la pérdida de validación más baja.
Muestre el progreso del entrenamiento en una gráfica y monitorice la métrica de precisión.
Suprimir la salida detallada.
options = trainingOptions("lbfgs", ... ExecutionEnvironment="cpu", ... CategoricalInputEncoding="one-hot", ... ValidationData=tblValidation, ... ValidationFrequency=5, ... OutputNetwork="best-validation", ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=false);
Entrenar redes neuronales
Entrene la red neuronal con la función trainnet
. Para la clasificación, utilice la pérdida de entropía cruzada.
[net,info] = trainnet(tblTrain,layers,"crossentropy",options);
La gráfica muestra la precisión y la pérdida del entrenamiento y la validación. Cuando se completa el entrenamiento, la gráfica muestra la razón de la detención. Cuando utiliza el solver L-BFGS, la razón de la detención puede mostrar que la búsqueda lineal ha fallado y que el software no ha podido encontrar una tasa de aprendizaje adecuada. Esta situación puede producirse cuando el solver alcanza un valor de pérdida mínimo rápidamente o cuando las normas de los pasos y los gradientes están cerca de cero.
Probar una red neuronal
Prediga las etiquetas de los datos de prueba con la red entrenada. Prediga las puntuaciones de clasificación utilizando la red entrenada y luego convierta las predicciones en etiquetas con la función onehotdecode
.
Pruebe la red neuronal con la función testnet
.
Evalúe la precisión de la clasificación de una sola etiqueta. La precisión es el porcentaje de predicciones correctas.
Haga una codificación one-hot de las entradas categóricas.
Pruebe la red neuronal con la CPU.
accuracy = testnet(net,tblTest,"accuracy", ... CategoricalInputEncoding="one-hot", ... ExecutionEnvironment="cpu")
accuracy = 86.3636
Visualice las predicciones en una gráfica de confusión separando los objetivos de los datos de prueba, haciendo predicción y, después, convirtiendo las puntuaciones a etiquetas.
Separe los objetivos de los datos.
TTest = tblTest.(labelName);
Realice predicciones con la función minibatchpredict
y convierta las puntuaciones de clasificación en etiquetas con la función scores2label
.
Haga una codificación one-hot de las entradas categóricas.
Realice predicciones con la CPU.
scoresTest = minibatchpredict(net,tblTest, ... CategoricalInputEncoding="one-hot", ... ExecutionEnvironment="cpu"); YTest = scores2label(scoresTest,classNames);
Visualice las predicciones en una gráfica de confusión.
confusionchart(TTest,YTest)
Consulte también
trainnet
| trainingOptions
| fullyConnectedLayer
| Deep Network Designer | featureInputLayer