Кластеризация и байесовские классификаторы Matlab
Так что я нахожусь на перекрестке, что делать дальше, я решил изучить и применить некоторые алгоритмы машинного обучения к сложному набору данных, и я уже сделал это. Мой план с самого начала состоял в том, чтобы объединить два возможных классификатора в попытке создать систему множественной классификации.
Но вот где я застрял. Я выбираю алгоритм кластеризации (Fuzzy C Means) (после изучения некоторых примеров K-средних) и Наивный Байес в качестве двух кандидатов на MCS (Multi-Classifier System).
Я могу использовать оба независимо, чтобы классифицировать данные, но я изо всех сил пытаюсь объединить два осмысленно.
Например, кластер Fuzzy улавливает почти все атаки "Smurf", за исключением обычно одной, и я не уверен, почему он не ловит этот странный шар, но все, что я знаю, это то, что он этого не делает. В одном из кластеров будут доминировать атаки смарфа, и обычно я найду только один смарф в других кластерах. И здесь я сталкиваюсь с проблемным сценарием, если я обучаю байесовский классификатор для всех различных типов атак (Smurf, normal, neptune... и т. Д.) И применяю это к остальным кластерам, пытаясь найти последний оставшийся смурф будет иметь высокий уровень ложной тревоги.
Я не уверен, как действовать дальше, я не хочу исключать другие атаки из учебного набора, но я только хочу обучить классификатор Байеса, чтобы он мог определять атаки "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
от всего нормального трафика и атак, которые не смутят других. Тогда, поскольку я уже знаю, что FCM правильно классифицирует все атаки, кроме одной, смурф, мне просто нужно использовать наивный байесовский классификатор на оставшихся кластерах.
Например:
Кластер 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.
Моя проблема в том, что происходит, если он неправильно классифицирует "другую" атаку как смурф или не находит оставшийся смурф.
Я чувствую себя потерянным от лучшего способа сделать это. Я пытаюсь подобрать хорошее соотношение смарф-атак к "другим", так как не хочу переизбытка, как было объяснено в предыдущем вопросе.
Но это займет у меня некоторое время, так как я пока не знаю, как изменить / заменить существующие метки с neptune, back, ipsweep, wareclient на "other" в matlab, так что я пока не могу проверить эту теорию (получу там),
Итак, мой вопрос:
1) Есть ли лучший способ найти одну неуловимую атаку смарфа?
2) Как я могу выполнить grep target_class (метки), чтобы заменить все, что не является смарфом, на " другое "
1 ответ
Я постараюсь частично ответить на ваши вопросы.
1) Есть ли лучший способ найти одну неуловимую атаку смарфа?
Я предлагаю вам не попробовать это. 1 из 500. Это почти очевидно, что вы слишком точно соответствовали вашим данным. Ваш классификатор не будет хорошо обобщать для проверки данных.
2) Как я могу выполнить grep target_class (метки), чтобы заменить все, что не является смарфом, на "другое"
Для этого попробуйте следующий код Matlab.
clear all;
close all;
load fisheriris
IndexOfVirginica = strcmp (species, 'virginica');
IndexOfNotVirginica = IndexOfVirginica ==0;
otherSpecies = species;
otherSpecies(IndexOfNotVirginica) = {'other'};
otherSpecies