私はlibsvmを使用しており、非常に単純な実験を行い、10k ベクトルをトレーニングし、わずか 22 でテストしました。パラメータ cost で線形カーネルを使用していますC=1
。私の問題はマルチクラスです。したがって、Libsvm は 1 対 1 のアプローチを使用してデータを分類します。Libsvm はSMOを使用して分離ハイパープレーンを見つけます。
私の友人が同じ実験をしましたが、使用した SVM 分類器はStatistics Toolboxからのものでした。彼は R のe1071パッケージも使用しました。ここでも、使用したカーネルは線形カーネルで、パラメーター コストC
は 1 に等しく、MATLAB でデータを分類するために 1 対 1 アプローチが使用されています (1 対 1アプローチは私の友人によってコーディングされました) と e1071 R パッケージ。MATLAB Statistics Toolbox と R の e1071 はどちらも、既定で分離超平面を見つけるために SMO アプローチを使用します。
最新のLIBLINEARライブラリも試しました。繰り返しますが、同じ構成が使用されました。
使用されるコードは次のとおりです。
libsvm 3.18 (コマンドライン)
./svm-scale -s train.range train.libsvm > train.scale
./svm-scale -r train.range test.libsvm > test.scale
./svm-train -t 0 -c 1 train.scale train.model
./svm-predict test.scale train.model test.predict
liblinear 1.94 (コマンドライン)
./svm-scale -s train.range train.libsvm > train.scale
./svm-scale -r train.range test.libsvm > test.scale
./train train.scale train.model
./predict test.scale train.model test.predict
R
rm(list = ls())
cat("\014")
library(e1071)
cat("Training model\n")
Traindata = read.csv("train.csv", header=FALSE)
SVM_model = svm(Traindata[,2:ncol(Traindata)], Traindata[,1], kernel="linear", tolerance=0.1, type="C-classification")
print(SVM_model)
cat("Testing model\n")
Testdata = read.csv("test.csv", header=FALSE)
Preddata = predict(SVM_model, Testdata[,2:ncol(Testdata)])
ConfMat = table(pred=Preddata, true=Testdata[,1])
print(ConfMat)
accuracy = 0
for (i in 1 : nrow(ConfMat)) {
for (j in 1 : ncol(ConfMat)) {
if (i == j) {
accuracy = accuracy + ConfMat[i, i]
}
}
}
accuracy = (accuracy / sum(ConfMat)) * 100
cat("Test vectors:", dim(Testdata), ", Accuracy =", accuracy, "%\n")
いくつかの精度の違いがあります:
- Libsvm は 22 個のテスト特徴ベクトルのうち 11 個を正しく分類しました
- liblinear は 22 個のテスト特徴ベクトルのうち 18 個を正しく分類しました
- R は 22 個のテスト特徴ベクトルのうち 17 個を正しく分類しました
- 私の友人の 1 対 1 の MATLAB 実装は、22 個の特徴ベクトルのうち 19 個を正しく分類しました。
では、なぜ予測が異なるのでしょうか。つまり、すべての SVM が線形カーネルを使用し、コスト パラメーターが同じで、マルチクラス分類に同じアプローチを使用している場合、結果は同じではないでしょうか?