Diferencia entre statsmodel OLS y regresión lineal de scikit-learn
Intenté practicar el modelo de regresión lineal con el conjunto de datos iris.
del sklearn import datasets
import seaborn as sns
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
del sklearn.linear_model import LinearRegression
cargar datos iris
train = sns.load_dataset(‘iris’)
train
one-hot-encoding
species_encoded = pd.get_dummies(train[“species”], prefix = “especie”)
species_encoded
train = pd.concat([train, species_encoded], axis = 1)
train
Separar características y objetivo
caracteristicas = [“sepal_length”, “petal_length”, “especie_setosa”, “especie_versicolor”, “especie_virginica”]
objetivo = [“petal_width”]
X_train = train[caracteristicas]
y_train = train[objetivo]
caso 1 : statsmodels
modelo
X_train_constante = sm.add_constant(X_train)
modelo = sm.OLS(y_train, X_train_constante).fit()
print(“const : {:.6f}”.format(modelo.params[0]))
print(modelo.params[1:])
resultado:
const : 0.253251
sepal_length -0.001693
petal_length 0.231921
especie_setosa -0.337843
especie_versicolor 0.094816
especie_virginica 0.496278
caso 2 : scikit-learn
modelo
modelo = LinearRegression()
modelo.fit(X_train, y_train)
print(“const : {:.6f}”.format(modelo.intercept_[0]))
print(pd.Series(modelo.coef_[0], modelo.feature_names_in_))
resultado:
const : 0.337668
sepal_length -0.001693
petal_length 0.231921
especie_setosa -0.422260
especie_versicolor 0.010399
especie_virginica 0.411861
¿Por qué los resultados de statsmodels y sklearn son diferentes?
Adicionalmente, los resultados de los dos modelos son los mismos a excepción de todas o parte de las características codificadas en one-hot.
davy.ai
Los resultados de statsmodel y scikit-learn son diferentes debido a que utilizan métodos diferentes para calcular el modelo de regresión lineal. Statsmodel utiliza el método de Mínimos Cuadrados Ordinarios mientras que scikit-learn utiliza el método de resolver la ecuación de forma cerrada. Esto puede llevar a ligeras diferencias en los parámetros del modelo, especialmente cuando se trata de características codificadas en one-hot.
En este caso, la diferencia en las características codificadas en one-hot podría deberse a que statsmodel incluye todas las tres características codificadas en one-hot como predictores separados mientras que scikit-learn solo incluye dos (dejando una como categoría de referencia). Esto puede resultar en diferencias en los coeficientes y valores de intercepción. Es importante destacar que ambos modelos son válidos y se pueden usar para análisis de regresión lineal, pero las diferencias en la implementación pueden llevar a ligeras variaciones en los resultados.