如何使用 R e1071 SVM 多类测试数据

Posted

技术标签:

【中文标题】如何使用 R e1071 SVM 多类测试数据【英文标题】:How to test data with R e1071 SVM multiclass 【发布时间】:2018-02-10 20:27:37 【问题描述】:

我第一次使用 R 和 e1071 包和 SVM 多类!那我就很迷茫了。目标是:如果我有一个sunny的句子;它将被归类为“是”的句子;如果我有一个带云的句子,它会被归类为“也许”,如果我有一个下雨的句子; il 将被归类为“否”。真正的目标是为我的研究做一些文本分类。

我有两个文件:

train.csv:一个有两列/变量的文件,其中一个是 数据,另一个是标签。

例子:

                  V1    V2
1              sunny   yes
2        sunny sunny   yes
3  sunny rainy sunny   yes
4  sunny cloud sunny   yes
5              rainy    no
6        rainy rainy    no
7  rainy sunny rainy    no
8  rainy cloud rainy    no
9              cloud maybe
10       cloud cloud maybe
11 cloud rainy cloud maybe
12 cloud sunny cloud maybe
test.csv:这个文件里面有新的待分类数据。

例子:

      V1
1  sunny
2  rainy
3  hello
4  cloud
5      a
6      b
7  cloud
8      d
9      e
10     f
11     g
12 hello

遵循 iris 数据集的示例 (https://cran.r-project.org/web/packages/e1071/e1071.pdf 和 http://rischanlab.github.io/SVM.html) 我创建了我的模型,然后以这种方式测试训练数据:

> library(e1071)
> train <- read.csv(file="C:/Users/Stef/Desktop/train.csv", sep = ";", header = FALSE)
> test <- read.csv(file="C:/Users/Stef/Desktop/test.csv", sep = ";", header = FALSE)
> attach(train)
> x <- subset(train, select=-V2)
> y <- V2
> model <- svm(V2 ~ ., data = train, probability=TRUE)
> summary(model)

Call:
svm(formula = V2 ~ ., data = train, probability = TRUE)


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.08333333 

Number of Support Vectors:  12

 ( 4 4 4 )


Number of Classes:  3 

Levels: 
 maybe no yes

> pred <- predict(model,x)
> system.time(pred <- predict(model,x))
   user  system elapsed 
      0       0       0 
> table(pred,y)
       y
pred    maybe no yes
  maybe     4  0   0
  no        0  4   0
  yes       0  0   4
> pred
    1     2     3     4     5     6     7     8     9    10    11    12 
  yes   yes   yes   yes    no    no    no    no maybe maybe maybe maybe 
Levels: maybe no yes

我认为到目前为止还可以。 现在的问题是:测试数据呢?我没有找到任何测试数据。然后,我想也许我应该用测试数据来测试模型。我这样做了:

> test
      V1
1  sunny
2  rainy
3  hello
4  cloud
5      a
6      b
7  cloud
8      d
9      e
10     f
11     g
12 hello
> z <- subset(test, select=V1)
> pred <-predict(model,z)
Error in predict.svm(model, z) : test data does not match model !

这里有什么问题?您能解释一下如何使用旧火车模型测试新数据吗? 谢谢

编辑

这些是每个文件 .csv 的前 5 行

> head(train,5)
                 V1  V2
1             sunny yes
2       sunny sunny yes
3 sunny rainy sunny yes
4 sunny cloud sunny yes
5             rainy  no
> head(test,5)
     V1
1 sunny
2 rainy
3 hello
4 cloud
5     a

【问题讨论】:

你能提供像 head train.csv 和 head test.csv 这样的东西吗?我无法协调您的声明,即您粘贴的输出有两列(例如晴天、下雨、晴天、是) @MikePalmice 我刚刚为你编辑了问题:) 训练和测试不应该有相同的列数吗? 【参考方案1】:

我认为问题可能在于您对子集函数的选择参数 - 如果您只执行 pred&lt;-predict(model,test) 会发生什么?很难判断您的原始数据是有两列(V1,V2)还是最多四列。由于您使用 data=train 训练/初始化模型,我认为预测测试而不是子集(测试,)应该可以解决问题。

即使测试集中的行数与训练 SVM 的行数不同,Predict 也可以在 SVM 上工作……它应该是微不足道的。类似:

test.preds<-predict(some.svm, test)
misclassification.rate<-mean(test.preds != test$V2)

【讨论】:

已经过测试,但它不起作用:(我按顺序做了:pred test.pred 【参考方案2】:

训练和测试数据集中的因素在这里是不同的,所以你需要先修复它。

library(e1071)
#sample data
train_data <- data.frame(V1 = c("sunny","sunny sunny","rainy","rainy rainy","cloud","cloud cloud"),
                         V2= c("yes","yes","no","no","maybe","maybe"))
test_data <- data.frame(V1 = c("sunny","rainy","hello","cloud"))

#fix levels in train_data & test_data dataset before running model
train_data$ind <- "train"
test_data$ind <- "test"
merged_data <- rbind(train_data[,-grep("V2", colnames(train_data))],test_data)
#train data
train <- merged_data[merged_data$ind=="train",]
train$V2 <- train_data$V2
train <- train[,-grep("ind", colnames(train))]
#test data
test <- merged_data[merged_data$ind=="test",]
test <- data.frame(V1 = test[,-grep("ind", colnames(test))])

#svm model
svm_model <- svm(V2 ~ ., data = train, probability=TRUE)
summary(svm_model)
train_pred <- predict(svm_model,train["V1"])
table(train_pred,train$V2)

#prediction on test data
test$test_pred <- predict(svm_model,test)
test

希望这会有所帮助!

【讨论】:

@Jurafsky 如果有帮助,请不要忘记告诉我们! 非常感谢您拯救了我的一天!看起来很复杂:什么是“rbind”?我应该每次都编写所有这些代码还是可以做一些更简单的事情,例如在源文件中(行和列布局) 为什么每次测试和训练数据都要合并? 很高兴它有帮助!要回答您的问题 - 1) rbind 用于合并两个数据框。 2)为什么每次都合并? - SVM 包e1071 的要求表示“测试”数据集中的因素不应与模型在训练期间已知的因素不同。所以基本上通过合并(即rbind),我们让模型提前知道所有因素。如果您检查str(train),那么您会发现比str(train_data) 更多的因子,因为现在train 具有训练和测试数据集的因子(rbind 确实很神奇!)。希望对您有所帮助! 如何查看有没有分类不好的类?使用“表”我可以看到分类的类和特征的划分,但我怎么能看到(在确定错误分类的情况下),哪些特征被错误分类了?而且,有没有办法改进(或如我所见,“调整”)支持向量机?再次感谢您

以上是关于如何使用 R e1071 SVM 多类测试数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中构建多类 SVM?

R - SVM 训练后的奇怪错误/警告 (e1071)

如何减少 SVM 的执行时间

R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集)简单线性核的支持向量机SVM(模型在测试集上的表现可视化模型预测的结果添加超平面区域与原始数据标签进行对比分析)如何改进核函数

R中的SVM函数

如何在 R 中绘制一类 SVM?