[ad_1]
Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.
Em nossa última nota, mencionamos a possibilidade de “modelos totalmente calibrados”. Esta nota é um exemplo de modelo de probabilidade que é calibrado no sentido tradicional, mas não totalmente calibrado em um sentido mais refinado.
Primeiro, vamos anexar nossos pacotes e gerar nossos dados de exemplo em R
.
1 | 1 | VERDADE |
1 | FALSO | |
1 | VERDADE | |
1 | 1 | FALSO |
VERDADE | ||
1 | VERDADE | |
1 | FALSO | |
FALSO | ||
VERDADE |
Agora, ajustamos nosso modelo de regressão logística.
## ## Call: ## glm(formula = y ~ x1 + x2, family = binomial(), data = d) ## ## Deviance Residuals: ## Min 1Q Median 3Q Max ## -1.4213 -1.2572 0.9517 1.0996 1.2572 ## ## Coefficients: ## Estimate Std. Error z value Pr(>|z|) ## (Intercept) 0.5572 1.0784 0.517 0.605 ## x1 -0.3715 1.3644 -0.272 0.785 ## x2 -0.3715 1.3644 -0.272 0.785 ## ## (Dispersion parameter for binomial family taken to be 1) ## ## Null deviance: 12.365 on 8 degrees of freedom ## Residual deviance: 12.201 on 6 degrees of freedom ## AIC: 18.201 ## ## Number of Fisher Scoring iterations: 4
Aterramos nossas previsões de modelo como uma nova coluna.
1 | 1 | VERDADE | 0,4537010 |
1 | FALSO | 0,5462990 | |
1 | VERDADE | 0,5462990 | |
1 | 1 | FALSO | 0,4537010 |
VERDADE | 0,6358007 | ||
1 | VERDADE | 0,5462990 | |
1 | FALSO | 0,5462990 | |
FALSO | 0,6358007 | ||
VERDADE | 0,6358007 |
Podemos ver que este modelo é calibrado ou imparcial no sentido E[prediction] = E[outcome]
.
colMeans(d[, qc(y, prediction)]) %.>% knitr::kable(.)
Y | 0,5555556 |
predição | 0,5555556 |
E é até calibrado no sentido que esperamos para regressão logística, E[prediction * x] = E[outcome * x]
(Onde x
é qualquer variável explicativa).
for(v in qc(x1, x2)) { print(paste0( v, ' diff: ', mean(d[[v]] * d$prediction) - mean(d[[v]] * d$y))) }
## [1] "x1 diff: 2.77555756156289e-17" ## [1] "x2 diff: 5.55111512312578e-17"
No entanto, podemos ver que este modelo não está “totalmente calibrado” em um sentido adicional, exigindo que E[outcome | prediction] = prediction
para todos os valores observados de prediction
.
0,4537010 | 0,5000000 |
0,5462990 | 0,5000000 |
0,6358007 | 0,66666667 |
Podemos recalibrar esse modelo (na prática, você gostaria de fazer isso em dados de amostra usando regressão isotônica ou usando métodos de quadro cruzado para evitar viés de modelo aninhado).
1 | 1 | VERDADE | 0,4537010 | 0,5000000 |
1 | FALSO | 0,5462990 | 0,5000000 | |
1 | VERDADE | 0,5462990 | 0,5000000 | |
1 | 1 | FALSO | 0,4537010 | 0,5000000 |
VERDADE | 0,6358007 | 0,66666667 | ||
1 | VERDADE | 0,5462990 | 0,5000000 | |
1 | FALSO | 0,5462990 | 0,5000000 | |
FALSO | 0,6358007 | 0,66666667 | ||
VERDADE | 0,6358007 | 0,66666667 |
Esta nova previsão calibrada também é calibrada no sentido padrão.
colMeans(d[, qc(y, prediction, calibrated)]) %.>% knitr::kable(.)
Y | 0,5555556 |
predição | 0,5555556 |
calibrado | 0,5555556 |
E, pelo menos neste caso, ainda obedece às condições explicativas de roll-up.
for(v in qc(x1, x2)) { print(paste0( v, ' diff: ', mean(d[[v]] * d$calibrated) - mean(d[[v]] * d$y))) }
## [1] "x1 diff: 0" ## [1] "x2 diff: 0"
As novas previsões calibradas apresentam desvios ainda menores do que as previsões originais.
deviance(prediction = d$prediction, truth = d$y)
## [1] 12.20102
deviance(prediction = d$calibrated, truth = d$y)
## [1] 12.13685
A razão pela qual o modelo logístico original não pôde fazer as previsões calibradas é: as previsões calibradas não são uma função linear das variáveis explicativas no espaço do link.
Relacionados
[ad_2]