Entrenamiento y validación del modelo

Entrenemos el modelo con el dataset de entrenamiento y veamos el comportamiento que ha tenido si lo aplicamos al dataset de validación. Eso sí, la tasa por defecto en el Perceptrón proveído por Scikit-Learn es de 1, valor demasiado grande si tenemos en cuenta que hemos escalado los datos, de forma que especifiquemos un valor menor:

model = Perceptron(eta0 = 0.1, random_state = 1)
model.fit(X_train_std, y_train)

Entrenamiento y validación del modelo

El porcentaje de muestras bien clasificadas en el dataset de validación es:

model.score(X_test_std, y_test)
0.7105263157894737

Un 71%. Y el número de epochs necesarias antes de que haya terminado el entrenamiento ha sido:

model.n_iter_
12

Los pesos para las dos entradas de cada uno de los tres modelos que se han entrenado (recordemos que se está aplicando la técnica de one vs. rest son:

model.coef_
array([[-0.40106405,  0.25608848],
       [-0.05461475, -0.1817912 ],
       [ 0.24889318, -0.00474238]])

y los bias:

model.intercept_
array([-0.4, -0.2, -0.2])

Podemos mostrar en sendas gráficas las fronteras de decisión situando los datos de entrenamiento y los datos de validación:

colors = ListedColormap(["#E67332", "#18B95E", "#326DE6"])
fig, ax = plt.subplots(1, 2, figsize = (10, 6))
ax[0].set_aspect("equal")
ax[1].set_aspect("equal")
plot_decision_boundaries(model, X_train_std, ax[0])
plot_decision_boundaries(model, X_train_std, ax[1])
scatter = ax[0].scatter(
    x = X_train_std[:, 0], y = X_train_std[:, 1], c = y_train,
    cmap = colors, zorder = 2, edgecolor = "#666666")
scatter = ax[1].scatter(
    x = X_test_std[:, 0], y = X_test_std[:, 1], c = y_test,
    cmap = colors, zorder = 2, edgecolor = "#666666")
ax[0].legend(
    handles = scatter.legend_elements()[0],
    labels = list(iris.species.unique())
)
ax[1].legend(
    handles = scatter.legend_elements()[0],
    labels = list(iris.species.unique())
)
ax[0].grid(color = "#EEEEEE", zorder = 1, alpha = 0.4)
ax[1].grid(color = "#EEEEEE", zorder = 1, alpha = 0.4)
ax[0].set_title("Dataset de entrenamiento")
ax[1].set_title("Dataset de validación")
plt.tight_layout()
plt.show()
Entrenamiento y validación del modelo

Vemos que las flores de la especie setosa del dataset de validación han sido correctamente clasificadas, aunque esta métrica ha sido mucho peor si nos fijamos en las flores de las otras dos especies.