Está en la página 1de 12

Universidad Externado de Colombia

Machine Learning
Juan Sebastián Rodríguez Garzón

Taller final

1) Genera la respectiva tabla de conceptos conjunta utilizando mínimo 1000


observaciones de cada clase  y utilice un modelo Bagging con separación de
datos  Training/Testing.  Evalúe los resultados obtenidos interpretando la matriz de
confusión y el error total de clasificación. Cuál es el mejor y peor concepto
clasificado? (5 puntos).

Gráfico

El gráfico nos muestra que la variable X50, X10, X30 y X20 son las más
determinantes al momento de realizar la clasificación. Al ser estas la ubicación de
un punto en el plano cartesiano la gráfica nos muestra que cada 10 trazos se
genera una variable de importancia que le da al modelo la información suficiente
para realizar una clasificación.

Matriz de confusión.

bag.classOut bat bird

bat 158 19

bird 42 195
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

El error del modelo fue del 14,73%. El conceto mejor clasificado fue bat con un
error del 10,73% mientras que el de bird fue del 17,72%

2) Pruebe ahora un modelo Random Forests (RF)  con la misma separación de datos
Training/Testing del punto anterior. Evalúe los resultados obtenidos.  Encuentra
evidencia para pasar al modelo RF o se queda con Bagging, recuerde que RF se
aplica cuando m=p

En este caso las variables de importancia fueron muy parecidas al modelo de


bagging en las cuales se destacan: X50, X30, X10 y una nueva que es X80.

La matriz de confusión arrojó los siguientes resultados.

RF.classOut bat bird


bat 162 23
bird 38 191

En este caso observamos un ligero aumento del error que paso a ser del 14,97%.
Esto nos arroja evidencia suficiente para quedarnos con el modelo de bagging ya
que tiene un error más pequeño que el Random Forest.

3. Pruebe ahora un modelo de Boosting con la misma separación de datos


Training/Testing del punto anterior.  Evalúe los resultados obtenidos utilizando los
parámetros distribution="multinomial", n.trees =5000, interaction .depth =1, qué
pasa si aumenta la profundidad del árbol?, serán 5,000 árboles suficientes o un
número excesivo, haga el tunning para encontrar el número de árboles suficientes.
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

Encuentra evidencia para pasar al modelo de Boosting o se quedaría con el RF o


Bagging. (20 puntos). (5 puntos).

Una vez corrido el modelo nos arroja el siguiente resultado.

Lo que nos dice este modelo es que al ser las variables de mayor importancia X40
y X80, el último punto del dibujo es quien nos da el mayor indicio de clasificación
entre bat y bird.

boost.class
bat bird
bat 176 24
bird 39 175

El concepto mejor clasificado fue bat con un error del 12% contra un error del
15,99% de bird. El error general del modelo fue del 15,91%

Tunning.

Despues de realizar el tunnig de forma manual se observo que disminuyendo el


número de árboles no se reflejaba una mejora en la disminución del error. Sin
embargo, cuando aumentamos la profundidad si hay una evidente disminución del
error. La mejor combinación fue utilizar 5000 árboles con una profundidad de 3

A continuación la matriz de confusión:


Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

bat bird
bat 172 28
bird 26 188

El error del modelo fue de 13,04%, una disminución con respecto a sus
parámetros originales y además un mejor que modelo que el random forest y el
bagging.

4. Pruebe ahora un modelo de SVM Con kernel lineal, Polinomial grado 2 y 3  y


radial. con la misma separación de datos Training/Testing del punto anterior. 
Realice tunning de parámetros. Evalúe los resultados obtenidos.  Encuentra
evidencia para pasar al modelo de SVM o se quedaría con los modelos de
ensamble. (5 puntos).

El modelo de kernel lineal nos arrojó los siguientes resultados:

KernelLpredict
bat bird
bat 168 32
bird 74 140

El concepto mejor clasificado fue bat con un error del 16%, diferente de bird que
tuvo un error alto del 34%

