파이썬에서 다중 선형 회귀


129

다중 회귀를 수행하는 파이썬 라이브러리를 찾지 못하는 것 같습니다. 내가 찾은 유일한 것은 단순한 회귀 만합니다. 여러 독립 변수 (x1, x2, x3 등)에 대해 종속 변수 (y)를 되돌려 야합니다.

예를 들어이 데이터를 사용하면

print 'y        x1      x2       x3       x4      x5     x6       x7'
for t in texts:
    print "{:>7.1f}{:>10.2f}{:>9.2f}{:>9.2f}{:>10.2f}{:>7.2f}{:>7.2f}{:>9.2f}" /
   .format(t.y,t.x1,t.x2,t.x3,t.x4,t.x5,t.x6,t.x7)

(위에 대한 출력 :)

      y        x1       x2       x3        x4     x5     x6       x7
   -6.0     -4.95    -5.87    -0.76     14.73   4.02   0.20     0.45
   -5.0     -4.55    -4.52    -0.71     13.74   4.47   0.16     0.50
  -10.0    -10.96   -11.64    -0.98     15.49   4.18   0.19     0.53
   -5.0     -1.08    -3.36     0.75     24.72   4.96   0.16     0.60
   -8.0     -6.52    -7.45    -0.86     16.59   4.29   0.10     0.48
   -3.0     -0.81    -2.36    -0.50     22.44   4.81   0.15     0.53
   -6.0     -7.01    -7.33    -0.33     13.93   4.32   0.21     0.50
   -8.0     -4.46    -7.65    -0.94     11.40   4.43   0.16     0.49
   -8.0    -11.54   -10.03    -1.03     18.18   4.28   0.21     0.55

선형 회귀 공식을 얻으려면 어떻게 파이썬에서 이것을 회귀합니까?

Y = a1x1 + a2x2 + a3x3 + a4x4 + a5x5 + a6x6 + + a7x7 + c


전문가가 아니라 변수가 독립적이라면 각각에 대해 간단한 회귀를 실행하고 결과를 합할 수는 없습니까?
휴 Bothwell

8
@HughBothwell 변수가 독립적이라고 가정 할 수는 없습니다. 실제로 변수가 독립적이라고 가정하면 데이터를 잘못 모델링했을 수 있습니다. 즉, 응답 Y이 서로 상관 될 수 있지만 독립성이 데이터 세트를 정확하게 모델링하지 않는다고 가정합니다.
hlin117

@HughBothwell이 멍청한 질문이라면 미안하지만 원시 기능 변수 x_i가 독립적인지 아닌지 왜 중요합니까? 이것이 예측 변수 (= 모델)에 어떤 영향을 줍니까?
Charlie Parker

답변:


100

sklearn.linear_model.LinearRegression 그것을 할 것입니다 :

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit([[getattr(t, 'x%d' % i) for i in range(1, 8)] for t in texts],
        [t.y for t in texts])

그런 다음 clf.coef_회귀 계수를 갖습니다.

sklearn.linear_model 또한 회귀에 대해 다양한 종류의 정규화를 수행하는 유사한 인터페이스가 있습니다.


2
특정 입력에 대한 오류를 반환합니다 . 다른 솔루션이 있습니까?
Zach

@Dougal sklearn.linear_model.LinearRegression을 가중 다변량 회귀에도 사용할 수 있습니까?
user961627

1
상수 항을 맞추려면 clf = linear_model.LinearRegression (fit_intercept = True)
Imran

2
sklearn.linear_model.LinearRegression을 사용하여 신뢰 수준을 얻는 방법을 알고 있습니까? 감사.
Huanian Zhang

1
@HuanianZhang 자신감 수준이란 무엇입니까? 결정 계수를 원하면 score방법이 결정 합니다. sklearn.metrics다른 모델 평가 기준이 있습니다. Akavall의 답변과 같은 것을 원한다면 statsmodels에는 R 형 진단이 더 있습니다.
Dougal

60

여기에 내가 만든 약간의 해결 방법이 있습니다. R로 확인했는데 올바르게 작동합니다.

import numpy as np
import statsmodels.api as sm

y = [1,2,3,4,3,4,5,4,5,5,4,5,4,5,4,5,6,5,4,5,4,3,4]

