hivemall-pyspark.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "hivemall-pyspark.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"toc_visible": true, | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/takuti/59bc761543786112a86528f61bbae67c/hivemall-pyspark.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "WyH7JUqhF8sY", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"# Hivemall with PySpark" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "vcaAkopVGAYG", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Installation\n", | |
"\n", | |
"Prepare Spark environment for Google Colabo:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Qc84kbLXx2kg", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"!apt-get install openjdk-8-jdk-headless -qq > /dev/null\n", | |
"!wget -q http://mirror.checkdomain.de/apache/spark/spark-2.3.4/spark-2.3.4-bin-hadoop2.7.tgz\n", | |
"!tar xf spark-2.3.4-bin-hadoop2.7.tgz\n", | |
"!pip install -q findspark" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "sG8vZYpp7JC7", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import os\n", | |
"\n", | |
"os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\"\n", | |
"os.environ[\"SPARK_HOME\"] = \"/content/spark-2.3.4-bin-hadoop2.7\"" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "pIQZ4AcY7NwO", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import findspark\n", | |
"findspark.init()" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "I-TF5acLIauO", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Download Hivemall JAR from the [releases](https://incubator.apache.org/clutch/hivemall.html):" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "CmL20W6k1zmB", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"!wget -q http://mirror.reverse.net/pub/apache/incubator/hivemall/0.5.2-incubating/hivemall-spark2.3-0.5.2-incubating-with-dependencies.jar" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "5s-BUNcNGECk", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Basic Usage \n", | |
"\n", | |
"Create `SparkSession` with the Hivemall JAR:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "sptUhAvix4aP", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"from pyspark.sql import SparkSession\n", | |
"\n", | |
"spark = SparkSession \\\n", | |
" .builder \\\n", | |
" .master('local[*]') \\\n", | |
" .config('spark.jars', \\\n", | |
" 'hivemall-spark2.3-0.5.2-incubating-with-dependencies.jar') \\\n", | |
" .enableHiveSupport() \\\n", | |
" .getOrCreate()" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "s4_GFJYnTcWE", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"`local[*]` runs Spark locally with as many worker threads as logical cores on this environment, and the number is:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "j8LwdUx6TwG4", | |
"colab_type": "code", | |
"outputId": "9aa11e90-8622-475c-ffce-90a9f6cd0d75", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
} | |
}, | |
"source": [ | |
"!grep -c ^processor /proc/cpuinfo" | |
], | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"2\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "H8VpiD1BGIWy", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Register Hive(mall) UDFs to the session:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "DdkQpqHW0xJD", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION hivemall_version AS 'hivemall.HivemallVersionUDF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "LxLfhUgYKCaj", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Use the functions in SQL context:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Nv4qpJVkKAT4", | |
"colab_type": "code", | |
"outputId": "f0cdf012-8f8c-4342-fc4e-fc6fc611f6b0", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 119 | |
} | |
}, | |
"source": [ | |
"spark.sql(\"SELECT hivemall_version()\").show()" | |
], | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"+------------------+\n", | |
"|hivemall_version()|\n", | |
"+------------------+\n", | |
"| 0.5.2-incubating|\n", | |
"+------------------+\n", | |
"\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "64wPO26FGNMJ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Example: Binary Classification" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Nac0TWOzGUNf", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Load data\n", | |
"\n", | |
"Use a [public dataset](https://aws.amazon.com/blogs/machine-learning/predicting-customer-churn-with-amazon-machine-learning/) that contains customers churn history from a telecom company:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "D6_zNAxK_IVf", | |
"colab_type": "code", | |
"outputId": "2ed48c56-8814-41b2-9d68-33732faa1d93", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 51 | |
} | |
}, | |
"source": [ | |
"!wget -q http://dataminingconsultant.com/DKD2e_data_sets.zip\n", | |
"!unzip -j DKD2e_data_sets.zip \"**/churn.txt\"" | |
], | |
"execution_count": 9, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Archive: DKD2e_data_sets.zip\n", | |
" inflating: churn.txt \n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "AImzvOJuLoxm", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Normalize column names, and load data as a Pandas DataFrame:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "SgvGtW8n_MEi", | |
"colab_type": "code", | |
"outputId": "d973d38d-9660-4228-dbf1-fc20f8f7c8c9", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 309 | |
} | |
}, | |
"source": [ | |
"import re\n", | |
"import pandas as pd\n", | |
"\n", | |
"pddf = pd.read_csv('churn.txt') \\\n", | |
" .rename(lambda c: re.sub(r'[^a-zA-Z0-9 ]', '', str(c)).lower().replace(' ', '_'), axis='columns')\n", | |
"pddf.head()" | |
], | |
"execution_count": 10, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>state</th>\n", | |
" <th>account_length</th>\n", | |
" <th>area_code</th>\n", | |
" <th>phone</th>\n", | |
" <th>intl_plan</th>\n", | |
" <th>vmail_plan</th>\n", | |
" <th>vmail_message</th>\n", | |
" <th>day_mins</th>\n", | |
" <th>day_calls</th>\n", | |
" <th>day_charge</th>\n", | |
" <th>eve_mins</th>\n", | |
" <th>eve_calls</th>\n", | |
" <th>eve_charge</th>\n", | |
" <th>night_mins</th>\n", | |
" <th>night_calls</th>\n", | |
" <th>night_charge</th>\n", | |
" <th>intl_mins</th>\n", | |
" <th>intl_calls</th>\n", | |
" <th>intl_charge</th>\n", | |
" <th>custserv_calls</th>\n", | |
" <th>churn</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>KS</td>\n", | |
" <td>128</td>\n", | |
" <td>415</td>\n", | |
" <td>382-4657</td>\n", | |
" <td>no</td>\n", | |
" <td>yes</td>\n", | |
" <td>25</td>\n", | |
" <td>265.1</td>\n", | |
" <td>110</td>\n", | |
" <td>45.07</td>\n", | |
" <td>197.4</td>\n", | |
" <td>99</td>\n", | |
" <td>16.78</td>\n", | |
" <td>244.7</td>\n", | |
" <td>91</td>\n", | |
" <td>11.01</td>\n", | |
" <td>10.0</td>\n", | |
" <td>3</td>\n", | |
" <td>2.70</td>\n", | |
" <td>1</td>\n", | |
" <td>False.</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>OH</td>\n", | |
" <td>107</td>\n", | |
" <td>415</td>\n", | |
" <td>371-7191</td>\n", | |
" <td>no</td>\n", | |
" <td>yes</td>\n", | |
" <td>26</td>\n", | |
" <td>161.6</td>\n", | |
" <td>123</td>\n", | |
" <td>27.47</td>\n", | |
" <td>195.5</td>\n", | |
" <td>103</td>\n", | |
" <td>16.62</td>\n", | |
" <td>254.4</td>\n", | |
" <td>103</td>\n", | |
" <td>11.45</td>\n", | |
" <td>13.7</td>\n", | |
" <td>3</td>\n", | |
" <td>3.70</td>\n", | |
" <td>1</td>\n", | |
" <td>False.</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>NJ</td>\n", | |
" <td>137</td>\n", | |
" <td>415</td>\n", | |
" <td>358-1921</td>\n", | |
" <td>no</td>\n", | |
" <td>no</td>\n", | |
" <td>0</td>\n", | |
" <td>243.4</td>\n", | |
" <td>114</td>\n", | |
" <td>41.38</td>\n", | |
" <td>121.2</td>\n", | |
" <td>110</td>\n", | |
" <td>10.30</td>\n", | |
" <td>162.6</td>\n", | |
" <td>104</td>\n", | |
" <td>7.32</td>\n", | |
" <td>12.2</td>\n", | |
" <td>5</td>\n", | |
" <td>3.29</td>\n", | |
" <td>0</td>\n", | |
" <td>False.</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>OH</td>\n", | |
" <td>84</td>\n", | |
" <td>408</td>\n", | |
" <td>375-9999</td>\n", | |
" <td>yes</td>\n", | |
" <td>no</td>\n", | |
" <td>0</td>\n", | |
" <td>299.4</td>\n", | |
" <td>71</td>\n", | |
" <td>50.90</td>\n", | |
" <td>61.9</td>\n", | |
" <td>88</td>\n", | |
" <td>5.26</td>\n", | |
" <td>196.9</td>\n", | |
" <td>89</td>\n", | |
" <td>8.86</td>\n", | |
" <td>6.6</td>\n", | |
" <td>7</td>\n", | |
" <td>1.78</td>\n", | |
" <td>2</td>\n", | |
" <td>False.</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>OK</td>\n", | |
" <td>75</td>\n", | |
" <td>415</td>\n", | |
" <td>330-6626</td>\n", | |
" <td>yes</td>\n", | |
" <td>no</td>\n", | |
" <td>0</td>\n", | |
" <td>166.7</td>\n", | |
" <td>113</td>\n", | |
" <td>28.34</td>\n", | |
" <td>148.3</td>\n", | |
" <td>122</td>\n", | |
" <td>12.61</td>\n", | |
" <td>186.9</td>\n", | |
" <td>121</td>\n", | |
" <td>8.41</td>\n", | |
" <td>10.1</td>\n", | |
" <td>3</td>\n", | |
" <td>2.73</td>\n", | |
" <td>3</td>\n", | |
" <td>False.</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" state account_length area_code ... intl_charge custserv_calls churn\n", | |
"0 KS 128 415 ... 2.70 1 False.\n", | |
"1 OH 107 415 ... 3.70 1 False.\n", | |
"2 NJ 137 415 ... 3.29 0 False.\n", | |
"3 OH 84 408 ... 1.78 2 False.\n", | |
"4 OK 75 415 ... 2.73 3 False.\n", | |
"\n", | |
"[5 rows x 21 columns]" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 10 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "TeKfonPVMVSP", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Convert into a Spark DataFrame:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "p4Urhba2MddQ", | |
"colab_type": "code", | |
"outputId": "43a9b1e0-baf1-4ff8-ebdd-3c91c8c03aa3", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 408 | |
} | |
}, | |
"source": [ | |
"df = spark.createDataFrame(pddf)\n", | |
"df.printSchema()" | |
], | |
"execution_count": 11, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"root\n", | |
" |-- state: string (nullable = true)\n", | |
" |-- account_length: long (nullable = true)\n", | |
" |-- area_code: long (nullable = true)\n", | |
" |-- phone: string (nullable = true)\n", | |
" |-- intl_plan: string (nullable = true)\n", | |
" |-- vmail_plan: string (nullable = true)\n", | |
" |-- vmail_message: long (nullable = true)\n", | |
" |-- day_mins: double (nullable = true)\n", | |
" |-- day_calls: long (nullable = true)\n", | |
" |-- day_charge: double (nullable = true)\n", | |
" |-- eve_mins: double (nullable = true)\n", | |
" |-- eve_calls: long (nullable = true)\n", | |
" |-- eve_charge: double (nullable = true)\n", | |
" |-- night_mins: double (nullable = true)\n", | |
" |-- night_calls: long (nullable = true)\n", | |
" |-- night_charge: double (nullable = true)\n", | |
" |-- intl_mins: double (nullable = true)\n", | |
" |-- intl_calls: long (nullable = true)\n", | |
" |-- intl_charge: double (nullable = true)\n", | |
" |-- custserv_calls: long (nullable = true)\n", | |
" |-- churn: string (nullable = true)\n", | |
"\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "q8V-2bF1Qity", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Preprocessing" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "iHM3tj5GVgg2", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION array_concat AS 'hivemall.tools.array.ArrayConcatUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION categorical_features AS 'hivemall.ftvec.trans.CategoricalFeaturesUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION quantitative_features AS 'hivemall.ftvec.trans.QuantitativeFeaturesUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION rescale AS 'hivemall.ftvec.scaling.RescaleUDF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "-rDg3uwSUHVU", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Create a view on the original DataFrame:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "qyhaKRS4UAS8", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"df.createOrReplaceTempView('churn')" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "AjS-mwtxU_Aa", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Query the view:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "zyD0a-lST_t_", | |
"colab_type": "code", | |
"outputId": "4e6e6852-df4c-4d63-b890-3eac343168be", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 204 | |
} | |
}, | |
"source": [ | |
"df_preprocessed = spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" phone,\n", | |
" array_concat(\n", | |
" categorical_features(\n", | |
" array('intl_plan', 'state', 'area_code', 'vmail_plan'),\n", | |
" intl_plan, state, area_code, vmail_plan\n", | |
" ),\n", | |
" quantitative_features(\n", | |
" array(\n", | |
" 'night_charge', 'day_charge', 'custserv_calls', \n", | |
" 'intl_charge', 'eve_charge', 'vmail_message'\n", | |
" ),\n", | |
" night_charge, day_charge, custserv_calls,\n", | |
" intl_charge, eve_charge, vmail_message\n", | |
" )\n", | |
" ) as features,\n", | |
" if(churn = 'True.', 1, 0) as label\n", | |
"FROM\n", | |
" churn\n", | |
"\"\"\")\n", | |
"df_preprocessed.toPandas().head()" | |
], | |
"execution_count": 14, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>phone</th>\n", | |
" <th>features</th>\n", | |
" <th>label</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>382-4657</td>\n", | |
" <td>[intl_plan#no, state#KS, area_code#415, vmail_...</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>371-7191</td>\n", | |
" <td>[intl_plan#no, state#OH, area_code#415, vmail_...</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>358-1921</td>\n", | |
" <td>[intl_plan#no, state#NJ, area_code#415, vmail_...</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>375-9999</td>\n", | |
" <td>[intl_plan#yes, state#OH, area_code#408, vmail...</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>330-6626</td>\n", | |
" <td>[intl_plan#yes, state#OK, area_code#415, vmail...</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" phone features label\n", | |
"0 382-4657 [intl_plan#no, state#KS, area_code#415, vmail_... 0\n", | |
"1 371-7191 [intl_plan#no, state#OH, area_code#415, vmail_... 0\n", | |
"2 358-1921 [intl_plan#no, state#NJ, area_code#415, vmail_... 0\n", | |
"3 375-9999 [intl_plan#yes, state#OH, area_code#408, vmail... 0\n", | |
"4 330-6626 [intl_plan#yes, state#OK, area_code#415, vmail... 0" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 14 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "AfGRPa2ZWRoQ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"We can of course run Spark DataFrame operations:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "RrW1sluxV5YV", | |
"colab_type": "code", | |
"outputId": "c03425a9-9562-4070-df29-0c5aac0be539", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 136 | |
} | |
}, | |
"source": [ | |
"df_preprocessed.groupby('label').count().show()" | |
], | |
"execution_count": 15, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"+-----+-----+\n", | |
"|label|count|\n", | |
"+-----+-----+\n", | |
"| 1| 483|\n", | |
"| 0| 2850|\n", | |
"+-----+-----+\n", | |
"\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "zNO7bKHTWZWW", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Split records into 80% train and 20% test set:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "SCap59YLBxr1", | |
"colab_type": "code", | |
"outputId": "406dfefe-a6ac-4f80-87d9-13000637f5de", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
} | |
}, | |
"source": [ | |
"df_train, df_test = df_preprocessed.randomSplit([0.8, 0.2], seed=31)\n", | |
"df_train.count(), df_test.count()" | |
], | |
"execution_count": 16, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"(2658, 675)" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 16 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Due2pk_GGYfu", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Training" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "i9cDb0SaBVFn", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Use `train_classifier` UDF to build a liner classifier:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "hfBOFHHYWmgO", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION train_classifier AS 'hivemall.classifier.GeneralClassifierUDTF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "8NpNjX1DFqB1", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Usage can be found by `-help` option:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "PePisTqXBkR0", | |
"colab_type": "code", | |
"outputId": "7b33d796-6f11-44d8-bf3b-969635521807", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
} | |
}, | |
"source": [ | |
"spark.sql(\"SELECT train_classifier(array(), 0, '-help')\")" | |
], | |
"execution_count": 18, | |
"outputs": [ | |
{ | |
"output_type": "error", | |
"ename": "AnalysisException", | |
"evalue": "ignored", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mPy4JJavaError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m/content/spark-2.3.4-bin-hadoop2.7/python/pyspark/sql/utils.py\u001b[0m in \u001b[0;36mdeco\u001b[0;34m(*a, **kw)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 64\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mpy4j\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPy4JJavaError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/content/spark-2.3.4-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py\u001b[0m in \u001b[0;36mget_return_value\u001b[0;34m(answer, gateway_client, target_id, name)\u001b[0m\n\u001b[1;32m 327\u001b[0m \u001b[0;34m\"An error occurred while calling {0}{1}{2}.\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 328\u001b[0;31m format(target_id, \".\", name), value)\n\u001b[0m\u001b[1;32m 329\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mPy4JJavaError\u001b[0m: An error occurred while calling o28.sql.\n: org.apache.spark.sql.AnalysisException: No handler for UDF/UDAF/UDTF 'hivemall.classifier.GeneralClassifierUDTF': org.apache.hadoop.hive.ql.exec.UDFArgumentException: \nusage: train_classifier(list<string|int|bigint> features, int label [,\n const string options]) - Returns a relation consists of\n <string|int|bigint feature, float weight> [-cv_rate <arg>] [-dense]\n [-dims <arg>] [-disable_cv] [-disable_halffloat] [-eps <arg>] [-eta\n <arg>] [-eta0 <arg>] [-help] [-iter <arg>] [-iters <arg>]\n [-l1_ratio <arg>] [-lambda <arg>] [-loss <arg>] [-mini_batch <arg>]\n [-mix <arg>] [-mix_cancel] [-mix_session <arg>] [-mix_threshold\n <arg>] [-opt <arg>] [-power_t <arg>] [-reg <arg>] [-rho <arg>]\n [-scale <arg>] [-ssl] [-t <arg>]\n -cv_rate,--convergence_rate <arg> Threshold to determine\n convergence [default: 0.005]\n -dense,--densemodel Use dense model or not\n -dims,--feature_dimensions <arg> The dimension of model [default:\n 16777216 (2^24)]\n -disable_cv,--disable_cvtest Whether to disable convergence\n check [default: OFF]\n -disable_halffloat Toggle this option to disable the\n use of SpaceEfficientDenseModel\n -eps <arg> Denominator value of\n AdaDelta/AdaGrad [default 1e-6]\n -eta <arg> Learning rate scheme [default:\n inverse/inv, fixed, simple]\n -eta0 <arg> The initial learning rate\n [default 0.1]\n -help Show function help\n -iter,--iterations <arg> The maximum number of iterations\n [default: 10]\n -iters,--iterations <arg> The maximum number of iterations\n [default: 10]\n -l1_ratio <arg> Ratio of L1 regularizer as a part\n of Elastic Net regularization\n [default: 0.5]\n -lambda <arg> Regularization term [default\n 0.0001]\n -loss,--loss_function <arg> Loss function [HingeLoss\n (default), LogLoss,\n SquaredHingeLoss,\n ModifiedHuberLoss, or\n a regression loss: SquaredLoss,\n QuantileLoss,\n EpsilonInsensitiveLoss,\n SquaredEpsilonInsensitiveLoss,\n HuberLoss]\n -mini_batch,--mini_batch_size <arg> Mini batch size [default: 1].\n Expecting the value in range\n [1,100] or so.\n -mix,--mix_servers <arg> Comma separated list of MIX\n servers\n -mix_cancel,--enable_mix_canceling Enable mix cancel requests\n -mix_session,--mix_session_name <arg> Mix session name [default:\n ${mapred.job.id}]\n -mix_threshold <arg> Threshold to mix local updates in\n range (0,127] [default: 3]\n -opt,--optimizer <arg> Optimizer to update weights\n [default: adagrad, sgd, adadelta,\n adam]\n -power_t <arg> The exponent for inverse scaling\n learning rate [default 0.1]\n -reg,--regularization <arg> Regularization type [default:\n rda, l1, l2, elasticnet]\n -rho,--decay <arg> Decay rate of AdaDelta [default\n 0.95]\n -scale <arg> Scaling factor for cumulative\n weights [100.0]\n -ssl Use SSL for the communication\n with mix servers\n -t,--total_steps <arg> a total of n_samples * epochs\n time steps\n\nPlease make sure your function overrides `public StructObjectInspector initialize(ObjectInspector[] args)`.; line 1 pos 7\n\tat hivemall.UDTFWithOptions.parseOptions(UDTFWithOptions.java:117)\n\tat hivemall.LearnerBaseUDTF.processOptions(LearnerBaseUDTF.java:121)\n\tat hivemall.GeneralLearnerBaseUDTF.processOptions(GeneralLearnerBaseUDTF.java:186)\n\tat hivemall.GeneralLearnerBaseUDTF.initialize(GeneralLearnerBaseUDTF.java:151)\n\tat org.apache.spark.sql.hive.HiveGenericUDTF.outputInspector$lzycompute(hiveUDFs.scala:215)\n\tat org.apache.spark.sql.hive.HiveGenericUDTF.outputInspector(hiveUDFs.scala:215)\n\tat org.apache.spark.sql.hive.HiveGenericUDTF.elementSchema$lzycompute(hiveUDFs.scala:223)\n\tat org.apache.spark.sql.hive.HiveGenericUDTF.elementSchema(hiveUDFs.scala:223)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog$$anonfun$makeFunctionExpression$2.apply(HiveSessionCatalog.scala:93)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog$$anonfun$makeFunctionExpression$2.apply(HiveSessionCatalog.scala:69)\n\tat scala.util.Try.getOrElse(Try.scala:79)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog.makeFunctionExpression(HiveSessionCatalog.scala:69)\n\tat org.apache.spark.sql.catalyst.catalog.SessionCatalog$$anonfun$org$apache$spark$sql$catalyst$catalog$SessionCatalog$$makeFunctionBuilder$1.apply(SessionCatalog.scala:1090)\n\tat org.apache.spark.sql.catalyst.catalog.SessionCatalog$$anonfun$org$apache$spark$sql$catalyst$catalog$SessionCatalog$$makeFunctionBuilder$1.apply(SessionCatalog.scala:1090)\n\tat org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry.lookupFunction(FunctionRegistry.scala:115)\n\tat org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupFunction(SessionCatalog.scala:1221)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog.org$apache$spark$sql$hive$HiveSessionCatalog$$super$lookupFunction(HiveSessionCatalog.scala:131)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog$$anonfun$3.apply(HiveSessionCatalog.scala:131)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog$$anonfun$3.apply(HiveSessionCatalog.scala:131)\n\tat scala.util.Try$.apply(Try.scala:192)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog.lookupFunction0(HiveSessionCatalog.scala:131)\n\tat org.apache.spark.sql.hive.HiveSessionCatalog.lookupFunction(HiveSessionCatalog.scala:124)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6$$anonfun$applyOrElse$53.apply(Analyzer.scala:1242)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6$$anonfun$applyOrElse$53.apply(Analyzer.scala:1242)\n\tat org.apache.spark.sql.catalyst.analysis.package$.withPosition(package.scala:53)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6.applyOrElse(Analyzer.scala:1241)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6.applyOrElse(Analyzer.scala:1225)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:267)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:267)\n\tat org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:266)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:272)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:272)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:306)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:272)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$transformExpressionsDown$1.apply(QueryPlan.scala:85)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$transformExpressionsDown$1.apply(QueryPlan.scala:85)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1.apply(QueryPlan.scala:107)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$1.apply(QueryPlan.scala:107)\n\tat org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpression$1(QueryPlan.scala:106)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1(QueryPlan.scala:118)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1$1.apply(QueryPlan.scala:122)\n\tat scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)\n\tat scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)\n\tat scala.collection.immutable.List.foreach(List.scala:381)\n\tat scala.collection.TraversableLike$class.map(TraversableLike.scala:234)\n\tat scala.collection.immutable.List.map(List.scala:285)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$1(QueryPlan.scala:122)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$2.apply(QueryPlan.scala:127)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.mapExpressions(QueryPlan.scala:127)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressionsDown(QueryPlan.scala:85)\n\tat org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressions(QueryPlan.scala:76)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16.applyOrElse(Analyzer.scala:1225)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16.applyOrElse(Analyzer.scala:1223)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)\n\tat org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)\n\tat org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:288)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$.apply(Analyzer.scala:1223)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$.apply(Analyzer.scala:1222)\n\tat org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:87)\n\tat org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:84)\n\tat scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)\n\tat scala.collection.immutable.List.foldLeft(List.scala:84)\n\tat org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:84)\n\tat org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:76)\n\tat scala.collection.immutable.List.foreach(List.scala:381)\n\tat org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:76)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer.org$apache$spark$sql$catalyst$analysis$Analyzer$$executeSameContext(Analyzer.scala:124)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:118)\n\tat org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:103)\n\tat org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:57)\n\tat org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:55)\n\tat org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:47)\n\tat org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:74)\n\tat org.apache.spark.sql.SparkSession.sql(SparkSession.scala:642)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:498)\n\tat py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)\n\tat py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)\n\tat py4j.Gateway.invoke(Gateway.java:282)\n\tat py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)\n\tat py4j.commands.CallCommand.execute(CallCommand.java:79)\n\tat py4j.GatewayConnection.run(GatewayConnection.java:238)\n\tat java.lang.Thread.run(Thread.java:748)\n", | |
"\nDuring handling of the above exception, another exception occurred:\n", | |
"\u001b[0;31mAnalysisException\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-18-2244f8a1acb3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mspark\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"SELECT train_classifier(array(), 0, '-help')\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
"\u001b[0;32m/content/spark-2.3.4-bin-hadoop2.7/python/pyspark/sql/session.py\u001b[0m in \u001b[0;36msql\u001b[0;34m(self, sqlQuery)\u001b[0m\n\u001b[1;32m 708\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mRow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34mu'row1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mRow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34mu'row2'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mRow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf1\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34mu'row3'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 709\u001b[0m \"\"\"\n\u001b[0;32m--> 710\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jsparkSession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msqlQuery\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_wrapped\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 711\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 712\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0msince\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2.0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/content/spark-2.3.4-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 1255\u001b[0m \u001b[0manswer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgateway_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend_command\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcommand\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1256\u001b[0m return_value = get_return_value(\n\u001b[0;32m-> 1257\u001b[0;31m answer, self.gateway_client, self.target_id, self.name)\n\u001b[0m\u001b[1;32m 1258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1259\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtemp_arg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtemp_args\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;32m/content/spark-2.3.4-bin-hadoop2.7/python/pyspark/sql/utils.py\u001b[0m in \u001b[0;36mdeco\u001b[0;34m(*a, **kw)\u001b[0m\n\u001b[1;32m 67\u001b[0m e.java_exception.getStackTrace()))\n\u001b[1;32m 68\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstartswith\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'org.apache.spark.sql.AnalysisException: '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 69\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mAnalysisException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m': '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstackTrace\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 70\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstartswith\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'org.apache.spark.sql.catalyst.analysis'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mAnalysisException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m': '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstackTrace\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mAnalysisException\u001b[0m: \"No handler for UDF/UDAF/UDTF 'hivemall.classifier.GeneralClassifierUDTF': org.apache.hadoop.hive.ql.exec.UDFArgumentException: \\nusage: train_classifier(list<string|int|bigint> features, int label [,\\n const string options]) - Returns a relation consists of\\n <string|int|bigint feature, float weight> [-cv_rate <arg>] [-dense]\\n [-dims <arg>] [-disable_cv] [-disable_halffloat] [-eps <arg>] [-eta\\n <arg>] [-eta0 <arg>] [-help] [-iter <arg>] [-iters <arg>]\\n [-l1_ratio <arg>] [-lambda <arg>] [-loss <arg>] [-mini_batch <arg>]\\n [-mix <arg>] [-mix_cancel] [-mix_session <arg>] [-mix_threshold\\n <arg>] [-opt <arg>] [-power_t <arg>] [-reg <arg>] [-rho <arg>]\\n [-scale <arg>] [-ssl] [-t <arg>]\\n -cv_rate,--convergence_rate <arg> Threshold to determine\\n convergence [default: 0.005]\\n -dense,--densemodel Use dense model or not\\n -dims,--feature_dimensions <arg> The dimension of model [default:\\n 16777216 (2^24)]\\n -disable_cv,--disable_cvtest Whether to disable convergence\\n check [default: OFF]\\n -disable_halffloat Toggle this option to disable the\\n use of SpaceEfficientDenseModel\\n -eps <arg> Denominator value of\\n ..." | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "K43cGiLpFvwo", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Train a model in the distributed manner by leveraging the available workers:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "DeqpkSBDCabD", | |
"colab_type": "code", | |
"outputId": "621c8bae-7737-4684-8a29-318e65fff50e", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 359 | |
} | |
}, | |
"source": [ | |
"df_train.createOrReplaceTempView('train')\n", | |
"\n", | |
"df_model = spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" feature,\n", | |
" avg(weight) as weight\n", | |
"FROM (\n", | |
" SELECT\n", | |
" train_classifier(\n", | |
" features, \n", | |
" label,\n", | |
" '-loss logloss -opt SGD -reg l1 -lambda 0.03 -eta0 0.01'\n", | |
" ) as (feature, weight)\n", | |
" FROM\n", | |
" train\n", | |
") t\n", | |
"GROUP BY 1\n", | |
"\"\"\")\n", | |
"df_model.toPandas().head(10)" | |
], | |
"execution_count": 19, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>feature</th>\n", | |
" <th>weight</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>state#TX</td>\n", | |
" <td>0.088104</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>state#MN</td>\n", | |
" <td>0.024230</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>state#LA</td>\n", | |
" <td>-0.024339</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>area_code#408</td>\n", | |
" <td>-0.006044</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>night_charge</td>\n", | |
" <td>-0.194483</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>state#ND</td>\n", | |
" <td>-0.066669</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>state#VT</td>\n", | |
" <td>-0.063177</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>state#MA</td>\n", | |
" <td>0.000016</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>state#OH</td>\n", | |
" <td>0.031865</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>state#MD</td>\n", | |
" <td>0.038399</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" feature weight\n", | |
"0 state#TX 0.088104\n", | |
"1 state#MN 0.024230\n", | |
"2 state#LA -0.024339\n", | |
"3 area_code#408 -0.006044\n", | |
"4 night_charge -0.194483\n", | |
"5 state#ND -0.066669\n", | |
"6 state#VT -0.063177\n", | |
"7 state#MA 0.000016\n", | |
"8 state#OH 0.031865\n", | |
"9 state#MD 0.038399" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 19 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "HsQsS02eBxtd", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Model parameters can be easily visualized as:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "7EaqBaMIDTm7", | |
"colab_type": "code", | |
"outputId": "7fa82e34-ec07-4a25-cd21-bdca62766830", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 269 | |
} | |
}, | |
"source": [ | |
"%matplotlib inline\n", | |
"import matplotlib.pyplot as plt\n", | |
"import pyspark.sql.functions as F\n", | |
"\n", | |
"m = df_model.orderBy(F.abs(df_model.weight).desc()).limit(10).toPandas()\n", | |
"\n", | |
"x = range(m.shape[0])\n", | |
"plt.barh(x, m['weight'], align='center')\n", | |
"plt.yticks(x, m['feature'])\n", | |
"\n", | |
"plt.gca().invert_yaxis()\n", | |
"plt.gca().xaxis.grid(True)\n", | |
"\n", | |
"fig = plt.gcf()\n", | |
"fig.set_size_inches((8, 4))\n", | |
" \n", | |
"plt.show()" | |
], | |
"execution_count": 20, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\nSeYAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<Figure size 576x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "gXrgBjpUGbAG", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Prediction" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "xUtbR1bB0_ZY", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION sigmoid AS 'hivemall.tools.math.SigmoidGenericUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION extract_feature AS 'hivemall.ftvec.ExtractFeatureUDFWrapper'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION extract_weight AS 'hivemall.ftvec.ExtractWeightUDFWrapper'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "oPXKfK8rF4HZ", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Join over features, compute weighted sum of them, and take sigmoid:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "grOFSn13D_KU", | |
"colab_type": "code", | |
"outputId": "80b4bbaf-d541-44b3-d2f4-304285b3180f", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 359 | |
} | |
}, | |
"source": [ | |
"df_test.createOrReplaceTempView('test')\n", | |
"df_model.createOrReplaceTempView('model')\n", | |
"\n", | |
"df_prediction = spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" phone,\n", | |
" label as expected,\n", | |
" sigmoid(sum(weight * value)) as prob\n", | |
"FROM ( \n", | |
" SELECT\n", | |
" phone,\n", | |
" label,\n", | |
" extract_feature(fv) AS feature,\n", | |
" extract_weight(fv) AS value\n", | |
" FROM \n", | |
" test\n", | |
" LATERAL VIEW explode(features) t2 AS fv\n", | |
") t \n", | |
"LEFT OUTER JOIN model m \n", | |
" ON t.feature = m.feature\n", | |
"GROUP BY 1, 2\n", | |
"\"\"\")\n", | |
"df_prediction.toPandas().head(10)" | |
], | |
"execution_count": 22, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>phone</th>\n", | |
" <th>expected</th>\n", | |
" <th>prob</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>375-3003</td>\n", | |
" <td>0</td>\n", | |
" <td>0.043165</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>344-4022</td>\n", | |
" <td>0</td>\n", | |
" <td>0.032754</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>356-2992</td>\n", | |
" <td>0</td>\n", | |
" <td>0.000035</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>420-3028</td>\n", | |
" <td>0</td>\n", | |
" <td>0.009459</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>354-9062</td>\n", | |
" <td>0</td>\n", | |
" <td>0.128704</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>360-6024</td>\n", | |
" <td>0</td>\n", | |
" <td>0.000029</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>376-4705</td>\n", | |
" <td>1</td>\n", | |
" <td>0.019202</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>373-1448</td>\n", | |
" <td>1</td>\n", | |
" <td>0.007880</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>349-2157</td>\n", | |
" <td>0</td>\n", | |
" <td>0.009182</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>337-9569</td>\n", | |
" <td>0</td>\n", | |
" <td>0.052731</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" phone expected prob\n", | |
"0 375-3003 0 0.043165\n", | |
"1 344-4022 0 0.032754\n", | |
"2 356-2992 0 0.000035\n", | |
"3 420-3028 0 0.009459\n", | |
"4 354-9062 0 0.128704\n", | |
"5 360-6024 0 0.000029\n", | |
"6 376-4705 1 0.019202\n", | |
"7 373-1448 1 0.007880\n", | |
"8 349-2157 0 0.009182\n", | |
"9 337-9569 0 0.052731" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 22 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "0vVGn7f4Gd-3", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Evaluation" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "akplzrCbGFa3", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"For binary classification, Hivemall offers [Log Loss](http://wiki.fast.ai/index.php/Log_Loss) and [AUC](http://gim.unmc.edu/dxtests/ROC3.htm) metric:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "uin0QSgo1dMk", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION logloss AS 'hivemall.evaluation.LogarithmicLossUDAF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION auc AS 'hivemall.evaluation.AUCUDAF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "kJ23r1fvEIUI", | |
"colab_type": "code", | |
"outputId": "693d0c11-2b60-495e-bc4f-741eabe46758", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 119 | |
} | |
}, | |
"source": [ | |
"df_prediction.createOrReplaceTempView('prediction')\n", | |
"\n", | |
"spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" auc(prob, expected) AS auc,\n", | |
" logloss(prob, expected) AS logloss\n", | |
"FROM (\n", | |
" SELECT prob, expected\n", | |
" FROM prediction\n", | |
" ORDER BY prob DESC\n", | |
") t\n", | |
"\"\"\").show()" | |
], | |
"execution_count": 24, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"+------------------+------------------+\n", | |
"| auc| logloss|\n", | |
"+------------------+------------------+\n", | |
"|0.6360049076499652|0.6456736373258979|\n", | |
"+------------------+------------------+\n", | |
"\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "OEC49sOFo44O", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"## Other Classifiers" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "3NbgswUPxTq4", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### Factorization Machines" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "TKhSEc3FpUww", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION train_fm AS 'hivemall.fm.FactorizationMachineUDTF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "PVQb92jVo-fa", | |
"colab_type": "code", | |
"outputId": "cb5beffd-0ece-4da5-fa97-30a3d0ce4ecc", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 359 | |
} | |
}, | |
"source": [ | |
"spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" train_fm(\n", | |
" features, \n", | |
" label,\n", | |
" '-classification -factor 30 -eta 0.001'\n", | |
" ) as (feature, Wi, Vij)\n", | |
"FROM\n", | |
" train\n", | |
"\"\"\").toPandas().head(10)" | |
], | |
"execution_count": 26, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>feature</th>\n", | |
" <th>Wi</th>\n", | |
" <th>Vij</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>0</td>\n", | |
" <td>-0.125796</td>\n", | |
" <td>None</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>state#SC</td>\n", | |
" <td>-0.002943</td>\n", | |
" <td>[-0.0018758076475933194, 0.06696834415197372, ...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>area_code#408</td>\n", | |
" <td>-0.043842</td>\n", | |
" <td>[-0.022054938599467278, 0.007548300549387932, ...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>vmail_message</td>\n", | |
" <td>-0.070304</td>\n", | |
" <td>[0.013247097842395306, 0.005205452907830477, 0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>state#WV</td>\n", | |
" <td>-0.033708</td>\n", | |
" <td>[-0.07025326788425446, -0.14394021034240723, -...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>state#NC</td>\n", | |
" <td>0.002798</td>\n", | |
" <td>[0.06377897411584854, -0.09058145433664322, -0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>state#KY</td>\n", | |
" <td>0.002730</td>\n", | |
" <td>[0.06627880781888962, -0.14982153475284576, -0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>intl_charge</td>\n", | |
" <td>-0.042286</td>\n", | |
" <td>[-0.06048768013715744, 0.018183737993240356, 0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>state#CO</td>\n", | |
" <td>0.019807</td>\n", | |
" <td>[0.03619685024023056, 0.09739864617586136, -0....</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>state#VA</td>\n", | |
" <td>-0.019707</td>\n", | |
" <td>[-0.09031106531620026, 0.14337880909442902, -0...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" feature Wi Vij\n", | |
"0 0 -0.125796 None\n", | |
"1 state#SC -0.002943 [-0.0018758076475933194, 0.06696834415197372, ...\n", | |
"2 area_code#408 -0.043842 [-0.022054938599467278, 0.007548300549387932, ...\n", | |
"3 vmail_message -0.070304 [0.013247097842395306, 0.005205452907830477, 0...\n", | |
"4 state#WV -0.033708 [-0.07025326788425446, -0.14394021034240723, -...\n", | |
"5 state#NC 0.002798 [0.06377897411584854, -0.09058145433664322, -0...\n", | |
"6 state#KY 0.002730 [0.06627880781888962, -0.14982153475284576, -0...\n", | |
"7 intl_charge -0.042286 [-0.06048768013715744, 0.018183737993240356, 0...\n", | |
"8 state#CO 0.019807 [0.03619685024023056, 0.09739864617586136, -0....\n", | |
"9 state#VA -0.019707 [-0.09031106531620026, 0.14337880909442902, -0..." | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 26 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "YpnpPcmKrVSG", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"### RandomFores" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "FDm4vJj-rYJl", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"spark.sql(\"CREATE TEMPORARY FUNCTION feature_hashing AS 'hivemall.ftvec.hashing.FeatureHashingUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION tree_predict AS 'hivemall.smile.tools.TreePredictUDF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION rf_ensemble AS 'hivemall.smile.tools.RandomForestEnsembleUDAF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION train_randomforest_classifier AS 'hivemall.smile.classification.RandomForestClassifierUDTF'\")\n", | |
"spark.sql(\"CREATE TEMPORARY FUNCTION tree_export AS 'hivemall.smile.tools.TreeExportUDF'\");" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Zwkh8N9CxlcB", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Training:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Et3De7pwrX5w", | |
"colab_type": "code", | |
"outputId": "d74801ed-f71a-430a-f6fd-aeee1348baee", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 374 | |
} | |
}, | |
"source": [ | |
"df_rf_model = spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" train_randomforest_classifier(\n", | |
" feature_hashing(features),\n", | |
" label,\n", | |
" '-trees 50 -seed 71' -- hyperparameters\n", | |
" ) as (model_id, model_weight, model, var_importance, oob_errors, oob_tests)\n", | |
"FROM\n", | |
" train\n", | |
"\"\"\")\n", | |
"\n", | |
"df_rf_model.toPandas().head()" | |
], | |
"execution_count": 28, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>model_id</th>\n", | |
" <th>model_weight</th>\n", | |
" <th>model</th>\n", | |
" <th>var_importance</th>\n", | |
" <th>oob_errors</th>\n", | |
" <th>oob_tests</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a3967714-914e-4267-b3f0-788fbef8225a</td>\n", | |
" <td>0.837838</td>\n", | |
" <td>I?XPI/%dsLd{LdDfaZTPM:)_@^i12w<Ba)_j40icEw3jYE...</td>\n", | |
" <td>{15900165: 1.8062073885289325}</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>814a7805-f1b2-4799-a66a-722f96233bc5</td>\n", | |
" <td>0.816498</td>\n", | |
" <td>I?{Pt:IYsLd{3Ze;DYt:3%}g`]F:N}gYMLrRqViFPHu._X...</td>\n", | |
" <td>{15900165: 2.7499708167499106}</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>bea6eef6-d8d8-43ba-861e-217386e32be4</td>\n", | |
" <td>0.851724</td>\n", | |
" <td>I?{PI/%dsLd{2Yw+<LzSF`agXnUPzzou^7Yl[Pws[y~yzD...</td>\n", | |
" <td>{15900165: 2.4154606004599684}</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>cfb19b11-4afb-4d5a-a2de-b3d1e940a098</td>\n", | |
" <td>0.807692</td>\n", | |
" <td>I?{P)`IYwL$|yz6!AGW.%p~UV=-B)WoH=;0c8uOOj+{BiM...</td>\n", | |
" <td>{15900165: 3.886217162213024}</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>efe91459-c0d5-4acf-953a-3c62c35f8f0d</td>\n", | |
" <td>0.824503</td>\n", | |
" <td>I?hRO|IYsL$|+Z>ZwzRhE`><L`+-vZ>D]1UblfV48c=Cl4...</td>\n", | |
" <td>{15900165: 3.422917848419591}</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" model_id model_weight ... oob_errors oob_tests\n", | |
"0 a3967714-914e-4267-b3f0-788fbef8225a 0.837838 ... 0 0\n", | |
"1 814a7805-f1b2-4799-a66a-722f96233bc5 0.816498 ... 0 0\n", | |
"2 bea6eef6-d8d8-43ba-861e-217386e32be4 0.851724 ... 0 0\n", | |
"3 cfb19b11-4afb-4d5a-a2de-b3d1e940a098 0.807692 ... 0 0\n", | |
"4 efe91459-c0d5-4acf-953a-3c62c35f8f0d 0.824503 ... 0 0\n", | |
"\n", | |
"[5 rows x 6 columns]" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 28 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "MXMqyYVVxoFS", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Prediction:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "z8klFXa9wJv8", | |
"colab_type": "code", | |
"outputId": "c23c354d-f18e-42d6-bc18-8f910259f5fb", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 359 | |
} | |
}, | |
"source": [ | |
"df_rf_model.createOrReplaceTempView('rf_model')\n", | |
"\n", | |
"spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" phone,\n", | |
" rf_ensemble(predicted.value, predicted.posteriori, model_weight) as predicted\n", | |
"FROM (\n", | |
" SELECT\n", | |
" t.phone,\n", | |
" m.model_weight,\n", | |
" tree_predict(m.model_id, m.model, feature_hashing(t.features), true) as predicted\n", | |
" FROM\n", | |
" test t\n", | |
" CROSS JOIN\n", | |
" rf_model m\n", | |
") t1\n", | |
"GROUP BY\n", | |
" 1\n", | |
"\"\"\").toPandas().head(10)" | |
], | |
"execution_count": 29, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>phone</th>\n", | |
" <th>predicted</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>366-3944</td>\n", | |
" <td>(0, 1.0, [1.0, 0.0])</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>378-4013</td>\n", | |
" <td>(0, 0.9572407298262462, [0.9572407298262462, 0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>385-9744</td>\n", | |
" <td>(0, 1.0, [1.0, 0.0])</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>408-4529</td>\n", | |
" <td>(0, 0.8680956719420105, [0.8680956719420105, 0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>355-6422</td>\n", | |
" <td>(0, 1.0, [1.0, 0.0])</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>373-2053</td>\n", | |
" <td>(0, 0.803639476792548, [0.803639476792548, 0.1...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>341-1916</td>\n", | |
" <td>(0, 0.9793229251609381, [0.9793229251609381, 0...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>368-8972</td>\n", | |
" <td>(0, 1.0, [1.0, 0.0])</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>383-4641</td>\n", | |
" <td>(0, 1.0, [1.0, 0.0])</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>386-3796</td>\n", | |
" <td>(0, 0.6022822895905967, [0.6022822895905967, 0...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" phone predicted\n", | |
"0 366-3944 (0, 1.0, [1.0, 0.0])\n", | |
"1 378-4013 (0, 0.9572407298262462, [0.9572407298262462, 0...\n", | |
"2 385-9744 (0, 1.0, [1.0, 0.0])\n", | |
"3 408-4529 (0, 0.8680956719420105, [0.8680956719420105, 0...\n", | |
"4 355-6422 (0, 1.0, [1.0, 0.0])\n", | |
"5 373-2053 (0, 0.803639476792548, [0.803639476792548, 0.1...\n", | |
"6 341-1916 (0, 0.9793229251609381, [0.9793229251609381, 0...\n", | |
"7 368-8972 (0, 1.0, [1.0, 0.0])\n", | |
"8 383-4641 (0, 1.0, [1.0, 0.0])\n", | |
"9 386-3796 (0, 0.6022822895905967, [0.6022822895905967, 0..." | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 29 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "LOOELmsox29k", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"Visualization:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Etxef4Ryx36_", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 204 | |
}, | |
"outputId": "5e0d39e0-1197-40ec-978d-03b1003f5c1f" | |
}, | |
"source": [ | |
"df_rf_model_viz = spark.sql(\"\"\"\n", | |
"SELECT\n", | |
" tree_export(model, '-type javascript') as js,\n", | |
" tree_export(model, '-type graphviz') as dot\n", | |
"FROM\n", | |
" rf_model\n", | |
"\"\"\")\n", | |
"\n", | |
"df_rf_model_viz.toPandas().head()" | |
], | |
"execution_count": 30, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>js</th>\n", | |
" <th>dot</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>if( x[15900165] <= 6.225 ) {\\n if( x[15900165...</td>\n", | |
" <td>digraph Tree {\\n node [shape=box, style=\"fille...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>if( x[15900165] <= 5.755 ) {\\n if( x[15900165...</td>\n", | |
" <td>digraph Tree {\\n node [shape=box, style=\"fille...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>if( x[15900165] <= 5.395 ) {\\n if( x[15900165...</td>\n", | |
" <td>digraph Tree {\\n node [shape=box, style=\"fille...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>if( x[15900165] <= 3.74 ) {\\n if( x[15900165]...</td>\n", | |
" <td>digraph Tree {\\n node [shape=box, style=\"fille...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>if( x[15900165] <= 6.015 ) {\\n if( x[15900165...</td>\n", | |
" <td>digraph Tree {\\n node [shape=box, style=\"fille...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" js dot\n", | |
"0 if( x[15900165] <= 6.225 ) {\\n if( x[15900165... digraph Tree {\\n node [shape=box, style=\"fille...\n", | |
"1 if( x[15900165] <= 5.755 ) {\\n if( x[15900165... digraph Tree {\\n node [shape=box, style=\"fille...\n", | |
"2 if( x[15900165] <= 5.395 ) {\\n if( x[15900165... digraph Tree {\\n node [shape=box, style=\"fille...\n", | |
"3 if( x[15900165] <= 3.74 ) {\\n if( x[15900165]... digraph Tree {\\n node [shape=box, style=\"fille...\n", | |
"4 if( x[15900165] <= 6.015 ) {\\n if( x[15900165... digraph Tree {\\n node [shape=box, style=\"fille..." | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 30 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "jQ54LDQlyHxN", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
}, | |
"outputId": "f169373a-bab3-49a2-c37a-c9bd67932b24" | |
}, | |
"source": [ | |
"viz_sample_row = df_rf_model_viz.limit(1).collect()[0]\n", | |
"\n", | |
"print(viz_sample_row.js)" | |
], | |
"execution_count": 31, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"if( x[15900165] <= 6.225 ) {\n", | |
" if( x[15900165] <= 5.425000000000001 ) {\n", | |
" if( x[15900165] <= 4.85 ) {\n", | |
" if( x[15900165] <= 3.3499999999999996 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.02 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
"} else {\n", | |
" if( x[15900165] <= 6.25 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.41 ) {\n", | |
" if( x[15900165] <= 8.395 ) {\n", | |
" if( x[15900165] <= 6.359999999999999 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.445 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.735 ) {\n", | |
" if( x[15900165] <= 6.615 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.745 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.825 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 6.835 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.545 ) {\n", | |
" if( x[15900165] <= 6.904999999999999 ) {\n", | |
" if( x[15900165] <= 6.85 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.3100000000000005 ) {\n", | |
" if( x[15900165] <= 7.215 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.345 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.505 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.555 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.63 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.655 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.755 ) {\n", | |
" if( x[15900165] <= 7.7 ) {\n", | |
" if( x[15900165] <= 7.6850000000000005 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.725 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 7.955 ) {\n", | |
" if( x[15900165] <= 7.795 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.245000000000001 ) {\n", | |
" if( x[15900165] <= 8.065000000000001 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.16 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.285 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.635000000000002 ) {\n", | |
" if( x[15900165] <= 8.535 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.605 ) {\n", | |
" if( x[15900165] <= 11.465 ) {\n", | |
" if( x[15900165] <= 11.065000000000001 ) {\n", | |
" if( x[15900165] <= 10.085 ) {\n", | |
" if( x[15900165] <= 10.065000000000001 ) {\n", | |
" if( x[15900165] <= 9.745000000000001 ) {\n", | |
" if( x[15900165] <= 9.735 ) {\n", | |
" if( x[15900165] <= 9.195 ) {\n", | |
" if( x[15900165] <= 8.955 ) {\n", | |
" if( x[15900165] <= 8.875 ) {\n", | |
" if( x[15900165] <= 8.735 ) {\n", | |
" if( x[15900165] <= 8.684999999999999 ) {\n", | |
" if( x[15900165] <= 8.655000000000001 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.695 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.705 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.715 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.774999999999999 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 8.94 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.225000000000001 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.385000000000002 ) {\n", | |
" if( x[15900165] <= 9.364999999999998 ) {\n", | |
" if( x[15900165] <= 9.24 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.415 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.44 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.71 ) {\n", | |
" if( x[15900165] <= 9.645 ) {\n", | |
" if( x[15900165] <= 9.455 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 9.865 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.024999999999999 ) {\n", | |
" if( x[15900165] <= 9.945 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.295 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.305 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.945 ) {\n", | |
" if( x[15900165] <= 10.93 ) {\n", | |
" if( x[15900165] <= 10.565000000000001 ) {\n", | |
" if( x[15900165] <= 10.375 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.395 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.72 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 10.870000000000001 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.075 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.1 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.165 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.285 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 11.51 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 12.274999999999999 ) {\n", | |
" if( x[15900165] <= 11.934999999999999 ) {\n", | |
" if( x[15900165] <= 11.925 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 12.575 ) {\n", | |
" if( x[15900165] <= 12.485 ) {\n", | |
" if( x[15900165] <= 12.415 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 12.780000000000001 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 13.43 ) {\n", | |
" if( x[15900165] <= 13.17 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 13.254999999999999 ) {\n", | |
" 1;\n", | |
" } else {\n", | |
" if( x[15900165] <= 13.295 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 1;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" } else {\n", | |
" if( x[15900165] <= 13.645 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" if( x[15900165] <= 14.11 ) {\n", | |
" 0;\n", | |
" } else {\n", | |
" 0;\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "sv3kat5YyjOi", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
}, | |
"outputId": "c3844389-4e2e-429f-f6af-c5d1d489cbd6" | |
}, | |
"source": [ | |
"from graphviz import Source\n", | |
"\n", | |
"Source(viz_sample_row.dot)" | |
], | |
"execution_count": 32, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<graphviz.files.Source at 0x7f4f020fee48>" | |
], | |
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n -->\n<!-- Title: Tree Pages: 1 -->\n<svg width=\"5077pt\" height=\"1412pt\"\n viewBox=\"0.00 0.00 5077.29 1412.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1408)\">\n<title>Tree</title>\n<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-1408 5073.2884,-1408 5073.2884,4 -4,4\"/>\n<!-- 0 -->\n<g id=\"node1\" class=\"node\">\n<title>0</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M995.6442,-1404C995.6442,-1404 831.6442,-1404 831.6442,-1404 825.6442,-1404 819.6442,-1398 819.6442,-1392 819.6442,-1392 819.6442,-1380 819.6442,-1380 819.6442,-1374 825.6442,-1368 831.6442,-1368 831.6442,-1368 995.6442,-1368 995.6442,-1368 1001.6442,-1368 1007.6442,-1374 1007.6442,-1380 1007.6442,-1380 1007.6442,-1392 1007.6442,-1392 1007.6442,-1398 1001.6442,-1404 995.6442,-1404\"/>\n<text text-anchor=\"start\" x=\"827.6442\" y=\"-1382.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.225</text>\n</g>\n<!-- 1 -->\n<g id=\"node2\" class=\"node\">\n<title>1</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M920.1442,-1332C920.1442,-1332 657.1442,-1332 657.1442,-1332 651.1442,-1332 645.1442,-1326 645.1442,-1320 645.1442,-1320 645.1442,-1308 645.1442,-1308 645.1442,-1302 651.1442,-1296 657.1442,-1296 657.1442,-1296 920.1442,-1296 920.1442,-1296 926.1442,-1296 932.1442,-1302 932.1442,-1308 932.1442,-1308 932.1442,-1320 932.1442,-1320 932.1442,-1326 926.1442,-1332 920.1442,-1332\"/>\n<text text-anchor=\"start\" x=\"653.1442\" y=\"-1310.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 5.425000000000001</text>\n</g>\n<!-- 0->1 -->\n<g id=\"edge1\" class=\"edge\">\n<title>0->1</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M882.1014,-1367.8314C865.9651,-1358.5368 846.1456,-1347.1208 828.9169,-1337.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"830.5891,-1334.1212 820.1769,-1332.1628 827.0952,-1340.187 830.5891,-1334.1212\"/>\n<text text-anchor=\"middle\" x=\"826.6718\" y=\"-1352.6044\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">True</text>\n</g>\n<!-- 10 -->\n<g id=\"node11\" class=\"node\">\n<title>10</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1117.1442,-1332C1117.1442,-1332 962.1442,-1332 962.1442,-1332 956.1442,-1332 950.1442,-1326 950.1442,-1320 950.1442,-1320 950.1442,-1308 950.1442,-1308 950.1442,-1302 956.1442,-1296 962.1442,-1296 962.1442,-1296 1117.1442,-1296 1117.1442,-1296 1123.1442,-1296 1129.1442,-1302 1129.1442,-1308 1129.1442,-1308 1129.1442,-1320 1129.1442,-1320 1129.1442,-1326 1123.1442,-1332 1117.1442,-1332\"/>\n<text text-anchor=\"start\" x=\"958.1442\" y=\"-1310.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.25</text>\n</g>\n<!-- 0->10 -->\n<g id=\"edge10\" class=\"edge\">\n<title>0->10</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M945.4393,-1367.8314C961.7047,-1358.5368 981.6828,-1347.1208 999.0492,-1337.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1000.9133,-1340.1631 1007.8592,-1332.1628 997.4403,-1334.0854 1000.9133,-1340.1631\"/>\n<text text-anchor=\"middle\" x=\"1001.2813\" y=\"-1352.5819\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">False</text>\n</g>\n<!-- 2 -->\n<g id=\"node3\" class=\"node\">\n<title>2</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M708.1442,-1260C708.1442,-1260 553.1442,-1260 553.1442,-1260 547.1442,-1260 541.1442,-1254 541.1442,-1248 541.1442,-1248 541.1442,-1236 541.1442,-1236 541.1442,-1230 547.1442,-1224 553.1442,-1224 553.1442,-1224 708.1442,-1224 708.1442,-1224 714.1442,-1224 720.1442,-1230 720.1442,-1236 720.1442,-1236 720.1442,-1248 720.1442,-1248 720.1442,-1254 714.1442,-1260 708.1442,-1260\"/>\n<text text-anchor=\"start\" x=\"549.1442\" y=\"-1238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 4.85</text>\n</g>\n<!-- 1->2 -->\n<g id=\"edge2\" class=\"edge\">\n<title>1->2</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M748.7741,-1295.8314C727.7365,-1286.2446 701.7459,-1274.4008 679.5046,-1264.2655\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"680.7786,-1260.9999 670.2275,-1260.038 677.8759,-1267.3697 680.7786,-1260.9999\"/>\n</g>\n<!-- 7 -->\n<g id=\"node8\" class=\"node\">\n<title>7</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M905.1442,-1260C905.1442,-1260 750.1442,-1260 750.1442,-1260 744.1442,-1260 738.1442,-1254 738.1442,-1248 738.1442,-1248 738.1442,-1236 738.1442,-1236 738.1442,-1230 744.1442,-1224 750.1442,-1224 750.1442,-1224 905.1442,-1224 905.1442,-1224 911.1442,-1224 917.1442,-1230 917.1442,-1236 917.1442,-1236 917.1442,-1248 917.1442,-1248 917.1442,-1254 911.1442,-1260 905.1442,-1260\"/>\n<text text-anchor=\"start\" x=\"746.1442\" y=\"-1238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.02</text>\n</g>\n<!-- 1->7 -->\n<g id=\"edge7\" class=\"edge\">\n<title>1->7</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M798.4855,-1295.8314C802.8399,-1287.7925 808.054,-1278.1666 812.8611,-1269.2918\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"815.985,-1270.8732 817.6703,-1260.4133 809.8299,-1267.5392 815.985,-1270.8732\"/>\n</g>\n<!-- 3 -->\n<g id=\"node4\" class=\"node\">\n<title>3</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M547.1442,-1188C547.1442,-1188 276.1442,-1188 276.1442,-1188 270.1442,-1188 264.1442,-1182 264.1442,-1176 264.1442,-1176 264.1442,-1164 264.1442,-1164 264.1442,-1158 270.1442,-1152 276.1442,-1152 276.1442,-1152 547.1442,-1152 547.1442,-1152 553.1442,-1152 559.1442,-1158 559.1442,-1164 559.1442,-1164 559.1442,-1176 559.1442,-1176 559.1442,-1182 553.1442,-1188 547.1442,-1188\"/>\n<text text-anchor=\"start\" x=\"272.1442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 3.3499999999999996</text>\n</g>\n<!-- 2->3 -->\n<g id=\"edge3\" class=\"edge\">\n<title>2->3</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M575.6639,-1223.9243C545.465,-1213.9959 507.8384,-1201.6255 476.2437,-1191.2382\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"477.24,-1187.8815 466.6471,-1188.0831 475.0537,-1194.5313 477.24,-1187.8815\"/>\n</g>\n<!-- 6 -->\n<g id=\"node7\" class=\"node\">\n<title>6</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"642.6442\" cy=\"-1170\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"600.1442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 2->6 -->\n<g id=\"edge6\" class=\"edge\">\n<title>2->6</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M633.6723,-1223.8314C634.9557,-1216.131 636.4818,-1206.9743 637.9081,-1198.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"641.3836,-1198.8526 639.5753,-1188.4133 634.4788,-1197.7018 641.3836,-1198.8526\"/>\n</g>\n<!-- 4 -->\n<g id=\"node5\" class=\"node\">\n<title>4</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"336.6442\" cy=\"-1098\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"294.1442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 3->4 -->\n<g id=\"edge4\" class=\"edge\">\n<title>3->4</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M392.7185,-1151.8314C383.451,-1142.9346 372.1587,-1132.0939 362.1431,-1122.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"364.4254,-1119.8182 354.7876,-1115.4177 359.5777,-1124.8679 364.4254,-1119.8182\"/>\n</g>\n<!-- 5 -->\n<g id=\"node6\" class=\"node\">\n<title>5</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"485.6442\" cy=\"-1098\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"443.1442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 3->5 -->\n<g id=\"edge5\" class=\"edge\">\n<title>3->5</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M430.3175,-1151.8314C439.4614,-1142.9346 450.6032,-1132.0939 460.4853,-1122.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"463.0161,-1124.8998 467.7426,-1115.4177 458.1346,-1119.8827 463.0161,-1124.8998\"/>\n</g>\n<!-- 8 -->\n<g id=\"node9\" class=\"node\">\n<title>8</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"815.6442\" cy=\"-1170\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"773.1442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 7->8 -->\n<g id=\"edge8\" class=\"edge\">\n<title>7->8</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M824.6161,-1223.8314C823.3327,-1216.131 821.8066,-1206.9743 820.3803,-1198.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"823.8095,-1197.7018 818.7131,-1188.4133 816.9047,-1198.8526 823.8095,-1197.7018\"/>\n</g>\n<!-- 9 -->\n<g id=\"node10\" class=\"node\">\n<title>9</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"964.6442\" cy=\"-1170\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"922.1442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 7->9 -->\n<g id=\"edge9\" class=\"edge\">\n<title>7->9</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M862.2151,-1223.8314C881.2387,-1213.8335 904.9332,-1201.3809 924.74,-1190.9715\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"926.6003,-1193.9479 933.824,-1186.1975 923.3437,-1187.7515 926.6003,-1193.9479\"/>\n</g>\n<!-- 11 -->\n<g id=\"node12\" class=\"node\">\n<title>11</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1020.6442\" cy=\"-1242\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"978.1442\" y=\"-1238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 10->11 -->\n<g id=\"edge11\" class=\"edge\">\n<title>10->11</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1034.8497,-1295.8314C1032.7953,-1288.0463 1030.3481,-1278.7729 1028.0686,-1270.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1031.439,-1269.1892 1025.5032,-1260.4133 1024.6707,-1270.9753 1031.439,-1269.1892\"/>\n</g>\n<!-- 12 -->\n<g id=\"node13\" class=\"node\">\n<title>12</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1271.1442,-1260C1271.1442,-1260 1116.1442,-1260 1116.1442,-1260 1110.1442,-1260 1104.1442,-1254 1104.1442,-1248 1104.1442,-1248 1104.1442,-1236 1104.1442,-1236 1104.1442,-1230 1110.1442,-1224 1116.1442,-1224 1116.1442,-1224 1271.1442,-1224 1271.1442,-1224 1277.1442,-1224 1283.1442,-1230 1283.1442,-1236 1283.1442,-1236 1283.1442,-1248 1283.1442,-1248 1283.1442,-1254 1277.1442,-1260 1271.1442,-1260\"/>\n<text text-anchor=\"start\" x=\"1112.1442\" y=\"-1238.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.41</text>\n</g>\n<!-- 10->12 -->\n<g id=\"edge12\" class=\"edge\">\n<title>10->12</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1078.5049,-1295.8314C1098.9184,-1286.2874 1124.1165,-1274.5065 1145.7302,-1264.4013\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1147.4865,-1267.4439 1155.0629,-1260.038 1144.5217,-1261.1027 1147.4865,-1267.4439\"/>\n</g>\n<!-- 13 -->\n<g id=\"node14\" class=\"node\">\n<title>13</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1250.6442,-1188C1250.6442,-1188 1086.6442,-1188 1086.6442,-1188 1080.6442,-1188 1074.6442,-1182 1074.6442,-1176 1074.6442,-1176 1074.6442,-1164 1074.6442,-1164 1074.6442,-1158 1080.6442,-1152 1086.6442,-1152 1086.6442,-1152 1250.6442,-1152 1250.6442,-1152 1256.6442,-1152 1262.6442,-1158 1262.6442,-1164 1262.6442,-1164 1262.6442,-1176 1262.6442,-1176 1262.6442,-1182 1256.6442,-1188 1250.6442,-1188\"/>\n<text text-anchor=\"start\" x=\"1082.6442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.395</text>\n</g>\n<!-- 12->13 -->\n<g id=\"edge13\" class=\"edge\">\n<title>12->13</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1187.3356,-1223.8314C1184.6325,-1216.0463 1181.4126,-1206.7729 1178.4132,-1198.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1181.6242,-1196.7119 1175.0377,-1188.4133 1175.0115,-1199.0081 1181.6242,-1196.7119\"/>\n</g>\n<!-- 70 -->\n<g id=\"node71\" class=\"node\">\n<title>70</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2420.1442,-1188C2420.1442,-1188 2157.1442,-1188 2157.1442,-1188 2151.1442,-1188 2145.1442,-1182 2145.1442,-1176 2145.1442,-1176 2145.1442,-1164 2145.1442,-1164 2145.1442,-1158 2151.1442,-1152 2157.1442,-1152 2157.1442,-1152 2420.1442,-1152 2420.1442,-1152 2426.1442,-1152 2432.1442,-1158 2432.1442,-1164 2432.1442,-1164 2432.1442,-1176 2432.1442,-1176 2432.1442,-1182 2426.1442,-1188 2420.1442,-1188\"/>\n<text text-anchor=\"start\" x=\"2153.1442\" y=\"-1166.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.635000000000002</text>\n</g>\n<!-- 12->70 -->\n<g id=\"edge70\" class=\"edge\">\n<title>12->70</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1283.2526,-1236.1079C1469.9752,-1223.8303 1902.5972,-1195.3839 2134.7876,-1180.1166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2135.2599,-1183.5932 2145.0086,-1179.4445 2134.8005,-1176.6083 2135.2599,-1183.5932\"/>\n</g>\n<!-- 14 -->\n<g id=\"node15\" class=\"node\">\n<title>14</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M962.1442,-1116C962.1442,-1116 699.1442,-1116 699.1442,-1116 693.1442,-1116 687.1442,-1110 687.1442,-1104 687.1442,-1104 687.1442,-1092 687.1442,-1092 687.1442,-1086 693.1442,-1080 699.1442,-1080 699.1442,-1080 962.1442,-1080 962.1442,-1080 968.1442,-1080 974.1442,-1086 974.1442,-1092 974.1442,-1092 974.1442,-1104 974.1442,-1104 974.1442,-1110 968.1442,-1116 962.1442,-1116\"/>\n<text text-anchor=\"start\" x=\"695.1442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.359999999999999</text>\n</g>\n<!-- 13->14 -->\n<g id=\"edge14\" class=\"edge\">\n<title>13->14</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1083.7888,-1151.9243C1035.4816,-1141.634 974.8597,-1128.7205 925.0518,-1118.1105\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"925.7511,-1114.681 915.2413,-1116.0207 924.2926,-1121.5274 925.7511,-1114.681\"/>\n</g>\n<!-- 69 -->\n<g id=\"node70\" class=\"node\">\n<title>69</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1168.6442\" cy=\"-1098\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1126.1442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 13->69 -->\n<g id=\"edge69\" class=\"edge\">\n<title>13->69</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1168.6442,-1151.8314C1168.6442,-1144.131 1168.6442,-1134.9743 1168.6442,-1126.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1172.1443,-1126.4132 1168.6442,-1116.4133 1165.1443,-1126.4133 1172.1443,-1126.4132\"/>\n</g>\n<!-- 15 -->\n<g id=\"node16\" class=\"node\">\n<title>15</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"652.6442\" cy=\"-1026\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"610.1442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 14->15 -->\n<g id=\"edge15\" class=\"edge\">\n<title>14->15</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M785.7273,-1079.8314C759.3102,-1069.1458 725.961,-1055.6562 699.2553,-1044.854\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"700.3249,-1041.5112 689.7421,-1041.0059 697.7,-1048.0004 700.3249,-1041.5112\"/>\n</g>\n<!-- 16 -->\n<g id=\"node17\" class=\"node\">\n<title>16</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M912.6442,-1044C912.6442,-1044 748.6442,-1044 748.6442,-1044 742.6442,-1044 736.6442,-1038 736.6442,-1032 736.6442,-1032 736.6442,-1020 736.6442,-1020 736.6442,-1014 742.6442,-1008 748.6442,-1008 748.6442,-1008 912.6442,-1008 912.6442,-1008 918.6442,-1008 924.6442,-1014 924.6442,-1020 924.6442,-1020 924.6442,-1032 924.6442,-1032 924.6442,-1038 918.6442,-1044 912.6442,-1044\"/>\n<text text-anchor=\"start\" x=\"744.6442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.445</text>\n</g>\n<!-- 14->16 -->\n<g id=\"edge16\" class=\"edge\">\n<title>14->16</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M830.6442,-1079.8314C830.6442,-1072.131 830.6442,-1062.9743 830.6442,-1054.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"834.1443,-1054.4132 830.6442,-1044.4133 827.1443,-1054.4133 834.1443,-1054.4132\"/>\n</g>\n<!-- 17 -->\n<g id=\"node18\" class=\"node\">\n<title>17</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"652.6442\" cy=\"-954\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"610.1442\" y=\"-950.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 16->17 -->\n<g id=\"edge17\" class=\"edge\">\n<title>16->17</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M785.7273,-1007.8314C759.3102,-997.1458 725.961,-983.6562 699.2553,-972.854\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"700.3249,-969.5112 689.7421,-969.0059 697.7,-976.0004 700.3249,-969.5112\"/>\n</g>\n<!-- 18 -->\n<g id=\"node19\" class=\"node\">\n<title>18</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M912.6442,-972C912.6442,-972 748.6442,-972 748.6442,-972 742.6442,-972 736.6442,-966 736.6442,-960 736.6442,-960 736.6442,-948 736.6442,-948 736.6442,-942 742.6442,-936 748.6442,-936 748.6442,-936 912.6442,-936 912.6442,-936 918.6442,-936 924.6442,-942 924.6442,-948 924.6442,-948 924.6442,-960 924.6442,-960 924.6442,-966 918.6442,-972 912.6442,-972\"/>\n<text text-anchor=\"start\" x=\"744.6442\" y=\"-950.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.735</text>\n</g>\n<!-- 16->18 -->\n<g id=\"edge18\" class=\"edge\">\n<title>16->18</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M830.6442,-1007.8314C830.6442,-1000.131 830.6442,-990.9743 830.6442,-982.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"834.1443,-982.4132 830.6442,-972.4133 827.1443,-982.4133 834.1443,-982.4132\"/>\n</g>\n<!-- 19 -->\n<g id=\"node20\" class=\"node\">\n<title>19</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M645.6442,-900C645.6442,-900 481.6442,-900 481.6442,-900 475.6442,-900 469.6442,-894 469.6442,-888 469.6442,-888 469.6442,-876 469.6442,-876 469.6442,-870 475.6442,-864 481.6442,-864 481.6442,-864 645.6442,-864 645.6442,-864 651.6442,-864 657.6442,-870 657.6442,-876 657.6442,-876 657.6442,-888 657.6442,-888 657.6442,-894 651.6442,-900 645.6442,-900\"/>\n<text text-anchor=\"start\" x=\"477.6442\" y=\"-878.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.615</text>\n</g>\n<!-- 18->19 -->\n<g id=\"edge19\" class=\"edge\">\n<title>18->19</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M763.6134,-935.9243C726.1608,-925.8247 679.3375,-913.1982 640.4168,-902.7027\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"641.2689,-899.3076 630.7025,-900.0831 639.4463,-906.0661 641.2689,-899.3076\"/>\n</g>\n<!-- 22 -->\n<g id=\"node23\" class=\"node\">\n<title>22</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M912.6442,-900C912.6442,-900 748.6442,-900 748.6442,-900 742.6442,-900 736.6442,-894 736.6442,-888 736.6442,-888 736.6442,-876 736.6442,-876 736.6442,-870 742.6442,-864 748.6442,-864 748.6442,-864 912.6442,-864 912.6442,-864 918.6442,-864 924.6442,-870 924.6442,-876 924.6442,-876 924.6442,-888 924.6442,-888 924.6442,-894 918.6442,-900 912.6442,-900\"/>\n<text text-anchor=\"start\" x=\"744.6442\" y=\"-878.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.745</text>\n</g>\n<!-- 18->22 -->\n<g id=\"edge22\" class=\"edge\">\n<title>18->22</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M830.6442,-935.8314C830.6442,-928.131 830.6442,-918.9743 830.6442,-910.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"834.1443,-910.4132 830.6442,-900.4133 827.1443,-910.4133 834.1443,-910.4132\"/>\n</g>\n<!-- 20 -->\n<g id=\"node21\" class=\"node\">\n<title>20</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"414.6442\" cy=\"-810\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"372.1442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 19->20 -->\n<g id=\"edge20\" class=\"edge\">\n<title>19->20</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M526.0452,-863.8314C504.7726,-853.552 478.13,-840.6777 456.2341,-830.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"457.697,-826.9169 447.1702,-825.7173 454.6513,-833.2196 457.697,-826.9169\"/>\n</g>\n<!-- 21 -->\n<g id=\"node22\" class=\"node\">\n<title>21</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"563.6442\" cy=\"-810\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"521.1442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 19->21 -->\n<g id=\"edge21\" class=\"edge\">\n<title>19->21</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M563.6442,-863.8314C563.6442,-856.131 563.6442,-846.9743 563.6442,-838.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"567.1443,-838.4132 563.6442,-828.4133 560.1443,-838.4133 567.1443,-838.4132\"/>\n</g>\n<!-- 23 -->\n<g id=\"node24\" class=\"node\">\n<title>23</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"712.6442\" cy=\"-810\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"670.1442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 22->23 -->\n<g id=\"edge23\" class=\"edge\">\n<title>22->23</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M800.8678,-863.8314C784.9684,-854.13 765.281,-842.1174 748.5406,-831.9029\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"749.9458,-828.6602 739.5863,-826.4393 746.2997,-834.6357 749.9458,-828.6602\"/>\n</g>\n<!-- 24 -->\n<g id=\"node25\" class=\"node\">\n<title>24</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M972.6442,-828C972.6442,-828 808.6442,-828 808.6442,-828 802.6442,-828 796.6442,-822 796.6442,-816 796.6442,-816 796.6442,-804 796.6442,-804 796.6442,-798 802.6442,-792 808.6442,-792 808.6442,-792 972.6442,-792 972.6442,-792 978.6442,-792 984.6442,-798 984.6442,-804 984.6442,-804 984.6442,-816 984.6442,-816 984.6442,-822 978.6442,-828 972.6442,-828\"/>\n<text text-anchor=\"start\" x=\"804.6442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.825</text>\n</g>\n<!-- 22->24 -->\n<g id=\"edge24\" class=\"edge\">\n<title>22->24</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M845.7847,-863.8314C852.7658,-855.454 861.1832,-845.3531 868.8317,-836.1749\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"871.5867,-838.3362 875.2998,-828.4133 866.2091,-833.8548 871.5867,-838.3362\"/>\n</g>\n<!-- 25 -->\n<g id=\"node26\" class=\"node\">\n<title>25</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"712.6442\" cy=\"-738\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"670.1442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 24->25 -->\n<g id=\"edge25\" class=\"edge\">\n<title>24->25</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M845.7273,-791.8314C819.3102,-781.1458 785.961,-767.6562 759.2553,-756.854\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"760.3249,-753.5112 749.7421,-753.0059 757.7,-760.0004 760.3249,-753.5112\"/>\n</g>\n<!-- 26 -->\n<g id=\"node27\" class=\"node\">\n<title>26</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M972.6442,-756C972.6442,-756 808.6442,-756 808.6442,-756 802.6442,-756 796.6442,-750 796.6442,-744 796.6442,-744 796.6442,-732 796.6442,-732 796.6442,-726 802.6442,-720 808.6442,-720 808.6442,-720 972.6442,-720 972.6442,-720 978.6442,-720 984.6442,-726 984.6442,-732 984.6442,-732 984.6442,-744 984.6442,-744 984.6442,-750 978.6442,-756 972.6442,-756\"/>\n<text text-anchor=\"start\" x=\"804.6442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.835</text>\n</g>\n<!-- 24->26 -->\n<g id=\"edge26\" class=\"edge\">\n<title>24->26</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M890.6442,-791.8314C890.6442,-784.131 890.6442,-774.9743 890.6442,-766.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"894.1443,-766.4132 890.6442,-756.4133 887.1443,-766.4133 894.1443,-766.4132\"/>\n</g>\n<!-- 27 -->\n<g id=\"node28\" class=\"node\">\n<title>27</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"712.6442\" cy=\"-666\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"670.1442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 26->27 -->\n<g id=\"edge27\" class=\"edge\">\n<title>26->27</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M845.7273,-719.8314C819.3102,-709.1458 785.961,-695.6562 759.2553,-684.854\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"760.3249,-681.5112 749.7421,-681.0059 757.7,-688.0004 760.3249,-681.5112\"/>\n</g>\n<!-- 28 -->\n<g id=\"node29\" class=\"node\">\n<title>28</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M972.6442,-684C972.6442,-684 808.6442,-684 808.6442,-684 802.6442,-684 796.6442,-678 796.6442,-672 796.6442,-672 796.6442,-660 796.6442,-660 796.6442,-654 802.6442,-648 808.6442,-648 808.6442,-648 972.6442,-648 972.6442,-648 978.6442,-648 984.6442,-654 984.6442,-660 984.6442,-660 984.6442,-672 984.6442,-672 984.6442,-678 978.6442,-684 972.6442,-684\"/>\n<text text-anchor=\"start\" x=\"804.6442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.545</text>\n</g>\n<!-- 26->28 -->\n<g id=\"edge28\" class=\"edge\">\n<title>26->28</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M890.6442,-719.8314C890.6442,-712.131 890.6442,-702.9743 890.6442,-694.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"894.1443,-694.4132 890.6442,-684.4133 887.1443,-694.4133 894.1443,-694.4132\"/>\n</g>\n<!-- 29 -->\n<g id=\"node30\" class=\"node\">\n<title>29</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M665.1442,-612C665.1442,-612 402.1442,-612 402.1442,-612 396.1442,-612 390.1442,-606 390.1442,-600 390.1442,-600 390.1442,-588 390.1442,-588 390.1442,-582 396.1442,-576 402.1442,-576 402.1442,-576 665.1442,-576 665.1442,-576 671.1442,-576 677.1442,-582 677.1442,-588 677.1442,-588 677.1442,-600 677.1442,-600 677.1442,-606 671.1442,-612 665.1442,-612\"/>\n<text text-anchor=\"start\" x=\"398.1442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.904999999999999</text>\n</g>\n<!-- 28->29 -->\n<g id=\"edge29\" class=\"edge\">\n<title>28->29</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M801.0188,-647.9243C749.8898,-637.6126 685.6996,-624.6666 633.0301,-614.0442\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"633.4913,-610.5668 622.9967,-612.0207 632.1074,-617.4287 633.4913,-610.5668\"/>\n</g>\n<!-- 42 -->\n<g id=\"node43\" class=\"node\">\n<title>42</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M972.6442,-612C972.6442,-612 808.6442,-612 808.6442,-612 802.6442,-612 796.6442,-606 796.6442,-600 796.6442,-600 796.6442,-588 796.6442,-588 796.6442,-582 802.6442,-576 808.6442,-576 808.6442,-576 972.6442,-576 972.6442,-576 978.6442,-576 984.6442,-582 984.6442,-588 984.6442,-588 984.6442,-600 984.6442,-600 984.6442,-606 978.6442,-612 972.6442,-612\"/>\n<text text-anchor=\"start\" x=\"804.6442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.555</text>\n</g>\n<!-- 28->42 -->\n<g id=\"edge42\" class=\"edge\">\n<title>28->42</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M890.6442,-647.8314C890.6442,-640.131 890.6442,-630.9743 890.6442,-622.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"894.1443,-622.4132 890.6442,-612.4133 887.1443,-622.4133 894.1443,-622.4132\"/>\n</g>\n<!-- 30 -->\n<g id=\"node31\" class=\"node\">\n<title>30</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M292.1442,-540C292.1442,-540 137.1442,-540 137.1442,-540 131.1442,-540 125.1442,-534 125.1442,-528 125.1442,-528 125.1442,-516 125.1442,-516 125.1442,-510 131.1442,-504 137.1442,-504 137.1442,-504 292.1442,-504 292.1442,-504 298.1442,-504 304.1442,-510 304.1442,-516 304.1442,-516 304.1442,-528 304.1442,-528 304.1442,-534 298.1442,-540 292.1442,-540\"/>\n<text text-anchor=\"start\" x=\"133.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 6.85</text>\n</g>\n<!-- 29->30 -->\n<g id=\"edge30\" class=\"edge\">\n<title>29->30</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M453.5588,-575.9243C408.157,-565.6769 351.2295,-552.828 304.333,-542.2432\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"305.011,-538.8083 294.4858,-540.0207 303.4698,-545.6365 305.011,-538.8083\"/>\n</g>\n<!-- 33 -->\n<g id=\"node34\" class=\"node\">\n<title>33</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M669.1442,-540C669.1442,-540 398.1442,-540 398.1442,-540 392.1442,-540 386.1442,-534 386.1442,-528 386.1442,-528 386.1442,-516 386.1442,-516 386.1442,-510 392.1442,-504 398.1442,-504 398.1442,-504 669.1442,-504 669.1442,-504 675.1442,-504 681.1442,-510 681.1442,-516 681.1442,-516 681.1442,-528 681.1442,-528 681.1442,-534 675.1442,-540 669.1442,-540\"/>\n<text text-anchor=\"start\" x=\"394.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.3100000000000005</text>\n</g>\n<!-- 29->33 -->\n<g id=\"edge33\" class=\"edge\">\n<title>29->33</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M533.6442,-575.8314C533.6442,-568.131 533.6442,-558.9743 533.6442,-550.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"537.1443,-550.4132 533.6442,-540.4133 530.1443,-550.4133 537.1443,-550.4132\"/>\n</g>\n<!-- 31 -->\n<g id=\"node32\" class=\"node\">\n<title>31</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"65.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"23.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 30->31 -->\n<g id=\"edge31\" class=\"edge\">\n<title>30->31</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M177.0452,-503.8314C155.7726,-493.552 129.13,-480.6777 107.2341,-470.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.697,-466.9169 98.1702,-465.7173 105.6513,-473.2196 108.697,-466.9169\"/>\n</g>\n<!-- 32 -->\n<g id=\"node33\" class=\"node\">\n<title>32</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"214.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"172.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 30->32 -->\n<g id=\"edge32\" class=\"edge\">\n<title>30->32</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M214.6442,-503.8314C214.6442,-496.131 214.6442,-486.9743 214.6442,-478.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"218.1443,-478.4132 214.6442,-468.4133 211.1443,-478.4133 218.1443,-478.4132\"/>\n</g>\n<!-- 34 -->\n<g id=\"node35\" class=\"node\">\n<title>34</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M474.6442,-468C474.6442,-468 310.6442,-468 310.6442,-468 304.6442,-468 298.6442,-462 298.6442,-456 298.6442,-456 298.6442,-444 298.6442,-444 298.6442,-438 304.6442,-432 310.6442,-432 310.6442,-432 474.6442,-432 474.6442,-432 480.6442,-432 486.6442,-438 486.6442,-444 486.6442,-444 486.6442,-456 486.6442,-456 486.6442,-462 480.6442,-468 474.6442,-468\"/>\n<text text-anchor=\"start\" x=\"306.6442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.215</text>\n</g>\n<!-- 33->34 -->\n<g id=\"edge34\" class=\"edge\">\n<title>33->34</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M498.0639,-503.8314C479.6117,-494.4089 456.8897,-482.8062 437.2712,-472.7883\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"438.7108,-469.5935 428.213,-468.1628 435.5274,-475.8278 438.7108,-469.5935\"/>\n</g>\n<!-- 37 -->\n<g id=\"node38\" class=\"node\">\n<title>37</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M680.6442,-468C680.6442,-468 516.6442,-468 516.6442,-468 510.6442,-468 504.6442,-462 504.6442,-456 504.6442,-456 504.6442,-444 504.6442,-444 504.6442,-438 510.6442,-432 516.6442,-432 516.6442,-432 680.6442,-432 680.6442,-432 686.6442,-432 692.6442,-438 692.6442,-444 692.6442,-444 692.6442,-456 692.6442,-456 692.6442,-462 686.6442,-468 680.6442,-468\"/>\n<text text-anchor=\"start\" x=\"512.6442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.345</text>\n</g>\n<!-- 33->37 -->\n<g id=\"edge37\" class=\"edge\">\n<title>33->37</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M550.0464,-503.8314C557.6857,-495.3694 566.9125,-485.1489 575.2649,-475.8971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"577.918,-478.1813 582.0211,-468.4133 572.7221,-473.4906 577.918,-478.1813\"/>\n</g>\n<!-- 35 -->\n<g id=\"node36\" class=\"node\">\n<title>35</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"243.6442\" cy=\"-378\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"201.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 34->35 -->\n<g id=\"edge35\" class=\"edge\">\n<title>34->35</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M355.0452,-431.8314C333.7726,-421.552 307.13,-408.6777 285.2341,-398.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"286.697,-394.9169 276.1702,-393.7173 283.6513,-401.2196 286.697,-394.9169\"/>\n</g>\n<!-- 36 -->\n<g id=\"node37\" class=\"node\">\n<title>36</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"392.6442\" cy=\"-378\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"350.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 34->36 -->\n<g id=\"edge36\" class=\"edge\">\n<title>34->36</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M392.6442,-431.8314C392.6442,-424.131 392.6442,-414.9743 392.6442,-406.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"396.1443,-406.4132 392.6442,-396.4133 389.1443,-406.4133 396.1443,-406.4132\"/>\n</g>\n<!-- 38 -->\n<g id=\"node39\" class=\"node\">\n<title>38</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"541.6442\" cy=\"-378\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"499.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 37->38 -->\n<g id=\"edge38\" class=\"edge\">\n<title>37->38</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M584.2607,-431.8314C577.5946,-423.411 569.55,-413.2495 562.2543,-404.0338\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"564.7769,-401.5814 555.8256,-395.9134 559.2885,-405.9264 564.7769,-401.5814\"/>\n</g>\n<!-- 39 -->\n<g id=\"node40\" class=\"node\">\n<title>39</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M801.6442,-396C801.6442,-396 637.6442,-396 637.6442,-396 631.6442,-396 625.6442,-390 625.6442,-384 625.6442,-384 625.6442,-372 625.6442,-372 625.6442,-366 631.6442,-360 637.6442,-360 637.6442,-360 801.6442,-360 801.6442,-360 807.6442,-360 813.6442,-366 813.6442,-372 813.6442,-372 813.6442,-384 813.6442,-384 813.6442,-390 807.6442,-396 801.6442,-396\"/>\n<text text-anchor=\"start\" x=\"633.6442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.505</text>\n</g>\n<!-- 37->39 -->\n<g id=\"edge39\" class=\"edge\">\n<title>37->39</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M629.1776,-431.8314C644.6542,-422.6221 663.6311,-411.3301 680.2005,-401.4706\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"682.3166,-404.2843 689.1205,-396.1628 678.7371,-398.2687 682.3166,-404.2843\"/>\n</g>\n<!-- 40 -->\n<g id=\"node41\" class=\"node\">\n<title>40</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"570.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"528.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 39->40 -->\n<g id=\"edge40\" class=\"edge\">\n<title>39->40</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M682.0452,-359.8314C660.7726,-349.552 634.13,-336.6777 612.2341,-326.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"613.697,-322.9169 603.1702,-321.7173 610.6513,-329.2196 613.697,-322.9169\"/>\n</g>\n<!-- 41 -->\n<g id=\"node42\" class=\"node\">\n<title>41</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"719.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"677.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 39->41 -->\n<g id=\"edge41\" class=\"edge\">\n<title>39->41</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M719.6442,-359.8314C719.6442,-352.131 719.6442,-342.9743 719.6442,-334.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"723.1443,-334.4132 719.6442,-324.4133 716.1443,-334.4133 723.1443,-334.4132\"/>\n</g>\n<!-- 43 -->\n<g id=\"node44\" class=\"node\">\n<title>43</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"803.6442\" cy=\"-522\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"761.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 42->43 -->\n<g id=\"edge43\" class=\"edge\">\n<title>42->43</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M868.6904,-575.8314C857.6475,-566.6924 844.1262,-555.5024 832.2776,-545.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"834.3285,-542.8508 824.393,-539.1715 829.8655,-548.2436 834.3285,-542.8508\"/>\n</g>\n<!-- 44 -->\n<g id=\"node45\" class=\"node\">\n<title>44</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1054.1442,-540C1054.1442,-540 899.1442,-540 899.1442,-540 893.1442,-540 887.1442,-534 887.1442,-528 887.1442,-528 887.1442,-516 887.1442,-516 887.1442,-510 893.1442,-504 899.1442,-504 899.1442,-504 1054.1442,-504 1054.1442,-504 1060.1442,-504 1066.1442,-510 1066.1442,-516 1066.1442,-516 1066.1442,-528 1066.1442,-528 1066.1442,-534 1060.1442,-540 1054.1442,-540\"/>\n<text text-anchor=\"start\" x=\"895.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.63</text>\n</g>\n<!-- 42->44 -->\n<g id=\"edge44\" class=\"edge\">\n<title>42->44</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M912.3456,-575.8314C922.8363,-567.0485 935.5897,-556.3712 946.9636,-546.8489\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"949.5289,-549.2659 954.9497,-540.1628 945.0353,-543.8986 949.5289,-549.2659\"/>\n</g>\n<!-- 45 -->\n<g id=\"node46\" class=\"node\">\n<title>45</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"836.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"794.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 44->45 -->\n<g id=\"edge45\" class=\"edge\">\n<title>44->45</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M941.3163,-503.8314C921.6476,-493.716 897.0929,-481.0879 876.7102,-470.6054\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"878.1649,-467.4178 867.6713,-465.9568 874.9634,-473.6428 878.1649,-467.4178\"/>\n</g>\n<!-- 46 -->\n<g id=\"node47\" class=\"node\">\n<title>46</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1096.6442,-468C1096.6442,-468 932.6442,-468 932.6442,-468 926.6442,-468 920.6442,-462 920.6442,-456 920.6442,-456 920.6442,-444 920.6442,-444 920.6442,-438 926.6442,-432 932.6442,-432 932.6442,-432 1096.6442,-432 1096.6442,-432 1102.6442,-432 1108.6442,-438 1108.6442,-444 1108.6442,-444 1108.6442,-456 1108.6442,-456 1108.6442,-462 1102.6442,-468 1096.6442,-468\"/>\n<text text-anchor=\"start\" x=\"928.6442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.655</text>\n</g>\n<!-- 44->46 -->\n<g id=\"edge46\" class=\"edge\">\n<title>44->46</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M986.2332,-503.8314C990.4759,-495.7925 995.5563,-486.1666 1000.2402,-477.2918\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1003.3538,-478.8908 1004.9261,-468.4133 997.1631,-475.6235 1003.3538,-478.8908\"/>\n</g>\n<!-- 47 -->\n<g id=\"node48\" class=\"node\">\n<title>47</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"912.6442\" cy=\"-378\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"870.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 46->47 -->\n<g id=\"edge47\" class=\"edge\">\n<title>46->47</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M988.9053,-431.8314C975.6117,-422.4477 959.2547,-410.9016 945.1027,-400.9119\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"946.8112,-397.8338 936.6231,-394.9263 942.7744,-403.5526 946.8112,-397.8338\"/>\n</g>\n<!-- 48 -->\n<g id=\"node49\" class=\"node\">\n<title>48</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1172.6442,-396C1172.6442,-396 1008.6442,-396 1008.6442,-396 1002.6442,-396 996.6442,-390 996.6442,-384 996.6442,-384 996.6442,-372 996.6442,-372 996.6442,-366 1002.6442,-360 1008.6442,-360 1008.6442,-360 1172.6442,-360 1172.6442,-360 1178.6442,-360 1184.6442,-366 1184.6442,-372 1184.6442,-372 1184.6442,-384 1184.6442,-384 1184.6442,-390 1178.6442,-396 1172.6442,-396\"/>\n<text text-anchor=\"start\" x=\"1004.6442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.755</text>\n</g>\n<!-- 46->48 -->\n<g id=\"edge48\" class=\"edge\">\n<title>46->48</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1033.8222,-431.8314C1043.003,-423.1337 1054.1448,-412.5783 1064.1217,-403.1265\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1066.6199,-405.5811 1071.4723,-396.1628 1061.8056,-400.4995 1066.6199,-405.5811\"/>\n</g>\n<!-- 49 -->\n<g id=\"node50\" class=\"node\">\n<title>49</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M962.1442,-324C962.1442,-324 815.1442,-324 815.1442,-324 809.1442,-324 803.1442,-318 803.1442,-312 803.1442,-312 803.1442,-300 803.1442,-300 803.1442,-294 809.1442,-288 815.1442,-288 815.1442,-288 962.1442,-288 962.1442,-288 968.1442,-288 974.1442,-294 974.1442,-300 974.1442,-300 974.1442,-312 974.1442,-312 974.1442,-318 968.1442,-324 962.1442,-324\"/>\n<text text-anchor=\"start\" x=\"811.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.7</text>\n</g>\n<!-- 48->49 -->\n<g id=\"edge49\" class=\"edge\">\n<title>48->49</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1039.9318,-359.9243C1012.3172,-350.0815 977.9691,-337.8386 948.9841,-327.5073\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"949.9721,-324.1438 939.3774,-324.0831 947.6218,-330.7375 949.9721,-324.1438\"/>\n</g>\n<!-- 56 -->\n<g id=\"node57\" class=\"node\">\n<title>56</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1188.6442,-324C1188.6442,-324 1024.6442,-324 1024.6442,-324 1018.6442,-324 1012.6442,-318 1012.6442,-312 1012.6442,-312 1012.6442,-300 1012.6442,-300 1012.6442,-294 1018.6442,-288 1024.6442,-288 1024.6442,-288 1188.6442,-288 1188.6442,-288 1194.6442,-288 1200.6442,-294 1200.6442,-300 1200.6442,-300 1200.6442,-312 1200.6442,-312 1200.6442,-318 1194.6442,-324 1188.6442,-324\"/>\n<text text-anchor=\"start\" x=\"1020.6442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.955</text>\n</g>\n<!-- 48->56 -->\n<g id=\"edge56\" class=\"edge\">\n<title>48->56</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1094.6817,-359.8314C1096.3929,-352.131 1098.4277,-342.9743 1100.3294,-334.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1103.7996,-334.9344 1102.5523,-324.4133 1096.9663,-333.4159 1103.7996,-334.9344\"/>\n</g>\n<!-- 50 -->\n<g id=\"node51\" class=\"node\">\n<title>50</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M706.1442,-252C706.1442,-252 435.1442,-252 435.1442,-252 429.1442,-252 423.1442,-246 423.1442,-240 423.1442,-240 423.1442,-228 423.1442,-228 423.1442,-222 429.1442,-216 435.1442,-216 435.1442,-216 706.1442,-216 706.1442,-216 712.1442,-216 718.1442,-222 718.1442,-228 718.1442,-228 718.1442,-240 718.1442,-240 718.1442,-246 712.1442,-252 706.1442,-252\"/>\n<text text-anchor=\"start\" x=\"431.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.6850000000000005</text>\n</g>\n<!-- 49->50 -->\n<g id=\"edge50\" class=\"edge\">\n<title>49->50</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M808.8098,-287.9243C763.5504,-277.6769 706.8013,-264.828 660.0518,-254.2432\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"660.7616,-250.8154 650.2355,-252.0207 659.2157,-257.6426 660.7616,-250.8154\"/>\n</g>\n<!-- 53 -->\n<g id=\"node54\" class=\"node\">\n<title>53</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M950.6442,-252C950.6442,-252 786.6442,-252 786.6442,-252 780.6442,-252 774.6442,-246 774.6442,-240 774.6442,-240 774.6442,-228 774.6442,-228 774.6442,-222 780.6442,-216 786.6442,-216 786.6442,-216 950.6442,-216 950.6442,-216 956.6442,-216 962.6442,-222 962.6442,-228 962.6442,-228 962.6442,-240 962.6442,-240 962.6442,-246 956.6442,-252 950.6442,-252\"/>\n<text text-anchor=\"start\" x=\"782.6442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.725</text>\n</g>\n<!-- 49->53 -->\n<g id=\"edge53\" class=\"edge\">\n<title>49->53</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M883.5973,-287.8314C881.4348,-280.0463 878.8589,-270.7729 876.4594,-262.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"879.8078,-261.1117 873.759,-252.4133 873.0632,-262.9852 879.8078,-261.1117\"/>\n</g>\n<!-- 51 -->\n<g id=\"node52\" class=\"node\">\n<title>51</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"421.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"379.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 50->51 -->\n<g id=\"edge51\" class=\"edge\">\n<title>50->51</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M533.0452,-215.8314C511.7726,-205.552 485.13,-192.6777 463.2341,-182.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"464.697,-178.9169 454.1702,-177.7173 461.6513,-185.2196 464.697,-178.9169\"/>\n</g>\n<!-- 52 -->\n<g id=\"node53\" class=\"node\">\n<title>52</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"570.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"528.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 50->52 -->\n<g id=\"edge52\" class=\"edge\">\n<title>50->52</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M570.6442,-215.8314C570.6442,-208.131 570.6442,-198.9743 570.6442,-190.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"574.1443,-190.4132 570.6442,-180.4133 567.1443,-190.4133 574.1443,-190.4132\"/>\n</g>\n<!-- 54 -->\n<g id=\"node55\" class=\"node\">\n<title>54</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"719.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"677.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 53->54 -->\n<g id=\"edge54\" class=\"edge\">\n<title>53->54</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M831.0452,-215.8314C809.7726,-205.552 783.13,-192.6777 761.2341,-182.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"762.697,-178.9169 752.1702,-177.7173 759.6513,-185.2196 762.697,-178.9169\"/>\n</g>\n<!-- 55 -->\n<g id=\"node56\" class=\"node\">\n<title>55</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"868.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"826.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 53->55 -->\n<g id=\"edge55\" class=\"edge\">\n<title>53->55</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M868.6442,-215.8314C868.6442,-208.131 868.6442,-198.9743 868.6442,-190.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"872.1443,-190.4132 868.6442,-180.4133 865.1443,-190.4133 872.1443,-190.4132\"/>\n</g>\n<!-- 57 -->\n<g id=\"node58\" class=\"node\">\n<title>57</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1188.6442,-252C1188.6442,-252 1024.6442,-252 1024.6442,-252 1018.6442,-252 1012.6442,-246 1012.6442,-240 1012.6442,-240 1012.6442,-228 1012.6442,-228 1012.6442,-222 1018.6442,-216 1024.6442,-216 1024.6442,-216 1188.6442,-216 1188.6442,-216 1194.6442,-216 1200.6442,-222 1200.6442,-228 1200.6442,-228 1200.6442,-240 1200.6442,-240 1200.6442,-246 1194.6442,-252 1188.6442,-252\"/>\n<text text-anchor=\"start\" x=\"1020.6442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 7.795</text>\n</g>\n<!-- 56->57 -->\n<g id=\"edge57\" class=\"edge\">\n<title>56->57</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1106.6442,-287.8314C1106.6442,-280.131 1106.6442,-270.9743 1106.6442,-262.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1110.1443,-262.4132 1106.6442,-252.4133 1103.1443,-262.4133 1110.1443,-262.4132\"/>\n</g>\n<!-- 60 -->\n<g id=\"node61\" class=\"node\">\n<title>60</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1525.1442,-252C1525.1442,-252 1262.1442,-252 1262.1442,-252 1256.1442,-252 1250.1442,-246 1250.1442,-240 1250.1442,-240 1250.1442,-228 1250.1442,-228 1250.1442,-222 1256.1442,-216 1262.1442,-216 1262.1442,-216 1525.1442,-216 1525.1442,-216 1531.1442,-216 1537.1442,-222 1537.1442,-228 1537.1442,-228 1537.1442,-240 1537.1442,-240 1537.1442,-246 1531.1442,-252 1525.1442,-252\"/>\n<text text-anchor=\"start\" x=\"1258.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.245000000000001</text>\n</g>\n<!-- 56->60 -->\n<g id=\"edge60\" class=\"edge\">\n<title>56->60</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1178.6959,-287.9243C1219.1246,-277.7819 1269.7114,-265.0912 1311.6521,-254.5694\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1312.715,-257.9113 1321.5628,-252.0831 1311.0116,-251.1217 1312.715,-257.9113\"/>\n</g>\n<!-- 58 -->\n<g id=\"node59\" class=\"node\">\n<title>58</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1017.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"975.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 57->58 -->\n<g id=\"edge58\" class=\"edge\">\n<title>57->58</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1084.1857,-215.8314C1072.889,-206.6924 1059.0568,-195.5024 1046.9359,-185.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1048.8458,-182.7399 1038.87,-179.1715 1044.4432,-188.182 1048.8458,-182.7399\"/>\n</g>\n<!-- 59 -->\n<g id=\"node60\" class=\"node\">\n<title>59</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1166.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1124.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 57->59 -->\n<g id=\"edge59\" class=\"edge\">\n<title>57->59</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1121.7847,-215.8314C1128.8732,-207.3251 1137.4426,-197.0419 1145.1842,-187.752\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1148.0032,-189.8363 1151.7163,-179.9134 1142.6257,-185.355 1148.0032,-189.8363\"/>\n</g>\n<!-- 61 -->\n<g id=\"node62\" class=\"node\">\n<title>61</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1525.1442,-180C1525.1442,-180 1262.1442,-180 1262.1442,-180 1256.1442,-180 1250.1442,-174 1250.1442,-168 1250.1442,-168 1250.1442,-156 1250.1442,-156 1250.1442,-150 1256.1442,-144 1262.1442,-144 1262.1442,-144 1525.1442,-144 1525.1442,-144 1531.1442,-144 1537.1442,-150 1537.1442,-156 1537.1442,-156 1537.1442,-168 1537.1442,-168 1537.1442,-174 1531.1442,-180 1525.1442,-180\"/>\n<text text-anchor=\"start\" x=\"1258.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.065000000000001</text>\n</g>\n<!-- 60->61 -->\n<g id=\"edge61\" class=\"edge\">\n<title>60->61</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1393.6442,-215.8314C1393.6442,-208.131 1393.6442,-198.9743 1393.6442,-190.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1397.1443,-190.4132 1393.6442,-180.4133 1390.1443,-190.4133 1397.1443,-190.4132\"/>\n</g>\n<!-- 66 -->\n<g id=\"node67\" class=\"node\">\n<title>66</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1731.6442,-180C1731.6442,-180 1567.6442,-180 1567.6442,-180 1561.6442,-180 1555.6442,-174 1555.6442,-168 1555.6442,-168 1555.6442,-156 1555.6442,-156 1555.6442,-150 1561.6442,-144 1567.6442,-144 1567.6442,-144 1731.6442,-144 1731.6442,-144 1737.6442,-144 1743.6442,-150 1743.6442,-156 1743.6442,-156 1743.6442,-168 1743.6442,-168 1743.6442,-174 1737.6442,-180 1731.6442,-180\"/>\n<text text-anchor=\"start\" x=\"1563.6442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.285</text>\n</g>\n<!-- 60->66 -->\n<g id=\"edge66\" class=\"edge\">\n<title>60->66</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1457.9133,-215.9243C1493.6708,-205.8675 1538.3369,-193.3052 1575.5597,-182.8363\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1576.6697,-186.1599 1585.3486,-180.0831 1574.7744,-179.4214 1576.6697,-186.1599\"/>\n</g>\n<!-- 62 -->\n<g id=\"node63\" class=\"node\">\n<title>62</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1241.6442\" cy=\"-90\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1199.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 61->62 -->\n<g id=\"edge62\" class=\"edge\">\n<title>61->62</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1355.2882,-143.8314C1333.5103,-133.5156 1306.2154,-120.5864 1283.834,-109.9847\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1285.109,-106.7158 1274.5732,-105.598 1282.1123,-113.042 1285.109,-106.7158\"/>\n</g>\n<!-- 63 -->\n<g id=\"node64\" class=\"node\">\n<title>63</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M1492.1442,-108C1492.1442,-108 1337.1442,-108 1337.1442,-108 1331.1442,-108 1325.1442,-102 1325.1442,-96 1325.1442,-96 1325.1442,-84 1325.1442,-84 1325.1442,-78 1331.1442,-72 1337.1442,-72 1337.1442,-72 1492.1442,-72 1492.1442,-72 1498.1442,-72 1504.1442,-78 1504.1442,-84 1504.1442,-84 1504.1442,-96 1504.1442,-96 1504.1442,-102 1498.1442,-108 1492.1442,-108\"/>\n<text text-anchor=\"start\" x=\"1333.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.16</text>\n</g>\n<!-- 61->63 -->\n<g id=\"edge63\" class=\"edge\">\n<title>61->63</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1398.9434,-143.8314C1401.214,-136.0463 1403.9187,-126.7729 1406.4382,-118.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1409.8336,-118.9933 1409.2736,-108.4133 1403.1136,-117.0332 1409.8336,-118.9933\"/>\n</g>\n<!-- 64 -->\n<g id=\"node65\" class=\"node\">\n<title>64</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1340.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1298.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 63->64 -->\n<g id=\"edge64\" class=\"edge\">\n<title>63->64</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1395.9709,-71.8314C1386.8269,-62.9346 1375.6851,-52.0939 1365.8031,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1368.1538,-39.8827 1358.5457,-35.4177 1363.2722,-44.8998 1368.1538,-39.8827\"/>\n</g>\n<!-- 65 -->\n<g id=\"node66\" class=\"node\">\n<title>65</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1489.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1447.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 63->65 -->\n<g id=\"edge65\" class=\"edge\">\n<title>63->65</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1433.5698,-71.8314C1442.8373,-62.9346 1454.1297,-52.0939 1464.1453,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1466.7107,-44.8679 1471.5007,-35.4177 1461.863,-39.8182 1466.7107,-44.8679\"/>\n</g>\n<!-- 67 -->\n<g id=\"node68\" class=\"node\">\n<title>67</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1628.6442\" cy=\"-90\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1586.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 66->67 -->\n<g id=\"edge67\" class=\"edge\">\n<title>66->67</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1644.345,-143.8314C1642.0744,-136.0463 1639.3696,-126.7729 1636.8501,-118.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1640.1748,-117.0332 1634.0147,-108.4133 1633.4548,-118.9933 1640.1748,-117.0332\"/>\n</g>\n<!-- 68 -->\n<g id=\"node69\" class=\"node\">\n<title>68</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1777.6442\" cy=\"-90\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1735.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 66->68 -->\n<g id=\"edge68\" class=\"edge\">\n<title>66->68</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1681.944,-143.8314C1699.6375,-133.8788 1721.6556,-121.4936 1740.11,-111.1129\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1741.8489,-114.1506 1748.8487,-106.1975 1738.417,-108.0496 1741.8489,-114.1506\"/>\n</g>\n<!-- 71 -->\n<g id=\"node72\" class=\"node\">\n<title>71</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2370.6442,-1116C2370.6442,-1116 2206.6442,-1116 2206.6442,-1116 2200.6442,-1116 2194.6442,-1110 2194.6442,-1104 2194.6442,-1104 2194.6442,-1092 2194.6442,-1092 2194.6442,-1086 2200.6442,-1080 2206.6442,-1080 2206.6442,-1080 2370.6442,-1080 2370.6442,-1080 2376.6442,-1080 2382.6442,-1086 2382.6442,-1092 2382.6442,-1092 2382.6442,-1104 2382.6442,-1104 2382.6442,-1110 2376.6442,-1116 2370.6442,-1116\"/>\n<text text-anchor=\"start\" x=\"2202.6442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.535</text>\n</g>\n<!-- 70->71 -->\n<g id=\"edge71\" class=\"edge\">\n<title>70->71</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2288.6442,-1151.8314C2288.6442,-1144.131 2288.6442,-1134.9743 2288.6442,-1126.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2292.1443,-1126.4132 2288.6442,-1116.4133 2285.1443,-1126.4133 2292.1443,-1126.4132\"/>\n</g>\n<!-- 74 -->\n<g id=\"node75\" class=\"node\">\n<title>74</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3527.6442,-1116C3527.6442,-1116 3355.6442,-1116 3355.6442,-1116 3349.6442,-1116 3343.6442,-1110 3343.6442,-1104 3343.6442,-1104 3343.6442,-1092 3343.6442,-1092 3343.6442,-1086 3349.6442,-1080 3355.6442,-1080 3355.6442,-1080 3527.6442,-1080 3527.6442,-1080 3533.6442,-1080 3539.6442,-1086 3539.6442,-1092 3539.6442,-1092 3539.6442,-1104 3539.6442,-1104 3539.6442,-1110 3533.6442,-1116 3527.6442,-1116\"/>\n<text text-anchor=\"start\" x=\"3351.6442\" y=\"-1094.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 11.605</text>\n</g>\n<!-- 70->74 -->\n<g id=\"edge74\" class=\"edge\">\n<title>70->74</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2432.3411,-1161.0267C2666.3569,-1146.4134 3124.5924,-1117.7986 3333.3708,-1104.7612\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3333.6632,-1108.2499 3343.4256,-1104.1333 3333.2269,-1101.2635 3333.6632,-1108.2499\"/>\n</g>\n<!-- 72 -->\n<g id=\"node73\" class=\"node\">\n<title>72</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2214.6442\" cy=\"-1026\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2172.1442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 71->72 -->\n<g id=\"edge72\" class=\"edge\">\n<title>71->72</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2269.9709,-1079.8314C2260.8269,-1070.9346 2249.6851,-1060.0939 2239.8031,-1050.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2242.1538,-1047.8827 2232.5457,-1043.4177 2237.2722,-1052.8998 2242.1538,-1047.8827\"/>\n</g>\n<!-- 73 -->\n<g id=\"node74\" class=\"node\">\n<title>73</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2363.6442\" cy=\"-1026\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2321.1442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 71->73 -->\n<g id=\"edge73\" class=\"edge\">\n<title>71->73</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2307.5698,-1079.8314C2316.8373,-1070.9346 2328.1297,-1060.0939 2338.1453,-1050.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2340.7107,-1052.8679 2345.5007,-1043.4177 2335.863,-1047.8182 2340.7107,-1052.8679\"/>\n</g>\n<!-- 75 -->\n<g id=\"node76\" class=\"node\">\n<title>75</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3527.6442,-1044C3527.6442,-1044 3355.6442,-1044 3355.6442,-1044 3349.6442,-1044 3343.6442,-1038 3343.6442,-1032 3343.6442,-1032 3343.6442,-1020 3343.6442,-1020 3343.6442,-1014 3349.6442,-1008 3355.6442,-1008 3355.6442,-1008 3527.6442,-1008 3527.6442,-1008 3533.6442,-1008 3539.6442,-1014 3539.6442,-1020 3539.6442,-1020 3539.6442,-1032 3539.6442,-1032 3539.6442,-1038 3533.6442,-1044 3527.6442,-1044\"/>\n<text text-anchor=\"start\" x=\"3351.6442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 11.465</text>\n</g>\n<!-- 74->75 -->\n<g id=\"edge75\" class=\"edge\">\n<title>74->75</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3441.6442,-1079.8314C3441.6442,-1072.131 3441.6442,-1062.9743 3441.6442,-1054.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3445.1443,-1054.4132 3441.6442,-1044.4133 3438.1443,-1054.4133 3445.1443,-1054.4132\"/>\n</g>\n<!-- 162 -->\n<g id=\"node163\" class=\"node\">\n<title>162</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M4053.1442,-1044C4053.1442,-1044 3782.1442,-1044 3782.1442,-1044 3776.1442,-1044 3770.1442,-1038 3770.1442,-1032 3770.1442,-1032 3770.1442,-1020 3770.1442,-1020 3770.1442,-1014 3776.1442,-1008 3782.1442,-1008 3782.1442,-1008 4053.1442,-1008 4053.1442,-1008 4059.1442,-1008 4065.1442,-1014 4065.1442,-1020 4065.1442,-1020 4065.1442,-1032 4065.1442,-1032 4065.1442,-1038 4059.1442,-1044 4053.1442,-1044\"/>\n<text text-anchor=\"start\" x=\"3778.1442\" y=\"-1022.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 12.274999999999999</text>\n</g>\n<!-- 74->162 -->\n<g id=\"edge162\" class=\"edge\">\n<title>74->162</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3539.6945,-1083.1689C3611.5976,-1072.2928 3709.932,-1057.4186 3788.2739,-1045.5686\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3788.8486,-1049.0216 3798.2126,-1044.0653 3787.8016,-1042.1003 3788.8486,-1049.0216\"/>\n</g>\n<!-- 76 -->\n<g id=\"node77\" class=\"node\">\n<title>76</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3447.1442,-972C3447.1442,-972 3176.1442,-972 3176.1442,-972 3170.1442,-972 3164.1442,-966 3164.1442,-960 3164.1442,-960 3164.1442,-948 3164.1442,-948 3164.1442,-942 3170.1442,-936 3176.1442,-936 3176.1442,-936 3447.1442,-936 3447.1442,-936 3453.1442,-936 3459.1442,-942 3459.1442,-948 3459.1442,-948 3459.1442,-960 3459.1442,-960 3459.1442,-966 3453.1442,-972 3447.1442,-972\"/>\n<text text-anchor=\"start\" x=\"3172.1442\" y=\"-950.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 11.065000000000001</text>\n</g>\n<!-- 75->76 -->\n<g id=\"edge76\" class=\"edge\">\n<title>75->76</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3408.8397,-1007.8314C3392.0579,-998.5368 3371.4456,-987.1208 3353.5278,-977.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3354.8819,-973.9461 3344.4382,-972.1628 3351.4903,-980.0696 3354.8819,-973.9461\"/>\n</g>\n<!-- 159 -->\n<g id=\"node160\" class=\"node\">\n<title>159</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3653.6442,-972C3653.6442,-972 3489.6442,-972 3489.6442,-972 3483.6442,-972 3477.6442,-966 3477.6442,-960 3477.6442,-960 3477.6442,-948 3477.6442,-948 3477.6442,-942 3483.6442,-936 3489.6442,-936 3489.6442,-936 3653.6442,-936 3653.6442,-936 3659.6442,-936 3665.6442,-942 3665.6442,-948 3665.6442,-948 3665.6442,-960 3665.6442,-960 3665.6442,-966 3659.6442,-972 3653.6442,-972\"/>\n<text text-anchor=\"start\" x=\"3485.6442\" y=\"-950.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 11.51</text>\n</g>\n<!-- 75->159 -->\n<g id=\"edge159\" class=\"edge\">\n<title>75->159</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3474.4487,-1007.8314C3491.2304,-998.5368 3511.8427,-987.1208 3529.7605,-977.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3531.798,-980.0696 3538.8502,-972.1628 3528.4065,-973.9461 3531.798,-980.0696\"/>\n</g>\n<!-- 77 -->\n<g id=\"node78\" class=\"node\">\n<title>77</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3226.6442,-900C3226.6442,-900 3054.6442,-900 3054.6442,-900 3048.6442,-900 3042.6442,-894 3042.6442,-888 3042.6442,-888 3042.6442,-876 3042.6442,-876 3042.6442,-870 3048.6442,-864 3054.6442,-864 3054.6442,-864 3226.6442,-864 3226.6442,-864 3232.6442,-864 3238.6442,-870 3238.6442,-876 3238.6442,-876 3238.6442,-888 3238.6442,-888 3238.6442,-894 3232.6442,-900 3226.6442,-900\"/>\n<text text-anchor=\"start\" x=\"3050.6442\" y=\"-878.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.085</text>\n</g>\n<!-- 76->77 -->\n<g id=\"edge77\" class=\"edge\">\n<title>76->77</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3268.4937,-935.8314C3245.5218,-926.159 3217.0933,-914.1891 3192.881,-903.9944\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3194.059,-900.6929 3183.4844,-900.038 3191.3425,-907.1443 3194.059,-900.6929\"/>\n</g>\n<!-- 150 -->\n<g id=\"node151\" class=\"node\">\n<title>150</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3440.6442,-900C3440.6442,-900 3268.6442,-900 3268.6442,-900 3262.6442,-900 3256.6442,-894 3256.6442,-888 3256.6442,-888 3256.6442,-876 3256.6442,-876 3256.6442,-870 3262.6442,-864 3268.6442,-864 3268.6442,-864 3440.6442,-864 3440.6442,-864 3446.6442,-864 3452.6442,-870 3452.6442,-876 3452.6442,-876 3452.6442,-888 3452.6442,-888 3452.6442,-894 3446.6442,-900 3440.6442,-900\"/>\n<text text-anchor=\"start\" x=\"3264.6442\" y=\"-878.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 11.075</text>\n</g>\n<!-- 76->150 -->\n<g id=\"edge150\" class=\"edge\">\n<title>76->150</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3322.4949,-935.8314C3327.3464,-927.7079 3333.1658,-917.9637 3338.5121,-909.0118\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3341.5248,-910.7933 3343.6474,-900.4133 3335.515,-907.2041 3341.5248,-910.7933\"/>\n</g>\n<!-- 78 -->\n<g id=\"node79\" class=\"node\">\n<title>78</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3040.1442,-828C3040.1442,-828 2769.1442,-828 2769.1442,-828 2763.1442,-828 2757.1442,-822 2757.1442,-816 2757.1442,-816 2757.1442,-804 2757.1442,-804 2757.1442,-798 2763.1442,-792 2769.1442,-792 2769.1442,-792 3040.1442,-792 3040.1442,-792 3046.1442,-792 3052.1442,-798 3052.1442,-804 3052.1442,-804 3052.1442,-816 3052.1442,-816 3052.1442,-822 3046.1442,-828 3040.1442,-828\"/>\n<text text-anchor=\"start\" x=\"2765.1442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.065000000000001</text>\n</g>\n<!-- 77->78 -->\n<g id=\"edge78\" class=\"edge\">\n<title>77->78</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3081.396,-863.9243C3048.7126,-853.9531 3007.9558,-841.5188 2973.8184,-831.104\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2974.5028,-827.6536 2963.9167,-828.0831 2972.4601,-834.3489 2974.5028,-827.6536\"/>\n</g>\n<!-- 131 -->\n<g id=\"node132\" class=\"node\">\n<title>131</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3254.6442,-828C3254.6442,-828 3082.6442,-828 3082.6442,-828 3076.6442,-828 3070.6442,-822 3070.6442,-816 3070.6442,-816 3070.6442,-804 3070.6442,-804 3070.6442,-798 3076.6442,-792 3082.6442,-792 3082.6442,-792 3254.6442,-792 3254.6442,-792 3260.6442,-792 3266.6442,-798 3266.6442,-804 3266.6442,-804 3266.6442,-816 3266.6442,-816 3266.6442,-822 3260.6442,-828 3254.6442,-828\"/>\n<text text-anchor=\"start\" x=\"3078.6442\" y=\"-806.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.295</text>\n</g>\n<!-- 77->131 -->\n<g id=\"edge131\" class=\"edge\">\n<title>77->131</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3147.7098,-863.8314C3150.7702,-855.9617 3154.4221,-846.5712 3157.8123,-837.8533\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3161.121,-839.0019 3161.4835,-828.4133 3154.5969,-836.4647 3161.121,-839.0019\"/>\n</g>\n<!-- 79 -->\n<g id=\"node80\" class=\"node\">\n<title>79</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2902.1442,-756C2902.1442,-756 2639.1442,-756 2639.1442,-756 2633.1442,-756 2627.1442,-750 2627.1442,-744 2627.1442,-744 2627.1442,-732 2627.1442,-732 2627.1442,-726 2633.1442,-720 2639.1442,-720 2639.1442,-720 2902.1442,-720 2902.1442,-720 2908.1442,-720 2914.1442,-726 2914.1442,-732 2914.1442,-732 2914.1442,-744 2914.1442,-744 2914.1442,-750 2908.1442,-756 2902.1442,-756\"/>\n<text text-anchor=\"start\" x=\"2635.1442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.745000000000001</text>\n</g>\n<!-- 78->79 -->\n<g id=\"edge79\" class=\"edge\">\n<title>78->79</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2870.8303,-791.8314C2853.3735,-782.4516 2831.8955,-770.9112 2813.309,-760.9244\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2814.9128,-757.8129 2804.4472,-756.1628 2811.5995,-763.9792 2814.9128,-757.8129\"/>\n</g>\n<!-- 130 -->\n<g id=\"node131\" class=\"node\">\n<title>130</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2997.6442\" cy=\"-738\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2955.1442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 78->130 -->\n<g id=\"edge130\" class=\"edge\">\n<title>78->130</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2928.112,-791.8314C2940.03,-782.6045 2954.6485,-771.287 2967.4009,-761.4142\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2969.6997,-764.0608 2975.4644,-755.1715 2965.4145,-758.5257 2969.6997,-764.0608\"/>\n</g>\n<!-- 80 -->\n<g id=\"node81\" class=\"node\">\n<title>80</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2799.6442,-684C2799.6442,-684 2635.6442,-684 2635.6442,-684 2629.6442,-684 2623.6442,-678 2623.6442,-672 2623.6442,-672 2623.6442,-660 2623.6442,-660 2623.6442,-654 2629.6442,-648 2635.6442,-648 2635.6442,-648 2799.6442,-648 2799.6442,-648 2805.6442,-648 2811.6442,-654 2811.6442,-660 2811.6442,-660 2811.6442,-672 2811.6442,-672 2811.6442,-678 2805.6442,-684 2799.6442,-684\"/>\n<text text-anchor=\"start\" x=\"2631.6442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.735</text>\n</g>\n<!-- 79->80 -->\n<g id=\"edge80\" class=\"edge\">\n<title>79->80</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2757.27,-719.8314C2751.2279,-711.6232 2743.9679,-701.7606 2737.3221,-692.7323\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2739.9453,-690.3918 2731.1984,-684.4133 2734.3079,-694.5415 2739.9453,-690.3918\"/>\n</g>\n<!-- 123 -->\n<g id=\"node124\" class=\"node\">\n<title>123</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3005.6442,-684C3005.6442,-684 2841.6442,-684 2841.6442,-684 2835.6442,-684 2829.6442,-678 2829.6442,-672 2829.6442,-672 2829.6442,-660 2829.6442,-660 2829.6442,-654 2835.6442,-648 2841.6442,-648 2841.6442,-648 3005.6442,-648 3005.6442,-648 3011.6442,-648 3017.6442,-654 3017.6442,-660 3017.6442,-660 3017.6442,-672 3017.6442,-672 3017.6442,-678 3011.6442,-684 3005.6442,-684\"/>\n<text text-anchor=\"start\" x=\"2837.6442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.865</text>\n</g>\n<!-- 79->123 -->\n<g id=\"edge123\" class=\"edge\">\n<title>79->123</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2809.2525,-719.8314C2829.5335,-710.2874 2854.5679,-698.5065 2876.0413,-688.4013\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2877.7556,-691.4629 2885.3134,-684.038 2874.7749,-685.1291 2877.7556,-691.4629\"/>\n</g>\n<!-- 81 -->\n<g id=\"node82\" class=\"node\">\n<title>81</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2636.6442,-612C2636.6442,-612 2472.6442,-612 2472.6442,-612 2466.6442,-612 2460.6442,-606 2460.6442,-600 2460.6442,-600 2460.6442,-588 2460.6442,-588 2460.6442,-582 2466.6442,-576 2472.6442,-576 2472.6442,-576 2636.6442,-576 2636.6442,-576 2642.6442,-576 2648.6442,-582 2648.6442,-588 2648.6442,-588 2648.6442,-600 2648.6442,-600 2648.6442,-606 2642.6442,-612 2636.6442,-612\"/>\n<text text-anchor=\"start\" x=\"2468.6442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.195</text>\n</g>\n<!-- 80->81 -->\n<g id=\"edge81\" class=\"edge\">\n<title>80->81</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2676.5124,-647.8314C2654.7121,-638.2018 2627.7564,-626.295 2604.7437,-616.1299\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2606.0418,-612.877 2595.4802,-612.038 2603.2133,-619.2802 2606.0418,-612.877\"/>\n</g>\n<!-- 122 -->\n<g id=\"node123\" class=\"node\">\n<title>122</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2732.6442\" cy=\"-594\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2690.1442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 80->122 -->\n<g id=\"edge122\" class=\"edge\">\n<title>80->122</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2721.4293,-647.8314C2723.0336,-640.131 2724.9412,-630.9743 2726.724,-622.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2730.1949,-622.9169 2728.8081,-612.4133 2723.342,-621.4892 2730.1949,-622.9169\"/>\n</g>\n<!-- 82 -->\n<g id=\"node83\" class=\"node\">\n<title>82</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2537.6442,-540C2537.6442,-540 2373.6442,-540 2373.6442,-540 2367.6442,-540 2361.6442,-534 2361.6442,-528 2361.6442,-528 2361.6442,-516 2361.6442,-516 2361.6442,-510 2367.6442,-504 2373.6442,-504 2373.6442,-504 2537.6442,-504 2537.6442,-504 2543.6442,-504 2549.6442,-510 2549.6442,-516 2549.6442,-516 2549.6442,-528 2549.6442,-528 2549.6442,-534 2543.6442,-540 2537.6442,-540\"/>\n<text text-anchor=\"start\" x=\"2369.6442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.955</text>\n</g>\n<!-- 81->82 -->\n<g id=\"edge82\" class=\"edge\">\n<title>81->82</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2529.6623,-575.8314C2517.3513,-566.8779 2502.3334,-555.9558 2489.0505,-546.2955\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2490.7641,-543.214 2480.6181,-540.1628 2486.6468,-548.8752 2490.7641,-543.214\"/>\n</g>\n<!-- 103 -->\n<g id=\"node104\" class=\"node\">\n<title>103</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2843.1442,-540C2843.1442,-540 2580.1442,-540 2580.1442,-540 2574.1442,-540 2568.1442,-534 2568.1442,-528 2568.1442,-528 2568.1442,-516 2568.1442,-516 2568.1442,-510 2574.1442,-504 2580.1442,-504 2580.1442,-504 2843.1442,-504 2843.1442,-504 2849.1442,-504 2855.1442,-510 2855.1442,-516 2855.1442,-516 2855.1442,-528 2855.1442,-528 2855.1442,-534 2849.1442,-540 2843.1442,-540\"/>\n<text text-anchor=\"start\" x=\"2576.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.225000000000001</text>\n</g>\n<!-- 81->103 -->\n<g id=\"edge103\" class=\"edge\">\n<title>81->103</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2594.2619,-575.8314C2615.1664,-566.2446 2640.9925,-554.4008 2663.093,-544.2655\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2664.6806,-547.388 2672.3113,-540.038 2661.7626,-541.0252 2664.6806,-547.388\"/>\n</g>\n<!-- 83 -->\n<g id=\"node84\" class=\"node\">\n<title>83</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2404.6442,-468C2404.6442,-468 2240.6442,-468 2240.6442,-468 2234.6442,-468 2228.6442,-462 2228.6442,-456 2228.6442,-456 2228.6442,-444 2228.6442,-444 2228.6442,-438 2234.6442,-432 2240.6442,-432 2240.6442,-432 2404.6442,-432 2404.6442,-432 2410.6442,-432 2416.6442,-438 2416.6442,-444 2416.6442,-444 2416.6442,-456 2416.6442,-456 2416.6442,-462 2410.6442,-468 2404.6442,-468\"/>\n<text text-anchor=\"start\" x=\"2236.6442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.875</text>\n</g>\n<!-- 82->83 -->\n<g id=\"edge83\" class=\"edge\">\n<title>82->83</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2422.0827,-503.8314C2404.7561,-494.4516 2383.4384,-482.9112 2364.9906,-472.9244\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2366.6553,-469.8457 2356.195,-468.1628 2363.3228,-476.0015 2366.6553,-469.8457\"/>\n</g>\n<!-- 102 -->\n<g id=\"node103\" class=\"node\">\n<title>102</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2500.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2458.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 82->102 -->\n<g id=\"edge102\" class=\"edge\">\n<title>82->102</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2466.9996,-503.8314C2472.1549,-495.5829 2478.3545,-485.6635 2484.0197,-476.5992\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2487.1163,-478.2484 2489.4483,-467.9134 2481.1803,-474.5384 2487.1163,-478.2484\"/>\n</g>\n<!-- 84 -->\n<g id=\"node85\" class=\"node\">\n<title>84</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2385.6442,-396C2385.6442,-396 2221.6442,-396 2221.6442,-396 2215.6442,-396 2209.6442,-390 2209.6442,-384 2209.6442,-384 2209.6442,-372 2209.6442,-372 2209.6442,-366 2215.6442,-360 2221.6442,-360 2221.6442,-360 2385.6442,-360 2385.6442,-360 2391.6442,-360 2397.6442,-366 2397.6442,-372 2397.6442,-372 2397.6442,-384 2397.6442,-384 2397.6442,-390 2391.6442,-396 2385.6442,-396\"/>\n<text text-anchor=\"start\" x=\"2217.6442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.735</text>\n</g>\n<!-- 83->84 -->\n<g id=\"edge84\" class=\"edge\">\n<title>83->84</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2317.8497,-431.8314C2315.7953,-424.0463 2313.3481,-414.7729 2311.0686,-406.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2314.439,-405.1892 2308.5032,-396.4133 2307.6707,-406.9753 2314.439,-405.1892\"/>\n</g>\n<!-- 99 -->\n<g id=\"node100\" class=\"node\">\n<title>99</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2608.1442,-396C2608.1442,-396 2453.1442,-396 2453.1442,-396 2447.1442,-396 2441.1442,-390 2441.1442,-384 2441.1442,-384 2441.1442,-372 2441.1442,-372 2441.1442,-366 2447.1442,-360 2453.1442,-360 2453.1442,-360 2608.1442,-360 2608.1442,-360 2614.1442,-360 2620.1442,-366 2620.1442,-372 2620.1442,-372 2620.1442,-384 2620.1442,-384 2620.1442,-390 2614.1442,-396 2608.1442,-396\"/>\n<text text-anchor=\"start\" x=\"2449.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.94</text>\n</g>\n<!-- 83->99 -->\n<g id=\"edge99\" class=\"edge\">\n<title>83->99</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2374.8629,-431.9243C2403.4213,-422.0387 2438.9737,-409.7321 2468.901,-399.3726\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2470.099,-402.6618 2478.404,-396.0831 2467.8092,-396.0469 2470.099,-402.6618\"/>\n</g>\n<!-- 85 -->\n<g id=\"node86\" class=\"node\">\n<title>85</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2130.1442,-324C2130.1442,-324 1867.1442,-324 1867.1442,-324 1861.1442,-324 1855.1442,-318 1855.1442,-312 1855.1442,-312 1855.1442,-300 1855.1442,-300 1855.1442,-294 1861.1442,-288 1867.1442,-288 1867.1442,-288 2130.1442,-288 2130.1442,-288 2136.1442,-288 2142.1442,-294 2142.1442,-300 2142.1442,-300 2142.1442,-312 2142.1442,-312 2142.1442,-318 2136.1442,-324 2130.1442,-324\"/>\n<text text-anchor=\"start\" x=\"1863.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.684999999999999</text>\n</g>\n<!-- 84->85 -->\n<g id=\"edge85\" class=\"edge\">\n<title>84->85</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2227.0735,-359.9243C2183.8459,-349.7198 2129.6904,-336.9355 2084.9601,-326.3762\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2085.5184,-322.9119 2074.9818,-324.0207 2083.9101,-329.7246 2085.5184,-322.9119\"/>\n</g>\n<!-- 96 -->\n<g id=\"node97\" class=\"node\">\n<title>96</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2435.1442,-324C2435.1442,-324 2172.1442,-324 2172.1442,-324 2166.1442,-324 2160.1442,-318 2160.1442,-312 2160.1442,-312 2160.1442,-300 2160.1442,-300 2160.1442,-294 2166.1442,-288 2172.1442,-288 2172.1442,-288 2435.1442,-288 2435.1442,-288 2441.1442,-288 2447.1442,-294 2447.1442,-300 2447.1442,-300 2447.1442,-312 2447.1442,-312 2447.1442,-318 2441.1442,-324 2435.1442,-324\"/>\n<text text-anchor=\"start\" x=\"2168.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.774999999999999</text>\n</g>\n<!-- 84->96 -->\n<g id=\"edge96\" class=\"edge\">\n<title>84->96</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2303.6442,-359.8314C2303.6442,-352.131 2303.6442,-342.9743 2303.6442,-334.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2307.1443,-334.4132 2303.6442,-324.4133 2300.1443,-334.4133 2307.1443,-334.4132\"/>\n</g>\n<!-- 86 -->\n<g id=\"node87\" class=\"node\">\n<title>86</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2001.1442,-252C2001.1442,-252 1738.1442,-252 1738.1442,-252 1732.1442,-252 1726.1442,-246 1726.1442,-240 1726.1442,-240 1726.1442,-228 1726.1442,-228 1726.1442,-222 1732.1442,-216 1738.1442,-216 1738.1442,-216 2001.1442,-216 2001.1442,-216 2007.1442,-216 2013.1442,-222 2013.1442,-228 2013.1442,-228 2013.1442,-240 2013.1442,-240 2013.1442,-246 2007.1442,-252 2001.1442,-252\"/>\n<text text-anchor=\"start\" x=\"1734.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.655000000000001</text>\n</g>\n<!-- 85->86 -->\n<g id=\"edge86\" class=\"edge\">\n<title>85->86</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1966.092,-287.8314C1949.4394,-278.5368 1928.9856,-267.1208 1911.2057,-257.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1912.6237,-253.9803 1902.1859,-252.1628 1909.2121,-260.0927 1912.6237,-253.9803\"/>\n</g>\n<!-- 89 -->\n<g id=\"node90\" class=\"node\">\n<title>89</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2207.6442,-252C2207.6442,-252 2043.6442,-252 2043.6442,-252 2037.6442,-252 2031.6442,-246 2031.6442,-240 2031.6442,-240 2031.6442,-228 2031.6442,-228 2031.6442,-222 2037.6442,-216 2043.6442,-216 2043.6442,-216 2207.6442,-216 2207.6442,-216 2213.6442,-216 2219.6442,-222 2219.6442,-228 2219.6442,-228 2219.6442,-240 2219.6442,-240 2219.6442,-246 2213.6442,-252 2207.6442,-252\"/>\n<text text-anchor=\"start\" x=\"2039.6442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.695</text>\n</g>\n<!-- 85->89 -->\n<g id=\"edge89\" class=\"edge\">\n<title>85->89</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2030.6916,-287.8314C2047.0861,-278.5368 2067.2227,-267.1208 2084.727,-257.1971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2086.6339,-260.1395 2093.607,-252.1628 2083.1815,-254.05 2086.6339,-260.1395\"/>\n</g>\n<!-- 87 -->\n<g id=\"node88\" class=\"node\">\n<title>87</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1827.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1785.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 86->87 -->\n<g id=\"edge87\" class=\"edge\">\n<title>86->87</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1859.0458,-215.8314C1854.2342,-207.5829 1848.4479,-197.6635 1843.1604,-188.5992\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1846.1557,-186.7876 1838.0937,-179.9134 1840.1092,-190.3148 1846.1557,-186.7876\"/>\n</g>\n<!-- 88 -->\n<g id=\"node89\" class=\"node\">\n<title>88</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"1976.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"1934.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 86->88 -->\n<g id=\"edge88\" class=\"edge\">\n<title>86->88</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M1896.6448,-215.8314C1910.8251,-206.2895 1928.3282,-194.5117 1943.3433,-184.4081\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"1945.5099,-187.1688 1951.8525,-178.6822 1941.602,-181.3612 1945.5099,-187.1688\"/>\n</g>\n<!-- 90 -->\n<g id=\"node91\" class=\"node\">\n<title>90</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2125.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2083.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 89->90 -->\n<g id=\"edge90\" class=\"edge\">\n<title>89->90</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2125.6442,-215.8314C2125.6442,-208.131 2125.6442,-198.9743 2125.6442,-190.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2129.1443,-190.4132 2125.6442,-180.4133 2122.1443,-190.4133 2129.1443,-190.4132\"/>\n</g>\n<!-- 91 -->\n<g id=\"node92\" class=\"node\">\n<title>91</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2385.6442,-180C2385.6442,-180 2221.6442,-180 2221.6442,-180 2215.6442,-180 2209.6442,-174 2209.6442,-168 2209.6442,-168 2209.6442,-156 2209.6442,-156 2209.6442,-150 2215.6442,-144 2221.6442,-144 2221.6442,-144 2385.6442,-144 2385.6442,-144 2391.6442,-144 2397.6442,-150 2397.6442,-156 2397.6442,-156 2397.6442,-168 2397.6442,-168 2397.6442,-174 2391.6442,-180 2385.6442,-180\"/>\n<text text-anchor=\"start\" x=\"2217.6442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.705</text>\n</g>\n<!-- 89->91 -->\n<g id=\"edge91\" class=\"edge\">\n<title>89->91</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2170.5611,-215.8314C2194.5792,-206.1162 2224.3276,-194.0831 2249.6033,-183.8592\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2251.0924,-187.0325 2259.0503,-180.038 2248.4675,-180.5432 2251.0924,-187.0325\"/>\n</g>\n<!-- 92 -->\n<g id=\"node93\" class=\"node\">\n<title>92</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2214.6442\" cy=\"-90\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2172.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 91->92 -->\n<g id=\"edge92\" class=\"edge\">\n<title>91->92</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2281.1857,-143.8314C2269.889,-134.6924 2256.0568,-123.5024 2243.9359,-113.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2245.8458,-110.7399 2235.87,-107.1715 2241.4432,-116.182 2245.8458,-110.7399\"/>\n</g>\n<!-- 93 -->\n<g id=\"node94\" class=\"node\">\n<title>93</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2474.6442,-108C2474.6442,-108 2310.6442,-108 2310.6442,-108 2304.6442,-108 2298.6442,-102 2298.6442,-96 2298.6442,-96 2298.6442,-84 2298.6442,-84 2298.6442,-78 2304.6442,-72 2310.6442,-72 2310.6442,-72 2474.6442,-72 2474.6442,-72 2480.6442,-72 2486.6442,-78 2486.6442,-84 2486.6442,-84 2486.6442,-96 2486.6442,-96 2486.6442,-102 2480.6442,-108 2474.6442,-108\"/>\n<text text-anchor=\"start\" x=\"2306.6442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 8.715</text>\n</g>\n<!-- 91->93 -->\n<g id=\"edge93\" class=\"edge\">\n<title>91->93</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2326.1026,-143.8314C2337.0647,-134.9632 2350.4141,-124.1637 2362.2707,-114.5718\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2364.6197,-117.1734 2370.1929,-108.1628 2360.2171,-111.7313 2364.6197,-117.1734\"/>\n</g>\n<!-- 94 -->\n<g id=\"node95\" class=\"node\">\n<title>94</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2318.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2276.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 93->94 -->\n<g id=\"edge94\" class=\"edge\">\n<title>93->94</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2373.9709,-71.8314C2364.8269,-62.9346 2353.6851,-52.0939 2343.8031,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2346.1538,-39.8827 2336.5457,-35.4177 2341.2722,-44.8998 2346.1538,-39.8827\"/>\n</g>\n<!-- 95 -->\n<g id=\"node96\" class=\"node\">\n<title>95</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2467.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2425.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 93->95 -->\n<g id=\"edge95\" class=\"edge\">\n<title>93->95</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2411.5698,-71.8314C2420.8373,-62.9346 2432.1297,-52.0939 2442.1453,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2444.7107,-44.8679 2449.5007,-35.4177 2439.863,-39.8182 2444.7107,-44.8679\"/>\n</g>\n<!-- 97 -->\n<g id=\"node98\" class=\"node\">\n<title>97</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2303.6442\" cy=\"-234\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2261.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 96->97 -->\n<g id=\"edge97\" class=\"edge\">\n<title>96->97</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2303.6442,-287.8314C2303.6442,-280.131 2303.6442,-270.9743 2303.6442,-262.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2307.1443,-262.4132 2303.6442,-252.4133 2300.1443,-262.4133 2307.1443,-262.4132\"/>\n</g>\n<!-- 98 -->\n<g id=\"node99\" class=\"node\">\n<title>98</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2452.6442\" cy=\"-234\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2410.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 96->98 -->\n<g id=\"edge98\" class=\"edge\">\n<title>96->98</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2341.2432,-287.8314C2362.5157,-277.552 2389.1584,-264.6777 2411.0543,-254.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2412.637,-257.2196 2420.1181,-249.7173 2409.5914,-250.9169 2412.637,-257.2196\"/>\n</g>\n<!-- 100 -->\n<g id=\"node101\" class=\"node\">\n<title>100</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2530.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2488.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 99->100 -->\n<g id=\"edge100\" class=\"edge\">\n<title>99->100</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2530.6442,-359.8314C2530.6442,-352.131 2530.6442,-342.9743 2530.6442,-334.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2534.1443,-334.4132 2530.6442,-324.4133 2527.1443,-334.4133 2534.1443,-334.4132\"/>\n</g>\n<!-- 101 -->\n<g id=\"node102\" class=\"node\">\n<title>101</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2679.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2637.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 99->101 -->\n<g id=\"edge101\" class=\"edge\">\n<title>99->101</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2568.2432,-359.8314C2589.5157,-349.552 2616.1584,-336.6777 2638.0543,-326.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2639.637,-329.2196 2647.1181,-321.7173 2636.5914,-322.9169 2639.637,-329.2196\"/>\n</g>\n<!-- 104 -->\n<g id=\"node105\" class=\"node\">\n<title>104</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2667.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2625.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 103->104 -->\n<g id=\"edge104\" class=\"edge\">\n<title>103->104</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2700.5411,-503.8314C2695.5004,-495.5829 2689.4386,-485.6635 2683.8992,-476.5992\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2686.7923,-474.6212 2678.5913,-467.9134 2680.8193,-478.2713 2686.7923,-474.6212\"/>\n</g>\n<!-- 105 -->\n<g id=\"node106\" class=\"node\">\n<title>105</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3026.1442,-468C3026.1442,-468 2763.1442,-468 2763.1442,-468 2757.1442,-468 2751.1442,-462 2751.1442,-456 2751.1442,-456 2751.1442,-444 2751.1442,-444 2751.1442,-438 2757.1442,-432 2763.1442,-432 2763.1442,-432 3026.1442,-432 3026.1442,-432 3032.1442,-432 3038.1442,-438 3038.1442,-444 3038.1442,-444 3038.1442,-456 3038.1442,-456 3038.1442,-462 3032.1442,-468 3026.1442,-468\"/>\n<text text-anchor=\"start\" x=\"2759.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.385000000000002</text>\n</g>\n<!-- 103->105 -->\n<g id=\"edge105\" class=\"edge\">\n<title>103->105</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2757.8228,-503.8314C2782.6243,-494.0734 2813.3692,-481.977 2839.4285,-471.7242\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2840.7734,-474.9563 2848.7976,-468.038 2838.2105,-468.4423 2840.7734,-474.9563\"/>\n</g>\n<!-- 106 -->\n<g id=\"node107\" class=\"node\">\n<title>106</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3026.1442,-396C3026.1442,-396 2763.1442,-396 2763.1442,-396 2757.1442,-396 2751.1442,-390 2751.1442,-384 2751.1442,-384 2751.1442,-372 2751.1442,-372 2751.1442,-366 2757.1442,-360 2763.1442,-360 2763.1442,-360 3026.1442,-360 3026.1442,-360 3032.1442,-360 3038.1442,-366 3038.1442,-372 3038.1442,-372 3038.1442,-384 3038.1442,-384 3038.1442,-390 3032.1442,-396 3026.1442,-396\"/>\n<text text-anchor=\"start\" x=\"2759.1442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.364999999999998</text>\n</g>\n<!-- 105->106 -->\n<g id=\"edge106\" class=\"edge\">\n<title>105->106</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2894.6442,-431.8314C2894.6442,-424.131 2894.6442,-414.9743 2894.6442,-406.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2898.1443,-406.4132 2894.6442,-396.4133 2891.1443,-406.4133 2898.1443,-406.4132\"/>\n</g>\n<!-- 111 -->\n<g id=\"node112\" class=\"node\">\n<title>111</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3256.6442,-396C3256.6442,-396 3092.6442,-396 3092.6442,-396 3086.6442,-396 3080.6442,-390 3080.6442,-384 3080.6442,-384 3080.6442,-372 3080.6442,-372 3080.6442,-366 3086.6442,-360 3092.6442,-360 3092.6442,-360 3256.6442,-360 3256.6442,-360 3262.6442,-360 3268.6442,-366 3268.6442,-372 3268.6442,-372 3268.6442,-384 3268.6442,-384 3268.6442,-390 3262.6442,-396 3256.6442,-396\"/>\n<text text-anchor=\"start\" x=\"3088.6442\" y=\"-374.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.415</text>\n</g>\n<!-- 105->111 -->\n<g id=\"edge111\" class=\"edge\">\n<title>105->111</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2964.9386,-431.9243C3004.298,-421.8033 3053.5259,-409.1447 3094.3929,-398.6361\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3095.5076,-401.9634 3104.3208,-396.0831 3093.7642,-395.1839 3095.5076,-401.9634\"/>\n</g>\n<!-- 107 -->\n<g id=\"node108\" class=\"node\">\n<title>107</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M2930.1442,-324C2930.1442,-324 2775.1442,-324 2775.1442,-324 2769.1442,-324 2763.1442,-318 2763.1442,-312 2763.1442,-312 2763.1442,-300 2763.1442,-300 2763.1442,-294 2769.1442,-288 2775.1442,-288 2775.1442,-288 2930.1442,-288 2930.1442,-288 2936.1442,-288 2942.1442,-294 2942.1442,-300 2942.1442,-300 2942.1442,-312 2942.1442,-312 2942.1442,-318 2936.1442,-324 2930.1442,-324\"/>\n<text text-anchor=\"start\" x=\"2771.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.24</text>\n</g>\n<!-- 106->107 -->\n<g id=\"edge107\" class=\"edge\">\n<title>106->107</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2884.0458,-359.8314C2879.3565,-351.7925 2873.7413,-342.1666 2868.5644,-333.2918\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2871.4472,-331.2875 2863.3852,-324.4133 2865.4008,-334.8146 2871.4472,-331.2875\"/>\n</g>\n<!-- 110 -->\n<g id=\"node111\" class=\"node\">\n<title>110</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3025.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2983.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 106->110 -->\n<g id=\"edge110\" class=\"edge\">\n<title>106->110</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2927.701,-359.8314C2945.8092,-349.8788 2968.3433,-337.4936 2987.2303,-327.1129\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2989.096,-330.0814 2996.1738,-322.1975 2985.7244,-323.9469 2989.096,-330.0814\"/>\n</g>\n<!-- 108 -->\n<g id=\"node109\" class=\"node\">\n<title>108</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2777.6442\" cy=\"-234\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2735.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 107->108 -->\n<g id=\"edge108\" class=\"edge\">\n<title>107->108</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2833.7185,-287.8314C2824.451,-278.9346 2813.1587,-268.0939 2803.1431,-258.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2805.4254,-255.8182 2795.7876,-251.4177 2800.5777,-260.8679 2805.4254,-255.8182\"/>\n</g>\n<!-- 109 -->\n<g id=\"node110\" class=\"node\">\n<title>109</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2926.6442\" cy=\"-234\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2884.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 107->109 -->\n<g id=\"edge109\" class=\"edge\">\n<title>107->109</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2871.3175,-287.8314C2880.4614,-278.9346 2891.6032,-268.0939 2901.4853,-258.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2904.0161,-260.8998 2908.7426,-251.4177 2899.1346,-255.8827 2904.0161,-260.8998\"/>\n</g>\n<!-- 112 -->\n<g id=\"node113\" class=\"node\">\n<title>112</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3174.6442\" cy=\"-306\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3132.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 111->112 -->\n<g id=\"edge112\" class=\"edge\">\n<title>111->112</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3174.6442,-359.8314C3174.6442,-352.131 3174.6442,-342.9743 3174.6442,-334.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3178.1443,-334.4132 3174.6442,-324.4133 3171.1443,-334.4133 3178.1443,-334.4132\"/>\n</g>\n<!-- 113 -->\n<g id=\"node114\" class=\"node\">\n<title>113</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3425.1442,-324C3425.1442,-324 3270.1442,-324 3270.1442,-324 3264.1442,-324 3258.1442,-318 3258.1442,-312 3258.1442,-312 3258.1442,-300 3258.1442,-300 3258.1442,-294 3264.1442,-288 3270.1442,-288 3270.1442,-288 3425.1442,-288 3425.1442,-288 3431.1442,-288 3437.1442,-294 3437.1442,-300 3437.1442,-300 3437.1442,-312 3437.1442,-312 3437.1442,-318 3431.1442,-324 3425.1442,-324\"/>\n<text text-anchor=\"start\" x=\"3266.1442\" y=\"-302.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.44</text>\n</g>\n<!-- 111->113 -->\n<g id=\"edge113\" class=\"edge\">\n<title>111->113</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3218.2994,-359.8314C3241.5399,-350.159 3270.301,-338.1891 3294.7964,-327.9944\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3296.4154,-331.1117 3304.3029,-324.038 3293.7257,-324.6491 3296.4154,-331.1117\"/>\n</g>\n<!-- 114 -->\n<g id=\"node115\" class=\"node\">\n<title>114</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3260.6442\" cy=\"-234\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3218.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 113->114 -->\n<g id=\"edge114\" class=\"edge\">\n<title>113->114</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3325.6904,-287.8314C3314.6475,-278.6924 3301.1262,-267.5024 3289.2776,-257.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3291.3285,-254.8508 3281.393,-251.1715 3286.8655,-260.2436 3291.3285,-254.8508\"/>\n</g>\n<!-- 115 -->\n<g id=\"node116\" class=\"node\">\n<title>115</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3511.1442,-252C3511.1442,-252 3356.1442,-252 3356.1442,-252 3350.1442,-252 3344.1442,-246 3344.1442,-240 3344.1442,-240 3344.1442,-228 3344.1442,-228 3344.1442,-222 3350.1442,-216 3356.1442,-216 3356.1442,-216 3511.1442,-216 3511.1442,-216 3517.1442,-216 3523.1442,-222 3523.1442,-228 3523.1442,-228 3523.1442,-240 3523.1442,-240 3523.1442,-246 3517.1442,-252 3511.1442,-252\"/>\n<text text-anchor=\"start\" x=\"3352.1442\" y=\"-230.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.71</text>\n</g>\n<!-- 113->115 -->\n<g id=\"edge115\" class=\"edge\">\n<title>113->115</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3369.3456,-287.8314C3379.8363,-279.0485 3392.5897,-268.3712 3403.9636,-258.8489\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3406.5289,-261.2659 3411.9497,-252.1628 3402.0353,-255.8986 3406.5289,-261.2659\"/>\n</g>\n<!-- 116 -->\n<g id=\"node117\" class=\"node\">\n<title>116</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3426.6442,-180C3426.6442,-180 3262.6442,-180 3262.6442,-180 3256.6442,-180 3250.6442,-174 3250.6442,-168 3250.6442,-168 3250.6442,-156 3250.6442,-156 3250.6442,-150 3256.6442,-144 3262.6442,-144 3262.6442,-144 3426.6442,-144 3426.6442,-144 3432.6442,-144 3438.6442,-150 3438.6442,-156 3438.6442,-156 3438.6442,-168 3438.6442,-168 3438.6442,-174 3432.6442,-180 3426.6442,-180\"/>\n<text text-anchor=\"start\" x=\"3258.6442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.645</text>\n</g>\n<!-- 115->116 -->\n<g id=\"edge116\" class=\"edge\">\n<title>115->116</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3411.1857,-215.8314C3400.2237,-206.9632 3386.8743,-196.1637 3375.0177,-186.5718\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3377.0713,-183.7313 3367.0954,-180.1628 3372.6686,-189.1734 3377.0713,-183.7313\"/>\n</g>\n<!-- 121 -->\n<g id=\"node122\" class=\"node\">\n<title>121</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3522.6442\" cy=\"-162\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3480.1442\" y=\"-158.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 115->121 -->\n<g id=\"edge121\" class=\"edge\">\n<title>115->121</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3456.1026,-215.8314C3467.3994,-206.6924 3481.2315,-195.5024 3493.3525,-185.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3495.8452,-188.182 3501.4183,-179.1715 3491.4425,-182.7399 3495.8452,-188.182\"/>\n</g>\n<!-- 117 -->\n<g id=\"node118\" class=\"node\">\n<title>117</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3337.6442,-108C3337.6442,-108 3173.6442,-108 3173.6442,-108 3167.6442,-108 3161.6442,-102 3161.6442,-96 3161.6442,-96 3161.6442,-84 3161.6442,-84 3161.6442,-78 3167.6442,-72 3173.6442,-72 3173.6442,-72 3337.6442,-72 3337.6442,-72 3343.6442,-72 3349.6442,-78 3349.6442,-84 3349.6442,-84 3349.6442,-96 3349.6442,-96 3349.6442,-102 3343.6442,-108 3337.6442,-108\"/>\n<text text-anchor=\"start\" x=\"3169.6442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.455</text>\n</g>\n<!-- 116->117 -->\n<g id=\"edge117\" class=\"edge\">\n<title>116->117</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3322.1857,-143.8314C3311.2237,-134.9632 3297.8743,-124.1637 3286.0177,-114.5718\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3288.0713,-111.7313 3278.0954,-108.1628 3283.6686,-117.1734 3288.0713,-111.7313\"/>\n</g>\n<!-- 120 -->\n<g id=\"node121\" class=\"node\">\n<title>120</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3433.6442\" cy=\"-90\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3391.1442\" y=\"-86.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 116->120 -->\n<g id=\"edge120\" class=\"edge\">\n<title>116->120</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3367.1026,-143.8314C3378.3994,-134.6924 3392.2315,-123.5024 3404.3525,-113.6967\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3406.8452,-116.182 3412.4183,-107.1715 3402.4425,-110.7399 3406.8452,-116.182\"/>\n</g>\n<!-- 118 -->\n<g id=\"node119\" class=\"node\">\n<title>118</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3180.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3138.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 117->118 -->\n<g id=\"edge118\" class=\"edge\">\n<title>117->118</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3236.7185,-71.8314C3227.451,-62.9346 3216.1587,-52.0939 3206.1431,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3208.4254,-39.8182 3198.7876,-35.4177 3203.5777,-44.8679 3208.4254,-39.8182\"/>\n</g>\n<!-- 119 -->\n<g id=\"node120\" class=\"node\">\n<title>119</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3329.6442\" cy=\"-18\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3287.1442\" y=\"-14.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 117->119 -->\n<g id=\"edge119\" class=\"edge\">\n<title>117->119</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3274.3175,-71.8314C3283.4614,-62.9346 3294.6032,-52.0939 3304.4853,-42.4789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3307.0161,-44.8998 3311.7426,-35.4177 3302.1346,-39.8827 3307.0161,-44.8998\"/>\n</g>\n<!-- 124 -->\n<g id=\"node125\" class=\"node\">\n<title>124</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"2909.6442\" cy=\"-594\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"2867.1442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 123->124 -->\n<g id=\"edge124\" class=\"edge\">\n<title>123->124</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2920.1114,-647.8314C2918.6141,-640.131 2916.8336,-630.9743 2915.1696,-622.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"2918.569,-621.5614 2913.2245,-612.4133 2911.6977,-622.8975 2918.569,-621.5614\"/>\n</g>\n<!-- 125 -->\n<g id=\"node126\" class=\"node\">\n<title>125</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3276.1442,-612C3276.1442,-612 3005.1442,-612 3005.1442,-612 2999.1442,-612 2993.1442,-606 2993.1442,-600 2993.1442,-600 2993.1442,-588 2993.1442,-588 2993.1442,-582 2999.1442,-576 3005.1442,-576 3005.1442,-576 3276.1442,-576 3276.1442,-576 3282.1442,-576 3288.1442,-582 3288.1442,-588 3288.1442,-588 3288.1442,-600 3288.1442,-600 3288.1442,-606 3282.1442,-612 3276.1442,-612\"/>\n<text text-anchor=\"start\" x=\"3001.1442\" y=\"-590.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.024999999999999</text>\n</g>\n<!-- 123->125 -->\n<g id=\"edge125\" class=\"edge\">\n<title>123->125</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M2978.1223,-647.9243C3008.0455,-637.9959 3045.3284,-625.6255 3076.6346,-615.2382\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3077.7546,-618.5543 3086.1436,-612.0831 3075.5502,-611.9104 3077.7546,-618.5543\"/>\n</g>\n<!-- 126 -->\n<g id=\"node127\" class=\"node\">\n<title>126</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3203.6442,-540C3203.6442,-540 3039.6442,-540 3039.6442,-540 3033.6442,-540 3027.6442,-534 3027.6442,-528 3027.6442,-528 3027.6442,-516 3027.6442,-516 3027.6442,-510 3033.6442,-504 3039.6442,-504 3039.6442,-504 3203.6442,-504 3203.6442,-504 3209.6442,-504 3215.6442,-510 3215.6442,-516 3215.6442,-516 3215.6442,-528 3215.6442,-528 3215.6442,-534 3209.6442,-540 3203.6442,-540\"/>\n<text text-anchor=\"start\" x=\"3035.6442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 9.945</text>\n</g>\n<!-- 125->126 -->\n<g id=\"edge126\" class=\"edge\">\n<title>125->126</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3135.8497,-575.8314C3133.7953,-568.0463 3131.3481,-558.7729 3129.0686,-550.1347\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3132.439,-549.1892 3126.5032,-540.4133 3125.6707,-550.9753 3132.439,-549.1892\"/>\n</g>\n<!-- 129 -->\n<g id=\"node130\" class=\"node\">\n<title>129</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3299.6442\" cy=\"-522\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3257.1442\" y=\"-518.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 125->129 -->\n<g id=\"edge129\" class=\"edge\">\n<title>125->129</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3180.7666,-575.8314C3203.7299,-565.4329 3232.5573,-552.379 3256.0732,-541.7302\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3257.7957,-544.7924 3265.4615,-537.479 3254.9081,-538.4158 3257.7957,-544.7924\"/>\n</g>\n<!-- 127 -->\n<g id=\"node128\" class=\"node\">\n<title>127</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3121.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3079.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 126->127 -->\n<g id=\"edge127\" class=\"edge\">\n<title>126->127</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3121.6442,-503.8314C3121.6442,-496.131 3121.6442,-486.9743 3121.6442,-478.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3125.1443,-478.4132 3121.6442,-468.4133 3118.1443,-478.4133 3125.1443,-478.4132\"/>\n</g>\n<!-- 128 -->\n<g id=\"node129\" class=\"node\">\n<title>128</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3270.6442\" cy=\"-450\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3228.1442\" y=\"-446.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 126->128 -->\n<g id=\"edge128\" class=\"edge\">\n<title>126->128</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3159.2432,-503.8314C3180.5157,-493.552 3207.1584,-480.6777 3229.0543,-470.0971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3230.637,-473.2196 3238.1181,-465.7173 3227.5914,-466.9169 3230.637,-473.2196\"/>\n</g>\n<!-- 132 -->\n<g id=\"node133\" class=\"node\">\n<title>132</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3166.6442\" cy=\"-738\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3124.1442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 0</text>\n</g>\n<!-- 131->132 -->\n<g id=\"edge132\" class=\"edge\">\n<title>131->132</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3168.1395,-791.8314C3167.9256,-784.131 3167.6712,-774.9743 3167.4335,-766.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3170.9321,-766.3122 3167.1557,-756.4133 3163.9348,-766.5066 3170.9321,-766.3122\"/>\n</g>\n<!-- 133 -->\n<g id=\"node134\" class=\"node\">\n<title>133</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3434.6442,-756C3434.6442,-756 3262.6442,-756 3262.6442,-756 3256.6442,-756 3250.6442,-750 3250.6442,-744 3250.6442,-744 3250.6442,-732 3250.6442,-732 3250.6442,-726 3256.6442,-720 3262.6442,-720 3262.6442,-720 3434.6442,-720 3434.6442,-720 3440.6442,-720 3446.6442,-726 3446.6442,-732 3446.6442,-732 3446.6442,-744 3446.6442,-744 3446.6442,-750 3440.6442,-756 3434.6442,-756\"/>\n<text text-anchor=\"start\" x=\"3258.6442\" y=\"-734.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.305</text>\n</g>\n<!-- 131->133 -->\n<g id=\"edge133\" class=\"edge\">\n<title>131->133</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3214.0658,-791.8314C3238.3537,-782.1162 3268.4364,-770.0831 3293.9961,-759.8592\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3295.5643,-763.0016 3303.5492,-756.038 3292.9645,-756.5023 3295.5643,-763.0016\"/>\n</g>\n<!-- 134 -->\n<g id=\"node135\" class=\"node\">\n<title>134</title>\n<ellipse fill=\"transparent\" stroke=\"#000000\" cx=\"3348.6442\" cy=\"-666\" rx=\"65.7887\" ry=\"18\"/>\n<text text-anchor=\"start\" x=\"3306.1442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">predicted = 1</text>\n</g>\n<!-- 133->134 -->\n<g id=\"edge134\" class=\"edge\">\n<title>133->134</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3348.6442,-719.8314C3348.6442,-712.131 3348.6442,-702.9743 3348.6442,-694.4166\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3352.1443,-694.4132 3348.6442,-684.4133 3345.1443,-694.4133 3352.1443,-694.4132\"/>\n</g>\n<!-- 135 -->\n<g id=\"node136\" class=\"node\">\n<title>135</title>\n<path fill=\"transparent\" stroke=\"#000000\" d=\"M3616.6442,-684C3616.6442,-684 3444.6442,-684 3444.6442,-684 3438.6442,-684 3432.6442,-678 3432.6442,-672 3432.6442,-672 3432.6442,-660 3432.6442,-660 3432.6442,-654 3438.6442,-648 3444.6442,-648 3444.6442,-648 3616.6442,-648 3616.6442,-648 3622.6442,-648 3628.6442,-654 3628.6442,-660 3628.6442,-660 3628.6442,-672 3628.6442,-672 3628.6442,-678 3622.6442,-684 3616.6442,-684\"/>\n<text text-anchor=\"start\" x=\"3440.6442\" y=\"-662.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\" fill=\"#000000\">feature#15900165 ≤ 10.945</text>\n</g>\n<!-- 133->135 -->\n<g id=\"edge135\" class=\"edge\">\n<title>133->135</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M3394.5705,-719.8314C3419.2364,-710.0734 3449.8133,-697.977 3475.7302,-687.7242\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"3477.0369,-690.9713 3485.0481,-684.038 3474.4618,-684.4621 3477.0369,-690.9713\"/>\n</g>\n<!-- 136 -->\n<g id=\"node137\" class=\"node\"& |