El error general del modelo fue del 25%

El tunning del kernel lineal nos arrojo que el costo óptimo era:

Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 5

Number of Support Vectors: 1233

Una vez utilizando el costo 5 los resultados fueron los siguientes:

KernelLpredict
bat bird
bat 54 146
bird 118 96

Sin embargo, el modelo que nos sugirió el tunning aumentó el error al 68%.
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

Kernel polinómico.

En este caso primero haremos el tunnning que nos arroje los mejores parámetros
para correr el modelo:

Parameter tuning of ‘svm’:

- sampling method: 10-fold cross validation

- best parameters:
cost degree
3 3

- best performance: 0.2402317

Por lo tanto, se procedió a correr el modelo con estos parámetros y se vio lo


siguiente:

svmpoli.predict
bat bird
bat 181 19
bird 72 142

El concepto mejor calificado fue bat y el error del modelo fue del 24%. Con este
resultado nos seguimos quedando con el modelo boosting,

Kernel radial.

En kernel radial tuvo varios porblemas de clasificación ya que clasificaba


perfectamente un concepto y el otro no era capaz de clasificarlo como lo vemos en
la matriz de confusión:

svmRadial.predict
bat bird
bat 200 0
bird 214 0

En este caso no pudo clasificar el concepto bird en ninguna oportunidad.

5. Pruebe ahora un modelo de Redes Neuronales con la misma separación de datos


Training/Testing del punto anterior.  Evalúe los resultados obtenidos. Qué sucede
si aumenta el número de capas y neuronas?.  Encuentra evidencia para pasar al
modelo de Redes Neuronales o se quedaría con los modelos de Ensamble y SVM,
que puede decir de la interpretabilidad de este modelo comparado con los
anteriores. (10 puntos).
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

Redes neuronales

El modelo de redes nos arrojó el siguiente resultado utilizando 3 capas:

Predicted
truth bat bird
bat 162 38
bird 102 112
En este caso vemos que el error fue de 33% y tuvo problemas en clasificar el
concepto bird, al aumentar a 4 capas observamos el siguiente resultado:

Predicted
truth bat bird
bat 81 119
bird 56 158
Obsevamos que al aumentar las capas el error aumenta con ellas para este
modelo.

Con 5 capas, aunque disminuye el error, sigue siendo mayor a las 3 capas
originales:

Predicted
truth bat bird
bat 173 27
bird 124 90

En conclusión el mejor modelo de clasificación fue boosting ya que presentó el menor


error de todos los modelos. (13%)

6. Repita los pasos 1-5  agregando 3 conceptos simples adicionales de tal forma que
repita los pasos descritos con 5 conceptos, obtiene los mismos resultados?
comparando con los resultados del taller anterior que modelo elegiría, su elección
es en función del desempeño o de la interpretabilidad?  (20 puntos).

Se añaden los siguientes 3 conceptos:


Basseball bat
Axe
Burguer

Comenzando con el modelo de bagging observamos que la matriz arrojó los


siguientes resultados
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

bag.classOut axe baseballbat bat bird hamburger


axe 159 14 11 12 3
baseballbat 11 144 8 9 2
bat 7 3 140 17 4
bird 28 16 41 163 6
hamburger 3 3 5 7 179

El concepto mejor clasificado fue la hamburguesa con un error del 10%. En cuanto
al error general del modelo se obtuvo un 21,10%

Random forest:

F.classOut axe baseballbat bat bird hamburger


axe 172 17 9 10 3
baseballbat 7 144 10 7 3
bat 5 1 141 28 4
bird 24 16 43 155 6
hamburger 0 2 2 8 178

Nuevamente el concepto mejor clasificado fue la hamburguesa con un error de


solamente el 6%. En cuanto al error de todo el modelo se tuvo una reducción del
1% con respecto al baggin con un 20,6% de error. Al añadir mas conceptos se
observa que tanto en el bagging como en el random forest hubo un aumento del
error con los modelos anteriores que solo clasificaban 2 conceptos.

