2017-07-19 1 views
0

Je voulais prédire la classe de document à l'aide des données historiques de texte « description » et « classe »Classification algorithme pour le texte en utilisant R

Ci-dessous script que je me sers, mais pour le nouveau document que je veux prédire je suis ne pas obtenir une meilleure précision, quelqu'un peut-il m'aider à savoir quel algorithme peut être utilisé pour augmenter la précision. Veuillez nous conseiller

library(plyr) 
library(tm) 
library(e1071) 

setwd("C:/Data") 

past <- read.csv("Past - Copy.csv",header=T,na.strings=c("")) 
future <- read.csv("Future - Copy.csv",header=T,na.strings=c("")) 

training <- rbind.fill(past,future) 

Res_Desc_Train <- subset(training,select=c("Class","Description")) 

##Step 1 : Create Document Matrix of ticket Descriptions available past data 

docs <- Corpus(VectorSource(Res_Desc_Train$Description)) 
docs <-tm_map(docs,content_transformer(tolower)) 

#remove potentially problematic symbols 
toSpace <- content_transformer(function(x, pattern) { return (gsub(pattern, " ", x))}) 
removeSpecialChars <- function(x) gsub("[^a-zA-Z0-9 ]","",x) 
docs <- tm_map(docs, content_transformer(tolower)) 
docs <- tm_map(docs, removeNumbers) 
docs <- tm_map(docs, removePunctuation) 
docs <- tm_map(docs, stripWhitespace) 
docs <- tm_map(docs, removeWords, stopwords('english')) 


#inspect(docs[440]) 
dataframe<-data.frame(text=unlist(sapply(docs, `[`, "content")), stringsAsFactors=F) 

dtm <- DocumentTermMatrix(docs,control=list(stopwords=FALSE,wordLengths =c(2,Inf))) 

##Let's remove the variables which are 95% or more sparse. 
dtm <- removeSparseTerms(dtm,sparse = 0.95) 

Weighteddtm <- weightTfIdf(dtm,normalize=TRUE) 
mat.df <- as.data.frame(data.matrix(Weighteddtm), stringsAsfactors = FALSE) 
mat.df <- cbind(mat.df, Res_Desc_Train$Class) 
colnames(mat.df)[ncol(mat.df)] <- "Class" 
Assignment.Distribution <- table(mat.df$Class) 

Res_Desc_Train_Assign <- mat.df$Class 

Assignment.Distribution <- table(mat.df$Class) 

### Feature has different ranges, normalizing to bring ranges from 0 to 1 
### Another way to standardize using z-scores 

normalize <- function(x) { 
    y <- min(x) 
    z <- max(x) 
    temp <- x - y 
    temp1 <- (z - y) 
    temp2 <- temp/temp1 
    return(temp2) 
} 
#normalize(c(1,2,3,4,5)) 

num_col <- ncol(mat.df)-1 
mat.df_normalize <- as.data.frame(lapply(mat.df[,1:num_col], normalize)) 
mat.df_normalize <- cbind(mat.df_normalize, Res_Desc_Train_Assign) 
colnames(mat.df_normalize)[ncol(mat.df_normalize)] <- "Class" 

#names(mat.df) 
outcomeName <- "Class" 

train = mat.df_normalize[c(1:nrow(past)),] 
test = mat.df_normalize[((nrow(past)+1):nrow(training)),] 


train$Class <- as.factor(train$Class) 

###SVM Model 
x <- subset(train, select = -Class) 
y <- train$Class 
model <- svm(x, y, probability = TRUE) 
test1 <- subset(test, select = -Class) 
svm.pred <- predict(model, test1, decision.values = TRUE, probability = TRUE) 
svm_prob <- attr(svm.pred, "probabilities") 

finalresult <- cbind(test,svm.pred,svm_prob) 

Répondre

0

Essayons de régler votre modèle SVM?

Vous exécutez le modèle en utilisant les paramètres par défaut, donc pas en mesure d'obtenir une meilleure précision. L'exécution du modèle est un processus itératif dans lequel vous modifiez le paramètre, exécutez le modèle, vérifiez la précision, puis répétez l'ensemble du processus à nouveau.

model <- tune(svm, train.x=x, train.y=y, kernel="radial", ranges=list(cost=10^(-1:2), gamma=c(.5,1,2))) 
print(model) 
#select values of cost & gamma from here and pass it to tuned_model 

tuned_model <- svm(x, y, kernel="radial", cost=<cost_from_tune_model_output>, gamma=<gamma_from_tune_model_output>) 
#now check accuracy of this model using test dataset and accordingly adjust tune parameter. Repeat the whole process again. 

Espérons que cela aide!

+0

Merci pour votre aide utiliser la solution que vous partagez et vérifier si la précision peut être augmentée, En fait, je suis très faible autour de 52% de précision – user3734568

+0

Dans ce cas, vous devrez peut-être augmenter votre jeu de données d'apprentissage correctement. – Prem

+0

merci pour votre suggestion va vérifier si je peux obtenir plus de données pour former le modèle, actuellement j'ai document 13383 dans mon ensemble de données de train. – user3734568