我正在使用电子邮件分类监督模型,将电子邮件分为20个不同的组,我已经完成了第一组(G1)的模型(非常大的代码),我想知道是否有某些功能可以重复代码,但将其他组作为变量,因为手动更改(G2 ... G20)的G1太麻烦了。
我不知道该怎么做。
####G1####
datos_pivot1= cast(datosArg[,c('Descripción', 'Subcategoría_Servicio', 'value')], Descripción ~ Subcategoría_Servicio, mean)
datos_pivot1=datos
datos_G1=datos[datos$G1>0 & is.na(datos$G1)==F ,c('Descripción','G1')]
wordcloud(datos_G1$Descripción, max.words = 200, min.freq = 200, random.order = F, colors = brewer.pal(name = "Dark2", n = 8))
length(datos_G1$Descripción)
# casos FALSE
datos_G1_no=datos[is.na(datos$G1)==T ,c('Descripción','G1')]
# numero de casos sin O2C
length(datos_G1_no$Descripción)
#para balancear la cantidad de True vs False, se selecciona una muestra del mismo número de casos True
datos_G1_no_sample =datos_G1_no[sample(1:length(datos_G1_no$Descripción),size=length(datos_G1$Descripción)),]
datos_G1_no_sample$G1=0
cor1=head(datos_G1_no_sample)
#unir casos TRUE Y casos FALSE
datos_G1 = rbind(datos_G1, datos_G1_no_sample)
table(datos_G1$G1)
#corpus
base_corpus_G1 <- Corpus(VectorSource(datos_G1$Descripción))
#Matriz de términos
base_tdm_G1 <- TermDocumentMatrix(base_corpus_G1)
#Eliminar términos dispersos
base_tdm_G1 <- removeSparseTerms(base_tdm_G1, sparse = .95)
#Matriz por filas=Analisis, culumnas = palabras
base_mat_G1 <- t(as.matrix(base_tdm_G1))
base_mat_G1= cbind(base_mat_G1, data.frame(G1=c(rep(1,table(datos_G1$G1)[2]),rep(0,table(datos_G1$G1)[2]))))
head(base_mat_G1)
##ENTRENAMIENTO Y PRUEBA
## 75% Train.
smp_size <- floor(0.75 * nrow(datos_G1))
#definimos una semilla para que cuando volvamos a ejecutar obtengamos la misma muestra
set.seed(456)
train_ind <- sample(seq_len(nrow(base_mat_G1)), size = smp_size)
#Filtro de Entrenamiento 75% (basado en el sample de la linea anterior)
train_G1 <- base_mat_G1[train_ind, ]
#Filtro de prueba 75% (los otros) (el menos indica las contratias)
test_G1 <- base_mat_G1[-train_ind, ]
table(train_G1$G1)
##MODELOS O2C
##Arbol de decision
library(rpart)
tree_G1 <- rpart(G1 ~ ., data = train_G1)
#Predict
pred.tree_G1 <- predict(tree_G1, newdata = test_G1)
pred.tree_G1=(as.data.frame(pred.tree_G1))
names(pred.tree_G1)=c('prob')
pred.tree_G1$G1.pred=0
pred.tree_G1$G1.pred[pred.tree_G1$prob>0.51] = 1
table(test_G1$G1, pred.tree_G1$G1.pred)
rpart.plot(tree_G1)
#Curva ROC
roc.curve(test_G1$G1, pred.tree_G1$G1.pred, curve=TRUE)
##GLM
#train
glm_G1 <- glm(G1 ~ ., family=binomial(logit), data=train_G1)
#predict
pred.glm_G1 = test_G1[,c('G1','G1')]
pred.glm_G1 = cbind(pred.glm_G1, data.frame(predict(glm_G1, newdata=test_G1,type='response')))
pred.glm_G1$G1 = NULL
pred.glm_G1$G1.1 = NULL
names(pred.glm_G1)=c('prob')
pred.glm_G1$G1.pred=0
pred.glm_G1$G1.pred[pred.glm_G1$prob>0.51] = 1
table(test_G1$G1, pred.glm_G1$G1.pred)
#Curva ROC:
roc.curve(test_G1$G1, pred.glm_G1$G1.pred, curve=TRUE)
##KKNN
kknn_G1 <- kknn(G1 ~ ., train_G1, test_G1, distance = 1, k=350, kernel = "optimal")
pred.kknn_G1 = test_G1[,c('G1','G1')]
pred.kknn_G1$prob<-kknn_G1$fitted.values
pred.kknn_G1$G1 = NULL
pred.kknn_G1$G1.1 = NULL
pred.kknn_G1$G1.pred=0
pred.kknn_G1$G1.pred[pred.kknn_G1$prob>0.51] = 1
table(test_G1$G1, pred.kknn_G1$G1.pred)
#Curva ROC
roc.curve(test_G1$G1, pred.kknn_G1$G1.pred, curve=TRUE)
head(pred.kknn_G1)