Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Clasificación

En este ejemplo se muestra cómo realizar la clasificación mediante análisis discriminante, clasificadores Bayes ingenuos y árboles de decisión. Supongamos que tiene un conjunto de datos que contiene observaciones con mediciones en diferentes variables (denominadas predictores) y sus etiquetas de clase conocidas. Si obtiene valores predictores para nuevas observaciones, ¿podría determinar a qué clases pertenecen probablemente esas observaciones? Este es el problema de la clasificación.

Los datos de iris de Fisher

Los datos de iris de Fisher consisten en mediciones en la longitud del sépalo, ancho del sépalo, longitud del pétalo y anchura del pétalo para 150 especímenes de iris. Hay 50 ejemplares de cada una de las tres especies. Cargue los datos y vea cómo difieren las mediciones sepales entre las especies. Puede utilizar las dos columnas que contengan mediciones sepales.

load fisheriris f = figure; gscatter(meas(:,1), meas(:,2), species,'rgb','osd'); xlabel('Sepal length'); ylabel('Sepal width'); N = size(meas,1); 

Supongamos que usted mide un sépalo y pétalo de un iris, y usted necesita determinar su especie sobre la base de esas mediciones. Un enfoque para resolver este problema se conoce como análisis discriminante.

Análisis de discriminantes lineales y cuadráticos

La función puede realizar la clasificación utilizando diferentes tipos de análisis discriminante.fitcdiscr Primero clasifique los datos utilizando el análisis discriminante lineal (LDA) predeterminado.

lda = fitcdiscr(meas(:,1:2),species); ldaClass = resubPredict(lda); 

Las observaciones con etiquetas de clase conocidas suelen denominarse datos de entrenamiento. Ahora calcule el error de reenvío, que es el error de clasificación errónea (la proporción de observaciones mal clasificadas) en el conjunto de entrenamiento.

ldaResubErr = resubLoss(lda) 
 ldaResubErr =      0.2000  

También puede calcular la matriz de confusión en el conjunto de entrenamiento. Una matriz de confusión contiene información sobre etiquetas de clase conocidas y etiquetas de clase pronosticadas. En términos generales, el elemento (i, j) de la matriz de confusión es el número de muestras cuya etiqueta de clase conocida es clase i y cuya clase predicha es j. Los elementos diagonales representan correctamente las observaciones clasificadas.

figure ldaResubCM = confusionchart(species,ldaClass); 

De las 150 observaciones de formación, el 20% o 30 observaciones se clasifican erróneamente por la función discriminante lineal. Puedes ver cuáles son dibujando X a través de los puntos mal clasificados.

figure(f) bad = ~strcmp(ldaClass,species); hold on; plot(meas(bad,1), meas(bad,2), 'kx'); hold off; 

La función ha separado el plano en regiones divididas por líneas, y ha asignado diferentes regiones a diferentes especies. Una forma de visualizar estas regiones es crear una cuadrícula de valores (x, y) y aplicar la función de clasificación a esa cuadrícula.

[x,y] = meshgrid(4:.1:8,2:.1:4.5); x = x(:); y = y(:); j = classify([x y],meas(:,1:2),species); gscatter(x,y,j,'grb','sod') 

Para algunos conjuntos de datos, las regiones para las distintas clases no están bien separadas por líneas. Cuando ese es el caso, el análisis discriminante lineal no es apropiado. En su lugar, puede intentar el análisis de discriminante cuadrático (QDA) para nuestros datos.

Calcule el error de reenvío para el análisis de discriminante cuadrático.

qda = fitcdiscr(meas(:,1:2),species,'DiscrimType','quadratic'); qdaResubErr = resubLoss(qda) 
 qdaResubErr =      0.2000  

Ha calculado el error de reenvío. Por lo general, las personas están más interesadas en el error de prueba (también denominado error de generalización), que es el error de predicción esperado en un conjunto independiente. De hecho, el error de reenvío probablemente se subestime el error de prueba.

En este caso, no tiene otro conjunto de datos etiquetados, pero puede simular uno mediante la validación cruzada. Una validación cruzada estratificada de 10 veces es una opción popular para estimar el error de prueba en los algoritmos de clasificación. Divide aleatoriamente el conjunto de entrenamiento en 10 subconjuntos disconjuntos. Cada subconjunto tiene un tamaño aproximadamente igual y aproximadamente las mismas proporciones de clase que en el conjunto de entrenamiento. Quite un subconjunto, capacite el modelo de clasificación con los otros nueve subconjuntos y use el modelo entrenado para clasificar el subconjunto eliminado. Puede repetir esta eliminación quitando cada uno de los diez subconjuntos a la vez.

