plot_decision_regions(X=X_train_01_subset,
... y=y_train_01_subset,
... classifier=lrgd)
>>> plt.xlabel('petal length [standardized]')
>>> plt.ylabel('petal width [standardized]')
>>> plt.legend(loc='upper left')
>>> plt.show()
La gráfica de la región de decisión resultante tiene el aspecto siguiente:
El algoritmo de aprendizaje del descenso del gradiente para regresión logísticaCon el cálculo, podemos mostrar que la actualización de peso en regresión logística mediante el descenso del gradiente es igual a la ecuación que utilizamos en Adaline en el Capítulo 2, Entrenar algoritmos simples de aprendizaje automático para clasificación. Sin embargo, debes tener en cuenta que la siguiente derivación de la regla de aprendizaje del descenso del gradiente va destinada a aquellos lectores que estén interesados en los conceptos matemáticos que hay detrás de la regla de aprendizaje del descenso del gradiente para regresión logística. No es esencial para seguir con el resto de este capítulo.Empezaremos calculando la derivada parcial de la función de probabilidad logarítmica con respecto al peso j: |
Ahora, podemos volver a sustituir |
Entrenar un modelo de regresión logística con scikit-learn
En la sección anterior, acabamos de ver algunos ejercicios de matemáticas y de código útiles, que nos han ayudado a ilustrar las diferencias conceptuales entre Adaline y la regresión logística. A continuación, aprenderemos cómo utilizar la implementación más optimizada de regresión logística de scikit-learn, que también soporta ajustes multiclase fuera de la librería (por defecto, OvR). En el siguiente código de ejemplo, utilizaremos la clase sklearn.linear_model.LogisticRegression, así como el ya conocido método fit, para entrenar el modelo en las tres clases en el conjunto de datos de entrenamiento de flores normalizado:
>>> from sklearn.linear_model import LogisticRegression
>>> lr = LogisticRegression(C=100.0, random_state=1)
>>> lr.fit(X_train_std, y_train)
>>> plot_decision_regions(X_combined_std,
... y_combined,
... classifier=lr,
... test_idx=range(105, 150))
>>> plt.xlabel('petal length [standardized]')
>>> plt.ylabel('petal width [standardized]')
>>> plt.legend(loc='upper left')
>>> plt.show()
Después de ajustar el modelo en los datos de entrenamiento, hemos mostrado gráficamente las regiones de decisión, las muestras de entrenamiento y las muestras de prueba, como puedes ver en la siguiente imagen:
Si piensas en el código anterior que utilizamos para entrenar el modelo LogisticRegression, debes estar preguntándote: «¿Qué es este parámetro misterioso C?». Trataremos este parámetro en la siguiente subsección donde, en primer lugar, introduciremos los conceptos de sobreajuste y regularización. Sin embargo, antes de pasar a estos temas, vamos a acabar nuestra discusión sobre las probabilidades de pertenencia a una clase.
La probabilidad de que los ejemplos de entrenamiento pertenezcan a una determinada clase puede ser calculada con el método predict_proba. Por ejemplo, podemos predecir las probabilidades de las tres primeras muestras en la prueba como sigue:
>>> lr.predict_proba(X_test_std[:3, :])
Este fragmento de código devuelve la matriz siguiente:
array([[ 3.20136878e-08, 1.46953648e-01, 8.53046320e-01],
[ 8.34428069e-01, 1.65571931e-01, 4.57896429e-12],
[ 8.49182775e-01, 1.50817225e-01, 4.65678779e-13]])
La primera fila corresponde a las probabilidades de pertenencia a una clase de la primera flor, la segunda fila corresponde a las probabilidades de pertenencia a una clase de la tercera flor, etc. Observa que las columnas suman todas más de uno, como esperábamos (puedes confirmar este hecho ejecutando lr.predict_proba(X_test_std[:3, :]).sum(axis=1)). El valor más alto de la primera fila es aproximadamente 0.853, lo cual significa que la primera muestra pertenece a la clase tres (Iris-virginica) con una predicción de la probabilidad del 85.7 %. Así, como ya habrás observado, podemos obtener las etiquetas de clase predichas identificando la columna más grande de cada fila; por ejemplo, mediante la función argmax de NumPy:
>>> lr.predict_proba(X_test_std[:3, :]).argmax(axis=1)
Los índices de clase devueltos se muestran a continuación (estos corresponden a Iris-virginica, Iris-setosa e Iris-setosa):
array([2, 0, 0])
Las etiquetas de clase que obtuvimos a partir de las probabilidades condicionales anteriores son, evidentemente, solo un enfoque manual para llamar directamente al método predict, que podemos verificar de la siguiente manera:
>>> lr.predict(X_test_std[:3, :])
array([2, 0, 0])
Por último, una advertencia si quieres predecir la etiqueta de clase de una única muestra de flor: scikit-learn espera una matriz bidimensional como entrada de datos; por tanto, debemos convertir primero una fila única a un formato de este tipo. Una manera de convertir una entrada de fila única en una matriz de datos bidimensional es utilizando el método reshape de NumPy para añadir una nueva dimensión, como se demuestra a continuación:
>>>