ols multiple python scikit-learn linear-regression statsmodels

multiple - statsmodels python



RegresiĆ³n OLS: Scikit vs. Statsmodels? (2)

Versión corta : estaba usando scikit LinearRegression en algunos datos, pero estoy acostumbrado a los valores de p, así que ponga los datos en los modelos de estadísticas OLS, y aunque el R ^ 2 es aproximadamente el mismo, los coeficientes variables son todos diferentes por grandes cantidades . Esto me preocupa ya que el problema más probable es que he cometido un error en algún lugar y ahora no me siento seguro en ninguno de los resultados (ya que es probable que haya hecho un modelo incorrectamente pero no sé cuál).

Versión más larga : debido a que no sé dónde está el problema, no sé exactamente qué detalles incluir, e incluir todo es probablemente demasiado. Tampoco estoy seguro de incluir código o datos.

Tengo la impresión de que LR y statsmodels OLS de scikit deberían estar haciendo OLS, y que yo sepa, OLS es OLS, por lo que los resultados deberían ser los mismos.

Para LR de scikit, los resultados son (estadísticamente) los mismos, ya sea que establezca o no normalize = True o = False, lo cual me parece algo extraño.

Para statsmodels OLS, normalizo los datos usando StandardScaler de sklearn. Agrego una columna de unos para que incluya una intersección (ya que la salida de scikit incluye una intersección). Más sobre eso aquí: http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html (Agregar esta columna no cambió los coeficientes variables a ningún grado notable y la intersección fue muy cercana a cero). StandardScaler no No me gusta que mis ints no fueran flotantes, así que intenté esto: https://github.com/scikit-learn/scikit-learn/issues/1709 Eso hace que la advertencia desaparezca, pero los resultados son exactamente iguales.

Por supuesto, estoy usando 5 veces el cv para el enfoque de sklearn (R ^ 2 son consistentes tanto para los datos de prueba como para los de entrenamiento cada vez), y para los modelos de estadísticas acabo de lanzar todos los datos.

R ^ 2 es de aproximadamente 0,41 tanto para sklearn como para statsmodels (esto es bueno para las ciencias sociales). Esto podría ser una buena señal o simplemente una coincidencia.

Los datos corresponden a observaciones de avatares en WoW (de http://mmnet.iis.sinica.edu.tw/dl/wowah/ ) que he recopilado para hacerlos semanalmente con algunas características diferentes. Originalmente, este era un proyecto de clase para una clase de ciencia de datos.

Las variables independientes incluyen el número de observaciones en una semana (int), el nivel de carácter (int), si está en un gremio (booleano), cuando se ven (booleanos en día laborable, víspera entre semana, tardes entre semana y las mismas tres para el fin de semana), una dummy para la clase de caracteres (en el momento de la recopilación de datos, solo había 8 clases en WoW, por lo que hay 7 vars ficticios y se elimina la variable categórica de la cadena original), y otros.

La variable dependiente es cuántos niveles ganó cada personaje durante esa semana (int).

Curiosamente, parte del orden relativo dentro de las variables similares se mantiene a través de los modelos de stats y sklearn. Por lo tanto, el orden de clasificación de "cuando se ve" es el mismo, aunque las cargas son muy diferentes, y el orden de clasificación para los maniquíes de clase de caracteres es el mismo, aunque de nuevo las cargas son muy diferentes.

Creo que esta pregunta es similar a esta: Diferencia en los modelos de estadísticas de Python OLS y R''s lm

Soy lo suficientemente bueno en Python y las estadísticas para intentarlo, pero no lo suficiente como para resolver algo como esto. Intenté leer los documentos de Sklearn y los de statsmodels, pero si la respuesta estaba allí, mirándome a la cara, no lo entendía.

Amaría saber:

  1. ¿Qué salida podría ser precisa? (Concedido que ambos podrían ser si me perdí un kwarg.)
  2. Si cometí un error, ¿qué es y cómo solucionarlo?
  3. ¿Podría haberlo resuelto sin preguntar aquí, y si es así, cómo?

Sé que esta pregunta tiene algunos bits bastante vagos (sin código, sin datos, sin resultados), pero creo que se trata más de los procesos generales de los dos paquetes. Claro, uno parece ser más estadísticas y uno parece ser más aprendizaje automático, pero ambos son MCO, así que no entiendo por qué los resultados no son los mismos.

(Incluso intenté algunas otras llamadas de OLS para triangular, una dio una R ^ 2 mucho más baja, una en bucle durante cinco minutos y la maté, y otra se estrelló).

¡Gracias!


Solo quería agregar aquí, que en términos de sklearn, no utiliza el método OLS para la regresión lineal bajo el capó. Como sklearn proviene del reino de la extracción de datos / aprendizaje automático, les gusta usar el algoritmo de gradiente de pendiente más pronunciada. Este es un método numérico que es sensible a las condiciones iniciales, etc., mientras que el MCO es un enfoque analítico de forma cerrada, por lo que uno debe esperar diferencias. Así que statsmodels proviene del campo de estadísticas clásico, por lo que utilizarían la técnica OLS. Así que hay diferencias entre las dos regresiones lineales de las 2 bibliotecas diferentes


Parece que no está alimentando la misma matriz de regresores X a ambos procedimientos (pero vea más abajo). Aquí hay un ejemplo para mostrarle qué opciones necesita usar para sklearn y statsmodels para producir resultados idénticos.

import numpy as np import statsmodels.api as sm from sklearn.linear_model import LinearRegression # Generate artificial data (2 regressors + constant) nobs = 100 X = np.random.random((nobs, 2)) X = sm.add_constant(X) beta = [1, .1, .5] e = np.random.random(nobs) y = np.dot(X, beta) + e # Fit regression model sm.OLS(y, X).fit().params >> array([ 1.4507724 , 0.08612654, 0.60129898]) LinearRegression(fit_intercept=False).fit(X, y).coef_ >> array([ 1.4507724 , 0.08612654, 0.60129898])

Como sugirió un comentarista, incluso si le está dando a ambos programas la misma X, X puede que no tenga rango de columna completo, y sm / sk podría estar realizando (diferentes) acciones bajo el capó para hacer que el cálculo OLS se realice (es decir soltando diferentes columnas).

Te recomiendo usar pandas y patsy para encargarte de esto:

import pandas as pd from patsy import dmatrices dat = pd.read_csv(''wow.csv'') y, X = dmatrices(''levels ~ week + character + guild'', data=dat)

O, alternativamente, la interfaz de fórmula de statsmodels :

import statsmodels.formula.api as smf dat = pd.read_csv(''wow.csv'') mod = smf.ols(''levels ~ week + character + guild'', data=dat).fit()

Edición: este ejemplo puede ser útil: http://statsmodels.sourceforge.net/devel/example_formulas.html