Boosting

axe baseballbat bat bird hamburger


axe 169 12 10 16 1
baseballbat 14 147 4 11 4
bat 8 7 153 35 2
bird 14 12 28 153 1
hamburger 3 2 4 8 177

Nuevamente el concepto mejor clasificado fue la hamburguesa con un error del


7%, y para el modelo en general obtuvimos una disminución con respecto a los 2
modelos anteriores con 19,69% de error.

Hasta el momento se ha demostrado que los modelos de esamble vertical tienen


un mejor compartamiento al momento de realizar la clasificación de esta data.
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

Modelo de kernel lineal

El modelo lineal alcanzaba el número máximo de interacciones y no arrojaba


resultados concluyentes. Por lo tanto, no se pudo testear.

Modelo de kernel polinómico

Axe baseballbat bat bird hamburger


axe 114 15 35 38 5
baseballbat 15 141 26 18 6
bat 1 7 158 43 1
bird 3 9 43 142 0
hamburger 4 6 12 20 169

El concepto mejor calificado fue hamburguesa con un error del 20%, mientras que
el error general del modelo fue cercano al 30%, no hubo una mejoría con respecto
a el modelo de boosting

Modelo de kernel radial

svmRadial.predict
axe baseballbat bat bird hamburger
axe 0 0 0 207 0
baseballbat 0 1 0 205 0
bat 0 0 36 174 0
bird 0 0 1 196 0
hamburger 0 0 0 211 0

Nuevamente observamos que el modelo de kernel radial no es un modelo óptimo


para este tipo de datos ya que solamento pudo clasificar un elemento bien y el
resto lo asocio con este mismo elemento.

Redes neuronales

Con las redes neuronales el modelo tuvo problemas ya que presentó un error
bastante alto, del 74% respectivamente. Los resultados fueron los siguientes:

Predicted
truth axe bat bird hamburger
axe 57 145 1 4
baseballbat 15 191 0 0
bat 9 201 0 0
bird 9 187 0 1
hamburger 16 195 0 0
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

El modelo no fue capaz de incluir uno de los conceptos de predicción lo que hace
que sea descartado.

En conclusión el mejor modelo tanto para los 2 conceptos como para los 5 conceptos fue
el modelo de boosting. Esto nos demuestra que este modelo de ensamble vertical es
bueno para realizar clasificaciones ya que va aprendiendo de los errores anteriores de
clasificación y asi puede ir realizando una mejor clasificación a medida que va avanzando
el modelo.

Código:
library(MASS)
library(splines)
library(neuralnet)
library(ISLR)
library(nnet)
library(e1071)
library(ggplot2)
library(dplyr)
library(reshape2)
library(Matrix)
library(RColorBrewer)
library(GGally)
install.packages("GGally")
library(ggplot2)
library(caret)
install.packages("glmnet")
library(glmnet)
library(boot)
install.packages("verification")
library(verification)
library(lattice)
install.packages("randomForest")
library(randomForest)
install.packages('gbm')
library(gbm)
install.packages('e1071')
library(e1071)

maxNumSketch=1000
numPoints=10
numTrazos=4
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

con <- list()

con[[1]] <- file('full_simplified_bat.ndjson','r')


con[[2]] <- file('full_simplified_bird.ndjson', 'r')
con[[3]] <- file('full_simplified_baseball bat.ndjson', 'r')
con[[4]] <- file('full_simplified_hamburger.ndjson', 'r')
con[[5]] <- file('full_simplified_axe.ndjson', 'r')

listData=dataImportada(con,maxNumSketch)
dataFrame=data.frame(listData$data)
dataFrame$class=as.factor(listData$clases)

#Bagging

training_sample = sample(c(TRUE,FALSE),nrow(dataFrame),
replace = T,prob = c(0.8,0.2))
train=dataFrame[training_sample,]
test=dataFrame[!training_sample,]

set.seed(100)

