Algoritmi di regressione - Regressione lineare

Introduzione alla regressione lineare

La regressione lineare può essere definita come il modello statistico che analizza la relazione lineare tra una variabile dipendente con un dato insieme di variabili indipendenti. Relazione lineare tra variabili significa che quando il valore di una o più variabili indipendenti cambierà (aumento o diminuzione), anche il valore della variabile dipendente cambierà di conseguenza (aumento o diminuzione).

Matematicamente la relazione può essere rappresentata con l'aiuto della seguente equazione:

Y = mX + b

Qui, Y è la variabile dipendente che stiamo cercando di prevedere

X è la variabile dipendente che stiamo usando per fare previsioni.

m è la pendenza della retta di regressione che rappresenta l'effetto che X ha su Y

b è una costante, nota come intercetta Y. Se X = 0, Y sarebbe uguale a b.

Inoltre, la relazione lineare può essere di natura positiva o negativa come spiegato di seguito -

Relazione lineare positiva

Una relazione lineare sarà chiamata positiva se aumentano sia la variabile indipendente che quella dipendente. Può essere compreso con l'aiuto del seguente grafico:

Relazione lineare negativa

Una relazione lineare sarà chiamata positiva se aumenti indipendenti e diminuzioni di variabili dipendenti. Può essere compreso con l'aiuto del seguente grafico:

Tipi di regressione lineare

La regressione lineare è dei seguenti due tipi:

  • Regressione lineare semplice
  • Regressione lineare multipla

Regressione lineare semplice (SLR)

È la versione più elementare della regressione lineare che prevede una risposta utilizzando una singola caratteristica. Il presupposto in SLR è che le due variabili siano correlate linearmente.

Implementazione di Python

Possiamo implementare SLR in Python in due modi, uno è fornire il proprio set di dati e l'altro è usare il set di dati dalla libreria python scikit-learn.

Example 1 - Nel seguente esempio di implementazione di Python, stiamo usando il nostro set di dati.

Innanzitutto, inizieremo importando i pacchetti necessari come segue:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

Quindi, definire una funzione che calcolerà i valori importanti per SLR -

def coef_estimation(x, y):

La seguente riga di script fornirà il numero di osservazioni n -

n = np.size(x)

La media dei vettori xey può essere calcolata come segue:

m_x, m_y = np.mean(x), np.mean(y)

Possiamo trovare la deviazione incrociata e la deviazione su x come segue:

SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x

Successivamente, i coefficienti di regressione cioè b possono essere calcolati come segue:

b_1 = SS_xy / SS_xx
b_0 = m_y - b_1*m_x
return(b_0, b_1)

Successivamente, dobbiamo definire una funzione che traccerà la linea di regressione e predirà il vettore di risposta -

def plot_regression_line(x, y, b):

La seguente riga di script traccerà i punti effettivi come grafico a dispersione:

plt.scatter(x, y, color = "m", marker = "o", s = 30)

La seguente riga di script prevede il vettore di risposta:

y_pred = b[0] + b[1]*x

Le seguenti righe di script tracceranno la linea di regressione e vi metteranno le etichette:

plt.plot(x, y_pred, color = "g")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

Alla fine, dobbiamo definire la funzione main () per fornire il set di dati e chiamare la funzione che abbiamo definito sopra -

def main():
   x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
   y = np.array([100, 300, 350, 500, 750, 800, 850, 900, 1050, 1250])
   b = coef_estimation(x, y)
   print("Estimated coefficients:\nb_0 = {} \nb_1 = {}".format(b[0], b[1]))
   plot_regression_line(x, y, b)
   
if __name__ == "__main__":
main()

Produzione

Estimated coefficients:
b_0 = 154.5454545454545
b_1 = 117.87878787878788

Example 2 - Nel seguente esempio di implementazione di Python, stiamo usando il set di dati sul diabete da scikit-learn.

Innanzitutto, inizieremo importando i pacchetti necessari come segue:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

Successivamente, caricheremo il set di dati sul diabete e creeremo il suo oggetto -

diabetes = datasets.load_diabetes()

Poiché stiamo implementando SLR, utilizzeremo solo una funzione come segue:

X = diabetes.data[:, np.newaxis, 2]

Successivamente, dobbiamo suddividere i dati in set di addestramento e test come segue:

X_train = X[:-30]
X_test = X[-30:]

Successivamente, dobbiamo suddividere l'obiettivo in set di addestramento e test come segue:

