{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# 1. Dados do aluno" ], "metadata": { "id": "O7LBoNEix_QA" } }, { "cell_type": "markdown", "source": [ "# 2. Objetivo" ], "metadata": { "id": "PpGJ0wPTyM1Z" } }, { "cell_type": "markdown", "source": [ "# 3. Motivação" ], "metadata": { "id": "g8LqqYHuyQbk" } }, { "cell_type": "markdown", "source": [ "# 4. Modelagem" ], "metadata": { "id": "_5VTISRTySj0" } }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "SMnEqgfJx7Or" }, "outputs": [], "source": [ "from pathlib import Path\n", "import torch, numpy as np, pandas as pd\n", "from fastai.data.transforms import RandomSplitter\n", "from torch import tensor" ] }, { "cell_type": "code", "source": [ "np.set_printoptions(linewidth=140)\n", "torch.set_printoptions(linewidth=140, sci_mode=False, edgeitems=7)\n", "pd.set_option('display.width', 140)" ], "metadata": { "id": "6bzlrHd71ZMV" }, "execution_count": 2, "outputs": [] }, { "cell_type": "code", "source": [ "path = Path('/content/drive/MyDrive/Software Engeneering/8th - Semester/ML/cars')\n", "path" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xA9J1Qan1zCH", "outputId": "5fbf6638-2953-4366-9cf6-98bbd5f91633" }, "execution_count": 3, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Path('/content/drive/MyDrive/Software Engeneering/8th - Semester/ML/cars')" ] }, "metadata": {}, "execution_count": 3 } ] }, { "cell_type": "markdown", "source": [ "## 4.1 Limpando os dados" ], "metadata": { "id": "mo7hHO8s1zX9" } }, { "cell_type": "markdown", "source": [ "Este é um dataset de dados tabulares - os dados estão na forma de uma tabela. Ele é fornecido como um arquivo de valores separados por vírgulas (CSV). Podemos abri-lo usando a biblioteca *pandas*, que criará um DataFrame" ], "metadata": { "id": "HUHC6ehD2R6-" } }, { "cell_type": "code", "source": [ "df = pd.read_csv(path/'Car_Purchasing_Data.csv')\n", "df" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 609 }, "id": "BO-LP-Zr2jP8", "outputId": "a979fe3d-81dd-4a20-8815-ef8971105176" }, "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Customer Name Customer e-mail Country Gender Age Annual Salary Credit Card Debt \\\n", "0 Martina Avila cubilia.Curae.Phasellus@quisaccumsanconvallis.edu USA 0 42 62812.09301 11609.380910 \n", "1 Harlan Barnes eu.dolor@diam.co.uk USA 0 41 66646.89292 9572.957136 \n", "2 Naomi Rodriquez vulputate.mauris.sagittis@ametconsectetueradipiscing.co.uk USA 1 43 53798.55112 11160.355060 \n", "3 Jade Cunningham malesuada@dignissim.com USA 1 58 79370.03798 14426.164850 \n", "4 Cedric Leach felis.ullamcorper.viverra@egetmollislectus.net USA 1 57 59729.15130 5358.712177 \n", ".. ... ... ... ... ... ... ... \n", "495 Walter ligula@Cumsociis.ca USA 0 41 71942.40291 6995.902524 \n", "496 Vanna Cum.sociis.natoque@Sedmolestie.edu USA 1 38 56039.49793 12301.456790 \n", "497 Pearl penatibus.et@massanonante.com USA 1 54 68888.77805 10611.606860 \n", "498 Nell Quisque.varius@arcuVivamussit.net USA 1 59 49811.99062 14013.034510 \n", "499 Marla Camaron.marla@hotmail.com USA 1 47 61370.67766 9391.341628 \n", "\n", " Net Worth Car Purchase Amount \n", "0 238961.2505 35321.45877 \n", "1 530973.9078 45115.52566 \n", "2 638467.1773 42925.70921 \n", "3 548599.0524 67422.36313 \n", "4 560304.0671 55915.46248 \n", ".. ... ... \n", "495 541670.1016 48901.44342 \n", "496 360419.0988 31491.41457 \n", "497 764531.3203 64147.28888 \n", "498 337826.6382 45442.15353 \n", "499 462946.4924 45107.22566 \n", "\n", "[500 rows x 9 columns]" ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Customer NameCustomer e-mailCountryGenderAgeAnnual SalaryCredit Card DebtNet WorthCar Purchase Amount
0Martina Avilacubilia.Curae.Phasellus@quisaccumsanconvallis.eduUSA04262812.0930111609.380910238961.250535321.45877
1Harlan Barneseu.dolor@diam.co.ukUSA04166646.892929572.957136530973.907845115.52566
2Naomi Rodriquezvulputate.mauris.sagittis@ametconsectetueradipiscing.co.ukUSA14353798.5511211160.355060638467.177342925.70921
3Jade Cunninghammalesuada@dignissim.comUSA15879370.0379814426.164850548599.052467422.36313
4Cedric Leachfelis.ullamcorper.viverra@egetmollislectus.netUSA15759729.151305358.712177560304.067155915.46248
..............................
495Walterligula@Cumsociis.caUSA04171942.402916995.902524541670.101648901.44342
496VannaCum.sociis.natoque@Sedmolestie.eduUSA13856039.4979312301.456790360419.098831491.41457
497Pearlpenatibus.et@massanonante.comUSA15468888.7780510611.606860764531.320364147.28888
498NellQuisque.varius@arcuVivamussit.netUSA15949811.9906214013.034510337826.638245442.15353
499MarlaCamaron.marla@hotmail.comUSA14761370.677669391.341628462946.492445107.22566
\n", "

500 rows × 9 columns

\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "markdown", "source": [ "Podemos observar que temos uma tabela com 9 colunas:\n", "\n", "- Customer Name\n", "-\n", "-\n", "-\n", "-\n", "-\n", "-\n", "-" ], "metadata": { "id": "6-HyZ2oX24rQ" } }, { "cell_type": "markdown", "source": [ "Para implementar nossa rede neural, precisamos multiplicar cada coluna por alguns coeficientes. Portanto, primeiramente verificamos se na tabela há alguma coluna que possue valores NaN, que é como o Pandas se refere aos valores ausentes. Não podemos multiplicar algo por um valor que falta!" ], "metadata": { "id": "Ben3_Bxl3Sti" } }, { "cell_type": "code", "source": [ "df.isna().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "v0Sve8aX3jy8", "outputId": "265d4562-9d7e-4ca5-f323-35f82c26fafb" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Customer Name 0\n", "Customer e-mail 0\n", "Country 0\n", "Gender 0\n", "Age 0\n", "Annual Salary 0\n", "Credit Card Debt 0\n", "Net Worth 0\n", "Car Purchase Amount 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 5 } ] }, { "cell_type": "markdown", "source": [ "Como podemos observar, não há nenhuma coluna com valores ausentes. Já temos um bom começo. O pandas nos permite verificar um resumo rápido de todas as colunas numéricas no dataset" ], "metadata": { "id": "DacMhkqO3nih" } }, { "cell_type": "code", "source": [ "df.describe(include=(np.number))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 300 }, "id": "D2gvs2RN4SfV", "outputId": "c961800d-0afd-4547-edb4-3ce12d9f1f33" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Gender Age Annual Salary Credit Card Debt Net Worth Car Purchase Amount\n", "count 500.000000 500.000000 500.000000 500.000000 500.000000 500.000000\n", "mean 0.506000 46.224000 62127.239608 9607.645049 431475.713625 44209.799218\n", "std 0.500465 7.990339 11703.378228 3489.187973 173536.756340 10773.178744\n", "min 0.000000 20.000000 20000.000000 100.000000 20000.000000 9000.000000\n", "25% 0.000000 41.000000 54391.977195 7397.515792 299824.195900 37629.896040\n", "50% 1.000000 46.000000 62915.497035 9655.035568 426750.120650 43997.783390\n", "75% 1.000000 52.000000 70117.862005 11798.867487 557324.478725 51254.709517\n", "max 1.000000 70.000000 100000.000000 20000.000000 1000000.000000 80000.000000" ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GenderAgeAnnual SalaryCredit Card DebtNet WorthCar Purchase Amount
count500.000000500.000000500.000000500.000000500.000000500.000000
mean0.50600046.22400062127.2396089607.645049431475.71362544209.799218
std0.5004657.99033911703.3782283489.187973173536.75634010773.178744
min0.00000020.00000020000.000000100.00000020000.0000009000.000000
25%0.00000041.00000054391.9771957397.515792299824.19590037629.896040
50%1.00000046.00000062915.4970359655.035568426750.12065043997.783390
75%1.00000052.00000070117.86200511798.867487557324.47872551254.709517
max1.00000070.000000100000.00000020000.0000001000000.00000080000.000000
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "markdown", "source": [ "Uma situação muito comum em campos que contêm valores monetários e que pode causar problemas para nosso modelo, é a discrepância entre valores de uma coluna, pois uma vez que essa coluna é multiplicada por um coeficiente posteriormente, as poucas linhas com valores realmente grandes dominarão o resultado. Para isso, vamos verificar por meio de um histograma a distribuição dos nossos campos que contém valores monetários, já qe os demais campos possuem valores razoáveis." ], "metadata": { "id": "j5hO2Mdf7wxC" } }, { "cell_type": "code", "source": [ "df['Annual Salary'].hist();" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "id": "qxyLV64o8PYr", "outputId": "a35c740e-57d3-4699-cbd3-46da44b0bf34" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "df['Credit Card Debt'].hist();" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "id": "FNYsMZCB8UuY", "outputId": "bae759d3-c827-4ce2-bd93-7b4449454bf3" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "df['Net Worth'].hist();" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 278 }, "id": "mZvVAC758fXi", "outputId": "7ad91460-b681-4625-f6a8-74ded03104f1" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEFCAYAAAAYKqc0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAARH0lEQVR4nO3de4xcZ3nH8e9D3IDJgp1g2EZOyoZioJFXtGRFQ6PSXUyrNKlwpKZpUAAHubW4paiYFrf8AepFMlIDBQnaWoRiKppNCKixCBdRk20Kwik2CWziFHCDE+wah4ttupAWVjz9Y07Iyqx3Z+fMnJl99/uRrJ1zmXmfx7P72zNnZ94TmYkkqSxP6HcBkqTuM9wlqUCGuyQVyHCXpAIZ7pJUoFX9LgBg3bp1OTIysuA+P/jBDzjnnHOaKWiA2PfKslL7hpXbe52+Dxw48J3MfPp82wYi3EdGRti/f/+C+0xNTTE+Pt5MQQPEvleWldo3rNze6/QdEQ+daZunZSSpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUAD8QlVLR8jO+5oZJzto7NcP2eswzuvbGRcqRQeuUtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVKBFwz0iPhARj0TEfXPWnRcRn4mIr1dfz63WR0S8JyIORcRXIuIFvSxekjS/do7cPwhcftq6HcDezNwA7K2WAX4b2FD92wb8XXfKlCQtxaLhnpl3Ad87bfVmYHd1ezdw1Zz1H8qWfcDaiDi/W8VKktoTmbn4ThEjwMczc2O1fDIz11a3AziRmWsj4uPAzsz8XLVtL/CWzPyZq19HxDZaR/cMDw9fMjk5uWANMzMzDA0NLaG1Mgxa39NHTzUyzvBqOP7o48uj69c0Mm6/Ddrz3aSV2nudvicmJg5k5th822rPLZOZGRGL/4b42fvtAnYBjI2N5WJX//bK6IPh+gbnlrlx+vFvz8PXjTcybr8N2vPdpJXae6/67vTdMscfO91SfX2kWn8UuHDOfhdU6yRJDeo03PcAW6rbW4Db56x/VfWumUuBU5l5rGaNkqQlWvS0TETcDIwD6yLiCPA2YCdwa0RsBR4Crql2/wRwBXAI+CHw6h7ULElaxKLhnpkvP8OmTfPsm8Dr6xYlSarHT6hKUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpALVvsye1ISRhi7vd7rDO6/sy7hSXR65S1KBPHKXFtD0K4bto7M/vQi5rxpUh0fuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBaoV7hHxxxFxf0TcFxE3R8STIuKiiLg7Ig5FxC0RcXa3ipUktafjcI+I9cAfAWOZuRE4C7gWeAfwrsx8NnAC2NqNQiVJ7at7WmYVsDoiVgFPBo4BLwFuq7bvBq6qOYYkaYk6DvfMPAr8DfAwrVA/BRwATmbmbLXbEWB93SIlSUsTmdnZHSPOBT4K/D5wEvgIrSP2t1enZIiIC4FPVqdtTr//NmAbwPDw8CWTk5MLjjczM8PQ0FBHtS5ng9b39NFTjYwzvBqOP9rIUANlbt+j69f0t5iGDdr3elPq9D0xMXEgM8fm21bnMnsvBb6Rmd8GiIiPAZcBayNiVXX0fgFwdL47Z+YuYBfA2NhYjo+PLzjY1NQUi+1TokHr+/qGLju3fXSWG6dX3lUg5/Z9+Lrx/hbTsEH7Xm9Kr/quc879YeDSiHhyRASwCTgI3AlcXe2zBbi9XomSpKXq+NAoM++OiNuALwGzwD20jsTvACYj4q+qdTd1o1A9rumLNktafmq97s3MtwFvO231g8AL6zyuJKkeP6EqSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SClQr3CNibUTcFhH/GREPRMSLIuK8iPhMRHy9+nput4qVJLWn7pH7u4FPZebzgOcDDwA7gL2ZuQHYWy1LkhrUcbhHxBrgxcBNAJn5o8w8CWwGdle77QauqlukJGlp6hy5XwR8G/jHiLgnIt4fEecAw5l5rNrnW8Bw3SIlSUsTmdnZHSPGgH3AZZl5d0S8G/g+cENmrp2z34nM/Jnz7hGxDdgGMDw8fMnk5OSC483MzDA0NNRRrcvZfH1PHz3Vp2qaM7wajj/a7yqaN7fv0fVr+ltMw/wZX7qJiYkDmTk237Y64f7zwL7MHKmWf53W+fVnA+OZeSwizgemMvO5Cz3W2NhY7t+/f8HxpqamGB8f76jW5Wy+vkd23NGfYhq0fXSWG6dX9buMxs3t+/DOK/tcTbP8GV+6iDhjuHd8WiYzvwV8MyIeC+5NwEFgD7ClWrcFuL3TMSRJnal7aHQD8OGIOBt4EHg1rV8Yt0bEVuAh4JqaY0iSlqhWuGfmvcB8Lwk21XlcSVI9fkJVkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVKCVN3mHtEz0aw6hlTanTak8cpekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIK5DVUa2jiGpfbR2e5vk/X0pS0fHnkLkkFqh3uEXFWRNwTER+vli+KiLsj4lBE3BIRZ9cvU5K0FN04cn8j8MCc5XcA78rMZwMngK1dGEOStAS1wj0iLgCuBN5fLQfwEuC2apfdwFV1xpAkLV3dI/e/Bf4U+Em1/DTgZGbOVstHgPU1x5AkLVFkZmd3jPgd4IrMfF1EjANvBq4H9lWnZIiIC4FPZubGee6/DdgGMDw8fMnk5OSC483MzDA0NNRRrb0yffRUz8cYXg3HH+35MAPHvvtndP2avow7iD/jTajT98TExIHMHJtvW523Ql4GvCwirgCeBDwVeDewNiJWVUfvFwBH57tzZu4CdgGMjY3l+Pj4goNNTU2x2D5Na+ItittHZ7lxeuW9Y9W+++fwdeN9GXcQf8ab0Ku+Oz4tk5l/lpkXZOYIcC3w2cy8DrgTuLrabQtwe+0qJUlL0ov3ub8FeFNEHKJ1Dv6mHowhSVpAV17/ZeYUMFXdfhB4YTceV5LUGT+hKkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKpDhLkkFMtwlqUCGuyQVyHCXpAIZ7pJUIMNdkgpkuEtSgToO94i4MCLujIiDEXF/RLyxWn9eRHwmIr5efT23e+VKktpR58h9FtiemRcDlwKvj4iLgR3A3szcAOytliVJDeo43DPzWGZ+qbr9P8ADwHpgM7C72m03cFXdIiVJSxOZWf9BIkaAu4CNwMOZubZaH8CJx5ZPu882YBvA8PDwJZOTkwuOMTMzw9DQUO1au2n66KmejzG8Go4/2vNhBo59rzzDq+EZ563pdxmNq5NtExMTBzJzbL5ttcM9IoaAfwP+OjM/FhEn54Z5RJzIzAXPu4+NjeX+/fsXHGdqaorx8fFatXbbyI47ej7G9tFZbpxe1fNxBo19rzzbR2e54brN/S6jcXWyLSLOGO613i0TET8HfBT4cGZ+rFp9PCLOr7afDzxSZwxJ0tLVebdMADcBD2TmO+ds2gNsqW5vAW7vvDxJUifqvP67DHglMB0R91br/hzYCdwaEVuBh4Br6pUoSVqqjsM9Mz8HxBk2b+r0cSVJ9fkJVUkqkOEuSQUy3CWpQIa7JBXIcJekAhnuklQgw12SCmS4S1KBDHdJKtCyn36uiZkZJWm58chdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCLfv3uUsqR78+t3J455V9GbeXPHKXpAIZ7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhLUoF6Eu4RcXlEfDUiDkXEjl6MIUk6s67PChkRZwHvBX4TOAJ8MSL2ZObBbo8lSd3Qr9koAT54+Tk9edxeHLm/EDiUmQ9m5o+ASWBzD8aRJJ1BZGZ3HzDiauDyzPyDavmVwK9m5htO228bsK1afC7w1UUeeh3wna4WuzzY98qyUvuGldt7nb6fmZlPn29D3y7WkZm7gF3t7h8R+zNzrIclDST7XllWat+wcnvvVd+9OC1zFLhwzvIF1TpJUkN6Ee5fBDZExEURcTZwLbCnB+NIks6g66dlMnM2It4AfBo4C/hAZt7fhYdu+xROYex7ZVmpfcPK7b0nfXf9D6qSpP7zE6qSVCDDXZIKNHDhvtjUBRHxxIi4pdp+d0SMNF9l97XR95si4mBEfCUi9kbEM/tRZ7e1O1VFRPxuRGREFPFWuXb6johrquf8/oj456Zr7IU2vs9/ISLujIh7qu/1K/pRZ7dFxAci4pGIuO8M2yMi3lP9v3wlIl5Qe9DMHJh/tP4A+1/As4CzgS8DF5+2z+uAv69uXwvc0u+6G+p7Anhydfu1K6Xvar+nAHcB+4Cxftfd0PO9AbgHOLdafka/626o713Aa6vbFwOH+113l3p/MfAC4L4zbL8C+CQQwKXA3XXHHLQj93amLtgM7K5u3wZsiohosMZeWLTvzLwzM39YLe6j9fmB5a7dqSr+EngH8L9NFtdD7fT9h8B7M/MEQGY+0nCNvdBO3wk8tbq9BvjvBuvrmcy8C/jeArtsBj6ULfuAtRFxfp0xBy3c1wPfnLN8pFo37z6ZOQucAp7WSHW9007fc22l9Vt+uVu07+rl6YWZ2b+Znbqvnef7OcBzIuLzEbEvIi5vrLreaafvtwOviIgjwCeAG5opre+WmgGL6tv0A+pMRLwCGAN+o9+19FpEPAF4J3B9n0vph1W0Ts2M03qVdldEjGbmyb5W1XsvBz6YmTdGxIuAf4qIjZn5k34XttwM2pF7O1MX/HSfiFhF66XbdxuprnfamrIhIl4KvBV4WWb+X0O19dJifT8F2AhMRcRhWuci9xTwR9V2nu8jwJ7M/HFmfgP4Gq2wX87a6XsrcCtAZn4BeBKtibVK1/VpWwYt3NuZumAPsKW6fTXw2az+IrGMLdp3RPwK8A+0gr2E86+wSN+ZeSoz12XmSGaO0Ppbw8syc39/yu2adr7P/4XWUTsRsY7WaZoHmyyyB9rp+2FgE0BE/BKtcP92o1X2xx7gVdW7Zi4FTmXmsVqP2O+/Ip/hr8Zfo/VX9bdW6/6C1g81tJ7sjwCHgP8AntXvmhvq+1+B48C91b89/a65ib5P23eKAt4t0+bzHbROSR0EpoFr+11zQ31fDHye1jtp7gV+q981d6nvm4FjwI9pvSrbCrwGeM2c5/u91f/LdDe+z51+QJIKNGinZSRJXWC4S1KBDHdJKpDhLkkFMtwlqWGLTSQ2z/5LnkTOd8tIUsMi4sXADK35ZDYusu8GWh/seklmnoiIZ2Qbn3XxyF2SGpbzTCQWEb8YEZ+KiAMR8e8R8bxqU0eTyBnukjQYdgE3ZOYlwJuB91XrO5pEzonDJKnPImII+DXgI3NmMH9i9bWjSeQMd0nqvycAJzPzl+fZdoTWxTt+DHwjIh6bRO6Liz2gJKmPMvP7tIL79+Cnl917frW5o0nkDHdJalhE3Ax8AXhuRByJiK3AdcDWiPgycD+PX6Xq08B3I+IgcCfwJ5m56DTnvhVSkgrkkbskFchwl6QCGe6SVCDDXZIKZLhLUoEMd0kqkOEuSQX6f3RpNK94RD93AAAAAElFTkSuQmCC\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "df['Car Purchase Amount'].hist();" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 267 }, "id": "085MkDB78l0B", "outputId": "4efbbd34-0572-4c94-d403-1545c9280c3b" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "Modelos lineares se comportam melhor com distribuições que não sejam do tipo *cauda longa*. Como nos exemplos apresentados acima não temos um caso parecido, irei deixar desta maneira." ], "metadata": { "id": "pJ5rjUDY-eXb" } }, { "cell_type": "markdown", "source": [ "Sabemos que todos os dados em um dataset são imports e podem ser necessários para a criação e treinamento de um modelo. Porém, para fins didáticos e afim de facilitar o aprendizado estarei removendo as colunas *Customer Name*, *Customer e-mail* e\t*Country* " ], "metadata": { "id": "6bzJF9u_ADp7" } }, { "cell_type": "code", "source": [ "df = df.drop(columns=['Customer Name', 'Customer e-mail', 'Country'])\n", "df" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 424 }, "id": "FqxxzDuWBd2S", "outputId": "59486040-3a3e-46ba-e3d9-1fcacaecceb8" }, "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Gender Age Annual Salary Credit Card Debt Net Worth Car Purchase Amount\n", "0 0 42 62812.09301 11609.380910 238961.2505 35321.45877\n", "1 0 41 66646.89292 9572.957136 530973.9078 45115.52566\n", "2 1 43 53798.55112 11160.355060 638467.1773 42925.70921\n", "3 1 58 79370.03798 14426.164850 548599.0524 67422.36313\n", "4 1 57 59729.15130 5358.712177 560304.0671 55915.46248\n", ".. ... ... ... ... ... ...\n", "495 0 41 71942.40291 6995.902524 541670.1016 48901.44342\n", "496 1 38 56039.49793 12301.456790 360419.0988 31491.41457\n", "497 1 54 68888.77805 10611.606860 764531.3203 64147.28888\n", "498 1 59 49811.99062 14013.034510 337826.6382 45442.15353\n", "499 1 47 61370.67766 9391.341628 462946.4924 45107.22566\n", "\n", "[500 rows x 6 columns]" ], "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GenderAgeAnnual SalaryCredit Card DebtNet WorthCar Purchase Amount
004262812.0930111609.380910238961.250535321.45877
104166646.892929572.957136530973.907845115.52566
214353798.5511211160.355060638467.177342925.70921
315879370.0379814426.164850548599.052467422.36313
415759729.151305358.712177560304.067155915.46248
.....................
49504171942.402916995.902524541670.101648901.44342
49613856039.4979312301.456790360419.098831491.41457
49715468888.7780510611.606860764531.320364147.28888
49815949811.9906214013.034510337826.638245442.15353
49914761370.677669391.341628462946.492445107.22566
\n", "

500 rows × 6 columns

\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 5 } ] }, { "cell_type": "markdown", "source": [ "Ficamos agora com apenas 6 colunas" ], "metadata": { "id": "UBNgIb8ICH-I" } }, { "cell_type": "markdown", "source": [ "A partir da saída *describe()*, parece que *gender* contém apenas 2 valores, o que também é muito bom pois não iremos precisar adaptar numericamente esta coluna. Mas para termos certeza iremos verificar por meio do código abaixo" ], "metadata": { "id": "AeoH_BxP_a9C" } }, { "cell_type": "code", "source": [ "gender = sorted(df.Gender.unique())\n", "gender" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bUY9MEN7_j20", "outputId": "5ee059d9-7494-4e3f-c54d-a4e5c728af40" }, "execution_count": 6, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[0, 1]" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "markdown", "source": [ "Por fim, iremos renomear as colunas para ficar mais fácil de se trabalhar usando as bibliotecas que importamos" ], "metadata": { "id": "d_qLrLpHDzyE" } }, { "cell_type": "code", "source": [ "df.rename(columns={'Gender': 'gender',\n", " 'Age': 'age',\n", " 'Annual Salary': 'annual_salary',\n", " 'Credit Card Debt': 'credit_card_debt',\n", " 'Net Worth': 'net_worth',\n", " 'Car Purchase Amount': 'car_purchase_amount'},\n", " inplace=True)" ], "metadata": { "id": "NoeE2I_cD_Gl" }, "execution_count": 7, "outputs": [] }, { "cell_type": "markdown", "source": [ "Agora podemos criar nossas variáveis ​​independentes (preditores) e dependentes (alvo). Ambos precisam ser tensores PyTorch. Nossa variável dependente é *Car Purchase Amount*" ], "metadata": { "id": "x09Hsq8zCgay" } }, { "cell_type": "code", "source": [ "df.columns" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Xg7mVs01DipZ", "outputId": "0f19dd9f-0732-4ce2-dcbf-6757b101d8a0" }, "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['gender', 'age', 'annual_salary', 'credit_card_debt', 'net_worth', 'car_purchase_amount'], dtype='object')" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "code", "source": [ "t_dep = tensor(df.car_purchase_amount)\n", "t_dep" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nUx59C6dDSF8", "outputId": "cdeba0bf-01a2-4eea-ea6c-3353b2508ce9" }, "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([35321.4588, 45115.5257, 42925.7092, 67422.3631, 55915.4625, 56611.9978, 28925.7055, 47434.9826, 48013.6141, 38189.5060, 59045.5131,\n", " 42288.8105, 28700.0334, 49258.8757, 49510.0336, 53017.2672, 41814.7207, 43901.7124, 44633.9924, 54827.5240, 51130.9538, 43402.3152,\n", " 47240.8600, 46635.4943, 45078.4019, 44387.5841, 37161.5539, 49091.9719, 58350.3181, 43994.3597, 17584.5696, 44650.3607, 66363.8932,\n", " 53489.4621, 39810.3482, 51612.1431, 38978.6746, 10092.2251, 35928.5240, 54823.1922, 45805.6719, 41567.4703, 28031.2098, 27815.7381,\n", " 68678.4352, 68925.0945, 34215.7615, 37843.4662, 37883.2423, 48734.3571, 27187.2391, 63738.3907, 48266.7552, 46381.1311, 31978.9799,\n", " 48100.2905, 47380.9122, 41425.0012, 38147.8102, 32737.8018, 37348.1374, 47483.8532, 49730.5334, 40093.6198, 42297.5062, 52954.9312,\n", " 48104.1118, 43680.9133, 52707.9682, 49392.8897, 30841.0015, 49373.3755, 41903.6517, 45058.8969, 52991.5267, 50958.0811, 41357.1790,\n", " 44434.7192, 38502.4239, 41221.2492, 38399.4614, 41456.6810, 30394.8249, 42384.0513, 39002.0771, 19553.2739, 45167.3254, 36019.9556,\n", " 50937.9384, 12895.7147, 38955.2192, 51221.0425, 25971.9567, 60670.3367, 54075.1206, 40004.8714, 61593.5206, 39503.3883, 52474.7184,\n", " 42187.6828, 57441.4441, 22681.7167, 33640.7370, 31540.7787, 60461.2427, 45738.3343, 34803.8239, 34642.6024, 27586.7185, 54973.0249,\n", " 49142.5117, 58840.5396, 57306.3287, 51941.6756, 30240.6097, 67120.8988, 42408.0263, 41451.7184, 42592.8865, 34521.1762, 42213.6964,\n", " 41913.5371, 59416.1810, 51402.6151, 54755.4204, 47143.4401, 64391.6891, 37252.5519, 52665.3651, 44001.2071, 51551.6800, 38243.6648,\n", " 39766.6480, 40077.5729, 33131.5273, 48622.6610, 47693.2348, 39410.4616, 33428.4018, 32700.2787, 62864.4301, 29425.8300, 44418.6096,\n", " 36645.5609, 53655.5386, 45977.1250, 38504.3944, 47935.9394, 60222.2267, 38930.5523, 27810.2181, 47604.3459, 42356.6895, 31300.5435,\n", " 42369.6425, 31837.2254, 26499.3142, 38172.8360, 39433.4063, 37714.3166, 57125.4154, 46453.3482, 43855.0608, 55592.7038, 42484.0228,\n", " 40879.1911, 20653.2141, 35438.8055, 36112.7935, 38182.3046, 41026.0242, 27889.9520, 43724.4896, 57430.7690, 41104.0711, 49050.8538,\n", " 41265.5293, 64545.1634, 29052.0952, 30719.8156, 38763.1131, 39331.2013, 32608.4547, 58045.5626, 54387.2773, 36638.2069, 39522.1313,\n", " 42978.3463, 60865.7640, 46380.4473, 56579.9034, 42774.3558, 37879.6539, 45208.4254, 56229.4127, 50455.1194, 49721.3108, 31696.9968,\n", " 49220.0218, 46188.8351, 36086.9316, 43264.0497, 40660.3832, 51683.6086, 44525.0209, 48518.9016, 45805.3059, 54850.3874, 32478.4476,\n", " 42209.2895, 55125.9324, 47984.4206, 43405.8909, 44577.4483, 37744.5428, 47805.2561, 44846.6856, 46643.2658, 56563.9867, 41673.4462,\n", " 61118.4695, 37303.5670, 46892.2662, 56457.7404, 45509.6973, 27625.4414, 46389.5024, 29002.0566, 51355.7106, 42011.1997, 52654.4045,\n", " 44432.7175, 46054.6025, 58235.4145, 42990.2925, 50702.1810, 47009.5774, 49399.9704, 42997.1676, 44434.9842, 46325.5096, 46846.7305,\n", " 56499.1020, 42773.7591, 52313.9839, 34139.6373, 60763.2473, 66158.6949, 31215.6421, 46135.2723, 56973.1810, 24184.0744, 49079.6194,\n", " 37093.9203, 43401.5661, 29092.1311, 48349.1646, 33261.0006, 41327.1655, 49336.1163, 51405.5523, 31249.9880, 43598.9699, 48300.0206,\n", " 54013.4760, 38674.6604, 37076.8251, 37947.8512, 41320.0726, 66888.9369, 12536.9384, 39549.1304, 52709.0820, 53502.9774, 52116.9079,\n", " 38705.6584, 48025.0254, 59483.9118, 35911.6456, 41034.2834, 51730.1743, 53021.8607, 32828.0348, 29417.6469, 57461.5116, 50441.6243,\n", " 41575.3474, 46412.4778, 47610.1172, 70878.2966, 55543.3850, 53848.7555, 39904.8161, 44736.4110, 46937.1742, 28440.8127, 38148.0016,\n", " 42747.5393, 29670.8334, 63038.2042, 63248.7619, 42321.5655, 44463.3050, 67092.2328, 22091.1184, 40022.1741, 56071.6138, 49442.1211,\n", " 42497.7286, 37084.7762, 51866.4872, 35716.3113, 39892.9334, 35781.1616, 42866.2127, 80000.0000, 60526.9779, 59758.7325, 39606.2460,\n", " 58641.7105, 52983.8941, 50666.8817, 59625.0262, 22630.2598, 41137.8946, 53496.4818, 36543.9364, 43503.9735, 31146.7108, 31526.0493,\n", " 31083.7027, 45366.3596, 25252.9322, 39888.5979, 52240.7287, 39911.6116, 45857.7536, 30826.1090, 39422.7939, 34678.8323, 23517.9198,\n", " 28733.6878, 59096.2698, 50188.8661, 35659.1224, 46398.3520, 32291.1898, 49079.2946, 49348.8839, 41427.5980, 24221.9994, 44424.0768,\n", " 60390.0662, 42793.9932, 46935.7277, 58667.0687, 38042.8006, 39270.5791, 54606.1877, 39083.9427, 47984.1204, 46082.8099, 30964.0780,\n", " 35726.9530, 49065.1634, 48955.8582, 37183.1029, 46710.5252, 52889.5626, 29754.6627, 60960.8343, 39975.4330, 38545.8033, 56764.4473,\n", " 63079.8433, 55700.8339, 36367.1845, 52477.8348, 50296.6750, 37259.8439, 47715.9605, 29540.8701, 60567.1884, 36125.4885, 57303.8713,\n", " 51922.0769, 35848.8293, 42704.3221, 55174.9895, 26599.9084, 53993.4432, 47970.7677, 43641.6573, 41679.7929, 63140.0508, 30757.6573,\n", " 65592.2201, 37871.7082, 42919.5196, 22599.4586, 70598.9677, 43242.5822, 38138.5751, 30419.8000, 63868.9405, 45112.9455, 44361.8751,\n", " 19525.2983, 49991.6070, 61731.7143, 41769.3829, 46402.5358, 37376.6344, 33766.6413, 30667.6093, 52056.4148, 30736.5798, 39439.4535,\n", " 38174.8743, 40589.8625, 62028.7119, 48465.2721, 40095.0498, 49568.4768, 31408.6263, 47719.4774, 35784.4241, 42905.5382, 48516.8434,\n", " 45593.6849, 32061.6467, 32208.3752, 35475.0034, 29519.5618, 55420.5667, 42139.6453, 50539.9017, 34922.4285, 43898.2733, 39135.0302,\n", " 41147.4668, 24134.5920, 42705.1131, 38901.6093, 28645.3943, 52150.4179, 66648.2508, 42909.2713, 49248.1059, 27303.1710, 47869.8259,\n", " 59984.1636, 45271.4608, 9000.0000, 46012.1062, 32967.2019, 48785.1584, 45824.5656, 40102.1142, 35457.1486, 29556.7932, 38243.0623,\n", " 44430.6332, 51046.4223, 52570.3652, 61404.2258, 28463.6433, 27586.2008, 47979.4855, 28164.8604, 69669.4740, 48052.6509, 37364.2347,\n", " 44500.8194, 35139.2479, 55167.3736, 48383.6907, 35823.5547, 36517.7100, 53110.8805, 53049.4457, 21471.1137, 45015.6795, 55377.8770,\n", " 56510.1329, 47443.7444, 41489.6412, 32553.5342, 41984.6241, 59538.4033, 41352.4707, 52785.1695, 60117.6789, 47760.6643, 64188.2686,\n", " 48901.4434, 31491.4146, 64147.2889, 45442.1535, 45107.2257], dtype=torch.float64)" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "markdown", "source": [ "Nossas variáveis ​​independentes são todas as variáveis restantes." ], "metadata": { "id": "vx02FTjNErhl" } }, { "cell_type": "code", "source": [ "indep_cols = ['gender', 'age', 'annual_salary', 'credit_card_debt', 'car_purchase_amount']\n", "t_indep = tensor(df[indep_cols].values, dtype=torch.float)\n", "t_indep" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "q3z8c99OE29k", "outputId": "83ae5ac9-2978-479b-cf95-698c3631c2b1" }, "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([[ 0.0000, 42.0000, 62812.0938, 11609.3809, 35321.4570],\n", " [ 0.0000, 41.0000, 66646.8906, 9572.9570, 45115.5273],\n", " [ 1.0000, 43.0000, 53798.5508, 11160.3555, 42925.7109],\n", " [ 1.0000, 58.0000, 79370.0391, 14426.1650, 67422.3594],\n", " [ 1.0000, 57.0000, 59729.1523, 5358.7124, 55915.4609],\n", " [ 1.0000, 57.0000, 68499.8516, 14179.4727, 56611.9961],\n", " [ 1.0000, 47.0000, 39814.5234, 5958.4600, 28925.7051],\n", " ...,\n", " [ 0.0000, 43.0000, 77665.1719, 13308.8789, 47760.6641],\n", " [ 0.0000, 52.0000, 77345.6172, 6736.7515, 64188.2695],\n", " [ 0.0000, 41.0000, 71942.4062, 6995.9023, 48901.4453],\n", " [ 1.0000, 38.0000, 56039.4961, 12301.4570, 31491.4141],\n", " [ 1.0000, 54.0000, 68888.7812, 10611.6064, 64147.2891],\n", " [ 1.0000, 59.0000, 49811.9922, 14013.0342, 45442.1523],\n", " [ 1.0000, 47.0000, 61370.6758, 9391.3418, 45107.2266]])" ] }, "metadata": {}, "execution_count": 10 } ] }, { "cell_type": "markdown", "source": [ "Aqui está o número de linhas e colunas que temos para nossas variáveis ​​independentes:" ], "metadata": { "id": "HCefaaDCFl31" } }, { "cell_type": "code", "source": [ "t_indep.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eS-NV39GFmir", "outputId": "65e1258a-10c0-40e3-8165-cadf861d08a5" }, "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "torch.Size([500, 5])" ] }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "markdown", "source": [ "# 4.2 Configurando o modelo linear" ], "metadata": { "id": "NkDH-UrHFx9c" } }, { "cell_type": "markdown", "source": [ "Agora que temos uma matriz de variáveis ​​independentes e um vetor de variáveis ​​dependentes, podemos trabalhar no cálculo de nossas previsões e perdas. " ], "metadata": { "id": "qty4gSAbF8BE" } }, { "cell_type": "code", "source": [ "torch.manual_seed(390)\n", "\n", "n_coeff = t_indep.shape[1]\n", "coeffs = torch.rand(n_coeff)-0.5\n", "coeffs" ], "metadata": { "id": "F-ab_-lMGEFB", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "2f4b651f-35fa-4abb-80f3-15fd6c7661e1" }, "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([ 0.1964, -0.0377, -0.2480, -0.1389, 0.4724])" ] }, "metadata": {}, "execution_count": 12 } ] }, { "cell_type": "markdown", "source": [ "Nossas previsões serão calculadas multiplicando cada linha pelos coeficientes e somando-os." ], "metadata": { "id": "II3vEBMlGSK1" } }, { "cell_type": "code", "source": [ "t_indep.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LPmgyw3Y5qPm", "outputId": "6bdc6f74-0965-41a0-f71a-94495be8b7d9" }, "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "torch.Size([500, 5])" ] }, "metadata": {}, "execution_count": 13 } ] }, { "cell_type": "code", "source": [ "coeffs.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Vfm5gv_55u7K", "outputId": "049759a8-b6aa-4396-b0f5-fec4f8b80379" }, "execution_count": 14, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "torch.Size([5])" ] }, "metadata": {}, "execution_count": 14 } ] }, { "cell_type": "markdown", "source": [ "A multiplicação abaixo foi realizada usando o método de transmissão." ], "metadata": { "id": "UC46Cvbe55Aa" } }, { "cell_type": "code", "source": [ "t_indep*coeffs" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-L2tWz2QceaN", "outputId": "2b462062-4374-4719-95e2-a15c7fb428cf" }, "execution_count": 15, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([[ 0.0000, -1.5826, -15575.6035, -1612.1055, 16686.3164],\n", " [ 0.0000, -1.5449, -16526.5234, -1329.3230, 21313.1621],\n", " [ 0.1964, -1.6202, -13340.5029, -1549.7528, 20278.6641],\n", " [ 0.1964, -2.1854, -19681.5000, -2003.2506, 31851.1992],\n", " [ 0.1964, -2.1478, -14811.1221, -744.1232, 26415.1914],\n", " [ 0.1964, -2.1478, -16986.0059, -1968.9944, 26744.2422],\n", " [ 0.1964, -1.7710, -9872.8633, -827.4055, 13664.8789],\n", " ...,\n", " [ 0.0000, -1.6202, -19258.7422, -1848.1017, 22562.7578],\n", " [ 0.0000, -1.9594, -19179.5020, -935.4809, 30323.3730],\n", " [ 0.0000, -1.5449, -17839.6602, -971.4672, 23101.6777],\n", " [ 0.1964, -1.4318, -13896.1934, -1708.2087, 14876.9531],\n", " [ 0.1964, -2.0347, -17082.4492, -1473.5522, 30304.0137],\n", " [ 0.1964, -2.2231, -12351.9502, -1945.8823, 21467.4629],\n", " [ 0.1964, -1.7710, -15218.1738, -1304.1034, 21309.2402]])" ] }, "metadata": {}, "execution_count": 15 } ] }, { "cell_type": "markdown", "source": [ "Como podemos observar as entradas das colunas *annual_salary*, *credit_card_debt*, *car_purchase_amount* e *age* possuem valores muito acima do que a coluna *gender* e entre si o que não é o fim do mundo mas não é o ideal, já que um coeficiente de, por exemplo, `0.5 X credit_card_debt` significa algo muito diferente de um coeficiente `0.5 X gender`. Desse modo, temos que aqueles coeficientes aleatórios vão significar coisas diferentes para colunas diferentes e isso vai atrapalhar a otimização. O que queremos, então, é que todas as colunas tenham aproximadamente o mesmo intervalo. Para isso temos algumas abordagens que são:\n", "\n", "- Dividir os inputs da coluna pelo máximo\n", "- Subtrair os inputs da coluna pela média\n", "- Dividir os inputs da coluna pelo desvio padrão\n", "\n" ], "metadata": { "id": "S43G2B3a63CY" } }, { "cell_type": "code", "source": [ "vals, indices = t_indep.max(dim=0)\n", "vals_d, indices_d = t_dep.max(dim=0)\n", "t_indep = t_indep / vals\n", "t_dep = t_dep / vals_d" ], "metadata": { "id": "HVZTWeId8ua5" }, "execution_count": 16, "outputs": [] }, { "cell_type": "markdown", "source": [ "Podemos ver agora que nossas variáveis independentes normalizadas pelos coeficientes possuem valores bem semelhantes" ], "metadata": { "id": "BfrxhPDC9UNP" } }, { "cell_type": "code", "source": [ "t_indep*coeffs" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CtK2PMus9PG9", "outputId": "fdcc7042-6f96-4380-f128-45e5438e0564" }, "execution_count": 17, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([[ 0.0000, -0.0226, -0.1558, -0.0806, 0.2086],\n", " [ 0.0000, -0.0221, -0.1653, -0.0665, 0.2664],\n", " [ 0.1964, -0.0231, -0.1334, -0.0775, 0.2535],\n", " [ 0.1964, -0.0312, -0.1968, -0.1002, 0.3981],\n", " [ 0.1964, -0.0307, -0.1481, -0.0372, 0.3302],\n", " [ 0.1964, -0.0307, -0.1699, -0.0984, 0.3343],\n", " [ 0.1964, -0.0253, -0.0987, -0.0414, 0.1708],\n", " ...,\n", " [ 0.0000, -0.0231, -0.1926, -0.0924, 0.2820],\n", " [ 0.0000, -0.0280, -0.1918, -0.0468, 0.3790],\n", " [ 0.0000, -0.0221, -0.1784, -0.0486, 0.2888],\n", " [ 0.1964, -0.0205, -0.1390, -0.0854, 0.1860],\n", " [ 0.1964, -0.0291, -0.1708, -0.0737, 0.3788],\n", " [ 0.1964, -0.0318, -0.1235, -0.0973, 0.2683],\n", " [ 0.1964, -0.0253, -0.1522, -0.0652, 0.2664]])" ] }, "metadata": {}, "execution_count": 17 } ] }, { "cell_type": "markdown", "source": [ "Agora podemos fazer a soma e obter nossas previsões. Claramente não são previsões úteis pois são originadas de coeficientes aleatórios, mas mesmo assim são nossas primeiras previsões." ], "metadata": { "id": "tKO146d69o22" } }, { "cell_type": "code", "source": [ "def calc_preds(coeffs, indeps): \n", " return (indeps*coeffs).sum(axis=1)\n" ], "metadata": { "id": "_JYIxwi19qmv" }, "execution_count": 18, "outputs": [] }, { "cell_type": "markdown", "source": [ "Queremos, então, usar o *gradiente descendente* para tornar nossas previsões melhores. Para isso, precisamos de uma *perda*. Perda é uma medida que representa o quão bom ou ruim são esses coeficientes. Para calcular essa perda iremos escrever a sua função utilizando o método do erro absoluto." ], "metadata": { "id": "7CPxq0YP-2sS" } }, { "cell_type": "code", "source": [ "def calc_loss(coeffs, indeps, deps): \n", " return torch.abs(calc_preds(coeffs, indeps)-deps).mean()" ], "metadata": { "id": "qCQzsUfCABhM" }, "execution_count": 19, "outputs": [] }, { "cell_type": "markdown", "source": [ "## 4.3 Executando o gradiente descendente" ], "metadata": { "id": "_smYmID7Awc_" } }, { "cell_type": "code", "source": [ "coeffs.requires_grad_()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "P57CU60sA1VG", "outputId": "e73b914b-1b60-47f4-c9b5-86d0b936726a" }, "execution_count": 20, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([ 0.1964, -0.0377, -0.2480, -0.1389, 0.4724], requires_grad=True)" ] }, "metadata": {}, "execution_count": 20 } ] }, { "cell_type": "code", "source": [ "loss = calc_loss(coeffs, t_indep, t_dep).to(dtype=torch.float32)\n", "loss" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_xOzQLB7BS2-", "outputId": "2f4f23b3-f8f3-426c-d02d-a82407670078" }, "execution_count": 21, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor(0.4378, grad_fn=)" ] }, "metadata": {}, "execution_count": 21 } ] }, { "cell_type": "code", "source": [ "loss.backward()" ], "metadata": { "id": "cW40XZWRBuWJ" }, "execution_count": 22, "outputs": [] }, { "cell_type": "code", "source": [ "coeffs.grad" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "lREe0smnBlC7", "outputId": "c32c8545-b4c5-4bb9-a832-db663047be79" }, "execution_count": 23, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "tensor([-0.5060, -0.6603, -0.6213, -0.4804, -0.5526])" ] }, "metadata": {}, "execution_count": 23 } ] }, { "cell_type": "code", "source": [ "with torch.no_grad():\n", " coeffs.sub_(coeffs.grad * 0.1)\n", " coeffs.grad.zero_()\n", " print(calc_loss(coeffs, t_indep, t_dep).to(dtype=torch.float32))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0YzTwcUbE9zp", "outputId": "ad18daab-f67d-4b35-bd11-b3ef5b0c9f88" }, "execution_count": 24, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "tensor(0.2776)\n" ] } ] }, { "cell_type": "markdown", "source": [ "## 4.4 Treinando o modelo linear" ], "metadata": { "id": "KnKo7xv8fFUq" } }, { "cell_type": "markdown", "source": [ "Antes de começarmos a treinar nosso modelo, precisamos garantir que tenhamos um conjunto de validação para calcular nossas métricas. Há muitas maneiras diferentes de fazer isso. Como queremos garantir que a divisão dos dados seja da mesma maneira, vamos usar o *RandomSplitter* para obter índices que dividirão nossos dados em conjuntos de treinamento e validação" ], "metadata": { "id": "-jyJ-uPJbAap" } }, { "cell_type": "code", "source": [ "trn_split,val_split=RandomSplitter(seed=42)(df)\n", "val_split" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PDtWHlW1fcjq", "outputId": "358c7257-1c03-40d9-9a99-95b3c04fc1a4" }, "execution_count": 25, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(#100) [42,32,120,29,478,70,496,324,306,461...]" ] }, "metadata": {}, "execution_count": 25 } ] }, { "cell_type": "markdown", "source": [ "Agora podemos aplicar esses índices às nossas variáveis ​​independentes e dependentes:" ], "metadata": { "id": "jIMzXLNcbc2M" } }, { "cell_type": "code", "source": [ "trn_indep,val_indep = t_indep[trn_split],t_indep[val_split]\n", "trn_dep,val_dep = t_dep[trn_split],t_dep[val_split]\n", "len(trn_indep),len(val_indep)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qi6NSA70ftqK", "outputId": "7f0a7b5b-88ca-46e4-86c8-96dc2500e58d" }, "execution_count": 26, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(400, 100)" ] }, "metadata": {}, "execution_count": 26 } ] }, { "cell_type": "markdown", "source": [ "Criaremos funções para as três coisas que fizemos manualmente acima: atualizar coeffs, fazer uma etapa completa de descida de gradiente e inicializar coeffs para números aleatórios:" ], "metadata": { "id": "QWjPbkR4bn-X" } }, { "cell_type": "code", "source": [ "def update_coeffs(coeffs, lr):\n", " coeffs.sub_(coeffs.grad * lr)\n", " coeffs.grad.zero_()" ], "metadata": { "id": "4wNNkRdVfxry" }, "execution_count": 27, "outputs": [] }, { "cell_type": "code", "source": [ "def one_epoch(coeffs, lr):\n", " loss = calc_loss(coeffs, trn_indep, trn_dep)\n", " loss.backward()\n", " with torch.no_grad(): update_coeffs(coeffs, lr)\n", " print(f\"{loss:.3f}\", end=\"; \")" ], "metadata": { "id": "SchcKHoqfz2W" }, "execution_count": 28, "outputs": [] }, { "cell_type": "code", "source": [ "def init_coeffs(): \n", " return (torch.rand(n_coeff)-0.5).requires_grad_()" ], "metadata": { "id": "CRD4c1Bqf2GZ" }, "execution_count": 29, "outputs": [] }, { "cell_type": "markdown", "source": [ "Criamos também uma função para treinamento" ], "metadata": { "id": "emutuYe6bwgQ" } }, { "cell_type": "code", "source": [ "def train_model(epochs, lr):\n", " torch.manual_seed(442)\n", " coeffs = init_coeffs()\n", " for i in range(epochs): one_epoch(coeffs, lr=lr)\n", " return coeffs" ], "metadata": { "id": "rfdImdgUf614" }, "execution_count": 30, "outputs": [] }, { "cell_type": "markdown", "source": [ "Agora podemos usar essas funções para treinar nosso modelo. Nossa perda será impressa no final de cada etapa, então esperamos vê-la diminuindo:" ], "metadata": { "id": "40UV6qdGb356" } }, { "cell_type": "code", "source": [ "coeffs = train_model(6, lr=0.2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nOf_rltNf-l0", "outputId": "29a4c49d-66d5-4079-a026-2e8c6a5608dc" }, "execution_count": 31, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.798; 0.478; 0.177; 0.098; 0.088; 0.087; " ] } ] }, { "cell_type": "markdown", "source": [ "Vamos dar uma olhada nos coeficientes de cada coluna" ], "metadata": { "id": "po5oU71Eccbh" } }, { "cell_type": "code", "source": [ "def show_coeffs(): \n", " return dict(zip(indep_cols, coeffs.requires_grad_(False)))\n", "show_coeffs()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BOVcd7C-gOJY", "outputId": "21f5f9a1-f44d-43ea-ce05-666dcbc2964f" }, "execution_count": 32, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'gender': tensor(-0.1149),\n", " 'age': tensor(0.3842),\n", " 'annual_salary': tensor(0.4649),\n", " 'credit_card_debt': tensor(-0.0613),\n", " 'car_purchase_amount': tensor(-0.0315)}" ] }, "metadata": {}, "execution_count": 32 } ] }, { "cell_type": "markdown", "source": [ "## 4.5 Resultado" ], "metadata": { "id": "pP6LhffjcjvC" } }, { "cell_type": "markdown", "source": [ "Podemos também verificar a precisão do modelo - a proporção de linhas em que prevemos corretamente. Primeiramente, calculamos as previsões" ], "metadata": { "id": "w3Z6kBEWc1Mk" } }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt" ], "metadata": { "id": "wcUZ4dAvm9Zq" }, "execution_count": 33, "outputs": [] }, { "cell_type": "code", "source": [ "X = df['age'].values\n", "X" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "RbzD8rZXmbT4", "outputId": "da4a9b2e-49b0-48af-b559-bd3cbaf3cf73" }, "execution_count": 34, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([42, 41, 43, 58, 57, 57, 47, 50, 47, 43, 50, 53, 44, 48, 55, 53, 45, 48, 52, 59, 52, 48, 46, 47, 40, 53, 28, 56, 46, 40, 33, 40, 51,\n", " 51, 46, 51, 50, 22, 51, 48, 42, 46, 38, 39, 61, 55, 42, 51, 41, 40, 41, 56, 46, 37, 52, 57, 34, 43, 50, 42, 42, 42, 55, 53, 53, 43,\n", " 55, 43, 57, 52, 45, 56, 41, 48, 56, 47, 53, 57, 39, 45, 33, 44, 40, 40, 37, 40, 44, 43, 58, 32, 50, 59, 42, 50, 53, 47, 46, 43, 49,\n", " 43, 53, 36, 30, 37, 48, 44, 42, 50, 30, 42, 46, 55, 44, 58, 42, 57, 43, 35, 43, 35, 34, 48, 53, 47, 54, 51, 59, 49, 51, 40, 53, 45,\n", " 45, 37, 43, 48, 49, 48, 45, 43, 62, 46, 51, 44, 57, 60, 39, 61, 50, 37, 45, 50, 32, 34, 45, 50, 51, 53, 34, 56, 57, 48, 40, 50, 47,\n", " 39, 36, 44, 47, 33, 42, 47, 40, 54, 38, 40, 45, 51, 38, 34, 50, 42, 33, 56, 57, 37, 51, 63, 53, 51, 48, 41, 39, 45, 70, 51, 51, 42,\n", " 50, 40, 44, 52, 41, 57, 54, 50, 37, 52, 43, 52, 64, 51, 55, 47, 36, 39, 45, 47, 47, 60, 59, 36, 47, 38, 42, 33, 39, 39, 55, 45, 51,\n", " 49, 46, 53, 39, 43, 70, 51, 52, 45, 48, 48, 48, 57, 46, 44, 65, 57, 47, 36, 57, 33, 43, 46, 45, 43, 38, 40, 43, 42, 51, 38, 41, 54,\n", " 45, 41, 40, 32, 54, 55, 35, 46, 45, 50, 54, 29, 56, 54, 33, 48, 49, 55, 42, 41, 53, 53, 44, 42, 41, 48, 63, 59, 45, 47, 49, 40, 41,\n", " 47, 27, 46, 51, 43, 32, 63, 35, 50, 51, 54, 37, 44, 57, 47, 52, 52, 48, 55, 47, 45, 40, 47, 45, 49, 60, 34, 36, 51, 42, 48, 35, 44,\n", " 48, 47, 31, 45, 49, 61, 51, 35, 53, 42, 39, 38, 41, 44, 43, 39, 33, 47, 45, 51, 42, 55, 62, 52, 51, 63, 46, 47, 58, 37, 51, 36, 32,\n", " 32, 43, 51, 43, 58, 49, 43, 48, 40, 35, 43, 57, 47, 32, 44, 50, 44, 57, 35, 53, 41, 44, 63, 50, 42, 41, 40, 40, 56, 48, 41, 61, 35,\n", " 55, 37, 48, 32, 62, 49, 43, 36, 61, 46, 57, 36, 49, 63, 49, 44, 43, 48, 37, 49, 40, 42, 30, 43, 55, 40, 38, 43, 37, 41, 42, 38, 43,\n", " 44, 41, 46, 46, 40, 45, 58, 62, 52, 44, 44, 40, 33, 44, 42, 20, 53, 56, 44, 52, 43, 49, 56, 47, 25, 45, 46, 33, 43, 48, 48, 40, 39,\n", " 39, 54, 53, 51, 55, 35, 43, 37, 60, 44, 39, 42, 32, 52, 56, 41, 51, 58, 51, 29, 53, 43, 62, 60, 37, 43, 42, 55, 46, 50, 55, 43, 52,\n", " 41, 38, 54, 59, 47])" ] }, "metadata": {}, "execution_count": 34 } ] }, { "cell_type": "code", "source": [ "Y = df['car_purchase_amount'].values.astype(int) #using .astype( 'dtype' ) from 'https://sparkbyexamples.com/pandas/pandas-convert-column-to-int/'\n", "Y" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nO81i8W8mcUJ", "outputId": "21cdea62-19b5-4a81-fc81-9da3d142c166" }, "execution_count": 35, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([35321, 45115, 42925, 67422, 55915, 56611, 28925, 47434, 48013, 38189, 59045, 42288, 28700, 49258, 49510, 53017, 41814, 43901, 44633,\n", " 54827, 51130, 43402, 47240, 46635, 45078, 44387, 37161, 49091, 58350, 43994, 17584, 44650, 66363, 53489, 39810, 51612, 38978, 10092,\n", " 35928, 54823, 45805, 41567, 28031, 27815, 68678, 68925, 34215, 37843, 37883, 48734, 27187, 63738, 48266, 46381, 31978, 48100, 47380,\n", " 41425, 38147, 32737, 37348, 47483, 49730, 40093, 42297, 52954, 48104, 43680, 52707, 49392, 30841, 49373, 41903, 45058, 52991, 50958,\n", " 41357, 44434, 38502, 41221, 38399, 41456, 30394, 42384, 39002, 19553, 45167, 36019, 50937, 12895, 38955, 51221, 25971, 60670, 54075,\n", " 40004, 61593, 39503, 52474, 42187, 57441, 22681, 33640, 31540, 60461, 45738, 34803, 34642, 27586, 54973, 49142, 58840, 57306, 51941,\n", " 30240, 67120, 42408, 41451, 42592, 34521, 42213, 41913, 59416, 51402, 54755, 47143, 64391, 37252, 52665, 44001, 51551, 38243, 39766,\n", " 40077, 33131, 48622, 47693, 39410, 33428, 32700, 62864, 29425, 44418, 36645, 53655, 45977, 38504, 47935, 60222, 38930, 27810, 47604,\n", " 42356, 31300, 42369, 31837, 26499, 38172, 39433, 37714, 57125, 46453, 43855, 55592, 42484, 40879, 20653, 35438, 36112, 38182, 41026,\n", " 27889, 43724, 57430, 41104, 49050, 41265, 64545, 29052, 30719, 38763, 39331, 32608, 58045, 54387, 36638, 39522, 42978, 60865, 46380,\n", " 56579, 42774, 37879, 45208, 56229, 50455, 49721, 31696, 49220, 46188, 36086, 43264, 40660, 51683, 44525, 48518, 45805, 54850, 32478,\n", " 42209, 55125, 47984, 43405, 44577, 37744, 47805, 44846, 46643, 56563, 41673, 61118, 37303, 46892, 56457, 45509, 27625, 46389, 29002,\n", " 51355, 42011, 52654, 44432, 46054, 58235, 42990, 50702, 47009, 49399, 42997, 44434, 46325, 46846, 56499, 42773, 52313, 34139, 60763,\n", " 66158, 31215, 46135, 56973, 24184, 49079, 37093, 43401, 29092, 48349, 33261, 41327, 49336, 51405, 31249, 43598, 48300, 54013, 38674,\n", " 37076, 37947, 41320, 66888, 12536, 39549, 52709, 53502, 52116, 38705, 48025, 59483, 35911, 41034, 51730, 53021, 32828, 29417, 57461,\n", " 50441, 41575, 46412, 47610, 70878, 55543, 53848, 39904, 44736, 46937, 28440, 38148, 42747, 29670, 63038, 63248, 42321, 44463, 67092,\n", " 22091, 40022, 56071, 49442, 42497, 37084, 51866, 35716, 39892, 35781, 42866, 80000, 60526, 59758, 39606, 58641, 52983, 50666, 59625,\n", " 22630, 41137, 53496, 36543, 43503, 31146, 31526, 31083, 45366, 25252, 39888, 52240, 39911, 45857, 30826, 39422, 34678, 23517, 28733,\n", " 59096, 50188, 35659, 46398, 32291, 49079, 49348, 41427, 24221, 44424, 60390, 42793, 46935, 58667, 38042, 39270, 54606, 39083, 47984,\n", " 46082, 30964, 35726, 49065, 48955, 37183, 46710, 52889, 29754, 60960, 39975, 38545, 56764, 63079, 55700, 36367, 52477, 50296, 37259,\n", " 47715, 29540, 60567, 36125, 57303, 51922, 35848, 42704, 55174, 26599, 53993, 47970, 43641, 41679, 63140, 30757, 65592, 37871, 42919,\n", " 22599, 70598, 43242, 38138, 30419, 63868, 45112, 44361, 19525, 49991, 61731, 41769, 46402, 37376, 33766, 30667, 52056, 30736, 39439,\n", " 38174, 40589, 62028, 48465, 40095, 49568, 31408, 47719, 35784, 42905, 48516, 45593, 32061, 32208, 35475, 29519, 55420, 42139, 50539,\n", " 34922, 43898, 39135, 41147, 24134, 42705, 38901, 28645, 52150, 66648, 42909, 49248, 27303, 47869, 59984, 45271, 9000, 46012, 32967,\n", " 48785, 45824, 40102, 35457, 29556, 38243, 44430, 51046, 52570, 61404, 28463, 27586, 47979, 28164, 69669, 48052, 37364, 44500, 35139,\n", " 55167, 48383, 35823, 36517, 53110, 53049, 21471, 45015, 55377, 56510, 47443, 41489, 32553, 41984, 59538, 41352, 52785, 60117, 47760,\n", " 64188, 48901, 31491, 64147, 45442, 45107])" ] }, "metadata": {}, "execution_count": 35 } ] }, { "cell_type": "code", "source": [ "%matplotlib inline \n", "plt.scatter(X,Y) \n", "plt.xlabel(\"Age\") \n", "plt.ylabel(\"Car Purchase Amount\") \n", "plt.title(\"Linear Regression\") \n", "m, b = np.polyfit(X,Y, 1) \n", "plt.plot(X, m*X + b,'Red')" ], "metadata": { "id": "mpLcEC8xgV66", "colab": { "base_uri": "https://localhost:8080/", "height": 312 }, "outputId": "9be56152-ce69-4e5a-f99d-28cb179ec0c5" }, "execution_count": 36, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 36 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "Com base nos dados quanto maior a idade, mais dinheiro seria gasto em carro mais caro" ], "metadata": { "id": "73L7RUVmnTdg" } }, { "cell_type": "markdown", "source": [ "# 5. Deploy" ], "metadata": { "id": "7z0H_P0ZnW1r" } }, { "cell_type": "code", "source": [ "!pip install huggingface_hub" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jjRBZVmpoVFq", "outputId": "1fcb632e-f6b6-46cb-cff4-cc517b652d9f" }, "execution_count": 37, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Collecting huggingface_hub\n", " Downloading huggingface_hub-0.11.1-py3-none-any.whl (182 kB)\n", "\u001b[K |████████████████████████████████| 182 kB 31.8 MB/s \n", "\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (4.4.0)\n", "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (21.3)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (2.23.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (6.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (3.8.2)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from huggingface_hub) (4.64.1)\n", "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.8/dist-packages (from packaging>=20.9->huggingface_hub) (3.0.9)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.8/dist-packages (from requests->huggingface_hub) (1.24.3)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.8/dist-packages (from requests->huggingface_hub) (3.0.4)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests->huggingface_hub) (2.10)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/dist-packages (from requests->huggingface_hub) (2022.12.7)\n", "Installing collected packages: huggingface-hub\n", "Successfully installed huggingface-hub-0.11.1\n" ] } ] }, { "cell_type": "code", "source": [ "!huggingface-cli login" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9qmIjI65n1oH", "outputId": "610f651a-6982-449c-ad45-02ad3b47303d" }, "execution_count": 38, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", " _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n", " _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n", " _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n", " _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n", " _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n", "\n", " To login, `huggingface_hub` now requires a token generated from https://huggingface.co/settings/tokens .\n", " \n", "Token: \n", "Add token as git credential? (Y/n) n\n", "Token is valid.\n", "Your token has been saved to /root/.huggingface/token\n", "Login successful\n" ] } ] }, { "cell_type": "code", "source": [ "from huggingface_hub import *" ], "metadata": { "id": "Jzd0BnuG_EJr" }, "execution_count": 39, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "G8Zn0wMKD4J2" }, "execution_count": null, "outputs": [] } ] }