【问题标题】:SVM in R, value of cost doesn't affect test error rateR中的SVM,成本值不影响测试错误率
【发布时间】:2013-10-29 00:43:40
【问题描述】:

我目前在 R (e1071) 中使用带有线性内核的 SVM 来尝试对高维数据集进行分类。它由大约 300 名患者组成,为每位患者测量了大约 12000 个基因活性水平。我的目标是根据这些基因活动预测患者对某种药物的反应(二元:治疗有效与否)。

我想建立传递给 tune.svm 函数的成本值范围,这就是我遇到麻烦的地方。我的理解是,这样做的方法是逐步尝试越来越小的值,直到分别建立合理性能的下限和上限;然而,当我尝试这样做时,无论我的可能成本有多大或多小,我得到的测试错误率都不会低于 50% 左右。我的实际数据集和这个玩具版本都会发生这种情况。如果这个子集太小,我可以提供更重要的部分。感谢您的建议。

我的代码:

dat.ex <- read.table("svm_ex.txt", header=T, row.names=1)
trainingSize <- 20
possibleCosts <- c(10^-50, 10^-25, 10^25, 10^50)
trainingDat <- sample(1:dim(dat.ex)[1], replace = FALSE, size = trainingSize)
ex.results <- vector()

for(i in 1:length(possibleCosts))
{
  svm.ex <- svm(dat.ex[trainingDat, -1], factor(dat.ex[trainingDat, 1]), kernel="linear", cost=possibleCosts[i], type="C-classification")
  test.ex <- predict(svm.ex, newdata=data.frame(x = dat.ex[-trainingDat,-1]))
  truth.ex <- table(pred = test.ex, truth = factor(dat.ex[-trainingDat,1]))
  exTestCorrectRate <- (truth.ex[1,1] + truth.ex[2,2])/(dim(dat.ex)[1] - trainingSize)
  ex.results[i] <- exTestCorrectRate  
}
print(ex.results)

【问题讨论】:

    标签: r machine-learning svm


    【解决方案1】:

    首先,您尝试使用丑陋怪异的 C 值。您应该检查更小的值范围(比如在1e-15 和1e10 之间)和更大的分辨率(例如 - 我建议的间隔有 25 个不同的值)。

    其次,您的数据集非常小。 20 个 10 维的训练向量可能很难建模

    【讨论】:

    • 我添加了更多数据(现在对 80 个特征有 50 个观察值)。不应该存在成本值​​如此极端以至于模型无法对几乎所有观察进行分类的成本值吗?使用我添加的更大数据集,当我运行 cost = 1e-50 时,我得到 73% 的观察结果被正确预测。这对我来说似乎是不可能的。我认为当成本变得如此微观时,模型就会严重过度拟合并且在测试数据上表现极差。这个模型怎么表现得这么好?
    • 模型过拟合大成本,不小。成本是 SVM 方程的原始公式中的C 参数。它定义了可分离性“力”——随着 C 趋于无穷大,你得到硬边距分类器,而 C 趋于零——你让越来越多的点在训练期间被错误分类。即使线性模型不容易过度拟合,因为您对可能模型的复杂性有很强的限制。顺便提一句。 R 使用 double 来存储数值,因此将天文值设置为 1e-50 或 1e50 很有可能导致一些数值不足/溢出。
    • 感谢您澄清低成本与高成本。我尝试了 c(10^-15, ..., 10^-8) 的成本,除了其中一个之外,正确的测试预测率 >= 60%,这似乎仍然很高。同样,对于 c(1e9, .. 1e16) 中的成本,正确的测试预测率在 53% 到 87% 之间。 C = 1e16 87% 的正确率似乎好得令人难以置信。由于过度拟合,我预计极高的成本会给我大约 0% 的正确预测率。这不是真的吗?
    • 正如我之前所说的 - linear SVM 在很多情况下都不会过拟合,因为它是一个过于简单的模型。还要记住,仅对一部分数据进行测试并不能很好地估计模型的正确性。您应该使用交叉验证来找到更合理的结果
    • 我用径向内核尝试了这个例子,并使用了 (cost, gamma) = {(1e10, 1e5), (1e10, 1e-5), (1e-10, 1e5), (1e- 10, 1e-5)}。我每次都用不同的子集为我的训练数据重复这 100 次。我得到的是最差的性能是 0.339 的错误率,最好的性能是 0.103 的错误率。我还在犯同样的错误吗?我无法想象 1e10 的成本和 1e-5 的 gamma 实际上应该表现良好。
    【解决方案2】:

    我发现了问题。在完整的数据集中,大约 2/3 的响应是 1,1/3 是 0。对于这些极端参数,每个响应都被预测为 1,因此测试错误率在 50% - 80% 的范围内(有些由于训练数据选择而发生的波动)不断发生。

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 2020-01-08
      • 2015-03-08
      • 1970-01-01
      • 2014-05-18
      • 2022-06-11
      • 2018-06-10
      • 2023-04-08
      相关资源
      最近更新 更多