为了进行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函数),在相同的数据上使用相同的参数 . 唯一的区别是我传递这些参数的方式 . 结果如何如此不同?