Add pt-BR translation to Regression lesson ()

* start pt-br translation on regression section

* add pt-br translation on tools section of regression lesson

* add pt-br translation on data section of regression lesson

* add pt-br translation on linear section of regression lesson

* add pt-br translation on logistic section of regression lesson

* add syntax and others types of fixes on regression lesson

* add url fixes on regression lesson

* add syntax fixes on regression lesson

* add syntax fixes on regression lesson
pull/396/head
Arianne 4 years ago committed by GitHub
parent 4631e0e6c1
commit ad1656d884
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,213 @@
# Primeiros passos com Python e Scikit-learn para modelos de regressão
![Resumo de uma regressão em um _sketchnote_](../../../sketchnotes/ml-regression.png)
> _Sketchnote_ por [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Questionário inicial](https://white-water-09ec41f0f.azurestaticapps.net/quiz/9?loc=br)
> ### [Esta lição está disponível em R!](../solution/R/lesson_1-R.ipynb)
## Introdução
Nestas quatro lições, você irá descobrir como construir modelos de regressão. Discutiremos o que eles são daqui a pouco. Antes de mais nada, certifique-se que tem as ferramentas de que precisa para começar!
Nesta lição, você aprenderá como:
- Configurar seu computador para tarefas de _machine learning_.
- Trabalhar com Jupyter notebooks.
- Usar Scikit-learn, incluindo como fazer sua instalação.
- Explorar regressão linear com exercícios práticos.
## Instalação e configuração
[![Configurar Python no Visual Studio Code (vídeo em inglês)](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Configurar Python no Visual Studio Code")
> 🎥 Clique na imagem acima para assistir o vídeo: usando Python no VS Code (vídeo em inglês).
1. **Instale Python**. Verifique se você já instalou [Python](https://www.python.org/downloads/) em seu computador. Você usará Python para muitas tarefas de _data science_ (ciência de dados) e _machine learning_. A maioria dos sistemas de computador já possui Python instalado. Existem [Pacotes de Código em Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-15963-cxa) disponíveis para ajudar na instalação.
Algumas aplicações em Python exigem versões diferentes da linguagem. Portanto, será útil trabalhar com [ambiente virtual](https://docs.python.org/3/library/venv.html).
2. **Instale o Visual Studio Code**. Verifique se já existe o Visual Studio Code instalado em seu computador. Siga essas instruções para [instalar o Visual Studio Code](https://code.visualstudio.com/) com uma instalação básica. Você usará Python no Visual Studio Code neste curso e precisará [configurar o Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-15963-cxa) para isso.
> Fique mais confortável em usar Python trabalhando nessa coleção de [módulos de aprendizagem](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-15963-cxa).
3. **Instale a Scikit-learn**, seguindo [estas instruções](https://scikit-learn.org/stable/install.html). Visto que você precisa ter certeza que está usando o Python 3, é recomendável usar um ambiente virtual. Note que se você estiver usando essa biblioteca em um M1 Mac, há instruções específicas na página linkada acima.
1. **Instale o Jupyter Notebook**. Você precisará [instalar o pacote Jupyter](https://pypi.org/project/jupyter/).
## Seu ambiente de ML
Você irá usar **_notebooks_** para desenvolver código em Python e criar modelos de _machine learning_. Esse tipo de arquivo é uma ferramenta comum para _data scientists_, e pode ser identificado pelo sufixo ou extensão `.ipynb`.
_Notebooks_ são ambientes interativos que permitem a construção de código de programação e notas de _markdown_ para documentá-lo, o que pode ser muito útil para
projetos experimentais ou de pesquisa.
### Exercício - Trabalhando com um **_notebook_**
Nesta pasta, você encontrará o arquivo _notebook.ipynb_.
1. Abra _notebook.ipynb_ no Visual Studio Code.
Um servidor Jupyter será iniciado com Python 3+ carregado. Você encontrará áreas do _notebook_ que podem ser executadas (`run`). Para executar uma célula de código, basta clicar no ícone que parece um botão _play_ ▶.
1. Adicione uma célula de _markdown_ (ícone `md`) e escreva o texto: "**# Boas-vindas ao seu notebook**" (Welcome to your Notebook).
Em seguida, adicionaremos algum código em Python.
1. Crie e escreva **print('hello notebook')** numa célula de código.
1. Clique no ícone ▶ para executar o código.
O resultado ficará assim:
```output
hello notebook
```
![VS Code com um notebook aberto](../images/notebook.jpg)
Você pode adicionar comentários para documentar seu _notebook_.
✅ Pense por um momento em como o ambiente de uma pessoa desenvolvedora _web_ difere do ambiente para _data scientists_.
## Scikit-learn instalado e funcionando
Agora que Python está funcionando em seu ambiente local e você está mais confortável com Jupyter notebooks, vamos nos familizar com a Scikit-learn (a pronúncia de `sci` é a mesma do verbo sair conjugado na forma `sai`). Scikit-learn fornece uma [API abrangente](https://scikit-learn.org/stable/modules/classes.html#api-ref) para te ajudar com tarefas de ML.
De acordo com o seu [website](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn é uma bibilioteca de código aberto para _machine learning_ que suporta aprendizado supervisionado e não supervisionado. Também fornece várias ferramentas para ajuste de modelo, processamento de dados, seleção e validação de modelo, etc."
Nesse curso, você irá usar a Scikit-learn e outras ferramentas para construir modelos de _machine learning_ para fazer as chamadas tarefas "tradicionais" de _machine learning_. Nós evitamos usar _neural networks_ (redes neurais) e _deep learning_ (aprendizagem profunda) por que serão abordadas de uma forma mais completa no curso de "AI para iniciantes".
Scikit-learn facilita a construção e validação de modelos. O foco principal é no uso de dados numéricos mas também contém vários conjuntos de dados prontos para serem usados como ferramenta de estudo. Também possui modelos pré-construídos para os alunos experimentarem. Vamos explorar o processo de carregar dados predefinidos e usar um modelo com estimador integrado com a Scikit-learn e alguns dados básicos.
## Exercício - Seu primeiro notebook Scikit-learn
> Este tutorial foi inspirado pelo [exemplo de regressão linear](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) do site da Scikit-learn.
No arquivo _notebook.ipynb_, limpe todas as células clicando no ícone que parece uma lata de lixo 🗑️.
Nesta seção, você irá trabalhar com um pequeno conjunto de dados sobre diabetes que foi produzido para a Scikit-learn com fins de aprendizagem. Imagine que você queira testar um tratamento para pessoas diabéticas. Modelos de _machine learning_ podem te ajudar a escolher quais pacientes irão responder melhor ao tratamento, baseado em combinações de variáveis. Mesmo um modelo de regressão simples, quando visualizado, pode mostrar informações sobre variáveis que ajudarão a organizar ensaios clínicos teóricos.
✅ Existem muitos tipos de métodos de regressão, e a escolha dentre eles dependerá da resposta que você procura. Se você quer prever a altura provável de uma pessoa de uma determinada idade, você deve usar a regressão linear, pois está sendo usado um **valor numérico**. Se você quer descobrir se um tipo de cozinha pode ser considerado vegano ou não, isso está relacionado a uma **atribuição de categoria**, então usa-se a regressão logística. Você irá aprender mais sobre regressão logística em breve. Pense um pouco nas questões que aparecem com os dados que você tem e qual desses métodos seria mais apropriado usar.
Vamos começar a tarefa.
### Importe as bibliotecas
Para esta tarefa nós importaremos algumas bibliotecas:
- **matplotlib**. É uma [ferramenta gráfica](https://matplotlib.org/) que usaremos para criar um gráfico de linha.
- **numpy**. [Numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) é uma biblioteca útil que lida com dados numéricos em Python.
- **sklearn**. Essa é a bilioteca [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
Importe essas bibliotecas pois te ajudarão na tarefa.
1. Para importar você pode usar o código abaixo:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
Acima, você está importando `matplottlib`, `numpy` e também `datasets`, `linear_model` e `model_selection` da `sklearn`. A função `model_selection` é usada para dividir os dados em conjuntos de dados de treinamento e teste.
### O conjunto de dados sobre diabetes
O [conjunto de dados sobre diabetes](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) inclui 442 exemplos de dados sobre diabetes, com 10 variáveis de características, algumas delas incluem:
- age: idade em anos
- bmi (body mass index): índice de massa corporal
- bp (blood pressure): média de pressão sanguínea
- s1 tc: Células T (um tipo de glóbulo branco)
✅ Esse conjunto de dados inclui o conceito de "sexo" como variável de característica importante no contexto de diabetes. Muitos conjuntos de dados médicos incluem tipos de classificação binária. Pense um pouco sobre como categorizações como essa podem excluir partes de uma população dos tratamentos.
Agora, carregue os dados X e y.
> 🎓 Lembre-se que esse é um processo de aprendizado supervisionado, portanto, precisamos de um alvo 'y'.
Em uma célula de código, carregue o conjunto de dados sobre diabetes chamando a função `load_diabetes()`. O parâmetro `return_X_y=True` indica que `X` será uma matriz de dados e `y` é o alvo da regressão.
1. Adicione alguns comandos _print_ para mostrar a forma da matriz e seu primeiro elemento:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
A função retorna uma estrutura chamada tupla. Na primeira linha, os dois primeiros valores da tupla são atribuidos a `X` e `y`, respectivamente. Saiba mais [sobre tuplas](https://wikipedia.org/wiki/Tuple).
Você pode observar que os dados possuem 442 elementos divididos em matrizes de 10 elementos:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Pense sobre a relação entre os dados e o alvo da regressão. Regressão linear sugere a relação entre a característica X e a característica alvo y. Você pode achar o [alvo](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) para o conjunto de dados sobre diabetes na documentação? Conhecendo o alvo, o que este conjunto de dados demonstra?
2. Em seguida, selecione uma parte do conjunto de dados para plotar em um gráfico, colocando-o em uma nova matriz usando a função `newaxis` da numpy. Iremos usar regressão linear para gerar uma linha entre os valores do conjunto de dados, de acordo com o padrão que ela é definida.
```python
X = X[:, np.newaxis, 2]
```
✅ Você pode adicionar comandos _print_ para imprimir e visualizar os dados e verificar seus formatos.
3. Agora que os dados estão prontos para serem plotados, podemos usar uma máquina para ajudar a determinar a divisão lógica entre os dados no conjunto de dados. Para isso, é necessário dividir os dados (X) e o alvo (y) em conjuntos de teste e treinamento e a Scikit-learn oferece uma maneira de fazer isso.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. Seu modelo está pronto para ser treinado! Carregue o modelo de regressão linear e treine-o usando seus conjuntos de treinamento X e Y usando a função `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` é uma função que aparece em muitas biblioteas de ML, como a TensorFlow.
5. Por fim, faça uma previsão com seus dados de teste, usando a função `predict()`. Isso será usado para traçar uma linha entre os grupos de dados.
```python
y_pred = model.predict(X_test)
```
6. Chegou a hora de mostrar os resultados em um gráfico. Matplotlib é a ferramenta perfeita para essa tarefa. Crie um gráfico de dispersão (`scatter`) de todos os dados de teste de X e y, e use a previsão feita para traçar no lugar mais adequado, entre os grupos de dados do modelo.
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Scaled BMIs')
plt.ylabel('Disease Progression')
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
plt.show()
```
![um gráfico de dispersão mostrando pontos de dados de diabetes](../images/scatterplot.png)
✅ Observe o que está acontecendo. Uma linha reta está atravessando os pequenos pontos de dados, mas o que significa isso? Você consegue ver como pode usar essa linha para prever onde um ponto de dados novo ficaria em relação ao eixo y deste gráfico? Tente colocar em palavras o uso prático desse modelo.
Parabéns, usando um conjunto de dados, você construiu seu primeiro modelo de regressão linear, pediu que ele fizesse uma previsão e a mostrou em forma de gráfico!
---
## 🚀Desafio
Plote uma variável diferente desse mesmo conjunto de dados. Dica: edite a linha: `X = X[:, np.newaxis, 2]`. Dado o conjunto de dados alvo, o que pode ser descoberto sobre o progresso da diabetes como uma doença?
## [Questionário para fixação](https://white-water-09ec41f0f.azurestaticapps.net/quiz/10?loc=br)
## Revisão e Auto Aprendizagem
Neste tutorial, você trabalhou com regressão linear simples, ao invés de regressão univariada ou múltipla. Leia sobre as diferença desses métodos, ou assista [esse vídeo](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
Leia mais sobre o conceito de regressão e pense sobre os tipos de questões que podem ser respondidas usando essa técnica. Faça esse [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-15963-cxa) para aprender mais.
## Tarefa
[Um conjunto de dados diferente](assignment.pt-br.md).

@ -0,0 +1,13 @@
# Regressão com Scikit-learn
## Instruções
Dê uma olhada no [conjunto de dados Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud). Esse conjunto de dados possui múltiplos [alvos](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Consiste em três variáveis de exercício (dados) e três variáveis fisiológicas (alvos) coletadas de vinte homens de meia idade de uma academia '.
Em suas palavras, descreva como criar um modelo de regressão que mostra a relação entre a cintura e o número de abdominiais feitas. Faça o mesmo para os outros pontos de dados nesse conjunto de dados.
## Critérios de avaliação
| Critério | Exemplar | Adequado | Precisa melhorar |
| ------------------------------ | ----------------------------------- | -------------------------------- | ---------------------------- |
| Enviar um parágrafo descritivo | Parágrafo bem escrito | Algumas sentenças foram enviadas | Não possui nenhuma descrição |

@ -0,0 +1,208 @@
# Construindo um modelo de regressão usando Scikit-learn: preparar e visualizar dados
![Infográfico de visualização de dados](../images/data-visualization.png)
Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Questionário inicial](https://white-water-09ec41f0f.azurestaticapps.net/quiz/11?loc=br)
> ### [Esta liçao está disponível em R!](../solution/R/lesson_2-R.ipynb)
## Introdução
Agora que você configurou as ferramentas que precisa para começar a construir modelos de _machine learning_ com o Scikit-learn, vamos fazer perguntas sobre seus dados. Conforme você trabalha com dados e aplica soluções de ML, é muito importante entender como fazer a pergunta certa para obter o melhor de seu conjunto de dados.
Nesta lição, você irá aprender a:
- Como preparar os dados para a construção do modelo.
- Como usar matplotlib para visualização de dados.
[![Preparando e visualizando os dados (vídeo em inglês)](https://img.youtube.com/vi/11AnOn_OAcE/0.jpg)](https://youtu.be/11AnOn_OAcE "Preparando e Visualizando dados - Clique para assistir!")
> 🎥 Clique na imagem acima para assistir a um vídeo sobre os principais aspectos desta lição (vídeo em inglês).
## Fazendo a pergunta correta a seus dados
A pergunta que você precisa responder determinará que tipo de algoritmos de ML você usará. E a qualidade da resposta que você receber dependerá muito da natureza dos seus dados.
Dê uma olhada [nesses dados](../../data/US-pumpkins.csv). Você pode abrir este arquivo .csv no VS Code. Uma rápida leitura mostra imediatamente que existem espaços em branco e uma mistura de strings e dados numéricos. Há também uma coluna estranha chamada `Package` onde os dados são uma mistura entre 'sacks' (sacos), 'bins' (caixas) e outros valores. Esses dados estão uma bagunça.
A verdade é que raramente somos apresentados a um conjunto de dados que pode ser usado diretamente para criar um modelo de ML. Nesta lição, você aprenderá como preparar um conjunto de dados "bruto" usando bibliotecas Python. Você também aprenderá várias técnicas para visualizar os dados.
## Caso de estudo: 'o mercado de abóboras'
Na pasta `data`, na raiz do projeto, você encontrará um arquivo .csv chamado [US-pumpkins.csv](../../data/US-pumpkins.csv) que inclui 1757 linhas de dados sobre o mercado de abóboras, classificados em agrupamentos por cidade. Estes são dados brutos extraídos dos [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) (Relatórios Padrão de Mercados Terminais para Cultivos Especiais) distribuído pelo Departamento de Agricultura dos Estados Unidos.
### Preparando os dados
Esses dados são abertos ao público. Podem ser baixados em arquivos separados, por cidade, no site do USDA. Para evitar muitos arquivos separados, concatenamos todos os dados da cidade em uma planilha, feito isso, já _preparamos_ os dados um pouco. Agora vamos examinar mais de perto os dados.
### Dados das abóboras - conclusões inciais
O que você acha desses dados? Você já viu que existe uma mistura de strings, números, espaços em branco e valores estranhos?
Que pergunta você pode fazer sobre esses dados, usando uma técnica de regressão? Que tal "Como prever o preço de uma abóbora à venda durante um determinado mês"?. Olhando novamente para os dados, existem algumas mudanças que você precisa fazer para criar a estrutura de dados necessária para a tarefa.
## Exercício - Análise dos dados das abóboras
Vamos usar o [Pandas](https://pandas.pydata.org/), (que significa `Python Data Analysis`) uma ferramenta útil para moldar, analizar e preparar dados.
### Primeiro, procuramos datas faltantes
Você precisará seguir alguns passos para procurar por datas faltantes:
1. Converta as datas para um formato mensal (as datas estão no formato dos EUA, ou seja, `MM/DD/AAAA`).
2. Transforme o mês numa nova coluna.
Abra o arquivo _notebook.ipynb_ no Visual Studio Code e importe a planilha no formato de um _dataframe_ Pandas.
1. Use a função `head()` para visualizar as cinco primeiras linhas.
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ Qual função você usaria para visualizar as últimas cinco linhas?
1. Veja se existe datas faltantes no _dataframe_ atual:
```python
pumpkins.isnull().sum()
```
Alguns dados estão faltando, mas talvez não sejam necessários para esta tarefa.
1. Para tornar seu _dataframe_ mais fácil de usar, remova algumas das colunas usando a função `drop()`, mantendo apenas as colunas que você precisa:
```python
new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
```
### Segundo, calcule o preço médio das abóboras
Pense em como determinar o preço médio de uma abóbora em um determinado mês. Quais colunas você escolheria para esta tarefa? Dica: você precisará de 3 colunas.
Solução: pegue a média das colunas `Low Price` (Preço baixo) e `High Price` (Preço alto) para preencher a nova coluna `Price` (Preço) e converta a coluna `Date` (Data) para mostrar apenas o mês. Felizmente, de acordo com a verificação acima, não faltam dados de datas ou preços.
1. Pra calcular a média, adicione o seguinte código:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ Sinta-se a vontade para imprimir qualquer dado usando `print(nome da variável aqui)`.
2. Agora, copie sua data convertida em um _dataframe_ Pandas novinho em folha:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
Ao imprimir seu _dataframe_, você verá um conjunto de dados limpo e organizado para criar seu modelo de regressão.
### Mas espere! Parece que tem algo estranho 🤔
Se você olhar a coluna `Package` (Pacote), as abóboras são vendidas em muitas configurações diferentes. Algumas são vendidas em medidas de '1 1/9 bushel' (bushel é uma unidade de medida, equivalente à "alqueire"), e algumas de '1/2 bushel', algumas por abóbora, algumas por libra (unidade de medida) e algumas em grandes caixas de larguras variadas.
> Parece que é difícil pesar a abóbora de uma forma consistente.
Analisando os dados originais, é interessante observar que qualquer coisa com `Unit of Sale` (Unidade de Venda) igual a 'EACH' ou 'PER BIN' também tem o tipo `Package` com "per inch" (por polegada), "per bin" (por caixa) ou "each" (ambos). Como as abóboras são difíceis de pesar de forma consistente, vamos filtrá-las selecionando apenas as abóboras com a string "bushel" em sua coluna `Package`.
1. Adicione um filtro na parte superior do arquivo, abaixo da importação inicial do .csv:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Se você imprimir os dados agora, verá que retorna cerca de 415 contendo dados de abóboras por bushel.
### Opa! Mais uma coisa...
Você notou que a quantidade de bushel varia por linha? Você precisa normalizar o preço para mostrar o preço por bushel.
1. Adicione essas linhas após o bloco criando o _dataframe_ `new_pumpkins`:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ De acordo com [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), o peso por bushel depende do tipo de produto, pois é uma medida de volume. "Um bushel de tomates, por exemplo, deve pesar 56 libras (25,4 kg).. Folhas e verduras ocupam mais espaço com menos peso, então um bushel de espinafre pesa apenas 20 libras (9,1 kg)." (fala traduzida). É muito complicado! Não vamos nos preocupar em fazer uma conversão de bushel para libra e, em vez disso, definir o preço por bushel. Perceba que todo esse estudo de bushels de abóboras mostra como é muito importante entender a natureza de seus dados!
Você pode analisar o preço por unidade com base na medição do bushel. Se você imprimir os dados mais uma vez, verá como eles estão padronizados.
✅ Você notou que as abóboras vendidas a meio bushel são muito caras? Você pode descobrir por quê? Dica: as abóboras pequenas são muito mais caras do que as grandes, provavelmente porque há muito mais delas por bushel, especialmente considerando que uma abóbora grande tem uma grande cavidade vazia.
## Estratégias de visualização
Parte da função do _data scientist_ é demonstrar a qualidade e a natureza dos dados com os quais está trabalhando. Para fazer isso, eles geralmente criam visualizações, ou plotagens, gráficos e tabelas, mostrando diferentes aspectos dos dados. Dessa forma, eles são capazes de mostrar visualmente relações e lacunas que, de outra forma, seriam difíceis de descobrir.
As visualizações também podem ajudar a determinar a técnica de _machine learning_ mais adequada para os dados. Um gráfico de dispersão que parece seguir uma linha, por exemplo, indica que os dados são bons candidatos para um exercício de regressão linear.
Uma biblioteca de visualização de dados que funciona bem nos blocos de _notebooks_ é a [Matplotlib](https://matplotlib.org/) (que você também viu na lição anterior).
> Ganhe mais experiência em visualização de dados fazendo [esses tutoriais](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa).
## Exercício - Experimento com Matplotlib
Tente criar alguns gráficos básicos para exibir o novo _dataframe_ que você acabou de criar. O que um gráfico de linha básico mostraria?
1. Importe a Matplotlib no início do arquivo, embaixo da importação do pandas:
```python
import matplotlib.pyplot as plt
```
1. Execute o _notebook_ inteiro para atualizá-lo.
1. No final do _notebook_, adicione uma célula para plotar os dados:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![Um gráfico de dispersão mostrando a relação de preços por mês](../images/scatterplot.png)
Esse gráfico é relevante? Alguma coisa nele te surpreende?
O gráfico não é útil, pois tudo o que faz é exibir seus dados como uma distribuição de pontos em um determinado mês.
### Torne o gráfico útil
Para fazer com que os gráficos exibam dados úteis, você precisa agrupar os dados de alguma forma. Vamos tentar criar um gráfico onde o eixo "y" mostra os meses e o eixo "x" mostra a distribuição dos preços das abóboras.
1. Adicione uma célula de código para criar um gráfico de barras:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Um gráfico de barras mostrando a relação de preços por mês](../images/barchart.png)
Essa visualização de dados parece ser mais útil! Parece indicar que o preço mais alto das abóboras ocorre em setembro e outubro. Isso atende às suas expectativas? Por quê ou por quê não?
---
## 🚀Desafio
Explore os diferentes tipos de visualização que o Matplotlib oferece. Quais tipos são mais adequados para problemas de regressão?
## [Questionário para fixação](https://white-water-09ec41f0f.azurestaticapps.net/quiz/12?loc=br)
## Revisão e Auto Aprendizagem
Dê uma olhada nas maneiras de visualizar dados. Faça uma lista das várias bibliotecas disponíveis e observe quais são as melhores para determinados tipos de tarefas, por exemplo, visualizações 2D vs. visualizações 3D. O que você descobriu?
## Tarefa
[Explorando visualização](assignment.pt-br.md).

@ -0,0 +1,11 @@
# Explorando Visualizações
## Instruções
Existem muitas bibliotecas disponíveis para visualização de dados. Crie algumas visualizações usando o conjunto de dados sobre abóboras nesta lição usando matplotlib e seaborn em um _notebook_. Quais bibliotecas são mais fáceis de usar?
## Critérios de avaliação
| Critério | Exemplar | Adequado | Precisa melhorar |
| -------- | --------- | -------- | ----------------- |
| | Um _notebook_ foi submetido com duas explorações/visualizações | Um _notebook_ foi submetido com uma exploração/visualização | Nenhum _notebook_ foi submetido |

@ -0,0 +1,342 @@
# Construindo um modelo de regressão usando Scikit-learn: regressão em dois modos
![Infográfico de regressão linear versus polinomial](../images/linear-polynomial.png)
> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Questionário inicial](https://white-water-09ec41f0f.azurestaticapps.net/quiz/13?loc=br)
> ### [Esta liçao está disponível em R!](../solution/R/lesson_3-R.ipynb)
### Introdução
Até agora, você viu o que é regressão com dados de amostra coletados do conjunto de dados de preços de abóboras, usaremos esse conjunto de dados ao longo desta lição. Você também o visualizou usando Matplotlib.
Você está pronto para mergulhar mais fundo na regressão para ML. Nesta lição, você aprenderá mais sobre dois tipos de regressão: _regressão linear básica_ e _regressão polinomial_, junto com um pouco da matemática que fundamenta essas duas técnicas.
> Ao longo deste curso, assumimos um conhecimento mínimo de matemática e procuramos torná-lo acessível para alunos vindos de outras áreas, portanto, preste atenção às notas, 🧮 legendas, diagramas e outras ferramentas de aprendizagem para ajudar na compreensão.
### Pré-requisito
Você já deve saber mais ou menos como é a estrutura do conjunto de dados de abóboras que estávamos examinando. Você pode encontrá-lo já tratado no arquivo _notebook.ipynb_ desta lição. No arquivo, o preço da abóbora é exibido por bushel (aquela unidade de medida 😅) em um novo _dataframe_. Certifique-se de que você pode executar os _notebooks_ no Visual Studio Code.
### Preparação
Lembre-se de que você está carregando esses dados para produzir questionamentos a partir deles.
- Qual é a melhor época para comprar abóboras?
- Que preço posso esperar de uma caixa de abóboras pequenas?
- Devo comprar abóboras em caixas de 1/2 bushel ou de 1 1/9?
Vamos continuar investigando esses dados.
Na lição anterior, você criou um _dataframe_ Pandas e o preencheu com parte do conjunto de dados original, padronizando o preço por bushel. Porém, ao fazer isso só foi possível reunir cerca de 400 pontos de dados e apenas para os meses de outono.
Dê uma olhada nos dados que pré-carregamos no _notebook_ que acompanha esta lição. Os dados são pré-carregados e um gráfico de dispersão inicial é traçado para mostrar os dados do mês. Talvez possamos obter mais detalhes sobre a natureza dos dados fazendo uma limpeza.
## Linha de regressão linear
Como você aprendeu na [Lição 1](../../1-Tools/translations/README.pt-br.md), o objetivo de um exercício de regressão linear é ser capaz de traçar uma linha para:
- **Mostrar relações entre variáveis**.
- **Fazer previsões**. Previsões sobre onde um novo ponto de dados ficaria em relação a linha.
É típico da **Regressão de Mínimos Quadrados** traçar esse tipo de linha. O termo 'mínimos quadrados' significa que todos os pontos de dados ao redor da linha de regressão são quadrados e somados. Idealmente, essa soma final é a menor possível, porque queremos um baixo número de erros, ou `mínimos quadrados`.
Fazemos isso porque queremos modelar uma linha que tenha a menor distância cumulativa de todos os nossos pontos de dados. Também elevamos os termos ao quadrado antes de adicioná-los, pois estamos preocupados com sua magnitude e não com sua direção.
> **🧮 Me mostre a matemática**
>
> Esta linha, chamada de _linha de melhor ajuste_, pode ser expressa por [uma equação](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` é a 'variável explanatória'. `Y` é a 'variável dependente'. `b` é a inclinação da linha e `a` é a interseção de y, que se refere ao valor de `Y` quando `X = 0`.
>
>![Cálculo da inclinação](../images/slope.png)
>
> Primeiro, calculamos a inclinação `b` (Infográfico por [Jen Looper](https://twitter.com/jenlooper)).
>
> Em outras palavras, e se referindo à pergunta original sobre os dados das abóboras: "prever o preço mensal de uma abóbora por bushel", `X` seria o preço e `Y` o mês de venda.
>
>![Completando a equação](../images/calculation.png)
>
> Agora calcule o valor de `Y`. Se você está pagando cerca de US $ 4, então deve ser abril! (Infográfico por [Jen Looper](https://twitter.com/jenlooper)).
>
> Esse cálculo deve demonstrar a inclinação da linha, que também depende da interseção, ou onde `Y` está situado quando `X = 0`.
>
> Você pode observar o cálculo desses valores no site [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) (Matemática é divertida). Visite também [esta calculadora de mínimos quadrados](https://www.mathsisfun.com/data/least-squares-calculator.html) para observar como os valores dos números afetam a linha.
## Correlação
Mais um termo a ser entendido é o **Coeficiente de correlação** entre as variáveis `X` e `Y` fornecidas. Usando um gráfico de dispersão, você pode visualizar rapidamente esse coeficiente. Um gráfico com pontos de dados espalhados quase no mesmo formato da linha tem alta correlação, mas um gráfico com pontos de dados espalhados por toda parte entre `X` e `Y` tem uma correlação baixa.
Um bom modelo de regressão linear será aquele que tiver um coeficiente de correlação alto (mais próximo de 1 do que 0) usando o método de regressão por mínimos quadrados com uma linha de regressão.
✅Execute o _notebook_ desta lição e observe o gráfico de dispersão usando as colunas City (cidade) e Price (preço). Os dados que associam a cidade ao preço para vendas de abóboras parecem ter alta ou baixa correlação?
## Prepare seus dados para regressão
Usando a matemática por trás deste exercício, crie um modelo de regressão para prever qual melhor preço de caixa de abóbora. Um comprador de abóbora vai querer saber desse tipo de informação para otimizar suas compras.
Como você usará o Scikit-learn, não há razão para fazer isso manualmente (mas você pode!). No bloco principal do seu _notebook_, adicione a biblioteca do Scikit-learn para converter automaticamente todos os dados string em números:
```python
from sklearn.preprocessing import LabelEncoder
new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)
```
Se você olhar para o _dataframe_ `new_pumpkins` agora, verá que todas as strings são números. Isso torna a leitura mais difícil, mas muito mais simples para o Scikit-learn!
Você pode tomar decisões robustas (não apenas com base em um gráfico de dispersão) sobre os melhores dados para a regressão.
Tente encontrar uma boa correlação entre dois pontos de seus dados para construir um bom modelo preditivo. Vemos que há uma correlação baixa entre City e Price:
```python
print(new_pumpkins['City'].corr(new_pumpkins['Price']))
0.32363971816089226
```
Porém, há uma correlação um pouco melhor entre Package (pacote) e Price. Isso faz sentido, né? Normalmente, quanto maior a caixa de produtos, mais alto é o preço.
```python
print(new_pumpkins['Package'].corr(new_pumpkins['Price']))
0.6061712937226021
```
Uma boa pergunta sobre esses dados seria: 'Que preço posso esperar de uma determinada caixa de abóbora?'.
Vamos construir o modelo de regressão.
## Construindo um modelo linear
Antes de construir seu modelo, vamos tratar os dados mais uma vez. Elimine quaisquer dados nulos e verifique os dados mais uma vez.
```python
new_pumpkins.dropna(inplace=True)
new_pumpkins.info()
```
Em seguida, crie um novo _dataframe_ a partir desse conjunto e imprima-o:
```python
new_columns = ['Package', 'Price']
lin_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
lin_pumpkins
```
```output
Package Price
70 0 13.636364
71 0 16.363636
72 0 16.363636
73 0 15.454545
74 0 13.636364
... ... ...
1738 2 30.000000
1739 2 28.750000
1740 2 25.750000
1741 2 24.000000
1742 2 24.000000
415 rows × 2 columns
```
1. Atribua seu X e y:
```python
X = lin_pumpkins.values[:, :1]
y = lin_pumpkins.values[:, 1:2]
```
✅ Mas o que é isso? Você está usando a [notação slice](https://stackoverflow.com/questions/509211/understanding-slice-notation/509295#509295) para criar _arrays_ e populá-los nas variáveis `X` and `y`.
2. Comece as rotinas de construção do modelo de regressão:
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
pred = lin_reg.predict(X_test)
accuracy_score = lin_reg.score(X_train,y_train)
print('Model Accuracy: ', accuracy_score)
```
Como a correlação não é tão boa, o modelo não é muito preciso.
```output
Model Accuracy: 0.3315342327998987
```
3. Para visualizar a linha, use o código abaixo:
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, pred, color='blue', linewidth=3)
plt.xlabel('Package')
plt.ylabel('Price')
plt.show()
```
![Um gráfico de dispersão mostrando a relação do preço e caixa de abóboras](../images/linear.png)
4. Teste o modelo com um valor hipotético de variedade (coluna Variety):
```python
lin_reg.predict( np.array([ [2.75] ]) )
```
O preço devolvido é:
```output
array([[33.15655975]])
```
O número faz sentido se a lógica da linha de regressão estiver correta.
🎃 Parabéns, você acabou de criar um modelo que pode ajudar a prever o preço de uma caixa (ou outro tipo de medida) de abóboras.
Já vai ter decoração de halloween até o do ano que vem ou já pode aprimorar seu histórico de receitas que levam abóbora.
Lembre-se que sempre tem como melhorar o seu modelo!
## Regressão polinomial
Outro tipo de regressão linear é a regressão polinomial. Embora às vezes haja uma relação linear entre as variáveis - quanto maior o volume da abóbora, mais alto é o preço -, às vezes essas relações não podem ser representadas como um plano ou uma linha reta.
✅ Aqui estão [mais exemplos](https://online.stat.psu.edu/stat501/lesson/9/9.8) de dados que podem usar regressão polinomial.
Dê uma outra olhada na relação entre Variety e Price no gráfico anterior. Este gráfico de dispersão parece que deve ser analisado por uma linha reta? Talvez não. Nesse caso, você pode tentar a regressão polinomial.
✅ Polinômios são expressões matemáticas que podem consistir em uma ou mais variáveis e coeficientes.
A regressão polinomial cria uma linha curva para ajustar melhor os dados não lineares.
1. Vamos recriar um _dataframe_ preenchido com um segmento dos dados originais:
```python
new_columns = ['Variety', 'Package', 'City', 'Month', 'Price']
poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
poly_pumpkins
```
Uma boa forma de visualizar as correlações entre os dados em _dataframes_ é exibi-los em um gráfico '_coolwarm_':
2. Use o método `Background_gradient()` com `coolwarm` como parâmetro:
```python
corr = poly_pumpkins.corr()
corr.style.background_gradient(cmap='coolwarm')
```
Este código cria um mapa de calor:
![Um mapa de calor mostrando a correlação dos dados](../images/heatmap.png)
Este gráfico mostra a boa correlação entre Package e Price. Portanto, você pode criar um modelo melhor que o anterior.
### Criando um _pipeline_
Scikit-learn inclui uma API para construir modelos de regressão polinomial - a [API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) `make_pipeline`. É criado um _pipeline_ que consiste em uma cadeia de estimadores. Nesse caso, o _pipeline_ inclui recursos polinomiais ou previsões que formam um caminho não linear.
1. Populamos X e y:
```python
X=poly_pumpkins.iloc[:,3:4].values
y=poly_pumpkins.iloc[:,4:5].values
```
2. Criamos um _pipeline_ chamando a função `make_pipeline()`:
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
pipeline.fit(np.array(X_train), y_train)
y_pred=pipeline.predict(X_test)
```
### Criando uma sequência
Neste momento, você precisa criar um novo _dataframe_ com dados _classificados_ para que o _pipeline_ possa criar uma sequência.
Adicione o código abaixo:
```python
df = pd.DataFrame({'x': X_test[:,0], 'y': y_pred[:,0]})
df.sort_values(by='x',inplace = True)
points = pd.DataFrame(df).to_numpy()
plt.plot(points[:, 0], points[:, 1],color="blue", linewidth=3)
plt.xlabel('Package')
plt.ylabel('Price')
plt.scatter(X,y, color="black")
plt.show()
```
Você criou um novo _dataframe_ chamando `pd.DataFrame`. Em seguida, classificou os valores chamando `sort_values()`. Finalmente, você criou um gráfico polinomial:
![Um gráfico polinomial que mostra a relação entre caixa e preço](../images/polynomial.png)
Você pode ver uma linha curva que se ajusta melhor aos seus dados.
Vamos verificar a acurácia do modelo:
```python
accuracy_score = pipeline.score(X_train,y_train)
print('Model Accuracy: ', accuracy_score)
```
Tcharam! ✨
```output
Model Accuracy: 0.8537946517073784
```
### Fazendo previsões
Podemos inserir um novo valor e obter uma previsão?
Chame `predict()` para pedir uma previsão:
```python
pipeline.predict( np.array([ [2.75] ]) )
```
E conseguimos:
```output
array([[46.34509342]])
```
Agora faz sentido!
E se esse modelo for melhor que o anterior usando o mesmo conjunto de dados, você já pode fazer orçamentos para abóboras mais caras! 😂
🏆 Muito bem! Você criou dois modelos de regressão em uma lição. Na lição final, você aprenderá sobre regressão logística para determinar categorias 🤩.
---
## 🚀Desafio
Teste variáveis diferentes neste _notebook_ para ver como a correlação corresponde à acurácia do modelo.
## [Questionário para fixação](https://white-water-09ec41f0f.azurestaticapps.net/quiz/14?loc=br)
## Revisão e Auto Aprendizagem
Nesta lição, aprendemos sobre regressão linear. Existem outros tipos importantes de regressão. Leia sobre as técnicas Stepwise, Ridge, Lasso e Elasticnet. Um bom curso para um estudo mais aprofundado é o [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) (Curso de aprendizagem estatística de Stanford).
## Tarefa
[Construa um modelo](assignment.pt-br.md).

@ -0,0 +1,11 @@
# Construa um modelo de regressão
## Instruções
Nesta lição, mostramos como construir um modelo usando regressão linear e polinomial. Usando o que aprendeu, encontre um conjunto de dados ou use um dos conjuntos integrados a Scikit-Learn para construir um novo modelo. Explique em seu _notebook_ porque você escolheu uma técnica particular e demonstre a acurácia do modelo. E se a acurácia não for boa, explique por quê.
## Critérios de avaliação
| Critério | Exemplar | Adequado | Precisa melhorar |
| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- |
| | Apresenta um _notebook_ completo e bem documentado | A solução está incompleta | A solução possui _bugs_ |

@ -0,0 +1,311 @@
# Regressão logística para prever categorias
![Infográfico de regressão logística versus regressão linear](../images/logistic-linear.png)
> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Questionário inicial](https://white-water-09ec41f0f.azurestaticapps.net/quiz/15?loc=br)
> ### [Esta liçao está disponível em R!](../solution/R/lesson_4-R.ipynb)
## Introdução
Nesta lição final sobre Regressão, uma das técnicas básicas do ML _clássico_, vamos estudar a Regressão Logística. Essa técnica serve para descobrir padrões e prever categorias binárias. Este doce é de chocolate ou não? Esta doença é contagiosa ou não? Este cliente vai escolher este produto ou não?
Você irá aprender:
- Uma nova biblioteca para visualização de dados
- Técnicas de regressão logística
✅ Aprofunde seu conhecimento de como trabalhar com este tipo de regressão neste [módulo](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-15963-cxa).
## Pré-requisito
Tendo trabalhado com os dados das abóboras, estamos familiarizados o suficiente com eles para perceber que há uma categoria binária com a qual podemos trabalhar: `Color` (cor).
Vamos construir um modelo de regressão logística para prever _qual a cor que a abóbora provavelmente terá_ (laranja 🎃 ou branca 👻), com base em algumas colunas.
> Por que estamos falando de classificação binária em um grupo de lições sobre regressão? Apenas por conveniência linguística, regressão logística é [um método de classificação](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), mesmo sendo linear. Vamos aprender outros modos de classificar dados em lições mais a frente.
## Defina a pergunta
Para esta lição, expressaremos 'Orange' (Laranja) ou 'Not Orange' (Não Laranja) como um dado binário. Existe uma categoria 'striped' (listrada) em nosso conjunto de dados, mas há poucas instâncias dela, então não a usaremos. Ela desaparece assim que removemos os valores nulos no conjunto de dados.
> 🎃 Curiosidade: podemos chamar as abóboras brancas de 'abóboras fantasmas'. Elas não são fáceis de esculpir, por isso não são tão populares quanto as laranjas mas são legais também!
## Sobre a regressão logística
A regressão logística difere da regressão linear em alguns aspectos importantes.
### Classificação binária
A regressão logística oferece uma previsão sobre uma categoria binária ("laranja ou não laranja"), enquanto a linear é capaz de prever valores contínuos, por exemplo: _quanto o preço de uma abóbora vai subir_ dada sua origem e a época de colheita.
![Modelo de classificação de abóboras](../images/pumpkin-classifier.png)
> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
### Outros tipos de classificações
Existem outros tipos de regressão logística, incluindo multinomial e ordinal:
- **Multinomial**, que envolve ter mais de uma categoria - "Laranja, Branco e Listrado".
- **Ordinal**, que envolve categorias ordenadas. É útil se quisermos ordenar nossos resultados logicamente, como nossas abóboras que são ordenadas por um número finito de tamanhos (mini, sm, med, lg, xl, xxl).
![Regressão multinomial versus ordina](../images/multinomial-ordinal.png)
> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
### Continua sendo linear
Embora esse tipo de regressão esteja relacionado a "previsões de categoria", ele funciona ainda melhor quando há uma relação linear clara entre a variável dependente (cor) e as outras variáveis independentes (o resto do conjunto de dados, como o nome da cidade e as dimensões). É bom saber se existe alguma relação linear entre essas variáveis previamente.
### Variáveis NÃO devem ser correlacionadas
Lembra como a regressão linear funcionou melhor com variáveis correlacionadas? A regressão logística é o oposto: as variáveis não precisam disso. Logo, funciona para dados que têm correlações baixas.
### Você precisará de muitos dados. E tratados.
A regressão logística fornecerá resultados mais precisos se você usar mais dados; portanto, tenha em mente que, como o conjunto de dados das abóboras é pequeno, talvez não sirva para esta tarefa.
✅ Pense sobre os tipos de dados que funcionariam bem com regressão logística.
## Exercício - Organizar os dados
Primeiro, limpamos os dados eliminando os valores nulos e selecionando apenas algumas das colunas:
1. Adicione o seguinte código:
```python
from sklearn.preprocessing import LabelEncoder
new_columns = ['Color','Origin','Item Size','Variety','City Name','Package']
new_pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
new_pumpkins.dropna(inplace=True)
new_pumpkins = new_pumpkins.apply(LabelEncoder().fit_transform)
```
Você pode usar o código abaixo dar uma espiada em como está seu _dataframe_:
```python
new_pumpkins.info
```
### Visualização: _side-by-side grid_ (grade lado-a-lado)
Após carregar mais uma vez seu [_notebook_](../notebook.ipynb) com os dados das abóboras e tratá-los para preservar um conjunto de dados contendo algumas colunas, incluindo `Color`, vamos visualizar o _dataframe_ no _notebook_ usando uma biblioteca diferente: a [Seaborn](https://seaborn.pydata.org/index.html).
Seaborn oferece algumas maneiras interessantes de visualizar dados. Por exemplo, você pode comparar as distribuições dos dados para cada ponto em uma grade lado-a-lado.
1. Crie a grade instanciando um `PairGrid`, usando nossos dados de abóboras `new_pumpkins`, seguido pela chamada da função `map()`:
```python
import seaborn as sns
g = sns.PairGrid(new_pumpkins)
g.map(sns.scatterplot)
```
![Uma grade para visualização de dados](../images/grid.png)
Olhando os dados lado a lado, você pode ver como os dados da coluna `Color` se relacionam com as outras colunas.
✅ Consegue imaginar o que podemos explorar, dada essa grade de gráficos de dispersão?
### Gráfico _swarm_
Como `Color` é uma categoria binária (laranja ou não), ela é chamada de 'dado categórico' e precisa de 'uma [abordagem mais especializada](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) para visualização'. Existem outras maneiras de visualizar a relação desta coluna com as outras.
As colunas podem ser visualizadas lado a lado com os gráficos Seaborn.
1. Experimente um gráfico _swarm_ para mostrar a distribuição de valores:
```python
sns.swarmplot(x="Color", y="Item Size", data=new_pumpkins)
```
![Dados visualizados num gráfico _swarm_](../images/swarm.png)
### Gráfico violino
Um gráfico do tipo "violino" é útil para visualizar como os dados são distribuídos nas duas categorias. Plotagens semelhantes a violino não funcionam tão bem com conjuntos de dados menores porque a distribuição é exibida de forma mais "uniforme".
1. Use como parâmetros `x=Color`, `kind="violin"` e chame a função `catplot()`:
```python
sns.catplot(x="Color", y="Item Size",
kind="violin", data=new_pumpkins)
```
![Gráfico violino](../images/violin.png)
✅ Tente criar este gráfico e outros gráficos Seaborn, usando outras colunas.
Agora podemos imaginar a relação entre as duas categorias binárias de cor e tamanho (_item size_). Vamos explorar a regressão logística para prever a cor de uma abóbora em particular.
> **🧮 Me mostre a matemática**
>
> Você se lembra como a regressão linear costumava usar mínimos quadrados comuns para chegar a um valor? A regressão logística depende do conceito de 'probabilidade máxima' usando [funções sigmóide](https://wikipedia.org/wiki/Sigmoid_function). Uma 'função sigmóide' em um gráfico parece estar na forma de um 'S'. Ela pega um valor e o mapeia para algo entre 0 e 1. Sua curva também é chamada de 'curva logística'. Sua fórmula é assim:
>
> ![logistic function](../images/sigmoid.png)
>
> o ponto médio do sigmóide encontra-se no eixo X. `L` é o valor máximo da curva e `k` é a inclinação da curva. Se o resultado da função for maior que 0.5, o valor atribuído à função será classificado como '1'. Caso contrário, será classificado como '0'.
## Construindo um modelo
Construir um modelo para encontrar classificações binárias é muito simples no Scikit-learn.
1. Selecione as colunas que deseja usar em seu modelo de classificação e divida os conjuntos de dados em conjuntos de treinamento e teste chamando `train_test_split()`:
```python
from sklearn.model_selection import train_test_split
Selected_features = ['Origin','Item Size','Variety','City Name','Package']
X = new_pumpkins[Selected_features]
y = new_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
1. Usando seus dados de treinamento, treine seu modelo chamando a função `fit()`, e imprima o resultado:
```python
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('Accuracy: ', accuracy_score(y_test, predictions))
```
Veja o placar do seu modelo. Nada mal, especialmente com apenas 1000 linhas de dados:
```output
precision recall f1-score support
0 0.85 0.95 0.90 166
1 0.38 0.15 0.22 33
accuracy 0.82 199
macro avg 0.62 0.55 0.56 199
weighted avg 0.77 0.82 0.78 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 1 0 0 0 1 0]
```
## Melhor compreensão usando Matriz de Confusão
Embora você possa obter os [valores](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) de um relatório de *placar* do seu modelo como na *impressão* acima, você pode entender melhor o desempenho do seu modelo com uma [matriz de confusão](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix).
> 🎓 Uma '[matriz de confusão](https://wikipedia.org/wiki/Confusion_matrix)' (ou 'matriz de erro') é uma tabela que expressa os verdadeiros e falsos positivos e negativos, medindo a acurácia das previsões.
1. Para obter a matriz de confusão, chame a função `confusion_matrix()`:
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
Dê uma olhada na matriz de confusão do seu modelo:
```output
array([[162, 4],
[ 33, 0]])
```
> Na Scikit-learn, as linhas nas matrizes de confusão (eixo 0) são classes reais e colunas (eixo 1) são classes previstas.
> | | 0 | 1 |
> | :---: | :---: | :---: |
> | 0 | TP (True Positive = Verdadeiro Positivo) | FN (False Negative = Falso Negativo) |
> | 1 | FP (False Positive = Falso Positivo) | TN (True Negative = Verdadeiro Negativo) |
O que está acontecendo aqui? Supondo que nosso modelo tenha que classificar as abóboras entre duas categorias binárias, categoria 'laranja' e categoria 'não laranja':
- Se o seu modelo prevê que uma abóbora não é laranja e ela pertence à categoria 'não laranja', chamamos isso de verdadeiro negativo.
- Se o seu modelo prevê que uma abóbora é laranja e ela pertence à categoria 'não laranja', chamamos isso de falso positivo.
- Se o seu modelo prevê que uma abóbora não é laranja e ela pertence à categoria 'laranja', chamamos isso de falso negativo.
- Se o seu modelo prevê que uma abóbora é laranja e ela pertence à categoria 'laranja', chamamos isso de verdadeiro positivo.
Podemos perceber que é melhor ter um número maior de positivos e negativos verdadeiros e um número menor de positivos e negativos falsos pois, isso significa que o modelo tem um desempenho melhor.
✅ Pergunta: Com base na matriz de confusão, o modelo é bom ou não? Resposta: nada mal; existem muitos verdadeiros positivos (162) e poucos falsos negativos (4).
Vamos revisitar os termos que vimos anteriormente com a ajuda da matriz de confusão de TP / TN e FP / FN:
🎓 Precision: TP / (TP + FP). Razão de dados relevantes que foram previstos corretamente entre todos os dados do conjunto.
🎓 Recall: TP / (TP + FN). A proporção dos dados relevantes que foram previstos, estando rotulados corretamente ou não.
🎓 f1-score (pontuação f1): (2 * precision * recall)/(precision + recall). Uma média ponderada entre _precision_ e _recall_. 1 é bom e 0 é ruim.
🎓 Support (suporte): O número de ocorrências de cada classe.
🎓 Accuracy (acurácia): (TP + TN) / (TP + TN + FP + FN). Porcentagem de classes previstas corretamente para uma amostra.
🎓 Macro avg (média macro): Média simples (não ponderada) das métricas de cada classe.
🎓 Weighted Avg (média Ponderada): Média ponderada dos valores de _Support_ de cada classe.
Como a matriz de confusão se relaciona com _precision_ (precisão) e _recall_ (cobertura)? A matriz de confusão mostrada acima possui valores de precisão (0.83) e _recall_ (0.98), pois:
Precision = TP / (TP + FP) = 162 / (162 + 33) = 0.8307692307692308
Recall = TP / (TP + FN) = 162 / (162 + 4) = 0.9759036144578314
✅ Você consegue perceber qual métrica deve ser usada se quiser que seu modelo reduza o número de falsos negativos?
## Visualizando a curva ROC de um modelo
O modelo construído não é ruim. A acurácia é de cerca de 80%, então ele pode ser usado para prever a cor de uma abóbora com base em algumas colunas.
Vamos usar mais um tipo de visualização utilizando a ROC:
```python
from sklearn.metrics import roc_curve, roc_auc_score
y_scores = model.predict_proba(X_test)
# calculate ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
sns.lineplot([0, 1], [0, 1])
sns.lineplot(fpr, tpr)
```
Usando a Seaborn novamente, plote a [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) (Característica de Operação do Receptor) do modelo ou ROC. As curvas ROC são muito usadas para obter uma visão da saída de um classificador em termos de seus verdadeiros versus falsos positivos. "As curvas ROC normalmente apresentam taxa de verdadeiro positivo no eixo Y e taxa de falso positivo no eixo X." Assim, a inclinação da curva e o espaço entre a linha do ponto médio e a curva são importantes: precisamos de uma curva que sobe e passa pela linha. No nosso caso, existem falsos positivos no começo e, em seguida, a linha avança corretamente:
![ROC](../images/ROC.png)
Por fim, usamos a [API `roc_auc_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) da Scikit-learn para calcular a 'Area Under the Curve' (área sob a curva) ou AUC:
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
O resultado é `0.6976998904709748`. Sabendo que a AUC varia de 0 a 1, o ideal é uma pontuação alta, pois um modelo que está 100% correto em suas previsões terá uma AUC de 1; neste caso, o modelo é _muito bom_.
Em outras lições sobre classificação, você aprenderá como iterar para melhorar as pontuações do seu modelo. Mas por enquanto, parabéns! Você concluiu as lições sobre regressão!
---
## 🚀Desafio
Ainda há muito sobre regressão logística! E a melhor maneira de aprender é experimentando. Encontre um conjunto de dados para este tipo de análise e construa um modelo com ele. O que você aprendeu? dica: tente o [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) para conjuntos de dados interessantes.
## [Questionário para fixação](https://white-water-09ec41f0f.azurestaticapps.net/quiz/16?loc=br)
## Revisão e Auto Aprendizagem
Leia as primeiras páginas [deste artigo de Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) sobre alguns usos práticos da regressão logística. Pense nas tarefas mais adequadas para um ou outro tipo de tarefa de regressão que estudamos até agora. O que funcionaria melhor?
## Tarefa
[Refazendo a regressão](assignment.pt-br.md)

@ -0,0 +1,11 @@
# Refazendo a regressão
## Instruções
Nesta lição, você usou um subconjunto do conjunto de dados de abóboras. Volte aos dados originais e tente usar todos eles, tratados e padronizados, para construir um modelo de Regressão Logística.
## Critérios de avaliação
| Critério | Exemplar | Adequado | Precisa melhorar |
| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
| | Apresenta um modelo bem explicado e de bom desepenho | Apresenta um modelo com desempenho mínimo | Apresenta um modelo baixo desempenho |

@ -0,0 +1,34 @@
# Modelos de regressão para *machine learning*
## Tema regional: Modelos de regressão para preços de abóbora na América do Norte 🎃
Na América do Norte, é costume esculpir rostos assustadores em abóbora no Halloween. Vamos descobrir mais sobre esses vegetais
fascinantes!
![jack-o-lanterns](../images/jack-o-lanterns.jpg)
> Foto de <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> em <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## O que vamos aprender
As lições desta seção abordam tipos de regressão no contexto de _machine learning_. Modelos de regressão podem ajudar a determinar a _relação_ entre variáveis. Esse tipo de modelo pode prever valores como comprimento, temperatura ou idade, sugerindo relações entre variáveis à medida que analisa pontos de dados.
Nesta série de lições, você descobrirá a diferença entre regressão linear e logística, e quando deve usar uma ou outra.
Neste grupo de lições, te prepararemos para começar tarefas de _machine learning_, incluindo configuração do Visual Studio Code para gerenciar _notebooks_, o ambiente comum para _data scientists_ (cientistas de dados). Você descobrirá a Scikit-learn, uma biblioteca para _machine learning_, e construirá seus primeiros modelos, focando em modelos de regressão neste capítulo.
> Existem ferramentas _low-code_ que podem ajudar a aprender como trabalhar com modelos de regressão. Use a [Azure ML para esta tarefa](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa).
### Lições
1. [Ferramentas necessárias](../1-Tools/translations/README.pt-br.md)
2. [Gerenciamento de dados](../2-Data/translations/README.pt-br.md)
3. [Regressão linear e polinomial](../3-Linear/translations/README.pt-br.md)
4. [Regressão logística](../4-Logistic/translations/README.pt-br.md)
---
### Créditos
"ML with regression" (ML com regressão) foi escrito com ♥️ por [Jen Looper](https://twitter.com/jenlooper)
♥️ Contribuidores do questionário incluem: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) e [Ornella Altunyan](https://twitter.com/ornelladotcom)
O _dataset_ (base de dados) de abóbora foi sugerido por [esse projeto no Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) e seus dados vieram dos [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) (Relatórios Padrão de Mercados Terminais para Cultivos Especiais) distribuído pelo Departamento de Agricultura dos Estados Unidos. Adicionamos alguns pontos sobre a cor por tipo de abóbora para normalizar a distribuição dos dados. Esses dados são abertos ao público.
Loading…
Cancel
Save