Modelli non lineari e cross validazione Strumenti quantitativi per la gestione Emanuele Taufer file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 1/28
Metodi per affrontare problemi nonlineari Regressione polinomiale Regressione k-nn Regressione con funzioni costanti (step functions) Regressione polinomiale locale (regression splines) Smoothing splines Regressione locale Modelli additivi generalizzati: approccio che permette di usare diversi tipi di tecniche simultaneamente file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 2/28
In questa esercitazione ci concentreremo su: regressione polinomiale regressione k-nn in un problema non-lineare di previsione dei picchi nella domanda di energia. I due modelli saranno comparati per mezzo di cross validazione file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 3/28
Regressione polinomiale Il metodo più tradizionale per estendere il modello di regressione a contesti non-lineari è quello di usare una funzione polinomiale: y i = β0 + β1x i + β2x 2 + + β + i d x d ε i i può essere stimato semplicemente con il metodo dei minimi quadrati: infatti è un modello di regressione standard con predittori x i, x 2, x 3, x d i i i difficilmente si usa troppo flessibile d > 4 poichè il polinomio tende a diventare la stessa tecnica può essere estesa al caso della regressione logistica file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 4/28
Esempio: modellare i picchi di domanda di energia Per operare efficacemente le aziende elettriche devono essere in grado di prevedere il picco giornaliero di richiesta di energia La richiesta di energia è misurata in megawatt per ora Il picco giornaliero è definito come il massimo di domanda nell arco delle 24 ore Le compagnie elettriche monitorano costantemente il fenomeno attraverso modelli di regressione file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 5/28
Fattori che determinano la domanda di energia Meteo-sensibili: Il fattore principale in questo caso è la temperatura (collegata all uso di impianti di riscaldamento e di condizionamento) Non meteo-sensibili Il fattore principale in questo caso è il giorno della settimana: feriale, sabato o domenica (collegato all uso di frigoriferi, luci, computer, impianti industriali) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 6/28
I dati Temp-2014-F.dat Osservazioni giornaliere di una compagnia elettrica nel periodo 1/1/14-31/12/14 Y : Picco di domanda in megawatt (Peak) X1: Temperatura in F al momento del picco (Tmax), X2 X3: indicatori se sabato o domenica file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 7/28
Dataset Temp Temp<-read.table("http://www.cs.unitn.it/~taufer/Data/Temp-2014-F.dat",header=T,sep="") head(temp) Date Tmax Peak Sat Sun 1 2014-01-01 39.74 3928.294 0 0 2 2014-01-02 34.52 4419.036 0 0 3 2014-01-03 40.10 4114.751 0 0 4 2014-01-04 38.84 4096.177 1 0 5 2014-01-05 42.08 3676.929 0 1 6 2014-01-06 47.66 3410.767 0 0 Per comodità, costruiamo la variabile factor Day Temp$Day<-Temp$Sat+2*Temp$Sun Temp$Day<-factor(Temp$Day, c(0,1,2),c("wday","sat","sun")) str(temp$day) Factor w/ 3 levels "Wday","Sat","Sun": 1 1 1 2 3 1 1 1 1 1... file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 8/28
Plot Picco-Temperatura massima plot(temp$tmax,temp$peak,pch=3, col="red",lwd=2.5) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 9/28
Regressione quadratica - output R Per provare a catturare l andamento non lineare del fenomeno, utilizziamo un modello di regressione lineare con un termine quadratico. Si noti l uso del wrapper I() nella formula. fit2<-lm(peak~tmax+i(tmax^2)+day,data=temp) summary(fit2) Call: lm(formula = Peak ~ Tmax + I(Tmax^2) + Day, data = Temp) Residuals: Min 1Q Median 3Q Max -504.76-115.79 0.63 113.86 695.00 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 1.123e+04 1.847e+02 60.801 < 2e-16 *** Tmax -2.505e+02 6.032e+00-41.533 < 2e-16 *** I(Tmax^2) 1.853e+00 4.755e-02 38.968 < 2e-16 *** DaySat -1.207e+02 2.684e+01-4.496 9.37e-06 *** DaySun -2.624e+02 2.684e+01-9.775 < 2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 176.7 on 360 degrees of freedom Multiple R-squared: 0.8645, Adjusted R-squared: 0.863 F-statistic: 574.2 on 4 and 360 DF, p-value: < 2.2e-16 file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 10/28
Peak osservato e previsto plot(temp$tmax,temp$peak,pch=3, col="red",lwd=2.5) points(temp$tmax,i(predict(fit2,temp)),col="blue",pch=8,lwd=2) I valori previsti dal modello fit2 sono in blu. Si noti che vi sono tre diverse curve corripondenti ai 3 livelli della variabile Day. file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 11/28
Validazione dei modelli di regressione. Per la scelta e la comparazione di modelli di regressione è possibile utilizzare delle statistiche tradizionali che tengono conto del numero di predittori utilizzati: R 2 -corretto RSE Se i modelli di regressione da comparare sono innestati fra loro, è possibile ricorrere all uso dei test F parziali (vedi lezioni precedenti). file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 12/28
Cross-validazione (CV) Nel caso in cui si voglia comparare un modello di regressione lineare con un modello di diversa natura, ad esempio un modello di regressione non-parametrica, è opportuno ricorrere alla CV. La CV può, in generale, essere applicata a tutti i modelli di statistical learning supervisionato e fornisce un criterio unico per il loro confronto. In questa esercitazione useremo LOOCV k-fold CV Nota: poiché in questa esercitazione si userà anche la regressione k- NN, per evitare confusione, parleremo d ora in poi di m-fold CV file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 13/28
Cross-validazione LOOCV per fit2 Il codice seguente calcola una LOOCV utilizzando la funzione glm() e la funzione accessoria cv.glm(). La funzione glm() (generalized lm) può essere utilizzata per stimare un modello di regressione lineare. library(boot) glm.fit=glm(peak~tmax+i(tmax^2)+day,data=temp) cv.err =cv.glm(temp,glm.fit) La stima del test MSE da LOOCV è contenuta nell oggetto cv.err. Per accedervi, digitare cv.err$delta ## [1] 31726.47 31725.16 Dove il primo numero è il valore di test MSE stimato ed il secondo una sua versione corretta per la distorsione (in questo caso quasi coincidono). Vedremo che potranno essere diversi nella m-fold CV. file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 14/28
CV m-fold per fit2 Utilizziamo ancora le funzioni glm e cv.glm per ottenere un CV m-fold con. m = 10 cv.err.m =cv.glm(temp,glm.fit,k=10) Da cui cv.err.m$delta ## [1] 31636.99 31592.38 La stima è molto simile a quella ottenuta con LOOCV file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 15/28
Struttura del fenomeno file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 16/28
Regressione k-nn La regressione quadratica è vincolata alla struttura simmetrica della parabola. Maggior flessibilità potrebbe essere introdotta dall uso di un termine cubico. fit3<-lm(peak ~ Tmax + I(Tmax^2)+I(Tmax^3)+Day,data=Temp) In quest esempio utilizziamo una regressione non-parametrica, la k- NN, per cercare di seguire più fedelmente la particolare struttura del fenomeno. file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 17/28
Regressione k-nn Per adattare una regressione k-nn ai dati è necessario costruire una funzione ad hoc. La funzione knn.reg() disponibile nel file KNNR.r (scaricabile dalla pagina web del corso) produce le previsioni per il vettore di dati x.test dato l input x.train e l output y.train. E possibile specificare una lista (o anche solo uno) di valori di K da considerare Per indicare ad R dove trovare la funzione knn.reg(), copiare il file KNNR.r nella directory di lavoro di R e richiamarlo con la funzione source() knn.reg <- function(klist,x.train,y.train,x.test) # Regressione k-nearest neighbors # # klist è la lista dei valori K da usare # x.train, y.train: il training set (indipendente-dipendente) # x.test: il test set (o ancora x.train se interessati all'interpolazione) # Output: una matrice di valori previsti per il test set (una colonna per ogni K in klist) source("knnr.r") file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 18/28
Input nella funzione knn.reg() In questo caso, la funzione knn.reg(), ci chiede di fornire come input i dati separati in variabile dipendente -indipendenti, training e, se a disposizione, test. x.train<-temp[,c(2,4,5)] y.train<-temp$peak Si noti che per formare x.train non si seleziona la variabile Day, che ha natura factor ed è appropriata per l utilizzo con lm(), ma si selezionano le due variabili numeriche Sat e Sun. In questo caso non abbiamo un set di dati test, pertanto utilizziamo la cross-validazione per: scegliere il valore ottimale di k confrontare la regressione k-nn con quella quadratica file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 19/28
CV per la regressione k-nn La CV può essere fatta utilizzando la funzione knn.reg.cv() disponibile in KNNR.r knn.reg.cv <- function(klist,x.train,y.train,nfolds) klist è la lista dei valori K da usare x.train, y.train: il training set (indipendente-dipendente) nfolds: il numero di folders per la m-fold CV, indicare n (numerosità dei dati) per ottenere una LOOCV Output: una matrice di valori previsti per la CV (una colonna per ogni K in klist) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 20/28
Seleziona il valore k ottimale con 10- fold CV k = 1, 2,, 30 Il codice seguente, per i valori esegue una 10-fold CV e salva i risultati (ossia le previsioni ottenute dalla CV) nell oggetto (matrice) p.cv. I test MSE calcolati successivamente sono nel vettore m.vec. # Consideriamo valori di k da 1 a 30 klist<-seq(30) ## Ottiene le previsioni da CV (una matrice di dati) p.cv<-knn.reg.cv(klist,x.train,y.train,10) ## Calcola i valori di test MSE stimato per k =1, 2,... 30 p.cv<-(p.cv-y.train)^2 m.vec<-apply(p.cv, 2, mean) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 21/28
Grafico dei test MSE stimati con 10- fold CV par(mfrow=c(1,1)) plot(klist,m.vec,pch=3, col="red",lwd=2.5) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 22/28
Determinare il valore minimo Utilizziamo la funzione which.min() per determinare l elemento (posizione) del vettore m.vec che contiene il valore minimo di MSE Il modello preferito per la regressione k-nn è quello con k uguale a which.min(m.vec) ## [1] 9 Il test MSE stimato dalla 10-fold CV è m.vec[which.min(m.vec)] ## [1] 38040.7 file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 23/28
Valori previsti Ottenuto il valore ottimale di k, lo utilizziamo per stimare un modelli di regressione k-nn ed ottenere le previsioni. klist<- which.min(m.vec) fit.knn<- knn.reg(klist,x.train,y.train,x.train) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 24/28
Valori osservati e valori previsti k-nn par(mfrow=c(1,1)) plot(temp$tmax,temp$peak,pch=3, col="red",lwd=2.5) points(temp$tmax,fit.knn,col="blue",pch=8,lwd=2) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 25/28
LOOCV per il modello k-nn scelto Per confrontare opportunamente fit2 e fit.knn crossvalidiamo la regressione non-parametrica utilizzando LOOCV klist<- which.min(m.vec) cvr<-knn.reg.cv(klist,x.train,y.train,nrow(temp)) LOOCV.knn<-mean((cvr-Temp$Peak)^2) LOOCV.knn ## [1] 38552.95 file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 26/28
Confronto grafico dei due modelli par(mfrow=c(1,2)) plot(temp$tmax,temp$peak,pch=3, col="red",lwd=2.5) points(temp$tmax,fit.knn,col="blue",pch=8,lwd=2) plot(temp$tmax,temp$peak,pch=3, col="red",lwd=2.5) points(temp$tmax,i(predict(fit2,temp)),col="blue",pch=8,lwd=2) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 27/28
Scelta del modello Dalla LOOCV abbiamo una stima del test MSE: 3.1726510^{4} per la regressione quadratica 3.855310^{4} per la regressione k-nn La regressione quadratica pur non catturando adeguatamente la struttura del fenomeno sembra sfruttare appieno l informazione data dal giorno della settimana. Se si considera anche la facilità di interpretazione, fit2 è decisamente preferito a fit.knn. Un modello più adatto potrebbe essere ottenuto utilizzando le spline (non trattate nel corso) file:///c:/users/emanuele.taufer/google%20drive/2%20corsi/3%20sqg/labs/l3-temperature_max.html#(24) 28/28