Было бы очень полезно предоставить mcve с вашими sklearn
и statsmodels
регрессиями.
Если отбросить преимущества запуска регрессии с 2000 переменными, кажется, чтоВаши входные данные могут содержать столбец констант.Страница справки для sm.add_constant()
сообщает:
has_constant : str {'raise', 'add', 'skip'}
Behavior if ``data`` already has a constant. The default will return
data without adding another constant. If 'raise', will raise an
error if a constant is present. Using 'add' will duplicate the
constant, if one is present.
Нормальное поведение
np.random.seed(42)
df = pd.DataFrame({'x1':np.random.rand(20) // .1,
'x2':np.random.rand(20) // .01,
'x3':np.random.rand(20) // .01,
'y':np.random.rand(20) // .01})
X = df.iloc[:, :-1]
y = df.iloc[:, -1]
X2 = sm.add_constant(X)
model = sm.OLS(y, X2).fit()
print(model.summary())
возвращает
const 23.7669 24.751 0.960 0.351 -28.702 76.236
x1 1.1993 2.943 0.408 0.689 -5.039 7.438
x2 0.4973 0.327 1.523 0.147 -0.195 1.190
x3 -0.1122 0.231 -0.486 0.634 -0.602 0.377
Константа уже в наборе данных
Если в наборе данных уже есть постоянный член, sm.add_constant()
выполняется, не возвращает сообщения и не добавляет константу.В приведенном ниже примере константой является значение, отличное от 1
, поэтому параметр для k
на выходе регрессии отличается от приведенного выше нормального случая.
np.random.seed(42)
df = pd.DataFrame({'x1':np.random.rand(20) // .1,
'x2':np.random.rand(20) // .01,
'x3':np.random.rand(20) // .01,
'k':list([15])*20,
'y':np.random.rand(20) // .01})
X = df.iloc[:, :-1]
y = df.iloc[:, -1]
X2 = sm.add_constant(X)
model = sm.OLS(y, X2).fit()
print(model.summary())
возвращает
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x1 1.1993 2.943 0.408 0.689 -5.039 7.438
x2 0.4973 0.327 1.523 0.147 -0.195 1.190
x3 -0.1122 0.231 -0.486 0.634 -0.602 0.377
k 1.5845 1.650 0.960 0.351 -1.913 5.082