Regresi linier berganda dengan Python

129

Saya tidak bisa menemukan pustaka python yang melakukan regresi berganda. Satu-satunya hal yang saya temukan hanya melakukan regresi sederhana. Saya perlu melakukan regresi terhadap variabel dependen saya (y) terhadap beberapa variabel independen (x1, x2, x3, dll.).

Misalnya, dengan data ini:

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)

(output untuk di atas :)

      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

Bagaimana saya mundur dalam python, untuk mendapatkan rumus regresi linier:

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

Zach
sumber
bukan ahli, tetapi jika variabel independen, tidak bisakah Anda menjalankan regresi sederhana terhadap masing-masing dan menjumlahkan hasilnya?
Hugh Bothwell
8
@HughBothwell Anda tidak dapat mengasumsikan bahwa variabel independen. Bahkan, jika Anda mengasumsikan bahwa variabel independen, Anda mungkin berpotensi memodelkan data Anda secara salah. Dengan kata lain, tanggapan Ymungkin berkorelasi satu sama lain, tetapi dengan asumsi independensi tidak secara akurat memodelkan dataset.
hlin117
@HughBothwell maaf jika ini pertanyaan bodoh, tapi mengapa itu penting jika variabel fitur baku x_i independen atau tidak? Bagaimana hal itu memengaruhi prediktor (= model)?
Charlie Parker

Jawaban:

100

sklearn.linear_model.LinearRegression akan melakukannya:

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

Kemudian clf.coef_akan memiliki koefisien regresi.

sklearn.linear_model juga memiliki antarmuka yang sama untuk melakukan berbagai macam regularisasi pada regresi.

Dougal
sumber
2
Ini mengembalikan kesalahan dengan input tertentu . Ada solusi lain yang tersedia?
Zach
@Dougal dapat sklearn.linear_model.LinearRegression digunakan untuk regresi multivarian tertimbang juga?
user961627
1
Agar sesuai dengan frasa konstan: clf = linear_model.LinearRegression (fit_intercept = True)
Imran
2
Tindak lanjut, Anda tahu cara mendapatkan tingkat kepercayaan menggunakan sklearn.linear_model.LinearRegression? Terima kasih.
Huanian Zhang
1
@HuanianZhang apa yang Anda maksud dengan tingkat kepercayaan? Jika Anda menginginkan koefisien determinasi, scoremetode akan melakukannya; sklearn.metricsmemiliki beberapa kriteria evaluasi model lainnya. Jika Anda menginginkan hal-hal seperti dalam jawaban Akavall, statsmodels memiliki beberapa diagnostik mirip-R.
Dougal
60

Ini adalah sedikit pekerjaan yang saya buat. Saya memeriksanya dengan R dan berfungsi dengan benar.

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

Hasil:

print reg_m(y, x).summary()

Keluaran:

                            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 menyediakan cara mudah untuk menjalankan OLS seperti yang diberikan dalam jawaban ini:

Jalankan regresi OLS dengan Bingkai Data Pandas

Akavall
sumber
18
The reg_mfungsi tidak perlu rumit. x = np.array(x).T, x = sm.add_constant(x)dan results = sm.OLS(endog=y, exog=x).fit()sudah cukup.
cd98
1
Ini alat yang bagus. Ajukan saja satu pertanyaan: dalam hal ini, nilai t berada di luar interval kepercayaan 95,5%, jadi itu berarti pemasangan ini tidak akurat sama sekali, atau bagaimana Anda menjelaskan ini?
Huanian Zhang
2
Hanya perhatikan bahwa x1, x2, x3 Anda berada dalam urutan terbalik dalam daftar prediktor asli Anda, yaitu, x = [x3, x2, x1]?
sophiadw
@sophiadw Anda bisa menambahkan x = x[::-1]dalam definisi fungsi untuk mendapatkan dalam urutan yang benar
Ashrith
@HuanianZhang "nilai t" hanyalah berapa banyak standar deviasi yang koefisiennya jauh dari nol, sedangkan 95% CI kira-kira coef +- 2 * std err(sebenarnya distribusi Student-t yang diparameterisasi oleh derajat kebebasan dalam residu). yaitu nilai t absolut yang lebih besar menyiratkan CI lebih jauh dari nol, tetapi tidak boleh dibandingkan secara langsung. klarifikasi agak terlambat, tetapi harap ini berguna bagi seseorang
Sam Mason
47

Hanya untuk memperjelas, contoh yang Anda berikan adalah beberapa regresi linier, tidak multivariat regresi linear merujuk. Perbedaan :

