Ajuste del modelo

De forma que podríamos probar a modificar la escala de los datos, o el número de epochs o el número de epochs sin mejoras antes de terminar el entrenamiento (o más de uno de estos parámetros simultáneamente).

Por ejemplo, si simplemente modificamos el número de epochs sin mejoras antes de terminar el entrenamiento:

model = Perceptron(n_iter_no_change = 300, random_state = 0)
model.fit(X.values, y.values)
model.score(X.values, y.values)
1.0

vemos que el Perceptrón ya converge a valores que clasifican perfectamente los datos de entrenamiento. El número de iteraciones necesarias ha sido:

model.n_iter_
837

1.000 iteraciones han sido finalmente suficientes, pero aun así el número final de epochs ha sido elevado. Podemos visualizar los valores de los pesos y el bias de la neurona con los atributos .coef_ y .intercept_ respectivamente:

model.coef_
array([[ 70.7, -87.9]])
model.intercept_
array([-117.])

Efectivamente, se trata de valores elevados.

Por último, visualicemos las fronteras de decisión del modelo:

colors = ListedColormap(["#E67332", "#18B95E", "#326DE6"])
fig, ax = plt.subplots(figsize = (6, 6))
ax.set_aspect("equal")
plot_decision_boundaries(model, X.values, ax)
scatter = plt.scatter(
    x = X["sepal_length"], y = X["sepal_width"], c = iris.label,
    cmap = colors, zorder = 2, edgecolor = "#666666")
ax.legend(
    handles = scatter.legend_elements()[0],
    labels = list(iris.species.unique())
)
ax.grid(color = "#EEEEEE", zorder = 1, alpha = 0.4)
plt.show()
Ajuste del modelo