Dado que la validación cruzada divide aleatoriamente los datos, su resultado depende de la semilla aleatoria inicial. Para reproducir los resultados exactos en este ejemplo, ejecute el siguiente comando:

rng(0,'twister'); 

Primer uso para generar 10 subconjuntos estratificados desconjuntos.cvpartition

cp = cvpartition(species,'KFold',10) 
 cp =   K-fold cross validation partition    NumObservations: 150        NumTestSets: 10          TrainSize: 135  135  135  135  135  135  135  135  135  135           TestSize: 15  15  15  15  15  15  15  15  15  15 

Los métodos y pueden estimar el error de clasificación errónea para LDA y QDA utilizando la partición de datos dada.crossvalkfoldLosscp

Estime el verdadero error de prueba para LDA utilizando la validación cruzada estratificada de 10 veces.

cvlda = crossval(lda,'CVPartition',cp); ldaCVErr = kfoldLoss(cvlda) 
 ldaCVErr =      0.2000  

El error de validación cruzada de LDA tiene el mismo valor que el error de reenvío de LDA en estos datos.

Estime el verdadero error de prueba para QDA utilizando la validación cruzada estratificada de 10 veces.

cvqda = crossval(qda,'CVPartition',cp); qdaCVErr = kfoldLoss(cvqda) 
 qdaCVErr =      0.2200  

QDA tiene un error de validación cruzada ligeramente mayor que LDA. Se muestra que un modelo más simple puede obtener comparable, o mejor rendimiento que un modelo más complicado.

Naive Bayes Classifiers

La función tiene otros otros dos tipos, ' DiagLinear ' y ' DiagQuadratic '.fitcdiscr Son similares a ' lineales ' y ' cuadráticos ', pero con estimaciones de matriz de covarianza diagonales. Estas opciones diagonales son ejemplos específicos de un clasificador Bayes ingenuo, porque asumen que las variables son condicionalmente independientes dada la etiqueta de clase. Los clasificadores Naive Bayes se encuentran entre los clasificadores más populares. Aunque la suposición de independencia condicional de clase entre variables no es cierta en general, se ha encontrado que los clasificadores Bayes ingenuos funcionan bien en la práctica en muchos conjuntos de datos.

La función se puede utilizar para crear un tipo más general de clasificador Bayes ingenuo.fitcnb

Primero Modele cada variable en cada clase utilizando una distribución gaussiana. Puede calcular el error de reenvío y el error de validación cruzada.

nbGau = fitcnb(meas(:,1:2), species); nbGauResubErr = resubLoss(nbGau) nbGauCV = crossval(nbGau, 'CVPartition',cp); nbGauCVErr = kfoldLoss(nbGauCV)  labels = predict(nbGau, [x y]); gscatter(x,y,labels,'grb','sod') 
 nbGauResubErr =      0.2200   nbGauCVErr =      0.2200  

Hasta ahora ha asumido que las variables de cada clase tienen una distribución normal multivariada. A menudo, eso es una suposición razonable, pero a veces puede que no esté dispuesto a hacer esa suposición o puede ver claramente que no es válida. Ahora intente modelar cada variable en cada clase usando una estimación de la densidad del kernel, que es una técnica no paramétrica más flexible. Aquí configuramos el kernel.box

nbKD = fitcnb(meas(:,1:2), species, 'DistributionNames','kernel', 'Kernel','box'); nbKDResubErr = resubLoss(nbKD) nbKDCV = crossval(nbKD, 'CVPartition',cp); nbKDCVErr = kfoldLoss(nbKDCV)  labels = predict(nbKD, [x y]); gscatter(x,y,labels,'rgb','osd') 
 nbKDResubErr =      0.2067   nbKDCVErr =      0.2133  

Para este conjunto de datos, el clasificador Bayes Ingenuo con estimación de densidad del kernel obtiene un error de reenvío más pequeño y un error de validación cruzada que el clasificador Bayes Ingenuo con una distribución gaussiana.

Árbol de decisión

Otro algoritmo de clasificación se basa en un árbol de decisión. Un árbol de decisión es un conjunto de reglas simples, como "si la longitud del sémero es menor que 5,45, clasifique la muestra como setosa." Los árboles de decisión también son no paramétricos porque no requieren ninguna suposición sobre la distribución de las variables en cada clase.

La función crea un árbol de decisión.fitctree Cree un árbol de decisión para los datos del iris y vea qué tan bien clasifica los iris en especies.

t = fitctree(meas(:,1:2), species,'PredictorNames',{'SL' 'SW' }); 

Es interesante ver cómo el método de árbol de decisión divide el plano. Utilice la misma técnica que la anterior para visualizar las regiones asignadas a cada especie.

