Accidentalmente, noté que los modelos OLS implementados por sklearn
y statsmodels
arrojan diferentes valores de R ^ 2 cuando no se ajustan a la intercepción. Por lo demás, parece que funcionan bien. El siguiente código produce:
import numpy as np import sklearn import statsmodels import sklearn.linear_model as sl import statsmodels.api as sm np.random.seed(42) N=1000 X = np.random.normal(loc=1, size=(N, 1)) Y = 2 * X.flatten() + 4 + np.random.normal(size=N) sklernIntercept=sl.LinearRegression(fit_intercept=True).fit(X, Y) sklernNoIntercept=sl.LinearRegression(fit_intercept=False).fit(X, Y) statsmodelsIntercept = sm.OLS(Y, sm.add_constant(X)) statsmodelsNoIntercept = sm.OLS(Y, X) print(sklernIntercept.score(X, Y), statsmodelsIntercept.fit().rsquared) print(sklernNoIntercept.score(X, Y), statsmodelsNoIntercept.fit().rsquared) print(sklearn.__version__, statsmodels.__version__)
huellas dactilares:
0.78741906105 0.78741906105 -0.950825182861 0.783154483028 0.19.1 0.8.0
¿De dónde viene la diferencia?
La pregunta difiere de los diferentes coeficientes de regresión lineal con statsmodels y sklearn , ya que sklearn.linear_model.LinearModel
(con intercepción) se ajustaba a X preparado como para statsmodels.api.OLS
.
La pregunta difiere de Statsmodels: calcule los valores ajustados y R al cuadrado , ya que aborda la diferencia entre dos paquetes de Python ( statsmodels
y scikit-learn
), mientras que la pregunta vinculada trata sobre statsmodels
y la definición común de R^2. Ambos son respondidos por la misma respuesta, sin embargo, ese tema ya se ha discutido aquí: ¿La misma respuesta implica que las preguntas deben cerrarse como duplicadas?
Como señaló @ user333700 en los comentarios, la definición OLS de R^2 es diferente en la implementación de statsmodels
que en la de scikit-learn
.
De la documentación de la clase RegressionResults
(énfasis mío):
R-cuadrado
R-cuadrado de un modelo con intercepto. Esto se define aquí como 1-ssr/centered_tss si la constante se incluye en el modelo y 1-ssr/uncentered_tss si se omite la constante .
De la documentación de LinearRegression.score()
:
puntuación (X, y, sample_weight=Ninguno)
Devuelve el coeficiente de determinación R^2 de la predicción.
El coeficiente R^2 se define como (1 - u/v), donde u es el residuo
suma de cuadrados ((y_true - y_pred) ** 2).sum() y v es la suma total de cuadrados ((y_true - y_true.mean()) ** 2).sum(). La mejor puntuación posible es 1,0 y puede ser negativa (porque el modelo puede ser arbitrariamente peor). Un modelo constante que siempre prediga el valor esperado de y, sin tener en cuenta las características de entrada, obtendría una puntuación R^2 de 0,0.