Artigo Mestrado
This commit is contained in:
88
preprocess_data_full.py
Normal file
88
preprocess_data_full.py
Normal file
@@ -0,0 +1,88 @@
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user