2017-09-13 9 views
2

私はかなり単純なSVM分類器[SVM = Support Vector Machine]と信じています。異なるパラメータで正規分布したデータを使って "テスト"すると、クラシファイアは私に50%の精度を返します。なにが問題ですか?ここで明確に分離可能なデータのための確率レベルの精度

はコードで、結果が再現可能でなければなりません:

features1 = normrnd(1,5,[100,5]); 
features2 = normrnd(50,5,[100,5]); 
features = [features1;features2]; 
labels = [zeros(100,1);ones(100,1)]; 

%% SVM-Classification 
nrFolds = 10; %number of folds of crossvalidation 
kernel = 'linear'; % 'linear', 'rbf' or 'polynomial' 
C = 1; % C is the 'boxconstraint' parameter. 

cvFolds = crossvalind('Kfold', labels, nrFolds); 


for i = 1:nrFolds       % iterate through each fold 
    testIdx = (cvFolds == i);    % indices test instances 
    trainIdx = ~testIdx;      % indices training instances 

    % train the SVM 
    cl = fitcsvm(features(trainIdx,:), labels(trainIdx),'KernelFunction',kernel,'Standardize',true,... 
    'BoxConstraint',C,'ClassNames',[0,1]); 

    [label,scores] = predict(cl, features(testIdx,:)); 
    eq = sum(labels(testIdx)); 
    accuracy(i) = eq/numel(labels(testIdx)); 

end 

crossValAcc = mean(accuracy) 

答えて

2

あなたは正しく正確さを計算されていません。元のデータと一致する予測の数を決定する必要があります。正しい予測の実際の数ではなく、テストセット内の1の合計数を単純に合計しているだけです。

eq = sum(labels(testIdx) == label); 

リコールlabels(testIdx)は、あなたのテストセットから真のラベルを抽出し、labelがあなたのSVMモデルから予測された結果であること:

したがって、あなたはこれまであなたのeq文を変更する必要があります。これは0/1のベクトルを正しく生成します。0は予測がテストセットの実際のラベルと一致しないことを意味し、1は一致することを意味します。彼らが同意するたびに合計を計算するか、ベクトルが1であるたびに精度を計算する方法です。

+0

はいバグがあり、今すぐ実現しました!質問:それ以外は全体的なロジックが正しいですか?ハイパーパラメータを最適化していないとき(このように)、この検証精度は新しいテストセットの分類子の精度に等しいと思いますか? – Pegah

+1

@ペガ本当にあなたのロジックは完璧です。この場合にハイパーパラメータを最適化しない場合でも、フィーチャスペースが完全に線形に分離可能である場合、各折り畳みでのクロスバリデーションの精度は、平均が実際の精度と一致する必要があります。 2つのデータディストリビューションの間に重複がないように、あなたは人為的にデータセットを作成しています。これにより、各折りたたみ時に同じクロス検証が確実に行われるはずです。 – rayryeng

+1

は意味があります、thx非常に – Pegah

関連する問題