我想通过多数表决来合并五个分类器(SVM,随机森林,朴素贝叶斯,决策树,KNN)的结果。我在tt数组(类标签是二进制1或2)中收集了这些分类器的输出,然后使用了模式函数来获取数组中最频繁的值,并将输出与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);
对于您对这些分类器进行投票并获得分类的准确性,我将不胜感激。