gpt4 book ai didi

matlab - 朴素贝叶斯分类器和判别分析的准确性还差得很远

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:44 27 4
gpt4 key购买 nike

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

%% Classify Clusters using Naive Bayes Classifier and classify
training_data = Testdata;
target_class = TestDataLabels;

[class, err] = classify(UnseenTestdata, training_data, target_class,'diaglinear')

cmat1 = confusionmat(UnseenTestDataLabels, class);
acc1 = 100*sum(diag(cmat1))./sum(cmat1(:));
fprintf('Classifier1:\naccuracy = %.2f%%\n', acc1);
fprintf('Confusion Matrix:\n'), disp(cmat1)

的混淆矩阵产生准确度81.49% 错误率 ( err ) 为 0.5040 (不确定如何解释)。

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

%% Classify Clusters using Naive Bayes Classifier
training_data = Testdata;
target_class = TestDataLabels;
%# train model
nb = NaiveBayes.fit(training_data, target_class, 'Distribution', 'mn');

%# prediction
class1 = nb.predict(UnseenTestdata);

%# performance
cmat1 = confusionmat(UnseenTestDataLabels, class1);
acc1 = 100*sum(diag(cmat1))./sum(cmat1(:));
fprintf('Classifier1:\naccuracy = %.2f%%\n', acc1);
fprintf('Confusion Matrix:\n'), disp(cmat1)


产生 的准确度81.89% .

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

所以我的问题。

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

现在我正在使用一个在文学中被多次使用过的数据集,并且在我的探索中我正在尝试一种与其他人不太相似的方法。

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

enter image description here

查看每个集群 (K1, K2...K12) 类标签:

%% output the class labels of each cluster
K1 = UnseenTestDataLabels(indX(clustIDX==1),:)

我发现主要是每个集群在 9 个集群中有一个类标签,而 3 个集群包含多个类标签。表明 K-means 对数据有很好的拟合。

问题然而,一旦我拥有每个集群数据(cluster1,cluster2...cluster12):

%% output the real data of each cluster
cluster1 = UnseenTestdata(clustIDX==1,:)

我将每个集群通过朴素贝叶斯或判别分析,如下所示:

class1  = classify(cluster1, training_data, target_class, 'diaglinear');
class2 = classify(cluster2, training_data, target_class, 'diaglinear');
class3 = classify(cluster3, training_data, target_class, 'diaglinear');
class4 = classify(cluster4, training_data, target_class, 'diaglinear');
class5 = classify(cluster5, training_data, target_class, 'diaglinear');
class6 = classify(cluster6, training_data, target_class, 'diaglinear');
class7 = classify(cluster7, training_data, target_class, 'diaglinear');
class8 = classify(cluster8, training_data, target_class, 'diaglinear');
class9 = classify(cluster9, training_data, target_class, 'diaglinear');
class10 = classify(cluster10, training_data, target_class, 'diaglinear');
class11 = classify(cluster11, training_data, target_class, 'diaglinear');
class12 = classify(cluster12, training_data, target_class, 'diaglinear');

准确率变得可怕,50% 的聚类被分类为 0% 准确率,每个分类的聚类 (acc1, acc2,...acc12) 都有自己对应的混淆矩阵,您可以在这里看到每个聚类的准确率:

enter image description here

所以我的问题/问题是:我哪里出错了?我首先想也许我将集群的数据/标签混合在一起,但是我上面发布的内容看起来是正确的,我看不出它有什么问题。

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

编辑:

根据评论的要求,我包含了第一个测试示例的 cmat 文件,该文件的准确性为 81.49% 的错误0.5040 :

enter image description here

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

enter image description here

看到有大量的类(总共 23 个),我决定按照 1999 KDD Cup 中的概述减少类。这只是应用了一些领域知识,因为有些攻击比其他攻击更相似,并且属于一个总称。

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

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

enter image description here

看不见的数据分为以下几类:
DoS: 39149
Probe: 405
R2L: 121
U2R: 6
normal.: 9721

类别或分类标签(判别分析的结果):
DoS: 28135
Probe: 10776
R2L: 1102
U2R: 1140
normal.: 8249

训练数据由以下部分组成:
DoS: 352452
Probe: 3717
R2L: 1006
U2R: 49
normal.: 87395

我担心如果我降低训练数据以具有相似百分比的恶意事件,那么分类器将没有足够的预测能力来区分类别,但是查看其他一些文献我注意到一些研究人员删除了 U2R,因为没有“t 足够的数据来成功分类。

到目前为止,我尝试过的方法是一类分类器,我训练分类器只预测一类(无效),对单个集群进行分类(准确性更差),减少类标签(第二好的)并保留完整的 23 个类标签(最佳精度)。

最佳答案

正如其他人正确指出的那样,这里至少有一个问题在这些方面:

class1  = classify(cluster1, training_data, target_class, 'diaglinear');
...

您正在使用所有 training_data 训练分类器,但仅在子集群上对其进行评估。为了对数据进行聚类以产生任何效果,您需要训练不同的分类器 每个子集群。有时这可能非常困难 - 例如,Y 类的集群 C 中的示例可能很少(或没有!)。这是尝试进行联合聚类和学习所固有的。

您的问题的一般框架如下:
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');

不这样做。

关于matlab - 朴素贝叶斯分类器和判别分析的准确性还差得很远,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com