【发布时间】:2012-07-18 23:58:44
【问题描述】:
所以我正处于下一步做什么的十字路口,我开始学习并在一个复杂的数据集上应用一些机器学习算法,现在我已经做到了。我从一开始的计划就是将两个可能的分类器结合起来,试图建立一个多分类系统。
但这就是我卡住的地方。我选择了一种聚类算法(模糊 C 均值)(在学习了一些 K 均值样本之后)和朴素贝叶斯作为 MCS(多分类器系统)的两个候选者。
我可以独立地使用两者来对数据进行分类,但我正在努力以一种有意义的方式将两者结合起来。
例如,模糊聚类捕获几乎所有“蓝精灵”攻击,除了通常一个,我不知道为什么它不能捕获这个奇怪的球,但我所知道的是它没有。其中一个集群将受到蓝精灵攻击的支配,通常我会在其他集群中找到一个蓝精灵。这就是我遇到问题场景的地方,如果我在所有不同的攻击类型(Smurf、正常、海王星......等)上训练贝叶斯分类器并将其应用于其余集群以试图找到最后一个剩下的smurf就会有很高的误报率。
我不确定如何继续,我不想将其他攻击从训练集中剔除,但我只想训练贝叶斯分类器以发现“Smurf”攻击。目前它被训练去尝试发现一切,在这个过程中,我认为(不确定)准确性下降了。
所以这是我在使用朴素贝叶斯分类器时的问题,您如何让它只查找 smurf 并将其他所有内容归类为“其他”。
rows = 1000;
columns = 6;
indX = randperm( size(fulldata,1) );
indX = indX(1:rows)';
data = fulldata(indX, indY)
indX1 = randperm( size(fulldata,1) );
indX1 = indX1(1:rows)';
%% apply normalization method to every cell
%data = zscore(data);
training_data = data;
target_class = labels(indX,:)
class = classify(test_data,training_data, target_class, 'diaglinear')
confusionmat(target_class,class)
我当时的想法是手动将 target_class 从所有正常的流量和非 smurf 的攻击更改为 其他。然后,正如我已经知道 FCM 正确分类了除一次 smurf 攻击之外的所有攻击一样,我只需要在剩余的集群上使用朴素贝叶斯分类器。
例如:
集群 1 = 500 次 smurf 攻击(重复此步骤可能会将 smurf 攻击的“大多数”从 1000 个样本转移到不同的集群中,因此我必须检查或遍历集群以获得最大的大小,一旦找到,我可以将其从朴素贝叶斯分类器阶段移除)
然后我在每个剩余的集群上测试分类器(不确定如何在 matlab 中执行循环等),所以目前我必须在处理过程中手动选择它们。
clusters = 4;
CM = colormap(jet(clusters));
options(1) = 12.0;
options(2) = 1000;
options(3) = 1e-10;
options(4) = 0;
[~,y] = max(U);
[centers, U, objFun] = fcm(data, clusters, options); % cluster 1000 sample data rows
training_data = newTrainingData(indX1,indY); % this is the numeric data
test_data = fulldata(indX(y==2),:); % this is cluster 2 from the FCM phase which will be classified.
test_class = labels(indX(y==2),:); % thanks to amro this helps the confusion matrix give an unbiased error detection rate in the confusion matrix.
target_class = labels(indX,:) % this is labels for the training_data, it only contains the smurf attacks while everything else is classed as other
class = classify(test_data,training_data, target_class, 'diaglinear')
confusionmat(test_class,class)
然后我对剩余的每个集群重复贝叶斯分类器,寻找那个 smurf 攻击。
我的问题是,如果它错误地将“其他”攻击归类为 smurf 或找不到剩余的 smurf,会发生什么情况。
我有点迷失在更好的方法上。我正在尝试选择 smurf 攻击与“其他”攻击的良好比例,因为我不想过度拟合,这在上一个问题 here 中进行了解释。
但这需要我一些时间,因为我还不知道如何在 matlab 中将现有标签从 neptune、back、ipsweep、wareclient 攻击更改/替换为“其他”,所以我还不能测试这个理论(将到达那里)。
所以我的问题是:
1) 有没有更好的方法来发现一种难以捉摸的 smurf 攻击。
2) 我如何 grep target_class (labels) 来用“other”替换所有不是 smurf 的东西
【问题讨论】:
-
尽量不要使用聚类,而是直接学习分类器。或者允许集群之间有一些重叠。如果你在一个集群中有一个 Smurf 实例,你的学习过程可能只是overfit。你需要在训练集中有更多这个类的训练数据。
-
或者尝试仅在 within 类中使用集群。然后学习训练一类分类器来识别特定的集群。假设有不同类型的 smurf/normal/etc,这是有道理的。
标签: matlab cluster-analysis classification bayesian fuzzy-c-means