1つのグループが他のグループよりも多く表示されるトレーニングデータからSVMを構築しようとしています。ただし、グループは最終的なテストデータで等しく表されます。そのため、Rパッケージインターフェイスのclass.weights
パラメーターを使用して、トレーニングデータの2つのグループの影響のバランスを取りたいと思います。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
PARAMTERは、働いているソートの下I重量として、a
それはこのシミュレーションで表現されて(と私は省略した場合は下げる、class.weights
それは1に近い返します)...しかし、単純に1の重みを使用して、なぜ私は理解していない:2( 2:1のトレーニングデータの場合、50%に下がることはありません。
SVMを誤解している場合、誰かがこの点を説明できますか?(またはいくつかの参照を送信しますか?)
私が間違っている場合、誰かがclass.weights
パラメーターを使用する正しい方法を教えてもらえますか?
おそらくバグでしょうか?(私はこのソフトウェアと基礎となるlibsvmがかなり成熟していると理解しているので、そうは思わない)