Diferencia entre statsmodel OLS y regresión lineal scikit


14

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

Aquí está el código que uso la biblioteca de estadísticas 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-squared 0.981434611923

y el segundo es el método de modelo lineal de la biblioteca de aprendizaje scikit:

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

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

Según tengo entendido, OLS trabaja con el conjunto de datos de entrenamiento. Entonces mis preguntas

  • ¿Hay alguna manera que funcione con el conjunto de datos de prueba con OLS?
  • ¿El puntaje del conjunto de datos de rastreo nos da algún significado (en OLS no utilizamos el conjunto de datos de prueba)? Según mi conocimiento anterior, tenemos que trabajar con datos de prueba.
  • ¿Cuál es la diferencia entre OLS y la regresión lineal de scikit? ¿Cuál usamos para calcular la puntuación del modelo?

Gracias por cualquier ayuda.

Respuestas:


14

Primero en términos de uso. Puede obtener la predicción en statsmodels de una manera muy similar a scikit-learn, excepto que usamos la instancia de resultados devuelta porfit

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 la bondad de las estadísticas de predicción, pero no está integrada en los modelos, ni incluye R al cuadrado. (Nunca he oído hablar de R cuadrado utilizado para datos fuera de la 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.

A tus otros dos puntos:

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

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

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

Como consecuencia, el énfasis en las características de soporte de statsmodels está en analizar los datos de entrenamiento que incluyen pruebas de hipótesis y medidas de bondad de ajuste, mientras que el énfasis en la infraestructura de soporte en scikit-learn está en la selección de modelos para predicción de muestra y, por lo tanto, validación cruzada en "datos de prueba".

Esto señala la distinción, todavía hay una gran superposición también en el uso. statsmodels también hace predicciones y, además, pronostica en un contexto de serie temporal. Pero, cuando queremos hacer una validación cruzada para la predicción en modelos de estadísticas, en la actualidad todavía es más fácil reutilizar la configuración de validación cruzada de scikit-learn junto con los modelos de estimación de modelos de estadísticas.


Hmm, estoy tratando de usar un modelo ARMA de statsmodels.tsa, pero la interfaz de predicción es completamente diferente allí. ¿Sabes cómo alimentar los datos de prueba?
Ephes

1
Esa es una pregunta diferente, y debes mirar la documentación o los ejemplos. La predicción en los modelos de series de tiempo es bastante diferente debido a la estructura de tiempo secuencial y la predicción es el pronóstico de los valores en los próximos períodos de tiempo.
Josef

Tienes razón, esa es otra pregunta, sin embargo, gracias por la explicación. He leído la documentación y conseguí que funcione de alguna manera. Pero todavía no entiendo por qué la interfaz es diferente. Especialmente por qué no es posible proporcionar vectores de características y obtener predicciones (pronósticos).
Ephes

ARMA y SARIMAX permiten incluir variables explicativas exogen la estimación y el pronóstico.
Josef

Esta pregunta sobre Stackowerlow aborda la diferencia en las interfaces: stackoverflow.com/questions/41045752/…
David Dale

1

En el modelo OLS está utilizando los datos de entrenamiento para ajustar y predecir.

Con el modelo LinearRegression, está utilizando datos de entrenamiento para ajustar y probar datos para predecir, por lo tanto, diferentes resultados en puntajes R2.

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


0

He encontrado un problema similar en el que el OLS está dando diferentes valores de Rsquared y Rsquared ajustado en comparación con el modelo Sklearn LinearRegression.

Razón para ello: OLS no considera, por defecto, el coeficiente de intercepción y allí construye el modelo sin él y Sklearn lo considera al construir el modelo.

Solución: agregue una columna de 1 al conjunto de datos y ajuste el modelo con OLS y obtendrá casi el mismo Rsquared y Adj. Valores cuadrados para ambos modelos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.