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

Posted

技术标签:

【中文标题】R - SVM 训练后的奇怪错误/警告 (e1071)【英文标题】:R - weird error/warning after SVM training (e1071) 【发布时间】:2014-05-05 18:05:15 【问题描述】:

我在训练 e1071 SVM 后遇到一个奇怪的错误。它是一个文本文档多类分类,基于大型 (10000x1000) 稀疏矩阵 (DTM)。特征(列)似乎有问题。

summary(svmModel) 有效。结果可能会更好(一如既往(;)。

但是,出了点问题,这可能是结果不一致的原因。

> svmModel <- svm(labels ~., data= train[,-1], cross = 10, seed = 1234, kernel="linear")

Warning message:
In svm.default(x, y, scale = scale, ..., na.action = na.action) :
  Variable(s) ‘abgebildet’ and 
...
‘could’ and  [... truncated]

【问题讨论】:

在训练和测试之前,您是否检查了自述文件以格式化特征数据? 【参考方案1】:

在您的训练数据集中检查没有值的变量。一种方法是对所有列求和。

colSums(train[,!colnames(train)=yvar])

如果我无法移除的自变量的值为 0,我通常将分层样本作为训练数据集。这通常是为一个取值 0 和 1 的标志变量完成的。

#stratified sampling
library(sampling)
Training<- strata(train, stratanames = "emptyvar", size = c(1000,500))
#this creates a sample of size 1000 and 500 for 0 and 1 each
strata.train<-getdata(train,Training)
#it creates additional 3 columns which you can remove
train<-strata.train[,!colnames(strata.train) %in% c("ID_unit","Prob","Stratum")]

另一方面,您也可以将scale=F 添加到您的svm() 并预先缩放您的变量。这避免了 svm 函数缩放你的变量,这导致 z 值是一个 NaN,其中变量为空。但是,您希望缩放可以手动执行的变量。

cols<-c(1:5) #say you want to scale the first 5 variables
library(plyr)
standardize <- function(x) as.numeric((x - mean(x)) / sd(x))
train[cols] <- plyr::colwise(standardize)(train[cols])

【讨论】:

【参考方案2】:

如果有些词很少出现,那么训练数据中的相应特征可能只有 0 的可能性不大。我相信这可能会导致此警告。

【讨论】:

这更像是一条评论——但是如何解决这个问题呢?他们是否需要减少列的数量(可能使用 PCA 或类似的东西?)

以上是关于R - SVM 训练后的奇怪错误/警告 (e1071)的主要内容,如果未能解决你的问题,请参考以下文章

使用线性内核调整 SVM 时,R 插入符号异常缓慢

将 SVM 分类器应用于看不见的新数据时,我遇到了错误消息。 (R 用户)

R中的svm,训练数据集[关闭]

数据集必须包含 R 中 SVM 中的所有因素

在 R 中绘制由 caret 包训练的 SVM 线性模型

在kernlab中的SVM训练之外的内核矩阵计算