Как подать голосование по классификаторам и получить достоверность классификации? - PullRequest
0 голосов
/ 21 октября 2019

Я хочу объединить результаты пяти классификаторов (SVM, случайный лес, наивный байесовский алгоритм, дерево решений, KNN) большинством голосов. Я собрал выходные данные этих классификаторов в массив tt (метки классов являются двоичными 1 или 2), затем я использовал функцию mode для получения наиболее частых значений в массиве и сравнил выходные данные с ytest (тестовые метки), чтобы получить tp, tn, fp, fnи вычислить Точность Индекса Рэнда обучения ансамбля. Но точность ансамбля классификации всегда получает 1, что это не правильно.

clear
close all
clc
load datas17.mat;
data=datas17;
[n,m]=size(data);
rows=(1:n);
test_count=floor((1/6)*n);
sum_ens=0;sum_result=0;
test_rows=randsample(rows,test_count);
train_rows=setdiff(rows,test_rows);
test=data(test_rows,:);
train=data(train_rows,:);
xtest=test(:,1:m-1);
ytest=test(:,m);
xtrain=train(:,1:m-1);
ytrain=train(:,m);
%-----------svm------------------
svm=svm1(xtest,xtrain,ytrain);
%-------------random forest---------------
rforest=randomforest(xtest,xtrain,ytrain);
%-------------decision tree---------------
DT=DTree(xtest,xtrain,ytrain);
%---------------bayesian---------------------
NBModel = NaiveBayes.fit(xtrain,ytrain, 'Distribution', 'kernel');
Pred = NBModel.predict(xtest);
dt=Pred;
%--------------KNN----------------
knnModel=fitcknn(xtrain,ytrain,'NumNeighbors',4);
     pred=knnModel.predict(xtest);
     sk=pred;
tt=[svm rforest DT dt sk];
output=zeros(test_count,1);
for i=1:test_count
    output(i,1)=mode(tt(i,:)); 
end
tp_ens=0;tn_ens=0;fp_ens=0;fn_ens=0;
for i=1:test_count

    if(output(i)==1 && ytest(i)==1)
    tp_ens=tp_ens+1;
    end

    if(output(i)==2 && ytest(i)==2)
    tn_ens=tn_ens+1;
    end

    if(output(i)==2 && ytest(i)==1)
    fp_ens=fp_ens+1;
    end

    if(output(i)==1 && ytest(i)==2)
    fn_ens=fn_ens+1;
    end
end
acc_ens=(tp_ens+tn_ens)/(tp_ens+tn_ens+fp_ens+fn_ens);
disp('accuracy of classification ensemble:');
disp(acc_ens);

Буду признателен за ваше мнение по поводу голосования за эти классификаторы и получения точности классификации.

...