bag.data=randomForest(class~.,data=train,mtry=80,importance=TRUE,ntree=5000
)
varImpPlot(bag.data)
bag.data
bag.classOut=predict(bag.data,newdata=test)
bag.classOut
bag.prob=predict(bag.data,newdata=test,type='prob')
table(bag.classOut,test$class)
errorBag=mean(test$class!=bag.classOut)
errorBag

#Random Forest
training_sample = sample(c(TRUE,FALSE),nrow(dataFrame),
replace = T,prob = c(0.8,0.2))
train=dataFrame[training_sample,]
test=dataFrame[!training_sample,]

set.seed(100)
sqrt(80)
RF.data=randomForest(class~.,data=train,mtry=8.94,importance=TRUE,ntree=500
0)
varImpPlot(RF.data)
RF.data
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

RF.classOut=predict(RF.data,newdata=test)
RF.prob=predict(RF.data,newdata=test,type='prob')
table(RF.classOut,test$class)
errorRF=mean(test$class!=RF.classOut)
errorRF

#Boosting
boost.Data=gbm(class~.,
data=train,
n.trees=5000,
distribution = 'multinomial',
interaction.depth = 3,
verbose=TRUE)
summary(boost.Data)
boost.prob=predict(boost.Data,newdata=test,n.trees=500,type='response')
boost.class=levels(dataFrame$class)[apply(boost.prob,1,which.max)]
tableBoosting=table(test$class,boost.class)
tableBoosting
errorBoost=mean(test$class!=boost.class)
errorBoost
tableBoosting

Boosttun <- tune(gbm, class~.,data = train, distribution = 'gaussian', ranges =


list(n.trees = c(1000 , 2000, 3000, 4000, 5000), interaction.deph = c(1,2,3) ))

#Modelo de kernel lineal


set.seed(20)
svm.fit <- svm(class~.,data = train, kernel = "linear", cost =5, scale = FALSE)

KernelLpredict <- predict(svm.fit, newdata = test, decision.values = FALSE)

TablekernelL <- table(test$class, KernelLpredict)


TablekernelL
svm.fit$index
tune.out <- tune(svm, class~., data = dataFrame, kernel = "linear", ranges =
list(cost = c(0.1,0.001,1,5,2,5,6.15)))
tune.out$best.model

tune.out$performances

errorSMV=mean(test$class!=KernelLpredict)
errorSMV

32/(168+32)
74/(74+140)

#Kernel polinomico

svmPoly.fit=svm(class~.,data=train,kernel='polynomial',degree=3,cost=3)
Universidad Externado de Colombia
Machine Learning
Juan Sebastián Rodríguez Garzón

svmPoly.fit
svmpoli.predict=predict(svmPoly.fit,newdata= test, decision.values = FALSE)

matrixConfusion=table(test$class,svmpoli.predict)
matrixConfusion

svmpoli.predict

error.poli <- mean(test$class! = svmpoli.predict)

#tuning

tune.out=tune(svm,class~.,data=train,kernel='polynomial',
ranges=list(cost=c(0.01,0.1,1,2,3,4,5,6,7),
degree=c(2,3,4)))
summary(tune.out)

#Kernel Radial

svmRadial.fit=svm(class~.,data=train,kernel='radial',gamma=1,cost=1)

svmRadial.predict=predict(svmRadial.fit,newdata= test)
matrixConfusion=table(test$class,svmRadial.predict)
matrixConfusion

#Redes neuronales

net.fit=neuralnet(class~., train, hidden = c(5),lifesign = "full",


linear.output = FALSE, threshold = 0.001,stepmax= 1e+05)
plot(net.fit)
net.prob = predict(net.fit, newdata = test)
net.class= levels(dataFrame$class)[apply(net.prob,1,which.max)]
tablaredes <- table(test$class, net.class, dnn = c("truth", "Predicted"))
tablaredes
errornet <- mean(test$class !=net.class)
errornet

También podría gustarte