2017-09-13 1 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 문을 변경해야합니다 labels(testIdx)는 테스트 세트에서 진정한 라벨을 추출하고 label이 SVM 모델에서 예측 된 결과입니다

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

리콜있다. 이렇게하면 0/1의 벡터가 올바르게 생성됩니다. 여기서 0은 예측이 테스트 집합의 실제 레이블과 일치하지 않는다는 것을 의미하고 1은 동의한다는 것을 의미합니다. 그들이 동의 할 때마다 또는 벡터가 1 일 때마다 합산하여 정확도를 계산하는 방법입니다.

+0

예 총 버그는 지금 당장 깨달았습니다. 질문 : 그렇지 않으면 전체 논리가 맞습니까? 나는 하이퍼 파라미터 (여기에서와 같이)를 최적화하지 않을 때이 유효성 검사 정확도가 새 테스트 세트에서 내 분류 자의 정확도와 같다고 생각하십니까? – Pegah

+1

@ 페가 정말로 당신의 논리는 완벽합니다. 이 경우 하이퍼 매개 변수를 최적화하지 않은 경우, 형상 공간이 완전히 선형으로 분리 가능하면 각 접기에서 교차 유효성 검사의 정확도가 일치해야 평균이 실제 정확도와 일치해야합니다. 두 가지 데이터 분포가 겹치지 않도록 인위적으로 서로 다른 수단으로 인위적으로 데이터 세트를 만들었으므로 각 폴드에서 동일한 교차 유효성 검사가 반드시 이루어져야합니다. – rayryeng

+1

은 의미가 있습니다, thx 대단히 – Pegah