Validazione dei modelli Strumenti quantitativi per la gestionetaufer/Labs/L2 - Valid.pdf · s q r p...
-
Upload
nguyendung -
Category
Documents
-
view
213 -
download
0
Transcript of Validazione dei modelli Strumenti quantitativi per la gestionetaufer/Labs/L2 - Valid.pdf · s q r p...
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 1/17
Validazione dei modelliStrumenti quantitativi per la gestioneEmanuele Taufer
Validazione dei modelliIl data set AutoI datiIl problema analizzatoValidation set approachDiagramma a dispersioneTest set e training setRegressione lineare sempliceRLS: Test MSERegressione quadraticaRq: Test MSERegressione cubicaRc: Test MSERegressione KNNInput nella funzione knn.reg.1()Calcolare le previsioni con KNNPlotTest MSE e training MSEPlot degli MSEConfronto test MSE
Validazione dei modelliIn 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 AutoIn questo data set vi sono alcuni valori mancanti indicati con “?”. Nella lettura del file specifichiamo che“?” indica un valore mancante ( NA )
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 2/17
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 141 54 223 241 2 ...
I datiNel data.frame eliminiamo le righe con i valori mancanti attraverso la funzione complete.cases checrea 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
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 3/17
Poiché l’obiettivo di questa esercitazione è l’applicazione di tecniche di scelta dei modelli, consideriamoun 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 nel modello
Stimiamo attraverso diversi modelli:
1. regressione lineare semplice, quadratica e cubica (modello parametrico)
2. regressione KNN (non parametrico)
Validation set approachPer 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 dispersioneplot(Auto$horsepower,Auto$mpg)
f
mpg = f(horsepower) + ε
f
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 4/17
Test set e training setIl dataset è composto da 392 unità. Suddividiamo casualmente il dataset in due parti:
il training set unità
il test set unità
Individuiamo le unità del training set con la funzione sample() . Il vettore train definito sotto contiene leposizioni selezionate
set.seed(1)train=sample(392,292)train
292
100
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 5/17
[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 semplicerls<‐lm(mpg~horsepower, data=Auto.train)summary(rls)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 6/17
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 freedomMultiple 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)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 7/17
RLS: Test MSEIl calcolo del test MSE può essere fatto molto semplicemente definendo la media delle differenze alquadrato 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 quadraticarq<‐lm(mpg~poly(horsepower,2), data=Auto.train)summary(rq)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 8/17
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 freedomMultiple 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)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 9/17
Rq: Test MSEtest.MSE.rq<‐mean((Auto.test$mpg‐predict(rq,Auto.test))^2)test.MSE.rq
[1] 18.43123
Regressione cubicarc<‐lm(mpg~poly(horsepower,3), data=Auto.train)summary(rc)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 10/17
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 freedomMultiple 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)
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 11/17
Rc: Test MSEtest.MSE.rc<‐mean((Auto.test$mpg‐predict(rc,Auto.test))^2)test.MSE.rc
## [1] 18.35299
Regressione KNNPer 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 eautomaticamente produce le previsioni per il vettore di dati x.test dato l’input x.train e l’outputy.train . E’ possibile specificare una lista (o anche solo uno) di valori di K da considerare
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 12/17
Per indicare ad R dove trovare la funzione knn.reg.1() , copiare il file KNNR.r nella directory di lavorodi 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 klist)
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 variabiledipendente indipendente , test e training.
x.train<‐Auto.train$horsepowery.train<‐Auto.train$mpgx.test<‐Auto.test$horsepowery.test<‐Auto.test$mpg
Calcolare le previsioni con KNNCon 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, ... 60y.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
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 13/17
plot(Auto.train$horsepower,Auto.train$mpg)lines(sort(Auto.train$horsepower),knn.reg.1(292,x.train,y.train,x.train)[order(Auto.train$horsepower)],col=1,lwd=2)lines(sort(Auto.train$horsepower),knn.reg.1(50,x.train,y.train,x.train)[order(Auto.train$horsepower)],col=2,lwd=2)lines(sort(Auto.train$horsepower),knn.reg.1(10,x.train,y.train,x.train)[order(Auto.train$horsepower)],col=3,lwd=2)lines(sort(Auto.train$horsepower),knn.reg.1(1,x.train,y.train,x.train)[order(Auto.train$horsepower)],col=4,lwd=2)legend("topright",legend=c('k=292','k=50','k=10','k=1'),text.col=seq(4) , lty=1 , col=seq(4))
Test MSE e training MSEmse.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 training.MSE
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 14/17
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
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 15/17
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
3/16/2015 Validazione dei modelli
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 16/17
59 18.26410 18.43718
60 18.33649 18.47335
Plot degli MSERiportiamo in un grafico i valori di MSE ottenuti. Dalla tavola precedente notiamo che il valore di testMSE più basso corrisponde al caso . Tuttavia per un intervallo di valori piuttosto ampioquesto rimane molto basso. Il valore produce una adattamento molto più smussato rispetto alcaso
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
K = 10 K
K = 50K = 10