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