получить бета-коэффициенты регрессионной модели в Python

#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, то автоматически используются имена столбцов.