R e1071包中的SVM针对不同的公式表示法产生不同的输出,但是相同的数据和参数

时间:2017-06-13 19:21:30

标签: r svm predict confusion-matrix

为了进行Twitter情绪分析,我使用的是e1071软件包中的SVM功能。 我使用RTextTools包创建了一个文档术语矩阵,我将其拆分为训练和测试集。我有“训练”,这是训练观察的数据框,不包括预测变量。然后我有“sentitrain”,它是对应于训练集的情绪值的向量。同样用于测试。 然后我使用三种不同的方法来拟合SVM模型。 首先,我创建了一个容器

trainmat = as.matrix(train)
# create container object
traincontainer = create_container(trainmat, 
                           sentitrain,
                           trainSize = 1:nrow(trainmat), 
                           virgin = FALSE)

# create test matrix


testmat = as.matrix(test)
testcontainer = create_container(testmat, labels = rep(0, nrow(test)), 
                               testSize = 1:nrow(test), virgin = FALSE)

model <- train_model(traincontainer , "SVM", kernel="radial", cost=400)
results = classify_model(testcontainer, model)
preds = results[,1]
confusionMatrix(table(preds, sentitest))

这给了我大约76%的分类准确度。

在第二种方法中,我只是取了训练矩阵的列名,然后创建了一个公式:

n = names(train)
# exclude the predicted variable
n = setdiff(n, c("sentiment"))
predictors = paste(n, collapse = " + ")

# create formula
f = as.formula(paste("sentiment ~ ", predictors))

model = svm(f, data = train, cost = 400, kernel = "radial")    
preds = predict(model, test)
confusionMatrix(table(preds, sentitest))

这给了我大约69%的准确度。

第三,我只是将数据帧和预测值的向量直接传递给函数调用:

model = svm(train, sentitrain, data = train, cost = 400, kernel = 
"radial")    
preds = predict(model, test)
confusionMatrix(table(preds, sentitest))

这导致了惊人的87%准确度。 我通过交叉验证多次运行每个模型,以确保这些差异不是由于随机性。 据我所知,我总是使用同一个包中的相同函数(RTextTools在内部调用e1071的SVM函数),在相同的数据上使用相同的参数。唯一的区别是我传递这些参数的方式。结果如何如此不同?

0 个答案:

没有答案