2
respostas

Dúvida sobre modelagem em Machine Learning (com python)

Estou utilizando o seguinte dataset composto de 4 arquivos CSV:

Dataset:

https://www.unsw.adfa.edu.au/unsw-canberra-cyber/cybersecurity/ADFA-NB15-Datasets/

Dentre as colunas do dataset destaco duas:

A classe : 0 significa que o tráfego é normal

                1 significa ATAQUE

Porém apenas me interessa classificar o ataque o tipo DDOS .

Existe uma coluna chamada cat_attack que é categórica e o valor que me interessa é DDoS.

A dúvida é:

Como no modelo de machine learning eu consigo dizer que é um ataque DDOS, se para isso eu preciso não apenas olhar a classe (cujo valor deve ser 1 para ser ATAQUE) mas também a coluna cat_attack, cujo valor deve ser a string "ddos" ? Eu preciso combinar o valor de duas colunas para caracterizar que é um ataque DDOS. Como fazer?

Segue um trecho do meu código:

    import pandas as pd
    import numpy as np

    UNSW1 = pd.read_csv('/home/users/p02543/ddos/UNSW-NB15_1.csv',dtype={"srcip":object ,},names = colunas)
    UNSW2= pd.read_csv('/home/users/p02543/ddos/UNSW-NB15_2.csv',dtype={"srcip":object ,},names = colunas)
    UNSW3= pd.read_csv('/home/users/p02543/ddos/UNSW-NB15_3.csv',dtype={"srcip":object ,},names = colunas)
    UNSW4= pd.read_csv('/home/users/p02543/ddos/UNSW-NB15_4.csv',dtype={"srcip":object ,},names = colunas)

    UNSW = pd.concat([UNSW1,UNSW2,UNSW3,UNSW4])#tudao 

    previsores = UNSW.iloc[:,UNSW.columns.isin(('Sload','Dload',
                                                       'Spkts','Dpkts','swin','dwin','smeansz','dmeansz',
    'Sjit','Djit','Sintpkt','Dintpkt','tcprtt','synack','ackdat','ct_srv_src','ct_srv_dst','ct_dst_ltm',
     'ct_src_ltm','ct_src_dport_ltm','ct_dst_sport_ltm','ct_dst_src_ltm','cat_attack')) ].values# atributos previsores

     classe= UNSW.iloc[:, -1].values #atributo meta!
2 respostas

Oi Edson, uma das maneiras de se fazer é usando rótulos de linha e valores condicionais. Segue um exemplo que pode ser aplicado ao seu código:

import pandas as pd

data = {'classe' : [1, 1, 0, 0, 1], 'cat_attack': [0, 'ddos', 'ddos', 0, 'ddos']}
df = pd.DataFrame(data=data)

print(df)

O código acima simula a situação que você colocou e gera o dataframe de saída:

   classe cat_attack
0       1          0
1       1       ddos
2       0       ddos
3       0          0
4       1       ddos

Como você deseja apenas os dados em que ao valor da classe é 1 e o de cat_attack é ddos, fazemos:

result = df[(df.classe == 1) & (df.cat_attack == 'ddos')]
print(result)

Que vai gerar a saída desejada:

   classe cat_attack
1       1       ddos
4       1       ddos

Espero ter ajudado e bons estudos!

Oi Edson,

Como a Thais citou, você pode aplicar o resultado dela a uma nova coluna do seu dataframe original:

df['classe_final'] = result

Assim você tem o resultado no próprio dataframe.

att