Files
cicids2017-visualization/preprocess_data_full.py
2025-07-28 22:40:31 -03:00

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)