# DSTO-GAN: Balanceamento de Dados com GAN

O **DSTO-GAN** é uma biblioteca Python que utiliza uma Rede Generativa Adversarial (GAN) para gerar amostras sintéticas e balancear datasets desbalanceados. Ele é especialmente útil para problemas de classificação em que as classes estão desproporcionais.

---

## Funcionalidades

1. **Geração de amostras sintéticas** para balanceamento de classes.
2. **Treinamento de um GAN personalizado** para dados tabulares.
3. **Salvamento do dataset balanceado** em um arquivo `.csv`.

---

## Pré-requisitos

- **Python 3.7 ou superior**.
- **Gerenciador de pacotes `pip`**.


## Instalação

Você pode instalar a biblioteca diretamente via `pip`:

```bash
pip install dsto-gan
```

### Dependências

As dependências serão instaladas automaticamente durante a instalação. Caso prefira instalar manualmente, execute:

```bash
pip install numpy torch pandas scikit-learn xgboost scikit-optimize
```


## Como Usar

### 1. Importação e Inicialização

Primeiro, importe a classe DSTO_GAN e inicialize o objeto:

from dsto_gan import DSTO_GAN

# Inicializar o DSTO-GAN
```bash
dsto_gan = DSTO_GAN(dim_h=64, n_z=10, lr=0.0002, epochs=100, batch_size=64)

```

### 2.  Balanceamento de Dados

Use o método fit_resample para balancear os dados:

```bash
# Dados desbalanceados
X = ...  # Features (numpy array ou pandas DataFrame)
y = ...  # Labels (numpy array ou pandas Series)

# Balancear os dados
X_resampled, y_resampled = dsto_gan.fit_resample(X, y)

print(f"Shape dos dados balanceados: {X_resampled.shape}, {y_resampled.shape}")
```

### 3. Integração com Scikit-Learn

O DSTO_GAN é compatível com pipelines do Scikit-Learn. Você pode usá-lo como parte de um pipeline de pré-processamento:

```bash
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# Dividir os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Criar um pipeline com DSTO-GAN e um classificador
pipeline = Pipeline([
    ('dsto_gan', DSTO_GAN()),  # Balanceamento com DSTO-GAN
    ('classifier', RandomForestClassifier())  # Classificador
])

# Treinar o modelo
pipeline.fit(X_train, y_train)

# Avaliar o modelo
accuracy = pipeline.score(X_test, y_test)
print(f"Acurácia do modelo: {accuracy:.2f}")

---

## Exemplo de Uso

Aqui está um exemplo completo de uso do DSTO-GAN:

```bash
import pandas as pd
from sklearn.model_selection import train_test_split
from dsto_gan import DSTO_GAN

# 1. Carregar dados desbalanceados
file_path = "caminho/para/desbalanceado.csv"
df = pd.read_csv(file_path)

# 2. Separar features (X) e labels (y)
X = df.iloc[:, :-1].values  # Todas as colunas, exceto a última
y = df.iloc[:, -1].values   # Última coluna é a classe

# 3. Dividir os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 4. Balancear os dados de treino com DSTO-GAN
dsto_gan = DSTO_GAN()
X_train_resampled, y_train_resampled = dsto_gan.fit_resample(X_train, y_train)

print(f"Shape dos dados balanceados: {X_train_resampled.shape}, {y_train_resampled.shape}")
```
---

## Estrutura do Projeto

```
dsto_gan/
│
├── dsto_gan/          # Pacote principal
│   ├── __init__.py    # Inicialização do pacote
│   ├── dsto_gan.py    # Código principal para balanceamento de dados
├── setup.py           # Configuração do pacote
├── README.md          # Documentação do projeto
└── LICENSE            # Licença do projeto
```

---


## Contribuição

Contribuições são bem-vindas! Se você encontrar problemas ou tiver sugestões de melhorias, sinta-se à vontade para abrir uma issue ou enviar um pull request.
---

## Licença

Este projeto está licenciado sob a **Licença MIT**. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.

---

## Contato

- **Autor**: Erika Assis
- **Email**: dudabh@gmail.com
- **Repositório**: [GitHub](https://github.com/erikaduda/dsto_gan)

---

## Agradecimentos

Este projeto foi desenvolvido como parte de uma pesquisa em balanceamento de dados usando GANs. Agradecimentos à comunidade de código aberto por fornecer as bibliotecas utilizadas.
