Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Clasificación

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

Datos de Iris de Fisher

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

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

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

Análisis Discriminante Lineal y Cuadrático

La función puede realizar la clasificación utilizando diferentes tipos de análisis discriminante.fitcdiscr En primer lugar, 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 llamarse datos de entrenamiento. Ahora calcule el error de resustitución, que es el error de clasificación errónea (la proporción de observaciones clasificadas incorrectamente) 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 las etiquetas de clase conocidas y las etiquetas de clase predichas. 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 la clase i y cuya clase predicha es j. Los elementos diagonales representan observaciones correctamente clasificadas.

figure ldaResubCM = confusionchart(species,ldaClass); 

De las 150 observaciones de entrenamiento, el 20% o 30 observaciones están clasificadas erróneamente por la función discriminante lineal. Puede 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 (x,y) valores 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 de 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 probar el análisis discriminante cuadrático (QDA) para nuestros datos.

Calcular el error de resustitución para el análisis discriminante cuadrático.

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

Ha calculado el error de resustitución. Por lo general, las personas están más interesadas en el error de prueba (también conocido como error de generalización), que es el error de predicción esperado en un conjunto independiente. De hecho, es probable que el error de resustitución subestimará el error de prueba.

En este caso, no tiene otro conjunto de datos etiquetado, pero puede simular uno realizando 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 desarticulados. Cada subconjunto tiene aproximadamente el mismo tamaño y aproximadamente las mismas proporciones de clase que en el conjunto de entrenamiento. Quite un subconjunto, entrene el modelo de clasificación con los otros nueve subconjuntos y utilice el modelo entrenado para clasificar el subconjunto eliminado. Puede repetir esto quitando cada uno de los diez subconjuntos uno a la vez.

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

rng(0,'twister'); 

Primer uso para generar 10 subconjuntos estratificados desarticulados.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 incorrecta para LDA y QDA utilizando la partición de datos dada.crossvalkfoldLosscp

Calcule 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 LDA tiene el mismo valor que el error de resustitución ldA en estos datos.

Calcule el verdadero error de prueba para QDA mediante 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. Muestra que un modelo más simple puede obtener un rendimiento comparable o mejor que un modelo más complicado.

Clasificadores Naive Bayes

La función tiene otros dos tipos, 'DiagLinear' y 'DiagQuadratic'.fitcdiscr Son similares a 'lineal' y 'quadratic', pero con estimaciones de matriz de covarianza diagonal. Estas opciones diagonales son ejemplos específicos de un clasificador Bayes ingenuo, porque suponen que las variables son condicionalmente independientes dada la etiqueta de clase. Los clasificadores Naive Bayes se encuentran entre los clasificadores más populares. Si bien la suposición de la 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 de cada clase utilizando una distribución gaussiana. Puede calcular el error de resustitución 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 multivariante. A menudo eso es una suposición razonable, pero a veces es posible 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 densidad del kernel, que es una técnica no paramétrica más flexible. Aquí establecemos el kernel en .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 núcleo obtiene un error de sustitución 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épalo es inferior a 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 Crea un árbol de decisión para los datos del iris y mira 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 del á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, comience en el nodo superior y aplique la regla. Si el punto satisface la regla, usted toma el camino izquierdo, y si no usted toma el camino correcto. En última instancia, se llega a un nodo terminal que asigna la observación a una de las tres especies.

Calcular el error de resustitución y el error de validación cruzada para el árbol de decisiones.

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 del error de validación cruzada es significativamente mayor que el error de resustitución. 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 nuevos datos sea probable que se degrade. A menudo es posible encontrar un árbol más simple que funcione mejor que un árbol más complejo en nuevos datos.

Intenta podar el árbol. En primer lugar, calcule el error de resustitución 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 resustitución es demasiado optimista. Siempre disminuye a medida que crece el tamaño del árbol, 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 debe 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 más o menos 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 límite 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 límite.cvloss (Tenga en cuenta que bestlevel-0 corresponde al árbol no podado, por lo que debe agregar 1 para usarlo como í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 examinar el árbol podado y calcular el error de clasificación incorrecta 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 de ™ de Statistics and Machine Learning Toolbox.

Este ejemplo no pretende ser un análisis ideal de los datos del iris de Fisher, de hecho, el uso de las mediciones de pétalos en lugar de, o además, las mediciones de sépalo pueden conducir a una mejor clasificación. Además, este ejemplo no está destinado a comparar las fortalezas y debilidades de diferentes algoritmos de clasificación. Es posible 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 utilizar para realizar la agregación de arranque para un conjunto de árboles de decisión, como se describe en el ejemplo .TreeBaggerBootstrap Aggregation (Bagging) of Classification Trees Using TreeBagger