Python Функция для вычисления бета-матрицы - PullRequest
0 голосов
/ 08 апреля 2020

Я ищу эффективную функцию для автоматического создания бета-версий для каждой возможной модели множественной регрессии с учетом зависимой переменной и набора предикторов в виде DataFrame в python.

Например, для данного набора данных:

enter image description here

https://i.stack.imgur.com/YuPuv.jpg
Зависимый переменная - «Количество случаев на душу населения», а следующие столбцы - переменные предиктора.

В более простом примере:


  Student   Grade    Hours Slept   Hours Studied   ...  
 --------- -------- ------------- --------------- ----- 
  A             90             9               1   ...  
  B             85             7               2   ...  
  C            100             4               5   ...  
  ...          ...           ...             ...   ...  

, где вывод бета-матрицы будет выглядеть так:


  Regression   Hours Slept   Hours Studied  
 ------------ ------------- --------------- 
           1   #             N/A            
           2   N/A           #              
           3   #             #              

Размер таблицы будет [2^n - 1], где n - это число переменных, поэтому в случае с 5 предикторами и 1 зависимой будет 31 регрессия, каждая с различной возможной комбинацией beta вычислений.

Процесс описан более подробно здесь , а фактическое решение, записанное в R, размещено здесь .

1 Ответ

1 голос
/ 09 апреля 2020

Я не знаю ни одного пакета, который уже делает это. Но вы можете создать все эти комбинации (2 ^ n-1), где n - это число столбцов в X (независимых переменных), и подобрать модель линейной регрессии для каждой комбинации, а затем получить коэффициенты / бета-версии для каждой модели.

Вот как я бы это сделал, надеюсь, это поможет

from sklearn import datasets, linear_model
import numpy as np
from itertools import combinations

#test dataset
X, y = datasets.load_boston(return_X_y=True)

X = X[:,:3] # Orginal X has 13 columns, only taking n=3 instead of 13 columns

#create all 2^n-1 (here 7 because n=3) combinations of columns, where n is the number of features/indepdent variables

all_combs = [] 
for i in range(X.shape[1]):
    all_combs.extend(combinations(range(X.shape[1]),i+1))

# print 2^n-1 combinations
print('2^n-1 combinations are:')
print(all_combs) 

 ## Create a betas/coefficients as zero matrix with rows (2^n-1) and columns equal to X
betas = np.zeros([len(all_combs), X.shape[1]])+np.NaN

## Fit a model for each combination of columns and add the coefficients into betas matrix
lr = linear_model.LinearRegression()
for regression_no, comb in enumerate(all_combs):
    lr.fit(X[:,comb], y)
    betas[regression_no, comb] = lr.coef_

## Print Coefficients of each model
print('Regression No'.center(15)+" ".join(['column {}'.format(i).center(10) for i in range(X.shape[1])]))  
print('_'*50)
for index, beta in enumerate(betas):
    print('{}'.format(index + 1).center(15), " ".join(['{:.4f}'.format(beta[i]).center(10) for i in range(X.shape[1])]))

Результаты в

2^n-1 combinations are:
[(0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]


    Regression No  column 0   column 1   column 2 
__________________________________________________
       1         -0.4152      nan        nan    
       2           nan       0.1421      nan    
       3           nan        nan      -0.6485  
       4         -0.3521     0.1161      nan    
       5         -0.2455      nan      -0.5234  
       6           nan       0.0564    -0.5462  
       7         -0.2486     0.0585    -0.4156  
...