Python'da çoklu doğrusal regresyon


129

Çoklu regresyon yapan herhangi bir python kitaplığı bulamıyorum. Bulduğum tek şey sadece basit gerileme yapıyor. Bağımlı değişkenimi (y) birkaç bağımsız değişkene (x1, x2, x3, vb.) Göre regresyona ihtiyacım var.

Örneğin, bu verilerle:

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)

(yukarıdaki çıktı :)

      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

Doğrusal regresyon formülünü elde etmek için bunları python'da nasıl gerileyebilirim:

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


bir uzman değil, ancak değişkenler bağımsızsa, her birine karşı basit bir regresyon çalıştırıp sonucu toplamaz mısınız?
Hugh Bothwell

8
@HughBothwell Değişkenlerin bağımsız olduğunu varsayamazsınız. Aslında, değişkenlerin bağımsız olduğunu varsayıyorsanız, potansiyel olarak verilerinizi yanlış modelliyor olabilirsiniz. Başka bir deyişle, yanıtlar Ybirbiriyle ilişkilendirilebilir, ancak bağımsızlığın varsayılması, veri setini doğru bir şekilde modellemez.
hlin117

@HughBothwell eğer bu aptal bir soruysa özür dilerim, ancak x_i ham özellik değişkenlerinin bağımsız olup olmaması neden önemli? Bu tahmin ediciyi (= model) nasıl etkiler?
Charlie Parker

Yanıtlar:


100

sklearn.linear_model.LinearRegression yapacağım:

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

Daha sonra clf.coef_regresyon katsayılarına sahip olacak.

sklearn.linear_model ayrıca regresyon üzerinde çeşitli düzenlemeler yapmak için benzer arayüzlere sahiptir.


2
Bu, belirli girdilerde bir hata verir . Mevcut başka çözümler var mı?
Zach,

@Dougal sklearn.linear_model.LinearRegression ağırlıklı çok değişkenli regresyon için de kullanılabilir mi?
user961627

1
Sabit bir terime uymak için: clf = linear_model.LinearRegression (fit_intercept = True)
Imran

2
Takip, sklearn.linear_model.LinearRegression kullanarak güven düzeyini nasıl elde edeceğinizi biliyor musunuz? Teşekkürler.
Huanian Zhang

1
@HuanianZhang güven seviyesiyle ne demek istiyorsun? Belirleme katsayısını istiyorsanız, scoreyöntem bunu yapacaktır; sklearn.metricsbaşka model değerlendirme kriterlerine sahiptir. Akavall'ın cevabındaki gibi şeyleri istiyorsanız, istatistik modellerinde daha fazla R benzeri tanılama bulunur.
Dougal

60

İşte oluşturduğum küçük bir çalışma. R ile kontrol ettim ve doğru çalışıyor.

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

Sonuç:

print reg_m(y, x).summary()

Çıktı:

                            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 bu yanıtta verildiği gibi OLS'yi çalıştırmak için uygun bir yol sağlar:

Pandas Data Frame ile bir OLS regresyonu çalıştırın


18
reg_mFonksiyon gereksiz yere karmaşık. x = np.array(x).T, x = sm.add_constant(x)Ve results = sm.OLS(endog=y, exog=x).fit()yeterlidir.
cd98

1
Bu güzel bir araçtır. Sadece bir soru sorun: bu durumda, t değeri% 95,5 güven aralığının dışında, yani bu uydurmanın hiç doğru olmadığı anlamına gelir veya bunu nasıl açıklarsınız?
Huanian Zhang

2
Orijinal tahmin listenizde x1, x2, x3'ün ters sırada olduğunu fark ettim, yani x = [x3, x2, x1]?
sophiadw

@sophiadw x = x[::-1]doğru sırayı almak için işlev tanımının içine ekleyebilirsiniz
Ashrith

@HuanianZhang "t değeri", katsayının sıfırdan uzak olduğu kaç standart sapmadır,% 95 CI ise yaklaşık olarak coef +- 2 * std err(gerçekte kalıntılardaki serbestlik derecelerine göre parametreleştirilmiş Student-t dağılımı). yani daha büyük mutlak t değerleri, CI'leri sıfırdan daha uzak gösterir, ancak bunlar doğrudan karşılaştırılmamalıdır. açıklama biraz gecikti, ancak birileri için yararlı olacağını umuyorum
Sam Mason

47

Sadece açıklığa kavuşturmak için, verdiğiniz örnek çok değişkenli doğrusal regresyon değil, çoklu doğrusal regresyondur. Fark :

Tek bir skaler yordayıcı değişken x ve tek bir skaler yanıt değişkeni y'nin en basit durumu, basit doğrusal regresyon olarak bilinir. Çoklu ve / veya vektör değerli tahmin değişkenlerinin uzantısı (büyük X ile gösterilir) çoklu doğrusal regresyon olarak bilinir ve aynı zamanda çok değişkenli doğrusal regresyon olarak da bilinir. Neredeyse tüm gerçek dünya regresyon modelleri birden fazla öngörücü içerir ve doğrusal regresyonun temel tanımları genellikle çoklu regresyon modeli olarak ifade edilir. Bununla birlikte, bu durumlarda yanıt değişkeni y'nin hala skaler olduğuna dikkat edin. Diğer bir çok değişkenli doğrusal regresyon terimi, y'nin bir vektör olduğu, yani genel doğrusal regresyon ile aynı olan durumlara atıfta bulunur.

Kısacası:

  • çoklu doğrusal regresyon: Y yanıtı bir skalerdir.
  • çok değişkenli doğrusal regresyon: Y yanıtı bir vektördür.

(Başka bir kaynak .)


5
Bu yararlı bilgi olabilir, ancak soruyu nasıl yanıtladığını anlamıyorum.
Akavall

7
@Akavall doğru terminolojiyi kullanmak bir cevap bulmanın ilk adımıdır.
Franck Dernoncourt

1
@FranckDernoncourt ama OP'nin Y değeri bir vektör mü?
alwaysaskingquestions

@FranckDernoncourt: "Doğru terminolojiyi kullanmak, bir cevap bulmanın ilk adımıdır" . Harika, ikimiz de aynı fikirde olabiliriz: bu kendi başına bir cevap değildir. Kullanıcılar, diğer kaynaklara başvurmak zorunda kalmadan problemlerini doğrudan cevaplardan çözebilmelidir .
Mac

28

Numpy.linalg.lstsq kullanabilirsiniz :

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

Sonuç:

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

Tahmini çıktıyı şununla görebilirsiniz:

print np.dot(X,beta_hat)

Sonuç:

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

print np.dot (X, beta_hat) ... ve mod_wls = sm.WLS (y, X, ağırlıklar = ağırlıklar) res = mod_wls.fit () predsY = res.predict () hepsi arasındaki farkın ne olduğunu öğrenebilir miyim Y sonucunu
döndür

13

Kullanın scipy.optimize.curve_fit. Ve sadece doğrusal uyum için değil.

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

Verilerinizi bir panda veri çerçevesine ( df) dönüştürdüğünüzde,

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

Önleme terimi varsayılan olarak dahil edilmiştir.

Daha fazla örnek için bu not defterine bakın .


Bu defter harika. Sadece 3 satır kod ve scikit öğrenme kullanarak Y üzerinde birden çok bağımsız değişkenin (x1, x2, x3 ...) nasıl regrese edileceğini gösterir.
jxn

@canary_in_the_data_mine defter için teşekkürler. birden çok özelliğe sahip doğrusal regresyonu nasıl çizebilirim? Defterde bulamadım. herhangi bir işaretçi çok takdir edilecektir. - Teşekkürler
Jai Prakash

Smf.add_intercept () parametresini ols () 'a parametre olarak iletmek zorunda olduğumuz için kesişim ekliyor mu?
bluedroid

4

Bence bu işi bitirmenin en kolay yolu bu:

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

Çoklu Doğrusal Regresyon, yukarıda belirtildiği gibi sklearn kitaplığı kullanılarak işlenebilir. Python 3.6'nın Anaconda kurulumunu kullanıyorum.

Modelinizi aşağıdaki gibi oluşturun:

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

# display coefficients
print(regressor.coef_)

3

Numpy.linalg.lstsq kullanabilirsiniz


6
Çok değişkenli bir regresyonun katsayılarını elde etmek için bunu nasıl kullanabilirsiniz? Sadece basit bir regresyonun nasıl yapıldığını görüyorum ... ve katsayıları nasıl elde edeceğimi bilmiyorum ..
Zach,

1

Aşağıdaki işlevi kullanabilir ve ona bir DataFrame iletebilirsiniz:

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, bu işi sizin için yapabilen Python için bir makine öğrenimi kitaplığıdır. Sadece sklearn.linear_model modülünü betiğinize aktarın.

Python'da sklearn kullanarak Çoklu Doğrusal Regresyon için kod şablonunu bulun:

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)

Bu kadar. Bu kodu, herhangi bir veri kümesinde Çoklu Doğrusal Regresyon uygulamak için bir şablon olarak kullanabilirsiniz. Bir örnekle daha iyi anlamak için ziyaret edin: bir örnekle Doğrusal Regresyon


0

İşte alternatif ve temel bir yöntem:

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.OLSSizin yerine sm.Logitveya sm.Probitvb. De kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.