1

K-NN 分類が MATLAB でどのように機能するかを理解するのに問題があります。問題は次のとおりです。大規模なデータセット (1500 を超える被験者に対して 65 の特徴) と、それぞれのクラスのラベル (0 または 1) があります。私に説明されたことによると、データをトレーニング、テスト、および検証のサブセットに分割して、データに対して教師付きトレーニングを実行し、K-NN を介して分類する必要があります。まず、3 つのサブグループを分割する最適な比率はどれくらいですか (それぞれのデータセットのサイズの 1/3 ですか?)。

ClassificationKNN/fitcknn 関数と crossval 関数 (理想的にはデータを分割するため) を調べましたが、それらの使用方法が本当にわかりません。

要約すると、私が望んでいた-データを3つのグループに分割-トレーニングサブセットを使用してKNNを「トレーニング」(トレーニングを必要とする方法ではなく、トレーニングと同等であることはわかっています)-テストサブセットを分類し、分類エラーを取得します/パフォーマンス - 検証テストを実施する意味は何ですか?

よろしくお願いします。

編集:私はそれを行うことができたと思いますが、それがあまり求めていなければ、私が何かを見逃していないか見てもらえますか? これはランダムな場合の私のコードです:

nfeats=60;ninds=1000;
trainRatio=0.8;valRatio=.1;testRatio=.1;
kmax=100; %for instance...
data=randi(100,nfeats,ninds);
class=randi(2,1,ninds);
[trainInd,valInd,testInd] = dividerand(1000,trainRatio,valRatio,testRatio);
train=data(:,trainInd);
test=data(:,testInd);
val=data(:,valInd);
train_class=class(:,trainInd);
test_class=class(:,testInd);
val_class=class(:,valInd);
precisionmax=0;
koptimal=0;
for know=1:kmax
      %is it the same thing use knnclassify or fitcknn+predict??
      predicted_class = knnclassify(val', train', train_class',know);
      mdl = fitcknn(train',train_class','NumNeighbors',know) ;
      label = predict(mdl,val');
      consistency=sum(label==val_class')/length(val_class);
      if consistency>precisionmax
          precisionmax=consistency;
          koptimal=know;
      end
  end
mdl_final = fitcknn(train',train_class','NumNeighbors',know) ;
label_final = predict(mdl,test');
consistency_final=sum(label==test_class')/length(test_class);

たくさんのご協力ありがとうございました

4

1 に答える 1

2

あなたの最初の質問 「3つのサブグループを分割するのに最適な比率は何ですか」については、経験則のみがあります。

  1. トレーニング データの量が最も重要です。多ければ多いほどよい。したがって、できるだけ大きくし、テストまたは検証データよりも確実に大きくしてください。

  2. テスト データと検証データは同様の機能を持っているため、同じ量のデータを割り当てると便利です。しかし、過剰適応を認識できる十分なデータを持つことが重要です。したがって、それらはデータベースから完全にランダムに選択する必要があります。

したがって、50/25/25 または 60/20/20 のパーティショニングが非常に一般的です。ただし、選択したトポロジの重みの総数に比べてデータの総量が少ない場合 (たとえば、ネットに 10 個の重みがあり、データに 200 個のケースしかない場合)、70/15/15 または 80/10/10 になります。より良い選択かもしれません。

2番目の質問 「検証テストを行う意味は何ですか?」に関して。:

通常、選択したモデルをトレーニング データでトレーニングし、トレーニング済みのモデルを目に見えないデータ (検証セット) に適用することで、"成功" を推定します。

精度を向上させるための努力を完全にやめた場合、データの 3 つのパーティションはまったく必要ありません。しかし、通常、重みや隠れ層の数を変更するなどして、モデルの成功を改善できると感じています。そして、多くの反復で大きなループが実行され始めます。

1) ウェイトとトポロジーを変更する、2) トレーニングする、3) 検証する、満足しない、1) に進む

このループの長期的な効果は、モデルを検証データにますます適応させることです。これにより、トポロジーを賢く改善するためではなく、検証セットのプロパティと対処方法を無意識のうちに学習するため、結果が改善されます。彼ら。

これで、ニューラル ネットワークの最終的かつ唯一の有効な精度は、実際には目に見えないデータであるテスト セットで推定されます。これは一度だけ行われ、過剰適応を明らかにするのにも役立ちます。テスト セットへの適応を禁止するために、2 番目のさらに大きなループを開始することは許可されていません。

于 2014-07-10T17:58:46.900 に答える