y_train = diabetes.target[:-30]
y_test = diabetes.target[-30:]

Ora, per addestrare il modello dobbiamo creare un oggetto di regressione lineare come segue:

regr = linear_model.LinearRegression()

Quindi, addestrare il modello utilizzando i set di addestramento come segue:

regr.fit(X_train, y_train)

Quindi, fare previsioni utilizzando il set di test come segue:

y_pred = regr.predict(X_test)

Successivamente, stamperemo alcuni coefficienti come MSE, punteggio di varianza ecc. Come segue:

print('Coefficients: \n', regr.coef_)
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
print('Variance score: %.2f' % r2_score(y_test, y_pred))

Ora traccia gli output come segue:

plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

Produzione

Coefficients:
   [941.43097333]
Mean squared error: 3035.06
Variance score: 0.41

Regressione lineare multipla (MLR)

È l'estensione della regressione lineare semplice che prevede una risposta utilizzando due o più caratteristiche. Matematicamente possiamo spiegarlo come segue:

Considera un insieme di dati che ha n osservazioni, caratteristiche p cioè variabili indipendenti ey come una risposta cioè variabile dipendente la retta di regressione per caratteristiche p può essere calcolata come segue:

$$ h (x_ {i}) = b_ {0} + b_ {1} x_ {i1} + b_ {2} x_ {i2} + ... + b_ {p} x_ {ip} $$

Qui, h (x i ) è il valore di risposta previsto e b 0 , b 1 , b 2 …, b p sono i coefficienti di regressione.

I modelli di regressione lineare multipla includono sempre gli errori nei dati noti come errore residuo che modifica il calcolo come segue:

$$ h (x_ {i}) = b_ {0} + b_ {1} x_ {i1} + b_ {2} x_ {i2} + ... + b_ {p} x_ {ip} + e_ {i} $$

Possiamo anche scrivere l'equazione di cui sopra come segue:

$$ y_ {i} = h (x_ {i}) + e_ {i} \: o \: e_ {i} = y_ {i} - h (x_ {i}) $$

Implementazione di Python

in questo esempio, utilizzeremo il set di dati sull'alloggiamento di Boston da scikit learn -

Innanzitutto, inizieremo importando i pacchetti necessari come segue:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, metrics

Quindi, carica il set di dati come segue:

boston = datasets.load_boston(return_X_y=False)

Le seguenti righe di script definiranno la matrice delle caratteristiche, X e il vettore di risposta, Y -

X = boston.data
y = boston.target

Successivamente, dividi il set di dati in set di addestramento e test come segue:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.7, random_state=1)

Esempio

Ora, crea un oggetto di regressione lineare e addestra il modello come segue:

reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)
print('Coefficients: \n', reg.coef_)
print('Variance score: {}'.format(reg.score(X_test, y_test)))
plt.style.use('fivethirtyeight')
plt.scatter(reg.predict(X_train), reg.predict(X_train) - y_train,
   color = "green", s = 10, label = 'Train data')
plt.scatter(reg.predict(X_test), reg.predict(X_test) - y_test,
   color = "blue", s = 10, label = 'Test data')
plt.hlines(y = 0, xmin = 0, xmax = 50, linewidth = 2)
plt.legend(loc = 'upper right')
plt.title("Residual errors")
plt.show()

Produzione

Coefficients:
[
   -1.16358797e-01  6.44549228e-02  1.65416147e-01  1.45101654e+00
   -1.77862563e+01  2.80392779e+00  4.61905315e-02 -1.13518865e+00
    3.31725870e-01 -1.01196059e-02 -9.94812678e-01  9.18522056e-03
   -7.92395217e-01
]
Variance score: 0.709454060230326

Presupposti

Di seguito sono riportate alcune ipotesi sul set di dati fatto dal modello di regressione lineare:

Multi-collinearity- Il modello di regressione lineare presuppone che nei dati vi sia una collinearità minima o nulla. Fondamentalmente, la multi-collinearità si verifica quando le variabili o le caratteristiche indipendenti hanno dipendenza da esse.

Auto-correlation- Un altro presupposto che il modello di regressione lineare assume è che nei dati vi sia pochissima o nessuna autocorrelazione. Fondamentalmente, l'auto-correlazione si verifica quando c'è dipendenza tra errori residui.

Relationship between variables - Il modello di regressione lineare presuppone che la relazione tra la risposta e le variabili delle caratteristiche debba essere lineare.