{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <font color='blue'>Data Science Academy - Python Fundamentos - Capítulo 10</font>\n",
    "\n",
    "## Download: http://github.com/dsacademybr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab 4 - Construindo um Modelo de Regressão Linear com TensorFlow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use como referência o Deep Learning Book: http://www.deeplearningbook.com.br/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Imports\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definindo os hyperparâmetros do modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hyperparâmetros do modelo\n",
    "learning_rate = 0.01\n",
    "training_epochs = 2000\n",
    "display_step = 200"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definindo os datasets de treino e de teste\n",
    "\n",
    "## Considere X como o tamanho de uma casa e y o preço de uma casa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Dataset de treino\n",
    "train_X = np.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,7.042,10.791,5.313,7.997,5.654,9.27,3.1])\n",
    "train_y = np.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,2.827,3.465,1.65,2.904,2.42,2.94,1.3])\n",
    "n_samples = train_X.shape[0]\n",
    " \n",
    "# Dataset de teste\n",
    "test_X = np.asarray([6.83, 4.668, 8.9, 7.91, 5.7, 8.7, 3.1, 2.1])\n",
    "test_y = np.asarray([1.84, 2.273, 3.2, 2.831, 2.92, 3.24, 1.35, 1.03])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Placeholders e variáveis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Placeholders para as variáveis preditoras (x) e para  variável target (y)\n",
    "X = tf.placeholder(tf.float32)\n",
    "y = tf.placeholder(tf.float32)\n",
    " \n",
    "# Pesos e bias do modelo\n",
    "W = tf.Variable(np.random.randn(), name=\"weight\")\n",
    "b = tf.Variable(np.random.randn(), name=\"bias\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Construindo o modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Construindo o modelo linear\n",
    "# Fórmula do modelo linear: y = W*X + b\n",
    "linear_model = W*X + b\n",
    " \n",
    "# Mean squared error (erro quadrado médio)\n",
    "cost = tf.reduce_sum(tf.square(linear_model - y)) / (2*n_samples)\n",
    " \n",
    "# Otimização com Gradient descent\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Executando o grafo computacional, treinando e testando o modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch:   200 \t Cost:   0.08133 \t W: 0.214 \t b: 1.065\n",
      "Epoch:   400 \t Cost:   0.07964 \t W:0.2221 \t b: 1.008\n",
      "Epoch:   600 \t Cost:   0.07859 \t W:0.2285 \t b:0.9628\n",
      "Epoch:   800 \t Cost:   0.07795 \t W:0.2335 \t b:0.9275\n",
      "Epoch:  1000 \t Cost:   0.07756 \t W:0.2374 \t b:0.8997\n",
      "Epoch:  1200 \t Cost:   0.07732 \t W:0.2405 \t b: 0.878\n",
      "Epoch:  1400 \t Cost:   0.07717 \t W:0.2429 \t b:0.8609\n",
      "Epoch:  1600 \t Cost:   0.07708 \t W:0.2448 \t b:0.8475\n",
      "Epoch:  1800 \t Cost:   0.07702 \t W:0.2462 \t b: 0.837\n",
      "Epoch:  2000 \t Cost:   0.07698 \t W:0.2474 \t b:0.8288\n",
      "\n",
      "Otimização Concluída!\n",
      "Custo Final de Treinamento: 0.07698439  - W Final: 0.24740951  - b Final: 0.8287576 \n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1817e25fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Custo Final em Teste: 0.07920746\n",
      "Diferença Média Quadrada Absoluta: 0.002223067\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x181daa32b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Definindo a inicialização das variáveis\n",
    "init = tf.global_variables_initializer()\n",
    " \n",
    "# Iniciando a sessão\n",
    "with tf.Session() as sess:\n",
    "    # Iniciando as variáveis\n",
    "    sess.run(init)\n",
    " \n",
    "    # Treinamento do modelo\n",
    "    for epoch in range(training_epochs):\n",
    " \n",
    "        # Otimização com Gradient Descent\n",
    "        sess.run(optimizer, feed_dict={X: train_X, y: train_y})\n",
    "         \n",
    "        # Display de cada epoch\n",
    "        if (epoch+1) % display_step == 0:\n",
    "            c = sess.run(cost, feed_dict={X: train_X, y: train_y})\n",
    "            print(\"Epoch:{0:6} \\t Cost:{1:10.4} \\t W:{2:6.4} \\t b:{3:6.4}\".format(epoch+1, c, sess.run(W), sess.run(b)))\n",
    "             \n",
    "    # Imprimindo os parâmetros finais do modelo\n",
    "    print(\"\\nOtimização Concluída!\")\n",
    "    training_cost = sess.run(cost, feed_dict={X: train_X, y: train_y})\n",
    "    print(\"Custo Final de Treinamento:\", training_cost, \" - W Final:\", sess.run(W), \" - b Final:\", sess.run(b), '\\n')\n",
    "     \n",
    "    # Visualizando o resultado\n",
    "    plt.plot(train_X, train_y, 'ro', label='Dados Originais')\n",
    "    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Linha de Regressão')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    " \n",
    "    # Testando o modelo\n",
    "    testing_cost = sess.run(tf.reduce_sum(tf.square(linear_model - y)) / (2 * test_X.shape[0]), \n",
    "                            feed_dict={X: test_X, y: test_y})\n",
    "     \n",
    "    print(\"Custo Final em Teste:\", testing_cost)\n",
    "    print(\"Diferença Média Quadrada Absoluta:\", abs(training_cost - testing_cost))\n",
    " \n",
    "    # Display em Teste\n",
    "    plt.plot(test_X, test_y, 'bo', label='Dados de Teste')\n",
    "    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Linha de Regressão')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "    \n",
    "sess.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Conheça a Formação Inteligência Artificial, um programa completo, 100% online e 100% em português, com 402 horas em 9 cursos de nível intermediário/avançado, que vão ajudá-lo a se tornar um dos profissionais mais cobiçados do mercado de tecnologia. Clique no link abaixo, faça sua inscrição, comece hoje mesmo e aumente sua empregabilidade:\n",
    "\n",
    "https://www.datascienceacademy.com.br/pages/formacao-inteligencia-artificial"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Fim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### Obrigado - Data Science Academy - <a href=\"http://facebook.com/dsacademybr\">facebook.com/dsacademybr</a>"
   ]
  }
 ],
 "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.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
