89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
import pandas as pd
|
|
import numpy as np
|
|
from sklearn.preprocessing import MinMaxScaler
|
|
import gc
|
|
|
|
def preprocess_cicids2017_full(input_path, output_path):
|
|
"""
|
|
Realiza o pré-processamento e limpeza do dataset CICIDS2017 completo.
|
|
|
|
Args:
|
|
input_path (str): Caminho para o arquivo CSV de entrada do dataset.
|
|
output_path (str): Caminho para salvar o arquivo CSV pré-processado.
|
|
"""
|
|
print(f"Carregando o dataset completo de: {input_path}")
|
|
|
|
try:
|
|
df = pd.read_csv(input_path, low_memory=False)
|
|
print(f"Dataset completo carregado com {df.shape[0]} linhas e {df.shape[1]} colunas")
|
|
except Exception as e:
|
|
print(f"Erro ao carregar o dataset completo: {e}")
|
|
print("Por favor, verifique se há memória suficiente ou se o arquivo está corrompido.")
|
|
return
|
|
|
|
# Renomear colunas para remover espaços e caracteres problemáticos
|
|
df.columns = df.columns.str.strip().str.replace(' ', '_').str.replace('/', '_').str.replace('(', '', regex=False).str.replace(')', '', regex=False)
|
|
|
|
# Verifica se a coluna 'Label' existe
|
|
if 'Label' not in df.columns:
|
|
raise ValueError("A coluna 'Label' não foi encontrada no dataset. Verifique se o arquivo contém os rótulos.")
|
|
|
|
print(f"Distribuição das classes antes da limpeza:")
|
|
print(df['Label'].value_counts())
|
|
|
|
# Converte todas as colunas (exceto 'Label') para numérico
|
|
feature_cols = df.columns[df.columns != 'Label']
|
|
print(f"Convertendo {len(feature_cols)} colunas para numérico...")
|
|
|
|
for col in feature_cols:
|
|
df[col] = pd.to_numeric(df[col], errors='coerce')
|
|
|
|
# Substitui valores infinitos por NaN e remove linhas inválidas
|
|
df.replace([np.inf, -np.inf], np.nan, inplace=True)
|
|
initial_rows = df.shape[0]
|
|
df.dropna(inplace=True)
|
|
print(f"Removidas {initial_rows - df.shape[0]} linhas com valores NaN ou infinitos.")
|
|
|
|
# Remover colunas com baixa variância (constantes ou quase constantes)
|
|
numeric_cols = df.select_dtypes(include=[np.number]).columns
|
|
low_variance_cols = [col for col in numeric_cols if df[col].nunique() <= 1]
|
|
if low_variance_cols:
|
|
df.drop(columns=low_variance_cols, inplace=True)
|
|
print(f"Removidas colunas com baixa variância: {low_variance_cols}")
|
|
else:
|
|
print("Nenhuma coluna com baixa variância encontrada.")
|
|
|
|
# Separar X e y
|
|
X = df.drop('Label', axis=1)
|
|
y = df['Label']
|
|
|
|
print(f"Características finais: {X.shape[1]} colunas")
|
|
print(f"Amostras finais: {X.shape[0]} linhas")
|
|
print(f"Distribuição das classes após limpeza:")
|
|
print(y.value_counts())
|
|
|
|
# Normalização Min-Max
|
|
print("Aplicando normalização Min-Max...")
|
|
scaler = MinMaxScaler()
|
|
X_scaled = scaler.fit_transform(X)
|
|
X_processed = pd.DataFrame(X_scaled, columns=X.columns)
|
|
|
|
# Combina X normalizado e y
|
|
df_processed = pd.concat([X_processed, y.reset_index(drop=True)], axis=1)
|
|
|
|
# Salva o resultado
|
|
df_processed.to_csv(output_path, index=False)
|
|
print(f"Dataset pré-processado salvo em: {output_path}")
|
|
print(f"Formato final: {df_processed.shape}")
|
|
|
|
# Limpeza de memória
|
|
del df, X, y, X_scaled, X_processed
|
|
gc.collect()
|
|
|
|
if __name__ == '__main__':
|
|
input_file = 'cicids2017.csv' # Caminho real do dataset bruto
|
|
output_file = 'cicids2017_preprocessed.csv'
|
|
|
|
preprocess_cicids2017_full(input_file, output_file)
|
|
|