我正在尝试从训练数据构建一个SVM,其中一组代表的数量更多。但是,组将在最终的测试数据中均等地代表。因此,我想使用R包接口的class.weights
参数来平衡两组在训练数据中的影响。e1071
libsvm
由于我不确定应该如何指定这些权重,因此我进行了一些测试:
- 生成一些空数据(随机特征;组标签之间的比例为2:1)
- 使用
class.weights
参数集安装一个svm 。 - 预测一堆新的空数据集并查看类比例。
- 针对不同的空训练集重复整个过程很多次。
这是我正在使用的R代码:
nullSVM <- function(n.var, n.obs) {
# Simulate null training data
vars = matrix(rnorm(n.var*n.obs), nrow=n.obs)
labels = rep(c('a', 'a', 'b'), length.out=n.obs)
data = data.frame(group=labels, vars)
# Fit SVM
fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))
# Calculate the average fraction of 'a' we would predict from null test data
mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}
library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))
从这个整体来看,我期望输出〜0.5,但是,这不是我得到的:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
该class.weights
放慢参数工作,排序,作为下我的重量a
,降低了它在这个模拟代表(如果我忽略class.weights
它返回接近1)......但为什么仅仅使用1的权重,我不明白:2( (2:1)的训练数据并不能使我一路跌到50%。
如果我误解了SVM,有人可以解释这一点吗?(或发送一些参考?)
如果我做错了,有人可以告诉我使用class.weights
参数的正确方法吗?
可能是错误吗?(我认为不是,因为我了解此软件以及基本的libsvm相当成熟)