Hồi quy tuyến tính đa trong Python


129

Tôi dường như không thể tìm thấy bất kỳ thư viện python nào thực hiện nhiều hồi quy. Những điều duy nhất tôi tìm thấy chỉ làm hồi quy đơn giản. Tôi cần hồi quy biến phụ thuộc (y) của mình với một số biến độc lập (x1, x2, x3, v.v.).

Ví dụ: với dữ liệu nà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)

(đầu ra cho ở trên :)

      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

Làm thế nào tôi có thể hồi quy những thứ này trong python, để có được công thức hồi quy tuyến tính:

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


không phải là một chuyên gia, nhưng nếu các biến là độc lập, bạn có thể chạy hồi quy đơn giản với từng biến và tổng hợp kết quả không?
Hugh Bothwell

8
@HughBothwell Bạn không thể cho rằng các biến là độc lập. Thực tế, nếu bạn cho rằng các biến là độc lập, có khả năng bạn đang mô hình hóa dữ liệu của mình không chính xác. Nói cách khác, các phản hồi Ycó thể tương quan với nhau, nhưng giả sử tính độc lập không mô hình chính xác bộ dữ liệu.
hlin117

@HughBothwell xin lỗi nếu đây là một câu hỏi dum, nhưng tại sao nó lại quan trọng nếu các biến tính năng thô x_i độc lập hay không? Điều đó ảnh hưởng đến yếu tố dự đoán (= model) như thế nào?
Charlie Parker

Câu trả lời:


100

sklearn.linear_model.LinearRegression sẽ làm điều đó:

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])

Sau đó clf.coef_sẽ có hệ số hồi quy.

sklearn.linear_model cũng có các giao diện tương tự để thực hiện các loại chính quy khác nhau trên hồi quy.


2
Điều này trả về một lỗi với đầu vào nhất định . Bất kỳ giải pháp khác có sẵn?
Zach

@Dougal có thể sklearn.linear_model.LinearRegression được sử dụng cho hồi quy đa biến có trọng số không?
dùng961627

1
Để phù hợp với một thuật ngữ không đổi: clf = linear_model.LinearRegression (fit_intercept = True)
Imran

2
Theo dõi, bạn có biết làm thế nào để có được mức độ tự tin bằng cách sử dụng sklearn.linear_model.LinearRegression? Cảm ơn.
Huanian Zhang

1
@H xôZhang bạn có ý nghĩa gì bởi mức độ tự tin? Nếu bạn muốn hệ số xác định, scorephương pháp sẽ làm điều đó; sklearn.metricscó một số tiêu chí đánh giá mô hình khác. Nếu bạn muốn những thứ như trong câu trả lời của Akavall, statsmodels có một số chẩn đoán giống R hơn.
Dougal

60

Đây là một công việc nhỏ xung quanh mà tôi tạo ra. Tôi đã kiểm tra nó với R và nó hoạt động chính xác.

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

Kết quả:

print reg_m(y, x).summary()

Đầu ra:

                            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 cung cấp một cách thuận tiện để chạy OLS như được đưa ra trong câu trả lời này:

Chạy hồi quy OLS với Khung dữ liệu Pandas


18
Các reg_mchức năng là phức tạp không cần thiết. x = np.array(x).T, x = sm.add_constant(x)results = sm.OLS(endog=y, exog=x).fit()là đủ.
cd98

1
Đây là một công cụ tốt đẹp. Chỉ cần hỏi một câu hỏi: trong trường hợp này, giá trị t nằm ngoài khoảng tin cậy 95,5%, vì vậy điều đó có nghĩa là sự phù hợp này không chính xác chút nào, hoặc bạn giải thích điều này như thế nào?
Huanian Zhang

2
Chỉ cần lưu ý rằng x1, x2, x3 của bạn theo thứ tự ngược lại trong danh sách dự đoán ban đầu của bạn, tức là x = [x3, x2, x1]?
sophiadw

@sophiadw bạn chỉ có thể thêm vào x = x[::-1]trong định nghĩa hàm để có thứ tự đúng
Ashrith

@H coiZhang "giá trị t" chỉ là có bao nhiêu độ lệch chuẩn mà hệ số này bằng 0, trong khi CI 95% xấp xỉ coef +- 2 * std err(thực tế là phân phối Student-t được tham số hóa theo mức độ tự do trong phần dư). tức là các giá trị t tuyệt đối lớn hơn bao hàm các TCTD khác từ 0, nhưng chúng không nên được so sánh trực tiếp. làm rõ là hơi muộn, nhưng hy vọng nó hữu ích với ai đó
Sam Mason

47

Chỉ cần làm rõ, ví dụ bạn đưa ra là nhiều hồi quy tuyến tính, không đa biến hồi quy tuyến tính tham khảo. Sự khác biệt :

