Cómo visualizar el clasificador svm en un modelo de aprendizaje supervisado

El conjunto de datos del iris no es fácil de graficar para análisis predictivo en su forma original porque no se puede trazar las cuatro coordenadas (a partir de las características) del conjunto de datos en una pantalla bidimensional. Por lo tanto usted tiene que reducir las dimensiones mediante la aplicación de una reducción de dimensionalidad algoritmo para las características.

En este caso, el algoritmo que va a utilizar para hacer la transformación de datos (reducción de las dimensiones de las características) se denomina Análisis de Componentes Principales (PCA).

sépalo Longitudsépalo AnchoLongitud pétalopétalo AnchoClase de destino / de la etiqueta
5.13.51.40.2Setosa (0)
7.03.24.71.4Versicolor (1)
6.33.36.02.5Virginica (2)

El algoritmo PCA lleva las cuatro características (números), hace algunos cálculos sobre ellos, y da salida a dos nuevos números que se pueden utilizar para hacer la trama. Piense en PCA como después de dos pasos generales:

  1. Toma como entrada un conjunto de datos con muchas características.

  2. Reduce dicha entrada a un conjunto más pequeño de características (definida por el usuario o algoritmo-determinado) mediante la transformación de los componentes del conjunto de características en lo que considera como las principales (principal) componentes.

Esta transformación del conjunto de características también se llama extracción de características. El siguiente código hace la reducción de la dimensión:

gt; gt; gt; de sklearn.decomposition PCAgt importación; gt; gt; PCA = PCA (n_components = 2) .fit (X_train) gt; gt; gt; pca_2d = pca.transform (X_train)

Si ya ha importado ninguna biblioteca o conjuntos de datos, no es necesario volver a importar o cargarlos en su sesión de Python actual. Si lo hace, sin embargo, no debería afectar a su programa.

Después de ejecutar el código, puede escribir el pca_2d variable en el intérprete y ver que da salida a las matrices con dos elementos en lugar de cuatro. Estos dos nuevos números son representaciones matemáticas de los cuatro números viejos. Cuando se establece la función reducida, puede trazar los resultados usando el siguiente código:

gt; gt; gt; pylab importación como plgt; gt; gt; para i en el rango (0, pca_2d.shape [0]): gt; gt; gt; si y_train [i] == 0: gt; gt; gt; c1 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `r`, marcador = `+`) gt; gt; gt; elif y_train [i] == 1: gt; gt; gt; c2 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `g`, marcador = `o`) gt; gt; gt; elif y_train [i] == 2: gt; gt; gt; c3 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `b`, marcador = `*`) gt; gt; gt; pl.legend ([c1, c2, c3], [ `Setosa`, `versicolor`, `Virginica`]) gt; gt; gt; pl.title ( `formación de datos del iris con 3 clases andknown Resultados`) gt; gt; gt; pl.show ()

Esto es un gráfico de dispersión - una visualización de puntos trazados representan las observaciones en una gráfica. Este gráfico de dispersión en particular representa los resultados conocidos de la formación de datos del iris. Hay 135 puntos trazados (observaciones) de nuestro conjunto de datos de entrenamiento. El conjunto de datos de entrenamiento consiste en

  • 45 ventajas que representan la clase Setosa.

  • 48 círculos que representan a la clase versicolor.

  • 42 estrellas que representan la clase Virginica.

Puede confirmar el número indicado de clases mediante la introducción de código siguiente:

gt; gt; gt; sum (y_train == 0) 45gt; gt; gt; sum (y_train == 1) 48gt; gt; gt; sum (y_train == 2) 42

De esta figura se puede decir claramente que la clase Setosa es linealmente separable de las otras dos clases. Mientras que las clases Versicolor y virginica no son completamente separables por una línea recta, que no son de solapamiento por mucho. Desde una perspectiva visual simple, los clasificadores deben hacer bastante bien.

Video: Tutoriales RapidMiner: Support Vector Machines

La imagen de abajo muestra un gráfico del modelo de máquinas de vectores soporte (SVM) entrenado con un conjunto de datos que ha sido reducido dimensionalmente a dos características. Cuatro características es un pequeño conjunto- función en este caso, que desea mantener los cuatro modo que los datos pueden retener la mayor parte de su información útil. La trama se muestra aquí como una ayuda visual.

Esta parcela incluye la superficie de decisión para el clasificador - la zona en la gráfica que representa la función de decisión que SVM utiliza para determinar el resultado de la nueva entrada de datos. Las líneas separan las áreas en las que el modelo será predecir la clase particular que un punto de datos pertenece.

La sección izquierda de la trama será predecir la clase Setosa, la sección media predecirá la clase versicolor, y la sección de la derecha va a predecir la clase de Virginica.

El modelo SVM que creó no utilizó el conjunto de características dimensionalmente reducida. Este modelo sólo utiliza la reducción de dimensionalidad aquí para generar una trama de la superficie de decisión del modelo SVM - como ayuda visual.

La lista completa del código que crea la trama se proporciona como referencia. No se debe ejecutar en secuencia con nuestro ejemplo actual si está siguiendo a lo largo de. Se puede sobrescribir algunas de las variables que puede que ya tenga en la sesión.

El código para producir esta trama se basa en el código de ejemplo proporcionado en el scikit de aprender sitio web. Se puede obtener más información sobre la creación de parcelas como estos en el scikit-learn sitio web.

Aquí está la lista completa del código que crea la trama:

gt; gt; gt; de sklearn.decomposition PCAgt importación; gt; gt; de sklearn.datasets importar load_irisgt; gt; gt; de sklearn svmgt importación; gt; gt; de sklearn cross_validationgt importación; gt; gt; pylab importación como plgt; gt; gt; importar numpy como npgt; gt; gt; iris = load_iris () gt; gt; gt; X_train, X_test, y_train, y_test = cross_validation.train_test_split (iris.data, iris.target, test_size = 0,10, random_state = 111) gt; gt; gt; PCA = PCA (n_components = 2) .fit (X_train) gt; gt; gt; pca_2d = pca.transform (X_train) gt; gt; gt; svmClassifier_2d = svm.LinearSVC (random_state = 111) .fit (pca_2d, y_train) gt; gt; gt; para i en el rango (0, pca_2d.shape [0]): gt; gt; gt; si y_train [i] == 0: gt; gt; gt; c1 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `r`, s = 50, marcador = `+`) gt; gt; gt; elif y_train [i] == 1: gt; gt; gt; c2 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `g`, s = 50, marcador = `o`) gt; gt; gt; elif y_train [i] == 2: gt; gt; gt; c3 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `b`, s = 50, marcador = `*`) gt; gt; gt; pl.legend ([c1, c2, c3], [ `Setosa`, `versicolor`, `Virginica`]) gt; gt; gt; mín_x, máx_x = pca_2d [:, 0] .min () - 1, pca_2d [:, 0] .max () + 1GT; gt; gt; mín_y, máx_y = pca_2d [:, 1] .min () - 1, pca_2d [:, 1] .max () + 1GT; gt; gt; xx, yy = np.meshgrid (np.arange (mín_x, máx_x, 0,01), np.arange (mín_y, máx_y, 0,01)) gt; gt; gt; Z = svmClassifier_2d.predict (np.c_ [xx.ravel (), yy.ravel ()]) gt; gt; gt; Z = Z.reshape (xx.shape) gt; gt; gt; pl.contour (xx, yy, Z) gt; gt; gt; pl.title ( `Decisión de vectores de soporte de la máquina Surface`) gt; gt; gt; pl.axis gt ( `off`); gt; gt; pl.show ()
Artículos Relacionados