2014-01-19 2 views
-1

친구, 현재 나는 LIBSVM을 사용하여 SVM 분류기 (5 배 교차 유효성 검사)에서 일하고 있습니다. 아래에는 언급 된 코드가 있습니다. 데이터에는 3 개의 클래스가있는 120 x 4 벡터가 있습니다. 그러므로 각 폴드는 trainData = 120 x 4, testData = 30 x 4입니다. 문제는 혼란 행렬에서 분류 정확도를 얻어야한다는 것입니다. 다음 질문에 대한 대답이 필요합니다.LIBSVM을 사용하여 혼동 행렬에서 분류 정확도를 얻는 방법은 무엇입니까?

  1. 혼란 매트릭스에서 각 클래스의 분류 정확도를 얻는 방법 ??
  2. 확률 추정의 필요성은 무엇입니까?
  3. "가장 높은 확률로 클래스를 예측하시오"라는 용어는 무엇을 말합니까?
  4. "acc"의 결과를 이해하지 못합니까 ???

미리 감사드립니다.

코드는 다음과 같습니다

load fisheriris     %# Fisher Iris dataset 
[~,~,labels] = unique(species); %# labels: 1/2/3 
data = zscore(meas);    %# scale features 
numInst = size(data,1); 
numLabels = max(labels); 
FISH =[]; 

numFolds = 5; 
for jj=1:5% number of iterations 

indices = crossvalind('Kfold',labels,numFolds);  % K-Fold Validation 
for ii = 1:numFolds 
test = (indices == ii); 
train = ~test 

%# split training/testing 
idx = randperm(numInst); 
numTrain = 120; numTest = numInst - numTrain; 
trainData = data(idx(1:numTrain),:); testData = data(idx(numTrain+1:end),:); 
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end)); 

%# train one-against-all models 
model = cell(numLabels,1); 
for k=1:numLabels 
model{k} = svmtrain(double(trainLabel==k), trainData, '-t 2 -c 1 -g 1 -b 1'); 
end 

%# get probability estimates of test instances using each model 
prob = zeros(numTest,numLabels); 
for k=1:numLabels 
[~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 
prob(:,k) = p(:,model{k}.Label==1); %# probability of class==k 
end 

%# predict the class with the highest probability 
[~,pred] = max(prob,[],2); 
acc = sum(pred == testLabel) ./ numel(testLabel) %# accuracy 
CM = confusionmat(testLabel, pred)     %# confusion matrix 
end 
FISH =[FISH;(CM(1,1)/10)*100 (CM(2,2)/10)*100 (CM(3,3)/10)*100)  
end 

답변

1

1. How to get the classification accuracy for each class from confusion matrix??

귀하의 코드는 일 - 대 - 모든 문제로 변환하여 3 클래스 분류 문제를 처리합니다. 보다 구체적으로이 코드 double(trainLabel==k)은 같은 라벨을 가진 샘플에 라벨 1을 할당하고 나머지에는 라벨 0을 할당합니다. 이것은 for 루프 내의 모든 클래스에 대해 수행되고 각 경우에 대한 모델을 저장합니다. 실제로 이진 분류 문제가있는 경우 sensitivityspecificity 측정 값을 사용할 수 있습니다. 일반적으로 네거티브 및 포지티브 라벨이있는 경우 분류 기준은 분류 기준이 음수 라벨을 얼마나 효과적으로 식별 하는지를 측정하는 반면 민감도는 양수 라벨을 식별하는 분류 기준의 효율성을 측정합니다. 좋은 참고 자료는 here입니다.

2. What is the need for probability estimates?

LIBSVM는 파라미터 옵션 (-b 1) 확률 정보 모델을 구하는 확률 추정치로 테스트 데이터를 예측할 수있다. 다음 코드에서

%# get probability estimates of test instances using each model 
prob = zeros(numTest,numLabels); 
for k=1:numLabels 
[~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 
prob(:,k) = p(:,model{k}.Label==1); %# probability of class==k 
end 

주석이 언급 할 때 우리는 각 객체가 클래스에 속할 확률을 얻습니다. 이것은 모델을 반복하고 각 샘플이 k 변수로 지정된 클래스에 속할 확률을 저장하여 얻습니다. 이 작업은 모든 레이블 numLabels에 대해 수행됩니다.

3. What the term refers "predict the class with the highest probability"? 매트릭스 prob에는 레이블 수만큼 샘플 수 및 열 수만큼의 행이 있습니다. 각 열에는 레이블 번호에 해당하는 표본의 확률이 열의 수에 포함됩니다. 행의 다음 번호 0.7 0.2 0.1가있는 경우, 예를 들어 그 대응하는 샘플은 1

4. I do not understand the result of "acc"??? acc 고전 정밀도 메트릭 인 클래스에 속한다 : 샘플의 총 개수로 나눈 정확하게 분류 샘플들의 총 개수 . 이것은 행렬의 대각 원소를 합산하여이 수를 행렬의 총 프레임 수로 나눔으로써 혼동 행렬에서 얻을 수도 있습니다.

관련 문제