#python #python-3.x #scikit-learn
#python #python-3.x #scikit-learn
Вопрос:
dataset = pd.read_excel('dfmodel.xlsx')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)
from sklearn.metrics import r2_score
print('The R2 score of Multi-Linear Regression model is: ',r2_score(y_test,y_pred))
С помощью приведенного выше кода мне удалось выполнить линейную регрессию и получить R2.
Как мне получить бета-коэффициенты каждой переменной-предиктора?
Ответ №1:
Из sklearn.linear_model.На странице документации LinearRegression вы можете найти коэффициенты (наклон) и перехват в regressor.coef_
и regressor.intercept_
соответственно.
Если вы используете sklearn.предварительная обработка.StandardScaler перед подгонкой вашей модели коэффициенты регрессии должны быть бета-коэффициентами, которые вы ищете.
Комментарии:
1. использование
regressor.coef_
результатов в массиве без какого-либо имени столбца. Трудно понять, насколько сильно влияние каждой переменной-предиктора на такие массивы..2. коэффициенты = pd.concat([pd.DataFrame(X.столбцы),pd.DataFrame(np.transpose(logistic.coef_))], axis = 1) приводит к ошибке: AttributeError: объект ‘numpy.ndarray’ не имеет атрибута ‘столбцы’. После этого понятия не имею..
3. Вы уже преобразовали свой фрейм данных в массив numpy, отсюда и ошибка. Вместо этого используйте dataset.columns.
Ответ №2:
Лично я предпочитаю один шаг np.polyfit() с указанной степенью 1.
import numpy as np
np.polyfit(X,y,1)[0] #returns beta other coeffs if > 1 degree.
итак, ваш вопрос, если я правильно понимаю, вы хотите вычислить прогнозируемые значения y по сравнению с начальным y — будет следующим:
np.polyfit(y_test,y_pred,1)[0]
Я бы вместо этого протестировал np.polyfit(x_test,y_pred)[0] .
Ответ №3:
Используйте regressor.coef_
. Вы можете увидеть, как эти коэффициенты отображаются в порядке переменных-предикторов, сравнивая с statsmodels
реализацией:
from sklearn.linear_model import LinearRegression
regressor = LinearRegression(fit_intercept=False)
regressor.fit(X, y)
regressor.coef_
# array([0.43160901, 0.42441214])
statsmodels
версия:
import statsmodels.api as sm
sm.add_constant(X)
mod = sm.OLS(y, X)
res = mod.fit()
print(res.summary())
OLS Regression Results
=======================================================================================
Dep. Variable: y R-squared (uncentered): 0.624
Model: OLS Adj. R-squared (uncentered): 0.623
Method: Least Squares F-statistic: 414.0
Date: Tue, 29 Sep 2020 Prob (F-statistic): 1.25e-106
Time: 17:03:27 Log-Likelihood: -192.54
No. Observations: 500 AIC: 389.1
Df Residuals: 498 BIC: 397.5
Df Model: 2
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x1 0.4316 0.041 10.484 0.000 0.351 0.512
x2 0.4244 0.041 10.407 0.000 0.344 0.505
==============================================================================
Omnibus: 36.830 Durbin-Watson: 1.967
Prob(Omnibus): 0.000 Jarque-Bera (JB): 13.197
Skew: 0.059 Prob(JB): 0.00136
Kurtosis: 2.213 Cond. No. 2.57
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Вы можете выполнить прямой тест эквивалентности с:
np.array([regressor.coef_.round(8) == res.params.round(8)]).all() # True
Комментарии:
1. очень впечатляет. Можно ли заменить x1, x2, x3, … именами столбцов?
2. @Luc да, это делается в statsmodels при вызове
summary()
:res.summary(xname=["foo", "bar"])
3. Если X в statsmodels является фреймом данных pandas, то автоматически используются имена столбцов.