R ^ 2 отрицательно при использовании sklearn и 0.92 при использовании statsmodels - PullRequest
0 голосов
/ 27 ноября 2018

Я так растерялся.Я сравниваю лассо и линейную регрессию на модели, которая предсказывает цены на жилье.Я не понимаю, как, когда я запускаю линейную модель в sklearn, я получаю отрицательное значение для R ^ 2, но когда я запускаю ее в лассо, я получаю разумное значение R ^ 2.Я знаю, что вы можете получить отрицательное значение R ^ 2, если линейная регрессия плохо подходит для вашей модели, поэтому я решил проверить это с помощью OLS в statsmodels, где я также получаю высокое значение 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...