x = [
     [4,2,3,4,5,4,5,6,7,4,8,9,8,8,6,6,5,5,5,5,5,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,7,7,7,7,7,6,5],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,7,7,7,7,7,6,6,4,4,4]
     ]

def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results

결과:

print reg_m(y, x).summary()

산출:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.535
Model:                            OLS   Adj. R-squared:                  0.461
Method:                 Least Squares   F-statistic:                     7.281
Date:                Tue, 19 Feb 2013   Prob (F-statistic):            0.00191
Time:                        21:51:28   Log-Likelihood:                -26.025
No. Observations:                  23   AIC:                             60.05
Df Residuals:                      19   BIC:                             64.59
Df Model:                           3                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             0.2424      0.139      1.739      0.098        -0.049     0.534
x2             0.2360      0.149      1.587      0.129        -0.075     0.547
x3            -0.0618      0.145     -0.427      0.674        -0.365     0.241
const          1.5704      0.633      2.481      0.023         0.245     2.895

==============================================================================
Omnibus:                        6.904   Durbin-Watson:                   1.905
Prob(Omnibus):                  0.032   Jarque-Bera (JB):                4.708
Skew:                          -0.849   Prob(JB):                       0.0950
Kurtosis:                       4.426   Cond. No.                         38.6

pandas 이 답변에 주어진 OLS를 실행하는 편리한 방법을 제공합니다.

Pandas 데이터 프레임으로 OLS 회귀 실행


18
reg_m기능은 불필요하게 복잡합니다. x = np.array(x).T, x = sm.add_constant(x)그리고 results = sm.OLS(endog=y, exog=x).fit()충분하다.
cd98

1
이것은 좋은 도구입니다. 한 가지 질문 만하십시오.이 경우 t 값이 95.5 % 신뢰 구간을 벗어 났으므로이 피팅이 전혀 정확하지 않다는 것을 의미하거나 어떻게 설명합니까?
Huanian Zhang

2
방금 x1, x2, x3이 원래 예측 변수 목록에서 역순으로 표시됩니다. 즉 x = [x3, x2, x1]?
sophiadw

@sophiadw x = x[::-1]함수 정의 내에 추가 하여 올바른 순서로 얻을 수 있습니다
Ashrith

@HuanianZhang "t value"는 계수가 0에서 떨어진 표준 편차의 수이고 95 % CI는 대략 coef +- 2 * std err(실제로 잔차의 자유도에 의해 매개 변수화 된 Student-t 분포)입니다. 즉, 절대 절대 값이 클수록 CI가 0에서 멀어짐을 의미하지만 직접 비교해서는 안됩니다. 설명이 약간 늦었지만 누군가에게 유용하기를 바랍니다
Sam Mason

47

명확히하기 위해, 당신이 제공 한 예는 여러 선형 회귀가 아니라 다변량 선형 회귀를 참조하십시오. 차이 :

단일 스칼라 예측 변수 x와 단일 스칼라 응답 변수 y의 가장 간단한 경우를 단순 선형 회귀라고합니다. 다중 및 / 또는 벡터 값 예측 변수 (자본 X로 표시) 로의 확장은 다중 선형 회귀라고도하며 다중 변수 선형 회귀라고도합니다. 거의 모든 실제 회귀 모델에는 여러 예측 변수가 포함되며 선형 회귀에 대한 기본 설명은 종종 여러 회귀 모델로 표현됩니다. 그러나이 경우 응답 변수 y는 여전히 스칼라입니다. 다변량 선형 회귀의 다른 용어는 y가 벡터 인 경우, 즉 일반 선형 회귀와 같은 경우를 의미합니다.

한마디로 :

  • 배수 선형 회귀 : 응답 y는 스칼라입니다.
  • 다변량 선형 회귀 : 반응 y는 벡터입니다.

(다른 출처 .)


5
이것은 유용한 정보 일 수 있지만 질문에 어떻게 대답하는지 모르겠습니다.
Akavall

7
@Akavall은 올바른 용어를 사용하여 답을 찾는 첫 번째 단계입니다.
Franck Dernoncourt

1
@FranckDernoncourt 그러나 OP의 Y 값은 벡터입니까?
항상 묻는 질문

