データセットが 1 つあり、データセット全体に対して 10 倍の交差検証などの交差検証を行う必要があります。パラメータを選択して放射基底関数 (RBF) カーネルを使用したいと考えています (RBF カーネルには C とガンマの 2 つのパラメータがあります)。通常、人々は開発セットを使用して SVM のハイパーパラメーターを選択し、開発セットに基づいて最適なハイパーパラメーターを使用し、それをテスト セットに適用して評価します。ただし、私の場合、元のデータセットは 10 個のサブセットに分割されています。残りの 9 つのサブセットでトレーニングされた分類子を使用して、1 つのサブセットが順次テストされます。固定されたトレーニング データとテスト データがないことは明らかです。この場合、ハイパーパラメータの選択はどのようにすればよいですか?
1 に答える
特定の理由で、データが正確に10 個のパーティションに分割されていますか? それらを再度連結/シャッフルできない場合は、通常の (繰り返し) 交差検証を実行して、パラメーター グリッド検索を実行します。たとえば、10 個のパーティションと 10 個の繰り返しを使用すると、合計 100 個のトレーニング セットと評価セットが得られます。これらは現在、すべてのパラメータ セットのトレーニングと評価に使用されているため、試行したパラメータ セットごとに 100 個の結果が得られます。パラメータ セットごとの平均パフォーマンスは、セットごとの 100 個の結果から計算できます。
caret
このプロセスは、R でのこの短い例のように、ライブラリを使用して、ほとんどの ML ツールに既に組み込まれています。
library(caret)
library(lattice)
library(doMC)
registerDoMC(3)
model <- train(x = iris[,1:4],
y = iris[,5],
method = 'svmRadial',
preProcess = c('center', 'scale'),
tuneGrid = expand.grid(C=3**(-3:3), sigma=3**(-3:3)), # all permutations of these parameters get evaluated
trControl = trainControl(method = 'repeatedcv',
number = 10,
repeats = 10,
returnResamp = 'all', # store results of all parameter sets on all partitions and repeats
allowParallel = T))
# performance of different parameter set (e.g. average and standard deviation of performance)
print(model$results)
# visualization of the above
levelplot(x = Accuracy~C*sigma, data = model$results, col.regions=gray(100:0/100), scales=list(log=3))
# results of all parameter sets over all partitions and repeats. From this the metrics above get calculated
str(model$resample)
ハイパーパラメータのグリッドを評価したら、適切なパラメータ セットを選択できます (「モデル選択」。たとえば、適切に機能しながら複雑でないモデルを選択するなど)。
ところで:可能であれば、クロスバリデーションよりもクロスバリデーションを繰り返すことをお勧めします(最終的には10回以上の繰り返しを使用しますが、詳細は問題によって異なります)。@christian-cerri が既に推奨しているように、新しいデータに対する最終モデルのパフォーマンスを推定するために使用される追加の目に見えないテスト セットを用意することをお勧めします。