Kasus yang paling sederhana dari variabel prediktor skalar tunggal x dan variabel respons skalar tunggal y dikenal sebagai regresi linier sederhana. Perpanjangan ke variabel prediktor berganda dan / atau bernilai vektor (dilambangkan dengan huruf kapital X) dikenal sebagai regresi linier berganda, juga dikenal sebagai regresi linier multivariabel. Hampir semua model regresi dunia nyata melibatkan banyak prediktor, dan deskripsi dasar regresi linier sering diungkapkan dalam istilah model regresi berganda. Namun, perhatikan bahwa dalam kasus-kasus ini variabel respons y masih berupa skalar. Istilah lain regresi linier multivariat mengacu pada kasus di mana y adalah vektor, yaitu, sama dengan regresi linier umum.

Pendeknya:

  • beberapa regresi linier: respon y adalah skalar.
  • regresi linier multivariat : respons y adalah vektor.

( Sumber lain .)

Franck Dernoncourt
sumber
5
Ini mungkin informasi yang berguna, tetapi saya tidak melihat bagaimana itu menjawab pertanyaan.
Akavall
7
@Akavall menggunakan terminologi yang benar adalah langkah pertama untuk menemukan jawaban.
Franck Dernoncourt
1
@ FranckDernoncourt tetapi nilai Y OP adalah vektor?
mengajukan pertanyaan
@ FranckDernoncourt: "menggunakan terminologi yang benar adalah langkah pertama untuk menemukan jawaban" . Hebat, jadi kita berdua bisa sepakat: ini, dalam dan dari dirinya sendiri, sebenarnya bukan jawaban. Pengguna harus dapat menyelesaikan masalah mereka langsung dari jawaban tanpa harus menggunakan sumber daya lain .
Mac
28

Anda dapat menggunakan 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

Hasil:

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

Anda dapat melihat estimasi hasil dengan:

print np.dot(X,beta_hat)

Hasil:

[ -5.97751163,  -5.06465759, -10.16873217,  -4.96959788,  -7.96356915,  -3.06176313,  -6.01818435,  -7.90878145,  -7.86720264]
Imran
sumber
bolehkah saya tahu apa perbedaan antara print np.dot (X, beta_hat) ... dan mod_wls = sm.WLS (y, X, weights = weights) res = mod_wls.fit () predsY = res.predict () semuanya kembalikan hasil Y
dd90p
13

Gunakan scipy.optimize.curve_fit. Dan tidak hanya untuk fit linear.

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
Volodimir Kopey
sumber
8

Setelah Anda mengonversi data Anda menjadi bingkai data panda ( 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)

Istilah intersepsi disertakan secara default.

Lihat buku catatan ini untuk lebih banyak contoh.

canary_in_the_data_mine
sumber
Notebook ini luar biasa. ini menunjukkan bagaimana mengembalikan beberapa variabel independen (x1, x2, x3 ...) pada Y hanya dengan 3 baris kode dan menggunakan scikit belajar.
jxn
@canary_in_the_data_mine terima kasih untuk notebooknya. bagaimana saya bisa merencanakan regresi linier yang memiliki banyak fitur? Saya tidak dapat menemukan di buku catatan. petunjuk apa pun akan sangat dihargai. - Terima kasih
Jai Prakash
Apakah ini menambah intersep karena kita harus menambahkan intersep dengan meneruskan smf.add_intercept () sebagai parameter ke ols ()
bluedroid
4

Saya pikir ini mungkin cara paling mudah untuk menyelesaikan pekerjaan ini:

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
==============================================================================
xmduhan
sumber
4

Regresi Linier Berganda dapat ditangani menggunakan pustaka sklearn seperti yang dirujuk di atas. Saya menggunakan instal Anaconda dari Python 3.6.

Buat model Anda sebagai berikut:

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

# display coefficients
print(regressor.coef_)
Eric C. Bohn
sumber
3

Anda dapat menggunakan numpy.linalg.lstsq

Moukden
sumber
6
Bagaimana Anda bisa menggunakan ini untuk mendapatkan koefisien regresi multivariat? Saya hanya melihat bagaimana melakukan regresi sederhana ... dan tidak melihat bagaimana mendapatkan koefisien ..
Zach
1

Anda dapat menggunakan fungsi di bawah ini dan memberikannya 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
Alfa
sumber
1

Scikit-learn adalah perpustakaan pembelajaran mesin untuk Python yang dapat melakukan pekerjaan ini untuk Anda. Cukup impor modul sklearn.linear_model ke skrip Anda.

Temukan templat kode untuk Regresi Linier Berganda menggunakan sklearn dengan 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)

Itu dia. Anda dapat menggunakan kode ini sebagai templat untuk menerapkan Regresi Linier Berganda dalam dataset apa pun. Untuk pemahaman yang lebih baik dengan contoh, Kunjungi: Regresi Linier dengan contoh

kowsalya_ckar
sumber
0

Berikut ini adalah metode alternatif dan dasar:

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

Alih-alih sm.OLSAnda juga dapat menggunakan sm.Logitatau sm.Probitdan sebagainya.

pemula
sumber