@FranckDernoncourt : "올바른 용어를 사용하는 것이 답을 찾는 첫 번째 단계" 입니다. 훌륭합니다. 그래서 우리 둘 다 동의 할 수 있습니다. 이것은 그 자체로는 실제로 답이 아닙니다. 사용자는 다른 리소스를 찾아 볼 필요없이 답변에서 직접 문제를 해결할 수 있어야합니다 .

28

numpy.linalg.lstsq 사용할 수 있습니다 :

import numpy as np
y = np.array([-6,-5,-10,-5,-8,-3,-6,-8,-8])
X = np.array([[-4.95,-4.55,-10.96,-1.08,-6.52,-0.81,-7.01,-4.46,-11.54],[-5.87,-4.52,-11.64,-3.36,-7.45,-2.36,-7.33,-7.65,-10.03],[-0.76,-0.71,-0.98,0.75,-0.86,-0.50,-0.33,-0.94,-1.03],[14.73,13.74,15.49,24.72,16.59,22.44,13.93,11.40,18.18],[4.02,4.47,4.18,4.96,4.29,4.81,4.32,4.43,4.28],[0.20,0.16,0.19,0.16,0.10,0.15,0.21,0.16,0.21],[0.45,0.50,0.53,0.60,0.48,0.53,0.50,0.49,0.55]])
X = X.T # transpose so input vectors are along the rows
X = np.c_[X, np.ones(X.shape[0])] # add bias term
beta_hat = np.linalg.lstsq(X,y)[0]
print beta_hat

결과:

[ -0.49104607   0.83271938   0.0860167    0.1326091    6.85681762  22.98163883 -41.08437805 -19.08085066]

다음을 사용하여 예상 출력을 볼 수 있습니다.

print np.dot(X,beta_hat)

결과:

[ -5.97751163,  -5.06465759, -10.16873217,  -4.96959788,  -7.96356915,  -3.06176313,  -6.01818435,  -7.90878145,  -7.86720264]

print np.dot (X, beta_hat) ...와 mod_wls = sm.WLS (y, X, weights = weights) res = mod_wls.fit () predsY = res.predict ()의 차이점이 무엇인지 알고 싶습니다. Y 결과 반환
dd90p

13

사용하십시오 scipy.optimize.curve_fit. 그리고 선형 맞춤뿐만 아니라.

from scipy.optimize import curve_fit
import scipy

def fn(x, a, b, c):
    return a + b*x[0] + c*x[1]

# y(x0,x1) data:
#    x0=0 1 2
# ___________
# x1=0 |0 1 2
# x1=1 |1 2 3
# x1=2 |2 3 4

x = scipy.array([[0,1,2,0,1,2,0,1,2,],[0,0,0,1,1,1,2,2,2]])
y = scipy.array([0,1,2,1,2,3,2,3,4])
popt, pcov = curve_fit(fn, x, y)
print popt

8

데이터를 팬더 데이터 프레임 ( df)으로 변환하면

import statsmodels.formula.api as smf
lm = smf.ols(formula='y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7', data=df).fit()
print(lm.params)

절편 용어는 기본적으로 포함됩니다.

더 많은 예는 이 노트북 을 참조하십시오 .


이 노트는 굉장합니다. 3 줄의 코드로 scikit learn을 사용하여 Y에서 여러 독립 변수 (x1, x2, x3 ...)를 회귀시키는 방법을 보여줍니다.
jxn

노트북 주셔서 감사합니다 @ canary_in_the_data_mine. 여러 피처가있는 선형 회귀를 어떻게 플롯 할 수 있습니까? 노트북에서 찾을 수 없습니다. 모든 조언을 주시면 감사하겠습니다. -감사합니다
Jai Prakash

ols ()에 smf.add_intercept ()를 매개 변수로 전달하여 인터셉트를 추가해야하므로 인터셉트를 추가합니까?
bluedroid

4

이 작업을 완료하는 가장 쉬운 방법이라고 생각합니다.

from random import random
from pandas import DataFrame
from statsmodels.api import OLS
lr = lambda : [random() for i in range(100)]
x = DataFrame({'x1': lr(), 'x2':lr(), 'x3':lr()})
x['b'] = 1
y = x.x1 + x.x2 * 2 + x.x3 * 3 + 4

print x.head()

         x1        x2        x3  b
