<jupyter_start><jupyter_text>**Aula 11 - Ensembles**<jupyter_code>import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>**TOC:**Na aula de hoje, vamos explorar os seguintes tópicos em Python:- 1) [Métodos de Ensemble](intro)- 2) [Random Forest](random_forest)- 3) [Adaboost](ada)- 4) [Árvores de regressão](regression)- 5) [Exercicio](exercicio)  1) **Métodos de Ensemble** Há uma classe de algoritmos de Machine Learning, os chamados **métodos de ensemble** que tem como objetivo **combinar as predições de diversos estimadores mais simples** para gerar uma **predição final mais robusta**    Os métodos de ensemble são ainda divididos em duas classes:- **Métodos de bagging**: têm como procedimento geral construir diversos estimadores independentes, e tomar a média de suas predições como a predição final. O principal objetivo do método é reduzir variância, de modo que o modelo final seja melhor que todos os modelos individuais. Ex.: **random forest.**- **Métodos de boosting**: têm como procedimento geral a construção de estimadores de forma sequencial, de modo que estimadores posteriores tentam reduzir o viés do estimador conjunto, que leva em consideração estimadores anteriores. Ex.: **adaboost**.Para mais detalhes, [clique aqui!](https://scikit-learn.org/stable/modules/ensemble.html)  2) **Random Forest** Uma técnica muito interessante baseada em árvores é o **Random Forest**.Neste modelo, são criadas varias árvores diferentes aleatoriamente, e a predição final é tomada através do voto majoritário de todas as árvores!O modelo de Random Forest utiliza os conceitos de **bootstraping** e **aggregation** (ou então, o procedimento composto **bagging**) para criar um modelo composto que é melhor que uma única árvore!Para maiores detalhes sobre como o modelo funciona, sugiro os vídeos do canal [StatQuest](https://www.youtube.com/watch?v=J4Wdy0Wc_xQ). Obs.: toda a [playlist de machine learning](https://www.youtube.com/playlist?list=PLblh5JKOoLUICTaGLRoHQDuF_7q2GfuJF) é muitíssimo interessante, com vídeos super claros e ilustrativos! Além disso, há outros vídeos de estatística que são muito bons! Este é um dos melhores canais no youtube para se aprender de forma clara e descontraída sobre estatística e machine learning!Aqui, vamos ver o Random Forest em ação! ______ **Adaboost** O Adaboost significa **Adaptive Boosting**, e tem como procedimento geral **a criação sucessiva de árvores de um único nó (stumps - modelos fracos) que utiliza dos erros da árvore anterior para melhorar a próxima árvore**. As predições finais são feitas com base **nos pesos de cada stump**, cuja determinação faz parte do algoritmo.De forma resumida, as principais ideias por trás deste algoritmo são:- O algoritmo cria e combina um conjunto de **modelos fracos** (em geral, stumps);- Cada stump é criado **levando em consideração os erros do stump anterior**;- Alguns dos stumps têm **maior peso de decisão** do que outros na predição final;<jupyter_code>df = pd.read_csv('data/bank_full.csv', sep=";")<jupyter_output><empty_output><jupyter_text>4) **Árvores de regressão** Alguns algoritmos de classificação podem ser utilizados como algoritmos de regressão, inclusive árvores de decisão!As **árvores de regressão** consistem em funções com valores discretos, similar a uma escada, onde cada degrau é o valor de uma folha. [Aqui](https://scikit-learn.org/stable/auto_examples/tree/plot_tree_regression.html) há detalhes sobre a classe do sklearn; e [aqui](https://www.youtube.com/watch?v=g9c66TUylZ4) está o StatQuest sobre árvores de regressão!Considere o seguinte dataset:O algoritmo irá obter os valores do target como sendo **a média dos valores de cada folha da árvore final**. Visualmente: Para a escolha das melhores divisões: - o algoritmo percorre a médida entre cada par de pontos das features; - define estes valores como divisões (sequencialmente); - para cada divisão experimentada, o algoritmo calcula o MSE;- a melhor divisão é aquela que apresentar o menor erro!Visualmente: Outro exemplo de árvore de regressão treinada: Vamos fazer um modelo de árvore de regressão para precificação de casas!  5) **Exercicio**<jupyter_code>df = pd.read_csv("data/house_prices.csv")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0782851817334576, 'fraction_numerical': 0.004659832246039142, 'mean_word_length': 5.760629921259842, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 5, 'lorem ipsum': 0, 'www.': 3, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '483543', 'license': 'MIT', 'n_tokens_mistral': 1436, 'n_tokens_neox': 1382, 'n_words': 552, 'path': 'semana_9/ensembles.ipynb', 'repo_name': 'rocabrera/curso_ml', 'size': '4292'}