26 votos

Diferencia entre statsmodel OLS y scikit linear regression

Tengo una pregunta sobre dos métodos diferentes de bibliotecas diferentes que parecen hacer el mismo trabajo. Estoy tratando de hacer un modelo de regresión lineal.

Aquí está el código que yo uso statsmodel biblioteca con OLS :

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

Esta impresión GFT + Wiki / GT R-cuadrado 0,981434611923

y el segundo es scikit learn library Linear model method:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

Esta impresión GFT + Wiki / GT R-cuadrado: 0.8543

Mi pregunta es que ambos métodos imprimen nuestro resultado R^2 pero uno imprime 0.98 y el otro 0.85.

Según tengo entendido, OLS funciona con un conjunto de datos de entrenamiento. Así que mis preguntas,

  • ¿Existe alguna forma de trabajar con un conjunto de datos de prueba con OLS?
  • ¿Tiene algún significado la puntuación del conjunto de datos de prueba (en OLS no utilizamos el conjunto de datos de prueba)? Por lo que yo sé, tenemos que trabajar con datos de prueba.
  • ¿Cuál es la diferencia entre OLS y scikit linear regression. ¿Cuál utilizamos para calcular la puntuación del modelo?

Gracias por cualquier ayuda.

23voto

StackQuestions Puntos 38

Primero en términos de uso. Puede obtener la predicción en statsmodels de forma muy similar a como lo hace en scikit-learn, excepto que utilizamos la instancia de resultados devuelta por fit

predictions = results.predict(X_test)

Dadas las predicciones, podemos calcular estadísticas basadas en el error de predicción

prediction_error = y_test - predictions

Hay una lista separada de funciones para calcular estadísticas de bondad de predicción con él, pero no está integrado en los modelos, ni incluye R al cuadrado. (Nunca he oído que se utilice R al cuadrado para datos fuera de muestra.) Calcularlos requiere un poco más de trabajo por parte del usuario y statsmodels no tiene el mismo conjunto de estadísticas, especialmente no para clasificación o modelos con una variable de respuesta binaria.

En cuanto a tus otros dos puntos:

La regresión lineal es, en su forma básica, la misma en statsmodels y en scikit-learn. Sin embargo, la implementación difiere, lo que puede producir resultados diferentes en casos extremos, y scikit learn tiene en general más soporte para modelos más grandes. Por ejemplo, statsmodels utiliza actualmente matrices dispersas en muy pocas partes.

La diferencia más importante está en la infraestructura circundante y en los casos de uso que se soportan directamente.

Statsmodels sigue en gran medida el modelo tradicional en el que queremos saber lo bien que un modelo determinado se ajusta a los datos, y qué variables "explican" o afectan al resultado, o cuál es el tamaño del efecto. Scikit-learn sigue la tradición del aprendizaje automático, en la que la tarea principal es elegir el "mejor" modelo de predicción.

En consecuencia, las funciones de apoyo de statsmodels se centran en el análisis de los datos de entrenamiento, lo que incluye pruebas de hipótesis y medidas de bondad de ajuste, mientras que la infraestructura de apoyo de scikit-learn se centra en la selección de modelos para la predicción fuera de la muestra y, por tanto, en la validación cruzada de los "datos de prueba".

statsmodels también realiza predicciones y, además, previsiones en un contexto de series temporales. Pero, cuando queremos hacer la validación cruzada para la predicción en statsmodels actualmente sigue siendo a menudo más fácil de reutilizar la configuración de validación cruzada de scikit-learn junto con los modelos de estimación de statsmodels.

3voto

Zekhire Puntos 53

En el modelo OLS se utilizan los datos de entrenamiento para ajustar y predecir.

Con el modelo de regresión lineal se utilizan datos de entrenamiento para ajustar y datos de prueba para predecir, por lo que los resultados de R2 son diferentes.

Si tomara los datos de prueba en el modelo OLS, debería tener los mismos resultados y un valor inferior

3voto

Praveen Puntos 59

Me he encontrado con un problema similar donde el OLS está dando diferentes valores Rsquared y Adjusted Rsquared en comparación con el modelo Sklearn LinearRegression.

Razón para ello: OLS no considera, por defecto, el coeficiente de intercepción y construye el modelo sin él y Sklearn lo considera en la construcción del modelo.

Solución: Añada una columna de 1's al conjunto de datos y ajuste el modelo con OLS y obtendrá casi los mismos valores de Rsquared y Adj. Rsquared para ambos modelos.

1voto

shubham pundir Puntos 1

Que quede muy claro: sabemos que la regresión lineal múltiple se representa como :

y = b0 + b1X1 + b2X2 + b3X3 + ..+ bnXn

pero también podemos, representarlo como: y = b0X0 + b1X1 + b2X2 + b3X3 + ..+ bnXn donde X0 = 1

Tenemos que añadir una columna con todos los mismos valores que 1 para representar b0X0.

¿Por qué necesitamos hacer eso? La librería Python de statsmodels proporciona una clase OLS (mínimos cuadrados ordinarios) para implementar la eliminación hacia atrás. Ahora una cosa a tener en cuenta que la clase OLS no proporciona la interceptación por defecto y tiene que ser creada por el propio usuario. Por eso creamos una columna con todos los mismos valores que 1 para representar b0X0.

Esa es la razón por la que obtenemos diferentes valores R2 en el modelo de regresión de sklearn y en el modelo estadístico de Ols.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X