library(corrplot)
library(reshape2)
library(ggplot2)
library(caret)
## Loading required package: lattice
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
vol: volume do câncer
weight: peso do paciente
age: idade do paciente
bph: hiperplasia prostática benigna
svi: invasão das vesículas seminais
cp: penetração capsular
gleason: escore Gleason
pgg45: percentagem escore Gleason 4 ou 5
psa: antígeno específico da próstata (esta é a variável resposta).
prostate.data <- read.delim("~/Dropbox/UFCG/AD2/M3/prostate.data.txt")
summary(prostate.data)
## X lcavol lweight age
## Min. : 1 Min. :-1.3471 Min. :2.375 Min. :41.00
## 1st Qu.:25 1st Qu.: 0.5128 1st Qu.:3.376 1st Qu.:60.00
## Median :49 Median : 1.4469 Median :3.623 Median :65.00
## Mean :49 Mean : 1.3500 Mean :3.629 Mean :63.87
## 3rd Qu.:73 3rd Qu.: 2.1270 3rd Qu.:3.876 3rd Qu.:68.00
## Max. :97 Max. : 3.8210 Max. :4.780 Max. :79.00
## lbph svi lcp gleason
## Min. :-1.3863 Min. :0.0000 Min. :-1.3863 Min. :6.000
## 1st Qu.:-1.3863 1st Qu.:0.0000 1st Qu.:-1.3863 1st Qu.:6.000
## Median : 0.3001 Median :0.0000 Median :-0.7985 Median :7.000
## Mean : 0.1004 Mean :0.2165 Mean :-0.1794 Mean :6.753
## 3rd Qu.: 1.5581 3rd Qu.:0.0000 3rd Qu.: 1.1787 3rd Qu.:7.000
## Max. : 2.3263 Max. :1.0000 Max. : 2.9042 Max. :9.000
## pgg45 lpsa train
## Min. : 0.00 Min. :-0.4308 Mode :logical
## 1st Qu.: 0.00 1st Qu.: 1.7317 FALSE:30
## Median : 15.00 Median : 2.5915 TRUE :67
## Mean : 24.38 Mean : 2.4784 NA's :0
## 3rd Qu.: 40.00 3rd Qu.: 3.0564
## Max. :100.00 Max. : 5.5829
No gráfico abaixo é apresentado as distribuições das variáveis onde no eixo x representa o valor correspondente da variável e no eixo y a quantidade daquele determinado valor que apareceu nos dados. Min: Menor valor da varíavel
1st Qu. Valor referente ao maior valor dos 25% menores valores
Median Valor que está no centro dos valores, ou seja, a quantidade de items com valores superiores a Median é igual ao número de items com valores inferiores a Median.
Mean Média dos valores
3rd Qu Valor referente ao menor valor dos 25% maiores valores.
Max Valor máximo
df <- melt(prostate.data)
## Using train as id variables
ggplot(df,aes(x = value)) +
facet_wrap(~variable, scales = "free_x") +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Como é possível observar, algumas variáveis apresentam uma distribuição normal, ou seja, existe um equilíbrio entre os menores valores e os maiores valores. Algumas variáveis tem um intervalo de valores muito pequeno como é o caso das variáveis gleason e svi.
Primeiramente eu pensei em realizar uma normalização dos dados, mas acredito que tal processo não melhoraria os resultados de forma significativa.
No gráfico abaixo podemos ver a correlação entre diversas variáveis, em outras palavras o qual similar são tais varíaveis. Por exemplo, a variável gleason tem um comportamento muito parecido com a variável pgg45.
M <- cor(prostate.data)
corrplot(M,type="lower")
Se elas têm comportamento parecido então só precisamos de apenas uma das duas. O mesmo ocorre com as variáveis lcp e lcavol, e lcp e svi.
A pergunta que fica é: Qual das duas devo eliminar? Eu optei pela variável que tem menor correlação com a variável resposta, ou seja a variável que queremos prever.
Como podemos ver nos gráficos seguintes, há uma comparação com todos os dados e após a remoção das varíaveis lcp e gleason Abaixo temos o sumário de uma regressão linear que de forma geral é um método estatístico para prever valores de uma varíavel a partir do processamento de outras variáveis.
train <- prostate.data[prostate.data$train==TRUE,]
test <- prostate.data[prostate.data$train==FALSE,]
modeloA <- lm(lpsa ~ lcavol
+ lweight
+ age
+ lbph
+ svi
+ pgg45
+ lcp
+ gleason,data = train)
summary(modeloA)
##
## Call:
## lm(formula = lpsa ~ lcavol + lweight + age + lbph + svi + pgg45 +
## lcp + gleason, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.64870 -0.34147 -0.05424 0.44941 1.48675
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.429170 1.553588 0.276 0.78334
## lcavol 0.576543 0.107438 5.366 1.47e-06 ***
## lweight 0.614020 0.223216 2.751 0.00792 **
## age -0.019001 0.013612 -1.396 0.16806
## lbph 0.144848 0.070457 2.056 0.04431 *
## svi 0.737209 0.298555 2.469 0.01651 *
## pgg45 0.009465 0.005447 1.738 0.08755 .
## lcp -0.206324 0.110516 -1.867 0.06697 .
## gleason -0.029503 0.201136 -0.147 0.88389
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7123 on 58 degrees of freedom
## Multiple R-squared: 0.6944, Adjusted R-squared: 0.6522
## F-statistic: 16.47 on 8 and 58 DF, p-value: 2.042e-12
predictions <- predict(modeloA,test)
axisRange = extendrange(c(test$lpsa,predictions))
plot(test$lpsa,predictions,main="Todas as Variaveis")
abline(0,1,col="blue",lty=2,lwd=2)
Abaixo podemos observar o erro residual, ou seja o qual as predições se afastam do valor real.
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.722 0.505
modeloB <- lm(lpsa ~ lcavol
+ lweight
+ age
+ lbph
+ svi
+ pgg45,data = train)
summary(modeloB)
##
## Call:
## lm(formula = lpsa ~ lcavol + lweight + age + lbph + svi + pgg45,
## data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.79922 -0.30470 -0.05402 0.41301 1.45256
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.428057 1.042469 0.411 0.68281
## lcavol 0.488440 0.096658 5.053 4.35e-06 ***
## lweight 0.613739 0.223090 2.751 0.00784 **
## age -0.017273 0.013323 -1.296 0.19979
## lbph 0.154229 0.071066 2.170 0.03396 *
## svi 0.553158 0.282538 1.958 0.05491 .
## pgg45 0.005358 0.003702 1.447 0.15306
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7211 on 60 degrees of freedom
## Multiple R-squared: 0.676, Adjusted R-squared: 0.6436
## F-statistic: 20.86 on 6 and 60 DF, p-value: 4.845e-13
predictions <- predict(modeloB,test)
axisRange = extendrange(c(test$lpsa,predictions))
plot(test$lpsa,predictions,main="Apos exclusao de gleason e lcp")
abline(0,1,col="blue",lty=2,lwd=2)
Podemos observar que o erro residual diminuição em relação ao nosso modelo anterior.
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.678 0.561
Por fim, utilizando a técnica Stepwise chegamos ao nosso modelo final
modeloC <- lm(lpsa ~ lcavol
+ lweight
+ svi,data = train)
summary(modeloC)
##
## Call:
## lm(formula = lpsa ~ lcavol + lweight + svi, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.69494 -0.46058 -0.04485 0.49149 1.68289
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.02278 0.71296 -1.435 0.156362
## lcavol 0.51999 0.09442 5.507 7.16e-07 ***
## lweight 0.73680 0.20155 3.656 0.000525 ***
## svi 0.53790 0.27093 1.985 0.051458 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7444 on 63 degrees of freedom
## Multiple R-squared: 0.6374, Adjusted R-squared: 0.6202
## F-statistic: 36.92 on 3 and 63 DF, p-value: 6.81e-14
predictions <- predict(modeloC,test)
axisRange = extendrange(c(test$lpsa,predictions))
plot(test$lpsa,predictions)
abline(0,1,col="blue",lty=2,lwd=2)
Uma outra forma de ver este gráfico pode ser visto abaixo
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
ggplot(lm_prediction, aes(x=obs, y=predictions)) +
geom_point(shape=1) +
geom_smooth()
Podemos observar que existe um “buraco” nos dados devido aos outilers o que acaba acarretando um intervalo de confiança muito alto.
Erro do nosso modelo final, a qual tem o menor RMSE
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.633 0.627
Na tabela da Anova abaixo podemos observar que a variável lcavol têm grande importância na explicação da variação dos dados.
anova(modeloC)
## Analysis of Variance Table
##
## Response: lpsa
## Df Sum Sq Mean Sq F value Pr(>F)
## lcavol 1 51.753 51.753 93.4013 4.664e-14 ***
## lweight 1 7.437 7.437 13.4215 0.0005117 ***
## svi 1 2.184 2.184 3.9418 0.0514583 .
## Residuals 63 34.908 0.554
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Sim,como foi possível observar nos gráficos acima, o hiperlano se ajusta muito bem aos dados de teste e o erro é eplicação da variação dos dados é significativa
A relação é consideravalmente alta devido a baixa taxa de erro residual. Além disso, é possível analisar visualmente esta forte relação
A variável que mais parece contribuir com a predição é a lcavol responsável por exiplicar mais de 51% da variação. Além disso foi a que apresentou melhor correlação com a varíavel destino
Sim. O hiperlano se ajusta consideravelmente bem aos dados. No entanto, temos dois outliers que não podem ser explicados pelo modelo.Caso tivessémos uma quantidade considerável de outilers em relação ao modelo poderíamos considerar que o modelo de regressão linear não seria aplicável,
train <- prostate.data[prostate.data$train==TRUE,]
test <- prostate.data[prostate.data$train==FALSE,]
As vezes quando temos uma quantidade de variáveis preditoras muito grande utilizar os métodos como forward e stepwised pode não ser a melhor alternativa. A técnica leaps and bounds fornece uma estratégia eficiente para encontrar o menor subconjunto de variáveis preditoras que oferecem o menor RSS.
Esta estratégia é bastante útil para enfrentar o problema do trade-off de bias e variância. Se aumentarmos a complexidade de nosso modelo, aumento do número de variáveis, o bias diminui, mas a variância aumenta. Por outra lado, se diminuirmos a complexidade de nosso modelo a variância diminui, mas o bias aumenta.
library(leaps)
predictors <- train[,2:8]
response <- train$lpsa
leaps.prostate <- leaps(predictors,response)
lm_prediction <- data.frame(size = leaps.prostate$size,mallows_cp = leaps.prostate$Cp)
ggplot(lm_prediction, aes(x=size,y=mallows_cp)) +
geom_point(shape=1) +
geom_smooth()
No gráfico acima cada ponto representa um modelo de regressão treinando com um número K de variáveis preditoras e no eixo y o coeficiente Mallows. No problema anterior foi utilizado a técnica stepwise com 3 variáveis. Acima podemos vemos que 4 variáveis seria o ideal.
Utilizando a métrica BIC O código abaixo utiliza a mesma técnica executada acima. No entanto, utiliza uma métrica diferente.
leaps.prostate <- leaps(predictors,response)
subsets <- regsubsets(lpsa ~ lcavol
+ lweight
+ age
+ lbph
+ svi
+ pgg45
+ lcp
+ gleason,data = train)
plot(subsets)
Cada linha do gráfico acima representa um modelo. Como podemos ver que os melhores modelos, segundo a métrica BIC, usam as variáveis lcavol,lweight,lbph e svi em 3 combinações diferentes. Pode perceber que a medida que a quantidade de variáveis aumenta a métrica BIC começa a decair.
Aplicando Cross Validation
Cross validation é uma técnica utilizada para evitar overfitting do treino, ou seja, enviesamento do algoritmo em relação aos dados de treino. Os dados são divididos em pastas. Uma certa porcentagem de pastas são separadas para teste e a outra parte para treino. Este processo é repetido n vezes, sendo n o número de pastas.
fitControl <- trainControl(method='cv', number = 10)
Assim como a técnica Leaps and Bounds, o lasso é um method utilizado para tratar overfitting.
lasso.fit <- train(train$lpsa ~ ., data=select(train,lcavol,lweight,pgg45,age,lbph,svi,lcp,gleason),
method='lasso',
metric="RMSE",
tuneLength = 10,
trControl=fitControl)
## Loading required package: elasticnet
## Loading required package: lars
## Loaded lars 1.2
Como podemos observar, a medida que eu vou aumentando x o RSME decresce
Plot do Lasso
plot(lasso.fit)
Valores Estimados
lasso.fit
## The lasso
##
## 67 samples
## 7 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 60, 61, 60, 61, 62, 60, ...
## Resampling results across tuning parameters:
##
## fraction RMSE Rsquared RMSE SD Rsquared SD
## 0.1000000 1.0085605 0.5010286 0.2383444 0.3456143
## 0.1888889 0.9186511 0.5029287 0.1822082 0.3468288
## 0.2777778 0.8582974 0.5207140 0.1609315 0.3415239
## 0.3666667 0.8170487 0.5314787 0.1460253 0.3415542
## 0.4555556 0.7858215 0.5484902 0.1414614 0.3463855
## 0.5444444 0.7642861 0.5668594 0.1495999 0.3434472
## 0.6333333 0.7690069 0.5747485 0.1601749 0.3423148
## 0.7222222 0.7654422 0.5837152 0.1656417 0.3409328
## 0.8111111 0.7636216 0.5905823 0.1703462 0.3385785
## 0.9000000 0.7620444 0.5950673 0.1762522 0.3365696
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was fraction = 0.9.
lasso_prediction <- predict(lasso.fit, select(test,lcavol,lweight,pgg45,age,lbph,svi,lcp,gleason))
lasso_prediction <- data.frame(pred = lasso_prediction, obs = test$lpsa)
round(defaultSummary(lasso_prediction), digits = 3)
## RMSE Rsquared
## 0.706 0.527
Uma outra forma de tratar o overfitting é usando a técnica Ridge.
A técnica Ridge penaliza coeficientes (com execeção do intercept) que têm peso muito alto utilizando a soma dos quadrados dos parâmetros, uma vez que coeficientes com peso muito alto pode prejudicar a generalização.Assim como no Lasso, este algoritmo utiliza um valor lambda a qual é setado automaticamente no código abaixo.
library(genridge)
## Loading required package: car
ridge.fit <- lm(lpsa ~ lcavol
+ lweight
+ age
+ lbph
+ svi
+ pgg45
+ lcp
+ gleason,data = train)
y <- train$lpsa
X0 <- model.matrix(ridge.fit)[,-1]
lambda <- seq(0.001, 100, .01)
aridge0 <- ridge(y, X0, lambda=lambda)
traceplot(aridge0)
traceplot(aridge0, X="df")
Como podemos ver nos dois gráficos acima, conforme a constante de ridge diminui a importância das variáveis aumentam.
Resultados Ridge
Abaixo o gráfico que mostra o desempenho do Ridge utilizando Cross Validation
ridge.fit <- train(lpsa ~ lcavol
+ lweight
+ age
+ lbph
+ svi
+ pgg45
+ lcp
+ gleason,data = train,
method='ridge',
metric="RMSE",
tuneLength = 10,
trControl=fitControl)
plot(ridge.fit)
Como podemos observar no gráfico acima. Conforme o peso dos coeficientes diminuem o RSME também. No entanto, existe um ponto que ocorre um aumento repentido do RSME.
Abaixo podemos ver este comportamento em números
ridge.fit
## Ridge Regression
##
## 67 samples
## 10 predictors
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 60, 60, 61, 60, 61, 59, ...
## Resampling results across tuning parameters:
##
## lambda RMSE Rsquared RMSE SD Rsquared SD
## 0.0000000000 0.7357177 0.6928691 0.1338084 0.2686691
## 0.0001000000 0.7357211 0.6928720 0.1338309 0.2686627
## 0.0002371374 0.7357259 0.6928759 0.1338617 0.2686538
## 0.0005623413 0.7357374 0.6928850 0.1339352 0.2686328
## 0.0013335214 0.7357658 0.6929053 0.1341106 0.2685833
## 0.0031622777 0.7358398 0.6929472 0.1345333 0.2684675
## 0.0074989421 0.7360491 0.6930131 0.1355699 0.2682002
## 0.0177827941 0.7367020 0.6930093 0.1381850 0.2675990
## 0.0421696503 0.7388165 0.6923669 0.1449237 0.2662837
## 0.1000000000 0.7450813 0.6892072 0.1616652 0.2634503
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was lambda = 0.
obs: Uma vez que as técnicas acima obtem as amostras de forma randômica os resultados podem variar.
Como podemos observar o RSME utilizando ridge apresentou um resultado bem próximo do lasso.
ridge_prediction <- predict(ridge.fit,test[,2:9])
ridge_prediction <- data.frame(pred = ridge_prediction, obs = test$lpsa)
round(defaultSummary(ridge_prediction), digits = 3)
## RMSE Rsquared
## 0.722 0.505
train$lcavol2 <- train$lcavol^2
train$lcavol3 <- train$lcavol2^2
train$lweight2 <- train$lweight^2
train$lweight3 <- train$lweight2^2
test$lcavol2 <- test$lcavol^2
test$lcavol3 <- test$lcavol2^2
test$lweight2 <- test$lweight^2
test$lweight3 <- test$lweight2^2
modeloC <- lm(lpsa ~ lcavol + lcavol2 + lcavol3
+lweight + lweight2 + lweight3
+ svi ,data = train)
summary(modeloC)
##
## Call:
## lm(formula = lpsa ~ lcavol + lcavol2 + lcavol3 + lweight + lweight2 +
## lweight3 + svi, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.70323 -0.49863 0.00445 0.57276 1.72961
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.110466 14.345557 0.705 0.4837
## lcavol 0.716329 0.161914 4.424 4.23e-05 ***
## lcavol2 -0.188873 0.121616 -1.553 0.1258
## lcavol3 0.009256 0.007930 1.167 0.2479
## lweight -7.760657 10.801919 -0.718 0.4753
## lweight2 1.808495 2.259543 0.800 0.4267
## lweight3 -0.022964 0.028189 -0.815 0.4185
## svi 0.691851 0.300989 2.299 0.0251 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7473 on 59 degrees of freedom
## Multiple R-squared: 0.6578, Adjusted R-squared: 0.6172
## F-statistic: 16.2 on 7 and 59 DF, p-value: 1.097e-11
predictions <- predict(modeloC,test)
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.647 0.610
Executando o Stepwise manualmente Apos remover as variaveis lweight
modeloC <- lm(lpsa ~ lcavol + lcavol2 + lcavol3
+ svi ,data = train)
summary(modeloC)
##
## Call:
## lm(formula = lpsa ~ lcavol + lcavol2 + lcavol3 + svi, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.7844 -0.5607 0.1426 0.5762 1.7359
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.654371 0.169105 9.783 3.46e-14 ***
## lcavol 0.810491 0.173129 4.681 1.60e-05 ***
## lcavol2 -0.195837 0.130381 -1.502 0.1382
## lcavol3 0.009849 0.008494 1.159 0.2507
## svi 0.698196 0.326254 2.140 0.0363 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8109 on 62 degrees of freedom
## Multiple R-squared: 0.5766, Adjusted R-squared: 0.5492
## F-statistic: 21.11 on 4 and 62 DF, p-value: 5.085e-11
predictions <- predict(modeloC,test)
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.630 0.637
Por fim utilizando o stepwise automaticamente
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
step <- stepAIC(modeloC, direction="both")
## Start: AIC=-23.28
## lpsa ~ lcavol + lcavol2 + lcavol3 + svi
##
## Df Sum of Sq RSS AIC
## - lcavol3 1 0.8840 41.653 -23.8463
## <none> 40.769 -23.2835
## - lcavol2 1 1.4835 42.253 -22.8888
## - svi 1 3.0115 43.781 -20.5087
## - lcavol 1 14.4110 55.180 -5.0041
##
## Step: AIC=-23.85
## lpsa ~ lcavol + lcavol2 + svi
##
## Df Sum of Sq RSS AIC
## - lcavol2 1 0.6595 42.313 -24.7937
## <none> 41.653 -23.8463
## + lcavol3 1 0.8840 40.769 -23.2835
## - svi 1 2.8646 44.518 -21.3900
## - lcavol 1 14.0861 55.739 -6.3287
##
## Step: AIC=-24.79
## lpsa ~ lcavol + svi
##
## Df Sum of Sq RSS AIC
## <none> 42.313 -24.7937
## + lcavol2 1 0.6595 41.653 -23.8463
## - svi 1 2.2160 44.529 -23.3736
## + lcavol3 1 0.0600 42.253 -22.8888
## - lcavol 1 24.1098 66.422 3.4199
summary(step)
##
## Call:
## lm(formula = lpsa ~ lcavol + svi, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.6200 -0.5176 0.1609 0.5256 1.6946
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.5376 0.1456 10.561 1.17e-15 ***
## lcavol 0.6040 0.1000 6.039 8.70e-08 ***
## svi 0.5418 0.2959 1.831 0.0718 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8131 on 64 degrees of freedom
## Multiple R-squared: 0.5605, Adjusted R-squared: 0.5468
## F-statistic: 40.82 on 2 and 64 DF, p-value: 3.747e-12
predictions <- predict(step,test)
lm_prediction <- data.frame(pred = predictions, obs = test$lpsa)
round(defaultSummary(lm_prediction), digits = 3)
## RMSE Rsquared
## 0.621 0.641
O resultado acima apresentou um resultado melhor do que a regressão do problema anterior.
Podemos concluir que as técnicas utilizadas acima apresentam desempenho inferior ao modelo normal e que o modelo polinomial apresenta melhores resultados se utilizados 4 variaveis de predicao. No entanto, apresenta um resultado inferior ao utilizado apenas 2 variáveis.
Vale salientar que a complexidade do último modelo apresentado é menor, logo a variância é menor, mas o bias tende a ser maior. Este resultado acima pode ser devido a um overfitting de teste uma vez que a base de dados é pequena. Uma alternativa seria utilizar dados de validação dos quais não fazem parte nem da base de teste como também de treino