Matlab 朴素贝叶斯分类器和判别分析的准确率相差甚远

Matlab 朴素贝叶斯分类器和判别分析的准确率相差甚远,matlab,statistics,cluster-analysis,bayesian,naivebayes,Matlab,Statistics,Cluster Analysis,Bayesian,Naivebayes,因此,我有两种分类方法,判别分析diaglinear分类(朴素贝叶斯)和在matlab中实现的纯朴素贝叶斯分类器,整个数据集中有23个类。第一种方法是判别分析: DoS: 28135 Probe: 10776 R2L: 1102 U2R: 1140 normal.: 8249 %%使用朴素贝叶斯分类器对集群进行分类并分类 训练数据=测试数据; target_class=TestDataLabels; [class,err]=分类(未插入测试数据、训练数据、目标类、'diaglinear') c

因此,我有两种分类方法,判别分析
diaglinear
分类(朴素贝叶斯)和在matlab中实现的纯朴素贝叶斯分类器,整个数据集中有23个类。第一种方法是判别分析:

DoS: 28135
Probe: 10776
R2L: 1102
U2R: 1140
normal.: 8249
%%使用朴素贝叶斯分类器对集群进行分类并分类
训练数据=测试数据;
target_class=TestDataLabels;
[class,err]=分类(未插入测试数据、训练数据、目标类、'diaglinear')
cmat1=confusionmat(未插入的数据标签,类别);
acc1=100*和(诊断(cmat1))/和(cmat1(:);
fprintf('Classifier1:\n准确度=%.2f%%\n',acc1);
fprintf('混淆矩阵:\n'),显示(cmat1)
从混淆矩阵中得出的准确度为81.49%,错误率(
err
)为0.5040(不确定如何解释)

第二种方法是朴素贝叶斯分类器:

%%使用朴素贝叶斯分类器对集群进行分类
训练数据=测试数据;
target_class=TestDataLabels;
%#列车模型
nb=NaiveBayes.fit(训练数据、目标类、“分布”、“mn”);
%#预测
class1=nb.预测(未经测试的数据);
%#演出
cmat1=confusionmat(未插入的数据标签,类别1);
acc1=100*和(诊断(cmat1))/和(cmat1(:);
fprintf('Classifier1:\n准确度=%.2f%%\n',acc1);
fprintf('混淆矩阵:\n'),显示(cmat1)
产生81.89%的准确度

我只做过一轮交叉验证,我对matlab和监督/非监督算法是新手,所以我自己做了交叉验证。我基本上只需要取10%的数据,并将其放在一边进行测试,因为每次都是随机设置的。我可以检查几次,取平均准确度,但结果可以用于解释目的

我的问题也是如此。

在我对当前方法的文献回顾中,许多研究人员发现,单一的分类算法与聚类算法相结合可以产生更好的精度结果。他们通过为自己的数据找到最佳数量的集群,并使用分区集群(应该更相似)通过分类算法运行每个单独的集群来实现这一点。可以将无监督算法的最佳部分与监督分类算法结合使用的过程

现在我使用的数据集在文献中已经使用了很多次,我正在尝试一种与我的研究中的其他人没有太大不同的方法

我首先使用简单的K-Means聚类,它出人意料地具有很好的数据聚类能力。输出如下所示:

查看每个群集(K1、K2…K12)类别标签:

%%输出每个集群的类标签
K1=未插入的数据标签(indX(clustIDX==1),:)
我发现在9个集群中,每个集群主要有一个类标签,而3个集群包含多个类标签。表明K-means与数据有很好的拟合

问题是一旦我有了每个集群数据(cluster1、cluster2…cluster12):

%%输出每个集群的真实数据
cluster1=unsentestdata(clustIDX==1,:)
我对每个聚类进行朴素贝叶斯或判别分析,如下所示:

class1=分类(cluster1,训练数据,目标类,'diaglinear');
class2=分类(聚类2,训练数据,目标类,'diaglinear');
class3=分类(聚类3,训练数据,目标类,“diaglinear”);
class4=分类(聚类4,训练数据,目标类,“diaglinear”);
class5=分类(聚类5,训练数据,目标类,“diaglinear”);
class6=分类(cluster6,训练数据,目标类,“diaglinear”);
class7=分类(聚类7,训练数据,目标类,'diaglinear');
class8=分类(聚类8,训练数据,目标类,'diaglinear');
class9=分类(聚类9,训练数据,目标类,'diaglinear');
class10=分类(cluster10,训练数据,目标类,'diaglinear');
class11=分类(cluster11,训练数据,目标类,'diaglinear');
class12=分类(cluster12,训练数据,目标类,'diaglinear');
准确度变得可怕,50%的聚类以0%的准确度进行分类,每个分类的聚类(acc1、acc2、…acc12)都有自己相应的混淆矩阵。您可以在此处看到每个聚类的准确度:

所以我的问题是:我错在哪里?我首先想到的可能是集群的数据/标签混淆了,但我上面发布的内容看起来是正确的,我看不出有什么问题

为什么第一次实验中使用的10%的未看到的数据与第一次实验中使用的数据完全相同,而对于相同的未看到的聚集数据,会产生如此奇怪的结果?我的意思是,应该注意的是,NB是一个稳定的分类器,不应该容易过度拟合,因为训练数据是巨大的,而要分类的聚类是并发的,不应该发生过度拟合

编辑:

根据评论要求,我已将cmat文件包括在第一个测试示例中,该示例的准确度为81.49%,误差为0.5040

本例(cluster4)中还要求提供K、class和相关cmat的a片段,准确率3.03%

由于存在大量的类(总共23个),我决定减少中概述的类。这只是应用了一些领域知识,因为一些攻击比其他攻击更相似,并且属于一个总括术语

然后,我用44.4万条记录训练分类器,同时保留10%用于测试

准确率较差73.39%错误率也较差0.4261

将不可见的数据细分为以下类别:

DoS: 39149
Probe: 405
R2L: 121
U2R: 6
normal.: 9721
班级
DoS: 352452
Probe: 3717
R2L: 1006
U2R: 49
normal.: 87395
classify(cluster1, training_data, target_class, 'diaglinear');
class1  = classify(cluster1, training_data, target_class, 'diaglinear');
...
Training data:
   Cluster into C clusters
   Within each cluster, develop a classifier

Testing data:
   Assign observation into one of the C clusters (either "hard", or "soft")
   Run the correct classifier (corresponding to that cluster)
class1  = classify(cluster1, training_data, target_class, 'diaglinear');
%% Generate data and labels for each class
x11 = bsxfun(@plus,randn(100,2),[2 2]);
x10 = bsxfun(@plus,randn(100,2),[0 2]);

x21 = bsxfun(@plus,randn(100,2),[-2 -2]);
x20 = bsxfun(@plus,randn(100,2),[0 -2]);

%If you have the PRT (shameless plug), this looks nice:
%http://www.mathworks.com/matlabcentral/linkexchange/links/2947-pattern-recognition-toolbox
% ds = prtDataSetClass(cat(1,x11,x21,x10,x20),prtUtilY(200,200));

x = cat(1,x11,x21,x10,x20);
y = cat(1,ones(200,1),zeros(200,1));

clusterIdx = kmeans(x,2); %make 2 clusters
xCluster1 = x(clusterIdx == 1,:);
yCluster1 = y(clusterIdx == 1);
xCluster2 = x(clusterIdx == 2,:);
yCluster2 = y(clusterIdx == 2);


%Performance is terrible:
yOut1  = classify(xCluster1, x, y, 'diaglinear');
yOut2  = classify(xCluster2, x, y, 'diaglinear');

pcCluster = length(find(cat(1,yOut1,yOut2) == cat(1,yCluster1,yCluster2)))/size(y,1)

%Performance is Good:
yOutCluster1  = classify(xCluster1, xCluster1, yCluster1, 'diaglinear');
yOutCluster2  = classify(xCluster2, xCluster2, yCluster2, 'diaglinear');

pcWithinCluster = length(find(cat(1,yOutCluster1,yOutCluster2) == cat(1,yCluster1,yCluster2)))/size(y,1)

%Performance is Bad (using all data):
yOutFull  = classify(x, x, y, 'diaglinear');
pcFull = length(find(yOutFull == y))/size(y,1)