English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Studio dell'algoritmo di regressione lineare generale e dell'adattamento dei dati in Python

I problemi di previsione nel machine learning sono generalmente divisi in due categorie: regressione e classificazione.

In altre parole, la regressione è la previsione di numeri, mentre la classificazione è l'attribuzione di etichette e la classificazione dei dati.

Questo articolo spiega come eseguire la fitting dei dati di base in Python e come analizzare gli errori dei risultati della fitting.

In questo esempio, viene utilizzata una funzione quadratica più un disturbo casuale per generare 500 punti, poi si tenta di adattare i dati utilizzando polinomi di 1, 2 e 100 potenze.

L'obiettivo della fitting è di adattare una funzione polinomiale in base ai dati di addestramento, in modo che questa funzione possa adattarsi bene ai dati esistenti e possa prevedere dati sconosciuti.

Il codice è il seguente:

import matplotlib.pyplot as plt 
import numpy as np 
import scipy as sp 
from scipy.stats import norm 
from sklearn.pipeline import Pipeline 
from sklearn.linear_model import LinearRegression 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn import linear_model 
''''' Generazione dei dati ''' 
x = np.arange(0, 1, 0.002) 
y = norm.rvs(0, size=500, scale=0.1) 
y = y + x**2 
''''' 均方误差根 ''' 
def rmse(y_test, y): 
 return sp.sqrt(sp.mean((y_test - y) ** 2)) 
''''' 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档 ''' 
def R2(y_test, y_true): 
 return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() 
''''' 这是Conway&White《机器学习使用案例解析》里的版本 ''' 
def R22(y_test, y_true): 
 y_mean = np.array(y_true) 
 y_mean[:] = y_mean.mean() 
 return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true) 
plt.scatter(x, y, s=5) 
degree = [1,2,100] 
y_test = [] 
y_test = np.array(y_test) 
for d in degree: 
 clf = Pipeline([('poly', PolynomialFeatures(degree=d)), 
     ('linear', LinearRegression(fit_intercept=False))]) 
 clf.fit(x[:, np.newaxis], y) 
 y_test = clf.predict(x[:, np.newaxis]) 
 print(clf.named_steps['linear'].coef_) 
 print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' % 
  (rmse(y_test, y), 
  R2(y_test, y), 
  R22(y_test, y), 
  clf.score(x[:, np.newaxis], y)))  
 plt.plot(x, y_test, linewidth=2) 
plt.grid() 
plt.legend(['1','2','100'], loc='upper left') 
plt.show() 

Il risultato visivo del programma in esecuzione è il seguente:

[-0.16140183  0.99268453]
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82
[ 0.00934527 -0.03591245  1.03065829]
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[  6.07130354e-02  -1.02247150e+00   6.66972089e+01  -1.85696012e+04
......
-9.43408707e+12  -9.78954604e+12  -9.99872105e+12  -1.00742526e+13
-1.00303296e+13  -9.88198843e+12  -9.64452002e+12  -9.33298267e+12
  -1.00580760e+12]
rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89
Il valore mostrato di coef_ è il parametro polinomiale. Ad esempio, il risultato dell'adattamento di grado 1 è
y = 0.99268453x -0.16140183
Ecco alcuni punti che dobbiamo notare qui:
1、Analisi degli errori.
Nell'analisi di regressione, gli errori comuni utilizzati sono la radice quadrata dell'errore quadratico medio (RMSE) e il coefficiente di determinazione R-quadro (R2).
RMSEÈ la media delle radici quadrate degli errori tra i valori predetti e i valori reali. Questo metodo di misurazione è molto popolare (metodo di valutazione della competizione di apprendimento automatico di Netflix), è un metodo di bilanciamento quantitativo.
R2Il metodo è confrontare il valore predetto con il valore medio utilizzato solo, per vedere quanto è buono. L'intervallo è generalmente tra (0,1). 0 significa che è peggio di non fare alcuna previsione, e prendere direttamente il valore medio, mentre 1 significa che tutte le previsioni corrispondono perfettamente ai risultati reali.
Il metodo di calcolo dell'R2 differisce leggermente tra le diverse letterature. Ad esempio, la funzione R2 in questo articolo è implementata secondo la documentazione del sito web ufficiale di scikit-learn, coincidendo con il risultato della funzione clf.score.
L'esecuzione della funzione R22 è tratta dal libro di Conway 'Analisi dei casi di studio di apprendimento automatico', differente dal fatto che utilizza il rapporto tra 2 RMSE per calcolare l'R2.
Vediamo che quando il grado del polinomio è 1, anche se l'adattamento non è molto buono, l'R2 può raggiungere 0.82. Con un polinomio di grado 2, l'R2 aumenta a 0.88. Ma quando il grado aumenta a 100, l'R2 aumenta solo a 0.89.
2、Overfitting.
Utilizzando il polinomio di potenza 100 per l'adattamento, l'effetto è veramente un po' migliore, tuttavia la capacità di misurazione del modello è estremamente debole.
E prestare attenzione ai coefficienti polinomiali, che appaiono in grandi numeri, persino fino a 10 alla 12a potenza.
Ecco, modificiamo il codice, rimuovendo gli ultimi 2 campioni da 500 campioni dal set di addestramento. Tuttavia, nel test vengono ancora testati tutti i 500 campioni.
clf.fit(x[:498, np.newaxis], y[:498)]
Ecco i risultati della fitting polinomiale modificata:

[-0.17933531  1.0052037 ]
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935  0.01922011  0.99193521]
rmse=0.10, R2=0.90, R22=0.69, clf.score=0.90
...
rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57
Semplicemente mancando degli ultimi 2 campioni di addestramento, la previsione del rosso (risultato di addestramento del polinomo di 100 ordini) è cambiata drasticamente, e R2 è precipitato a 0.57.
E a confronto, i risultati di addestramento dei polinomi di 1 e 2 ordini, R2 aumenta leggermente.
Questo indica che i polinomi di alta ordine superapprendono i dati di addestramento, inclusi una grande quantità di rumore, causando che perdano completamente la capacità di prevedere la tendenza dei dati. Come già visto, i coefficienti numerici dei polinomi di 100 ordini sono enormi. La gente naturalmente pensa di evitare la generazione di questa funzione di addestramento irregolare limitando le dimensioni dei numeri dei coefficienti durante il processo di addestramento.
Il suo principio fondamentale è aggiungere la somma degli assoluti di tutti i coefficienti del polinomo di addestramento (regolarizzazione L1) o la somma dei quadrati (regolarizzazione L2) al modello di penalità, e specificare un fattore di penalità w per evitare la generazione di coefficienti irregolari.
Questo principio è applicato nei metodi di regressione di riduzione della pendenza (Ridge) utilizzando la regolarizzazione L2, nel metodo Lasso (utilizzando la regolarizzazione L1) e nel metodo Elastic Net (utilizzando la regolarizzazione L1+L2), che possono efficacemente evitare il superapprendimento. Per ulteriori dettagli, si può fare riferimento a materiali correlati.
Ecco un esempio con la regressione di riduzione della pendenza (Ridge) per vedere se l'addestramento di 100 polinomi è efficace. Modifica il codice come segue:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
                    ('lineare', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400)]

Risultati come segue:

[ 0.          0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0.          0.35936882  0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[  0.00000000e+00  2.63903249e-01  3.14973328e-01  2.43389461e-01
   1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
   ......
   3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
   1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90
Si può vedere che i parametri dei coefficienti della polinomiale di 100 volte diventano molto piccoli. La maggior parte di loro è vicina a 0.
Inoltre, è degno di nota che dopo l'uso di modelli di penale come la regressione di riduzione di riduzione, i valori di R2 della regressione polinomiale di 1° e 2° grado potrebbero essere leggermente inferiori alla regressione lineare di base.
Tuttavia, questo modello, anche se utilizzato 100 volte la polinomiale, durante l'addestramento di 400 campioni e la previsione di 500 campioni, non solo ha un errore R2 più piccolo, ma ha anche una capacità di previsione eccellente.

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e speriamo che tutti sosteniate il tutorial di urla.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di copyright.

Ti potrebbe interessare