{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Gradient Boosting Trees\n", "\n", "Neste notebook, vamos aprender um método de classificação muito poderoso, cuja ideia é fácil de entender, mas cuja formulação matemática nem tanto.\n", "\n", "A ideia do método é muito antiga e fora da comunidade de aprendizado é conhecida como teorema do juri de Condorcet (\"Essay sur l'applicacion de l'analyse à la probabilités dés decisions\" de 1785). Neste artigo do marquês de Condorcet, ele se coloca a questão de quantas pessoas são necessárias num juri para este tomar uma decisão correta.\n", "\n", "O teorema diz que, num juri que tem que decidir entre duas decisões, sendo que uma delas é a correta, se cada pessoa escolher independentemente a decisão correta com probabilidade p, se essa probabilidade for maior que 1/2 (isto é, cada membro do juri tem probabilidade de votar corretamente maior do que 1/2), então adicionando mais membros ao juri, aumenta as chances que o juri se decida pela decisão correta.\n", "\n", "Na área de aprendizado de máquina, essa ideia e o nome \"boosting\" (incremento) aparece no artigo de Michael Kearns: \"Thoughts on Hypothesis Boosting\". Neste artigo, Kearns introduz o conceito de classificadores fracos, ou hipóteses fracas (\"weak learners\", ou \"weak hypothesis\"), que são classificadores que têm performance um pouco melhor que um classificador aleatório, e apresenta algumas ideias de como juntar classificadores fracos para criar um classificador melhor.\n", "\n", "Ideias como essa avançaram através de diversos artigos e serviram como faísca para a criação de uma nova área de pesquisa: combinação de classificadores (\"ensemble learning\").\n", "\n", "Aqui, vamos nos restringir a um desses avanços, Gradient Boosting Regression Trees (ou simplesmente, Gradient Boosting Trees), cuja principal contribuição foi dada por Jerome H. Friedman, um pesquisador de Stanford, que criou, dentre outras coisas, o algoritmo CART para indução de árvores de decisão. No artigo: \"Greedy Function Approximation: A Gradient Boosting Machine\" (http://www-stat.stanford.edu/~jhf/ftp/trebst.pdf), Friedman apresenta o problema da seguinte maneira:\n", "\n", "Dado um conjunto finito de exemplos do tipo $\\{\\bf{x}_i,y_i\\}$, onde $\\bf{x}_i \\in R^d$ e $y_i \\in R$, e $y_i = F(\\bf{x}_i)$ ($F:R^d \\rightarrow R$ é uma função desconhecida) e uma função de custo $L$, podemos aproximar $F$ por uma função $G$ estimada, minimizando o valor esperado da função de custo $L(y,G(\\bf{x}))$ sobre todos os valores possíveis da distribuição conjunta discreta $(y,\\bf{x})$ escrevendo $G$ como uma função iterativa $G_m$ da seguinte forma:\n", "$$\n", "G_m(\\bf{x}) = G_{m-1}(\\bf{x}) + \\rho_m h(\\bf{x};\\bf{a}_m)\n", "$$\n", "onde $\\rho_m$ é uma taxa de aprendizado (que pode ser dada, ou estimada), $\\bf{a}_m$ são parâmetros a serem estimados e $\\{h(\\bf{x};\\bf{a}_m)\\}_1^M$ são um conjunto de funções de base que, neste caso, podem ser árvores de decisão pouco profundas.\n", "\n", "Em outras palavras, a função $F$ pode ser aproximada por uma soma de contribuições de árvores de decisão. No entanto, vale notar que uma vez calculada a árvore no passo $m-1$, ela está fixa e não vai mais ser modificada na próxima iteração.\n", "\n", "A otimização é usualmente feita pelo algoritmo do gradiente descendente e a teoria completa sobre o assunto (Gradient Boosting Machine) é extensa e foge ao escopo deste mini-curso. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exemplo de aplicação\n", "\n", "Neste exemplo, revisitamos um exemplo de regressão com árvores de decisão e comparamos qualitativamente com o GBRT. Para isso, vamos novamente usar o sklearn, desta vez o método GradientBoostingRegressor da classe ensemble:\n", "\n", "https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier\n", "\n", "Note que, sendo um classificador mais complexo, que é uma somatória de classificadores, o número de parâmetros é bem maior. No exemplo abaixo, usamos quatro deles:\n", "\n", "- Número de iterações/estimadores: n_estimators;\n", "- Taxa de aprendizado: learning_rate;\n", "- Profundidade máxima de cada árvores: max_depth;\n", "- Semente aleatória: random_state;" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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LicVxZgxY3j77bfdFkNRFCVrEJFYFQLU9aQoiqLERxWFoiiKEhdVFIqiKEpccjJGoSiKO3R0dLBp0yZaW1t7H6y4QlFRESNHjiQ/P/GOt6ooFEVJGZs2baK8vJwxY8YgIm6Lo3TDGENtbS2bNm1i7733Tng7V11PInKfiGwTkQ9jrD9arFaIK+y/VFWKHJC0LFpAzSXT2DprX2oumUbLogVui6TkGK2trQwZMkSVhEcREYYMGZK0xee2RfEAcCvxq2cuMcacmhlxcpeWRQvYdfs10NYCQLCm2noPFM+YGW9TRUkKVRLepi/fj6sWhTFmMVapZSXNNM67MawkwrS1WMsVRVHikA1ZT1NF5D0ReT7UVMQJEblURN4WkbdramoyKV9WENy+OanliqIoIbyuKN4BRhtjJgB/wWoz6Igx5i5jzBRjzJSqKsdZ6AMa31DnXjexliuKkhxjxoxh+/btfdr2gQceoLq6OiX7GjNmDAcffDATJ05kypQpfdpHdzytKIwxu4wxjfbr54B8uxWlkiRls6+GwuLohYXF1nJFUVylu6LoLwsXLmTFihUpK2XkdjA7LiKyJ7DVGGNE5DAsxVbrslhZSShg3TjvRoLbN+MbOoyy2VdrIFtJG9e/9EZa9vuL44+Iu37dunWceOKJHHXUUbz11ltMmDCBiy66iGuvvZZt27bx0EMPAfD973+flpYWiouLuf/++znggAP405/+xIcffsh9993HBx98wLnnnsvSpUspKSnpcZza2lrOPfdcampqOOyww4hs2TBv3jxuueUW2tvbOfzww7n99tvx+/2UlZVx2WWXsXDhQgYPHsyjjz7KokWLePvttzn//PMpLi7mzTet7q5/+ctfeOaZZ+jo6OAf//gHBx54YAo/xeRwOz32EayetweIyCYR+baIzBWRufaQbwAfish7WH1yzzHaQKPPFM+YSdXdS9hj/mqq7l6iSkLJWVavXs2VV17J+++/z8cff8zDDz/Ma6+9xo033shvf/tbDjzwQBYvXsy7777Lddddx89+9jPAUh6rV69m/vz5XHTRRdx5552OSgLg17/+NUcddRTvvvsup59+Ohs2bABg1apVPPbYY7z++uusWLECv98fVk5NTU1MmjSJd955hxkzZvDrX/+ab3zjG0yZMoWHHnqIFStWUFxsWf5Dhw7lnXfe4fLLL+fGG62k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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Importa os módulos necessários\n", "\n", "from sklearn.tree import DecisionTreeRegressor\n", "from sklearn.ensemble import GradientBoostingRegressor\n", "from sklearn.metrics import mean_squared_error\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Cria um conjunto de dados aleatório\n", "# inicializa a semente\n", "rng = np.random.RandomState(1)\n", "\n", "# Cria um domínio de 80 pontos em posições aleatórias do eixo X.\n", "X = np.sort(5 * rng.rand(80, 1), axis=0)\n", "\n", "# Cria uma função que é um seno adicionado a um ruído.\n", "y = np.sin(X).ravel()\n", "y[::5] += 3 * (0.5 - rng.rand(16))\n", "\n", "# Calcula a regressão baseada em DT\n", "regrDT = DecisionTreeRegressor(max_depth=5)\n", "regrDT.fit(X, y)\n", "\n", "# Calcula a regressão baseada em GBRT\n", "GBRT = GradientBoostingRegressor(n_estimators=100, \n", " learning_rate=0.5, \n", " max_depth=1, \n", " random_state=0)\n", "GBRT.fit(X,y)\n", "\n", "\n", "# Cria um domínio de pontos arranjados uniformemente no eixo X\n", "X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]\n", "\n", "# Prediz o valor da função baseada na DT\n", "y_DT = regrDT.predict(X_test)\n", "\n", "# Prediz o valor da função baseada no GBRT\n", "y_GBRT = GBRT.predict(X_test)\n", "\n", "# Apresenta os resultados num gráfico\n", "plt.figure()\n", "plt.scatter(X, y, c=\"#E84F22\", label=\"data\")\n", "plt.plot(X_test, y_DT, color=\"#82BAC5\", label=\"max_depth=5\", linewidth=2)\n", "plt.plot(X_test, y_GBRT, color=\"#37454B\", label=\"GBRT\", linewidth=2)\n", "plt.xlabel(\"data\")\n", "plt.ylabel(\"target\")\n", "plt.title(\"Decision Tree vs Gradient Boosting Trees\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercício: Experimente mudar os valores dos parâmetros da GBRT e veja como ela se comporta." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Outro exemplo do sklearn\n", "\n", "O exemplo abaixo é uma adaptação do exemplo que está no site do sklearn:\n", "\n", "https://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_regression.html\n", "\n", "que foi feito por Peter Prettenhover. \n", "\n", "O dataset usado é o \"Boston Housing\", que contém informções do censo americano sobre domicílios na área de Boston Massachusetts. Um dos lugares que esse dataset está arquivado é aqui:\n", "\n", "http://lib.stat.cmu.edu/datasets/boston\n", "\n", "O conjunto contém 506 dados, 14 atributos, sendo que um deles (MEDV - \"Median value of owner-occupied homes in $1000\" ) é o preço das casas, que é usado normalmente como variável alvo. Uma coisa a ser notada é que os preços altos foram censurados.\n", "\n", "O objetivo do exemplo é predizer os preços das casas (MEDV) baseado nesses 13 atributos." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])\n" ] } ], "source": [ "# Author: Peter Prettenhofer \n", "#\n", "# License: BSD 3 clause\n", "\n", "# Adaptado para o curso de aprendizado de máquina.\n", "\n", "# Importa as bibliotecas necessárias.\n", "from sklearn import datasets\n", "from sklearn.utils import shuffle\n", "from sklearn.metrics import mean_squared_error\n", "\n", "# Carrega o conjunto de dados.\n", "boston = datasets.load_boston()\n", "\n", "print(boston.keys())" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# Usando o método DESCR, do boston dataset, imprima as informações sobre o dataset\n", "# A ideia é apagar esta linha e deixar como exercício." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# Exercício: Usando o método head, veja os primeiros valores do dataset." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Exercício: Escolha dois atributos que você ache que tem mais correlação \n", "# com os preços das casas e faça um par de gráficos para ver se essa relação\n", "# realmente existe." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MSE Training: 1.7677\n" ] } ], "source": [ "# Cria um conjunto de dados rotulados, embaralhando a ordem dos dados originais.\n", "X, y = shuffle(boston.data, boston.target, random_state=13)\n", "X = X.astype(np.float32)\n", "\n", "# Separa o conjunto em treino (90%) e teste \n", "offset = int(X.shape[0] * 0.9)\n", "X_train, y_train = X[:offset], y[:offset]\n", "X_test, y_test = X[offset:], y[offset:]\n", "\n", "# Ajusta a regressão baseada em GBRT\n", "# Note que no exemplo os parâmetros são passados de uma forma diferente\n", "# da vista anteriormente. \n", "\n", "# Primeiro cria-se um dicionário de parâmetros\n", "params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,\n", " 'learning_rate': 0.01, 'loss': 'ls'}\n", "\n", "# Passa-se a referência do dicionário para a função e\n", "# cria-se o modelo.\n", "clf = GradientBoostingRegressor(**params)\n", "\n", "# Ajusta o modelo com os dados de treinamento.\n", "clf.fit(X_train, y_train)\n", "\n", "# Calcula-se o erro de treinamento\n", "mseTrain = mean_squared_error(y_train, clf.predict(X_train))\n", "print(\"MSE Training: %.4f\" % mseTrain)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Exercício: Mofifique as duas últimas linhas para calcular o erro no\n", "# conjunto de testes" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Deviance')" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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dO7c+YB9tmzZwvHHH88dd9zBddddx/jx47n++usP+mznHDNmzGDKlCncdtttvP7669x///00btyYF154gXnz5tGjR4+D9mvUqBFDhgyhZcuWnHjiifzkJz9hxIgRpKWlcfXVV/Ob3/yGvn37smLFCoYNG8bChQu59NJLycrKYuzYsREdd48ePXjqqacAGDNmDOPGjaNt27Z8+OGHXHXVVbz55pt07tyZDz74gGOPPZaXXnqJU045hYyMA2Ptmmuu4dZbb8U5x7nnnsvrr7/OySefXOrxP/zww6xevZp58+aRnp7Opk2b2L17N9dccw1TpkwhKyuLZ555hj/84Q889thjER1LJJIyjHfuhOnToWNHaNky3q0ROTxt27alV69e+18/99xzPP744+Tn57N69WoWLVp0UBhXr159f+D07NmT6dOnl/jZZ5xxxv5tVqxYAcAHH3zAb3/7WwC6d+9Oly5dStz3ySefZP78+UybNo077riDt99+m3HjxjFt2rQDxq6///57du7cGfVxh3uwmzdv5uOPP+bMM8/c/15+fj4AI0aMYOLEiRx77LFMmDCB66677qDPefvtt7n77rvZtWsXGzZs2N+zLe34p02bxtixY0lPTwegfv36zJ07l88++4xBgwYBUFBQQPPm5Xt/2aQM4y1bYMgQePBBuPLKeLdGKptYe7BBOeKII/Y/X7JkCX//+9+ZMWMGdevW5fzzzy9xOlXVqlX3P09PT98fXsVlZmYetE0098Xs1q0b3bp149xzz6VTp06MGzduf2+zaBtiMWfOHDp16oRzjqysrIOGSgBOO+00brrpJm699VYWLFjA8ccff8D7O3bs4KqrrmL27Nk0a9aM3//+9wf8e5V2/MVnRjjn6NatW6m/1MpDUo4ZN2oEGRmwcmW8WyJSvrZu3UqtWrWoXbs2a9as4Y033ij37+jfvz+TJk0CYMGCBSxatKjEdrz//vv7X8+dO5eWoT9DBw0axIMPPnjAewC1atVi27ZtEbXh3XffZfz48VxyySXUq1ePJk2a8OKLLwKwb98+5s2bB0Dt2rXJzc1l7NixnHrqqQed3Ny5cydpaWlkZWWxbds2XnjhhTK/e/DgwTz88MMUFBQAsGnTJjp37syqVauYMWMGAHv27OGzzz6L6FgilZRhnJYGTZvCqlXxbolI+erRowedO3cmOzubyy67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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Apresenta um gráfico do erro de treinamento e de teste para cada iteração do GBRT\n", "\n", "test_score = np.zeros((params['n_estimators'],), dtype=np.float64)\n", "\n", "# Olhe o que o método staged_predict faz neste help:\n", "# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier.staged_predict\n", "for i, y_pred in enumerate(clf.staged_predict(X_test)):\n", " test_score[i] = clf.loss_(y_test, y_pred)\n", "\n", "# Apresenta o gráfico \n", "plt.figure(figsize=(12, 6))\n", "plt.subplot(1, 2, 1)\n", "plt.title('Deviance')\n", "plt.plot(np.arange(params['n_estimators']) + 1, clf.train_score_, 'b-',\n", " label='Training Set Deviance')\n", "plt.plot(np.arange(params['n_estimators']) + 1, test_score, 'r-',\n", " label='Test Set Deviance')\n", "plt.legend(loc='upper right')\n", "plt.xlabel('Boosting Iterations')\n", "plt.ylabel('Deviance')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Importância das variáveis\n", "\n", "Um subproduto do algoritmo GBRT é o cálculo da importância \n", "de cada característica. O exemplo abaixo apresenta a importância\n", "relativa emum gráfico." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Extrai a importância calculada de cada característica.\n", "feature_importance = clf.feature_importances_\n", "\n", "# Calcula a importância relativa em relação à máxima importância.\n", "feature_importance = 100.0 * (feature_importance / feature_importance.max())\n", "\n", "# Apresenta um gráfico por ordem de importância.\n", "sorted_idx = np.argsort(feature_importance)\n", "pos = np.arange(sorted_idx.shape[0]) + .5\n", "plt.subplot(1, 2, 2)\n", "plt.barh(pos, feature_importance[sorted_idx], align='center')\n", "plt.yticks(pos, boston.feature_names[sorted_idx])\n", "plt.xlabel('Relative Importance')\n", "plt.title('Variable Importance')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 2 }