You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/pt/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

449 lines
17 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
"translation_date": "2025-09-03T19:42:25+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "pt"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Introdução à Regressão - Aula 1\n",
"\n",
"#### Colocando em Perspectiva\n",
"\n",
"✅ Existem muitos tipos de métodos de regressão, e qual você escolhe depende da resposta que está procurando. Se quiser prever a altura provável de uma pessoa com uma determinada idade, utilizaria `regressão linear`, pois está à procura de um **valor numérico**. Se estiver interessado em descobrir se um tipo de culinária deve ser considerado vegano ou não, está à procura de uma **atribuição de categoria**, então utilizaria `regressão logística`. Aprenderá mais sobre regressão logística mais adiante. Pense um pouco sobre algumas perguntas que pode fazer aos dados e qual desses métodos seria mais apropriado.\n",
"\n",
"Nesta seção, irá trabalhar com um [pequeno conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imagine que queria testar um tratamento para pacientes diabéticos. Modelos de Machine Learning podem ajudar a determinar quais pacientes responderiam melhor ao tratamento, com base em combinações de variáveis. Mesmo um modelo de regressão muito básico, quando visualizado, pode mostrar informações sobre variáveis que ajudariam a organizar os seus ensaios clínicos teóricos.\n",
"\n",
"Dito isso, vamos começar esta tarefa!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Arte por @allison_horst</figcaption>\n",
"\n",
"<!--![Arte por \\@allison_horst](../../../../../../translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.pt.jpg)<br>Arte por @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Carregar o nosso conjunto de ferramentas\n",
"\n",
"Para esta tarefa, vamos precisar dos seguintes pacotes:\n",
"\n",
"- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
"\n",
"- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [coleção de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizagem automática.\n",
"\n",
"Pode instalá-los com o seguinte comando:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"O script abaixo verifica se tem os pacotes necessários para completar este módulo e instala-os caso algum esteja em falta.\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"Agora, vamos carregar estes pacotes incríveis e torná-los disponíveis na nossa sessão atual de R. (Isto é apenas para ilustração, `pacman::p_load()` já fez isso por si)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. O conjunto de dados sobre diabetes\n",
"\n",
"Neste exercício, vamos demonstrar nossas habilidades de regressão fazendo previsões com um conjunto de dados sobre diabetes. O [conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) inclui `442 amostras` de dados relacionados à diabetes, com 10 variáveis preditoras, `idade`, `sexo`, `índice de massa corporal`, `pressão arterial média` e `seis medições de soro sanguíneo`, além de uma variável de resultado `y`: uma medida quantitativa da progressão da doença um ano após a linha de base.\n",
"\n",
"|Número de observações|442|\n",
"|----------------------|:---|\n",
"|Número de preditores|As primeiras 10 colunas são preditivas numéricas|\n",
"|Resultado/Alvo|A coluna 11 é uma medida quantitativa da progressão da doença um ano após a linha de base|\n",
"|Informação sobre os preditores|- idade em anos\n",
"||- sexo\n",
"||- bmi índice de massa corporal\n",
"||- bp pressão arterial média\n",
"||- s1 tc, colesterol sérico total\n",
"||- s2 ldl, lipoproteínas de baixa densidade\n",
"||- s3 hdl, lipoproteínas de alta densidade\n",
"||- s4 tch, colesterol total / HDL\n",
"||- s5 ltg, possivelmente logaritmo do nível de triglicerídeos no soro\n",
"||- s6 glu, nível de açúcar no sangue|\n",
"\n",
"\n",
"\n",
"> 🎓 Lembre-se, isto é aprendizagem supervisionada, e precisamos de um alvo chamado 'y'.\n",
"\n",
"Antes de poder manipular dados com R, é necessário importar os dados para a memória do R ou estabelecer uma conexão com os dados que o R possa usar para acessá-los remotamente.\n",
"\n",
"> O pacote [readr](https://readr.tidyverse.org/), que faz parte do Tidyverse, oferece uma maneira rápida e amigável de ler dados retangulares no R.\n",
"\n",
"Agora, vamos carregar o conjunto de dados sobre diabetes fornecido neste URL de origem: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Além disso, faremos uma verificação básica nos nossos dados usando `glimpse()` e exibiremos as primeiras 5 linhas usando `slice()`.\n",
"\n",
"Antes de avançarmos, vamos também introduzir algo que você encontrará frequentemente no código R 🥁🥁: o operador pipe `%>%`\n",
"\n",
"O operador pipe (`%>%`) realiza operações em sequência lógica, passando um objeto adiante para uma função ou expressão de chamada. Você pode pensar no operador pipe como dizendo \"e então\" no seu código.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` mostra-nos que estes dados têm 442 linhas e 11 colunas, sendo todas as colunas do tipo de dados `double`.\n",
"\n",
"<br>\n",
"\n",
"> glimpse() e slice() são funções do [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, parte do Tidyverse, é uma gramática de manipulação de dados que fornece um conjunto consistente de verbos para ajudar a resolver os desafios mais comuns de manipulação de dados.\n",
"\n",
"<br>\n",
"\n",
"Agora que temos os dados, vamos focar numa única característica (`bmi`) como alvo para este exercício. Isto exigirá que selecionemos as colunas desejadas. Então, como fazemos isso?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) permite-nos *selecionar* (e opcionalmente renomear) colunas num data frame.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dados de Treino e Teste\n",
"\n",
"É uma prática comum em aprendizagem supervisionada *dividir* os dados em dois subconjuntos: um conjunto (geralmente maior) para treinar o modelo e um conjunto menor \"reservado\" para verificar como o modelo se comportou.\n",
"\n",
"Agora que temos os dados prontos, podemos verificar se uma máquina pode ajudar a determinar uma divisão lógica entre os números neste conjunto de dados. Podemos usar o pacote [rsample](https://tidymodels.github.io/rsample/), que faz parte do framework Tidymodels, para criar um objeto que contém as informações sobre *como* dividir os dados, e depois usar mais duas funções do rsample para extrair os conjuntos de treino e teste criados:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Treinar um modelo de regressão linear com Tidymodels\n",
"\n",
"Agora estamos prontos para treinar o nosso modelo!\n",
"\n",
"No Tidymodels, especifica-se os modelos utilizando `parsnip()` ao definir três conceitos:\n",
"\n",
"- O **tipo** de modelo diferencia modelos como regressão linear, regressão logística, modelos de árvores de decisão, entre outros.\n",
"\n",
"- O **modo** do modelo inclui opções comuns como regressão e classificação; alguns tipos de modelo suportam ambos, enquanto outros têm apenas um modo.\n",
"\n",
"- O **motor** do modelo é a ferramenta computacional que será usada para ajustar o modelo. Muitas vezes, são pacotes R, como **`\"lm\"`** ou **`\"ranger\"`**\n",
"\n",
"Estas informações sobre o modelo são capturadas numa especificação de modelo, então vamos construir uma!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Depois de um modelo ter sido *especificado*, pode ser `estimado` ou `treinado` utilizando a função [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), normalmente com uma fórmula e alguns dados.\n",
"\n",
"`y ~ .` significa que ajustaremos `y` como a quantidade/variável alvo prevista, explicada por todos os preditores/características, ou seja, `.` (neste caso, temos apenas um preditor: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"A partir do resultado do modelo, podemos observar os coeficientes aprendidos durante o treino. Eles representam os coeficientes da linha de melhor ajuste que nos proporciona o menor erro geral entre a variável real e a prevista.\n",
"<br>\n",
"\n",
"## 5. Fazer previsões no conjunto de teste\n",
"\n",
"Agora que treinámos um modelo, podemos utilizá-lo para prever a progressão da doença y para o conjunto de dados de teste usando [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Isto será usado para traçar a linha entre os grupos de dados.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 Acabámos de treinar um modelo e utilizámo-lo para fazer previsões!\n",
"\n",
"Ao fazer previsões, a convenção do tidymodels é sempre produzir um tibble/data frame de resultados com nomes de colunas padronizados. Isto facilita a combinação dos dados originais com as previsões num formato utilizável para operações subsequentes, como a criação de gráficos.\n",
"\n",
"`dplyr::bind_cols()` une eficientemente várias data frames por coluna.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Representar os resultados do modelo\n",
"\n",
"Agora é hora de ver isto visualmente 📈. Vamos criar um gráfico de dispersão com todos os valores de `y` e `bmi` do conjunto de teste e, em seguida, usar as previsões para desenhar uma linha no lugar mais apropriado, entre os agrupamentos de dados do modelo.\n",
"\n",
"O R tem vários sistemas para criar gráficos, mas o `ggplot2` é um dos mais elegantes e versáteis. Este permite compor gráficos **combinando componentes independentes**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Pensa um pouco sobre o que está a acontecer aqui. Uma linha reta está a passar por muitos pequenos pontos de dados, mas o que está realmente a fazer? Consegues perceber como deverias ser capaz de usar esta linha para prever onde um novo ponto de dados, ainda não visto, deveria encaixar em relação ao eixo y do gráfico? Tenta expressar em palavras a utilidade prática deste modelo.\n",
"\n",
"Parabéns, construíste o teu primeiro modelo de regressão linear, criaste uma previsão com ele e exibiste-a num gráfico!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante ter em conta que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n"
]
}
]
}