【问题标题】:Setting C for Linear SVM为线性 SVM 设置 C
【发布时间】:2019-12-05 11:05:26
【问题描述】:

这是我的问题:

我有一个关于液压系统状况的中等大小的数据集。

数据集由68个变量加上系统条件(绿、黄、红)表示

我必须使用几个分类器来预测系统的行为,所以我将我的数据集分为训练集和测试集,如下所示:

(谈条件,颜色表示:红色-警告,黄色-注意,绿色-良好)

这是我写的

Tab$Condition=factor(Tab$Condition, labels=c("Yellow","Green","Red")) 

set.seed(32343)

reg_Control = trainControl("repeatedcv", number = 5, repeats=5, verboseIter = T, classProbs =T)

inTrain = createDataPartition(y=Tab$Condition,p=0.75, list=FALSE)

training = Tab[inTrain,]

testing = Tab[-inTrain,]

我正在使用 SVM 线性分类器来预测系统的行为。

我首先使用 C 的随机值来查看我应该得到什么样的结果。



svmLinear = train(Condition ~.,data=training, method="svmLinear", trControl=reg_Control,tuneGrid=data.frame(C=seq(0.1,1,0.1))) 

svmLPredictions = predict(svmLinear,newdata=training)


confusionMatrix(svmLPredictions,training$Condition) 



#misclassification of 129/1655 accuracy of 92.21%


svmLPred = predict(svmLinear,newdata=testing) 


confusionMatrix(svmLPred,testing$Condition)


#misclassification of 41/550 accuracy of 92.55%


我使用 SVM 线性分类器来预测系统的行为。

正如我在开始使用 RANDOM VALUE FOR C 之前所说的那样。

我如何决定用于分析的最佳价值?

对不起,如果问题是平庸的,但我是初学者!

答案会很有帮助!

谢谢

【问题讨论】:

  • 您使用的是哪个软件包?如果您查看实现文档,它将为您提供使用的默认值。我认为大多数实现中的默认成本值是 1。您可以将所有其他参数固定使用 C 的小于和大于 1 的值,看看哪个方向可以改善结果。基本上这是 gridSearch 的本质
  • 我正在使用插入符号!因此,您建议尝试为 C.. 尝试使用小于 1 的值,看看在准确性和错误分类方面我得到了什么样的差异/改进......??另一个重要的问题是……我应该每次都从“view()”和“confusionMatrix()”检查 C 的结果吗?谢谢
  • 其实训练好的模型会告诉你各种参数的准确度分数。只需在控制台上输入svmLinear。第一部分,使用tunegrid=data.frame(C=c(0.5, 1,1.5))
  • 我保持 tuneGrid=data.frame(C=seq(0.1,1,0.1) 作为建议的暗示计算中的一些错误(我刚刚尝试过!)。如果我输入svmLinear 在控制台上我可以看到结果,最好的一个是 C = 0.2 和 Accuracy = 0.91。我是否应该检查结果以使用混淆矩阵进行训练和测试,或者控制台上的 svmLinear 输入是否详尽......?一旦我已经这样做了,我可以试试 tuneGrid=data.frame(C=seq(1,10,1) 你觉得怎么样?
  • 不,你不必用混淆矩阵来分析它。所有这些都已通过由tuneControlparameters 管理的 k 折交叉验证过程完成。实际上,我们根本不需要 testing 部分,除非我们想创建许多其他模型(如 svmRadialWeights )并将这些模型的性能相互比较。

标签: r svm r-caret


【解决方案1】:

Caret 调用其他包来运行实际的建模过程。 Caret 本身在这方面只是一个(非常强大的)便利包。但是,它会自动执行此操作,因此除非引发错误,否则用户可能不会轻易意识到这一点 无论如何,我拼凑了一个例子来解释这个过程。

library(caret)
data("iris")

set.seed(1024)

tr <- createDataPartition(iris$Species,  list = FALSE)
training <- iris[ tr,]
testing  <- iris[-tr,]

#head(training)
fitControl <- trainControl(##smaller values for quick run
  method = "repeatedcv",
  number = 5,
  repeats = 4)

set.seed(1024)

tunegrid=data.frame(C=c(0.25, 0.5, 1,5,8,12,100))
tunegrid

svmfit <- train(Species ~ ., data = training, 
                method = "svmLinear", 
                trControl = fitControl,
                tuneGrid= tunegrid) 

#print this, it will give model's  accuracy (on train data) given various 
# parameter values
svmfit

#C       Accuracy   Kappa
#0.25    0.9533333  0.930
#0.50    0.9666667  0.950
#1.00    0.9766667  0.965
#5.00    0.9800000  0.970
#8.00    0.9833333  0.975
#12.00   0.9833333  0.975
#100.00  0.9400000  0.910 
#The final value used for the model was C = 8.  

# it has already chosen the best model (as per train Accuracy )
# how well does it work on test data?
preds <-predict(svmfit, testing)
cmSVM <-confusionMatrix(preds, testing$Species)
print(cmSVM)

【讨论】:

  • 非常感谢!!好的例子。现在在我的情况下,我只需要验证 C 的值是否大于 1 会产生最佳结果,对吗?然后我将不得不保留最适合我情况的代码部分! (这是因为到目前为止我尝试使用小于 1 的值)。
  • 是的。尽管在所有实现中 C 的默认值都是 1,但它没有规定的范围。我们唯一可以确定的是,它的值越高,边距越小(在类边界处)。也就是说,它将更好地拟合训练数据,但更有可能对看不见的数据进行错误分类。这就是为什么上面的模型选择 C=8 而不是 12。
  • 您能解释一下我在控制台上键入时 SvmLinear 显示的准确度与模型在训练和测试上的准确度之间的区别吗??
  • 输入 SvmLinear 时显示的准确度值是每个模型运行 20 次 (number/folds = 5 x repeats=4) 的平均值。每个模型都描述了我们参数 C 的一个值。我将尝试扩展我的答案以展示整个过程是如何运行的。但是,如果您想了解训练和测试精度的不同之处,不使用 Caret 的训练模型将提供更好的理解。例如,检查包 e1071 ?e1071::svm 中的 SVM 实现
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2016-07-25
  • 1970-01-01
  • 2014-12-15
  • 2015-09-06
  • 2017-09-08
相关资源
最近更新 更多