[grpname,node] = predict(t,[x y]); gscatter(x,y,grpname,'grb','sod') 

Otra forma de visualizar el árbol de decisión es dibujar un diagrama de la regla de decisión y las asignaciones de clases.

view(t,'Mode','graph'); 

Este árbol de aspecto desordenado utiliza una serie de reglas de la forma "SL < 5,45" para clasificar cada espécimen en uno de los 19 nodos terminales. Para determinar la asignación de especies para una observación, empiece en el nodo superior y aplique la regla. Si el punto satisface la regla, toma el camino izquierdo, y si no tomas el camino correcto. En última instancia, se llega a un nodo terminal que asigna la observación a una de las tres especies.

Calcule el error de reenvío y el error de validación cruzada para el árbol de decisión.

dtResubErr = resubLoss(t)  cvt = crossval(t,'CVPartition',cp); dtCVErr = kfoldLoss(cvt) 
 dtResubErr =      0.1333   dtCVErr =      0.3067  

Para el algoritmo de árbol de decisión, la estimación de error de validación cruzada es significativamente mayor que el error de reenvío. Esto muestra que el árbol generado se ajusta al conjunto de entrenamiento. En otras palabras, se trata de un árbol que clasifica bien el conjunto de entrenamiento original, pero la estructura del árbol es sensible a este conjunto de entrenamiento en particular para que su rendimiento en los nuevos datos es probable que se degrade. A menudo es posible encontrar un árbol más simple que funcione mejor que un árbol más complejo en los nuevos datos.

Intenta podar el árbol. Calcule primero el error de reenvío para varios subconjuntos del árbol original. A continuación, calcule el error de validación cruzada para estos subárboles. Un gráfico muestra que el error de reenvío es excesivamente optimista. Siempre disminuye a medida que el tamaño del árbol crece, pero más allá de un cierto punto, el aumento del tamaño del árbol aumenta la tasa de error de validación cruzada.

resubcost = resubLoss(t,'Subtrees','all'); [cost,secost,ntermnodes,bestlevel] = cvloss(t,'Subtrees','all'); plot(ntermnodes,cost,'b-', ntermnodes,resubcost,'r--') figure(gcf); xlabel('Number of terminal nodes'); ylabel('Cost (misclassification error)') legend('Cross-validation','Resubstitution') 

¿Qué árbol deberías elegir? Una regla simple sería elegir el árbol con el error de validación cruzada más pequeño. Si bien esto puede ser satisfactorio, es posible que prefiera utilizar un árbol más simple si es aproximadamente tan bueno como un árbol más complejo. Para este ejemplo, tome el árbol más simple que está dentro de un error estándar del mínimo. Esa es la regla predeterminada utilizada por el método de.cvlossClassificationTree

Puede mostrar esto en el gráfico calculando un valor de corte que sea igual al costo mínimo más un error estándar. El nivel "mejor" calculado por el método es el árbol más pequeño bajo este corte.cvloss (Tenga en cuenta que bestlevel = 0 corresponde al árbol no podado, por lo que tiene que agregar 1 para utilizarlo como un índice en las salidas vectoriales de.)cvloss

[mincost,minloc] = min(cost); cutoff = mincost + secost(minloc); hold on plot([0 20], [cutoff cutoff], 'k:') plot(ntermnodes(bestlevel+1), cost(bestlevel+1), 'mo') legend('Cross-validation','Resubstitution','Min + 1 std. err.','Best choice') hold off 

Por último, puede ver el árbol podado y calcular el error de clasificación errónea estimado para él.

pt = prune(t,'Level',bestlevel); view(pt,'Mode','graph') 

cost(bestlevel+1) 
 ans =      0.2467  

Conclusiones

En este ejemplo se muestra cómo realizar la clasificación en MATLAB® mediante las funciones estadísticas y herramientas de aprendizaje automático™.

Este ejemplo no pretende ser un análisis ideal de los datos del iris de Fisher, de hecho, utilizando las mediciones de pétalo en lugar de, o además de, las mediciones del sépalo pueden conducir a una mejor clasificación. Además, este ejemplo no pretende comparar las fortalezas y debilidades de los diferentes algoritmos de clasificación. Puede que le resulte instructivo realizar el análisis en otros conjuntos de datos y comparar diferentes algoritmos. También hay funciones de Toolbox que implementan otros algoritmos de clasificación. Por ejemplo, puede usar para realizar la agregación de bootstrap para un conjunto de árboles de decisión, como se describe en el ejemplo.TreeBaggerAgregación de bootstrap (embolsado) de árboles de clasificación medianteTreeBagger