Estoy haciendo regresión logística en Python con este ejemplo de wikipedia. enlace al ejemplo

Aquí está el código que tengo:

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]] # number of hours spent studying
y = [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1] # 0=failed, 1=pass

lr.fit(Z,y)

Los resultados para esto son

lr.coef_
array([[ 0.61126347]])

lr.intercept_
array([-1.36550178])

Mientras que obtienen valores de 1.5046 para el coeficiente de hora y -4.0777 de intersección. ¿Por qué los resultados son tan diferentes? su predicción para 1 hora de estudio es una probabilidad de 0.07 de pasar, mientras que obtengo 0.32 con este modelo, estos son resultados drásticamente diferentes.

1
DoctorEvil 12 nov. 2017 a las 15:06

2 respuestas

La mejor respuesta

El "problema" es que LogisticRegression en scikit-learn usa regularización L2 (también conocida como Regularización de Tikhonov, también conocida como Ridge, también conocida como antes normal). Lea la guía del usuario de sklearn sobre regresión logística para obtener detalles de implementación.

En la práctica, significa que LogisticRegression tiene un parámetro C, que por defecto es igual a 1. Cuanto más pequeño C, más regularización hay, es decir, coef_ se vuelve más pequeño y intercept_ más grande, lo que aumenta la estabilidad numérica y reduce el sobreajuste.

Si establece C muy grande, el efecto de regularización desaparecerá. Con

lr = LogisticRegression(C=100500000)

Obtienes coef_ e intercept_ respectivamente

[[ 1.50464535]]
[-4.07771322]

Como en el artículo de Wikipedia.

Un poco más de teoría . El sobreajuste es un problema donde hay muchas funciones, pero no demasiados ejemplos. Una regla práctica simple: use una C pequeña, si n_obs / n_features es menor que 10. En el ejemplo de wiki, hay una característica y 20 observaciones, por lo que la regresión logística simple no se sobreajustaría incluso con una C.

Otro caso de uso para C pequeño son los problemas de convergencia. Pueden suceder si los ejemplos positivos y negativos se pueden separar perfectamente o en el caso de multicolinealidad (lo que nuevamente es más probable si n_obs / n_features es pequeño), y conducir a un crecimiento infinito del coeficiente en el caso no regularizado.

4
David Dale 13 nov. 2017 a las 10:58

Creo que el problema surge del hecho de que tienes

Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]]

Pero en cambio debería ser

Z = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 1.75, 2.0, 2.25 ...]

Prueba esto

0
Moulick 12 nov. 2017 a las 12:34