diff --git a/Ch4/09_Lime_RNN.ipynb b/Ch4/09_Lime_RNN.ipynb index c988669..67db2c3 100644 --- a/Ch4/09_Lime_RNN.ipynb +++ b/Ch4/09_Lime_RNN.ipynb @@ -1,31 +1,4 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "accelerator": "GPU", - "colab": { - "name": "09_Lime_RNN.ipynb", - "provenance": [], - "collapsed_sections": [] - }, - "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.13" - } - }, "cells": [ { "cell_type": "markdown", @@ -33,118 +6,169 @@ "id": "hjoUGDuyTdh5" }, "source": [ - "In this notebook we will demonstrate how to interpret a Deep Learning Model using [LIME](https://github.com/marcotcr/lime)(local interpretable model-agnostic explanations), a python package for explaining machine learning classifiers. " + "In this notebook we will demonstrate how to interpret a Deep Learning Model using [LIME](https://github.com/marcotcr/lime)(local interpretable model-agnostic explanations), a python package for explaining machine learning classifiers." ] }, { "cell_type": "code", + "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IVQdTkPzH-Y7", - "outputId": "1d0dea01-69b6-4c3b-930d-5d0bf45b6c96" + "outputId": "e961acb8-75db-4f4a-d792-6c5287b27038" }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (1.5.3)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2023.3.post1)\n", + "Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.23.5)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)\n", + "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (1.2.2)\n", + "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.11.2)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (3.2.0)\n", + "Collecting lime\n", + " Downloading lime-0.2.0.1.tar.gz (275 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m275.7/275.7 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from lime) (3.7.1)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from lime) (1.23.5)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from lime) (1.11.2)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from lime) (4.66.1)\n", + "Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.10/dist-packages (from lime) (1.2.2)\n", + "Requirement already satisfied: scikit-image>=0.12 in /usr/local/lib/python3.10/dist-packages (from lime) (0.19.3)\n", + "Requirement already satisfied: networkx>=2.2 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (3.1)\n", + "Requirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (9.4.0)\n", + "Requirement already satisfied: imageio>=2.4.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (2.31.3)\n", + "Requirement already satisfied: tifffile>=2019.7.26 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (2023.8.30)\n", + "Requirement already satisfied: PyWavelets>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (1.4.1)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from scikit-image>=0.12->lime) (23.1)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.18->lime) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.18->lime) (3.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (1.4.5)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->lime) (2.8.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->lime) (1.16.0)\n", + "Building wheels for collected packages: lime\n", + " Building wheel for lime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for lime: filename=lime-0.2.0.1-py3-none-any.whl size=283834 sha256=c7172254f3d96d837ba07dbb708583c2a38152cb3be2a66fff7f95083fff74db\n", + " Stored in directory: /root/.cache/pip/wheels/fd/a2/af/9ac0a1a85a27f314a06b39e1f492bee1547d52549a4606ed89\n", + "Successfully built lime\n", + "Installing collected packages: lime\n", + "Successfully installed lime-0.2.0.1\n", + "Requirement already satisfied: tensorflow in /usr/local/lib/python3.10/dist-packages (2.13.0)\n", + "Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.4.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=23.1.21 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (23.5.26)\n", + "Requirement already satisfied: gast<=0.4.0,>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.4.0)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.57.0)\n", + "Requirement already satisfied: h5py>=2.9.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.9.0)\n", + "Requirement already satisfied: keras<2.14,>=2.13.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.13.1)\n", + "Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (16.0.6)\n", + "Requirement already satisfied: numpy<=1.24.3,>=1.22 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.23.5)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.3.0)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from tensorflow) (23.1)\n", + "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.20.3)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from tensorflow) (67.7.2)\n", + "Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.16.0)\n", + "Requirement already satisfied: tensorboard<2.14,>=2.13 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.13.0)\n", + "Requirement already satisfied: tensorflow-estimator<2.14,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.13.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.3.0)\n", + "Requirement already satisfied: typing-extensions<4.6.0,>=3.6.6 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (4.5.0)\n", + "Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.15.0)\n", + "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.33.0)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from astunparse>=1.6.0->tensorflow) (0.41.2)\n", + "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (2.17.3)\n", + "Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (1.0.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (3.4.4)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (2.31.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (0.7.1)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.14,>=2.13->tensorflow) (2.3.7)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow) (5.3.1)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow) (0.3.0)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow) (4.9)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow) (1.3.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow) (3.2.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow) (3.4)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow) (2.0.4)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorboard<2.14,>=2.13->tensorflow) (2023.7.22)\n", + "Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.10/dist-packages (from werkzeug>=1.0.1->tensorboard<2.14,>=2.13->tensorflow) (2.1.3)\n", + "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow) (0.5.0)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (1.23.5)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (3.7.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.23.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (2.8.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", + "Requirement already satisfied: seaborn in /usr/local/lib/python3.10/dist-packages (0.12.2)\n", + "Requirement already satisfied: numpy!=1.24.0,>=1.17 in /usr/local/lib/python3.10/dist-packages (from seaborn) (1.23.5)\n", + "Requirement already satisfied: pandas>=0.25 in /usr/local/lib/python3.10/dist-packages (from seaborn) (1.5.3)\n", + "Requirement already satisfied: matplotlib!=3.6.1,>=3.1 in /usr/local/lib/python3.10/dist-packages (from seaborn) (3.7.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.25->seaborn) (2023.3.post1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.1->seaborn) (1.16.0)\n", + "Collecting scikeras\n", + " Downloading scikeras-0.11.0-py3-none-any.whl (27 kB)\n", + "Requirement already satisfied: packaging>=0.21 in /usr/local/lib/python3.10/dist-packages (from scikeras) (23.1)\n", + "Requirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from scikeras) (1.2.2)\n", + "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->scikeras) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->scikeras) (1.11.2)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->scikeras) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->scikeras) (3.2.0)\n", + "Installing collected packages: scikeras\n", + "Successfully installed scikeras-0.11.0\n" + ] + } + ], "source": [ "# To install only the requirements of this notebook, uncomment the lines below and run this cell\n", "\n", "# ===========================\n", "\n", - "!pip install pandas==1.1.5\n", - "!pip install scikit-learn==0.21.3\n", - "!pip install lime==0.2.0.1\n", - "!pip install tensorflow==1.14.0\n", - "!pip install numpy==1.19.5\n", - "!pip install matplotlib==3.2.2\n", - "!pip install seaborn==0.11.1\n", + "# !pip install pandas==1.5.3\n", + "# !pip install scikit-learn==1.2.2\n", + "# !pip install lime==0.2.0.1\n", + "# !pip install tensorflow==2.13.0\n", + "# !pip install numpy==1.23.5\n", + "# !pip install matplotlib==3.7.1\n", + "# !pip install seaborn==0.12.2\n", + "# !pip install scikeras==0.11.0\n", "\n", "# ===========================" - ], - "execution_count": 1, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Requirement already satisfied: pandas==1.1.5 in /usr/local/lib/python3.7/dist-packages (1.1.5)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas==1.1.5) (2.8.1)\n", - "Requirement already satisfied: numpy>=1.15.4 in /usr/local/lib/python3.7/dist-packages (from pandas==1.1.5) (1.19.5)\n", - "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas==1.1.5) (2018.9)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas==1.1.5) (1.15.0)\n", - "Requirement already satisfied: scikit-learn==0.21.3 in /usr/local/lib/python3.7/dist-packages (0.21.3)\n", - "Requirement already satisfied: numpy>=1.11.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.21.3) (1.19.5)\n", - "Requirement already satisfied: scipy>=0.17.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.21.3) (1.4.1)\n", - "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn==0.21.3) (1.0.1)\n", - "Requirement already satisfied: lime==0.2.0.1 in /usr/local/lib/python3.7/dist-packages (0.2.0.1)\n", - "Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (0.21.3)\n", - "Requirement already satisfied: scikit-image>=0.12 in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (0.16.2)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (1.19.5)\n", - "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (3.2.2)\n", - "Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (4.41.1)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from lime==0.2.0.1) (1.4.1)\n", - "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18->lime==0.2.0.1) (1.0.1)\n", - "Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime==0.2.0.1) (2.5.1)\n", - "Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime==0.2.0.1) (1.1.1)\n", - "Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime==0.2.0.1) (2.4.1)\n", - "Requirement already satisfied: pillow>=4.3.0 in /usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime==0.2.0.1) (7.1.2)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->lime==0.2.0.1) (2.4.7)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->lime==0.2.0.1) (0.10.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->lime==0.2.0.1) (1.3.1)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->lime==0.2.0.1) (2.8.1)\n", - "Requirement already satisfied: decorator<5,>=4.3 in /usr/local/lib/python3.7/dist-packages (from networkx>=2.0->scikit-image>=0.12->lime==0.2.0.1) (4.4.2)\n", - "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib->lime==0.2.0.1) (1.15.0)\n", - "Requirement already satisfied: tensorflow==1.14.0 in /usr/local/lib/python3.7/dist-packages (1.14.0)\n", - "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (0.36.2)\n", - "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (0.8.1)\n", - "Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.0.8)\n", - "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.1.2)\n", - "Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.19.5)\n", - "Requirement already satisfied: tensorboard<1.15.0,>=1.14.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.14.0)\n", - "Requirement already satisfied: tensorflow-estimator<1.15.0rc0,>=1.14.0rc0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.14.0)\n", - "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.12.1)\n", - "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.1.0)\n", - "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (0.12.0)\n", - "Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (0.4.0)\n", - "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (0.2.0)\n", - "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (3.17.3)\n", - "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.15.0)\n", - "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.14.0) (1.34.1)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.7/dist-packages (from keras-applications>=1.0.6->tensorflow==1.14.0) (3.1.0)\n", - "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (1.0.1)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (57.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.3.4)\n", - "Requirement already satisfied: cached-property; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from h5py->keras-applications>=1.0.6->tensorflow==1.14.0) (1.5.2)\n", - "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (4.6.1)\n", - "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.7.4.3)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.5.0)\n", - "Requirement already satisfied: numpy==1.19.5 in /usr/local/lib/python3.7/dist-packages (1.19.5)\n", - "Requirement already satisfied: matplotlib==3.2.2 in /usr/local/lib/python3.7/dist-packages (3.2.2)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib==3.2.2) (2.4.7)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib==3.2.2) (2.8.1)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib==3.2.2) (1.3.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib==3.2.2) (0.10.0)\n", - "Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.7/dist-packages (from matplotlib==3.2.2) (1.19.5)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib==3.2.2) (1.15.0)\n", - "Requirement already satisfied: seaborn==0.11.1 in /usr/local/lib/python3.7/dist-packages (0.11.1)\n", - "Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.7/dist-packages (from seaborn==0.11.1) (1.4.1)\n", - "Requirement already satisfied: matplotlib>=2.2 in /usr/local/lib/python3.7/dist-packages (from seaborn==0.11.1) (3.2.2)\n", - "Requirement already satisfied: pandas>=0.23 in /usr/local/lib/python3.7/dist-packages (from seaborn==0.11.1) (1.1.5)\n", - "Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.7/dist-packages (from seaborn==0.11.1) (1.19.5)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn==0.11.1) (0.10.0)\n", - "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn==0.11.1) (2.4.7)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn==0.11.1) (1.3.1)\n", - "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn==0.11.1) (2.8.1)\n", - "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.23->seaborn==0.11.1) (2018.9)\n", - "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib>=2.2->seaborn==0.11.1) (1.15.0)\n" - ], - "name": "stdout" - } ] }, { "cell_type": "code", + "execution_count": 2, "metadata": { "id": "xQa4Mi5HH-Y8" }, + "outputs": [], "source": [ "# To install the requirements for the entire chapter, uncomment the lines below and run this cell\n", "\n", @@ -157,9 +181,7 @@ "# !pip install -r \"ch4-requirements.txt\"\n", "\n", "# ===========================" - ], - "execution_count": 2, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -172,9 +194,11 @@ }, { "cell_type": "code", + "execution_count": 3, "metadata": { "id": "UsCn1xlo_MMX" }, + "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", @@ -205,51 +229,78 @@ "\n", "def download_and_load_datasets(force_download=False):\n", " dataset = tf.keras.utils.get_file(\n", - " fname=\"aclImdb.tar.gz\", \n", - " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n", + " fname=\"aclImdb.tar.gz\",\n", + " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\",\n", " extract=True)\n", "\n", - " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n", + " train_df = load_dataset(os.path.join(os.path.dirname(dataset),\n", " \"aclImdb\", \"train\"))\n", - " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n", + " test_df = load_dataset(os.path.join(os.path.dirname(dataset),\n", " \"aclImdb\", \"test\"))\n", - " \n", + "\n", " return train_df, test_df" - ], - "execution_count": 3, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 4, "metadata": { - "id": "dlBTwerPX1EV" + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dlBTwerPX1EV", + "outputId": "c993d022-1ac9-4ba0-b649-2ad1c1c5bd25" }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading data from http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\n", + "84125825/84125825 [==============================] - 7s 0us/step\n" + ] + } + ], "source": [ "try:\n", " from google.colab import files\n", - " \n", + "\n", " if not os.path.exists('aclImdb'):\n", " train,test = download_and_load_datasets()\n", " else:\n", " train = load_dataset('aclImdb/train')\n", " test = load_dataset('aclImdb/test')\n", - " \n", + "\n", "except ModuleNotFoundError:\n", " if not os.path.exists('Data/aclImdb'):\n", " train,test = download_and_load_datasets()\n", " else:\n", " train = load_dataset('Data/aclImdb/train')\n", " test = load_dataset('Data/aclImdb/test')" - ], - "execution_count": 4, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 5, "metadata": { - "id": "hEpQWHnF-hOX" + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hEpQWHnF-hOX", + "outputId": "6fc9530e-fa69-4417-8ee3-a44eef30accb" }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Colab only includes TensorFlow 2.x; %tensorflow_version has no effect.\n" + ] + } + ], "source": [ + "%tensorflow_version 2.x\n", + "\n", "import os\n", "import sys\n", "import numpy as np\n", @@ -264,29 +315,24 @@ "\n", "\n", "MAX_SEQUENCE_LENGTH = 1000\n", - "MAX_NUM_WORDS = 20000 \n", - "EMBEDDING_DIM = 100 \n", + "MAX_NUM_WORDS = 20000\n", + "EMBEDDING_DIM = 100\n", "VALIDATION_SPLIT = 0.2\n", "\n", "vocab_size = 20000 # Max number of different word, i.e. model input dimension\n", "maxlen = 1000 # Max number of words kept at the end of each text" - ], - "execution_count": 5, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "830AVGaZBfnf", - "outputId": "1a80608b-b295-41c3-dc2f-bfbd701667d5" + "outputId": "33ecf1b4-c225-4bfe-d0f3-5912e1073879" }, - "source": [ - "train.columns" - ], - "execution_count": 6, "outputs": [ { "output_type": "execute_result", @@ -295,42 +341,40 @@ "Index(['sentence', 'sentiment', 'polarity'], dtype='object')" ] }, - "metadata": { - "tags": [] - }, + "metadata": {}, "execution_count": 6 } + ], + "source": [ + "train.columns" ] }, { "cell_type": "code", + "execution_count": 7, "metadata": { "id": "FJo_FLISBhx6" }, + "outputs": [], "source": [ "train_texts = train['sentence'].values\n", "train_labels = train['polarity'].values\n", "test_texts = test['sentence'].values\n", "# test_labels = test['polarity'].values\n", "\n", - "labels_index = {'pos':1, 'neg':0} " - ], - "execution_count": 7, - "outputs": [] + "labels_index = {'pos':1, 'neg':0}" + ] }, { "cell_type": "code", + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rZ1G3DH3dDQ4", - "outputId": "6aee306f-91e4-45a3-fae1-db00d530ff2f" + "outputId": "4fba11fb-6daa-48a8-8281-03fc1c88cdf7" }, - "source": [ - "test.columns" - ], - "execution_count": 8, "outputs": [ { "output_type": "execute_result", @@ -339,40 +383,39 @@ "Index(['sentence', 'sentiment', 'polarity'], dtype='object')" ] }, - "metadata": { - "tags": [] - }, + "metadata": {}, "execution_count": 8 } + ], + "source": [ + "test.columns" ] }, { "cell_type": "code", + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "g8I6QgXldKd0", - "outputId": "e96585e8-3a61-45f1-8873-247b4b6afa13" + "outputId": "3381f56e-4032-4f75-c715-74508799c083" }, - "source": [ - "test_labels = test['polarity'].values\n", - "test_labels" - ], - "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "array([0, 0, 1, ..., 0, 0, 1])" + "array([0, 0, 1, ..., 1, 1, 0])" ] }, - "metadata": { - "tags": [] - }, + "metadata": {}, "execution_count": 9 } + ], + "source": [ + "test_labels = test['polarity'].values\n", + "test_labels" ] }, { @@ -393,9 +436,20 @@ }, { "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "yPj2uXzFKnaC" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, "metadata": { "id": "ibekacAMMTsr" }, + "outputs": [], "source": [ "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", @@ -404,53 +458,51 @@ "\n", "\n", "class TextsToSequences(Tokenizer, BaseEstimator, TransformerMixin):\n", - " \"\"\" Sklearn transformer to convert texts to indices list \n", + " \"\"\" Sklearn transformer to convert texts to indices list\n", " (e.g. [[\"the cute cat\"], [\"the dog\"]] -> [[1, 2, 3], [1, 4]])\"\"\"\n", " def __init__(self, **kwargs):\n", " super().__init__(**kwargs)\n", - " \n", + "\n", " def fit(self, texts, y=None):\n", " self.fit_on_texts(texts)\n", " return self\n", - " \n", + "\n", " def transform(self, texts, y=None):\n", " return np.array(self.texts_to_sequences(texts))\n", - " \n", + "\n", "sequencer = TextsToSequences(num_words=vocab_size)\n", "\n", "\n", "\n", "\n", "class Padder(BaseEstimator, TransformerMixin):\n", - " \"\"\" Pad and crop uneven lists to the same length. \n", + " \"\"\" Pad and crop uneven lists to the same length.\n", " Only the end of lists longernthan the maxlen attribute are\n", " kept, and lists shorter than maxlen are left-padded with zeros\n", - " \n", + "\n", " Attributes\n", " ----------\n", " maxlen: int\n", " sizes of sequences after padding\n", " max_index: int\n", - " maximum index known by the Padder, if a higher index is met during \n", + " maximum index known by the Padder, if a higher index is met during\n", " transform it is transformed to a 0\n", " \"\"\"\n", " def __init__(self, maxlen=500):\n", " self.maxlen = maxlen\n", " self.max_index = None\n", - " \n", + "\n", " def fit(self, X, y=None):\n", " self.max_index = pad_sequences(X, maxlen=self.maxlen).max()\n", " return self\n", - " \n", + "\n", " def transform(self, X, y=None):\n", " X = pad_sequences(X, maxlen=self.maxlen)\n", " X[X > self.max_index] = 0\n", " return X\n", "\n", "padder = Padder(maxlen)" - ], - "execution_count": 10, - "outputs": [] + ] }, { "cell_type": "markdown", @@ -463,19 +515,43 @@ }, { "cell_type": "code", + "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6XvXEYGBMWlW", - "outputId": "4ea00082-b2b0-4760-b083-77b033daa59b" + "outputId": "b8c2be15-f166-4975-daf2-341faf8e5826" }, + "outputs": [ + { + "metadata": { + "tags": null + }, + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:Layer lstm will not use cuDNN kernels since it doesn't meet the criteria. It will use a generic GPU kernel as fallback when running on GPU.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/2\n", + "782/782 [==============================] - 3287s 4s/step - loss: 0.4312 - accuracy: 0.8028\n", + "Epoch 2/2\n", + "782/782 [==============================] - 3149s 4s/step - loss: 0.2442 - accuracy: 0.9061\n" + ] + } + ], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", + "import tensorflow\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Embedding, Bidirectional, LSTM\n", - "from tensorflow.keras.wrappers.scikit_learn import KerasClassifier\n", + "from scikeras.wrappers import KerasClassifier\n", "from sklearn.pipeline import make_pipeline\n", "\n", "batch_size = 64\n", @@ -498,93 +574,98 @@ "\n", "# Use Keras Scikit-learn wrapper to instantiate a LSTM with all methods\n", "# required by Scikit-learn for the last step of a Pipeline\n", - "sklearn_lstm = KerasClassifier(build_fn=create_model, epochs=2, batch_size=32, \n", + "sklearn_lstm = KerasClassifier(build_fn=create_model, epochs=2, batch_size=32,\n", " max_features=max_features, verbose=1)\n", "\n", "# Build the Scikit-learn pipeline\n", "pipeline = make_pipeline(sequencer, padder, sklearn_lstm)\n", "\n", - "pipeline.fit(train_texts, train_labels);" - ], - "execution_count": 11, - "outputs": [ - { - "output_type": "stream", - "text": [ - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Call initializer instance with the dtype argument instead of passing it to the constructor\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Call initializer instance with the dtype argument instead of passing it to the constructor\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use tf.where in 2.0, which has the same broadcast rule as np.where\n", - "Epoch 1/2\n", - "25000/25000 [==============================] - 1951s 78ms/sample - loss: 0.4927 - acc: 0.7689\n", - "Epoch 2/2\n", - "25000/25000 [==============================] - 1925s 77ms/sample - loss: 0.3622 - acc: 0.8466\n" - ], - "name": "stdout" - } + "pipeline.fit(train_texts, train_labels)" ] }, { "cell_type": "code", + "execution_count": 12, "metadata": { + "id": "rTph3cZ2anzx", "colab": { "base_uri": "https://localhost:8080/" }, - "id": "rTph3cZ2anzx", - "outputId": "d469ca0d-836c-4911-a194-3f9b01253b94" + "outputId": "4354537f-f43c-495e-cac0-68bca332e755" }, - "source": [ - "y_preds = pipeline.predict(test_texts)" - ], - "execution_count": 12, "outputs": [ { "output_type": "stream", + "name": "stdout", "text": [ - "25000/25000 [==============================] - 201s 8ms/sample\n" - ], - "name": "stdout" + "782/782 [==============================] - 201s 257ms/step\n" + ] } + ], + "source": [ + "y_preds = pipeline.predict(test_texts)" ] }, { "cell_type": "code", + "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2KKnIf5BcnQn", - "outputId": "5f7f975d-d7da-4618-f63d-8f9ac3162c97" + "outputId": "c655c353-635e-4d82-f7b4-fa1c3d124a88" }, - "source": [ - "print('Test accuracy: {:.2f} %'.format(100*accuracy_score(y_preds, test_labels)))" - ], - "execution_count": 13, "outputs": [ { "output_type": "stream", + "name": "stdout", "text": [ - "Test accuracy: 79.89 %\n" - ], - "name": "stdout" + "Test accuracy: 86.52 %\n" + ] } + ], + "source": [ + "print('Test accuracy: {:.2f} %'.format(100*accuracy_score(y_preds, test_labels)))" ] }, { "cell_type": "code", + "execution_count": 16, "metadata": { + "id": "jd9mzgXrZ9ys", "colab": { "base_uri": "https://localhost:8080/", - "height": 477 + "height": 667 }, - "id": "jd9mzgXrZ9ys", - "outputId": "28ee9c4e-f38f-4b42-e7b2-b032230892b1" + "outputId": "5f53835a-ceff-4b9e-fa70-3ab0bcbb92ff" }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sample 11: last 1000 words (only part used by the model)\n", + "--------------------------------------------------\n", + "This film was such a mess I actually reimbursed my friends who I dragged to see it. The only reason I went to see it was that my friend was an apprentice editor on the shoot.