0  0.433681  0.946723  0.103422  1
1  0.400423  0.527179  0.131674  1
2  0.992441  0.900678  0.360140  1
3  0.413757  0.099319  0.825181  1
4  0.796491  0.862593  0.193554  1

print y.head()

0    6.637392
1    5.849802
2    7.874218
3    7.087938
4    7.102337
dtype: float64

model = OLS(y, x)
result = model.fit()
print result.summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 5.859e+30
Date:                Wed, 09 Dec 2015   Prob (F-statistic):               0.00
Time:                        15:17:32   Log-Likelihood:                 3224.9
No. Observations:                 100   AIC:                            -6442.
Df Residuals:                      96   BIC:                            -6431.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             1.0000   8.98e-16   1.11e+15      0.000         1.000     1.000
x2             2.0000   8.28e-16   2.41e+15      0.000         2.000     2.000
x3             3.0000   8.34e-16    3.6e+15      0.000         3.000     3.000
b              4.0000   8.51e-16    4.7e+15      0.000         4.000     4.000
==============================================================================
Omnibus:                        7.675   Durbin-Watson:                   1.614
Prob(Omnibus):                  0.022   Jarque-Bera (JB):                3.118
Skew:                           0.045   Prob(JB):                        0.210
Kurtosis:                       2.140   Cond. No.                         6.89
==============================================================================

4

위에서 언급 한 sklearn 라이브러리를 사용하여 다중 선형 회귀를 처리 할 수 ​​있습니다. Python 3.6의 Anaconda 설치를 사용하고 있습니다.

다음과 같이 모델을 작성하십시오.

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X, y)

# display coefficients
print(regressor.coef_)

3

numpy.linalg.lstsq 를 사용할 수 있습니다


6
다변량 회귀의 계수를 구하기 위해 이것을 어떻게 사용할 수 있습니까? 난 단지 간단한 회귀 분석을 수행하는 방법을 볼 ... 그리고 있습니다 .. 원을 계수를 얻는 방법을 볼 수 없습니다
자크

1

아래 함수를 사용하여 DataFrame에 전달할 수 있습니다.

def linear(x, y=None, show=True):
    """
    @param x: pd.DataFrame
    @param y: pd.DataFrame or pd.Series or None
              if None, then use last column of x as y
    @param show: if show regression summary
    """
    import statsmodels.api as sm

    xy = sm.add_constant(x if y is None else pd.concat([x, y], axis=1))
    res = sm.OLS(xy.ix[:, -1], xy.ix[:, :-1], missing='drop').fit()

    if show: print res.summary()
    return res

1

Scikit-learn은이 작업을 수행 할 수있는 Python 용 기계 학습 라이브러리입니다. sklearn.linear_model 모듈을 스크립트로 가져 오기만하면됩니다.

파이썬에서 sklearn을 사용하여 다중 선형 회귀에 대한 코드 템플릿을 찾으십시오.

import numpy as np
import matplotlib.pyplot as plt #to plot visualizations
import pandas as pd

# Importing the dataset
df = pd.read_csv(<Your-dataset-path>)
# Assigning feature and target variables
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

# Use label encoders, if you have any categorical variable
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
X['<column-name>'] = labelencoder.fit_transform(X['<column-name>'])

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = ['<index-value>'])
X = onehotencoder.fit_transform(X).toarray()

# Avoiding the dummy variable trap
X = X[:,1:] # Usually done by the algorithm itself

#Spliting the data into test and train set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 0, test_size = 0.2)

# Fitting the model
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# Predicting the test set results
y_pred = regressor.predict(X_test)

그게 다야. 이 코드를 모든 데이터 세트에서 다중 선형 회귀를 구현하기위한 템플릿으로 사용할 수 있습니다. 예제를 더 잘 이해하려면 다음을 방문하십시오. 예제를 사용한 선형 회귀


0

대안적이고 기본적인 방법은 다음과 같습니다.

from patsy import dmatrices
import statsmodels.api as sm

y,x = dmatrices("y_data ~ x_1 + x_2 ", data = my_data)
### y_data is the name of the dependent variable in your data ### 
model_fit = sm.OLS(y,x)
results = model_fit.fit()
print(results.summary())

대신 또는 등을 sm.OLS사용할 수도 있습니다 .sm.Logitsm.Probit

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.