Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Práctica: Desarrollo 1. Crear un dataset artificial balanceado a partir de datos generados aleatoriamente con distribución normal de dimensiones [100,3]. Generar los primeros 50 patrones (perteneciente a la clase 1) con una distribución normal con media=8 y SD=2. Generar los 50 patrones restantes (perteneciente a la clase 0) con una distribución normal con media=11 y SD=2. set.seed(11031880) X1<-c(rnorm(50,8,2),rnorm(50,11,2)) X2<-c(rnorm(50,8,2),rnorm(50,11,2)) clase<-c(rep(1,50),rep(0,50)) 2. Aplicar al dataset el método Hold-Out con un 70% para entrenar y el resto para prueba. set.seed(11031880) indice.test1<-sample(1:50,15) indice.test0<-sample(51:100,15) X1tr<-X1[-c(indice.test1,indice.test0)] X2tr<-X2[-c(indice.test1,indice.test0)] X1test<-X1[c(indice.test1,indice.test0)] X2test<-X2[c(indice.test1,indice.test0)] clase_tr<-clase[-c(indice.test1,indice.test0)] clase_test<-clase[c(indice.test1,indice.test0)] dataset_train_RNA<-data.frame(X1tr,X2tr,clase_tr) dataset_train_SVM<-cbind(X1tr,X2tr,clase_tr) dataset_test<-cbind(X1test,X2test,clase_test) 3. Graficar el dataset de test. Los patrones de la clase 1 con color rojo y los patrones de la clase 0 con azul. Colocar a la gráfica el título “Dataset Test”. Etiquetar los ejes de la gráfica con “X1” y “X2”. Guardar la gráfica en formato PDF con el nombre “Grafica_dataset_test.pdf”. pdf("Grafica_dataset_test.pdf") plot(1:20,1:20,type="n",main='Dataset Test', xlab='X1', ylab='X2') points(dataset_test[1:15,1],dataset_test[1:15,2],col="red") points(dataset_test[16:30,1],dataset_test[16:30,2],col="blue") dev.off() 4. Entrenar 10 veces una red neuronal con el algoritmo Back Propagation, la red debe tener 10 neuronas en la capa oculta, además se debe usar la derivada de la función de error como criterio de parada (la suma de errores cuadráticos) con un umbral igual a 0.01, función de activación logística (logistic) tanto para la capa oculta como para la capa de salida y learning rate =0.001. (En caso de no converger ajuste los parámetros necesarios para asegurar la convergencia). library('neuralnet') red<-neuralnet(clase_tr~X1tr+X2tr,dataset_train_RNA,hidden=10,linear.output = FALSE, act.fct ="logistic", algorithm="backprop",threshold=0.05,learningrate=0.005, rep=10) print(red) Luego de repetir el procedimiento 10 veces, pude observar que el resultado que se daba con mayor frecuencia fue que la red convergía 6 de las 10 veces. 5. Graficar la red aprendida. plot(red,rep="best") Gráfico de la red aprendida 6. Realizar las predicciones sobre el conjunto de prueba. Calcular el error de Clasificación de la red. pred<-compute(red,dataset_test[,-3]) predicciones_RNA<-round(pred$net.result) ErrorC_RNA<-sum(predicciones_RNA!=dataset_test[,3])/length(dataset_test[,3]) ErrorC_RNA 7. Graficar las predicciones obtenidas. Los patrones de la clase 1 con color rojo y los patrones de la clase 0 con azul. Colocar a la gráfica el título “Predicciones RNA”. Etiquetar los ejes de la gráfica con “X1” y “X2”. Guardar la gráfica en formato PDF con el nombre “Grafica_predicciones_RNA.pdf”. pdf("Grafica_Predicciones_RNA.pdf") plot(1:20,1:20,type="n", main='Predicciones RNA', xlab='X1', ylab='X2') points(dataset_test[predicciones_RNA==1,1],dataset_test[predicciones_RNA==1,2],col="r ed") points(dataset_test[predicciones_RNA==0,1],dataset_test[predicciones_RNA==0,2],col="b lue") dev.off() 8. Entrenar una SVM con los mismos patrones de entrenamiento usados para entrenar la RNA del punto 4. library(e1071) ModeloSVM<-svm(dataset_train_SVM[,-3],dataset_train_SVM[,3], type = "C", kernel = “linear”) 9. Realizar las predicciones sobre el mismo conjunto de prueba usado en el punto 6. Calcular el error de clasificación de la SVM. prediccionesSVM<- predict(ModeloSVM,dataset_test[,-3]) ErrorSVM<-sum(prediccionesSVM!= dataset_test[,3])/length(prediccionesSVM) ErrorSVM 10. Graficar las predicciones obtenidas. Los patrones de la clase 1 con color rojo y los patrones de la clase 0 con azul. Colocar a la gráfica el título “Predicciones SVM”. Etiquetar los ejes de la gráfica con “X1” y “X2”. Guardar la gráfica en formato PDF con el nombre “Grafica_predicciones_SVM.pdf”. pdf("Grafica_predicciones_SVM.pdf") plot(1:20,1:20,type="n", main='Predicciones SVM', xlab='X1', ylab='X2') points(dataset_test[prediccionesSVM==1,1],dataset_test[prediccionesSVM==1,2],col="red ") points(dataset_test[prediccionesSVM==0,1],dataset_test[prediccionesSVM==0,2],col="blu e") dev.off() 11. Compare las tres gráficas: “Grafica_predicciones_RNA.pdf”, “Grafica_predicciones_SVM.pdf” y “Grafica_dataset_test.pdf”. Escriba sus conclusiones. Observando las 3 graficas podemos concluir que SVM fue quién predijo de manera más eficiente, aunque en ambos casos, o sea tanto en SVM como Back Propagation necesitaron ajustes de parámetros para minimizar el error. En ambos casos se realizaron 10 experimentos de cada algoritmo, y pudimos observar que SVM es estable, mientras que Back Propagation es altamente inestable, ya que el error variaba de 0.16 a 0.5, siendo 0.5 un error bastante significativo por lo que nos estaría indicando que el algoritmo no aprendió correctamente, y eso nos puede llevar a pensar que este alcanzaba mínimos locales en vez de mínimos globales; en cambio SVM siempre encuentra un mínimo global. No podemos establecer como regla general que el SVM sea mejor que el ANN, ya que en cada problema particular uno será mejor que otro. Otro factor a tener en cuenta, es que SVM no se introduce en la complejidad computacional en la que si se introduce ANN, es por ello que uno demuestra ser estable y el otro inestable respectivamente. SVM posee un tiempo de entrenamiento mucho menor que el de Back Propagation que suele tomar un tiempo demasiado extenso.
Compartir