conjunto de datos de prueba mediante unos pequeños círculos:
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
def plot_decision_regions(X, y, classifier, test_idx=None,
resolution=0.02):
# define generador de marcador y mapa de colores
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
# representa la superficie de decisión
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_max, resolution))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
alpha=0.8, c=colors[idx],
marker=markers[idx], label=cl,
edgecolor='black')
# destaca las muestras de prueba
if test_idx:
# representa todas las muestras
X_test, y_test = X[test_idx, :], y[test_idx]
plt.scatter(X_test[:, 0], X_test[:, 1],
c='', edgecolor='black', alpha=1.0,
linewidth=1, marker='o',
s=100, label='test set')
Con esta pequeña modificación en la función plot_decision_regions, ya podemos especificar los índices de las muestras que queremos marcar en los diagramas resultantes. El código es el siguiente:
>>> X_combined_std = np.vstack((X_train_std, X_test_std))
>>> y_combined = np.hstack((y_train, y_test))
>>> plot_decision_regions(X=X_combined_std,
... y=y_combined,
... classifier=ppn,
... test_idx=range(105, 150))
>>> plt.xlabel('petal length [standardized]')
>>> plt.ylabel('petal width [standardized]')
>>> plt.legend(loc='upper left')
>>> plt.show()
Como podemos ver en el diagrama resultante, las tres clases de flor no pueden ser separadas perfectamente por un límite de decisión lineal:
Recuerda que en el Capítulo 2, Entrenar algoritmos simples de aprendizaje automático para clasificación dijimos que el algoritmo de perceptrón no converge nunca en conjuntos de datos que no son perfectamente separables linealmente, razón por la cual el uso del algoritmo de perceptrón no suele ser recomendable para esta práctica. En las siguientes secciones, trataremos unos clasificadores lineales más potentes que convergen en un mínimo coste, incluso si las clases no son perfectamente separables linealmente.
El Perceptron, así como otras funciones y clases de scikit-learn, con frecuencia tiene parámetros adicionales que nosotros omitimos para mayor claridad. Puedes leer más acerca de estos parámetros en la función help de Python (por ejemplo, help(Perceptron)) o accediendo a la excelente documentación online de scikit-learn en http://scikit-learn.org/stable/. |
Modelar probabilidades de clase mediante regresión logística
Aunque la regla de perceptrón ofrece una sencilla y agradable introducción a los algoritmos de aprendizaje automático para clasificación, su mayor inconveniente es que nunca converge si las clases no son perfectamente separables linealmente. La tarea de clasificación de la sección anterior sería un ejemplo de este caso. De forma intuitiva, podemos pensar que la razón por la que los pesos se actualizan continuamente es que siempre existe como mínimo una muestra clasificada erróneamente en cada época. Evidentemente, puedes cambiar el rango de aprendizaje y aumentar el número de épocas, pero ten en cuenta que el perceptrón no convergerá nunca en este conjunto de datos. Para aprovechar mejor el tiempo, veamos otro sencillo –a la vez que potente– algoritmo para problemas de clasificación binaria y lineal: la regresión logística. Ten en cuenta que, a pesar de su nombre, la regresión logística es un modelo para clasificación, no para regresión.
Intuición en regresión logística y probabilidades condicionales
La regresión logística es un modelo de clasificación muy sencillo de implementar y que funciona muy bien en clases separables lineales. Es uno de los algoritmos más utilizados para clasificación en la industria. Parecido al perceptrón y a Adaline, el modelo de regresión logística es también, en este caso, un modelo lineal para clasificación binaria que puede ampliarse a la clasificación multiclase, por ejemplo, mediante la técnica OvR.
Para explicar la idea que se esconde detrás de la regresión logística como modelo probabilístico, vamos a presentar primero la razón de probabilidades: las probabilidades de que ocurra un evento concreto. La razón de probabilidades se puede escribir como
Ten en cuenta que log se refiere al logaritmo natural, puesto que es la convención común en informática. La función logit toma como entrada valores del rango de 0 a 1 y los transforma en valores de todo el rango de números reales, que podemos utilizar para expresar una relación lineal entre valores de características y logaritmos de la razón de probabilidades:
En este caso,
Ahora, nos interesa realmente predecir la probabilidad de que una determinada muestra pertenezca a una clase concreta, que es la forma inversa de la función logit. También se denomina función sigmoide logística, en ocasiones abreviada simplemente como función sigmoide, debido a su característica forma de S: