02 CalderonBermudo Maquinas Con Vectores de SoporteEjercicio Propuesto - Jupyter Notebook

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

Máquinas con vectores de soporte: Ejercicio Propuesto

¡Analizaremos el famoso conjunto de datos de iris!

Los datos
Para esta serie de conferencias, utilizaremos el famoso [conjunto de datos Flor de Iris] (http://en.wikipedia.org/wiki/Iris_flower_data_set
(http://en.wikipedia.org/wiki/Iris_flower_data_set)).

Los datos Flor de Iris o Iris de Fisher es un conjunto de datos multivariados introducido por Sir Ronald Fisher en el año 1936 como un ejemplo de análisis
discriminante.

El conjunto de datos consta de 50 muestras de cada una de las tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor), haciendo 150 muestras
totales. Se midieron cuatro características de cada muestra: la longitud y el ancho de los sépalos y pétalos, en centímetros.

Se muestran fotos de los tres tipos diferentes de iris:


In [1]: # Iris Setosa
from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/5/56/Kosaciec_szczecinkowaty_Iris_setosa.jpg'
Image(url,width=300, height=300)

Out[1]:
In [2]: # Iris Versicolor
from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/4/41/Iris_versicolor_3.jpg'
Image(url,width=300, height=300)

Out[2]:

In [3]: # Iris Virginica


from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/9/9f/Iris_virginica.jpg'
Image(url,width=300, height=300)

Out[3]:

El conjunto de datos del iris contiene medidas para 150 flores de iris de tres especies diferentes.

Las tres clases en el conjunto de datos de Iris:


Iris-setosa (n = 50)
Iris-versicolor (n = 50)
Iris-virginica (n = 50)

Las cuatro características del conjunto de datos Iris:

longitud del sépalo en cm


ancho de sépalo en cm
longitud del pétalo en cm
ancho del pétalo en cm

Obtener los datos

In [1]: import seaborn as sns


iris = sns.load_dataset('iris')

¡Visualicemos los datos!

Análisis exploratorio de datos


Intenta recrear las siguientes gráficas, ¡asegúrate de importar las bibliotecas que necesitarás!

** Importe algunas bibliotecas que crea que necesitará. **

In [2]: import numpy as np


import pandas as pd
import matplotlib.pyplot as plt

** Crea un pairplot del conjunto de datos. ¿Qué especie de flor parece ser la más separable?**
In [3]: sns.pairplot(iris, hue='species')
plt.show()
Crea un gráfico kde de sepal_length vs sepal_width para la especie de flor setosa.

In [4]: setosa_data = iris[iris['species'] == 'setosa']


# Crear el gráfico KDE con mapa de calor
sns.kdeplot(data=setosa_data, x='sepal_width', y='sepal_length', cmap='viridis', shade=True)
# Configurar etiquetas de los ejes
plt.xlabel('Sepal Width')
plt.ylabel('Sepal Length')
# Mostrar el gráfico
plt.show()

División en datos de entrenamiento y prueba


** Divida sus datos en un conjunto de entrenamiento y un conjunto de prueba. **

In [5]: from sklearn.model_selection import train_test_split


In [6]: # Separar las características (X) y las etiquetas (y)
X = iris.drop('species', axis=1)
y = iris['species']
# Dividir los datos en un conjunto de entrenamiento y un conjunto de prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Entrena un modelo
Entrene un clasificador de máquinas de vectores de soporte.

Llame al modelo SVC() desde sklearn y ajuste el modelo a los datos de entrenamiento.

In [7]: from sklearn.svm import SVC

In [10]: model = SVC()


model.fit(X_train, y_train)

Out[10]: SVC()

In [11]: model.get_params()

Out[11]: {'C': 1.0,


'break_ties': False,
'cache_size': 200,
'class_weight': None,
'coef0': 0.0,
'decision_function_shape': 'ovr',
'degree': 3,
'gamma': 'scale',
'kernel': 'rbf',
'max_iter': -1,
'probability': False,
'random_state': None,
'shrinking': True,
'tol': 0.001,
'verbose': False}

Evaluación del modelo


In [12]: from sklearn.metrics import confusion_matrix, classification_report

In [13]: y_pred = model.predict(X_test)


In [14]: classification_rep = classification_report(y_test, y_pred)


print(classification_rep)

precision recall f1-score support

setosa 1.00 1.00 1.00 10


versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11

accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30

¡Deberías haber notado que tu modelo es bastante bueno! Veamos si podemos ajustar los parámetros para tratar de mejorar (poco probable, y
probablemente estarás satisfecho con estos resultados en la realidad porque el conjunto de datos es bastante pequeño), pero solo quiero que practiques con
GridSearch.

Práctica Gridsearch
** Importe GridsearchCV de SciKit Learn.**

In [15]: from sklearn.model_selection import GridSearchCV

Cree un diccionario llamado param_grid y complete algunos parámetros para C and gamma.

In [16]: param_grid = {
'C': [0.1, 1, 10],
'gamma': [0.01, 0.1, 1]
}

** Cree un objeto GridSearchCV y ajústelo a los datos de entrenamiento. **

In [17]: grid_search = GridSearchCV(estimator=model, param_grid=param_grid)


grid_search.fit(X_train, y_train)

Out[17]: GridSearchCV(estimator=SVC(),
param_grid={'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1]})

** Ahora tome ese modelo de cuadrícula y cree algunas predicciones utilizando el conjunto de pruebas y cree informes de clasificación y matrices de
confusión para ellos. ¿Pudiste mejorar? **

In [18]: y_pred = grid_search.predict(X_test)


In [19]: confusion_mtx = confusion_matrix(y_test, y_pred)


print(confusion_mtx)

[[10 0 0]
[ 0 9 0]
[ 0 0 11]]

In [20]: classification_rep = classification_report(y_test, y_pred)


print(classification_rep)

precision recall f1-score support

setosa 1.00 1.00 1.00 10


versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11

accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30

Deberías haber hecho lo mismo o exactamente lo mismo, esto tiene sentido, básicamente hay un solo punto que es demasiado ruidoso para comprenderlo,
lo que tiene sentido, no queremos tener un modelo de sobrecapa que sea capaz de atrapar esto.
¡Buen trabajo!

También podría gustarte