R中的事故单优先级分类

Posted

技术标签:

【中文标题】R中的事故单优先级分类【英文标题】:incident ticket priority classification in R 【发布时间】:2018-08-30 10:08:26 【问题描述】:

我是 R 和机器学习的新手。在这里,我尝试建立一个随机森林分类模型,从事件单的描述中预测其优先级。我遵循以下步骤。

1) 输入

library(tm)
library(SnowballC)
library(caTools)
library(randomForest)
incidents = read.csv("incident.csv", stringsAsFactors = FALSE)

> str(incidents) 'data.frame':  4265 obs. of  7 variables:  $ number                : chr  "INC0031193" "INC0037867" "INC0159979" "INC0031446" ...  $
> u_detailed_description: chr  "Close & Ignore new Ticket New-Production
> SNOW Auto Routing test for XYZ SNOW ticketing in uat"  "" "" ""...  $
> priority              : chr  "3 - Moderate" "2 - High" "4 - Low" "3 -
> Moderate" ...  $ state                 : chr  "Canceled" "Canceled"
> "Canceled" "Canceled" ...  $ category              : chr  "Server"
> "Tools" "Server" "Server" ...  $ assignment_group      : chr 
> "Windows" "Tools" "SNOC Support" "Windows" ...

2) 数据清洗,创建DocumenTermMatrix并转换为DataFrame。

incidentCorpus <- Corpus(VectorSource(incidents$u_detailed_description))
incidentCorpus <- tm_map(incidentCorpus, tolower)
incidentCorpus <- tm_map(incidentCorpus, removePunctuation)
incidentCorpus <- tm_map(incidentCorpus, removeWords, stopwords("english"))
incidentCorpus <- tm_map(incidentCorpus, stemDocument)
incidentDTM <- DocumentTermMatrix(incidentCorpus)

3) 使用 caTools 将数据拆分为训练集和测试集。

set.seed(123)
split <- sample.split(incidentSparse$priority,SplitRatio = 0.7)
train <- subset(incidentSparse, split == TRUE)
test  <- subset(incidentSparse, split == FALSE)
train$priority <- as.character(train$priority) 
train$priority <- as.factor(train$priority
test$priority  <- as.character(testSet1$priority)
test$priority  <- as.factor(testSet1$priority)

4) 应用randomforest() 函数创建我的模型,并使用predict 函数对我的测试集进行分类。

incidentRandomF <- randomForest(priority ~ ., data = train, ntree = 200, mtry = 50, importance = TRUE, proximity = TRUE)

5) 模型的整体准确率在 90% 左右。

baselineAccuracy <- sum(diag(table(predict(incidentRandomF, type="class"), train$priority)))/nrow(train)

> baselineAccuracy
[1] 0.8392498

predFinalTestSet_RF <- predict(incidentRandomF, newdata = test,  type="class")
FinalTestSetAccuracy <- sum(diag(table(test$priority,predFinalTestSet_RF)))/nrow(test)

> FinalTestSetAccuracy
[1] 0.8828125

到目前为止,我的分类模型已准备就绪,现在我需要执行此模型以根据给定描述预测优先级,其中描述将由用户提供。

如何向 R 脚本提供用户输入以使其正常运行?

您的帮助将不胜感激。 提前致谢。

【问题讨论】:

请提供一个可重现的例子:***.com/questions/5963269/… 感谢您的回复。我已经更新了这个问题。请检查。 想要预测的人希望如何提供输入?您可以使用 rShiny 创建一个 Web 表单,或者他们可以向您发送一个看起来像您的测试集的 CSV,您可以分发您的训练模型,他们可以通过 R 输入值,这里有很多选项。 @Josh。感谢您的回复。我想用 ShinyR 创建 web 表单。如果您能给我提供一个高层次的想法或任何以前解决的问题,那将会很有帮助。 【参考方案1】:

因此,无需编写整个页面(或测试我在这里编写的代码),但希望足以说明如何开始(如果您还有其他问题,请告诉我),以下是 Shiny 应用程序的基本外观:

在一个名为 ui.R 的文件中:

fluidPage(

  # Copy the line below to make a text input box
  textInput("u_detailed_description", label = h3("Text input"), value = "Enter text..."),
  #Additional inputs for other fields here

  hr(),
  fluidRow(column(3, verbatimTextOutput("prediction")))

)

然后在server.R中:

function(input, output) 

  # You can access the value of the widget with input$u_detailed_description, e.g.
  output$value <- renderPrint( predict(incidentRandomF, newdata = input,  type="class") )


大量信息和文档,包括Shiny site 上的许多示例

在查找其他内容时,我偶然发现了 this repo,它显示有人在 Shiny 应用程序中显示模型的预测,它可能有助于阐明如何执行诸如保存模型并重新加载之类的事情。

【讨论】:

非常感谢 sn-ps 和信息。我会检查并告诉你结果。 我已经修改了脚本,但是得到了错误 renderPrint 函数。警告:评估错误:找不到对象“自动”堆栈跟踪(最里面的第一个):91:评估 90:评估 89:model.frame.default 88:model.frame 87:predict.randomForest 86:预测 85:renderPrint [D :\Sourav\Analytics\Service Now/server.R#50] 84: func 83: eval 82: eval 81: withVisible 80: evalVis 79: utils::capture.output 78: paste 77: origRenderFunc 76: output$prediction 1 : 运行应用 我认为 train set 中的列与文本不匹配。可能是我需要与列相交。请提出建议。

以上是关于R中的事故单优先级分类的主要内容,如果未能解决你的问题,请参考以下文章

如何处理人工神经网络中的多个分类列?

优先使用单表查询,而非联合查询

进程管理

进程管理

处理 R 中冲突的命名空间(不同包中的相同函数名):重置包命名空间的优先级

运算符的分类用法