Validazione dei modelli Strumenti quantitativi per la gestione
Transcript
Validazione dei modelli Strumenti quantitativi per la gestione
3/16/2015 Validazione dei modelli Validazione dei modelli Strumenti quantitativi per la gestione Emanuele Taufer Validazione dei modelli Il data set Auto I dati Il problema analizzato Validation set approach Diagramma a dispersione Test set e training set Regressione lineare semplice RLS: Test MSE Regressione quadratica Rq: Test MSE Regressione cubica Rc: Test MSE Regressione KNN Input nella funzione knn.reg.1() Calcolare le previsioni con KNN Plot Test MSE e training MSE Plot degli MSE Confronto test MSE Validazione dei modelli In questo esempio consideriamo il data set Auto e: adattiamo un modello di regressione lineare adattiamo una regressione polinomiale adattiamo una regressione KNN (nonparametrica) compariamo i modelli attraverso il calcolo del test MSE Il data set Auto In questo data set vi sono alcuni valori mancanti indicati con “?”. Nella lettura del file specifichiamo che “?” indica un valore mancante ( NA ) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 1/17 3/16/2015 Validazione dei modelli Auto<‐read.csv("http://www.cs.unitn.it/~taufer/Data/Auto.csv",header=T,na.strings="?") str(Auto) ## 'data.frame': 397 obs. of 9 variables: ## $ mpg : num 18 15 18 16 17 15 14 14 14 15 ... ## $ cylinders : int 8 8 8 8 8 8 8 8 8 8 ... ## $ displacement: num 307 350 318 304 302 429 454 440 455 390 ... ## $ horsepower : int 130 165 150 150 140 198 220 215 225 190 ... ## $ weight : int 3504 3693 3436 3433 3449 4341 4354 4312 4425 3850 ... ## $ acceleration: num 12 11.5 11 12 10.5 10 9 8.5 10 8.5 ... ## $ year : int 70 70 70 70 70 70 70 70 70 70 ... ## $ origin : int 1 1 1 1 1 1 1 1 1 1 ... ## $ name : Factor w/ 304 levels "amc ambassador brougham",..: 49 36 231 14 161 1 41 54 223 241 2 ... I dati Nel data.frame eliminiamo le righe con i valori mancanti attraverso la funzione complete.cases che crea un vettore logico (T,F,T...) con F in corrispondenza di una riga con uno o più valori mancanti Auto<‐Auto[complete.cases(Auto),] ## elimino le righe con "NA" head(Auto) ## mpg cylinders displacement horsepower weight acceleration year origin ## 1 18 8 307 130 3504 12.0 70 1 ## 2 15 8 350 165 3693 11.5 70 1 ## 3 18 8 318 150 3436 11.0 70 1 ## 4 16 8 304 150 3433 12.0 70 1 ## 5 17 8 302 140 3449 10.5 70 1 ## 6 15 8 429 198 4341 10.0 70 1 ## name ## 1 chevrolet chevelle malibu ## 2 buick skylark 320 ## 3 plymouth satellite ## 4 amc rebel sst ## 5 ford torino ## 6 ford galaxie 500 nrow(Auto) ## [1] 392 Il problema analizzato file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 2/17 3/16/2015 Validazione dei modelli Poiché l’obiettivo di questa esercitazione è l’applicazione di tecniche di scelta dei modelli, consideriamo un solo predittore: questo ci permetterà di visualizzare i risultati. Proviamo a prevedere il consumo (mpg) in funzione della potenza del motore (horsepower) L’obiettivo è dunque stimare f nel modello mpg = f (horsepower) + ε Stimiamo f attraverso diversi modelli: 1. regressione lineare semplice, quadratica e cubica (modello parametrico) 2. regressione KNN (non parametrico) Validation set approach Per validare i modelli utilizzeremo il cd validation set approach, in cui una parte dei dati a disposizione è messa da parte e utilizzata come test set. Il test MSE calcolato dai dati test sarà utilizzato per scegliere K nella regressione KNN comparare i diversi modelli stimati Diagramma a dispersione plot(Auto$horsepower,Auto$mpg) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 3/17 3/16/2015 Validazione dei modelli Test set e training set Il dataset è composto da 392 unità. Suddividiamo casualmente il dataset in due parti: il training set 292 unità il test set 100 unità Individuiamo le unità del training set con la funzione sample() . Il vettore train definito sotto contiene le posizioni selezionate set.seed(1) train=sample(392,292) train file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 4/17 3/16/2015 Validazione dei modelli [1] 105 146 224 354 79 348 365 255 242 24 388 68 262 391 292 188 270 [18] 372 143 290 387 382 384 47 99 142 5 140 317 124 175 217 178 67 [35] 297 239 283 39 257 379 289 228 275 194 185 274 9 165 252 238 164 [52] 294 149 83 383 34 107 174 222 136 304 98 152 110 214 85 157 250 [69] 28 356 329 376 111 336 330 323 347 123 245 301 333 334 363 101 234 [86] 63 218 38 75 44 73 18 193 263 233 237 135 121 357 360 192 103 [103] 371 287 183 62 305 137 299 170 276 206 100 295 42 4 198 29 315 [120] 362 321 296 131 369 203 122 312 55 61 326 151 21 10 167 240 154 [137] 144 271 251 129 173 380 60 65 181 112 303 288 26 211 340 385 373 [154] 109 120 43 125 313 249 50 359 207 291 179 201 94 15 76 163 225 [171] 386 186 189 86 339 195 311 160 130 300 307 41 187 106 314 40 284 [188] 370 213 247 256 258 261 375 57 117 22 342 352 318 52 278 368 51 [205] 35 97 392 338 48 132 273 19 138 364 353 265 115 259 166 59 46 [222] 350 177 87 156 219 358 8 69 216 282 196 325 309 349 341 108 169 [239] 232 70 269 88 285 161 158 32 212 20 389 241 281 208 66 84 202 [256] 226 337 381 298 236 153 191 37 102 90 200 346 95 77 127 345 14 [273] 172 316 36 23 30 119 229 254 277 344 210 243 6 150 377 17 279 [290] 197 199 104 Costruiamo i due data set, test e training, utilizzando i risultati del campionamento: Auto.test<‐Auto[‐train,] nrow(Auto.test) [1] 100 Auto.train<‐Auto[train,] nrow(Auto.train) [1] 292 Regressione lineare semplice rls<‐lm(mpg~horsepower, data=Auto.train) summary(rls) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 5/17 3/16/2015 Validazione dei modelli Call: lm(formula = mpg ~ horsepower, data = Auto.train) Residuals: Min 1Q Median 3Q Max ‐13.4369 ‐3.1577 ‐0.1577 2.9059 17.0611 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 39.771601 0.821389 48.42 <2e‐16 *** horsepower ‐0.157426 0.007373 ‐21.35 <2e‐16 *** ‐‐‐ Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.887 on 290 degrees of freedom Multiple R‐squared: 0.6112, Adjusted R‐squared: 0.6099 F‐statistic: 455.9 on 1 and 290 DF, p‐value: < 2.2e‐16 plot(Auto$horsepower,Auto$mpg) abline(rls,col="red",lwd=2) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 6/17 3/16/2015 Validazione dei modelli RLS: Test MSE Il calcolo del test MSE può essere fatto molto semplicemente definendo la media delle differenze al quadrato tra i valori di mpg nel test set e la loro previsione in base al modello rls test.MSE.rls<‐mean((Auto.test$mpg‐predict(rls,Auto.test))^2) test.MSE.rls [1] 24.66309 Regressione quadratica rq<‐lm(mpg~poly(horsepower,2), data=Auto.train) summary(rq) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 7/17 3/16/2015 Validazione dei modelli Call: lm(formula = mpg ~ poly(horsepower, 2), data = Auto.train) Residuals: Min 1Q Median 3Q Max ‐14.4662 ‐2.3486 0.0239 2.4118 15.1130 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 23.3308 0.2579 90.448 < 2e‐16 *** poly(horsepower, 2)1 ‐104.3413 4.4078 ‐23.672 < 2e‐16 *** poly(horsepower, 2)2 36.1999 4.4078 8.213 7.29e‐15 *** ‐‐‐ Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.408 on 289 degrees of freedom Multiple R‐squared: 0.6848, Adjusted R‐squared: 0.6826 F‐statistic: 313.9 on 2 and 289 DF, p‐value: < 2.2e‐16 plot(Auto$horsepower,Auto$mpg) lines(sort(Auto$horsepower),predict(rq,Auto)[order(Auto$horsepower)],col="red",lwd=2) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 8/17 3/16/2015 Validazione dei modelli Rq: Test MSE test.MSE.rq<‐mean((Auto.test$mpg‐predict(rq,Auto.test))^2) test.MSE.rq [1] 18.43123 Regressione cubica rc<‐lm(mpg~poly(horsepower,3), data=Auto.train) summary(rc) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 9/17 3/16/2015 Validazione dei modelli Call: lm(formula = mpg ~ poly(horsepower, 3), data = Auto.train) Residuals: Min 1Q Median 3Q Max ‐14.4555 ‐2.4116 ‐0.0247 2.3805 15.0703 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 23.3308 0.2583 90.313 <2e‐16 *** poly(horsepower, 3)1 ‐104.3413 4.4144 ‐23.637 <2e‐16 *** poly(horsepower, 3)2 36.1999 4.4144 8.200 8e‐15 *** poly(horsepower, 3)3 ‐1.6460 4.4144 ‐0.373 0.71 ‐‐‐ Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 4.414 on 288 degrees of freedom Multiple R‐squared: 0.6849, Adjusted R‐squared: 0.6816 F‐statistic: 208.7 on 3 and 288 DF, p‐value: < 2.2e‐16 plot(Auto$horsepower,Auto$mpg) lines(sort(Auto$horsepower),predict(rc,Auto)[order(Auto$horsepower)],col="red",lwd=2) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 10/17 3/16/2015 Validazione dei modelli Rc: Test MSE test.MSE.rc<‐mean((Auto.test$mpg‐predict(rc,Auto.test))^2) test.MSE.rc ## [1] 18.35299 Regressione KNN Per adattare una regressione KNN ai dati è necessario costruire una funzione ad hoc. La funzione knn.reg.1() disponibile nel file KNNR.r è appropriata per il caso di un solo regressore e automaticamente 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 file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 11/17 3/16/2015 Validazione dei modelli Per indicare ad R dove trovare la funzione knn.reg.1() , copiare il file KNNR.r nella directory di lavoro di R e richiamarlo con la funzione source() knn.reg.1 <‐ 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 # Output: una matrice di valori previsti per il test set (una colonna per ogni K in kl ist) source("KNNR.r") Input nella funzione knn.reg.1() In questo caso, la funzione knn.reg.1() , ci chiede di fornire come input i dati separati in variabile dipendente indipendente , test e training. x.train<‐Auto.train$horsepower y.train<‐Auto.train$mpg x.test<‐Auto.test$horsepower y.test<‐Auto.test$mpg Calcolare le previsioni con KNN Con il codice seguente calcoliamo le previsioni del modello KNN per valori di K da 1 a 60 ( klist=seq(60) ): y.pred.train contiene i valori previsti per il training set y.pred.test contiene i valori previsti per il test set klist<‐ seq(60) # testiamo i risultati per k=1,2, ... 60 y.pred.train<‐ knn.reg.1(klist,x.train,y.train,x.train) y.pred.test<‐ knn.reg.1(klist,x.train,y.train,x.test) Plot file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 12/17 3/16/2015 Validazione dei modelli plot(Auto.train$horsepower,Auto.train$mpg) lines(sort(Auto.train$horsepower),knn.reg.1(292,x.train,y.train,x.train)[order(Auto.trai n$horsepower)],col=1,lwd=2) lines(sort(Auto.train$horsepower),knn.reg.1(50,x.train,y.train,x.train)[order(Auto.trai n$horsepower)],col=2,lwd=2) lines(sort(Auto.train$horsepower),knn.reg.1(10,x.train,y.train,x.train)[order(Auto.trai n$horsepower)],col=3,lwd=2) lines(sort(Auto.train$horsepower),knn.reg.1(1,x.train,y.train,x.train)[order(Auto.train$h orsepower)],col=4,lwd=2) legend("topright",legend=c('k=292','k=50','k=10','k=1'),text.col=seq(4) , lty=1 , col=se q(4)) Test MSE e training MSE mse.train <‐ apply((y.pred.train ‐ y.train)^2 , 2, mean) mse.test <‐ apply((y.pred.test ‐ y.test)^2 , 2, mean) MSE.table<‐data.frame("K"=klist, "test MSE"=mse.test,"training MSE"=mse.train) knitr::kable(MSE.table) K test.MSE file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html training.MSE 13/17 3/16/2015 Validazione dei modelli 1 30.09680 28.42973 2 22.43528 21.62602 3 21.63598 17.45762 4 23.00930 16.52595 5 21.19542 14.84301 6 20.04907 14.84211 7 19.88380 15.48677 8 19.68465 15.35615 9 18.49637 15.46417 10 17.73639 15.78714 11 18.34507 15.67925 12 18.53279 15.83070 13 18.53622 15.99003 14 18.57326 16.24180 15 18.67473 16.55086 16 18.09896 16.72008 17 18.23275 16.84350 18 18.30847 17.09664 19 18.29056 17.13032 20 18.52957 17.14312 21 18.33329 17.13683 22 18.19082 17.15208 23 18.51499 17.28544 24 18.65177 17.29859 25 18.58782 17.41129 26 18.79448 17.51886 27 18.85187 17.52284 28 18.67760 17.64364 29 18.67672 17.56414 file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 14/17 3/16/2015 Validazione dei modelli 30 18.54286 17.51857 31 18.65928 17.55357 32 18.56971 17.55974 33 18.38003 17.52870 34 18.26046 17.49751 35 18.12801 17.44084 36 17.98945 17.47497 37 17.91272 17.51087 38 17.87040 17.54706 39 17.79941 17.46536 40 17.79758 17.49787 41 17.89832 17.50491 42 17.96041 17.65028 43 17.85633 17.75584 44 17.90828 17.70944 45 17.89409 17.71314 46 17.96101 17.76872 47 17.96844 17.82790 48 17.88406 17.78567 49 17.84261 17.87657 50 17.81711 17.84915 51 17.84355 17.98911 52 17.80041 18.05454 53 17.92845 18.18487 54 17.91767 18.26421 55 17.90798 18.28456 56 18.01142 18.28817 57 18.08693 18.31213 58 18.18657 18.38472 file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 15/17 3/16/2015 Validazione dei modelli 59 18.26410 18.43718 60 18.33649 18.47335 Plot degli MSE Riportiamo in un grafico i valori di MSE ottenuti. Dalla tavola precedente notiamo che il valore di test MSE più basso corrisponde al caso K = 10 . Tuttavia per un intervallo di valori K piuttosto ampio questo rimane molto basso. Il valore K = 50 produce una adattamento molto più smussato rispetto al caso K = 10 plot(mse.train , type='l' , xlab='k' , ylab='MSE', col=1 , lwd=2) lines(mse.test , col=2 , lwd=2) legend("bottomright",legend=c('Train','Test'),text.col=seq(2) , lty=1 , col=seq(2)) Confronto test MSE file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 16/17 3/16/2015 Validazione dei modelli 1. RLS: test MSE = 24.66309 2. RQ: test MSE =18.4312291 3. RC: test MSE =18.3529882 4. KNN, K = 10 : test MSE =17.736386 5. KNN, K = 50 : test MSE =17.8171135 file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 17/17