r - 为什么我的 SVM 函数在我使用预测数据集时失败但可以用于测试和训练数据集?
r - why does my SVM function fails when I use a predict dataset but is OK with test and train datasets?
我有一个 table 包含门票信息。
一列是工单号,另外三列带有自由格式的文本字段,其中包含多个英文单词,最后一列(分类)用于分配给的组。
为简单起见,我只是将 Text### 作为单元格值,但实际上 Field1、Field2 和 Field3 列中的每个列都有多个句子和多个英文单词。
数据如下。在同一个 table 中,我们提供了带有正确组标识的行,以及一些待分配给相应组的门票。
票证ID
字段 1
字段 2
字段 3
组
DataOneY
00000001
文字101
文本102
文本103
B
B
00000002
文字101
文本102
文本103
一个
一个
00000003
文字101
文本102
文本103
B
B
00000004
文字101
文本102
文本103
B
B
00000005
文字101
文本102
文本103
C
C
.......
.......
.......
.......
......
.......
00000789
文字101
文本102
文本103
00001232
文字101
文本102
文本103
00012988
文字101
文本102
文本103
.......
.......
.......
.......
......
.......
手头的任务是,根据以前的数据,使用 SVM 通过使用所有自由格式文本字段中的词来预测组分配。
所以我构建了 VCorpus 和 DTM,然后开始构建我的训练、测试和预测数据帧。
tSparse
数据框如下所示(工单 ID 用作行名称)
Word1
Word2
Word3
.......
WordN
组
DataOneY
00000001
0
1
0
.......
2
B
B
00000001
1
1
3
.......
0
B
B
00000002
0
1
0
.......
1
B
B
00000103
2
3
3
.......
0
B
B
00000084
0
1
0
.......
0
B
B
.....
...
...
...
.......
...
...
...
00001249
0
1
0
.......
2
00023232
0
2
2
.......
1
00000098
4
1
0
.......
1
.....
...
...
...
.......
...
...
...
buildDocCorpus <- reactive({
#build the VCorpus and DTM
#Build general dataframe with predictions to split train and test
tSparse1_r<-tSparse%>%filter(tSparse$dataOneY!="")
#make sure output column is a factor
tSparse1_r$dataOneY<-factor(tSparse1_r$dataOneY)
#Split into training and test dataframes (sets)
trainSparse <- stratified(tSparse1_r, "dataOneY", .9, keep.rownames=TRUE)
#make sure trainSparse is a dataframe and use ticket id as index (row names)
trainSparse <- as.data.frame(trainSparse)
rownames(trainSparse) <- trainSparse$rn
trainSparse$rn <- NULL
#create test dataframe by selecting tickets whose ID doesn't appear in training
testSparse = subset(tSparse1_r, !(rownames(tSparse1_r) %in% rownames(trainSparse)))
#build predict set with rows that don't have a group assigned
PredictSparse1<-tSparse%>%filter(dataOneY==""|(is.na(dataOneY)))
PredictSparse1<-subset(PredictSparse1, select = -c(dataOneY))
return(
list(
trainSparse = trainSparse,
testSparse = testSparse,
PredictSparse = PredictSparse1
)
)
})
cfMtxSVM <- function(mymode){
#browser()
mymode = toString(mymode)
bdc <- buildDocCorpus()
trainSparse <- bdc$trainSparse
if(mymode == "test"){
mySparse <- bdc$testSparse
}
else if (mymode == "predict"){
mySparse <- bdc$PredictSparse
}
#subset.test <- test[filt,]
#rf =randomForest(dataOneY~ ., data=trainSparse)
#PredictRF = predict(rf,newdata = mySparse)
#
trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
svm_Linear <- train(dataOneY ~., data = trainSparse, method = "svmLinear", trControl=trctrl, preProcess = c("center", "scale"), tuneLength = 10)
test_svm1 <- predict(svm_Linear, newdata = mySparse)
#test_svm
return(
list(
testOneY = mySparse$dataOneY,
test_svm = test_svm1,
trainSparse = trainSparse
)
)
}
当我运行这样的程序时:
tb1 <- cfMtxSVM(mymode = toString("predict"))
我收到以下错误:
Warning: Error in model.frame.default: factor Group has new level
[没有可用的堆栈跟踪]
当然,Group
和 DataOneY
列在预测数据集中都是 NA。
根据我的调查,我似乎需要将级别分配给预测数据集中的组列。这些是我尝试过的所有尝试,所有尝试都 return 一个错误:
#Attempt 1: Remove both output columns
#PredictSparse1<-subset(PredictSparse1, select = -c(Group,dataOneY))
#Attempt 2: Make PredictSpare Group column a factor
#PredictSparse1$Group<-factor(PredictSparse1$Group)
#Attempt 3: Copy Levels from trainSparse to PredictSparse
#levels(PredictSparse1$Group) <- levels(trainSparse$Group)
#Attempt 4: Like 3 but making it factor
#PredictSparse1$Failure_Mode <- factor(
# PredictSparse1$Failure_Mode,levels = levels(trainSparse$Failure_Mode)
#)
#Attempt 5: Manually specify levels and add NA that is in output column
lvls <- c('A','B','C')
PredictSparse1$Group <- sapply(PredictSparse1$Group, factor, levels=lvls)
PredictSparse1$Group <- addNA(PredictSparse1$Group)
#Attempt 6: Same as 5 but for the three datasets (train, test and predict)
我无计可施,能否请您说明如何解决 has new level
错误。
如果有帮助,我还 运行 RandomForest 使用完全相同的训练、测试和预测数据集,并且它每次都 运行 没问题,除非我之前说过尝试修复级别错误,它也会崩溃。
菜鸟错误!
dataOneY
和 Group
是副本,所以我实际上在模型中有数据泄漏。
从训练和测试数据集中删除 Group
并重新运行 模型训练后,我能够在 SVM predict
中正确获得结果。
我有一个 table 包含门票信息。 一列是工单号,另外三列带有自由格式的文本字段,其中包含多个英文单词,最后一列(分类)用于分配给的组。
为简单起见,我只是将 Text### 作为单元格值,但实际上 Field1、Field2 和 Field3 列中的每个列都有多个句子和多个英文单词。
数据如下。在同一个 table 中,我们提供了带有正确组标识的行,以及一些待分配给相应组的门票。
票证ID | 字段 1 | 字段 2 | 字段 3 | 组 | DataOneY |
---|---|---|---|---|---|
00000001 | 文字101 | 文本102 | 文本103 | B | B |
00000002 | 文字101 | 文本102 | 文本103 | 一个 | 一个 |
00000003 | 文字101 | 文本102 | 文本103 | B | B |
00000004 | 文字101 | 文本102 | 文本103 | B | B |
00000005 | 文字101 | 文本102 | 文本103 | C | C |
....... | ....... | ....... | ....... | ...... | ....... |
00000789 | 文字101 | 文本102 | 文本103 | ||
00001232 | 文字101 | 文本102 | 文本103 | ||
00012988 | 文字101 | 文本102 | 文本103 | ||
....... | ....... | ....... | ....... | ...... | ....... |
手头的任务是,根据以前的数据,使用 SVM 通过使用所有自由格式文本字段中的词来预测组分配。
所以我构建了 VCorpus 和 DTM,然后开始构建我的训练、测试和预测数据帧。
tSparse
数据框如下所示(工单 ID 用作行名称)
Word1 | Word2 | Word3 | ....... | WordN | 组 | DataOneY | |
---|---|---|---|---|---|---|---|
00000001 | 0 | 1 | 0 | ....... | 2 | B | B |
00000001 | 1 | 1 | 3 | ....... | 0 | B | B |
00000002 | 0 | 1 | 0 | ....... | 1 | B | B |
00000103 | 2 | 3 | 3 | ....... | 0 | B | B |
00000084 | 0 | 1 | 0 | ....... | 0 | B | B |
..... | ... | ... | ... | ....... | ... | ... | ... |
00001249 | 0 | 1 | 0 | ....... | 2 | ||
00023232 | 0 | 2 | 2 | ....... | 1 | ||
00000098 | 4 | 1 | 0 | ....... | 1 | ||
..... | ... | ... | ... | ....... | ... | ... | ... |
buildDocCorpus <- reactive({
#build the VCorpus and DTM
#Build general dataframe with predictions to split train and test
tSparse1_r<-tSparse%>%filter(tSparse$dataOneY!="")
#make sure output column is a factor
tSparse1_r$dataOneY<-factor(tSparse1_r$dataOneY)
#Split into training and test dataframes (sets)
trainSparse <- stratified(tSparse1_r, "dataOneY", .9, keep.rownames=TRUE)
#make sure trainSparse is a dataframe and use ticket id as index (row names)
trainSparse <- as.data.frame(trainSparse)
rownames(trainSparse) <- trainSparse$rn
trainSparse$rn <- NULL
#create test dataframe by selecting tickets whose ID doesn't appear in training
testSparse = subset(tSparse1_r, !(rownames(tSparse1_r) %in% rownames(trainSparse)))
#build predict set with rows that don't have a group assigned
PredictSparse1<-tSparse%>%filter(dataOneY==""|(is.na(dataOneY)))
PredictSparse1<-subset(PredictSparse1, select = -c(dataOneY))
return(
list(
trainSparse = trainSparse,
testSparse = testSparse,
PredictSparse = PredictSparse1
)
)
})
cfMtxSVM <- function(mymode){
#browser()
mymode = toString(mymode)
bdc <- buildDocCorpus()
trainSparse <- bdc$trainSparse
if(mymode == "test"){
mySparse <- bdc$testSparse
}
else if (mymode == "predict"){
mySparse <- bdc$PredictSparse
}
#subset.test <- test[filt,]
#rf =randomForest(dataOneY~ ., data=trainSparse)
#PredictRF = predict(rf,newdata = mySparse)
#
trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
svm_Linear <- train(dataOneY ~., data = trainSparse, method = "svmLinear", trControl=trctrl, preProcess = c("center", "scale"), tuneLength = 10)
test_svm1 <- predict(svm_Linear, newdata = mySparse)
#test_svm
return(
list(
testOneY = mySparse$dataOneY,
test_svm = test_svm1,
trainSparse = trainSparse
)
)
}
当我运行这样的程序时:
tb1 <- cfMtxSVM(mymode = toString("predict"))
我收到以下错误:
Warning: Error in model.frame.default: factor Group has new level
[没有可用的堆栈跟踪]
当然,Group
和 DataOneY
列在预测数据集中都是 NA。
根据我的调查,我似乎需要将级别分配给预测数据集中的组列。这些是我尝试过的所有尝试,所有尝试都 return 一个错误:
#Attempt 1: Remove both output columns
#PredictSparse1<-subset(PredictSparse1, select = -c(Group,dataOneY))
#Attempt 2: Make PredictSpare Group column a factor
#PredictSparse1$Group<-factor(PredictSparse1$Group)
#Attempt 3: Copy Levels from trainSparse to PredictSparse
#levels(PredictSparse1$Group) <- levels(trainSparse$Group)
#Attempt 4: Like 3 but making it factor
#PredictSparse1$Failure_Mode <- factor(
# PredictSparse1$Failure_Mode,levels = levels(trainSparse$Failure_Mode)
#)
#Attempt 5: Manually specify levels and add NA that is in output column
lvls <- c('A','B','C')
PredictSparse1$Group <- sapply(PredictSparse1$Group, factor, levels=lvls)
PredictSparse1$Group <- addNA(PredictSparse1$Group)
#Attempt 6: Same as 5 but for the three datasets (train, test and predict)
我无计可施,能否请您说明如何解决 has new level
错误。
如果有帮助,我还 运行 RandomForest 使用完全相同的训练、测试和预测数据集,并且它每次都 运行 没问题,除非我之前说过尝试修复级别错误,它也会崩溃。
菜鸟错误!
dataOneY
和 Group
是副本,所以我实际上在模型中有数据泄漏。
从训练和测试数据集中删除 Group
并重新运行 模型训练后,我能够在 SVM predict
中正确获得结果。