{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CORA - Categorizing academic publications\n", "\n", "In this notebook, we compare getML against extant approaches in the relational learning literature on the CORA data set, which is often used for benchmarking. We demonstrate that getML outperforms the state of the art in the relational learning literature on this data set. Beyond the benchmarking aspects, this notebooks showcases getML's excellent capabilities in dealing with categorical data.\n", "\n", "Summary:\n", "\n", "- Prediction type: __Classification model__\n", "- Domain: __Academia__\n", "- Prediction target: __The category of a paper__ \n", "- Population size: __2708__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Background\n", "\n", "CORA is a well-known benchmarking dataset in the academic literature on relational learning. The dataset contains 2708 scientific publications on machine learning. The papers are divided into 7 categories. The challenge is to predict the category of a paper based on the papers it cites, the papers it is cited by and keywords contained in the paper.\n", "\n", "It has been downloaded from the [CTU Prague relational learning repository](https://relational.fit.cvut.cz/dataset/CORA) (Motl and Schulte, 2015)(Now residing at [relational-data.org](https://relational-data.org/dataset/CORA).)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's get started with the analysis and set up your session:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%pip install -q \"getml==1.5.0\" \"matplotlib==3.9.2\" \"ipywidgets==8.1.5\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "getML API version: 1.5.0\n", "\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "import getml\n", "\n", "%matplotlib inline \n", "\n", "print(f\"getML API version: {getml.__version__}\\n\")" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Launching ./getML --allow-push-notifications=true --allow-remote-ips=true --home-directory=/home/user --in-memory=true --install=false --launch-browser=true --log=false --token=token in /home/user/.getML/getml-1.5.0-x64-linux...\n", "Launched the getML Engine. The log output will be stored in /home/user/.getML/logs/20240912134108.log.\n", "\u001b[2K Loading pipelines... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
Connected to project 'cora'.\n",
       "
\n" ], "text/plain": [ "Connected to project \u001b[32m'cora'\u001b[0m.\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "getml.engine.launch(allow_remote_ips=True, token='token')\n", "getml.engine.set_project('cora')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Loading data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.1 Download from source\n", "\n", "We begin by downloading the data from the source file:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Connection(dbname='CORA', dialect='mysql', host='relational.fel.cvut.cz', port=3306)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conn = getml.database.connect_mysql(\n", " host=\"relational.fel.cvut.cz\",\n", " dbname=\"CORA\",\n", " port=3306,\n", " user=\"guest\",\n", " password=\"ctu-relational\"\n", ")\n", "\n", "conn" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def load_if_needed(name):\n", " \"\"\"\n", " Loads the data from the relational learning\n", " repository, if the data frame has not already\n", " been loaded.\n", " \"\"\"\n", " if not getml.data.exists(name):\n", " data_frame = getml.data.DataFrame.from_db(\n", " name=name,\n", " table_name=name,\n", " conn=conn\n", " )\n", " data_frame.save()\n", " else:\n", " data_frame = getml.data.load_data_frame(name)\n", " return data_frame" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "paper = load_if_needed(\"paper\")\n", "cites = load_if_needed(\"cites\")\n", "content = load_if_needed(\"content\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
name paper_idclass_label
roleunused_floatunused_string
0\n", " 35 \n", " Genetic_Algorithms
1\n", " 40 \n", " Genetic_Algorithms
2\n", " 114 \n", " Reinforcement_Learning
3\n", " 117 \n", " Reinforcement_Learning
4\n", " 128 \n", " Reinforcement_Learning
\n", " ... \n", " ...
2703\n", " 1154500 \n", " Case_Based
2704\n", " 1154520 \n", " Neural_Networks
2705\n", " 1154524 \n", " Rule_Learning
2706\n", " 1154525 \n", " Rule_Learning
2707\n", " 1155073 \n", " Rule_Learning
\n", "\n", "

\n", " 2708 rows x 2 columns
\n", " memory usage: 0.09 MB
\n", " name: paper
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ "name paper_id class_label \n", "role unused_float unused_string \n", " 0 35 Genetic_Algorithms \n", " 1 40 Genetic_Algorithms \n", " 2 114 Reinforcement_Learning\n", " 3 117 Reinforcement_Learning\n", " 4 128 Reinforcement_Learning\n", " ... ... \n", "2703 1154500 Case_Based \n", "2704 1154520 Neural_Networks \n", "2705 1154524 Rule_Learning \n", "2706 1154525 Rule_Learning \n", "2707 1155073 Rule_Learning \n", "\n", "\n", "2708 rows x 2 columns\n", "memory usage: 0.09 MB\n", "type: getml.DataFrame" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paper" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namecited_paper_idciting_paper_id
role unused_float unused_float
0\n", " 35 \n", " \n", " 887 \n", "
1\n", " 35 \n", " \n", " 1033 \n", "
2\n", " 35 \n", " \n", " 1688 \n", "
3\n", " 35 \n", " \n", " 1956 \n", "
4\n", " 35 \n", " \n", " 8865 \n", "
\n", " ... \n", " \n", " ... \n", "
5424\n", " 853116 \n", " \n", " 19621 \n", "
5425\n", " 853116 \n", " \n", " 853155 \n", "
5426\n", " 853118 \n", " \n", " 1140289 \n", "
5427\n", " 853155 \n", " \n", " 853118 \n", "
5428\n", " 954315 \n", " \n", " 1155073 \n", "
\n", "\n", "

\n", " 5429 rows x 2 columns
\n", " memory usage: 0.09 MB
\n", " name: cites
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ "name cited_paper_id citing_paper_id\n", "role unused_float unused_float\n", " 0 35 887\n", " 1 35 1033\n", " 2 35 1688\n", " 3 35 1956\n", " 4 35 8865\n", " ... ...\n", "5424 853116 19621\n", "5425 853116 853155\n", "5426 853118 1140289\n", "5427 853155 853118\n", "5428 954315 1155073\n", "\n", "\n", "5429 rows x 2 columns\n", "memory usage: 0.09 MB\n", "type: getml.DataFrame" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cites" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
name paper_idword_cited_id
roleunused_floatunused_string
0\n", " 35 \n", " word100
1\n", " 35 \n", " word1152
2\n", " 35 \n", " word1175
3\n", " 35 \n", " word1228
4\n", " 35 \n", " word1248
\n", " ... \n", " ...
49211\n", " 1155073 \n", " word75
49212\n", " 1155073 \n", " word759
49213\n", " 1155073 \n", " word789
49214\n", " 1155073 \n", " word815
49215\n", " 1155073 \n", " word979
\n", "\n", "

\n", " 49216 rows x 2 columns
\n", " memory usage: 1.20 MB
\n", " name: content
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ " name paper_id word_cited_id\n", " role unused_float unused_string\n", " 0 35 word100 \n", " 1 35 word1152 \n", " 2 35 word1175 \n", " 3 35 word1228 \n", " 4 35 word1248 \n", " ... ... \n", "49211 1155073 word75 \n", "49212 1155073 word759 \n", "49213 1155073 word789 \n", "49214 1155073 word815 \n", "49215 1155073 word979 \n", "\n", "\n", "49216 rows x 2 columns\n", "memory usage: 1.20 MB\n", "type: getml.DataFrame" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "content" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.2 Prepare data for getML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "getML requires that we define *roles* for each of the columns." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namepaper_idclass_label
rolejoin_keycategorical
035Genetic_Algorithms
140Genetic_Algorithms
2114Reinforcement_Learning
3117Reinforcement_Learning
4128Reinforcement_Learning
......
27031154500Case_Based
27041154520Neural_Networks
27051154524Rule_Learning
27061154525Rule_Learning
27071155073Rule_Learning
\n", "\n", "

\n", " 2708 rows x 2 columns
\n", " memory usage: 0.02 MB
\n", " name: paper
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ "name paper_id class_label \n", "role join_key categorical \n", " 0 35 Genetic_Algorithms \n", " 1 40 Genetic_Algorithms \n", " 2 114 Reinforcement_Learning\n", " 3 117 Reinforcement_Learning\n", " 4 128 Reinforcement_Learning\n", " ... ... \n", "2703 1154500 Case_Based \n", "2704 1154520 Neural_Networks \n", "2705 1154524 Rule_Learning \n", "2706 1154525 Rule_Learning \n", "2707 1155073 Rule_Learning \n", "\n", "\n", "2708 rows x 2 columns\n", "memory usage: 0.02 MB\n", "type: getml.DataFrame" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paper.set_role(\"paper_id\", getml.data.roles.join_key)\n", "paper.set_role(\"class_label\", getml.data.roles.categorical)\n", "paper" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namecited_paper_idciting_paper_id
role join_key join_key
035887
1351033
2351688
3351956
4358865
......
542485311619621
5425853116853155
54268531181140289
5427853155853118
54289543151155073
\n", "\n", "

\n", " 5429 rows x 2 columns
\n", " memory usage: 0.04 MB
\n", " name: cites
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ "name cited_paper_id citing_paper_id\n", "role join_key join_key\n", " 0 35 887\n", " 1 35 1033\n", " 2 35 1688\n", " 3 35 1956\n", " 4 35 8865\n", " ... ...\n", "5424 853116 19621\n", "5425 853116 853155\n", "5426 853118 1140289\n", "5427 853155 853118\n", "5428 954315 1155073\n", "\n", "\n", "5429 rows x 2 columns\n", "memory usage: 0.04 MB\n", "type: getml.DataFrame" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cites.set_role([\"cited_paper_id\", \"citing_paper_id\"], getml.data.roles.join_key)\n", "cites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to separate our data set into a training, testing and validation set:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namepaper_idword_cited_id
rolejoin_keycategorical
035word100
135word1152
235word1175
335word1228
435word1248
......
492111155073word75
492121155073word759
492131155073word789
492141155073word815
492151155073word979
\n", "\n", "

\n", " 49216 rows x 2 columns
\n", " memory usage: 0.39 MB
\n", " name: content
\n", " type: getml.DataFrame
\n", " \n", "

\n" ], "text/plain": [ " name paper_id word_cited_id\n", " role join_key categorical \n", " 0 35 word100 \n", " 1 35 word1152 \n", " 2 35 word1175 \n", " 3 35 word1228 \n", " 4 35 word1248 \n", " ... ... \n", "49211 1155073 word75 \n", "49212 1155073 word759 \n", "49213 1155073 word789 \n", "49214 1155073 word815 \n", "49215 1155073 word979 \n", "\n", "\n", "49216 rows x 2 columns\n", "memory usage: 0.39 MB\n", "type: getml.DataFrame" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "content.set_role(\"paper_id\", getml.data.roles.join_key)\n", "content.set_role(\"word_cited_id\", getml.data.roles.categorical)\n", "content" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The goal is to predict seven different labels. We generate a target column for each of those labels. We also have to separate the data set into a training and testing set." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namepaper_idclass_label=Case_Basedclass_label=Genetic_Algorithmsclass_label=Neural_Networksclass_label=Probabilistic_Methodsclass_label=Reinforcement_Learningclass_label=Rule_Learningclass_label=Theory
rolejoin_key target target target target target target target
035\n", " 0 \n", " \n", " 1 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", "
140\n", " 0 \n", " \n", " 1 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", "
2114\n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 1 \n", " \n", " 0 \n", " \n", " 0 \n", "
3117\n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 1 \n", " \n", " 0 \n", " \n", " 0 \n", "
4128\n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 0 \n", " \n", " 1 \n", " \n", " 0 \n", " \n", " 0 \n", "
......\n", " ... \n", " \n", " ... \n", " \n", " ... \n", " \n", " ... \n", " \n", " ... \n", " \n", " ... \n", " \n", " ... \n", "
\n", "\n", "

\n", " 2708 rows
\n", " \n", " type: getml.data.View
\n", " \n", "

\n" ], "text/plain": [ "name paper_id class_label=Case_Based class_label=Genetic_Algorithms class_label=Neural_Networks\n", "role join_key target target target\n", " 0 35 0 1 0\n", " 1 40 0 1 0\n", " 2 114 0 0 0\n", " 3 117 0 0 0\n", " 4 128 0 0 0\n", " ... ... ... ... ...\n", "\n", "name class_label=Probabilistic_Methods class_label=Reinforcement_Learning class_label=Rule_Learning class_label=Theory\n", "role target target target target\n", " 0 0 0 0 0\n", " 1 0 0 0 0\n", " 2 0 1 0 0\n", " 3 0 1 0 0\n", " 4 0 1 0 0\n", " ... ... ... ... ...\n", "\n", "\n", "2708 rows x 8 columns\n", "type: getml.data.View" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_full = getml.data.make_target_columns(paper, \"class_label\")\n", "data_full" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "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", "
0train
1test
2train
3test
4test
...
\n", "\n", "

\n", " infinite number of rows
\n", " \n", " type: StringColumnView
\n", " \n", "

\n" ], "text/plain": [ " \n", " 0 train\n", " 1 test \n", " 2 train\n", " 3 test \n", " 4 test \n", " ... \n", "\n", "\n", "infinite number of rows\n", "type: StringColumnView" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "split = getml.data.split.random(train=0.7, test=0.3, validation=0.0)\n", "split" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
\n", "
population
\n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
subsetname rowstype
0testpaper821View
1trainpaper1887View
\n", "
\n", "
\n", "
peripheral
\n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
name rowstype
0cites5429DataFrame
1content49216DataFrame
2paper2708DataFrame
\n", "
\n", "
" ], "text/plain": [ "population\n", " subset name rows type\n", "0 test paper 821 View\n", "1 train paper 1887 View\n", "\n", "peripheral\n", " name rows type \n", "0 cites 5429 DataFrame\n", "1 content 49216 DataFrame\n", "2 paper 2708 DataFrame" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "container = getml.data.Container(population=data_full, split=split)\n", "container.add(cites=cites, content=content, paper=paper)\n", "container.freeze()\n", "container" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Predictive modeling\n", "\n", "We loaded the data and defined the roles and units. Next, we create a getML pipeline for relational learning." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 Define relational model\n", "\n", "To get started with relational learning, we need to specify the data model. Even though the data set itself is quite simple with only three tables and six columns in total, the resulting data model is actually quite complicated.\n", "\n", "That is because the class label can be predicting using three different pieces of information:\n", "\n", "- The keywords used by the paper\n", "- The keywords used by papers it cites and by papers that cite the paper\n", "- The class label of papers it cites and by papers that cite the paper\n", "\n", "The main challenge here is that `cites` is used twice, once to connect the _cited_ papers and then to connect the _citing_ papers. To resolve this, we need two placeholders on `cites`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
diagram
\n", "
contentpapercitescontentpapercitescontentpopulationpaper_id = citing_paper_idpaper_id = citing_paper_idRelationship: many-to-onepaper_id = cited_paper_idpaper_id = cited_paper_idRelationship: many-to-onecited_paper_id = paper_idciting_paper_id = paper_idpaper_id = paper_id
\n", "
\n", "\n", "
\n", "
staging
\n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
data frames staging table
0populationPOPULATION__STAGING_TABLE_1
1cites, paperCITES__STAGING_TABLE_2
2cites, paperCITES__STAGING_TABLE_3
3contentCONTENT__STAGING_TABLE_4
\n", "
\n", " " ], "text/plain": [ "population:\n", " columns:\n", " - class_label: categorical\n", " - paper_id: join_key\n", "\n", " joins:\n", " - right: 'cites'\n", " on: (population.paper_id, cites.cited_paper_id)\n", " relationship: 'many-to-many'\n", " lagged_targets: False\n", " - right: 'cites'\n", " on: (population.paper_id, cites.citing_paper_id)\n", " relationship: 'many-to-many'\n", " lagged_targets: False\n", " - right: 'content'\n", " on: (population.paper_id, content.paper_id)\n", " relationship: 'many-to-many'\n", " lagged_targets: False\n", "\n", "cites:\n", " columns:\n", " - cited_paper_id: join_key\n", " - citing_paper_id: join_key\n", "\n", " joins:\n", " - right: 'content'\n", " on: (cites.citing_paper_id, content.paper_id)\n", " relationship: 'many-to-many'\n", " lagged_targets: False\n", " - right: 'paper'\n", " on: (cites.citing_paper_id, paper.paper_id)\n", " relationship: 'many-to-one'\n", " lagged_targets: False\n", "\n", "content:\n", " columns:\n", " - word_cited_id: categorical\n", " - paper_id: join_key\n", "\n", "paper:\n", " columns:\n", " - class_label: categorical\n", " - paper_id: join_key\n", "\n", "cites:\n", " columns:\n", " - cited_paper_id: join_key\n", " - citing_paper_id: join_key\n", "\n", " joins:\n", " - right: 'content'\n", " on: (cites.cited_paper_id, content.paper_id)\n", " relationship: 'many-to-many'\n", " lagged_targets: False\n", " - right: 'paper'\n", " on: (cites.cited_paper_id, paper.paper_id)\n", " relationship: 'many-to-one'\n", " lagged_targets: False\n", "\n", "content:\n", " columns:\n", " - word_cited_id: categorical\n", " - paper_id: join_key\n", "\n", "paper:\n", " columns:\n", " - class_label: categorical\n", " - paper_id: join_key\n", "\n", "content:\n", " columns:\n", " - word_cited_id: categorical\n", " - paper_id: join_key" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dm = getml.data.DataModel(paper.to_placeholder(\"population\"))\n", "\n", "# We need two different placeholders for cites.\n", "dm.add(getml.data.to_placeholder(cites=[cites]*2, content=content, paper=paper))\n", "\n", "dm.population.join(\n", " dm.cites[0],\n", " on=('paper_id', 'cited_paper_id')\n", ")\n", "\n", "dm.cites[0].join(\n", " dm.content,\n", " on=('citing_paper_id', 'paper_id')\n", ")\n", "\n", "dm.cites[0].join(\n", " dm.paper,\n", " on=('citing_paper_id', 'paper_id'),\n", " relationship=getml.data.relationship.many_to_one\n", ")\n", "\n", "dm.population.join(\n", " dm.cites[1],\n", " on=('paper_id', 'citing_paper_id')\n", ")\n", "\n", "dm.cites[1].join(\n", " dm.content,\n", " on=('cited_paper_id', 'paper_id')\n", ")\n", "\n", "dm.cites[1].join(\n", " dm.paper,\n", " on=('cited_paper_id', 'paper_id'),\n", " relationship=getml.data.relationship.many_to_one\n", ")\n", "\n", "dm.population.join(\n", " dm.content,\n", " on='paper_id'\n", ")\n", "\n", "dm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 getML pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "__Set-up the feature learner & predictor__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the relboost algorithms for this problem. Because of the large number of keywords, we regularize the model a bit by requiring a minimum support for the keywords (`min_num_samples`)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "mapping = getml.preprocessors.Mapping()\n", "\n", "fast_prop = getml.feature_learning.FastProp(\n", " loss_function=getml.feature_learning.loss_functions.CrossEntropyLoss,\n", " num_threads=1\n", ")\n", "\n", "relboost = getml.feature_learning.Relboost(\n", " num_features=10,\n", " num_subfeatures=10,\n", " loss_function=getml.feature_learning.loss_functions.CrossEntropyLoss,\n", " seed=4367,\n", " num_threads=1,\n", " min_num_samples=30\n", ")\n", "\n", "predictor = getml.predictors.XGBoostClassifier()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Build the pipeline__" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(data_model='population',\n",
       "         feature_learners=['FastProp'],\n",
       "         feature_selectors=[],\n",
       "         include_categorical=False,\n",
       "         loss_function='CrossEntropyLoss',\n",
       "         peripheral=['cites', 'content', 'paper'],\n",
       "         predictors=['XGBoostClassifier'],\n",
       "         preprocessors=['Mapping'],\n",
       "         share_selected_features=0.5,\n",
       "         tags=['fast_prop'])
" ], "text/plain": [ "Pipeline(data_model='population',\n", " feature_learners=['FastProp'],\n", " feature_selectors=[],\n", " include_categorical=False,\n", " loss_function='CrossEntropyLoss',\n", " peripheral=['cites', 'content', 'paper'],\n", " predictors=['XGBoostClassifier'],\n", " preprocessors=['Mapping'],\n", " share_selected_features=0.5,\n", " tags=['fast_prop'])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1 = getml.pipeline.Pipeline(\n", " tags=['fast_prop'],\n", " data_model=dm,\n", " preprocessors=[mapping],\n", " feature_learners=[fast_prop],\n", " predictors=[predictor]\n", ")\n", "\n", "pipe1" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(data_model='population',\n",
       "         feature_learners=['Relboost'],\n",
       "         feature_selectors=[],\n",
       "         include_categorical=False,\n",
       "         loss_function='CrossEntropyLoss',\n",
       "         peripheral=['cites', 'content', 'paper'],\n",
       "         predictors=['XGBoostClassifier'],\n",
       "         preprocessors=[],\n",
       "         share_selected_features=0.5,\n",
       "         tags=['relboost'])
" ], "text/plain": [ "Pipeline(data_model='population',\n", " feature_learners=['Relboost'],\n", " feature_selectors=[],\n", " include_categorical=False,\n", " loss_function='CrossEntropyLoss',\n", " peripheral=['cites', 'content', 'paper'],\n", " predictors=['XGBoostClassifier'],\n", " preprocessors=[],\n", " share_selected_features=0.5,\n", " tags=['relboost'])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2 = getml.pipeline.Pipeline(\n", " tags=['relboost'],\n", " data_model=dm,\n", " feature_learners=[relboost],\n", " predictors=[predictor]\n", ")\n", "\n", "pipe2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.3 Model training" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Checking data model...\n",
       "
\n" ], "text/plain": [ "Checking data model\u001b[33m...\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K⠏ Preprocessing... 0% • 00:00" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n",
       "
\n" ], "text/plain": [ "The pipeline check generated \u001b[1;36m3\u001b[0m issues labeled INFO and \u001b[1;36m0\u001b[0m issues labeled WARNING.\n" ] }, "metadata": {}, "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", "
typelabel message
0INFOMIGHT TAKE LONGThe number of unique entries in column 'word_cited_id' in CONTENT__STAGING_TABLE_4 is 1432. This might take a long time to fit. You should consider setting its role to unused_string or using it for comparison only (you can do the latter by setting a unit that contains 'comparison only').
1INFOFOREIGN KEYS NOT FOUNDWhen joining POPULATION__STAGING_TABLE_1 and CITES__STAGING_TABLE_2 over 'paper_id' and 'cited_paper_id', there are no corresponding entries for 41.759406% of entries in 'paper_id' in 'POPULATION__STAGING_TABLE_1'. You might want to double-check your join keys.
2INFOFOREIGN KEYS NOT FOUNDWhen joining POPULATION__STAGING_TABLE_1 and CITES__STAGING_TABLE_3 over 'paper_id' and 'citing_paper_id', there are no corresponding entries for 17.700053% of entries in 'paper_id' in 'POPULATION__STAGING_TABLE_1'. You might want to double-check your join keys.
" ], "text/plain": [ " type label message \n", "0 INFO MIGHT TAKE LONG The number of unique entries in ...\n", "1 INFO FOREIGN KEYS NOT FOUND When joining POPULATION__STAGING...\n", "2 INFO FOREIGN KEYS NOT FOUND When joining POPULATION__STAGING..." ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.check(container.train)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Checking data model...\n",
       "
\n" ], "text/plain": [ "Checking data model\u001b[33m...\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n",
       "
\n" ], "text/plain": [ "The pipeline check generated \u001b[1;36m3\u001b[0m issues labeled INFO and \u001b[1;36m0\u001b[0m issues labeled WARNING.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
To see the issues in full, run .check() on the pipeline.\n",
       "
\n" ], "text/plain": [ "To see the issues in full, run \u001b[1;35m.check\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m on the pipeline.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Trying 3780 features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:06\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
Trained pipeline.\n",
       "
\n" ], "text/plain": [ "Trained pipeline.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 0:00:16.670446.\n", "\n" ] }, { "data": { "text/html": [ "
Pipeline(data_model='population',\n",
       "         feature_learners=['FastProp'],\n",
       "         feature_selectors=[],\n",
       "         include_categorical=False,\n",
       "         loss_function='CrossEntropyLoss',\n",
       "         peripheral=['cites', 'content', 'paper'],\n",
       "         predictors=['XGBoostClassifier'],\n",
       "         preprocessors=['Mapping'],\n",
       "         share_selected_features=0.5,\n",
       "         tags=['fast_prop', 'container-BRPpU2'])
" ], "text/plain": [ "Pipeline(data_model='population',\n", " feature_learners=['FastProp'],\n", " feature_selectors=[],\n", " include_categorical=False,\n", " loss_function='CrossEntropyLoss',\n", " peripheral=['cites', 'content', 'paper'],\n", " predictors=['XGBoostClassifier'],\n", " preprocessors=['Mapping'],\n", " share_selected_features=0.5,\n", " tags=['fast_prop', 'container-BRPpU2'])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.fit(container.train)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Checking data model...\n",
       "
\n" ], "text/plain": [ "Checking data model\u001b[33m...\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K⠧ Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90% • 00:01" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n",
       "
\n" ], "text/plain": [ "The pipeline check generated \u001b[1;36m3\u001b[0m issues labeled INFO and \u001b[1;36m0\u001b[0m issues labeled WARNING.\n" ] }, "metadata": {}, "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", "
typelabel message
0INFOMIGHT TAKE LONGThe number of unique entries in column 'word_cited_id' in CONTENT__STAGING_TABLE_4 is 1432. This might take a long time to fit. You should consider setting its role to unused_string or using it for comparison only (you can do the latter by setting a unit that contains 'comparison only').
1INFOFOREIGN KEYS NOT FOUNDWhen joining POPULATION__STAGING_TABLE_1 and CITES__STAGING_TABLE_2 over 'paper_id' and 'cited_paper_id', there are no corresponding entries for 41.759406% of entries in 'paper_id' in 'POPULATION__STAGING_TABLE_1'. You might want to double-check your join keys.
2INFOFOREIGN KEYS NOT FOUNDWhen joining POPULATION__STAGING_TABLE_1 and CITES__STAGING_TABLE_3 over 'paper_id' and 'citing_paper_id', there are no corresponding entries for 17.700053% of entries in 'paper_id' in 'POPULATION__STAGING_TABLE_1'. You might want to double-check your join keys.
" ], "text/plain": [ " type label message \n", "0 INFO MIGHT TAKE LONG The number of unique entries in ...\n", "1 INFO FOREIGN KEYS NOT FOUND When joining POPULATION__STAGING...\n", "2 INFO FOREIGN KEYS NOT FOUND When joining POPULATION__STAGING..." ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.check(container.train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The training process seems a bit intimidating. That is because the relboost algorithms needs to train separate models for each class label. This is due to the nature of the generated features." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Checking data model...\n",
       "
\n" ], "text/plain": [ "Checking data model\u001b[33m...\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n",
       "
\n" ], "text/plain": [ "The pipeline check generated \u001b[1;36m3\u001b[0m issues labeled INFO and \u001b[1;36m0\u001b[0m issues labeled WARNING.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
To see the issues in full, run .check() on the pipeline.\n",
       "
\n" ], "text/plain": [ "To see the issues in full, run \u001b[1;35m.check\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m on the pipeline.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:01\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Training features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K XGBoost: Training as predictor... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "data": { "text/html": [ "
Trained pipeline.\n",
       "
\n" ], "text/plain": [ "Trained pipeline.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 0:00:39.645936.\n", "\n" ] }, { "data": { "text/html": [ "
Pipeline(data_model='population',\n",
       "         feature_learners=['Relboost'],\n",
       "         feature_selectors=[],\n",
       "         include_categorical=False,\n",
       "         loss_function='CrossEntropyLoss',\n",
       "         peripheral=['cites', 'content', 'paper'],\n",
       "         predictors=['XGBoostClassifier'],\n",
       "         preprocessors=[],\n",
       "         share_selected_features=0.5,\n",
       "         tags=['relboost', 'container-BRPpU2'])
" ], "text/plain": [ "Pipeline(data_model='population',\n", " feature_learners=['Relboost'],\n", " feature_selectors=[],\n", " include_categorical=False,\n", " loss_function='CrossEntropyLoss',\n", " peripheral=['cites', 'content', 'paper'],\n", " predictors=['XGBoostClassifier'],\n", " preprocessors=[],\n", " share_selected_features=0.5,\n", " tags=['relboost', 'container-BRPpU2'])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.fit(container.train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.4 Model evaluation" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date time set usedtarget accuracy auccross entropy
02024-09-12 13:05:07trainclass_label=Case_Based0.99790.99990.02323
12024-09-12 13:05:07trainclass_label=Genetic_Algorithms1.01.0.004862
22024-09-12 13:05:07trainclass_label=Neural_Networks0.98460.99830.065852
32024-09-12 13:05:07trainclass_label=Probabilistic_Methods0.99580.99980.027649
42024-09-12 13:05:07trainclass_label=Reinforcement_Learning0.99951.0.008878
..................
92024-09-12 13:05:48testclass_label=Neural_Networks0.95130.97870.163577
102024-09-12 13:05:48testclass_label=Probabilistic_Methods0.97440.98730.082802
112024-09-12 13:05:48testclass_label=Reinforcement_Learning0.98050.97360.073926
122024-09-12 13:05:48testclass_label=Rule_Learning0.98420.99370.052303
132024-09-12 13:05:48testclass_label=Theory0.95620.9770.128617
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", " 0 2024-09-12 13:05:07 train class_label=Case_Based 0.9979 0.9999 0.02323 \n", " 1 2024-09-12 13:05:07 train class_label=Genetic_Algorithms 1.0 1. 0.004862\n", " 2 2024-09-12 13:05:07 train class_label=Neural_Networks 0.9846 0.9983 0.065852\n", " 3 2024-09-12 13:05:07 train class_label=Probabilistic_Method... 0.9958 0.9998 0.027649\n", " 4 2024-09-12 13:05:07 train class_label=Reinforcement_Learni... 0.9995 1. 0.008878\n", " ... ... ... ... ... ...\n", " 9 2024-09-12 13:05:48 test class_label=Neural_Networks 0.9513 0.9787 0.163577\n", "10 2024-09-12 13:05:48 test class_label=Probabilistic_Method... 0.9744 0.9873 0.082802\n", "11 2024-09-12 13:05:48 test class_label=Reinforcement_Learni... 0.9805 0.9736 0.073926\n", "12 2024-09-12 13:05:48 test class_label=Rule_Learning 0.9842 0.9937 0.052303\n", "13 2024-09-12 13:05:48 test class_label=Theory 0.9562 0.977 0.128617" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.score(container.test)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date time set usedtarget accuracy auccross entropy
02024-09-12 13:05:47trainclass_label=Case_Based1.01.0.009385
12024-09-12 13:05:47trainclass_label=Genetic_Algorithms1.01.0.004222
22024-09-12 13:05:47trainclass_label=Neural_Networks0.9910.99960.03766
32024-09-12 13:05:47trainclass_label=Probabilistic_Methods0.99891.0.013846
42024-09-12 13:05:47trainclass_label=Reinforcement_Learning1.01.0.004409
..................
92024-09-12 13:05:51testclass_label=Neural_Networks0.93910.97570.193588
102024-09-12 13:05:51testclass_label=Probabilistic_Methods0.97690.98920.072601
112024-09-12 13:05:51testclass_label=Reinforcement_Learning0.97690.97730.094757
122024-09-12 13:05:51testclass_label=Rule_Learning0.98420.99120.060603
132024-09-12 13:05:51testclass_label=Theory0.94880.97450.142024
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", " 0 2024-09-12 13:05:47 train class_label=Case_Based 1.0 1. 0.009385\n", " 1 2024-09-12 13:05:47 train class_label=Genetic_Algorithms 1.0 1. 0.004222\n", " 2 2024-09-12 13:05:47 train class_label=Neural_Networks 0.991 0.9996 0.03766 \n", " 3 2024-09-12 13:05:47 train class_label=Probabilistic_Method... 0.9989 1. 0.013846\n", " 4 2024-09-12 13:05:47 train class_label=Reinforcement_Learni... 1.0 1. 0.004409\n", " ... ... ... ... ... ...\n", " 9 2024-09-12 13:05:51 test class_label=Neural_Networks 0.9391 0.9757 0.193588\n", "10 2024-09-12 13:05:51 test class_label=Probabilistic_Method... 0.9769 0.9892 0.072601\n", "11 2024-09-12 13:05:51 test class_label=Reinforcement_Learni... 0.9769 0.9773 0.094757\n", "12 2024-09-12 13:05:51 test class_label=Rule_Learning 0.9842 0.9912 0.060603\n", "13 2024-09-12 13:05:51 test class_label=Theory 0.9488 0.9745 0.142024" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.score(container.test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make things a bit easier, we just look at our test results." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date time set usedtarget accuracy auccross entropy
02024-09-12 13:05:48testclass_label=Case_Based0.97080.98610.08689
12024-09-12 13:05:48testclass_label=Genetic_Algorithms0.98420.99810.04915
22024-09-12 13:05:48testclass_label=Neural_Networks0.95130.97870.16358
32024-09-12 13:05:48testclass_label=Probabilistic_Methods0.97440.98730.0828
42024-09-12 13:05:48testclass_label=Reinforcement_Learning0.98050.97360.07393
52024-09-12 13:05:48testclass_label=Rule_Learning0.98420.99370.0523
62024-09-12 13:05:48testclass_label=Theory0.95620.9770.12862
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", "0 2024-09-12 13:05:48 test class_label=Case_Based 0.9708 0.9861 0.08689\n", "1 2024-09-12 13:05:48 test class_label=Genetic_Algorithms 0.9842 0.9981 0.04915\n", "2 2024-09-12 13:05:48 test class_label=Neural_Networks 0.9513 0.9787 0.16358\n", "3 2024-09-12 13:05:48 test class_label=Probabilistic_Method... 0.9744 0.9873 0.0828 \n", "4 2024-09-12 13:05:48 test class_label=Reinforcement_Learni... 0.9805 0.9736 0.07393\n", "5 2024-09-12 13:05:48 test class_label=Rule_Learning 0.9842 0.9937 0.0523 \n", "6 2024-09-12 13:05:48 test class_label=Theory 0.9562 0.977 0.12862" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.scores.filter(lambda score: score.set_used == \"test\")" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date time set usedtarget accuracy auccross entropy
02024-09-12 13:05:51testclass_label=Case_Based0.97440.98950.08319
12024-09-12 13:05:51testclass_label=Genetic_Algorithms0.99030.99880.03866
22024-09-12 13:05:51testclass_label=Neural_Networks0.93910.97570.19359
32024-09-12 13:05:51testclass_label=Probabilistic_Methods0.97690.98920.0726
42024-09-12 13:05:51testclass_label=Reinforcement_Learning0.97690.97730.09476
52024-09-12 13:05:51testclass_label=Rule_Learning0.98420.99120.0606
62024-09-12 13:05:51testclass_label=Theory0.94880.97450.14202
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", "0 2024-09-12 13:05:51 test class_label=Case_Based 0.9744 0.9895 0.08319\n", "1 2024-09-12 13:05:51 test class_label=Genetic_Algorithms 0.9903 0.9988 0.03866\n", "2 2024-09-12 13:05:51 test class_label=Neural_Networks 0.9391 0.9757 0.19359\n", "3 2024-09-12 13:05:51 test class_label=Probabilistic_Method... 0.9769 0.9892 0.0726 \n", "4 2024-09-12 13:05:51 test class_label=Reinforcement_Learni... 0.9769 0.9773 0.09476\n", "5 2024-09-12 13:05:51 test class_label=Rule_Learning 0.9842 0.9912 0.0606 \n", "6 2024-09-12 13:05:51 test class_label=Theory 0.9488 0.9745 0.14202" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.scores.filter(lambda score: score.set_used == \"test\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We take the average of the AUC values, which is also the value that appears in the getML monitor (http://localhost:1709/#/listpipelines/cora)." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9849300280909873\n", "0.9851644641057435\n" ] } ], "source": [ "fastprop_auc = np.mean(pipe1.auc)\n", "relboost_auc = np.mean(pipe2.auc)\n", "print(fastprop_auc)\n", "print(relboost_auc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The accuracy for multiple targets can be calculated using one of two methods. The first method is to simply take the average of the pair-wise accuracy values, which is also the value that appears in the getML monitor (http://localhost:1709/#/listpipelines/cora)." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9716373760222724\n", "0.9700713415695145\n" ] } ], "source": [ "print(np.mean(pipe1.accuracy))\n", "print(np.mean(pipe2.accuracy))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, the benchmarking papers actually use a different approach: \n", "\n", "- They first generate probabilities for each of the labels:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K FastProp: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Staging... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Preprocessing... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building subfeatures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[2K Relboost: Building features... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 00:00\n", "\u001b[?25h" ] } ], "source": [ "probabilities1 = pipe1.predict(container.test)\n", "probabilities2 = pipe2.predict(container.test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- They then find the class label with the highest probability:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "class_label = paper.class_label.unique()\n", "\n", "ix_max = np.argmax(probabilities1, axis=1)\n", "predicted_labels1 = np.asarray([class_label[ix] for ix in ix_max])\n", "\n", "ix_max = np.argmax(probabilities2, axis=1)\n", "predicted_labels2 = np.asarray([class_label[ix] for ix in ix_max])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- They then compare that value to the actual class label:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Share of accurately predicted class labels (pipe1):\n", "0.9001218026796589\n", "\n", "Share of accurately predicted class labels (pipe2):\n", "0.8964677222898904\n", "\n" ] } ], "source": [ "actual_labels = paper[split == \"test\"].class_label.to_numpy()\n", "fastprop_accuracy = (actual_labels == predicted_labels1).sum() / len(actual_labels)\n", "relboost_accuracy = (actual_labels == predicted_labels2).sum() / len(actual_labels)\n", "\n", "print(\"Share of accurately predicted class labels (pipe1):\")\n", "print(fastprop_accuracy)\n", "print()\n", "print(\"Share of accurately predicted class labels (pipe2):\")\n", "print(relboost_accuracy)\n", "print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since this is the method the benchmark papers use, this is the accuracy score we will report as well." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.5 Studying features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Feature correlations__\n", "\n", "We want to analyze how the features are correlated with the target variables." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "TARGET_NUM = 0" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABmAAAAOkCAYAAACxvPtEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACU2klEQVR4nOzdd3hW9d348U/CCMgIoGwpy4m4HhCLClhFUVGLFsHRirj6qDge1BZrFREqtFXUOot7tVpx1DqoilK1UrVarbsOUKuyRAgVGSbn94c/UmMCJOEbkhter+vKdZVzn/PN576TO5W8OefkZVmWBQAAAAAAAMnk1/YAAAAAAAAAGxoBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAANgB77rln7LnnnknXvOCCCyIvLy/pmrXtmGOOiS5dulR636ZNm9aZedaX2bNnR15eXtx8881VPnbV98yCBQuSzVMXXyPKuvnmmyMvLy9mz55d26MAANQpAgwAAKVW/RKtoo8xY8bUyOd89tln44ILLohFixbVyPqs2dKlS+OCCy6IGTNm1PYotWJjf/4bovvuuy/233//2GyzzaJhw4bRoUOHGDZsWDzxxBO1Pdpa7bnnnmV+7jZs2DC6du0aJ554Ynz00Ue1PR4AAFVUv7YHAACg7rnwwguja9euZbb17NmzRj7Xs88+G+PGjYtjjjkmWrRoUSOfg9VbunRpjBs3LiKi3Bk0P//5z2ssvNWW6667LkpKSkr/vKbnT27JsiyOPfbYuPnmm2PnnXeO0aNHR7t27eLTTz+N++67L/bee+/461//Grvttlttj7pGm2++eUycODEiIlasWBFvvPFGXHvttfHnP/853nzzzdhkk01qeUIAACpLgAEAoJz9998/evfuXdtjrJMvvvgimjRpUttjrNGyZcuiYcOGkZ9f/sT0ujB//fr1o379DeuvDA0aNKjtEaghl1xySdx8881xxhlnxOTJk8tcPu/cc8+N2267LSe+nwsLC+OHP/xhmW1du3aNUaNGxV//+tfYZ599amkyAACqyiXIAACoskceeST69esXTZo0iWbNmsXgwYPj9ddfL7PPP//5zzjmmGOiW7du0ahRo2jXrl0ce+yx8dlnn5Xuc8EFF8TZZ58dEV//gnHVZXdmz569xvtQ5OXlxQUXXFBmnby8vHjjjTfiyCOPjJYtW8Yee+xR+vjtt98evXr1isaNG0erVq3i8MMPr/TlfD7++OM47rjjokOHDlFQUBBdu3aNk046KVasWFG6z/vvvx+HHXZYtGrVKjbZZJP47ne/Gw899FCZdWbMmBF5eXlx5513xs9//vPo2LFjbLLJJlFUVFR6r5H33nsvDjjggGjWrFkcddRRERFRUlISl112WWy33XbRqFGjaNu2bfz4xz+Ozz//fI1zr1ixIs4///zo1atXFBYWRpMmTaJfv37x5JNPlu4ze/bsaN26dUREjBs3rvT1X/XaVnQPmK+++irGjx8f3bt3j4KCgujSpUv87Gc/i+XLl5fZr0uXLnHggQfGM888E3369IlGjRpFt27d4tZbby2z38qVK2PcuHGx5ZZbRqNGjWLTTTeNPfbYIx577LHVPrdFixZFvXr14je/+U3ptgULFkR+fn5suummkWVZ6faTTjop2rVrV/rnb95PZG3Pf5WPP/44hgwZEk2bNo3WrVvHWWedFcXFxaud75seeeSRGDBgQDRr1iyaN28eu+yyS/zud79b4zEXX3xx7LbbbrHppptG48aNo1evXjF16tRy+z322GOxxx57RIsWLaJp06ax9dZbx89+9rMy+1xxxRWx3XbbxSabbBItW7aM3r17r/XzV6Qy7+dvWrBgQQwbNiyaN28em266aZx++umxbNmycvuty3vzm7788suYOHFibLPNNnHxxRdXeO+iH/3oR9GnT5+IiFi4cGGcddZZsf3220fTpk2jefPmsf/++8crr7xS7rjKvIYff/xxHHvssdG2bdsoKCiI7bbbLm688cYqP4/VWfU9/M2A9MEHH8TJJ58cW2+9dTRu3Dg23XTTOOyww8rdh6Wy77G33norhg4dGq1atYpGjRpF796944EHHig3y+uvvx577bVXNG7cODbffPOYMGFCmbPKAAD4r7r/z38AAFjvFi9eXO4m2ptttllERNx2220xYsSIGDRoUPzyl7+MpUuXxjXXXBN77LFH/OMf/yj95fZjjz0W77//fowcOTLatWsXr7/+ekyZMiVef/31+Nvf/hZ5eXlx6KGHxr/+9a/4/e9/H5deemnp52jdunXMnz+/ynMfdthhseWWW8ZFF11U+kv4X/ziF3HeeefFsGHD4vjjj4/58+fHFVdcEf37949//OMfa7zs2SeffBJ9+vSJRYsWxYknnhjbbLNNfPzxxzF16tRYunRpNGzYMObOnRu77bZbLF26NE477bTYdNNN45ZbbomDDz44pk6dGoccckiZNcePHx8NGzaMs846K5YvXx4NGzaMiK/DxqBBg2KPPfaIiy++uPQyQz/+8Y/j5ptvjpEjR8Zpp50Ws2bNiiuvvDL+8Y9/xF//+tfVntFRVFQU119/fRxxxBFxwgknxJIlS+KGG26IQYMGxfPPPx877bRTtG7dOq655po46aST4pBDDolDDz00IiJ22GGH1b4mxx9/fNxyyy0xdOjQOPPMM+O5556LiRMnxptvvhn33XdfmX3ffffdGDp0aBx33HExYsSIuPHGG+OYY46JXr16xXbbbRcRX0eeiRMnxvHHHx99+vSJoqKi+Pvf/x4vvfTSav+lf4sWLaJnz57x1FNPxWmnnRYREc8880zk5eXFwoUL44033ihd/+mnn45+/fpVuE5lnn9xcXEMGjQodt1117j44ovj8ccfj0suuSS6d+8eJ5100mpfp4iv76l07LHHxnbbbRfnnHNOtGjRIv7xj3/EtGnT4sgjj1ztcZdffnkcfPDBcdRRR8WKFSvizjvvjMMOOywefPDBGDx4cER8/UvwAw88MHbYYYe48MILo6CgIN59993461//WrrOddddF6eddloMHTq0NID885//jOeee26Nn78ilXk/f9OwYcOiS5cuMXHixPjb3/4Wv/nNb+Lzzz8vE+DW5b35bc8880wsXLgwzjjjjKhXr95a93///ffj/vvvj8MOOyy6du0ac+fOjd/+9rcxYMCAeOONN6JDhw4RUbnXcO7cufHd73438vLyYtSoUdG6det45JFH4rjjjouioqI444wzKv08Ir7+nlv183flypXx5ptvxtixY2OLLbaI3XffvXS/F154IZ599tk4/PDDY/PNN4/Zs2fHNddcE3vuuWe88cYbpT9DKvMee/3112P33XePjh07xpgxY6JJkybxhz/8IYYMGRL33HNP6c+xOXPmxPe+97346quvSvebMmVKNG7cuErPEQBgo5EBAMD/d9NNN2URUeFHlmXZkiVLshYtWmQnnHBCmePmzJmTFRYWltm+dOnScuv//ve/zyIie+qpp0q3/frXv84iIps1a1aZfWfNmpVFRHbTTTeVWycisrFjx5b+eezYsVlEZEcccUSZ/WbPnp3Vq1cv+8UvflFm+6uvvprVr1+/3PZvO/roo7P8/PzshRdeKPdYSUlJlmVZdsYZZ2QRkT399NOljy1ZsiTr2rVr1qVLl6y4uDjLsix78skns4jIunXrVu61GTFiRBYR2ZgxY8psf/rpp7OIyO64444y26dNm1Zu+4ABA7IBAwaU/vmrr77Kli9fXua4zz//PGvbtm127LHHlm6bP39+uddzlVWv6yovv/xyFhHZ8ccfX2a/s846K4uI7Iknnijd1rlz53Jf63nz5mUFBQXZmWeeWbptxx13zAYPHlzuc6/NKaeckrVt27b0z6NHj8769++ftWnTJrvmmmuyLMuyzz77LMvLy8suv/zy0v1GjBiRde7cuVLPf9XX5cILLyyzfeedd8569eq1xvkWLVqUNWvWLNt1112zL7/8ssxjq753Kpony8q/d1asWJH17Nkz22uvvUq3XXrppVlEZPPnz1/tDN///vez7bbbbo1zVqSi915l38+rvmcOPvjgMvuefPLJWURkr7zySpZlVXtvVvQafdvll1+eRUR23333Veo5Llu2rPS9ucqsWbOygoKCMl/vyryGxx13XNa+fftswYIFZbYffvjhWWFhYYWv3eoMGDCgwp+/2267bfb++++X2beidWfOnJlFRHbrrbeWbqvMe2zvvffOtt9++2zZsmWl20pKSrLddtst23LLLUu3rfp599xzz5VumzdvXlZYWFjhz3EAgI2dS5ABAFDOVVddFY899liZj4iv/xX8okWL4ogjjogFCxaUftSrVy923XXXMpe3+ua/iF62bFksWLAgvvvd70ZExEsvvVQjc//v//5vmT/fe++9UVJSEsOGDSszb7t27WLLLbcsM++3lZSUxP333x8HHXRQhffDWfUv/h9++OHo06dPmUueNW3aNE488cSYPXt2vPHGG2WOGzFixGr/tfi3z6i4++67o7CwMPbZZ58y8/fq1SuaNm26xvnr1atXenZNSUlJLFy4ML766qvo3bt3tV//hx9+OCIiRo8eXWb7mWeeGRFR7rJrPXr0KHP2SevWrWPrrbeO999/v3RbixYt4vXXX4933nmnSrP069cv5s6dG2+//XZEfH2mS//+/aNfv37x9NNPR8TXZ0VkWbbaM2Aq69vfV/369SvzHCry2GOPxZIlS2LMmDHRqFGjMo9VdHmsb/rm98fnn38eixcvjn79+pX5uq06O+SPf/zjai//1KJFi/j3v/8dL7zwwho/X2VU9f18yimnlPnzqaeeGhH//R5al/dmRYqKiiIiolmzZpXav6CgoPTeS8XFxfHZZ5+VXsbt26/zml7DLMvinnvuiYMOOiiyLCvzXAYNGhSLFy+u8vutS5cupT93H3nkkbjsssti8eLFsf/++5c5M/CbX5OVK1fGZ599FltssUW0aNGi3HNY03ts4cKF8cQTT8SwYcNiyZIlpfN/9tlnMWjQoHjnnXfi448/joivv37f/e53Sy/lFvH1+3rVJRMBACjLJcgAACinT58+FUaHVb/A22uvvSo8rnnz5qX/e+HChTFu3Li48847Y968eWX2W7x4ccJp/6tr165l/vzOO+9ElmWx5ZZbVrj/mm7IPn/+/CgqKoqePXuu8XN+8MEHseuuu5bbvu2225Y+/s01vj3jKvXr14/NN9+83PyLFy+ONm3aVHjMt1/Xb7vlllvikksuibfeeitWrly51hnW5oMPPoj8/PzYYostymxv165dtGjRIj744IMy27/zne+UW6Nly5Zl7l9z4YUXxve///3YaqutomfPnrHffvvFj370ozVeBi0iSqPK008/HZtvvnn84x//iAkTJkTr1q3j4osvLn2sefPmseOOO1br+UZENGrUqPQ+Mat7DhV57733IiLW+v1TkQcffDAmTJgQL7/8cpl763wz3AwfPjyuv/76OP7442PMmDGx9957x6GHHhpDhw4tDQs//elP4/HHH48+ffrEFltsEfvuu28ceeSRZS5jVVlVfT9/+z3XvXv3yM/PL70/ybq8Nyuy6mfPkiVLKrV/SUlJXH755XH11VfHrFmzytzTZ9NNNy3932t7DefPnx+LFi2KKVOmxJQpUyr8XGt7n35bkyZNYuDAgaV/3m+//WKPPfaI3r17x6RJk+KSSy6JiP/e9+amm26Kjz/+uMy9j775NVnbe+zdd9+NLMvivPPOi/POO2+1z6Fjx46r/Xm39dZbV+k5AgBsLAQYAAAqbdW/tL/tttvK3Nh8lW/eIHrYsGHx7LPPxtlnnx077bRTNG3aNEpKSmK//far1A2bV3eWwJpufv7tM0tKSkoiLy8vHnnkkQrvC9G0adO1zpHa6s5++ea/yF+lpKQk2rRpE3fccUeFx3w7DHzT7bffHsccc0wMGTIkzj777GjTpk3Uq1cvJk6cWBoHqmttZ3Cssrp7cXzzF8X9+/eP9957L/74xz/Go48+Gtdff31ceumlce2118bxxx+/2rU7dOgQXbt2jaeeeiq6dOkSWZZF3759o3Xr1nH66afHBx98EE8//XTstttu5V7XqqjM/URSevrpp+Pggw+O/v37x9VXXx3t27ePBg0axE033VTmxu+NGzeOp556Kp588sl46KGHYtq0aXHXXXfFXnvtFY8++mjUq1cvtt1223j77bfjwQcfjGnTpsU999wTV199dZx//vkxbty4Ks2V+v2c+r25zTbbRETEq6++GkOGDFnr/hdddFGcd955ceyxx8b48eOjVatWkZ+fH2eccUaZ57O213DVvj/84Q9jxIgRFX6utcXEyujVq1cUFhbGU089Vbrt1FNPjZtuuinOOOOM6Nu3bxQWFkZeXl4cfvjhZZ7D2t5jq/Y966yzYtCgQRV+/m9HVwAAKkeAAQCg0rp37x4REW3atCnzL7S/7fPPP4/p06fHuHHj4vzzzy/dXtElcFb3y/yWLVtGRMSiRYvKbP/2WRZrmzfLsujatWtstdVWlT4u4uu40bx583jttdfWuF/nzp1LL4P1TW+99Vbp49XVvXv3ePzxx2P33Xev8k2up06dGt26dYt77723zGs8duzYMvtVNqZEfP1cSkpK4p133ik9wyfi65uQL1q0qNrPtVWrVjFy5MgYOXJk/Oc//4n+/fvHBRdcsMYAE/H1WTBPPfVUdO3aNXbaaado1qxZ7LjjjlFYWBjTpk2Ll156aa2hoSrPvypWvVdee+21Kv3y+p577olGjRrFn//85ygoKCjdftNNN5XbNz8/P/bee+/Ye++9Y/LkyXHRRRfFueeeG08++WTp+7NJkyYxfPjwGD58eKxYsSIOPfTQ+MUvfhHnnHNOuUujrU5V3s/ffOybZ1q9++67UVJSEl26dImIdXtvVmSPPfaIli1bxu9///v42c9+ttZwNnXq1Pje974XN9xwQ5ntixYtis0226zMtjW9hq1bt45mzZpFcXHxGn8mplBcXBz/+c9/yjyHESNGlJ4RE/H15eG+/TMzYs3vsW7dukXE12cdre05dO7cucKve0U/AwEAiHAPGAAAKm3QoEHRvHnzuOiii8pc0mqVVfcnWPXLz2+e6RARcdlll5U7pkmTJhFRPrQ0b948NttsszL/4jsi4uqrr670vIceemjUq1cvxo0bV26WLMvis88+W+2x+fn5MWTIkPjTn/4Uf//738s9vmq9Aw44IJ5//vmYOXNm6WNffPFFTJkyJbp06RI9evSo9LzfNmzYsCguLo7x48eXe+yrr76q8Betq1T0NXjuuefKzBkRsckmm0RE+de/IgcccEBElP86Tp48OSIiBg8evNY1vu3bX4OmTZvGFltsUebSW6vTr1+/mD17dtx1112llyTLz8+P3XbbLSZPnhwrV65c6/1fqvL8q2LfffeNZs2axcSJE2PZsmVlHvv29+I31atXL/Ly8sqc6TV79uy4//77y+y3cOHCcsfutNNOERGlr923X9uGDRtGjx49IsuyCt+/a5qporkrej+vctVVV5X58xVXXBEREfvvv39ErNt7syKbbLJJ/PSnP40333wzfvrTn1b4Gt9+++3x/PPPlz6nb+9z9913l97rZJW1vYb16tWLH/zgB3HPPfdUGGu/ec+WdfHkk0/Gf/7znzKX06voOVxxxRXlzhJc23usTZs2seeee8Zvf/vb+PTTT9f4HA444ID429/+Vvo6rnp8dWfpAQBs7JwBAwBApTVv3jyuueaa+NGPfhT/8z//E4cffni0bt06Pvzww3jooYdi9913jyuvvDKaN28e/fv3j1/96lexcuXK6NixYzz66KMxa9ascmv26tUrIiLOPffcOPzww6NBgwZx0EEHRZMmTeL444+PSZMmxfHHHx+9e/eOp556Kv71r39Vet7u3bvHhAkT4pxzzonZs2fHkCFDolmzZjFr1qy477774sQTT4yzzjprtcdfdNFF8eijj8aAAQPixBNPjG233TY+/fTTuPvuu+OZZ56JFi1axJgxY+L3v/997L///nHaaadFq1at4pZbbolZs2bFPffcs06XvxowYED8+Mc/jokTJ8bLL78c++67bzRo0CDeeeeduPvuu+Pyyy+PoUOHVnjsgQceGPfee28ccsghMXjw4Jg1a1Zce+210aNHjzL/ir5x48bRo0ePuOuuu2KrrbaKVq1aRc+ePSu8d8mOO+4YI0aMiClTpsSiRYtiwIAB8fzzz8ctt9wSQ4YMie9973tVfo49evSIPffcM3r16hWtWrWKv//97zF16tQYNWrUWo9dFVfefvvtuOiii0q39+/fPx555JEoKCiIXXbZZY1rVOX5V0Xz5s3j0ksvjeOPPz522WWXOPLII6Nly5bxyiuvxNKlS+OWW26p8LjBgwfH5MmTY7/99osjjzwy5s2bF1dddVVsscUW8c9//rN0vwsvvDCeeuqpGDx4cHTu3DnmzZsXV199dWy++eaxxx57RMTXEahdu3ax++67R9u2bePNN9+MK6+8MgYPHlzpm9Wvei6VfT+vMmvWrDj44INjv/32i5kzZ8btt98eRx55ZGlAWNf3ZkXOPvvseP311+OSSy6JJ598MoYOHRrt2rWLOXPmxP333x/PP/98PPvssxHx9fvjwgsvjJEjR8Zuu+0Wr776atxxxx2lZ4OsUpnXcNKkSfHkk0/GrrvuGieccEL06NEjFi5cGC+99FI8/vjjFcayNVm8eHHcfvvtEfF1aH377bfjmmuuicaNG8eYMWNK9zvwwAPjtttui8LCwujRo0fMnDkzHn/88TL3sImo3Hvsqquuij322CO23377OOGEE6Jbt24xd+7cmDlzZvz73/+OV155JSIifvKTn8Rtt90W++23X5x++unRpEmTmDJlSnTu3LnM9ycAAP9fBgAA/99NN92URUT2wgsvrHG/J598Mhs0aFBWWFiYNWrUKOvevXt2zDHHZH//+99L9/n3v/+dHXLIIVmLFi2ywsLC7LDDDss++eSTLCKysWPHlllv/PjxWceOHbP8/PwsIrJZs2ZlWZZlS5cuzY477rissLAwa9asWTZs2LBs3rx55dYYO3ZsFhHZ/PnzK5z3nnvuyfbYY4+sSZMmWZMmTbJtttkmO+WUU7K33357ra/JBx98kB199NFZ69ats4KCgqxbt27ZKaecki1fvrx0n/feey8bOnRo1qJFi6xRo0ZZnz59sgcffLDcaxYR2d13313uc4wYMSJr0qTJameYMmVK1qtXr6xx48ZZs2bNsu233z77yU9+kn3yySel+wwYMCAbMGBA6Z9LSkqyiy66KOvcuXNWUFCQ7bzzztmDDz6YjRgxIuvcuXOZ9Z999tmsV69eWcOGDcu8tqte129auXJlNm7cuKxr165ZgwYNsk6dOmXnnHNOtmzZsjL7de7cORs8eHC55/LtOSdMmJD16dMna9GiRda4ceNsm222yX7xi19kK1asWO3r8U1t2rTJIiKb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zBkwDRs2jF69esX06dNLt5WUlMT06dOjb9++5fbfZptt4tVXX42XX3659OPggw+O733ve/Hyyy+7tBgAAAAAAFBjcuYMmIiI0aNHx4gRI6J3797Rp0+fuOyyy+KLL76IkSNHRkTE0UcfHR07doyJEydGo0aNomfPnmWOb9GiRUREue0AAAAAAAAp5VSAGT58eMyfPz/OP//8mDNnTuy0004xbdq0aNu2bUREfPjhh5GfnzMn9QB1kEuaAQAAAAAp5FSAiYgYNWpUjBo1qsLHZsyYscZjb7755vQDAQAAAAAAfIvTRQAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABJLEmCKiori/vvvjzfffDPFcgAAAAAAADmtWgFm2LBhceWVV0ZExJdffhm9e/eOYcOGxQ477BD33HNP0gEBAAAAAAByTbUCzFNPPRX9+vWLiIj77rsvsiyLRYsWxW9+85uYMGFC0gEBAAAAAAByTbUCzOLFi6NVq1YRETFt2rT4wQ9+EJtsskkMHjw43nnnnaQDAgAAAAAA5JpqBZhOnTrFzJkz44svvohp06bFvvvuGxERn3/+eTRq1CjpgAAAAAAAALmmfnUOOuOMM+Koo46Kpk2bRufOnWPPPfeMiK8vTbb99tunnA8AAAAAACDnVCvAnHzyydGnT5/46KOPYp999on8/K9PpOnWrZt7wAAAAAAAABu9agWYiIjevXtH7969y2wbPHjwOg8EAAAAAACQ66oVYIqLi+Pmm2+O6dOnx7x586KkpKTM40888USS4QAAAAAAAHJRtQLM6aefHjfffHMMHjw4evbsGXl5eannAgAAAAAAyFnVCjB33nln/OEPf4gDDjgg9TwAAAAAAAA5L786BzVs2DC22GKL1LMAAAAAAABsEKoVYM4888y4/PLLI8uy1PMAAAAAAADkvGpdguyZZ56JJ598Mh555JHYbrvtokGDBmUev/fee5MMBwAAAAAAkIuqFWBatGgRhxxySOpZAAAAAAAANgjVCjA33XRT6jkAAAAAAAA2GNUKMKvMnz8/3n777YiI2HrrraN169ZJhgIAAAAAAMhl+dU56Isvvohjjz022rdvH/3794/+/ftHhw4d4rjjjoulS5emnhEAAAAAACCnVCvAjB49Ov7yl7/En/70p1i0aFEsWrQo/vjHP8Zf/vKXOPPMM1PPCAAAAAAAkFOqdQmye+65J6ZOnRp77rln6bYDDjggGjduHMOGDYtrrrkm1XwAAAAAAAA5p1pnwCxdujTatm1bbnubNm1cggwAAAAAANjoVSvA9O3bN8aOHRvLli0r3fbll1/GuHHjom/fvsmGAwAAAAAAyEXVugTZ5ZdfHoMGDYrNN988dtxxx4iIeOWVV6JRo0bx5z//OemAAAAAAAAAuaZaAaZnz57xzjvvxB133BFvvfVWREQcccQRcdRRR0Xjxo2TDggAAAAAAJBrqhVgIiI22WSTOOGEE1LOAgAAAAAAsEGodIB54IEHYv/9948GDRrEAw88sMZ9Dz744HUeDAAAAAAAIFdVOsAMGTIk5syZE23atIkhQ4asdr+8vLwoLi5OMRsAAAAAAEBOqnSAKSkpqfB/AwAAAAAAUFZ+dQ669dZbY/ny5eW2r1ixIm699dZ1HgoAAAAAACCXVSvAjBw5MhYvXlxu+5IlS2LkyJHrPBQAAAAAAEAuq1aAybIs8vLyym3/97//HYWFhes8FAAAAAAAQC6r9D1gIiJ23nnnyMvLi7y8vNh7772jfv3/Hl5cXByzZs2K/fbbL/mQAAAAAAAAuaRKAWbIkCEREfHyyy/HoEGDomnTpqWPNWzYMLp06RI/+MEPkg4IAAAAAACQa6oUYMaOHRsREV26dInhw4dHo0aNamQoAAAAAACAXFalALPKiBEjUs8BAAAAAACwwahWgCkuLo5LL700/vCHP8SHH34YK1asKPP4woULkwwHAAAAAACQi/Krc9C4ceNi8uTJMXz48Fi8eHGMHj06Dj300MjPz48LLrgg8YgAAAAAAAC5pVoB5o477ojrrrsuzjzzzKhfv34cccQRcf3118f5558ff/vb31LPCAAAAAAAkFOqFWDmzJkT22+/fURENG3aNBYvXhwREQceeGA89NBD6aYDAAAAAADIQdUKMJtvvnl8+umnERHRvXv3ePTRRyMi4oUXXoiCgoJ00wEAAAAAAOSgagWYQw45JKZPnx4REaeeemqcd955seWWW8bRRx8dxx57bNIBAQAAAAAAck396hw0adKk0v89fPjw+M53vhMzZ86MLbfcMg466KBkwwEAAAAAAOSiagWYb+vbt2/07ds3xVIAAAAAAAA5r9IB5oEHHqj0ogcffHC1hgEAAAAAANgQVDrADBkypFL75eXlRXFxcXXnAQAAAAAAyHmVDjAlJSU1OQcAAAAAAMAGI39dF1i2bFmKOQAAAAAAADYY1QowxcXFMX78+OjYsWM0bdo03n///YiIOO+88+KGG25IOiAAAAAAAECuqVaA+cUvfhE333xz/OpXv4qGDRuWbu/Zs2dcf/31yYYDAAAAAADIRdUKMLfeemtMmTIljjrqqKhXr17p9h133DHeeuutZMMBAAAAAADkomoFmI8//ji22GKLcttLSkpi5cqV6zwUAAAAAABALqtWgOnRo0c8/fTT5bZPnTo1dt5553UeCgAAAAAAIJfVr85B559/fowYMSI+/vjjKCkpiXvvvTfefvvtuPXWW+PBBx9MPSMAAAAAAEBOqdYZMN///vfjT3/6Uzz++OPRpEmTOP/88+PNN9+MP/3pT7HPPvuknhEAAAAAACCnVPkMmK+++iouuuiiOPbYY+Oxxx6riZkAAAAAAAByWpXPgKlfv3786le/iq+++qom5gEAAAAAAMh51boE2d577x1/+ctfUs8CAAAAAACwQajyJcgiIvbff/8YM2ZMvPrqq9GrV69o0qRJmccPPvjgJMMBAAAAAADkomoFmJNPPjkiIiZPnlzusby8vCguLl63qQAAAAAAAHJYtQJMSUlJ6jkAAAAAAAA2GFW+B8zKlSujfv368dprr9XEPAAAAAAAADmvygGmQYMG8Z3vfMdlxgAAAAAAAFajygEmIuLcc8+Nn/3sZ7Fw4cLU8wAAAAAAAOS8at0D5sorr4x33303OnToEJ07d44mTZqUefyll15KMhwAAAAAAEAuqlaAGTJkSOIxAAAAAAAANhzVCjBjx45NPQcAAAAAAMAGo1oBZpUXX3wx3nzzzYiI2G677WLnnXdOMhQAAAAAAEAuq1aAmTdvXhx++OExY8aMaNGiRURELFq0KL73ve/FnXfeGa1bt045IwAAAAAAQE7Jr85Bp556aixZsiRef/31WLhwYSxcuDBee+21KCoqitNOOy31jAAAAAAAADmlWmfATJs2LR5//PHYdtttS7f16NEjrrrqqth3332TDQcAAAAAAJCLqnUGTElJSTRo0KDc9gYNGkRJSck6DwUAAAAAAJDLqhVg9tprrzj99NPjk08+Kd328ccfx//93//F3nvvnWw4AAAAAACAXFStAHPllVdGUVFRdOnSJbp37x7du3ePrl27RlFRUVxxxRWpZwQAAAAAAMgp1boHTKdOneKll16Kxx9/PN56662IiNh2221j4MCBSYcDAAAAAADIRVU6A+aJJ56IHj16RFFRUeTl5cU+++wTp556apx66qmxyy67xHbbbRdPP/10Tc0KAAAAAACQE6oUYC677LI44YQTonnz5uUeKywsjB//+McxefLkZMMBAAAAAADkoioFmFdeeSX222+/1T6+7777xosvvrjOQwEAAAAAAOSyKgWYuXPnRoMGDVb7eP369WP+/PnrPBQAAAAAAEAuq1KA6dixY7z22murffyf//xntG/ffp2HAgAAAAAAyGVVCjAHHHBAnHfeebFs2bJyj3355ZcxduzYOPDAA5MNBwAAAAAAkIvqV2Xnn//853HvvffGVlttFaNGjYqtt946IiLeeuutuOqqq6K4uDjOPffcGhkUAAAAAAAgV1QpwLRt2zaeffbZOOmkk+Kcc86JLMsiIiIvLy8GDRoUV111VbRt27ZGBgUAAAAAAMgVVQowERGdO3eOhx9+OD7//PN49913I8uy2HLLLaNly5Y1MR8AAAAAAEDOqXKAWaVly5axyy67pJwFAAAAAABgg5Bf2wMAAAAAAABsaAQYAAAAAACAxAQYAAAAAACAxAQYAAAAAACAxAQYAAAAAACAxAQYAAAAAACAxAQYAAAAAACAxAQYAAAAAACAxHIuwFx11VXRpUuXaNSoUey6667x/PPPr3bf6667Lvr16xctW7aMli1bxsCBA9e4PwAAAAAAQAo5FWDuuuuuGD16dIwdOzZeeuml2HHHHWPQoEExb968CvefMWNGHHHEEfHkk0/GzJkzo1OnTrHvvvvGxx9/vJ4nBwAAAAAANiY5FWAmT54cJ5xwQowcOTJ69OgR1157bWyyySZx4403Vrj/HXfcESeffHLstNNOsc0228T1118fJSUlMX369PU8OQAAAAAAsDHJmQCzYsWKePHFF2PgwIGl2/Lz82PgwIExc+bMSq2xdOnSWLlyZbRq1Wq1+yxfvjyKiorKfAAAAAAAAFRFzgSYBQsWRHFxcbRt27bM9rZt28acOXMqtcZPf/rT6NChQ5mI820TJ06MwsLC0o9OnTqt09wAAAAAAMDGJ2cCzLqaNGlS3HnnnXHfffdFo0aNVrvfOeecE4sXLy79+Oijj9bjlAAAAAAAwIagfm0PUFmbbbZZ1KtXL+bOnVtm+9y5c6Ndu3ZrPPbiiy+OSZMmxeOPPx477LDDGvctKCiIgoKCdZ4XAAAAAADYeOXMGTANGzaMXr16xfTp00u3lZSUxPTp06Nv376rPe5Xv/pVjB8/PqZNmxa9e/deH6MCAAAAAAAbuZw5AyYiYvTo0TFixIjo3bt39OnTJy677LL44osvYuTIkRERcfTRR0fHjh1j4sSJERHxy1/+Ms4///z43e9+F126dCm9V0zTpk2jadOmtfY8AAAAAACADVtOBZjhw4fH/Pnz4/zzz485c+bETjvtFNOmTYu2bdtGRMSHH34Y+fn/PannmmuuiRUrVsTQoUPLrDN27Ni44IIL1ufoAAAAAADARiSnAkxExKhRo2LUqFEVPjZjxowyf549e3bNDwQAAAAAAPAtOXMPGAAAAAAAgFwhwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACRWv7YHAAAAACD3dBnz0DodP3vS4ESTAEDd5AwYAAAAAACAxAQYAAAAAACAxFyCDAAAAIANjkukAVDbnAEDAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQWP3aHgAAAAAAANaHLmMeWqfjZ08anGgSNgbOgAEAAAAAAEhMgAEAAAAAAEhMgAEAAAAAAEhMgAEAAAAAAEisfm0PAAAAAAAAuajLmIfW6fjZkwYnmoS6yBkwAAAAAAAAieXcGTBXXXVV/PrXv445c+bEjjvuGFdccUX06dNntfvffffdcd5558Xs2bNjyy23jF/+8pdxwAEHrMeJAQAAAABg7ZxRs2HJqQBz1113xejRo+Paa6+NXXfdNS677LIYNGhQvP3229GmTZty+z/77LNxxBFHxMSJE+PAAw+M3/3udzFkyJB46aWXomfPnrXwDAAAAAAAYP0QdGpXTl2CbPLkyXHCCSfEyJEjo0ePHnHttdfGJptsEjfeeGOF+19++eWx3377xdlnnx3bbrttjB8/Pv7nf/4nrrzyyvU8OQAAAAAAsDHJmQCzYsWKePHFF2PgwIGl2/Lz82PgwIExc+bMCo+ZOXNmmf0jIgYNGrTa/SMili9fHkVFRWU+AAAAAAAAqiIvy7KstoeojE8++SQ6duwYzz77bPTt27d0+09+8pP4y1/+Es8991y5Yxo2bBi33HJLHHHEEaXbrr766hg3blzMnTu3ws9zwQUXxLhx48ptX7x4cTRv3jzBMwE2JqlP86xr69XEmtbzNdnQ1quJNa1Xt9ariTWt52uyoa1XE2tar26tVxNrWq/uf01S29Dni6j73zfW8zXe0NaraE1IoaioKAoLC9faDXLmDJj15ZxzzonFixeXfnz00Ue1PRIAAAAAAJBj6tf2AJW12WabRb169cqduTJ37txo165dhce0a9euSvtHRBQUFERBQcG6DwwAAAAAAGy0cuYMmIYNG0avXr1i+vTppdtKSkpi+vTpZS5J9k19+/Yts39ExGOPPbba/QEAAAAAAFLImTNgIiJGjx4dI0aMiN69e0efPn3isssuiy+++CJGjhwZERFHH310dOzYMSZOnBgREaeffnoMGDAgLrnkkhg8eHDceeed8fe//z2mTJlSm08DAAAAAADYwOVUgBk+fHjMnz8/zj///JgzZ07stNNOMW3atGjbtm1ERHz44YeRn//fk3p22223+N3vfhc///nP42c/+1lsueWWcf/990fPnj1r6ykAAAAAAAAbgZwKMBERo0aNilGjRlX42IwZM8ptO+yww+Kwww6r4akAAAAAAAD+K2fuAQMAAAAAAJArBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDEBBgAAAAAAIDE6tf2AAAAAAAArH+zJw3eqNaD9c0ZMAAAAAAAAIk5AwYAAAAAIAc4IwRyiwADAAAAAFADBBPYuLkEGQAAAAAAQGLOgAEAAAAAco4bvgN1nTNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEqtf2wMAAAAAABs+N7kHNjbOgAEAAAAAAEjMGTAAAAAAQDnOWAFYN86AAQAAAAAASMwZMAAAAACwFjVxNkjqNZ2xAlC3OAMGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMfeAAQAAAKDWuX8JABsaZ8AAAAAAAAAkJsAAAAAAAAAkJsAAAAAAAAAkJsAAAAAAAAAkJsAAAAAAAAAkVr+2BwAAAACgrNmTBufEmgDA6gkwAAAAAOtI3AAAvs0lyAAAAAAAABITYAAAAAAAABJzCTIAAABgo+OSYQBATRNgAAAAgDpPMAEAco1LkAEAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACRWv7YHAAAAADY8sycNru0RAABqlQADAAAAGzmxBAAgPQEGAAAAviV1kKjr6wEAkJ4AAwAAQM4TJAAAqGsEGAAAANY7wQQAgA2dAAMAALCBcbkrAACoffm1PQAAAAAAAMCGRoABAAAAAABIzCXIAAAAqsglvgAAgLURYAAAgA2ewAEAAKxvLkEGAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQmAADAAAAAACQWP3aHgAAAOCbZk8aXNsjAAAArDNnwAAAAAAAACTmDBgAAGCdOGMFAACgPAEGAAA2MoIJAABAzRNgAACgjhNMAAAAco97wAAAAAAAACTmDBgAAEjMGSsAAAAIMAAA5JTUcUMsAQAAoCYIMAAAlCFwAAAAwLpzDxgAAAAAAIDEBBgAAAAAAIDEXIIMACDHucQXAAAA1D3OgAEAAAAAAEhMgAEAAAAAAEhMgAEAAAAAAEjMPWAAANYz92wBAACADZ8zYAAAAAAAABITYAAAAAAAABITYAAAAAAAABITYAAAAAAAABKrX9sDAADUZbMnDa7tEQAAAIAcJMAAABsUwQQAAACoC1yCDAAAAAAAIDFnwAAAtcoZKwAAAMCGyBkwAAAAAAAAiQkwAAAAAAAAiQkwAAAAAAAAiQkwAAAAAAAAiQkwAAAAAAAAiQkwAAAAAAAAidWv7QEAgNwye9Lg2h4BAAAAoM4TYABgAyeYAAAAAKx/AgwA1CFiCQAAAMCGQYABgHUgmAAAAABQkfzaHgAAAAAAAGBDI8AAAAAAAAAkJsAAAAAAAAAkJsAAAAAAAAAkVr+2BwCA9Wn2pMG1PQIAAAAAGwFnwAAAAAAAACQmwAAAAAAAACTmEmQA1GkuGQYAAABALnIGDAAAAAAAQGLOgAEgKWesAAAAAIAzYAAAAAAAAJJzBgzARszZKgAAAABQM5wBAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkJgAAwAAAAAAkFj92h4AgMqbPWlwbY8AAAAAAFSCM2AAAAAAAAASy5kzYBYuXBinnnpq/OlPf4r8/Pz4wQ9+EJdffnk0bdp0tfuPHTs2Hn300fjwww+jdevWMWTIkBg/fnwUFhau5+mBjZUzVgAAAABg45QzZ8AcddRR8frrr8djjz0WDz74YDz11FNx4oknrnb/Tz75JD755JO4+OKL47XXXoubb745pk2bFscdd9x6nBoAAAAAANgY5WVZltX2EGvz5ptvRo8ePeKFF16I3r17R0TEtGnT4oADDoh///vf0aFDh0qtc/fdd8cPf/jD+OKLL6J+/cqd/FNUVBSFhYWxePHiaN68ebWfAwAAAAAAkPsq2w1y4gyYmTNnRosWLUrjS0TEwIEDIz8/P5577rlKr7PqxVhTfFm+fHkUFRWV+QAAAAAAAKiKnAgwc+bMiTZt2pTZVr9+/WjVqlXMmTOnUmssWLAgxo8fv8bLlkVETJw4MQoLC0s/OnXqVO25AQAAAACAjVOtBpgxY8ZEXl7eGj/eeuutdf48RUVFMXjw4OjRo0dccMEFa9z3nHPOicWLF5d+fPTRR+v8+QEAAAAAgI1L5W6EUkPOPPPMOOaYY9a4T7du3aJdu3Yxb968Mtu/+uqrWLhwYbRr126Nxy9ZsiT222+/aNasWdx3333RoEGDNe5fUFAQBQUFlZofAAAAAACgIrUaYFq3bh2tW7de6359+/aNRYsWxYsvvhi9evWKiIgnnngiSkpKYtddd13tcUVFRTFo0KAoKCiIBx54IBo1apRsdgAAAAAAgNXJiXvAbLvttrHffvvFCSecEM8//3z89a9/jVGjRsXhhx8eHTp0iIiIjz/+OLbZZpt4/vnnI+Lr+LLvvvvGF198ETfccEMUFRXFnDlzYs6cOVFcXFybTwcAAAAAANjA1eoZMFVxxx13xKhRo2LvvfeO/Pz8+MEPfhC/+c1vSh9fuXJlvP3227F06dKIiHjppZfiueeei4iILbbYosxas2bNii5duqy32QEAAAAAgI1LXpZlWW0PUZcVFRVFYWFhLF68OJo3b17b4wAAAAAAALWost0gJy5BBgAAAAAAkEsEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMTq1/YAdV2WZRERUVRUVMuTAAAAAAAAtW1VL1jVD1ZHgFmLJUuWREREp06dankSAAAAAACgrliyZEkUFhau9vG8bG2JZiNXUlISn3zySTRr1izy8vJqe5ycUVRUFJ06dYqPPvoomjdvXufWq4k1rbfu6vqMG9t6NbGm9erWejWxpvXWXV2fcWNbrybWtF7dWq8m1rTeuqvrM25s69XEmtarW+vVxJrWW3d1fcaNbb2aWNN6dWu9mlhzY1tvY5JlWSxZsiQ6dOgQ+fmrv9OLM2DWIj8/PzbffPPaHiNnNW/ePOmbN/V6NbGm9eremtare2tar26tVxNrWq/urWm9urem9erWejWxpvXq3prWq3trWq9urVcTa1qv7q1pvbq3pvXq1no1sebGtt7GYk1nvqyy+jQDAAAAAABAtQgwAAAAAAAAiQkw1IiCgoIYO3ZsFBQU1Mn1amJN69W9Na1X99a0Xt1arybWtF7dW9N6dW9N69Wt9WpiTevVvTWtV/fWtF7dWq8m1rRe3VvTenVvTevVrfVqYs2NbT3Ky8uyLKvtIQAAAAAAADYkzoABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITICBRObOnRtz5syp7TFWa/ny5fHee+/F8uXLk605Y8aM+PLLL5OtVxcVFxfH3LlzY/78+bU9Sq3Jsqy2R4Ckvvrqq9oeIafNmjXLa1gH1cTP6pRrbozfN6m/Jqlfw43xa5JSLrx+5qM25Nrfn2ri77Qb09+fauJ97GdD3VPXf9/FuqmJ3xdSlgBDjXvzzTejW7duVTrmlVdeiQkTJsTVV18dCxYsKPNYUVFRHHvssZVea/vtt4/x48fHRx99VKUZVmfhwoUxdOjQ+M53vhMnnXRSFBcXx/HHHx/t27ePjh07xm677Raffvpplde9/vrrY8SIEXHTTTdFRMRdd90V2267bXTr1i3Gjh1bpbVuvvnmmDlzZkRELFu2LI477rho0qRJbLXVVtG0adP43//93yQ/WPfdd9+YPXt2tY5944034uSTT46dd9452rdvH+3bt4+dd945Tj755HjjjTeqtNa8efPK/Pnll1+OESNGxO677x5Dhw6NGTNmVHm+hx56KPr37x9NmjSJDh06RLt27aJFixbxox/9KD788MMqr7c27733Xuy1116V3v+ggw6K2267LdlfFpYvXx5nnXVW9O/fP375y19GRMSECROiadOm0axZszjyyCOjqKioSmsuWLAgfvWrX8UhhxwSffv2jb59+8YhhxwSv/71r6v1F7JPP/00br/99nj44YdjxYoVZR774osv4sILL6zSeqlfw4iIxx57LMaOHRtPPPFEREQ89dRTsf/++8dee+1V+t5OparfMzWx3iuvvBJHH310dOvWLRo3bhxNmjSJ7bffPs4777wqf79EpP+aTJs2LV599dWIiCgpKYnx48dHx44do6CgIDbffPOYNGnSOv0F+ZNPPomxY8fGUUcdFWeddVa89dZbVV4j9fd16vUqsvXWW8c777xT7eNTv09SrlcTPxdS/iysiZ/VNbFmRdb1+2aVFO+7lOutr9cvIt1rmGK91D//U/83w5qk+v/Pdf16pHzOdf3/72pivpr4b666/t9xqd93qf+boab//pT65/8q1f077cb296eaeB/XxJop3yc18XuGNant351F1Mzvu1L+riv17/ci0v5uKqLu/x15ff2+kG/JoIa9/PLLWX5+fqX3//Of/5w1bNgw22677bLvfOc72aabbpo98cQTpY/PmTOnSuvl5eVlm266aVavXr1s0KBB2dSpU7OVK1dW6Tl807HHHpv17Nkzu+KKK7IBAwZk3//+97Mddtghe+aZZ7Jnn30222WXXbKjjz66SmteeumlWZMmTbJDDz00a9++fTZhwoRs0003zSZMmJCNGzcua978/7V35tFRVFkcvtVJOjsJIEtYsmBYB4ctKptGMSjOoA6ggIiAbCMMMqIYEZBFBQQF2QRF1DACIjJuIDgIAsMioCYgspOAqCyKbEaGJCR3/vDQh4Ys3en3ut+r9/vO6XPsLvL5u3Xr3XRXpbsr8Ouvv+6xLykpibdu3crMzMOHD+fExET+4IMPeO/evfzRRx9xvXr1+KmnnvLY16xZs2JvlmVxw4YNXfc9ZeXKlex0Orlly5Y8duxYnjNnDs+ZM4fHjh3LrVu35tDQUP7ss8889jkcDj558iQzM2/evJlDQkI4NTWVn3rqKW7fvj0HBwfzhg0bPPb961//4ujoaH7yySd51KhRXL16dR4xYgTPnTuXU1NT+brrruMDBw547PMEb9eJZVkcHBzMMTEx/Oijj/LXX3/t0/9/2LBhXKNGDX7yySe5YcOGPHjwYI6Pj+eFCxfy4sWLOTk5mR977DGPfdu3b+eKFStyzZo1uXfv3pyens7p6encu3dvrlWrFleqVIm/+uorr3yxsbFcoUIFDg8P5+TkZP7uu+9c272dC8zi9+E777zDwcHB3Lx5c46KiuK3336bY2NjuX///ty3b192Op38/vvv+/T/uBJvjxnRvs8++4zD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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "names, correlations = pipe2.features.correlations(target_num=TARGET_NUM)\n", "\n", "plt.subplots(figsize=(20, 10))\n", "\n", "plt.bar(names, correlations)\n", "\n", "plt.title('Feature correlations with class label ' + class_label[TARGET_NUM])\n", "plt.xlabel('Features')\n", "plt.ylabel('Correlations')\n", "plt.xticks(rotation='vertical')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Feature importances__\n", " \n", "Feature importances are calculated by analyzing the improvement in predictive accuracy on each node of the trees in the XGBoost predictor. They are then normalized, so that all importances add up to 100%." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABl4AAAOkCAYAAADHhknPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACkgElEQVR4nOzdeZxXdaH/8ffMCAOijAsyCHFlTdzxQpKKYkqi4V7uN5RSuy55E5ereQXREjFTTE1ulkva4pJ5c0O9k9wyScslS8stSFHZTEAhoWbO749+fHNkUBiOjsTz+Xicx4M5388538853y/zBy/OOVVFURQBAAAAAABgtVW39QQAAAAAAAD+WQgvAAAAAAAAJRFeAAAAAAAASiK8AAAAAAAAlER4AQAAAAAAKInwAgAAAAAAUBLhBQAAAAAAoCTCCwAAAAAAQEmEFwAAAAAAgJIILwAA8C6uu+66VFVVZcaMGW09FVbBlClTMnDgwHTo0CFVVVWZP39+m85n6tSpqaqqytSpU9t0Hu+02267Zbfddlvl7WbMmJGqqqpcfPHFpc3lw3qOaK6qqirnnntuW08DAOBDTXgBAKCZZaGhpeXMM898X97zoYceyrnnntvm/zj+z2jx4sU599xz16p/zH7ttddyyCGHpGPHjrnyyitzww03pFOnTm09LUr2wgsv5Atf+EL69OmTDh06pHPnztl5551z2WWX5S9/+UtbT+9dtfR7tmvXrvnEJz6Re+65p62nBwDAalqnrScAAMCH03nnnZfevXs3W7f11lu/L+/10EMPZfz48Tn66KOzwQYbvC/v0Vqf/exnc9hhh6W2tratp9Iqixcvzvjx45OkVVc2rIl+9atf5Y033sj555+f4cOHt/V0eB/cddddOfjgg1NbW5tRo0Zl6623ztKlS/Pggw/m9NNPz1NPPZVvfetbbT3N97Ts92xRFJk9e3auu+66fOpTn8odd9yRffbZp62nBwBAKwkvAAC0aO+9987gwYPbehqrZdGiRat9pUNNTU1qampKmtEHp6mpKUuXLm3rabSJOXPmJEmpEa+M7xLlmD59eg477LBsttlm+elPf5pNN9208tqJJ56Y559/PnfddVcbznDlvfP37Oc///nU19fnBz/4gfACALAGc6sxAABa5Z577skuu+ySTp06Zf3118/IkSPz1FNPNRvz5JNP5uijj67cCqhbt2753Oc+l9dee60y5txzz83pp5+eJOndu3fltjszZsyoPEfiuuuuW+793/mcgXPPPTdVVVV5+umnc8QRR2TDDTfM0KFDK6/feOONGTRoUDp27JiNNtoohx12WF566aX3PM6WnvHSq1ev7LPPPpk6dWoGDx6cjh07Zptttqnczuu2227LNttskw4dOmTQoEF5/PHHm+3z6KOPznrrrZc//vGPGTFiRDp16pTu3bvnvPPOS1EUzcYuWrQop556anr27Jna2tpsvvnmufjii5cbV1VVlZNOOinf+973stVWW6W2tjaTJ0/OJptskiQZP3585dwuO28r8/m8/dw+//zzlauS6urqMnr06CxevHi5c3bjjTdmhx12yLrrrpsNN9wwu+66a+67775mY1bm+zNr1qyMHj06H/nIR1JbW5tNN900+++//7s+b2e33XbLUUcdlST52Mc+lqqqqhx99NGV12+55ZbK96BLly75t3/7t7z88sstfj4vvPBCPvWpT2X99dfPkUceucL3TJKXX345n//859O9e/fU1tamd+/eOf744981fv385z/PwQcfnH/5l39JbW1tevbsmVNOOWW522StzHn49a9/nREjRqRLly7p2LFjevfunc997nPvOueWLF26NGPHjs2gQYNSV1eXTp06ZZdddskDDzywwm0uvfTSbLbZZunYsWOGDRuW3/3ud8uN+cMf/pDPfOYz2WijjdKhQ4cMHjw4P/nJT1Z5fkly0UUX5c0338x3vvOdZtFlmX79+uU//uM/Kj9fe+212X333dO1a9fU1tZmyy23zFVXXbXcditzDpuamjJp0qRstdVW6dChQ+rr6/OFL3whr7/+equO5Z022GCDdOzYMeus0/z/SF588cXZaaedsvHGG6djx44ZNGhQbr311uW2v//++zN06NBssMEGWW+99bL55pvny1/+crMxS5Ysybhx49KvX7/K9+6MM87IkiVLlht3yimnZJNNNsn666+f/fbbLzNnzizlOAEA/tm54gUAgBYtWLAg8+bNa7auS5cuSZIbbrghRx11VEaMGJGJEydm8eLFueqqqzJ06NA8/vjj6dWrV5K//yPgH//4x4wePTrdunWr3P7nqaeeyi9/+ctUVVXloIMOyrPPPpsf/OAHufTSSyvvsckmm2Tu3LmrPO+DDz44/fv3zwUXXFCJE1/96ldzzjnn5JBDDskxxxyTuXPn5vLLL8+uu+6axx9/vFVXRjz//PM54ogj8oUvfCH/9m//losvvjj77rtvJk+enC9/+cs54YQTkiQTJkzIIYcckmeeeSbV1f/4f0+NjY3Za6+98vGPfzwXXXRRpkyZknHjxuVvf/tbzjvvvCRJURTZb7/98sADD+Tzn/98Bg4cmHvvvTenn356Xn755Vx66aXN5vTTn/40N998c0466aR06dIl2223Xa666qocf/zxOfDAA3PQQQclSbbddtskK/f5vN0hhxyS3r17Z8KECXnsscfy7W9/O127ds3EiRMrY8aPH59zzz03O+20U84777y0b98+Dz/8cH76059mzz33TLLy359Pf/rTeeqpp/LFL34xvXr1ypw5c3L//ffnxRdfrIx5p7PPPjubb755vvWtb1Vu49S3b98kf49oo0ePzsc+9rFMmDAhs2fPzmWXXZZf/OIXy30P/va3v2XEiBEZOnRoLr744qy77ror/C688sor2WGHHTJ//vwcd9xxGTBgQF5++eXceuutWbx4cdq3b9/idrfccksWL16c448/PhtvvHEeeeSRXH755Zk5c2ZuueWWyrj3Og9z5szJnnvumU022SRnnnlmNthgg8yYMSO33XbbCue8IgsXLsy3v/3tHH744Tn22GPzxhtv5Dvf+U5GjBiRRx55JAMHDmw2/rvf/W7eeOONnHjiiXnrrbdy2WWXZffdd89vf/vb1NfXJ0meeuqp7LzzzunRo0fOPPPMdOrUKTfffHMOOOCA/OhHP8qBBx64SnO844470qdPn+y0004rNf6qq67KVlttlf322y/rrLNO7rjjjpxwwglpamrKiSeemCQrfQ6/8IUvVL5HJ598cqZPn54rrrgijz/+eH7xi1+kXbt2q3Qsy37PFkWROXPm5PLLL8+bb76Zf/u3f2s27rLLLst+++2XI488MkuXLs0Pf/jDHHzwwbnzzjszcuTIJH8/z/vss0+23XbbnHfeeamtrc3zzz+fX/ziF5X9NDU1Zb/99suDDz6Y4447LltssUV++9vf5tJLL82zzz6b22+/vTL2mGOOyY033pgjjjgiO+20U376059W3gsAgPdQAADA21x77bVFkhaXoiiKN954o9hggw2KY489ttl2s2bNKurq6pqtX7x48XL7/8EPflAkKX72s59V1n3ta18rkhTTp09vNnb69OlFkuLaa69dbj9JinHjxlV+HjduXJGkOPzww5uNmzFjRlFTU1N89atfbbb+t7/9bbHOOusst35F5+Ptc9tss82KJMVDDz1UWXfvvfcWSYqOHTsWf/rTnyrr//u//7tIUjzwwAOVdUcddVSRpPjiF79YWdfU1FSMHDmyaN++fTF37tyiKIri9ttvL5IUX/nKV5rN6TOf+UxRVVVVPP/8883OR3V1dfHUU081Gzt37tzlztUyK/v5LDu3n/vc55qNPfDAA4uNN9648vNzzz1XVFdXFwceeGDR2NjYbGxTU1NRFCv//Xn99deLJMXXvva15eb4XpZ9Zr/61a8q65YuXVp07dq12HrrrYu//OUvlfV33nlnkaQYO3ZsZd2yz+fMM89cqfcbNWpUUV1d3ez9lll23A888MBy34OWzv+ECROKqqqqyndoZc7Dj3/84+WOd2UNGzasGDZsWOXnv/3tb8WSJUuajXn99deL+vr6Zp//sr+bHTt2LGbOnFlZ//DDDxdJilNOOaWybo899ii22Wab4q233qqsa2pqKnbaaaeif//+lXUtnaN3WrBgQZGk2H///Vf6GFs6zyNGjCj69OlT+XllzuHPf/7zIknxve99r9n6KVOmtLj+3azo92xtbW1x3XXXvecxLF26tNh6662L3XffvbLu0ksvLZJUfn+05IYbbiiqq6uLn//8583WT548uUhS/OIXvyiKoiieeOKJIklxwgknNBt3xBFHrPD3CQAA/+BWYwAAtOjKK6/M/fff32xJ/n6VxPz583P44Ydn3rx5laWmpiZDhgxpdkuijh07Vv781ltvZd68efn4xz+eJHnsscfel3n/+7//e7Ofb7vttjQ1NeWQQw5pNt9u3bqlf//+73oLpXez5ZZbZscdd6z8PGTIkCTJ7rvvnn/5l39Zbv0f//jH5fZx0kknVf687FZhS5cuzf/+7/8mSe6+++7U1NTk5JNPbrbdqaeemqIocs899zRbP2zYsGy55ZYrfQyr+vm889zusssuee2117Jw4cIkye23356mpqaMHTu22dU9y44vWfnvT8eOHdO+fftMnTq1lNs4/frXv86cOXNywgknpEOHDpX1I0eOzIABA1p8Jsjxxx//nvttamrK7bffnn333bfFZyK986qht3v7+V+0aFHmzZuXnXbaKUVRVG5PtzLnYdmVOnfeeWf++te/vuec301NTU3lCp2mpqb8+c9/zt/+9rcMHjy4xe/EAQcckB49elR+3mGHHTJkyJDcfffdSZI///nP+elPf5pDDjkkb7zxRuXzfu211zJixIg899xzy93q7d0s+66tv/76K73N28/zsitMhg0blj/+8Y9ZsGBBkpU7h7fcckvq6uryyU9+stl3d9CgQVlvvfVa9bvk7b9nb7zxxnziE5/IMcccs9yVNm8/htdffz0LFizILrvs0uwzWXYM//M//5OmpqYVHsMWW2yRAQMGNDuG3XffPUkqx7Ds83vn754vfelLq3yMAABrI7caAwCgRTvssEOL/5D83HPPJUnlH+reqXPnzpU///nPf8748ePzwx/+sPLA82WW/YNn2Xr37t3s5+eeey5FUaR///4tjl/VWwMt8/a4kiR1dXVJkp49e7a4/p3/aF5dXZ0+ffo0W/fRj340SSrP7vjTn/6U7t27L/ePzFtssUXl9bd757G/l1X9fN55zBtuuGGSvx9b586d88ILL6S6uvpd48/Kfn9qa2szceLEnHrqqamvr8/HP/7x7LPPPhk1alS6deu28gf5/y07V5tvvvlyrw0YMCAPPvhgs3XrrLNOPvKRj7znfufOnZuFCxdm6623XuU5vfjiixk7dmx+8pOfLPf9WHb+V+Y8DBs2LJ/+9Kczfvz4XHrppdltt91ywAEH5Igjjkhtbe0qz+v666/P17/+9fzhD39oFiFa+n619Pfqox/9aG6++eYkf78lX1EUOeecc3LOOee0+H5z5sxpFm/ezbLvxxtvvLFS45PkF7/4RcaNG5dp06Yt90yiBQsWpK6ubqXO4XPPPZcFCxaka9euKzyOVfXO37OHH354tt9++5x00knZZ599KhHszjvvzFe+8pU88cQTzZ7F8vawd+ihh+bb3/52jjnmmJx55pnZY489ctBBB+Uzn/lMJYQ+99xz+f3vf1959tOKjuFPf/pTqqurK7fpW6alvz8AACxPeAEAYJUs+5/UN9xwQ4v/AP72h0Ifcsgheeihh3L66adn4MCBWW+99dLU1JS99tprhf8j++1WdLVAY2PjCrd5+/8MXzbfqqqq3HPPPampqVlu/Hrrrfee82hJS/t6t/XF/3/ezPvpncf+Xlb18ynj2Fbl+/OlL30p++67b26//fbce++9OeecczJhwoT89Kc/zfbbb7/S79katbW1y121U6bGxsZ88pOfzJ///Of853/+ZwYMGJBOnTrl5ZdfztFHH93s/L/Xeaiqqsqtt96aX/7yl7njjjty77335nOf+1y+/vWv55e//OUqfcdvvPHGHH300TnggANy+umnp2vXrqmpqcmECRPywgsvrPJxLjuO0047LSNGjGhxTL9+/VZ6f507d0737t3zu9/9bqXGv/DCC9ljjz0yYMCAXHLJJenZs2fat2+fu+++O5deemllfitzDpuamtK1a9d873vfa/G9VhQzVkV1dXU+8YlP5LLLLstzzz2XrbbaKj//+c+z3377Zdddd803v/nNbLrppmnXrl2uvfbafP/7369s27Fjx/zsZz/LAw88kLvuuitTpkzJTTfdlN133z333Xdfampq0tTUlG222SaXXHJJi+//znAMAEDrCC8AAKySZf8DumvXrhk+fPgKx73++utpaGjI+PHjM3bs2Mr6ZVc8vN2KAsuyKyrmz5/fbP07r/R4r/kWRZHevXtXrij5MGhqasof//jHZnN69tlnk6Ty4PjNNtss//u//5s33nij2VUvf/jDHyqvv5cVndtV+XxWVt++fdPU1JSnn356uYewv31M8t7fn7ePP/XUU3Pqqafmueeey8CBA/P1r389N9544yrNbdm5euaZZ5a72uaZZ55ZqXPZkk022SSdO3de6RCwzG9/+9s8++yzuf766zNq1KjK+mW39HunlTkPH//4x/Pxj388X/3qV/P9738/Rx55ZH74wx/mmGOOWel53XrrrenTp09uu+22Zt+dcePGtTi+pe/Ls88+W/kOL7uqq127div1ea+MffbZJ9/61rcybdq0Zrf7a8kdd9yRJUuW5Cc/+UmzK7ZWdFuwdzuHffv2zf/+7/9m5513XuXIuSr+9re/JUnefPPNJMmPfvSjdOjQIffee2+zK5iuvfba5batrq7OHnvskT322COXXHJJLrjggpx99tl54IEHMnz48PTt2ze/+c1vsscee7zrbfA222yzNDU15YUXXmh2lcszzzxT1mECAPxT84wXAABWyYgRI9K5c+dccMEFLT4LYe7cuUn+cXXEO6+GmDRp0nLbdOrUKcnygaVz587p0qVLfvaznzVb/81vfnOl53vQQQelpqYm48ePX24uRVHktddeW+l9le2KK65oNpcrrrgi7dq1yx577JEk+dSnPpXGxsZm45Lk0ksvTVVVVfbee+/3fI911103yfLndlU+n5V1wAEHpLq6Ouedd95yV8wse5+V/f4sXrw4b731VrPX+vbtm/XXX7/ZrZZW1uDBg9O1a9dMnjy52fb33HNPfv/732fkyJGrvM/k7//QfcABB+SOO+7Ir3/96+VeX9HVQC2d/6IoctlllzUbtzLn4fXXX1/ufZaFr1U9Vy3N6+GHH860adNaHH/77bc3e0bLI488kocffrjy3ezatWt22223/Pd//3deffXV5bZf9nmvijPOOCOdOnXKMccck9mzZy/3+gsvvFA5jy0dz4IFC5aLFitzDg855JA0Njbm/PPPX+49//a3vy33d6w1/vrXv+a+++5L+/btK7cUrKmpSVVVVbMr/WbMmJHbb7+92bZ//vOfl9tfS8fw8ssv5+qrr15u7F/+8pcsWrQoSSqf3ze+8Y1mY1bn9wMAwNrEFS8AAKySzp0756qrrspnP/vZ/Ou//msOO+ywbLLJJnnxxRdz1113Zeedd84VV1yRzp07Z9ddd81FF12Uv/71r+nRo0fuu+++TJ8+fbl9Dho0KEly9tln57DDDku7du2y7777Vv5x9cILL8wxxxyTwYMH52c/+1nlypCV0bdv33zlK1/JWWedlRkzZuSAAw7I+uuvn+nTp+fHP/5xjjvuuJx22mmlnZ+V1aFDh0yZMiVHHXVUhgwZknvuuSd33XVXvvzlL1duWbTvvvvmE5/4RM4+++zMmDEj2223Xe677778z//8T770pS8t9/yFlnTs2DFbbrllbrrppnz0ox/NRhttlK233jpbb731Sn8+K6tfv345++yzc/7552eXXXbJQQcdlNra2vzqV79K9+7dM2HChJX+/jz77LPZY489csghh2TLLbfMOuuskx//+MeZPXt2DjvssFWeW7t27TJx4sSMHj06w4YNy+GHH57Zs2fnsssuS69evXLKKae0+rgvuOCC3HfffRk2bFiOO+64bLHFFnn11Vdzyy235MEHH6w89PztBgwYkL59++a0007Lyy+/nM6dO+dHP/rRcs96WZnzcP311+eb3/xmDjzwwPTt2zdvvPFGrr766nTu3Dmf+tSnVulY9tlnn9x222058MADM3LkyEyfPj2TJ0/OlltuWbkC4+369euXoUOH5vjjj8+SJUsyadKkbLzxxjnjjDMqY6688soMHTo022yzTY499tj06dMns2fPzrRp0zJz5sz85je/WaU59u3bN9///vdz6KGHZosttsioUaOy9dZbZ+nSpXnooYdyyy235Oijj06S7Lnnnmnfvn323XfffOELX8ibb76Zq6++Ol27dm0WglbmHA4bNixf+MIXMmHChDzxxBPZc889065duzz33HO55ZZbctlll+Uzn/nMKh3LPffcU7mCbc6cOfn+97+f5557LmeeeWbleTYjR47MJZdckr322itHHHFE5syZkyuvvDL9+vXLk08+WdnXeeedl5/97GcZOXJkNttss8yZMyff/OY385GPfCRDhw5Nknz2s5/NzTffnH//93/PAw88kJ133jmNjY35wx/+kJtvvjn33ntvBg8enIEDB+bwww/PN7/5zSxYsCA77bRTGhoa8vzzz6/S8QEArLUKAAB4m2uvvbZIUvzqV79613EPPPBAMWLEiKKurq7o0KFD0bdv3+Loo48ufv3rX1fGzJw5szjwwAOLDTbYoKirqysOPvjg4pVXXimSFOPGjWu2v/PPP7/o0aNHUV1dXSQppk+fXhRFUSxevLj4/Oc/X9TV1RXrr79+ccghhxRz5sxZbh/jxo0rkhRz585tcb4/+tGPiqFDhxadOnUqOnXqVAwYMKA48cQTi2eeeWalzsey+RRFUWy22WbFyJEjlxubpDjxxBObrZs+fXqRpPja175WWXfUUUcVnTp1Kl544YVizz33LNZdd92ivr6+GDduXNHY2Nhs+zfeeKM45ZRTiu7duxft2rUr+vfvX3zta18rmpqa3vO9l3nooYeKQYMGFe3bt2923lb281nRuW3p3BRFUVxzzTXF9ttvX9TW1hYbbrhhMWzYsOL+++9vNua9vj/z5s0rTjzxxGLAgAFFp06dirq6umLIkCHFzTff3OIxtjSvlr7DN910U2VuG220UXHkkUcWM2fObDZm2eezKv70pz8Vo0aNKjbZZJOitra26NOnT3HiiScWS5YsqRxvkuKBBx6obPP0008Xw4cPL9Zbb72iS5cuxbHHHlv85je/KZIU11577Uqfh8cee6w4/PDDi3/5l38pamtri65duxb77LNPs7+LKzJs2LBi2LBhlZ+bmpqKCy64oNhss82K2traYvvtty/uvPPO4qijjio222yzyri3f6+//vWvFz179ixqa2uLXXbZpfjNb36z3Pu88MILxahRo4pu3boV7dq1K3r06FHss88+xa233loZ09I5ejfPPvtsceyxxxa9evUq2rdvX6y//vrFzjvvXFx++eXFW2+9VRn3k5/8pNh2222LDh06FL169SomTpxYXHPNNc2+u6tyDr/1rW8VgwYNKjp27Fisv/76xTbbbFOcccYZxSuvvLJS8y6Kf3xH37506NChGDhwYHHVVVct9/f7O9/5TtG/f/+itra2GDBgQHHttddW/l4u09DQUOy///5F9+7di/bt2xfdu3cvDj/88OLZZ59ttq+lS5cWEydOLLbaaqvK39FBgwYV48ePLxYsWFAZ95e//KU4+eSTi4033rjo1KlTse+++xYvvfRSi7+/AQBorqooPoCnfAIAABVHH310br311havIAAAAGDN5hkvAAAAAAAAJfGMFwAAACjBm2+++Z5Xsm2yySapqan5gGYEAEBbEF4AAACgBBdffHHGjx//rmOmT5+eXr16fTATAgCgTXjGCwAAAJTgj3/8Y/74xz++65ihQ4emQ4cOH9CMAABoC8ILAAAAAABASarbegIAAAAAAAD/LDzjpQVNTU155ZVXsv7666eqqqqtpwMAAAAAALShoijyxhtvpHv37qmufvdrWoSXFrzyyivp2bNnW08DAAAAAAD4EHnppZfykY985F3HCC8tWH/99ZP8/QR27ty5jWcDAAAAAAC0pYULF6Znz56VfvBuhJcWLLu9WOfOnYUXAAAAAAAgSVbq8STvfiMyAAAAAAAAVprwAgAAAAAAUBLhBQAAAAAAoCTCCwAAAAAAQEmEFwAAAAAAgJIILwAAAAAAACURXgAAAAAAAEoivAAAAAAAAJREeAEAAAAAACiJ8AIAAAAAAFAS4QUAAAAAAKAkwgsAAAAAAEBJhBcAAAAAAICSCC8AAAAAAAAlEV4AAAAAAABKIrwAAAAAAACURHgBAAAAAAAoifACAAAAAABQEuEFAAAAAACgJMILAAAAAABASYQXAAAAAACAkggvAAAAAAAAJRFeAAAAAAAASiK8AAAAAAAAlER4AQAAAAAAKInwAgAAAAAAUBLhBQAAAAAAoCTCCwAAAAAAQEmEFwAAAAAAgJIILwAAAAAAACURXgAAAAAAAEoivAAAAAAAAJREeAEAAAAAACiJ8AIAAAAAAFCSddp6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CsfedtttGTx4cDbYYIN06tQpAwcOzA033NBszNFHH52qqqpmy1577fV+HwYAAAAAALCWW6etJ3DTTTdlzJgxmTx5coYMGZJJkyZlxIgReeaZZ9K1a9flxm+00UY5++yzM2DAgLRv3z533nlnRo8ena5du2bEiBGVcXvttVeuvfbays+1tbUfyPEAAAAAAABrrza/4uWSSy7Jsccem9GjR2fLLbfM5MmTs+666+aaa65pcfxuu+2WAw88MFtssUX69u2b//iP/8i2226bBx98sNm42tradOvWrbJsuOGGH8ThAAAAAAAAa7E2DS9Lly7No48+muHDh1fWVVdXZ/jw4Zk2bdp7bl8URRoaGvLMM89k1113bfba1KlT07Vr12y++eY5/vjj89prr61wP0uWLMnChQubLQAAAAAAAKuqTW81Nm/evDQ2Nqa+vr7Z+vr6+vzhD39Y4XYLFixIjx49smTJktTU1OSb3/xmPvnJT1Ze32uvvXLQQQeld+/eeeGFF/LlL385e++9d6ZNm5aamprl9jdhwoSMHz++vAMDAAAAAADWSm3+jJfWWH/99fPEE0/kzTffTENDQ8aMGZM+ffpkt912S5IcdthhlbHbbLNNtt122/Tt2zdTp07NHnvssdz+zjrrrIwZM6by88KFC9OzZ8/3/TgAAAAAAIB/Lm0aXrp06ZKamprMnj272frZs2enW7duK9yuuro6/fr1S5IMHDgwv//97zNhwoRKeHmnPn36pEuXLnn++edbDC+1tbWpra1t/YEAAAAAAACkjZ/x0r59+wwaNCgNDQ2VdU1NTWloaMiOO+640vtpamrKkiVLVvj6zJkz89prr2XTTTddrfkCAAAAAAC8mza/1diYMWNy1FFHZfDgwdlhhx0yadKkLFq0KKNHj06SjBo1Kj169MiECROS/P15LIMHD07fvn2zZMmS3H333bnhhhty1VVXJUnefPPNjB8/Pp/+9KfTrVu3vPDCCznjjDPSr1+/jBgxos2OEwAAAAAA+OfX5uHl0EMPzdy5czN27NjMmjUrAwcOzJQpU1JfX58kefHFF1Nd/Y8LcxYtWpQTTjghM2fOTMeOHTNgwIDceOONOfTQQ5MkNTU1efLJJ3P99ddn/vz56d69e/bcc8+cf/75bicGAAAAAAC8r6qKoijaehIfNgsXLkxdXV0WLFiQzp07t/V0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smRJFi5c2GwBAAAAAABYVW0aXubNm5fGxsbU19c3W19fX59Zs2at1D7+8z//M927d28Wb/baa69897vfTUNDQyZOnJj/+7//y957753GxsYW9zFhwoTU1dVVlp49e7b+oAAAAAAAgLXWOm09gdVx4YUX5oc//GGmTp2aDh06VNYfdthhlT9vs8022XbbbdO3b99MnTo1e+yxx3L7OeusszJmzJjKzwsXLhRfAAAAAACAVdamV7x06dIlNTU1mT17drP1s2fPTrdu3d5124svvjgXXnhh7rvvvmy77bbvOrZPnz7p0qVLnn/++RZfr62tTefOnZstAAAAAAAAq6pNw0v79u0zaNCgNDQ0VNY1NTWloaEhO+644wq3u+iii3L++ednypQpGTx48Hu+z8yZM/Paa69l0003LWXeAAAAAAAALWnT8JIkY8aMydVXX53rr78+v//973P88cdn0aJFGT16dJJk1KhROeussyrjJ06cmHPOOSfXXHNNevXqlVmzZmXWrFl58803kyRvvvlmTj/99Pzyl7/MjBkz0tDQkP333z/9+vXLiBEj2uQYAQAAAACAtUObP+Pl0EMPzdy5czN27NjMmjUrAwcOzJQpU1JfX58kefHFF1Nd/Y8+dNVVV2Xp0qX5zGc+02w/48aNy7nnnpuampo8+eSTuf766zN//vx07949e+65Z84///zU1tZ+oMcGAAAAAACsXaqKoijaehIfNgsXLkxdXV0WLFjgeS/v0OvMu1Z7HzMuHFnCTAAAAAAA4IOxKt2gzW81BgAAAAAA8M9CeAEAAAAAACiJ8AIAAAAAAFAS4QUAAAAAAKAkwgsAAAAAAEBJhBcAAAAAAICSCC8AAAAAAAAlEV4AAAAAAABKIrwAAAAAAACURHgBAAAAAAAoSWnhZf78+WXtCgAAAAAAYI3UqvAyceLE3HTTTZWfDznkkGy88cbp0aNHfvOb35Q2OQAAAAAAgDVJq8LL5MmT07NnzyTJ/fffn/vvvz/33HNP9t5775x++umlThAAAAAAAGBNsU5rNpo1a1YlvNx555055JBDsueee6ZXr14ZMmRIqRMEAAAAAABYU7TqipcNN9wwL730UpJkypQpGT58eJKkKIo0NjaWNzsAAAAAAIA1SKuueDnooINyxBFHpH///nnttdey9957J0kef/zx9OvXr9QJAgAAAAAArClaFV4uvfTS9OrVKy+99FIuuuiirLfeekmSV199NSeccEKpEwQAAAAAAFhTtCq8tGvXLqeddtpy60855ZTVnhAAAAAAAMCaqlXPeEmSG264IUOHDk337t3zpz/9KUkyadKk/M///E9pkwMAAAAAAFiTtCq8XHXVVRkzZkz23nvvzJ8/P42NjUmSDTbYIJMmTSpzfgAAAAAAAGuMVoWXyy+/PFdffXXOPvvs1NTUVNYPHjw4v/3tb0ubHAAAAAAAwJqkVeFl+vTp2X777ZdbX1tbm0WLFq32pAAAAAAAANZErQovvXv3zhNPPLHc+ilTpmSLLbZY3TkBAAAAAACskdZpzUZjxozJiSeemLfeeitFUeSRRx7JD37wg0yYMCHf/va3y54jAAAAAADAGqFV4eWYY45Jx44d81//9V9ZvHhxjjjiiHTv3j2XXXZZDjvssLLnCAAAAAAAsEZoVXhJkiOPPDJHHnlkFi9enDfffDNdu3Ytc14AAAAAAABrnFaFl+nTp+dvf/tb+vfvn3XXXTfrrrtukuS5555Lu3bt0qtXrzLnCAAAAAAAsEaobs1GRx99dB566KHl1j/88MM5+uijV3dOAAAAAAAAa6RWhZfHH388O++883LrP/7xj+eJJ55Y3TkBAAAAAACskVoVXqqqqvLGG28st37BggVpbGxc7UkBAAAAAACsiVoVXnbddddMmDChWWRpbGzMhAkTMnTo0NImBwAAAAAAsCZZpzUbTZw4Mbvuums233zz7LLLLkmSn//851m4cGF++tOfljpBAAAAAACANUWrrnjZcsst8+STT+aQQw7JnDlz8sYbb2TUqFH5wx/+kK233rrsOQIAAAAAAKwRWnXFS5J07949F1xwQZlzAQAAAAAAWKO1OrzMnz8/jzzySObMmZOmpqZmr40aNWq1JwYAAAAAALCmaVV4ueOOO3LkkUfmzTffTOfOnVNVVVV5raqqSngBAAAAAADWSq16xsupp56az33uc3nzzTczf/78vP7665Xlz3/+c9lzBAAAAAAAWCO0Kry8/PLLOfnkk7PuuuuWPR8AAAAAAIA1VqvCy4gRI/LrX/+67LkAAAAAAACs0Vr1jJeRI0fm9NNPz9NPP51tttkm7dq1a/b6fvvtV8rkAAAAAAAA1iStCi/HHntskuS8885b7rWqqqo0Njau3qwAAAAAAADWQK0KL01NTWXPAwAAAAAAYI3Xqme8AAAAAAAAsLxWXfGSJIsWLcr//d//5cUXX8zSpUubvXbyySev9sQAAAAAAADWNK0KL48//ng+9alPZfHixVm0aFE22mijzJs3L+uuu266du0qvAAAAAAAAGulVt1q7JRTTsm+++6b119/PR07dswvf/nL/OlPf8qgQYNy8cUXlz1HAAAAAACANUKrwssTTzyRU089NdXV1ampqcmSJUvSs2fPXHTRRfnyl79c9hwBAAAAAADWCK0KL+3atUt19d837dq1a1588cUkSV1dXV566aXyZgcAAAAAALAGadUzXrbffvv86le/Sv/+/TNs2LCMHTs28+bNyw033JCtt9667DkCAAAAAACsEVp1xcsFF1yQTTfdNEny1a9+NRtuuGGOP/74zJ07N//93/9d6gQBAAAAAADWFK264mXw4MGVP3ft2jVTpkwpbUIAAAAAAABrqlZd8bL77rtn/vz5y61fuHBhdt9999WdEwAAAAAAwBqpVeFl6tSpWbp06XLr33rrrfz85z9f7UkBAAAAAACsiVbpVmNPPvlk5c9PP/10Zs2aVfm5sbExU6ZMSY8ePcqbHQAAAAAAwBpklcLLwIEDU1VVlaqqqhZvKdaxY8dcfvnlpU0OAAAAAABgTbJK4WX69OkpiiJ9+vTJI488kk022aTyWvv27dO1a9fU1NSUPkkAAAAAAIA1wSqFl8022yx//etfc9RRR2XjjTfOZptt9n7NCwAAAAAAYI1TvaobtGvXLj/+8Y/fj7kAAAAAAACs0VY5vCTJ/vvvn9tvv73kqQAAAAAAAKzZVulWY8v0798/5513Xn7xi19k0KBB6dSpU7PXTz755FImBwAAAAAAsCZpVXj5zne+kw022CCPPvpoHn300WavVVVVCS8AAAAAAMBaqVXhZfr06WXPAwAAAAAAYI3Xqme8vF1RFCmKooy5AAAAAAAArNFaHV6++93vZptttknHjh3TsWPHbLvttrnhhhvKnBsAAAAAAMAapVW3Grvkkktyzjnn5KSTTsrOO++cJHnwwQfz7//+75k3b15OOeWUUicJAAAAAACwJmhVeLn88stz1VVXZdSoUZV1++23X7baaquce+65wgsAAAAAALBWatWtxl599dXstNNOy63faaed8uqrr672pAAAAAAAANZErQov/fr1y80337zc+ptuuin9+/df7UkBAAAAAACsiVp1q7Hx48fn0EMPzc9+9rPKM15+8YtfpKGhocUgAwAAAAAAsDZo1RUvn/70p/Pwww+nS5cuuf3223P77benS5cueeSRR3LggQeWPUcAAAAAAIA1QquueEmSQYMG5cYbbyxzLgAAAAAAAGu0VoeXxsbG/PjHP87vf//7JMmWW26Z/fffP+us0+pdAgAAAAAArNFaVUmeeuqp7Lfffpk1a1Y233zzJMnEiROzySab5I477sjWW29d6iQBAAAAAADWBK16xssxxxyTrbbaKjNnzsxjjz2Wxx57LC+99FK23XbbHHfccWXPEQAAAAAAYI3Qqitennjiifz617/OhhtuWFm34YYb5qtf/Wo+9rGPlTY5AAAAAACANUmrrnj56Ec/mtmzZy+3fs6cOenXr99qTwoAAAAAAGBN1KrwMmHChJx88sm59dZbM3PmzMycOTO33nprvvSlL2XixIlZuHBhZQEAAAAAAFhbtOpWY/vss0+S5JBDDklVVVWSpCiKJMm+++5b+bmqqiqNjY1lzBMAAAAAAOBDr1Xh5YEHHih1EldeeWW+9rWvZdasWdluu+1y+eWXZ4cddmhx7NVXX53vfve7+d3vfpckGTRoUC644IJm44uiyLhx43L11Vdn/vz52XnnnXPVVVelf//+pc4bAAAAAADg7VoVXoYNG1baBG666aaMGTMmkydPzpAhQzJp0qSMGDEizzzzTLp27brc+KlTp+bwww/PTjvtlA4dOmTixInZc88989RTT6VHjx5Jkosuuijf+MY3cv3116d3794555xzMmLEiDz99NPp0KFDaXMHAAAAAAB4u6pi2T3CVtFbb72VJ598MnPmzElTU1Oz1/bbb7+V3s+QIUPysY99LFdccUWSpKmpKT179swXv/jFnHnmme+5fWNjYzbccMNcccUVGTVqVIqiSPfu3XPqqafmtNNOS5IsWLAg9fX1ue6663LYYYe95z4XLlyYurq6LFiwIJ07d17pY1kb9DrzrtXex4wLR5YwEwAAAAAA+GCsSjdo1RUvU6ZMyahRozJv3rzlXluV57osXbo0jz76aM4666zKuurq6gwfPjzTpk1bqX0sXrw4f/3rX7PRRhslSaZPn55Zs2Zl+PDhlTF1dXUZMmRIpk2b1mJ4WbJkSZYsWVL5eeHChSv13gAA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k7PuuuvmmmuuaXH8ZZddlr322iunn356tthii5x//vn513/911xxxRXNxtXW1qZbt26VZcMNN/wgDgcAAAAAAFiLtWl4Wbp0aR599NEMHz68sq66ujrDhw/PtGnTWtxm2rRpzcYnyYgRI5YbP3Xq1HTt2jWbb755jj/++Lz22msrnMeSJUuycOHCZgsAAAAAAMCqatPwMm/evDQ2Nqa+vr7Z+vr6+syaNavFbWbNmvWe4/faa69897vfTUNDQyZOnJj/+7//y957753GxsYW9zlhwoTU1dVVlp49e67mkQEAAAAAAGujddp6Au+Hww47rPLnbbbZJttuu2369u2bqVOnZo899lhu/FlnnZUxY8ZUfl64cKH4AgAAAAAArLI2veKlS5cuqampyezZs5utnz17drp169biNt26dVul8UnSp0+fdOnSJc8//3yLr9fW1qZz587NFgAAAAAAgFXVpuGlffv2GTRoUBoaGirrmpqa0tDQkB133LHFbXbcccdm45Pk/vvvX+H4JJk5c2Zee+21bLrppuVMHAAAAAAAoAVtGl6SZMyYMbn66qtz/fXX5/e//32OP/74LFq0KKNHj06SjBo1KmeddVZl/H/8x39kypQp+frXv54//OEPOffcc/PrX/86J510UpLkzTffzOmnn55f/vKXmTFjRhoaGrL//vunX79+GTFiRJscIwAAAAAAsHZo82e8HHrooZk7d27Gjh2bWbNmZeDAgZkyZUrq6+uTJC+++GKqq//Rh3baaad8//vfz3/913/ly1/+cvr375/bb789W2+9dZKkpqYmTz75ZK6//vrMnz8/3bt3z5577pnzzz8/tbW1bXKMAAAAAADA2qHNw0uSnHTSSZUrVt5p6tSpy607+OCDc/DBB7c4vmPHjrn33nvLnB4AAAAAAMBKafNbjQEAAAAAAPyzEF4AAAAAAABKIrwAAAAAAACURHgBAAAAAAAoifACAAAAAABQEuEFAAAAAACgJMILAAAAAABASYQXAAAAAACAkggvAAAAAAAAJRFeAAAAAAAASiK8AAAAAAAAlER4AQAAAAAAKInwAgAAAAAAUJJ12noCwOrpdeZdq72PGReOLGEmAAAAAAC44gUAAAAAAKAkwgsAAAAAAEBJhBcAAAAAAICSCC8AAAAAAAAlEV4AAAAAAABKIrwAAAAAAACURHgBAAAAAAAoifACAAAAAABQEuEFAAAAAACgJMILAAAAAABASYQXAAAAAACAkggvAAAAAAAAJRFeAAAAAAAASiK8AAAAAAAAlER4AQAAAAAAKInwAgAAAAAAUBLhBQAAAADg/7V35/FRVff/xz8zZCUJCSBLWMIiiFIsILgAKoqgWHFBVFwBWaz6tVQtRkQlqAiCBdkERKpQBde6FESrolBZxIWlCiIQoFBZXNgEShKSz++PPsiPYZ3JnJs5Z+7r+XjMQ2du8uZz7rnn3Hs5zAwAGJIQ6wIA2Kf+wPei+v2NT11hqBIAAAAAAAAAcAvveAEAAAAAAAAAADCEhRcAAAAAAAAAAABDWHgBAAAAAAAAAAAwhIUXAAAAAAAAAAAAQ1h4AQAAAAAAAAAAMISFFwAAAAAAAAAAAENYeAEAAAAAAAAAADCEhRcAAAAAAAAAAABDWHgBAAAAAAAAAAAwhIUXAAAAAAAAAAAAQ1h4AQAAAAAAAAAAMISFFwAAAAAAAAAAAENYeAEAAAAAAAAAADCEhRcAAAAAAAAAAABDWHgBAAAAAAAAAAAwhIUXAAAAAAAAAAAAQ1h4AQAAAAAAAAAAMISFFwAAAAAAAAAAAENYeAEAAAAAAAAAADCEhRcAAAAAAAAAAABDWHgBAAAAAAAAAAAwhIUXAAAAAAAAAAAAQ1h4AQAAAAAAAAAAMCQh1gUAiH/1B74X1e9vfOoKQ5UAAAAAAAAAgLd4xwsAAAAAAAAAAIAhLLwAAAAAAAAAAAAYwsILAAAAAAAAAACAISy8AAAAAAAAAAAAGMLCCwAAAAAAAAAAgCEJsS4AACJVf+B7Uf3+xqeuMFQJAAAAAAAAAITiHS8AAAAAAAAAAACG8I4XAL7HO2gAAAAAAAAAmMI7XgAAAAAAAAAAAAxh4QUAAAAAAAAAAMAQFl4AAAAAAAAAAAAM4TteAMCwaL8zRoTvjQEAAAAAAABcxTteAAAAAAAAAAAADGHhBQAAAAAAAAAAwBAWXgAAAAAAAAAAAAzhO14AwAHRfm8M3xkDAAAAAAAAlA8WXgDAh0wv5LAwBAAAAAAAAPwPCy8AAOuwkAMAAAAAAABXsfACAIh7LOQAAAAAAACgvARjXQAAAAAAAAAAAEC84B0vAABEKNp30IjwPTkAAAAAAADxyoqFl2effVaefvpp2bZtmzRv3lzGjx8v55xzznF//o033pBHH31UNm7cKI0bN5YRI0bI7373u9Ltqip5eXny/PPPy65du6Rdu3YyadIkady4cXk0BwCAmDO9kBPvecfKBAAAAAAAKIuYL7y89tprcv/998vkyZPl3HPPlTFjxshll10m33//vVSvXv2on1+0aJHcdNNNMnz4cOnSpYvMnDlTrrnmGlm6dKk0a9ZMRERGjhwp48aNk+nTp0uDBg3k0Ucflcsuu0xWrVolKSkp5d1EAADgINsWh/yW50Umi2sAAAAAgPIQ84WX0aNHS79+/eT2228XEZHJkyfLe++9Jy+88IIMHDjwqJ8fO3asdO7cWR544AEREXniiSfko48+kgkTJsjkyZNFVWXMmDHyyCOPyNVXXy0iIn/961+lRo0a8s4778iNN95Yfo0DAACAtWxbbPJbnheZLNYBAAAAsEFMF14KCwvl66+/loceeqj0tWAwKB07dpTFixcf83cWL14s999/f8hrl112mbzzzjsiIrJhwwbZtm2bdOzYsXR7ZmamnHvuubJ48eJjLrwUFBRIQUFB6fPdu3eLiMiePXvK3LZ4VVKwP+qMI/drtJnk0SfxludFJnl25XmRSR59Em95XmSSZ1eeF5le5zXL+0dUed8+dpnVeV5kkme+TwAAABAbh+4PVPXkP6wx9MMPP6iI6KJFi0Jef+CBB/Scc8455u8kJibqzJkzQ1579tlntXr16qqqunDhQhUR3bJlS8jPXH/99XrDDTccMzMvL09FhAcPHjx48ODBgwcPHjx48ODBgwcPHjx48ODB47iPzZs3n3TtI+YfNWaDhx56KORdNCUlJbJjxw6pWrWqBAKBGFbmnj179kjdunVl8+bNUqlSJfLiLM+LTPKiZ3uNfsvzIpM8u/K8yCQverbX6Lc8LzLJsyvPi0zyomd7jX7L8yKTPLvyvMgkL3q21+i3PC8yybMrz09UVX799VepVavWSX82pgsvp5xyilSoUEG2b98e8vr27dulZs2ax/ydmjVrnvDnD/13+/btkp2dHfIzLVq0OGZmcnKyJCcnh7yWlZUVSVNwhEqVKhkduOTZledFJnn2ZZJnXyZ5duV5kUmefZnk2ZdJnl15XmSSZ18mefZlkmdXnheZ5NmXSZ59meTZlecXmZmZYf1c0OM6TigpKUlatWolc+fOLX2tpKRE5s6dK23atDnm77Rp0ybk50VE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PpO//OUv0q1bt4jadzwHDhwIeT5w4EAZNGiQXHrppbJo0aKIsurVqyfPPPOMbNiw4ZiPE80Zx2J6nHix/3Jycko/s/3LL7+UQCAQ0u9LliyR2rVrh51Xu3Zt+f7770uf5+fnS0lJiVStWlVEROrUqVN6XIaja9eu8uSTT0pxcbFcffXVMnHixJDPEB4/fry0aNEi7LzExMSQz9RNTk4OOZ8kJydH9HnDptsrYr6fTc81pttseq4xnWf6mBExP9eYvqY50jnnnCPPPfecbNmyRSZOnCibN2+WTp06hf37pq8LTV+3ipgfJ6bnLtuPa9PHtIj585OI2WsG03O16WPGdH2mrzNFvDmHHi7aucv0MWh6nhExe38nYn4sm76PN30/5sU8c7hoj0ER83ODiN33T6brM32+8+Ie+UjRHje2X9McKdr2enEu8eL63+Rx7fXchROI6bIPnHXzzTfrvffee9zty5cv10AgEHbeyy+/rBUqVNBGjRppcnKyvvHGG1qrVi294YYb9MYbb9SkpCSdMGFC2Hnt2rUL+QiqI82aNUubNWsWdp6q6uuvv64JCQl65ZVX6tixY/XVV1/VV199VceOHatXXXWVJiUl6Ztvvhl23oQJEzQzM1Nzc3N18ODBWqtWLe3Tp0/p9pdffjmi73I48l8BHMvu3bsjygsGgxoMBjUQCOiUKVNCtr/77rsRvT30cC+88ILWrFlTn3vuOU1MTCzzv7y3fR926tRJn3766WNumzlzpiYmJkb8r4OysrK0cuXKmpiYqC+99FLI9g8//FDr168fdl5BQYFeddVVWrlyZe3UqZOmpKRoxYoVtXHjxpqWlqY5OTlH/SuLE5kwYYImJydr//799d1339XPP/9cP//8c3333Xe1f//+mpqaqs8++2zYeYcrLi7WwYMHa926dfWDDz4o83FzwQUXhLyt+HAjRozQ5OTkiPqkW7dumpube9ztkc6FhzM1TlTN7T/V/332dkpKinbs2FErV66s48aN05o1a2pubq4OHDhQMzMz9fHHHw8777HHHtM6deropEmT9IUXXtBmzZqFfETgW2+9pU2bNg07b9euXdq6dWtt1KiR3nbbbZqSkqL16tXTTp06aYMGDTQzM7P0M+fD0bp165C3Ye/evTvkowI++ugjPe2008LOM93ew5nqZ9Nzjek2m55rTOeZPmZUzc81pq9pwjl/RnI+MX1daPq6VdX8ODE9d9l+XHtx/jR9fjJ9zXCIqbna9DFjuj7T15mq5s8npucu08eg6XnGi/s702PZ9H286fsxL/rY5DGoan5usP3+yXR9ps93Xtwjmz5ubL+mMd1eL+7HTB83po9r03MXwsfCC8pk69atIR8BYcKCBQv0z3/+c+lneq9cuVJvu+027datm06bNi3irGXLlh13+7PPPqvjx4+PuMaFCxdq9+7dNScnR5OSkjQpKUlzcnK0e/fuumjRoojzJk6cqG3bttVWrVrpoEGD9L///W/ptjVr1pzwLalH6tWrl+7ZsyfiGo5n3rx5IY8jT2RjxozRkSNHljl/zZo1evbZZ5d+XmdZ2bwP33rrrRP+Rc+MGTP0oosuCjtv2rRpIY8jPx7g8ccf1/vuuy/iOt9//329++67tXPnznrppZdqz549dcqUKbp3796Is1599VU999xzNSEhQQOBQOkX4Z177rn62muvRZx3pM8++0wbNGigwWCwTMfN888/r7feeutxtz/11FMRXVSuXLnyhF+GWFhYGNVcaWqcHBLt/jtkxowZes899+jMmTNVVfXTTz/VCy64QFu1aqVDhgwJ+Zi0kykqKtLc3FytVauWVq1aVW+++Wb96aefSrcvWbIk4i96LSws1EmTJunvfvc7Pf300/W0007T9u3b66BBg3Tz5s0RZb311lsn/POHDx+ujzzySNh5XrT3SNH2s+m5xos2m55rTOaZPmZUvZlrTF7TXHTRRbpz586IfudkTF4XenHd6sU52eTcpWr3ce3V+dPk+cn0NcORTJyTTR8zputTNXudafp84sXcZfIYND3PeHF/Z3osm76PN30/duh3TPWxF8egqtm5wfb7J9P1eXEdZ/q61fRxY/s1jen2enFvYvq48eIaxOTchfCx8IJyMXPmzDJdXLua5wXb21yWvOLiYt21a9cxv2jOiz6xoc3lmbdgwQI9cOCAsbxI6issLNQtW7boli1btLCw0FgNqqq//vqrLl++XAsKCo7aZrrNNuSZHifluf+8yCQvPH4ZJ6bnGi/nruNxYdyZFsvzUyzyVONrnITD9nnGi8yy5Nk+V5dnffE27uIhz4U+sX3+t72Pvcgk7/hicT5Wja99GA95XmTanudnLLygXGRkZGh+fr5v8rxge5ttz/Mikzz72N5mv+V5kUme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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "names, importances = pipe2.features.importances()\n", "\n", "plt.subplots(figsize=(20, 10))\n", "\n", "plt.bar(names, importances)\n", "\n", "plt.title('Feature importances for class label ' + class_label[TARGET_NUM])\n", "plt.xlabel('Features')\n", "plt.ylabel('Importances')\n", "plt.xticks(rotation='vertical')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Column importances__\n", "\n", "Because getML uses relational learning, we can apply the principles we used to calculate the feature importances to individual columns as well." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABlUAAARGCAYAAAChTTY/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACIVUlEQVR4nOzdeXQV9d348U9CIWwmIEsQpEQWF0TFQkFUxEdRSnGvitrfw1Kh1l2p9hH9FVweTd0Qf9SK1kqttpVKrW3VoohaNypuqHXXsrmwiSyiQknm94eHW2OCfomRG+X1OueeQ+bO3PuZScgheTMzBVmWZQEAAAAAAMBnKsz3AAAAAAAAAF8FogoAAAAAAEACUQUAAAAAACCBqAIAAAAAAJBAVAEAAAAAAEggqgAAAAAAACQQVQAAAAAAABKIKgAAAAAAAAlEFQAAAAAAgASiCgAAm2TfffeNfffdN99jfGnKyspixIgR+R6DTfD+++/HqFGjol27dlFQUBBnnHFGvkeql39PHnzwwSgoKIgHH3xwk7cdMWJENG/evE7nqY/HiKrOP//8KCgoyPcYAAD1iqgCAPA198Ybb8QJJ5wQnTt3jsaNG0dxcXHstddecfXVV8eHH36Y7/GoY3fffXecf/75+R5js7rkkkvi17/+dZx44olx8803x3//93/neyTqWEVFRUyZMiX23Xff2HrrraOoqCjKyspi5MiR8eSTT+Z7vM9VVlYWBQUFuUfjxo2jW7ducfbZZ8fy5cvzPR4AAJvgG/keAACAL89dd90VRx11VBQVFcWwYcOiR48esW7dunjkkUfi7LPPjhdeeCGuv/76fI9Zr7zyyitRWPjV/b9Hd999d1xzzTVbVFi5//77Y4899ojx48fnexS+BB9++GEcccQRMX369Nhnn33i3HPPja233jrmzZsXf/jDH+Kmm26KBQsWxLbbbpvvUT9Tz54948c//nFERHz00Ufx1FNPxcSJE+Pvf/97zJ49O8/TAQCQSlQBAPiamjt3bhxzzDHRqVOnuP/++2ObbbbJPXfyySfH66+/HnfddVceJ6yfioqK8j1CraxZsyaaNWuW7zHyYsmSJdG9e/c6e73169dHZWVlNGrUqM5ek9o7++yzY/r06XHVVVdVu7Tb+PHj46qrrsrPYJuoQ4cO8X/+z//JfTxq1Kho3rx5XHHFFfHaa69Ft27d8jgdAACpvrr/BQ8AgM902WWXxfvvvx+/+tWvqgSVDbp27Rqnn3567uP169fHRRddFF26dMldWufcc8+NtWvXfub7/PrXv46CgoKYN29eleU13b9h3333jR49esRzzz0XAwYMiKZNm0bXrl1j2rRpERHx97//Pfr27RtNmjSJHXbYIe67774qr7nh+v6vv/56jBgxIlq0aBElJSUxcuTI+OCDD6qsO2PGjNh7772jRYsW0bx589hhhx3i3HPP/dzj9ul7qmzYv0ceeSROO+20aNOmTbRo0SJOOOGEWLduXaxYsSKGDRsWLVu2jJYtW8ZPfvKTyLIst/28efOioKAgrrjiirjqqquiU6dO0aRJkxgwYED885//rPb+999/f/Tv3z+aNWsWLVq0iEMPPTReeumlGo/Diy++GMcdd1y0bNky9t577xgxYkRcc801ERFVLjW0wRVXXBF77rlntGrVKpo0aRK9evXKHftPKigoiFNOOSXuuOOO6NGjRxQVFcXOO+8c06dPr7buW2+9Fccff3y0b98+ioqKYrvttosTTzwx1q1bl1tnxYoVccYZZ0THjh2jqKgounbtGpdeemlUVlZWea1bb701evXqFVtttVUUFxfHLrvsEldfffVGP1cbvsbmzp0bd911V25/N3wtLlmyJI4//vgoLS2Nxo0bx2677RY33XRTldf45Odn4sSJua//F198caPvGxFxyy23RJ8+faJp06bRsmXL2GeffeLee+/d6Prr1q2LcePGRa9evaKkpCSaNWsW/fv3jwceeKDaup93HP7973/HBRdcEN26dYvGjRtHq1atYu+9944ZM2Z85sw1efjhh+Ooo46Kb37zm1FUVBQdO3aMM888c6OXBvzXv/4VgwYNimbNmkX79u3jwgsvrPL1HhFRWVkZEydOjJ133jkaN24cpaWlccIJJ8R77723yfO9+eabcd1118UBBxxQ471yGjRoEGeddVbuLJX58+fHSSedFDvssEM0adIkWrVqFUcddVS170+px/Dll1+OI488Mrbeeuto3Lhx9O7dO/7yl79s8n5sTLt27SIi4hvf+M//d3zuuedixIgRuUs2tmvXLn7wgx/Eu+++W2Xb1atXxxlnnBFlZWVRVFQUbdu2jQMOOCCefvrpKus9/vjj8Z3vfCdKSkqiadOmMWDAgHj00UerzfLII4/Et7/97WjcuHF06dIlrrvuujrbTwCArxNnqgAAfE399a9/jc6dO8eee+6ZtP6oUaPipptuiiOPPDJ+/OMfx+OPPx7l5eXx0ksvxZ/+9Kc6m+u9996Lgw46KI455pg46qij4tprr41jjjkmfvvb38YZZ5wRP/rRj+K4446Lyy+/PI488shYuHBhbLXVVlVe4+ijj47tttsuysvL4+mnn44bbrgh2rZtG5deemlERLzwwgtx0EEHxa677hoXXnhhFBUVxeuvv17jLxJTnXrqqdGuXbu44IIL4h//+Edcf/310aJFi3jsscfim9/8ZlxyySVx9913x+WXXx49evSIYcOGVdn+N7/5TaxevTpOPvnk+Oijj+Lqq6+O/fbbL55//vkoLS2NiIj77rsvBg8eHJ07d47zzz8/Pvzww5g0aVLstdde8fTTT0dZWVmV1zzqqKOiW7ducckll0SWZbH77rvH22+/HTNmzIibb7652j5cffXVccghh8T3v//9WLduXdx6661x1FFHxZ133hlDhgypsu4jjzwSt99+e5x00kmx1VZbxf/7f/8vvve978WCBQuiVatWERHx9ttvR58+fWLFihXxwx/+MHbcccd46623Ytq0afHBBx9Eo0aN4oMPPogBAwbEW2+9FSeccEJ885vfjMceeyzGjh0b77zzTkycODEiPo5gxx57bOy///65z+NLL70Ujz76aJX490k77bRT3HzzzXHmmWfGtttum7u0Ups2beLDDz+MfffdN15//fU45ZRTYrvttovbbrstRowYEStWrKj2mlOmTImPPvoofvjDH0ZRUVFsvfXWG/1auOCCC+L888+PPffcMy688MJo1KhRPP7443H//ffHgQceWOM2q1atihtuuCGOPfbYGD16dKxevTp+9atfxaBBg2L27NnRs2fP5ONw/vnnR3l5eYwaNSr69OkTq1atiieffDKefvrpOOCAAzY6d01uu+22+OCDD+LEE0+MVq1axezZs2PSpEnx5ptvxm233VZl3YqKivjOd74Te+yxR1x22WUxffr0GD9+fKxfvz4uvPDC3HonnHBC/PrXv46RI0fGaaedFnPnzo2f//zn8cwzz8Sjjz4aDRs2TJ7vb3/7W6xfvz75PjlPPPFEPPbYY3HMMcfEtttuG/PmzYtrr7029t1333jxxRejadOmEZF2DF944YXYa6+9okOHDnHOOedEs2bN4g9/+EMcdthh8cc//jEOP/zw5P2I+DjkLFu2LCI+vvzXM888ExMmTIh99tkntttuu9x6M2bMiH/9618xcuTIaNeuXe4yjS+88EL84x//yIXSH/3oRzFt2rQ45ZRTonv37vHuu+/GI488Ei+99FJ861vfioiPI+3gwYOjV69eMX78+CgsLIwpU6bEfvvtFw8//HD06dMnIiKef/75OPDAA6NNmzZx/vnnx/r162P8+PG5700AAHxCBgDA187KlSuziMgOPfTQpPXnzJmTRUQ2atSoKsvPOuusLCKy+++/P7dswIAB2YABA3IfT5kyJYuIbO7cuVW2feCBB7KIyB544IEq20ZE9rvf/S637OWXX84iIissLMz+8Y9/5Jbfc889WURkU6ZMyS0bP358FhHZD37wgyrvdfjhh2etWrXKfXzVVVdlEZEtXbo0af8/qVOnTtnw4cOr7d+gQYOyysrK3PJ+/fplBQUF2Y9+9KPcsvXr12fbbrttleMzd+7cLCKyJk2aZG+++WZu+eOPP55FRHbmmWfmlvXs2TNr27Zt9u677+aWPfvss1lhYWE2bNiwasfh2GOPrTb/ySefnG3sn/kffPBBlY/XrVuX9ejRI9tvv/2qLI+IrFGjRtnrr79eZY6IyCZNmpRbNmzYsKywsDB74oknqr3XhmN10UUXZc2aNcteffXVKs+fc845WYMGDbIFCxZkWZZlp59+elZcXJytX7++xtk/S6dOnbIhQ4ZUWTZx4sQsIrJbbrmlyv7269cva968ebZq1aosy/7z+SkuLs6WLFnyue/12muvZYWFhdnhhx+eVVRU1LjPWVb978n69euztWvXVln/vffey0pLS6t8Pacch912263a/qao6e/kp78msizLysvLs4KCgmz+/Pm5ZcOHD88iIjv11FNzyyorK7MhQ4ZkjRo1yv1de/jhh7OIyH77299Wec3p06dXW/7pY1STM888M4uI7Jlnnknax5r2Z9asWVlEZL/5zW9yy1KO4f7775/tsssu2UcffZRbVllZme25555Zt27dkubZoFOnTllEVHvstdde2bJlyz53H37/+99nEZE99NBDuWUlJSXZySefvNH3rKyszLp161bte9cHH3yQbbfddtkBBxyQW3bYYYdljRs3rvI5f/HFF7MGDRps9PsJAMCWyuW/AAC+hlatWhURUe0Mj425++67IyJizJgxVZZv+J//dXnvlebNm8cxxxyT+3iHHXaIFi1axE477RR9+/bNLd/w53/961/VXuNHP/pRlY/79+8f7777bm6/W7RoERERf/7zn6tdYqq2jj/++CqX0urbt29kWRbHH398blmDBg2id+/eNc582GGHRYcOHXIf9+nTJ/r27Zs79u+8807MmTMnRowYUeUsiV133TUOOOCA3Hqf9Onj8HmaNGmS+/N7770XK1eujP79+1e7XFBExMCBA6NLly5V5iguLs7tW2VlZdxxxx1x8MEHR+/evattv+FY3XbbbdG/f/9o2bJlLFu2LPcYOHBgVFRUxEMPPRQRH3/O1qxZU6tLWNXk7rvvjnbt2sWxxx6bW9awYcM47bTT4v3334+///3vVdb/3ve+F23atPnc173jjjuisrIyxo0bF4WFVX+c+uTXx6c1aNAgd4+WysrKWL58eaxfvz569+5d5finHIcWLVrECy+8EK+99trnzvt5Pvk1sWbNmli2bFnsueeekWVZPPPMM9XWP+WUU3J/3nCZuHXr1uUu1XfbbbdFSUlJHHDAAVU+37169YrmzZvXeLmzz7Kp38s+uT///ve/4913342uXbtGixYtqh3nzzqGy5cvj/vvvz+OPvroWL16dW4/3n333Rg0aFC89tpr8dZbb23SvvTt2zdmzJgRM2bMiDvvvDMuvvjieOGFF+KQQw6pcrm1T+7DRx99FMuWLYs99tgjIqLaPjz++OPx9ttv1/h+c+bMiddeey2OO+64ePfdd3P7sGbNmth///3joYceisrKyqioqIh77rknDjvssPjmN7+Z236nnXaKQYMGbdI+AgBsCUQVAICvoeLi4oj4+Jr7KebPnx+FhYXRtWvXKsvbtWsXLVq0iPnz59fZbNtuu221Xz6XlJREx44dqy2LiBrvw/DJX/xFRLRs2bLKukOHDo299torRo0aFaWlpXHMMcfEH/7why8UWD79nhvmq2nummau6SbU22+/fe5eDxuO8Q477FBtvZ122in3y9BP+uQlg1Lceeedsccee0Tjxo1j6623jjZt2sS1114bK1eurLbup/c34uPjvGHfli5dGqtWrYoePXp85nu+9tprMX369GjTpk2Vx8CBAyPi4/ueREScdNJJsf3228fgwYNj2223jR/84Ac13sMl1fz586Nbt27VwsdOO+2Ue/6TUo/lG2+8EYWFhdG9e/dNnummm26KXXfdNXcPjzZt2sRdd91V5finHIcLL7wwVqxYEdtvv33ssssucfbZZ8dzzz23yfNERCxYsCAX8po3bx5t2rSJAQMGRERU+7ooLCyMzp07V1m2/fbbR0Tkvo5fe+21WLlyZbRt27ba5/z999/Pfb5Tber3sg8//DDGjRuXu39P69ato02bNrFixYoq+/N5x/D111+PLMvipz/9abX9GD9+fETEJu9L69atY+DAgTFw4MAYMmRInHvuuXHDDTfEY489FjfccENuveXLl8fpp58epaWl0aRJk2jTpk3u6/OT+3DZZZfFP//5z+jYsWP06dMnzj///CpBd0MwGj58eLV9uOGGG2Lt2rWxcuXKWLp0aXz44Yc1fo+q6fsRAMCWzj1VAAC+hoqLi6N9+/Y13gj9s3zW/7Tf1G0qKipqXN6gQYNNWp596ibYKes2adIkHnrooXjggQfirrvuiunTp8fUqVNjv/32i3vvvXej23+WTZm7ppm/DJ/8H+2f5+GHH45DDjkk9tlnn/jFL34R22yzTTRs2DCmTJkSv/vd76qtvymfj89SWVkZBxxwQPzkJz+p8fkNv5Rv27ZtzJkzJ+65557429/+Fn/7299iypQpMWzYsGo3l/8ybMqxrI1bbrklRowYEYcddlicffbZ0bZt22jQoEGUl5fHG2+8kVsv5Tjss88+8cYbb8Sf//znuPfee+OGG26Iq666KiZPnhyjRo1KnqmioiIOOOCAWL58efzP//xP7LjjjtGsWbN46623YsSIEbWKkJWVldG2bdv47W9/W+PzKWcDfdKOO+4YER/f82PDfWc+y6mnnhpTpkyJM844I/r16xclJSVRUFAQxxxzTJX9+bxjuGHds846a6Nna3w6QtfG/vvvHxERDz30UJx66qkR8fE9ox577LE4++yzo2fPntG8efOorKyM73znO1X24eijj47+/fvHn/70p7j33nvj8ssvj0svvTRuv/32GDx4cG7dyy+/fKPHrnnz5rF27dovvB8AAFsSUQUA4GvqoIMOiuuvvz5mzZoV/fr1+8x1O3XqFJWVlfHaa6/l/id/RMTixYtjxYoV0alTp41uu+EskRUrVlRZXpdnt9RGYWFh7L///rH//vvHhAkT4pJLLonzzjsvHnjggdxZEptTTZcZevXVV3M3n99wjF955ZVq67388svRunXraNas2ee+z8Yi1x//+Mdo3Lhx3HPPPVFUVJRbPmXKlJTxq2nTpk0UFxd/brjr0qVLvP/++0nHvFGjRnHwwQfHwQcfHJWVlXHSSSfFddddFz/96U83+RfYnTp1iueeey4qKyurnK3y8ssv556vjS5dukRlZWW8+OKLSb/k32DatGnRuXPnuP3226t8jjac9fBJKcdh6623jpEjR8bIkSPj/fffj3322SfOP//8TYoqzz//fLz66qtx0003xbBhw3LLN3bpscrKyvjXv/6VC2ERH38NR0Tu67hLly5x3333xV577VUnoWrw4MHRoEGDuOWWW5JuVj9t2rQYPnx4XHnllbllH330UbXvTxGffQw3nJHTsGHDL/X7xfr16yMi4v3334+Ij8+2mzlzZlxwwQUxbty43Hobu0zZNttsEyeddFKcdNJJsWTJkvjWt74VF198cQwePDh3+b7i4uLP3Ic2bdpEkyZNanyPmr4fAQBs6Vz+CwDga+onP/lJNGvWLEaNGhWLFy+u9vwbb7wRV199dUREfPe7342IiIkTJ1ZZZ8KECRERMWTIkI2+z4Zf3G24N0bEx/8D/vrrr/9C838Ry5cvr7Zswy/A8/W/su+4444q92CYPXt2PP744zF48OCI+PiXoz179oybbrqpyi+A//nPf8a9996b+xx9ng3h5dO/RG7QoEEUFBRUOYNo3rx5cccdd9RqfwoLC+Owww6Lv/71r/Hkk09We37DGS1HH310zJo1K+65555q66xYsSL3S+V333232uvvuuuuEVG7z9l3v/vdWLRoUUydOjW3bP369TFp0qRo3rx57hJXm+qwww6LwsLCuPDCC6udyfFZZ/FsOPPnk+s8/vjjMWvWrCrrpRyHT6/TvHnz6Nq16yYfp5pmyrIs932hJj//+c+rrPvzn/88GjZsmDvj4uijj46Kioq46KKLqm27fv36GuPGZ+nYsWOMHj067r333pg0aVK15ysrK+PKK6+MN998M7dPn/48TJo0qdqZc593DNu2bRv77rtvXHfddfHOO+9Ue9+lS5du0n5szF//+teIiNhtt91y80dU/1r69PfmioqKapdna9u2bbRv3z63D7169YouXbrEFVdckYs2Ne1DgwYNYtCgQXHHHXfEggULcs+/9NJLNf69BQDY0jlTBQDga6pLly7xu9/9LoYOHRo77bRTDBs2LHr06BHr1q2Lxx57LG677bYYMWJERHz8C73hw4fH9ddfHytWrIgBAwbE7Nmz46abborDDjss/uu//muj77PzzjvHHnvsEWPHjo3ly5fH1ltvHbfeemvul+X5cOGFF8ZDDz0UQ4YMiU6dOsWSJUviF7/4RWy77bax995752Wmrl27xt577x0nnnhirF27NiZOnBitWrWqclmsyy+/PAYPHhz9+vWL448/Pj788MOYNGlSlJSUxPnnn5/0Pr169YqIiNNOOy0GDRoUDRo0iGOOOSaGDBkSEyZMiO985ztx3HHHxZIlS+Kaa66Jrl271vp+HJdccknce++9MWDAgPjhD38YO+20U7zzzjtx2223xSOPPBItWrSIs88+O/7yl7/EQQcdFCNGjIhevXrFmjVr4vnnn49p06bFvHnzonXr1jFq1KhYvnx57LfffrHtttvG/PnzY9KkSdGzZ88qZ0+l+uEPfxjXXXddjBgxIp566qkoKyuLadOmxaOPPhoTJ05MvvH5p3Xt2jXOO++8uOiii6J///5xxBFHRFFRUTzxxBPRvn37KC8vr3G7gw46KG6//fY4/PDDY8iQITF37tyYPHlydO/evcovvFOOQ/fu3WPfffeNXr16xdZbbx1PPvlkTJs2rcpN5FPsuOOO0aVLlzjrrLPirbfeiuLi4vjjH/9Y4z2BIiIaN24c06dPj+HDh0ffvn3jb3/7W9x1111x7rnn5i7rNWDAgDjhhBOivLw85syZEwceeGA0bNgwXnvttbjtttvi6quvjiOPPHKT5rzyyivjjTfeiNNOOy1uv/32OOigg6Jly5axYMGCuO222+Lll1+OY445Jnecb7755igpKYnu3bvHrFmz4r777otWrVpVec2UY3jNNdfE3nvvHbvsskuMHj06OnfuHIsXL45Zs2bFm2++Gc8+++wm7cdbb70Vt9xyS0RErFu3Lp599tm47rrronXr1rlLfxUXF8c+++wTl112Wfz73/+ODh06xL333htz586t8lqrV6+ObbfdNo488sjYbbfdonnz5nHffffFE088kTtLp7CwMG644YYYPHhw7LzzzjFy5Mjo0KFDvPXWW/HAAw9EcXFxLupccMEFMX369Ojfv3+cdNJJuQC588471/r7AwDA11YGAMDX2quvvpqNHj06Kysryxo1apRttdVW2V577ZVNmjQp++ijj3Lr/fvf/84uuOCCbLvttssaNmyYdezYMRs7dmyVdbIsywYMGJANGDCgyrI33ngjGzhwYFZUVJSVlpZm5557bjZjxowsIrIHHnigyrY777xztRk7deqUDRkypNryiMhOPvnk3Mfjx4/PIiJbunRplfWmTJmSRUQ2d+7cLMuybObMmdmhhx6atW/fPmvUqFHWvn377Nhjj81effXVzz1enTp1yoYPH17ttZ944okq621sluHDh2fNmjXLfTx37twsIrLLL788u/LKK7OOHTtmRUVFWf/+/bNnn3222vvfd9992V577ZU1adIkKy4uzg4++ODsxRdfTHrvLMuy9evXZ6eeemrWpk2brKCgIPvkP/l/9atfZd26dcuKioqyHXfcMZsyZUrutT7p08d9Y8cmy7Js/vz52bBhw7I2bdpkRUVFWefOnbOTTz45W7t2bW6d1atXZ2PHjs26du2aNWrUKGvdunW25557ZldccUW2bt26LMuybNq0admBBx6YtW3bNmvUqFH2zW9+MzvhhBOyd955p9ocNc1V09fP4sWLs5EjR2atW7fOGjVqlO2yyy7ZlClTqqzzyc/Pprjxxhuz3XffPSsqKspatmyZDRgwIJsxY0bu+U//PamsrMwuueSSrFOnTllRUVG2++67Z3feeWc2fPjwrFOnTrn1Uo7D//7v/2Z9+vTJWrRokTVp0iTbcccds4svvjh3LDfmgQceqPZ38sUXX8wGDhyYNW/ePGvdunU2evTo7Nlnn80iosqx2vB1/cYbb2QHHnhg1rRp06y0tDQbP358VlFRUe29rr/++qxXr15ZkyZNsq222irbZZddsp/85CfZ22+/vdFj9FnWr1+f3XDDDVn//v2zkpKSrGHDhlmnTp2ykSNHZs8880xuvffeey/3OW/evHk2aNCg7OWXX672tZt6DN94441s2LBhWbt27bKGDRtmHTp0yA466KBs2rRpSXNv0KlTpywico/CwsKsbdu22bHHHpu9/vrrVdZ98803s8MPPzxr0aJFVlJSkh111FHZ22+/nUVENn78+CzLsmzt2rXZ2Wefne22227ZVlttlTVr1izbbbfdsl/84hfV3vuZZ57JjjjiiKxVq1ZZUVFR1qlTp+zoo4/OZs6cWWW9v//971mvXr2yRo0a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mtdeey0vv/xyamtr87d/+7dZsWJF7rjjjqITASgj7lQBoGKMHTu22c9OmzZtB5YAAAAtxfnnn58zzjgj1157bWpqaprWR48enS984QsFlgFQjgxVAKgYXbt2LToBAABoYf71X/81N99883bru+++e1atWlVAEQDlzFAFgIpx2223/T9/zZw5czJ06NC0a9duBxQBAADlrl27dlm7du1266+88kp69epVQBEA5ayq6AAAKNIxxxyTt956q+gMAACgIGPGjMnll1+eDz/8MElSKpWyYsWKXHTRRTnppJMKrgOg3BiqANCqNTY2Fp0AAAAU6B/+4R+yfv369O7dO5s2bcqRRx6ZfffdNzU1NbnqqquKzgOgzDj+CwAAAIBWq2vXrnn44YczZ86czJ8/P+vXr8+QIUNy1FFHFZ0GQBkqNfqILgCtWE1NTebPn5/a2tqiUwAAgALccccdOfXUU7e7Z3Hz5s258847c/rppxdUBkA5MlQBoFUzVAEAgNaturo6K1euTO/evbdZX7NmTXr37p2GhoaCygAoR+5UAaBVK5VKRScAAAAFamxs/JM/F7z55pvp2rVrAUUAlDN3qgDQqtmwCQAArdPBBx+cUqmUUqmUz372s2nT5j/+mayhoSHLly/P0UcfXWAhAOXIUAWAirRp06Y0NjamY8eOSZLXX389v/rVr3LAAQfkc5/7XNNz69atKyoRAAAo0AknnJAkmTdvXkaNGpXOnTs3vde2bdv07ds3J510UkF1AJQrd6oAUJE+97nPZezYsfn617+e+vr67L///tlpp53y7rvvZtKkSfnGN75RdCIAAFAGbr/99px66qlp37590SkAtADuVAGgIs2dOzeHH354kuSee+7JLrvsktdffz133HFHJk+eXHAdAABQLr785S8bqADQbI7/AqAibdy4MTU1NUmSmTNnZuzYsamqqsrw4cPz+uuvF1wHAAAUqUePHnnllVfSs2fPdO/e/U9eVP97dXV1n2AZAOXOUAWAirTvvvvmvvvuy4knnpgZM2bk29/+dpLknXfeSZcuXQquAwAAinT99dc3fQjr+uuv/4tDFQD4Q+5UAaAi3XPPPfnCF76QhoaGfPazn83MmTOTJFdffXUee+yx/OY3vym4EAAAAICWxlAFgIq1atWqrFy5MgcddFCqqv79GrFnnnkmXbp0yf77719wHQAAUA4efPDBVFdXZ9SoUdusz5w5Mw0NDTnmmGMKKgOgHLmoHoCKteuuu+bggw9OVVVV1q5dm/vuuy81NTUGKgAAQJOLL744DQ0N261v3bo1F198cQFFAJQzQxUAKtK4cePyox/9KEmyadOmDB06NOPGjcvgwYNz7733FlwHAACUiyVLluSAAw7Ybn3//ffP0qVLCygCoJwZqgBQkR577LEcfvjhSZJf/epXaWxsTH19fSZPnpwrr7yy4DoAAKBcdO3aNcuWLdtufenSpenUqVMBRQCUM0MVACrS+++/nx49eiRJHnrooZx00knp2LFjPv/5z2fJkiUF1wEAAOXi+OOPz8SJE/Pqq682rS1dujQXXHBBxowZU2AZAOXIUAWAirTnnnvmySefzIYNG/LQQw/lc5/7XJLkvffeS/v27QuuAwAAysW1116bTp06Zf/998/ee++dvffeOwMGDMjOO++c6667rug8AMpMm6IDAGBHmDhxYk477bR07tw5e+21V0aOHJnk348FGzRoULFxAABA2ejatWueeOKJPPzww5k/f346dOiQwYMH54gjjig6DYAyVGpsbGwsOgIAdoTnnnsuK1asyH/9r/81nTt3TpI88MAD6datWw477LCC6wAAgJZk0KBBefDBB7PnnnsWnQJAgQxVAAAAAOAj1NTUZP78+amtrS06BYACOf4LgIr15ptvZvr06VmxYkU2b968zXuTJk0qqAoAAACAlspQBYCKNGvWrIwZMya1tbV56aWXcuCBB+a1115LY2NjhgwZUnQeAAAAAC1QVdEBALAjXHLJJbnwwgvzwgsvpH379rn33nvzxhtv5Mgjj8wpp5xSdB4AAAAALZChCgAVafHixTn99NOTJG3atMmmTZvSuXPnXH755fn+979fcB0AAAAALZGhCgAVqVOnTk33qPTp0yevvvpq03vvvvtuUVkAAAAAtGDuVAGgIg0fPjyPP/54BgwYkNGjR+eCCy7ICy+8kGnTpmX48OFF5wEAAC3MzTffnF122aXoDAAKVmpsbGwsOgIAPm7Lli3L+vXrM3jw4GzYsCEXXHBBnnjiifTr1y+TJk3KXnvtVXQiAABQkMmTJzf72QkTJuzAEgBaGkMVAAAAAFqVvffee5vXq1evzsaNG9OtW7ckSX19fTp27JjevXtn2bJlBRQCUK7cqQIAAABAq7J8+fKmX1dddVU+9alPZfHixamrq0tdXV0WL16cIUOG5Iorrig6FYAyY6cKABWje/fuKZVKzXq2rq5uB9cAAAAtwT777JN77rknBx988Dbrzz33XE4++eQsX768oDIAypGL6gGoGD/84Q+LTgAAAFqYlStXZsuWLdutNzQ05O233y6gCIByZqcKAAAAAK3Wcccdl7feeitTpkzJkCFDkvz7LpWvfvWr2X333TN9+vSCCwEoJ+5UAaAiPfjgg5kxY8Z26zNnzsxvfvObAooAAIBydOutt2bXXXfN0KFD065du7Rr1y7Dhg3LLrvskilTphSdB0CZcfwXABXp4osvzjXXXLPd+tatW3PxxRfnmGOOKaAKAAAoJ42Njdm0aVPuvffevPnmm1m8eHGSZP/990///v0LrgOgHDn+C4CK1KFDhyxevDh9+/bdZv21117LwIEDs2HDhmLCAACAsrF169a0b98+ixYtSr9+/YrOAaAFcPwXABWpa9euWbZs2XbrS5cuTadOnQooAgAAyk1VVVX69euXNWvWFJ0CQAthqAJARTr++OMzceLEvPrqq01rS5cuzQUXXJAxY8YUWAYAAJSTa665Jt/5zneycOHColMAaAEc/wVARXr//fdz9NFH59lnn80ee+yRJHnzzTdz+OGHZ9q0aenWrVuxgQAAQFno3r17Nm7cmC1btqRt27bp0KHDNu/X1dUVVAZAOXJRPQAVqWvXrnniiSfy8MMPZ/78+enQoUMGDx6cI444oug0AACgjPzwhz8sOgGAFsROFQAAAAAAgGawUwWAVuXZZ5/Nxo0b7VgBAACaNDQ05L777svixYuTJAMHDsyYMWNSXV1dcBkA5cZOFQBalQEDBuSVV15JQ0ND0SkAAEAZWLp0aUaPHp233nor++23X5Lk5Zdfzp577pkHHngg++yzT8GFAJSTqqIDAODj9uGHH+YrX/lKli9fvt17s2bNyrJlywqoAgAAytGECROyzz775I033sjcuXMzd+7crFixInvvvXcmTJhQdB4AZcZOFQAqUteuXTNv3rzsvffeRacAAABlrFOnTnnqqacyaNCgbdbnz5+fww47LOvXry+oDIByZKcKABXphBNOyH333Vd0BgAAUObatWuXdevWbbe+fv36tG3btoAiAMqZi+oBqEj9+vXL5Zdfnjlz5uSQQw5Jp06dtnnfNn4AACBJ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8ePH59133y2oDAAAAICWyp0qAFSkDz/8MEOHDt1u/ZBDDsmWLVsKKAIAAMrZ5s2b8/LLL/t5AYC/yFAFgIr0pS99KTfeeON26//0T/+U0047rYAiAACgHG3cuDFnnXVWOnbsmIEDB2bFihVJkvHjx+eaa64puA6AcmOoAkDFuuWWW3LggQfm7LPPztlnn51Bgwblpz/9aaqqqnL++ec3/QIAAFqvSy65JPPnz88jjzyS9u3bN60fddRRueuuuwosA6AcuVMFgIr06U9/ulnPlUql/Pa3v93BNQAAQLnaa6+9ctddd2X48OGpqanJ/PnzU1tbm6VLl2bIkCFZu3Zt0YkAlJE2RQcAwI4we/bsohMAAIAWYPXq1endu/d26xs2bEipVCqgCIBy5vgvAAAAAFqtoUOH5oEHHmh6/ftBypQpUzJixIiisgAoU3aqAAAAANBq/f3f/32OOeaYvPjii9myZUtuuOGGvPjii3niiSfy6KOPFp0HQJmxUwUAAACAVutv/uZvMm/evGzZsiWDBg3KzJkz07t37zz55JM55JBDis4DoMy4qB4AAAAAAKAZ7FQBAAAAoNWqrq7OO++8s936mjVrUl1dXUARAOXMnSoAVIzJkyf/P3/NmWeemZqamh1QAwAAtAR/7hCXDz74IG3btv2EawAod4YqAFSMiRMnZo899mj2p8neeOONHHvssYYqAADQCv3+Q1mlUilTpkxJ586dm95raGjIY489lv3337+oPADKlKEKABXl2WefTe/evZv1rGEKAAC0Xtdff32Sf9+pctNNN23z4ay2bdumb9++uemmm4rKA6BMGaoAUDEuu+yybT5d9lG++93vpkePHjuwCAAAKFfLly9Pknz605/OtGnT0r1794KLAGgJSo1/7uBIAAAAAAAAmtipAkCrsmDBggwdOjSbN28uOgUAACgDDQ0NmTp1ambNmpV33nknW7du3eb93/72twWVAVCODFUAaFUaGxvT0NBQdAYAAFAmvvWtb2Xq1Kn5/Oc/nwMPPDClUqnoJADKmKEKAAAAAK3WnXfembvvvjujR48uOgWAFqCq6AAAAAAAKErbtm2z7777Fp0BQAthqAJARVm7du1f/LVu3bqiEwEAgDJywQUX5IYbbkhjY2PRKQC0AKVG/8cAoIJUVVX9xTOQGxsbUyqV3KsCAAAkSU488cTMnj07PXr0yMCBA7PTTjtt8/60adMKKgOgHLlTBYCKMnv27KITAACAFqRbt2458cQTi84AoIWwUwWAVqeuri49evQoOgMAAACAFsadKgC0GjNnzsy4ceOy++67F50CAACUmdWrV+fxxx/P448/ntWrVxedA0CZMlQBoKK9/vrrueyyy9K3b9+ccsopqaqqyh133FF0FgAAUCY2bNiQr3zlK+nTp0+OOOKIHHHEEdltt91y1llnZePGjUXnAVBmDFUAqDibN2/OnXfemaOOOir7779/5s6dmzfffDOPP/547rzzzpxyyilFJwIAAGXi/PPPz6OPPpr7778/9fX1qa+vz69//es8+uijueCCC4rOA6DMuFMFgIoyfvz4/PKXv0y/fv3yxS9+Mf/tv/237Lzzztlpp50yf/78HHDAAUUnAgAAZaRnz5655557MnLkyG3WZ8+enXHjxjkKDIBttCk6AAA+TjfeeGMuuuiiXHzxxampqSk6BwAAKHMbN27MLrvsst167969Hf8FwHYc/wVARfnZz36WZ555Jn369Mmpp56af/mXf0lDQ0PRWQAAQJkaMWJELrvssvzud79rWtu0aVP+5//8nxkxYkSBZQCUI8d/AVCRli9fnqlTp2bq1KnZuHFj6urqctddd+Xkk08uOg0AACgjCxcuzKhRo/LBBx/koIMOSpLMnz8/7du3z4wZMzJw4MCCCwEoJ4YqAFS0xsbGzJw5M7fcckumT5+enj17ZuzYsZk8eXLRaQAAQJnYuHFjfv7zn+ell15KkgwYMCCnnXZaOnToUHAZAOXGUAWAVqOuri533HFHpk6dmnnz5hWdAwAAAEAL404VAFqNHj165PDDD88ee+xRdAoAAFAmrr766tx6663brd966635/ve/X0ARAOXMUAWAijNjxoxceOGF+e53v5tly5YlSV566aWccMIJGTZsWLZu3VpwIQAAUC5uvvnm7L///tutDxw4MDfddFMBRQCUszZFBwDAx+mWW27JOeeckx49euS9997LlClTMmnSpIwfPz6nnnpqFi5cmAEDBhSdCQAAlIlVq1alT58+26336tUrK1euLKAIgHJmpwoAFeWGG27I97///bz77ru5++678+677+YnP/lJXnjhhdx0000GKgAAwDb23HPPzJkzZ7v1OXPmZLfddiugCIByZqcKABXl1VdfzSmnnJIkGTt2bNq0aZMf/OAH7lEBAAD+pHPOOScTJ07Mhx9+mM985jNJklmzZuV//I//kQsuuKDgOgDKjaEKABVl06ZN6dixY5KkVCqlXbt2f3IrPwAAQJJ85zvfyZo1a3Luuedm8+bNSZL27dvnoosuyiWXXFJwHQDlptTY2NhYdAQAfFyqqqpy5ZVXpnPnzkmSiy66KN/5znfSs2fPbZ6bMGFCEXkAAECZWr9+fRYvXpwOHTqkX79+adeuXdFJAJQhQxUAKkrfvn1TKpX+4jOlUinLli37hIoAAAAAqBSGKgAAAAAAAM1QVXQAAAAAAABAS2CoAkBFGT16dN5///2m19dcc03q6+ubXq9ZsyYHHHBAAWUAAAAAtHSO/wKgolRXV2flypXp3bt3kqRLly6ZN29eamtrkyRvv/12dttttzQ0NBSZCQAAAEAL1KboAAD4OP3xZwV8dgAAAPhjkydP/n/+mjPPPDM1NTU7oAaAlsRQBQAAAIBWZeLEidljjz1SXV3drOffeOONHHvssYYqABiqAFBZSqVSSqXSdmsAAAB/6Nlnn206NvijGKYA8HuGKgBUlMbGxpxxxhlp165dkuR3v/tdvv71r6dTp05Jkg8++KDIPAAAoAxcdtll6dy5c7Of/+53v5sePXrswCIAWgoX1QNQUc4888xmPXfbbbft4BIAAAAAKo2hCgAAAAD8kQULFmTo0KHZvHlz0SkAlJGqogMAAAAAoNw0NjamoaGh6AwAyow7VQCoKGPHjm3Wc9OmTdvBJQAAAABUGkMVACpK165dt3n9i1/8Iscdd1xqamoKKgIAAACgUrhTBYCKVlNTk/nz56e2trboFAAAoIysXbv2L76/YMGCHHnkkY4AA2AbdqoAAAAA0Op069YtpVLpz77f2Nj4F98HoHUyVAEAAACg1Zk9e3bRCQC0QIYqAAAAALQ6Rx555Ec+U1dX9wmUANCSGKoAUFGmT5++zeutW7dm1qxZWbhw4TbrY8aM+SSzAACAFmTmzJmZMmVK7r///mzatKnoHADKiIvqAagoVVVVH/lMqVRy2SQAALCN119/Pbfeemtuv/32vPfeeznmmGNy0kkn5ZRTTik6DYAyYqcKABVl69atRScAAAAtxObNmzNt2rRMmTIlc+bMyVFHHZU333wzzz//fAYNGlR0HgBl6KM/zgsALdAHH3yQDRs2FJ0BAACUqfHjx2e33XbLDTfckBNPPDFvvvlm7r///pRKpVRXVxedB0CZMlQBoKKsXr06xxxzTDp37pwuXbpk+PDhWbp0adFZAABAmbnxxhvzta99LTNnzsx5552XnXfeuegkAFoAQxUAKspFF12UefPm5fLLL891112X+vr6nHPOOUVnAQAAZeZnP/tZnnnmmfTp0yennnpq/uVf/sXdiwB8JBfVA1BR9txzz0yZMiWjRo1KkixZsiQDBgzIhg0b0q5du4LrAACAcrN8+fJMnTo1U6dOzcaNG1NXV5e77rorJ598ctFpAJQhQxUAKkp1dXXeeuut7Lrrrk1rnTp1yqJFi9K3b9/iwgAAgLLW2NiYmTNn5pZbbsn06dPTs2fPjB07NpMnTy46DYAy0qboAAD4uP3xpZLV1dXxGQIAAOAvKZVKGTVqVEaNGpW6urrccccdmTp1atFZAJQZQxUAKkpjY2P69++fUqnUtLZ+/focfPDBqar6j6vE6urqisgDAABagB49euTwww/P//7f/7voFADKjKEKABXltttuKzoBAABoIWbMmJGHH344bdu2zdlnn53a2tq89NJLufjii3P//fc33dUIAL/nThUAAAAAWp1bbrkl55xzTnr06JH33nsvO++8cyZNmpTx48fn1FNPzbe+9a0MGDCg6EwAyoyhCgAAAACtzuDBg/OlL30p3/nOd3LvvffmlFNOyfDhw3P33Xdnjz32KDoPgDJlqAJARenevfs296n8Oe5UAQCA1q1Tp05ZtGhR+vbtm8bGxrRr1y6zZ8/OYYcdVnQaAGXMnSoAVJQf/vCHRScAAAAtwKZNm9KxY8ckSalUSrt27dKnT5+CqwAod4YqAFSUL3/5y0UnAAAALcSUKVPSuXPnJMmWLVsyderU9OzZc5tnJkyYUEQaAGXK8V8AtCorV67MVVddlR/96EdFpwAAAAXq27fvRx4dXCqVsmzZsk+oCICWwE4VACrOokWLMnv27LRt2zbjxo1Lt27d8u677+aqq67KTTfdlNra2qITAQCAgr322mtFJwDQAtmpAkBFmT59ek4++eRs2bIlSVJbW5uf/vSnGTduXA455JBMnDgxRx99dMGVAAAAALREVUUHAMDH6corr8x5552XtWvXZtKkSVm2bFkmTJiQBx98MA899JCBCgAAkCQZPXp03n///abX11xzTerr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AABQFpYuXZrGxsbsv//+f/aZWbNm5YUXXsjy5cuz5557JknuuOOODBw4MP/6r/+aQw899D/9/UePHp2vfe1rSZJLL700N954Yw499NCccsopSZKLLrooI0aMyNtvv51dd901SfLhhx/mpptuyj777JMk+eY3v5nLL788SbJ27dq8//77OfbYY5veHzBgwH+6DwAAKJ6dKgAAQFn4wx0gf87ixYuz5557Ng1UkuSAAw5It27dsnjx4v+v7z948OCm3++yyy5JkkGDBm239s477zStdezYsWlgkiR9+vRper9Hjx4544wzMmrUqBx33HG54YYbtjkaDAAAaHkMVQAAgLLQr1+/lEqlj/0y+qqqqu0GNh9++OF2z+20005Nv//9EV1/am3r1q1/8mt+/8wffq/bbrstTz75ZP76r/86d911V/r37990NwwAANDyGKoAAABloUePHhk1alR+/OMfZ8OGDdu9X19fnwEDBuSNN97IG2+80bT+4osvpr6+PgcccMCf/HN79eq1zQ6RhoaGLFy48OP/C/wZBx98cC655JI88cQTOfDAA/OLX/ziE/veAADAx8tQBQAAKBs//vGP09DQkGHDhuXee+/NkiVLsnjx4kyePDkjRozIUUcdlUGDBuW0007L3Llz88wzz+T000/PkUcemaFDh/7JP/Mzn/lMHnjggTzwwAN56aWX8o1vfCP19fU7/O+yfPnyXHLJJXnyySfz+uuvZ+bMmVmyZIl7VQAAoAVzUT0AAFA2amtrM3fu3Fx11VW54IILsnLlyvTq1SuHHHJIbrzxxpRKpfz617/O+PHjc8QRR6SqqipHH310/vEf//HP/plf+cpXMn/+/Jx++ulp06ZNvv3tb+fTn/70Dv+7dOzYMS+99FJuv/32rFmzJn369Ml5552Xr33tazv8ewMAADtGqbE5t0ECAAAAAAC0co7/AgAAAAAAaAZDFQAAAAAAgGYwVAEAAAAAAGgGQxUAAAAAAIBmMFQBAAAAAABoBkMVAAAAAACAZjBUAQAAAAAAaAZDFQAAAAAAgGYwVAEAAAAAAGgGQxUAAAAAAIBmMFQBAAAAAABoBkMVAAAAAACAZvi/lchZbNLGNRQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "names, importances = pipe2.columns.importances(target_num=TARGET_NUM)\n", "\n", "plt.subplots(figsize=(20, 10))\n", "\n", "plt.bar(names, importances)\n", "\n", "plt.title('Columns importances for class label ' + class_label[TARGET_NUM])\n", "plt.xlabel('Columns')\n", "plt.ylabel('Importances')\n", "plt.xticks(rotation='vertical')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most important features look as follows:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "```sql\n", "DROP TABLE IF EXISTS \"FEATURE_1_51\";\n", "\n", "CREATE TABLE \"FEATURE_1_51\" AS\n", "SELECT AVG( t2.\"t4__class_label__mapping_2_target_3_avg\" ) AS \"feature_1_51\",\n", " t1.rowid AS rownum\n", "FROM \"POPULATION__STAGING_TABLE_1\" t1\n", "INNER JOIN \"CITES__STAGING_TABLE_3\" t2\n", "ON t1.\"paper_id\" = t2.\"citing_paper_id\"\n", "GROUP BY t1.rowid;\n", "```" ], "text/plain": [ "'DROP TABLE IF EXISTS \"FEATURE_1_51\";\\n\\nCREATE TABLE \"FEATURE_1_51\" AS\\nSELECT AVG( t2.\"t4__class_label__mapping_2_target_3_avg\" ) AS \"feature_1_51\",\\n t1.rowid AS rownum\\nFROM \"POPULATION__STAGING_TABLE_1\" t1\\nINNER JOIN \"CITES__STAGING_TABLE_3\" t2\\nON t1.\"paper_id\" = t2.\"citing_paper_id\"\\nGROUP BY t1.rowid;'" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.features.to_sql()[pipe1.features.sort(by=\"importances\")[0].name]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "```sql\n", "DROP TABLE IF EXISTS \"FEATURE_6_1\";\n", "\n", "CREATE TABLE \"FEATURE_6_1\" AS\n", "SELECT AVG( \n", " CASE\n", " WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" > 5.516436 ) AND ( f_6_2.\"feature_6_2_1\" > 15.824859 ) THEN 19.11484833926196\n", " WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" > 5.516436 ) AND ( f_6_2.\"feature_6_2_1\" <= 15.824859 ) THEN 16.25336464210706\n", " WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.516436 ) AND ( f_6_2.\"feature_6_2_20\" > 0.747603 ) THEN 13.8749941754607\n", " WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.516436 ) AND ( f_6_2.\"feature_6_2_20\" <= 0.747603 ) THEN 8.209072454235654\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" > 0.575234 ) THEN 5.856092769106291\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.575234 ) AND ( f_6_2.\"feature_6_2_4\" > 1.058131 ) THEN -2.241272133429655\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.575234 ) AND ( f_6_2.\"feature_6_2_4\" <= 1.058131 ) THEN -0.6025668375656026\n", " ELSE NULL\n", " END\n", ") AS \"feature_6_1\",\n", " t1.rowid AS rownum\n", "FROM \"POPULATION__STAGING_TABLE_1\" t1\n", "INNER JOIN \"CITES__STAGING_TABLE_3\" t2\n", "ON t1.\"paper_id\" = t2.\"citing_paper_id\"\n", "LEFT JOIN \"FEATURES_6_2\" f_6_2\n", "ON t2.rowid = f_6_2.\"rownum\"\n", "GROUP BY t1.rowid;\n", "```" ], "text/plain": [ "'DROP TABLE IF EXISTS \"FEATURE_6_1\";\\n\\nCREATE TABLE \"FEATURE_6_1\" AS\\nSELECT AVG( \\n CASE\\n WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" > 5.516436 ) AND ( f_6_2.\"feature_6_2_1\" > 15.824859 ) THEN 19.11484833926196\\n WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" > 5.516436 ) AND ( f_6_2.\"feature_6_2_1\" <= 15.824859 ) THEN 16.25336464210706\\n WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.516436 ) AND ( f_6_2.\"feature_6_2_20\" > 0.747603 ) THEN 13.8749941754607\\n WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.516436 ) AND ( f_6_2.\"feature_6_2_20\" <= 0.747603 ) THEN 8.209072454235654\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" > 0.575234 ) THEN 5.856092769106291\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.575234 ) AND ( f_6_2.\"feature_6_2_4\" > 1.058131 ) THEN -2.241272133429655\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.575234 ) AND ( f_6_2.\"feature_6_2_4\" <= 1.058131 ) THEN -0.6025668375656026\\n ELSE NULL\\n END\\n) AS \"feature_6_1\",\\n t1.rowid AS rownum\\nFROM \"POPULATION__STAGING_TABLE_1\" t1\\nINNER JOIN \"CITES__STAGING_TABLE_3\" t2\\nON t1.\"paper_id\" = t2.\"citing_paper_id\"\\nLEFT JOIN \"FEATURES_6_2\" f_6_2\\nON t2.rowid = f_6_2.\"rownum\"\\nGROUP BY t1.rowid;'" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.features.to_sql()[pipe2.features.sort(by=\"importances\")[0].name]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.6 Productionization\n", "\n", "It is possible to productionize the pipeline by transpiling the features into production-ready SQL code. Please also refer to getML's `sqlite3` and `spark` modules." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Creates a folder containing the SQL code.\n", "pipe1.features.to_sql().save(\"cora_pipeline\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pipe1.features.to_sql(dialect=getml.pipeline.dialect.spark_sql).save(\"cora_spark\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.7 Benchmarks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "State-of-the-art approaches on this data set perform as follows:\n", "\n", "| Approach | Study | Accuracy | AUC |\n", "| :-------------------------- | :------------------------ | -----------: | ------: |\n", "| RelF | Dinh et al (2012) | 85.7% | -- |\n", "| LBP | Dinh et al (2012) | 85.0% | -- |\n", "| EPRN | Preisach and Thieme (2006) | 84.0% | -- |\n", "| PRN | Preisach and Thieme (2006) | 81.0% | -- |\n", "| ACORA | Perlich and Provost (2006) | -- | 97.0% |\n", "\n", "\n", "As we can see, the performance of the relboost algorithm, as used in this notebook, compares favorably to these benchmarks." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "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", "
ApproachAccuracyAUC
0FastProp90.0%98.5%
1Relboost89.6%98.5%
\n", "
" ], "text/plain": [ " Approach Accuracy AUC\n", "0 FastProp 90.0% 98.5%\n", "1 Relboost 89.6% 98.5%" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(data={\n", " 'Approach': ['FastProp', 'Relboost'],\n", " 'Accuracy': [f'{score:.1%}' for score in [fastprop_accuracy, relboost_accuracy]],\n", " 'AUC': [f'{score:,.1%}' for score in [fastprop_auc, relboost_auc]]\n", "})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "getml.engine.shutdown()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Conclusion\n", "\n", "In this notebook we have demonstrated that getML outperforms state-of-the-art relational learning algorithms on the CORA dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n", "\n", "Dinh, Quang-Thang, Christel Vrain, and Matthieu Exbrayat. \"A Link-Based Method for Propositionalization.\" ILP (Late Breaking Papers). 2012.\n", "\n", "Motl, Jan, and Oliver Schulte. \"The CTU prague relational learning repository.\" arXiv preprint arXiv:1511.03086 (2015).\n", "\n", "Perlich, Claudia, and Foster Provost. \"Distribution-based aggregation for relational learning with identifier attributes.\" Machine Learning 62.1-2 (2006): 65-105.\n", "\n", "Preisach, Christine, and Lars Schmidt-Thieme. \"Relational ensemble classification.\" Sixth International Conference on Data Mining (ICDM'06). IEEE, 2006." ] } ], "metadata": { "jupytext": { "encoding": "# -*- coding: utf-8 -*-", "formats": "ipynb,py:percent,md" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } } }, "nbformat": 4, "nbformat_minor": 4 }