2016-01-02 16 views
5

Per ridurre il problema di sovra-adattamento nella regressione lineare nell'apprendimento automatico, si consiglia di modificare la funzione di costo includendo quadrati di parametri. Ciò si traduce in valori più piccoli dei parametri.In che modo avere valori più piccoli per i parametri aiuta a evitare un adattamento eccessivo?

Questo per me non è affatto intuitivo. In che modo avere valori più piccoli per i parametri si traduce in ipotesi più semplici e aiuta a prevenire un adattamento eccessivo?

risposta

2

Questo è un po 'più complicato. Dipende molto dall'algoritmo che stai usando.

Per fare un esempio semplice ma un po 'stupido.Invece di ottimizzare il parametro della funzione

y = a*x1 + b*x2 

si potrebbe anche ottimizzando i parametri di

y = 1/a * x1 + 1/b * x2 

Ovviamente se si minimizza nel primo caso è necessario il massimizzarli in quest'ultimo caso.

Il fatto che per la maggior parte degli algoritmi la riduzione al minimo del quadrato dei parametri deriva dalla teoria di apprendimento computazionale .

Supponiamo per il seguente si desidera imparare una funzione

f(x) = a + bx + c * x^2 + d * x^3 +.... 

Si può sostenere che una funzione fosse solo una è diverso da zero è più probabile di una funzione, dove a e b sono diversi forma zero e così via. Segue Rasoio di Occam (Se hai due ipotesi che spiegano i tuoi dati, più semplice è più probabilmente quello giusto), dovresti preferire un'ipotesi in cui più di te sono zero.

Per fare un esempio permette di dire i punti dati sono (x, y) = {(-1,0), (1,0)} quale funzione si preferisce

f(x) = 0 

o

f(x) = -1 + 1*x^2 

Estendendolo un po 'è possibile passare da parametri che sono zero a parametri che sono piccoli.

Se si desidera provarlo, è possibile campionare alcuni punti dati da una funzione lineare e aggiungere un po 'di rumore gaussiano. Se vuoi trovare un fit polinomiale perfetto, hai bisogno di una funzione piuttosto complicata con pesi in genere piuttosto grandi. Tuttavia, se applichi la regolarizzazione ti avvicinerai alla funzione di generazione dei dati.

Ma se si desidera impostare il proprio ragionamento su solide basi teoriche raccomanderei l'applicazione delle statistiche Baysian. L'idea è che tu definisca una distribuzione di probabilità sulle funzioni di regressione. In questo modo puoi definirti quale sia una funzione di regressione "probabile".

(In realtà l'apprendimento automatico da Tom Mitchell contiene una buona e dettagliata spiegazione)

0

Aggiungendo i quadrati alla funzione (quindi da lineare a polinomiale) si ha cura di poter disegnare una curva invece di una linea retta.

Esempio di funzione polinomiale:

y=q+t1*x1+t2*x2^2; 

Aggiungendo questo però può portare ad un risultato che segue i dati di prova troppo con come risultato che i nuovi dati sia abbinato a chiudere i dati di test. Aggiungere più polinomi (3 °, 4 ° ordine). Quindi quando aggiungi polinomi devi sempre stare attento che i dati non vengano sovrasfruttati.

Per ottenere ulteriori informazioni in questo, disegnare alcune curve in un foglio di calcolo e vedere come le curve cambiano seguendo i dati.

+0

Ma come fa aggiungendo le piazze in funzione di costo noi ottenere l'ipotesi più semplice? Non ti ho preso qui. –

3

Ho messo insieme un esempio piuttosto ingegnoso, ma speriamo che sia d'aiuto.

import pandas as pd 
import numpy as np 

from sklearn import datasets 
from sklearn.linear_model import Ridge, Lasso 
from sklearn.cross_validation import train_test_split 
from sklearn.preprocessing import PolynomialFeatures 

Per prima cosa creare un set di dati lineare, con una suddivisione di allenamento e test. 5 in ogni

X,y, c = datasets.make_regression(10,1, noise=5, coef=True, shuffle=True, random_state=0) 
X_train, X_test, y_train, y_test = train_test_split(X,y, train_size=5) 

Original Data

adattare i dati con un quinto polinomio di ordine senza regolarizzazione.

from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import StandardScaler 
pipeline = Pipeline([ 
     ('poly', PolynomialFeatures(5)), 
     ('model', Ridge(alpha=0.)) # alpha=0 indicates 0 regularization. 
    ]) 

pipeline.fit(X_train,y_train) 

Guardando i coefficienti

pipeline.named_steps['model'].coef_ 
pipeline.named_steps['model'].intercept_ 

# y_pred = -12.82 + 33.59 x + 292.32 x^2 - 193.29 x^3 - 119.64 x^4 + 78.87 x^5 

No Regularization

Qui il modello tocca tutti i punti di formazione, ma ha elevati coefficienti e non toccare i punti di prova.

Proviamo di nuovo, ma cambiare il nostro L2 regolarizzazione

pipeline.set_params(model__alpha=1) 

With regularization

y_pred = 6.88 + 26.13 x + 16.58 x^2 + 12.47 x^3 + 5.86 x^4 - 5.20 x^5 

Qui vediamo una forma fluida, con meno dimenando intorno. Non tocca più tutti i punti di allenamento, ma è una curva molto più morbida. I coefficienti sono più piccoli a causa della regolarizzazione aggiunta.

Problemi correlati