A continuación veremos cómo podemos implementar este modelo en Python. Para ello, utilizaremos la librería scikit-learn
.
import pandas as pd
from sklearn.model_selection import train_test_split
total_data = pd.read_csv("https://raw.githubusercontent.com/4GeeksAcademy/machine-learning-content/master/assets/clean_iris.csv")
X = total_data.drop("specie", axis = 1)
y = total_data["specie"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
X_train.head()
El conjunto train lo utilizaremos para entrenar el modelo, mientras que con el test lo evaluaremos para medir su grado de efectividad.
Para asegurar el correcto funcionamiento de este modelo y evitar errores, la estandarización de los datos es necesaria ya que si las características no están en la misma escala, aquellas con magnitudes más grandes pueden dominar la distancia y afectar el resultado del algoritmo.
Por ejemplo, si tenemos dos características: la edad (con valores entre 0 y 100) y el ingreso anual (con valores entre 0 y 100.000), la diferencia de escala entre ambas variables podría hacer que el ingreso anual tenga un impacto desproporcionado en la distancia ignorando la importancia de la edad.
Estandarizar los datos ayuda a que todas las características contribuyan de manera equitativa a la distancia, lo que puede mejorar el rendimiento del algoritmo KNN. La elección entre normalización y estandarización Min-Max dependerá del comportamiento de las variables y de cómo afectan al rendimiento del modelo. Si tenemos características con diferentes escalas y rango, Min-Max es la mejor alternativa. Si por el contrario tienen la misma escala o similar, la normalización es la más apropiada.
A continuación visualizaremos la relación entre las variables del dataset (hemos escogido tres para realizar un gráfico 3D, ya que no podemos coger más y graficarlas; no existen los gráficos 4D):
# Añadimos el nombre de la especie para el plot
total_data["specie"] = total_data["specie"].map({0: "setosa", 1: "versicolor", 2: "virginica"})
import plotly.express as px
fig = px.scatter_3d(total_data, x = "petal width (cm)", y = "petal length (cm)", z = "sepal width (cm)", color = "specie", width = 1000, height = 500,
size = total_data["petal length (cm)"].abs(), color_discrete_sequence=["#E58139", "#39E581", "#8139E5"])
camera = dict(
up = dict(x = 1, y = 3.5, z = 0),
eye = dict(x = 2, y = 0, z = 0)
)
fig.update_layout(scene_camera = camera)
fig.show()