diff --git a/models/RedditEngagement.ipynb b/models/RedditEngagement.ipynb index f95bf54..c68b57a 100644 --- a/models/RedditEngagement.ipynb +++ b/models/RedditEngagement.ipynb @@ -1,3678 +1,1037 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "RedditEngagement.ipynb", - "version": "0.3.2", - "views": {}, - "default_view": {}, - "provenance": [], - "collapsed_sections": [], - "last_runtime": { - "build_target": "", - "kind": "local" - } - } - }, "cells": [ { "metadata": { - "id": "G8vQ713RmNxM", - "colab_type": "text" + "_cell_guid": "5ae57a08-b3c1-4da1-a2a4-f80316323365", + "_uuid": "963a235008f6f1059420277ede200f813e87ed1d", + "colab_type": "text", + "id": "G8vQ713RmNxM" }, "cell_type": "markdown", - "source": [ - "# Reddit Community Engagement\n", - "\n", - "\n" - ] + "source": "# Predicting Community Engagement on Reddit" }, { "metadata": { - "id": "PmKLeDScYznR", - "colab_type": "text" + "_cell_guid": "150ecbe0-719c-473b-b320-c708621045b8", + "_uuid": "8c2cff0c4f9858f13bbf2bc4f9fb77927054bec8", + "colab_type": "text", + "id": "BgEjnpQHZsiy" }, "cell_type": "markdown", - "source": [ - "## Define Constants and Global Variables" - ] + "source": "This is the companion notebook to the 3-part blog series on the Google Big Data & Machine Learning blog *\"Predicting community engagement on Reddit using TensorFlow, GDELT, and Cloud Dataflow\"* by [datancoffee](https://medium.com/@datancoffee)\n\n* [Part 1](https://cloud.google.com/blog/big-data/2018/03/predicting-community-engagement-on-reddit-using-tensorflow-gdelt-and-cloud-dataflow-part-1)\n* [Part 2](https://cloud.google.com/blog/big-data/2018/03/predicting-community-engagement-on-reddit-using-tensorflow-gdelt-and-cloud-dataflow-part-2)\n* [Part 3](https://cloud.google.com/blog/big-data/2018/03/predicting-community-engagement-on-reddit-using-tensorflow-gdelt-and-cloud-dataflow-part-3)\n\n### Getting Started\n\nYou can run this notebook either in [Colab](https://colab.research.google.com/) or in [Kaggle](https://www.kaggle.com/). \n\n\n#### Running in Colab\n\nSet the following variable to True in the \"Define Constants and Global Variables\" code cell\n\n `current_run_in_colab=True`\n\n\nDecide if you want to get the training data from the [datancoffee](https://bigquery.cloud.google.com/dataset/datancoffee:discussion_opinions?pli=1) BigQuery dataset or from snapshot CSV files. At present time only Colab allows you accessing the datancoffee BigQuery dataset. To get training data from BigQuery, set the following variable to True in the \"Define Constants and Global Variables\" code cell\n\n `current_read_from_bq=True`\n\nTo get training data from snapshot files, verify that this variable is set to False . By default it is set to False.\n\n `current_read_from_bq=False # this is the default value`\n\nPrior to running the notebook, download and setup the snapshot files.\n\n##### Getting the snapshot dataset\n\nDownload the [reddit-ds.zip](https://github.com/GoogleCloudPlatform/dataflow-opinion-analysis/blob/master/models/data/reddit-ds.zip) snapshot file achive from github repository\n\nUnzip the archive and move its contents to the `input_dir` directory. \nBy default, the `input_dir` directory is set to `./tfprojects/results`. This path is relative to where the Jupyter process was started. If you prefer to set an absolute path (e.g. if you are having issues locating this directory), change the `INPUT_DIR_PREFERENCE` variable, and `input_dir` will be adjusted to that location. \nThe archive contains 3 files:\n* reddit-ds-CommentsClassification-IncludeAuto.csv\n* reddit-ds-MlbSubredditClassification-ExcludeAuto.csv\n* reddit-ds-SubredditClassification-ExcludeAuto.csv\n\n#### Running in Kaggle\n\nThis notebook is available as a Kaggle [kernel](https://www.kaggle.com/datancoffee/predicting-community-engagement-on-reddit/).\n\nVerify that the following 2 variables are set to False in the \"Define Constants and Global Variables\" code cell\n\n`current_run_in_colab=False`
\n`current_read_from_bq=False`\n\nThe snapshot [dataset](https://www.kaggle.com/datancoffee/predicting-reddit-community-engagement-dataset) is available in Kaggle, and is packaged with the prediction kernel. You don't have to download and set it up.\n\n\n\n#### Run the model \nExecute all code cells in this notebook, either all at once, or one by one, and observe the various outputs of the model.\n\n\n### Tips and Tricks\n\n#### Run in Kaggle with GPUs\nRunning with GPUs really makes the difference in execution time. Training runs are ~20s vs ~400s with regular CPUs.\n\n#### Improving model accuracy\nThe number of data points in the full Reddit dataset is large, so memory is important. The `current_sample_frac` variable controls the fraction of the input dataset that will be sampled and then divided in training, test and validation subsets. The default settings in the notebook have been selected to run in the publicly hosted versions of Kaggle and Colab. For SubredditClassification goal the setting is current_sample_frac = 0.5 and for the CommentsClassification goal the setting is current_sample_frac = 0.25.\n\nNote that this is about half of what we used in our 3-part blog series.\n\nKaggle gives 6.5GB of memory when running with GPUs. To run the model with more accuracy, self-host the model in an environment with 30-40GB of available memory. In this case you can set current_sample_frac = 0.99 for SubredditClassification and current_sample_frac = 0.5 (or higher) for CommentsClassification.\n\n#### Keras model graphs\nIn Kaggle, to see the Keras model graphs, make sure that the Docker image has the following packages installed: pydot, graphviz. The notebook will handle their absence gracefully, but you won't see the model graphs if they are not installed.\n\n" }, { "metadata": { - "id": "1NM9WQJbYt2d", - "colab_type": "code", + "_cell_guid": "64504238-87c2-4b89-8dfc-f96f45389a45", + "_uuid": "2ab35d4c6491354efdc2c712d442b9a59d5cc7a7", + "colab_type": "text", + "id": "PmKLeDScYznR" + }, + "cell_type": "markdown", + "source": "## Define Constants and Global Variables" + }, + { + "metadata": { + "_cell_guid": "e9c01df6-9083-4aa4-9a49-89e03d81c349", + "_uuid": "ad7b7532ce89b6abcd7f81ab7e88890af730f90b", + "cellView": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, - "cellView": "code" + "colab_type": "code", + "collapsed": true, + "id": "1NM9WQJbYt2d", + "trusted": true }, "cell_type": "code", - "source": [ - "\n", - "import math\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import tensorflow.google as tf\n", - "import collections\n", - "import tempfile\n", - "import shutil\n", - "import time\n", - "import itertools\n", - "\n", - "from IPython import display\n", - "from google3.pyglib import gfile\n", - "from datetime import datetime\n", - "\n", - "\n", - "# Fraction of the read dataframe to use for learning\n", - "current_sample_frac=0.99 #@param\n", - "# Fraction of the ML sample to use for test\n", - "TEST_FRAC=0.20 #@param\n", - "\n", - "\n", - "# Options: SubredditClassification, MlbSubredditClassification, CommentsRegression, CommentsClassification\n", - "current_learning_goal = 'SubredditClassification'\n", - "current_label_col=''\n", - "current_feature_cols=''\n", - "\n", - "EXAMPLE_WEIGHT_COL = 'ExampleWeight'\n", - "\n", - "# Add Url and PostId columns so that we can evaluate the quality of our predictions\n", - "URL_COL = 'Url'\n", - "REDDIT_POSTURL_COL = 'RedditPostUrl'\n", - "URL_LIST_COL = 'UrlList'\n", - "REDDIT_POSTURL_LIST_COL = 'RedditPostUrlList'\n", - "\n", - "EMB_DIM_K = 2\n", - "\n", - "# Should training runs reuse model directory checkpoints, or restart\n", - "RESTART_TRAINING=True #@param\n", - "ENABLE_SAVE_TOFILES=True #@param \n", - "\n", - "# Set preferences for outputs, or leave '' empty for defaults\n", - "OUTPUT_DIR_PREFERENCE='./tfprojects' # if set to '' will create subdir under /tmp\n", - "RESULTS_DIR_PREFERENCE='' # if set to '' will create subdir under output_dir\n", - "\n", - "\n", - "\"\"\"\n", - "Options for current_label_col: \n", - " Subreddit or RedditSubmitter (for SubredditClassification), \n", - " SubredditList (for MlbSubredditClassification),\n", - " NumCommentersLogScaled (for CommentsRegression), \n", - " NumCommentersBin, NumCommentsBin, ScoreBin (for CommentsClassification)\n", - "\"\"\"\n", - "\n", - "def set_columns_for_goal():\n", - " \n", - " global current_label_col, current_feature_cols\n", - " \n", - " if current_learning_goal=='SubredditClassification':\n", - " current_label_col = 'Subreddit'\n", - " elif current_learning_goal=='MlbSubredditClassification':\n", - " current_label_col = 'SubredditList'\n", - " elif current_learning_goal=='CommentsRegression':\n", - " current_label_col = 'NumCommentersLogScaled'\n", - " elif current_learning_goal=='CommentsClassification':\n", - " current_label_col = 'ScoreBin'\n", - " else:\n", - " current_label_col = 'Subreddit'\n", - "\n", - "\n", - "\n", - " if current_learning_goal==\"SubredditClassification\":\n", - " current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", EXAMPLE_WEIGHT_COL]\n", - " elif current_learning_goal==\"MlbSubredditClassification\":\n", - " current_feature_cols = [URL_LIST_COL, REDDIT_POSTURL_LIST_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitterList\", EXAMPLE_WEIGHT_COL] \n", - " elif current_learning_goal==\"CommentsRegression\":\n", - " current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", EXAMPLE_WEIGHT_COL]\n", - " elif current_learning_goal==\"CommentsClassification\":\n", - " current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", \"NumCommentersBin\", \"ScoreBin\", EXAMPLE_WEIGHT_COL]\n", - " else:\n", - " current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", EXAMPLE_WEIGHT_COL]\n", - "\n", - " print('Building model with learning goal: %s, using label column: %s, using feature columns: %s' % (current_learning_goal,current_label_col,current_feature_cols))\n", - "\n", - " return\n", - "\n", - "\n", - " \n", - "\n" - ], - "execution_count": 0, + "source": "import math\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport collections\nimport tempfile\nimport shutil\nimport time\nimport itertools\nimport os\n\n\nfrom IPython import display\nfrom datetime import datetime\n\n# Will this notebook be run in Colab or Kaggle?\ncurrent_run_in_colab=False\n\n# What is the source of training data? BigQuery or snapshot CSV files\ncurrent_read_from_bq=False\n\n# Fraction of the input dataframe to use for learning (training, validation and test)\ncurrent_sample_frac=0.50 #@param\n# Fraction of the sample to use for test\nTEST_FRAC=0.20 #@param\n\n# What are we trying to do in the model?\n# Options: SubredditClassification, MlbSubredditClassification, CommentsRegression, CommentsClassification\ncurrent_learning_goal = 'SubredditClassification'\n\n# What are our label and feature columns in the input dataset\ncurrent_label_col=''\ncurrent_feature_cols=''\n\n# Special columns in our dataset\nEXAMPLE_WEIGHT_COL = 'ExampleWeight'\nURL_COL = 'Url'\nREDDIT_POSTURL_COL = 'RedditPostUrl'\nURL_LIST_COL = 'UrlList'\nREDDIT_POSTURL_LIST_COL = 'RedditPostUrlList'\n\n# What is the K parameter for embeddings\nEMB_DIM_K = 2\n\n# Should training runs reuse model directory checkpoints, or restart\nRESTART_TRAINING=True #@param\nENABLE_SAVE_TOFILES=False #@param \n\n# Set preferences for outputs, or leave '' empty for defaults\nOUTPUT_DIR_PREFERENCE='./tfprojects' # if set to '' will create subdir under /tmp\nRESULTS_DIR_PREFERENCE='' # if set to '' will create subdir under output_dir\nif current_run_in_colab==True:\n INPUT_DIR_PREFERENCE='' # if set to '', will set to results_dir\nelse: \n INPUT_DIR_PREFERENCE='../input/reddit-ds/' # in Kaggle, files will be available under /input\n\n\n\"\"\"\nOptions for current_label_col: \n Subreddit or RedditSubmitter (for SubredditClassification), \n SubredditList (for MlbSubredditClassification),\n NumCommentersLogScaled (for CommentsRegression), \n NumCommentersBin, NumCommentsBin, ScoreBin (for CommentsClassification)\n\"\"\"\n\ndef set_columns_for_goal():\n \n global current_label_col, current_feature_cols\n \n if current_learning_goal=='SubredditClassification':\n current_label_col = 'Subreddit'\n elif current_learning_goal=='MlbSubredditClassification':\n current_label_col = 'SubredditList'\n elif current_learning_goal=='CommentsRegression':\n current_label_col = 'NumCommentersLogScaled'\n elif current_learning_goal=='CommentsClassification':\n current_label_col = 'ScoreBin'\n else:\n current_label_col = 'Subreddit'\n\n\n\n if current_learning_goal==\"SubredditClassification\":\n current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", EXAMPLE_WEIGHT_COL]\n elif current_learning_goal==\"MlbSubredditClassification\":\n current_feature_cols = [URL_LIST_COL, REDDIT_POSTURL_LIST_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitterList\", EXAMPLE_WEIGHT_COL] \n elif current_learning_goal==\"CommentsRegression\":\n current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", EXAMPLE_WEIGHT_COL]\n elif current_learning_goal==\"CommentsClassification\":\n current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", \"NumCommentersBin\", \"ScoreBin\", EXAMPLE_WEIGHT_COL]\n else:\n current_feature_cols = [URL_COL, REDDIT_POSTURL_COL,\"Domain\", \"Tags\", \"BOWEntitiesEncoded\", \"RedditSubmitter\", \"Subreddit\", EXAMPLE_WEIGHT_COL]\n\n print('Building model with learning goal: %s, using label column: %s, using feature columns: %s' % (current_learning_goal,current_label_col,current_feature_cols))\n\n return\n\n\n \n\n", + "execution_count": null, "outputs": [] }, { "metadata": { - "id": "23UZZozMi_iz", - "colab_type": "text" + "_cell_guid": "5f97e0f7-a1a4-4086-bb8c-a515a051299a", + "_uuid": "35ffabd31db1759aa53000cdecd6a1e77f3b829a", + "colab_type": "text", + "id": "23UZZozMi_iz" }, "cell_type": "markdown", - "source": [ - "## Define util functions" - ] + "source": "## Define util functions" }, { "metadata": { - "id": "zLrd3M2cjELf", - "colab_type": "code", + "_cell_guid": "2ea774c0-d81d-4675-a620-303bc87a6042", + "_uuid": "79cb5b2e6da8f9c233414a1503108f050b43b646", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - { - "item_id": 1 - } - ], - "height": 70 + "height": 88 }, - "outputId": "5af2acd4-fe7c-4f33-cca0-2b1a9c17c9ac", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 200, "status": "ok", - "timestamp": 1519084774495, - "user_tz": 480, - "elapsed": 177, + "timestamp": 1525651228680, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "zLrd3M2cjELf", + "outputId": "7ff2281a-279e-46f6-bdd0-bca6a196a186", + "trusted": true }, "cell_type": "code", - "source": [ - "\n", - "\"\"\"\n", - "Create temp directories for outputs\n", - "\"\"\"\n", - "\n", - "def create_output_dirs():\n", - " if OUTPUT_DIR_PREFERENCE=='':\n", - " output_dir = tempfile.mkdtemp()\n", - " else:\n", - " output_dir = OUTPUT_DIR_PREFERENCE\n", - " #run_id = datetime.fromtimestamp(time.time()).strftime('%Y%m%d-%H%M') \n", - " \n", - " if RESULTS_DIR_PREFERENCE=='':\n", - " results_dir = os.path.join(output_dir, 'results')\n", - " else:\n", - " results_dir = RESULTS_DIR_PREFERENCE\n", - " \n", - " tb_log_dir = clean_tb_log_dir(output_dir)\n", - " \n", - " return (output_dir,results_dir, tb_log_dir)\n", - "\n", - "def clean_model_dir():\n", - " model_dir = os.path.join(output_dir, 'model')\n", - " if RESTART_TRAINING==True:\n", - " shutil.rmtree(model_dir, ignore_errors=True)\n", - " os.makedirs(model_dir)\n", - " else:\n", - " os.makedirs(model_dir)\n", - " return model_dir\n", - "\n", - "def clean_tb_log_dir(output_dir):\n", - " tb_log_dir = os.path.join(output_dir, 'tb_log_dir')\n", - " shutil.rmtree(tb_log_dir, ignore_errors=True)\n", - " os.makedirs(tb_log_dir)\n", - " return tb_log_dir\n", - "\n", - " \n", - "\"\"\"\n", - "Define some basic file I/O ops\n", - "\"\"\"\n", - "\n", - "def log_dataframe(df, name):\n", - " if ENABLE_SAVE_TOFILES: \n", - " df.to_csv(gfile.GFile(os.path.join(results_dir,name+'.csv'), 'w'), encoding='utf-8', index_label='dataframe_idx')\n", - "\n", - "def load_raw_dataframe(path):\n", - " # Load it into a pandas dataframe\n", - " df = pd.read_csv(gfile.Open(path), names=types.keys(), dtype=types, na_values=\"?\", header=0)\n", - " print(\"Size of dataframe: \" + str(len(df.index)) + \" records\") \n", - " \n", - " return df \n", - "\n", - "(output_dir, results_dir, tb_log_dir) = create_output_dirs()\n", - "\n", - "print(\"Location of output (model etc) files: %s \" % output_dir)\n", - "print(\"Location of Tensorboard log files: %s \" % tb_log_dir)\n", - "print(\"Location of results files: %s\" % results_dir)\n" - ], - "execution_count": 2, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Location of output (model etc) files: ./tfprojects \n", - "Location of Tensorboard log files: ./tfprojects/tb_log_dir \n", - "Location of results files: ./tfprojects/results\n" - ], - "name": "stdout" - } - ] + "source": "\n\"\"\"\nCreate temp directories for outputs\n\"\"\"\n\ndef create_dirs():\n if OUTPUT_DIR_PREFERENCE=='':\n output_dir = tempfile.mkdtemp()\n else:\n output_dir = OUTPUT_DIR_PREFERENCE\n #run_id = datetime.fromtimestamp(time.time()).strftime('%Y%m%d-%H%M') \n \n if RESULTS_DIR_PREFERENCE=='':\n results_dir = os.path.join(output_dir, 'results')\n else:\n results_dir = RESULTS_DIR_PREFERENCE\n \n if INPUT_DIR_PREFERENCE=='':\n input_dir = results_dir\n else:\n input_dir = INPUT_DIR_PREFERENCE\n \n tb_log_dir = clean_tb_log_dir(output_dir)\n \n return (output_dir,input_dir,results_dir, tb_log_dir)\n\ndef clean_model_dir():\n model_dir = os.path.join(output_dir, 'model')\n if RESTART_TRAINING==True:\n shutil.rmtree(model_dir, ignore_errors=True)\n os.makedirs(model_dir)\n else:\n os.makedirs(model_dir)\n return model_dir\n\ndef clean_tb_log_dir(output_dir):\n tb_log_dir = os.path.join(output_dir, 'tb_log_dir')\n shutil.rmtree(tb_log_dir, ignore_errors=True)\n os.makedirs(tb_log_dir)\n return tb_log_dir\n\n \n\"\"\"\nDefine some basic file I/O ops\n\"\"\"\n\ndef current_dataset_filename(prefix):\n res = prefix + '-' + current_learning_goal + '-' + ('ExcludeAuto' if current_exclude_autosubreddits else 'IncludeAuto')\n return res\n \n\ndef log_dataframe(df, name):\n if ENABLE_SAVE_TOFILES: \n df.to_csv(os.path.join(results_dir,name+'.csv'), encoding='utf-8', index_label='dataframe_idx')\n\ndef load_raw_dataframe(path, col_names, col_types):\n # Load it into a pandas dataframe\n df = pd.read_csv(path, index_col='dataframe_idx', dtype=col_types, header=0).fillna('')\n print(\"Size of dataframe: \" + str(len(df.index)) + \" records\") \n\n return df \n\n(output_dir, input_dir, results_dir, tb_log_dir) = create_dirs()\n\nprint(\"Location of output (model etc) files: %s \" % output_dir)\nprint(\"Location of input files: %s \" % input_dir)\nprint(\"Location of Tensorboard log files: %s \" % tb_log_dir)\nprint(\"Location of results files: %s\" % results_dir)\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "qC6s1Lq8a21s", - "colab_type": "text" + "_cell_guid": "88c97d86-9de3-4cfe-ba52-c97111fd55a4", + "_uuid": "37cdeba0e08afdcedf4857d424267298f53cb558", + "colab_type": "text", + "id": "qC6s1Lq8a21s" }, "cell_type": "markdown", - "source": [ - "## Get training data from BigQuery" - ] + "source": "## Get training data from BigQuery or CSV files" }, { "metadata": { - "id": "19_mfqZB5NRl", - "colab_type": "code", + "_cell_guid": "78a45cb0-74e3-4cf7-b010-8a6a21ad6121", + "_uuid": "0d1335aefd583a46ad4f1406d9262c91f3a491fe", + "cellView": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, - "cellView": "code" + "colab_type": "code", + "collapsed": true, + "id": "19_mfqZB5NRl", + "trusted": true }, "cell_type": "code", - "source": [ - "from colabtools import bigquery\n", - "\n", - "PROJECT_ID = 'datancoffee' #@param\n", - "\n", - "bqclient = bigquery.Create(project_id=PROJECT_ID) \n", - "current_exclude_autosubreddits = True\n", - " \n", - "def get_bq_data_for_goal():\n", - "\n", - " query = '''\n", - " WITH \n", - " s1 AS ( -- Create matches btw reddit and gdelt\n", - " SELECT \n", - " nwr.DocumentHash,\n", - " ARRAY_AGG(DISTINCT nwr.Url) AS MatchedUrls,\n", - " ARRAY_AGG(DISTINCT nwr.WebResourceHash) AS MatchedNWRs,\n", - " ARRAY_AGG(DISTINCT rwr.WebResourceHash) AS MatchedRWRs, \n", - " COUNT(*) AS cnt\n", - " FROM discussion_opinions.webresource rwr \n", - " INNER JOIN news_opinions.webresource nwr ON nwr.Url = rwr.MetaFields[SAFE_OFFSET(0)]\n", - " WHERE \n", - " rwr.MetaFields[SAFE_OFFSET(0)] <> 'unavailable' -- 0-index metafield contains external URL\n", - " AND nwr._PARTITIONTIME BETWEEN TIMESTAMP('2017-06-01') AND TIMESTAMP('2017-09-30') \n", - " AND rwr._PARTITIONTIME BETWEEN TIMESTAMP('2017-06-01') AND TIMESTAMP('2017-09-30') \n", - " GROUP BY 1\n", - " ORDER BY 5 DESC\n", - " )\n", - " -- SELECT * FROM s1 LIMIT 1000\n", - " -- SELECT COUNT(*) FROM s1 -- 200265\n", - " , s2a AS (\n", - " SELECT nd.DocumentHash, \n", - " nd.PublicationTime AS NewsPubTime, \n", - " nd.Author AS NewsAuthor, \n", - " ARRAY_AGG(REGEXP_REPLACE(tag.Tag,\"[ | [:punct:]]\",\"_\")) AS TagArray \n", - " FROM s1\n", - " INNER JOIN news_opinions.document nd ON nd.DocumentHash = s1.DocumentHash, UNNEST(nd.Tags) AS tag\n", - " GROUP BY 1,2,3\n", - " )\n", - " , s2b AS (\n", - " SELECT tag, COUNT(DISTINCT DocumentHash) cnt FROM s2a, UNNEST(s2a.TagArray) AS tag \n", - " GROUP BY 1 HAVING COUNT(DISTINCT DocumentHash) >= 3\n", - " )\n", - " -- SELECT COUNT(*) FROM s2b -- 52264\n", - " , s2c AS (\n", - " SELECT DocumentHash, tag2 AS Tag\n", - " FROM s2a, UNNEST(s2a.TagArray) AS tag2\n", - " INNER JOIN s2b ON s2b.tag = tag2\n", - " )\n", - " , s2 AS (\n", - " SELECT s2a.DocumentHash, \n", - " s2a.NewsPubTime, \n", - " s2a.NewsAuthor,\n", - " ARRAY_TO_STRING(ARRAY_AGG(s2c.Tag),\" \") AS Tags\n", - " FROM s2a\n", - " LEFT OUTER JOIN s2c ON s2c.DocumentHash = s2a.DocumentHash\n", - " GROUP BY 1,2,3\n", - " )\n", - " -- SELECT COUNT(*) FROM s2 --198657\n", - " -- SELECT * FROM s2 LIMIT 1000\n", - " , s3 AS (\n", - " SELECT s1.DocumentHash, \n", - " rwr.Author AS RedditSubmitter,\n", - " rwr.PublicationTime AS RedditPubTime,\n", - " rwr.MetaFields[SAFE_OFFSET(4)] AS Domain, \n", - " rwr.MetaFields[SAFE_OFFSET(0)] AS Url,\n", - " rwr.MetaFields[SAFE_OFFSET(1)] AS Subreddit,\n", - " rwr.MetaFields[SAFE_OFFSET(2)] AS Score,\n", - " rwr.CollectionItemId AS RedditPostId\n", - " FROM s1, UNNEST(s1.MatchedRWRs) AS rwrHash\n", - " INNER JOIN discussion_opinions.webresource rwr ON rwr.WebResourceHash = rwrHash\n", - " GROUP BY 1,2,3,4,5,6,7,8\n", - " ),\n", - " -- SELECT * FROM s3 LIMIT 1000\n", - " -- SELECT COUNT(*) FROM s3 -- 429648\n", - " s3aa AS (\n", - " SELECT Url FROM s3 GROUP BY 1\n", - " ),\n", - " s3ab AS (\n", - " SELECT gkg.DocumentIdentifier, gkg.V2Themes, gkg.AllNames, gkg.V2Locations\n", - " FROM `gdelt-bq.gdeltv2.gkg` gkg \n", - " INNER JOIN s3aa ON s3aa.Url = gkg.DocumentIdentifier\n", - " )\n", - " ,s3ac AS ( -- Mentions of Themes\n", - " SELECT s3ab.DocumentIdentifier, SPLIT(theme_mentions,',')[SAFE_OFFSET(0)] AS Entity, SPLIT(theme_mentions,',')[SAFE_OFFSET(1)] AS Offset\n", - " FROM s3ab, UNNEST(SPLIT(s3ab.V2Themes,\";\")) AS theme_mentions\n", - " )\n", - " -- SELECT * FROM s3ac LIMIT 1000\n", - " ,s3ad AS (\n", - " SELECT s3ab.DocumentIdentifier, \n", - " REPLACE(SPLIT(name_mentions,',')[SAFE_OFFSET(0)],' ','_') AS Name, \n", - " SPLIT(name_mentions,',')[SAFE_OFFSET(1)] AS Offset\n", - " FROM s3ab, UNNEST(SPLIT(s3ab.AllNames,\";\")) AS name_mentions\n", - " )\n", - " -- SELECT * FROM s3ad LIMIT 1000\n", - " ,s3ae AS ( -- Calculate frequency stats for Name mentions\n", - " SELECT Name, COUNT(DISTINCT DocumentIdentifier) FROM s3ad \n", - " GROUP BY 1 HAVING COUNT(DISTINCT DocumentIdentifier) >= 10\n", - " )\n", - " -- SELECT * FROM s3ae LIMIT 1000\n", - " ,s3af AS (-- Filter mentions of Names\n", - " SELECT s3ad.DocumentIdentifier, s3ad.Name AS Entity, s3ad.Offset\n", - " FROM s3ad INNER JOIN s3ae ON s3ae.Name = s3ad.Name\n", - " )\n", - " -- SELECT DISTINCT Entity FROM s3af\n", - " ,s3ag AS ( -- Mentions of Locations\n", - " SELECT s3ab.DocumentIdentifier, SPLIT(loc_mentions,'#') AS LocFieldArray \n", - " FROM s3ab, UNNEST(SPLIT(s3ab.V2Locations,\";\")) AS loc_mentions\n", - " )\n", - " -- SELECT * FROM s3ag LIMIT 1000\n", - " ,s3ah AS (\n", - " SELECT \n", - " s3ag.DocumentIdentifier, \n", - " REPLACE(REPLACE(LocFieldArray[SAFE_OFFSET(1)],' ','_'),',','_') AS Loc, \n", - " LocFieldArray[SAFE_OFFSET(8)] AS Offset\n", - " FROM s3ag\n", - " )\n", - " ,s3ai AS ( -- Calculate frequency stats for Location mentions\n", - " SELECT Loc, COUNT(DISTINCT DocumentIdentifier) FROM s3ah \n", - " GROUP BY 1 HAVING COUNT(DISTINCT DocumentIdentifier) >= 10\n", - " )\n", - " -- SELECT * FROM s3ae LIMIT 1000\n", - " ,s3aj AS ( -- Filter mentions of Locations\n", - " SELECT s3ah.DocumentIdentifier, s3ah.Loc AS Entity, s3ah.Offset\n", - " FROM s3ah INNER JOIN s3ai ON s3ai.Loc = s3ah.Loc\n", - " )\n", - " ,s3ak AS ( -- Join all Themes, Locations, Names\n", - " SELECT DocumentIdentifier, Entity, Offset FROM s3ac\n", - " UNION ALL\n", - " SELECT DocumentIdentifier, Entity, Offset FROM s3af\n", - " UNION ALL\n", - " SELECT DocumentIdentifier, Entity, Offset FROM s3aj\n", - " ) \n", - " -- SELECT COUNT(DISTINCT Entity) FROM s3ak -- 36412\n", - " ,s3an AS ( -- Create Encoding for Entities\n", - " SELECT Entity, cnt, CAST(RANK() OVER (ORDER BY cnt DESC, Entity ASC) AS STRING) AS EntityIdx \n", - " FROM (SELECT Entity, COUNT(*) AS cnt FROM s3ak GROUP BY 1) \n", - " )\n", - " -- SELECT * FROM s3an ORDER BY CAST(EntityIdx AS INT64) ASC LIMIT 1000\n", - " ,s3a AS (\n", - " SELECT DocumentIdentifier, \n", - " STRING_AGG(DISTINCT EntityIdx,\" \") AS BOWEntitiesEncoded, -- For Bag-of-Words encoding order is not important\n", - " COUNT(DISTINCT s3ak.Entity) AS BOWEncodingLength,\n", - " STRING_AGG(DISTINCT s3ak.Entity,\" \") AS EntitiesBOW \n", - " -- STRING_AGG(EntityIdx,\" \" ORDER BY Offset ASC) AS EntitiesSeqEncoded, -- For CNN and RNN analysis, use Entity Sequence\n", - " -- COUNT(*) AS EntitiesSeqLength,\n", - " -- STRING_AGG(s3ak.Entity,\" \" ORDER BY Offset ASC) AS EntitiesSeq\n", - " FROM s3ak\n", - " INNER JOIN s3an ON s3ak.Entity = s3an.Entity\n", - " WHERE s3ak.Entity<>\"\"\n", - " GROUP BY 1\n", - " )\n", - " -- SELECT * FROM s3a LIMIT 1000\n", - " -- SELECT COUNT(*) FROM s3a -- 429648\n", - " , s3b AS (\n", - " SELECT s3.RedditPostId, \n", - " COUNT(DISTINCT rwr.Author) AS NumCommenters,\n", - " COUNT(*) AS NumComments\n", - " FROM s3\n", - " INNER JOIN discussion_opinions.webresource rwr ON rwr.MetaFields[SAFE_OFFSET(3)] = s3.RedditPostId\n", - " WHERE rwr.Author <> '[deleted]' \n", - " AND rwr.ParentWebResourceHash IS NOT NULL -- exclude the actual post item\n", - " GROUP BY 1\n", - " )\n", - " -- SELECT * FROM s3b WHERE NumComments < 10 ORDER BY NumCommenters DESC LIMIT 1000\n", - " -- SELECT COUNT(*) FROM s3b -- 419004\n", - " , s4 AS (\n", - " SELECT s2.*, \n", - " s3.Domain, \n", - " s3.Url,\n", - " CONCAT(\"https://www.reddit.com/r/\",s3.Subreddit,\"/comments/\", SUBSTR(s3.RedditPostId,4), \"/\") AS RedditPostUrl,\n", - " s3.RedditSubmitter,\n", - " s3.RedditPubTime,\n", - " s3.Subreddit,\n", - " s3.Score,\n", - " IFNULL(s3b.NumCommenters,0) AS NumCommenters,\n", - " IFNULL(s3b.NumComments,0) AS NumComments,\n", - " TIMESTAMP_DIFF(s3.RedditPubTime, s2.NewsPubTime, MINUTE) AS PostSubmitDelay,\n", - " s3a.BOWEntitiesEncoded,\n", - " s3a.BOWEncodingLength,\n", - " s3a.EntitiesBOW\n", - " -- s3a.EntitiesSeqEncoded,\n", - " -- s3a.EntitiesSeqLength,\n", - " -- s3a.EntitiesSeq\n", - " FROM s2 \n", - " INNER JOIN s3 ON s3.DocumentHash = s2.DocumentHash\n", - " LEFT OUTER JOIN s3b ON s3b.RedditPostId = s3.RedditPostId\n", - " LEFT OUTER JOIN s3a ON s3a.DocumentIdentifier = s3.Url\n", - " )\n", - " -- SELECT COUNT(*) FROM s4 -- 425548 / 425548\n", - " -- SELECT * FROM s4 LIMIT 1000\n", - " , s5 AS ( -- Creates a ranking of Subreddits based on frequency of posts\n", - " SELECT Subreddit, cnt, RANK() OVER (ORDER BY cnt DESC) AS SubredditRank\n", - " FROM (SELECT Subreddit, COUNT(*) AS cnt FROM s4 GROUP BY 1)\n", - " )\n", - " , s8 AS (\n", - " SELECT s4.*\n", - " , (CASE WHEN s5.SubredditRank < 200 THEN 1 ELSE 0 END) AS IsTop200Subreddit\n", - " FROM s4\n", - " INNER JOIN s5 ON s5.Subreddit = s4.Subreddit\n", - " )\n", - " , s9 AS (\n", - " SELECT\n", - " s8.DocumentHash,\n", - " s8.RedditPostUrl,\n", - " s8.Url,\n", - " s8.Domain,\n", - " s8.RedditSubmitter AS RedditSubmitter,\n", - " s8.Subreddit,\n", - " s8.Score,\n", - " s8.NumCommenters,\n", - " s8.NumComments,\n", - " s8.Tags,\n", - " IFNULL(s8.BOWEntitiesEncoded,\"\") AS BOWEntitiesEncoded,\n", - " IFNULL(s8.BOWEncodingLength,0) AS BOWEncodingLength,\n", - " IFNULL(s8.EntitiesBOW,\"\") AS EntitiesBOW,\n", - " -- IFNULL(s8.EntitiesSeqEncoded,\"\") AS EntitiesSeqEncoded,\n", - " -- IFNULL(s8.EntitiesSeqLength,0) AS EntitiesSeqLength,\n", - " -- IFNULL(s8.EntitiesSeq,\"\") AS EntitiesSeq,\n", - " (CASE WHEN s8.Subreddit LIKE '%auto' OR s8.Subreddit IN ('AutoNewspaper','UMukhasimAutoNews','newsbotbot','TheNewsFeed') THEN 1 ELSE 0 END) AS IsAutoSubreddit,\n", - " IsTop200Subreddit\n", - " FROM s8\n", - " GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\n", - " )\n", - " '''\n", - "\n", - "\n", - " if current_learning_goal == 'SubredditClassification':\n", - " query += '''SELECT Url, RedditPostUrl, Domain, RedditSubmitter, Subreddit, Tags, BOWEntitiesEncoded FROM s9 WHERE IsTop200Subreddit = 1 '''\n", - " query += ''' AND s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n", - " \n", - " elif current_learning_goal == 'MlbSubredditClassification':\n", - " query += '''\n", - " SELECT DocumentHash, Domain, Tags, BOWEntitiesEncoded, \n", - " STRING_AGG(DISTINCT Url,\" \") AS UrlList,\n", - " STRING_AGG(DISTINCT RedditPostUrl,\" \") AS RedditPostUrlList,\n", - " STRING_AGG(DISTINCT RedditSubmitter,\" \") AS RedditSubmitterList, \n", - " STRING_AGG(DISTINCT Subreddit,\" \") AS SubredditList,\n", - " MAX(Score) AS Score,\n", - " SUM(NumCommenters) AS NumCommenters,\n", - " SUM(NumComments) AS NumComments\n", - " FROM s9 \n", - " WHERE IsTop200Subreddit = 1 '''\n", - " query += ''' AND s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n", - " query += '''GROUP BY 1,2,3,4 '''\n", - " else:\n", - " query += '''\n", - " SELECT \n", - " Url, RedditPostUrl, Domain, RedditSubmitter, Subreddit, Tags, \n", - " BOWEntitiesEncoded, Score, NumCommenters, NumComments \n", - " FROM s9 '''\n", - " query += ''' WHERE s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n", - "\n", - "\n", - " df = bigquery.ExecuteQuery(query=query, start_row=0, max_rows = 500000, use_legacy_sql=False)\n", - " print(\"Size of reddit set: %s records\" % len(df.index)) \n", - "\n", - " # Dump reddit dataset to CSV for inspection\n", - " log_dataframe(df,'010-bq-results')\n", - "\n", - " return df\n", - "\n", - "reddit_df = pd.DataFrame()\n" - ], - "execution_count": 0, + "source": "try:\n from colabtools import bigquery # pylint: disable=g-import-not-at-top\n PROJECT_ID = 'datancoffee' #@param\n bqclient = bigquery.Create(project_id=PROJECT_ID) \nexcept ImportError:\n pass\n\ncurrent_exclude_autosubreddits = True\n\ndef get_snapshot_data_for_goal():\n\n def get_column_types():\n \n if current_learning_goal==\"SubredditClassification\":\n col_defaults = collections.OrderedDict([\n (\"dataframe_idx\", [0]),\n (\"Url\", [\"\"]),\n (\"RedditPostUrl\", [\"\"]),\n (\"Domain\", [\"\"]),\n (\"RedditSubmitter\", [\"\"]),\n (\"Subreddit\", [\"\"]),\n (\"Tags\", [\"\"]),\n (\"BOWEntitiesEncoded\", [\"\"])\n ]) # pyformat: disable\n elif current_learning_goal==\"MlbSubredditClassification\":\n col_defaults = collections.OrderedDict([\n (\"dataframe_idx\", [0]),\n (\"DocumentHash\", [\"\"]),\n (\"Domain\", [\"\"]),\n (\"Tags\", [\"\"]),\n (\"BOWEntitiesEncoded\", [\"\"]),\n (\"UrlList\", [\"\"]),\n (\"RedditPostUrlList\", [\"\"]),\n (\"RedditSubmitterList\", [\"\"]),\n (\"SubredditList\", [\"\"]),\n (\"Score\", [0]),\n (\"NumCommenters\", [0]),\n (\"NumComments\", [0])\n ]) # pyformat: disable \n elif current_learning_goal==\"CommentsClassification\":\n col_defaults = collections.OrderedDict([\n (\"dataframe_idx\", [0]),\n (\"Url\", [\"\"]),\n (\"RedditPostUrl\", [\"\"]),\n (\"Domain\", [\"\"]),\n (\"RedditSubmitter\", [\"\"]),\n (\"Subreddit\", [\"\"]),\n (\"Tags\", [\"\"]),\n (\"BOWEntitiesEncoded\", [\"\"]),\n (\"Score\", [0]),\n (\"NumCommenters\", [0]),\n (\"NumComments\", [0])\n ]) # pyformat: disable \n else:\n col_defaults = collections.OrderedDict([\n (\"dataframe_idx\", [0])\n ]) # pyformat: disable \n\n \n col_types = collections.OrderedDict((key, type(value[0]))\n for key, value in col_defaults.items())\n col_names=col_types.keys()\n \n return (col_names, col_types)\n \n (col_names, col_types) = get_column_types()\n \n filename = current_dataset_filename('reddit-ds')\n path = os.path.join(input_dir,filename+'.csv')\n df = load_raw_dataframe(path, col_names, col_types)\n \n return df\n\n\ndef get_bq_data_for_goal():\n\n query = '''\n WITH \n s1 AS ( -- Create matches btw reddit and gdelt\n SELECT \n nwr.DocumentHash,\n ARRAY_AGG(DISTINCT nwr.Url) AS MatchedUrls,\n ARRAY_AGG(DISTINCT nwr.WebResourceHash) AS MatchedNWRs,\n ARRAY_AGG(DISTINCT rwr.WebResourceHash) AS MatchedRWRs, \n COUNT(*) AS cnt\n FROM discussion_opinions.webresource rwr \n INNER JOIN news_opinions.webresource nwr ON nwr.Url = rwr.MetaFields[SAFE_OFFSET(0)]\n WHERE \n rwr.MetaFields[SAFE_OFFSET(0)] <> 'unavailable' -- 0-index metafield contains external URL\n AND nwr._PARTITIONTIME BETWEEN TIMESTAMP('2017-06-01') AND TIMESTAMP('2017-09-30') \n AND rwr._PARTITIONTIME BETWEEN TIMESTAMP('2017-06-01') AND TIMESTAMP('2017-09-30') \n GROUP BY 1\n ORDER BY 5 DESC\n )\n -- SELECT * FROM s1 LIMIT 1000\n -- SELECT COUNT(*) FROM s1 -- 200265\n , s2a AS (\n SELECT nd.DocumentHash, \n nd.PublicationTime AS NewsPubTime, \n nd.Author AS NewsAuthor, \n ARRAY_AGG(REGEXP_REPLACE(tag.Tag,\"[ | [:punct:]]\",\"_\")) AS TagArray \n FROM s1\n INNER JOIN news_opinions.document nd ON nd.DocumentHash = s1.DocumentHash, UNNEST(nd.Tags) AS tag\n GROUP BY 1,2,3\n )\n , s2b AS (\n SELECT tag, COUNT(DISTINCT DocumentHash) cnt FROM s2a, UNNEST(s2a.TagArray) AS tag \n GROUP BY 1 HAVING COUNT(DISTINCT DocumentHash) >= 3\n )\n -- SELECT COUNT(*) FROM s2b -- 52264\n , s2c AS (\n SELECT DocumentHash, tag2 AS Tag\n FROM s2a, UNNEST(s2a.TagArray) AS tag2\n INNER JOIN s2b ON s2b.tag = tag2\n )\n , s2 AS (\n SELECT s2a.DocumentHash, \n s2a.NewsPubTime, \n s2a.NewsAuthor,\n ARRAY_TO_STRING(ARRAY_AGG(s2c.Tag),\" \") AS Tags\n FROM s2a\n LEFT OUTER JOIN s2c ON s2c.DocumentHash = s2a.DocumentHash\n GROUP BY 1,2,3\n )\n -- SELECT COUNT(*) FROM s2 --198657\n -- SELECT * FROM s2 LIMIT 1000\n , s3 AS (\n SELECT s1.DocumentHash, \n rwr.Author AS RedditSubmitter,\n rwr.PublicationTime AS RedditPubTime,\n rwr.MetaFields[SAFE_OFFSET(4)] AS Domain, \n rwr.MetaFields[SAFE_OFFSET(0)] AS Url,\n rwr.MetaFields[SAFE_OFFSET(1)] AS Subreddit,\n rwr.MetaFields[SAFE_OFFSET(2)] AS Score,\n rwr.CollectionItemId AS RedditPostId\n FROM s1, UNNEST(s1.MatchedRWRs) AS rwrHash\n INNER JOIN discussion_opinions.webresource rwr ON rwr.WebResourceHash = rwrHash\n GROUP BY 1,2,3,4,5,6,7,8\n ),\n -- SELECT * FROM s3 LIMIT 1000\n -- SELECT COUNT(*) FROM s3 -- 429648\n s3aa AS (\n SELECT Url FROM s3 GROUP BY 1\n ),\n s3ab AS (\n SELECT gkg.DocumentIdentifier, gkg.V2Themes, gkg.AllNames, gkg.V2Locations\n FROM `gdelt-bq.gdeltv2.gkg` gkg \n INNER JOIN s3aa ON s3aa.Url = gkg.DocumentIdentifier\n )\n ,s3ac AS ( -- Mentions of Themes\n SELECT s3ab.DocumentIdentifier, SPLIT(theme_mentions,',')[SAFE_OFFSET(0)] AS Entity, SPLIT(theme_mentions,',')[SAFE_OFFSET(1)] AS Offset\n FROM s3ab, UNNEST(SPLIT(s3ab.V2Themes,\";\")) AS theme_mentions\n )\n -- SELECT * FROM s3ac LIMIT 1000\n ,s3ad AS (\n SELECT s3ab.DocumentIdentifier, \n REPLACE(SPLIT(name_mentions,',')[SAFE_OFFSET(0)],' ','_') AS Name, \n SPLIT(name_mentions,',')[SAFE_OFFSET(1)] AS Offset\n FROM s3ab, UNNEST(SPLIT(s3ab.AllNames,\";\")) AS name_mentions\n )\n -- SELECT * FROM s3ad LIMIT 1000\n ,s3ae AS ( -- Calculate frequency stats for Name mentions\n SELECT Name, COUNT(DISTINCT DocumentIdentifier) FROM s3ad \n GROUP BY 1 HAVING COUNT(DISTINCT DocumentIdentifier) >= 10\n )\n -- SELECT * FROM s3ae LIMIT 1000\n ,s3af AS (-- Filter mentions of Names\n SELECT s3ad.DocumentIdentifier, s3ad.Name AS Entity, s3ad.Offset\n FROM s3ad INNER JOIN s3ae ON s3ae.Name = s3ad.Name\n )\n -- SELECT DISTINCT Entity FROM s3af\n ,s3ag AS ( -- Mentions of Locations\n SELECT s3ab.DocumentIdentifier, SPLIT(loc_mentions,'#') AS LocFieldArray \n FROM s3ab, UNNEST(SPLIT(s3ab.V2Locations,\";\")) AS loc_mentions\n )\n -- SELECT * FROM s3ag LIMIT 1000\n ,s3ah AS (\n SELECT \n s3ag.DocumentIdentifier, \n REPLACE(REPLACE(LocFieldArray[SAFE_OFFSET(1)],' ','_'),',','_') AS Loc, \n LocFieldArray[SAFE_OFFSET(8)] AS Offset\n FROM s3ag\n )\n ,s3ai AS ( -- Calculate frequency stats for Location mentions\n SELECT Loc, COUNT(DISTINCT DocumentIdentifier) FROM s3ah \n GROUP BY 1 HAVING COUNT(DISTINCT DocumentIdentifier) >= 10\n )\n -- SELECT * FROM s3ae LIMIT 1000\n ,s3aj AS ( -- Filter mentions of Locations\n SELECT s3ah.DocumentIdentifier, s3ah.Loc AS Entity, s3ah.Offset\n FROM s3ah INNER JOIN s3ai ON s3ai.Loc = s3ah.Loc\n )\n ,s3ak AS ( -- Join all Themes, Locations, Names\n SELECT DocumentIdentifier, Entity, Offset FROM s3ac\n UNION ALL\n SELECT DocumentIdentifier, Entity, Offset FROM s3af\n UNION ALL\n SELECT DocumentIdentifier, Entity, Offset FROM s3aj\n ) \n -- SELECT COUNT(DISTINCT Entity) FROM s3ak -- 36412\n ,s3an AS ( -- Create Encoding for Entities\n SELECT Entity, cnt, CAST(RANK() OVER (ORDER BY cnt DESC, Entity ASC) AS STRING) AS EntityIdx \n FROM (SELECT Entity, COUNT(*) AS cnt FROM s3ak GROUP BY 1) \n )\n -- SELECT * FROM s3an ORDER BY CAST(EntityIdx AS INT64) ASC LIMIT 1000\n ,s3a AS (\n SELECT DocumentIdentifier, \n STRING_AGG(DISTINCT EntityIdx,\" \") AS BOWEntitiesEncoded, -- For Bag-of-Words encoding order is not important\n COUNT(DISTINCT s3ak.Entity) AS BOWEncodingLength,\n STRING_AGG(DISTINCT s3ak.Entity,\" \") AS EntitiesBOW \n -- STRING_AGG(EntityIdx,\" \" ORDER BY Offset ASC) AS EntitiesSeqEncoded, -- For CNN and RNN analysis, use Entity Sequence\n -- COUNT(*) AS EntitiesSeqLength,\n -- STRING_AGG(s3ak.Entity,\" \" ORDER BY Offset ASC) AS EntitiesSeq\n FROM s3ak\n INNER JOIN s3an ON s3ak.Entity = s3an.Entity\n WHERE s3ak.Entity<>\"\"\n GROUP BY 1\n )\n -- SELECT * FROM s3a LIMIT 1000\n -- SELECT COUNT(*) FROM s3a -- 429648\n , s3b AS (\n SELECT s3.RedditPostId, \n COUNT(DISTINCT rwr.Author) AS NumCommenters,\n COUNT(*) AS NumComments\n FROM s3\n INNER JOIN discussion_opinions.webresource rwr ON rwr.MetaFields[SAFE_OFFSET(3)] = s3.RedditPostId\n WHERE rwr.Author <> '[deleted]' \n AND rwr.ParentWebResourceHash IS NOT NULL -- exclude the actual post item\n GROUP BY 1\n )\n -- SELECT * FROM s3b WHERE NumComments < 10 ORDER BY NumCommenters DESC LIMIT 1000\n -- SELECT COUNT(*) FROM s3b -- 419004\n , s4 AS (\n SELECT s2.*, \n s3.Domain, \n s3.Url,\n CONCAT(\"https://www.reddit.com/r/\",s3.Subreddit,\"/comments/\", SUBSTR(s3.RedditPostId,4), \"/\") AS RedditPostUrl,\n s3.RedditSubmitter,\n s3.RedditPubTime,\n s3.Subreddit,\n s3.Score,\n IFNULL(s3b.NumCommenters,0) AS NumCommenters,\n IFNULL(s3b.NumComments,0) AS NumComments,\n TIMESTAMP_DIFF(s3.RedditPubTime, s2.NewsPubTime, MINUTE) AS PostSubmitDelay,\n s3a.BOWEntitiesEncoded,\n s3a.BOWEncodingLength,\n s3a.EntitiesBOW\n -- s3a.EntitiesSeqEncoded,\n -- s3a.EntitiesSeqLength,\n -- s3a.EntitiesSeq\n FROM s2 \n INNER JOIN s3 ON s3.DocumentHash = s2.DocumentHash\n LEFT OUTER JOIN s3b ON s3b.RedditPostId = s3.RedditPostId\n LEFT OUTER JOIN s3a ON s3a.DocumentIdentifier = s3.Url\n )\n -- SELECT COUNT(*) FROM s4 -- 425548 / 425548\n -- SELECT * FROM s4 LIMIT 1000\n , s5 AS ( -- Creates a ranking of Subreddits based on frequency of posts\n SELECT Subreddit, cnt, RANK() OVER (ORDER BY cnt DESC) AS SubredditRank\n FROM (SELECT Subreddit, COUNT(*) AS cnt FROM s4 GROUP BY 1)\n )\n , s8 AS (\n SELECT s4.*\n , (CASE WHEN s5.SubredditRank < 200 THEN 1 ELSE 0 END) AS IsTop200Subreddit\n FROM s4\n INNER JOIN s5 ON s5.Subreddit = s4.Subreddit\n )\n , s9 AS (\n SELECT\n s8.DocumentHash,\n s8.RedditPostUrl,\n s8.Url,\n s8.Domain,\n s8.RedditSubmitter AS RedditSubmitter,\n s8.Subreddit,\n s8.Score,\n s8.NumCommenters,\n s8.NumComments,\n s8.Tags,\n IFNULL(s8.BOWEntitiesEncoded,\"\") AS BOWEntitiesEncoded,\n IFNULL(s8.BOWEncodingLength,0) AS BOWEncodingLength,\n IFNULL(s8.EntitiesBOW,\"\") AS EntitiesBOW,\n -- IFNULL(s8.EntitiesSeqEncoded,\"\") AS EntitiesSeqEncoded,\n -- IFNULL(s8.EntitiesSeqLength,0) AS EntitiesSeqLength,\n -- IFNULL(s8.EntitiesSeq,\"\") AS EntitiesSeq,\n (CASE WHEN s8.Subreddit LIKE '%auto' OR s8.Subreddit IN ('AutoNewspaper','UMukhasimAutoNews','newsbotbot','TheNewsFeed') THEN 1 ELSE 0 END) AS IsAutoSubreddit,\n IsTop200Subreddit\n FROM s8\n GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\n )\n '''\n\n\n if current_learning_goal == 'SubredditClassification':\n query += '''SELECT Url, RedditPostUrl, Domain, RedditSubmitter, Subreddit, Tags, BOWEntitiesEncoded FROM s9 WHERE IsTop200Subreddit = 1 '''\n query += ''' AND s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n \n elif current_learning_goal == 'MlbSubredditClassification':\n query += '''\n SELECT DocumentHash, Domain, Tags, BOWEntitiesEncoded, \n STRING_AGG(DISTINCT Url,\" \") AS UrlList,\n STRING_AGG(DISTINCT RedditPostUrl,\" \") AS RedditPostUrlList,\n STRING_AGG(DISTINCT RedditSubmitter,\" \") AS RedditSubmitterList, \n STRING_AGG(DISTINCT Subreddit,\" \") AS SubredditList,\n MAX(Score) AS Score,\n SUM(NumCommenters) AS NumCommenters,\n SUM(NumComments) AS NumComments\n FROM s9 \n WHERE IsTop200Subreddit = 1 '''\n query += ''' AND s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n query += '''GROUP BY 1,2,3,4 '''\n else:\n query += '''\n SELECT \n Url, RedditPostUrl, Domain, RedditSubmitter, Subreddit, Tags, \n BOWEntitiesEncoded, Score, NumCommenters, NumComments \n FROM s9 '''\n query += ''' WHERE s9.IsAutoSubreddit = 0 ''' if current_exclude_autosubreddits == True else ''' '''\n\n\n df = bigquery.ExecuteQuery(query=query, start_row=0, max_rows = 500000, use_legacy_sql=False)\n print(\"Size of reddit set: %s records\" % len(df.index)) \n\n # Dump reddit dataset to CSV for inspection\n log_dataframe(df,current_dataset_filename('reddit-ds'))\n\n return df\n\n\ndef get_data_for_goal():\n\n df = get_bq_data_for_goal() if current_read_from_bq else get_snapshot_data_for_goal()\n \n return df\n \n\nreddit_df = pd.DataFrame()\n", + "execution_count": null, "outputs": [] }, { "metadata": { - "id": "jcxm_vDpmGIB", - "colab_type": "text" + "_cell_guid": "5fbdaf39-208f-4981-9861-2a2a01361262", + "_uuid": "6133db189a99d7cb07187d431e62f6a33afacb6f", + "colab_type": "text", + "id": "jcxm_vDpmGIB" }, "cell_type": "markdown", - "source": [ - "\n", - "## Define Transforms of Raw Data into Feature Columns & Input Functions\n", - "\n" - ] + "source": "\n## Define Transforms of Raw Data into Feature Columns & Input Functions\n\n" }, { "metadata": { - "id": "Bf3M1cDCmtvD", - "colab_type": "code", + "_cell_guid": "9b61f408-d15d-489f-9fad-0e921a960514", + "_uuid": "c3b8254bf87ad463cd849d5147c845f32cfad2c6", + "cellView": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, - "cellView": "code" + "colab_type": "code", + "collapsed": true, + "id": "Bf3M1cDCmtvD", + "trusted": true }, "cell_type": "code", - "source": [ - "current_inverse_frequency_pow = 0.75 # used in weight_inverse_to_freq\n", - "\n", - "\n", - "def get_train_test_sets(fullset_df, train_size, test_size, seed=None):\n", - " \"\"\"\n", - " Args:\n", - " seed: The random seed to use when shuffling the data. `None` generates a\n", - " unique shuffle every run.\n", - " Returns:\n", - " a pair of training data, and test data:\n", - " `(train, test)`\n", - " \"\"\"\n", - "\n", - " # Shuffle the data\n", - " np.random.seed(seed)\n", - "\n", - " # Split the data into train/test subsets.\n", - " sample_size = train_size + test_size\n", - " sample_df = fullset_df.sample(n=sample_size, random_state=seed)\n", - " train = sample_df.head(train_size)\n", - " test = sample_df.drop(train.index)\n", - "\n", - " return (train, test)\n", - "\n", - " \n", - "# Split the Dataframe\n", - "def split_features_labels(raw_df, feature_cols, label_col):\n", - " \n", - " features=pd.DataFrame({k: raw_df[k].values for k in feature_cols})\n", - " labels=pd.Series(raw_df[label_col].values)\n", - "\n", - " return (features,labels) \n", - "\n", - "def embedding_dims(num_tokens, k=2):\n", - " return np.ceil(k * (num_tokens**0.25)).astype(int)\n", - "\n", - "\n", - "def space_tokenizer_fn(iterator):\n", - " \n", - " for x in iterator:\n", - " if x is not None:\n", - " yield x.split(\" \")\n", - " else:\n", - " yield []\n", - " \n", - " \n", - "def int_converter_fn(a):\n", - " return np.asarray([int(i) for i in a],dtype=int)\n", - "\n", - "\n", - "\"\"\"\n", - "Normalization utilities compliments of\n", - " https://github.com/google/eng-edu/blob/master/ml/cc/exercises/improving_neural_net_performance.ipynb\n", - "\"\"\"\n", - "def linear_scale(series):\n", - " min_val = series.min()\n", - " max_val = series.max()\n", - " scale = (max_val - min_val) / 2.0\n", - " return series.apply(lambda x:((x - min_val) / scale) - 1.0)\n", - "\n", - "def log1p_normalize(series):\n", - " return series.apply(lambda x:math.log(x+1.0))\n", - "\n", - "def log_10_1p_normalize(series):\n", - " return series.apply(lambda x:math.log10(x+1.0))\n", - "\n", - "def clip(series, clip_to_min, clip_to_max):\n", - " return series.apply(lambda x:(\n", - " min(max(x, clip_to_min), clip_to_max)))\n", - "\n", - "def z_score_normalize(series):\n", - " mean = series.mean()\n", - " std_dv = series.std()\n", - " return series.apply(lambda x:(x - mean) / std_dv)\n", - "\n", - "def binary_threshold(series, threshold):\n", - " return series.apply(lambda x:(1 if x > threshold else 0))\n", - "\n", - "\"\"\"\n", - "Label Weighting Functions\n", - "\"\"\"\n", - "def scorebin_weight(series):\n", - " return series.apply(lambda x:(0.5 if x == \"1\" else 1.0) )\n", - "\n", - "def weight_inverse_to_freq(series):\n", - " \"\"\"\n", - " Will calculate a weight inverse to the frequency of the label class, \n", - " making small classes more important than indicated by their frequency.\n", - " Uses sqrt so as not to diminish the importance of very large classes.\n", - " \"\"\"\n", - " val_counts = series.value_counts()\n", - " min_val = val_counts.min()\n", - "\n", - " return series.apply(lambda x: ((min_val / float(val_counts[x]))**current_inverse_frequency_pow) )\n", - "\n", - "\n", - "def add_engineered_columns(df, learning_goal):\n", - " \n", - " # rule of thumb, NN's train best when the input features are roughly on the same scale\n", - " \n", - " if learning_goal == \"CommentsRegression\" or learning_goal == \"CommentsClassification\":\n", - " df[\"Score\"] = df[\"Score\"].astype(int) \n", - " \n", - " df[\"NumCommentersClipped\"] = ( clip(df[\"NumCommenters\"],0, (10**4 - 1)) )\n", - " df[\"NumCommentsClipped\"] = ( clip(df[\"NumComments\"],0, (10**5 - 1)) )\n", - " df[\"ScoreClipped\"] = ( clip(df[\"Score\"],0, (10**4 - 1)) )\n", - " \n", - " df[\"NumCommentersLogScaled\"] = ( log_10_1p_normalize(df[\"NumCommentersClipped\"]) )\n", - " df[\"NumCommentsLogScaled\"] = ( log_10_1p_normalize(df[\"NumCommentsClipped\"]) )\n", - " df[\"ScoreLogScaled\"] = ( log_10_1p_normalize(df[\"ScoreClipped\"]) )\n", - " \n", - " # This will result in following binning of ScoreBin<-Score: 0: 0, 1: 1-9, 2: 10-99, 3: 100-999, 4: 1000-9999 etc\n", - " df[\"NumCommentersBin\"] = (np.ceil(df[\"NumCommentersLogScaled\"]).astype(int).astype(str))\n", - " df[\"NumCommentsBin\"] = (np.ceil(df[\"NumCommentsLogScaled\"]).astype(int).astype(str))\n", - " df[\"ScoreBin\"] = (np.ceil(df[\"ScoreLogScaled\"]).astype(int).astype(str))\n", - " \n", - " df[EXAMPLE_WEIGHT_COL] = weight_inverse_to_freq(df[current_label_col])\n", - " \n", - " else:\n", - " df[EXAMPLE_WEIGHT_COL] = 1.0\n", - " \n", - " return\n", - "\n", - "def convert_series_to_nparray(s):\n", - " \"\"\"\n", - " Converts a pandas Series to a numpy array\n", - " \"\"\"\n", - " nparray = s.values.astype(type(s[0]))\n", - " return nparray\n", - "\n", - "\n", - "def create_train_test_features_labels():\n", - "\n", - " # Add Engineered Columns\n", - " add_engineered_columns(reddit_df,learning_goal = current_learning_goal)\n", - "\n", - "\n", - " # Log results to file\n", - " log_dataframe(reddit_df,'030-with-engineered-cols')\n", - "\n", - " reddit_size=len(reddit_df.index)\n", - " sample_size=int(np.floor(reddit_size * current_sample_frac))\n", - " test_size=int(np.floor(sample_size * TEST_FRAC))\n", - " train_size=sample_size - test_size\n", - "\n", - " (train, test) = get_train_test_sets(fullset_df=reddit_df, train_size=train_size, test_size=test_size,seed=3)\n", - " print(\"Size of train set: %d records\" %len(train.index)) \n", - " print(\"Size of test set: %d records\" % len(test.index)) \n", - "\n", - " # Log results to file\n", - " log_dataframe(train,'040-train')\n", - " log_dataframe(test,'050-test')\n", - "\n", - "\n", - " # Create training and validation splits\n", - " training_features, training_labels = split_features_labels(raw_df = train, feature_cols=current_feature_cols, label_col=current_label_col)\n", - " validation_features, validation_labels = split_features_labels(raw_df = test, feature_cols=current_feature_cols, label_col=current_label_col)\n", - "\n", - " return (training_features, training_labels,validation_features, validation_labels)\n", - "\n", - "\n", - "training_features = pd.DataFrame()\n", - "training_labels = pd.Series()\n", - "validation_features = pd.DataFrame()\n", - "validation_labels = pd.Series()\n", - "\n" - ], - "execution_count": 0, + "source": "current_inverse_frequency_pow = 0.75 # used in weight_inverse_to_freq\n\n\ndef get_train_test_sets(fullset_df, train_size, test_size, seed=None):\n \"\"\"\n Args:\n seed: The random seed to use when shuffling the data. `None` generates a\n unique shuffle every run.\n Returns:\n a pair of training data, and test data:\n `(train, test)`\n \"\"\"\n\n # Shuffle the data\n np.random.seed(seed)\n\n # Split the data into train/test subsets.\n sample_size = train_size + test_size\n sample_df = fullset_df.sample(n=sample_size, random_state=seed)\n train = sample_df.head(train_size)\n test = sample_df.drop(train.index)\n\n return (train, test)\n\n \n# Split the Dataframe\ndef split_features_labels(raw_df, feature_cols, label_col):\n \n features=pd.DataFrame({k: raw_df[k].values for k in feature_cols})\n labels=pd.Series(raw_df[label_col].values)\n\n return (features,labels) \n\ndef embedding_dims(num_tokens, k=2):\n return np.ceil(k * (num_tokens**0.25)).astype(int)\n\n\ndef space_tokenizer_fn(iterator):\n \n for x in iterator:\n if x is not None:\n yield x.split(\" \")\n else:\n yield []\n \n \ndef int_converter_fn(a):\n return np.asarray([int(i) for i in a],dtype=int)\n\n\n\"\"\"\nNormalization utilities compliments of\n https://github.com/google/eng-edu/blob/master/ml/cc/exercises/improving_neural_net_performance.ipynb\n\"\"\"\ndef linear_scale(series):\n min_val = series.min()\n max_val = series.max()\n scale = (max_val - min_val) / 2.0\n return series.apply(lambda x:((x - min_val) / scale) - 1.0)\n\ndef log1p_normalize(series):\n return series.apply(lambda x:math.log(x+1.0))\n\ndef log_10_1p_normalize(series):\n return series.apply(lambda x:math.log10(x+1.0))\n\ndef clip(series, clip_to_min, clip_to_max):\n return series.apply(lambda x:(\n min(max(x, clip_to_min), clip_to_max)))\n\ndef z_score_normalize(series):\n mean = series.mean()\n std_dv = series.std()\n return series.apply(lambda x:(x - mean) / std_dv)\n\ndef binary_threshold(series, threshold):\n return series.apply(lambda x:(1 if x > threshold else 0))\n\n\"\"\"\nLabel Weighting Functions\n\"\"\"\ndef scorebin_weight(series):\n return series.apply(lambda x:(0.5 if x == \"1\" else 1.0) )\n\ndef weight_inverse_to_freq(series):\n \"\"\"\n Will calculate a weight inverse to the frequency of the label class, \n making small classes more important than indicated by their frequency.\n Uses sqrt so as not to diminish the importance of very large classes.\n \"\"\"\n val_counts = series.value_counts()\n min_val = val_counts.min()\n\n return series.apply(lambda x: ((min_val / float(val_counts[x]))**current_inverse_frequency_pow) )\n\n\ndef add_engineered_columns(df, learning_goal):\n \n # rule of thumb, NN's train best when the input features are roughly on the same scale\n \n if learning_goal == \"CommentsRegression\" or learning_goal == \"CommentsClassification\":\n df[\"Score\"] = df[\"Score\"].astype(int) \n \n df[\"NumCommentersClipped\"] = ( clip(df[\"NumCommenters\"],0, (10**4 - 1)) )\n df[\"NumCommentsClipped\"] = ( clip(df[\"NumComments\"],0, (10**5 - 1)) )\n df[\"ScoreClipped\"] = ( clip(df[\"Score\"],0, (10**4 - 1)) )\n \n df[\"NumCommentersLogScaled\"] = ( log_10_1p_normalize(df[\"NumCommentersClipped\"]) )\n df[\"NumCommentsLogScaled\"] = ( log_10_1p_normalize(df[\"NumCommentsClipped\"]) )\n df[\"ScoreLogScaled\"] = ( log_10_1p_normalize(df[\"ScoreClipped\"]) )\n \n # This will result in following binning of ScoreBin<-Score: 0: 0, 1: 1-9, 2: 10-99, 3: 100-999, 4: 1000-9999 etc\n df[\"NumCommentersBin\"] = (np.ceil(df[\"NumCommentersLogScaled\"]).astype(int).astype(str))\n df[\"NumCommentsBin\"] = (np.ceil(df[\"NumCommentsLogScaled\"]).astype(int).astype(str))\n df[\"ScoreBin\"] = (np.ceil(df[\"ScoreLogScaled\"]).astype(int).astype(str))\n \n df[EXAMPLE_WEIGHT_COL] = weight_inverse_to_freq(df[current_label_col])\n \n else:\n df[EXAMPLE_WEIGHT_COL] = 1.0\n \n return\n\ndef convert_series_to_nparray(s):\n \"\"\"\n Converts a pandas Series to a numpy array\n \"\"\"\n nparray = s.values.astype(type(s[0]))\n return nparray\n\n\ndef create_train_test_features_labels():\n\n # Add Engineered Columns\n add_engineered_columns(reddit_df,learning_goal = current_learning_goal)\n\n\n # Log results to file\n log_dataframe(reddit_df,'030-with-engineered-cols')\n\n reddit_size=len(reddit_df.index)\n sample_size=int(np.floor(reddit_size * current_sample_frac))\n test_size=int(np.floor(sample_size * TEST_FRAC))\n train_size=sample_size - test_size\n\n (train, test) = get_train_test_sets(fullset_df=reddit_df, train_size=train_size, test_size=test_size,seed=3)\n print(\"Size of train set: %d records\" %len(train.index)) \n print(\"Size of test set: %d records\" % len(test.index)) \n\n # Log results to file\n log_dataframe(train,'040-train')\n log_dataframe(test,'050-test')\n\n\n # Create training and validation splits\n training_features, training_labels = split_features_labels(raw_df = train, feature_cols=current_feature_cols, label_col=current_label_col)\n validation_features, validation_labels = split_features_labels(raw_df = test, feature_cols=current_feature_cols, label_col=current_label_col)\n\n return (training_features, training_labels,validation_features, validation_labels)\n\n\ntraining_features = pd.DataFrame()\ntraining_labels = pd.Series()\nvalidation_features = pd.DataFrame()\nvalidation_labels = pd.Series()\n\n", + "execution_count": null, "outputs": [] }, { "metadata": { - "id": "Xd7Lha3VikJp", - "colab_type": "text" + "_cell_guid": "6951dd32-053f-4990-b7ba-6e4478f0bf1c", + "_uuid": "df50a56ac1045128095d0c7516973fbadaff2075", + "colab_type": "text", + "id": "Xd7Lha3VikJp" }, "cell_type": "markdown", - "source": [ - "## Keras Multi-Label Model" - ] + "source": "## Keras Multi-Label Model" }, { "metadata": { - "id": "dXNlcAFhixiW", - "colab_type": "code", + "_cell_guid": "b95186ab-0fb9-4a0e-834b-4c40eac1d1a3", + "_uuid": "fe19f5168842f3ca35b0dd1cd86a2c45b354b575", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - { - "item_id": 1 - } - ], "height": 34 }, - "outputId": "065b4002-928f-40c8-c6fe-669335299133", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 6178, "status": "ok", - "timestamp": 1519084804997, - "user_tz": 480, - "elapsed": 2481, + "timestamp": 1525651237972, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "dXNlcAFhixiW", + "outputId": "9168d67f-18cf-4afd-f24c-d3524674ff62", + "trusted": true }, "cell_type": "code", - "source": [ - "# Keras Multi-Label Model: Tags -> Subreddit\n", - "\n", - "from keras.models import Model, Input\n", - "from keras.layers import Flatten, Dense, Dropout, Embedding, Activation, LSTM\n", - "from keras.preprocessing.text import Tokenizer\n", - "from keras.preprocessing.sequence import pad_sequences\n", - "from keras.optimizers import Adam\n", - "import keras.utils\n", - "from sklearn.preprocessing import MultiLabelBinarizer, LabelEncoder\n", - "import bisect\n", - "from sklearn import metrics\n", - "from keras.utils import plot_model\n", - "from IPython.display import SVG\n", - "from keras.utils.vis_utils import model_to_dot\n", - "from keras.metrics import top_k_categorical_accuracy \n", - "\n", - "BATCH_SIZE = 50 \n", - "VALIDATION_SPLIT = 0.1\n", - "current_epochs = 2\n", - "\n", - "# Hidden Layers configuration\n", - "HIDDEN_UNITS_L1 = 500\n", - "DROPOUT_L1 = 0.3\n", - "\n", - "TAGS_MAX_SEQUENCE_LENGTH = 7\n", - "TAGS_MAX_NUM_TOKENS=None # don't limit Tags dictionary \n", - "\n", - "ENTITIES_MAX_SEQUENCE_LENGTH = 100\n", - "ENTITIES_MAX_NUM_TOKENS=None # don't limit Entities dictionary \n", - "\n", - "\n", - "def create_bow_input(train, test, max_sequence_length, max_num_tokens=None):\n", - "\n", - " \"\"\"\n", - " Args\n", - " max_num_tokens: if None, will use the entire dictionary of tokens found\n", - " \"\"\"\n", - " \n", - " tokenizer = Tokenizer(num_words=max_num_tokens,filters='')\n", - " tokenizer.fit_on_texts(train)\n", - "\n", - " vocab_size = len(tokenizer.word_index) \n", - " # when creating Embedding layer, we will add 1 to input_dims \n", - " # to account for the padding 0\n", - " actual_num_tokens = vocab_size if max_num_tokens == None else min(max_num_tokens,vocab_size)\n", - "\n", - " train_enc = tokenizer.texts_to_sequences(train)\n", - " test_enc = tokenizer.texts_to_sequences(test)\n", - "\n", - " train_enc = pad_sequences(train_enc, maxlen=max_sequence_length, padding='post')\n", - " test_enc = pad_sequences(test_enc, maxlen=max_sequence_length, padding='post')\n", - "\n", - " inverted_dict = dict([[v,k] for k,v in tokenizer.word_index.items()])\n", - " \n", - " return (train_enc, test_enc, inverted_dict, actual_num_tokens)\n", - "\n", - "def create_bow_embedded_layer(train, test, feature_key, max_sequence_length, max_num_tokens ):\n", - " \n", - " \"\"\"\n", - " Args:\n", - " train, test - string columns that need to be encoded with integers\n", - " \"\"\"\n", - " \n", - " (train_enc, test_enc, inverted_dict, actual_num_tokens) = create_bow_input(\n", - " train=train,\n", - " test=test,\n", - " max_sequence_length=max_sequence_length,\n", - " max_num_tokens=max_num_tokens)\n", - "\n", - " print(\"Using %d unique values for %s\" % (actual_num_tokens,feature_key))\n", - "\n", - " # the very first input layer for the feature\n", - " input_layer = Input(shape=(train_enc.shape[1],), name=feature_key)\n", - "\n", - " # Embedding layer \n", - " # When embedding, use (tags_actual_num_tokens +1) to account for the padding 0\n", - " num_embedding_dims= embedding_dims(actual_num_tokens,EMB_DIM_K)\n", - " embedding_layer = Embedding(\n", - " input_dim = (actual_num_tokens +1), # to account for the padding 0\n", - " output_dim = num_embedding_dims, \n", - " input_length=max_sequence_length,\n", - " #mask_zero=True\n", - " )(input_layer)\n", - "\n", - " # Adding LSTM layer will work best on sequential data. An LSTM will transform \n", - " # the vector sequence into a single vector, containing information about the \n", - " # entire sequence\n", - " # lstm_layer = LSTM(32)(embedding_layer)\n", - " # lstm_layer = LSTM(64,return_sequences=True)(embedding_layer)\n", - "\n", - " # Flatten on top of a Embedding will create a bag-of-words matrix\n", - " bagofwords_layer = Flatten()(embedding_layer)\n", - " \n", - " return (train_enc, test_enc, inverted_dict, actual_num_tokens, input_layer, bagofwords_layer)\n", - "\n", - "\n", - "def create_categorical_label_or_feature(training_nparray, test_nparray, min_frequency=0, vocab_order=None):\n", - "\n", - " \"\"\"\n", - " Use VocabularyProcessor because sklearn LabelEncoder() does not support \n", - " unseen values in test dataset\n", - " \"\"\"\n", - " vocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(\n", - " max_document_length = 1, \n", - " tokenizer_fn = space_tokenizer_fn,\n", - " min_frequency=min_frequency\n", - " #vocabulary=tf.contrib.learn.preprocessing.CategoricalVocabulary()\n", - " )\n", - " \n", - " if vocab_order is not None:\n", - " vocab_processor.fit(vocab_order)\n", - " else:\n", - " vocab_processor.fit(training_nparray)\n", - " \n", - " train_enc = vocab_processor.transform(training_nparray)\n", - " # transform test set using training encoding. Words not found in train set will be set as unknown\n", - " test_enc = vocab_processor.transform(test_nparray) \n", - " \n", - " train_enc = np.array(list(train_enc))\n", - " test_enc = np.array(list(test_enc))\n", - " \n", - " # VocabularyProcessor outputs a word-id matrix where word ids start from 1 \n", - " # and 0 means 'no word'. We do not have to subtract 1 from the index, because\n", - " # keras to_categorical works well with that. We also use 0 to pad sequences.\n", - " classes = vocab_processor.vocabulary_._reverse_mapping\n", - " num_classes = len(classes)\n", - "\n", - " # convert to one-hot representation\n", - " train_enc = keras.utils.to_categorical(train_enc, num_classes=num_classes) \n", - " test_enc = keras.utils.to_categorical(test_enc, num_classes=num_classes)\n", - " \n", - " return (train_enc, test_enc, num_classes, classes)\n", - "\n", - "def create_multi_label(training_nparray, test_nparray, max_num_classes=None):\n", - "\n", - " tokenizer = Tokenizer(num_words=max_num_classes,filters='')\n", - " tokenizer.fit_on_texts(training_nparray)\n", - "\n", - " num_classes = len(tokenizer.word_index) + 1 # for the 0 index unknown class\n", - " actual_num_classes = num_classes if max_num_classes == None else min(max_num_classes,num_classes)\n", - "\n", - " train_enc = tokenizer.texts_to_matrix(training_nparray)\n", - " test_enc = tokenizer.texts_to_matrix(test_nparray)\n", - "\n", - " inverted_dict = dict([[v,k] for k,v in tokenizer.word_index.items()])\n", - " \n", - " return (train_enc, test_enc, actual_num_classes, inverted_dict)\n", - " \n", - "\n", - "def compile_and_fit_model(inputs = [], outputs=[], use_sample_weights=False, k_of_top_k_accuracy=5):\n", - " \n", - " # Prepare output or input: Subreddit\n", - " if ('Subreddit' in inputs) or ('Subreddit' in outputs):\n", - " global subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes\n", - " subreddit_train_nparray = convert_series_to_nparray(training_labels) if ('Subreddit' in outputs) else training_features['Subreddit']\n", - " subreddit_test_nparray = convert_series_to_nparray(validation_labels) if ('Subreddit' in outputs) else validation_features['Subreddit']\n", - " \n", - " if current_learning_goal in ['SubredditClassification','CommentsClassification']:\n", - " (subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes) = create_categorical_label_or_feature(\n", - " training_nparray = subreddit_train_nparray,\n", - " test_nparray = subreddit_test_nparray) \n", - "\n", - " elif current_learning_goal==\"MlbSubredditClassification\":\n", - " (subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes) = create_multi_label(\n", - " training_nparray = subreddit_train_nparray,\n", - " test_nparray = subreddit_test_nparray) \n", - " print('Using %d unique values for subreddit' % num_subreddit_classes)\n", - " # Input layer for subreddit\n", - " if ('Subreddit' in inputs):\n", - " subreddit_input = Input(shape=(subreddit_train.shape[1],), name='Subreddit')\n", - "\n", - " \n", - " # Prepare input: Domain\n", - " if 'Domain' in inputs:\n", - " global domain_train, domain_test, num_domain_classes, domain_classes\n", - " (domain_train, domain_test, num_domain_classes, domain_classes) = create_categorical_label_or_feature(\n", - " training_nparray = training_features['Domain'],\n", - " test_nparray = validation_features['Domain']) \n", - " print(\"Using %d unique values for domain\" % num_domain_classes)\n", - " # Input layer for domain\n", - " domain_input = Input(shape=(domain_train.shape[1],), name='Domain')\n", - "\n", - " # Prepare input/output: RedditSubmitter\n", - "\n", - " if ('RedditSubmitter' in inputs) or ('RedditSubmitter' in outputs):\n", - " global submitter_train, submitter_test, num_submitter_classes, submitter_classes\n", - " (submitter_train, submitter_test, num_submitter_classes, submitter_classes) = create_categorical_label_or_feature(\n", - " training_nparray = training_features['RedditSubmitter'],\n", - " test_nparray = validation_features['RedditSubmitter'],\n", - " min_frequency = 4) \n", - " print(\"Using %d unique values for submitter\" % num_submitter_classes)\n", - " # Input layer for submitter\n", - " if ('RedditSubmitter' in inputs):\n", - " submitter_input = Input(shape=(submitter_train.shape[1],), name='RedditSubmitter')\n", - "\n", - " # Prepare input: Tags\n", - "\n", - " #global tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords\n", - " if 'Tags' in inputs:\n", - " global tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords\n", - " (tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords) = create_bow_embedded_layer(\n", - " train = training_features['Tags'], \n", - " test = validation_features['Tags'], \n", - " feature_key = 'Tags', \n", - " max_sequence_length = TAGS_MAX_SEQUENCE_LENGTH,\n", - " max_num_tokens = TAGS_MAX_NUM_TOKENS)\n", - "\n", - " # Prepare input: GDELT Entities \n", - "\n", - " if 'BOWEntitiesEncoded' in inputs:\n", - " global entities_train, entities_test, entities_inverted_dict, entities_actual_num_tokens, entities_input, entities_bagofwords\n", - " (entities_train, entities_test, entities_inverted_dict, entities_actual_num_tokens, entities_input, entities_bagofwords) = create_bow_embedded_layer(\n", - " train=training_features['BOWEntitiesEncoded'],\n", - " test=validation_features['BOWEntitiesEncoded'],\n", - " feature_key = 'BOWEntitiesEncoded',\n", - " max_sequence_length=ENTITIES_MAX_SEQUENCE_LENGTH,\n", - " max_num_tokens=ENTITIES_MAX_NUM_TOKENS)\n", - "\n", - " if ('ScoreBin' in outputs):\n", - " global scorebin_train, scorebin_test, num_scorebin_classes, scorebin_classes\n", - " vocab_order = np.sort(training_labels.unique())\n", - " (scorebin_train, scorebin_test, num_scorebin_classes, scorebin_classes) = create_categorical_label_or_feature(\n", - " training_nparray = training_features['ScoreBin'],\n", - " test_nparray = validation_features['ScoreBin'],\n", - " vocab_order=vocab_order) \n", - " print(\"Using %d unique values for ScoreBin\" % num_scorebin_classes)\n", - "\n", - " if ('NumCommentersBin' in outputs):\n", - " global numcommentersbin_train, numcommentersbin_test, num_numcommentersbin_classes, numcommentersbin_classes\n", - " vocab_order = np.sort(training_features['NumCommentersBin'].unique())\n", - " (numcommentersbin_train, numcommentersbin_test, num_numcommentersbin_classes, numcommentersbin_classes) = create_categorical_label_or_feature(\n", - " training_nparray = training_features['NumCommentersBin'],\n", - " test_nparray = validation_features['NumCommentersBin'],\n", - " vocab_order=vocab_order) \n", - " print(\"Using %d unique values for NumCommentersBin\" % num_numcommentersbin_classes)\n", - " \n", - " \n", - " ########################## \n", - " # Merge input branches and build the model\n", - " ##########################\n", - "\n", - " def _create_subreddit_model(model_type='multiclass'):\n", - " \"\"\"\n", - " Creates Multi-Class Single-Label model using softmax\n", - " \"\"\"\n", - " \n", - " # Bring together the Inputs\n", - " input_layers = []\n", - " preconcat_layers = []\n", - " for s in inputs:\n", - " if s=='Tags':\n", - " input_layers.append(tags_input)\n", - " preconcat_layers.append(tags_bagofwords)\n", - " elif s=='BOWEntitiesEncoded':\n", - " input_layers.append(entities_input)\n", - " preconcat_layers.append(entities_bagofwords)\n", - " elif s=='Domain':\n", - " input_layers.append(domain_input)\n", - " preconcat_layers.append(domain_input)\n", - " elif s=='RedditSubmitter':\n", - " input_layers.append(submitter_input)\n", - " preconcat_layers.append(submitter_input)\n", - " elif s=='Subreddit':\n", - " input_layers.append(subreddit_input)\n", - " preconcat_layers.append(subreddit_input)\n", - "\n", - " if len(preconcat_layers) > 1:\n", - " joined_1 = keras.layers.concatenate(preconcat_layers, axis=-1)\n", - " elif len(preconcat_layers) == 1:\n", - " joined_1 = preconcat_layers[0]\n", - " else:\n", - " raise ValueError('No valid inputs among %s' % (','.join(inputs)))\n", - " \n", - " # Connect to Hidden Layers\n", - " hidden_1 = Dense(HIDDEN_UNITS_L1, activation='relu')(joined_1)\n", - " dropout_1 = Dropout(DROPOUT_L1)(hidden_1)\n", - " \n", - " if model_type=='multiclass':\n", - " output_activation='softmax'\n", - " loss_function = 'categorical_crossentropy'\n", - " elif model_type=='multilabel':\n", - " output_activation='sigmoid'\n", - " loss_function = 'binary_crossentropy'\n", - " \n", - " # Add the outputs\n", - " output_layers = []\n", - " for s in outputs:\n", - " if s=='Subreddit':\n", - " layer = Dense(num_subreddit_classes, activation=output_activation, name='subreddit_output')(dropout_1)\n", - " output_layers.append(layer)\n", - " elif s=='RedditSubmitter':\n", - " layer = Dense(num_submitter_classes, activation=output_activation, name='submitter_output')(dropout_1)\n", - " output_layers.append(layer)\n", - " elif s=='ScoreBin':\n", - " layer = Dense(num_scorebin_classes, activation=output_activation, name='scorebin_output')(dropout_1)\n", - " output_layers.append(layer)\n", - " elif s=='NumCommentersBin':\n", - " layer = Dense(num_numcommentersbin_classes, activation=output_activation, name='numcommentersbin_output')(dropout_1)\n", - " output_layers.append(layer)\n", - " \n", - " model = Model(inputs=input_layers, outputs=output_layers)\n", - "\n", - " \n", - " def top_k_accuracy(y_true, y_pred):\n", - " return top_k_categorical_accuracy(y_true, y_pred, k=k_of_top_k_accuracy)\n", - " \n", - " if k_of_top_k_accuracy==5:\n", - " metrics=['accuracy','top_k_categorical_accuracy']\n", - " else:\n", - " metrics=['accuracy',top_k_accuracy]\n", - " \n", - " model.compile(optimizer='adam',\n", - " loss=loss_function,\n", - " # loss_weights=[1., 0.2]\n", - " metrics=metrics)\n", - " \n", - "\n", - " return model\n", - " \n", - " global x_train, x_test, y_train, y_test\n", - " \n", - " if current_learning_goal in ['SubredditClassification','CommentsClassification']:\n", - " model = _create_subreddit_model(model_type='multiclass') \n", - " elif current_learning_goal==\"MlbSubredditClassification\":\n", - " model = _create_subreddit_model(model_type='multilabel')\n", - "\n", - " x_train = {}\n", - " x_test = {}\n", - " \n", - " for s in inputs:\n", - " \n", - " if s=='Tags':\n", - " x_train['Tags'] = tags_train\n", - " x_test['Tags'] = tags_test\n", - " elif s=='BOWEntitiesEncoded':\n", - " x_train['BOWEntitiesEncoded'] = entities_train\n", - " x_test['BOWEntitiesEncoded'] = entities_test\n", - " elif s=='Domain':\n", - " x_train['Domain'] = domain_train\n", - " x_test['Domain'] = domain_test\n", - " elif s=='RedditSubmitter':\n", - " x_train['RedditSubmitter'] = submitter_train\n", - " x_test['RedditSubmitter'] = submitter_test\n", - " elif s=='Subreddit':\n", - " x_train['Subreddit'] = subreddit_train\n", - " x_test['Subreddit'] = subreddit_test\n", - " \n", - " y_train = {}\n", - " y_test = {}\n", - "\n", - " for s in outputs:\n", - " \n", - " if s=='Subreddit':\n", - " y_train['subreddit_output'] = subreddit_train\n", - " y_test['subreddit_output'] = subreddit_test\n", - " elif s=='RedditSubmitter':\n", - " y_train['submitter_output'] = submitter_train\n", - " y_test['submitter_output'] = submitter_test\n", - " elif s=='ScoreBin':\n", - " y_train['scorebin_output'] = scorebin_train\n", - " y_test['scorebin_output'] = scorebin_test\n", - " elif s=='NumCommentersBin':\n", - " y_train['numcommentersbin_output'] = numcommentersbin_train\n", - " y_test['numcommentersbin_output'] = numcommentersbin_test\n", - " \n", - " \n", - " \"\"\"\n", - " callbacks = [\n", - " keras.callbacks.TensorBoard(\n", - " log_dir=tb_log_dir, \n", - " histogram_freq=1, \n", - " embeddings_freq=1, \n", - " )\n", - " ]\n", - " \"\"\"\n", - " \n", - " if use_sample_weights==True:\n", - " if len(outputs) == 1:\n", - " sample_weight = np.array(training_features[EXAMPLE_WEIGHT_COL])\n", - " else:\n", - " sample_weight = []\n", - " for s in outputs:\n", - " sample_weight.append(np.array(training_features[EXAMPLE_WEIGHT_COL]))\n", - " else:\n", - " sample_weight = None\n", - "\n", - " \n", - " history = model.fit(x_train, y_train, \n", - " epochs=current_epochs, batch_size=BATCH_SIZE,\n", - " verbose=2, validation_split=VALIDATION_SPLIT,\n", - " sample_weight = sample_weight)\n", - "\n", - " score = model.evaluate(x_test, y_test, batch_size=BATCH_SIZE, verbose=0)\n", - "\n", - " if len(outputs)==1:\n", - " print('Test data loss: %.3f; top 1 accuracy: %.3f; top %d accuracy: %.3f;'%(score[0],score[1], k_of_top_k_accuracy, score[2]))\n", - " elif len(outputs)==2:\n", - " print('Test metrics: total loss: %.3f; output_1 loss: %.3f; output_2 loss: %.3f; output_1 top 1 accuracy: %.3f; output_1 top %d accuracy: %.3f; output_2 top 1 accuracy: %.3f; output_2 top %d accuracy: %.3f;'%(score[0],score[1],score[2],score[3],k_of_top_k_accuracy,score[4],score[5],k_of_top_k_accuracy,score[6]))\n", - "\n", - " return (model, history, x_train, x_test, y_train, y_test)\n", - "\n", - "def get_true_and_predicted_labels(model, x_test, y_test_selected, label_classes, multi_output=True, output_idx=0):\n", - " \n", - " \"\"\"\n", - " Run predictions and determine y_true and y_pred filled with labels, not indexes \n", - " \"\"\"\n", - " y_pred_probs = model.predict(x_test) # shape: num outputs x num samples x num classes\n", - " y_pred_probs = np.array(y_pred_probs)\n", - "\n", - " if multi_output==True:\n", - " y_pred_idx = np.argmax(y_pred_probs[output_idx],axis=1) \n", - " else:\n", - " y_pred_idx = np.argmax(y_pred_probs,axis=1) \n", - " \n", - " y_true_idx = np.argmax(y_test_selected,axis=1)\n", - "\n", - " y_pred = np.array([label_classes[i] for i in y_pred_idx])\n", - " y_true = np.array([label_classes[i] for i in y_true_idx])\n", - "\n", - " return (y_true, y_pred)\n", - "\n", - "\n", - "\n" - ], - "execution_count": 5, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ], - "name": "stderr" - } - ] + "source": "# Keras Multi-Label Model: Tags -> Subreddit\n\nfrom keras.models import Model, Input\nfrom keras.layers import Flatten, Dense, Dropout, Embedding, Activation, LSTM\nfrom keras.preprocessing.text import Tokenizer\nfrom keras.preprocessing.sequence import pad_sequences\nfrom keras.optimizers import Adam\nimport keras.utils\nfrom sklearn.preprocessing import MultiLabelBinarizer, LabelEncoder\nimport bisect\nfrom sklearn import metrics\nfrom keras.utils import plot_model\nfrom IPython.display import SVG\nfrom keras.utils.vis_utils import model_to_dot\nfrom keras.metrics import top_k_categorical_accuracy \n\nBATCH_SIZE = 50 \nVALIDATION_SPLIT = 0.1\ncurrent_epochs = 2\n\n# Hidden Layers configuration\nHIDDEN_UNITS_L1 = 500\nDROPOUT_L1 = 0.3\n\nTAGS_MAX_SEQUENCE_LENGTH = 7\nTAGS_MAX_NUM_TOKENS=None # don't limit Tags dictionary \n\nENTITIES_MAX_SEQUENCE_LENGTH = 100\nENTITIES_MAX_NUM_TOKENS=None # don't limit Entities dictionary \n\n\ndef create_bow_input(train, test, max_sequence_length, max_num_tokens=None):\n\n \"\"\"\n Args\n max_num_tokens: if None, will use the entire dictionary of tokens found\n \"\"\"\n \n tokenizer = Tokenizer(num_words=max_num_tokens,filters='')\n tokenizer.fit_on_texts(train)\n\n vocab_size = len(tokenizer.word_index) \n # when creating Embedding layer, we will add 1 to input_dims \n # to account for the padding 0\n actual_num_tokens = vocab_size if max_num_tokens == None else min(max_num_tokens,vocab_size)\n\n train_enc = tokenizer.texts_to_sequences(train)\n test_enc = tokenizer.texts_to_sequences(test)\n\n train_enc = pad_sequences(train_enc, maxlen=max_sequence_length, padding='post')\n test_enc = pad_sequences(test_enc, maxlen=max_sequence_length, padding='post')\n\n inverted_dict = dict([[v,k] for k,v in tokenizer.word_index.items()])\n \n return (train_enc, test_enc, inverted_dict, actual_num_tokens)\n\ndef create_bow_embedded_layer(train, test, feature_key, max_sequence_length, max_num_tokens ):\n \n \"\"\"\n Args:\n train, test - string columns that need to be encoded with integers\n \"\"\"\n \n (train_enc, test_enc, inverted_dict, actual_num_tokens) = create_bow_input(\n train=train,\n test=test,\n max_sequence_length=max_sequence_length,\n max_num_tokens=max_num_tokens)\n\n print(\"Using %d unique values for %s\" % (actual_num_tokens,feature_key))\n\n # the very first input layer for the feature\n input_layer = Input(shape=(train_enc.shape[1],), name=feature_key)\n\n # Embedding layer \n # When embedding, use (tags_actual_num_tokens +1) to account for the padding 0\n num_embedding_dims= embedding_dims(actual_num_tokens,EMB_DIM_K)\n embedding_layer = Embedding(\n input_dim = (actual_num_tokens +1), # to account for the padding 0\n output_dim = num_embedding_dims, \n input_length=max_sequence_length,\n #mask_zero=True\n )(input_layer)\n\n # Adding LSTM layer will work best on sequential data. An LSTM will transform \n # the vector sequence into a single vector, containing information about the \n # entire sequence\n # lstm_layer = LSTM(32)(embedding_layer)\n # lstm_layer = LSTM(64,return_sequences=True)(embedding_layer)\n\n # Flatten on top of a Embedding will create a bag-of-words matrix\n bagofwords_layer = Flatten()(embedding_layer)\n \n return (train_enc, test_enc, inverted_dict, actual_num_tokens, input_layer, bagofwords_layer)\n\n\ndef create_categorical_label_or_feature(training_nparray, test_nparray, min_frequency=0, vocab_order=None):\n\n \"\"\"\n Use VocabularyProcessor because sklearn LabelEncoder() does not support \n unseen values in test dataset\n \"\"\"\n vocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(\n max_document_length = 1, \n tokenizer_fn = space_tokenizer_fn,\n min_frequency=min_frequency\n #vocabulary=tf.contrib.learn.preprocessing.CategoricalVocabulary()\n )\n \n if vocab_order is not None:\n vocab_processor.fit(vocab_order)\n else:\n vocab_processor.fit(training_nparray)\n \n train_enc = vocab_processor.transform(training_nparray)\n # transform test set using training encoding. Words not found in train set will be set as unknown\n test_enc = vocab_processor.transform(test_nparray) \n \n train_enc = np.array(list(train_enc))\n test_enc = np.array(list(test_enc))\n \n # VocabularyProcessor outputs a word-id matrix where word ids start from 1 \n # and 0 means 'no word'. We do not have to subtract 1 from the index, because\n # keras to_categorical works well with that. We also use 0 to pad sequences.\n classes = vocab_processor.vocabulary_._reverse_mapping\n num_classes = len(classes)\n\n # convert to one-hot representation\n train_enc = keras.utils.to_categorical(train_enc, num_classes=num_classes) \n test_enc = keras.utils.to_categorical(test_enc, num_classes=num_classes)\n \n return (train_enc, test_enc, num_classes, classes)\n\ndef create_multi_label(training_nparray, test_nparray, max_num_classes=None):\n\n tokenizer = Tokenizer(num_words=max_num_classes,filters='')\n tokenizer.fit_on_texts(training_nparray)\n\n num_classes = len(tokenizer.word_index) + 1 # for the 0 index unknown class\n actual_num_classes = num_classes if max_num_classes == None else min(max_num_classes,num_classes)\n\n train_enc = tokenizer.texts_to_matrix(training_nparray)\n test_enc = tokenizer.texts_to_matrix(test_nparray)\n\n inverted_dict = dict([[v,k] for k,v in tokenizer.word_index.items()])\n \n return (train_enc, test_enc, actual_num_classes, inverted_dict)\n \n\ndef compile_and_fit_model(inputs = [], outputs=[], use_sample_weights=False, k_of_top_k_accuracy=5):\n \n # Prepare output or input: Subreddit\n if ('Subreddit' in inputs) or ('Subreddit' in outputs):\n global subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes\n subreddit_train_nparray = convert_series_to_nparray(training_labels) if ('Subreddit' in outputs) else training_features['Subreddit']\n subreddit_test_nparray = convert_series_to_nparray(validation_labels) if ('Subreddit' in outputs) else validation_features['Subreddit']\n \n if current_learning_goal in ['SubredditClassification','CommentsClassification']:\n (subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes) = create_categorical_label_or_feature(\n training_nparray = subreddit_train_nparray,\n test_nparray = subreddit_test_nparray) \n\n elif current_learning_goal==\"MlbSubredditClassification\":\n (subreddit_train, subreddit_test, num_subreddit_classes, subreddit_classes) = create_multi_label(\n training_nparray = subreddit_train_nparray,\n test_nparray = subreddit_test_nparray) \n print('Using %d unique values for subreddit' % num_subreddit_classes)\n # Input layer for subreddit\n if ('Subreddit' in inputs):\n subreddit_input = Input(shape=(subreddit_train.shape[1],), name='Subreddit')\n\n \n # Prepare input: Domain\n if 'Domain' in inputs:\n global domain_train, domain_test, num_domain_classes, domain_classes\n (domain_train, domain_test, num_domain_classes, domain_classes) = create_categorical_label_or_feature(\n training_nparray = training_features['Domain'],\n test_nparray = validation_features['Domain']) \n print(\"Using %d unique values for domain\" % num_domain_classes)\n # Input layer for domain\n domain_input = Input(shape=(domain_train.shape[1],), name='Domain')\n\n # Prepare input/output: RedditSubmitter\n\n if ('RedditSubmitter' in inputs) or ('RedditSubmitter' in outputs):\n global submitter_train, submitter_test, num_submitter_classes, submitter_classes\n (submitter_train, submitter_test, num_submitter_classes, submitter_classes) = create_categorical_label_or_feature(\n training_nparray = training_features['RedditSubmitter'],\n test_nparray = validation_features['RedditSubmitter'],\n min_frequency = 4) \n print(\"Using %d unique values for submitter\" % num_submitter_classes)\n # Input layer for submitter\n if ('RedditSubmitter' in inputs):\n submitter_input = Input(shape=(submitter_train.shape[1],), name='RedditSubmitter')\n\n # Prepare input: Tags\n\n #global tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords\n if 'Tags' in inputs:\n global tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords\n (tags_train, tags_test, tags_inverted_dict, tags_actual_num_tokens, tags_input, tags_bagofwords) = create_bow_embedded_layer(\n train = training_features['Tags'], \n test = validation_features['Tags'], \n feature_key = 'Tags', \n max_sequence_length = TAGS_MAX_SEQUENCE_LENGTH,\n max_num_tokens = TAGS_MAX_NUM_TOKENS)\n\n # Prepare input: GDELT Entities \n\n if 'BOWEntitiesEncoded' in inputs:\n global entities_train, entities_test, entities_inverted_dict, entities_actual_num_tokens, entities_input, entities_bagofwords\n (entities_train, entities_test, entities_inverted_dict, entities_actual_num_tokens, entities_input, entities_bagofwords) = create_bow_embedded_layer(\n train=training_features['BOWEntitiesEncoded'],\n test=validation_features['BOWEntitiesEncoded'],\n feature_key = 'BOWEntitiesEncoded',\n max_sequence_length=ENTITIES_MAX_SEQUENCE_LENGTH,\n max_num_tokens=ENTITIES_MAX_NUM_TOKENS)\n\n if ('ScoreBin' in outputs):\n global scorebin_train, scorebin_test, num_scorebin_classes, scorebin_classes\n vocab_order = np.sort(training_labels.unique())\n (scorebin_train, scorebin_test, num_scorebin_classes, scorebin_classes) = create_categorical_label_or_feature(\n training_nparray = training_features['ScoreBin'],\n test_nparray = validation_features['ScoreBin'],\n vocab_order=vocab_order) \n print(\"Using %d unique values for ScoreBin\" % num_scorebin_classes)\n\n if ('NumCommentersBin' in outputs):\n global numcommentersbin_train, numcommentersbin_test, num_numcommentersbin_classes, numcommentersbin_classes\n vocab_order = np.sort(training_features['NumCommentersBin'].unique())\n (numcommentersbin_train, numcommentersbin_test, num_numcommentersbin_classes, numcommentersbin_classes) = create_categorical_label_or_feature(\n training_nparray = training_features['NumCommentersBin'],\n test_nparray = validation_features['NumCommentersBin'],\n vocab_order=vocab_order) \n print(\"Using %d unique values for NumCommentersBin\" % num_numcommentersbin_classes)\n \n \n ########################## \n # Merge input branches and build the model\n ##########################\n\n def _create_subreddit_model(model_type='multiclass'):\n \"\"\"\n Creates Multi-Class Single-Label model using softmax\n \"\"\"\n \n # Bring together the Inputs\n input_layers = []\n preconcat_layers = []\n for s in inputs:\n if s=='Tags':\n input_layers.append(tags_input)\n preconcat_layers.append(tags_bagofwords)\n elif s=='BOWEntitiesEncoded':\n input_layers.append(entities_input)\n preconcat_layers.append(entities_bagofwords)\n elif s=='Domain':\n input_layers.append(domain_input)\n preconcat_layers.append(domain_input)\n elif s=='RedditSubmitter':\n input_layers.append(submitter_input)\n preconcat_layers.append(submitter_input)\n elif s=='Subreddit':\n input_layers.append(subreddit_input)\n preconcat_layers.append(subreddit_input)\n\n if len(preconcat_layers) > 1:\n joined_1 = keras.layers.concatenate(preconcat_layers, axis=-1)\n elif len(preconcat_layers) == 1:\n joined_1 = preconcat_layers[0]\n else:\n raise ValueError('No valid inputs among %s' % (','.join(inputs)))\n \n # Connect to Hidden Layers\n hidden_1 = Dense(HIDDEN_UNITS_L1, activation='relu')(joined_1)\n dropout_1 = Dropout(DROPOUT_L1)(hidden_1)\n \n if model_type=='multiclass':\n output_activation='softmax'\n loss_function = 'categorical_crossentropy'\n elif model_type=='multilabel':\n output_activation='sigmoid'\n loss_function = 'binary_crossentropy'\n \n # Add the outputs\n output_layers = []\n for s in outputs:\n if s=='Subreddit':\n layer = Dense(num_subreddit_classes, activation=output_activation, name='subreddit_output')(dropout_1)\n output_layers.append(layer)\n elif s=='RedditSubmitter':\n layer = Dense(num_submitter_classes, activation=output_activation, name='submitter_output')(dropout_1)\n output_layers.append(layer)\n elif s=='ScoreBin':\n layer = Dense(num_scorebin_classes, activation=output_activation, name='scorebin_output')(dropout_1)\n output_layers.append(layer)\n elif s=='NumCommentersBin':\n layer = Dense(num_numcommentersbin_classes, activation=output_activation, name='numcommentersbin_output')(dropout_1)\n output_layers.append(layer)\n \n model = Model(inputs=input_layers, outputs=output_layers)\n\n \n def top_k_accuracy(y_true, y_pred):\n return top_k_categorical_accuracy(y_true, y_pred, k=k_of_top_k_accuracy)\n \n if k_of_top_k_accuracy==5:\n metrics=['accuracy','top_k_categorical_accuracy']\n else:\n metrics=['accuracy',top_k_accuracy]\n \n model.compile(optimizer='adam',\n loss=loss_function,\n # loss_weights=[1., 0.2]\n metrics=metrics)\n \n\n return model\n \n global x_train, x_test, y_train, y_test\n \n if current_learning_goal in ['SubredditClassification','CommentsClassification']:\n model = _create_subreddit_model(model_type='multiclass') \n elif current_learning_goal==\"MlbSubredditClassification\":\n model = _create_subreddit_model(model_type='multilabel')\n\n x_train = {}\n x_test = {}\n \n for s in inputs:\n \n if s=='Tags':\n x_train['Tags'] = tags_train\n x_test['Tags'] = tags_test\n elif s=='BOWEntitiesEncoded':\n x_train['BOWEntitiesEncoded'] = entities_train\n x_test['BOWEntitiesEncoded'] = entities_test\n elif s=='Domain':\n x_train['Domain'] = domain_train\n x_test['Domain'] = domain_test\n elif s=='RedditSubmitter':\n x_train['RedditSubmitter'] = submitter_train\n x_test['RedditSubmitter'] = submitter_test\n elif s=='Subreddit':\n x_train['Subreddit'] = subreddit_train\n x_test['Subreddit'] = subreddit_test\n \n y_train = {}\n y_test = {}\n\n for s in outputs:\n \n if s=='Subreddit':\n y_train['subreddit_output'] = subreddit_train\n y_test['subreddit_output'] = subreddit_test\n elif s=='RedditSubmitter':\n y_train['submitter_output'] = submitter_train\n y_test['submitter_output'] = submitter_test\n elif s=='ScoreBin':\n y_train['scorebin_output'] = scorebin_train\n y_test['scorebin_output'] = scorebin_test\n elif s=='NumCommentersBin':\n y_train['numcommentersbin_output'] = numcommentersbin_train\n y_test['numcommentersbin_output'] = numcommentersbin_test\n \n \n \"\"\"\n callbacks = [\n keras.callbacks.TensorBoard(\n log_dir=tb_log_dir, \n histogram_freq=1, \n embeddings_freq=1, \n )\n ]\n \"\"\"\n \n if use_sample_weights==True:\n if len(outputs) == 1:\n sample_weight = np.array(training_features[EXAMPLE_WEIGHT_COL])\n else:\n sample_weight = []\n for s in outputs:\n sample_weight.append(np.array(training_features[EXAMPLE_WEIGHT_COL]))\n else:\n sample_weight = None\n\n \n history = model.fit(x_train, y_train, \n epochs=current_epochs, batch_size=BATCH_SIZE,\n verbose=2, validation_split=VALIDATION_SPLIT,\n sample_weight = sample_weight)\n\n score = model.evaluate(x_test, y_test, batch_size=BATCH_SIZE, verbose=0)\n\n if len(outputs)==1:\n print('Test data loss: %.3f; top 1 accuracy: %.3f; top %d accuracy: %.3f;'%(score[0],score[1], k_of_top_k_accuracy, score[2]))\n elif len(outputs)==2:\n print('Test metrics: total loss: %.3f; output_1 loss: %.3f; output_2 loss: %.3f; output_1 top 1 accuracy: %.3f; output_1 top %d accuracy: %.3f; output_2 top 1 accuracy: %.3f; output_2 top %d accuracy: %.3f;'%(score[0],score[1],score[2],score[3],k_of_top_k_accuracy,score[4],score[5],k_of_top_k_accuracy,score[6]))\n\n return (model, history, x_train, x_test, y_train, y_test)\n\ndef get_true_and_predicted_labels(model, x_test, y_test_selected, label_classes, multi_output=True, output_idx=0):\n \n \"\"\"\n Run predictions and determine y_true and y_pred filled with labels, not indexes \n \"\"\"\n y_pred_probs = model.predict(x_test) # shape: num outputs x num samples x num classes\n y_pred_probs = np.array(y_pred_probs)\n\n if multi_output==True:\n y_pred_idx = np.argmax(y_pred_probs[output_idx],axis=1) \n else:\n y_pred_idx = np.argmax(y_pred_probs,axis=1) \n \n y_true_idx = np.argmax(y_test_selected,axis=1)\n\n y_pred = np.array([label_classes[i] for i in y_pred_idx])\n y_true = np.array([label_classes[i] for i in y_true_idx])\n\n return (y_true, y_pred)\n\n\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "OpFnSPRI83D5", - "colab_type": "text" + "_cell_guid": "77ea1148-cba2-48f6-a01b-765309008578", + "_uuid": "e84fb010039afe48cc5af8433e74b486a6f88b41", + "colab_type": "text", + "id": "OpFnSPRI83D5" }, "cell_type": "markdown", - "source": [ - "## Calculate Multi-Label Metrics" - ] + "source": "## Calculate Multi-Label Metrics" }, { "metadata": { - "id": "PXtcYY3RrRLI", - "colab_type": "code", + "_cell_guid": "b7ed1a43-f826-4c1c-a28b-8c2e51431da7", + "_uuid": "181be58e6b5abcddc0b8288cf1cadc94c83d7ef5", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } - } + }, + "colab_type": "code", + "collapsed": true, + "id": "PXtcYY3RrRLI", + "trusted": true }, "cell_type": "code", - "source": [ - "# Multi-Label Accuracy calculation based on https://github.com/suraj-deshmukh/Multi-Label-Image-Classification/blob/master/miml.ipynb\n", - "\n", - "from sklearn.metrics import matthews_corrcoef, hamming_loss, label_ranking_loss, accuracy_score\n", - "from sklearn.metrics import roc_curve, auc\n", - "\n", - "CASE_TYPE_HEADERS = ['100% TP+TN','50%+ TP', '1-49% TP', '0% TP']\n", - "\n", - "\n", - "def eval_multilabel_metrics(model, x_test, y_true):\n", - " \"\"\"\n", - " Returns:\n", - " y_pred = the matrix of predicted labels\n", - " \"\"\"\n", - " y_pred_probs = model.predict(x_test)\n", - " y_pred_probs = np.array(y_pred_probs)\n", - "\n", - " ttl_test_samples = y_true.shape[0] \n", - " num_classes = y_true.shape[1]\n", - "\n", - "\n", - " threshold = np.arange(0.05,0.95,0.05)\n", - "\n", - " acc = []\n", - " accuracies = []\n", - " best_threshold = np.zeros(y_pred_probs.shape[1])\n", - " for i in range(y_pred_probs.shape[1]):\n", - " y_prob = np.array(y_pred_probs[:,i])\n", - " \n", - " old_settings = np.seterr(all='ignore') # prevent warnings. matthews_corrcoef handles the NaN case\n", - " for j in threshold:\n", - " y_pred = [1 if prob>=j else 0 for prob in y_prob]\n", - " mcc = matthews_corrcoef(y_true[:,i],y_pred)\n", - " acc.append(mcc)\n", - " np.seterr(**old_settings)\n", - "\n", - " acc = np.array(acc)\n", - " index = np.where(acc==acc.max()) \n", - " accuracies.append(acc.max()) \n", - " best_threshold[i] = threshold[index[0][0]]\n", - " acc = []\n", - "\n", - "\n", - " y_pred = np.array([[1 if y_pred_probs[i,j]>=best_threshold[j] else 0 for j in range(num_classes)] for i in range(ttl_test_samples)])\n", - "\n", - "\n", - " total_correctly_predicted = len([i for i in range(ttl_test_samples) if (y_true[i]==y_pred[i]).sum() == num_classes])\n", - " print('Total correctly predicted: %d out of %d (absolute accuracy: %.3f)' % (total_correctly_predicted,ttl_test_samples, total_correctly_predicted/float(ttl_test_samples)))\n", - "\n", - " acc_score = accuracy_score(y_true,y_pred) #same as above\n", - " h_loss = hamming_loss(y_true,y_pred)\n", - " r_loss = label_ranking_loss(y_true,y_pred_probs)\n", - "\n", - " print('Multi-label accuracy score: %.3f' % acc_score)\n", - " print('Hamming loss: %.3f' % h_loss)\n", - " print('Label ranking loss: %.3f' % r_loss)\n", - "\n", - " return (y_pred, acc_score,h_loss,r_loss)\n", - "\n", - "\n", - "\n", - "def prettyprint_nparray(nparray, col_headers=None, row_headers=None):\n", - " df = pd.DataFrame(nparray)\n", - " if col_headers is not None:\n", - " df.columns = col_headers\n", - " if row_headers is not None:\n", - " df.index = row_headers\n", - " print(df)\n", - "\n", - "def get_label_bin_header(bin):\n", - " \n", - " l_start = (2 ** max((bin-1),0)) + 1\n", - " l_end = 2 ** bin\n", - " if (l_start >= l_end):\n", - " res = '%d'%l_end\n", - " else:\n", - " res = '%d..%d'%(l_start,l_end) \n", - " return res\n", - "\n", - "def gen_label_bin_headers(max_bin):\n", - " \n", - " res=[]\n", - " for i in range(max_bin+1):\n", - " res.append(get_label_bin_header(i))\n", - " return res\n", - " \n", - " \n", - "\n", - "def calc_multilabel_accuracy_stats(y_true, y_pred):\n", - "\n", - " ttl_test_samples = y_true.shape[0]\n", - " num_classes = y_true.shape[1]\n", - " \n", - " max_num_true_labels = max([y_true[i].sum() for i in range(ttl_test_samples)])\n", - " max_bin = np.ceil(np.log2(max_num_true_labels)).astype(int)\n", - "\n", - " stats_num_cases = np.zeros((max_bin+1,4),dtype=int)\n", - " stats_num_samples = np.zeros((max_bin+1),dtype=int)\n", - " # matrix for indexes in x_test for examples; initialize with np.inf\n", - " example_by_casetype_bin = np.full((max_bin+1,4),-1,dtype=int) \n", - "\n", - " for i in range(ttl_test_samples):\n", - "\n", - " num_true_labels = y_true[i].sum()\n", - " label_bin = np.ceil(np.log2(num_true_labels)).astype(int)\n", - "\n", - " num_all_matches = (y_true[i]==y_pred[i]).sum() # 1's and 0's need to match - the most stringent condition\n", - " num_1_matches = np.array([ 1 if y_true[i][j]==y_pred[i][j] and y_true[i][j] ==1 else 0 for j in range(num_classes) ]).sum() # the 1's match \n", - "\n", - " if (num_all_matches == num_classes):\n", - " case_type = 0 # 100% True Positives and 100% True Negatives \n", - " elif (num_1_matches/float(num_true_labels) >= 0.5):\n", - " case_type = 1\n", - " elif (num_1_matches/float(num_true_labels) > 0.0):\n", - " case_type = 2\n", - " else:\n", - " case_type = 3\n", - "\n", - " stats_num_samples[label_bin] += 1\n", - " stats_num_cases[label_bin,case_type] += 1\n", - " \n", - " if example_by_casetype_bin[label_bin,case_type] == -1:\n", - " example_by_casetype_bin[label_bin,case_type] = i\n", - "\n", - " stats_num_cases_ratios = stats_num_cases.astype(float)\n", - "\n", - " for i in range(stats_num_cases_ratios.shape[0]):\n", - " # stats_num_cases_ratios[i] = stats_num_cases_ratios[i] / stats_num_samples[i].astype(float)\n", - " stats_num_cases_ratios[i] = stats_num_cases_ratios[i] / ttl_test_samples\n", - "\n", - " stats_num_cases_ratios = np.around(stats_num_cases_ratios, decimals=3) \n", - " stats_by_casetype = np.sum(stats_num_cases_ratios,0)\n", - "\n", - " return (stats_num_samples, stats_num_cases, stats_num_cases_ratios, stats_by_casetype, example_by_casetype_bin)\n", - "\n", - "\n", - "\n", - "\n", - "def get_input_values_at(npdict, idx):\n", - " \n", - " \"\"\"\n", - " Args\n", - " npdict: dictionary of numpy arrays representing train or test datasets.\n", - " used in multi-input keras functional models\n", - " Returns \n", - " result_list_nparrays: list of single-element numpy arrays populated by \n", - " values from npdict located at the same 'idx' position. \n", - " Can be used for model.predict calls on a single data point\n", - " result_dict_nparrays: dictionary of single-element numpy arrays\n", - " \n", - " \"\"\"\n", - " result_list_nparrays = [] # TODO: remove the nparray output, as it can cause errors during predictions if keys are sorted differently\n", - " result_dict_nparrays = {} # the dictionary preserves the key\n", - " for k,v in npdict.items():\n", - " v_at_idx = np.array([v[idx]])\n", - " result_list_nparrays.append( v_at_idx )\n", - " result_dict_nparrays[k] = v_at_idx\n", - " return (result_list_nparrays,result_dict_nparrays)\n", - "\n", - "\n", - "def decode_domain(domain_enc_nparray):\n", - " \n", - " idx = np.argmax(domain_enc_nparray)\n", - " domain = domain_classes[idx]\n", - " \n", - " return domain\n", - "\n", - "def decode_submitter(submitter_enc_nparray):\n", - " \n", - " idx = np.argmax(submitter_enc_nparray)\n", - " submitter = submitter_classes[idx]\n", - " \n", - " return submitter\n", - "\n", - "def decode_tags(tags_enc, show_unknown=False):\n", - " \n", - " \"\"\"\n", - " Args:\n", - " tags_enc - numpy array with just 1 row\n", - " \"\"\"\n", - " if show_unknown:\n", - " tags_class = lambda idx: '' if idx==0 else tags_inverted_dict[idx]\n", - " else:\n", - " tags_class = lambda idx: '' if idx==0 else tags_inverted_dict[idx]\n", - " \n", - " #tags_decoded = np.array([tags_class(tags_enc[0,idx]) for idx in range(tags_enc.shape[1])])\n", - " #tags_str = np.array_str(tags_decoded)\n", - " \n", - " tags_str = ''\n", - " \n", - " for idx in range(tags_enc.shape[1]):\n", - " tag = tags_class(tags_enc[0,idx])\n", - " tags_str = ''.join([tags_str, ' ' + tag])\n", - " \n", - " return tags_str\n", - "\n", - "def decode_single_input(single_input_dict):\n", - " \n", - " single_input_str=''\n", - " \n", - " for k,v in single_input_dict.items():\n", - " single_feature_str=''\n", - " \n", - " if k=='Tags':\n", - " single_feature_str = decode_tags(v)\n", - " elif k=='Domain':\n", - " single_feature_str = decode_domain(v)\n", - " elif k=='RedditSubmitter':\n", - " single_feature_str = decode_submitter(v)\n", - " else:\n", - " single_feature_str = 'Decode function not implemented'\n", - " \n", - " single_input_str = ''.join([single_input_str, ' %s [%s]' % (k,single_feature_str) ])\n", - " \n", - " return single_input_str\n", - "\n", - "def get_class_indeces(nhot_class_array):\n", - " class_indeces = np.nonzero(nhot_class_array)[0]\n", - " return class_indeces\n", - "\n", - "def get_classes(class_indeces, classes_dict):\n", - " \n", - " res=[]\n", - " for i in range(class_indeces.shape[0]):\n", - " cl = classes_dict[class_indeces[i]]\n", - " res.append(cl)\n", - " return res\n", - "\n", - "def decode_classes(nhot_class_array, classes_dict):\n", - " class_indeces = get_class_indeces(nhot_class_array)\n", - " classes = get_classes(class_indeces, classes_dict)\n", - " res = ','.join(classes)\n", - " return res\n", - "\n", - "def print_singlelabel_prediction_samples(y_true, classes_dict,\n", - " top_prediction_K = 5,\n", - " top1_pred_tofind = 1,\n", - " topK_pred_tofind = 1,\n", - " notintopK_pred_tofind = 1,\n", - " start_idx=0):\n", - "\n", - " ttl_test_samples = y_true.shape[0]\n", - " \n", - " str_top1=''\n", - " str_topK=''\n", - " str_notintopK=''\n", - "\n", - " i = start_idx\n", - " all_examples_found = False\n", - " \n", - " while (not all_examples_found) and i < ttl_test_samples:\n", - "\n", - " (single_input, single_input_dict) = get_input_values_at(x_test, i) # \n", - " prediction = model.predict(single_input_dict) # resulting prediction is 2D array with shape (1,1)\n", - " prediction = prediction.flatten() # convert to 1D array\n", - " \n", - " # take K largest elements (might be unsorted)\n", - " topKidx = np.argpartition(prediction, -top_prediction_K)[-top_prediction_K:] \n", - " # sort first (will be in asc order), then reverse array\n", - " topKidx = topKidx[np.argsort(prediction[topKidx])]\n", - " topKidx = topKidx[::-1]\n", - "\n", - " str_testcase=''\n", - " str_testcase = ''.join([str_testcase,'Test record index #%d '%i]) \n", - "\n", - " pred_input = decode_single_input(single_input_dict)\n", - "\n", - " str_testcase = ''.join([str_testcase,'Prediction input: %s\\n' % pred_input])\n", - " url_str = get_url_and_reddit_post(validation_features,i)\n", - " str_testcase = ''.join([str_testcase,url_str])\n", - "\n", - " \n", - " # what is the actual label?\n", - " #actual_label_idx = np.argmax(y_true[i])\n", - " actual_label_idx = get_class_indeces(y_true[i])\n", - " actual_label_idx = actual_label_idx[0]\n", - " actual_label = classes_dict[actual_label_idx]\n", - "\n", - " # is it in top K predictions?\n", - " found_str = ''\n", - " num_prediction=top_prediction_K+1 # set it to a +1 value to represent \"not in top K\"\n", - "\n", - " found_in_topK = np.nonzero(topKidx == actual_label_idx)\n", - " if (len(found_in_topK[0]) > 0):\n", - " num_prediction = found_in_topK[0][0] + 1\n", - " found_str = ('[ #' + str(num_prediction) + ' prediction]') \n", - " else:\n", - " found_str = ('[ not found among ' + str(top_prediction_K) + ' top predictions]')\n", - "\n", - " # build the string with top K classes and their probabilities \n", - " pred_str = ''\n", - " for j in range(top_prediction_K):\n", - " proba = prediction[topKidx[j]]\n", - " pred_class = classes_dict[topKidx[j]]\n", - " pred_str = ''.join([pred_str, pred_class + ' (' + '%.2f'%proba + ') '])\n", - "\n", - " str_testcase = ''.join([str_testcase,'Top %d predicted labels: %s\\n'%(top_prediction_K,pred_str)]) \n", - " str_testcase = ''.join([str_testcase,'Actual label: %s %s\\n' % (actual_label,found_str)])\n", - "\n", - " if num_prediction == 1:\n", - " if top1_pred_tofind > 0:\n", - " top1_pred_tofind-=1\n", - " str_top1 = ''.join([str_top1,str_testcase,'\\n'])\n", - " elif num_prediction <= 5:\n", - " if topK_pred_tofind > 0:\n", - " topK_pred_tofind-=1 \n", - " str_topK = ''.join([str_topK,str_testcase,'\\n'])\n", - " else:\n", - " if notintopK_pred_tofind > 0:\n", - " notintopK_pred_tofind-=1\n", - " str_notintopK = ''.join([str_notintopK,str_testcase,'\\n'])\n", - "\n", - " i += 1\n", - " all_examples_found = True if (top1_pred_tofind + topK_pred_tofind + notintopK_pred_tofind) == 0 else False\n", - "\n", - " print('Examples of exact matches (Actual Label = Top 1 Predicted Label):\\n%s'%str_top1)\n", - " print('Examples of approx. matches (Actual Label in Top %d Predicted Labels):\\n%s'%(top_prediction_K,str_topK))\n", - " print('Examples of bad matches (Actual Label not in Top %d predictions):\\n%s'%(top_prediction_K,str_notintopK))\n", - "\n", - " return\n", - "\n", - "def plot_metrics(history):\n", - " acc = history.history['acc']\n", - " val_acc = history.history['val_acc']\n", - " loss = history.history['loss']\n", - " val_loss = history.history['val_loss']\n", - " \n", - " epochs = range(1, len(acc) + 1)\n", - " \n", - " plt.plot(epochs, acc, 'bo', label='Training acc')\n", - " plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", - " plt.title('Training and validation accuracy')\n", - " plt.legend()\n", - " \n", - " plt.figure()\n", - " \n", - " plt.plot(epochs, loss, 'bo', label='Training loss')\n", - " plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", - " plt.title('Training and validation loss')\n", - " plt.legend()\n", - " \n", - " plt.show()\n", - " return\n", - "\n", - "\n", - "def get_url_and_reddit_post(df, idx):\n", - " \n", - " res_str = ''\n", - " \n", - " if URL_COL in df.columns:\n", - " val = df[URL_COL][idx]\n", - " res_str = ''.join([res_str, 'News Urls: %s\\n' % val]) \n", - " elif URL_LIST_COL in df.columns:\n", - " val = df[URL_LIST_COL][idx]\n", - " res_str = ''.join([res_str, 'News Urls: %s\\n' % val]) \n", - " \n", - " if REDDIT_POSTURL_COL in df.columns:\n", - " val = df[REDDIT_POSTURL_COL][idx]\n", - " res_str = ''.join([res_str, 'Reddit Post Urls: %s\\n' % val]) \n", - " elif REDDIT_POSTURL_LIST_COL in df.columns:\n", - " val = df[REDDIT_POSTURL_LIST_COL][idx]\n", - " res_str = ''.join([res_str, 'Reddit Post Urls: %s\\n' % val]) \n", - " \n", - " return res_str\n", - " \n", - " \n", - "\n", - "\n", - "def print_prediction_and_input(idx, notes, y_true, y_pred, classes_dict):\n", - " \n", - " print('Test record index #%d %s'%(idx,notes))\n", - " print(get_url_and_reddit_post(validation_features,idx))\n", - " \n", - " (single_input, single_input_dict) = get_input_values_at(x_test, idx) \n", - " pred_input = decode_single_input(single_input_dict)\n", - " print('Prediction input: %s' % pred_input)\n", - "\n", - " predicted_classes = decode_classes(y_pred[idx], classes_dict)\n", - " print('Predicted classes: %s' % predicted_classes)\n", - "\n", - " true_classes = decode_classes(y_true[idx], classes_dict)\n", - " print('True/Actual classes: %s' % true_classes)\n", - "\n", - "\n", - "def calc_multilabel_precision_recall(y_true, y_pred):\n", - " summary_df = pd.DataFrame(np.empty(0, dtype=[('subreddit', 'U'), \n", - " ('sum_true', 'u4'), ('sum_pred', 'u4'), \n", - " ('sum_TP', 'u4'), ('recall','f4'),\n", - " ('precision','f4'), ('f1_score','f4')]))\n", - " ttl_num_samples = y_true.shape[0]\n", - "\n", - " for i in range(num_subreddit_classes):\n", - " subreddit = '' if i==0 else subreddit_classes[i]\n", - " summary_df.at[i,'subreddit'] = subreddit\n", - " summary_df.at[i,'sum_true'] = np.sum(y_true[:, i])\n", - " summary_df.at[i,'sum_pred'] = np.sum(y_pred[:, i])\n", - " num_1_matches = (np.array([ 1 if y_true[j][i]==y_pred[j][i] and y_true[j][i] ==1 else 0 for j in range(ttl_num_samples) ])).sum() # the 1's match \n", - " summary_df.at[i,'sum_TP'] = num_1_matches\n", - "\n", - " summary_df['recall'] = summary_df['sum_TP'] / summary_df['sum_true'] #https://en.wikipedia.org/wiki/Precision_and_recall\n", - " summary_df['precision'] = summary_df['sum_TP'] / summary_df['sum_pred'] \n", - " summary_df['f1_score'] = 2 * summary_df['recall'] * summary_df['precision'] / (summary_df['recall'] + summary_df['precision'])\n", - " \n", - " summary_df.set_index('subreddit',inplace=True)\n", - "\n", - " return summary_df\n", - "\n", - "\n", - "def plot_confusion_matrix(y_true, y_pred, class_order,\n", - " normalize=False,\n", - " title='Confusion matrix',\n", - " cmap=plt.cm.Blues):\n", - " \"\"\"\n", - " This function plots the confusion matrix.\n", - " Args:\n", - " y_true and y_pred need to be class labels\n", - " use class_order to define order in the CM matrix\n", - " Normalization can be applied by setting `normalize=True`\n", - " \n", - " \"\"\"\n", - " \n", - " found_classes = np.unique(np.concatenate((np.unique(y_true), np.unique(y_pred))))\n", - " found_and_ordered = []\n", - " for s in class_order: # preserve order\n", - " index = np.where(found_classes==s) \n", - " numfound = len(index[0])\n", - " if numfound > 0:\n", - " found_and_ordered.append(s)\n", - "\n", - " cm = metrics.confusion_matrix(y_true, y_pred, labels=found_and_ordered)\n", - " \n", - " if normalize:\n", - " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", - "\n", - " np.set_printoptions(precision=2)\n", - " \n", - " num_classes = len(found_and_ordered)\n", - " show_text = True if num_classes < 21 else False\n", - " \n", - " # Plot normalized confusion matrix\n", - " plt.figure(1,figsize=(8,8))\n", - " \n", - " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", - " plt.title(title)\n", - " plt.colorbar()\n", - " tick_marks = np.arange(num_classes)\n", - " plt.xticks(tick_marks, found_and_ordered, rotation=45)\n", - " plt.yticks(tick_marks, found_and_ordered)\n", - " \n", - " #ax.tick_params(axis=u'both', which=u'both',length=0)\n", - " \n", - " if show_text==True:\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", - " horizontalalignment=\"center\",\n", - " color=\"white\" if cm[i, j] > thresh else \"black\")\n", - "\n", - " plt.tight_layout()\n", - " plt.ylabel('True label')\n", - " plt.xlabel('Predicted label')\n", - " \n", - " plt.show()\n", - "\n", - "def plot_roc_curves(y_true, y_pred):\n", - "\n", - " # Compute ROC curve and ROC area for each class\n", - " fpr = dict()\n", - " tpr = dict()\n", - " roc_auc = dict()\n", - " for i in range(num_subreddit_classes):\n", - " fpr[i], tpr[i], _ = roc_curve(y_true[:, i], y_pred[:, i])\n", - " roc_auc[i] = auc(fpr[i], tpr[i])\n", - "\n", - " # Compute micro-average ROC curve and ROC area\n", - " fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_true.ravel(), y_pred.ravel())\n", - " roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n", - "\n", - " plt.figure(figsize=(8,8))\n", - " plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n", - " plt.xlim([0.0, 1.0])\n", - " plt.ylim([0.0, 1.05])\n", - " plt.xlabel('False Positive Rate')\n", - " plt.ylabel('True Positive Rate')\n", - " plt.title('Receiver operating characteristic example')\n", - " plt.legend(loc=\"lower right\")\n", - " lw = 1\n", - "\n", - " for i in range(num_subreddit_classes):\n", - "\n", - " plt.plot(fpr[i], tpr[i], color='darkorange',\n", - " lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[i])\n", - "\n", - " plt.show()\n", - "\n", - "\n" - ], - "execution_count": 0, + "source": "# Multi-Label Accuracy calculation based on https://github.com/suraj-deshmukh/Multi-Label-Image-Classification/blob/master/miml.ipynb\n\nfrom sklearn.metrics import matthews_corrcoef, hamming_loss, label_ranking_loss, accuracy_score\nfrom sklearn.metrics import roc_curve, auc\n\nCASE_TYPE_HEADERS = ['100% TP+TN','50%+ TP', '1-49% TP', '0% TP']\n\n\ndef eval_multilabel_metrics(model, x_test, y_true):\n \"\"\"\n Returns:\n y_pred = the matrix of predicted labels\n \"\"\"\n y_pred_probs = model.predict(x_test)\n y_pred_probs = np.array(y_pred_probs)\n\n ttl_test_samples = y_true.shape[0] \n num_classes = y_true.shape[1]\n\n\n threshold = np.arange(0.05,0.95,0.05)\n\n acc = []\n accuracies = []\n best_threshold = np.zeros(y_pred_probs.shape[1])\n for i in range(y_pred_probs.shape[1]):\n y_prob = np.array(y_pred_probs[:,i])\n \n old_settings = np.seterr(all='ignore') # prevent warnings. matthews_corrcoef handles the NaN case\n for j in threshold:\n y_pred = [1 if prob>=j else 0 for prob in y_prob]\n mcc = matthews_corrcoef(y_true[:,i],y_pred)\n acc.append(mcc)\n np.seterr(**old_settings)\n\n acc = np.array(acc)\n index = np.where(acc==acc.max()) \n accuracies.append(acc.max()) \n best_threshold[i] = threshold[index[0][0]]\n acc = []\n\n\n y_pred = np.array([[1 if y_pred_probs[i,j]>=best_threshold[j] else 0 for j in range(num_classes)] for i in range(ttl_test_samples)])\n\n\n total_correctly_predicted = len([i for i in range(ttl_test_samples) if (y_true[i]==y_pred[i]).sum() == num_classes])\n print('Total correctly predicted: %d out of %d (absolute accuracy: %.3f)' % (total_correctly_predicted,ttl_test_samples, total_correctly_predicted/float(ttl_test_samples)))\n\n acc_score = accuracy_score(y_true,y_pred) #same as above\n h_loss = hamming_loss(y_true,y_pred)\n r_loss = label_ranking_loss(y_true,y_pred_probs)\n\n print('Multi-label accuracy score: %.3f' % acc_score)\n print('Hamming loss: %.3f' % h_loss)\n print('Label ranking loss: %.3f' % r_loss)\n\n return (y_pred, acc_score,h_loss,r_loss)\n\n\n\ndef prettyprint_nparray(nparray, col_headers=None, row_headers=None):\n df = pd.DataFrame(nparray)\n if col_headers is not None:\n df.columns = col_headers\n if row_headers is not None:\n df.index = row_headers\n print(df)\n\ndef get_label_bin_header(bin):\n \n l_start = (2 ** max((bin-1),0)) + 1\n l_end = 2 ** bin\n if (l_start >= l_end):\n res = '%d'%l_end\n else:\n res = '%d..%d'%(l_start,l_end) \n return res\n\ndef gen_label_bin_headers(max_bin):\n \n res=[]\n for i in range(max_bin+1):\n res.append(get_label_bin_header(i))\n return res\n \n \n\ndef calc_multilabel_accuracy_stats(y_true, y_pred):\n\n ttl_test_samples = y_true.shape[0]\n num_classes = y_true.shape[1]\n \n max_num_true_labels = max([y_true[i].sum() for i in range(ttl_test_samples)])\n max_bin = np.ceil(np.log2(max_num_true_labels)).astype(int)\n\n stats_num_cases = np.zeros((max_bin+1,4),dtype=int)\n stats_num_samples = np.zeros((max_bin+1),dtype=int)\n # matrix for indexes in x_test for examples; initialize with np.inf\n example_by_casetype_bin = np.full((max_bin+1,4),-1,dtype=int) \n\n for i in range(ttl_test_samples):\n\n num_true_labels = y_true[i].sum()\n label_bin = np.ceil(np.log2(num_true_labels)).astype(int)\n\n num_all_matches = (y_true[i]==y_pred[i]).sum() # 1's and 0's need to match - the most stringent condition\n num_1_matches = np.array([ 1 if y_true[i][j]==y_pred[i][j] and y_true[i][j] ==1 else 0 for j in range(num_classes) ]).sum() # the 1's match \n\n if (num_all_matches == num_classes):\n case_type = 0 # 100% True Positives and 100% True Negatives \n elif (num_1_matches/float(num_true_labels) >= 0.5):\n case_type = 1\n elif (num_1_matches/float(num_true_labels) > 0.0):\n case_type = 2\n else:\n case_type = 3\n\n stats_num_samples[label_bin] += 1\n stats_num_cases[label_bin,case_type] += 1\n \n if example_by_casetype_bin[label_bin,case_type] == -1:\n example_by_casetype_bin[label_bin,case_type] = i\n\n stats_num_cases_ratios = stats_num_cases.astype(float)\n\n for i in range(stats_num_cases_ratios.shape[0]):\n # stats_num_cases_ratios[i] = stats_num_cases_ratios[i] / stats_num_samples[i].astype(float)\n stats_num_cases_ratios[i] = stats_num_cases_ratios[i] / ttl_test_samples\n\n stats_num_cases_ratios = np.around(stats_num_cases_ratios, decimals=3) \n stats_by_casetype = np.sum(stats_num_cases_ratios,0)\n\n return (stats_num_samples, stats_num_cases, stats_num_cases_ratios, stats_by_casetype, example_by_casetype_bin)\n\n\n\n\ndef get_input_values_at(npdict, idx):\n \n \"\"\"\n Args\n npdict: dictionary of numpy arrays representing train or test datasets.\n used in multi-input keras functional models\n Returns \n result_list_nparrays: list of single-element numpy arrays populated by \n values from npdict located at the same 'idx' position. \n Can be used for model.predict calls on a single data point\n result_dict_nparrays: dictionary of single-element numpy arrays\n \n \"\"\"\n result_list_nparrays = [] # TODO: remove the nparray output, as it can cause errors during predictions if keys are sorted differently\n result_dict_nparrays = {} # the dictionary preserves the key\n for k,v in npdict.items():\n v_at_idx = np.array([v[idx]])\n result_list_nparrays.append( v_at_idx )\n result_dict_nparrays[k] = v_at_idx\n return (result_list_nparrays,result_dict_nparrays)\n\n\ndef decode_domain(domain_enc_nparray):\n \n idx = np.argmax(domain_enc_nparray)\n domain = domain_classes[idx]\n \n return domain\n\ndef decode_submitter(submitter_enc_nparray):\n \n idx = np.argmax(submitter_enc_nparray)\n submitter = submitter_classes[idx]\n \n return submitter\n\ndef decode_tags(tags_enc, show_unknown=False):\n \n \"\"\"\n Args:\n tags_enc - numpy array with just 1 row\n \"\"\"\n if show_unknown:\n tags_class = lambda idx: '' if idx==0 else tags_inverted_dict[idx]\n else:\n tags_class = lambda idx: '' if idx==0 else tags_inverted_dict[idx]\n \n #tags_decoded = np.array([tags_class(tags_enc[0,idx]) for idx in range(tags_enc.shape[1])])\n #tags_str = np.array_str(tags_decoded)\n \n tags_str = ''\n \n for idx in range(tags_enc.shape[1]):\n tag = tags_class(tags_enc[0,idx])\n tags_str = ''.join([tags_str, ' ' + tag])\n \n return tags_str\n\ndef decode_single_input(single_input_dict):\n \n single_input_str=''\n \n for k,v in single_input_dict.items():\n single_feature_str=''\n \n if k=='Tags':\n single_feature_str = decode_tags(v)\n elif k=='Domain':\n single_feature_str = decode_domain(v)\n elif k=='RedditSubmitter':\n single_feature_str = decode_submitter(v)\n else:\n single_feature_str = 'Decode function not implemented'\n \n single_input_str = ''.join([single_input_str, ' %s [%s]' % (k,single_feature_str) ])\n \n return single_input_str\n\ndef get_class_indeces(nhot_class_array):\n class_indeces = np.nonzero(nhot_class_array)[0]\n return class_indeces\n\ndef get_classes(class_indeces, classes_dict):\n \n res=[]\n for i in range(class_indeces.shape[0]):\n cl = classes_dict[class_indeces[i]]\n res.append(cl)\n return res\n\ndef decode_classes(nhot_class_array, classes_dict):\n class_indeces = get_class_indeces(nhot_class_array)\n classes = get_classes(class_indeces, classes_dict)\n res = ','.join(classes)\n return res\n\ndef print_singlelabel_prediction_samples(y_true, classes_dict,\n top_prediction_K = 5,\n top1_pred_tofind = 1,\n topK_pred_tofind = 1,\n notintopK_pred_tofind = 1,\n start_idx=0):\n\n ttl_test_samples = y_true.shape[0]\n \n str_top1=''\n str_topK=''\n str_notintopK=''\n\n i = start_idx\n all_examples_found = False\n \n while (not all_examples_found) and i < ttl_test_samples:\n\n (single_input, single_input_dict) = get_input_values_at(x_test, i) # \n prediction = model.predict(single_input_dict) # resulting prediction is 2D array with shape (1,1)\n prediction = prediction.flatten() # convert to 1D array\n \n # take K largest elements (might be unsorted)\n topKidx = np.argpartition(prediction, -top_prediction_K)[-top_prediction_K:] \n # sort first (will be in asc order), then reverse array\n topKidx = topKidx[np.argsort(prediction[topKidx])]\n topKidx = topKidx[::-1]\n\n str_testcase=''\n str_testcase = ''.join([str_testcase,'Test record index #%d '%i]) \n\n pred_input = decode_single_input(single_input_dict)\n\n str_testcase = ''.join([str_testcase,'Prediction input: %s\\n' % pred_input])\n url_str = get_url_and_reddit_post(validation_features,i)\n str_testcase = ''.join([str_testcase,url_str])\n\n \n # what is the actual label?\n #actual_label_idx = np.argmax(y_true[i])\n actual_label_idx = get_class_indeces(y_true[i])\n actual_label_idx = actual_label_idx[0]\n actual_label = classes_dict[actual_label_idx]\n\n # is it in top K predictions?\n found_str = ''\n num_prediction=top_prediction_K+1 # set it to a +1 value to represent \"not in top K\"\n\n found_in_topK = np.nonzero(topKidx == actual_label_idx)\n if (len(found_in_topK[0]) > 0):\n num_prediction = found_in_topK[0][0] + 1\n found_str = ('[ #' + str(num_prediction) + ' prediction]') \n else:\n found_str = ('[ not found among ' + str(top_prediction_K) + ' top predictions]')\n\n # build the string with top K classes and their probabilities \n pred_str = ''\n for j in range(top_prediction_K):\n proba = prediction[topKidx[j]]\n pred_class = classes_dict[topKidx[j]]\n pred_str = ''.join([pred_str, pred_class + ' (' + '%.2f'%proba + ') '])\n\n str_testcase = ''.join([str_testcase,'Top %d predicted labels: %s\\n'%(top_prediction_K,pred_str)]) \n str_testcase = ''.join([str_testcase,'Actual label: %s %s\\n' % (actual_label,found_str)])\n\n if num_prediction == 1:\n if top1_pred_tofind > 0:\n top1_pred_tofind-=1\n str_top1 = ''.join([str_top1,str_testcase,'\\n'])\n elif num_prediction <= 5:\n if topK_pred_tofind > 0:\n topK_pred_tofind-=1 \n str_topK = ''.join([str_topK,str_testcase,'\\n'])\n else:\n if notintopK_pred_tofind > 0:\n notintopK_pred_tofind-=1\n str_notintopK = ''.join([str_notintopK,str_testcase,'\\n'])\n\n i += 1\n all_examples_found = True if (top1_pred_tofind + topK_pred_tofind + notintopK_pred_tofind) == 0 else False\n\n print('Examples of exact matches (Actual Label = Top 1 Predicted Label):\\n%s'%str_top1)\n print('Examples of approx. matches (Actual Label in Top %d Predicted Labels):\\n%s'%(top_prediction_K,str_topK))\n print('Examples of bad matches (Actual Label not in Top %d predictions):\\n%s'%(top_prediction_K,str_notintopK))\n\n return\n\ndef plot_metrics(history):\n acc = history.history['acc']\n val_acc = history.history['val_acc']\n loss = history.history['loss']\n val_loss = history.history['val_loss']\n \n epochs = range(1, len(acc) + 1)\n \n plt.plot(epochs, acc, 'bo', label='Training acc')\n plt.plot(epochs, val_acc, 'b', label='Validation acc')\n plt.title('Training and validation accuracy')\n plt.legend()\n \n plt.figure()\n \n plt.plot(epochs, loss, 'bo', label='Training loss')\n plt.plot(epochs, val_loss, 'b', label='Validation loss')\n plt.title('Training and validation loss')\n plt.legend()\n \n plt.show()\n return\n\n\ndef get_url_and_reddit_post(df, idx):\n \n res_str = ''\n \n if URL_COL in df.columns:\n val = df[URL_COL][idx]\n res_str = ''.join([res_str, 'News Urls: %s\\n' % val]) \n elif URL_LIST_COL in df.columns:\n val = df[URL_LIST_COL][idx]\n res_str = ''.join([res_str, 'News Urls: %s\\n' % val]) \n \n if REDDIT_POSTURL_COL in df.columns:\n val = df[REDDIT_POSTURL_COL][idx]\n res_str = ''.join([res_str, 'Reddit Post Urls: %s\\n' % val]) \n elif REDDIT_POSTURL_LIST_COL in df.columns:\n val = df[REDDIT_POSTURL_LIST_COL][idx]\n res_str = ''.join([res_str, 'Reddit Post Urls: %s\\n' % val]) \n \n return res_str\n \n \n\n\ndef print_prediction_and_input(idx, notes, y_true, y_pred, classes_dict):\n \n print('Test record index #%d %s'%(idx,notes))\n print(get_url_and_reddit_post(validation_features,idx))\n \n (single_input, single_input_dict) = get_input_values_at(x_test, idx) \n pred_input = decode_single_input(single_input_dict)\n print('Prediction input: %s' % pred_input)\n\n predicted_classes = decode_classes(y_pred[idx], classes_dict)\n print('Predicted classes: %s' % predicted_classes)\n\n true_classes = decode_classes(y_true[idx], classes_dict)\n print('True/Actual classes: %s' % true_classes)\n\n\ndef calc_multilabel_precision_recall(y_true, y_pred):\n summary_df = pd.DataFrame(np.empty(0, dtype=[('subreddit', 'U'), \n ('sum_true', 'u4'), ('sum_pred', 'u4'), \n ('sum_TP', 'u4'), ('recall','f4'),\n ('precision','f4'), ('f1_score','f4')]))\n ttl_num_samples = y_true.shape[0]\n\n for i in range(num_subreddit_classes):\n subreddit = '' if i==0 else subreddit_classes[i]\n summary_df.at[i,'subreddit'] = subreddit\n summary_df.at[i,'sum_true'] = np.sum(y_true[:, i])\n summary_df.at[i,'sum_pred'] = np.sum(y_pred[:, i])\n num_1_matches = (np.array([ 1 if y_true[j][i]==y_pred[j][i] and y_true[j][i] ==1 else 0 for j in range(ttl_num_samples) ])).sum() # the 1's match \n summary_df.at[i,'sum_TP'] = num_1_matches\n\n summary_df['recall'] = summary_df['sum_TP'] / summary_df['sum_true'] #https://en.wikipedia.org/wiki/Precision_and_recall\n summary_df['precision'] = summary_df['sum_TP'] / summary_df['sum_pred'] \n summary_df['f1_score'] = 2 * summary_df['recall'] * summary_df['precision'] / (summary_df['recall'] + summary_df['precision'])\n \n summary_df.set_index('subreddit',inplace=True)\n\n return summary_df\n\n\ndef plot_confusion_matrix(y_true, y_pred, class_order,\n normalize=False,\n title='Confusion matrix',\n cmap=plt.cm.Blues):\n \"\"\"\n This function plots the confusion matrix.\n Args:\n y_true and y_pred need to be class labels\n use class_order to define order in the CM matrix\n Normalization can be applied by setting `normalize=True`\n \n \"\"\"\n \n found_classes = np.unique(np.concatenate((np.unique(y_true), np.unique(y_pred))))\n found_and_ordered = []\n for s in class_order: # preserve order\n index = np.where(found_classes==s) \n numfound = len(index[0])\n if numfound > 0:\n found_and_ordered.append(s)\n\n cm = metrics.confusion_matrix(y_true, y_pred, labels=found_and_ordered)\n \n if normalize:\n cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\n np.set_printoptions(precision=2)\n \n num_classes = len(found_and_ordered)\n show_text = True if num_classes < 21 else False\n \n # Plot normalized confusion matrix\n plt.figure(1,figsize=(8,8))\n \n plt.imshow(cm, interpolation='nearest', cmap=cmap)\n plt.title(title)\n plt.colorbar()\n tick_marks = np.arange(num_classes)\n plt.xticks(tick_marks, found_and_ordered, rotation=45)\n plt.yticks(tick_marks, found_and_ordered)\n \n #ax.tick_params(axis=u'both', which=u'both',length=0)\n \n if show_text==True:\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 horizontalalignment=\"center\",\n color=\"white\" if cm[i, j] > thresh else \"black\")\n\n plt.tight_layout()\n plt.ylabel('True label')\n plt.xlabel('Predicted label')\n \n plt.show()\n\ndef plot_roc_curves(y_true, y_pred):\n\n # Compute ROC curve and ROC area for each class\n fpr = dict()\n tpr = dict()\n roc_auc = dict()\n for i in range(num_subreddit_classes):\n fpr[i], tpr[i], _ = roc_curve(y_true[:, i], y_pred[:, i])\n roc_auc[i] = auc(fpr[i], tpr[i])\n\n # Compute micro-average ROC curve and ROC area\n fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_true.ravel(), y_pred.ravel())\n roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n\n plt.figure(figsize=(8,8))\n plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n plt.xlim([0.0, 1.0])\n plt.ylim([0.0, 1.05])\n plt.xlabel('False Positive Rate')\n plt.ylabel('True Positive Rate')\n plt.title('Receiver operating characteristic example')\n plt.legend(loc=\"lower right\")\n lw = 1\n\n for i in range(num_subreddit_classes):\n\n plt.plot(fpr[i], tpr[i], color='darkorange',\n lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[i])\n\n plt.show()\n\n\n", + "execution_count": null, "outputs": [] }, { "metadata": { - "id": "FjDTPSp39hLD", - "colab_type": "text" + "_cell_guid": "dd069671-61e8-404a-a1c4-e3668f10cba1", + "_uuid": "c08a5bd1fc05a3efb157650b9adc00d15344df85", + "colab_type": "text", + "id": "FjDTPSp39hLD" }, "cell_type": "markdown", - "source": [ - "### Tags to Subreddit Classification" - ] + "source": "### Tags to Subreddit Classification" }, { "metadata": { - "id": "ck6u5eWcYg1U", - "colab_type": "code", + "_cell_guid": "9eeaf0d7-d3ab-495f-96f6-cdbc27d989e3", + "_uuid": "7a7eb43535679b9a7a2a1cbe26b05655f41ae31c", "colab": { "autoexec": { "startup": false, "wait_interval": 0 - } - } + }, + "height": 108 + }, + "colab_type": "code", + "collapsed": true, + "executionInfo": { + "elapsed": 1691, + "status": "ok", + "timestamp": 1525651242327, + "user": { + "displayName": "Sergei Sokolenko", + "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", + "userId": "106652311097239389877" + }, + "user_tz": 420 + }, + "id": "ck6u5eWcYg1U", + "outputId": "69b9baee-5e10-402a-b5a1-1943cdba470e", + "trusted": true }, "cell_type": "code", - "source": [ - "current_learning_goal = 'SubredditClassification'\n", - "set_columns_for_goal()\n", - "reddit_df = get_bq_data_for_goal()\n", - "(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()" - ], - "execution_count": 0, + "source": "current_learning_goal = 'SubredditClassification'\nset_columns_for_goal()\nreddit_df = get_data_for_goal()\n(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()", + "execution_count": null, "outputs": [] }, { "metadata": { - "id": "FjLYRPZYaZIq", - "colab_type": "code", + "_cell_guid": "b14ef9ad-8ba7-46a3-ba02-fdc8072b83dd", + "_uuid": "fecc4d9df2c05dfe20040e8e9a44e625cc4a3672", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {}, - {} - ], "height": 709 }, - "outputId": "62316e7b-e304-4dac-ab4b-2f8150ca35af", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 49321, "status": "ok", - "timestamp": 1518588338595, - "user_tz": 480, - "elapsed": 60270, + "timestamp": 1525651291697, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "FjLYRPZYaZIq", + "outputId": "095affb7-705c-4479-91a1-dc6b3671f268", + "trusted": true }, "cell_type": "code", - "source": [ - "# Tags -> Subreddit \n", - "# Single-Label Classification\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['Tags'], outputs=['Subreddit'])\n", - "SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n", - "\n", - "\n", - "\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 150 unique values for subreddit\n", - "Using 41309 unique values for Tags\n", - "Train on 110434 samples, validate on 12271 samples\n", - "Epoch 1/2\n", - " - 24s - loss: 3.7336 - acc: 0.1626 - top_k_categorical_accuracy: 0.4307 - val_loss: 3.3839 - val_acc: 0.2056 - val_top_k_categorical_accuracy: 0.5074\n", - "Epoch 2/2\n", - " - 24s - loss: 3.0322 - acc: 0.2662 - top_k_categorical_accuracy: 0.5822 - val_loss: 3.2503 - val_acc: 0.2318 - val_top_k_categorical_accuracy: 0.5458\n", - "Test data loss: 3.239; top 1 accuracy: 0.229; top 5 accuracy: 0.545;\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "image/svg+xml": "\n\nG\n\n\n140566337781840\n\nTags: InputLayer\n\n\n140566588553232\n\nembedding_1: Embedding\n\n\n140566337781840->140566588553232\n\n\n\n\n140566379221200\n\nflatten_1: Flatten\n\n\n140566588553232->140566379221200\n\n\n\n\n140566116768592\n\ndense_1: Dense\n\n\n140566379221200->140566116768592\n\n\n\n\n140566358571920\n\ndropout_1: Dropout\n\n\n140566116768592->140566358571920\n\n\n\n\n140566195231440\n\nsubreddit_output: Dense\n\n\n140566358571920->140566195231440\n\n\n\n\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 7 - } - ] + "source": "# Tags -> Subreddit \n# Single-Label Classification\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['Tags'], outputs=['Subreddit'])\n\ntry:\n SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\nexcept ImportError:\n print('Unable to import pydot and graphviz.') \n pass\n\n\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "kNIOJZdgUkM3", - "colab_type": "code", + "_cell_guid": "55f558b5-6f79-4683-acae-a224f7af28e5", + "_uuid": "1b0e73f7cc63d98b7f9c021815ef42ca14999fcb", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], - "height": 563 + "height": 562 }, - "outputId": "c64c3e4e-abe4-443f-cb71-4e8e136adf9b", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 4096, "status": "ok", - "timestamp": 1517943542996, - "user_tz": 480, - "elapsed": 4111, + "timestamp": 1525651295885, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "kNIOJZdgUkM3", + "outputId": "e07a950a-2a6d-4bfc-8669-4f8b12b70fb1", + "trusted": true }, "cell_type": "code", - "source": [ - "y_pred_probs = model.predict(x_test)\n", - "y_pred_probs = np.array(y_pred_probs)\n", - "\n", - "y_pred = np.argmax(y_pred_probs,axis=1)\n", - "y_true = np.argmax(y_test['subreddit_output'],axis=1)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, classes_dict=subreddit_classes)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\n3hCpDx4yn3/+eYlTUg+DxMREbG1tpazG27dv58aNG2zZsoXGjRvz7rvv0r59e1588UV8fHz47LPP\ncHNzIzs7G3Nzc06fPs2mTZtYv34906dPx8vLi02bNjF06FA2bNjACy+8IB37btOmDUlJSaSkpODq\n6sq6desICQmhTp06fPHFF0ydOpVdu3bRrFkzFAoFn332GV27dqVx48b4+flJ24P/+te/yu2PYXWl\nUsrIKyz68abnarFVKWg6K5jbq3xR5xedejKsVMxNICtPh7W5XHomt0Av6TDIGO7laPRYmP5Pf/Gr\nQdZYWfGrwYpiaEfxshR1IXWtTIzWHZOuwdnW9L7rrmr7qiJraJOxMa/uumuDvtrSF71eX+lnV1v6\n8jBkjf32a2pfHkRfjkZXLZOauuO3VS70AKR891K16i8PMaG5R9LT05k4cSIymYykpCTkcjl169bl\n7t27ODo60r9//3ua0AQFBbFx40ag6B+tUaNGMWnSpBIyf/zxB5988glyuZz4+Hhee+012rdvz/Ll\ny9Fqtbi7u7No0SKUSiVHjhxh9uzZmJmZodFo8PLyIicnh7t372JpaYlarSY5ORmdTsfkyZP55ptv\naNOmDZcvXyY/P59mzZqRlZVFeno6rVu35s6dO5iYmJCZmYmDgwO//fYbvXv3pqCggDp16vD666+z\nadMmPD09OXHiBGlpabi4uBASElJun3V6cSRRIBAIHhd1J1TzhGbL45nQiNQH94itrS1BQUEEBgYy\nZswYJk2aRGBgIEFBQchkMmbPnl3lyUxoaCjfffcdmzdvJjg4mF27dmFlZVVGrnfv3uzZs4egoCC8\nvb1p3LgxPXr0IDAwkD179vDRRx9J23WtW7dGo9GwYcMGzp49i42NDWlpaWRkZLBq1SoOHjxI7969\nsba2ZubMmXTs2BEo8mkyNTVl6tSpNGzYECcnJ5YtW8bzzz/PjBkzkMvlNG/enF27dmFra4utrS0b\nNmzA19eXL774gnPnznHy5En69u3L//3f/1XYb2M+NAafmavxOQD8cjZOKjfIRCXmlngmW1N2Hz0t\np8ivJqOYf03pq7F7UHb//0ZSLjeSco3KGnxocgv00nMGf5XMvMr9YyryNSivffcjaxijbI2+wnaV\n1pejET40tU2f6MvDka0u/6L7kRU+NPeGmNA8RLRaLQsWLGDo0KFMnjxZOoUVHR3NlClTGDVqFGPH\n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\nXLlCT0+PSLa+dOkSBgYGNDY2YmZmJmjC0nNTKpU0NDTg4+NDYWEh8+fPp6ysjEmTJtHZ2SkCFMvK\nyggMDCQ0NJTc3FxKSkoIDAwkIiKC8vJy5s+fT3R0NOnp6XR3d2Nra8uZM2dEgrmrq6tgMEnWdkl4\nbWhoKAI1pddUCotUq9VUVVURHByMkZERjx8/FsDJCRMm0NnZKThYa9euJSsrCwAbGxu2b98umEUm\nJibs2rVLHKp+++03MjIyyM/PFyRsKctJeowqlQpPT0/WrFmDQqEgJSUFc3NzTE1NGRgYoKKigpqa\nGl5++WXu3r3LyZMnsbe3x9ramnv37qFWqxkeHmblypXC5t/d3c3ixYvZunUr4eHh+Pv7i2uvkZGR\ncFX+55K4NlOnTiUkJERcW3v+7AnNk4bmSf07loaGBrW1tRw9epT58+djY2ODhoYGVVVVuLm5oaur\nK5wPhw8fxtTUFB8fH3p6ekhKSmL79u1YWlqKtZX0hQOEEyUiIgKZTMbf/vY37ty5Q0pKihiZS6f0\nwsJCBgYGBOJe0kb4+flRXV1Nc3MzFhYWuLu7CwLs008/zauvvsrDhw/Jy8vDzMyMy5cvY2VlxcOH\nDxk3bhx6enrCjaGhoUFYWBh1dXU0NTUxZcoUDhw4IBxcEmSuurqaoaEhpk6dSmlpKf39/cjlcubM\nmUNNTQ0ODg7MmTOHnJwcgZzv7u5mypQptLS0iFF0Z2cnAQEBnD59Wtz0PTw8SE1Nxd7entHRUSws\nLLCxscHJyYmmpiYR+KZUKvn666/p6uoiOTmZ0NBQqqqqRCKvlpYW3d3dODo6oq2tLVZbkntJctoM\nDAzQ0dGBgYEBn3zyCWq1muTkZMzMzMjOzsbX15eioiKWLl3KzJkzqa+v5+zZs2hra3P27FlUKhWr\nV6/m1q1baGlpkZeXx+3bt5kxYwZKpZLu7m6WLFlCS0sLiYmJDA8Ps379etLT03n8+DFdXV00Nzdj\nb2+PlpYWDQ0NtLW1ER0dTV1dHe3t7QQHB2Nvb8+NGzdQKpWUlJSQkJAg9Ec9PT2YmJgI/ZIkCpf0\nJGlpacyePZusrCwSEhKoqKjg6tWr4uZ09+5dkY5eWFiIlpYWpaWlInsrKysLtVpNWloaenp6ODo6\nUlxc/Ie1T39/Pzo6OiJSA34Xui9YsIAVK1bQ0dFBb2+vsOJ6eHiQnp6Ovb09t2/fZubMmdjY2Lxk\n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\niY6OFkZ/n376KbNnz0ZaWpqDBw+yY8cOZGVl+fXXXxk+fDj79u0jIyODpqYmLC0tGTJkCDt37sTE\nxES4WN+8eVMcyh9++CGJiYloaGhQUVFBe3s7d+/epaSkhIMHD7JkyRLq6+vZtm0b8+fPx8DAgLKy\nMlatWoWnpyepqanIyMgwadIkCgsLiY2NRVVVlTfeeAM9PT1CQ0O5fPky58+f59y5c7S2trJ8+fLf\ndd7+ChUVFfzyyy+MGDECgPj4eNrb27l9+zbS0tK88cYbbNq0ieLiYgwMDPj666+xtrb+22ImJiaG\njIwMTp06JVyMy8vLCQ8Px9vbm2HDhpGQkICWlpbwiYqMjGTs2LHY2tpy9OhRTp8+zc6dO4VruZaW\nFrGxsbz22mt4e3v/7Zr+KXT2/rMdmpcFzUv8H4+/65Boa2sTEhKChoaGkAvn5+dz9+5dYTA1uKF9\n8MEH5ObmUlpaSmpqKu+88w4dHR3k5eWhpqbG+++/z8SJE9HV1f3Da6iurubJkyfo6elx8+ZNNm/e\nTEtLC+np6YJobGhoyMDAgHCZHT58OHV1dRQVFTFy5Ejk5eX/8LhSUlKkp6eTkpKCnZ0dNjY2VFdX\n09nZKXgSHR0dODs7iyya30YtaGtrs3fvXsaNGycCNf8MxcXFbNq0iZ07d9LZ2UlycjIzZszA39+f\ncePGibGCqqoqx48fZ/78+bS1tWFtbc327dvx9/enurqa0tJSfH19kZaWRiKRYGFhwdatWxkYGOC1\n115j2rRpv2vJ/3bTnjZtGmlpaZw9exZdXV0ePHjApk2bqKioYOnSpdjY2AgOx9ixYzE2Nubs2bMk\nJCRgY2NDUFAQFy9e5MGDB+JAGzVqFJs3b8bPz4/e3l5kZGRQVlYWjtAhISH4+Phw/fp1+vv7uXTp\nEikpKaSnp6OpqUl3d7dYS3BwMH5+ftTU1ODi4oKysjKmpqYEBwczefJkjIyM6Orqor+/H3l5eZKT\nk3Fzc2Pq1KlYW1tz+fJlYmNjcXV1FTEKAJMmTRLP29rair29PZMnT6asrIzq6mqeP39OWFgYXV1d\n5OfnM3r0aK5evcrevXu5dOkS/f39JCcnY2xszKlTp5CSkuLevXvs2rULa2trqqqqKCoqwsfHBykp\nKZGaraamxpMnT8jIyCAmJoaamhqMjY25cOECjY2NeHp6Mn78eJydnfH29qa9vR1zc3OWLFmCpaXl\n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\naJGnrPQAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['subreddit_output'],\n multi_output=False,\n label_classes=subreddit_classes)\n\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=subreddit_classes)", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "7rLH231h92JZ", - "colab_type": "text" + "_cell_guid": "fcaa5368-e9f3-4a22-ba4c-0283bd47d311", + "_uuid": "d0c4da1dba84811bb067cfb168696bcbfb3f3d32", + "colab_type": "text", + "id": "7rLH231h92JZ" }, "cell_type": "markdown", - "source": [ - "### Tags to Subreddit Samples" - ] + "source": "### Tags to Subreddit Samples" }, { "metadata": { - "id": "W4ateLd5ztyd", - "colab_type": "code", + "_cell_guid": "6a66b485-7a0c-48c2-9c37-602105941b88", + "_uuid": "c10f518b9010b7fdddb182f17413030d8f94cefa", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 443 }, - "outputId": "5f06fd95-967d-4d13-bf47-cf99c357b117", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 150, "status": "ok", - "timestamp": 1518588426461, - "user_tz": 480, - "elapsed": 442, + "timestamp": 1525651296223, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "W4ateLd5ztyd", + "outputId": "f14d6d67-7d97-4ab0-f6b1-d369fd7257c9", + "trusted": true }, "cell_type": "code", - "source": [ - "print_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], \n", - " classes_dict=subreddit_classes)\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Examples of exact matches (Actual Label = Top 1 Predicted Label):\n", - "Test record index #2 Prediction input: Tags [ intelligence_report voting_software_company vr_systems ]\n", - "News Urls: http://www.nydailynews.com/news/national/russian-hackers-targeted-vote-software-company-officials-report-article-1.3223517\n", - "Reddit Post Urls: https://www.reddit.com/r/politics/comments/6fh0uw/\n", - "Top 5 predicted labels: politics (0.32) The_Donald (0.15) news (0.06) EnoughTrumpSpam (0.04) Conservative (0.03) \n", - "Actual label: politics [ #1 prediction]\n", - "\n", - "\n", - "Examples of approx. matches (Actual Label in Top 5 Predicted Labels):\n", - "Test record index #0 Prediction input: Tags [ digital_currency bitcoin_exchange tokyo_stock_exchange virtual_currency ]\n", - "News Urls: https://www.bloomberg.com/news/articles/2017-06-05/bitcoin-mania-infects-japanese-stock-market-s-smaller-listings\n", - "Reddit Post Urls: https://www.reddit.com/r/Bitcoin/comments/6fk8cc/\n", - "Top 5 predicted labels: BitcoinAll (0.36) Bitcoin (0.29) ethernews (0.16) CryptoCurrency (0.12) BTCNews (0.05) \n", - "Actual label: Bitcoin [ #2 prediction]\n", - "\n", - "\n", - "Examples of bad matches (Actual Label not in Top 5 predictions):\n", - "Test record index #1 Prediction input: Tags [ minimum_wage higher_minimum_wage working_hour seattle minimum_wage_hike many_people employer]\n", - "News Urls: https://www.bloomberg.com/view/articles/2017-06-27/a-sign-to-go-slow-on-the-15-minimum-wage\n", - "Reddit Post Urls: https://www.reddit.com/r/economy/comments/6k3y0y/\n", - "Top 5 predicted labels: politics (0.20) SandersForPresident (0.12) The_Donald (0.07) news (0.07) WayOfTheBern (0.05) \n", - "Actual label: economy [ not found among 5 top predictions]\n", - "\n", - "\n" - ], - "name": "stdout" - } - ] + "source": "print_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], \n classes_dict=subreddit_classes)\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "fj_z6yNK9-sA", - "colab_type": "text" + "_cell_guid": "735b4ce9-f604-4170-a3eb-9f0dd5411496", + "_uuid": "3879d6a202a22ac84177672b0a345b9dcf579d09", + "colab_type": "text", + "id": "fj_z6yNK9-sA" }, "cell_type": "markdown", - "source": [ - "### BOWEntitiesEncoded to Subreddit Classification" - ] + "source": "### BOWEntitiesEncoded to Subreddit Classification" }, { "metadata": { - "id": "s7MxXCyw6v5h", - "colab_type": "code", + "_cell_guid": "3656c250-9dc6-4c65-b26b-e936293b4a94", + "_uuid": "c1a9b5c463f152441c802426f51e08983ca8c31c", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 585 }, - "outputId": "bf52d495-4632-4964-ca9e-2ee1acb4dc78", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 96588, "status": "ok", - "timestamp": 1518588560021, - "user_tz": 480, - "elapsed": 117403, + "timestamp": 1525651392946, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "s7MxXCyw6v5h", + "outputId": "e775a66a-6370-4b24-961a-e34ad4088973", + "trusted": true }, "cell_type": "code", - "source": [ - "\n", - "# BOWEntitiesEncoded -> Subreddit \n", - "# Single-Label Classification\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded'], outputs=['Subreddit'])\n", - "\n", - "# SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n", - "\n", - "print_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], classes_dict=subreddit_classes)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 150 unique values for subreddit\n", - "Using 32376 unique values for BOWEntitiesEncoded\n", - "Train on 110434 samples, validate on 12271 samples\n", - "Epoch 1/2\n", - " - 45s - loss: 3.5663 - acc: 0.1836 - top_k_categorical_accuracy: 0.4605 - val_loss: 3.1908 - val_acc: 0.2349 - val_top_k_categorical_accuracy: 0.5445\n", - "Epoch 2/2\n", - " - 46s - loss: 2.8923 - acc: 0.2726 - top_k_categorical_accuracy: 0.6065 - val_loss: 3.0652 - val_acc: 0.2497 - val_top_k_categorical_accuracy: 0.5727\n", - "Test data loss: 3.078; top 1 accuracy: 0.244; top 5 accuracy: 0.572;\n", - "Examples of exact matches (Actual Label = Top 1 Predicted Label):\n", - "Test record index #2 Prediction input: BOWEntitiesEncoded [Decode function not implemented]\n", - "News Urls: http://www.nydailynews.com/news/national/russian-hackers-targeted-vote-software-company-officials-report-article-1.3223517\n", - "Reddit Post Urls: https://www.reddit.com/r/politics/comments/6fh0uw/\n", - "Top 5 predicted labels: politics (0.20) news (0.10) technology (0.09) The_Donald (0.05) worldnewshub (0.03) \n", - "Actual label: politics [ #1 prediction]\n", - "\n", - "\n", - "Examples of approx. matches (Actual Label in Top 5 Predicted Labels):\n", - "Test record index #0 Prediction input: BOWEntitiesEncoded [Decode function not implemented]\n", - "News Urls: https://www.bloomberg.com/news/articles/2017-06-05/bitcoin-mania-infects-japanese-stock-market-s-smaller-listings\n", - "Reddit Post Urls: https://www.reddit.com/r/Bitcoin/comments/6fk8cc/\n", - "Top 5 predicted labels: BitcoinAll (0.27) ethernews (0.21) Bitcoin (0.16) CryptoCurrency (0.12) MilitaryProcurement (0.05) \n", - "Actual label: Bitcoin [ #3 prediction]\n", - "\n", - "\n", - "Examples of bad matches (Actual Label not in Top 5 predictions):\n", - "Test record index #7 Prediction input: BOWEntitiesEncoded [Decode function not implemented]\n", - "News Urls: http://www.thejournal.ie/harris-cabinet-leo-varadkar-3429307-Jun2017/\n", - "Reddit Post Urls: https://www.reddit.com/r/ireland/comments/6fnhky/\n", - "Top 5 predicted labels: worldnewshub (0.16) worldnews (0.13) news (0.09) TheColorIsBlue (0.08) india (0.07) \n", - "Actual label: ireland [ not found among 5 top predictions]\n", - "\n", - "\n" - ], - "name": "stdout" - } - ] + "source": "\n# BOWEntitiesEncoded -> Subreddit \n# Single-Label Classification\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded'], outputs=['Subreddit'])\n\n# SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n\nprint_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], classes_dict=subreddit_classes)", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "Cgn9JoK3-ICf", - "colab_type": "text" + "_cell_guid": "e6e15f89-f079-438a-ae5f-3ba7a4c1257e", + "_uuid": "b048d0b4b1ee3607829992e11acd00d6de54792d", + "colab_type": "text", + "id": "Cgn9JoK3-ICf" }, "cell_type": "markdown", - "source": [ - "### BOWEntitiesEncoded and Domain to Subreddit Classification" - ] + "source": "### BOWEntitiesEncoded and Domain to Subreddit Classification" }, { "metadata": { - "id": "RzscRUJd9aSM", - "colab_type": "code", + "_cell_guid": "b1f658e7-1455-48ad-8d3d-cd0db36b6348", + "_uuid": "78dffbde2b25ec678ab11459f284673452bdf27b", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {}, - {} - ], "height": 918 }, - "outputId": "7ac26ea3-0999-402d-be2b-7096f6c274fe", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 189419, "status": "ok", - "timestamp": 1518588795800, - "user_tz": 480, - "elapsed": 222680, + "timestamp": 1525651582399, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "RzscRUJd9aSM", + "outputId": "65a18cb1-8576-4d81-e347-8b1f9f7d4f24", + "trusted": true }, "cell_type": "code", - "source": [ - "# BOWEntitiesEncoded, Domain -> Subreddit \n", - "# Single-Label Classification\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit'])\n", - "\n", - "SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))\n", - "\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 150 unique values for subreddit\n", - "Using 4232 unique values for domain\n", - "Using 32376 unique values for BOWEntitiesEncoded\n", - "Train on 110434 samples, validate on 12271 samples\n", - "Epoch 1/2\n", - " - 91s - loss: 2.9042 - acc: 0.3077 - top_k_categorical_accuracy: 0.6233 - val_loss: 2.3575 - val_acc: 0.3844 - val_top_k_categorical_accuracy: 0.7294\n", - "Epoch 2/2\n", - " - 92s - loss: 2.0985 - acc: 0.4194 - top_k_categorical_accuracy: 0.7815 - val_loss: 2.3281 - val_acc: 0.3645 - val_top_k_categorical_accuracy: 0.7388\n", - "Test data loss: 2.350; top 1 accuracy: 0.361; top 5 accuracy: 0.737;\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "image/svg+xml": "\n\nG\n\n\n140566233907024\n\nBOWEntitiesEncoded: InputLayer\n\ninput:\n\noutput:\n\n(None, 100)\n\n(None, 100)\n\n\n140566227169872\n\nembedding_3: Embedding\n\ninput:\n\noutput:\n\n(None, 100)\n\n(None, 100, 27)\n\n\n140566233907024->140566227169872\n\n\n\n\n140566234021968\n\nflatten_3: Flatten\n\ninput:\n\noutput:\n\n(None, 100, 27)\n\n(None, 2700)\n\n\n140566227169872->140566234021968\n\n\n\n\n140566241865680\n\nconcatenate_1: Concatenate\n\ninput:\n\noutput:\n\n[(None, 2700), (None, 4232)]\n\n(None, 6932)\n\n\n140566234021968->140566241865680\n\n\n\n\n140566626281168\n\nDomain: InputLayer\n\ninput:\n\noutput:\n\n(None, 4232)\n\n(None, 4232)\n\n\n140566626281168->140566241865680\n\n\n\n\n140566241863888\n\ndense_3: Dense\n\ninput:\n\noutput:\n\n(None, 6932)\n\n(None, 500)\n\n\n140566241865680->140566241863888\n\n\n\n\n140566240647760\n\ndropout_3: Dropout\n\ninput:\n\noutput:\n\n(None, 500)\n\n(None, 500)\n\n\n140566241863888->140566240647760\n\n\n\n\n140566240648464\n\nsubreddit_output: Dense\n\ninput:\n\noutput:\n\n(None, 500)\n\n(None, 150)\n\n\n140566240647760->140566240648464\n\n\n\n\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 10 - } - ] + "source": "# BOWEntitiesEncoded, Domain -> Subreddit \n# Single-Label Classification\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit'])\n\ntry:\n SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))\nexcept ImportError:\n print('Unable to import pydot and graphviz.') \n pass\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "0_psJ6-d-SoQ", - "colab_type": "text" + "_cell_guid": "00f5c140-837d-4e01-91fa-5fc1823833d5", + "_uuid": "4769dc57c8e893d78016ced6cc2417ecff0dc16f", + "colab_type": "text", + "id": "0_psJ6-d-SoQ" }, "cell_type": "markdown", - "source": [ - "### BOWEntitiesEncoded and Domain to Subreddit Classification Samples" - ] + "source": "### BOWEntitiesEncoded and Domain to Subreddit Classification Samples" }, { "metadata": { - "id": "bNvBG5Pw9e0W", - "colab_type": "code", + "_cell_guid": "9e12160d-c12c-45eb-8277-545d1d4265c8", + "_uuid": "ad2ea68ba446556db07bca0801eba582f0cb1b16", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 443 }, - "outputId": "0a5f302d-8d3e-47c8-ee64-5a01cd45e7e0", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 532, "status": "ok", - "timestamp": 1518588883123, - "user_tz": 480, - "elapsed": 716, + "timestamp": 1525651582975, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "bNvBG5Pw9e0W", + "outputId": "100fc720-19bc-4010-a02f-9c7d7633a23e", + "trusted": true }, "cell_type": "code", - "source": [ - "print_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], \n", - " classes_dict=subreddit_classes,\n", - " start_idx=10)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Examples of exact matches (Actual Label = Top 1 Predicted Label):\n", - "Test record index #12 Prediction input: BOWEntitiesEncoded [Decode function not implemented] Domain [komonews.com]\n", - "News Urls: http://komonews.com/news/local/man-hit-by-bus-in-downtown-suffers-life-threatening-injuries\n", - "Reddit Post Urls: https://www.reddit.com/r/SeattleWA/comments/6f200s/\n", - "Top 5 predicted labels: SeattleWA (0.91) nottheonion (0.02) GunsAreCool (0.01) news (0.01) mobilityreport (0.01) \n", - "Actual label: SeattleWA [ #1 prediction]\n", - "\n", - "\n", - "Examples of approx. matches (Actual Label in Top 5 Predicted Labels):\n", - "Test record index #10 Prediction input: BOWEntitiesEncoded [Decode function not implemented] Domain [bbc.com]\n", - "News Urls: http://www.bbc.com/news/world-europe-40242531\n", - "Reddit Post Urls: https://www.reddit.com/r/worldnewshub/comments/6gmxq4/\n", - "Top 5 predicted labels: worldnews (0.19) worldnewshub (0.12) Raytheon (0.12) news (0.10) europe (0.07) \n", - "Actual label: worldnewshub [ #2 prediction]\n", - "\n", - "\n", - "Examples of bad matches (Actual Label not in Top 5 predictions):\n", - "Test record index #13 Prediction input: BOWEntitiesEncoded [Decode function not implemented] Domain [businessinsider.com]\n", - "News Urls: http://www.businessinsider.com/evidence-russia-meddled-in-us-election-2017-6\n", - "Reddit Post Urls: https://www.reddit.com/r/neutralnews/comments/6j97bf/\n", - "Top 5 predicted labels: politics (0.17) news (0.17) The_Donald (0.10) conspiracy (0.07) Impeach_Trump (0.05) \n", - "Actual label: neutralnews [ not found among 5 top predictions]\n", - "\n", - "\n" - ], - "name": "stdout" - } - ] + "source": "print_singlelabel_prediction_samples(y_true=y_test['subreddit_output'], \n classes_dict=subreddit_classes,\n start_idx=10)", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "GYeIGFz1-bvt", - "colab_type": "text" + "_cell_guid": "68190900-1612-4798-8555-a5afd4e7bf20", + "_uuid": "4ec1c1557fcd58ccb28603942ed22e4dfdd9a60a", + "colab_type": "text", + "id": "GYeIGFz1-bvt" }, "cell_type": "markdown", - "source": [ - "### BOWEntitiesEncoded and Domain to Subreddit and RedditSubmitter Classification" - ] + "source": "### BOWEntitiesEncoded and Domain to Subreddit and RedditSubmitter Classification" }, { "metadata": { - "id": "CtMq7mNe--6L", - "colab_type": "code", + "_cell_guid": "2d931b09-4ca4-4eea-98aa-4ca252552b68", + "_uuid": "bf2e4b4c88ae4496e485ec8460e94654cb268d88", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {}, - {} - ], "height": 862 }, - "outputId": "9cab8e73-75a7-4253-8f44-d72840e52d95", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 242373, "status": "ok", - "timestamp": 1518589167953, - "user_tz": 480, - "elapsed": 276631, + "timestamp": 1525651825463, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "CtMq7mNe--6L", + "outputId": "196f4a60-6887-4455-dac9-040a38404ba2", + "trusted": true }, "cell_type": "code", - "source": [ - "# BOWEntitiesEncoded, Domain -> Subreddit, RedditSubmitter \n", - "# Single-Label Classification\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit','RedditSubmitter'])\n", - "\n", - "SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 150 unique values for subreddit\n", - "Using 4232 unique values for domain\n", - "Using 2020 unique values for submitter\n", - "Using 32376 unique values for BOWEntitiesEncoded\n", - "Train on 110434 samples, validate on 12271 samples\n", - "Epoch 1/2\n", - " - 116s - loss: 7.0773 - subreddit_output_loss: 3.0157 - submitter_output_loss: 4.0617 - subreddit_output_acc: 0.2963 - subreddit_output_top_k_categorical_accuracy: 0.6032 - submitter_output_acc: 0.2745 - submitter_output_top_k_categorical_accuracy: 0.5828 - val_loss: 5.8692 - val_subreddit_output_loss: 2.4344 - val_submitter_output_loss: 3.4348 - val_subreddit_output_acc: 0.3745 - val_subreddit_output_top_k_categorical_accuracy: 0.7168 - val_submitter_output_acc: 0.3253 - val_submitter_output_top_k_categorical_accuracy: 0.6586\n", - "Epoch 2/2\n", - " - 116s - loss: 5.2865 - subreddit_output_loss: 2.2068 - submitter_output_loss: 3.0797 - subreddit_output_acc: 0.4076 - subreddit_output_top_k_categorical_accuracy: 0.7597 - submitter_output_acc: 0.3510 - submitter_output_top_k_categorical_accuracy: 0.6828 - val_loss: 5.5459 - val_subreddit_output_loss: 2.3106 - val_submitter_output_loss: 3.2353 - val_subreddit_output_acc: 0.3726 - val_subreddit_output_top_k_categorical_accuracy: 0.7429 - val_submitter_output_acc: 0.3331 - val_submitter_output_top_k_categorical_accuracy: 0.6818\n", - "Test metrics: total loss: 5.460; output_1 loss: 2.320; output_2 loss: 3.140; output_1 top 1 accuracy: 0.366; output_1 top 5 accuracy: 0.740; output_2 top 1 accuracy: 0.335; output_2 top 5 accuracy: 0.688;\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "image/svg+xml": "\n\nG\n\n\n140566281181200\n\nBOWEntitiesEncoded: InputLayer\n\n\n140566183076304\n\nembedding_4: Embedding\n\n\n140566281181200->140566183076304\n\n\n\n\n140566234301072\n\nflatten_4: Flatten\n\n\n140566183076304->140566234301072\n\n\n\n\n140566222000528\n\nconcatenate_2: Concatenate\n\n\n140566234301072->140566222000528\n\n\n\n\n140566626282384\n\nDomain: InputLayer\n\n\n140566626282384->140566222000528\n\n\n\n\n140566222003600\n\ndense_4: Dense\n\n\n140566222000528->140566222003600\n\n\n\n\n140566095945872\n\ndropout_4: Dropout\n\n\n140566222003600->140566095945872\n\n\n\n\n140566095948240\n\nsubreddit_output: Dense\n\n\n140566095945872->140566095948240\n\n\n\n\n140566125580240\n\nsubmitter_output: Dense\n\n\n140566095945872->140566125580240\n\n\n\n\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 12 - } - ] + "source": "# BOWEntitiesEncoded, Domain -> Subreddit, RedditSubmitter \n# Single-Label Classification\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit','RedditSubmitter'])\n\ntry:\n SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\nexcept ImportError:\n print('Unable to import pydot and graphviz.') \n pass\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "I_NVBbt9-h8U", - "colab_type": "text" + "_cell_guid": "4f5badd5-ec85-45bd-ae1d-169d994e31ce", + "_uuid": "8d2ad011851fce47d1f6c1bee2140c3af499452b", + "colab_type": "text", + "id": "I_NVBbt9-h8U" }, "cell_type": "markdown", - "source": [ - "### Subreddit Multi-Label Classification" - ] + "source": "### Subreddit Multi-Label Classification" }, { "metadata": { - "id": "9Hy0PerZBvZ3", - "colab_type": "code", + "_cell_guid": "dfc0078c-6cd8-4a21-8298-a3b1ac0db29b", + "_uuid": "4df5b08626c13732ed267fd4da6447b5a3adaaf9", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {}, - {}, - {} - ], - "height": 895 + "height": 915 }, - "outputId": "80b0842d-f0ed-4359-a0fd-73653852858e", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 107759, "status": "ok", - "timestamp": 1518590417590, - "user_tz": 480, - "elapsed": 363951, + "timestamp": 1525651933260, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "9Hy0PerZBvZ3", + "outputId": "272ab708-ce78-437f-83b9-de5c9ff0978d", + "trusted": true }, "cell_type": "code", - "source": [ - "# BOWEntitiesEncoded, Domain -> Subreddit \n", - "# Multi-Label Classification\n", - "\n", - "current_learning_goal = 'MlbSubredditClassification'\n", - "set_columns_for_goal()\n", - "reddit_df = get_bq_data_for_goal()\n", - "(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n", - "\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit'])\n", - "\n", - "SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Waiting on bqjob_r6cd4702065323f8b_000001619305507b_2 ... (195s) Current status: DONE " - ], - "name": "stderr" - }, - { - "output_type": "stream", - "text": [ - "\n", - "Size of reddit set: 89313 records\n", - "Size of train set: 70736 records\n", - "Size of test set: 17683 records\n", - "Using 150 unique values for subreddit\n", - "Using 4131 unique values for domain\n", - "Using 32208 unique values for BOWEntitiesEncoded\n", - "Train on 63662 samples, validate on 7074 samples\n", - "Epoch 1/2\n", - " - 50s - loss: 0.0480 - acc: 0.9889 - top_k_categorical_accuracy: 0.5804 - val_loss: 0.0330 - val_acc: 0.9909 - val_top_k_categorical_accuracy: 0.7843\n", - "Epoch 2/2\n", - " - 55s - loss: 0.0292 - acc: 0.9916 - top_k_categorical_accuracy: 0.8237 - val_loss: 0.0288 - val_acc: 0.9917 - val_top_k_categorical_accuracy: 0.8425\n", - "Test data loss: 0.029; top 1 accuracy: 0.992; top 5 accuracy: 0.839;\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "image/svg+xml": "\n\nG\n\n\n140566241865296\n\nBOWEntitiesEncoded: InputLayer\n\n\n140566064428816\n\nembedding_5: Embedding\n\n\n140566241865296->140566064428816\n\n\n\n\n140566626279952\n\nflatten_5: Flatten\n\n\n140566064428816->140566626279952\n\n\n\n\n140566626281424\n\nconcatenate_3: Concatenate\n\n\n140566626279952->140566626281424\n\n\n\n\n140566626281616\n\nDomain: InputLayer\n\n\n140566626281616->140566626281424\n\n\n\n\n140566695132752\n\ndense_5: Dense\n\n\n140566626281424->140566695132752\n\n\n\n\n140566064427920\n\ndropout_5: Dropout\n\n\n140566695132752->140566064427920\n\n\n\n\n140566064427152\n\nsubreddit_output: Dense\n\n\n140566064427920->140566064427152\n\n\n\n\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 13 - } - ] + "source": "# BOWEntitiesEncoded, Domain -> Subreddit \n# Multi-Label Classification\n\ncurrent_learning_goal = 'MlbSubredditClassification'\nset_columns_for_goal()\nreddit_df = get_data_for_goal()\n(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain'], outputs=['Subreddit'])\n\ntry:\n SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\nexcept ImportError:\n print('Unable to import pydot and graphviz.') \n pass\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "wBPVEnYv-sNH", - "colab_type": "text" + "_cell_guid": "bbc9a82b-3209-4cba-aef9-269fb8ab52fe", + "_uuid": "3f95c11a801e43258d24127e53f03184516d08fb", + "colab_type": "text", + "id": "wBPVEnYv-sNH" }, "cell_type": "markdown", - "source": [ - "### Multi-label accuracy metrics" - ] + "source": "### Multi-label accuracy metrics" }, { "metadata": { - "id": "GHuGRKKqZ69m", - "colab_type": "code", + "_cell_guid": "90a3470a-2013-471b-b74c-ca6c540f5541", + "_uuid": "beb6b61b7419f83c1fb5ce130543d9ed2aad01c0", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 88 }, - "outputId": "acbb4b02-750e-4e6f-d131-5fea3ffb3c26", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 137599, "status": "ok", - "timestamp": 1518592539209, - "user_tz": 480, - "elapsed": 127637, + "timestamp": 1525652070875, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "GHuGRKKqZ69m", + "outputId": "9298aa00-ab24-4602-9206-434bebedc44e", + "trusted": true }, "cell_type": "code", - "source": [ - "# Multi-label accuracy metrics\n", - "\n", - "(y_pred,acc_score,h_loss,r_loss) = eval_multilabel_metrics(model, x_test, y_true = y_test['subreddit_output'])\n", - "\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Total correctly predicted: 4509 out of 17683 (absolute accuracy: 0.255)\n", - "Multi-label accuracy score: 0.255\n", - "Hamming loss: 0.014\n", - "Label ranking loss: 0.030\n" - ], - "name": "stdout" - } - ] + "source": "# Multi-label accuracy metrics\n\n(y_pred,acc_score,h_loss,r_loss) = eval_multilabel_metrics(model, x_test, y_true = y_test['subreddit_output'])\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "wH_ncWFOxGDX", - "colab_type": "code", + "_cell_guid": "aa9f9cd8-d73a-4103-810a-2bdff039cc02", + "_uuid": "d83b27a94c903ac2d5c7325ff1a5ee208695344d", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 2310 }, - "outputId": "1c5852da-6543-4995-8e09-a7a01d391740", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 6240, "status": "ok", - "timestamp": 1518592557027, - "user_tz": 480, - "elapsed": 7498, + "timestamp": 1525652077202, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "wH_ncWFOxGDX", + "outputId": "db731d1b-a022-4e79-b0e8-58e7e6f2fba6", + "trusted": true }, "cell_type": "code", - "source": [ - "# Precision and Recall metrics\n", - "#plot_roc_curves(y_true = y_test['subreddit_output'], y_pred=y_pred)\n", - "\n", - "summary_df = calc_multilabel_precision_recall(y_true = y_test['subreddit_output'], y_pred = y_pred)\n", - "#pd.set_option('display.max_rows', 1000)\n", - "print(summary_df)\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - " sum_true sum_pred sum_TP recall precision \\\n", - "subreddit \n", - " 0.0 0.0 0.0 NaN NaN \n", - "politics 2366.0 2652.0 1643.0 0.694421 0.619532 \n", - "worldnewshub 1957.0 3198.0 1108.0 0.566173 0.346467 \n", - "news 1727.0 1225.0 653.0 0.378112 0.533061 \n", - "worldnews 1468.0 2319.0 823.0 0.560627 0.354894 \n", - "the_donald 1357.0 1501.0 725.0 0.534267 0.483011 \n", - "ecointernet 1302.0 1306.0 997.0 0.765745 0.763400 \n", - "thecolorisblue 1244.0 1320.0 1099.0 0.883441 0.832576 \n", - "willis7737_news 685.0 691.0 685.0 1.000000 0.991317 \n", - "india 677.0 819.0 600.0 0.886263 0.732601 \n", - "ukpolitics 601.0 865.0 479.0 0.797005 0.553757 \n", - "raytheon 485.0 898.0 324.0 0.668041 0.360802 \n", - "donaldtrumpwhitehouse 404.0 1708.0 313.0 0.774752 0.183255 \n", - "redditsample 388.0 624.0 341.0 0.878866 0.546474 \n", - "nottheonion 392.0 1038.0 136.0 0.346939 0.131021 \n", - "enoughtrumpspam 358.0 156.0 103.0 0.287709 0.660256 \n", - "unitedkingdom 334.0 957.0 231.0 0.691617 0.241379 \n", - "technology 311.0 236.0 83.0 0.266881 0.351695 \n", - "conspiracy 308.0 156.0 60.0 0.194805 0.384615 \n", - "europe 253.0 99.0 56.0 0.221344 0.565657 \n", - "canada 241.0 434.0 190.0 0.788382 0.437788 \n", - "conservative 285.0 440.0 107.0 0.375439 0.243182 \n", - "skydtech 256.0 256.0 256.0 1.000000 1.000000 \n", - "thecolorisorange 227.0 226.0 226.0 0.995595 1.000000 \n", - "movies 233.0 234.0 162.0 0.695279 0.692308 \n", - "techfeed 241.0 241.0 241.0 1.000000 1.000000 \n", - "mobilityreport 223.0 149.0 104.0 0.466368 0.697987 \n", - "futurology 250.0 321.0 100.0 0.400000 0.311526 \n", - "nofilternews 213.0 1182.0 62.0 0.291080 0.052453 \n", - "bbcnewsuk 205.0 373.0 204.0 0.995122 0.546917 \n", - "... ... ... ... ... ... \n", - "maybetheonion 42.0 25.0 2.0 0.047619 0.080000 \n", - "sino 55.0 15.0 8.0 0.145455 0.533333 \n", - "xboxone 49.0 57.0 27.0 0.551020 0.473684 \n", - "todayilearned 47.0 0.0 0.0 0.000000 NaN \n", - "medical_news 50.0 41.0 33.0 0.660000 0.804878 \n", - "enough_sanders_spam 61.0 172.0 15.0 0.245902 0.087209 \n", - "honolulu 67.0 68.0 64.0 0.955224 0.941176 \n", - "potuswatch_noanon 39.0 34.0 20.0 0.512821 0.588235 \n", - "bubbla 50.0 0.0 0.0 0.000000 NaN \n", - "mensrights 60.0 0.0 0.0 0.000000 NaN \n", - "pakistan 43.0 40.0 31.0 0.720930 0.775000 \n", - "progressive 41.0 138.0 8.0 0.195122 0.057971 \n", - "lacortenews 48.0 43.0 1.0 0.020833 0.023256 \n", - "joinordietrump 54.0 12.0 8.0 0.148148 0.666667 \n", - "the_europe 52.0 54.0 13.0 0.250000 0.240741 \n", - "california 39.0 58.0 10.0 0.256410 0.172414 \n", - "political_revolution 39.0 5.0 2.0 0.051282 0.400000 \n", - "islamunveiled 46.0 26.0 4.0 0.086957 0.153846 \n", - "neoliberal 49.0 0.0 0.0 0.000000 NaN \n", - "btcnews 51.0 41.0 39.0 0.764706 0.951220 \n", - "listen2this 47.0 51.0 47.0 1.000000 0.921569 \n", - "soccer 52.0 25.0 25.0 0.480769 1.000000 \n", - "twoxchromosomes 50.0 0.0 0.0 0.000000 NaN \n", - "portland 50.0 45.0 36.0 0.720000 0.800000 \n", - "socialism 50.0 10.0 2.0 0.040000 0.200000 \n", - "mma 56.0 51.0 49.0 0.875000 0.960784 \n", - "ps4 43.0 25.0 16.0 0.372093 0.640000 \n", - "westernterrorism 52.0 38.0 12.0 0.230769 0.315789 \n", - "badlawyer 55.0 40.0 2.0 0.036364 0.050000 \n", - "canadaweedstocks 50.0 26.0 20.0 0.400000 0.769231 \n", - "\n", - " f1_score \n", - "subreddit \n", - " NaN \n", - "politics 0.654843 \n", - "worldnewshub 0.429874 \n", - "news 0.442412 \n", - "worldnews 0.434645 \n", - "the_donald 0.507348 \n", - "ecointernet 0.764571 \n", - "thecolorisblue 0.857254 \n", - "willis7737_news 0.995640 \n", - "india 0.802139 \n", - "ukpolitics 0.653479 \n", - "raytheon 0.468547 \n", - "donaldtrumpwhitehouse 0.296402 \n", - "redditsample 0.673913 \n", - "nottheonion 0.190210 \n", - "enoughtrumpspam 0.400778 \n", - "unitedkingdom 0.357862 \n", - "technology 0.303473 \n", - "conspiracy 0.258621 \n", - "europe 0.318182 \n", - "canada 0.562963 \n", - "conservative 0.295172 \n", - "skydtech 1.000000 \n", - "thecolorisorange 0.997792 \n", - "movies 0.693790 \n", - "techfeed 1.000000 \n", - "mobilityreport 0.559140 \n", - "futurology 0.350263 \n", - "nofilternews 0.088889 \n", - "bbcnewsuk 0.705882 \n", - "... ... \n", - "maybetheonion 0.059701 \n", - "sino 0.228571 \n", - "xboxone 0.509434 \n", - "todayilearned NaN \n", - "medical_news 0.725275 \n", - "enough_sanders_spam 0.128755 \n", - "honolulu 0.948148 \n", - "potuswatch_noanon 0.547945 \n", - "bubbla NaN \n", - "mensrights NaN \n", - "pakistan 0.746988 \n", - "progressive 0.089385 \n", - "lacortenews 0.021978 \n", - "joinordietrump 0.242424 \n", - "the_europe 0.245283 \n", - "california 0.206186 \n", - "political_revolution 0.090909 \n", - "islamunveiled 0.111111 \n", - "neoliberal NaN \n", - "btcnews 0.847826 \n", - "listen2this 0.959184 \n", - "soccer 0.649351 \n", - "twoxchromosomes NaN \n", - "portland 0.757895 \n", - "socialism 0.066667 \n", - "mma 0.915888 \n", - "ps4 0.470588 \n", - "westernterrorism 0.266667 \n", - "badlawyer 0.042105 \n", - "canadaweedstocks 0.526316 \n", - "\n", - "[150 rows x 6 columns]\n" - ], - "name": "stdout" - } - ] + "source": "# Precision and Recall metrics\n#plot_roc_curves(y_true = y_test['subreddit_output'], y_pred=y_pred)\n\nsummary_df = calc_multilabel_precision_recall(y_true = y_test['subreddit_output'], y_pred = y_pred)\n#pd.set_option('display.max_rows', 1000)\nprint(summary_df)\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "dOIH3fWs-ya-", - "colab_type": "text" + "_cell_guid": "72d3d568-3aa4-4bb8-8daf-b1bf7be7b870", + "_uuid": "d6bd93aaf24747a26937f0f50c400bff7b6f440e", + "colab_type": "text", + "id": "dOIH3fWs-ya-" }, "cell_type": "markdown", - "source": [ - "### Multi-label accuracy by case type" - ] + "source": "### Multi-label accuracy by case type" }, { "metadata": { - "id": "Stb-Yk1e0KRm", - "colab_type": "code", + "_cell_guid": "3b995e8b-38cd-4331-b449-bf31204b7bfa", + "_uuid": "187ade5d162eeef6d54381a26a95a2b251964e5f", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], "height": 763 }, - "outputId": "81cece91-68ad-49da-e5a7-b3ebbb458199", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 3978, "status": "ok", - "timestamp": 1518592578923, - "user_tz": 480, - "elapsed": 3925, + "timestamp": 1525652081257, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "Stb-Yk1e0KRm", + "outputId": "112d8d00-cabc-4c6c-eea7-034cf94a2250", + "trusted": true }, "cell_type": "code", - "source": [ - "(stats_num_samples, stats_num_cases, stats_num_cases_ratios, stats_by_casetype, example_by_casetype_bin) = calc_multilabel_accuracy_stats (\n", - " y_true = y_test['subreddit_output'], y_pred=y_pred)\n", - "\n", - "\n", - "print('Samples by Number of Labels (2^x scale)')\n", - "prettyprint_nparray(stats_num_samples,\n", - " col_headers=['Num Labels'],\n", - " row_headers=gen_label_bin_headers(stats_num_samples.shape[0]-1))\n", - "\n", - "print('\\nSamples by Number of Labels X Case Type')\n", - "prettyprint_nparray(stats_num_cases,\n", - " col_headers=CASE_TYPE_HEADERS,\n", - " row_headers=gen_label_bin_headers(stats_num_cases.shape[0]-1))\n", - " \n", - "print('\\nSamples by Number of Labels X Case Type (Ratios add up to 100%)')\n", - "prettyprint_nparray(stats_num_cases_ratios,\n", - " col_headers=CASE_TYPE_HEADERS,\n", - " row_headers=gen_label_bin_headers(stats_num_cases_ratios.shape[0]-1))\n", - "\n", - "print('\\nSamples by Case Type (Ratios add up to 100%)')\n", - "prettyprint_nparray(stats_by_casetype,\n", - " col_headers=['Ratio'],\n", - " row_headers=CASE_TYPE_HEADERS)\n", - "\n", - "print('\\nSample indeces by Number of Labels X Case Type')\n", - "prettyprint_nparray(example_by_casetype_bin,\n", - " col_headers=CASE_TYPE_HEADERS,\n", - " row_headers=gen_label_bin_headers(example_by_casetype_bin.shape[0]-1))\n", - "\n", - "\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Samples by Number of Labels (2^x scale)\n", - " Num Labels\n", - "1 11916\n", - "2 3129\n", - "3..4 1908\n", - "5..8 634\n", - "9..16 89\n", - "17..32 7\n", - "\n", - "Samples by Number of Labels X Case Type\n", - " 100% TP+TN 50%+ TP 1-49% TP 0% TP\n", - "1 4066 4100 0 3750\n", - "2 345 2019 0 765\n", - "3..4 93 965 530 320\n", - "5..8 5 282 284 63\n", - "9..16 0 14 69 6\n", - "17..32 0 1 6 0\n", - "\n", - "Samples by Number of Labels X Case Type (Ratios add up to 100%)\n", - " 100% TP+TN 50%+ TP 1-49% TP 0% TP\n", - "1 0.230 0.232 0.000 0.212\n", - "2 0.020 0.114 0.000 0.043\n", - "3..4 0.005 0.055 0.030 0.018\n", - "5..8 0.000 0.016 0.016 0.004\n", - "9..16 0.000 0.001 0.004 0.000\n", - "17..32 0.000 0.000 0.000 0.000\n", - "\n", - "Samples by Case Type (Ratios add up to 100%)\n", - " Ratio\n", - "100% TP+TN 0.255\n", - "50%+ TP 0.418\n", - "1-49% TP 0.050\n", - "0% TP 0.277\n", - "\n", - "Sample indeces by Number of Labels X Case Type\n", - " 100% TP+TN 50%+ TP 1-49% TP 0% TP\n", - "1 1 4 -1 0\n", - "2 41 7 -1 2\n", - "3..4 142 50 31 49\n", - "5..8 4666 55 193 295\n", - "9..16 -1 2256 436 1290\n", - "17..32 -1 17209 215 -1\n" - ], - "name": "stdout" - } - ] + "source": "(stats_num_samples, stats_num_cases, stats_num_cases_ratios, stats_by_casetype, example_by_casetype_bin) = calc_multilabel_accuracy_stats (\n y_true = y_test['subreddit_output'], y_pred=y_pred)\n\n\nprint('Samples by Number of Labels (2^x scale)')\nprettyprint_nparray(stats_num_samples,\n col_headers=['Num Labels'],\n row_headers=gen_label_bin_headers(stats_num_samples.shape[0]-1))\n\nprint('\\nSamples by Number of Labels X Case Type')\nprettyprint_nparray(stats_num_cases,\n col_headers=CASE_TYPE_HEADERS,\n row_headers=gen_label_bin_headers(stats_num_cases.shape[0]-1))\n \nprint('\\nSamples by Number of Labels X Case Type (Ratios add up to 100%)')\nprettyprint_nparray(stats_num_cases_ratios,\n col_headers=CASE_TYPE_HEADERS,\n row_headers=gen_label_bin_headers(stats_num_cases_ratios.shape[0]-1))\n\nprint('\\nSamples by Case Type (Ratios add up to 100%)')\nprettyprint_nparray(stats_by_casetype,\n col_headers=['Ratio'],\n row_headers=CASE_TYPE_HEADERS)\n\nprint('\\nSample indeces by Number of Labels X Case Type')\nprettyprint_nparray(example_by_casetype_bin,\n col_headers=CASE_TYPE_HEADERS,\n row_headers=gen_label_bin_headers(example_by_casetype_bin.shape[0]-1))\n\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "KXeYVumn-82A", - "colab_type": "text" + "_cell_guid": "70bb4f2a-da46-428a-bafb-ca3ac7e32739", + "_uuid": "82f7584ecf01b55e5057b424d2bcba400e9151ef", + "colab_type": "text", + "id": "KXeYVumn-82A" }, "cell_type": "markdown", - "source": [ - "### Multi-Label prediction examples" - ] + "source": "### Multi-Label prediction examples" }, { "metadata": { - "id": "H25yychh6AFn", - "colab_type": "code", + "_cell_guid": "85ad90b8-887d-4c83-868c-a1025630f765", + "_uuid": "ea4d950f89a4454567430a85f0e5e2e30fdcc798", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {} - ], - "height": 303 + "height": 283 }, - "outputId": "fc6c1bb9-4689-4b20-e02a-591194f31c63", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 164, "status": "ok", - "timestamp": 1518592634562, - "user_tz": 480, - "elapsed": 796, + "timestamp": 1525652081471, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "H25yychh6AFn", + "outputId": "c9406cbb-d7cd-446c-895a-8e0c3723d8e1", + "trusted": true }, "cell_type": "code", - "source": [ - "\n", - "print_prediction_and_input(4666, notes='example of 100% TP+TN',\n", - " y_true=y_test['subreddit_output'], y_pred=y_pred, classes_dict=subreddit_classes) \n", - "\n", - "print('')\n", - "\n", - "print_prediction_and_input(55, notes='example of 50%+ TP',\n", - " y_true=y_test['subreddit_output'], y_pred=y_pred, classes_dict=subreddit_classes) \n", - "\n" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Test record index #4666 example of 100% TP+TN\n", - "News Urls: http://www.bbc.co.uk/news/uk-40453054\n", - "Reddit Post Urls: https://www.reddit.com/r/unitedkingdom/comments/6kdx84/ https://www.reddit.com/r/ukpolitics/comments/6kdwgn/ https://www.reddit.com/r/worldnewshub/comments/6ke5zi/ https://www.reddit.com/r/worldnews/comments/6kdxo7/ https://www.reddit.com/r/bbcnewsuk/comments/6kd8pk/\n", - "\n", - "Prediction input: BOWEntitiesEncoded [Decode function not implemented] Domain [bbc.co.uk]\n", - "Predicted classes: worldnewshub,worldnews,ukpolitics,unitedkingdom,bbcnewsuk\n", - "True/Actual classes: worldnewshub,worldnews,ukpolitics,unitedkingdom,bbcnewsuk\n", - "\n", - "Test record index #55 example of 50%+ TP\n", - "News Urls: https://heatst.com/politics/nj-democratic-strategist-starts-huntrepublicans-and-huntrepublicancongressman/\n", - "Reddit Post Urls: https://www.reddit.com/r/The_Donald/comments/6i3gcb/ https://www.reddit.com/r/The_Donald/comments/6hp3z7/ https://www.reddit.com/r/Conservative/comments/6hp24w/ https://www.reddit.com/r/Newsdumps/comments/6i4xli/ https://www.reddit.com/r/politics/comments/6hv4ph/ https://www.reddit.com/r/Libertarian/comments/6hv4hu/\n", - "\n", - "Prediction input: BOWEntitiesEncoded [Decode function not implemented] Domain [heatst.com]\n", - "Predicted classes: politics,the_donald,conservative,nofilternews,campusreform\n", - "True/Actual classes: politics,the_donald,conservative,newsdumps,libertarian\n" - ], - "name": "stdout" - } - ] + "source": "\nprint_prediction_and_input(4666, notes='example of 100% TP+TN',\n y_true=y_test['subreddit_output'], y_pred=y_pred, classes_dict=subreddit_classes) \n\nprint('')\n\nprint_prediction_and_input(55, notes='example of 50%+ TP',\n y_true=y_test['subreddit_output'], y_pred=y_pred, classes_dict=subreddit_classes) \n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "-OE5bQo8_NFn", - "colab_type": "text" + "_cell_guid": "3d2475d0-82f3-49e3-a2ca-215ade2b40df", + "_uuid": "9451e496df944ad8c3fa73b2ff6a8e590949acac", + "colab_type": "text", + "id": "-OE5bQo8_NFn" }, "cell_type": "markdown", - "source": [ - "### Adding Submitter as Predictor of Subreddit" - ] + "source": "### Adding Submitter as Predictor of Subreddit" }, { "metadata": { - "id": "9o2ObHjfIZqt", - "colab_type": "code", + "_cell_guid": "97fd7415-0680-49c5-a10d-d6f694d4edb8", + "_uuid": "29942a7939be99ea2732ccbcc1abf05ff50321c0", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - {}, - {}, - {} - ], - "height": 913 + "height": 933 }, - "outputId": "c9efcaee-7d53-44d6-ba4a-8a375dd3d5cd", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 240796, "status": "ok", - "timestamp": 1518593199688, - "user_tz": 480, - "elapsed": 546245, + "timestamp": 1525652322352, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "9o2ObHjfIZqt", + "outputId": "a2c8b1d8-66f5-403f-9f5f-eea92f4223fc", + "trusted": true }, "cell_type": "code", - "source": [ - "# BOWEntitiesEncoded, Domain, RedditSubmitter -> Subreddit\n", - "# Single-label classification\n", - "\n", - "current_learning_goal = 'SubredditClassification'\n", - "set_columns_for_goal()\n", - "reddit_df = get_bq_data_for_goal()\n", - "(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain','RedditSubmitter'], outputs=['Subreddit'])\n", - "\n", - "SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Waiting on bqjob_r4842d4f23f38c65_00000161932cf8b6_3 ... (224s) Current status: DONE " - ], - "name": "stderr" - }, - { - "output_type": "stream", - "text": [ - "\n", - "Size of reddit set: 154931 records\n", - "Size of train set: 122705 records\n", - "Size of test set: 30676 records\n", - "Using 150 unique values for subreddit\n", - "Using 4232 unique values for domain\n", - "Using 2029 unique values for submitter\n", - "Using 32376 unique values for BOWEntitiesEncoded\n", - "Train on 110434 samples, validate on 12271 samples\n", - "Epoch 1/2\n", - " - 114s - loss: 1.5813 - acc: 0.6281 - top_k_categorical_accuracy: 0.8191 - val_loss: 0.9967 - val_acc: 0.7303 - val_top_k_categorical_accuracy: 0.9113\n", - "Epoch 2/2\n", - " - 117s - loss: 0.8020 - acc: 0.7693 - top_k_categorical_accuracy: 0.9416 - val_loss: 0.9802 - val_acc: 0.7279 - val_top_k_categorical_accuracy: 0.9178\n", - "Test data loss: 0.992; top 1 accuracy: 0.720; top 5 accuracy: 0.916;\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "image/svg+xml": "\n\nG\n\n\n140565677891536\n\nBOWEntitiesEncoded: InputLayer\n\n\n140566235544016\n\nembedding_6: Embedding\n\n\n140565677891536->140566235544016\n\n\n\n\n140566382290256\n\nflatten_6: Flatten\n\n\n140566235544016->140566382290256\n\n\n\n\n140566082426000\n\nconcatenate_4: Concatenate\n\n\n140566382290256->140566082426000\n\n\n\n\n140566152812368\n\nDomain: InputLayer\n\n\n140566152812368->140566082426000\n\n\n\n\n140566092504976\n\nRedditSubmitter: InputLayer\n\n\n140566092504976->140566082426000\n\n\n\n\n140565738127312\n\ndense_6: Dense\n\n\n140566082426000->140565738127312\n\n\n\n\n140566382291216\n\ndropout_6: Dropout\n\n\n140565738127312->140566382291216\n\n\n\n\n140565896111568\n\nsubreddit_output: Dense\n\n\n140566382291216->140565896111568\n\n\n\n\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 25 - } - ] + "source": "# BOWEntitiesEncoded, Domain, RedditSubmitter -> Subreddit\n# Single-label classification\n\ncurrent_learning_goal = 'SubredditClassification'\nset_columns_for_goal()\nreddit_df = get_data_for_goal()\n(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(inputs = ['BOWEntitiesEncoded','Domain','RedditSubmitter'], outputs=['Subreddit'])\n\ntry:\n SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\nexcept ImportError:\n print('Unable to import pydot and graphviz.') \n pass", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "tKnn4WGILlcA", - "colab_type": "text" + "_cell_guid": "c56645c7-cd22-485c-a0f2-3c5a5064fa72", + "_uuid": "62d4ddea6a7627805432378f3547818392f9c47c", + "colab_type": "text", + "id": "tKnn4WGILlcA" }, "cell_type": "markdown", - "source": [ - "##Predicting engagement metrics (Score, Number of Commenters, Number of Comments)" - ] + "source": "##Predicting engagement metrics (Score, Number of Commenters, Number of Comments)" }, { "metadata": { - "id": "QOMG51SwLvgd", - "colab_type": "text" + "_cell_guid": "3d365df4-6f07-4402-8fca-1a7d1cb11d52", + "_uuid": "cb298c9665f18e718357aefd633e3e325e87ca35", + "colab_type": "text", + "id": "QOMG51SwLvgd" }, "cell_type": "markdown", - "source": [ - "###Explore data distributions" - ] + "source": "###Explore data distributions" }, { "metadata": { - "id": "bTazJagsMApY", - "colab_type": "code", + "_cell_guid": "447cf76c-0ef4-4146-99d2-67b06b4b5228", + "_uuid": "df007d73d0764d357e3c121d38726bdc943c8752", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - { - "item_id": 194 - }, - { - "item_id": 197 - } - ], - "height": 125 + "height": 108 }, - "outputId": "50845735-acb7-4977-ec39-c996006c177e", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 14092, "status": "ok", - "timestamp": 1519085178857, - "user_tz": 480, - "elapsed": 346012, + "timestamp": 1525652336480, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "bTazJagsMApY", + "outputId": "40d2f333-1293-4fbe-bf9a-741d6a3d32db", + "trusted": true }, "cell_type": "code", - "source": [ - "current_learning_goal = 'CommentsClassification'\n", - "current_exclude_autosubreddits = False\n", - "current_sample_frac = 0.5\n", - "set_columns_for_goal()\n", - "reddit_df = get_bq_data_for_goal()\n", - "(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n", - "\n", - "\n" - ], - "execution_count": 7, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Waiting on bqjob_r6d22cca32cd339fb_00000161b08308a8_1 ... (194s) Current status: DONE " - ], - "name": "stderr" - }, - { - "output_type": "stream", - "text": [ - "Building model with learning goal: CommentsClassification, using label column: ScoreBin, using feature columns: ['Url', 'RedditPostUrl', 'Domain', 'Tags', 'BOWEntitiesEncoded', 'RedditSubmitter', 'Subreddit', 'NumCommentersBin', 'ScoreBin', 'ExampleWeight']\n", - "\n", - "Size of reddit set: 425548 records\n", - "Size of train set: 170220 records\n", - "Size of test set: 42554 records\n" - ], - "name": "stdout" - } - ] + "source": "current_learning_goal = 'CommentsClassification'\ncurrent_exclude_autosubreddits = False\ncurrent_sample_frac = 0.25\nset_columns_for_goal()\nreddit_df = get_data_for_goal()\n(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "IooCgeX7L0TA", - "colab_type": "code", + "_cell_guid": "14a1eca9-93f7-4140-aa0b-63e45d0a9a8a", + "_uuid": "48a20a15da136e22bd49f98fb8e2105fcc00b79f", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - { - "item_id": 1 - }, - { - "item_id": 2 - }, - { - "item_id": 3 - } - ], "height": 927 }, - "outputId": "d582fb16-96d4-4d5a-8dfd-323698f45ff6", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 3777, "status": "ok", - "timestamp": 1519060620737, - "user_tz": 480, - "elapsed": 4458, + "timestamp": 1525652340270, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } - }, - "cell_type": "code", - "source": [ - "print(\"Reddit dataset summary:\")\n", - "\n", - "display.display(reddit_df.describe())\n", - "\n", - "if current_learning_goal == \"CommentsRegression\" or current_learning_goal == \"CommentsClassification\":\n", - "\n", - " plt.figure(figsize=(10,10))\n", - " plt.subplot(321)\n", - " plt.hist(reddit_df[\"NumCommenters\"],bins=20)\n", - " plt.yscale('log')\n", - " plt.title(\"NumCommenters histogram\")\n", - "\n", - " plt.subplot(322)\n", - " plt.hist(pd.to_numeric(reddit_df[\"NumCommentersBin\"], errors='coerce'),bins='auto')\n", - " plt.title(\"NumCommentersBin histogram\")\n", - "\n", - " plt.subplot(323)\n", - " plt.hist(reddit_df[\"NumComments\"],bins=20)\n", - " plt.yscale('log')\n", - " plt.title(\"NumComments histogram\")\n", - "\n", - " plt.subplot(324)\n", - " plt.hist(pd.to_numeric(reddit_df[\"NumCommentsBin\"], errors='coerce'),bins='auto')\n", - " plt.title(\"NumCommentsBin histogram\")\n", - "\n", - " plt.subplot(325)\n", - " plt.hist(reddit_df[\"Score\"],bins=20)\n", - " plt.yscale('log')\n", - " plt.title(\"Score histogram\")\n", - "\n", - " plt.subplot(326)\n", - " plt.hist(pd.to_numeric(reddit_df[\"ScoreBin\"], errors='coerce'),bins=5)\n", - " plt.title(\"ScoreBin histogram\")\n", - "\n", - "\n", - " plt.show()" - ], - "execution_count": 8, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Reddit dataset summary:\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "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", - "
ScoreNumCommentersNumCommentsNumCommentersClippedNumCommentsClippedScoreClippedNumCommentersLogScaledNumCommentsLogScaledScoreLogScaledExampleWeight
count425548.000000425548.000000425548.000000425548.000000425548.000000425548.000000425548.000000425548.000000425548.000000425548.000000
mean58.9578454.3433017.5226774.3433017.52267741.1884460.2040040.2243060.5731820.064570
std1073.18748552.371072106.04111052.371072106.041110424.0240240.4160520.4685420.5685000.108779
min0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.028566
25%1.0000000.0000000.0000000.0000000.0000001.0000000.0000000.0000000.3010300.028566
50%1.0000000.0000000.0000000.0000000.0000001.0000000.0000000.0000000.3010300.028566
75%3.0000001.0000001.0000001.0000001.0000003.0000000.3010300.3010300.6020600.028566
max100206.0000008146.00000023586.0000008146.00000023586.0000009999.0000003.9109984.3726734.0000001.000000
\n", - "
" - ], - "text/plain": [ - " Score NumCommenters NumComments NumCommentersClipped \\\n", - "count 425548.000000 425548.000000 425548.000000 425548.000000 \n", - "mean 58.957845 4.343301 7.522677 4.343301 \n", - "std 1073.187485 52.371072 106.041110 52.371072 \n", - "min 0.000000 0.000000 0.000000 0.000000 \n", - "25% 1.000000 0.000000 0.000000 0.000000 \n", - "50% 1.000000 0.000000 0.000000 0.000000 \n", - "75% 3.000000 1.000000 1.000000 1.000000 \n", - "max 100206.000000 8146.000000 23586.000000 8146.000000 \n", - "\n", - " NumCommentsClipped ScoreClipped NumCommentersLogScaled \\\n", - "count 425548.000000 425548.000000 425548.000000 \n", - "mean 7.522677 41.188446 0.204004 \n", - "std 106.041110 424.024024 0.416052 \n", - "min 0.000000 0.000000 0.000000 \n", - "25% 0.000000 1.000000 0.000000 \n", - "50% 0.000000 1.000000 0.000000 \n", - "75% 1.000000 3.000000 0.301030 \n", - "max 23586.000000 9999.000000 3.910998 \n", - "\n", - " NumCommentsLogScaled ScoreLogScaled ExampleWeight \n", - "count 425548.000000 425548.000000 425548.000000 \n", - "mean 0.224306 0.573182 0.064570 \n", - "std 0.468542 0.568500 0.108779 \n", - "min 0.000000 0.000000 0.028566 \n", - "25% 0.000000 0.301030 0.028566 \n", - "50% 0.000000 0.301030 0.028566 \n", - "75% 0.301030 0.602060 0.028566 \n", - "max 4.372673 4.000000 1.000000 " - ] }, - "metadata": { - "tags": [] - } + "user_tz": 420 }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAJcCAYAAAAo6aqNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtcVVX++P/X4aKZAo5yOWqOfcIardQRQTAMFISjIMpV\nS1NTv1rmLW+VlpFZ2mRqfnIaxXGmm1OTJlTieMMCfah0U+lj+pmkGhTlgAqIN45w1u8PfuwPyAGP\nyDmAvJ9/wdr77Pdae28W77Mva+mUUgohhBBCCGFzDo1dASGEEEKIlkISLyGEEEIIO5HESwghhBDC\nTiTxEkIIIYSwE0m8hBBCCCHsRBIvIYQQQgg7kcRL3PFyc3Pp0aMHZrPZ4vL169ezePFiO9dKCCFq\nmjJlCikpKfX6bEhICAcPHrS47LvvvmPYsGG3UzXRQCTxukUhISEEBgZy7do1rWzz5s2MGzfOZjGz\nsrKYOnUqfn5++Pv7M2rUKLZu3WqzePawdu1annvuObvF0+l0tS576qmnWLp06U23MW7cOLZs2dKQ\n1RKiwUjf1DBs3Tf16NGDvn374uPjw4ABA5g3bx6XLl3Slm/YsIHo6OgGj+vr68u//vWvm65n7765\nJZLEqx7Ky8t5//33q5XV9Y/9dhw+fJgJEybg7+/P7t27yczM5JVXXmHfvn02iddclJeXN3YVGtSd\n1h7ROKRvanw3+1vW6XR88cUX/PDDD+zZs4fi4mLeeecdO9WucUk/V0ESr3qYPHkyf/vb36p9S6lk\n6bZW1SslycnJPP744yxfvhw/Pz/CwsI4fPgwycnJDBo0iMDAwGqXmVesWEFcXByTJ0+mffv2ADz4\n4IOsXr1aW+fTTz8lPDwcf39/nnnmGfLz87VlPXr04B//+AcGg4F+/fqxZs0aTp06xWOPPYavry9z\n5syhrKwMgG+++Ybg4GD++te/8sgjj/Doo4+yZ88e0tPTMRgM+Pv7s379em3bSimSkpIICwsjICCA\nOXPmcPHixWr7ISUlhcGDBzNgwADWrVsHwL59+1i3bh3bt2+nb9++2re7S5cu8eKLLzJw4ECCg4N5\n++23qZxYoep+8/f3Z+3ateTk5DBu3Dh8fX0ZMGAAc+fOrfWYKaX44osvatQFKr7hLViwAACTycSC\nBQvw9/fHz8+PhIQELly4wOrVq/n+++9ZunQpPj4+vPbaawD88MMPxMfHa+sePnxY2+7p06d54okn\n6NevH5MmTeLVV1/V4lTuny1btjB48GCefPJJAGbPns3AgQPx8/Nj3LhxnDx5UtvewoULWbJkCVOm\nTKFv376MGTOGc+fOsWzZMvr3709ERAQnTpyodR+IO5/0TRWact9UdbKYtm3bEhISUu3v/MZjMmbM\nGP70pz/Rv39/hgwZQkZGRp3nwPHjxxkxYgR+fn7MnTsXk8lUbR9WSkpKIigoCB8fH4YNG8ahQ4dq\nbX9+fj7Tpk3D398fg8HA5s2bte2Ulpby/PPP079/fyIjI/nrX/9aLU5ISAgbNmxgxIgR9O3bF7PZ\nrB0bHx8fhg8fzp49e7T1b/U8bJaUuCWDBw9WBw4cUDNnzlSrV69WSin16aefqnHjximllDp9+rTq\n0aOHKi8v1z7zxBNPqM2bNyullNq6dat66KGHVHJysjKbzWr16tVq0KBB6tVXX1Umk0nt379f9e3b\nV125ckVdvXpV9ezZU2VmZtZanwMHDih/f391/PhxZTKZ1NKlS9XYsWO15X/4wx/UtGnT1OXLl9XJ\nkyfVww8/rJ588kl1+vRpVVJSoiIiIlRycrJSSqnMzEz14IMPqnfffVeVlZWpTz/9VAUEBKh58+ap\nK1euqJ9//ln16tVLnTp1Siml1N///nc1evRoZTQalclkUi+//LKaO3euth/+8Ic/qMWLF6vS0lJ1\n/Phx9fDDD6vs7GyllFLvvPOOWrBgQbW2TJs2TSUmJqpr166p8+fPq4SEBPXPf/5T228PPvig+uij\nj1R5ebm6du2amjt3rlq3bp1SSqnS0lL1/fffW9xHt1KXTz75RD399NOqtLRUmc1mdezYMXXp0qUa\nx1EppYqKipSfn5/64osvVHl5udq2bZvy8/NTRUVFSimlRo8erd588011/fp19d133ykfHx8tTmWd\nnn/+eXX16lVVWlqqlFLqs88+U1euXFEmk0ktW7ZMjRw5Uov3wgsvqICAAPXTTz+p0tJSNX78eBUS\nEqI+//xz7VyqPA9FyyN9U/Pom/7whz+onJwcpVRFHzJp0iT1zjvv1HlMNm/erMxms/rHP/6hBg4c\nWOc5kJCQoAoKClRxcbEaNmyY+uSTT7R9GBwcrJRS6pdfflHBwcGqoKBAKaVUbm6uVidL7R87dqx2\nHhw/flwFBASogwcPKqWUWrFihXriiSdUSUmJysvLU1FRUVqcyjpFR0ervLw8rZ/bsWOHFnv79u3q\nj3/8o/b7rZyHzZVc8aqnmTNnsmnTJgoLC2/5s126dCE6OhqdTkdERAR5eXlMnz4dZ2dnAgMDcXZ2\n5j//+Q/FxcWYzWY8PDxq3da2bduIj4+nR48eODs7M3fuXI4cOcKZM2e0daZOncrdd9+Nt7c3999/\nP4GBgXTp0oV27doRFBTE8ePHtXWdnZ15+umncXR0JCIigsLCQiZMmECbNm3o3r073bt353//93+B\nim+zzz77LJ6enjg7OzN9+nR27typfaPW6XTMmDGDVq1a0aNHD3r06FHrFZnz58+zb98+Fi1aROvW\nrenQoQMTJkxg27Zt2jpeXl6MHTsWBwcHWrdujZOTE7m5uRiNRlq1aoWPj0+t+8naujg5OVFUVMSv\nv/6KTqfjwQcfpG3btha3+fXXX3PvvfcSFRWFg4MDkZGR3HfffXz11VecPXuW//mf/2HWrFk4OTnR\nr18/QkJCatRp5syZ3HXXXbRq1QqA2NhY2rRpo+3PEydOVLt6ERYWRs+ePWnVqhVhYWHcddddjBgx\nQjuX5IqXkL6p6fdNMTEx+Pn58cgjj3D27FlGjRpV5zGJj49Hp9MRExPDuXPnOH/+fK3rjx8/Hnd3\nd1xdXRk8eHC1fVjJ0dGR69ev8/PPP1NWVkbnzp3p2rWrxe3l5eVx+PBh5s+fj7OzMz169CAhIYHP\nP/8cgB07djBt2jTatWuHl5eXxWcKx48fj5eXl9bPGQwG3N3dARg2bBjdunUjKyurWputOQ+bK6fG\nrkBzdf/99zNo0CCSkpK47777bumzlSccwF133QVAhw4dqpVduXKFe++9FwcHBwoKCviv//ovi9vK\nz8/noYce0n6/++67ad++PUajkc6dOwPQsWPHatuuGr9169bV/ojbt2+vPRNSWbcbP3/lyhUAzpw5\nw4wZM3BwqMjflVI4OTlx7ty5Wtta+dkb5ebmUlZWxsCBA7VtKaXo1KmTto5er6/2meeee463336b\n+Ph42rdvz5NPPklcXJzF7Vtbl5EjR5KXl8fcuXMpKSkhKiqKuXPn4ujoWGPd/Px8bR9X6ty5M0aj\nkfz8fNzc3GjdurW2rFOnTuTl5VVbv2qbzGYzq1atYufOnRQWFqLT6dDpdBQWFtKuXTug+rFo3bp1\nrcdGtFzSNzX9vik5OZmuXbtSXl7Opk2bGDNmDNu3b9cSk6purKdSiitXrlRre1VVy9u0aUNBQUGN\n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\nqVOxtrama9eudO3alf/3//4fUP5t9sUXX8TFxQVLS0vmzJnD3r17tW93Op2OuXPnYmVlRffu3ene\nvXutl+DNzc358ccfKS4uxsnJCXd39xq37devH4MHD0an0zF69GgtpttZWlqSkZHB1atXsba2rjYT\nu6r0U2NCQgLPPvssbm5uWFtbEx0dze7duzEajezduxd/f388PDywsLBg/vz51ery8PDA398fACsr\nKx5//HF69+6NTqejc+fOjBs3rtqg//qcGyHqQvqmpu2bTpw4Qf/+/fHw8GD8+PE8/fTTdOnSpcZj\nRURE8OCDD2JlZcWIESNq/YxbWloye/ZszM3N8fPzo3379toKHJVZWFiQm5tLZmYm5ubm9OvXr8rz\nlfu5r776iiFDhjBw4EDMzc15/vnnKS4u5ocffuDkyZOUlZUxadIkzM3NCQwMrNZnmpmZERUVhaWl\nJVZWVjg4OBAYGIiVlRXt27dn5syZHD9+vFqb77//fu28Pvjgg3h7e2NmZsbw4cPbbD8niVcDe/TR\nRxkyZAhbtmyp976Vl5ho164dgLauXUVZUVER9vb2mJmZVVkm4XY5OTl07txZe9y+fXscHByqXOrt\n2LFjlWNXrv++++6jqKhIe+zg4KCNCamI7fb9K7a/ePEic+fOpX///vTv35+RI0diYWFRZVmL29ta\nua7KrK2t2bBhA3//+98ZNGgQs2bN4ueff66x3bcft7i42ORA+dWrV/PLL78wYsQIxo4dy4EDB2o8\n5u2vpZubG2VlZVy+fJmcnBw6depUpc7bl+qoWLm+wvnz55k1axaDBg3C09OTd955p9ofw/qcGyHq\nQvqmpu2bnnzySb799lt++OEH/vd//5effvqpys+tt6tcr7W1da2fcQcHB8zM/v3nu127dtpya5U9\n//zzPPjgg0ybNo3AwMBaz/3t50Wn06HX6zEYDOTk5ODq6lpl+8r9HpS/HyrWS4Ty5X1ee+01/P39\n8fT0ZNKkSVy/fr1Kslf5PN133301nre2RhKvRhAVFcWnn35apSOpWMD05s2bWlnlD3t9tGvXjief\nfJJ9+/bVuI2Li0uVb5BFRUXk5+dXSwIaQ6dOndi6dSvffvst3377Ld999x0nTpy440VjfXx8eP/9\n9/nf//1fHn74YZYtW3bXMT744IOsW7eOY8eO8Yc//IF58+bx22+/mRxwfPtrmZWVhbm5OU5OTjg7\n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\niEZiMBjo1KmT9tjV1ZWcnJxmjEjcy86f/5nIOe/Ue1oe0XLd8eB6U53TqVOnALC2tmbt2rV3H51o\ndLUtqn31qg15eTeqlbfmebZkXrHayesDSql673Pr8j+5bGNJevpPjRBR08jI+JXfbuTxyy+/mPzc\ntyYVbampb2tNKtrQFtoCNf9daW2cnfve8b53nHjdSedUk/Wvz26wY1U3WrZvRs7OffnG+87foA3J\n2dkWAL2+ZcRzpyra0Vha++tzt/R6PRcvXtQeGwwGXFxqn4du74evNnZYjc7buy/jxoU3dxgNQtoi\nWrI7Hvl+J52TEEK0dL169SIjI4OsrCxKSkpITEwkICCgucMSQrQRdb7idfsVrsqdk7OzM4mJiaxf\nv77BAxRCiKZkbm7OsmXLmDZtGkopIiMjcXd3b+6whBBthE7V4TfDmJgYUlNTyc/Px8nJiaioKMaM\nGcPBgwdZs2aN1jnNmDGjKWIWQgghhGiV6pR4CSGEEEKIuyezmwohhBBCNBFJvIQQQgghmkizJ16t\nYU00f39/nn76acLCwoiMjATg2rVrTJs2jeDgYJ5//nkKCgq07VetWkVQUBCjR4/mzJkzWnlcXBzB\nwcEEBwcTHx/fJLGbWu6pIWM/ffo0oaGhBAcHs3r16iZvy6ZNm/D19SU8PJzw8HBSUlK05zZv3kxQ\nUBAjRozg8OHDWnlN77nMzEzGjRtHcHAw0dHRlJaWNko7srOzmTJlCiEhIYSGhvLhhx8CrfO83N6W\njz76CGid5+VOtIb+q65qWhqutanp89UalZSUMHbsWMLCwggNDWXTpk3NHdJdMRqNhIeHM2vWrOYO\n5a6YygnqRTWjsrIyNWzYMJWZmalKSkrU008/rc6dO9ecIZnk7++v8vPzq5S9+eabasuWLUoppTZv\n3qzeeustpZRSBw4cUNOnT1dKKXXixAk1duxYpZRS+fn5KiAgQF2/fl1du3ZN+39j++6779S//vUv\nNWrUqEaJPTIyUp08eVIppdQf/vAHlZKS0qRteffdd9X7779fbdtz586p0aNHq1u3bqkLFy6oYcOG\nKaPRWOt7bv78+Wr37t1KKaVee+019fe//71R2pGTk6P+9a9/KaWUunHjhgoKClLnzp1rleelpra0\nxvNSX62l/6orU5+v1qim92RrVVRUpJRSqrS0VI0dO1b7XLdGf/nLX1RMTIyaOXNmc4dyV0zlBPXR\n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\neuQZFRUFg8EAADh27BjCwsKk9qNHj8JsNuPq1auorKxEaGio3c6/Wq3G+PHj8f333wPoGKMzefLk\nIXc+AeDBBx9EeXk57t69CyEEzp8/j5/97GdD5pze/9uTM85hbzEGkmdxcTH+/d//He+++y7GjBnT\nLf+BnqewsLABXQtnkXNtn3zySYfkKCd2bW2t9Hej0YjJkyfbJXanvnrdersfnRW/63iqiooKAICv\nr6/dYlv7vOjK0cffX3xHHn99fb30pPOPP/6Ic+fO4aGHHuq2jaPue7nxHXXvW/sMfuONN7ptY9Ox\n9zv83sGKioqETqcTsbGxIjc31ykxv/76a/Hwww+LefPmicTERJGUlCSKiopEQ0ODWLp0qdDpdOI3\nv/mNaGpqkl6zdetWERMTIxISEsR//dd/Se2HDh0SsbGxQqfTCYPBILVfuHBBzJ07V8TGxtrlaYuu\nT61UVlaKtLQ0odPpxLp164TZbBZCCHH37l2xdu1aERsbK9LT08XVq1el17/33nsiJiZGzJ49W5SU\nlEjt9jr/ly5dEikpKWLevHniueeeE83NzUP2fP7bv/2bmD17tpg7d67YuHGjMJvNQ+Kcrl+/XoSH\nh4uf//znIjIyUuTn54vGxkaHn8O+rpPcPGNjY8WsWbNEUlKSSEpKkp7yseU82XItnMVazjk5OeLU\nqVMOz7G/2Hv27BHx8fEiMTFRLFmyRHz33Xd2i23tmn/88cfik08+kbbp7X50RvyPPvpIOvYFCxaI\nsrIyu8Xu7fPCWccvJ74jj//y5csiKSlJzJs3T8ydO1e88847Qgjn3fdy4jvy3u/U9TN4sMfOJYOI\niIiInMTlE6gSERERjRQsvIiIiIichIUXERERkZOw8CIiIiJyEhZeRERERE7CwouIiIjISVh4ERER\nETkJCy8iIiIiJ/l/reP+yiP91bUAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "id": "IooCgeX7L0TA", + "outputId": "7f89eeef-0a17-461e-90eb-c178d2e4291c", + "trusted": true + }, + "cell_type": "code", + "source": "print(\"Reddit dataset summary:\")\n\ndisplay.display(reddit_df.describe())\n\nif current_learning_goal == \"CommentsRegression\" or current_learning_goal == \"CommentsClassification\":\n\n plt.figure(figsize=(10,10))\n plt.subplot(321)\n plt.hist(reddit_df[\"NumCommenters\"],bins=20)\n plt.yscale('log')\n plt.title(\"NumCommenters histogram\")\n\n plt.subplot(322)\n plt.hist(pd.to_numeric(reddit_df[\"NumCommentersBin\"], errors='coerce'),bins='auto')\n plt.title(\"NumCommentersBin histogram\")\n\n plt.subplot(323)\n plt.hist(reddit_df[\"NumComments\"],bins=20)\n plt.yscale('log')\n plt.title(\"NumComments histogram\")\n\n plt.subplot(324)\n plt.hist(pd.to_numeric(reddit_df[\"NumCommentsBin\"], errors='coerce'),bins='auto')\n plt.title(\"NumCommentsBin histogram\")\n\n plt.subplot(325)\n plt.hist(reddit_df[\"Score\"],bins=20)\n plt.yscale('log')\n plt.title(\"Score histogram\")\n\n plt.subplot(326)\n plt.hist(pd.to_numeric(reddit_df[\"ScoreBin\"], errors='coerce'),bins=5)\n plt.title(\"ScoreBin histogram\")\n\n\n plt.show()", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "1lI15yICW1ei", - "colab_type": "code", + "_cell_guid": "f9d6b3e2-1bad-4ca3-bdeb-a7ccb0a7f3d9", + "_uuid": "69cb84cc62a919621f7f1a2593ac1a2ba7586896", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, - "output_extras": [ - { - "item_id": 6 - }, - { - "item_id": 7 - } - ], "height": 743 }, - "outputId": "d6127d42-0dde-442c-e0e7-72fb3ac49f72", + "colab_type": "code", + "collapsed": true, "executionInfo": { + "elapsed": 133349, "status": "ok", - "timestamp": 1519060812053, - "user_tz": 480, - "elapsed": 155563, + "timestamp": 1525652473636, "user": { "displayName": "Sergei Sokolenko", "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", "userId": "106652311097239389877" - } - } + }, + "user_tz": 420 + }, + "id": "1lI15yICW1ei", + "outputId": "fa797e7d-7cac-435e-bd11-e5760b265f29", + "trusted": true }, "cell_type": "code", - "source": [ - "current_epochs = 1\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n", - " inputs = ['Domain','Tags'], \n", - " outputs=['ScoreBin','NumCommentersBin'],\n", - " k_of_top_k_accuracy=2)\n", - "\n", - "(y_true, y_pred) = get_true_and_predicted_labels(\n", - " model=model,\n", - " x_test=x_test, \n", - " y_test_selected=y_test['scorebin_output'], \n", - " label_classes=scorebin_classes)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n", - "\n" - ], - "execution_count": 9, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 5291 unique values for domain\n", - "Using 49586 unique values for Tags\n", - "Using 6 unique values for ScoreBin\n", - "Using 6 unique values for NumCommentersBin\n", - "Train on 153198 samples, validate on 17022 samples\n", - "Epoch 1/1\n", - " - 106s - loss: 1.2296 - scorebin_output_loss: 0.5986 - numcommentersbin_output_loss: 0.6310 - scorebin_output_acc: 0.8005 - scorebin_output_top_k_accuracy: 0.9330 - numcommentersbin_output_acc: 0.7357 - numcommentersbin_output_top_k_accuracy: 0.9336 - val_loss: 1.1873 - val_scorebin_output_loss: 0.5758 - val_numcommentersbin_output_loss: 0.6115 - val_scorebin_output_acc: 0.8008 - val_scorebin_output_top_k_accuracy: 0.9335 - val_numcommentersbin_output_acc: 0.7395 - val_numcommentersbin_output_top_k_accuracy: 0.9336\n", - "Test metrics: total loss: 1.174; output_1 loss: 0.570; output_2 loss: 0.604; output_1 top 1 accuracy: 0.804; output_1 top 2 accuracy: 0.936; output_2 top 1 accuracy: 0.745; output_2 top 2 accuracy: 0.936;\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAI0CAYAAADC51nVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlclOX+//H3gCibokYs7kqpYKhppmnh+ssF10Qr18JT\nmbmVGS5plmV5KjqaZblnWtrpZCJY30wty1wyFUgxTS0KDDU1QERE5veHndE5Aw6UM8ztvJ7nMY/j\nzP3huq/7PrfXuXzf19yYzGazWQAAAOXMo7w7AAAAIDEpAQAALoJJCQAAcAlMSgAAgEtgUgIAAFxC\nhfLuAAAAsM/n1tFO29e5PfOctq8rkZQAAACXwKQEAAC4BG7fAABgBKbrP0e4/o8QAAAYAkkJAABG\nYDKVdw8cjqQEAAC4BJISAACMgDUlAAAAzkFSAgCAEbCmBAAAwDlISgAAMALWlAAAADgHkxIAAOAS\nuH0DAIARsNAVAADAOUhKAAAwAha6AgAAOAdJCQAARsCaEgAAAOcgKQEAwAhYUwIAAOAcJCUAABgB\na0oAAACcg6QEAAAjYE0JAACAc5CUAABgBKwpAQAAcA6SEgAAjIA1JQAAAM7BpAQAALgEbt8AAGAE\n3L4BAABwDpISAACMwIOvBAMAADgFSQkAAEbAmhIAAADnICkBAMAIeMw8AACAc5CUAABgBKwpAQAA\ncA6SEgAAjIA1JQAAAM5BUgIAgBGwpgSAo5w/f14jR47UbbfdpvHjx//ldtatW6cRI0Zcw56Vn127\ndql79+7l3Q0A5cRkNpvN5d0JwJWtW7dOy5Yt05EjR+Tv76/w8HA98sgjatmy5d9qd+3atVq5cqVW\nr14tkxvcK27cuLE2bNig2rVrl3dXAEPy6fqK0/Z17v+etFuzZcsWzZo1S2azWf3799fDDz9stT0z\nM1NTpkzRqVOnVLVqVb388ssKDg6+apskJcBVLF26VC+99JIeffRRbdu2TV988YUGDRqkTZs2/e22\nMzMzVa9ePbeYkEiye5wXL150Uk8A/F1FRUWaOXOmFi9erMTERCUlJenw4cNWNbNnz1a/fv2UkJCg\nxx57TK+++qrddpmUACXIzc3V3Llz9cwzz6hLly7y9vaWp6enOnTooIkTJ0qSCgoK9MILL+iuu+5S\nVFSUZs2apQsXLkiSdu7cqfbt22vp0qVq27at7rrrLq1Zs0aS9Prrr+uNN97Q+vXr1aJFC/3nP//R\nvHnzLO1KUkZGhho3bqyioiJJ0kcffaQuXbqoRYsW6tKlixITEyVJa9as0aBBgyw/t3v3bsXExKhV\nq1YaMGCA9uzZY9k2dOhQzZkzR/fff79atGihESNG6MyZM8Ue/3/7v2jRIkv/P//8c3355Zfq2rWr\nWrdurbfffttSn5KSovvuu0+tWrXSXXfdpZkzZ6qwsFCSNGTIEJnNZvXu3VstWrTQJ598Yml/4cKF\nuvPOOzVlyhTLZ5L0yy+/qHXr1kpLS5MkZWVlqU2bNvr222//xv+qAK6FlJQU1a1bVzVr1pSXl5ei\no6O1ceNGq5rDhw+rTZs2kqTWrVvbbC8OkxKgBHv27NGFCxfUpUuXEmvmz5+v1NRUJSQkaO3atUpJ\nSdH8+fMt20+ePKmzZ8/qq6++0vPPP69nn31WOTk5GjNmjEaOHKkePXpo9+7d6t+/vyTbNOG/78+d\nO6cXXnhBixcv1u7du7Vq1SqFh4fb1P3xxx8aOXKkhg8frh07duiBBx7QI488oj/++MNSm5SUpNmz\nZ2v79u0qKCjQkiVLSjy+kydP6sKFC/rqq680duxYTZs2TevWrdPHH3+slStX6o033tCvv/4qSfL0\n9LRMLFavXq3t27frvffekyStWLFCkpSQkKDdu3db1o2cPHlSOTk52rx5s2bOnGl1LLVr19aTTz6p\nJ598Uvn5+ZoyZYr69++vVq1aldhf4Lpm8nDey46srCyFhoZa3gcHB+v48eNWNY0bN9Znn30mSfrs\ns8+Ul5dnNRYVh0kJUIIzZ86oatWq8vAo+a9JYmKiHnvsMVWrVk3VqlXT6NGjtXbtWst2Ly8vjRo1\nSp6enmrfvr18fX119OjRv9QfT09PHTx4UOfPn1dgYKDCwsJsar744gvVq1dPvXr1koeHh6Kjo9Wg\nQQNt3rzZUnPPPfeoTp06qlixorp3725JIorj5eWlkSNHytPTUz169NDp06c1fPhw+fj46KabbtJN\nN92kH374QZLUpEkTNW3aVCaTSTVq1NDAgQPtphoeHh4aM2aMvLy8VLFiRZvtAwYMUN26dTVgwACd\nPHnyby0IBnDtlGY56lNPPaWdO3fqnnvu0a5duxQcHCxPT8+r/gxfCQZKULVqVZ05c0ZFRUUlTkyO\nHz+uGjVqWN7XqFHD6l8L/zup8fb21tmzZ8vcFx8fH7322mtavHixpkyZopYtW+qpp55SgwYNrtqf\n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\nslkzpe3fZ1Obtn+fIps2u1zX9HJd2v79ioxsalUfGdlU+/fZtuMObq5zowovFuloxu+Wz1IPZSq8\nQYjdn/UwmRQRdqmuVlCAagYF6JawEB1cO0X7/jNJU/9he3vHXRw+dOl6rd/g8vV6S2RTHUjbb1N7\nIG2/mjVrVmLdd9/uVPKe7xT70COO7bQBlHUcuPK8Mg6UjPOK0nL4pGTLli3q1q2bunbtqgULFjh6\nd39Zbm6uqgQEWH0WUCVAOTk5xdYGXFEbEBCg3NxcSdLZs7btVKkSoNxc23bcgb9vRWXnnrP67I/c\nfFX2rWRTu2H7D5IkP5+KalDrBg3r2Uq+lSpKkmoGVZUkdbq9oVrc/6q6P/aWBt7d3CpJcSe5Z3NV\npUrprrOz/3O9VgkI0Nk/r9eioiJNfHys/hk/17EdNgjGAcfgvF4jJie+yolDJyVFRUWaOXOmFi9e\nrMTERCUlJenw4cOO3OVf5u/vr5zsbKvPsrOzVbly5WJrs6+ozc7Olr+/vyTJz8+2nZycbPn727bj\nDnLzClT5zwWs/1XFz1s5eedtap945WNJUuqHcVo9e7hWf7ZHGSfOSJLOnb8gSYp/d7Ny884r/bcz\nWrxmh7r9ecvH3fj7+Ssnp3TXmd//XK852dny+/N6XfT2m7olsqlatrrdsR02CMYBx+C8orQcOilJ\nSUlR3bp1VbNmTXl5eSk6OlobN2505C7/spsbNlRhYaGOXDFpSk1JVnhEE5va8IgmSk25vOI7JXmv\npS6iSROlpqZY1aempiiiiW077uBQ+glV8PRQ/ZqXvyUTeXOo0o78ZlP73/UhDaJnqtXgeHl6eGjX\nvl8kSQfTj6vgwkXndNoAwm6+dL0ePXL5ev0+NUWNwyNsahuHRyj5im8opKYkW+q2fLFZies+VuP6\ntdS4fi3t3L5NT0+eqLgJ4x1/EC6orOPAleeVcaBknNdrg4Wuf1NWVpZCQ0Mt74ODg3X8+HFH7vIv\n8/X1VZ9+9+i5GdOVl5enb7ZuVVJiggYNHmpTO3jIMM2dE6/MzExlZmZq7px4DRv+oCQpqn0HeXp6\n6s15r6ugoEDz35gnk8mkDh07OfuQXMK58xe09ovvNf3hu+VTyUt3NK2n6Lsi9N4nu21q69W4tMjS\nZDLp7jsa6cE+rfXiks8lSfnnC/XvDcl6fEgH+flUVM2gAD3Y53YlfWW7hsId+Pr6qmeffpo1c4by\n8vK0fdtWfZK0TvcOGmJTe9+goYqPj9exzEwdy8zUG6//S4OHPiBJenPhUu3Y/b2+2rFbX+3YreYt\nWipuyjQ9PWOmk4/INZR1HIiPZxwoDc4rSsuhD08zm81l/pmKnpJHOU3S3nrzDcXGxqpOjSAFBgbq\nrbfeUvPIcH399dfq0aOHJVIcPeoR/Zp+VJGRkTKZTHrooYc0auRDkiTvCl5a+/HHGjFihKZNnaTw\n8HAlrF0rf+/yfU7duR0vl+v+Jem+bpe/cbN39cQS6/K2/9Py5+QPnrLZfvKLFyx/Xjj9Xi2cfu81\n6qGxLHzrTcXGxqph3VAFBgbq7bfeUutbb7G5Xh8f86iyMn7Wnbc3t1yv4x67tKi1qk81qzb9fLwV\nfENV1f5zDY87Kus40OpW44wD5el6Pa/5Tvw2sqs9PG3Lli2aNWuWzGaz+vfvr4cffthq+7FjxxQX\nF6ecnBwVFRXpiSeeUPv27a/apsn8V2YOpbR37169/vrrWrx4sSRZFrr+b8ev5Mz/gf8u7wrG6W+1\ndiVPAlzJuR0vy6e1MfoqSce+eKm8u1AqVX08deaccW5/eXt5lncXSsVIY4CRGO28OmtOdOODq52z\nI0knll79H3tFRUXq2rWrli1bpqCgIMXExCg+Pl5hV3zDavr06YqIiNB9992nw4cP66GHHtKmTVf/\n+rZDb99ERkYqPT1dGRkZKigoUFJSkjp37uzIXQIAcF1ypTUlpVkzajKZLN+cys7OVnBwsN12HTq/\n8/T01LRp0xQbGyuz2ayYmBirWRQAADCe4taMpqamWtWMHj1asbGxevfdd5Wfn6+lS+3/CguHh05R\nUVGKiopy9G4AALi+udCSktKs/EhKSlL//v31wAMPaO/evZo4caKSkpKu+jM80RUAAJRJSEiIMjMz\nLe+zsrIUFGT9O80+/PBDde/eXZLUvHlznT9/XqdOnbpqu0xKAAAwAFdaU1KaNaM1atTQN998I0k6\nfPiwCgoK7P5+Lff9fhoAAPhLSlozOnfuXEVGRqpjx46Ki4vT008/rWXLlsnDw0OzZ8+22y6TEgAA\nDMDVnlNS3JrRsWPHWv4cFham999/v0xtcvsGAAC4BCYlAADAJXD7BgAAA3C12zeOQFICAABcAkkJ\nAAAGQFICAADgJCQlAAAYwfUflJCUAAAA10BSAgCAAbCmBAAAwElISgAAMACSEgAAACchKQEAwABI\nSgAAAJyEpAQAACO4/oMSkhIAAOAaSEoAADAA1pQAAAA4CZMSAADgErh9AwCAAXD7BgAAwElISgAA\nMACSEgAAACchKQEAwABISgAAAJyEpAQAACO4/oMSkhIAAOAaSEoAADAA1pQAAAA4CUkJAAAGQFIC\nAADgJCQlAAAYgBsEJSQlAADANZCUuIuCc+Xdg9IzUF8rehpnXm+kvgJwT0xKAAAwABa6AgAAOAlJ\nCQAABuAGQQlJCQAAcA0kJQAAGABrSgAAAJyEpAQAAANwg6CEpAQAALgGkhIAAAzAw+P6j0pISgAA\ngEsgKQEAwABYUwIAAOAkJCUAABiAqz2nZMuWLZo1a5bMZrP69++vhx9+2Gr7iy++qB07dshkMikv\nL0+nT5/Wzp07r9omkxIAAFAmRUVFmjlzppYtW6agoCDFxMSoc+fOCgsLs9RMnjzZ8ucVK1YoLS3N\nbrvcvgEAwABMJue97ElJSVHdunVVs2ZNeXl5KTo6Whs3biyxPjExUT179rTbLpMSAABQJllZWQoN\nDbW8Dw4O1vHjx4utzczMVEZGhtq0aWO3XSYlAACgTMxmc6lrk5KS1LVr11KtiWFSAgCAAZhMJqe9\n7AkJCVFmZqblfVZWloKCgoqtXb9+falu3UhMSgAAQBlFRkYqPT1dGRkZKigoUFJSkjp37mxTd+TI\nEWVnZ6t58+alapdv3wAAYACu9JVgT09PTZs2TbGxsTKbzYqJiVFYWJjmzp2ryMhIdezYUdKllCQ6\nOrrU7TIpAQAAZRYVFaWoqCirz8aOHWv1fvTo0WVqk0kJAAAG4EJBicOwpgQAALgEkhIAAAzAldaU\nOApJCQAAcAkkJQAAGIAbBCUkJQAAwDWQlAAAYACsKQEAAHASkhIAAAzADYISkhIAAOAaSEoAADAA\n1pQAAAA4CZMSAADgErh9AwCAAbjB3RuSkiudPn1aA2P6KbCqvxrfXF+rV71fYu3UyXEKDAxU7dAb\nNXVynNW25L171a71bbohwE/t2rRSSnKyo7vu0qpW9tHqVx/Sia2vKi1xhgZ2a1lsXRV/b0nST5/P\n0tENszTl4e5W29s0q68ty59U1lcva/uqSbqjWQOH992VnT59WvcNuEdB1SsromEDfbC65Os1Li5O\ndWrcqLo1g/T0FOvrdcyoR3RrZLgq+1TQyhXLHd1tl1eWcSAuLk61QhgHSoPzitJgUnKFcWNGydvb\nW78cO6Ely1Zo3OhHdSAtzaZu0YK3lZSYoNTUVO3cnaJP1idq8cIFkqQLFy5oYExfDRoyTL+dPKPB\nQ4ZpQP8+KiwsdPbhuIw5U+5VfsEF1e40SbFTl2vOlHvVqH6wTd3LT8ZIkhp2n672w17WoOjbNbhX\na0mXJjYfvPawXl22QcF3TdS/3vlcH855xDKRcUfjxz6mSt7e+jnjuBYve1fjx4wq9npdvPBtJSQk\naMd3Kdq+K1mfrk/SkkULLNubNmuuf73+pm5tUfxk0d2UZRxISEjQt3sYB0qD8/r3mUwmp73KC5OS\nP+Xl5Wntmo8049nn5ePjo7bt2im6Z2+9t/Jdm9qVK5Zr3PgJCg0NVWhoqMaNn6B3ly+TJH35xWZd\nvHhRj40ZKy8vL40aPUZms1lfbN7k5CNyDT7eXurTqZlmvJGo/PMXtC35iJK+TNWg6NttartHNZEk\nFVwoVPqx01q2dpuG92kjSWrTrIGyTuZo7aZL/ypa9ckunTydqz6dmjvvYFxIXl6eEj7+SM/MmCkf\nHx/d0badevTsrfffs71e31v5riZMuHy9jhn/hFa8+45l+0OPPKr2HTqqUqVKzjwEl1TWceDK88o4\nUDLOK0qLScmfDh08qAoVKqhBWJjls8hmzZS2f59Nbdr+fYps2uxyXdPLdWn79ysysqlVfWRkU+3f\nZ9uOO7i5TpAKLxbp6K8nLZ+lHsxQeFio3Z/1MJkUEVZD0n//hWC93WQyqclN9tu5Hh06VMz1GtlU\nafv329Sm7d+nZs0uX69NmxZ/XaPs48CV55VxoGSc12vDZHLeq7w4dFIyZcoUtW3bVr169XLkbq6J\n3NxcVQkIsPosoEqAcnJyiq0NuKI2ICBAubm5kqSzZ23bqVIlQLm5tu24A3/fSsrOzbf67I/cc6rs\na/uv8g1bL0W5fj4V1aB2oIb1biNfby9J0vbkIwq9MUAxd7eQp6eHBvdqrQa1AuXjXdHxB+GCzhZ3\nvQYEKKeY6+x/r9dL12Ouw/toRIwDjsF5RWk5dFJyzz33aPHixY7cxTXj7++vnOxsq8+ys7NVuXLl\nYmuzr6jNzs6Wv7+/JMnPz7adnJxs+fvbtuMOcvPOq7Kf9bqPKn4+ysk7b1P7xOx/S5JS1z6j1a8+\nrNWf7lLG8TOSpNPZeRr4+AKNG9pJP22YpS5tGmvj9gPKyDrj+INwQX4lXa/FXGc212vO5esV1hgH\nHIPzem2wpuRvuu2221SlShVH7uKaublhQxUWFurI4cOWz1JTkhUe0cSmNjyiiVJTLq/4Tknea6mL\naNJEqakpVvWpqSmKaGLbjjs4lH5cFTw9VL9WoOWzyIY1lXb4mE3tH7nnJEkN7p6qVgNnydPDQ7u+\n/9myfeuew7pr6Cuq3WmSRkxbrkb1g622u5Obby7mek1NUXhEhE1teEQTJScXf73CWlnHgZLOK+OA\nNc4rSos1JX/y9fVVn3736LkZ05WXl6dvtm5VUmKCBg0ealM7eMgwzZ0Tr8zMTGVmZmrunHgNG/6g\nJCmqfQd5enrqzXmvq6CgQPPfmCeTyaQOHTs5+5Bcwrn8C1q7KVnTH42Wj7eX7mjWQNHtI/Ve0k6b\n2no1b5B06V8Dd7eL0IP3tNWLCz+1bG/asKY8PT1U2c9bs5+4R7/+dlqbdhxw2rG4El9fX/Xue49m\nPveM8vLytO2brVqfmKD7B9ler4MGD1V8fLyOZWbqWGamXp/zmoYOe8Cy/cKFC8rPz5fZbNaFggKd\nP39eZrPZiUfjOso6DsTHMw6UBuf12nCHNSUms4NHn4yMDI0cOVLr1q0rVX2RWfIopxNy+vRpxcbG\nasOGDQoMDNTs2bN177336uuvv1aPHj2sIsVJkyZp4cKFMplMeuihh/Tiiy9atiUnJ2vEiBFKS0tT\neHi4lixZoqZNmxa3S+Avu1bXa8eOHfXll19aRbabN29WVFSUU4/HVTAOOMb1el7zCyVvJz2GtO0/\ntzhnR5K+eap8/v673KQk30BfN/euYJz+Vms1ury7UCrn9syTz63G6Ksk/b7j9fLuQqn4VjQpr8A4\n6YdHef3LpIyMNAYYidHOq7MmJe1e/so5O5K0deJdTtvXlRx++8ZdY2AAAFA2Dp2UTJgwQffdd5+O\nHj2qDh066D//+Y8jdwcAwHXLHdaUODR0evXVVx3ZPAAAuI7w7RsAAOASnLQ8BwAA/B3l+VAzZyEp\nAQAALoGkBAAAAyApAQAAcBKSEgAADMANghKSEgAA4BpISgAAMADWlAAAADgJSQkAAAbgBkEJSQkA\nAHANJCUAABgAa0oAAACchKQEAAADcIOghKQEAAC4BpISAAAMwMMNohKSEgAA4BKYlAAAAJfA7RsA\nAAzADe7ekJQAAICy27Jli7p166auXbtqwYIFxdasX79e0dHR6tWrl5588km7bZKUAABgAK708LSi\noiLNnDlTy5YtU1BQkGJiYtS5c2eFhYVZan7++WctWrRIq1evlr+/v06dOmW3XZISAABQJikpKapb\nt65q1qz941/HAAAgAElEQVQpLy8vRUdHa+PGjVY1H3zwgQYNGiR/f39JUvXq1e22S1ICAIABeLhO\nUKKsrCyFhoZa3gcHBys1NdWq5qeffpIk3X///TKbzXrsscd01113XbVdJiUAAKBMzGaz3ZqLFy8q\nPT1dK1euVGZmpgYPHqykpCRLclIcbt8AAGAAJpPJaS97QkJClJmZaXmflZWloKAgq5rg4GB17txZ\nHh4eqlWrlurXr29JT0rCpAQAAJRJZGSk0tPTlZGRoYKCAiUlJalz585WNV26dNH27dslSadOndLP\nP/+s2rVrX7Vdbt8AAGAALvTlG3l6emratGmKjY2V2WxWTEyMwsLCNHfuXEVGRqpjx4666667tHXr\nVkVHR8vT01NPPfWUAgICrtquyVyaG0NOlF9Y3j0oPe8KxulvtVajy7sLpXJuzzz53GqMvkrS7zte\nL+8ulIpvRZPyClzqr/pVebjSir6rMNIYYCRGO6/eTvrnffTbO52zI0lJj9zutH1diaQEAAADMMkY\nk/W/gzUlAADAJZCUAABgAAa5q/m3kJQAAACXQFICAIABuNLvvnEUkhIAAOASmJQAAACXwO0bAAAM\nwA3u3pCUAAAA10BSAgCAAXi4QVTCpMRdVL6hvHtQegbq69nzxngWtm9FL8P0VZIq+3iVdxcAlAMm\nJQAAGIAbBCWsKQEAAK6BpAQAAAPg4WkAAABOQlICAIABuEFQQlICAABcA0kJAAAG4A7PKSEpAQAA\nLoGkBAAAA7j+cxKSEgAA4CKYlAAAAJfA7RsAAAyAh6cBAAA4CUkJAAAG4HH9ByUkJQAAwDWQlAAA\nYACsKQEAAHCSEpOS1atXX/UH77333mveGQAAUDw3CEpKnpTs2rWrxB8ymUxMSgAAwDVV4qTk5Zdf\ndmY/AADAVbCmRNL58+c1b948xcXFSZKOHDmijRs3OrxjAADAvdidlMyYMUNnz57V999/L0kKCgrS\nvHnzHN4xAABwmYfJea9yO0Z7BWlpaYqLi5OXl5ckyd/fXxcvXnR4xwAAgHux+5ySihUrWr0vKCiQ\n2Wx2WIcAAIAtd1hTYndS0rJlSy1cuFAFBQXatWuXli5dqg4dOjihawAAwJ3YvX3z+OOP6/z58/L2\n9tYLL7ygxo0ba+zYsc7oGwAA+JPJia/yUqrbN6NHj9bo0aOd0R8AAOCm7E5K8vLy9NZbb2n79u0y\nmUxq06aNHnnkEfn6+jqjfwAAwE3YvX0zZcoUZWVlaeLEiZowYYKOHz+uyZMnO6NvAADgTx4mk9Ne\n5cVuUnLo0CElJSVZ3t9+++2Kjo52aKcAAID7sTspqVGjhs6cOaOqVatKks6cOaPatWs7vGMAAOAy\nN/hGcMmTkvj4eElS5cqV1adPH3Xq1EmStHnzZt1xxx3O6R0AAHAbJU5KPDwuLTepU6eO6tSpY/m8\nb9++ju8VAACw4tYPTxs/frwz+wEAANyc3W/fSNK2bdu0dOlSvfXWW5bX9ej06dMaGNNPgVX91fjm\n+lq96v0Sa6dOjlNgYKBqh96oqZPjrLYl792rdq1v0w0BfmrXppVSkpMd3XWXVtXfW6ufv08nPp2i\ntNXjNbDzLcXWVfGrJEn66eOJOrrmSU15oEOxdXc2q6uzXzyjabEdHdVlQzhz+rSGD4pRvdBqui2y\noT7696oSa+Pi4tS4XqjC69fQc9Otvz1XVFSkF5+brqaN6qlBzRvUJaq1crKzHd19l1WWcSAuLk61\nQhgHSoPz+veZTM57lRe7k5LXXntNb7zxhhYuXKj09HS98847OnjwoDP65nTjxoySt7e3fjl2QkuW\nrdC40Y/qQFqaTd2iBW8rKTFBqamp2rk7RZ+sT9TihQskSRcuXNDAmL4aNGSYfjt5RoOHDNOA/n1U\nWFjo7MNxGXOe6Kn8gkLV7v1Pxc78j+Y80VON6gba1L08prskqeGAeLUfuVCD7m6qwd2aWdV4enro\n5THdtXP/r07puyuLe2KMvCt5K+1Ipt5YuExPPTFGB3+wvV7fWbJQCQkJ+nL7bn2x7Ttt+HS9li9d\nZNk++/kZ2rVrpz7d9LWOZPyuNxYsVSVvbyceiWspyziQkJCgb/cwDpQG5/X6s2XLFnXr1k1du3bV\nggULbLavWbNGd9xxh/r166d+/frpww8/tNum3UnJxo0btXTpUgUGBmrWrFn66KOPdP78+b92BC4s\nLy9Pa9d8pBnPPi8fHx+1bddO0T17672V79rUrlyxXOPGT1BoaKhCQ0M1bvwEvbt8mSTpyy826+LF\ni3pszFh5eXlp1OgxMpvN+mLzJicfkWvwqeSlPlHhmrFoo/ILCrXt+1+UtPUHDbq7mU1t97YNJUkF\nFy4qPesPLUvao+E9WljVjL+3rT7/9kf98PNJp/TfVeXl5Slp3ceaNO1Z+fj4qHWbturavaf+vWql\nTe0H76/QhAkTFBwSquCQUD065nGtWrlckvTHmTNa8NY8xc+drxo1a0mSGjWOsPlFnO6irOPAhAmM\nA6XBeb02XOk5JUVFRZo5c6YWL16sxMREJSUl6fDhwzZ10dHRWrNmjdasWaOYmBj7x2ivoGLFivLy\n8pIkFRYWKjQ0VMeOHbPbsNEcOnhQFSpUUIOwMMtnkc2aKW3/PpvatP37FNn08v+pRja9XJe2f78i\nI5ta1UdGNtX+fbbtuIOba9+gwotFOpp52vJZ6uEshdcPsvuzHh4mRVxRVyc4QEO7N9esZV+6xYKv\nqzn846XrtX6Dy9drk8im+iFtv03tDwf2q1mzy9drk1ua6ocDl+rS9n8vrwpeSvj4P7rl5jpq2/IW\nLVl4fd6eLY2yjgNXnlfGgZJxXq8/KSkpqlu3rmrWrCkvLy9FR0dr48aNNnVms7lM7dp9Tomfn5/y\n8/PVvHlzTZ48WUFBQaX+P4TffvtNTz31lE6ePClPT08NGDBAw4YNK1MHnSU3N1dVAgKsPguoEqCc\nnJxiawOuqA0ICFBubq4k6exZ23aqVAlQbq5tO+7A36eiss/mW332R26+Kvva/kt8w44fNahrM/n5\nVFRwdX8N695cvt5elu2vjO2uZxdt0rnzFxzeb1d39uxZVa5S3HWWa1v7P9dr5SpVdPbPusyMX/XH\nH2d09PCP2r3vR/146AfF9Oqmm25uqKgOnRx7EC6IccAxOK/Xhiv9WywrK0uhoaGW98HBwUpNTbWp\n++yzz7Rr1y7Vq1dPkydPVkhIyFXbtZuUvPLKK/Lw8NCkSZNUp04dFRQUaM6cOaXqtKenpyZPnqz1\n69dr1apVWrlyZbHxjivw9/e3WdyXnZ2typUrF1ubfUVtdna2/P39JUl+frbt5ORky9/fth13kHuu\nQJV9K1l9VsWvknLyCmxqn5izXpKU+t5YrX7hPq3+PFUZJy6dyx5tG8rft5LWfGmbBLgjPz8/5eQU\nd53529b+z/Wam5Mjvz/rvH18ZDKZ9OSkp1WxYkVFNIlU3/4D9flnnzr2AFwU44BjcF6vP6VJQDp1\n6qRNmzZp7dq1uuOOOxQXF2f3Z+xOSoKDg1WxYkX5+vpqzJgxmjp1qmrVqlWqTt94440KDw+XdGkQ\nDQsL0/Hjx0v1s852c8OGKiws1JErJk2pKckKj2hiUxse0USpKZdXfKck77XURTRpotTUFKv61NQU\nRTSxbccdHPrld1Xw9FD9GtUsn0XeFKK0o7bXwR+5lxKVBv1eUasH3pSnh4d2pWVIkjq0aKBbG4bq\nyJondWTNk4rp1ESjB7TR6ufvc86BuJiwmxrqYmGhjh65fL3uS01Ro/AIm9pGjSOUfMU3FL5PTVaj\nxpfqIppEOr6zBlLWceDK88o4UDLO67VhMpmc9rInJCREmZmZlvdZWVkKCrK+LR8QEGBZ/jFw4EDt\nK8VtthInJU888YQmTJhQ4qusfv31Vx04cEBNmza1X1wOfH191affPXpuxnTl5eXpm61blZSYoEGD\nh9rUDh4yTHPnxCszM1OZmZmaOydew4Y/KEmKat9Bnp6eenPe6yooKND8N+bJZDKpQ0f3i8Il6dz5\nC1q7JU3TR3SSTyUv3XFLbUW3a6T3PrP9Gl+90EsTF5PJpLtb36QHe7XQi+98KUmasWijmg5+Xa0f\nnK/WD85X0tYftDRxtx5+6WOnHo+r8PX1VXSvvpr9wrPKy8vTju3f6P8+SdSA+wbb1A68f4ji4+P1\n27FM/XYsU2/N+5fuHzJcklSvfgO1aXunXnvlJRUUFOjgD2n6+KN/q2t39/z9VmUdB+LjGQdKg/N6\n/YmMjFR6eroyMjJUUFCgpKQkde7c2armxIkTlj9v3LhRN910k912TeYSMph///vfV/3BAQMGlKbf\nki7d/x46dKhGjRqlLl26XLW2yCx5lNN9s9OnTys2NlYbNmxQYGCgZs+erXvvvVdff/21evToYRUp\nTpo0SQsXLpTJZNJDDz2kF1980bItOTlZI0aMUFpamsLDw7VkyRKXnYzBuK7V9Xrs2DHFxsbq66+/\nVnBwsCZNmqR//OMf5XFILoFxwDGu1/OaXyh5212deW08tsb2K9SO8ka/cLs1W7Zs0QsvvCCz2ayY\nmBg9/PDDmjt3riIjI9WxY0fFx8dr06ZNqlChggICAjRjxgzVr1//qm2WOCm5VgoLC/XII48oKipK\nw4cPt1ufb6Cvm3tXME5/q3V6pry7UCrntjwrnyhj9FWS0pOeLu8ulMqNlb10Isc4C4Qr+3jZL3IB\nRhoDjMRo59VZk5IxTpyUvF6KSYkjlOqJrn/HlClTdNNNN5VqQgIAANyXQ+d33333ndatW6eGDRuq\nb9++MplMevzxxxUVFeXI3QIAcN1xh+czOXRS0rJlS6UV8xhhAACA/1Wq2zc7d+7U++9f+uVJv//+\nu9LT0x3aKQAAYM3D5LxXuR2jvYLFixcrPj5eS5culSSdP39ekyZNcnjHAACAe7E7KVm7dq3effdd\n+fr6SpJq1KhR7KOBAQCA45CUSPL29rY8ke2/3GGxDQAAcC67C11DQkK0d+9emUwmmc1mLVy4UGFX\n/KZHAADgeO4QCNidlEydOlUTJ07UoUOH1KxZMzVr1kyvvfaaM/oGAADciN1JSXBwsJYvX67c3FyZ\nzeZif6sjAABwrPJc6+EsdiclX3/9dbGf33nnnde8MwAAwH3ZnZS8+eablj+fP39eBw8eVHh4OJMS\nAACcyA2WlNiflLz33ntW73/44QetWLHCYR0CAADuqcyPmW/UqJEOHDjgiL4AAIASeLhBVFKmNSVF\nRUVKTU3VxYsXHdopAADgfsq0psTT01N16tTRv/71L4d2CgAAuJ+rTkqKioo0cuRIRUVFOas/AACg\nGKX6DboGd9Vj9PDwsEpKAAAAHMXuxCsiIkLff/+9M/oCAABKYDI571Ve7K4p2bt3r1avXq0GDRrI\nz8/P8vmqVasc2jEAAOBe7E5KJk6c6Ix+AACAq3DrrwRPmTJFs2bN0h133OHM/gAAADdV4qQkLS3N\nmf0AAABX4QZBiVt8wwgAABhAiUnJwYMHi711YzabZTKZtG3bNod2DAAAXObhBklJiZOSevXqacGC\nBc7sCwAAcGMlTkoqVqyomjVrOrMvAACgBO7w7ZsS15R4eXk5sx8AAMDNlZiUfPDBB87sBwAAuAo3\nCEr49g0AAHANdp/oCgAAyp87fPuGpAQAALgEJiUAAMAlcPsGAAADMOn6v39DUgIAAFwCSQkAAAbA\nQlcAAAAnISkBAMAASEoAAACchKQEAAADMLnBc+ZJSgAAgEsgKXEXRRfLuwelZ6C+GulXiRuprwBs\nsaYEAADASUhKAAAwAHcIO0lKAACASyApAQDAANxhXRhJCQAAKLMtW7aoW7du6tq1qxYsWFBi3aef\nfqrGjRtr3759dttkUgIAAMqkqKhIM2fO1OLFi5WYmKikpCQdPnzYpu7s2bNasWKFmjdvXqp2mZQA\nAGAAHibnvexJSUlR3bp1VbNmTXl5eSk6OlobN260qZszZ44eeugheXl5le4Yy3pSAACAe8vKylJo\naKjlfXBwsI4fP25Vk5aWpt9++03t27cvdbssdAUAwABcaZ2r2Wy2u33WrFmaPXt2qX9GIikBAABl\nFBISoszMTMv7rKwsBQUFWd6fPXtWP/74o4YOHapOnTopOTlZo0aNsrvYlaQEAAAD8JDrRCWRkZFK\nT09XRkaGbrzxRiUlJSk+Pt6y3d/fX9u2bbO8Hzp0qCZPnqyIiIirtsukBAAAlImnp6emTZum2NhY\nmc1mxcTEKCwsTHPnzlVkZKQ6duxoVW8ymUp1+4ZJCQAABuBKa0okKSoqSlFRUVafjR07ttja5cuX\nl6pN1pQAAACXQFICAIABlOb5IUZHUgIAAFwCSQkAAAbAL+QDAABwEpISAAAMwA2CEpISAADgGkhK\nAAAwANaUAAAAOAmTEgAA4BK4fQMAgAG4wd0bkhIAAOAaSEoAADAAd0gR3OEYAQCAAZCUAABgACY3\nWFRCUgIAAFwCSQkAAAZw/eckJCUAAMBFkJQAAGAAPGYeAADASUhKAAAwgOs/JyEpsXL69GkNjOmn\nwKr+anxzfa1e9X6JtVMnxykwMFC1Q2/U1MlxVtuS9+5Vu9a36YYAP7Vr00opycmO7rpLq1rZW6tn\nDdKJz6Yp7YMJGtilabF1VfwqSZJ+Spiko2vjNOXBjlbbD/x7gn7/fLqy/u9pZf3f01r76jCH992V\nnTl9WsPuj1HdkKpqccvN+s+/V5VYGxcXp4Z1Q9SoXqienTbZatuNVSqqbmg11Q2tpno1quvxMSMd\n3XWXVpZxIC4uTrVCGAdKg/OK0iApucK4MaPk7e2tX46d0J7du3VPn2g1a9ZcjcPDreoWLXhbSYkJ\nSk1NVX6hFN2tixo0CNOIhx7WhQsXNDCmr8aOe0IPj3xUC99+SwP699G+Az+qQgX3PN1zJvRWfkGh\navd8Ubc2qqGP/jlUyYeO6YefT1jVvTw2WpLUsP/LCqleWevnPKifj53Ryk/3SJLMZqnfxHe1Zc9R\npx+DK5r4xBhV8vbWgaPHlLJ3t+4f0EeRkc3UsLH19bpsyQIlJCRoy45L57F/r26qV7+Bhsc+JOnS\nsw+2bNutuvXqO/0YXFFZxoGEhAR9uydVEuOAPZzXv88NlpSQlPxXXl6e1q75SDOefV4+Pj5q266d\nonv21nsr37WpXbliucaNn6DQ0FCFhoZq3PgJenf5MknSl19s1sWLF/XYmLHy8vLSqNFjZDab9cXm\nTU4+ItfgU8lLfaIiNGPB58ovKNS21HQlbT2gQV2b29R2b9tIklRw4aLSs85oWeJ3Gh7dwqrGHR4e\nVBp5eXlKSlijKdOelY+Pj1rf0U7devTUB6tW2tR+8N4KTZgwQSEhoQoJCdWoMeO1auVyy3az2ayi\noiJndt9llXUcmDCBcaA0OK8oLSYlfzp08KAqVKigBmFhls8imzVT2v59NrVp+/cpsmmzy3VNL9el\n7d+vyEjr2xORkU21f59tO+7g5to3qPBikY5mnrJ8lvrjbwqvH2T3Zz08TIpoEGz12dLpA/RTwiSt\nfXWYbgkLLuEnr3+Hf7x0vdZvcPl6bXJLMx1I229Te+DAfjVrdvl6bRLZVAcOWNf17t5ZTW6uoweH\n3Ktf0n92XMddXFnHgSvPK+NAyTiv14bJZHLaq7w4dFJSUFCgAQMGqG/fvurVq5fmzZvnyN39Lbm5\nuaoSEGD1WUCVAOXk5BRbG3BFbUBAgHJzcyVJZ8/atlOlSoByc23bcQf+vpWUfTbf6rM/cvNV2beS\nTe2GHYckSX4+FdWgZnUN69FCvt5elu0PPPuBGg94RY1iXtFXe35SwqsPFNuOOzibm6vKVf73OqtS\n7HV29n+u1ypVAnT2z+tVktZ9ukl79v2o7d99r+CQEA0a0MdtkxPGAcfgvKK0HDopqVixopYvX66P\nP/5YH3/8sbZs2aKUlBRH7vIv8/f3V052ttVn2dnZqly5crG12VfUZmdny9/fX5Lk52fbTk5Otvz9\nbdtxB7l5520mDlX8Kikn77xN7RP/SpQkpb7/uFbPGqTVG1KUcfwPy/Yd+35RwYWLOl9QqFdWbNEf\nuefUrlldxx6Ai/Lz91duTumuM7//uV5zcrLl9+f1Kklt2t6pChUqqHKVKpr1z9eU/vNPOvhDmuM6\n78IYBxyD84rScvjtGx8fH0mXUpPCwkJH7+4vu7lhQxUWFurI4cOWz1JTkhUe0cSmNjyiiVJTLq/4\nTknea6mLaNJEqanWE6/U1BRFNLFtxx0c+uV3VfD0UP0a1S2fRd4UqrSjx21q/8i9lKg06DtbrYbP\nk6enSbvSMkps22x23zUmYTddul6PHrl8ve5LTVHj8Aib2saNI5R8xTcUvk9JVuPGtnXSpfUlMpku\n/bcbKus4cOV5ZRwoGef12vBw4qu8OHzfRUVF6tu3r9q1a6d27dqpadPivw5a3nx9fdWn3z16bsZ0\n5eXl6ZutW5WUmKBBg4fa1A4eMkxz58QrMzNTmZmZmjsnXsOGPyhJimrfQZ6ennpz3usqKCjQ/Dfm\nyWQyqUPHTs4+JJdw7vwFrd2yX9P/0Vk+lbx0R2QdRd/ZWO/9316b2no1qkm6NNG4u83NerDXbXpx\n2WZJUq2gALW5pbYqeHqoopenHr//TlUP8NW2VPdc/+Dr66vo3v300gszlJeXpx3bturTTxI18L7B\nNrUDBw1RfHy8jh3L1LFjmZo/b47uHzJckvTDgf36PjVZRUVFys3N1fQpE1WjRi01bBRu0447KOs4\nEB/POFAanFeUmtlJcnJyzEOHDjUfOnToqnUXi5zUoWKcOnXK3LdvX7Ofn5+5bt265lWrVpnNZrP5\nq6++MleuXNmqNi4uzly9enXzDTfcYJ40aZLVtr1795pbtmxp9vX1Nbds2dKcnJzstGOA+7gW1+um\nTZvMjRo1Mvv7+5uDg4PN/fr1M//4449OPQ5XwzjgGNfreT13wXn7Wr0nw2mv8mIym52X086bN09+\nfn568MEHS6zJd907PDa8Kxinv9U6PF3eXSiVc18/L587jdFXSfr10xnl3YVSucG/gn7PNcjFKsnP\n2xjPnDDSGGAkRjuvzrpcP9ib6ZwdSRrYvIbT9nUlh96+OXXqlGV1dX5+vrZt26YGDRo4cpcAAFyX\nTE58lReHzu9OnDihSZMmqaioSEVFRerRo4fat2/vyF0CAACDcuikpFGjRlqzZo0jdwEAgFtwh28b\n8kRXAADgEoyxmgwAADfnDimCOxwjAAAwAJISAAAMgDUlAAAATkJSAgCAAVz/OQlJCQAAcBFMSgAA\ngEvg9g0AAAbgButcSUoAAIBrICkBAMAAPNxgqStJCQAAcAlMSgAAMACTyXmv0tiyZYu6deumrl27\nasGCBTbbV61apV69eqlv374aPHiwDh8+bLdNJiUAAKBMioqKNHPmTC1evFiJiYlKSkqymXT06tVL\n69at08cff6wRI0boxRdftNsukxIAAAzA5MT/2JOSkqK6deuqZs2a8vLyUnR0tDZu3GhV4+fnZ/lz\nXl6ePDzsTzlY6AoAAMokKytLoaGhlvfBwcFKTU21qVu5cqWWLVumwsJCvfPOO3bbJSkBAMAAXGlN\nidlsLlWfBw8erA0bNujJJ5/Um2++abeeSQkAACiTkJAQZWZmWt5nZWUpKCioxPoePXro888/t9su\nkxIAAAzAQyanveyJjIxUenq6MjIyVFBQoKSkJHXu3Nmq5ueff7b8efPmzapXr57ddllTAgAAysTT\n01PTpk1TbGyszGazYmJiFBYWprlz5yoyMlIdO3bUihUrtG3bNnl5ealKlSqaPXu23XaZlAAAYACu\n9rtvoqKiFBUVZfXZ2LFjLX+eOnVqmdvk9g0AAHAJJCUAABiAqyUljkBSAgAAXAKTEgAA4BK4fQMA\ngAGU5vHvRkdSAgAAXAJJCQAABuBx/QclJCUAAMA1kJQAAGAArCkBAABwEpISAAAMgIenAQAAOAlJ\nCQAABsCaEgAAACchKQEAwAB4TgkAAICTkJQAAGAA7rCmhEmJu7hwvrx7UHoG6qunp3EGCSP1FYB7\n4vYNAABwCSQlAAAYAA9PAwAAcBKSEgAADMANghKSEgAA4BpISgAAMAAPN1hUQlICAABcAkkJAAAG\ncP3nJCQlAADARZCUAABgBG4QlZCUAAAAl0BSAgCAAbjDL+QjKQEAAC6BpAQAAANwg8eUkJQAAADX\nQFICAIABuEFQQlICAABcA5MSAADgErh9AwCAEbjB/RuSEgAA4BJISgAAMAAengYAAOAkJCUAABgA\nD08DAABwEpISAAAMwA2CEpISAADgGkhKAAAwAjeISkhKAACAS2BSAgCAAZic+J/S2LJli7p166au\nXbtqwYIFNtuXLVum6Oho9enTRw8++KCOHTtmt00mJQAAoEyKioo0c+ZMLV68WImJiUpKStLhw4et\naiIiIvTRRx9p7dq1uvvuu/XPf/7TbrtMSgAAMACTyXkve1JSUlS3bl3VrFlTXl5eio6O1saNG61q\nbr/9dlWqVEmS1Lx5c2VlZdltl0kJAAAok6ysLIWGhlreBwcH6/jx4yXWf/jhh4qKirLbLt++AQDA\nAFzpyzdms7nUtWvXrtW+ffv07rvv2q1lUgIAAMokJCREmZmZlvdZWVkKCgqyqfvmm2+0YMECrVix\nQl5eXnbb5fbNFU6fPq2BMf0UWNVfjW+ur9Wr3i+xdurkOAUGBqp26I2aOjnOalvy3r1q1/o23RDg\np3ZtWiklOdnRXXdpVSv7aPXs4Tqx+XmlrZmsgXc3L7auip+3JOmnT6br6PrpmjLi/9nUPHbvndr/\n0SSd2Py8vnt/ghrUusGhfXdlZ06f1pB7+6vWjQFqFn6TPvxgVYm1cXFxCqsdrJvqhOiZpycVW/P+\niuWq7uelFe8sdVSXDaEs40BcXJxqhTAOlAbn9foSGRmp9PR0ZWRkqKCgQElJSercubNVzf79+/XM\nM5e187MAABYjSURBVM9o/vz5qlatWqnaZVJyhXFjRsnb21u/HDuhJctWaNzoR3UgLc2mbtGCt5WU\nmKDU1FTt3J2iT9YnavHCS1+HunDhggbG9NWgIcP028kzGjxkmAb076PCwkJnH47LmPNUP+UXXFDt\nbjMU+8z7mvPUPWpUz3ZG/fITvSVJDXu/oPaxczWoewsN7tHSsv2B3rdraM9W6jN+sW7s+LTueWKJ\nfj9z1mnH4WomjB+tSt7eOpT+m95e8o4mjHtMPxywvV6XLlqghIQEbd25V1/v2KPPPlmvZYsXWtX8\nceaM/vXqPxXe5BZndd9llWUcSEhI0Ld7GAdKg/N6DZic+LLD09NT06ZNU2xsrHr27Kno6GiFhYVp\n7ty52rx5syTp5Zdf1rlz5zRu3Dj17dtXo0aNsn+I5rLcGHKC/HK6tvLy8hR6YzXtSdmvBmFhkqQR\nDwxTzVq19Nzzs6xqO0a107DhD+rRR/6h/ELpnaVLtHTJIn3x1Tf6fMNnGvnwCP149BdLfcOwunrz\nrYXq8v/uduoxXalau4nlsl+fSl469vlzuvW+V3Q043dJ0qJn7lPG8TN6Zv6nVrXpnz6jG6v5y6f1\npb4+Obyj7m7TSHc/+pYk6eDaKfrHc6u15Tvrr52Vp2NfvFQu+83Ly1P9GoHavjtV9Rtcul5H/uMB\n1ahRU9Ofe8Gqtmunu/TQ/2/v3sOqqvM9jr83W0S5hykomqJTeWHjNJBH50ynwCe11NRkKrMpbcqm\nZnLSxizPHC/xgI+lTKMzVno0ukxhx/KKMU4OE11UIgzItByvCQg+psIWZG/Z6/xh7SBMIGHvveTz\n8uF5ZO8f6/ddi8Xiy3f9fr/16/tJnjwVgNdefolXMlaxNecDd5uZ039LrC2OdW+9yZ2T7uGe+6Z6\nbmcuoJO/1Sv9tvQ68Ov7p3LPlAcAc1wHvOVyP66dPDQQovCrKs90BAzuFeKxvupTpeQb+778kg4d\nOrh/YABsgwez5/Pdjdru+Xw3trjB37WL+67dns8/x2aLa9DeZovj892Nt9MeXH1VV87VudwJCUDx\nvlIG9I1q8mv9LBYG9jvfrme3MKK7hRHbL4ovN8xh91tP8t8PNL69017s33f+fP02IQGItcWxd8/n\njdru3fM5gwcP/sF2n3ycR+GuT7j/wYfaNmgTaOl1oP5x1XXgh+m4tg5fWzytLXgkKXG5XEyYMIHf\n/OY3nujuR7Hb7YSGhTV4LSw0jKqqxpmp3W4nrF7bsLAw7HY7AGfONN5OaGgYdrvnMlxfEhzYkUp7\nTYPXTtvPEhIY0KjtP3Z8AUBQ54707dmFe8dcT2BARwCiu4UDkDTkGn42aQm3/PYF7hjxU+4be30b\n74Fvsp+xExravPPszPfO19CwMM58c766XC5mzZjOM+lL2zZgk9B1oG3ouEpzeSQpeeWVV+hXL0P2\nRcHBwVRVVjZ4rbKykpCQxiWs4OBgKuu1raysJDg4GICgoMbbqaqqJDjYO6Uwb7NXOwj5ZgDrt0KD\nOlFVXduo7czF6wEoXjubNYvuY83WXZQcPwVATa0TgPRXc7BX13Lk2ClWrdvJqP8c0MZ74JuCg4Kp\nqmreeRb0vfO1qrKSoG/O1/99cTmxtjjirx/StgGbhK4DbUPHtXX40uJpbaXNk5Jjx47x3nvv8ctf\n/rKtu7okV19zDefOneNAvWVyi4sKGTBwUKO2AwYOorjouxHfRYWfutsNHDSI4uKiBu2Li4sYOKjx\ndtqDfUeO08HqR0z0d7NkbFd3Z8+BY43anrafBaDv6BSun5yO1c+P/N3n7x1/eaQCh7POM0GbQL+r\nz5+vBw98d75+VlxE/wEDG7XtP2AghfVmKBQXFbrb5f4rh82b1tM/pif9Y3qSt2M7f3xqFrMff6zt\nd8IHtfQ6UP+46jrww3RcpbnaPClJS0vjiSeewOLN1KsZAgMDGTfhdp6eP5fq6mo++vBDsjZv5O7J\nv2rUdvI997L0z+mUlpZSWlrK0j+nc+83AwP/68absFqtLP/LMhwOB8//9S9YLBZuSkzy9C75hJpa\nJxv+9Rlzp42gc4A/w+L6MPqGgbz+TkGjtn16RABgsVgYMexapo77DxaufheAs7Xn+L9/FDLjnpsI\n6tyR6G5hTB03hKz3G4+haA8CAwMZM24CaSnzqa6uZsf2D3knaxN33n1Po7Z33f0r0tPTKSstpay0\nlL8ue47Jv5oCwPKVL7Gz4DPe31nA+zsL+OnP4pk953/44/wUD++Rb2jpdSA9XdeB5tBxbR0+NPmm\n7RhtKCcnx1iwYIFhGIaxY8cO46GHHmrya+pcbRnRxX399dfG+PHjjaCgIKN3795GZmamYRiG8f77\n7xshISEN2s6ePduIiIgwunTpYjz55JMN3vv000+N+Ph4IzAw0IiPjzcKCws9tg/SfrTW+VpfYmKi\nsWrVqjaN29fpOtA2LtfjWuP0XF/FX1V57MNb2nRKcHp6Ohs3bsRqtVJbW8uZM2e4+eabL/qkQG9N\nCf4xOnUwT7zemhLcUjU7n3VPCTYDb00JbqnwzlZO1Zjn9pe3pgS3lJmuAWZituPqqSnBn5XYPdMR\nEBsd7LG+6mvTQzlz5kxmzpwJQF5eHqtXr27Wo4tFRESk/dGzb0REREzAm+uHeIrHkpIhQ4YwZIim\nHYqIiMiFqVIiIiJiAj4+ibVVaJl5ERER8QlKSkRERMQn6PaNiIiICbSDuzeqlIiIiIhvUKVERETE\nDNpBqUSVEhEREfEJqpSIiIiYQHtYPE2VEhEREfEJqpSIiIiYgBZPExEREfEQVUpERERMoB0USlQp\nEREREd+gSomIiIgZtINSiSolIiIi4hNUKRERETEBrVMiIiIi4iGqlIiIiJiA1ikRERER8RAlJSIi\nIuITdPtGRETEBNrB3RtVSkRERMQ3qFIiIiJiBu2gVKJKiYiIiPgEVUpERERMQIuniYiIiHiIKiUi\nIiImoMXTRERERDxElRIRERETaAeFElVKRERExDeoUiIiImIG7aBUokqJiIiI+ARVSkRERExA65SI\niIiIeIgqJSIiIiagdUpEREREPERJiYiIiPgEJSUiIiImYPHgR3Pk5uYyatQoRo4cyYoVKxq9n5+f\nz+23386gQYPYunVr8/bRMAyjmf2LiIiIl3z1da3H+uoVEXDR910uFyNHjiQjI4Nu3bqRnJxMeno6\n/fr1c7cpLS3FbrezevVqkpKSGDFiRJP9aqCriIiICfjSQNeioiJ69+5NdHQ0AKNHj2bbtm0NkpIe\nPXoAYGlB4Lp9IyIiIi1SXl5O9+7d3Z9HRkZSUVFxydtVpURERMQUfKdU0lYjP1QpERERkRaJioqi\ntLTU/Xl5eTndunW75O0qKRERETEBi8VzH02x2WwcOXKEkpISHA4HWVlZDB8+/AfbN7eyotk3IiIi\nJlByyuGxvqLDOzbZJjc3l9TUVAzDIDk5mWnTprF06VJsNhuJiYkUFxfzu9/9jsrKSgICAujatSub\nNm266DaVlIiIiJhAqQeTkh7NSEragm7fiIiIz9Dfye2bkpIWOHDgALt27cLpdFJXV+ftcC4rOp6t\n7/DhwxQXF+NweO6vq/Zg37595OXlcfLkSW+HctnIz89n/fr1wPk1LZSYXJgvjSlpK5oS3Exbt24l\nPT2dyMhIIiMjiY2N5fbbbyc4ONjboZnawYMHiYmJwWq1UldXh9Vq9XZIl4WcnBzS09MJDw+na9eu\nPProo8TExHg7LNN77733WLx4Mb169eLcuXOkpqbStWtXb4dlWi6Xi5qaGubNm4dhGNTU1DBp0iQs\nFgsulws/P/3d3N7oO94MTqeTLVu2kJqayssvv8zw4cMpKytj5cqV2O12b4dnWjk5OYwfP57HH38c\nwJ2YyKUpKChg0aJFLFq0iFdffZXQ0NALPpdCWmbnzp2kpaWRmprK8uXL8ff3Z9++fd4Oy9T8/PwI\nCgpi/PjxJCcns2vXLjIyMtzvSUMWD/7zFn3Xm8lut3P48GEAbr75ZhITE3E6nWzatEmlxh+hurqa\n1157jTlz5uDv788f/vAHQIlJa5k2bRoDBw4EYPr06Zw+fVq3cS7RlVdeyYIFC4iLi+P48eMUFhby\n2muvMXfuXLKzs3UduAQdOnSgrKyMCRMmUFRUxMKFC1myZAmGYeByubwdnniQkpJm8Pf3Z+rUqWzd\nupX8/Hz8/PyIj49nwIABfPLJJ94Oz5QCAwNJS0tjzJgxPPHEEzgcjgaJifx4gwcPdj/4qq6uDofD\n4X4wFqCxED9Sv379GDp0KABr167l7rvvZvny5QwePJjs7Gwd10swfPhwunbtyrBhw4iNjSUzMxO7\n3Y7FYlHFpJ3Rd7uZEhIS+MUvfsGGDRv4+OOPsVqtjB07loqKCvbu3evt8EwpMjKSoKAgIiIiWLBg\nAbW1te7EZPfu3ezfv9/LEZqT1Wp1j3UyDIOQkBDCwsKIiIhg48aNPPfcc5w9e9bLUZrbww8/zCOP\nPALAxIkTOXPmDGVlZV6OyrwCAgI4ePAgb775JpmZmTz44IOUlZWRmZnp7dB8i8WDH16iga7NFBAQ\nwNixY7FYLLz44oscOHCAjh07cuLECQ10awVXXHEFCxYs4Nlnn2XUqFG4XC5eeeUVb4dleh06dKBD\nhw50796dJUuW8OGHH7Jw4UI6derk7dBMyzCMBk89/fvf/86JEydaZYnt9ioyMpKoqCiWL1/O3Llz\nSUpKYseOHfTu3dvboYmHafG0FnI4HBQUFLBmzRoCAgK499573ffu5dJlZGSwcuVKVq9ezbXXXuvt\ncEzPMAycTie33nor586dIyMjgz59+ng7rMuCw+Fgw4YNZGRk8Kc//YlrrrnG2yGZWllZGSdOnCA2\nNhZAs28uoLzS6bG+IkP9PdZXfUpKfqS6ujrd72xlp0+f5rHHHmP27Nn079/f2+FcVt5++21sNhtX\nX321t0O5bDidTj766CN69epF3759vR3OZeP7lSj5jpISEQ+rra0lICDA22FcdnShFzG/iirPJSXd\nQryTlOjPfPEpSkjahhISETEDDXQVERExAW8uauYpqpSIiIiIT1ClRERExAwu/0KJKiUiIiLiG5SU\niLSCpKQkbr31VsaNG8fYsWPZsmVLq2333//+NwAPPfQQX3311UXbv/vuuxQXF/+ovtatW8f06dOb\njONi+vfvT01NTYv6LSkpcS/fLiI/rB0s6KrbNyKtZdmyZfTr1489e/Zw11138fOf/5zw8PAGbVq6\nIFT9WTMvvvhik+23bdtGbGwsNput+YH/QH+e/HrNDhIRUFIi0mq+XfJnwIABBAUFcfToUXJycsjK\nyiIiIoL9+/eTmppKly5dSElJ4dixY5w9e5YxY8Ywbdo0APLz81mwYAGdO3cmLi6uwZNnk5KSWLFi\nBT/5yU8oLy8nNTWVQ4cOYbFYGD16NAMHDuSf//wn27dvZ+3atUyZMoVx48axfv16Xn/9derq6ggJ\nCWHevHnExMTgdDpJSUkhLy+PqKgoYmJimrWfL730Elu2bKGuro6OHTsyf/5892J3hmGwatUqPvjg\nA06fPs2MGTPcDwcsKipi8eLFnDlzBjj/9OIbb7yx1Y6/yOWuPeTuSkpEWtmOHTtwOBz06dOHffv2\nUVBQwMaNG+nZsycA999/P4888ggJCQk4nU6mTJmCzWYjPj6emTNnkp6eTkJCAu+88w5/+9vfLtjH\nrFmzSExMZOnSpQCcOnWK8PBwkpKSiI2NZfLkycD5JOfb7fj7+5Obm8ucOXN44403yMzMpKSkhC1b\ntuBwOJg8ebI7xosZP348U6dOBWD79u3MmzePNWvWuN+3Wq1kZmZy8OBB7rrrLhISEvD392fevHms\nXLmSK6+8kuPHj5OcnExWVtYlHWsRubwoKRFpJdOnTycgIIDg4GCWLVvmflJvfHy8+5d9TU0NeXl5\nnDx50l0Fqa6uZv/+/URERNC5c2cSEhIAuOWWW5g7d26jfqqrq9m1axcvv/yy+7Xv3yb6Vk5ODl98\n8QV33HEHhmFgGAZVVVUA5OXlMWHCBPz8/OjUqRO33XYbBQUFTe5ncXExK1as4PTp01gsFg4fPtzg\n/eTkZABiYmKIjY2lsLAQPz8/jh49yoMPPujeb6vVyuHDh38wdhFpqD2sU6KkRKSVfDum5PsCAwPd\n/3e5XFgsFt56661GY0v27t3b7L4sFkuzlo43DIOJEyfy6KOPXvC9lnI6nfz+97/njTfeoH///lRU\nVDS6BVN/u9/uL5wfBPvqq6822mZJSUmL4xCRy5Nm34i0kub8kg8KCiIhIYEXXnjB/dqxY8c4ceIE\nffv2pba2lvz8fACys7PdVY36AgMDue6668jIyHC/dvLkSff27Xa7+/WkpCTWr19PeXk5cD5J2L17\nNwDDhg1jw4YN1NXVcfbsWTZv3txk/LW1tbhcLiIjIwEueHvp7bffBuDQoUPs3buXuLg4rrvuOg4d\nOsTOnTvd7erPEtIjuEQEVCkRaRUtmT2yePFi0tLSuO222zAMg+DgYNLS0ujSpQtLlixh/vz5dO7c\nmaFDh9KjR48L9vHMM8/w9NNPs27dOqxWK2PGjOGBBx5g3LhxPPXUU2RnZ7sHus6YMYOHH34Yl8uF\n0+lk1KhRDBo0iDvuuIMvvviC0aNH0717d4YMGcLRo0cvun/BwcFMnz6diRMnEh0dzQ033NCoXceO\nHZk0aRKnTp0iJSWFiIgIAJ5//nkWLVrEwoULcTgcXHXVVe7kTLNvRJrWHn5M9JRgEREREzhZXeex\nvq4ItHqsr/p0+0ZERER8gpISERER8QkaUyIiImIC7WFMiSolIiIi4hNUKRERETGB9rB4miolIiIi\n4hNUKRERETEBjSkRERER8RBVSkREREygHRRKVCkRERER36BKiYiIiBm0g1KJKiUiIiLiE5SUiIiI\niE/Q7RsRERET0OJpIiIiIh6iSomIiIgJaPE0EREREQ9RpURERMQE2kGhRJUSERER8Q2qlIiIiJhB\nOyiVqFIiIiIiPkFJiYiIiAlYPPivOXJzcxk1ahQjR45kxYoVjd53OBzMmDGDESNGcOedd1JaWtrk\nNpWUiIiISIu4XC5SUlJYtWoVmzdvJisri/379zdos3btWsLCwti6dSv33Xcfzz77bJPbVVIiIiJi\nAhaL5z6aUlRURO/evYmOjsbf35/Ro0ezbdu2Bm22bdvGhAkTABg5ciTbt29vcrtKSkRERKRFysvL\n6d69u/vzyMhIKioqGrSpqKggKioKAKvVSmhoKKdOnbrodjX7RkRExAQ6+dBvbMMwWtzGMAwsTZRh\nVCkRERGRFomKimowcLW8vJxu3bo1anPs2DEA6urqsNvthIWFXXS7SkpERESkRWw2G0eOHKGkpASH\nw0FWVhbDhw9v0CYxMZF169YBkJ2dzdChQ5vcrsVoTg1GREREpJ7c3FxSU1MxDIPk5GSmTZvG0qVL\nsdlsJCYm4nA4mDVrFnv27CE8PJz09HR69ux50W0qKRERERGfoNs3IiIi4hOUlIiIiIhPUFIiIiIi\nPkFJiYiIiPgEJSUiIiLiE5SUiIiIiE9QUiIiIiI+4f8BeaqKVhlYZZsAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "current_epochs = 1\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n inputs = ['Domain','Tags'], \n outputs=['ScoreBin','NumCommentersBin'],\n k_of_top_k_accuracy=2)\n\n(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['scorebin_output'], \n label_classes=scorebin_classes)\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "t_wUA8WkqMLt", - "colab_type": "code", + "_cell_guid": "29afd245-d12b-4e06-a44d-2b5551cc8e81", + "_uuid": "1f11f594e14593f16d29f38c47012060bd568d30", "colab": { "autoexec": { "startup": false, "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 5 - }, - { - "item_id": 6 - } - ], - "height": 743 - }, - "outputId": "7ea3d8c3-2eda-488e-d0cf-d8f28a0621ec", - "executionInfo": { - "status": "ok", - "timestamp": 1519061154566, - "user_tz": 480, - "elapsed": 145563, - "user": { - "displayName": "Sergei Sokolenko", - "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", - "userId": "106652311097239389877" } - } + }, + "colab_type": "code", + "collapsed": true, + "id": "t_wUA8WkqMLt", + "trusted": true }, "cell_type": "code", - "source": [ - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n", - " inputs = ['Domain','Tags'], \n", - " outputs=['ScoreBin','NumCommentersBin'],\n", - " use_sample_weights=True,\n", - " k_of_top_k_accuracy=2)\n", - "\n", - "(y_true, y_pred) = get_true_and_predicted_labels(\n", - " model=model,\n", - " x_test=x_test, \n", - " y_test_selected=y_test['scorebin_output'], \n", - " label_classes=scorebin_classes)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n" - ], - "execution_count": 10, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 5291 unique values for domain\n", - "Using 49586 unique values for Tags\n", - "Using 6 unique values for ScoreBin\n", - "Using 6 unique values for NumCommentersBin\n", - "Train on 153198 samples, validate on 17022 samples\n", - "Epoch 1/1\n", - " - 107s - loss: 0.1608 - scorebin_output_loss: 0.0872 - numcommentersbin_output_loss: 0.0736 - scorebin_output_acc: 0.6951 - scorebin_output_top_k_accuracy: 0.8045 - numcommentersbin_output_acc: 0.6871 - numcommentersbin_output_top_k_accuracy: 0.8685 - val_loss: 0.1598 - val_scorebin_output_loss: 0.0860 - val_numcommentersbin_output_loss: 0.0738 - val_scorebin_output_acc: 0.6959 - val_scorebin_output_top_k_accuracy: 0.7906 - val_numcommentersbin_output_acc: 0.7152 - val_numcommentersbin_output_top_k_accuracy: 0.8845\n", - "Test metrics: total loss: 1.612; output_1 loss: 0.888; output_2 loss: 0.723; output_1 top 1 accuracy: 0.701; output_1 top 2 accuracy: 0.796; output_2 top 1 accuracy: 0.714; output_2 top 2 accuracy: 0.885;\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nMZRKJcaOHXvXGL1BgK2N+MbLiIiI7lR4QwvvJpZZmuLbPwosch4AGPGoj8XOVR8N+jTQtWvXYGdn\nBxcXF1RWVuLAgQOYOHFire8prjA0ZEoPVDNnW/yvTLzzcG635UR+Y6dQL+Mf98W/D12oO1Akfjoj\njUXp1v/zUYxa+0djp1Fv70d2aOwU6sXfQ4FzVyoaO416U9jbNHYK9eLdxB6FN7R1B5LVaNDOypUr\nVzBz5kwYjUYYjUYMGDAATz9tvcMhRERE98uaxxwatLPSoUMHbN68uSFPQURERA85MU76JSIiIjJp\n0MoKERERPRhiXKzNUlhZISIiIlFjZYWIiEgCrLm6YM3XTkRERBLAygoREZEEcM4KERERkUixskJE\nRCQB1ltXYWWFiIiIRI6VFSIiIgmw4ikrrKwQERGRuLGyQkREJAFyK561wsoKERERiRorK0RERBLA\nOStEREREIsXOChEREYkah4GIiIgkQMYJtkRERETixM4KERGRBMhklnvVx759+xAZGYmIiAgkJiaa\n7V+zZg2ioqIwZMgQjB07FoWFhdX2l5WVoXfv3nj//ffrPBc7K0RERHRPjEYj4uLikJSUhG3btiE1\nNRU5OTnVYjp37ozvv/8eKSkp6NevHxYvXlxt/7JlyxAaGlqv87GzQkREJAFyyCz2qktmZiZ8fX3R\nokUL2NnZISoqCrt3764WExoaCgcHBwDAo48+iqKiItO+48eP49q1a+jVq1c9r52IiIjoHhQVFcHb\n29v0vaenJy5fvnzX+I0bN6J3794AAEEQsGjRIkyfPh2CINTrfHwaiIiISALEtChcfTsZAJCSkoIT\nJ05g7dq1AID169fjmWeegaenZ72Pxc4KERER3RMvLy8UFBSYvi8qKkLz5s3N4n777TckJiZi3bp1\nsLOzAwAcPXoUR44cwfr161FeXg69Xg+lUolp06bd9XzsrBAREUmAmCorKpUKFy9eRH5+Pjw8PJCa\nmoqEhIRqMSdPnsScOXOQlJSERx55xLR9yZIlpq83b96MEydO1NpRAdhZISIiontkY2OD2bNnY9y4\ncRAEAbGxsQgICMDy5cuhUqkQFhaG+Ph4VFRU4NVXX4UgCPDx8cHKlSvv63zsrBAREUmA2Faw7d27\nt2nS7E1Tp041ff3FF1/UeYyYmBjExMTUGcengYiIiEjUWFkhIiKSALm4CisWxcoKERERiRo7K0RE\nRCRqHAYiIiKSALFNsLUkVlaIiIhI1FhZISIikgAxLQpnaaysEBERkaixskJERCQBnLNCREREJFKs\nrBAREUmANS8KJ7rOitT+X0gtX3qwmrs6NHYK9SalXA1GobFTqDcp5VquMTR2CvUmpVyp4Ymus0JE\nRETmOGeFiIiISKRYWSEiIpIArrNCREREJFKsrBAREUmAFRdWWFkhIiIicWNnhYiIiESNw0BEREQS\nILfiGbasrBAREZGosbJCREQkAdZbV2FlhYiIiESOlRUiIiIpsOLSCisrREREJGqsrBAREUkA/5Ah\nERERkUixskJERCQBVrzMCisrREREJG6srBAREUmAFRdWWFkhIiIicWNnhYiIiESNw0BERERSYMXj\nQKysEBERkaixskJERCQBXBSOiIiISKRYWSEiIpIALgpHREREJFKsrBAREUmAFRdWWFkhIiIicWNl\nhYiISAqsuLTCygoRERGJGisrREREEsB1VoiIiIhEipUVIiIiCeA6K0REREQixc7KbYqvX8e/RsbC\n16spugW1w6bvku8aO2/2LDRr1gwd2nhj3uxZ1fYZjUYseO9dBLX3RRsfN4Q/FYrSkpKGTl+0yktu\n4JMZEzE5rDNmxvTCoV0pNcb9+M3nCAgIwNQ+Krw1qAe+XfY+jEajaX9KYgLmjo7Ey0+2xQ9JyyyV\nvmgp7OQYF9oSi6I6YPY/AtCthWuNcb39HwEALBzQHnP7tcWQwObVRr7bPKLA673b4IMB7fHWM37w\nc1NYIHvxulF8HZPGPodH/Zsj/LHO2Lb52xrjDu3fh/DwcHRv74Pw0MBq+6797wqmvTIGvR5ti5AO\nLTBySF9kHEm3RPqidKP4OiaNeRZd/DwQFtIJP3x/9zb959D+aNq0KcIe61xt39X/XcHrL49Bry4B\n6N7eByMH/wMZR363RPokAuys3OataVPg4OiIrNxCrFq9Bm+9Phlnsk6Zxa35PBFp27fh2LFj2Hvw\nCHalbceXn6827f/g/blI//0Qdu3Zj/MF17Bq9Ro4ODpa8ErE5ev4d2Bn74CEHUcwfu5H+HrxOyjM\nPWsW1+Wpvjh69CiW7z6Geet34s/sk/jp2y9M+5u3aoPYKbOg6hVuyfRFa3iwF/QGI97ZcQbrjhRg\neBcveDrbm8Udv1QGAJi1/QwW/XQOLZo4mjowCjs5xj/eEruzr2Lm9jP46exVjH+8FRxtrffWMHfm\na3BwcMDBExcQ/0kS5sx4DWfPZJnFKZyUePHFFzFjzgKzfeXl5QjuGoKU//yG37PyED18FCY+PwwV\narUlLkF05sx4DfYOjjh08iKWrPwcc2a8epc2dULsqBewZMkSs33qm2364wGkn85H9PBRmGBlbSqz\n4EtsrPeOdAe1Wo3UrZvx9ux5UCgUeLznk4gcMBDfJn9tFvvt+nWYNOU1eHt7w8vLG5OmvIbkr78C\nANwoLsZnq1bgwxWfwqdFSwBAh46dYW9v/kvEGmgqK3D0552IfulN2Ds6om2XEHR5qi8OpH1vFuvh\n0wqurlXVAaPRCJlMjst5F0z7e/YfiqAeT8NRobRY/mJlZyNDsLcLUk9dgc4oIPdaBY5fKkVIqyZm\nsdfUOtPXMpkMgiCgmbLq59HPzQklGj0yC0sBAP/NK0G5Vo9gHxfLXIjIVKjV2LV9K16fOQeOCgW6\nh/ZEeL8BSNm4wSw2uGt3jB49Gi1b+5rta+XbBmMmToa7R3PIZDI8+/xY6HRa5OacscRliEpVm6bg\n9Vm32rRPRBRSvltvFhvcNQRDYp+Dn5+f2b5Wvm0w9qXb2vSf46DTanHOCtvUGrGz8pecs2dga2sL\nP/8A07bAoC7IOnXSLDYr6yQCVcG34lTByMqqijt54jjs7OyQsnkTOrdthR7dgvD56lUNfwEiVXTx\nHOQ2Nmje8tYNvVXbTig4V/MNZsOGDZjaR4Vpkd2QdzYLvaNHWSpVSWmutIdBAK7e1hHJv6GBl4vD\nXd+zcEB7vN+/HXxcHbH/fLFpe02forxrOc7DLPdcNmxtbNG6jb9pW8dAFc6eNq+w3ouTxzOg1+vQ\n2i+g7uCHzM029b2jTbMfUJv6WlObWnFpxSKdFaPRiJiYGLz88suWON19KS8rg4tr9U+lrq6uKCsr\nrTHW9bZYV9cmKC+rKrUXFOThRnExzuVk44+TOfh87QYsXhCHfT//1LAXIFIatRoK5+qf0hXOLqhU\nl9cYP3LkSCzffQzvf/cznh46Cq5uzSyRpuTY28pRqTdU21apM8KhluGbWdvPYP6POdh//jrKNHoA\nwPlrarg62qGrjwvkMuCxVk3QTGkPexvr/ByjLi+Hi2v1uT8urk1QXsN9oL7KSkswY8oETHnjbTg7\nW1/FqsY2dXE13TPvR2lpCaZPnoApb/4/q2xTsdi3bx8iIyMRERGBxMREs/3p6ekYOnQoAgMDsWvX\nrmr7CgsL8eKLL2LAgAEYOHAgCgoKaj2XRe5IX331FQICxN37VTo7o6y0+iTY0tKSGv8hKJ2dUXpb\nbGlpCZTOzgAAhaMCMpkM02fNhr29PToHqhATOwL/2bmjYS9ApBycnFBZXv2mVFFeBken2odymrf0\nhU+bdvh68TsNmZ5kafVGONraVNvmaCeHRm+8yzuqXFXrUFSqwfAuXgAAtc6IpEN/4pm27ngvoh06\neChx+nI5iit1tR7nYeWkVKKstHrHpKy0BMr7/IWoqazEy/8aga6P9cCEydMeRIqSU2OblpWa7pn3\nqqpNh6PrY49jopW1qcyC/9XFaDQiLi4OSUlJ2LZtG1JTU5GTk1MtxsfHBx988AEGDRpk9v7p06dj\n/Pjx2L59O7777ju4u7vXer4G76xcunQJe/fuxfDhwxv6VH9LQNv20Ov1yD13q7FPHMtEx06dzWI7\nduyME8cyTd8fz8xAx45VcZ2DVA2frIR4tvaHwaCvNvck7+xJ+Pi3r/O9Br0eVwouNmR6knW5XAu5\nDHB3sjNt83F1wKVSTZ3vlctlcHe6NYfq3LUKfLjvPN5Jy8bXRwrg6WKPC9crGyRvsfPzbwe9QY+L\n58+ZtmWdOIa2HTrd87G0Wi0mjX0WXi1a4L3Fyx9kmpJys00v3NGm7e6zTV8ZMwLePi0RF7/iQaZJ\n9ygzMxO+vr5o0aIF7OzsEBUVhd27d1eL8fHxQfv27SG7Y4GYnJwcGI1G9OzZEwCgUCjg4FD70HOD\nd1YWLFiA6dOnmyUrNk5OTogaHIMP5s+FWq3GoQP7kbZjG0Y8N9osdsSo57Hq42UoKChAYWEBVn28\nDCOffwEA0MbPHz2e6IWE+IXQarU4k3UKWzZ9h4gBAy19SaLg4KhAt2cikZKYAE1lBc5mpCPjlx/R\nM3KoWewvW7/BlStXAAAFudnYsXYVOj3Wy7TfoNdDp6mE0Wis+lqrqfZoszXRGQRkFpaif0cP2NnI\n4OemQJCXC9L/vGEW+3jrW0OWni72+Ec7d5y5cmsYroWrA+QywMFWjuggT1yv0Ffbb00UTk7oN2Aw\nli2OQ4Vajf8ePoCfdm3HkNiRZrGCIECj0UCn1UIwGqHVaKDTVVWk9Ho9prw4Co4KJyxevtrsvdak\nqk2HYNmiW226e2cqhgw3n492s021Wi0EwVjVvre16eRxI6vadIV1tqlMZrlXXYqKiuDt7W363tPT\nE5cvX67XdeTm5sLFxQVTpkzB0KFDER8fD0EQan+T0ID27NkjzJs3TxAEQTh48KDw0ksv1fkend7Y\nkCnV6tq1a0J0dLSgVCoFX19fITk5WRAEQfjll18EFxeXarEzZswQ3NzcBHd3d2HmzJnV9hUUFAiR\nkZGCs7OzEBAQIKxevdpi1yBG9W3XsWPHCp6enoKzs7Pg5+cnzJgxQ9BoNKb9Y8aMEWQymSCXy02v\nL7/80uLXQw+3+v68/vzzz2Y/j2FhYYIgCMLevXsFuVwuKJVKwdnZWXB2dhZcXFyEX3/9tVGuqbE9\nzG2aXaS22Lky/yy12KsuO3bsEN555x3T91u2bBHi4uJqjJ05c6awc+dO0/dpaWlCSEiIkJeXJxgM\nBmHKlCnCxo0baz2fTBDq6s7cv4SEBGzduhU2NjbQaDQoLy9H3759sXjx4ru+52qZvqHSeeDcnW0l\nk+/mE/mNnUK9jH/cF/8+dKHuQJE4fkkaazx8NKQTXkv5e09fWNL/9TB/HFiM2nk6IbtIGj8DAERf\n4b6pbXMFzl6uaOw06q1tc8sspHg87/4nJd+roJa1zyn6448/sGLFCiQlJQGAaYLtxIkTzWJnzZqF\nsLAw9OvXDwCQkZGBpUuX4quvqpb8SElJQWZmJmbPnn3X8zXoMNC0adPw888/Y/fu3UhISMDjjz9e\na0eFiIiIxE+lUuHixYvIz8+HVqtFamoq+vTpc9f42+siKpUKJSUluH79OgDg4MGDdT6Ewz9kSERE\nJAUiKozZ2Nhg9uzZGDduHARBQGxsLAICArB8+XKoVCqEhYXh2LFjmDx5MkpKSrBnzx58/PHH+OGH\nHyCXyzFjxgy88ELVXM/AwECMGDGi1vNZrLMSGhqK0NBQS52OiIiIGlDv3r3Ru3fvatumTp1q+lql\nUmHv3r01vrdnz57YunVrvc/FygoREZEE1Gf9k4eVdS5TSURERJLBzgoRERGJGoeBiIiIJEAiT543\nCFZWiIiISNRYWSEiIpIAKy6ssLJCRERE4sbKChERkRRYcWmFlRUiIiISNVZWiIiIJICLwhERERGJ\nFCsrREREEsB1VoiIiIhEipUVIiIiCbDiwgorK0RERCRurKwQERFJgRWXVlhZISIiIlFjZ4WIiIhE\njcNAREREEsBF4YiIiIhEipUVIiIiCeCicEREREQixcoKERGRBFhxYYWVFSIiIhI3VlaIiIikwIpL\nK6ysEBERkaixskJERCQBXGeFiIiISKRYWSEiIpIArrNCREREJFLsrBAREZGocRiIiIhIAqx4FIiV\nFSIiIhI3VlaIiIikwIpLK6ysEBERkaixskJERCQBXBSOiIiISKRYWSEiIpIAa14UTiYIgtDYSRAR\nEVHtLl7TWOxcrd0cLHau+mBlhYiISAKsuLDCOStEREQkbqysEBERSYA1z1lhZYWIiIhEjZUVIiIi\nSbDe0gorK0RERCRq7KwQERGRqHEYiIiIREMQBMiseSZpLay5WVhZuQfnzp3D0aNHodPpYDAYGjud\nhwrb88G7cOECjh07Bq1W29ipPFSys7Nx+PBhXL9+vbFTeWikp6djy5YtAACZTAauVUp3YmWlnnbt\n2oWEhAR4enrC09MTQUFBGDp0KJydnRs7NUnLzc2Fn58fbGxsYDAYYGNj09gpPRT27NmDhIQENG3a\nFB4eHpgyZQr8/PwaOy3J27t3L5YsWYJWrVpBr9dj/vz58PDwaOy0JMtoNKKiogJz5syBIAioqKjA\nyJEjIZPJYDQaIZfz8/TtrLiwwspKfeh0Omzfvh3z58/Hl19+iT59+qCwsBCrV69GWVlZY6cnWXv2\n7EF0dDTeeOMNADB1WOjvOXLkCBYtWoRFixZh7dq1cHV1RWJiYmOnJXmHDh3CggULMH/+fKxcuRJ2\ndnbIzs5u7LQkTS6XQ6lUIjo6GrGxsTh69CjWrFlj2kfitm/fPkRGRiIiIqLGe4xWq8Xrr7+Ofv36\n4dlnn0VBQQEAQK/XY+bMmRg0aBCioqLqdX/iT0M9lZWV4cKFCwCAvn37IiwsDDqdDj/88ANLlvdB\nrVZj3bp1ePvtt2FnZ4c333wTADssD8rEiRPRuXNnAMDUqVNx48YNDgf9Tc2aNcO8efMQHByMK1eu\nICMjA+vWrcO7776LtLQ03gf+BltbWxQWFiImJgaZmZlYuHAhli5dCkEQYDQaGzs90ZDJLPeqi9Fo\nRFxcHJKSkrBt2zakpqYiJyenWszGjRvRpEkT7Nq1Cy+88ALi4+MBAGlpaabfn5s2bUJycrKpI3M3\n7KzUg52dHcaOHYtdu3YhPT0dcrkc3bt3R6dOnfDf//63sdOTJCcnJyxYsAADBw7E9OnTodVqq3VY\n6P516dIF/fr1A1A1F0ir1aKgoMBUBeRci/sTEBCAHj16AKi6CY8aNQorV65Ely5dkJaWxnb9G/r0\n6QMPDw/07NkTQUFBSE5ORllZGWQyGSssIpWZmQlfX1+0aNECdnZ2iIqKwu7du6vF7N69GzExmoYZ\nNQAACYpJREFUMQCAiIgIHDx4EEDVvCS1Wg2DwYCKigrY29vXOaWCPwX1FBISgl69eiElJQW///47\nbGxsMGjQIFy+fBlZWVmNnZ4keXp6QqlUws3NDfPmzYNGozF1WE6cOGHWS6f6sbGxMf3DFwQBLi4u\naNKkCdzc3LB161Z89NFHqKysbOQspe2VV17BpEmTAADDhg1DeXk5CgsLGzkr6XJwcEBubi6+/fZb\nJCcnY8KECSgsLERycnJjpyYqMgv+V5eioiJ4e3ubvvf09MTly5erxVy+fBleXl4Aqu5LLi4uKC4u\nRkREBBQKBXr16oXw8HC8+OKLcHV1rfV8nGBbTw4ODhg0aBBkMhk+++wznDt3Dvb29rh69Son2D0A\njzzyCObNm4f4+HhERkbCaDTiq6++auy0JM/W1ha2trbw9vbG0qVLsX//fixcuBCOjo6NnZpk3flo\n7c6dO3H16lU0b968EbOSNk9PT3h5eWHlypV49913ER4ejoMHD8LX17exU6O7qM+w550xN//tZGZm\nwsbGBvv370dxcTFGjRqFnj17omXLlnc9Fjsr96BJkyYYPnw4AgIC8M0338DBwQHx8fFo1qxZY6f2\nUHBzc0OHDh2wb98+fP7556YeOd0/QRCg0+mQnp4OvV6PNWvWoE2bNo2dlqTd7KhotVqkpKRgzZo1\n+PDDD/mh5W8aMWIE+vTpg6CgIABAaGgoh4DuJKLHgby8vKrNMykqKjLrsHt5eeHSpUvw9PSEwWBA\nWVkZmjRpgm3btuGpp56CXC6Hm5sbunXrhuPHj7Oz8iDZ29ujR48eeOyxxzie+oDduHEDe/fuRVJS\nEjp06NDY6TwUZDIZ7O3tMWnSJKhUKnZUHiCZTIbmzZtjxYoV8Pf3b+x0JM/b2xve3t6mT9+8t4qb\nSqXCxYsXkZ+fDw8PD6SmpiIhIaFaTFhYGDZv3mya13Vzzpe3tzcOHjyIwYMHQ61WIyMjA2PGjKn1\nfDKBU9hJRDQaDRwcHBo7jYcOVwUlkr6iEp3FzuXpaldnzL59+zB//nwIgoDY2FhMnDgRy5cvh0ql\nQlhYGLRaLd566y2cOnUKTZs2RUJCAlq2bAm1Wo1Zs2aZ5iUOGzYMY8eOrfVc7KwQERFJgNg6K5bE\nYSAiIiIJsObiKAcFiYiISNTYWSEiIiJR4zAQERGRBNRnsbaHFSsrRA9AeHg4BgwYgCFDhmDQoEHY\nvn37Azvu2bNnAQAvvfQS/vzzz1rjf/zxRxw7duy+zrV582ZMnTq1zjxq07FjR1RUVNzTefPz802P\nNBIR1YSVFaIHZMWKFQgICMCpU6fw3HPP4YknnkDTpk2rxdzrn72//XHjzz77rM743bt3IygoCCqV\nqv6J3+V8lnw/H6smqgcr/mfCzgrRA3JzFYBOnTpBqVQiLy8Pe/bsQWpqKtzc3JCTk4P58+fD3d0d\ncXFxuHTpEiorKzFw4EBMnDgRAJCeno558+ZBoVAgODi42nLV4eHhSExMRNu2bVFUVIT58+fj/Pnz\nkMlkiIqKQufOnfHTTz/hwIED2LhxI8aMGYMhQ4Zgy5YtWL9+PQwGA1xcXDBnzhz4+flBp9MhLi4O\nhw8fhpeXF/z8/Op1nV988QW2b98Og8EAe3t7zJ07Fx07djS1QVJSEn799VfcuHHD9Ofhgao/fLZk\nyRKUl5cDqPpr0E8//fQDa38ienixs0L0gB08eBBarRZt2rRBdnY2jhw5gq1bt5qWkh43bhwmTZqE\nkJAQ6HQ6jBkzBiqVCt27d8e0adOQkJCAkJAQ7NixA19//XWN53jrrbcQFhaG5cuXAwCKi4vRtGlT\nhIeHIygoCKNHjwZQ1fm5eRw7Ozvs27cPb7/9NjZs2IDk5GTk5+dj+/bt0Gq1GD16dK3LXd8UHR1t\nWsDpwIEDmDNnDr755hvTfhsbGyQnJyM3NxfPPfccQkJCYGdnhzlz5mD16tVo1qwZrly5gtjYWKSm\npv6ttiayJlZcWGFnhehBmTp1KhwcHODs7IwVK1aY/vJx9+7dTZ2AiooKHD58GNevXzdVTdRqNXJy\ncuDm5gaFQoGQkBAAQP/+/fHuu++anUetVuPo0aP48ssvTdvuHG66ac+ePTh9+jRGjBgBQRAgCAJK\nS0sBAIcPH0ZMTAzkcjkcHR0xePBgHDlypM7rPHbsGBITE3Hjxg3IZDJcuHCh2v7Y2FgAgJ+fH4KC\ngpCRkQG5XI68vDxMmDDBdN02Nja4cOHCXXMnIrqJnRWiB+TmnJU7OTk5mb42Go2QyWTYtGmT2dyV\nrKysep9LJpPVawl9QRAwbNgwTJkypcZ990qn0+HVV1/Fhg0b0LFjR1y+fNlsKOf24968XqBq8u3a\ntWvNjpmfn3/PeRBZI2ue2sWngYgekPr88lcqlQgJCcGnn35q2nbp0iVcvXoV/v7+0Gg0SE9PBwCk\npaWZqiC3c3JyQteuXbFmzRrTtuvXr5uOX1ZWZtoeHh6OLVu2oKioCEBV5+HEiRMAgJ49eyIlJQUG\ngwGVlZXYtm1bnflrNBoYjUZ4enoCQI3DVN9//z0A4Pz588jKykJwcDC6du2K8+fP49ChQ6a4259a\n4l/9IKLasLJC9ADcy9MsS5YswYIFCzB48GAIggBnZ2csWLAA7u7uWLp0KebOnQuFQoEePXrAx8en\nxnMsXrwY7733HjZv3gwbGxsMHDgQ48ePx5AhQzBr1iykpaWZJti+/vrreOWVV2A0GqHT6RAZGYnA\nwECMGDECp0+fRlRUFLy9vREaGoq8vLxar8/Z2RlTp07FsGHD0KJFCzz11FNmcfb29hg5ciSKi4sR\nFxcHNzc3AMCqVauwaNEiLFy4EFqtFq1btzZ12vg0EFHdrHmdFf4hQyIiIgm4Vm6w2LnclDYWO1d9\nsLJCREQkAdZcgOScFSIiIhI1dlaIiIhI1NhZISIiIlFjZ4WIiIhEjRNsiYiIJIATbImIiIhEipUV\nIiIiCbDmReFYWSEiIiJRY2WFiIhIAjhnhYiIiEikWFkhIiKSACsurLCyQkREROLGygoREZEUWHFp\nhZUVIiIiEjVWVoiIiCSA66wQERERiRQ7K0RERCRqHAYiIiKSAC4KR0RERCRSrKwQERFJgBUXVlhZ\nISIiInFjZYWIiEgKrLi0wsoKERERiRorK0RERBLAReGIiIiIRIqVFSIiIgngOitEREREIiUTBEFo\n7CSIiIiI7oaVFSIiIhI1dlaIiIhI1NhZISIiIlFjZ4WIiIhEjZ0VIiIiEjV2VoiIiEjU/j8nLzqa\nlMXMWAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n inputs = ['Domain','Tags'], \n outputs=['ScoreBin','NumCommentersBin'],\n use_sample_weights=True,\n k_of_top_k_accuracy=2)\n\n(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['scorebin_output'], \n label_classes=scorebin_classes)\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "53v1oL9OOVGH", - "colab_type": "code", + "_cell_guid": "c4cca57d-e2d2-4e08-a7b9-7d6a3fe4ca22", + "_uuid": "00f0db89645538dc74382932946430be8a6e0a01", "colab": { "autoexec": { "startup": false, "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 6 - }, - { - "item_id": 7 - } - ], - "height": 743 - }, - "outputId": "aebd2816-a8d6-4144-be94-db7e69bc0155", - "executionInfo": { - "status": "ok", - "timestamp": 1519062434713, - "user_tz": 480, - "elapsed": 147157, - "user": { - "displayName": "Sergei Sokolenko", - "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", - "userId": "106652311097239389877" } - } + }, + "colab_type": "code", + "collapsed": true, + "id": "53v1oL9OOVGH", + "trusted": true }, "cell_type": "code", - "source": [ - "current_epochs = 1\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n", - " inputs = ['Subreddit','RedditSubmitter'], \n", - " outputs=['ScoreBin','NumCommentersBin'],\n", - " use_sample_weights=True,\n", - " k_of_top_k_accuracy=2)\n", - "\n", - "#SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n", - "\n", - "(y_true, y_pred) = get_true_and_predicted_labels(\n", - " model=model,\n", - " x_test=x_test, \n", - " y_test_selected=y_test['scorebin_output'], \n", - " label_classes=scorebin_classes)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n", - "\n" - ], - "execution_count": 8, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Using 5872 unique values for subreddit\n", - "Using 2000 unique values for submitter\n", - "Using 6 unique values for ScoreBin\n", - "Using 6 unique values for NumCommentersBin\n", - "Train on 153198 samples, validate on 17022 samples\n", - "Epoch 1/1\n", - " - 110s - loss: 0.1222 - scorebin_output_loss: 0.0653 - numcommentersbin_output_loss: 0.0569 - scorebin_output_acc: 0.7614 - scorebin_output_top_k_accuracy: 0.8552 - numcommentersbin_output_acc: 0.7914 - numcommentersbin_output_top_k_accuracy: 0.9314 - val_loss: 0.1166 - val_scorebin_output_loss: 0.0619 - val_numcommentersbin_output_loss: 0.0547 - val_scorebin_output_acc: 0.7588 - val_scorebin_output_top_k_accuracy: 0.8607 - val_numcommentersbin_output_acc: 0.8035 - val_numcommentersbin_output_top_k_accuracy: 0.9383\n", - "Test metrics: total loss: 1.019; output_1 loss: 0.563; output_2 loss: 0.456; output_1 top 1 accuracy: 0.760; output_1 top 2 accuracy: 0.861; output_2 top 1 accuracy: 0.805; output_2 top 2 accuracy: 0.938;\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nSUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "current_epochs = 1\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n inputs = ['Subreddit','RedditSubmitter'], \n outputs=['ScoreBin','NumCommentersBin'],\n use_sample_weights=True,\n k_of_top_k_accuracy=2)\n\n#SVG(model_to_dot(model, show_shapes=False).create(prog='dot', format='svg'))\n\n(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['scorebin_output'], \n label_classes=scorebin_classes)\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)\n\n", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "WC6m8DOSK6gc", - "colab_type": "code", + "_cell_guid": "f8894359-2440-4de1-a526-ae5bd69084da", + "_uuid": "a042875ebf2058c80f3988651a45fc8108e4185e", "colab": { "autoexec": { "startup": false, "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ], - "height": 581 - }, - "outputId": "9a26f1bc-02f3-4fa9-f2de-f06a30a8c354", - "executionInfo": { - "status": "ok", - "timestamp": 1519062742263, - "user_tz": 480, - "elapsed": 10944, - "user": { - "displayName": "Sergei Sokolenko", - "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", - "userId": "106652311097239389877" } - } + }, + "colab_type": "code", + "collapsed": true, + "id": "WC6m8DOSK6gc", + "trusted": true }, "cell_type": "code", - "source": [ - "# How well is CM distributed for NumCommenters, when ScoreBin is used for weights\n", - "(y_true, y_pred) = get_true_and_predicted_labels(\n", - " model=model,\n", - " x_test=x_test, \n", - " y_test_selected=y_test['numcommentersbin_output'], \n", - " label_classes=scorebin_classes,\n", - " multi_output=True,\n", - " output_idx=1)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)" - ], - "execution_count": 9, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAI0CAYAAADC51nVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdYU2f7B/BvEkACYajIcqDgYBhwLxRF/b0ouEXqbl+s\now4ctMXZ2tpq2/ctVever9sOLSh2ObHWrQwF9xZFrSAjbPL7wzYaAwKtCeeQ7+e6cl3knJsn9/MQ\nDg/3ec6JRK1Wq0FERERUyaSVnQARERERwEkJERERCQQnJURERCQInJQQERGRIHBSQkRERIJgUtkJ\nEBERUdnkzSca7LVyzi0x2Gu9iJUSIiIiEgROSoiIiEgQePqGiIhIDCRVv45Q9XtIREREosBKCRER\nkRhIJJWdgd6xUkJERESCwEoJERGRGHBNCREREZFhsFJCREQkBlxTQkRERGQYrJQQERGJAdeUEBER\nERkGJyVEREQkCDx9Q0REJAZc6EpERERkGKyUEBERiQEXuhIREREZBislREREYsA1JURERESGwUoJ\nERGRGHBNCREREZFhsFJCREQkBlxTQkRERGQYrJQQERGJAdeUEBERERkGKyVERERiwDUlRERERIbB\nSgkREZEYcE0JERERkWFwUkJERESCwNM3REREYsDTN0RERESGwUoJERGRGEh5STARERGRQbBSQkRE\nJAZcU0JERERkGKyUEBERiQFvM09ERERkGKyUEBERiQHXlBAREREZBislREREYsA1JURERESGwUoJ\nERGRGHBNCRHpS15eHsaNG4dWrVphypQpf7ud3bt3Y9SoUa8xs8pz+vRp9OzZs7LTIKJKIlGr1erK\nToJIyHbv3o0NGzbg+vXrUCgU8PDwwNixY9GyZct/1G5UVBS2bNmCHTt2QGIE54rd3d3x66+/om7d\nupWdCpEoyQP+a7DXyvn5XYO91ot4+oboFdavX481a9bgo48+QseOHWFqaoojR47gwIED/3hSkpKS\ngvr16xvFhARAmf0sKiqCTCYzUDZEJEQ8fUNUiqysLCxevBgffvghunfvDnNzc8hkMnTp0gXvvfce\nACA/Px+ffvopOnXqBD8/P8yfPx8FBQUAgJMnT6Jz585Yv349OnTogE6dOmHXrl0AgK+//hpLly7F\n3r170aJFC3z//fdYsmSJpl0AuHfvHtzd3VFcXAwA2LlzJ7p3744WLVqge/fu2LNnDwBg165dGDp0\n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\n79JvPPm6PVr/hsFe60V6/c1XKpW4ffs27t27h/z8fMTExKBbt276fEkiIqIqyRjWlOh1fieTyTBn\nzhyEhoZCrVYjODgYbi9cp05ERET0F70Xnfz8/ODn56fvlyEiIqraqv6SEt7RlYiIiITBeJeCExER\niYgxXH3DSgkREREJAislREREIsBKCREREZGBcFJCREREgsDTN0RERCIgtNM3sbGxmD9/PtRqNQYO\nHKhzt/YFCxbgxIkTkEgkUKlUSEtLw8mTup8n9yJOSoiIiKhCiouLMW/ePGzYsAH29vYIDg5Gt27d\ntG6QOmPGDM3XmzdvRnJycpnt8vQNERGRCAjpNvMJCQlwcXFB7dq1YWpqiqCgIOzfv7/U+D179qBX\nr15ltstJCREREVVIamoqnJycNM8dHBzw8OHDEmNTUlJw7949tGvXrsx2efqGiIhIDAS0pEStVpc7\nNiYmBgEBAeWqwLBSQkRERBXi6OiIlJQUzfPU1FTY29uXGLt3795ynboBOCkhIiISBSGtKVEqlbh9\n+zbu3buH/Px8xMTEoFu3bjpx169fR0ZGBpo1a1auPvL0DREREVWITCbDnDlzEBoaCrVajeDgYLi5\nuWHx4sVQKpXw9/cH8KxKEhQUVO52OSkhIiISAaHdp8TPzw9+fn5a28LCwrSeT5w4sUJt8vQNERER\nCQIrJURERCIgtEqJPrBSQkRERILASgkREZEYVP1CCSslREREJAyslBAREYkA15QQERERGQgnJURE\nRCQIPH1DREQkAjx9Q0RERGQgrJQQERGJACslRERERAbCSgkREZEIsFJCREREZCCslBAREYlB1S+U\nsFJCREREwsBKCRERkQhwTQkRERGRgbBSQkREJAKslBAREREZCCslREREImAEhRJWSoiIiEgYBFcp\nObprfmWnUCFiyTfwqyOVnUK5JM7rLppcAWDj220qO4Vyae5ijSsPsio7jXJzd7aq7BTKSQK1Wl3Z\nSZSbMaxJIHET3KSEiIiIdBnDpJKnb4iIiEgQWCkhIiISASMolLBSQkRERMLASgkREZEIcE0JERER\nkYGwUkJERCQCRlAoYaWEiIiIhIGVEiIiIhGQSqt+qYSVEiIiIhIEVkqIiIhEgGtKiIiIiAyElRIi\nIiIR4H1KiIiIiAyElRIiIiIRMIJCCSslREREJAyclBAREZEg8PQNERGRCHChKxEREZGBsFJCREQk\n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\njeRXFblENcEAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "# How well is CM distributed for NumCommenters, when ScoreBin is used for weights\n(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['numcommentersbin_output'], \n label_classes=scorebin_classes,\n multi_output=True,\n output_idx=1)\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=scorebin_classes)", + "execution_count": null, + "outputs": [] }, { "metadata": { - "id": "YbwnIS3bmf1p", - "colab_type": "code", + "_cell_guid": "f860b8bd-0fe4-42fb-bad9-37414f8cace2", + "_uuid": "f0abd6d4d989a6ea916779cc79a1e8525bc454a1", "colab": { "autoexec": { "startup": false, "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 6 - }, - { - "item_id": 7 - } - ], - "height": 779 - }, - "outputId": "ad452614-eacd-4536-c327-2ab6f96b650a", - "executionInfo": { - "status": "ok", - "timestamp": 1519085797625, - "user_tz": 480, - "elapsed": 190774, - "user": { - "displayName": "Sergei Sokolenko", - "photoUrl": "//lh6.googleusercontent.com/-iyAOAY88u7I/AAAAAAAAAAI/AAAAAAAAABA/9ECequ778Ss/s50-c-k-no/photo.jpg", - "userId": "106652311097239389877" } - } + }, + "colab_type": "code", + "collapsed": true, + "id": "YbwnIS3bmf1p", + "trusted": true }, "cell_type": "code", - "source": [ - "# Change label to NumCommentersBin and check CM composition now\n", - "\n", - "current_epochs = 1\n", - "current_label_col = 'NumCommentersBin'\n", - "current_inverse_frequency_pow = 0.85\n", - "\n", - "(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n", - "\n", - "(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n", - " inputs = ['Subreddit','RedditSubmitter'], \n", - " outputs=['ScoreBin','NumCommentersBin'],\n", - " use_sample_weights=True,\n", - " k_of_top_k_accuracy=2)\n", - "\n", - "(y_true, y_pred) = get_true_and_predicted_labels(\n", - " model=model,\n", - " x_test=x_test, \n", - " y_test_selected=y_test['numcommentersbin_output'], \n", - " label_classes=numcommentersbin_classes,\n", - " multi_output=True,\n", - " output_idx=1)\n", - "\n", - "plot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=numcommentersbin_classes)\n" - ], - "execution_count": 8, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Size of train set: 170220 records\n", - "Size of test set: 42554 records\n", - "Using 5872 unique values for subreddit\n", - "Using 2039 unique values for submitter\n", - "Using 6 unique values for ScoreBin\n", - "Using 6 unique values for NumCommentersBin\n", - "Train on 153198 samples, validate on 17022 samples\n", - "Epoch 1/1\n", - " - 107s - loss: 0.0092 - scorebin_output_loss: 0.0044 - numcommentersbin_output_loss: 0.0048 - scorebin_output_acc: 0.7941 - scorebin_output_top_k_accuracy: 0.8910 - numcommentersbin_output_acc: 0.7517 - numcommentersbin_output_top_k_accuracy: 0.8856 - val_loss: 0.0087 - val_scorebin_output_loss: 0.0043 - val_numcommentersbin_output_loss: 0.0045 - val_scorebin_output_acc: 0.7712 - val_scorebin_output_top_k_accuracy: 0.8777 - val_numcommentersbin_output_acc: 0.7343 - val_numcommentersbin_output_top_k_accuracy: 0.8688\n", - "Test metrics: total loss: 1.197; output_1 loss: 0.555; output_2 loss: 0.642; output_1 top 1 accuracy: 0.774; output_1 top 2 accuracy: 0.881; output_2 top 1 accuracy: 0.737; output_2 top 2 accuracy: 0.869;\n" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\nMoBWCTslREREJAgsSoiIiEgQePqGiIhIBAzg7A07JURERFRyR44cQbt27dC2bVssWbJEY/3WrVvR\ntGlTdO3aFV27dsVvv/2mdUx2SoiIiERASDdPKygoQEREBFatWgUbGxsEBwcjICAArq6uanFBQUGY\nMmVKscdlp4SIiIhKJDo6Gs7OznB0dISJiQmCgoJw8OBBjTilUlmicVmUEBERiYCRRHcPbZKTk2Fv\nb696bmtri4cPH2rE/f777+jcuTM++eQTPHjwQPs2lmiPEBERkcErTgekdevWOHToELZv346mTZti\n/PjxWn+GRQkREZEISCQSnT20sbOzQ1JSkup5cnIybGxs1GKsrKxgYmICAOjZsyeuXLmidVwWJURE\nRFQicrkcCQkJSExMRE5ODiIjIxEQEKAW8+jRI9W/Dx48CDc3N63j8uobIiIiERDQxTeQSqWYOnUq\nQkNDoVQqERwcDFdXV8ydOxdyuRz+/v5Ys2YNDh06BGNjY1hZWeGbb77ROi6LEiIiIioxX19f+Pr6\nqi0LDw9X/XvMmDEYM2ZMicZkUUJERCQCEgioVVJKOKeEiIiIBIGdEiIiIhEozv1DxI6dEiIiIhIE\ndkqIiIhEQEjffVNa2CkhIiIiQWBRQkRERILA0zdEREQiYABnb9gpISIiImFgp4SIiEgEjAygVSK4\noqRyWVN9p1AiYsl3wvs19Z1CsYkp1zXRSdqDBKCRi5VocgWAYU2c9J1CsVSyNMajtGx9p1FsqYpc\nfadQbGLKld4ewRUlREREpMkAGiWcU0JERETCwE4JERGRCPDmaUREREQ6wk4JERGRCBhAo4SdEiIi\nIhIGdkqIiIhEwBDuU8JOCREREQkCOyVEREQi8O73SdgpISIiIoFgUUJERESCwNM3REREIsCbpxER\nERHpCDslREREImD07jdK2CkhIiIiYWCnhIiISAQ4p4SIiIhIR4rslGzcuPGVP9irV6+3ngwREREV\nzgAaJUUXJefOnSvyhyQSCYsSIiIiequKLEq+//57XeZBREREr8A5JQCys7Mxf/58jB8/HgAQFxeH\ngwcPlnpiREREZFi0FiXTp09HRkYGLl++DACwsbHB/PnzSz0xIiIiesFIoruH3rZRW0BsbCzGjx8P\nExMTAIClpSXy8/NLPTEiIiIyLFrvU1KmTBm15zk5OVAqlaWWEBEREWkyhDklWouSBg0aYOnSpcjJ\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "source": "# Change label to NumCommentersBin and check CM composition now\n\ncurrent_epochs = 1\ncurrent_label_col = 'NumCommentersBin'\ncurrent_inverse_frequency_pow = 0.85\n\n(training_features, training_labels,validation_features, validation_labels) = create_train_test_features_labels()\n\n(model, history, x_train, x_test, y_train, y_test) = compile_and_fit_model(\n inputs = ['Subreddit','RedditSubmitter'], \n outputs=['ScoreBin','NumCommentersBin'],\n use_sample_weights=True,\n k_of_top_k_accuracy=2)\n\n(y_true, y_pred) = get_true_and_predicted_labels(\n model=model,\n x_test=x_test, \n y_test_selected=y_test['numcommentersbin_output'], \n label_classes=numcommentersbin_classes,\n multi_output=True,\n output_idx=1)\n\nplot_confusion_matrix(y_true=y_true, y_pred=y_pred, normalize=True, class_order=numcommentersbin_classes)\n", + "execution_count": null, + "outputs": [] } - ] + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "default_view": {}, + "last_runtime": { + "build_target": "", + "kind": "local" + }, + "name": "RedditEngagement.ipynb", + "provenance": [], + "version": "0.3.2", + "views": {} + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.6.4", + "mimetype": "text/x-python", + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "pygments_lexer": "ipython3", + "nbconvert_exporter": "python", + "file_extension": ".py" + } + }, + "nbformat": 4, + "nbformat_minor": 1 } \ No newline at end of file