# Aprendizado de Máquina (Machine Learning)

### 📌 Visão Geral

O **Aprendizado de Máquina** é um subcampo da inteligência artificial que permite que sistemas aprendam padrões a partir de dados sem serem explicitamente programados. Em vez de seguir regras fixas, os algoritmos de ML **descobrem** relações, fazem previsões e tomam decisões baseadas em exemplos.

```
Dados + Algoritmo → Modelo Treinado → Previsões
     ↑                    ↓
  (Treinamento)     (Inferência)
```

#### Analogia

> *"Machine Learning é como ensinar uma criança a identificar frutas: em vez de dar regras ('é vermelho e redondo'), você mostra muitos exemplos até que ela aprenda os padrões sozinha."*

***

### 🏷️ Tipos de Aprendizado

| Tipo                    | Descrição                                       | Exemplos                                |
| ----------------------- | ----------------------------------------------- | --------------------------------------- |
| **Supervisionado**      | Dados rotulados (entrada → saída conhecida)     | Regressão, Classificação                |
| **Não-supervisionado**  | Dados não rotulados (encontrar padrões ocultos) | Clusterização, Redução dimensionalidade |
| **Semi-supervisionado** | Poucos dados rotulados + muitos não rotulados   | Classificação com dados escassos        |
| **Por Reforço**         | Agente aprende por tentativa/erro (recompensas) | Jogos, robótica                         |

***

### 📋 Algoritmos por Categoria

#### 📈 Regressão (Valores Contínuos)

| Algoritmo            | Tipo           | Uso Principal                              |
| -------------------- | -------------- | ------------------------------------------ |
| **Regressão Linear** | Supervisionado | Previsão de valores (preços, temperaturas) |

#### 🏷️ Classificação (Categorias Discretas)

| Algoritmo               | Tipo           | Uso Principal                            |
| ----------------------- | -------------- | ---------------------------------------- |
| **Regressão Logística** | Supervisionado | Classificação binária (spam ou não spam) |
| **Árvores de Decisão**  | Supervisionado | Regras interpretáveis                    |
| **Random Forest**       | Ensemble       | Alta precisão, robustez                  |
| **SVM**                 | Supervisionado | Classificação com margem máxima          |
| **KNN**                 | Supervisionado | Classificação por vizinhança             |

#### 🔵 Clusterização (Agrupamento)

| Algoritmo   | Tipo               | Uso Principal           |
| ----------- | ------------------ | ----------------------- |
| **K-Means** | Não-supervisionado | Agrupar dados similares |

#### 📉 Redução de Dimensionalidade

| Algoritmo | Tipo               | Uso Principal                     |
| --------- | ------------------ | --------------------------------- |
| **PCA**   | Não-supervisionado | Redução de features, visualização |

#### 🛒 Regras de Associação

| Algoritmo   | Tipo               | Uso Principal          |
| ----------- | ------------------ | ---------------------- |
| **Apriori** | Não-supervisionado | Market basket analysis |

#### 🧠 Deep Learning

| Arquitetura      | Tipo           | Uso Principal                            |
| ---------------- | -------------- | ---------------------------------------- |
| **CNN**          | Supervisionado | Visão computacional (imagens)            |
| **RNN**          | Supervisionado | Dados sequenciais (texto, áudio, séries) |
| **Transformers** | Supervisionado | NLP, LLMs (GPT, BERT, LLaMA)             |

***

### ⚖️ Comparativo de Algoritmos

#### Classificação

| Algoritmo               | Interpretabilidade | Precisão | Tempo Treino | Memória | Dados Grandes |
| ----------------------- | ------------------ | -------- | ------------ | ------- | ------------- |
| **Regressão Logística** | ⭐⭐⭐⭐⭐              | ⭐⭐⭐      | ⭐⭐⭐⭐⭐        | ⭐⭐⭐⭐    | ✅ Sim         |
| **Árvores de Decisão**  | ⭐⭐⭐⭐⭐              | ⭐⭐⭐      | ⭐⭐⭐⭐         | ⭐⭐⭐     | ✅ Sim         |
| **Random Forest**       | ⭐⭐                 | ⭐⭐⭐⭐⭐    | ⭐⭐           | ⭐⭐      | ✅ Sim         |
| **SVM**                 | ⭐⭐                 | ⭐⭐⭐⭐     | ⭐            | ⭐       | ⚠️ Médio      |
| **KNN**                 | ⭐⭐⭐⭐               | ⭐⭐⭐      | ⭐⭐⭐⭐         | ⭐⭐      | ❌ Não         |

