Validazione dei modelli Strumenti quantitativi per la gestionetaufer/Labs/L2 - Valid.pdf · s q r p...

17
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 )

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

3/16/2015 Validazione dei modelli

file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/Validation.html 17/17

1.  RLS: test MSE = 24.66309

2.  RQ: test MSE =18.4312291

3.  RC: test MSE =18.3529882

4.  KNN,  : test MSE =17.736386

5.  KNN,  : test MSE =17.8171135

K = 10

K = 50