Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.03 KB | None | 0 0
  1. ############################################################
  2. #
  3. # MBD - Clustering supervisado (I)
  4. #
  5. ############################################################
  6.  
  7. ############################################################
  8. #
  9. # KNN
  10. #
  11. ############################################################
  12.  
  13. ############################################################
  14. # Variables
  15. ############################################################
  16. # Datos de clientes de una companyia telefonica
  17. # age: edad
  18. # annualincome: ingresos anuales
  19. # calldroprate: tasa de llamadas perdidas
  20. # callfailurerate: tasa de llamadas cortadas
  21. # callingnum: numero de telefono
  22. # customerid: identificador del cliente
  23. # customersuspended:
  24. # education: formacion educativa
  25. # gender: sexo
  26. # homeowner: propietario de vivienda
  27. # maritalstatus: estado civil
  28. # monthlybilledamount: factura mensual
  29. # noadditionallines: ?
  30. # numberofcomplaints: numero de quejas
  31. # numberofmonthunpaid: numero de meses sin pagar
  32. # numdayscontractequipmentplanexpiring: numero de dias para expirar el contrato
  33. # occupation: ocupacion
  34. # penaltytoswitch: penalizacion por cambio de linea
  35. # state: estado de USA
  36. # totalminsusedinlastmonth: minutos en ultimo mes
  37. # unpaidbalance: balance de impagos
  38. # usesinternetservice: servicio de internet contratado
  39. # usesvoiceservice: servicio de voz contratado
  40. # percentagecalloutsidenetwork
  41. # totalcallduration: duracion total de las llamadas
  42. # avgcallduration: duracion media de las llamadas
  43. # churn: baja del cliente
  44. # year: anyo
  45. # month: mes
  46.  
  47. rm(list=ls())
  48.  
  49. ############################################################
  50. # Cargar paquetes
  51. ############################################################
  52. # install.packages('class')
  53. # install.packages('deldir')
  54. # install.packages('kknn')
  55. library(deldir)
  56. library(kknn)
  57. library(class)
  58.  
  59. ############################################################
  60. # Leer e inspeccionar los datos
  61. ############################################################
  62.  
  63. d0 <- read.table('edw.csv',header=TRUE,sep=',')
  64. dim(d0)
  65. #20468 clientes y 29 variables
  66. summary(d0)
  67. #Mirar categoricas y numericas. La educacion hay 2 opciones, crear 3 variables dummy que valdria 0, 1, 2 o 3
  68. #en funcion de si son de bachelor or equivalent, etc. Haciendo esto estamos valorando de que de un estudio a otro
  69. #hay la misma diferencia de dificultad.
  70.  
  71. ############################################################
  72. # Eliminar variables irrelevantes y transformar algunas
  73. ############################################################
  74. var.rm <- c('customerid','noadditionallines','state','year','month','callingnum')
  75. d <- d0[,-which(names(d0) %in% var.rm)]
  76. #eliminamos variables como año (siempre 2015), numero de telefono ya que no da info, etc.
  77.  
  78. d$education <- relevel(d$education,'High School or below')
  79. #pone la categoria de referencia la mas bajas de todas, de esta forma al transformarla en niveles te cogera
  80. #high school como la mas pequeña. En este caso solo estaba high school desordenada. Si no fuese asi habria que
  81. #indicarle el orden con factor(d$education, levels c('High school,...,))
  82.  
  83. d$occupationTech <- ifelse(d$occupation=='Technology Related Job',1,0)
  84. #la tranformamos en 2 dummies. 1 o 0
  85.  
  86. d$occupationNonTech <- ifelse(d$occupation=='Non-technology Related Job',1,0)
  87. d$occupation <- NULL
  88. d <- d[,names(d)[c(1:21,23,24,22)]] # Poner la variable respuesta la ultima (Cuestion totalmente estetica!!!)
  89.  
  90. ############################################################
  91. # Tranformar todas las variables en numericas
  92. ############################################################
  93. for (i in 1:ncol(d)) d[,i] <- as.numeric(d[,i])
  94. #De esta forma las categoricas que se han transformado en dummies se transforman en numericas
  95.  
  96. ############################################################
  97. # Dividir la muestra
  98. ############################################################
  99. ##-- Dividir en muestra de entrenamiento y muestra test
  100. p <- 0.7 # Proporcion en muestra de entrenamiento
  101. n <- dim(d)[1] # numero de observaciones
  102. set.seed(12345)
  103. train.sel <- sample(c(FALSE,TRUE),n,rep=TRUE,prob=c(1-p,p))
  104. #cramos un vector donde true cuando te envia a la muestra train i false test
  105. train <- d[train.sel,]
  106. test <- d[!train.sel,]
  107.  
  108. ############################################################
  109. # Comparar capacidad predictiva
  110. ############################################################
  111. ##-- 1-NN Train + Test
  112. knn1 <- knn(train[,-ncol(d)], test=test[,-ncol(d)], cl=train$churn, k = 1)
  113. #le quitamos la variable respuesta y más cosas (nose!!! :( )
  114. t <- table(knn1,test$churn)
  115. #0 y 1 lo que ha predicho el modelo. No darse de baja =1. nos interesa la Proporcion de aciertos la diagonal decreciente
  116. sum(diag(t))/sum(t)
  117. #prob de acierto de 84%. Si el objetivo fuera predecir los que se dan de baja (71) no los esta cazando bien.
  118.  
  119. ##-- 1-NN Cross-validation
  120. knn2 <- knn.cv(d[,-ncol(d)], cl=d$churn, k = 1)
  121. t <- table(knn2,d$churn)
  122. t
  123. #proporcion de aciertos
  124. sum(diag(t))/sum(t)
  125. #se ha mejorado un poco pero no mucho
  126.  
  127. ##-- Naive (Asignar a la categoria mayoritaria)
  128. max(prop.table(table(test$churn)))
  129. #asignandolos todos al 0 tenemos 90% de acierto pero lo que pasa es que nos interesa los del 1
  130.  
  131. ############################################################
  132. # Numero de grupos
  133. ############################################################
  134. p <- c()
  135. #prob de acierto
  136. K <- seq(1,21,2)
  137. #vector que nos diga que vayamos probando los vecinos proximos impares.
  138.  
  139. for(k in K){
  140. cat('Iteration:',k,'of',max(K),'\n')
  141. knn <- knn(train[,-ncol(d)], test=test[,-ncol(d)], cl=train$churn, k = k)
  142. t <- table(knn,test$churn)
  143. p[(k+1)/2] <- sum(diag(t))/sum(t)
  144. }
  145. plot(K,p,pch=19,type='b')
  146. #prob de acierto en funcion de k. que no nos engañe la escala!!! de 0.84 a 0.9!
  147. #No aplicamos la regla del codo!! lo que tenemos que coger es el valor mas alto
  148. #a partir de 9 siempre cogemos el valor mas alto
  149. cbind(K,p)
  150. #ver el plot con numeros. en el valor 21 si hacemos t <- table(knn,test$churn) vemos que de los 21 vecinos acabmos
  151. #cogiendolos todos y los asignan al 0.
  152. #si nos quedamos con el 5 ganamos un poco respecto al 0.84 que teniamos antes. Viendo el t no se xd
  153.  
  154.  
  155. ############################################################
  156. # Usar ACP --> Reduccion dimensionalidad
  157. ############################################################
  158. #intentar proyector todos los puntos en aquelespacio que recoja la mayor variabilidad posible
  159. res.acp0 <- princomp(d[,-ncol(d)])
  160. screeplot(res.acp0,type='lines')
  161. #Nos dice el % de variabilidad que recoge cada una de las dimensiones. Nos dice que podemos proyector todos los datos
  162. #en una sola dimension. Por tanto reducimos todos los datos en una dimension.
  163. res.acp <- res.acp0$scores[,1]
  164. #nos quedamos con una componente ( si hubieran salido 3 pos habriamos cogido 3)
  165. #recogemos las variables y las llevamos a una unica variable
  166. train2 <- data.frame(c1=res.acp[train.sel])
  167. test2 <- data.frame(c1=res.acp[!train.sel])
  168.  
  169.  
  170. K <- seq(1,21,2)
  171. p <- c()
  172. for(k in K){
  173. cat('Iteration:',k,'of',max(K),'\n')
  174. knn <- knn(train2, test2, cl=train$churn, k = k)
  175. t <- table(knn,test$churn)
  176. p <- c(p,sum(diag(t))/sum(t))
  177. }
  178. #ahora va mas rapido y hemos conseguido una capacidad predictiva de 0.95. puede parecer poco predictivo coger menos datos
  179.  
  180. plot(K,p,pch=19,type='b')
  181. cbind(K,p)
  182.  
  183. ##-- 1-NN
  184. knn1 <- knn(train2, test2, cl=train$churn, k = 1)
  185. t <- table(knn1,test$churn)
  186. t
  187. #si vemos la tabla la proporcion de los que estan asignados a que realmente se vayan a dar de baja es mucho mayor.
  188. # si llegase un cliente futuro esperariamos ver estas predicciones.
  189.  
  190. ############################################################
  191. # Anyadir un minimo de votos (parametro l)
  192. ############################################################
  193. knn2 <- knn(train2, test2, cl=train$churn, l=2, k = 2)
  194. #cogemos numero par (2 vecinos mas proximos) exijo que o los dos vecinos son iguales o no se asigna a ningun sitio
  195. t <- table(knn2,test$churn)
  196. t
  197. #funciona un poco mejor que la anterior pero hacemos la pequeña trampa de que no esta toda la muestra test por
  198. #los que han empatado.
  199. #los NAs son los que habian empate.
  200. sum(diag(t))/sum(t)
  201. #el % no es real porque es sobre los datos que hemos asignado y no sobre el total
  202. tmiss <- table(knn2,test$churn,useNA = 'always')
  203. tmiss
  204. #dice que 444 no han sido asignados.
  205.  
  206.  
  207. ############################################################
  208. # Kernel
  209. ############################################################
  210. ##-- Con datos originales
  211. kknn1 <- kknn(factor(churn)~., train, test,k=1)
  212. #para un vecino proximo
  213. fit <- fitted(kknn1)
  214. t <- table(fit,test$churn)
  215. sum(diag(t))/sum(t)
  216. #con todas estas mejoras hemos llegado del 84 al 95%
  217.  
  218. p <- c()
  219. K <- seq(1,21,2)
  220. for(k in K){
  221. cat('Iteration:',k,'of',max(K),'\n')
  222. kknn <- kknn(factor(churn)~., train, test,k=k)
  223. t <- table(fitted(kknn),test$churn)
  224. p <- c(p,sum(diag(t))/sum(t))
  225. }
  226. plot(K,p,pch=19,type='b')
  227. cbind(K,p)
  228.  
  229. ##-- Con ACP --> NO mejora
  230. kknn3 <- kknn(factor(train$churn)~., train2, test2,k=2)
  231. fit <- fitted(kknn3)
  232. t <- table(fit,test$churn)
  233. sum(diag(t))/sum(t)
  234.  
  235. K <- seq(1,21,2)
  236. for(k in K){
  237. cat('Iteration:',k,'of',max(K),'\n')
  238. kknn <- kknn(factor(train$churn)~., train2, test2,k=k)
  239. t <- table(fitted(kknn),test$churn)
  240. p[(k+1)/2] <- sum(diag(t))/sum(t)
  241. }
  242. plot(K,p,pch=19,type='b')
  243. cbind(K,p)
  244.  
  245. ############################################################
  246. # Ejercicio 6-1
  247. ############################################################
  248.  
  249. ##-- 1. Lee los datos "bank-additional-full.csv"
  250.  
  251. datos <- read.table('bank-additional-full.csv',header=TRUE,sep=';')
  252.  
  253. ##-- 2. Realiza una depuracion
  254. # a. Ordena las categoricas ordinales
  255. # b. Convierte en dummies las categoricas nominales
  256. # c. Todas las variables deben ser de clase "numeric"
  257. # d. Elimina varible pdays
  258. # Puedes usar la siguiente funcion manual para pasar una variable a dummy
  259.  
  260. datos$pdays <- NULL
  261. to.dummy <- function(x,ordinal,ord=NULL){
  262. if(ordinal){
  263. y <- as.numeric(factor(x,levels=ord))
  264. }else{
  265. nl <- nlevels(x)
  266. y <- matrix(ncol=nl-1,nrow=length(x))
  267. for(i in 1:(nl-1)){
  268. y[,i] <- ifelse(x==levels(x)[i],1,0)
  269. }
  270. colnames(y) <- paste0(levels(x)[1:(nl-1)],'.dummy')
  271. }
  272. return(y)
  273. }
  274. job2 <- to.dummy(datos$job,FALSE)
  275. marital2 <- to.dummy(datos$marital,FALSE)
  276. education2 <- to.dummy(datos$education,TRUE,
  277. c('unknown','illiterate','basic.4y','basic.6y','basic.9y',
  278. 'professional.course','high.school','university.degree'))
  279. default2 <- to.dummy(datos$default,FALSE)
  280. housing2 <- to.dummy(datos$housing,TRUE,c('unknown','no','yes'))
  281. loan2 <- to.dummy(datos$loan,TRUE,c('unknown','no','yes'))
  282. month2 <- to.dummy(datos$month,FALSE)
  283. day_of_week2 <- to.dummy(datos$day_of_week,FALSE)
  284. #poutcome2 <- to.dummy(datos$poutcome,FALSE)
  285.  
  286. datos$job <- NULL
  287. datos$marital <- NULL
  288. datos$default <- NULL
  289. datos$housing <- NULL
  290. datos$loan <- NULL
  291. datos$month <- NULL
  292. datos$day_of_week <- NULL
  293. datos$poutcome <- NULL
  294.  
  295. datos <- cbind(datos,job2,marital2,education2,default2,housing2,loan2,month2,day_of_week2)#,poutcome2)
  296. dim(datos)
  297. for(i in 1:length(datos)) datos[,i] <- as.numeric(datos[,i])
  298.  
  299. ##-- 3. Divide la muestra: Train + test en una submuestra de 10000
  300.  
  301. k <- seq(1,21,2)
  302. p <- c()
  303. for (k in k) {
  304. cat('Iteration', k, 'of', max(k), '\n')
  305. knn1 <- knn(train, test, cl=y.train, k = k)
  306. t <- table(knn1, y.test)
  307. p[(k+1)/2] <- sum(diag(t))/sum(t)
  308.  
  309. }
  310.  
  311. cbind(k,p)
  312.  
  313. ##-- 4. Estudia el numero de grupos idoneo en una submuestra de 10000
  314.  
  315.  
  316.  
  317.  
  318. ############################################################
  319. #
  320. # Naive Bayes
  321. #
  322. ############################################################
  323. rm(list=ls())
  324.  
  325. ############################################################
  326. # Variables
  327. ############################################################
  328. # Objetivo: clasificar los productos
  329. # id: identificador del producto
  330. # feat_XX: caracter�stica XX
  331. # target: tipo de producto
  332.  
  333. ############################################################
  334. # Cargar paquetes
  335. ############################################################
  336. # install.packages('e1071')
  337. # install.packages('ineq')
  338. library(e1071)
  339. library(ineq)
  340.  
  341. ############################################################
  342. # Leer datos
  343. ############################################################
  344. setwd('C:/Users/jcortes/Google Drive/Docencia/Master/17_18/Datasets')
  345. datos <- read.csv2('products.csv',header=TRUE)
  346.  
  347. ############################################################
  348. # Inspeccionar datos
  349. ############################################################
  350. dim(datos) # Dimension
  351. summary(datos) # Descriptiva
  352. #mucha variedad
  353. table(apply(apply(datos,2,is.na),2,sum)) # Tabla con numero de missings
  354. #construye un dataframe con true o flase dependiendo de NAs. vemos que todas las columnas tienen 0 por lo tanto no hay missings NAs
  355.  
  356. ############################################################
  357. # Premisa de independencia
  358. ############################################################
  359. cor.matrix <- cor(datos[,-c(1,length(datos))]) # Matriz de correlaciones
  360. cor.num <- as.numeric(cor.matrix) # Todas las correlaciones en un vector
  361. t.cor <- table(cut(cor.num[cor.num!=1],br=seq(-1,1,0.1)))/2 # Categorazi�n de las correlaciones en intervalos de 0.1
  362. #tabla categorizada
  363. t.cor
  364. barplot(t.cor, las=2)
  365. #manera de encontrar si hay correlaciones altas o no. Hay diferentes manera de hacerlos.
  366. #son variables bastante independientes. La mayoria estan por el 0 y por tanto poco correlacionados.
  367.  
  368. ############################################################
  369. # Dividir la muestra
  370. ############################################################
  371. d <- datos[,-1] # Eliminamos identificador
  372. p <- 0.7 # Proporcion en muestra de entrenamiento
  373. n <- nrow(d) # Numero de observaciones
  374. set.seed(12345)
  375. train.sel <- sample(c(FALSE,TRUE),n,rep=TRUE,prob=c(1-p,p))
  376. train <- d[train.sel,]
  377. test <- d[!train.sel,]
  378.  
  379. ############################################################
  380. # Aplicar bayes
  381. ############################################################
  382. nb <- naiveBayes(target ~ ., train)
  383. nb$levels # Clases
  384. nb$apriori # A priori
  385. #pertenencia a cada clase
  386. nb$tables # A posteriori
  387. #probabilidades a posteriori
  388. #para la carac[,1] la media de la desviacion tipo¿? no se si cierto...
  389. #nos gustaria que las medias[,1] fueran diferentes
  390.  
  391. ############################################################
  392. # Capacidad predictiva
  393. ############################################################
  394. ##-- Global
  395. preds <- predict(nb, newdata = test)
  396. t <- table(preds, test$target)
  397. t
  398. #predicciones respecto a la realidad. queremos valores en la diagonal decreciente solo!!! no pasa del todo
  399. #la clase 5 la predice bastante bien
  400. p.acierto <- sum(diag(t))/sum(t)
  401. p.acierto
  402. #53% al ser 9 clases no esta mal ya que lo normal seria un 1/9
  403.  
  404. ##-- Se pueden pedir las probabilidades de cada clase para inspecci�n visual
  405. preds2 <- predict(nb, newdata = test,type = "raw")
  406. #dame todas las probabilidades tete
  407. #lo que me da es la probabilidad de que el individuo y vaya a la clase x
  408. head(preds2)
  409. heatmap(scale(preds2[1:50,]),Rowv=NA,Colv=NA,col = cm.colors(256))
  410. #ver si en la asignacion se tiene dudas o no.
  411. #en el indivio 1 vemos que hay una predominancia en la clase 2. vemos que en cada linia hay solo un lila por tanto es bien
  412.  
  413. ##-- Proporci�n de acierto por clase
  414. barplot(diag(prop.table(t,2)))
  415. #la prob por columnas de la tabla de confusion. en la clase 6 un 73% van al...
  416. #la clase 5 es la que mas acierta y la 3 menos.
  417.  
  418.  
  419. ############################################################
  420. # Importancia de las variables
  421. ############################################################
  422. # Medir la importancia de las variables en funcion del indice Gini
  423. graphics.off() # Cerrar ventanas
  424. nbt <- nb$tables # Tablas con medias
  425. var.imp <- c() # Gini
  426.  
  427. ##-- Calcular indice y graficar distribucion
  428. for (i in 1:(ncol(d)-1)){
  429. ##-- Crear ventana grafica cada 9 graficos
  430. if((i-1) %% 9==0){
  431. windows()
  432. par(mfrow=c(3,3))
  433. }
  434.  
  435. x <- nbt[[i]][,1]
  436. barplot(x,main=names(d)[i]) # grafico
  437. var.imp[i] <- ineq(x) # GINI
  438. #indice gini es la medida de la desigualdad entre las clases
  439. #las variables que tenian valores muy parecidos gini mu bajo
  440. }
  441. #La feat 93 tiene pinta de ser buena predictora ( es bien!)
  442. #la 65 es mal :(
  443.  
  444. ##-- Los mas predictores
  445. sel.pr <- order(var.imp, decreasing=TRUE)[1:9]
  446. #9 variables que mas discriminan
  447. windows()
  448. par(mfrow=c(3,3))
  449. for (i in sel.pr){
  450. x <- nbt[[i]][,1]
  451. barplot(x,main=names(d)[i])
  452. }
  453.  
  454.  
  455. ##-- Los menos predictores
  456. sel.pr <- order(var.imp, decreasing=FALSE)[1:9]
  457. #9 variables que menos discriminan
  458. windows()
  459. par(mfrow=c(3,3))
  460. for (i in sel.pr){
  461. x <- nbt[[i]][,1]
  462. barplot(x,main=names(d)[i])
  463. }
  464.  
  465. ############################################################
  466. # Intento de mejora 1: Seleccionar mejores predictores
  467. ############################################################
  468. ##-- Selecionar los mejores predictores
  469. hist(var.imp)
  470. sel.pr <- which(var.imp>0.5)
  471. #todos los que tengan un indice mayor que 0.5 (menos predictores)
  472. train1 <- train[,c(paste0('feat_',sel.pr),'target')]
  473.  
  474. ##-- Aplicar bayes nuevamente
  475. nb1 <- naiveBayes(target ~ ., train1, type="class")
  476. preds <- predict(nb1, newdata = test)
  477. t <- table(preds, test$target)
  478. p.acierto1 <- sum(diag(t))/sum(t)
  479. p.acierto1
  480.  
  481. ############################################################
  482. # Intento de mejora 2: Quitar variables correlacionadas
  483. ############################################################
  484. ##-- Sistema 1: Correlaciones grandes
  485. high.corr <- which(cor.matrix>0.8,arr.ind = TRUE)
  486. #quitamos las variables con correlacion mayor de 0.8
  487. t.high.corr <- sort(table(as.numeric(high.corr))/2,decreasing=TRUE)
  488. t.high.corr
  489. sel.rm <- names(t.high.corr)[t.high.corr>=2]
  490. train2 <- train[,-which(names(train) %in% paste0('feat_',sel.rm))]
  491. #escoger tu el criterio. Un criterio posible para cada variable sumar todas las correlaciones con todas las otras
  492. #como todas son numericas puedes hacer una regresion lineal y las que tienen un R2 mas grande ir eliminandolas.
  493.  
  494.  
  495. ##-- Aplicar bayes nuevamente
  496. nb2 <- naiveBayes(target ~ ., train2, type="class")
  497. preds <- predict(nb2, newdata = test)
  498. t <- table(preds, test$target)
  499. p.acierto2 <- sum(diag(t))/sum(t)
  500. p.acierto2
  501.  
  502. ##-- Sistema 2: Suma de correlaciones
  503. cor.sum <- sort(apply(cor.matrix,2,sum),decreasing=TRUE)
  504. cor.sum
  505. sel.rm <- names(cor.sum)[1:30]
  506. train3 <- train[,-which(names(train) %in% sel.rm)]
  507.  
  508. ##-- Aplicar bayes nuevamente
  509. nb3 <- naiveBayes(target ~ ., train3, type="class")
  510. preds <- predict(nb3, newdata = test)
  511. t <- table(preds, test$target)
  512. p.acierto3 <- sum(diag(t))/sum(t)
  513. p.acierto3
  514. #se ha subido un 0.8 % alomejor porque ya no se puede mas.
  515.  
  516. ############################################################
  517. # Ejercicio 6-2
  518. ############################################################
  519. ##-- 1. Reduce el numero de variables predictoras a 20 y aplica el KNN con diferente n�mero de vecinos
  520. ## �Mejora la capacidad predictiva medida por la proporci�n de aciertos?
  521.  
  522. ##-- 2. Obten una medida probab�listica del KNN y promediala con la obtenida con el NB. Asigna a un grupo segun esta nueva probabilidad
  523. ## �Mejora la capacidad predictiva medida por la proporci�n de aciertos? (15')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement