9

Así que estoy en una encrucijada sobre qué hacer a continuación, me propuse aprender y aplicar algunos algoritmos de aprendizaje automático en un conjunto de datos complicado y ahora lo he hecho. Mi plan desde el principio fue combinar dos clasificadores posibles en un intento de crear un sistema de clasificación múltiple.Clustering y clasificadores Bayes Matlab

Pero aquí es donde estoy atascado. Elijo un algoritmo de agrupación (Fuzzy C Means) (después de aprender algunas muestras de K-means) y Naive Bayes como los dos candidatos para MCS (Sistema de múltiples clasificadores).

Puedo utilizar ambos de forma independiente para clasificar los datos, pero estoy luchando para combinar los dos de una manera significativa.

Por ejemplo, la agrupación Fuzzy capta casi todos los ataques "Smurf" excepto por lo general uno y no estoy seguro de por qué es imposible atrapar a este bola impar pero lo único que sé es que no funciona. Uno de los clusters estará dominado por los ataques smurf y generalmente encontraré solo un pitufo en los otros clusters. Y aquí es donde me encuentro con el escenario del problema, si entreno el clasificador bayes en todos los diferentes tipos de ataque (Smurf, normal, Neptune ... etc.) y lo aplico al resto de los clusters en un intento de encontrar ese último restante smurf tendrá una alta tasa de falsas alarmas.

No estoy seguro de cómo proceder, no quiero quitar los otros ataques del conjunto de entrenamiento, pero solo quiero entrenar al clasificador de bayes para detectar ataques de "Pitufo". Por el momento está entrenado para tratar de detectar todo, y en este proceso, creo (no estoy seguro) que la precisión se descarta.

Así que esta es mi pregunta al usar el clasificador naive bayes, ¿cómo conseguirías que solo busque smurf y clasifique todo lo demás como "Otro"?

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) 

lo que estaba pensando estaba cambiando manualmente target_class de todo el tráfico normal y ataques que se enviaban a otro pitufo . Entonces, como ya sé que FCM clasifica correctamente todos los ataques smurf, excepto uno, solo tengo que usar el clasificador bayes ingenuos en los clústeres restantes.

Por ejemplo:

Cluster 1 = 500 ataques Smurf (repitiendo este paso podría cambiar la "mayoría" de los ataques Smurf de las 1000 muestras en un grupo diferente, así que tiene que comprobar o iterar a través de los racimos para el tamaño más grande, una vez encontrado puedo eliminarlo de la etapa de clasificador de bayes ingenuos)

Luego pruebo el clasificador en cada grupo restante (no estoy seguro de cómo hacer loops, etc. aún en matlab) así que en este momento tengo que recogerlos manualmente durante el procesamiento.

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) 

entonces repito el clasificador de Bayes para cada uno de los restantes grupos, en busca de que el ataque de un pitufo.

Mi problema es qué sucede si clasifica incorrectamente un "otro" ataque como un pitufo o no encuentra el que queda smurf.

Me siento como perdido en una mejor forma de hacerlo. Estoy en el proceso de tratar de elegir una buena proporción de ataques smurf a "otro", ya que no quiero ajustarme demasiado, lo que se explicó en una pregunta anterior here.

Pero esto me llevará un tiempo ya que aún no sé cómo cambiar/reemplazar las etiquetas existentes de neptuno, atrás, ipsweep, wareclient ataca a "otro" en matlab, así que todavía no puedo probar esta teoría (llegará allí).

Así que mi pregunta es:

1) ¿Existe un método mejor al descubrir que un ataque Smurf difícil de alcanzar.

2) ¿Cómo puedo grep la target_class (etiquetas) para reemplazar todo lo que no se smurf con "otra"

+0

Trate de no utilizar la agrupación en clúster, pero aprender clasificadores directamente. O permitiendo cierta superposición entre los clusters. Si tienes una sola instancia de Smurf en un clsuter, tu proceso de aprendizaje probablemente solo * sobreajustará *. Necesita tener más datos de entrenamiento de esta clase en el conjunto de entrenamiento. –

+1

O intente utilizar el agrupamiento * dentro de * clases solamente. Luego, aprenda a entrenar clasificadores de una clase para reconocer el clúster particular. Eso tiene sentido suponiendo que hay diferentes tipos de smurf/normal/etc. –

Respuesta

1

voy a tratar de responder en parte a sus preguntas.

1) ¿Hay un mejor método para encontrar ese esquivo ataque smurf.

Le sugiero que no pruebe esto. 1 en 500. Este es casi claramente un caso de ajuste excesivo de sus datos. Su clasificador no generalizará bien para probar los datos.

2) ¿Cómo puedo grep la target_class (etiquetas) para reemplazar todo lo que no se smurf con "otro"

Para tratar este código siguiente MATLAB.

clear all; 
close all; 
load fisheriris 
IndexOfVirginica = strcmp (species, 'virginica'); 
IndexOfNotVirginica = IndexOfVirginica ==0; 
otherSpecies = species; 
otherSpecies(IndexOfNotVirginica) = {'other'}; 
otherSpecies