Vamos gerar nosso dataset com 2 variáveis independentes (X e Z)
In [15]:
set.seed(42)
X = seq(from = 1.5, to = 3.0, length.out = 100)
set.seed(42)
Y <- unlist(lapply(X, function(x) {x^4 + runif(1)*6.5}))
set.seed(42)
Z <- unlist(lapply(X*Y, function(x) {x + runif(1)*3.2}))
In [18]:
#install.packages('scatterplot3d')
library(scatterplot3d)
In [19]:
scatterplot3d(X, Y, Z, highlight.3d=TRUE, col.axis="blue",
col.grid="lightblue", main="Dados", pch=20)
Train/Test split Precisamos dividir nossos dados em dados de treino e de teste:
In [37]:
set.seed(42)
indices_x <- sample.int(n = length(X), size = floor(.75*length(X)), replace = FALSE)
x_treino <- X[indices_x]
x_teste <- X[-indices_x]
set.seed(42)
indices_y <- sample.int(n = length(Y), size = floor(.75*length(Y)), replace = FALSE)
y_treino <- Y[indices_y]
y_teste <- Y[-indices_y]
In [36]:
plot(x_treino,y_treino)
In [45]:
library(rpart)
In [82]:
df_treino <- data.frame(x = x_treino, y = y_treino)
y <- df_treino$y
x <- df_treino$x
modelo <- rpart(y ~ x, method = "anova")
summary(modelo)
In [68]:
print(modelo)
In [69]:
rsq.rpart(modelo)
In [70]:
printcp(modelo)
In [71]:
plotcp(modelo)
In [72]:
plot(modelo, uniform=TRUE,
main="Árvore gerada")
text(modelo, use.n=TRUE, all=TRUE, cex=.8)
In [73]:
min.xerror <- modelo$cptable[which.min(modelo$cptable[,"xerror"]),"CP"]
min.xerror
In [74]:
modelo_podado <- prune(modelo,cp = min.xerror)
plot(modelo_podado, uniform=TRUE,
main="Árvore podada")
text(modelo_podado, use.n=TRUE, all=TRUE, cex=.8)
Nossa árvore já está do tamanho correto, logo, não é necessário podar
In [83]:
df_teste <- data.frame(x = x_teste, y = y_teste)
y <- df_teste$y
x <- df_teste$x
predicoes <- predict(modelo, newdata = df_teste)
In [85]:
predicoes
In [65]:
str(x_teste)
In [92]:
plot(x_treino,y_treino)
lines(x_teste,predicoes,col=2,lwd=3,type="b")
Como vemos, nossas predições, utilizando os dados de teste, estão seguindo a curva original da amostra.
In [93]:
set.seed(42)
indices_x <- sample.int(n = length(X), size = floor(.75*length(X)), replace = FALSE)
x_treino <- X[indices_x]
x_teste <- X[-indices_x]
set.seed(42)
indices_y <- sample.int(n = length(Y), size = floor(.75*length(Y)), replace = FALSE)
y_treino <- Y[indices_y]
y_teste <- Y[-indices_y]
set.seed(42)
indices_z <- sample.int(n = length(Z), size = floor(.75*length(Z)), replace = FALSE)
z_treino <- Z[indices_z]
z_teste <- Z[-indices_z]
In [94]:
df_treino <- data.frame(x = x_treino, y = y_treino, z = z_treino)
y <- df_treino$y
x <- df_treino$x
z <- df_treino$z
modelo <- rpart(y ~ x + z, method = "anova")
summary(modelo)
In [95]:
df_teste <- data.frame(x = x_teste, y = y_teste, z = z_teste)
y <- df_teste$y
x <- df_teste$x
z <- df_teste$z
predicoes <- predict(modelo, newdata = df_teste)
In [96]:
predicoes
In [118]:
plot1 <- scatterplot3d(X, Y, Z, highlight.3d=TRUE, col.axis="blue",
col.grid="lightblue", main="Dados", pch=20)
plot1$points3d(df_teste$x, predicoes, df_teste$z, col = 4, pch=13, cex=3)
Os pontos marcados com um alvo em azul, são nossas predições. Note que, no geral, acertamos bastante.
In [ ]: