{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Problema 3 - Reconhecendo dígitos manuscritos\n", "\n", "\n", "* Minicurso Machine Learning -- Hands on com Python\n", "* Samsung Ocean Manaus\n", "* Facilitadora: Elloá B. Guedes\n", "* Repositório: http://bit.ly/mlpython\n", "* Nome:\n", "* Email:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bibliotecas\n", "\n", "A célula a seguir está reservada para importação de bibliotecas" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Obtendo o conjunto de dados\n", "\n", "1. Obtenha o dataset do MNIST\n", " 1.1 Vamos utilizar o [Projeto MNIST-for-Numpy](https://github.com/hsjeong5/MNIST-for-Numpy) para nos ajudar\n", " 1.2 Baixe o arquivo mnist.py do nosso repositório\n", " 1.3 Coloque-o na mesma pasta do Jupyter Notebook do problema 3\n", " 1.4 Adicione import mnist\n", " 1.5 Faça mnist.init() para download dos arquivos\n", "2. Particione o dataset em dados de treino e teste\n", " 2.1 60 mil primeiros exemplos para treino\n", " 2.2 10 mil exemplos seguintes para teste\n", " 2.3 Conforme documentação do projeto, faça: X_train, y_train, X_test, y_test = mnist.load()\n", "3. Imprima o exemplo no índice 5 dos dados de treino e seu respectivo rótulo\n", " 3.1 Visualize o atributo preditor conforme array e também como imagem" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "pixels = np.array(X_train[5], dtype='uint8')\n", "\n", "# Reshape the array into 28 x 28 array (2-dimensional array)\n", "pixels = pixels.reshape((28, 28))\n", "\n", "# Plot\n", "plt.title('Label is {label}'.format(label=y_train[5]))\n", "plt.imshow(pixels, cmap='gray')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Projetando uma Rede Neural Reconhecedora de Dígitos\n", "\n", "1. Com a utilização do pacote sklearn, proponha uma rede neural multilayer perceptron para este problema\n", " 1.1 Utilize a classe MLPClassifier, consultando a documentação oficial em: \n", " 1.2 Vamos inicialmente propor uma rede com as seguintes características:\n", " * Uma camada oculta, com 5 neurônios\n", " * Função de ativação sigmóide (logistic)\n", " * Número de épocas máximo igual a 100 (max_iter = 100)\n", " * Utilize o treinamento de maneira visual, isto é, verbose=True\n", " * Os demais parâmetros devem permanecer padrões\n", " 1.3 Treine a rede com os dados de treinamento (X_train e y_train)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Avaliando a Rede Neural Proposta\n", "\n", "1. Obtenha as previsões desta rede para o conjunto de testes\n", "1. Considerando as previsões efetuadas, calcule a acurácia da rede\n", "2. Obtenha a matriz de confusão e exiba-a\n", " * Lembre do que foi efetuado no problema 2, aproveite código de lá!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import itertools\n", "\n", "cm = matrizcf\n", "cmap=plt.cm.Blues\n", "normalize = False\n", "classes = [str(x) for x in range(0,11)]\n", "plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", "plt.title('Matriz de confusao')\n", "plt.colorbar()\n", "tick_marks = np.arange(len(classes))\n", "plt.xticks(tick_marks, classes, rotation=45)\n", "plt.yticks(tick_marks, classes)\n", "\n", "fmt = '.2f' if normalize else 'd'\n", "thresh = cm.max() / 2.\n", "for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", " plt.text(j, i, format(cm[i, j], fmt))\n", "\n", "plt.tight_layout()\n", "plt.ylabel('Rótulo real')\n", "plt.xlabel('Rótulo previsto')\n", "plt.savefig(\"mnist-confusao.pdf\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Projetando outras Redes Neurais para o MNIST\n", "\n", "1. Proponha uma rede neural para este problema com mais neurônios na única camada oculta\n", " 1.1 Mude o número de neurônios em hidden_layers_size\n", " 1.2 Treine a nova rede proposta\n", " 1.3 Obtenha a previsão desta rede para os dados do conjunto de teste\n", " 1.4 Calcule a acurácia e compare-a com o resultado já existente\n", "2. Proponha outra rede neural com duas camadas ocultas com diferentes quantidades de neurônios e uma outra função de ativação\n", " 2.1 Mude o número de neurônios em hidden_layers_size\n", " 2.2 Defina a nova função de ativação para um dos seguintes valores ('identity', 'logistic', 'tanh', 'relu')\n", " * Dica: a função de ativação ReLU é ótima para capturar não-linearidades!\n", " 2.2 Treine a nova rede proposta\n", " 2.3 Obtenha a previsão desta rede para os dados do conjunto de teste\n", " 2.4 Calcule a acurácia e compare-a com os resultados já existentes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparando com Árvore de Decisão\n", "\n", "1. Proponha uma árvore de decisão para esta tarefa\n", " * Aproveite as ideias já utilizadas no Problema 2\n", "2. Compare o desempenho obtido com as redes neurais que você propôs!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }