Multiple lineare Regression in Python

129

Ich kann anscheinend keine Python-Bibliotheken finden, die eine multiple Regression durchführen. Die einzigen Dinge, die ich finde, sind nur einfache Regressionen. Ich muss meine abhängige Variable (y) gegen mehrere unabhängige Variablen (x1, x2, x3 usw.) zurückführen.

Zum Beispiel mit diesen Daten:

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)

(Ausgabe für oben :)

      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

Wie würde ich diese in Python zurückführen, um die lineare Regressionsformel zu erhalten:

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

Zach
quelle
Sie sind kein Experte, aber wenn die Variablen unabhängig sind, können Sie dann nicht einfach eine einfache Regression für jede Variable durchführen und das Ergebnis summieren?
Hugh Bothwell
8
@ HughBothwell Sie können jedoch nicht davon ausgehen, dass die Variablen unabhängig sind. Wenn Sie davon ausgehen, dass die Variablen unabhängig sind, modellieren Sie Ihre Daten möglicherweise falsch. Mit anderen Worten, die Antworten Ykönnen miteinander korreliert sein, aber unter der Annahme, dass die Unabhängigkeit den Datensatz nicht genau modelliert.
hlin117
@ HughBothwell Entschuldigung, wenn dies eine dumme Frage ist, aber warum ist es wichtig, ob die Roh-Feature-Variablen x_i unabhängig sind oder nicht? Wie wirkt sich das auf den Prädiktor (= Modell) aus?
Charlie Parker

Antworten:

100

sklearn.linear_model.LinearRegression werde es tun:

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

Dann clf.coef_haben die Regressionskoeffizienten.

sklearn.linear_model hat auch ähnliche Schnittstellen, um verschiedene Arten von Regularisierungen für die Regression durchzuführen.

Dougal
quelle
2
Dies gibt bei bestimmten Eingaben einen Fehler zurück . Gibt es noch andere Lösungen?
Zach
@Dougal kann sklearn.linear_model.LinearRegression auch für die gewichtete multivariate Regression verwendet werden?
user961627
1
Um einen konstanten Term anzupassen: clf = linear_model.LinearRegression (fit_intercept = True)
Imran
2
Wissen Sie, wie Sie mit sklearn.linear_model.LinearRegression das Konfidenzniveau ermitteln können? Vielen Dank.
Huanian Zhang
1
@HuanianZhang was meinst du mit Konfidenzniveau? Wenn Sie den Bestimmungskoeffizienten wünschen, wird die scoreMethode dies tun; sklearn.metricshat einige andere Modellbewertungskriterien. Wenn Sie das Zeug wie in Akavalls Antwort wollen, hat statsmodels etwas mehr R-ähnliche Diagnose.
Dougal
60

Hier ist eine kleine Arbeit, die ich erstellt habe. Ich habe es mit R überprüft und es funktioniert korrekt.

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

Ergebnis:

print reg_m(y, x).summary()

Ausgabe:

                            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 bietet eine bequeme Möglichkeit, OLS wie in dieser Antwort angegeben auszuführen:

Führen Sie eine OLS-Regression mit Pandas Data Frame aus

Akavall
quelle
18
Die reg_mFunktion ist unnötig kompliziert. x = np.array(x).T, x = sm.add_constant(x)Und results = sm.OLS(endog=y, exog=x).fit()ist genug.
CD98
1
Das ist ein schönes Werkzeug. Stellen Sie einfach eine Frage: In diesem Fall liegt der t-Wert außerhalb des 95,5% -Konfidenzintervalls. Dies bedeutet, dass diese Anpassung überhaupt nicht genau ist, oder wie erklären Sie dies?
Huanian Zhang
2
Sie haben gerade bemerkt, dass Ihre x1, x2, x3 in Ihrer ursprünglichen Prädiktorliste in umgekehrter Reihenfolge sind, dh x = [x3, x2, x1]?
Sophiadw
@sophiadw können Sie einfach x = x[::-1]innerhalb der Funktionsdefinition hinzufügen , um in die richtige Reihenfolge zu gelangen
Ashrith
@HuanianZhang "t-Wert" gibt an, wie viele Standardabweichungen der Koeffizient von Null entfernt ist, während 95% CI ungefähr sind coef +- 2 * std err(tatsächlich die Student-t-Verteilung, die durch Freiheitsgrade in den Residuen parametrisiert wird). dh größere absolute t-Werte implizieren CIs, die weiter von Null entfernt sind, aber nicht direkt verglichen werden sollten. Die Klärung ist etwas spät, aber ich hoffe, es ist für jemanden nützlich
Sam Mason
47

Zur Verdeutlichung haben Sie als Beispiel eine multiple lineare Regression angegeben, nicht eine multivariate lineare Regression. Unterschied :

Der einfachste Fall einer einzelnen skalaren Prädiktorvariablen x und einer einzelnen skalaren Antwortvariablen y ist als einfache lineare Regression bekannt. Die Erweiterung auf mehrere und / oder vektorwertige Prädiktorvariablen (mit einem Großbuchstaben X bezeichnet) wird als multiple lineare Regression bezeichnet, die auch als multivariable lineare Regression bezeichnet wird. Nahezu alle realen Regressionsmodelle umfassen mehrere Prädiktoren, und grundlegende Beschreibungen der linearen Regression werden häufig in Form des multiplen Regressionsmodells formuliert. Beachten Sie jedoch, dass in diesen Fällen die Antwortvariable y immer noch ein Skalar ist. Ein anderer Begriff multivariate lineare Regression bezieht sich auf Fälle, in denen y ein Vektor ist, dh dasselbe wie die allgemeine lineare Regression.

Zusamenfassend:

  • mehrere lineare Regression: Die Antwort y ist ein Skalar.
  • multivariate lineare Regression: Die Antwort y ist ein Vektor.

(Eine andere Quelle .)

Franck Dernoncourt
quelle
5
Dies mag eine nützliche Information sein, aber ich sehe nicht, wie sie die Frage beantwortet.
Akavall
7
@Akavall mit der richtigen Terminologie ist der erste Schritt, um eine Antwort zu finden.
Franck Dernoncourt
1
@FranckDernoncourt, aber der Y-Wert von OP ist ein Vektor?
alwaysaskingquestions
@FranckDernoncourt: "Die Verwendung der richtigen Terminologie ist der erste Schritt, um eine Antwort zu finden" . Großartig, also können wir uns beide einig sein: Dies ist an und für sich keine Antwort. Benutzer sollten in der Lage sein, ihr Problem direkt anhand von Antworten zu lösen, ohne nach anderen Ressourcen suchen zu müssen .
Mac
28

Sie können numpy.linalg.lstsq verwenden :

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

Ergebnis:

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

Sie können die geschätzte Ausgabe sehen mit:

print np.dot(X,beta_hat)

Ergebnis:

[ -5.97751163,  -5.06465759, -10.16873217,  -4.96959788,  -7.96356915,  -3.06176313,  -6.01818435,  -7.90878145,  -7.86720264]
Imran
quelle
Darf ich wissen, was der Unterschied zwischen print np.dot (X, beta_hat) ... und mod_wls = sm.WLS (y, X, Gewichte = Gewichte) ist? res = mod_wls.fit () predsY = res.predict () sie alle
Geben Sie
13

Verwenden Sie scipy.optimize.curve_fit. Und das nicht nur für die lineare Passform.

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
quelle
8

Sobald Sie Ihre Daten in einen Pandas-Datenrahmen ( df) konvertiert haben ,

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

Der Intercept-Term ist standardmäßig enthalten.

Weitere Beispiele finden Sie in diesem Notizbuch .

canary_in_the_data_mine
quelle
Dieses Notizbuch ist fantastisch. Es zeigt, wie Sie mehrere unabhängige Variablen (x1, x2, x3 ...) auf Y mit nur 3 Codezeilen und mithilfe von Scikit Learn zurückführen können.
jxn
@canary_in_the_data_mine danke für das Notizbuch. Wie kann ich eine lineare Regression mit mehreren Merkmalen darstellen? Ich konnte nicht im Notizbuch finden. Hinweise werden sehr geschätzt. - Danke
Jai Prakash
Fügt es den Intercept hinzu, weil wir den Intercept hinzufügen müssen, indem wir smf.add_intercept () als Parameter an ols () übergeben
bluedroid
4

Ich denke, dies ist der einfachste Weg, um diese Arbeit zu beenden:

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
quelle
4

Die mehrfache lineare Regression kann mithilfe der oben genannten sklearn-Bibliothek behandelt werden. Ich verwende die Anaconda-Installation von Python 3.6.

Erstellen Sie Ihr Modell wie folgt:

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

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

Sie können numpy.linalg.lstsq verwenden

Moukden
quelle
6
Wie können Sie damit die Koeffizienten einer multivariaten Regression ermitteln? Ich sehe nur, wie man eine einfache Regression macht ... und nicht, wie man die Koeffizienten erhält ...
Zach
1

Sie können die folgende Funktion verwenden und einen DataFrame übergeben:

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
Alpha
quelle
1

Scikit-learn ist eine maschinelle Lernbibliothek für Python, die diese Aufgabe für Sie erledigen kann. Importieren Sie einfach das Modul sklearn.linear_model in Ihr Skript.

Suchen Sie die Codevorlage für die multiple lineare Regression mit sklearn in 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)

Das ist es. Sie können diesen Code als Vorlage für die Implementierung der multiplen linearen Regression in einem beliebigen Dataset verwenden. Zum besseren Verständnis mit einem Beispiel besuchen Sie: Lineare Regression mit einem Beispiel

kowsalya_ckar
quelle
0

Hier ist eine alternative und grundlegende Methode:

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

Anstelle von sm.OLSdir kannst du auch sm.Logitoder sm.Probitund etc. verwenden.

Neuling
quelle