Pregunta

Version corta:Estaba usando scikit LinearRegression en algunos datos, pero estoy acostumbrado a los valores p, así que coloque los datos en los modelos de estadísticas OLS, y aunque el R ^ 2 es aproximadamente el mismo, los coeficientes variables son todos diferentes en grandes cantidades.Esto me preocupa ya que el problema más probable es que cometí un error en alguna parte y ahora no me siento seguro de ninguno de los resultados (ya que probablemente hice un modelo incorrectamente pero no sé cuál).

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

Tengo la impresión de que LR de scikit y OLS de statsmodels deberían estar haciendo OLS y, hasta donde yo sé, 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 normalize=True o =False o no, lo cual me parece algo extraño.

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

De acuerdo, estoy usando cv de 5 veces para el enfoque 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 simplemente agrego todos los datos.

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

Los datos son observaciones de avatares en WoW (de http://mmnet.iis.sinica.edu.tw/dl/wowah/) que estuve pensando en hacerlo 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 del personaje (int), si está en un gremio (booleano), cuándo se ve (booleanos el día laborable, la víspera del día laborable, el día laborable tarde y los mismos tres para el fin de semana), un ficticio para la clase de personaje (en el momento de la recopilación de datos, solo había 8 clases en WoW, por lo que hay 7 variables ficticias y la variable categórica de cadena original se elimina), y otros.

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

Curiosamente, parte del orden relativo dentro de variables similares se mantiene en statsmodels y sklearn.Entonces, 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 muñecos de clase de personaje es el mismo aunque nuevamente las cargas son muy diferentes.

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

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

Amaría saber:

  1. ¿Qué resultado podría ser exacto?(Es cierto que ambos podrían serlo si me perdiera un kwarg).
  2. Si cometí un error, ¿qué es y cómo solucionarlo?
  3. ¿Podría haber resuelto esto sin preguntar aquí y, de ser así, cómo?

Sé que esta pregunta tiene algunas partes bastante vagas (sin código, sin datos, sin salida), pero creo que se trata más de los procesos generales de los dos paquetes.Claro, uno parece tener más estadísticas y el otro parece tener más aprendizaje automático, pero ambos son OLS, por lo que no entiendo por qué los resultados no son los mismos.

(Incluso probé algunas otras llamadas OLS para triangular, una dio un R^2 mucho más bajo, otra hizo un bucle durante cinco minutos y la eliminé, y otra falló).

¡Gracias!

¿Fue útil?

Solución

Parece que no estás alimentando la misma matriz de regresores. X a ambos procedimientos (pero ver más abajo).Aquí hay un ejemplo para mostrarle qué opciones necesita usar para que sklearn y statsmodels produzcan 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, es posible que X no tenga el rango de columna completo, y sm/sk podrían estar tomando (diferentes) acciones encubiertas para que el cálculo OLS se realice (es decir,eliminando diferentes columnas).

te recomiendo que uses pandas y patsy para encargarse 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, el statsmodels interfaz de fórmula:

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

Editar:Este ejemplo puede resultar útil: http://statsmodels.sourceforge.net/devel/example_formulas.html

Otros consejos

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ó.Dado que sklearn proviene del ámbito de la minería de datos/aprendizaje automático, les gusta usar el algoritmo Steepest Descent Gradient.Este es un método numérico que es sensible a las condiciones iniciales, etc., mientras que OLS es un enfoque analítico de forma cerrada, por lo que se deben esperar diferencias.Entonces, los modelos de estadísticas provienen del campo de la estadística clásica, por lo que usarían la técnica OLS.Entonces existen diferencias entre las dos regresiones lineales de las 2 bibliotecas diferentes.

Si utiliza statsmodels, le recomiendo encarecidamente que utilice la interfaz de fórmulas de statsmodels.Obtendrá el mismo resultado anterior de OLS utilizando la interfaz de fórmula de statsmodels que obtendría de sklearn.linear_model.LinearRegression, R, SAS o Excel.

smod = smf.ols(formula ='y~ x', data=df)
result = smod.fit()
print(result.summary())

En caso de duda, por favor

  1. intenta leer el código fuente
  2. pruebe con un idioma diferente como punto de referencia, o
  3. Pruebe OLS desde cero, que es álgebra lineal básica.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top