Trường hợp rất đơn giản của một biến dự báo vô hướng đơn x và biến phản ứng vô hướng đơn y được gọi là hồi quy tuyến tính đơn giản. Phần mở rộng cho các biến dự báo nhiều giá trị và / hoặc vectơ (được biểu thị bằng chữ X viết hoa) được gọi là hồi quy tuyến tính đa biến, còn được gọi là hồi quy tuyến tính đa biến. Gần như tất cả các mô hình hồi quy trong thế giới thực liên quan đến nhiều yếu tố dự đoán và các mô tả cơ bản về hồi quy tuyến tính thường được đặt theo cụm từ mô hình hồi quy bội. Tuy nhiên, lưu ý rằng trong những trường hợp này, biến trả lời y vẫn là vô hướng. Một thuật ngữ hồi quy tuyến tính đa biến khác đề cập đến các trường hợp trong đó y là một vectơ, nghĩa là giống như hồi quy tuyến tính tổng quát.

Nói ngắn gọn:

  • hồi quy tuyến tính bội : đáp ứng y là vô hướng.
  • hồi quy tuyến tính đa biến : đáp ứng y là một vectơ.

(Một nguồn khác .)


5
Đây có thể là thông tin hữu ích, nhưng tôi không thấy nó trả lời câu hỏi như thế nào.
Akavall

7
@Akavall sử dụng thuật ngữ chính xác là bước đầu tiên để tìm câu trả lời.
Franck Dernoncourt

1
@FranckDernoncourt nhưng giá trị Y của OP là một vectơ?
alwaysaskingquestions

@FranckDernoncourt: "sử dụng thuật ngữ chính xác là bước đầu tiên để tìm câu trả lời" . Tuyệt vời, vì vậy cả hai chúng ta đều có thể đồng ý: điều này, về bản thân nó, không thực sự là một câu trả lời. Người dùng có thể giải quyết vấn đề của họ trực tiếp từ câu trả lời mà không cần phải tìm đến các tài nguyên khác .
Mac

28

Bạn có thể sử dụng 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

Kết quả:

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

Bạn có thể thấy sản lượng ước tính với:

print np.dot(X,beta_hat)

Kết quả:

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

tôi có thể biết sự khác biệt giữa print np.dot (X, beta_hat) ... và mod_wls = sm.WLS (y, X, weights = weights) res = mod_wls.fit () presY = res.predict () tất cả chúng trả về kết quả Y
dd90p

13

Sử dụng scipy.optimize.curve_fit. Và không chỉ cho phù hợp tuyến tính.

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

Khi bạn chuyển đổi dữ liệu của mình sang dataframe ( 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)

Thuật ngữ chặn được bao gồm theo mặc định.

Xem sổ tay này để biết thêm ví dụ.


Cuốn sổ này thật tuyệt nó chỉ ra cách hồi quy nhiều biến độc lập (x1, x2, x3 ...) trên Y chỉ với 3 dòng mã và sử dụng scikit learn.
jxn

@canary_in_the_data_mine cảm ơn vì máy tính xách tay. Làm thế nào tôi có thể vẽ hồi quy tuyến tính có nhiều tính năng? Tôi không thể tìm thấy trong sổ ghi chép. bất kỳ con trỏ sẽ được đánh giá rất cao. - Cảm ơn
Jai Prakash

Có phải nó thêm phần chặn bởi vì chúng ta phải thêm phần chặn bằng cách chuyển smf.add_intercept () làm tham số cho ols ()
bluedroid

4

Tôi nghĩ rằng đây có thể là cách dễ dàng nhất để hoàn thành công việc này:

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

Nhiều hồi quy tuyến tính có thể được xử lý bằng thư viện sklearn như được tham chiếu ở trên. Tôi đang sử dụng bản cài đặt Anaconda của Python 3.6.

Tạo mô hình của bạn như sau:

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

# display coefficients
print(regressor.coef_)

3

Bạn có thể sử dụng numpy.linalg.lstsq


6
Làm thế nào bạn có thể sử dụng điều này để có được các hệ số của hồi quy đa biến? Tôi chỉ thấy cách thực hiện hồi quy đơn giản ... và không thấy cách lấy hệ số ..
Zach

1

Bạn có thể sử dụng hàm bên dưới và truyền cho nó một 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 là một thư viện máy học cho Python có thể thực hiện công việc này cho bạn. Chỉ cần nhập mô-đun sklearn.linear_model vào tập lệnh của bạn.

Tìm mẫu mã cho Hồi quy tuyến tính đa bằng cách sử dụng sklearn trong Python:

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)

Đó là nó. Bạn có thể sử dụng mã này làm mẫu để thực hiện Nhiều hồi quy tuyến tính trong bất kỳ tập dữ liệu nào. Để hiểu rõ hơn với một ví dụ, Truy cập: Hồi quy tuyến tính với một ví dụ


0

Đây là một phương pháp thay thế và cơ bản:

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())

Thay vì sm.OLSbạn cũng có thể sử dụng sm.Logithoặc sm.Probitvv

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.