#### Clusterização

| Algoritmo   | Número de Clusters    | Escalabilidade | Interpretabilidade |
| ----------- | --------------------- | -------------- | ------------------ |
| **K-Means** | Definido pelo usuário | ⭐⭐⭐⭐⭐          | ⭐⭐⭐⭐               |

#### Deep Learning

| Arquitetura      | Tamanho Dados | Tempo Treino | Hardware       | Interpretabilidade |
| ---------------- | ------------- | ------------ | -------------- | ------------------ |
| **CNN**          | Grande        | Longo        | GPU            | ⭐                  |
| **RNN**          | Médio-Grande  | Longo        | GPU            | ⭐                  |
| **Transformers** | Muito Grande  | Muito Longo  | Múltiplas GPUs | ⭐                  |

***

### 🎯 Guia de Seleção

#### "Preciso prever um número..."

| Se seu cenário é... | Use                          |
| ------------------- | ---------------------------- |
| Relação linear      | Regressão Linear             |
| Relação complexa    | Random Forest, Redes Neurais |

#### "Preciso classificar algo..."

| Se seu cenário é...        | Use                                |
| -------------------------- | ---------------------------------- |
| Apenas 2 classes           | Regressão Logística                |
| Múltiplas classes          | Árvores de Decisão, Random Forest  |
| Quero entender o motivo    | Árvores de Decisão                 |
| Quero máxima precisão      | Random Forest, SVM                 |
| Dados são muitos (n > 10⁵) | Regressão Logística, Random Forest |

#### "Preciso agrupar dados similares..."

| Se seu cenário é...          | Use                    |
| ---------------------------- | ---------------------- |
| Conheço número de grupos     | K-Means                |
| Não conheço número de grupos | K-Means + Elbow Method |

#### "Preciso reduzir dimensionalidade..."

| Se seu cenário é...       | Use |
| ------------------------- | --- |
| Visualizar dados em 2D/3D | PCA |
| Reduzir ruído             | PCA |

#### "Preciso analisar imagens..."

| Se seu cenário é...      | Use                             |
| ------------------------ | ------------------------------- |
| Classificação de imagens | CNN (ResNet, VGG, EfficientNet) |
| Detecção de objetos      | YOLO, Faster R-CNN              |
| Segmentação              | U-Net, Mask R-CNN               |

#### "Preciso processar texto..."

| Se seu cenário é...                  | Use                          |
| ------------------------------------ | ---------------------------- |
| Pequena escala (classificação)       | Regressão Logística + TF-IDF |
| Média escala (análise de sentimento) | RNN, LSTM                    |
| Grande escala (geração de texto)     | Transformers (GPT, BERT)     |
| Tradução automática                  | Transformers (T5, GPT)       |

***

### 📊 Exemplos Práticos

#### Exemplo 1 – Regressão Linear (Python)

```python
from sklearn.linear_model import LinearRegression
import numpy as np

# Dados: anos de experiência → salário
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([30000, 35000, 40000, 45000, 50000])

modelo = LinearRegression()
modelo.fit(X, y)

# Prever salário para 6 anos
previsao = modelo.predict([[6]])
print(f"Salário previsto: R$ {previsao[0]:.0f}")
```

#### Exemplo 2 – Classificação com Random Forest

```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# Dados: características de flores
X = [[5.1, 3.5, 1.4, 0.2],   # comprimento, largura, etc.
     [6.2, 3.4, 5.4, 2.3],
     ...]
y = ['setosa', 'virginica', ...]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

modelo = RandomForestClassifier(n_estimators=100)
modelo.fit(X_train, y_train)

acuracia = modelo.score(X_test, y_test)
print(f"Acurácia: {acuracia:.2f}")
```

