Saltar al contenido principal
LibreTexts Español

7.3: Aprendizaje automático

  • Page ID
    150002
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Los métodos explicados en esta sección no son solo visualizaciones. Juntos, frecuentemente llamaban “clasificación con aprendizaje”, “clasificación supervisada”, “aprendizaje automático”, o simplemente “clasificación”. Todos ellos se basan en la idea de aprender:

    ... Se agolpó y se puso de pie.... No veía más que colores, colores que se negaron a formarse en cosas. Además, aún no sabía nada lo suficientemente bien como para verlo: no se pueden ver las cosas hasta que no se sabe más o menos cuáles son\(^{[1]}\). Su primera impresión fue de un mundo brillante y pálido, un mundo de acuarela

    Screen Shot 2019-01-25 en 3.51.20 PM.png
    Figura Gráfica\(\PageIndex{1}\) Procrustes que muestra la ordenación T-SNE frente a la ordenación PCA objetivo.

    de la caja de pintura de un niño; un momento después reconoció el cinturón plano de azul claro como una lámina de agua, o de algo así como agua, que casi se puso de pie. Estaban en la orilla de un lago o río...

    C.S.Lewis. Fuera del Planeta Silencioso.

    En primer lugar, pequeña parte de los datos donde ya se conoce la identidad (conjunto de datos de entrenamiento) se utiliza para desarrollar (ajustar) el modelo de clasificación (Figura\(\PageIndex{2}\)). En el siguiente paso, este modelo se utiliza para clasificar objetos con identidad desconocida (testing dataset). En la mayoría de estos métodos, es posible estimar la calidad de la clasificación y también evaluar la significancia de cada carácter.

    Vamos a crear conjuntos de datos de entrenamiento y pruebas a partir de datos de iris:

    Screen Shot 2019-01-25 at 3.55.01 PM.png
    Figura Representación\(\PageIndex{2}\) gráfica del aprendizaje automático estadístico. El azul es un conjunto de datos de entrenamiento, las líneas rojas es el modelo de clasificación, el verde es un conjunto de datos de prueba, las líneas discontinuas muestran el proceso de predicción (

    Código\(\PageIndex{1}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]

    (iris.unknown es por supuesto el falso desconocido así que para usarlo correctamente, debemos especificar iris.unknown [, -5]. Por otro lado, la información de especies ayudará a crear tabla de clasificación errónea (matriz de confusión, ver más adelante).)

    Aprendiendo con regresión

    Análisis discriminante lineal

    Uno de los métodos más simples de clasificación es el análisis discriminante lineal (LDA). La idea básica es crear el conjunto de funciones lineales que “decidan” cómo clasificar el objeto en particular.

    Código\(\PageIndex{2}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(MASS)
    iris.lda <- lda(Species ~ . , data=iris.train)
    iris.predicted <- predict(iris.lda, iris.unknown[, 1:4])
    Misclass(iris.predicted$class, iris.unknown[, 5]) # asmisc.r

    El entrenamiento resultó en la hipótesis que permitió que casi todas las plantas (con excepción de siete Iris virginica) fueran colocadas en el grupo adecuado. Tenga en cuenta que LDA no requiere escalado de variables.

    Es posible verificar los resultados de LDA con métodos inferenciales. El análisis multidimensional de variación (MANOVA) permite comprender la relación entre datos y modelo (clasificación a partir de LDA):

    Código\(\PageIndex{3}\) (R):

    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    ldam <- manova(as.matrix(iris.unknown[, 1:4]) ~ iris.predicted$class)
    summary(ldam, test="Wilks")

    Aquí son importantes tanto el valor p basado en las estadísticas de Fisher, como también el valor de las estadísticas de Wilks que es la razón de verosimilitud (en nuestro caso, la probabilidad de que los grupos no sean diferentes).

    Es posible verificar la importancia relativa de cada personaje en LDA con técnicas similares a Anova:

    Código\(\PageIndex{4}\) (R):

    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    summary(aov(as.matrix(iris.unknown[, 1:4]) ~ iris.predicted$class))

    (Esta idea también es aplicable a otros métodos de clasificación).

    ... y también visualizar los resultados de LDA (Figura\(\PageIndex{3}\)):

    Código\(\PageIndex{5}\) (R):

    library(MASS)
    iris.lda2 <- lda(iris[, 1:4], iris[, 5])
    iris.ldap2 <- predict(iris.lda2, dimen=2)$x
    plot(iris.ldap2, type="n", xlab="LD1", ylab="LD2")
    text(iris.ldap2, labels=abbreviate(iris[, 5], 1, method="both.sides"))
    Ellipses(iris.ldap2, as.numeric(iris[, 5]), centers=TRUE) # asmisc.r

    (Tenga en cuenta elipses de confianza del 95% con centros.)

    Screen Shot 2019-01-25 en 4.01.16 PM.png
    Figura Representación\(\PageIndex{3}\) gráfica de los resultados del análisis discriminante lineal. Elipses de confianza al 95% y sus centros añadidos con la función Elipses ().

    Para colocar todos los puntos en la parcela, simplemente usamos todos los datos como entrenamiento. Obsérvese la buena discriminación (mayor que en PCA, MDS o agrupamiento), incluso entre Iris versicolor cercano e I. virginica. Esto se debe a que la LDA frecuentemente sobreestima las diferencias entre grupos. Esta característica, y también la parametricidad y linealidad de LDA, la hicieron menos utilizada en los últimos años.

    Con LDA, es fácil ilustrar un concepto más importante del aprendizaje automático: la calidad de la capacitación. Considera el siguiente ejemplo:

    Código\(\PageIndex{6}\) (R):

    set.seed(230)
    iris.sample2 <- sample(1:nrow(iris), 30)
    iris.train2 <- iris[iris.sample2, ]
    iris.unknown2 <- iris[-iris.sample2, ]
    library(MASS)
    iris.lda2 <- lda(Species ~ . , data=iris.train2)
    iris.predicted2 <- predict(iris.lda2, iris.unknown2[, 1:4])
    Misclass(iris.predicted2$class, iris.unknown2[, 5])

    Error de clasificación errónea aquí ¡casi dos veces más grande! ¿Por qué?

    Código\(\PageIndex{7}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    set.seed(230)
    iris.sample2 <- sample(1:nrow(iris), 30)
    iris.train2 <- iris[iris.sample2, ]
    table(iris.train2$Species)

    Bueno, el uso de sample () (y particular set.seed () value) resultó en una muestra de entrenamiento sesgada, es por eso que nuestro segundo modelo se entrenó tan mal. Nuestra primera forma de muestrear (cada quinto iris) fue mejor, y si es necesario usar sample (), considere muestrear cada especie por separado.

    Ahora, vuelva a la configuración predeterminada del generador de números aleatorios:

    Código\(\PageIndex{8}\) (R):

    set.seed(NULL)

    Tenga en cuenta que es ampliamente conocido que si bien el LDA se desarrolló sobre material biológico, este tipo de datos rara vez cumple con dos supuestos clave de este método: (1) normalidad multivariada y (2) homocedasticidad multivariada. Sorprendentemente, ¡incluso los datos de Fisher's Iris con los que se inventó LDA, no cumplen con estos supuestos! Por lo tanto, no recomendamos usar LDA y mantenerla aquí principalmente con fines de enseñanza.

    Partición recursiva

    Para reemplazar el análisis discriminante lineal, se inventaron múltiples métodos con ideas de fondo similares. La partición recursiva, o árboles de decisión (árboles de regresión, árboles de clasificación), permiten, entre otras cosas, hacer y visualizar el tipo de clave de discriminación donde cada paso da como resultado la división de objetos en dos grupos (Figura\(\PageIndex{4}\)):

    Código\(\PageIndex{9}\) (R):

    set.seed(NULL)
    library(tree)
    iris.tree <- tree(Species ~ ., data=iris)
    plot(iris.tree)
    text(iris.tree)

    Primero cargamos el paquete de árbol que contiene la función tree () (rpart es otro paquete que hace árboles de clasificación). Luego nuevamente usamos todo el conjunto de datos como datos de entrenamiento. La parcela muestra que todas las plantas con longitud de pétalo inferior a 2.45 cm pertenecen a Iris setosa, y del resto aquellas plantas que tienen un ancho de pétalo inferior a 1.75 cm y una longitud de pétalo superior a 4.95 cm, son I. versicolor; todos los demás iris pertenecen a I. virginica.

    De hecho, estos árboles son resultado de algo similar al “análisis discriminante jerárquico”, y es posible utilizarlos para la clasificación supervisada:

    Código\(\PageIndex{10}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    iris.tree2 <- tree(Species ~ ., data=iris.train)
    iris.tp2 <- predict(iris.tree2, iris.unknown[,-5], type="class")
    library(MASS)
    Misclass(iris.tp2, iris.unknown[, 5])
    Screen Shot 2019-01-25 a las 4.09.30 PM.png
    Figura Árbol de\(\PageIndex{4}\) clasificación para los datos del iris del paquete de árbol.

    Trate de averiguar qué caracteres distinguen especies de colas de caballo descritas en el archivo de datos eq.txt. El archivo eq_c.txt contiene la descripción de los caracteres.

    Package Party ofrece sofisticados métodos de partición recursiva junto con gráficas de árbol avanzadas (Figura\(\PageIndex{5}\)):

    Código\(\PageIndex{11}\) (R):

    library(party)
    SA <- abbreviate(iris$Species, 1, method="both.sides")
    iris.ct <- ctree(factor(SA) ~ ., data=iris[, 1:4])
    plot(iris.ct)
    library(MASS)
    Misclass(SA, predict(iris.ct))

    (Para los nombres de especies, usamos abreviaturas de una letra.)

    Ensamble learnig

    Bosque Aleatorio

    El otro método, internamente similar a los árboles de regresión, gana rápidamente popularidad. Este es el Bosque Aleatorio. Su nombre proviene de la capacidad de utilizar numerosos árboles de decisión y construir el complejo modelo de clasificación. Random Forest pertenece a los métodos de ensacado de conjuntos; utiliza bootstrap (ver en Apéndice) para multiplicar el número de árboles en el modelo (de ahí “bosque”). A continuación se muestra un ejemplo del clasificador Random Forest hecho a partir de los datos del iris:

    Código\(\PageIndex{12}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(randomForest)
    set.seed(17)
    iris.rf <- randomForest(Species ~ ., data=iris.train)
    iris.rfp <- predict(iris.rf, iris.unknown[,-5])
    library(MASS)
    Misclass(iris.rfp, iris.unknown[, 5])
    Screen Shot 2019-01-25 a las 4.16.36 PM.png
    Figura Árbol de\(\PageIndex{5}\) clasificación para los datos del iris del paquete de fiesta.

    Aquí los resultados son similares a LDA pero Random Forest permite más. Por ejemplo, puede aclarar la importancia de cada personaje (con función importance ()), y revelar distancias de clasificación (proximidades) entre todos los objetos de subconjunto de entrenamiento (estas distancias podrían ser a su vez utilizadas para la agrupación). Random Forest también podría visualizar el dataset multidimensional (Figura\(\PageIndex{6}\)):

    Código\(\PageIndex{13}\) (R):

    library(randomForest)
    set.seed(17) # because plot is random
    iris.urf <- randomForest(iris[,-5])
    iris.rfm <- MDSplot(iris.urf, iris[, 5], xlab="", ylab="", pch=abbreviate(iris[, 5], 1, method="both.sides"))
    Pal <- brewer.pal(nlevels(iris[, 5]), "Set1")
    Hulls(iris.rfm$points, as.numeric(iris[, 5]), centers=TRUE, usecolor=Pal) # asmisc.r

    (Aplicamos varios trucos para mostrar los cascos convexos y sus centroides).

    Screen Shot 2019-01-25 a las 4.20.10 PM.png
    Figura\(\PageIndex{6}\) Visualización de datos de iris con la ayuda de “Bosque Aleatorio”. Cascos y sus centroides añadidos con la función Cascos ().

    Package ranger implementa una variante aún más rápida del algoritmo Random Forest, también puede emplear cálculos paralelos.

    Impulso de gradiente

    Hay muchos métodos de clasificación débiles que suelen cometer errores de clasificación errónea altos. Sin embargo, muchos de ellos también son ultrarrápidos. Entonces, ¿es posible combinar muchos aprendices débiles para hacer el fuerte? ¡Sí! Esto es lo que hacen los métodos de impulso. El impulso de gradiente emplea la optimización de varios pasos y ahora se encuentra entre las técnicas de aprendizaje más frecuentemente utilizadas. En R, hay varios paquetes de refuerzo de gradiente, por ejemplo, xgboost y gbm:

    Código\(\PageIndex{14}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(gbm)
    set.seed(4)
    iris.gbm <- gbm(Species ~ ., data=rbind(iris.train, iris.train)) # to make training bigger
    Distribution not specified, assuming multinomial ...
    plot(iris.gbm)
    iris.gbm.p1 <- predict.gbm(iris.gbm, iris.unknown, n.trees=iris.gbm$n.trees)
    iris.gbm.p2 <- apply(iris.gbm.p1, 1, # membership trick function(.x) colnames(iris.gbm.p1)[which.max(.x)])
    library(MASS)
    Misclass(iris.gbm.p2, iris.unknown[, 5])

    (La trama es puramente técnica; en la forma anterior, mostrará el efecto marginal (efecto sobre la pertenencia) de la 1ª variable. Por favor, hágalo usted mismo. “Truco de membresía” selecciona la “mejor especie” de tres alternativas, ya que gbm () informa el resultado de clasificación en forma difusa.)

    Aprendiendo con proximidad

    El algoritmo K-Neighbors más cercano (o KnN) es el “clasificador perezoso” porque no funciona hasta que se suministran datos desconocidos:

    Código\(\PageIndex{15}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(class)
    iris.knn.pred <- knn(train=iris.train[,-5], test=iris.unknown[,-5], cl=iris.train[, 5], k=5)
    library(MASS)
    Misclass(iris.knn.pred, iris.unknown[, 5])

    KnN se basa en el cálculo de distancia y el “voto”. Calcula distancias desde cada objeto desconocido hasta cada objeto del conjunto de entrenamiento. A continuación, considera varios (5 en el caso anterior) vecinos más cercanos con identidad conocida y encuentra cuál id prevalece. Esta identificación prevalente asignada al miembro desconocido. La función knn () usa distancias euclidianas pero en principio, cualquier distancia funcionaría para kNn.

    Para ilustrar la idea de los vecinos más cercanos, utilizamos la descomposición de Voronoi, la técnica que se aproxima tanto a KnN como al cálculo de distancia:

    Código\(\PageIndex{16}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    iris.p <- prcomp(iris[, 1:4], scale=TRUE)$x[, 1:2]
    iris.p1 <- iris.p[seq(1, nrow(iris.p), 5), ]
    iris.p2 <- iris.p[-seq(1, nrow(iris.p), 5), ]
    library(tripack)
    iris.v <- voronoi.mosaic(iris.p1[, 1], iris.p1[, 2], duplicate="remove")
    plot(iris.v, do.points=FALSE, main="", sub="")
    points(iris.p1[, 1:2], col=iris.train$Species, pch=16, cex=2)
    points(iris.p2[, 1:2], col=iris.unknown$Species)

    La gráfica (Figura\(\PageIndex{7}\)) contiene múltiples celdas que representan barrios de muestra de entrenamiento (puntos grandes). Esto no es exactamente lo que hace KnN, pero la idea es igual. De hecho, la trama Voronoi es una buena herramienta para visualizar cualquier enfoque basado en la distancia.

    Clasificación de profundidad basada en qué tan cerca se encuentra un punto arbitrario del espacio a un centro definido implícitamente de una nube de datos multidimensional:

    Screen Shot 2019-01-25 a las 4.27.50 PM.png
    Figura\(\PageIndex{7}\) Visualización de puntos de datos de entrenamiento barrios con descomposición Voronoi.

    Código\(\PageIndex{17}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(ddalpha)
    iris.dd <- ddalpha.train(Species ~ ., data=iris.train)
    iris.p <- predict(iris.dd, iris.unknown[, -5])
    library(MASS)
    Misclass(unlist(iris.p), iris.unknown[, 5]) # asmisc.r
    iris.pp <- predict(iris.dd, iris.unknown[, -5], outsider.method="Ignore")
    sapply(iris.pp, as.character) # shows points outside train clouds

    Aprendiendo con reglas

    El clasificador Naïve Bayes es uno de los algoritmos de aprendizaje automático más simples que trata de clasificar objetos en función de las probabilidades de atributos previamente vistos. De manera inesperada, suele ser un buen clasificador:

    Código\(\PageIndex{18}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(e1071)
    iris.nb <- naiveBayes(Species ~ ., data=iris.train)
    iris.nbp <- predict(iris.nb, iris.unknown[,-5])
    library(MASS)
    Misclass(iris.nbp, iris.unknown[, 5]) # asmisc.r

    Tenga en cuenta que el clasificador Naïve Bayes podría usar no solo numéricos como los anteriores, sino también predictores nominales (que es similar al análisis de correspondencia).

    El método Apriori es similar a los árboles de regresión pero en lugar de clasificar objetos, investiga reglas de asociación entre clases de objetos. Este método podría ser utilizado no sólo para encontrar estas reglas sino también para hacer clasificación. Tenga en cuenta que los datos de iris de medición son menos adecuados para las reglas de asociación que los datos nominales, y primero necesitan discretización:

    Código\(\PageIndex{19}\) (R):

    library(arulesCBA)
    irisd <- as.data.frame(lapply(iris[1:4], discretize, categories=9))
    irisd$Species <- iris$Species
    irisd.train <- irisd[seq(1, nrow(irisd), 5), ]
    irisd.unknown <- irisd[-seq(1, nrow(irisd), 5), ]
    irisd.cba <- CBA(Species ~ ., irisd.train, supp=0.05, conf=0.8)
    inspect(irisd.cba$rules)
    irisd.cbap <- predict(irisd.cba, irisd.unknown)
    library(MASS)
    Misclass(irisd.cbap, irisd.unknown$Species)

    (Las reglas se explican por sí mismas. ¿Qué opinas, este método funciona mejor para los datos nominales? Por favor averiguarlo.)

    Aprendiendo de la caja negra

    Famoso SVM, Support Vector Machines es una técnica de kernel que calcula parámetros de los hiperplanos dividiendo múltiples grupos en el espacio multidimensional de caracteres:

    Código\(\PageIndex{20}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    library(e1071)
    iris.svm <- svm(Species ~ ., data=iris.train)
    iris.svmp <- predict(iris.svm, iris.unknown[,-5])
    Misclass(iris.svmp, iris.unknown[, 5]) # asmisc.r

    La clasificación o cuadrícula de predicción a menudo ayuda a ilustrar el método SVM. Los puntos de datos se disponen con PCA para reducir la dimensionalidad, y luego el clasificador predice la identidad para cada punto en la cuadrícula hecha artificialmente (Figura\(\PageIndex{8}\)). Esto es posible realizarlo manualmente pero la función Gradd () simplifica el trazado:

    Código\(\PageIndex{21}\) (R):

    iris.p <- prcomp(iris[, 1:4], scale=TRUE)$x[, 1:2]
    iris.svm.pca <- svm(Species ~ ., data=cbind(iris[5], iris.p))
    plot(iris.p, type="n", xlab="", ylab="")
    Gradd(iris.svm.pca, iris.p) # gmoon.r
    text(iris.p, col=as.numeric(iris[, 5]), labels=abbreviate(iris[, 5], 1, method="both.sides"))

    Y finalmente, ¡redes neuronales! Este nombre se utiliza para la técnica estadística basada en algunas características de las células neuronales, las neuronas. Primero, necesitamos preparar datos y convertir la variable categórica Species en tres variables ficticias lógicas:

    Código\(\PageIndex{22}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.dummy <- Tobin(iris.train$Species, convert.names=FALSE) # asmisc.r
    iris.train2 <- cbind(iris.train[, -5], iris.dummy)
    str(iris.train2)

    Ahora, llamamos paquete neuralnet y procedemos al cálculo principal. El paquete “quiere” suministrar todos los términos del modelo explícitamente:

    Screen Shot 2019-01-26 a las 12.43.02 AM.png
    Figura Cuadrícula de\(\PageIndex{8}\) clasificación que ilustra el algoritmo SVM. Los puntos de datos están dispuestos con PCA.

    Código\(\PageIndex{23}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.dummy <- Tobin(iris.train$Species, convert.names=FALSE) # asmisc.r
    iris.train2 <- cbind(iris.train[, -5], iris.dummy)
    library(neuralnet)
    set.seed(17)
    iris.n <- neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data=iris.train2, hidden=3, lifesign="full")

    (Tenga en cuenta el uso de set.seed (), esto es para que sus resultados sean similares a los que se presentan aquí.)

    Ahora predice (con la función compute ()) y verifica la clasificación errónea:

    Código\(\PageIndex{24}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.unknown <- iris[-seq(1, nrow(iris), 5), ]
    iris.dummy <- Tobin(iris.train$Species, convert.names=FALSE) # asmisc.r
    iris.np <- compute(iris.n, iris.unknown[,-5])
    iris.np2 <- apply(iris.np$net.result, 1, function(.x) colnames(iris.dummy)[which.max(.x)])
    Misclass(iris.np2, iris.unknown[, 5])

    Los resultados de la predicción de redes neuronales son difusos, similares a los resultados de agrupamiento difuso o árboles de regresión, por lo que se aplicó qué.max () para cada fila. Como ve, este es uno de los errores de clasificación errónea más bajos.

    Es posible trazar la red real:

    Código\(\PageIndex{25}\) (R):

    iris.train <- iris[seq(1, nrow(iris), 5), ]
    iris.dummy <- Tobin(iris.train$Species, convert.names=FALSE) # asmisc.r
    iris.train2 <- cbind(iris.train[, -5], iris.dummy)
    library(neuralnet)
    set.seed(17)
    iris.n <- neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data=iris.train2, hidden=3, lifesign="full")
    plot(iris.n, rep="best", intercept=FALSE)

    La gráfica (Figura 7.4.1) es un poco esotérica para el novato, pero ojalá se introduzca en el método porque existe una aparente estructura multicapa que se utiliza para las decisiones de redes neuronales.

    Referencias

    1. Énfasis mío.


    This page titled 7.3: Aprendizaje automático is shared under a Public Domain license and was authored, remixed, and/or curated by Alexey Shipunov via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.