{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CORA - Categorizing academic publications using getML\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": [ { "name": "stdout", "output_type": "stream", "text": [ "getML engine is already running.\n", "\n", "Connected to project 'cora'\n" ] } ], "source": [ "import copy\n", "import os\n", "from pathlib import Path\n", "from urllib import request\n", "\n", "import numpy as np\n", "import pandas as pd\n", "from IPython.display import Image\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline \n", "\n", "import getml\n", "\n", "getml.engine.launch(home_directory=Path.home(), 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": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Connection(dbname='CORA', dialect='mysql', host='db.relational-data.org', port=3306)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conn = getml.database.connect_mysql(\n", " host=\"db.relational-data.org\",\n", " dbname=\"CORA\",\n", " port=3306,\n", " user=\"guest\",\n", " password=\"relational\"\n", ")\n", "\n", "conn" ] }, { "cell_type": "code", "execution_count": 3, "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": 4, "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": 5, "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": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paper" ] }, { "cell_type": "code", "execution_count": 6, "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": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cites" ] }, { "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_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": 7, "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": 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", "
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": 8, "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": 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", "
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": 9, "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": 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_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": 10, "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": 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_full = getml.data.make_target_columns(paper, \"class_label\")\n", "data_full" ] }, { "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", "
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": 12, "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": 13, "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": 13, "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": 14, "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": 14, "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": 15, "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": 16, "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": 16, "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": 17, "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": 17, "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": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking data model...\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Checking... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n" ] }, { "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": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.check(container.train)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking data model...\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n", "To see the issues in full, run .check() on the pipeline.\n", "\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Trying 3780 features... 100% |██████████| [elapsed: 00:07, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "\n", "Trained pipeline.\n", "Time taken: 0h:0m:14.893815\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-SfPngp'])
" ], "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-SfPngp'])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.fit(container.train)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking data model...\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Checking... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n" ] }, { "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": [ "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": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking data model...\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "The pipeline check generated 3 issues labeled INFO and 0 issues labeled WARNING.\n", "To see the issues in full, run .check() on the pipeline.\n", "\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Training subfeatures... 100% |██████████| [elapsed: 00:01, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Training features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "XGBoost: Training as predictor... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "Trained pipeline.\n", "Time taken: 0h:0m:26.081776\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-SfPngp'])
" ], "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-SfPngp'])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe2.fit(container.train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4 Model evaluation" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n" ] }, { "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-02-21 14:56:28trainclass_label=Case_Based0.99790.99990.02323
12024-02-21 14:56:28trainclass_label=Genetic_Algorithms1.01.0.004915
22024-02-21 14:56:28trainclass_label=Neural_Networks0.98460.99830.065852
32024-02-21 14:56:28trainclass_label=Probabilistic_Methods0.99580.99980.02765
42024-02-21 14:56:28trainclass_label=Reinforcement_Learning0.99951.0.009078
..................
92024-02-21 14:56:55testclass_label=Neural_Networks0.95130.97870.163552
102024-02-21 14:56:55testclass_label=Probabilistic_Methods0.97320.98720.083174
112024-02-21 14:56:55testclass_label=Reinforcement_Learning0.98050.97360.074599
122024-02-21 14:56:55testclass_label=Rule_Learning0.98420.99370.052146
132024-02-21 14:56:55testclass_label=Theory0.95740.9770.128597
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", " 0 2024-02-21 14:56:28 train class_label=Case_Based 0.9979 0.9999 0.02323 \n", " 1 2024-02-21 14:56:28 train class_label=Genetic_Algorithms 1.0 1. 0.004915\n", " 2 2024-02-21 14:56:28 train class_label=Neural_Networks 0.9846 0.9983 0.065852\n", " 3 2024-02-21 14:56:28 train class_label=Probabilistic_Method... 0.9958 0.9998 0.02765 \n", " 4 2024-02-21 14:56:28 train class_label=Reinforcement_Learni... 0.9995 1. 0.009078\n", " ... ... ... ... ... ...\n", " 9 2024-02-21 14:56:55 test class_label=Neural_Networks 0.9513 0.9787 0.163552\n", "10 2024-02-21 14:56:55 test class_label=Probabilistic_Method... 0.9732 0.9872 0.083174\n", "11 2024-02-21 14:56:55 test class_label=Reinforcement_Learni... 0.9805 0.9736 0.074599\n", "12 2024-02-21 14:56:55 test class_label=Rule_Learning 0.9842 0.9937 0.052146\n", "13 2024-02-21 14:56:55 test class_label=Theory 0.9574 0.977 0.128597" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.score(container.test)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n" ] }, { "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-02-21 14:56:54trainclass_label=Case_Based1.01.0.008392
12024-02-21 14:56:54trainclass_label=Genetic_Algorithms1.01.0.003788
22024-02-21 14:56:54trainclass_label=Neural_Networks0.99210.99950.038185
32024-02-21 14:56:54trainclass_label=Probabilistic_Methods0.99791.0.014505
42024-02-21 14:56:54trainclass_label=Reinforcement_Learning1.01.0.004389
..................
92024-02-21 14:56:57testclass_label=Neural_Networks0.94030.9810.178774
102024-02-21 14:56:57testclass_label=Probabilistic_Methods0.97080.98770.092301
112024-02-21 14:56:57testclass_label=Reinforcement_Learning0.98290.97830.075957
122024-02-21 14:56:57testclass_label=Rule_Learning0.98170.99140.067588
132024-02-21 14:56:57testclass_label=Theory0.95010.96630.162815
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", " 0 2024-02-21 14:56:54 train class_label=Case_Based 1.0 1. 0.008392\n", " 1 2024-02-21 14:56:54 train class_label=Genetic_Algorithms 1.0 1. 0.003788\n", " 2 2024-02-21 14:56:54 train class_label=Neural_Networks 0.9921 0.9995 0.038185\n", " 3 2024-02-21 14:56:54 train class_label=Probabilistic_Method... 0.9979 1. 0.014505\n", " 4 2024-02-21 14:56:54 train class_label=Reinforcement_Learni... 1.0 1. 0.004389\n", " ... ... ... ... ... ...\n", " 9 2024-02-21 14:56:57 test class_label=Neural_Networks 0.9403 0.981 0.178774\n", "10 2024-02-21 14:56:57 test class_label=Probabilistic_Method... 0.9708 0.9877 0.092301\n", "11 2024-02-21 14:56:57 test class_label=Reinforcement_Learni... 0.9829 0.9783 0.075957\n", "12 2024-02-21 14:56:57 test class_label=Rule_Learning 0.9817 0.9914 0.067588\n", "13 2024-02-21 14:56:57 test class_label=Theory 0.9501 0.9663 0.162815" ] }, "execution_count": 23, "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": 24, "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-02-21 14:56:55testclass_label=Case_Based0.97080.98610.08689
12024-02-21 14:56:55testclass_label=Genetic_Algorithms0.98540.9980.04898
22024-02-21 14:56:55testclass_label=Neural_Networks0.95130.97870.16355
32024-02-21 14:56:55testclass_label=Probabilistic_Methods0.97320.98720.08317
42024-02-21 14:56:55testclass_label=Reinforcement_Learning0.98050.97360.0746
52024-02-21 14:56:55testclass_label=Rule_Learning0.98420.99370.05215
62024-02-21 14:56:55testclass_label=Theory0.95740.9770.1286
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", "0 2024-02-21 14:56:55 test class_label=Case_Based 0.9708 0.9861 0.08689\n", "1 2024-02-21 14:56:55 test class_label=Genetic_Algorithms 0.9854 0.998 0.04898\n", "2 2024-02-21 14:56:55 test class_label=Neural_Networks 0.9513 0.9787 0.16355\n", "3 2024-02-21 14:56:55 test class_label=Probabilistic_Method... 0.9732 0.9872 0.08317\n", "4 2024-02-21 14:56:55 test class_label=Reinforcement_Learni... 0.9805 0.9736 0.0746 \n", "5 2024-02-21 14:56:55 test class_label=Rule_Learning 0.9842 0.9937 0.05215\n", "6 2024-02-21 14:56:55 test class_label=Theory 0.9574 0.977 0.1286 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.scores.filter(lambda score: score.set_used == \"test\")" ] }, { "cell_type": "code", "execution_count": 25, "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-02-21 14:56:57testclass_label=Case_Based0.97440.97870.10446
12024-02-21 14:56:57testclass_label=Genetic_Algorithms0.99150.99890.03707
22024-02-21 14:56:57testclass_label=Neural_Networks0.94030.9810.17877
32024-02-21 14:56:57testclass_label=Probabilistic_Methods0.97080.98770.0923
42024-02-21 14:56:57testclass_label=Reinforcement_Learning0.98290.97830.07596
52024-02-21 14:56:57testclass_label=Rule_Learning0.98170.99140.06759
62024-02-21 14:56:57testclass_label=Theory0.95010.96630.16282
" ], "text/plain": [ " date time set used target accuracy auc cross entropy\n", "0 2024-02-21 14:56:57 test class_label=Case_Based 0.9744 0.9787 0.10446\n", "1 2024-02-21 14:56:57 test class_label=Genetic_Algorithms 0.9915 0.9989 0.03707\n", "2 2024-02-21 14:56:57 test class_label=Neural_Networks 0.9403 0.981 0.17877\n", "3 2024-02-21 14:56:57 test class_label=Probabilistic_Method... 0.9708 0.9877 0.0923 \n", "4 2024-02-21 14:56:57 test class_label=Reinforcement_Learni... 0.9829 0.9783 0.07596\n", "5 2024-02-21 14:56:57 test class_label=Rule_Learning 0.9817 0.9914 0.06759\n", "6 2024-02-21 14:56:57 test class_label=Theory 0.9501 0.9663 0.16282" ] }, "execution_count": 25, "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": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9849037843150564\n", "0.983174892778554\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": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9718113798503566\n", "0.9702453453975987\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": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "FastProp: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n", "Staging... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Preprocessing... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building subfeatures... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "Relboost: Building features... 100% |██████████| [elapsed: 00:00, remaining: 00:00] \n", "\n" ] } ], "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": 29, "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": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Share of accurately predicted class labels (pipe1):\n", "0.8989037758830695\n", "\n", "Share of accurately predicted class labels (pipe2):\n", "0.8976857490864799\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": 31, "metadata": {}, "outputs": [], "source": [ "TARGET_NUM = 0" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABmAAAAOkCAYAAACxvPtEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAACU8ElEQVR4nOzdd3hW9d348U/CCMgIoGyRAE7E9UCxqIBVFBUHWgRHK+Lqo+J4UFusVUSs0FZR6yzu1WrFUeugVZSqlarVat11gFqVJUKoyDA5vz/8kRoTIAnfmNzwel1XrkvOfc43n/tO7qh5c87Jy7IsCwAAAAAAAJLJr+sBAAAAAAAA1jcCDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAArAd233332H333ZOuef7550deXl7SNeva0UcfHUVFRVXet3nz5vVmnm/L7NmzIy8vL26++eZqH7vqe2bBggXJ5qmPrxHl3XzzzZGXlxezZ8+u61EAAOoVAQYAgDKrfolW2cfYsWNr5XM+88wzcf7558eiRYtqZX3WbOnSpXH++efHjBkz6nqUOrGhP//10X333Rf77rtvbLLJJtG4cePo1KlTDB8+PB5//PG6Hm2tdt9993I/dxs3bhzdunWLE044IT788MO6Hg8AgGpqWNcDAABQ/1xwwQXRrVu3ctt69epVK5/rmWeeifHjx8fRRx8drVq1qpXPweotXbo0xo8fHxFR4Qyan/3sZ7UW3urKddddF6WlpWV/XtPzJ7dkWRbHHHNM3HzzzbHTTjvFmDFjokOHDvHJJ5/EfffdF3vuuWf89a9/jV122aWuR12jTTfdNCZOnBgREStWrIjXX389rr322vjTn/4Ub7zxRmy00UZ1PCEAAFUlwAAAUMG+++4bffr0qesx1snnn38ezZo1q+sx1mjZsmXRuHHjyM+veGJ6fZi/YcOG0bDh+vW/DI0aNarrEagll1xySdx8881x+umnx+TJk8tdPu+cc86J2267LSe+nwsLC+MHP/hBuW3dunWL0aNHx1//+tfYa6+96mgyAACqyyXIAACotkceeST69+8fzZo1ixYtWsSQIUPitddeK7fPP//5zzj66KOje/fu0aRJk+jQoUMcc8wx8emnn5btc/7558dZZ50VEV/9gnHVZXdmz569xvtQ5OXlxfnnn19unby8vHj99dfjiCOOiNatW8duu+1W9vjtt98evXv3jqZNm0abNm3isMMOq/LlfD766KM49thjo1OnTlFQUBDdunWLE088MVasWFG2z3vvvReHHnpotGnTJjbaaKP47ne/Gw899FC5dWbMmBF5eXlx5513xs9+9rPo3LlzbLTRRlFcXFx2r5F333039ttvv2jRokUceeSRERFRWloal112WWy77bbRpEmTaN++ffzoRz+Kzz77bI1zr1ixIs4777zo3bt3FBYWRrNmzaJ///7xxBNPlO0ze/bsaNu2bUREjB8/vuz1X/XaVnYPmC+//DImTJgQPXr0iIKCgigqKoqf/vSnsXz58nL7FRUVxf777x9PP/109O3bN5o0aRLdu3ePW2+9tdx+K1eujPHjx8cWW2wRTZo0iY033jh22223ePTRR1f73BYtWhQNGjSIX//612XbFixYEPn5+bHxxhtHlmVl20888cTo0KFD2Z+/fj+RtT3/VT766KMYOnRoNG/ePNq2bRtnnnlmlJSUrHa+r3vkkUdi4MCB0aJFi2jZsmV85zvfid/+9rdrPObiiy+OXXbZJTbeeONo2rRp9O7dO6ZOnVphv0cffTR22223aNWqVTRv3jy22mqr+OlPf1punyuuuCK23Xbb2GijjaJ169bRp0+ftX7+ylTl/fx1CxYsiOHDh0fLli1j4403jtNOOy2WLVtWYb91eW9+3RdffBETJ06MrbfeOi6++OJK7130wx/+MPr27RsREQsXLowzzzwztttuu2jevHm0bNky9t1333j55ZcrHFeV1/Cjjz6KY445Jtq3bx8FBQWx7bbbxo033ljt57E6q76Hvx6Q3n///TjppJNiq622iqZNm8bGG28chx56aIX7sFT1Pfbmm2/GsGHDok2bNtGkSZPo06dPPPDAAxVmee2112KPPfaIpk2bxqabbhoXXnhhubPKAAD4r/r/138AAPjWLV68uMJNtDfZZJOIiLjtttti5MiRMXjw4PjFL34RS5cujWuuuSZ22223+Mc//lH2y+1HH3003nvvvRg1alR06NAhXnvttZgyZUq89tpr8be//S3y8vLikEMOiX/961/xu9/9Li699NKyz9G2bduYP39+tec+9NBDY4sttoiLLrqo7JfwP//5z+Pcc8+N4cOHx3HHHRfz58+PK664IgYMGBD/+Mc/1njZs48//jj69u0bixYtihNOOCG23nrr+Oijj2Lq1KmxdOnSaNy4ccydOzd22WWXWLp0aZx66qmx8cYbxy233BIHHnhgTJ06NQ4++OBya06YMCEaN24cZ555ZixfvjwaN24cEV+FjcGDB8duu+0WF198cdllhn70ox/FzTffHKNGjYpTTz01Zs2aFVdeeWX84x//iL/+9a+rPaOjuLg4rr/++jj88MPj+OOPjyVLlsQNN9wQgwcPjueeey523HHHaNu2bVxzzTVx4oknxsEHHxyHHHJIRERsv/32q31NjjvuuLjlllti2LBhccYZZ8Szzz4bEydOjDfeeCPuu+++cvu+8847MWzYsDj22GNj5MiRceONN8bRRx8dvXv3jm233TYivoo8EydOjOOOOy769u0bxcXF8fe//z1efPHF1f5N/1atWkWvXr3iySefjFNPPTUiIp5++unIy8uLhQsXxuuvv162/lNPPRX9+/evdJ2qPP+SkpIYPHhw7LzzznHxxRfHY489Fpdcckn06NEjTjzxxNW+ThFf3VPpmGOOiW233TbOPvvsaNWqVfzjH/+IadOmxRFHHLHa4y6//PI48MAD48gjj4wVK1bEnXfeGYceemg8+OCDMWTIkIj46pfg+++/f2y//fZxwQUXREFBQbzzzjvx17/+tWyd6667Lk499dQYNmxYWQD55z//Gc8+++waP39lqvJ+/rrhw4dHUVFRTJw4Mf72t7/Fr3/96/jss8/KBbh1eW9+09NPPx0LFy6M008/PRo0aLDW/d977724//7749BDD41u3brF3Llz4ze/+U0MHDgwXn/99ejUqVNEVO01nDt3bnz3u9+NvLy8GD16dLRt2zYeeeSROPbYY6O4uDhOP/30Kj+PiK++51b9/F25cmW88cYbMW7cuNh8881j1113Ldvv+eefj2eeeSYOO+yw2HTTTWP27NlxzTXXxO677x6vv/562c+QqrzHXnvttdh1112jc+fOMXbs2GjWrFn8/ve/j6FDh8Y999xT9nNszpw58b3vfS++/PLLsv2mTJkSTZs2rdZzBADYYGQAAPD/3XTTTVlEVPqRZVm2ZMmSrFWrVtnxxx9f7rg5c+ZkhYWF5bYvXbq0wvq/+93vsojInnzyybJtv/rVr7KIyGbNmlVu31mzZmURkd10000V1omIbNy4cWV/HjduXBYR2eGHH15uv9mzZ2cNGjTIfv7zn5fb/sorr2QNGzassP2bjjrqqCw/Pz97/vnnKzxWWlqaZVmWnX766VlEZE899VTZY0uWLMm6deuWFRUVZSUlJVmWZdkTTzyRRUTWvXv3Cq/NyJEjs4jIxo4dW277U089lUVEdscdd5TbPm3atArbBw4cmA0cOLDsz19++WW2fPnycsd99tlnWfv27bNjjjmmbNv8+fMrvJ6rrHpdV3nppZeyiMiOO+64cvudeeaZWURkjz/+eNm2rl27Vvhaz5s3LysoKMjOOOOMsm077LBDNmTIkAqfe21OPvnkrH379mV/HjNmTDZgwICsXbt22TXXXJNlWZZ9+umnWV5eXnb55ZeX7Tdy5Misa9euVXr+q74uF1xwQbntO+20U9a7d+81zrdo0aKsRYsW2c4775x98cUX5R5b9b1T2TxZVvG9s2LFiqxXr17ZHnvsUbbt0ksvzSIimz9//mpnOOigg7Jtt912jXNWprL3XlXfz6u+Zw488MBy+5500klZRGQvv/xylmXVe29W9hp90+WXX55FRHbfffdV6TkuW7as7L25yqxZs7KCgoJyX++qvIbHHnts1rFjx2zBggXlth922GFZYWFhpa/d6gwcOLDSn7/bbLNN9t5775Xbt7J1Z86cmUVEduutt5Ztq8p7bM8998y22267bNmyZWXbSktLs1122SXbYostyrat+nn37LPPlm2bN29eVlhYWOnPcQCADZ1LkAEAUMFVV10Vjz76aLmPiK/+FvyiRYvi8MMPjwULFpR9NGjQIHbeeedyl7f6+t+IXrZsWSxYsCC++93vRkTEiy++WCtz/+///m+5P997771RWloaw4cPLzdvhw4dYosttig37zeVlpbG/fffHwcccECl98NZ9Tf+H3744ejbt2+5S541b948TjjhhJg9e3a8/vrr5Y4bOXLkav+2+DfPqLj77rujsLAw9tprr3Lz9+7dO5o3b77G+Rs0aFB2dk1paWksXLgwvvzyy+jTp0+NX/+HH344IiLGjBlTbvsZZ5wREVHhsms9e/Ysd/ZJ27ZtY6uttor33nuvbFurVq3itddei7fffrtas/Tv3z/mzp0bb731VkR8dabLgAEDon///vHUU09FxFdnRWRZttozYKrqm99X/fv3L/ccKvPoo4/GkiVLYuzYsdGkSZNyj1V2eayv+/r3x2effRaLFy+O/v37l/u6rTo75A9/+MNqL//UqlWr+Pe//x3PP//8Gj9fVVT3/XzyySeX+/Mpp5wSEf/9HlqX92ZliouLIyKiRYsWVdq/oKCg7N5LJSUl8emnn5Zdxu2br/OaXsMsy+Kee+6JAw44ILIsK/dcBg8eHIsXL672+62oqKjs5+4jjzwSl112WSxevDj23XffcmcGfv1rsnLlyvj0009j8803j1atWlV4Dmt6jy1cuDAef/zxGD58eCxZsqRs/k8//TQGDx4cb7/9dnz00UcR8dXX77vf/W7Zpdwivnpfr7pkIgAA5bkEGQAAFfTt27fS6LDqF3h77LFHpce1bNmy7J8XLlwY48ePjzvvvDPmzZtXbr/FixcnnPa/unXrVu7Pb7/9dmRZFltssUWl+6/phuzz58+P4uLi6NWr1xo/5/vvvx8777xzhe3bbLNN2eNfX+ObM67SsGHD2HTTTSvMv3jx4mjXrl2lx3zzdf2mW265JS655JJ48803Y+XKlWudYW3ef//9yM/Pj80337zc9g4dOkSrVq3i/fffL7d9s802q7BG69aty92/5oILLoiDDjoottxyy+jVq1fss88+8cMf/nCNl0GLiLKo8tRTT8Wmm24a//jHP+LCCy+Mtm3bxsUXX1z2WMuWLWOHHXao0fONiGjSpEnZfWJW9xwq8+6770ZErPX7pzIPPvhgXHjhhfHSSy+Vu7fO18PNiBEj4vrrr4/jjjsuxo4dG3vuuWcccsghMWzYsLKw8JOf/CQee+yx6Nu3b2y++eax9957xxFHHFHuMlZVVd338zffcz169Ij8/Pyy+5Osy3uzMqt+9ixZsqRK+5eWlsbll18eV199dcyaNavcPX023njjsn9e22s4f/78WLRoUUyZMiWmTJlS6eda2/v0m5o1axaDBg0q+/M+++wTu+22W/Tp0ycmTZoUl1xySUT89743N910U3z00Ufl7n309a/J2t5j77zzTmRZFueee26ce+65q30OnTt3Xu3Pu6222qpazxEAYEMhwAAAUGWr/qb9bbfdVu7G5qt8/QbRw4cPj2eeeSbOOuus2HHHHaN58+ZRWloa++yzT5Vu2Ly6swTWdPPzb55ZUlpaGnl5efHII49Uel+I5s2br3WO1FZ39svX/0b+KqWlpdGuXbu44447Kj3mm2Hg626//fY4+uijY+jQoXHWWWdFu3btokGDBjFx4sSyOFBTazuDY5XV3Yvj678oHjBgQLz77rvxhz/8If785z/H9ddfH5deemlce+21cdxxx6127U6dOkW3bt3iySefjKKiosiyLPr16xdt27aN0047Ld5///146qmnYpdddqnwulZHVe4nktJTTz0VBx54YAwYMCCuvvrq6NixYzRq1Chuuummcjd+b9q0aTz55JPxxBNPxEMPPRTTpk2Lu+66K/bYY4/485//HA0aNIhtttkm3nrrrXjwwQdj2rRpcc8998TVV18d5513XowfP75ac6V+P6d+b2699dYREfHKK6/E0KFD17r/RRddFOeee24cc8wxMWHChGjTpk3k5+fH6aefXu75rO01XLXvD37wgxg5cmSln2ttMbEqevfuHYWFhfHkk0+WbTvllFPipptuitNPPz369esXhYWFkZeXF4cddli557C299iqfc8888wYPHhwpZ//m9EVAICqEWAAAKiyHj16REREu3btyv0N7W/67LPPYvr06TF+/Pg477zzyrZXdgmc1f0yv3Xr1hERsWjRonLbv3mWxdrmzbIsunXrFltuuWWVj4v4Km60bNkyXn311TXu17Vr17LLYH3dm2++WfZ4TfXo0SMee+yx2HXXXat9k+upU6dG9+7d49577y33Go8bN67cflWNKRFfPZfS0tJ4++23y87wifjqJuSLFi2q8XNt06ZNjBo1KkaNGhX/+c9/YsCAAXH++eevMcBEfHUWzJNPPhndunWLHXfcMVq0aBE77LBDFBYWxrRp0+LFF19ca2iozvOvjlXvlVdffbVav7y+5557okmTJvGnP/0pCgoKyrbfdNNNFfbNz8+PPffcM/bcc8+YPHlyXHTRRXHOOefEE088Ufb+bNasWYwYMSJGjBgRK1asiEMOOSR+/vOfx9lnn13h0mirU53389cf+/qZVu+8806UlpZGUVFRRKzbe7Myu+22W7Ru3Tp+97vfxU9/+tO1hrOpU6fG9773vbjhhhvKbV+0aFFssskm5bat6TVs27ZttGjRIkpKStb4MzGFkpKS+M9//lPuOYwcObLsjJiIry4P982fmRFrfo917949Ir4662htz6Fr166Vft0r+xkIAECEe8AAAFBlgwcPjpYtW8ZFF11U7pJWq6y6P8GqX35+/UyHiIjLLruswjHNmjWLiIqhpWXLlrHJJpuU+xvfERFXX311lec95JBDokGDBjF+/PgKs2RZFp9++ulqj83Pz4+hQ4fGH//4x/j73/9e4fFV6+23337x3HPPxcyZM8se+/zzz2PKlClRVFQUPXv2rPK83zR8+PAoKSmJCRMmVHjsyy+/rPQXratU9jV49tlny80ZEbHRRhtFRMXXvzL77bdfRFT8Ok6ePDkiIoYMGbLWNb7pm1+D5s2bx+abb17u0lur079//5g9e3bcddddZZcky8/Pj1122SUmT54cK1euXOv9X6rz/Ktj7733jhYtWsTEiRNj2bJl5R775vfi1zVo0CDy8vLKnek1e/bsuP/++8vtt3DhwgrH7rjjjhERZa/dN1/bxo0bR8+ePSPLskrfv2uaqbK5K3s/r3LVVVeV+/MVV1wRERH77rtvRKzbe7MyG220UfzkJz+JN954I37yk59U+hrffvvt8dxzz5U9p2/uc/fdd5fd62SVtb2GDRo0iO9///txzz33VBprv37PlnXxxBNPxH/+859yl9Or7DlcccUVFc4SXNt7rF27drH77rvHb37zm/jkk0/W+Bz222+/+Nvf/lb2Oq56fHVn6QEAbOicAQMAQJW1bNkyrrnmmvjhD38Y//M//xOHHXZYtG3bNj744IN46KGHYtddd40rr7wyWrZsGQMGDIhf/vKXsXLlyujcuXP8+c9/jlmzZlVYs3fv3hERcc4558Rhhx0WjRo1igMOOCCaNWsWxx13XEyaNCmOO+646NOnTzz55JPxr3/9q8rz9ujRIy688MI4++yzY/bs2TF06NBo0aJFzJo1K+6777444YQT4swzz1zt8RdddFH8+c9/joEDB8YJJ5wQ22yzTXzyySdx9913x9NPPx2tWrWKsWPHxu9+97vYd99949RTT402bdrELbfcErNmzYp77rlnnS5/NXDgwPjRj34UEydOjJdeein23nvvaNSoUbz99ttx9913x+WXXx7Dhg2r9Nj9998/7r333jj44INjyJAhMWvWrLj22mujZ8+e5f4WfdOmTaNnz55x1113xZZbbhlt2rSJXr16VXrvkh122CFGjhwZU6ZMiUWLFsXAgQPjueeei1tuuSWGDh0a3/ve96r9HHv27Bm777579O7dO9q0aRN///vfY+rUqTF69Oi1Hrsqrrz11ltx0UUXlW0fMGBAPPLII1FQUBDf+c531rhGdZ5/dbRs2TIuvfTSOO644+I73/lOHHHEEdG6det4+eWXY+nSpXHLLbdUetyQIUNi8uTJsc8++8QRRxwR8+bNi6uuuio233zz+Oc//1m23wUXXBBPPvlkDBkyJLp27Rrz5s2Lq6++OjbddNPYbbfdIuKrCNShQ4fYddddo3379vHGG2/ElVdeGUOGDKnyzepXPZeqvp9XmTVrVhx44IGxzz77xMyZM+P222+PI444oiwgrOt7szJnnXVWvPbaa3HJJZfEE088EcOGDYsOHTrEnDlz4v7774/nnnsunnnmmYj46v1xwQUXxKhRo2KXXXaJV155Je64446ys0FWqcprOGnSpHjiiSdi5513juOPPz569uwZCxcujBdffDEee+yxSmPZmixevDhuv/32iPgqtL711ltxzTXXRNOmTWPs2LFl++2///5x2223RWFhYfTs2TNmzpwZjz32WLl72ERU7T121VVXxW677RbbbbddHH/88dG9e/eYO3duzJw5M/7973/Hyy+/HBERP/7xj+O2226LffbZJ0477bRo1qxZTJkyJbp27Vru+xMAgP8vAwCA/++mm27KIiJ7/vnn17jfE088kQ0ePDgrLCzMmjRpkvXo0SM7+uijs7///e9l+/z73//ODj744KxVq1ZZYWFhduihh2Yff/xxFhHZuHHjyq03YcKErHPnzll+fn4WEdmsWbOyLMuypUuXZscee2xWWFiYtWjRIhs+fHg2b968CmuMGzcui4hs/vz5lc57zz33ZLvttlvWrFmzrFmzZtnWW2+dnXzyydlbb7211tfk/fffz4466qisbdu2WUFBQda9e/fs5JNPzpYvX162z7vvvpsNGzYsa9WqVdakSZOsb9++2YMPPljhNYuI7O67767wOUaOHJk1a9ZstTNMmTIl6927d9a0adOsRYsW2XbbbZf9+Mc/zj7++OOyfQYOHJgNHDiw7M+lpaXZRRddlHXt2jUrKCjIdtppp+zBBx/MRo4cmXXt2rXc+s8880zWu3fvrHHjxuVe21Wv69etXLkyGz9+fNatW7esUaNGWZcuXbKzzz47W7ZsWbn9unbtmg0ZMqTCc/nmnBdeeGHWt2/frFWrVlnTpk2zrbfeOvv5z3+erVixYrWvx9e1a9cui4hs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AAD1mTNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEhNgAAAAAAAAEsu5AHPVVVdFUVFRNGnSJHbeeed47rnn1rj/okWL4uSTT46OHTtGQUFBbLnllvHwww9/S9MCAAAAAAAbooZ1PUB13HXXXTFmzJi49tprY+edd47LLrssBg8eHG+99Va0a9euwv4rVqyIvfbaK9q1axdTp06Nzp07x/vvvx+tWrX69ocHAAAAAAA2GDkVYCZPnhzHH398jBo1KiIirr322njooYfixhtvjLFjx1bY/8Ybb4yFCxfGM888E40aNYqIiKKiom9zZFijorEPrdPxsycNSTQJAAAAAAAp5cwlyFasWBEvvPBCDBo0qGxbfn5+DBo0KGbOnFnpMQ888ED069cvTj755Gjfvn306tUrLrrooigpKVnt51m+fHkUFxeX+wAAAAAAAKiOnAkwCxYsiJKSkmjfvn257e3bt485c+ZUesx7770XU6dOjZKSknj44Yfj3HPPjUsuuSQuvPDC1X6eiRMnRmFhYdlHly5dkj4PAAAAAABg/ZczAaYmSktLo127djFlypTo3bt3jBgxIs4555y49tprV3vM2WefHYsXLy77+PDDD7/FiQEAAAAAgPVBztwDZpNNNokGDRrE3Llzy22fO3dudOjQodJjOnbsGI0aNYoGDRqUbdtmm21izpw5sWLFimjcuHGFYwoKCqKgoCDt8AAAAAAAwAYlZ86Aady4cfTu3TumT59etq20tDSmT58e/fr1q/SYXXfdNd55550oLS0t2/avf/0rOnbsWGl8AQAAAAAASCFnAkxExJgxY+K6666LW265Jd5444048cQT4/PPP49Ro0ZFRMRRRx0VZ599dtn+J554YixcuDBOO+20+Ne//hUPPfRQXHTRRXHyySfX1VMAAAAAAAA2ADlzCbKIiBEjRsT8+fPjvPPOizlz5sSOO+4Y06ZNi/bt20dExAcffBD5+f9tSl26dIk//elP8X//93+x/fbbR+fOneO0006Ln/zkJ3X1FAAAAAAAgA1ATgWYiIjRo0fH6NGjK31sxowZFbb169cv/va3v9XyVAAAAAAAAP+VU5cgAwAAAAAAyAUCDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGICDAAAAAAAQGIN63oAIJ2isQ+t0/GzJw1JNAkAAAAAwIbNGTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAAAACJCTAAAAAA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mEaNGsVmm23mMmMAAAAAAACrUe0AExFxzjnnxE9/+tNYuHBh6nkAAAAAAAByXo3uAXPllVfGO++8E506dYquXbtGs2bNyj3+4osvJhkOAAAAAAAgF9UowAwdOjTxGAAAAAAAAOuPGgWYcePGpZ4DAAAAAABgvVGjALPKCy+8EG+88UZERGy77bax0047JRkKAAAAAAAgl9UowMybNy8OO+ywmDFjRrRq1SoiIhYtWhTf+9734s4774y2bdumnBEAAAAAACCn5NfkoFNOOSWWLFkSr732WixcuDAWLlwYr776ahQXF8epp56aekYAAAAAAICcUqMzYKZNmxaPPfZYbLPNNmXbevbsGVdddVXsvffeyYYDAAAAAADIRTU6A6a0tDQaNWpUYXujRo2itLR0nYcCAAAAAADIZTUKMHvssUecdtpp8fHHH5dt++ijj+L//u//Ys8990w2HAAAAAAAQC6qUYC58soro7i4OIqKiqJHjx7Ro0eP6NatWxQXF8cVV1yRekYAAAAAAICcUqN7wHTp0iVefPHFeOyxx+LNN9+MiIhtttkmBg0alHQ4AAAAAACAXFStM2Aef/zx6NmzZxQXF0deXl7stddeccopp8Qpp5wS3/nOd2LbbbeNp556qrZmBQAAAAAAyAnVCjCXXXZZHH/88dGyZcsKjxUWFsaPfvSjmDx5crLhAAAAAAAAclG1AszLL78c++yzz2of33vvveOFF15Y56EAAAAAAAByWbUCzNy5c6NRo0arfbxhw4Yxf/78dR4KAAAAAAAgl1UrwHTu3DleffXV1T7+z3/+Mzp27LjOQwEAAAAAAOSyagWY/fbbL84999xYtmxZhce++OKLGDduXOy///7JhgMAAAAAAMhFDauz889+9rO49957Y8stt4zRo0fHVlttFRERb775Zlx11VVRUlIS55xzTq0MCgAAAAAAkCuqFWDat28fzzzzTJx44olx9tlnR5ZlERGRl5cXgwcPjquuuirat29fK4MCAAAAAADkimoFmIiIrl27xsMPPxyfffZZvPPOO5FlWWyxxRbRunXr2pgPAAAAAAAg51Q7wKzSunXr+M53vpNyFgAAAAAAgPVCfl0PUF1XXXVVFBUVRZMmTWLnnXeO5557brX7XnfdddG/f/9o3bp1tG7dOgYNGrTG/QEAAAAAAFLIqQBz1113xZgxY2Lc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AAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACQmwAAAAAAAACSWcwHmqquuiqKiomjSpEnsvPPO8dxzz61x/7vvvju23nrraNKkSWy33Xbx8MMPf0uTAgAAAAAAG6qGdT1Addx1110xZsyYuPbaa2PnnXeOyy67LAYPHhxvvfVWtGvXrsL+zzzzTBx++OExceLE2H///eO3v/1tDB06NF588cXo1atXHTwDAAAAAACoXNHYh9bp+NmThiSahBRy6gyYyZMnx/HHHx+jRo2Knj17xrXXXhsbbbRR3HjjjZXuf/nll8c+++wTZ511VmyzzTYxYcKE+J//+Z+48sorv+XJAQAAAACADUnOBJgVK1bECy+8EIMGDSrblp+fH4MGDYqZM2dWeszMmTPL7R8RMXjw4NXuHxGxfPnyKC4uLvcBAAAAAABQHXlZlmV1PURVfPzxx9G5c+d45plnol+/fmXbf/zjH8df/vKXePbZZysc07hx47jlllvi8MMPL9t29dVXx/jx42Pu3LmVfp7zzz8/xo8fX2H74sWLo2XLlgmeCbAhSX3aaH1brzbWtJ6vyfq2Xm2sab36tV5trGk9X5P1bb3aWNN69Wu92ljTer4m69t6la2ZWn17zrn2fGtDff+arO/r1caa3idERBQXF0dhYeFau0FO3QPm23D22WfHmDFjyv5cXFwcXbp0qcOJAAAAAACg+gSUupUzAWaTTTaJBg0aVDhzZe7cudGhQ4dKj+nQoUO19o+IKCgoiIKCgnUfGAAAAAAA2GDlzD1gGjduHL17947p06eXbSstLY3p06eXuyTZ1/Xr16/c/hERjz766Gr3BwAAAAAASCFnzoCJiBgzZkyMHDky+vTpE3379o3LLrssPv/88xg1alRERBx11FHRuXPnmDhxYkREnHbaaTFw4MC45JJLYsiQIXHnnXfG3//+95gyZUpdPg0AAAAAAGA9l1MBZsSIETF//vw477zzYs6cObHjjjvGtGnTon379hER8cEHH0R+/n9P6tlll13it7/9bfzsZz+Ln/70p7HFFlvE/fffH7169aqrpwAAAAAAAGwAcirARESMHj06Ro8eXelj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bObMmdGqVauy+BIRMWjQoMjPz49nn302Dj744Cqts+rFWFN8Wb58eSxfvrzsz8XFxTUfHNjgCSgAAAAAsGHKiUuQzZkzJ9q1a1duW8OGDaNNmzYxZ86cKq2xYMGCmDBhwhovWxYRMXHixCgsLCz76NKlS43nBgAAAAAANkx1GmDGjh0beXl5a/x488031/nzFBcXx5AhQ6Jnz55x/vnnr3Hfs88+OxYvXlz28eGHH67z5wcAAAAAADYsdXoJsjPOOCOOPvroNe7TvXv36NChQ8ybN6/c9i+//DIWLlwYHTp0WOPxS5YsiX322SdatGgR9913XzRq1GiN+xcUFERBQUGV5gcAAAAAAKhMnQaYtm3bRtu2bde6X79+/WLRokXxwgsvRO/evSMi4vHHH4/S0tLYeeedV3tccXFxDB48OAoKCuKBBx6IJk2aJJsdAAAAAABgdXLiHjDbbLNN7LPPPnH88cfHc889F3/9619j9OjRcdhhh0WnTp0iIuKjjz6KrbfeOp577rmI+Cq+7L333vH555/HDTfcEMXFxTFnzpyYM2dOlJSU1OXTAQAAAAAA1nN1egZMddxxxx0xevTo2HPPPSM/Pz++//3vx69//euyx1euXBlvvfVWLF26NCIiXnzxxXj22WcjImLzzTcvt9asWbOiqKjoW5sdAAAAAADYsORlWZbV9RD1WXFxcRQWFsbixYujZcuWdT0OAAAAAABQh6raDXLiEmQAAAAAAAC5RIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABITIABAAAAAABIrGFdD1DfZVkWERHFxcV1PAkAAAAAAFDXVvWCVf1gdQSYtViyZElERHTp0qWOJwEAAAAAAOqLJUuWRGFh4Wofz8vWlmg2cKWlpfHxxx9HixYtIi8vr67HyRnFxcXRpUuX+PDDD6Nly5b1br3aWNN6666+z7ihrVcba1qvfq1XG2tab93V9xk3tPVqY03r1a/1amNN6627+j7jhrZebaxpvfq1Xm2sab11V99n3NDWq401rVe/1quNNTe09TYkWZbFkiVLolOnTpGfv/o7vTgDZi3y8/Nj0003resxclbLli2TvnlTr1cba1qv/q1pvfq3pvXq13q1sab16t+a1qt/a1qvfq1XG2tar/6tab36t6b16td6tbGm9erfmtarf2tar36tVxtrbmjrbSjWdObLKqtPMwAAAAAAANSIAAMAAAAAAJCYAEOtKCgoiHHjxkVBQUG9XK821rRe/VvTevVvTevVr/VqY03r1b81rVf/1rRe/VqvNta0Xv1b03r1b03r1a/1amNN69W/Na1X/9a0Xv1arzbW3NDWo6K8LMuyuh4CAAAAAABgfeIMGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGAAAAAAAgMQEGKjH5s6dG3PmzEmy1vLly+Pdd9+N5cuXJ1kvImLGjBnxxRdfJFuvPiopKYm5c+fG/Pnz63qUOpNlWV2PAGwAUv6smTVrVnz55ZfJ1qsNG9rP1lz4mqSUC8819Ywb2te4NngN182G+Nr5nql/Uv4/fETt/D93ffxvkNr8/+5ceI/Ux69JbcqFr0l9Vhu/36N2CTDUujfeeCO6d+9e5f232267mDBhQnz44YfJZnj55ZfjwgsvjKuvvjoWLFhQ7rHi4uI45phjqrXe9ddfHyNHjoybbropIiLuuuuu2GabbaJ79+4xbty4as+3cOHCGDZsWGy22WZx4oknRklJSRx33HHRsWPH6Ny5c+yyyy7xySefVHm9m2++OWbOnBkREcuWLYtjjz02mjVrFltuuWU0b948/vd//zfJD+q99947Zs+eXaNjX3/99TjppJNip512io4dO0bHjh1jp512ipNOOilef/31aq01b968cn9+6aWXYuTIkbHrrrvGsGHDYsaMGdWe76GHHooBAwZEs2bNolOnTtGhQ4do1apV/PCHP4wPPvig2usdcMABcdttt31rwerdd9+NPfbYo8r7L1++PM4888wYMGBA/OIXv4iIiAsvvDCaN28eLVq0iCOOOCKKi4urvF5tPN8FCxbEL3/5yzj44IOjX79+0a9fvzj44IPjV7/6VY3/Q/2TTz6J22+/PR5++OFYsWJFucc+//zzuOCCC6q13qOPPhrjxo2Lxx9/PCIinnzyydh3331jjz32KPt5kUp1v8a1sd7LL78cRx11VHTv3j2aNm0azZo1i+222y7OPffcan2/rFLb75OPP/44xo0bF0ceeWSceeaZ8eabb9bperXxfFN/T6deL/XPmtXZaqut4u23367RsSnfx7XxfGvj50xt/Hz9pnX5mnxdivdxyp9d06ZNi1deeSUiIkpLS2PChAnRuXPnKCgoiE033TQmTZpUo1+qpPya1NaM31Rf3ncR6f/9lHq91alP75P6/N80tfU9nfrfeWuS6r/j1uV7JuX3dW39N1xt/vtpXd8nqf8ffnVq+v/ctfHfILXxHkn5/9218bMh5fdg6q9JbfweJCLt77tSf01y4feFa1Ld349G1M7v91L+Po4qyqCWvfTSS1l+fn6V98/Ly8s23njjrEGDBtngwYOzqVOnZitXrqzx5//Tn/6UNW7cONt2222zzTbbLNt4442zxx9/vOzxOXPmVGu+Sy+9NGvWrFl2yCGHZB07dswuvPDCbOONN84uvPDCbPz48VnLli2z3/zmN9Wa8Zhjjsl69eqVXXHFFdnAgQOzgw46KNt+++2zp5/+f+2deXRURfq/39tJOjsJIEtYsmBYB4ctKJtGMSjOoA5EAREB2UYYZEQxIjAsKkRQEAKCIiqMEBEZNxAcBIFhEVATENkCCYjKoshm5AsJyfv7w5P+pSEJ3emqvnVvfZ5zco7dlzx+6tZbdftWpbu38LZt27ht27bcr18/j30JCQm8fft2ZmYePXo0x8fH8wcffMD79+/njz76iBs1asRPP/20x75WrVqV+WMYBjdt2tT12FNWr17NTqeT27VrxxMnTuR58+bxvHnzeOLEidyhQwcODg7mzz77zGOfw+HgU6dOMTPz1q1bOSgoiJOTk/npp5/mLl26cGBgIG/atMlj37///W+OjIzkp556iseNG8e1a9fmMWPG8Pz58zk5OZlvuOEGzsnJ8djH/EddBwYGclRUFD/22GP89ddfe/X73uLtuBs1ahTXqVOHn3rqKW7atCkPHz6cY2NjecmSJZyZmcmJiYn8+OOPe+wT3d6dO3dy1apVuW7duty/f39OS0vjtLQ07t+/P9erV4+rVavGX331ldfO6OhorlKlCoeGhnJiYiJ/9913ruPezg3vvPMOBwYGcuvWrTkiIoLf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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": 33, "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "data": { "image/png": "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bPTq1SsuueSSXJy4+OKL4/zzz48RI0bECSecEMuXL4+rr7469t9//3jmmWcadWbEq6++Gscdd1x861vfiq9//etx+eWXx2GHHRYzZsyIH/zgB3HKKadERERZWVmMGDEiXn755cjP/8//e6qqqophw4bFl770pbjsssti1qxZMXny5HjvvffiwgsvjIiILMvi8MMPj9mzZ8c3v/nN6N+/fzzwwANx9tlnx5tvvhlXXnlljTk9/PDDcdttt8Vpp50WHTp0iN133z2mT58eJ598chx11FFx9NFHR0REv379IqJ+n8/7jRgxIrp16xZlZWXx9NNPx89//vPo2LFjTJ06NTdmypQpccEFF8Q+++wTF154YTRv3jyefPLJePjhh+Pggw+OiPp/f772ta/F888/H9/5zneipKQkli1bFg899FAsWrQoN+aDzjvvvNh5553jZz/7We4yTj169IiIf0e08ePHx5577hllZWWxdOnSuOqqq+Kxxx6r9T147733orS0NAYPHhyXX355tGrVapPfhbfeeiv22muvWLVqVZx00knRu3fvePPNN+OOO+6IdevWRfPmzetc7/bbb49169bFySefHNtvv33Mmzcvrr766li8eHHcfvvtuXEfdRyWLVsWBx98cOywww4xceLEaNeuXSxcuDDuvPPOTc55UyorK+PnP/95jB49Ok488cRYvXp1/OIXv4jS0tKYN29e9O/fv8b4X/7yl7F69eo49dRT4913342rrroqDjzwwPjrX/8axcXFERHx/PPPx7777htdunSJiRMnRuvWreO2226LI488Mn7729/GUUcd1aA53n333dG9e/fYZ5996jV++vTpseuuu8bhhx8e22yzTdx9991xyimnRHV1dZx66qkREfU+ht/61rdy36PTTz89FixYENdcc00888wz8dhjj0WzZs0atC8bf89mWRbLli2Lq6++OtasWRNf//rXa4y76qqr4vDDD4/jjz8+NmzYEL/5zW/i2GOPjXvuuSeGDx8eEf8+zoceemj069cvLrzwwigsLIxXX301Hnvssdx2qqur4/DDD49HH300TjrppNhll13ir3/9a1x55ZXxyiuvxF133ZUbe8IJJ8Qtt9wSxx13XOyzzz7x8MMP594LAICPkAEAwPvccMMNWUTU+ciyLFu9enXWrl277MQTT6yx3pIlS7KioqIay9etW1dr+7feemsWEdkf//jH3LIf/ehHWURkCxYsqDF2wYIFWURkN9xwQ63tREQ2efLk3PPJkydnEZGNHj26xriFCxdmBQUF2cUXX1xj+V//+tdsm222qbV8U8fj/XPbaaedsojIHn/88dyyBx54IIuIrGXLltnf//733PL/+Z//ySIimz17dm7Z2LFjs4jIvvOd7+SWVVdXZ8OHD8+aN2+eLV++PMuyLLvrrruyiMh++MMf1pjTMccck+Xl5WWvvvpqjeORn5+fPf/88zXGLl++vNax2qi+n8/GY/uNb3yjxtijjjoq23777XPP58+fn+Xn52dHHXVUVlVVVWNsdXV1lmX1//688847WURkP/rRj2rN8aNs/Mz+9Kc/5ZZt2LAh69ixY7bbbrtl//znP3PL77nnniwiskmTJuWWbfx8Jk6cWK/3GzNmTJafn1/j/TbauN+zZ8+u9T2o6/iXlZVleXl5ue9QfY7D7373u1r7W19DhgzJhgwZknv+3nvvZevXr68x5p133smKi4trfP4b/222bNkyW7x4cW75k08+mUVEdsYZZ+SWHXTQQVnfvn2zd999N7esuro622effbJevXrlltV1jD6ooqIii4jsiCOOqPc+1nWcS0tLs+7du+ee1+cYPvLII1lEZL/61a9qLJ81a1adyz/Mpn7PFhYWZjfeeONH7sOGDRuy3XbbLTvwwANzy6688sosInK/P+py8803Z/n5+dkjjzxSY/mMGTOyiMgee+yxLMuy7Nlnn80iIjvllFNqjDvuuOM2+fsEAID/cKkxAADqdO2118ZDDz1U4xHx77MkVq1aFaNHj44VK1bkHgUFBTFo0KAalyRq2bJl7ud33303VqxYEV/60pciIuLpp5/+WOb97W9/u8bzO++8M6qrq2PEiBE15tupU6fo1avXh15C6cP06dMn9t5779zzQYMGRUTEgQceGJ///OdrLX/99ddrbeO0007L/bzxUmEbNmyIP/zhDxERcd9990VBQUGcfvrpNdY788wzI8uyuP/++2ssHzJkSPTp06fe+9DQz+eDx3a//faLlStXRmVlZURE3HXXXVFdXR2TJk2qcXbPxv2LqP/3p2XLltG8efOYM2dOkss4/fnPf45ly5bFKaecEi1atMgtHz58ePTu3bvOe4KcfPLJH7nd6urquOuuu+Kwww6r855IHzxr6P3ef/zXrl0bK1asiH322SeyLMtdnq4+x2HjmTr33HNP/Otf//rIOX+YgoKC3Bk61dXV8Y9//CPee++9GDhwYJ3fiSOPPDK6dOmSe77XXnvFoEGD4r777ouIiH/84x/x8MMPx4gRI2L16tW5z3vlypVRWloa8+fPr3Wptw+z8bvWpk2beq/z/uO88QyTIUOGxOuvvx4VFRURUb9jePvtt0dRUVF85StfqfHdHTBgQGy77baN+l3y/t+zt9xyS3z5y1+OE044odaZNu/fh3feeScqKipiv/32q/GZbNyH//3f/43q6upN7sMuu+wSvXv3rrEPBx54YEREbh82fn4f/N3zve99r8H7CACwNXKpMQAA6rTXXnvV+Yfk+fPnR0Tk/lD3QW3bts39/I9//COmTJkSv/nNb3I3PN9o4x88U+vWrVuN5/Pnz48sy6JXr151jm/opYE2en9ciYgoKiqKiIiuXbvWufyDfzTPz8+P7t2711j2hS98ISIid++Ov//979G5c+daf2TeZZddcq+/3wf3/aM09PP54D63b98+Iv69b23bto3XXnst8vPzPzT+1Pf7U1hYGFOnTo0zzzwziouL40tf+lIceuihMWbMmOjUqVP9d/L/23isdt5551qv9e7dOx599NEay7bZZpv43Oc+95HbXb58eVRWVsZuu+3W4DktWrQoJk2aFL///e9rfT82Hv/6HIchQ4bE1772tZgyZUpceeWVccABB8SRRx4Zxx13XBQWFjZ4XjfddFP8+Mc/jpdeeqlGhKjr+1XXv6svfOELcdttt0XEvy/Jl2VZnH/++XH++efX+X7Lli2rEW8+zMbvx+rVq+s1PiLisccei8mTJ8fcuXNr3ZOooqIiioqK6nUM58+fHxUVFdGxY8dN7kdDffD37OjRo2OPPfaI0047LQ499NBcBLvnnnvihz/8YTz77LM17sXy/rA3cuTI+PnPfx4nnHBCTJw4MQ466KA4+uij45hjjsmF0Pnz58eLL76Yu/fTpvbh73//e+Tn5+cu07dRXf9+AACoTXgBAKBBNv5P6ptvvrnOP4C//6bQI0aMiMcffzzOPvvs6N+/f2y77bZRXV0dw4YN2+T/yH6/TZ0tUFVVtcl13v8/wzfONy8vL+6///4oKCioNX7bbbf9yHnUpa5tfdjy7P/fb+bj9MF9/ygN/XxS7FtDvj/f+9734rDDDou77rorHnjggTj//POjrKwsHn744dhjjz3q/Z6NUVhYWOusnZSqqqriK1/5SvzjH/+I73//+9G7d+9o3bp1vPnmmzFu3Lgax/+jjkNeXl7ccccd8cQTT8Tdd98dDzzwQHzjG9+IH//4x/HEE0806Dt+yy23xLhx4+LII4+Ms88+Ozp27BgFBQVRVlYWr732WoP3c+N+nHXWWVFaWlrnmJ49e9Z7e23bto3OnTvH3/72t3qNf+211+Kggw6K3r17xxVXXBFdu3aN5s2bx3333RdXXnllbn71OYbV1dXRsWPH+NWvflXne20qZjREfn5+fPnLX46rrroq5s+fH7vuums88sgjcfjhh8f+++8fP/3pT2PHHXeMZs2axQ033BC//vWvc+u2bNky/vjHP8bs2bPj3nvvjVmzZsXMmTPjwAMPjAcffDAKCgqiuro6+vbtG1dccUWd7//BcAwAQOMILwAANMjG/wHdsWPHGDp06CbHvfPOO1FeXh5TpkyJSZMm5ZZvPOPh/TYVWDaeUbFq1aoayz94psdHzTfLsujWrVvujJJPg+rq6nj99ddrzOmVV16JiMjdOH6nnXaKP/zhD7F69eoaZ7289NJLudc/yqaObUM+n/rq0aNHVFdXxwsvvFDrJuzvHxPx0d+f948/88wz48wzz4z58+dH//7948c//nHccsstDZrbxmP18ssv1zrb5uWXX67XsazLDjvsEG3btq13CNjor3/9a7zyyitx0003xZgxY3LLN17S74Pqcxy+9KUvxZe+9KW4+OKL49e//nUcf/zx8Zvf/CZOOOGEes/rjjvuiO7du8edd95Z47szefLkOsfX9X155ZVXct/hjWd1NWvWrF6fd30ceuih8bOf/Szmzp1b43J/dbn77rtj/fr18fvf/77GGVubuizYhx3DHj16xB/+8IfYd999Gxw5G+K9996LiIg1a9ZERMRvf/vbaNGiRTzwwAM1zmC64YYbaq2bn58fBx10UBx00EFxxRVXxCWXXBLnnXdezJ49O4YOHRo9evSIv/zlL3HQQQd96GXwdtppp6iuro7XXnutxlkuL7/8cqrdBAD4THOPFwAAGqS0tDTatm0bl1xySZ33Qli+fHlE/OfsiA+eDTFt2rRa67Ru3ToiageWtm3bRocOHeKPf/xjjeU//elP6z3fo48+OgoKCmLKlCm15pJlWaxcubLe20rtmmuuqTGXa665Jpo1axYHHXRQRER89atfjaqqqhrjIiKuvPLKyMvLi0MOOeQj36NVq1YRUfvYNuTzqa8jjzwy8vPz48ILL6x1xszG96nv92fdunXx7rvv1nitR48e0aZNmxqXWqqvgQMHRseOHWPGjBk11r///vvjxRdfjOHDhzd4mxH//kP3kUceGXfffXf8+c9/rvX6ps4Gquv4Z1kWV111VY1x9TkO77zzTq332Ri+Gnqs6prXk08+GXPnzq1z/F133VXjHi3z5s2LJ598Mvfd7NixYxxwwAHxP//zP/H222/XWn/j590Q55xzTrRu3TpOOOGEWLp0aa3XX3vttdxxrGt/KioqakWL+hzDESNGRFVVVVx00UW13vO9996r9W+sMf71r3/Fgw8+GM2bN89dUrCgoCDy8vJqnOm3cOHCuOuuu2qs+49//KPW9urahzfffDOuu+66WmP/+c9/xtq1ayMicp/fT37ykxpjNuf3AwDA1sQZLwAANEjbtm1j+vTp8V//9V/xxS9+MUaNGhU77LBDLFq0KO69997Yd99945prrom2bdvG/vvvH5dddln861//ii5dusSDDz4YCxYsqLXNAQMGRETEeeedF6NGjYpmzZrFYYcdlvvj6qWXXhonnHBCDBw4MP74xz/mzgypjx49esQPf/jDOPfcc2PhwoVx5JFHRps2bWLBggXxu9/9Lk466aQ466yzkh2f+mrRokXMmjUrxo4dG4MGDYr7778/7r333vjBD36Qu2TRYYcdFl/+8pfjvPPOi4ULF8buu+8eDz74YPzv//5vfO9736t1/4W6tGzZMvr06RMzZ86ML3zhC7HddtvFbrvtFrvttlu9P5/66tmzZ5x33nlx0UUXxX777RdHH310FBYWxp/+9Kfo3LlzlJWV1fv788orr8RBBx0UI0aMiD59+sQ222wTv/vd72Lp0qUxatSoBs+tWbNmMXXq1Bg/fnwMGTIkRo8eHUuXLo2rrroqSkpK4owzzmj0fl9yySXx4IMPxpAhQ+Kkk06KXXbZJd5+++24/fbb49FHH83d9Pz9evfuHT169Iizzjor3nzzzWjbtm389re/rXWvl/och5tuuil++tOfxlFHHRU9evSI1atXx3XXXRdt27aNr371qw3al0MPPTTuvPPOOOqoo2L48OGxYMGCmDFjRvTp0yd3Bsb79ezZMwYPHhwnn3xyrF+/PqZNmxbbb799nHPOObkx1157bQwePDj69u0bJ554YnTv3j2WLl0ac+fOjcWLF8df/vKXBs2xR48e8etf/zpGjhwZu+yyS4wZMyZ222232LBhQzz++ONx++23x7hx4yIi4uCDD47mzZvHYYcdFt/61rdizZo1cd1110XHjh1rhKD6HMMhQ4bEt771rSgrK4tnn302Dj744GjWrFnMnz8/br/99rjqqqvimGOOadC+3H///bkz2JYtWxa//vWvY/78+TFx4sTc/WyGDx8eV1xxRQwbNiyOO+64WLZsWVx77bXRs2fPeO6553LbuvDCC+OPf/xjDB8+PHbaaadYtmxZ/PSnP43Pfe5zMXjw4IiI+K//+q+47bbb4tvf/nbMnj079t1336iqqoqXXnopbrvttnjggQdi4MCB0b9//xg9enT89Kc/jYqKithnn32ivLw8Xn311QbtHwDAVisDAID3ueGGG7KIyP70pz996LjZs2dnpaWlWVFRUdaiRYusR48e2bhx47I///nPuTGLFy/OjjrqqKxdu3ZZUVFRduyxx2ZvvfVWFhHZ5MmTa2zvoosuyrp06ZLl5+dnEZEtWLAgy7IsW7duXfbNb34zKyoqytq0aZONGDEiW7ZsWa1tTJ48OYuIbPny5XXO97e//W02ePDgrHXr1lnr1q2z3r17Z6eeemr28ssv1+t4bJxPlmXZTjvtlA0fPrzW2IjITj311BrLFixYkEVE9qMf/Si3bOzYsVnr1q2z1157LTv44IOzVq1aZcXFxdnkyZOzqqqqGuuvXr06O+OMM7LOnTtnzZo1y3r16pX96Ec/yqqrqz/yvTd6/PHHswEDBmTNmzevcdzq+/ls6tjWdWyyLMuuv/76bI899sgKCwuz9u3bZ0OGDMkeeuihGmM+6vuzYsWK7NRTT8169+6dtW7dOisqKsoGDRqU3XbbbXXuY13zqus7PHPmzNzctttuu+z444/PFi9eXGPMxs+nIf7+979nY8aMyXbYYYessLAw6969e3bqqadm69evz+1vRGSzZ8/OrfPCCy9kQ4cOzbbddtusQ4cO2Yknnpj95S9/ySIiu+GGG+p9HJ5++uls9OjR2ec///mssLAw69ixY3booYfW+Le4KUOGDMmGDBmSe15dXZ1dcskl2U477ZQVFhZme+yxR3bPPfdkY8eOzXbaaafcuPd/r3/84x9nXbt2zQoLC7P99tsv+8tf/lLrfV577bVszJgxWadOnbJmzZplXbp0yQ499NDsjjvuyI2p6xh9mFdeeSU78cQTs5KSkqx58+ZZmzZtsn333Te7+uqrs3fffTc37ve//33Wr1+/rEWLFllJSUk2derU7Prrr6/x3W3IMfzZz36WDRgwIGvZsmXWpk2brG/fvtk555yTvfXWW/Wad5b95zv6/keLFi2y/v37Z9OnT6/17/sXv/hF1qtXr6ywsDDr3bt3dsMNN+T+XW5UXl6eHXHEEVnnzp2z5s2bZ507d85Gjx6dvfLKKzW2tWHDhmzq1KnZrrvumvs3OmDAgGzKlClZRUVFbtw///nP7PTTT8+23377rHXr1tlhhx2WvfHGG3X+/gYAoKa8LPsE7vIJAADkjBs3Lu644446zyAAAABgy+YeLwAAAAAAAIm4xwsAAAAksGbNmo88k22HHXaIgoKCT2hGAAA0BeEFAAAAErj88stjypQpHzpmwYIFUVJS8slMCACAJuEeLwAAAJDA66+/Hq+//vqHjhk8eHC0aNHiE5oRAABNQXgBAAAAAABIJL+pJwAAAAAAAPBZ4R4vdaiuro633nor2rRpE3l5eU09HQAAAAAAoAllWRarV6+Ozp07R37+h5/TIrzU4a233oquXbs29TQAAAAAAIBPkTfeeCM+97nPfegY4aUObdq0iYh/H8C2bds28WwAAAAAAICmVFlZGV27ds31gw8jvNRh4+XF2rZtK7wAAAAAAAAREfW6PcmHX4gMAAAAAACAehNeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEhFeAAAAAAAAEtmmqSfAlqVk4r2bvY2Flw5PMBMAAAAAAPj0ccYLAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIsILAAAAAABAIp+K8HLttddGSUlJtGjRIgYNGhTz5s3b5Ng777wzBg4cGO3atYvWrVtH//794+abb64xZty4cZGXl1fjMWzYsI97NwAAAAAAgK3cNk09gZkzZ8aECRNixowZMWjQoJg2bVqUlpbGyy+/HB07dqw1frvttovzzjsvevfuHc2bN4977rknxo8fHx07dozS0tLcuGHDhsUNN9yQe15YWPiJ7A8AAAAAALD1avIzXq644oo48cQTY/z48dGnT5+YMWNGtGrVKq6//vo6xx9wwAFx1FFHxS677BI9evSI7373u9GvX7949NFHa4wrLCyMTp065R7t27f/JHYHAAAAAADYijVpeNmwYUM89dRTMXTo0Nyy/Pz8GDp0aMydO/cj18+yLMrLy+Pll1+O/fffv8Zrc+bMiY4dO8bOO+8cJ598cqxcuXKT21m/fn1UVlbWeAAAAAAAADRUk15qbMWKFVFVVRXFxcU1lhcXF8dLL720yfUqKiqiS5cusX79+igoKIif/vSn8ZWvfCX3+rBhw+Loo4+Obt26xWuvvRY/+MEP4pBDDom5c+dGQUFBre2VlZXFlClT0u0YAAAAAACwVWrye7w0Rps2beLZZ5+NNWvWRHl5eUyYMCG6d+8eBxxwQEREjBo1Kje2b9++0a9fv+jRo0fMmTMnDjrooFrbO/fcc2PChAm555WVldG1a9eP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ERHx0EMPxUMPPRT3339/HHLIIXH22WcnnSAAAAAAAMCWYpvGrLRkyZJceLnnnntixIgRcfDBB0dJSUkMGjQo6QQBAAAAAAC2FI0646V9+/bxxhtvRETErFmzYujQoRERkWVZVFVVpZsdAAAAAADAFqRRZ7wcffTRcdxxx0WvXr1i5cqVccghh0RExDPPPBM9e/ZMOkEAAAAAAIAtRaPCy5VXXhklJSXxxhtvxGWXXRbbbrttRES8/fbbccoppySdIAAAAAAAwJaiUeGlWbNmcdZZZ9VafsYZZ2z2hAAAAAAAALZUjbrHS0TEzTffHIMHD47OnTvH3//+94iImDZtWvzv//5vsskBAAAAAABsSRoVXqZPnx4TJkyIQw45JFatWhVVVVUREdGuXbuYNm1ayvkBAAAAAABsMRoVXq6++uq47rrr4rzzzouCgoLc8oEDB8Zf//rXZJMDAAAAAADYkjQqvCxYsCD22GOPWssLCwtj7dq1mz0pAAAAAACALVGjwku3bt3i2WefrbV81qxZscsuu2zunAAAAAAAALZI2zRmpQkTJsSpp54a7777bmRZFvPmzYtbb701ysrK4uc//3nqOQIAAAAAAGwRGhVeTjjhhGjZsmX893//d6xbty6OO+646Ny5c1x11VUxatSo1HMEAAAAAADYIjQqvEREHH/88XH88cfHunXrYs2aNdGxY8eU8wIAAAAAANjiNCq8LFiwIN57773o1atXtGrVKlq1ahUREfPnz49mzZpFSUlJyjkCAAAAAABsEfIbs9K4cePi8ccfr7X8ySefjHHjxm3unAAAAAAAALZIjQovzzzzTOy77761ln/pS1+KZ599dnPnBAAAAAAAsEVqVHjJy8uL1atX11peUVERVVVVmz0pAAAAAACALVGjwsv+++8fZWVlNSJLVVVVlJWVxeDBg5NNDgAAAAAAYEuyTWNWmjp1auy///6x8847x3777RcREY888khUVlbGww8/nHSCAAAAAAAAW4pGnfHSp0+feO6552LEiBGxbNmyWL16dYwZMyZeeuml2G233VLPEQAAAAAAYIvQqDNeIiI6d+4cl1xyScq5AAAAAAAAbNEaHV5WrVoV8+bNi2XLlkV1dXWN18aMGbPZEwMAAAAAANjSNCq83H333XH88cfHmjVrom3btpGXl5d7LS8vT3gBAAAAAAC2So26x8uZZ54Z3/jGN2LNmjWxatWqeOedd3KPf/zjHw3e3rXXXhslJSXRokWLGDRoUMybN2+TY6+77rrYb7/9on379tG+ffsYOnRorfFZlsWkSZNixx13jJYtW8bQoUNj/vz5DZ4XAAAAAABAQzQqvLz55ptx+umnR6tWrTZ7AjNnzowJEybE5MmT4+mnn47dd989SktLY9myZXWOnzNnTowePTpmz54dc+fOja5du8bBBx8cb775Zm7MZZddFj/5yU9ixowZ8eSTT0br1q2jtLQ03n333c2eLwAAAAAAwKbkZVmWNXSlo48+OkaNGhUjRozY7AkMGjQo9txzz7jmmmsiIqK6ujq6du0a3/nOd2LixIkfuX5VVVW0b98+rrnmmhgzZkxkWRadO3eOM888M84666yIiKioqIji4uK48cYbY9SoUR+5zcrKyigqKoqKiopo27bt5u3gZ0zJxHs3exsLLx2eYCYAAAAAAPDJaEg3aNQ9XoYPHx5nn312vPDCC9G3b99o1qxZjdcPP/zwem1nw4YN8dRTT8W5556bW5afnx9Dhw6NuXPn1msb69ati3/961+x3XbbRUTEggULYsmSJTF06NDcmKKiohg0aFDMnTu3zvCyfv36WL9+fe55ZWVlvd4bAAAAAADg/RoVXk488cSIiLjwwgtrvZaXlxdVVVX12s6KFSuiqqoqiouLaywvLi6Ol156qV7b+P73vx+dO3fOhZYlS5bktvHBbW587YPKyspiypQp9Xo/AAAAAACATWnUPV6qq6s3+ahvdEnh0ksvjd/85jfxu9/9Llq0aNHo7Zx77rlRUVGRe7zxxhsJZwkAAAAAAGwtGnXGSyodOnSIgoKCWLp0aY3lS5cujU6dOn3oupdffnlceuml8Yc//CH69euXW75xvaVLl8aOO+5YY5v9+/evc1uFhYVRWFjYyL0AAAAAAAD4t0aHl7Vr18b//d//xaJFi2LDhg01Xjv99NPrtY3mzZvHgAEDory8PI488siI+PfZNOXl5XHaaadtcr3LLrssLr744njggQdi4MCBNV7r1q1bdOrUKcrLy3OhpbKyMp588sk4+eST67+DAAAAAAAADdSo8PLMM8/EV7/61Vi3bl2sXbs2tttuu1ixYkW0atUqOnbsWO/wEhExYcKEGDt2bAwcODD22muvmDZtWqxduzbGjx8fERFjxoyJLl26RFlZWURETJ06NSZNmhS//vWvo6SkJHfflm233Ta23XbbyMvLi+9973vxwx/+MHr16hXdunWL888/Pzp37pyLOwAAAAAAAB+HRoWXM844Iw477LCYMWNGFBUVxRNPPBHNmjWLr3/96/Hd7363QdsaOXJkLF++PCZNmhRLliyJ/v37x6xZs6K4uDgiIhYtWhT5+f+5Fc306dNjw4YNccwxx9TYzuTJk+OCCy6IiIhzzjkn1q5dGyeddFKsWrUqBg8eHLNmzdqs+8AAAAAAAAB8lLwsy7KGrtSuXbt48sknY+edd4527drF3LlzY5dddoknn3wyxo4dGy+99NLHMddPTGVlZRQVFUVFRUW0bdu2qafzqVIy8d7N3sbCS4cnmAkAAAAAAHwyGtIN8j/01U1o1qxZ7iyUjh07xqJFiyIioqioKN54443GbBIAAAAAAGCL16hLje2xxx7xpz/9KXr16hVDhgyJSZMmxYoVK+Lmm2+O3XbbLfUcAQAAAAAAtgiNOuPlkksuiR133DEiIi6++OJo3759nHzyybF8+fL4n//5n6QTBAAAAAAA2FI06oyXgQMH5n7u2LFjzJo1K9mEAAAAAAAAtlSNOuPlwAMPjFWrVtVaXllZGQceeODmzgkAAAAAAGCL1KjwMmfOnNiwYUOt5e+++2488sgjmz0pAAAAAACALVGDLjX23HPP5X5+4YUXYsmSJbnnVVVVMWvWrOjSpUu62QEAAAAAAGxBGhRe+vfvH3l5eZGXl1fnJcVatmwZV199dbLJAQAAAAAAbEkaFF4WLFgQWZZF9+7dY968ebHDDjvkXmvevHl07NgxCgoKkk8SAAAAAABgS9Cg8LLTTjvFv/71rxg7dmxsv/32sdNOO31c8wIAAAAAANji5Dd0hWbNmsXvfve7j2MuAAAAAAAAW7QGh5eIiCOOOCLuuuuuxFMBAAAAAADYsjXoUmMb9erVKy688MJ47LHHYsCAAdG6desar59++ulJJgcAAAAAALAlaVR4+cUvfhHt2rWLp556Kp566qkar+Xl5QkvAAAAAADAVqlR4WXBggWp5wEAAAAAALDFa9Q9Xt4vy7LIsizFXAAAAAAAALZojQ4vv/zlL6Nv377RsmXLaNmyZfTr1y9uvvnmlHMDAAAAAADYojTqUmNXXHFFnH/++XHaaafFvvvuGxERjz76aHz729+OFStWxBlnnJF0kgAAAAAAAFuCRoWXq6++OqZPnx5jxozJLTv88MNj1113jQsuuEB4AQAAAAAAtkqNutTY22+/Hfvss0+t5fvss0+8/fbbmz0pAAAAAACALVGjwkvPnj3jtttuq7V85syZ0atXr82eFAAAAAAAwJaoUZcamzJlSowcOTL++Mc/5u7x8thjj0V5eXmdQQYAAAAAAGBr0KgzXr72ta/Fk08+GR06dIi77ror7rrrrujQoUPMmzcvjjrqqNRzBAAAAAAA2CI06oyXiIgBAwbELbfcknIuAAAAAAAAW7RGh5eqqqr43e9+Fy+++GJERPTp0yeOOOKI2GabRm8SAAAAAABgi9aoSvL888/H4YcfHkuWLImdd945IiKmTp0aO+ywQ9x9992x2267JZ0kAAAAAADAlqBR93g54YQTYtddd43FixfH008/HU8//XS88cYb0a9fvzjppJNSzxEAAAAAAGCL0KgzXp599tn485//HO3bt88ta9++fVx88cWx5557JpscAAAAAADAlqRRZ7x84QtfiKVLl9ZavmzZsujZs+dmTwoAAAAAAGBL1KjwUlZWFqeffnrccccdsXjx4li8eHHccccd8b3vfS+mTp0alZWVuQcAAAAAAMDWolGXGjv00EMjImLEiBGRl5cXERFZlkVExGGHHZZ7npeXF1VVVSnmCQAAAAAA8KnXqPAye/bs1PMAAAAAAADY4jUqvAwZMiT1PAAAAAAAALZ4jQovERHvvvtuPPfcc7Fs2bKorq6u8drhhx++2RMDAAAAAADY0jQqvMyaNSvGjBkTK1asqPWa+7oAAAAAAABbq/zGrPSd73wnjj322Hj77bejurq6xkN0AQAAAAAAtlaNCi9Lly6NCRMmRHFxcer5AAAAAAAAbLEaFV6OOeaYmDNnTuKpAAAAAAAAbNkadY+Xa665Jo499th45JFHom/fvtGsWbMar59++ulJJgcAAAAAALAlaVR4ufXWW+PBBx+MFi1axJw5cyIvLy/3Wl5envACAAAAAABslRoVXs4777yYMmVKTJw4MfLzG3W1MgAAAAAAgM+cRlWTDRs2xMiRI0UXAAAAAACA92lUORk7dmzMnDkz9VwAAAAAAAC2aI261FhVVVVcdtll8cADD0S/fv2iWbNmNV6/4oorkkwOAAAAAABgS9Ko8PLXv/419thj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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": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABlUAAARGCAYAAAChTTY/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAACIIklEQVR4nOzdeXQV9d348U9CIWwSkCUIUiKLC6Ji4QFRER9FKcW1VVH7e4BUqHWvVFvRXwHxqakb4o9a0Vqp1bZSqbWtWhRR60bFDbXuWhY3NpFVJZLM7w8Pt8YE/BIjifJ6nXPPIXNn7v3MJORA3pmZvCzLsgAAAAAAAGCz8ut6AAAAAAAAgC8DUQUAAAAAACCBqAIAAAAAAJBAVAEAAAAAAEggqgAAAAAAACQQVQAAAAAAABKIKgAAAAAAAAlEFQAAAAAAgASiCgAAAAAAQAJRBQCALXLggQfGgQceWNdjfGGKi4tj5MiRdT0GW2Dt2rUxatSoaN++feTl5cUPf/jDuh6pXv49eeCBByIvLy8eeOCBLd525MiR0bx581qdpz4eIyqbMGFC5OXl1fUYAAD1iqgCAPAV9/rrr8fJJ58cXbp0icaNG0eLFi1iv/32i6uuuio++OCDuh6PWnbXXXfFhAkT6nqMreriiy+O3/zmN3HKKafETTfdFP/zP/9T1yNRy8rLy2PatGlx4IEHxvbbbx8FBQVRXFwcJSUl8cQTT9T1eJ+puLg48vLyco/GjRtH9+7d49xzz40VK1bU9XgAAGyBr9X1AAAAfHHuvPPOOPbYY6OgoCCGDx8ePXv2jLKysnj44Yfj3HPPjeeffz6uu+66uh6zXnn55ZcjP//L+7tHd911V1x99dXbVFi57777Yp999onx48fX9Sh8AT744IP49re/HTNnzowDDjggzj///Nh+++1jwYIF8cc//jFuvPHGWLRoUey44451Pepm9erVK370ox9FRMSHH34YTz75ZEyePDn+8Y9/xNy5c+t4OgAAUokqAABfUfPnz4/jjz8+OnfuHPfdd1/ssMMOuedOO+20eO211+LOO++swwnrp4KCgroeoUbWrVsXzZo1q+sx6sTSpUujR48etfZ6GzZsiIqKimjUqFGtvSY1d+6558bMmTPjyiuvrHJpt/Hjx8eVV15ZN4NtoY4dO8b/+T//J/fxqFGjonnz5nH55ZfHq6++Gt27d6/D6QAASPXl/RU8AAA269JLL421a9fGr3/960pBZaNu3brFWWedlft4w4YNcdFFF0XXrl1zl9Y5//zzY/369Zt9n9/85jeRl5cXCxYsqLS8uvs3HHjggdGzZ8949tlnY+DAgdG0adPo1q1bzJgxIyIi/vGPf0S/fv2iSZMmscsuu8S9995b6TU3Xt//tddei5EjR0bLli2jsLAwSkpK4v3336+07qxZs2L//fePli1bRvPmzWOXXXaJ888//zOP26fvqbJx/x5++OE488wzo23bttGyZcs4+eSTo6ysLFauXBnDhw+PVq1aRatWreLHP/5xZFmW237BggWRl5cXl19+eVx55ZXRuXPnaNKkSQwcODD+9a9/VXn/++67LwYMGBDNmjWLli1bxpFHHhkvvvhitcfhhRdeiBNPPDFatWoV+++/f4wcOTKuvvrqiIhKlxra6PLLL4999903WrduHU2aNInevXvnjv0n5eXlxemnnx6333579OzZMwoKCmL33XePmTNnVln3rbfeipNOOik6dOgQBQUFsdNOO8Upp5wSZWVluXVWrlwZP/zhD6NTp05RUFAQ3bp1i0suuSQqKioqvdYtt9wSvXv3ju222y5atGgRe+yxR1x11VWb/Fxt/BqbP39+3Hnnnbn93fi1uHTp0jjppJOiqKgoGjduHHvttVfceOONlV7jk5+fyZMn577+X3jhhU2+b0TEzTffHH379o2mTZtGq1at4oADDoh77rlnk+uXlZXFuHHjonfv3lFYWBjNmjWLAQMGxP33319l3c86Dh999FFceOGF0b1792jcuHG0bt069t9//5g1a9ZmZ67OQw89FMcee2x8/etfj4KCgujUqVOcffbZm7w04L///e8YPHhwNGvWLDp06BATJ06s9PUeEVFRURGTJ0+O3XffPRo3bhxFRUVx8sknx3vvvbfF87355ptx7bXXxiGHHFLtvXIaNGgQ55xzTu4slYULF8app54au+yySzRp0iRat24dxx57bJXvT6nH8KWXXopjjjkmtt9++2jcuHH06dMn/vrXv27xfmxK+/btIyLia1/7z+87PvvsszFy5MjcJRvbt28f3/ve9+Ldd9+ttO2aNWvihz/8YRQXF0dBQUG0a9cuDjnkkHjqqacqrffYY4/FN7/5zSgsLIymTZvGwIED45FHHqkyy8MPPxz/9V//FY0bN46uXbvGtddeW2v7CQDwVeJMFQCAr6i//e1v0aVLl9h3332T1h81alTceOONccwxx8SPfvSjeOyxx6K0tDRefPHF+POf/1xrc7333ntx2GGHxfHHHx/HHntsXHPNNXH88cfH7373u/jhD38YP/jBD+LEE0+Myy67LI455ph44403Yrvttqv0Gscdd1zstNNOUVpaGk899VRcf/310a5du7jkkksiIuL555+Pww47LPbcc8+YOHFiFBQUxGuvvVbtDxJTnXHGGdG+ffu48MIL45///Gdcd9110bJly3j00Ufj61//elx88cVx1113xWWXXRY9e/aM4cOHV9r+t7/9baxZsyZOO+20+PDDD+Oqq66Kgw46KJ577rkoKiqKiIh77703hgwZEl26dIkJEybEBx98EFOmTIn99tsvnnrqqSguLq70mscee2x07949Lr744siyLPbee+94++23Y9asWXHTTTdV2YerrroqjjjiiPjud78bZWVlccstt8Sxxx4bd9xxRwwdOrTSug8//HDcdtttceqpp8Z2220X/+///b/4zne+E4sWLYrWrVtHRMTbb78dffv2jZUrV8b3v//92HXXXeOtt96KGTNmxPvvvx+NGjWK999/PwYOHBhvvfVWnHzyyfH1r389Hn300Rg7dmy88847MXny5Ij4OIKdcMIJcfDBB+c+jy+++GI88sgjleLfJ+22225x0003xdlnnx077rhj7tJKbdu2jQ8++CAOPPDAeO211+L000+PnXbaKW699dYYOXJkrFy5ssprTps2LT788MP4/ve/HwUFBbH99ttv8mvhwgsvjAkTJsS+++4bEydOjEaNGsVjjz0W9913Xxx66KHVbrN69eq4/vrr44QTTojRo0fHmjVr4te//nUMHjw45s6dG7169Uo+DhMmTIjS0tIYNWpU9O3bN1avXh1PPPFEPPXUU3HIIYdscu7q3HrrrfH+++/HKaecEq1bt465c+fGlClT4s0334xbb7210rrl5eXxzW9+M/bZZ5+49NJLY+bMmTF+/PjYsGFDTJw4MbfeySefHL/5zW+ipKQkzjzzzJg/f3784he/iKeffjoeeeSRaNiwYfJ8f//732PDhg3J98l5/PHH49FHH43jjz8+dtxxx1iwYEFcc801ceCBB8YLL7wQTZs2jYi0Y/j888/HfvvtFx07dozzzjsvmjVrFn/84x/jqKOOij/96U9x9NFHJ+9HxMchZ/ny5RHx8eW/nn766Zg0aVIccMABsdNOO+XWmzVrVvz73/+OkpKSaN++fe4yjc8//3z885//zIXSH/zgBzFjxow4/fTTo0ePHvHuu+/Gww8/HC+++GJ84xvfiIiPI+2QIUOid+/eMX78+MjPz49p06bFQQcdFA899FD07ds3IiKee+65OPTQQ6Nt27YxYcKE2LBhQ4wfPz73vQkAgE/IAAD4ylm1alUWEdmRRx6ZtP68efOyiMhGjRpVafk555yTRUR233335ZYNHDgwGzhwYO7jadOmZRGRzZ8/v9K2999/fxYR2f33319p24jIfv/73+eWvfTSS1lEZPn5+dk///nP3PK77747i4hs2rRpuWXjx4/PIiL73ve+V+m9jj766Kx169a5j6+88sosIrJly5Yl7f8nde7cORsxYkSV/Rs8eHBWUVGRW96/f/8sLy8v+8EPfpBbtmHDhmzHHXesdHzmz5+fRUTWpEmT7M0338wtf+yxx7KIyM4+++zcsl69emXt2rXL3n333dyyZ555JsvPz8+GDx9e5TiccMIJVeY/7bTTsk39M//999+v9HFZWVnWs2fP7KCDDqq0PCKyRo0aZa+99lqlOSIimzJlSm7Z8OHDs/z8/Ozxxx+v8l4bj9VFF12UNWvWLHvllVcqPX/eeedlDRo0yBYtWpRlWZadddZZWYsWLbINGzZUO/vmdO7cORs6dGilZZMnT84iIrv55psr7W///v2z5s2bZ6tXr86y7D+fnxYtWmRLly79zPd69dVXs/z8/Ozoo4/OysvLq93nLKv692TDhg3Z+vXrK63/3nvvZUVFRZW+nlOOw1577VVlf1NU93fy018TWZZlpaWlWV5eXrZw4cLcshEjRmQRkZ1xxhm5ZRUVFdnQoUOzRo0a5f6uPfTQQ1lEZL/73e8qvebMmTOrLP/0MarO2WefnUVE9vTTTyftY3X7M2fOnCwist/+9re5ZSnH8OCDD8722GOP7MMPP8wtq6ioyPbdd9+se/fuSfNs1Llz5ywiqjz222+/bPny5Z+5D3/4wx+yiMgefPDB3LLCwsLstNNO2+R7VlRUZN27d6/yvev999/Pdtppp+yQQw7JLTvqqKOyxo0bV/qcv/DCC1mDBg02+f0EAGBb5fJfAABfQatXr46IqHKGx6bcddddERExZsyYSss3/uZ/bd57pXnz5nH88cfnPt5ll12iZcuWsdtuu0W/fv1yyzf++d///neV1/jBD35Q6eMBAwbEu+++m9vvli1bRkTEX/7ylyqXmKqpk046qdKltPr16xdZlsVJJ52UW9agQYPo06dPtTMfddRR0bFjx9zHffv2jX79+uWO/TvvvBPz5s2LkSNHVjpLYs8994xDDjkkt94nffo4fJYmTZrk/vzee+/FqlWrYsCAAVUuFxQRMWjQoOjatWulOVq0aJHbt4qKirj99tvj8MMPjz59+lTZfuOxuvXWW2PAgAHRqlWrWL58ee4xaNCgKC8vjwcffDAiPv6crVu3rkaXsKrOXXfdFe3bt48TTjght6xhw4Zx5plnxtq1a+Mf//hHpfW/853vRNu2bT/zdW+//faoqKiIcePGRX5+5f9OffLr49MaNGiQu0dLRUVFrFixIjZs2BB9+vSpdPxTjkPLli3j+eefj1dfffUz5/0sn/yaWLduXSxfvjz23XffyLIsnn766Srrn3766bk/b7xMXFlZWe5SfbfeemsUFhbGIYccUunz3bt372jevHm1lzvbnC39XvbJ/fnoo4/i3XffjW7dukXLli2rHOfNHcMVK1bEfffdF8cdd1ysWbMmtx/vvvtuDB48OF599dV46623tmhf+vXrF7NmzYpZs2bFHXfcET/72c/i+eefjyOOOKLS5dY+uQ8ffvhhLF++PPbZZ5+IiCr78Nhjj8Xbb79d7fvNmzcvXn311TjxxBPj3Xffze3DunXr4uCDD44HH3wwKioqory8PO6+++446qij4utf/3pu+9122y0GDx68RfsIALAtEFUAAL6CWrRoEREfX3M/xcKFCyM/Pz+6detWaXn79u2jZcuWsXDhwlqbbccdd6zyw+fCwsLo1KlTlWURUe19GD75g7+IiFatWlVad9iwYbHffvvFqFGjoqioKI4//vj44x//+LkCy6ffc+N81c1d3czV3YR65513zt3rYeMx3mWXXaqst9tuu+V+GPpJn7xkUIo77rgj9tlnn2jcuHFsv/320bZt27jmmmti1apVVdb99P5GfHycN+7bsmXLYvXq1dGzZ8/Nvuerr74aM2fOjLZt21Z6DBo0KCI+vu9JRMSpp54aO++8cwwZMiR23HHH+N73vlftPVxSLVy4MLp3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AL6iunbtGr///e9j2LBhsdtuu8Xw4cOjZ8+eUVZWFo8++mjceuutMXLkyIj4+Ad6I0aMiOuuuy5WrlwZAwcOjLlz58aNN94YRx11VPz3f//3Jt9n9913j3322SfGjh0bK1asiO233z5uueWW3A/L68LEiRPjwQcfjKFDh0bnzp1j6dKl8ctf/jJ23HHH2H///etkpm7dusX+++8fp5xySqxfvz4mT54crVu3rnRZrMsuuyyGDBkS/fv3j5NOOik++OCDmDJlShQWFsaECROS3qd3794REXHmmWfG4MGDo0GDBnH88cfH0KFDY9KkSfHNb34zTjzxxFi6dGlcffXV0a1btxrfj+Piiy+Oe+65JwYOHBjf//73Y7fddot33nknbr311nj44YejZcuWce6558Zf//rXOOyww2LkyJHRu3fvWLduXTz33HMxY8aMWLBgQbRp0yZGjRoVK1asiIMOOih23HHHWLhwYUyZMiV69epV6eypVN///vfj2muvjZEjR8aTTz4ZxcXFMWPGjHjkkUdi8uTJyTc+/7Ru3brFBRdcEBdddFEMGDAgvv3tb0dBQUE8/vjj0aFDhygtLa12u8MOOyxuu+22OProo2Po0KExf/78mDp1avTo0aPSD7xTjkOPHj3iwAMPjN69e8f2228fTzzxRMyYMaPSTeRT7LrrrtG1a9c455xz4q233ooWLVrEn/70p2rvCRQR0bhx45g5c2aMGDEi+vXrF3//+9/jzjvvjPPPPz93Wa+BAwfGySefHKWlpTFv3rw49NBDo2HDhvHqq6/GrbfeGldddVUcc8wxWzTnFVdcEa+//nqceeaZcdttt8Vhhx0WrVq1ikWLFsWtt94aL730Uhx//PG543zTTTdFYWFh9OjRI+bMmRP33ntvtG7dutJrphzDq6++Ovbff//YY489YvTo0dGlS5dYsmRJzJkzJ95888145plntmg/3nrrrbj55psjIqKsrCyeeeaZuPbaa6NNmza5S3+1aNEiDjjggLj00kvjo48+io4dO8Y999wT8+fPr/Raa9asiR133DGOOeaY2GuvvaJ58+Zx7733xuOPP547Syc/Pz+uv/76GDJkSOy+++5RUlISHTt2jLfeeivuv//+aNGiRS7qXHjhhTFz5swYMGBAnHrqqbkAufvuu9f4+wMAwFdWBgDAV9orr7ySjR49OisuLs4aNWqUbbfddtl+++2XTZkyJfvwww9z63300UfZhRdemO20005Zw4YNs06dOmVjx46ttE6WZdnAgQOzgQMHVlr2+uuvZ4MGDcoKCgqyoqKi7Pzzz89mzZqVRUR2//33V9p29913rzJj586ds6FDh1ZZHhHZaaedlvt4/PjxWURky5Ytq7TetGnTsojI5s+fn2VZls2ePTs78sgjsw4dOmSNGjXKOnTokJ1wwgnZK6+88pnHq3PnztmIESOqvPbjjz9eab1NzTJixIisWbNmuY/nz5+fRUR22WWXZVdccUXWqVOnrKCgIBswYED2zDPPVHn/e++9N9tvv/2yJk2aZC1atMgOP/zw7IUXXkh67yzLsg0bNmRnnHFG1rZt2ywvLy/75D/5f/3rX2fdu3fPCgoKsl133TWbNm1a7rU+6dPHfVPHJsuybOHChdnw4cOztm3bZgUFBVmXLl2y0047LVu/fn1unTVr1mRjx47NunXrljVq1Chr06ZNtu+++2aXX355VlZWlmVZls2YMSM79NBDs3bt2mWNGjXKvv71r2cnn3xy9s4771SZo7q5qvv6WbJkSVZSUpK1adMma9SoUbbHHntk06ZNq7TOJz8/W+KGG27I9t5776ygoCBr1apVNnDgwGzWrFm55z/996SioiK7+OKLs86dO2cFBQXZ3nvvnd1xxx3ZiBEjss6dO+fWSzkO//u//5v17ds3a9myZdakSZNs1113zX72s5/ljuWm3H///VX+Tr7wwgvZoEGDsubNm2dt2rTJRo8enT3zzDNZRFQ6Vhu/rl9//fXs0EMPzZo2bZoVFRVl48ePz8rLy6u813XXXZf17t07a9KkSbbddttle+yxR/bjH/84e/vttzd5jDZnw4YN2fXXX58NGDAgKywszBo2bJh17tw5KykpyZ5++unceu+9917uc968efNs8ODB2UsvvVTlazf1GL7++uvZ8OHDs/bt22cNGzbMOnbsmB122GHZjBkzkubeqHPnzllE5B75+flZu3btshNOOCF77bXXKq375ptvZkcffXTWsmXLrLCwMDv22GOzt99+O4uIbPz48VmWZdn69euzc889N9trr72y7bbbLmvWrFm21157Zb/85S+rvPfTTz+dffvb385at26dFRQUZJ07d86OO+64bPbs2ZXW+8c//pH17t07a9SoUdalS5ds6tSp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/vGPVZZPnz49unfvvsWvd/XVV0dxcXE0btw4+vXrF3Pnzt3kurfddlv06dMnWrZsGc2aNYtevXq5lwsAAAAAAPCFq9Hlvy688MIYNmxYPPjgg7l7qjzyyCMxe/bsamPL5kyfPj3GjBkTU6dOjX79+sXkyZNj8ODB8fLLL0e7du2qrL/99tvHBRdcELvuums0atQo7rjjjigpKYl27drF4MGDa7I7AAAAAAAAn6lGZ6p85zvficceeyzatGkTt99+e9x+++3Rpk2bmDt3bhx99NFb9FqTJk2K0aNHR0lJSfTo0SOmTp0aTZs2jRtuuKHa9Q888MA4+uijY7fddouuXbvGWWedFXvuuWc8/PDDNdkVAAAAAACAJDU6UyUionfv3nHzzTd/rjcvKyuLJ598MsaOHZtblp+fH4MGDYo5c+Z85vZZlsV9990XL7/8clxyySXVrrN+/fpYv3597uPVq1d/rpkBAAAAAIBtU42jSnl5efz5z3+OF198MSIievToEUceeWR87WvpL7l8+fIoLy+PoqKiSsuLioripZde2uR2q1atio4dO8b69eujQYMG8ctf/jIOOeSQatctLS2NCy+8MHkmAAAAAACA6tQoqjz//PNxxBFHxOLFi2OXXXaJiIhLLrkk2rZtG3/729+iZ8+etTrkp2233XYxb968WLt2bcyePTvGjBkTXbp0iQMPPLDKumPHjo0xY8bkPl69enV06tTpC50PAAAAAAD46qlRVBk1alTsvvvu8cQTT0SrVq0iIuK9996LkSNHxve///149NFHk16nTZs20aBBg1iyZEml5UuWLIn27dtvcrv8/Pzo1q1bRET06tUrXnzxxSgtLa02qhQUFERBQUHingEAAAAAAFSvRjeqnzdvXpSWluaCSkREq1at4mc/+1k8/fTTya/TqFGj6N27d8yePTu3rKKiImbPnh39+/dPfp2KiopK900BAAAAAACobTU6U2XnnXeOJUuWxO67715p+dKlS3NnkKQaM2ZMjBgxIvr06RN9+/aNyZMnx7p166KkpCQiIoYPHx4dO3aM0tLSiPj4Hil9+vSJrl27xvr16+Ouu+6Km266Ka655pqa7AoAAAAAAECSGkWV0tLSOPPMM2PChAmxzz77RETEP//5z5g4cWJccsklsXr16ty6LVq02OxrDRs2LJYtWxbjxo2LxYsXR69e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o4+mX79+mTx5ct599928++67mTx5cvbcc888+uijRecBAACtjM8lA5DYqQJAhRoyZEhGjhyZG264IdXV1UmSxsbGnHPOOXn88cfz/PPPF1wIAAC0JjU1NZk/f76dKgBtnKEKABWpU6dOmTdvXvbZZ5+t1l966aV86lOfysaNGwsqAwAAWiNDFQASx38BUKGGDRvWfJfKH1u8eHH233//AooAAAAAaO3aFR0AAB+XBQsWNP9+woQJ+da3vpWlS5fm4IMPTpI8+eST+fGPf5yrr766qEQAAKCVKpVKRScAUAYc/wVAxaiqqkqpVPrICyRLpVIaGxs/oSoAAKASOP4LgMROFQAqyPLly4tOAAAAKtT7779fdAIAZcBOFQAAAADalAMOOKDFx3nNnTt3O9cA0JrYqQJARXvhhReyYsWKbNq0aav1MWPGFFQEAAAU7fjjj2/+/e9+97v85Cc/yaBBgzJy5Mgkv7+PcdGiRTnnnHMKKgSgXNmpAkBFWrZsWU444YQ8//zzW92z8odPo7lTBQAASJKzzjorffv2zeWXX77V+qWXXprXX389t9xyS0FlAJSjqqIDAGB7+Na3vpU999wzb7/9djp37pxFixbl0UcfzfDhw/Pwww8XnQcAAJSJ//E//kdOO+20bda/+MUv5p577imgCIByZqgCQEV64oknctlll6VXr16pqqpKVVVV/u7v/i5XXXVVJkyYUHQeAABQJjp16pQ5c+Zssz5nzpx07NixgCIAypk7VQCoSI2NjampqUmS9OrVK//xH/+RffbZJ3vssUdeeumlgusAAIByMXHixHzjG9/I3LlzM2LEiCTJU089lVtuuSXf+973Cq4DoNwYqgBQkfbbb7/Mnz8/e+65Z/7Tf/pPueaaa9K+ffv8y7/8S+rq6orOAwAAysRFF12Uurq6XH/99fnXf/3XJMnAgQNz6623Zty4cQXXAVBuXFQPQEWaMWNG1q9fn7Fjx2bp0qU55phj8vLLL2fHHXfMnXfemc985jNFJwIAAADQyhiqANBm1NfXp0ePHimVSkWnAAAAZaShoSF33313li1blgsuuCA9e/bM3Llzs9NOO2XXXXctOg+AMmKoAgAAAECbtWDBghx55JHp1q1bXn311bz00kupq6vL3//932fFihW5/fbbi04EoIy4UwWAijF27NgWPztt2rTtWAIAALQW5513Xk4//fRcc801qampaV4fPXp0vvCFLxRYBkA5MlQBoGJ069at6AQAAKCV+fd///fcdNNN26zvuuuuWbVqVQFFAJQzQxUAKsatt976f/01c+bMyfDhw9OhQ4ftUAQAAJS7Dh06ZO3atdusv/zyy+ndu3cBRQCUs6qiAwCgSEcffXTefPPNojMAAICCjBkzJpdddlk+/PDDJEmpVMqKFSty4YUX5sQTTyy4DoByY6gCQJvW1NRUdAIAAFCgf/qnf8q6devSp0+fbNy4MYcffnj23nvv1NTU5Morryw6D4Ay4/gvAAAAANqsbt265aGHHsqcOXMyf/78rFu3LsOGDcuRRx5ZdBoAZajU5CO6ALRhNTU1mT9/furq6opOAQAACnD77bfnlFNO2eaexU2bNuWOO+7IaaedVlAZAOXIUAWANs1QBQAA2rbq6uqsXLkyffr02Wp9zZo16dOnTxobGwsqA6AcuVMFgDatVCoVnQAAABSoqanpz/5c8MYbb6Rbt24FFAFQztypAkCbZsMmAAC0TQcccEBKpVJKpVI++9nPpl27//PPZI2NjVm+fHmOOuqoAgsBKEeGKgBUpI0bN6apqSmdO3dOkrz22mv51a9+lUGDBuVzn/tc83Pvv/9+UYkAAECBjj/++CTJvHnzMmrUqHTt2rX5vfbt26dfv3458cQTC6oDoFy5UwWAivS5z30uY8eOzde//vU0NDRk3333zQ477JB33nknkyZNyje+8Y2iEwEAgDJw22235ZRTTknHjh2LTgGgFXCnCgAVae7cuTn00EOTJHfffXd22mmnvPbaa7n99tszefLkgusAAIBy8eUvf9lABYAWc/wXABVpw4YNqampSZLMnDkzY8eOTVVVVQ4++OC89tprBdcBAABF6tmzZ15++eX06tUrPXr0+LMX1f9BfX39J1gGQLkzVAGgIu2999659957c8IJJ2TGjBn59re/nSR5++23U1tbW3AdAABQpOuuu675Q1jXXXfdXx2qAMAfc6cKABXp7rvvzhe+8IU0Njbms5/9bGbOnJkkueqqq/Loo4/mN7/5TcGFAAAAALQ2hioAVKxVq1Zl5cqV2X///VNV9ftrxJ5++unU1tZm3333LbgOAAAoBw888ECqq6szatSordZnzpyZxsbGHH300QWVAVCOXFQPQMXaeeedc8ABB6Sqqipr167Nvffem5qaGgMVAACg2UUXXZTGxsZt1rds2ZKLLrqogCIAypmhCgAVady4cfnRj36UJNm4cWOGDx+ecePGZejQobnnnnsKrgMAAMrFkiVLMmjQoG3W99133yxdurSAIgDKmaEKABXp0UcfzaGHHpok+dWvfpWmpqY0NDRk8uTJueKKKwquAwAAykW3bt2ybNmybdaXLl2aLl26FFAEQDkzVAGgIr333nvp2bNnkuTBBx/MiSeemM6dO+fzn/98lixZUnAdAABQLo477rhMnDgxr7zySvPa0qVLc/7552fMmDEFlgFQjgxVAKhIu+++e5544omsX78+Dz74YD73uc8lSd5999107Nix4DoAAKBcXHPNNenSpUv23Xff7Lnnntlzzz0zcODA7Ljjjrn22muLzgOgzLQrOgAAtoeJEyfm1FNPTdeuXbPHHnvkiCOOSPL7Y8GGDBlSbBwAAFA2unXrlscffzwPPfRQ5s+fn06dOmXo0KE57LDDik4DoAyVmpqamoqOAIDt4dlnn82KFSvyn//zf07Xrl2TJPfff3+6d++eQw45pOA6AACgNRkyZEgeeOCB7L777kWnAFAgQxUAAAAA+Ag1NTWZP39+6urqik4BoECO/wKgYr3xxhuZPn16VqxYkU2bNm313qRJkwqqAgAAAKC1MlQBoCLNmjUrY8aMSV1dXV588cXst99+efXVV9PU1JRhw4YVnQcAAABAK1RVdAAAbA8XX3xxLrjggjz//PPp2LFj7rnnnrz++us5/PDDc/LJJxedBwAAAEArZKgCQEVavHhxTjvttCRJu3btsnHjxnTt2jWXXXZZvv/97xdcBwAAAEBrZKgCQEXq0qVL8z0qffv2zSuvvNL83jvvvFNUFgAAAACtmDtVAKhIBx98cB577LEMHDgwo0ePzvnnn5/nn38+06ZNy8EHH1x0HgAA0MrcdNNN2WmnnYrOAKBgpaampqaiIwDg47Zs2bKsW7cuQ4cOzfr163P++efn8ccfT//+/TNp0qTsscceRScCAAAFmTx5coufnTBhwnYsAaC1MVQBAAAAoE3Zc889t3q9evXqbNiwId27d0+SNDQ0pHPnzunTp0+WLVtWQCEA5cqdKgAAAAC0KcuXL2/+deWVV+ZTn/pUFi9enPr6+tTX12fx4sUZNmxYLr/88qJTASgzdqoAUDF69OiRUqnUomfr6+u3cw0AANAa7LXXXrn77rtzwAEHbLX+7LPP5qSTTsry5csLKgOgHLmoHoCK8cMf/rDoBAAAoJVZuXJlNm/evM16Y2Nj3nrrrQKKAChndqoAAAAA0GYde+yxefPNNzNlypQMGzYsye93qXz1q1/NrrvumunTpxdcCEA5cacKABXpgQceyIwZM7ZZnzlzZn7zm98UUAQAAJSjW265JTvvvHOGDx+eDh06pEOHDhkxYkR22mmnTJkypeg8AMqM478AqEgXXXRRrr766m3Wt2zZkosuuihHH310AVUAAEA5aWpqysaNG3PPPffkjTfeyOLFi5Mk++67bwYMGFBwHQDlyPFfAFSkTp06ZfHixenXr99W66+++moGDx6c9evXFxMGAACUjS1btqRjx45ZtGhR+vfvX3QOAK2A478AqEjdunXLsmXLtllfunRpunTpUkARAABQbqqqqtK/f/+sWbOm6BQAWglDFQAq0nHHHZeJEyfmlVdeaV5bunRpzj///IwZM6bAMgAAoJxcffXV+c53vpOFCxcWnQJAK+D4LwAq0nvvvZejjjoqzzzzTHbbbbckyRtvvJFDDz0006ZNS/fu3YsNBAAAykKPHj2yYcOGbN68Oe3bt0+nTp22er++vr6gMgDKkYvqAahI3bp1y+OPP56HHnoo8+fPT6dOnTJ06NAcdthhRacBAABl5Ic//GHRCQC0InaqAAAAAAAAtICdKgC0Kc8880w2bNhgxwoAANCssbEx9957bxYvXpwkGTx4cMaMGZPq6uqCywAoN3aqANCmDBw4MC+//HIaGxuLTgEAAMrA0qVLM3r06Lz55pvZZ599kiQvvfRSdt9999x///3Za6+9Ci4EoJxUFR0AAB+3Dz/8MF/5yleyfPnybd6bNWtWli1bVkAVAABQjiZMmJC99torr7/+eubOnZu5c+dmxYoV2XPPPTNhwoSi8wAoM3aqAFCRunXrlnnz5mXPPfcsOgUAAChjXbp0yZNPPpkhQ4ZstT5//vwccsghWbduXUFlAJQjO1UAqEjHH3987r333qIzAACAMtehQ4e8//7726yvW7cu7du3L6AIgHLmonoAKlL//v1z2WWXZc6cOTnwwAPTpUuXrd63jR8AAEiSY445Jl/96ldz8803Z8SIEUmSp556Kl//+tczZsyYgusAKDeO/wKgIv21Y79KpZJ7VQAAgCRJQ0NDvvzlL+e+++7LDjvskCTZvHlzxowZk6lTp6Zbt24FFwJQTgxVAAAAAGjzlixZkhdffDFJMnDgwOy9994FFwFQjgxVAKhomzZtyvLly7PXXnulXTunXgIAAFtbtmxZ6urqis4AoJVwUT0AFWnDhg0588wz07lz5wwePDgrVqxIkowfPz5XX311wXUAAEC52HvvvfM3f/M3+dKXvpSbb745S5cuLToJgDJmqAJARbr44oszf/78PPzww+nYsWPz+pFHHpk777yzwDIAAKCcvP7667nqqqvSqVOnXHPNNRkwYEB22223nHrqqZkyZUrReQCUGcd/AVCR9thjj9x55505+OCDU1NTk/nz56euri5Lly7NsGHDsnbt2qITAQCAMrRkyZJceeWV+fnPf54tW7aksbGx6CQAyojD5QGoSKtXr06fPn22WV+/fn1KpVIBRQAAQDnasGFDHnvssTz88MN5+OGH89xzz2XffffNN7/5zRxxxBFF5wFQZgxVAKhIw4cPz/3335/x48cnSfMgZcqUKRk5cmSRaQAAQBnp3r17evTokVNPPTUXXXRRDj300PTo0aPoLADKlKEKABXpH//xH3P00UfnhRdeyObNm3P99dfnhRdeyOOPP55HHnmk6DwAAKBMjB49Oo899ljuuOOOrFq1KqtWrcoRRxyRAQMGFJ0GQBlypwoAFeuVV17J1Vdfnfnz52fdunUZNmxYLrzwwgwZMqToNAAAoMwsWLAgjzzySB555JH8r//1v9KuXbscccQR+fnPf150GgBlxFAFAAAAgDavqakpzz33XGbPnp3Zs2dnxowZaWpqyubNm4tOA6CMGKoAULEaGxvzq1/9KosXL06SDBo0KMcdd1zatXP6JQAA8HuTJk3Kww8/nMceeyzvv/9+9t9//xx22GE54ogj3K8CwDYMVQCoSIsWLcqYMWOyatWq7LPPPkmSl19+Ob179859992X/fbbr+BCAACgHBx00EE5/PDDm4co3bp1KzoJgDJmqAJARRo5cmR69+6d2267rfmTZe+++25OP/30rF69Oo8//njBhQAAAAC0NoYqAFSkTp065ZlnnsngwYO3Wl+4cGEOOuigbNy4saAyAAAAAFqrqqIDAGB7GDBgQN56661t1t9+++3svffeBRQBAACtycCBA1NdXV10BgBlxk29AFSkq666KhMmTMg//MM/5OCDD06SPPnkk7nsssvy/e9/P2vXrm1+tra2tqhMAACgTF111VV57733is4AoMw4/guAilRV9X82Y5ZKpSTJH/6X98evS6VSGhsbP/lAAAAAAFodO1UAqEizZ88uOgEAAGgFPvOZz2TatGnp3r37Vutr167N8ccfn9/+9rfFhAFQluxUAQAAAKDNqqqqyqpVq9KnT5+t1t9+++3suuuu+fDDDwsqA6Ac2akCQEXbsGFDVqxYkU2bNm21PnTo0IKKAACAcrBgwYLm37/wwgtZtWpV8+vGxsY8+OCD2XXXXYtIA6CM2akCQEVavXp1zjjjjPzmN7/5s++7RwUAANq2qqqqbe5f/GOdOnXKP//zP+crX/nKJ50GQBmzUwWAijRx4sQ0NDTkqaeeyhFHHJFf/epXeeutt3LFFVfkn/7pn4rOAwAACrZ8+fI0NTWlrq4uTz/9dHr37t38Xvv27dOnT59UV1cXWAhAObJTBYCK1Ldv3/z617/OiBEjUltbm2eeeSYDBgzI9OnTc8011+Sxxx4rOhEAAACAVsZOFQAq0vr165svmuzRo0dWr16dAQMGZMiQIZk7d27BdQAAQDlZsmRJZs+enbfffjtbtmzZ6r1LLrmkoCoAypGhCgAVaZ999slLL72Ufv36Zf/9989NN92Ufv365cYbb0zfvn2LzgMAAMrET3/603zjG99Ir169svPOOzffs5IkpVLJUAWArTj+C4CK9K//+q/ZvHlzTj/99Dz77LM56qijUl9fn/bt22fq1Kk55ZRTik4EAADKwB577JFzzjknF154YdEpALQChioAtAkbNmzIiy++mL/5m79Jr169is4BAADKRG1tbebNm5e6urqiUwBoBaqKDgCA7a2pqSmdOnXKsGHDDFQAAICtnHzyyZk5c2bRGQC0Eu5UAaBi3XzzzbnuuuuyZMmSJEn//v0zceLEnHXWWQWXAQAA5WLvvffO9773vTz55JMZMmRIdthhh63enzBhQkFlAJQjx38BUJEuueSSTJo0KePHj8/IkSOTJE888UR+9KMf5dvf/nYuu+yyggsBAIBysOeee/7F90qlUpYtW/YJ1gBQ7gxVAKhIvXv3zuTJk/Nf/+t/3Wr9l7/8ZcaPH5933nmnoDIAAAAAWit3qgBQkT788MMMHz58m/UDDzwwmzdvLqAIAAAoZ5s2bcpLL73k5wUA/ipDFQAq0pe+9KXccMMN26z/y7/8S0499dQCigAAgHK0YcOGnHnmmencuXMGDx6cFStWJEnGjx+fq6++uuA6AMqNoQoAFevmm2/Ofvvtl7POOitnnXVWhgwZkp/+9KepqqrKeeed1/wLAABouy6++OLMnz8/Dz/8cDp27Ni8fuSRR+bOO+8ssAyAcuROFQAq0qc//ekWPVcqlfLb3/52O9cAAADlao899sidd96Zgw8+ODU1NZk/f37q6uqydOnSDBs2LGvXri06EYAy0q7oAADYHmbPnl10AgAA0AqsXr06ffr02WZ9/fr1KZVKBRQBUM4c/wUAAABAmzV8+PDcf//9za//MEiZMmVKRo4cWVQWAGXKThUAAAAA2qx//Md/zNFHH50XXnghmzdvzvXXX58XXnghjz/+eB555JGi8wAoM3aqAAAAANBm/d3f/V3mzZuXzZs3Z8iQIZk5c2b69OmTJ554IgceeGDReQCUGRfVAwAAAAAAtICdKgAAAAC0WdXV1Xn77be3WV+zZk2qq6sLKAKgnLlTBYCKMXny5P/rrznjjDNSU1OzHWoAAIDW4C8d4vLBBx+kffv2n3ANAOXOUAWAijFx4sTstttuLf402euvv55jjjnGUAUAANqgP3woq1QqZcqUKenatWvze42NjXn00Uez7777FpUHQJkyVAGgojzzzDPp06dPi541TAEAgLbruuuuS/L7nSo33njjVh/Oat++ffr165cbb7yxqDwAypShCgAV49JLL93q02Uf5bvf/W569uy5HYsAAIBytXz58iTJpz/96UybNi09evQouAiA1qDU9JcOjgQAAAAAAKCZnSoAtCkLFizI8OHDs2nTpqJTAACAMtDY2JipU6dm1qxZefvtt7Nly5at3v/tb39bUBkA5chQBYA2pampKY2NjUVnAAAAZeJb3/pWpk6dms9//vPZb7/9UiqVik4CoIwZqgAAAADQZt1xxx256667Mnr06KJTAGgFqooOAAAAAICitG/fPnvvvXfRGQC0EoYqAFSUtWvX/tVf77//ftGJAABAGTn//PNz/fXXp6mpqegUAFqBUpP/YwBQQaqqqv7qGchNTU0plUruVQEAAJIkJ5xwQmbPnp2ePXtm8ODB2WGHHbZ6f9q0aQWVAVCO3KkCQEWZPXt20QkAAEAr0r1795xwwglFZwDQStipAkCbU19fn549exadAQAAAEAr404VANqMmTNnZty4cdl1112LTgEAAMrM6tWr89hjj+Wxxx7L6tWri84BoEwZqgBQ0V577bVceuml6devX04++eRUVVXl9ttvLzoLAAAoE+vXr89XvvKV9O3bN4cddlgOO+yw7LLLLjnzzDOzYcOGovMAKDOGKgBUnE2bNuWOO+7IkUcemX333Tdz587NG2+8kcceeyx33HFHTj755KITAQCAMnHeeeflkUceyX333ZeGhoY0NDTk17/+dR555JGcf/75RecBUGbcqQJARRk/fnx++ctfpn///vniF7+Y//Jf/kt23HHH7LDDDpk/f34GDRpUdCIAAFBGevXqlbvvvjtHHHHEVuuzZ8/OuHHjHAUGwFbaFR0AAB+nG264IRdeeGEuuuii1NTUFJ0DAACUuQ0bNmSnnXbaZr1Pnz6O/wJgG47/AqCi/OxnP8vTTz+dvn375pRTTsm//du/pbGxsegsAACgTI0cOTKXXnppfve73zWvbdy4Mf/9v//3jBw5ssAyAMqR478AqEjLly/P1KlTM3Xq1GzYsCH19fW58847c9JJJxWdBgAAlJGFCxdm1KhR+eCDD7L//vsnSebPn5+OHTtmxowZGTx4cMGFAJQTQxUAKlpTU1NmzpyZm2++OdOnT0+vXr0yduzYTJ48ueg0AACgTGzYsCE///nP8+KLLyZJBg4cmFNPPTWdOnUquAyAcmOoAkCbUV9fn9tvvz1Tp07NvHnzis4BAAAAoJVxpwoAbUbPnj1z6KGHZrfddis6BQAAKBNXXXVVbrnllm3Wb7nllnz/+98voAiAcmaoAkDFmTFjRi644IJ897vfzbJly5IkL774Yo4//viMGDEiW7ZsKbgQAAAoFzfddFP23XffbdYHDx6cG2+8sYAiAMpZu6IDAODjdPPNN+fss89Oz5498+6772bKlCmZNGlSxo8fn1NOOSULFy7MwIEDi84EAADKxKpVq9K3b99t1nv37p2VK1cWUARAObNTBYCKcv311+f73/9+3nnnndx1111555138pOf/CTPP/98brzxRgMVAABgK7vvvnvmzJmzzfqcOXOyyy67FFAEQDmzUwWAivLKK6/k5JNPTpKMHTs27dq1yw9+8AP3qAAAAH/W2WefnYkTJ+bDDz/MZz7zmSTJrFmz8t/+23/L+eefX3AdAOXGUAWAirJx48Z07tw5SVIqldKhQ4c/u5UfAAAgSb7zne9kzZo1Oeecc7Jp06YkSceOHXPhhRfm4osvLrgOgHJTampqaio6AgA+LlVVVbniiivStWvXJMmFF16Y73znO+nVq9dWz02YMKGIPAAAoEytW7cuixcvTqdOndK/f/906NCh6CQAypChCgAVpV+/fimVSn/1mVKplGXLln1CRQAAAABUCkMVAAAAAACAFqgqOgAAAAAAAKA1MFQBoKKMHj067733XvPrq6++Og0NDc2v16xZk0GDBhVQBgAAAEBr5/gvACpKdXV1Vq5cmT59+iRJamtrM2/evNTV1SVJ3nrrreyyyy5pbGwsMhMAAACAVqhd0QEA8HH6088K+OwAAADwpyZPnvx//TVnnHFGampqtkMNAK2JoQoAAAAAbcrEiROz2267pbq6ukXPv/766znmmGMMVQAwVAGgspRKpZRKpW3WAAAA/tgzzzzTfGzwRzFMAeAPDFUAqChNTU05/fTT06FDhyTJ7373u3z9619Ply5dkiQffPBBkXkAAEAZuPTSS9O1a9cWP//d7343PXv23I5FALQWLqoHoKKcccYZLXru1ltv3c4lAAAAAFQaQxUAAAAA+BMLFizI8OHDs2nTpqJTACgjVUUHAAAAAEC5aWpqSmNjY9EZAJQZd6oAUFHGjh3bouemTZu2nUsAAAAAqDSGKgBUlG7dum31+he/+EWOPfbY1NTUFFQEAAAAQKVwpwoAFa2mpibz589PXV1d0SkAAEAZWbt27V99f8GCBTn88MMdAQbAVuxUAQAAAKDN6d69e0ql0l98v6mp6a++D0DbZKgCAAAAQJsze/bsohMAaIUMVQAAAABocw4//PCPfKa+vv4TKAGgNTFUAaCiTJ8+favXW7ZsyaxZs7Jw4cKt1seMGfNJZgEAAK3IzJkzM2XKlNx3333ZuHFj0TkAlBEX1QNQUaqqqj7ymVKp5LJJAABgK6+99lpuueWW3HbbbXn33Xdz9NFH58QTT8zJJ59cdBoAZcROFQAqypYtW4pOAAAAWolNmzZl2rRpmTJlSubMmZMjjzwyb7zxRp577rkMGTKk6DwAytBHf5wXAFqhDz74IOvXry86AwAAKFPjx4/PLrvskuuvvz4nnHBC3njjjdx3330plUqprq4uOg+AMmWoAkBFWb16dY4++uh07do1tbW1Ofjgg7N06dKiswAAgDJzww035Gtf+1pmzpyZc889NzvuuGPRSQC0AoYqAFSUCy+8MPPmzctll12Wa6+9Ng0NDTn77LOLzgIAAMrMz372szz99NPp27dvTjnllPzbv/2buxcB+Eguqgegouy+++6ZMmVKRo0alSRZsmRJBg4cmPXr16dDhw4F1wEAAOVm+fLlmTp1aqZOnZoNGzakvr4+d955Z0466aSi0wAoQ4YqAFSU6urqvPnmm9l5552b17p06ZJFixalX79+xYUBAABlrampKTNnzszNN9+c6dOnp1evXhk7dmwmT55cdBoAZaRd0QEA8HH700slq6ur4zMEAADAX1MqlTJq1KiMGjUq9fX1uf322zN16tSiswAoM4YqAFSUpqamDBgwIKVSqXlt3bp1OeCAA1JV9X+uEquvry8iDwAAaAV69uyZQw89NP/zf/7PolMAKDOGKgBUlFtvvbXoBAAAoJWYMWNGHnroobRv3z5nnXVW6urq8uKLL+aiiy7Kfffd13xXIwD8gTtVAAAAAGhzbr755px99tnp2bNn3n333ey4446ZNGlSxo8fn1NOOSXf+ta3MnDgwKIzASgzhioAAAAAtDlDhw7Nl770pXznO9/JPffck5NPPjkHH3xw7rrrruy2225F5wFQpgxVAKgoPXr02Oo+lb/EnSoAANC2denSJYsWLUq/fv3S1NSUDh06ZPbs2TnkkEOKTgOgjLlTBYCK8sMf/rDoBAAAoBXYuHFjOnfunCQplUrp0KFD+vbtW3AVAOXOUAWAivLlL3+56AQAAKCVmDJlSrp27Zok2bx5c6ZOnZpevXpt9cyECROKSAOgTDn+C4A2ZeXKlbnyyivzox/9qOgUAACgQP369fvIo4NLpVKWLVv2CRUB0BrYqQJAxVm0aFFmz56d9u3bZ9y4cenevXveeeedXHnllbnxxhtTV1dXdCIAAFCwV199tegEAFohO1UAqCjTp0/PSSedlM2bNydJ6urq8tOf/jTjxo3LgQcemIkTJ+aoo44quBIAAACA1qiq6AAA+DhdccUVOffcc7N27dpMmjQpy5Yty4QJE/LAAw/kwQcfNFABAACSJKNHj857773X/Prqq69OQ0ND8+s1a9Zk0KBBBZQBUM7sVAGgonTr1i3PPvts9t577zQ2NqZDhw558MEHc+SRRxad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NmfUqFFZt25drr322nTs2DGXX355nn/++SxZsqToNADKmKEKAAAAAG1Or169MnPmzAwbNixJ0tDQkJ49e6ahoSG1tbUF1wFQrqqKDgAAAACAT1p9fX1222235tfdu3dPly5dsmbNmgKrACh37lQBAAAAoE164YUXmu9USZKmpqYsXrw477//fvPa0KFDi0gDoEw5/gsAAACANqeqqiqlUil/7p/G/rBeKpXS2NhYQB0A5cpOFQAAAADanOXLlxedAEArZKcKAAAAAABAC7ioHgAAAIA2ZcGCBdmyZUuLn1+0aFE2b968HYsAaC3sVAEAAACgTamurs6qVavSu3fvFj1fW1ubefPmpa6ubjuXAVDu3KkCAAAAQJvS1NSU733ve+ncuXOLnt+0adN2LgKgtTBUAQAAAKBNOeyww/LSSy+1+PmRI0emU6dO27EIgNbC8V8AAAAAAAAt4KJ6AAAAAACAFjBUAQAAAAAAaAFDFQAAAAAAgBYwVAEAAAAAAGgBQxUAAKCi/MM//EM+9alPFZ0BAABUIEMVAACgrKxatSrjx49PXV1dOnTokN133z3HHntsZs2aVXQaAADQxrUrOgAAAOAPXn311RxyyCHp3r17fvCDH2TIkCH58MMPM2PGjJx77rl58cUXi04EAADaMDtVAACAsnHOOeekVCrl6aefzoknnpgBAwZk8ODBOe+88/Lkk08mSVasWJHjjjsuXbt2TW1tbcaNG5e33nrrL/6ZRxxxRCZOnLjV2vHHH5/TTz+9+XW/fv1yxRVX5LTTTkvXrl2zxx57ZPr06Vm9enXz9xo6dGieeeaZ5q+ZOnVqunfvnhkzZmTgwIHp2rVrjjrqqKxcubL5mYcffjgjRoxIly5d0r179xxyyCF57bXXPp7/WAAAwCfOUAUAACgL9fX1efDBB3PuueemS5cu27zfvXv3bNmyJccdd1zq6+vzyCOP5KGHHsqyZctyyimn/H9//+uuuy6HHHJInnvuuXz+85/Pl770pZx22mn54he/mLlz52avvfbKaaedlqampuav2bBhQ6699tr87Gc/y6OPPpoVK1bkggsuSJJs3rw5xx9/fA4//PAsWLAgTzzxRL761a+mVCr9f7cCAADFcPwXAABQFpYuXZqmpqbsu+++f/GZWbNm5fnnn8/y5cuz++67J0luv/32DB48OP/+7/+egw466P/5+48ePTpf+9rXkiSXXHJJbrjhhhx00EE5+eSTkyQXXnhhRo4cmbfeeis777xzkuTDDz/MjTfemL322itJ8s1vfjOXXXZZkmTt2rV57733cswxxzS/P3DgwP/nPgAAoHh2qgAAAGXhj3eA/CWLFy/O7rvv3jxQSZJBgwale/fuWbx48f/X9x86dGjz73faaackyZAhQ7ZZe/vtt5vXOnfu3DwwSZK+ffs2v9+zZ8+cfvrpGTVqVI499thcf/31Wx0NBgAAtD6GKgAAQFno379/SqXSx34ZfVVV1TYDmw8//HCb53bYYYfm3//hiK4/t7Zly5Y/+zV/eOaPv9ett96aJ554In/7t3+bO++8MwMGDGi+GwYAAGh9DFUAAICy0LNnz4waNSo//vGPs379+m3eb2hoyMCBA/P666/n9ddfb15/4YUX0tDQkEGDBv3ZP7d3795b7RBpbGzMwoULP/6/wF9wwAEH5OKLL87jjz+e/fbbL7/4xS8+se8NAAB8vAxVAACAsvHjH/84jY2NGTFiRO65554sWbIkixcvzuTJkzNy5MgceeSRGTJkSE499dTMnTs3Tz/9dE477bQcfvjhGT58+J/9Mz/zmc/k/vvvz/33358XX3wx3/jGN9LQ0LDd/y7Lly/PxRdfnCeeeCKvvfZaZs6cmSVLlrhXBQAAWjEX1QMAAGWjrq4uc+fOzZVXXpnzzz8/K1euTO/evXPggQfmhhtuSKlUyq9//euMHz8+hx12WKqqqnLUUUfln//5n//in/mVr3wl8+fPz2mnnZZ27drl29/+dj796U9v979L586d8+KLL+a2227LmjVr0rdv35x77rn52te+tt2/NwAAsH2UmlpyGyQAAAAAAEAb5/gvAAAAAACAFjBUAQAAAAAAaAFDFQAAAAAAgBYwVAEAAAAAAGgBQxUAAAAAAIAWMFQBAAAAAABoAUMVAAAAAACAFjBUAQAAAAAAaAFDFQAAAAAAgBYwVAEAAAAAAGgBQxUAAAAAAIAWMFQBAAAAAABogf8NgT1BZ8LDgf8AAAAASUVORK5CYII=", "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": 35, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "```sql\n", "DROP TABLE IF EXISTS \"FEATURE_1_64\";\n", "\n", "CREATE TABLE \"FEATURE_1_64\" AS\n", "SELECT AVG( t2.\"t4__class_label__mapping_2_target_6_avg\" ) AS \"feature_1_64\",\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_64\";\\n\\nCREATE TABLE \"FEATURE_1_64\" AS\\nSELECT AVG( t2.\"t4__class_label__mapping_2_target_6_avg\" ) AS \"feature_1_64\",\\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": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe1.features.to_sql()[pipe1.features.sort(by=\"importances\")[0].name]" ] }, { "cell_type": "code", "execution_count": 36, "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.518669 ) 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.518669 ) 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.518669 ) AND ( f_6_2.\"feature_6_2_16\" > 0.759650 ) THEN 13.54988592990512\n", " WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.518669 ) AND ( f_6_2.\"feature_6_2_16\" <= 0.759650 ) THEN 7.015267202459227\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" > 1.818403 ) THEN 5.178143055435354\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" <= 1.818403 ) AND ( f_6_2.\"feature_6_2_13\" > 0.586650 ) THEN 3.066163439590274\n", " WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" <= 1.818403 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.586650 ) THEN -0.674856124411419\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.518669 ) 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.518669 ) 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.518669 ) AND ( f_6_2.\"feature_6_2_16\" > 0.759650 ) THEN 13.54988592990512\\n WHEN ( f_6_2.\"feature_6_2_2\" > 3.142350 ) AND ( f_6_2.\"feature_6_2_11\" <= 5.518669 ) AND ( f_6_2.\"feature_6_2_16\" <= 0.759650 ) THEN 7.015267202459227\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" > 1.818403 ) THEN 5.178143055435354\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" <= 1.818403 ) AND ( f_6_2.\"feature_6_2_13\" > 0.586650 ) THEN 3.066163439590274\\n WHEN ( f_6_2.\"feature_6_2_2\" <= 3.142350 ) AND ( f_6_2.\"feature_6_2_5\" <= 1.818403 ) AND ( f_6_2.\"feature_6_2_13\" <= 0.586650 ) THEN -0.674856124411419\\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": 36, "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": 37, "metadata": {}, "outputs": [], "source": [ "# Creates a folder containing the SQL code.\n", "pipe1.features.to_sql().save(\"cora_pipeline\")" ] }, { "cell_type": "code", "execution_count": 38, "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": 39, "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
0FastProp89.9%98.5%
1Relboost89.8%98.3%
\n", "
" ], "text/plain": [ " Approach Accuracy AUC\n", "0 FastProp 89.9% 98.5%\n", "1 Relboost 89.8% 98.3%" ] }, "execution_count": 39, "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": "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.8.18" }, "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 }