#### Exemplo 3 – Clusterização com K-Means

```python
from sklearn.cluster import KMeans

# Dados de clientes
X = [[25, 50000], [30, 60000], [45, 80000], [22, 30000], ...]

kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)

# Grupos encontrados
print(f"Centróides: {kmeans.cluster_centers_}")
print(f"Rótulos: {kmeans.labels_}")
```

#### Exemplo 4 – CNN com Keras (Imagens)

```python
from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Conv2D(32, (3,3), activation='relu', input_shape=(64,64,3)),
    layers.MaxPooling2D((2,2)),
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.MaxPooling2D((2,2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')  # 10 classes
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10)
```

***

### 📈 Métricas de Avaliação

#### Regressão

| Métrica | Fórmula                | Significado                      |
| ------- | ---------------------- | -------------------------------- |
| **MSE** | (1/n) Σ(yᵢ - ŷᵢ)²      | Erro quadrático médio            |
| **MAE** | (1/n) Σ\|yᵢ - ŷᵢ\|     | Erro absoluto médio              |
| **R²**  | 1 - Σ(yᵢ-ŷᵢ)²/Σ(yᵢ-ȳ)² | Proporção da variância explicada |

#### Classificação

| Métrica      | Fórmula               | Significado                                   |
| ------------ | --------------------- | --------------------------------------------- |
| **Acurácia** | (VP+VN)/(VP+FP+VN+FN) | Acertos totais                                |
| **Precisão** | VP/(VP+FP)            | Dos que previsti como positivos, quantos são? |
| **Recall**   | VP/(VP+FN)            | Dos que eram positivos, quantos acertei?      |
| **F1-Score** | 2×(P×R)/(P+R)         | Média harmônica                               |

#### Clusterização

| Métrica              | Significado                       |
| -------------------- | --------------------------------- |
| **Inércia**          | Soma das distâncias intra-cluster |
| **Silhouette Score** | Coesão vs separação               |

***

### ⚠️ Armadilhas Comuns

| Problema                  | Descrição                         | Solução                                      |
| ------------------------- | --------------------------------- | -------------------------------------------- |
| **Overfitting**           | Modelo decora os dados de treino  | Regularização, mais dados, validação cruzada |
| **Underfitting**          | Modelo é muito simples            | Aumentar complexidade, mais features         |
| **Viés de dados**         | Dados não representam a realidade | Coletar dados mais diversos                  |
| **Data Leakage**          | Informação do futuro vaza         | Separar treino/teste corretamente            |
| **Features irrelevantes** | Ruído nos dados                   | Seleção de features, PCA                     |

***

### 🔗 Links Úteis

#### Cursos e Tutoriais

* [Andrew Ng - Machine Learning (Coursera)](https://www.coursera.org/learn/machine-learning)
* [Fast.ai - Deep Learning](https://www.fast.ai/)
* [Scikit-learn Documentation](https://scikit-learn.org/)

#### Datasets para Prática

* [Kaggle Datasets](https://www.kaggle.com/datasets)
* [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/)
* [Papers with Code](https://paperswithcode.com/)

#### Bibliotecas Python

```bash
pip install scikit-learn pandas numpy matplotlib
pip install tensorflow   # Deep Learning
pip install torch        # PyTorch
```

***

### 📚 Leitura Recomendada

| Livro                                | Autor                         | Foco               |
| ------------------------------------ | ----------------------------- | ------------------ |
| Pattern Recognition and ML           | Christopher Bishop            | Teoria fundamental |
| The Elements of Statistical Learning | Hastie, Tibshirani            | Estatístico        |
| Deep Learning                        | Goodfellow, Bengio, Courville | Deep Learning      |
| Hands-On ML with Scikit-Learn        | Aurélien Géron                | Prático            |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/conceitos/algoritmos/aprendizado-de-maquina-machine-learning.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