I'm sure that this film was meant to be campy, but the approach was so heavy-handed and self-reflexive it turned out really flat. Judd Nelson stars as an obsequious garbage man who is a hack comedian on the side. His life is hell and made worse by his obnoxious and overbearing companion Bill Paxton (who I feel embarrassed for - this was a really tasteless role for a talented actor). A freak accident alters Nelson's career course and mayhem ensues.

The attempts at humor were corny, predictable and often base and tasteless. Wayne Newton in the cast as a talent agent is a novelty but he adds nothing - comedically or otherwise.

Overall, it's a very weak and uncreative attempt at camp humor that goes over like a lead balloon. At least you could laugh AT Plan 9 From Outer Space. This one just makes you wonder who thought this was a good enough idea to finance and film. One of the all time worst bombs you'll ever witness.\n", + "--------------------------------------------------\n", + "1/1 [==============================] - 1s 1s/step\n", + "Probability(positive) = [0.990785 0.00921502]\n", + "True class: negative\n", + "157/157 [==============================] - 50s 313ms/step\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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eVN69Ogh1tbWkj9/filVqpS0atVKNm7cqPR59eqVDB8+XEqWLCkFChSQevXqSXBwcKpLHoiI/PHHH+Ls7KycUv/mJRTmzJkjpUqVElNTU6lXr56cOnUq3csmpFWriMiZM2ekXbt2UqxYMTE1NRU7Ozvp2LGj7N+/X0Ren5L/1VdfSbVq1aRIkSJSqFAhqVatmixevDjD5yhFbGysGBsbS5EiRSQxMVFpX7VqlQCQ7t27p7ncX3/9Jd7e3mJubi5mZmZSrlw56dWrl5w6dUrp89/LJoiIPH/+XPz8/MTS0lIKFy4sbdq0katXrwoAmTFjRqpl3zzFXuT/X0NvvieuXLkiDRs2lAIFCiivJbXPy/79+6VGjRpiYmIi5cqVk2XLlsnw4cPFzMxMp196l8e4fv268no9cuRImo+RmfdSeq+PlPd2WpfseFPK83jp0iXp0KGDFClSRIoWLSr+/v7y8uXLNJeZOXOmAJBp06ZluO43ZfR+TbkUwtsum5CerFw24V0us0Lp04hkwwxcojyqV69e2LhxY5qHkYj04ezZs6hRowZWrVqV6ZEMfWjTpg0uXryonOmYV82fPx9Dhw7FnTt3Up1dSB8WzqEiIsqlXr58mapt3rx5MDIy0plnpG//rfP69evYtWuXztcG5UUigp9//hkeHh4MU8Q5VEREudXMmTMRGhqKxo0bI1++fNi9ezd2796N/v37p7qOmj6VLVsWvXr1QtmyZXH37l388MMPMDExwciRI/VdWo54/vw5tm3bhr/++gt///03/vjjD32XRLkAAxURUS5Vt25d7N27F5MnT8azZ89QpkwZTJgwAaNHj9Z3aTqaN2+O33//HWFhYTA1NYW7uzumTZuW6gKZeUVkZCS6du0KCwsLfPPNN8r3O9KHjXOoiIiIiFTiHCoiIiIilRioiIiIiFTiHKr3IDk5GQ8fPkSRIkWyfDE+IiIier9EBE+fPoWNjU2qC87+FwPVe/Dw4cNcdUYOERERZd79+/d1vgUhLQxU70GRIkUAvP6FaLVaPVdDREREmREbGwtbW1tlP54RBqr3IOUwn1arZaAiIiIyMJmZrsNJ6UREREQqMVARERERqcRARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQq5dN3AWT47k2qou8SMlRm3N/6LoGIiPI4jlARERERqcRARURERKQSAxURERGRSgYXqBYtWgR7e3uYmZnBzc0NJ06cyLD/hg0b4OjoCDMzM1SpUgW7du3SuX/z5s1o1qwZihUrBo1Gg7Nnz6Zax6tXr+Dn54dixYqhcOHCaN++PcLDw7Nzs4iIiMiAGVSgWrduHYYNG4bx48fj9OnTqFatGry9vREREZFm/2PHjqFLly7w9fXFmTNn0KZNG7Rp0wYXLlxQ+jx//hz169fHt99+m+7jDh06FNu3b8eGDRtw8OBBPHz4EO3atcv27SMiIiLDpBER0XcRmeXm5oZatWph4cKFAIDk5GTY2tpi4MCBCAgISNW/U6dOeP78OXbs2KG01alTB9WrV8eSJUt0+t65cwcODg44c+YMqlevrrTHxMSgePHiWLNmDTp06AAAuHLlCpycnBAcHIw6deq8te7Y2FiYm5sjJiYGWq02K5ueq/EsPyIiyoveZf9tMCNU8fHxCA0NhZeXl9JmZGQELy8vBAcHp7lMcHCwTn8A8Pb2Trd/WkJDQ5GQkKCzHkdHR5QpUybd9cTFxSE2NlbnRkRERHmXwQSqR48eISkpCSVKlNBpL1GiBMLCwtJcJiws7J36p7cOExMTWFhYZHo906dPh7m5uXKztbXN9OMRERGR4TGYQGVIRo0ahZiYGOV2//59fZdEREREOchgrpT+0UcfwdjYONXZdeHh4bC2tk5zGWtr63fqn9464uPjER0drTNKldF6TE1NYWpqmunHICIiIsNmMCNUJiYmcHFxwf79+5W25ORk7N+/H+7u7mku4+7urtMfAPbu3Ztu/7S4uLggf/78Ouu5evUq7t27907rISIiorzLYEaoAGDYsGHo2bMnXF1dUbt2bcybNw/Pnz9H7969AQA9evRAqVKlMH36dADA4MGD4eHhgTlz5qBly5ZYu3YtTp06haVLlyrrjIqKwr179/Dw4UMAr8MS8HpkytraGubm5vD19cWwYcNgaWkJrVaLgQMHwt3dPVNn+BEREVHeZ1CBqlOnToiMjMS4ceMQFhaG6tWrIzAwUJl4fu/ePRgZ/f+gW926dbFmzRqMGTMG33zzDSpUqICtW7eicuXKSp9t27YpgQwAOnfuDAAYP348JkyYAACYO3cujIyM0L59e8TFxcHb2xuLFy9+D1tMREREhsCgrkNlqHgdKv3idaiIiCgr8uR1qIiIiIhyKwYqIiIiIpUYqIiIiIhUYqAiIiIiUsmgzvIjog/DwuHb9V1CuvznfKrvEogoF+IIFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQqMVARERERqcRARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQqMVARERERqcRARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQqGVygWrRoEezt7WFmZgY3NzecOHEiw/4bNmyAo6MjzMzMUKVKFezatUvnfhHBuHHjULJkSRQoUABeXl64fv26Th97e3toNBqd24wZM7J924iIiMgwGVSgWrduHYYNG4bx48fj9OnTqFatGry9vREREZFm/2PHjqFLly7w9fXFmTNn0KZNG7Rp0wYXLlxQ+sycORMLFizAkiVLEBISgkKFCsHb2xuvXr3SWdekSZPw77//KreBAwfm6LYSERGR4TCoQPXdd9+hX79+6N27N5ydnbFkyRIULFgQy5cvT7P//Pnz0bx5c3z11VdwcnLC5MmTUbNmTSxcuBDA69GpefPmYcyYMfjss89QtWpVrFy5Eg8fPsTWrVt11lWkSBFYW1srt0KFCuX05hIREZGBMJhAFR8fj9DQUHh5eSltRkZG8PLyQnBwcJrLBAcH6/QHAG9vb6X/7du3ERYWptPH3Nwcbm5uqdY5Y8YMFCtWDDVq1MCsWbOQmJiYbq1xcXGIjY3VuREREVHelU/fBWTWo0ePkJSUhBIlSui0lyhRAleuXElzmbCwsDT7h4WFKfentKXXBwAGDRqEmjVrwtLSEseOHcOoUaPw77//4rvvvkvzcadPn46JEye+2wYSERGRwTKYQKVPw4YNU/5ftWpVmJiY4IsvvsD06dNhamqaqv+oUaN0lomNjYWtre17qZWIiIjeP4M55PfRRx/B2NgY4eHhOu3h4eGwtrZOcxlra+sM+6f8+y7rBAA3NzckJibizp07ad5vamoKrVarcyMiIqK8y2AClYmJCVxc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LcO+cXFxiI2N1bkRERFR3mUQgSosLAxWVlY6bfny5YOlpSXCwsLSXcbExAQWFhY67SVKlEh3mbQULlwYc+bMwYYNG7Bz507Ur18fbdq0yTBUTZ8+Hebm5srN1tY2049HREREhkevgSogICDNCd9v3q5cuaLPEvHRRx9h2LBhcHNzQ61atTBjxgx069YNs2bNSneZUaNGISYmRrndv3//PVZMRERE75te51ANHz4cvXr1yrBP2bJlYW1tjYiICJ32xMREREVFpTuvydraGvHx8YiOjtYZpQoPD1c9F8rNzQ179+5N935TU1OYmpqqegwiIiIyHHoNVMWLF0fx4sXf2s/d3R3R0dEIDQ1Vzq47cOAAkpOT4ebmluYyLi4uyJ8/P/bv34/27dsDAK5evYp79+7B3d1dVd1nz55FyZIlVa2DiIiI8g6DOMvPyckJzZs3R79+/bBkyRIkJCTA398fnTt3Vs7we/DgATw9PbFy5UrUrl0b5ubm8PX1xbBhw2BpaQmtVouBAwfC3d1dOcMPAG7cuIFnz54hLCwML1++xNmzZwEAzs7OMDExwa+//goTExPUqFEDALB582YsX74cy5Yte+/PAxEREeVOBhGoAGD16tXw9/eHp6cnjIyM0L59e+WSBwCQkJCAq1ev4sWLF0rb3Llzlb5xcXHw9vbG4sWLddbbt29fHDx4UPk5JTjdvn0b9vb2AIDJkyfj7t27yJcvHxwdHbFu3Tp06NAhB7eWiIiIDIlGRETfReR1sbGxMDc3R0xMDLRardLu8tVKPVb1dqGzeui7BCIiIr1Jb/+dFoO4bAIRERFRbsZARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQqMVARERERqcRARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoMVEREREQqMVARERERqcRARURERKQSAxURERGRSgxURERERCoxUBERERGpxEBFREREpBIDFREREZFKDFREREREKjFQEREREanEQEVERESkEgMVERERkUoGE6iioqLg4+MDrVYLCwsL+Pr64tmzZxku8+rVK/j5+aFY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\n" + }, + "metadata": {} + } + ], "source": [ "# We choose a sample from test set\n", "idx = 11\n", @@ -595,7 +676,7 @@ "print('-'*50)\n", "print(\" \".join(text_sample.split()[-1000:]))\n", "print('-'*50)\n", - "print('Probability(positive) =', pipeline.predict_proba([text_sample])[0,1])\n", + "print('Probability(positive) =', pipeline.predict_proba([text_sample]))\n", "print('True class: %s' % class_names[test_labels[idx]])\n", "\n", "\n", @@ -615,36 +696,6 @@ "sns.barplot(x=\"words\", y=\"weights\", data=lime_weights);\n", "plt.xticks(rotation=45)\n", "plt.title('Sample {} features weights given by LIME'.format(idx));" - ], - "execution_count": 14, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Sample 11: last 1000 words (only part used by the model)\n", - "--------------------------------------------------\n", - "I had the privilege of being one of the Still photographers on the set of \"Grand Champion\" and enjoyed every minute of the 42 days I worked on the movie. I have been in the Photography business for 25 years and have worked on 16 movies and I can't think of a time when I enjoyed providing my craft more. The Kids were wonderful to work with and little Emma Roberts has so much energy she's a real trip. She even grabbed one of my camera during the stockshow scene rehearsal and started shooting. Some of her images were used for PR. I could have made more money working for a production with a bigger budget but I doubt I would have had the fun and been around so many great actors and the great people of West Texas as I was.\n", - "--------------------------------------------------\n", - "\r1/1 [==============================] - 0s 125ms/sample\n", - "Probability(positive) = 0.43980047\n", - "True class: positive\n", - "5000/5000 [==============================] - 40s 8ms/sample\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [], - "needs_background": "light" - } - } ] }, { @@ -656,6 +707,40 @@ "We have used the LIME interpretation to provide explanations for a recurrent neural network. Looking at the graph we understand that the sentence is negative and the word \"worst\" affects it the most.\n", "\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "utxsReF5N8NX" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "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.13" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } \ No newline at end of file