<jupyter_start><jupyter_text>[Iris Data Set](https://archive.ics.uci.edu/ml/datasets/iris) ![iris-machinelearning.png](attachment:iris-machinelearning.png)  Información del Dataset:Este es, probablemente, el dataset más conocido en cuanto al apredizaje de reconocimiento de patrones. El "Iris flower dataset"  o "Iris Fisher dataset" es un conjunto de datos multivariante creado por <NAME> en su articulo de 1936, como un ejemplo de análisis discriminativo lineal. A veces, se llama "Iris Anderson dataset" porque <NAME> coleccionó los datos para cuantificar la variación morfológica de la flor Iris de tres especies relacionadas. Dos de las tres especies se coleccionaron en la Península de la Gaspesia «todos son de la misma pastura, y recolectado el mismo día y medidos al mismo tiempo por la misma persona con el mismo aparato».El conjunto de datos contiene 50 muestras de cada una de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). Se midieron cuatro rasgos de cada muestra: el largo y ancho del sépalo y pétalo, en centímetros. Basado en la combinación de estos cuatro rasgos, Fisher desarrolló un modelo discriminativo lineal para distinguir entre una especie y otra.El conjunto de datos contiene 3 clases de 50 instancias cada una, donde cada clase se refiere a un tipo de planta. Una clase es linealmente separable de las otras 2; las otras 2 NO son linealmente separables entre sí.Atributo a predecir: tipo de iris. Información de atributos:1. sepal length in cm 2. sepal width in cm 3. petal length in cm 4. petal width in cm 5. class: -- Iris Setosa -- Iris Versicolour -- Iris Virginica  Análisis exploratorio de los datos<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("../datasets/Iris.csv")
df.head()<jupyter_output><empty_output><jupyter_text>Desbalanceo de las clasesAquí comprueba cuántas instancias tenemos de cada clase  Visualización de los datos Compara las variables entre sí para intentar inferir relaciones entre ellas - Después de representar gráficamente las features, queda claro que la relación entre la especie `iris-setosa` es diferente de las de las otras dos especies. - Además, existe una cierta superposición en las features de las otras dos especies, `iris-versicolor` e `iris-virginica`.  Preprocesamiento  Valores nulos   Detección de outliers  Distintos órdenes de magnitud Los ordenes de magnitud no son muy distintos, así que no hace falta hacer nada aquí  Datos categóricos El campo `Species` es de tipo object, así que habrá que pasarlo a valores categóricos  Selección de variables Muestra la matriz de correlación de las variables Para este ejemplo, nos vamos a quedar solo con las variables `SepalLengthCm` y `SepalWidthCm` (además de la `Species`) para poder representar los datos en gráficos de 2d  Entrenando los modelos Separa el dataset de entrenamiento en train y test<jupyter_code>from sklearn.model_selection import train_test_split<jupyter_output><empty_output><jupyter_text>Aquí tenemos una clase que podemos utilizar luego para visualizar las áreas de decisión. No tienes que hacer nada de momento con ella, sólo ejecutarla<jupyter_code>def plotSVC(title):
    # create a mesh to plot in
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    
    h = (x_max / x_min)/100
    
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
    
                         np.arange(y_min, y_max, h))
    plt.subplot(1, 1, 1)
    
    Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired,
                edgecolor='k', s=20)
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.xlim(xx.min(), xx.max())
    plt.title(title)
    
    plt.show()<jupyter_output><empty_output><jupyter_text>Regresión logística<jupyter_code>from sklearn.linear_model import LogisticRegression<jupyter_output><empty_output><jupyter_text>**Áreas de decisión**Utiliza la función `plotSVC` para pintar las áreas de decisión del modelo que acabas de entrenar<jupyter_code>svc = logreg
plotSVC('Logistic regression')<jupyter_output><empty_output><jupyter_text>Prueba con distintas combinaciones de parámetros y pinta los resultados.<jupyter_code>solvers = ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']<jupyter_output><empty_output><jupyter_text>**Grid search** A continuación prueba el grid search<jupyter_code>from sklearn.model_selection import GridSearchCV

param_grid = {
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'multi_class': ['auto', 'warn']
}<jupyter_output><empty_output><jupyter_text>Naïve Bayes<jupyter_code>from sklearn.naive_bayes import GaussianNB<jupyter_output><empty_output><jupyter_text>**Áreas de decisión**  Decision tree<jupyter_code>from sklearn.tree import DecisionTreeClassifier<jupyter_output><empty_output><jupyter_text>**Áreas de decisión** **Grid search**  Random forest<jupyter_code>from sklearn.ensemble import RandomForestClassifier<jupyter_output><empty_output><jupyter_text>**Importancia de las features**En random forest podemos visualizar la importancia que ha tenido cada features en el entrenamiento. Visualiza los resultados en una tabla y en un gráfico de barras **Áreas de decisión** **Grid search**  Support Vector Machine<jupyter_code>from sklearn.svm import SVC<jupyter_output><empty_output><jupyter_text>**Áreas de decisión**<jupyter_code># Kernel parameters
kernels = ['linear', 'rbf', 'poly']
# gamma is a parameter for non linear hyperplanes. 
# The higher the gamma value it tries to exactly fit the training data set

gammas = [0.1, 1, 10, 100]
# C is the penalty parameter of the error term. 
# It controls the trade off between smooth decision boundary and classifying the training points correctly.
# Increasing C values may lead to overfitting the training data.
cs = [0.1, 1, 10, 100, 1000]
# degree is a parameter used when kernel is set to ‘poly’. 
# It’s basically the degree of the polynomial used to find the hyperplane to split the data.
degrees = [0, 1, 2, 3, 4, 5, 6]<jupyter_output><empty_output><jupyter_text>**Grid search**<jupyter_code>from sklearn.model_selection import GridSearchCV

# Create the parameter grid based on the results of random search 
param_grid = {
    'kernel': ['linear', 'rbf', 'poly'],
    'C': [0.001, 0.01, 0.1, 1, 10], 
    'gamma': [0.001, 0.01, 0.1, 1],
    'degree': [0, 1, 2, 3, 4, 5, 6],
}<jupyter_output><empty_output><jupyter_text>K Nearest Neighbors<jupyter_code>from sklearn.neighbors import KNeighborsClassifier<jupyter_output><empty_output><jupyter_text>**Obteniendo el valor de K**<jupyter_code>from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# Experimenta con diferentes valores de K y obtén el mejor 
k_range = list(range(1,26))

# Prueba con el mejor valor de K obtenido<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08837341682083392, 'fraction_numerical': 0.013661591006119255, 'mean_word_length': 5.105994787141616, 'pattern_counts': {'":': 0, '<': 63, '<?xml version=': 0, '>': 63, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '572122', 'license': 'CC0-1.0', 'n_tokens_mistral': 2469, 'n_tokens_neox': 2383, 'n_words': 824, 'path': 'ejercicios/iris_dataset.ipynb', 'repo_name': 'aliciapj/intro_ml_python', 'size': '7042'}