R^2 отрицательный при использовании sklearn и 0,92 при использовании статистических моделей

Я так растерялся. Я сравниваю лассо и линейную регрессию на модели, предсказывающей цены на жилье. Я не понимаю, как, когда я запускаю линейную модель в sklearn, я получаю отрицательный результат для R ^ 2, но когда я запускаю ее в лассо, я получаю разумный R ^ 2. Я знаю, что вы можете получить отрицательное значение R^2, если линейная регрессия плохо подходит для вашей модели, поэтому я решил проверить ее с помощью МНК в статистических моделях, где я также получаю высокое значение R^2. Я просто запутался, как это возможно и что происходит? Это связано с мультиколлинеарностью?

Кроме того, да, я знаю, что я могу использовать поиск по сетке cv, чтобы найти альфу для лассо, но мой профессор хотел, чтобы мы попробовали это таким образом, чтобы попрактиковаться в программировании. Я по специальности математик, и это для курса статистики.

# Linear regression in sklearn

X = df.drop('SalePrice',axis=1)
y = df['SalePrice']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=60)
lm = LinearRegression()
lm.fit(X_train, y_train)
predictions_linear = lm.predict(X_test)
print('\nR^2 of linear model is {:.5f}\n'.format(metrics.r2_score(y_test, predictions_linear)))
>>>>R^2 of linear model is -213279628873266528256.00000


# Lasso in sklearn

r2_alpha_lasso = [None]*200
i=0
for num in np.logspace(-4,1,len(r2_alpha_lasso)):
    lasso = linear_model.Lasso(alpha=num, random_state=50)
    lasso.fit(X_train, y_train)
    predictions_lasso = lasso.predict(X_test)
    r2 = metrics.r2_score(y_test, predictions_lasso)
    r2_alpha_lasso[i] = [num, r2]
    i+=1

r2_maximized_lasso = sorted(r2_alpha_lasso, key=itemgetter(1))[-1]
print("\nR^2 maximized where:\n    Alpha: {:.5f}\n    R^2: {:.5f}\n".format(r2_maximized_lasso[0], r2_maximized_lasso[1]))
>>>>R^2 maximized where:
    Alpha: 0.00120
    R^2: 0.90498


# OLS in statsmodels

df['Constant'] = 1
X = df.drop('SalePrice',axis=1)
y = df['SalePrice']
mod = sm.OLS(endog=y, exog=X, data=df)
res = mod.fit()
print(res.summary())  # only printed the relevant results, not the entire table
>>>>R-squared:                       0.921
    Adj. R-squared:                  0.908
    [2] The smallest eigenvalue is 1.26e-29. This might indicate that there are

сильные проблемы мультиколлинеарности или что матрица плана является сингулярной.


person agra94    schedule 27.11.2018    source источник
comment
Для LR one вы используете только данные одного прогона и тренировочного теста без какой-либо настройки, для Lasso вы показываете максимальное значение R2 среди 200 прогонов, а для OLS вы используете все данные без разделения на тренировку и тест. Тогда почему вы думаете, что эти вещи можно сравнивать?   -  person Vivek Kumar    schedule 27.11.2018
comment
Я не сравниваю их напрямую, но расхождение в R ^ 2 для лассо и линейной модели, похоже, вызывает беспокойство, поскольку они оба используют одни и те же тестовые и обучающие наборы. Затем я посмотрел на R^2 для OLS, чтобы понять, смогу ли я лучше понять, что происходит.   -  person agra94    schedule 27.11.2018
comment
Я еще раз повторяю то, что я сказал выше. Даже если они используют одни и те же данные тестов поезда, вы показываете здесь лучший результат из 200 запусков лассо. Вы уверены, что все 200 пробежек имеют хорошие результаты? Почему бы вам не попробовать 200 прогонов для LR с другими параметрами?   -  person Vivek Kumar    schedule 27.11.2018
comment
Это 200 прогонов лассо, каждый с другим параметром альфы. Выбранная модель — это та модель, в которой R^2 максимальна. Конечно, не все они будут иметь хорошие оценки, если сила регуляризации достаточно высока, чтобы обнулить все коэффициенты. Идея состоит в том, чтобы найти альфу там, где максимально R^2. Альфа — это гиперпараметр, выбираемый исследователем, строящим модель. Линейная регрессия не имеет такого гиперпараметра.   -  person agra94    schedule 27.11.2018
comment
Точно моя точка зрения. LR и Lasso — это два разных алгоритма с разными гиперпараметрами и разными предположениями о данных. Так что выход может быть разным. Что касается sm.OLS, то на него вы отправляете разные данные, и методы подгонки разные, и определение, используемое для R2, ​​тоже другое. См. этот вопрос и этот   -  person Vivek Kumar    schedule 28.11.2018
comment
Конечно, результат будет другим. Это очевидно. Но несоответствие в R^2 все же очень странное и заслуживает вопросов. Кроме того, линейные модели не имеют гиперпараметров.   -  person agra94    schedule 28.11.2018
comment
Вы смотрели ссылки, которые я давал в предыдущих комментариях?   -  person Vivek Kumar    schedule 29.11.2018