From 10f4711309083c4f83bb06990bacb4a19120ce82 Mon Sep 17 00:00:00 2001 From: Alexandre Farias Date: Mon, 3 Aug 2020 01:45:27 -0300 Subject: [PATCH] Added Text Similarity Classification Example (#326) * Added Customer Churn Predicition Notebook Example. * Added Text Similarity Classification example. --- ...ret 2 Text Similarity Classification.ipynb | 11972 ++++++++++++++++ 1 file changed, 11972 insertions(+) create mode 100644 examples/PyCaret 2 Text Similarity Classification.ipynb diff --git a/examples/PyCaret 2 Text Similarity Classification.ipynb b/examples/PyCaret 2 Text Similarity Classification.ipynb new file mode 100644 index 0000000..41e3958 --- /dev/null +++ b/examples/PyCaret 2 Text Similarity Classification.ipynb @@ -0,0 +1,11972 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Text Similarity Classification\n", + "Last Update: 08/02/2020
\n", + "PyCaret Version: 2.0
\n", + "Author: Alexandre Farias
\n", + "Email: afarias@tuta.io\n", + "\n", + "# Introduction\n", + "This task consists in compare two sentences present on the dataset and identify if both have the same meaning.
\n", + "An Exploratory Data Analysis is made to gain insights about the data, a Topic Modelling to get the features and the classification step, these last two steps are made with the Python Module PyCaret.
\n", + "Importing the requires modules, PyCaret is imported later to avoid conflicts on the experiments.\n", + "The dataset used on this work is the [Text Similarity](https://www.kaggle.com/rishisankineni/text-similarity) hosted on Kaggle, only using the data present on the train set, since the test set has a few samples doesn't has the labels do validate the model." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Standard\n", + "import pandas as pd\n", + "# Plots\n", + "from plotly.offline import init_notebook_mode, iplot\n", + "import plotly.graph_objects as go\n", + "from plotly.subplots import make_subplots\n", + "init_notebook_mode(connected=True)\n", + "import seaborn as sns\n", + "# Sklearn tools\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.metrics import *\n", + "# PATH and setup\n", + "import os\n", + "os.chdir(\"..\")\n", + "PATH = os.getcwd()+os.sep\n", + "RANDOM_SEED = 42\n", + "K_FOLDS = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The helper functions used to plots, data sampling and scores." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "## Dataset Sampling\n", + "def data_sampling(dataset, frac: float, random_seed: int):\n", + " data_sampled_a = dataset.sample(frac=frac,\n", + " random_state=random_seed)\n", + " data_sampled_b = dataset.drop(data_sampled_a.index).\\\n", + " reset_index(drop=True)\n", + " data_sampled_a.reset_index(drop=True, inplace=True)\n", + " return data_sampled_a, data_sampled_b \n", + "## Pie Chart\n", + "def pie_plot(data, plot_title: str):\n", + " trace = go.Pie(labels=data.index, values=data.values)\n", + " layout = go.Layout(autosize=False,\n", + " title={\"text\" : plot_title,\n", + " \"y\" : 0.9,\n", + " \"x\" : 0.5,\n", + " \"xanchor\" : \"center\",\n", + " \"yanchor\" : \"top\"})\n", + " fig = go.Figure(data=trace, layout=layout)\n", + " fig.update_traces(textfont_size=14,\n", + " marker=dict(line=dict(color=\"#000000\",\n", + " width=2)))\n", + " fig.update_yaxes(automargin=True)\n", + " iplot(fig)\n", + "## Histogram subplots\n", + "def histogram_subplot(dataset_a, dataset_b, feature_a: str,\n", + "feature_b: str, title: str, title_a:\n", + "str, title_b: str):\n", + " fig = make_subplots(rows=1, cols=2, subplot_titles=(\n", + " title_a,\n", + " title_b\n", + " )\n", + " )\n", + " fig.add_trace(go.Histogram(x=dataset_a[feature_a],\n", + " showlegend=False), row=1, col=1)\n", + " fig.add_trace(go.Histogram(x=dataset_b[feature_b],\n", + " showlegend=False), row=1, col=2)\n", + " fig.update_layout(template=\"simple_white\")\n", + " fig.update_layout(autosize=False,\n", + " title={\"text\" : title,\n", + " \"y\" : 0.9,\n", + " \"x\" : 0.5,\n", + " \"xanchor\" : \"center\",\n", + " \"yanchor\" : \"top\"},\n", + " yaxis={\"title\" : \"Frequency\"})\n", + " fig.update_traces(marker=dict(line=dict(color=\"#000000\",\n", + " width=2)))\n", + " fig.update_yaxes(automargin=True)\n", + " iplot(fig)\n", + "# Calculate scores with Test/Unseen labeled data\n", + "def test_score_report(data_unseen, predict_unseen):\n", + " le = LabelEncoder()\n", + " data_unseen[\"Label\"] = le.fit_transform(data_unseen.same_security.values)\n", + " data_unseen[\"Label\"] = data_unseen[\"Label\"].astype(int)\n", + " accuracy = accuracy_score(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"])\n", + " roc_auc = roc_auc_score(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"])\n", + " precision = precision_score(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"])\n", + " recall = recall_score(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"])\n", + " f1 = f1_score(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"])\n", + " df_unseen = pd.DataFrame({\n", + " \"Accuracy\" : [accuracy],\n", + " \"AUC\" : [roc_auc],\n", + " \"Recall\" : [recall],\n", + " \"Precision\" : [precision],\n", + " \"F1 Score\" : [f1]\n", + " })\n", + " return df_unseen\n", + "# Confusion Matrix\n", + "def conf_mat(data_unseen, predict_unseen):\n", + " unique_label = data_unseen[\"Label\"].unique()\n", + " cmtx = pd.DataFrame(\n", + " confusion_matrix(data_unseen[\"Label\"],\n", + " predict_unseen[\"Label\"], labels=unique_label),\n", + " index=['{:}'.format(x) for x in unique_label],\n", + " columns=['{:}'.format(x) for x in unique_label])\n", + " ax = sns.heatmap(cmtx, annot=True, fmt=\"d\", cmap=\"YlGnBu\")\n", + " ax.set_ylabel('Predicted')\n", + " ax.set_xlabel('Target');\n", + " ax.set_title(\"Predict Unseen Confusion Matrix\", size=14);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. Data Loading and Initial Infos\n", + "The data is loaded in a Dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0description_xdescription_yticker_xticker_ysame_security
00first trust dow jones internetfirst trust dj internet idxFDNFDNTrue
11schwab intl large company index etfschwab strategic tr fundamental intl large co ...FNDFFNDFTrue
22vanguard small cap index admvanguard small-cap index fund instVSMAXVSCIXFalse
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 description_x \\\n", + "0 0 first trust dow jones internet \n", + "1 1 schwab intl large company index etf \n", + "2 2 vanguard small cap index adm \n", + "\n", + " description_y ticker_x ticker_y \\\n", + "0 first trust dj internet idx FDN FDN \n", + "1 schwab strategic tr fundamental intl large co ... FNDF FNDF \n", + "2 vanguard small-cap index fund inst VSMAX VSCIX \n", + "\n", + " same_security \n", + "0 True \n", + "1 True \n", + "2 False " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv(PATH+\"data\"+os.sep+\"train.csv\")\n", + "data.head(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A check for duplicated samples." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "data.drop_duplicates(inplace=True, keep='first')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There're no duplicated samples on the dataset.
\n", + "Time to drop features that will not help on the prediction and get some information about the data." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 2142 entries, 0 to 2141\n", + "Data columns (total 3 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 description_x 2142 non-null object\n", + " 1 description_y 2142 non-null object\n", + " 2 same_security 2142 non-null bool \n", + "dtypes: bool(1), object(2)\n", + "memory usage: 52.3+ KB\n" + ] + } + ], + "source": [ + "data.drop(columns=['Unnamed: 0', 'ticker_x', 'ticker_y'],\n", + " inplace=True)\n", + "data.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And check for missing values." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "description_x 0\n", + "description_y 0\n", + "same_security 0\n", + "dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.isnull().sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset doesn't contain any missing value, what is very good!\n", + "A good approach to compare the sentences is check its characters length, let's create these features for each sentence." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "data['len_x'] = data['description_x'].apply(len)\n", + "data['len_y'] = data['description_y'].apply(len)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. EDA" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check the distribution of the target feature, `same_security`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": false + }, + "data": [ + { + "labels": [ + true, + false + ], + "marker": { + "line": { + "color": "#000000", + "width": 2 + } + }, + "textfont": { + "size": 14 + }, + "type": "pie", + "values": [ + 1613, + 529 + ] + } + ], + "layout": { + "autosize": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Security Values", + "x": 0.5, + "xanchor": "center", + "y": 0.9, + "yanchor": "top" + }, + "yaxis": { + "automargin": true + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "series_aux = data['same_security'].value_counts()\n", + "pie_plot(series_aux, 'Security Values')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's a case of imbalanced classes and it will be handled with a model evaluation using F1-Score. I will not use any resampling technique, as random oversampling, SMOTE, etc.
\n", + "A good insight for this problem is see the distribution of character length of each sentence for the security values, starting with the True values." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": false + }, + "data": [ + { + "marker": { + "line": { + "color": "#000000", + "width": 2 + } + }, + "showlegend": false, + "type": "histogram", + "x": [ + 30, + 35, + 53, + 16, + 28, + 24, + 43, + 28, + 17, + 31, + 14, + 31, + 19, + 64, + 18, + 16, + 12, + 28, + 15, + 22, + 10, + 39, + 19, + 18, + 25, + 20, + 26, + 36, + 20, + 20, + 33, + 29, + 27, + 13, + 35, + 35, + 32, + 25, + 30, + 39, + 29, + 33, + 10, + 39, + 25, + 66, + 14, + 44, + 40, + 15, + 33, + 19, + 18, + 24, + 24, + 31, + 33, + 38, + 25, + 33, + 18, + 40, + 37, + 22, + 16, + 30, + 18, + 17, + 20, + 40, + 24, + 23, + 32, + 13, + 31, + 32, + 32, + 27, + 21, + 32, + 12, + 17, + 28, + 14, + 24, + 27, + 36, + 21, + 45, + 36, + 29, + 29, + 34, + 14, + 24, + 19, + 8, + 32, + 15, + 39, + 22, + 27, + 29, + 44, + 35, + 42, + 18, + 8, + 15, + 21, + 19, + 17, + 19, + 24, + 27, + 17, + 33, + 25, + 23, + 20, + 33, + 29, + 10, + 23, + 31, + 24, + 35, + 26, + 16, + 38, + 18, + 34, + 21, + 22, + 36, + 28, + 26, + 31, + 19, + 28, + 16, + 20, + 41, + 34, + 23, + 54, + 17, + 32, + 21, + 28, + 18, + 28, + 24, + 32, + 53, + 32, + 60, + 46, + 27, + 58, + 27, + 30, + 22, + 35, + 30, + 29, + 26, + 34, + 55, + 35, + 12, + 48, + 27, + 18, + 28, + 18, + 27, + 35, + 22, + 22, + 20, + 51, + 34, + 39, + 13, + 20, + 32, + 25, + 24, + 30, + 18, + 30, + 18, + 12, + 31, + 21, + 20, + 23, + 24, + 40, + 18, + 26, + 12, + 27, + 33, + 21, + 27, + 16, + 48, + 26, + 11, + 37, + 28, + 35, + 35, + 22, + 36, + 35, + 14, + 32, + 15, + 12, + 14, + 15, + 17, + 35, + 37, + 16, + 32, + 40, + 16, + 23, + 33, + 20, + 31, + 22, + 31, + 44, + 12, + 34, + 19, + 28, + 47, + 24, + 19, + 53, + 20, + 32, + 19, + 25, + 18, + 22, + 17, + 29, + 21, + 45, + 18, + 11, + 20, + 41, + 28, + 14, + 20, + 30, + 18, + 23, + 13, + 21, + 25, + 37, + 19, + 25, + 26, + 10, + 27, + 31, + 19, + 17, + 32, + 34, + 19, + 19, + 24, + 21, + 35, + 26, + 58, + 17, + 28, + 40, + 21, + 50, + 27, + 30, + 43, + 34, + 12, + 18, + 27, + 32, + 26, + 40, + 34, + 20, + 22, + 35, + 34, + 26, + 14, + 20, + 28, + 22, + 40, + 54, + 32, + 15, + 12, + 19, + 34, + 29, + 24, + 13, + 60, + 19, + 16, + 25, + 29, + 29, + 27, + 20, + 34, + 23, + 24, + 34, + 19, + 11, + 24, + 10, + 36, + 33, + 35, + 44, + 29, + 18, + 19, + 37, + 26, + 9, + 27, + 31, + 36, + 43, + 21, + 41, + 29, + 20, + 29, + 12, + 31, + 14, + 51, + 59, + 29, + 34, + 32, + 10, + 23, + 36, + 23, + 30, + 14, + 38, + 32, + 21, + 28, + 25, + 19, + 22, + 19, + 18, + 33, + 17, + 15, + 11, + 35, + 21, + 17, + 39, + 30, + 33, + 17, + 30, + 33, + 29, + 20, + 14, + 21, + 10, + 20, + 22, + 52, + 10, + 31, + 32, + 24, + 45, + 52, + 29, + 28, + 24, + 22, + 16, + 30, + 22, + 19, + 34, + 30, + 24, + 26, + 19, + 15, + 28, + 16, + 43, + 14, + 26, + 13, + 26, + 15, + 23, + 26, + 30, + 30, + 45, + 19, + 53, + 29, + 32, + 32, + 22, + 38, + 21, + 20, + 27, + 27, + 26, + 17, + 18, + 19, + 20, + 32, + 24, + 26, + 58, + 40, + 20, + 47, + 36, + 39, + 25, + 59, + 21, + 10, + 20, + 37, + 35, + 34, + 21, + 15, + 36, + 34, + 60, + 27, + 36, + 15, + 30, + 34, + 56, + 31, + 27, + 17, + 50, + 21, + 30, + 31, + 12, + 34, + 18, + 28, + 13, + 18, + 24, + 16, + 21, + 17, + 38, + 16, + 24, + 29, + 18, + 31, + 33, + 25, + 31, + 40, + 22, + 28, + 20, + 35, + 28, + 48, + 25, + 15, + 7, + 47, + 12, + 24, + 24, + 27, + 28, + 34, + 23, + 16, + 22, + 31, + 14, + 25, + 34, + 50, + 13, + 29, + 21, + 24, + 23, + 31, + 36, + 51, + 29, + 23, + 29, + 40, + 31, + 33, + 44, + 29, + 31, + 49, + 19, + 34, + 17, + 41, + 18, + 26, + 26, + 30, + 28, + 15, + 20, + 48, + 32, + 58, + 34, + 24, + 11, + 15, + 18, + 22, + 18, + 8, + 17, + 29, + 53, + 34, + 31, + 44, + 19, + 30, + 27, + 18, + 31, + 41, + 28, + 33, + 32, + 33, + 30, + 29, + 20, + 27, + 10, + 49, + 14, + 26, + 24, + 30, + 39, + 18, + 79, + 48, + 44, + 23, + 29, + 23, + 14, + 24, + 27, + 11, + 29, + 22, + 59, + 18, + 33, + 18, + 36, + 59, + 34, + 15, + 29, + 41, + 36, + 30, + 37, + 31, + 42, + 27, + 19, + 50, + 18, + 15, + 25, + 27, + 29, + 26, + 37, + 25, + 16, + 60, + 23, + 38, + 22, + 50, + 34, + 36, + 18, + 30, + 19, + 22, + 22, + 15, + 20, + 38, + 28, + 45, + 44, + 39, + 28, + 36, + 18, + 30, + 30, + 31, + 29, + 29, + 53, + 19, + 31, + 25, + 11, + 20, + 19, + 38, + 24, + 32, + 30, + 18, + 30, + 28, + 26, + 30, + 20, + 23, + 29, + 39, + 28, + 23, + 29, + 37, + 11, + 27, + 18, + 11, + 39, + 27, + 31, + 20, + 17, + 18, + 25, + 20, + 20, + 16, + 30, + 19, + 22, + 55, + 58, + 30, + 23, + 28, + 30, + 28, + 17, + 23, + 50, + 15, + 17, + 21, + 40, + 19, + 28, + 28, + 24, + 25, + 17, + 19, + 60, + 13, + 39, + 23, + 44, + 28, + 15, + 68, + 23, + 8, + 37, + 31, + 60, + 56, + 22, + 60, + 14, + 34, + 38, + 32, + 20, + 19, + 25, + 23, + 48, + 36, + 21, + 35, + 18, + 13, + 28, + 20, + 36, + 32, + 14, + 32, + 28, + 30, + 17, + 24, + 30, + 30, + 53, + 51, + 36, + 9, + 22, + 27, + 27, + 23, + 26, + 24, + 36, + 15, + 20, + 30, + 39, + 13, + 44, + 30, + 35, + 46, + 15, + 79, + 22, + 25, + 34, + 28, + 31, + 31, + 20, + 12, + 21, + 18, + 24, + 36, + 28, + 18, + 26, + 19, + 59, + 29, + 17, + 11, + 20, + 32, + 18, + 27, + 27, + 21, + 26, + 14, + 28, + 39, + 31, + 23, + 47, + 16, + 49, + 22, + 38, + 52, + 30, + 23, + 36, + 9, + 78, + 23, + 32, + 19, + 23, + 26, + 27, + 19, + 28, + 30, + 27, + 50, + 28, + 19, + 40, + 28, + 27, + 24, + 18, + 22, + 30, + 23, + 16, + 14, + 15, + 22, + 43, + 25, + 12, + 20, + 21, + 40, + 28, + 34, + 37, + 32, + 26, + 32, + 25, + 31, + 17, + 40, + 48, + 41, + 30, + 27, + 33, + 17, + 48, + 35, + 48, + 21, + 18, + 64, + 34, + 17, + 13, + 19, + 17, + 38, + 37, + 31, + 36, + 18, + 16, + 17, + 27, + 11, + 19, + 20, + 22, + 47, + 39, + 25, + 46, + 30, + 30, + 19, + 39, + 24, + 34, + 15, + 21, + 33, + 16, + 23, + 17, + 37, + 28, + 44, + 41, + 31, + 28, + 18, + 36, + 28, + 49, + 11, + 27, + 40, + 33, + 32, + 18, + 30, + 17, + 26, + 37, + 26, + 35, + 18, + 20, + 20, + 47, + 15, + 23, + 39, + 52, + 24, + 18, + 18, + 22, + 26, + 24, + 14, + 29, + 29, + 32, + 23, + 26, + 27, + 30, + 27, + 29, + 17, + 57, + 33, + 28, + 23, + 25, + 38, + 41, + 23, + 20, + 27, + 20, + 30, + 21, + 35, + 38, + 14, + 20, + 35, + 28, + 37, + 21, + 36, + 17, + 18, + 30, + 44, + 32, + 23, + 42, + 44, + 60, + 31, + 44, + 28, + 17, + 27, + 18, + 12, + 23, + 22, + 20, + 21, + 15, + 20, + 18, + 40, + 27, + 18, + 23, + 21, + 35, + 40, + 18, + 25, + 64, + 36, + 24, + 34, + 9, + 31, + 15, + 68, + 26, + 28, + 16, + 38, + 32, + 50, + 27, + 14, + 27, + 39, + 29, + 52, + 20, + 19, + 32, + 39, + 39, + 23, + 38, + 26, + 24, + 30, + 24, + 56, + 29, + 23, + 34, + 20, + 13, + 36, + 60, + 15, + 42, + 23, + 53, + 25, + 20, + 18, + 22, + 18, + 24, + 27, + 30, + 60, + 25, + 21, + 27, + 35, + 18, + 15, + 22, + 41, + 23, + 19, + 35, + 13, + 35, + 14, + 32, + 17, + 37, + 35, + 29, + 40, + 36, + 36, + 30, + 7, + 21, + 58, + 24, + 28, + 27, + 40, + 46, + 16, + 30, + 18, + 21, + 18, + 21, + 25, + 28, + 30, + 28, + 27, + 17, + 59, + 20, + 12, + 31, + 18, + 49, + 17, + 18, + 20, + 25, + 28, + 32, + 29, + 26, + 34, + 24, + 26, + 22, + 30, + 33, + 40, + 56, + 33, + 19, + 36, + 15, + 42, + 35, + 29, + 34, + 18, + 11, + 14, + 18, + 33, + 24, + 43, + 22, + 25, + 33, + 16, + 25, + 52, + 19, + 16, + 18, + 34, + 28, + 12, + 37, + 30, + 28, + 26, + 27, + 25, + 39, + 18, + 35, + 15, + 17, + 22, + 26, + 60, + 53, + 17, + 51, + 20, + 16, + 10, + 20, + 27, + 11, + 30, + 19, + 28, + 36, + 31, + 51, + 28, + 29, + 11, + 30, + 25, + 35, + 39, + 18, + 29, + 14, + 25, + 36, + 30, + 19, + 28, + 21, + 14, + 22, + 45, + 32, + 30, + 23, + 30, + 32, + 15, + 34, + 25, + 52, + 34, + 29, + 27, + 36, + 10, + 13, + 33, + 21, + 37, + 12, + 20, + 18, + 30, + 35, + 34, + 14, + 19, + 25, + 30, + 44, + 36, + 32, + 28, + 13, + 30, + 18, + 21, + 32, + 26, + 17, + 68, + 23, + 27, + 35, + 57, + 21, + 35, + 50, + 36, + 27, + 60, + 11, + 23, + 16, + 22, + 67, + 20, + 30, + 21, + 29, + 17, + 16, + 28, + 24, + 35, + 20, + 28, + 32, + 28, + 20, + 60, + 22, + 31, + 41, + 33, + 20, + 25, + 9, + 36, + 34, + 51, + 26, + 46, + 34, + 26, + 30, + 17, + 18, + 41, + 20, + 17, + 26, + 15, + 53, + 28, + 33, + 23, + 17, + 23, + 18, + 25, + 23, + 22, + 39, + 18, + 27, + 26, + 19, + 33, + 32, + 19, + 23, + 22, + 36, + 38, + 20, + 28, + 30, + 26, + 31, + 20, + 26, + 9, + 41, + 26, + 26, + 31, + 13, + 34, + 38, + 15, + 20, + 24, + 25, + 32, + 55, + 36, + 27, + 20, + 30, + 23, + 18, + 71, + 23, + 29, + 29, + 19, + 38, + 24, + 39, + 32, + 20, + 36, + 11, + 50, + 25, + 31, + 16, + 14, + 24, + 33, + 14, + 38, + 19, + 24, + 35, + 23, + 47, + 39, + 20, + 30, + 36, + 46, + 18, + 22, + 14, + 16, + 21, + 33, + 18, + 25, + 28, + 12, + 18, + 17, + 18, + 21, + 27, + 22, + 27, + 14, + 36, + 26, + 18, + 28, + 18, + 19, + 27, + 23, + 35, + 16, + 26, + 21, + 33, + 22, + 40, + 10, + 48, + 20, + 9, + 17, + 37, + 23, + 19, + 43, + 32, + 35, + 20, + 19, + 19, + 48, + 15, + 36, + 29, + 23, + 27, + 32, + 29, + 33, + 22, + 28, + 24, + 33, + 25, + 41, + 32, + 33, + 31, + 10, + 33, + 41, + 20, + 21, + 18, + 32, + 25, + 20, + 31, + 20, + 21, + 58, + 36, + 42, + 28, + 26, + 24, + 10, + 24, + 36, + 36, + 20, + 33, + 18, + 33, + 26, + 27, + 45, + 26, + 17, + 45, + 21, + 28, + 32, + 20, + 27, + 41, + 19, + 36, + 13, + 28, + 33, + 31, + 14, + 36, + 18, + 19, + 40, + 28, + 17, + 22, + 21, + 11, + 33, + 37, + 20, + 35, + 37, + 19, + 24, + 53, + 27, + 18, + 12, + 24, + 11, + 29, + 28, + 24, + 31, + 29, + 29, + 79, + 24, + 23, + 43, + 25, + 34, + 21, + 27, + 43, + 14, + 38, + 27, + 25, + 33, + 18, + 16, + 17, + 35, + 29, + 22, + 38, + 12, + 33, + 17, + 31, + 25, + 7, + 59, + 21, + 9, + 21, + 28, + 27, + 13, + 60, + 23, + 36, + 60, + 20, + 28, + 13, + 26, + 31, + 24, + 23, + 53, + 33, + 24, + 29, + 38, + 20, + 10, + 54, + 23, + 37, + 12, + 27, + 17, + 47, + 32, + 22, + 14, + 14, + 34, + 21, + 33, + 30, + 14, + 26, + 30, + 33, + 27, + 18, + 32, + 9, + 23, + 40, + 41, + 30, + 35, + 44, + 29, + 21, + 30, + 27, + 20, + 9, + 39, + 23, + 24, + 18, + 19 + ], + "xaxis": "x", + "yaxis": "y" + }, + { + "marker": { + "line": { + "color": "#000000", + "width": 2 + } + }, + "showlegend": false, + "type": "histogram", + "x": [ + 27, + 55, + 60, + 9, + 13, + 23, + 34, + 23, + 19, + 35, + 22, + 40, + 18, + 36, + 24, + 11, + 23, + 23, + 20, + 19, + 17, + 20, + 20, + 27, + 10, + 59, + 34, + 24, + 45, + 23, + 36, + 42, + 45, + 17, + 30, + 36, + 36, + 38, + 29, + 18, + 26, + 60, + 15, + 20, + 22, + 59, + 15, + 33, + 53, + 11, + 41, + 24, + 28, + 16, + 57, + 25, + 21, + 29, + 30, + 49, + 27, + 40, + 35, + 38, + 25, + 32, + 20, + 13, + 48, + 15, + 39, + 14, + 34, + 16, + 26, + 18, + 27, + 32, + 25, + 38, + 16, + 16, + 45, + 13, + 9, + 17, + 32, + 27, + 34, + 38, + 13, + 31, + 15, + 6, + 19, + 52, + 4, + 30, + 19, + 54, + 39, + 34, + 43, + 39, + 35, + 27, + 16, + 9, + 29, + 15, + 20, + 27, + 27, + 59, + 23, + 16, + 22, + 24, + 24, + 25, + 22, + 35, + 9, + 21, + 28, + 35, + 28, + 41, + 13, + 27, + 21, + 58, + 17, + 24, + 35, + 26, + 28, + 34, + 44, + 25, + 11, + 20, + 33, + 28, + 27, + 30, + 26, + 59, + 11, + 30, + 22, + 34, + 18, + 31, + 37, + 27, + 24, + 39, + 42, + 25, + 23, + 44, + 18, + 18, + 60, + 23, + 49, + 40, + 30, + 38, + 17, + 31, + 22, + 22, + 67, + 31, + 31, + 20, + 33, + 32, + 42, + 39, + 59, + 46, + 11, + 23, + 20, + 32, + 29, + 34, + 33, + 15, + 29, + 17, + 26, + 20, + 36, + 33, + 54, + 38, + 13, + 22, + 10, + 25, + 27, + 28, + 35, + 17, + 30, + 37, + 15, + 59, + 32, + 35, + 31, + 22, + 20, + 34, + 27, + 30, + 30, + 16, + 23, + 11, + 22, + 22, + 39, + 27, + 39, + 24, + 20, + 23, + 30, + 35, + 26, + 11, + 35, + 25, + 13, + 23, + 15, + 26, + 26, + 28, + 11, + 31, + 29, + 36, + 26, + 27, + 32, + 18, + 17, + 25, + 52, + 48, + 37, + 16, + 32, + 28, + 19, + 20, + 41, + 24, + 22, + 31, + 16, + 10, + 19, + 36, + 48, + 21, + 30, + 14, + 53, + 12, + 15, + 25, + 25, + 60, + 38, + 15, + 20, + 30, + 60, + 34, + 35, + 26, + 25, + 38, + 22, + 31, + 19, + 36, + 47, + 35, + 16, + 15, + 27, + 36, + 38, + 40, + 40, + 39, + 32, + 38, + 40, + 43, + 33, + 28, + 18, + 31, + 24, + 22, + 22, + 17, + 17, + 53, + 58, + 26, + 28, + 10, + 35, + 34, + 18, + 38, + 28, + 30, + 31, + 13, + 45, + 33, + 32, + 18, + 20, + 24, + 24, + 18, + 40, + 18, + 42, + 39, + 29, + 31, + 31, + 24, + 16, + 13, + 30, + 56, + 45, + 79, + 17, + 32, + 22, + 27, + 27, + 19, + 19, + 10, + 49, + 37, + 78, + 25, + 26, + 5, + 19, + 52, + 19, + 33, + 15, + 39, + 28, + 36, + 23, + 29, + 26, + 19, + 34, + 32, + 18, + 9, + 11, + 30, + 32, + 22, + 33, + 25, + 20, + 40, + 21, + 30, + 25, + 36, + 24, + 21, + 9, + 21, + 33, + 19, + 27, + 13, + 22, + 38, + 22, + 16, + 38, + 39, + 45, + 37, + 32, + 22, + 34, + 32, + 15, + 27, + 55, + 29, + 25, + 15, + 9, + 36, + 16, + 25, + 10, + 51, + 9, + 31, + 19, + 12, + 30, + 24, + 20, + 46, + 15, + 19, + 23, + 34, + 20, + 18, + 26, + 29, + 29, + 26, + 15, + 16, + 13, + 14, + 27, + 24, + 33, + 32, + 18, + 49, + 41, + 39, + 28, + 28, + 26, + 15, + 20, + 21, + 23, + 19, + 47, + 36, + 31, + 46, + 10, + 32, + 33, + 22, + 23, + 32, + 30, + 27, + 35, + 34, + 35, + 24, + 17, + 30, + 29, + 36, + 23, + 15, + 27, + 19, + 24, + 27, + 23, + 29, + 39, + 31, + 18, + 30, + 34, + 17, + 39, + 17, + 22, + 18, + 20, + 37, + 33, + 20, + 27, + 17, + 19, + 27, + 34, + 24, + 38, + 11, + 59, + 22, + 60, + 35, + 18, + 25, + 28, + 19, + 24, + 20, + 35, + 9, + 58, + 36, + 41, + 20, + 33, + 32, + 46, + 21, + 36, + 28, + 37, + 29, + 8, + 30, + 14, + 41, + 39, + 37, + 44, + 21, + 49, + 23, + 40, + 21, + 20, + 38, + 34, + 29, + 22, + 20, + 14, + 59, + 32, + 47, + 30, + 27, + 32, + 7, + 13, + 19, + 22, + 24, + 10, + 20, + 15, + 29, + 23, + 51, + 26, + 24, + 25, + 19, + 14, + 27, + 16, + 32, + 78, + 60, + 20, + 39, + 31, + 32, + 40, + 16, + 29, + 41, + 33, + 20, + 44, + 25, + 13, + 30, + 23, + 23, + 27, + 22, + 37, + 8, + 13, + 22, + 16, + 15, + 18, + 40, + 25, + 30, + 14, + 30, + 34, + 39, + 23, + 33, + 58, + 38, + 33, + 20, + 34, + 39, + 26, + 23, + 21, + 24, + 19, + 28, + 26, + 38, + 25, + 41, + 33, + 23, + 40, + 31, + 32, + 18, + 36, + 17, + 19, + 21, + 31, + 30, + 35, + 33, + 15, + 22, + 45, + 31, + 64, + 33, + 38, + 24, + 20, + 36, + 23, + 30, + 15, + 26, + 21, + 35, + 15, + 22, + 34, + 9, + 25, + 38, + 36, + 22, + 18, + 23, + 14, + 19, + 24, + 16, + 28, + 42, + 24, + 16, + 25, + 27, + 13, + 28, + 23, + 15, + 27, + 25, + 13, + 27, + 29, + 32, + 37, + 19, + 23, + 34, + 28, + 30, + 29, + 29, + 26, + 15, + 35, + 28, + 26, + 24, + 20, + 32, + 60, + 27, + 29, + 30, + 19, + 16, + 20, + 35, + 8, + 20, + 20, + 19, + 15, + 15, + 21, + 44, + 18, + 27, + 26, + 30, + 16, + 39, + 59, + 31, + 12, + 62, + 22, + 72, + 63, + 18, + 45, + 22, + 44, + 28, + 21, + 32, + 27, + 23, + 57, + 22, + 18, + 25, + 29, + 33, + 17, + 19, + 31, + 24, + 49, + 15, + 36, + 35, + 29, + 42, + 22, + 28, + 21, + 20, + 27, + 40, + 14, + 33, + 23, + 32, + 28, + 26, + 18, + 21, + 44, + 11, + 26, + 17, + 17, + 22, + 24, + 24, + 55, + 19, + 78, + 42, + 16, + 27, + 52, + 26, + 33, + 19, + 8, + 25, + 25, + 30, + 19, + 20, + 22, + 18, + 25, + 35, + 24, + 22, + 14, + 28, + 45, + 14, + 31, + 28, + 25, + 28, + 15, + 44, + 59, + 31, + 20, + 38, + 36, + 59, + 11, + 39, + 43, + 18, + 22, + 20, + 25, + 35, + 38, + 30, + 19, + 30, + 20, + 32, + 48, + 28, + 44, + 32, + 32, + 24, + 24, + 33, + 31, + 32, + 21, + 11, + 34, + 26, + 41, + 24, + 20, + 18, + 14, + 55, + 20, + 11, + 27, + 15, + 29, + 20, + 35, + 26, + 51, + 44, + 36, + 23, + 46, + 31, + 29, + 21, + 53, + 39, + 33, + 40, + 21, + 19, + 32, + 21, + 29, + 10, + 27, + 38, + 33, + 20, + 37, + 31, + 36, + 40, + 25, + 41, + 22, + 26, + 21, + 27, + 13, + 22, + 15, + 26, + 31, + 44, + 38, + 21, + 25, + 30, + 23, + 23, + 16, + 30, + 18, + 17, + 30, + 37, + 24, + 21, + 36, + 29, + 30, + 41, + 27, + 21, + 10, + 32, + 24, + 29, + 15, + 61, + 40, + 33, + 21, + 15, + 16, + 16, + 30, + 44, + 16, + 31, + 14, + 17, + 22, + 53, + 23, + 27, + 28, + 28, + 35, + 16, + 20, + 15, + 20, + 32, + 15, + 23, + 36, + 26, + 26, + 30, + 21, + 30, + 39, + 58, + 9, + 23, + 50, + 34, + 27, + 17, + 35, + 30, + 36, + 19, + 28, + 34, + 28, + 28, + 46, + 48, + 9, + 22, + 48, + 38, + 36, + 15, + 35, + 13, + 33, + 38, + 53, + 30, + 19, + 26, + 23, + 29, + 29, + 40, + 35, + 25, + 26, + 23, + 7, + 22, + 26, + 30, + 21, + 15, + 37, + 17, + 17, + 23, + 27, + 19, + 31, + 48, + 27, + 16, + 21, + 36, + 34, + 26, + 13, + 16, + 17, + 30, + 40, + 19, + 35, + 31, + 20, + 27, + 23, + 23, + 27, + 30, + 36, + 42, + 20, + 57, + 15, + 45, + 21, + 33, + 19, + 40, + 12, + 39, + 33, + 27, + 33, + 27, + 16, + 33, + 19, + 18, + 29, + 39, + 26, + 26, + 37, + 45, + 21, + 19, + 22, + 11, + 28, + 17, + 30, + 18, + 21, + 17, + 21, + 35, + 20, + 24, + 20, + 28, + 35, + 59, + 15, + 38, + 17, + 32, + 12, + 17, + 39, + 35, + 22, + 34, + 53, + 29, + 37, + 32, + 9, + 19, + 62, + 37, + 54, + 25, + 37, + 33, + 25, + 34, + 14, + 17, + 26, + 29, + 22, + 68, + 16, + 53, + 59, + 16, + 32, + 18, + 11, + 30, + 18, + 36, + 21, + 22, + 16, + 34, + 22, + 27, + 36, + 40, + 22, + 20, + 27, + 21, + 35, + 20, + 45, + 20, + 30, + 21, + 35, + 12, + 30, + 37, + 23, + 28, + 24, + 21, + 21, + 49, + 24, + 26, + 24, + 39, + 14, + 20, + 30, + 27, + 63, + 23, + 15, + 26, + 43, + 24, + 21, + 47, + 24, + 40, + 38, + 30, + 32, + 20, + 24, + 31, + 22, + 20, + 14, + 34, + 47, + 35, + 12, + 31, + 25, + 26, + 9, + 47, + 20, + 20, + 20, + 27, + 29, + 15, + 23, + 27, + 22, + 34, + 15, + 16, + 14, + 29, + 28, + 27, + 23, + 9, + 36, + 32, + 32, + 17, + 37, + 28, + 13, + 31, + 69, + 36, + 22, + 38, + 26, + 33, + 10, + 30, + 22, + 36, + 30, + 25, + 23, + 28, + 5, + 21, + 40, + 25, + 24, + 33, + 38, + 22, + 19, + 52, + 45, + 23, + 15, + 38, + 22, + 22, + 39, + 22, + 20, + 33, + 29, + 15, + 17, + 24, + 31, + 15, + 39, + 14, + 20, + 19, + 20, + 23, + 60, + 52, + 27, + 25, + 26, + 19, + 16, + 12, + 18, + 60, + 52, + 26, + 19, + 30, + 21, + 29, + 30, + 29, + 40, + 14, + 20, + 35, + 29, + 19, + 21, + 46, + 53, + 35, + 23, + 28, + 18, + 18, + 30, + 17, + 26, + 22, + 25, + 29, + 30, + 33, + 11, + 11, + 28, + 15, + 17, + 15, + 23, + 27, + 29, + 46, + 23, + 18, + 19, + 33, + 60, + 19, + 22, + 26, + 22, + 22, + 20, + 44, + 25, + 33, + 23, + 36, + 36, + 38, + 45, + 24, + 24, + 23, + 31, + 47, + 15, + 15, + 22, + 31, + 19, + 20, + 26, + 10, + 34, + 17, + 11, + 48, + 28, + 20, + 24, + 20, + 21, + 18, + 20, + 23, + 14, + 23, + 32, + 27, + 20, + 40, + 23, + 39, + 37, + 18, + 26, + 29, + 43, + 7, + 35, + 18, + 19, + 20, + 18, + 26, + 27, + 14, + 19, + 19, + 18, + 13, + 12, + 29, + 45, + 25, + 36, + 35, + 29, + 22, + 15, + 15, + 12, + 12, + 30, + 9, + 43, + 32, + 9, + 20, + 21, + 21, + 26, + 29, + 18, + 22, + 10, + 50, + 35, + 39, + 24, + 30, + 33, + 54, + 57, + 25, + 15, + 22, + 24, + 23, + 19, + 63, + 9, + 43, + 21, + 13, + 21, + 13, + 44, + 15, + 68, + 18, + 22, + 23, + 15, + 28, + 33, + 26, + 29, + 20, + 19, + 51, + 21, + 19, + 28, + 26, + 39, + 25, + 33, + 33, + 56, + 34, + 24, + 24, + 11, + 35, + 35, + 15, + 21, + 23, + 19, + 37, + 26, + 49, + 32, + 19, + 29, + 26, + 26, + 32, + 45, + 28, + 21, + 24, + 20, + 35, + 17, + 29, + 26, + 25, + 31, + 18, + 53, + 17, + 15, + 31, + 25, + 28, + 36, + 39, + 19, + 18, + 23, + 26, + 23, + 24, + 22, + 38, + 9, + 26, + 31, + 27, + 58, + 39, + 25, + 34, + 17, + 15, + 39, + 27, + 21, + 34, + 34, + 39, + 20, + 44, + 20, + 14, + 13, + 34, + 16, + 34, + 36, + 59, + 20, + 32, + 39, + 59, + 28, + 21, + 45, + 22, + 34, + 8, + 14, + 43, + 22, + 70, + 16, + 31, + 26, + 34, + 23, + 21, + 24, + 20, + 37, + 50, + 8, + 40, + 33, + 33, + 20, + 11, + 23, + 22, + 13, + 30, + 34, + 36, + 18, + 40, + 20, + 53, + 24, + 24, + 18, + 14, + 24, + 38, + 20, + 48, + 22, + 39, + 32, + 22, + 50, + 11, + 18, + 35, + 19, + 45, + 24, + 37, + 20, + 28, + 18, + 19, + 23, + 15, + 27, + 19, + 28, + 22, + 19, + 37, + 20, + 31, + 27, + 26, + 38, + 11, + 26, + 36, + 41, + 39, + 36, + 38, + 21, + 25, + 38, + 28, + 22, + 7, + 21, + 28, + 29, + 21, + 27 + ], + "xaxis": "x2", + "yaxis": "y2" + } + ], + "layout": { + "annotations": [ + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Description X Length", + "x": 0.225, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Description Y Length", + "x": 0.775, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + } + ], + "autosize": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "rgb(36,36,36)" + }, + "error_y": { + "color": "rgb(36,36,36)" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "rgb(36,36,36)", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "rgb(36,36,36)" + }, + "baxis": { + "endlinecolor": "rgb(36,36,36)", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "rgb(36,36,36)" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.6 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "rgb(237,237,237)" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "rgb(217,217,217)" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "rgb(103,0,31)" + ], + [ + 0.1, + "rgb(178,24,43)" + ], + [ + 0.2, + "rgb(214,96,77)" + ], + [ + 0.3, + "rgb(244,165,130)" + ], + [ + 0.4, + "rgb(253,219,199)" + ], + [ + 0.5, + "rgb(247,247,247)" + ], + [ + 0.6, + "rgb(209,229,240)" + ], + [ + 0.7, + "rgb(146,197,222)" + ], + [ + 0.8, + "rgb(67,147,195)" + ], + [ + 0.9, + "rgb(33,102,172)" + ], + [ + 1, + "rgb(5,48,97)" + ] + ], + "sequential": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "sequentialminus": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ] + }, + "colorway": [ + "#1F77B4", + "#FF7F0E", + "#2CA02C", + "#D62728", + "#9467BD", + "#8C564B", + "#E377C2", + "#7F7F7F", + "#BCBD22", + "#17BECF" + ], + "font": { + "color": "rgb(36,36,36)" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + } + }, + "shapedefaults": { + "fillcolor": "black", + "line": { + "width": 0 + }, + "opacity": 0.3 + }, + "ternary": { + "aaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "baxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside", + "title": { + "standoff": 15 + }, + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "yaxis": { + "automargin": true, + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside", + "title": { + "standoff": 15 + }, + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + } + } + }, + "title": { + "text": "Character length distribution for True Security", + "x": 0.5, + "xanchor": "center", + "y": 0.9, + "yanchor": "top" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 0.45 + ] + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0.55, + 1 + ] + }, + "yaxis": { + "anchor": "x", + "automargin": true, + "domain": [ + 0, + 1 + ], + "title": { + "text": "Frequency" + } + }, + "yaxis2": { + "anchor": "x2", + "automargin": true, + "domain": [ + 0, + 1 + ] + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_true = data.query('same_security == True')\n", + "histogram_subplot(data_true, data_true, 'len_x', 'len_y', \n", + " 'Character length distribution for True Security', \n", + " 'Description X Length', 'Description Y Length')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sentences that are True on the comparing, have a similar distribution, even on the frequency for the values, for now, seems a good idea use the character length as a feature.
\n", + "To make this idea better, let's check it for the False values." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": false + }, + "data": [ + { + "marker": { + "line": { + "color": "#000000", + "width": 2 + } + }, + "showlegend": false, + "type": "histogram", + "x": [ + 28, + 52, + 40, + 39, + 56, + 20, + 17, + 24, + 38, + 31, + 19, + 31, + 37, + 40, + 56, + 39, + 31, + 47, + 34, + 28, + 23, + 22, + 32, + 30, + 36, + 40, + 35, + 49, + 56, + 30, + 24, + 63, + 20, + 27, + 17, + 36, + 43, + 34, + 50, + 26, + 29, + 40, + 26, + 35, + 15, + 44, + 17, + 23, + 38, + 17, + 19, + 20, + 31, + 46, + 36, + 49, + 29, + 37, + 40, + 36, + 19, + 28, + 19, + 43, + 39, + 46, + 29, + 32, + 23, + 20, + 26, + 38, + 15, + 24, + 24, + 28, + 28, + 60, + 38, + 28, + 40, + 25, + 36, + 29, + 36, + 24, + 29, + 28, + 46, + 33, + 49, + 32, + 52, + 33, + 40, + 36, + 63, + 51, + 40, + 22, + 33, + 25, + 20, + 33, + 33, + 34, + 62, + 28, + 31, + 24, + 36, + 32, + 39, + 27, + 24, + 33, + 52, + 35, + 29, + 29, + 40, + 17, + 35, + 49, + 16, + 28, + 28, + 32, + 29, + 48, + 39, + 31, + 32, + 40, + 28, + 24, + 56, + 21, + 43, + 27, + 63, + 15, + 34, + 35, + 45, + 22, + 45, + 35, + 33, + 25, + 17, + 24, + 24, + 20, + 31, + 50, + 22, + 18, + 37, + 31, + 44, + 28, + 24, + 34, + 23, + 44, + 20, + 29, + 15, + 30, + 23, + 50, + 36, + 17, + 25, + 34, + 28, + 17, + 22, + 34, + 30, + 23, + 22, + 28, + 28, + 29, + 42, + 17, + 26, + 19, + 24, + 24, + 32, + 30, + 34, + 38, + 20, + 38, + 24, + 40, + 24, + 63, + 33, + 42, + 17, + 42, + 33, + 45, + 35, + 20, + 25, + 30, + 51, + 44, + 30, + 17, + 27, + 27, + 20, + 19, + 18, + 39, + 62, + 11, + 36, + 29, + 20, + 19, + 25, + 44, + 31, + 56, + 20, + 30, + 45, + 26, + 24, + 57, + 30, + 18, + 28, + 28, + 28, + 31, + 31, + 25, + 34, + 52, + 40, + 25, + 34, + 39, + 14, + 34, + 29, + 36, + 28, + 17, + 34, + 38, + 71, + 39, + 69, + 40, + 40, + 44, + 19, + 49, + 43, + 29, + 20, + 38, + 32, + 24, + 34, + 33, + 19, + 38, + 37, + 38, + 19, + 20, + 38, + 14, + 45, + 52, + 20, + 26, + 33, + 22, + 29, + 27, + 28, + 31, + 57, + 30, + 22, + 25, + 29, + 19, + 25, + 32, + 19, + 33, + 33, + 36, + 48, + 52, + 30, + 35, + 37, + 28, + 24, + 31, + 32, + 19, + 26, + 32, + 20, + 26, + 18, + 18, + 28, + 32, + 50, + 14, + 24, + 24, + 28, + 33, + 36, + 23, + 34, + 40, + 28, + 35, + 52, + 35, + 29, + 25, + 25, + 15, + 37, + 30, + 57, + 24, + 45, + 36, + 22, + 24, + 43, + 26, + 62, + 25, + 34, + 16, + 11, + 34, + 31, + 30, + 20, + 44, + 36, + 29, + 30, + 45, + 30, + 24, + 32, + 49, + 16, + 17, + 24, + 22, + 24, + 36, + 58, + 20, + 56, + 20, + 34, + 29, + 36, + 20, + 36, + 22, + 24, + 40, + 28, + 63, + 49, + 32, + 55, + 31, + 37, + 30, + 32, + 28, + 33, + 29, + 39, + 40, + 40, + 38, + 29, + 21, + 40, + 19, + 39, + 20, + 43, + 20, + 41, + 20, + 44, + 20, + 24, + 22, + 31, + 26, + 40, + 26, + 24, + 23, + 33, + 38, + 35, + 31, + 32, + 35, + 30, + 29, + 31, + 30, + 20, + 28, + 31, + 39, + 37, + 36, + 34, + 38, + 57, + 24, + 36, + 17, + 17, + 50, + 29, + 34, + 58, + 33, + 20, + 50, + 40, + 32, + 39, + 49, + 28, + 39, + 56, + 42, + 31, + 17, + 24, + 36, + 35, + 32, + 21, + 33, + 36, + 31, + 29, + 49, + 20, + 24, + 35, + 35, + 40, + 40, + 30, + 26, + 30, + 30, + 20, + 33, + 17, + 18, + 39, + 23, + 25, + 28, + 21, + 28, + 29, + 39, + 28, + 34, + 24, + 33, + 20, + 44, + 22, + 29, + 16, + 52, + 40, + 25, + 29, + 24, + 60, + 40, + 28, + 25, + 40, + 26, + 22, + 33, + 26, + 20, + 32, + 20, + 28, + 17, + 26, + 39, + 37, + 26, + 52 + ], + "xaxis": "x", + "yaxis": "y" + }, + { + "marker": { + "line": { + "color": "#000000", + "width": 2 + } + }, + "showlegend": false, + "type": "histogram", + "x": [ + 34, + 40, + 38, + 31, + 32, + 30, + 33, + 18, + 20, + 28, + 39, + 23, + 36, + 53, + 32, + 39, + 29, + 19, + 31, + 20, + 20, + 18, + 26, + 50, + 58, + 40, + 53, + 32, + 53, + 27, + 33, + 38, + 38, + 30, + 14, + 38, + 48, + 31, + 28, + 37, + 20, + 36, + 25, + 30, + 14, + 29, + 20, + 25, + 21, + 18, + 26, + 28, + 41, + 38, + 63, + 33, + 37, + 52, + 38, + 63, + 36, + 39, + 20, + 35, + 38, + 36, + 53, + 53, + 24, + 39, + 20, + 39, + 22, + 30, + 38, + 34, + 37, + 59, + 20, + 25, + 63, + 38, + 34, + 56, + 26, + 26, + 20, + 20, + 50, + 42, + 36, + 22, + 56, + 26, + 24, + 19, + 32, + 38, + 64, + 17, + 21, + 13, + 27, + 31, + 18, + 28, + 36, + 39, + 30, + 28, + 20, + 23, + 20, + 30, + 34, + 32, + 37, + 30, + 38, + 36, + 40, + 18, + 58, + 32, + 29, + 47, + 20, + 20, + 34, + 33, + 39, + 42, + 38, + 20, + 39, + 27, + 38, + 13, + 33, + 22, + 36, + 18, + 20, + 20, + 44, + 18, + 50, + 56, + 18, + 19, + 30, + 20, + 29, + 41, + 33, + 50, + 20, + 37, + 30, + 23, + 49, + 20, + 25, + 13, + 26, + 20, + 27, + 40, + 27, + 20, + 31, + 39, + 53, + 30, + 39, + 20, + 20, + 20, + 14, + 20, + 40, + 33, + 27, + 24, + 18, + 56, + 25, + 24, + 20, + 38, + 28, + 14, + 20, + 36, + 53, + 31, + 38, + 31, + 36, + 38, + 29, + 36, + 24, + 46, + 28, + 33, + 16, + 31, + 23, + 36, + 50, + 53, + 20, + 35, + 21, + 20, + 37, + 30, + 32, + 32, + 23, + 36, + 27, + 19, + 20, + 50, + 38, + 34, + 28, + 46, + 21, + 36, + 25, + 27, + 68, + 24, + 33, + 32, + 50, + 27, + 38, + 50, + 20, + 37, + 24, + 34, + 38, + 34, + 53, + 21, + 30, + 34, + 22, + 35, + 30, + 30, + 20, + 27, + 38, + 20, + 38, + 30, + 45, + 56, + 34, + 47, + 15, + 50, + 33, + 58, + 28, + 42, + 24, + 37, + 63, + 25, + 38, + 29, + 40, + 38, + 20, + 32, + 36, + 18, + 38, + 32, + 38, + 18, + 27, + 27, + 19, + 39, + 39, + 20, + 46, + 56, + 40, + 39, + 28, + 19, + 29, + 20, + 29, + 19, + 31, + 58, + 43, + 20, + 63, + 20, + 45, + 25, + 39, + 36, + 27, + 36, + 22, + 36, + 25, + 18, + 27, + 21, + 37, + 47, + 46, + 17, + 37, + 19, + 18, + 27, + 56, + 41, + 58, + 53, + 50, + 63, + 63, + 40, + 20, + 36, + 20, + 18, + 39, + 39, + 38, + 23, + 45, + 38, + 15, + 24, + 43, + 17, + 64, + 19, + 46, + 20, + 17, + 63, + 31, + 25, + 40, + 31, + 56, + 34, + 28, + 30, + 32, + 53, + 33, + 28, + 39, + 30, + 25, + 36, + 25, + 52, + 36, + 30, + 32, + 50, + 57, + 63, + 20, + 40, + 31, + 27, + 20, + 50, + 24, + 27, + 57, + 16, + 39, + 49, + 20, + 38, + 32, + 20, + 34, + 39, + 31, + 19, + 20, + 32, + 38, + 21, + 39, + 46, + 20, + 36, + 21, + 25, + 31, + 36, + 39, + 40, + 28, + 29, + 31, + 19, + 30, + 27, + 20, + 19, + 41, + 32, + 20, + 43, + 27, + 28, + 20, + 63, + 31, + 25, + 53, + 36, + 21, + 50, + 19, + 38, + 56, + 41, + 39, + 30, + 33, + 22, + 26, + 30, + 32, + 32, + 38, + 40, + 37, + 32, + 20, + 30, + 33, + 20, + 39, + 19, + 28, + 33, + 33, + 27, + 28, + 40, + 58, + 20, + 14, + 30, + 20, + 52, + 20, + 32, + 19, + 20, + 38, + 20, + 30, + 20, + 36, + 20, + 26, + 28, + 56, + 17, + 23, + 17, + 20, + 31, + 40, + 30, + 17, + 20, + 35, + 50, + 20, + 56, + 28, + 39, + 33, + 39, + 22, + 28, + 27, + 30, + 30, + 26, + 58, + 20, + 60, + 27, + 39, + 34, + 58, + 14, + 18, + 20, + 18, + 36, + 18, + 37, + 30, + 28, + 27, + 30, + 20, + 30, + 33 + ], + "xaxis": "x2", + "yaxis": "y2" + } + ], + "layout": { + "annotations": [ + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Description X Length", + "x": 0.225, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 16 + }, + "showarrow": false, + "text": "Description Y Length", + "x": 0.775, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + } + ], + "autosize": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "rgb(36,36,36)" + }, + "error_y": { + "color": "rgb(36,36,36)" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "rgb(36,36,36)", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "rgb(36,36,36)" + }, + "baxis": { + "endlinecolor": "rgb(36,36,36)", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "rgb(36,36,36)" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.6 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "rgb(237,237,237)" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "rgb(217,217,217)" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 1, + "tickcolor": "rgb(36,36,36)", + "ticks": "outside" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "rgb(103,0,31)" + ], + [ + 0.1, + "rgb(178,24,43)" + ], + [ + 0.2, + "rgb(214,96,77)" + ], + [ + 0.3, + "rgb(244,165,130)" + ], + [ + 0.4, + "rgb(253,219,199)" + ], + [ + 0.5, + "rgb(247,247,247)" + ], + [ + 0.6, + "rgb(209,229,240)" + ], + [ + 0.7, + "rgb(146,197,222)" + ], + [ + 0.8, + "rgb(67,147,195)" + ], + [ + 0.9, + "rgb(33,102,172)" + ], + [ + 1, + "rgb(5,48,97)" + ] + ], + "sequential": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "sequentialminus": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ] + }, + "colorway": [ + "#1F77B4", + "#FF7F0E", + "#2CA02C", + "#D62728", + "#9467BD", + "#8C564B", + "#E377C2", + "#7F7F7F", + "#BCBD22", + "#17BECF" + ], + "font": { + "color": "rgb(36,36,36)" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "rgb(232,232,232)", + "gridwidth": 2, + "linecolor": "rgb(36,36,36)", + "showbackground": true, + "showgrid": false, + "showline": true, + "ticks": "outside", + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + } + }, + "shapedefaults": { + "fillcolor": "black", + "line": { + "width": 0 + }, + "opacity": 0.3 + }, + "ternary": { + "aaxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "baxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside", + "title": { + "standoff": 15 + }, + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + }, + "yaxis": { + "automargin": true, + "gridcolor": "rgb(232,232,232)", + "linecolor": "rgb(36,36,36)", + "showgrid": false, + "showline": true, + "ticks": "outside", + "title": { + "standoff": 15 + }, + "zeroline": false, + "zerolinecolor": "rgb(36,36,36)" + } + } + }, + "title": { + "text": "Character length distribution for False Security", + "x": 0.5, + "xanchor": "center", + "y": 0.9, + "yanchor": "top" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 0.45 + ] + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0.55, + 1 + ] + }, + "yaxis": { + "anchor": "x", + "automargin": true, + "domain": [ + 0, + 1 + ], + "title": { + "text": "Frequency" + } + }, + "yaxis2": { + "anchor": "x2", + "automargin": true, + "domain": [ + 0, + 1 + ] + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_false = data.query('same_security == False')\n", + "histogram_subplot(data_false, data_false, 'len_x', 'len_y', \n", + " 'Character length distribution for False Security', \n", + " 'Description X Length', 'Description Y Length')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And for the False values the distribution for each sentence is different, I will use both features about the character length to feed the model." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Model Build\n", + "PyCaret has a NLP module that can automatize most of the boring stuff, like lowering case, remove stop words, stemming, etc. So, a good amount of this part is just setting up PyCaret to run.
\n", + "Let's import the module." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from pycaret.nlp import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The PyCaret setup is simple, just enter data, the text target to process and a random seed for the session.
\n", + "It's possible to add custom stop words, but I will use the default from PyCaret.
\n", + "Let's start with the text from `description_x`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Description Value
session_id42
Documents2142
Vocab Size310
Custom StopwordsFalse
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exp_x = setup(data=data, target='description_x', session_id=RANDOM_SEED)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are 310 words present in the vocabulary for `sentence_x`.
\n", + "To get the features for the model, is used a Topic Modelling with PyCaret, for it, the model is tuned (LDA Model) to see what is the best number of topics." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "IntProgress(value=0, description='Processing: ', max=25)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9c4d66da6add4e4fadd70930b483a6ec", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Metric=Accuracy
# Topics=%{x}
Score=%{y}", + "legendgroup": "Accuracy", + "line": { + "color": "#636efa", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Accuracy", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8697478991596639, + 0.861811391223156, + 0.8408029878618114, + 0.8524743230625583, + 0.8585434173669467, + 0.8552754435107376, + 0.8632119514472456, + 0.8674136321195145, + 0.8646125116713352, + 0.8650793650793651 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=AUC
# Topics=%{x}
Score=%{y}", + "legendgroup": "AUC", + "line": { + "color": "#EF553B", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "AUC", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8883908742413072, + 0.8811997745163647, + 0.8552504052025309, + 0.8707846338293428, + 0.8904535104075231, + 0.8887694148559027, + 0.8940865627457437, + 0.8964169900278574, + 0.8953048072314149, + 0.8966713036915328 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Recall
# Topics=%{x}
Score=%{y}", + "legendgroup": "Recall", + "line": { + "color": "#00cc96", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Recall", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.9820210787352759, + 0.9845009299442034, + 0.9783013019218847, + 0.9714817110973342, + 0.9758214507129572, + 0.977061376317421, + 0.9851208927464352, + 0.9869807811531308, + 0.9851208927464352, + 0.9857408555486671 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Precision
# Topics=%{x}
Score=%{y}", + "legendgroup": "Precision", + "line": { + "color": "#ab63fa", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Precision", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8636859323882224, + 0.8542227003765466, + 0.8375796178343949, + 0.8530212302667393, + 0.8563656147986942, + 0.8523526230394808, + 0.8552206673842842, + 0.8582210242587601, + 0.8566037735849057, + 0.8566810344827587 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=F1
# Topics=%{x}
Score=%{y}", + "legendgroup": "F1", + "line": { + "color": "#FFA15A", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "F1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.9190600522193212, + 0.9147465437788018, + 0.902487846725765, + 0.9084057971014493, + 0.9121993625036221, + 0.9104563835932986, + 0.9155862863728033, + 0.9181084198385238, + 0.9163783160322952, + 0.9166906889593543 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Kappa
# Topics=%{x}
Score=%{y}", + "legendgroup": "Kappa", + "line": { + "color": "#19d3f3", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Kappa", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.592622989931765, + 0.5596663634027599, + 0.48299322616949436, + 0.5375729809569745, + 0.5562682630341831, + 0.5422856079353153, + 0.5644570963806426, + 0.5787861456586435, + 0.5698872614119951, + 0.5710484484548298 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Metric" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "plot_bgcolor": "rgb(245,245,245)", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Logistic Regression Metrics and # of Topics", + "x": 0.45, + "xanchor": "center", + "y": 0.95, + "yanchor": "top" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "# Topics" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "range": [ + 0, + 1 + ], + "title": { + "text": "Score" + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Model: Latent Dirichlet Allocation | # Topics: 2 | Accuracy : 0.8697\n" + ] + } + ], + "source": [ + "tuned_model_x = tune_model(model='lda', supervised_target='same_security')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Based on the F1-Score, the model doesn't have a high variation on the score, so I will use 4 topics, to keep it simples.
\n", + "Time to create a LDA model with 4 topics and see some informations about the topic modelled data.
\n", + "You can click on each box to see infos like frequency of a word, word cloud, etc.
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "model_x = create_model('lda', num_topics=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model is assigned to the topic weights and other infos to use after in the classification task." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "model_x_results = assign_model(model_x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, all the steps are made again for the `description_y`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Description Value
session_id42
Documents2142
Vocab Size310
Custom StopwordsFalse
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exp_y = setup(data=data, target='description_y', session_id=RANDOM_SEED)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, 310 words are present in the vocabulary for `sentence_y`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "IntProgress(value=0, description='Processing: ', max=25)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0994d638bdac48d2a680f9252651ebdd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Metric=Accuracy
# Topics=%{x}
Score=%{y}", + "legendgroup": "Accuracy", + "line": { + "color": "#636efa", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Accuracy", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8389355742296919, + 0.8277310924369747, + 0.8361344537815126, + 0.8361344537815126, + 0.8380018674136321, + 0.8440709617180205, + 0.8417366946778712, + 0.8412698412698413, + 0.8417366946778712, + 0.842203548085901 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=AUC
# Topics=%{x}
Score=%{y}", + "legendgroup": "AUC", + "line": { + "color": "#EF553B", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "AUC", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8582394697149929, + 0.8400226421197337, + 0.8410164577270922, + 0.8647273980196349, + 0.8619686221473216, + 0.8498295395281954, + 0.8633450802025603, + 0.8680088646477052, + 0.8681202001225863, + 0.8680264439332128 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Recall
# Topics=%{x}
Score=%{y}", + "legendgroup": "Recall", + "line": { + "color": "#00cc96", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Recall", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.9820210787352759, + 0.9646621202727836, + 0.972101673899566, + 0.9615623062616243, + 0.9578425294482331, + 0.9764414135151891, + 0.9807811531308122, + 0.977061376317421, + 0.9776813391196528, + 0.9776813391196528 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Precision
# Topics=%{x}
Score=%{y}", + "legendgroup": "Precision", + "line": { + "color": "#ab63fa", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Precision", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.8336842105263158, + 0.8329764453961456, + 0.8367129135538954, + 0.8429347826086957, + 0.8470394736842105, + 0.8417958311063602, + 0.837037037037037, + 0.8387440127727515, + 0.8388297872340426, + 0.8392762107503992 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=F1
# Topics=%{x}
Score=%{y}", + "legendgroup": "F1", + "line": { + "color": "#FFA15A", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "F1", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.9017933390264732, + 0.8939959781671935, + 0.8993404072268426, + 0.898349261511729, + 0.8990398603433226, + 0.9041331802525833, + 0.9032258064516129, + 0.9026345933562429, + 0.9029487546521615, + 0.9032073310423825 + ], + "yaxis": "y" + }, + { + "hovertemplate": "Metric=Kappa
# Topics=%{x}
Score=%{y}", + "legendgroup": "Kappa", + "line": { + "color": "#19d3f3", + "dash": "solid", + "shape": "linear" + }, + "mode": "lines", + "name": "Kappa", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 2, + 4, + 8, + 16, + 32, + 64, + 100, + 200, + 300, + 400 + ], + "xaxis": "x", + "y": [ + 0.47042737590705774, + 0.44732591491426676, + 0.4718838462240891, + 0.4852110872682107, + 0.4970504049856884, + 0.4986074531741237, + 0.4836484186004838, + 0.48647943534455407, + 0.4875981387681829, + 0.4895001445484096 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Metric" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "plot_bgcolor": "rgb(245,245,245)", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Logistic Regression Metrics and # of Topics", + "x": 0.45, + "xanchor": "center", + "y": 0.95, + "yanchor": "top" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "# Topics" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "range": [ + 0, + 1 + ], + "title": { + "text": "Score" + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Model: Latent Dirichlet Allocation | # Topics: 64 | Accuracy : 0.8441\n" + ] + } + ], + "source": [ + "tuned_model_y = tune_model(model='lda', supervised_target='same_security')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result from the tuned model is similar from before, so 4 topics is used again." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "model_y = create_model('lda', num_topics=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And assign the topics to the model." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "model_y_results = assign_model(model_y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Topic Modelling made and is time to make the classification." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Classification\n", + "To start, the unused columns are dropped and the results are concatenated in one dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "data_topics = model_x_results.drop(columns=['description_x', 'description_y', \n", + " 'Dominant_Topic', 'Perc_Dominant_Topic'])\n", + "data_topics['Topic_0_y'] = model_y_results['Topic_0']\n", + "data_topics['Topic_1_y'] = model_y_results['Topic_1']\n", + "data_topics['Topic_2_y'] = model_y_results['Topic_2']\n", + "data_topics['Topic_3_y'] = model_y_results['Topic_3']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To avoid errors with PyCaret on the label feature, `same_security` is converted to object and the labels are renamed to `Yes` for `True` and `No` for `False`.
\n", + "10% of the data is sampled to be used as unseen data to validate the final model." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
same_securitylen_xlen_yTopic_0Topic_1Topic_2Topic_3Topic_0_yTopic_1_yTopic_2_yTopic_3_y
0Yes30270.2722330.1629070.1563050.4085550.0566940.1232930.0663830.753630
1Yes35550.0889630.0531990.2198100.6380280.4607000.1775480.1899380.171814
2No28340.3879180.0801650.0769170.4550000.0565840.7450600.0661870.132170
3Yes53600.2722330.1629070.1563050.4085550.0345590.3201990.5786830.066559
4Yes1690.2722330.1629070.1563050.4085550.1611750.3476400.1885250.302660
\n", + "
" + ], + "text/plain": [ + " same_security len_x len_y Topic_0 Topic_1 Topic_2 Topic_3 \\\n", + "0 Yes 30 27 0.272233 0.162907 0.156305 0.408555 \n", + "1 Yes 35 55 0.088963 0.053199 0.219810 0.638028 \n", + "2 No 28 34 0.387918 0.080165 0.076917 0.455000 \n", + "3 Yes 53 60 0.272233 0.162907 0.156305 0.408555 \n", + "4 Yes 16 9 0.272233 0.162907 0.156305 0.408555 \n", + "\n", + " Topic_0_y Topic_1_y Topic_2_y Topic_3_y \n", + "0 0.056694 0.123293 0.066383 0.753630 \n", + "1 0.460700 0.177548 0.189938 0.171814 \n", + "2 0.056584 0.745060 0.066187 0.132170 \n", + "3 0.034559 0.320199 0.578683 0.066559 \n", + "4 0.161175 0.347640 0.188525 0.302660 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pycaret.classification import *\n", + "\n", + "data_topics['same_security'] = data_topics['same_security'].astype('str')\n", + "data_topics_dict = {'True' : 'Yes', 'False' : 'No'}\n", + "data_topics['same_security'] = data_topics['same_security'].replace(data_topics_dict)\n", + "train, unseen = data_sampling(data_topics, 0.9, RANDOM_SEED)\n", + "data_topics.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The same setting up from before, but now PyCaret split the dataset in 70% for Train and 30% for Test.
\n", + "No feature transformation, scalling or normalization are used." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setup Succesfully Completed!\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Description Value
0session_id42
1Target TypeBinary
2Label EncodedNo: 0, Yes: 1
3Original Data(1928, 11)
4Missing Values False
5Numeric Features 10
6Categorical Features 0
7Ordinal Features False
8High Cardinality Features False
9High Cardinality Method None
10Sampled Data(1928, 11)
11Transformed Train Set(1349, 10)
12Transformed Test Set(579, 10)
13Numeric Imputer mean
14Categorical Imputer constant
15Normalize False
16Normalize Method None
17Transformation False
18Transformation Method None
19PCA False
20PCA Method None
21PCA Components None
22Ignore Low Variance False
23Combine Rare Levels False
24Rare Level Threshold None
25Numeric Binning False
26Remove Outliers False
27Outliers Threshold None
28Remove Multicollinearity False
29Multicollinearity Threshold None
30Clustering False
31Clustering Iteration None
32Polynomial Features False
33Polynomial Degree None
34Trignometry Features False
35Polynomial Threshold None
36Group Features False
37Feature Selection False
38Features Selection Threshold None
39Feature Interaction False
40Feature Ratio False
41Interaction Threshold None
42Fix ImbalanceFalse
43Fix Imbalance MethodSMOTE
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exp_clf = setup(data=train, \n", + " target='same_security',\n", + " session_id=RANDOM_SEED, \n", + " experiment_name=\"text-similarity\",\n", + " log_experiment=True,\n", + " silent=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the models sorted by F1-Score to get the best.`" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Model Accuracy AUC Recall Prec. F1 Kappa MCC TT (Sec)
0CatBoost Classifier0.84800.86130.93970.86870.90260.55850.56927.4354
1Extreme Gradient Boosting0.84800.86960.91590.88570.90030.58040.58330.1665
2Light Gradient Boosting Machine0.84360.86650.91790.87910.89790.56380.56810.2272
3Gradient Boosting Classifier0.83840.85780.93670.86020.89670.52830.53970.2618
4Extra Trees Classifier0.82210.82370.90210.86640.88380.50510.50760.3498
5Ada Boost Classifier0.80730.81330.91790.83980.87700.43510.44540.1626
6Random Forest Classifier0.80280.81870.86350.87220.86750.48100.48210.1271
7Ridge Classifier0.76210.00000.96340.77420.85840.16360.21990.0085
8Logistic Regression0.75830.70110.95940.77280.85610.15380.20250.0924
9Linear Discriminant Analysis0.75540.69510.93760.78020.85160.18590.22020.0165
10Decision Tree Classifier0.76870.71710.82300.86260.84210.41050.41290.0116
11K Neighbors Classifier0.73980.64880.88430.79270.83590.21620.22370.0083
12Quadratic Discriminant Analysis0.74940.77440.82490.83830.83150.34320.34360.0078
13Naive Bayes0.73240.74170.82680.81770.82200.28170.28250.0054
14SVM - Linear Kernel0.61140.00000.65760.82900.65880.10250.13570.0150
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "top_model = compare_models(sort='F1',\n", + " fold=K_FOLDS,\n", + " n_select=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The best model by F1-Score is the Catboost Classifier, but the difference from XGBoost is minimal and this model got a better score on the other metrics, let's take XGBoost as the base model.\n", + "Tune the model to see if can get any improvement." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Accuracy AUC Recall Prec. F1 Kappa MCC
00.84440.88650.91630.88150.89860.56580.5677
10.84440.82410.91090.88460.89760.57480.5758
20.85190.89440.91090.89320.90200.59900.5995
30.84070.84210.94060.85970.89830.53420.5459
40.82160.84420.90590.86320.88410.49790.5007
Mean0.84060.85830.91690.87650.89610.55430.5579
SD0.01020.02730.01230.01290.00620.03500.0334
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "tuned_model = tune_model(top_model[1], optimize='F1',\n", + " choose_better=True, fold=K_FOLDS);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The tuned model doesn't get any improvement, so the base model is the best.
\n", + "Time to build a Bagging Ensemble." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Accuracy AUC Recall Prec. F1 Kappa MCC
00.85930.88790.93600.88370.90910.59870.6036
10.84440.83630.92080.87740.89860.56600.5691
20.85560.89870.93560.87910.90650.59080.5963
30.83700.84630.95050.84960.89720.51020.5295
40.85500.86930.92570.88630.90560.59420.5968
Mean0.85030.86770.93370.87520.90340.57200.5791
SD0.00830.02370.01020.01320.00470.03290.0275
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bagged_model = ensemble_model(tuned_model, optimize=\"F1\",\n", + " fold=K_FOLDS) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now a Boosting Ensemble." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Accuracy AUC Recall Prec. F1 Kappa MCC
00.75190.50001.00000.75190.85840.00000.0000
10.74810.50001.00000.74810.85590.00000.0000
20.74810.50001.00000.74810.85590.00000.0000
30.74810.50001.00000.74810.85590.00000.0000
40.75090.50001.00000.75090.85770.00000.0000
Mean0.74940.50001.00000.74940.85680.00000.0000
SD0.00160.00000.00000.00160.00110.00000.0000
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "boosted_model = ensemble_model(tuned_model, optimize=\"F1\",\n", + " fold=K_FOLDS, method=\"Boosting\") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Bagged Model is the best and is saved as the best model and used to predict on the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ModelAccuracyAUCRecallPrec.F1KappaMCC
0Bagging Classifier0.86010.87190.9240.89310.90830.61410.6157
\n", + "
" + ], + "text/plain": [ + " Model Accuracy AUC Recall Prec. F1 Kappa \\\n", + "0 Bagging Classifier 0.8601 0.8719 0.924 0.8931 0.9083 0.6141 \n", + "\n", + " MCC \n", + "0 0.6157 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "best_model = bagged_model\n", + "predict_model(best_model);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check the model hyperparameters." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Parameters
base_estimator__objectivebinary:logistic
base_estimator__base_score0.5
base_estimator__boostergbtree
base_estimator__colsample_bylevel1
base_estimator__colsample_bynode1
base_estimator__colsample_bytree1
base_estimator__gamma0
base_estimator__gpu_id-1
base_estimator__importance_typegain
base_estimator__interaction_constraints
base_estimator__learning_rate0.3
base_estimator__max_delta_step0
base_estimator__max_depth6
base_estimator__min_child_weight1
base_estimator__missingNaN
base_estimator__monotone_constraints()
base_estimator__n_estimators100
base_estimator__n_jobs-1
base_estimator__num_parallel_tree1
base_estimator__random_state42
base_estimator__reg_alpha0
base_estimator__reg_lambda1
base_estimator__scale_pos_weight1
base_estimator__subsample1
base_estimator__tree_methodexact
base_estimator__validate_parameters1
base_estimator__verbosity0
base_estimatorXGBClassifier(base_score=0.5, booster='gbtree'...
bootstrapTrue
bootstrap_featuresFalse
max_features1
max_samples1
n_estimators10
n_jobs-1
oob_scoreFalse
random_state42
verbose0
warm_startFalse
\n", + "
" + ], + "text/plain": [ + " Parameters\n", + "base_estimator__objective binary:logistic\n", + "base_estimator__base_score 0.5\n", + "base_estimator__booster gbtree\n", + "base_estimator__colsample_bylevel 1\n", + "base_estimator__colsample_bynode 1\n", + "base_estimator__colsample_bytree 1\n", + "base_estimator__gamma 0\n", + "base_estimator__gpu_id -1\n", + "base_estimator__importance_type gain\n", + "base_estimator__interaction_constraints \n", + "base_estimator__learning_rate 0.3\n", + "base_estimator__max_delta_step 0\n", + "base_estimator__max_depth 6\n", + "base_estimator__min_child_weight 1\n", + "base_estimator__missing NaN\n", + "base_estimator__monotone_constraints ()\n", + "base_estimator__n_estimators 100\n", + "base_estimator__n_jobs -1\n", + "base_estimator__num_parallel_tree 1\n", + "base_estimator__random_state 42\n", + "base_estimator__reg_alpha 0\n", + "base_estimator__reg_lambda 1\n", + "base_estimator__scale_pos_weight 1\n", + "base_estimator__subsample 1\n", + "base_estimator__tree_method exact\n", + "base_estimator__validate_parameters 1\n", + "base_estimator__verbosity 0\n", + "base_estimator XGBClassifier(base_score=0.5, booster='gbtree'...\n", + "bootstrap True\n", + "bootstrap_features False\n", + "max_features 1\n", + "max_samples 1\n", + "n_estimators 10\n", + "n_jobs -1\n", + "oob_score False\n", + "random_state 42\n", + "verbose 0\n", + "warm_start False" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_model(best_model, plot=\"parameter\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, plot the AUC Score." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_model(best_model, plot=\"auc\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The AUC Score for both classes was good, 0.87.
\n", + "Now, the confusion matrix and class report." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAFkCAYAAADv13iSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAoPUlEQVR4nO3de3zP9f//8fvOM5PDxjDxEcswa8ghhxyLZIYKX4eshI9jRTKFxPjk+HFKH4dOU0IxEzIhh5A55LBMUTnMbDSHT23M7P3+/eHnXTMzPnm/92S36+XicmnP1/v9ej022m2v1/swJ6vVahUAADCSc34PAAAAckeoAQAwGKEGAMBghBoAAIMRagAADEaoAQAwGKGGsRITE1W1alWFhYUpLCxMoaGheu6557Rnzx67HG/Dhg2KjIz8W/v473//q8jISIWGhiosLEzt27fX559/btvevHlzHTx48O+Oms2MGTO0YsUKSdLy5cvVtGlT9erVK9v637F371716tXL9nfQp08f/fTTT39rn3+d83/Ru3dvHT169G/NcN2sWbNUpUoVLVu2LNt6enq6atasqb59++a5j9mzZ2v9+vU33Xa3/h5QgFkBQ508edIaEhKSbW316tXWJ554Ip8murXLly9bQ0NDrfPmzbNmZmZarVarNTEx0dqyZUvr0qVLrVar1dqsWTPrgQMH7DZDjx49rCtWrLhr+4uLi7M2adLEevDgQdtaTEyMtW7dutbU1NT/eb93e86/Y+bMmdamTZtae/TokW09Ojra2qBBA2ufPn3y3Ef37t2tX331lb1GRAHnmt8/KAB34sKFCypZsqQkyWKxaMKECdq/f7/S0tJktVoVGRmp2rVr69y5cxoxYoROnDihYsWKqWTJkgoICNCgQYO0efNmTZkyRc7Ozqpataq2b9+uRYsWKS4uTrGxsZo7d6569OihkJAQ7d27V6dPn9Zjjz2mcePGydnZWcuXL9e8efPk6emp+vXrKyoqSocOHdKaNWvk5eWl3r172+b19/fX9OnTlZmZme3zuNXsu3fv1jvvvCOLxSJJ6tu3r1q1apXrekREhAICApSSkqKDBw8qMTFR58+f1+HDhxUQEKBevXrp559/1vjx43XhwgVlZWWpR48eevbZZ7Vz506NHz9eXl5eSktL07Jly+Tu7m6bc+bMmerfv7+CgoJsa+3atZOH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T59Wjx491L17dz3++OPy9fVVQkKCXF1d9fnnnysuLk5btmxRly5dtHDhQoWHh6tZs2b65ptvNHnyZB04cED9+vXL9WsF3O+49A0YrF69evr666+Vmpoqq9WqMWPG6OOPP1bt2rW1b98+paSkyGKxaM2aNTnuW6dOHa1Zs0ZWq1Wpqanq3r27rly5IhcXF2VlZalIkSL6xz/+YQv1tm3b1K1bN0lSgwYNtHLlSknSunXrlJGRkWP/nTt31ubNm7V582ZJ18I+Z84cpaam2s70JengwYOqUKGCwsPDVaNGDa1fv15ZWVk6dOiQunfvrjp16mj48OGqVKmSfv31Vz333HNKS0tTeHi4wsPDufSNAo8zasBggYGBGjhwoHr27CmLxaKqVauqT58+8vDw0MiRIxUeHq5ChQqpcuXKOe7btWtXRUZGql27dpKu/XpEb29vNW7cWG+99ZYmTpyoyZMna8yYMVqwYIHc3Nz073//W05OTho9erSGDRumJUuWKCgoSIULF86x/5IlS2r+/PmaNGmSpkyZoqysLFWrVk3vvvtutts1bNhQn332mdq0aSOr1ao6deroyJEjqlatmkJCQtS2bVsVKlRItWrV0uOPP65ChQopIiJCrq6u8vLy4r2sUeDxFqIAABiMS98AABiMUAMAYDBCDQCAwQg1AAAGI9QAABiMUAMAYDBCDQCAwf4fuofRKvwvEMoAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_model(best_model, plot=\"confusion_matrix\")" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_model(best_model, plot=\"class_report\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the results are excellent for the class True (1), but good for the class False (0).
\n", + "As the test data is well fitted on the model, let's use it to fit a final model." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:logs:Creating MLFlow logs\n", + "INFO:logs:SubProcess create_model() called ==================================\n", + "INFO:logs:Initializing create_model()\n", + "INFO:logs:create_model(estimator=BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=1,\n", + " colsample_bynode=1,\n", + " colsample_bytree=1, gamma=0,\n", + " gpu_id=-1,\n", + " importance_type='gain',\n", + " interaction_constraints='',\n", + " learning_rate=0.300000012,\n", + " max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan,\n", + " monotone_constraints='()',\n", + " n_estimators=100, n_jobs=-1,\n", + " num_parallel_tree=1,\n", + " objective='binary:logistic',\n", + " random_state=42, reg_alpha=0,\n", + " reg_lambda=1, scale_pos_weight=1,\n", + " subsample=1, tree_method='exact',\n", + " validate_parameters=1,\n", + " verbosity=0),\n", + " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", + " max_samples=1.0, n_estimators=10, n_jobs=-1, oob_score=False,\n", + " random_state=42, verbose=0, warm_start=False), ensemble=False, method=None, fold=10, round=4, cross_validation=True, verbose=False, system=False)\n", + "INFO:logs:Checking exceptions\n", + "INFO:logs:Preloading libraries\n", + "INFO:logs:Preparing display monitor\n", + "INFO:logs:Copying training dataset\n", + "INFO:logs:Importing libraries\n", + "INFO:logs:Defining folds\n", + "INFO:logs:Declaring metric variables\n", + "INFO:logs:Importing untrained model\n", + "INFO:logs:Declaring custom model\n", + "INFO:logs:Bagging Classifier Imported succesfully\n", + "INFO:logs:Checking ensemble method\n", + "INFO:logs:Initializing Fold 1\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 2\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 3\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 4\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 5\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 6\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 7\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 8\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 9\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Initializing Fold 10\n", + "INFO:logs:Fitting Model\n", + "INFO:logs:Evaluating Metrics\n", + "INFO:logs:Compiling Metrics\n", + "INFO:logs:Calculating mean and std\n", + "INFO:logs:Creating metrics dataframe\n", + "INFO:logs:Finalizing model\n", + "INFO:logs:Uploading results into container\n", + "INFO:logs:Uploading model into container now\n", + "INFO:logs:create_model_container: 17\n", + "INFO:logs:master_model_container: 17\n", + "INFO:logs:display_container: 21\n", + "INFO:logs:BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=1,\n", + " colsample_bynode=1,\n", + " colsample_bytree=1, gamma=0,\n", + " gpu_id=-1,\n", + " importance_type='gain',\n", + " interaction_constraints='',\n", + " learning_rate=0.300000012,\n", + " max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan,\n", + " monotone_constraints='()',\n", + " n_estimators=100, n_jobs=-1,\n", + " num_parallel_tree=1,\n", + " objective='binary:logistic',\n", + " random_state=42, reg_alpha=0,\n", + " reg_lambda=1, scale_pos_weight=1,\n", + " subsample=1, tree_method='exact',\n", + " validate_parameters=1,\n", + " verbosity=0),\n", + " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", + " max_samples=1.0, n_estimators=10, n_jobs=-1, oob_score=False,\n", + " random_state=42, verbose=0, warm_start=False)\n", + "INFO:logs:create_model() succesfully completed......................................\n", + "INFO:logs:SubProcess create_model() end ==================================\n", + "INFO:logs:SubProcess save_model() called ==================================\n", + "INFO:logs:Initializing save_model()\n", + "INFO:logs:save_model(model=BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=1,\n", + " colsample_bynode=1,\n", + " colsample_bytree=1, gamma=0,\n", + " gpu_id=-1,\n", + " importance_type='gain',\n", + " interaction_constraints='',\n", + " learning_rate=0.300000012,\n", + " max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan,\n", + " monotone_constraints='()',\n", + " n_estimators=100, n_jobs=-1,\n", + " num_parallel_tree=1,\n", + " objective='binary:logistic',\n", + " random_state=42, reg_alpha=0,\n", + " reg_lambda=1, scale_pos_weight=1,\n", + " subsample=1, tree_method='exact',\n", + " validate_parameters=1,\n", + " verbosity=0),\n", + " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", + " max_samples=1.0, n_estimators=10, n_jobs=-1, oob_score=False,\n", + " random_state=42, verbose=0, warm_start=False), model_name=Trained Model, verbose=False)\n", + "INFO:logs:Appending prep pipeline\n", + "INFO:logs:Trained Model.pkl saved in current working directory\n", + "INFO:logs:[Pipeline(memory=None,\n", + " steps=[('dtypes',\n", + " DataTypes_Auto_infer(categorical_features=[],\n", + " display_types=False, features_todrop=[],\n", + " ml_usecase='classification',\n", + " numerical_features=[],\n", + " target='same_security',\n", + " time_features=[])),\n", + " ('imputer',\n", + " Simple_Imputer(categorical_strategy='not_available',\n", + " numeric_strategy='mean',\n", + " target_variable=None)),\n", + " ('new_levels1',\n", + " New_Catagor...\n", + " ('group', Empty()), ('nonliner', Empty()), ('scaling', Empty()),\n", + " ('P_transform', Empty()), ('pt_target', Empty()),\n", + " ('binn', Empty()), ('rem_outliers', Empty()),\n", + " ('cluster_all', Empty()),\n", + " ('dummy', Dummify(target='same_security')),\n", + " ('fix_perfect', Empty()), ('clean_names', Clean_Colum_Names()),\n", + " ('feature_select', Empty()), ('fix_multi', Empty()),\n", + " ('dfs', Empty()), ('pca', Empty())],\n", + " verbose=False), BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=1,\n", + " colsample_bynode=1,\n", + " colsample_bytree=1, gamma=0,\n", + " gpu_id=-1,\n", + " importance_type='gain',\n", + " interaction_constraints='',\n", + " learning_rate=0.300000012,\n", + " max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan,\n", + " monotone_constraints='()',\n", + " n_estimators=100, n_jobs=-1,\n", + " num_parallel_tree=1,\n", + " objective='binary:logistic',\n", + " random_state=42, reg_alpha=0,\n", + " reg_lambda=1, scale_pos_weight=1,\n", + " subsample=1, tree_method='exact',\n", + " validate_parameters=1,\n", + " verbosity=0),\n", + " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", + " max_samples=1.0, n_estimators=10, n_jobs=-1, oob_score=False,\n", + " random_state=42, verbose=0, warm_start=False)]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:logs:save_model() succesfully completed......................................\n", + "INFO:logs:SubProcess save_model() end ==================================\n", + "INFO:logs:create_model_container: 17\n", + "INFO:logs:master_model_container: 17\n", + "INFO:logs:display_container: 21\n", + "INFO:logs:BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=1,\n", + " colsample_bynode=1,\n", + " colsample_bytree=1, gamma=0,\n", + " gpu_id=-1,\n", + " importance_type='gain',\n", + " interaction_constraints='',\n", + " learning_rate=0.300000012,\n", + " max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan,\n", + " monotone_constraints='()',\n", + " n_estimators=100, n_jobs=-1,\n", + " num_parallel_tree=1,\n", + " objective='binary:logistic',\n", + " random_state=42, reg_alpha=0,\n", + " reg_lambda=1, scale_pos_weight=1,\n", + " subsample=1, tree_method='exact',\n", + " validate_parameters=1,\n", + " verbosity=0),\n", + " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", + " max_samples=1.0, n_estimators=10, n_jobs=-1, oob_score=False,\n", + " random_state=42, verbose=0, warm_start=False)\n", + "INFO:logs:finalize_model() succesfully completed......................................\n" + ] + } + ], + "source": [ + "final_model = finalize_model(best_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5. Validation on Unseen Data\n", + "To validadte the model, let's see the prediction with unseen data, which was not included on the final model fit." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Accuracy AUC Recall Precision F1 Score\n", + " 0.878505 0.780538 0.952381 0.898876 0.924855\n" + ] + }, + { + "data": { + "image/png": "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iYny8/NTs2bNFBwcrPDwcKWnp1/2Wjc3N7399tsKCAjQc889p969e2v69Onq0aOHbbFTWS6dG+vfv79GjhypLl26aMyYMZKkSZMmKTg4WOPHj9egQYOUl5end955R97e3mW+D46YNm2ann32WSUlJenBBx/UuHHjVLduXS1btsz2h0BYWJief/55vf766+rXr5+2bNmixYsXF1sdWl5ubm6Kj4/XDz/8oD59+uijjz7S008/bXt82LBhGjhwoCZNmqTevXsrNTVViYmJl10swMfHR2+//bZ+/vln9e/fXzNmzNDw4cP13HPPOfxeXOTv76+goCC1bNmyxO41IiJCQUFBGjFihIYMGaITJ05o7NixOnDggCSV+XN0qYvD0jExMZKke+65R3//+981derUK85NA+VhMW60M9MBAKgAOk4AAOxAcAIAYAeCEwBQae3atUsRERGSpD/++EOjR4/WsGHDNGTIENsnFa1YsUIDBw7UI488orS0tDL3yXmcAIBKadGiRVq7dq2qVq0qSZo9e7b69u2rPn366Ntvv9WPP/6oqlWrKikpSatWrVJeXp7Cw8PVpUuXUs8PpuMEAFRKAQEBtusbS9L333+vU6dO6fHHH9eHH36oDh06aPfu3Wrbtq08PT3l5+engIAAZWRklLrf67LjrBpQvg+1Ba5n549NN7sE4Cpp5rQ9V+T3/fljy0p9PCwsrNhFQE6cOKHq1avr3Xff1fz587Vo0SI1atSo2NXEfHx8SryK2aXoOAEAprFY3By+2cvf39/2SVE9evTQ3r175evrq9zcXNtzcnNzy/yMYYITAHBDaNeunTZu3ChJ2rZtm26//XYFBgZq+/btysvLU3Z2tjIzM9WsWekd9nU5VAsAuDFYrmH/FhkZqalTp2r58uXy9fXVq6++qho1aigiIkLh4eEyDEPjx48v8zKb1+WVg5jjRGXAHCcqD+fNcfo2eszh1+YcKf2Tc5yFjhMAYBpH5irNRnACAExj70fFXQ8ITgCAieg4AQAoN1ccqnW9igEAMBEdJwDANK7YcRKcAADTXMvzOK8WghMAYBo6TgAA7EBwAgBgB4ITAAA7WOR6F0BwvagHAMBEdJwAANMwVAsAgB0ITgAA7EBwAgBgF4ITAIByo+MEAMAOrhicrlcxAAAmouMEAJiGi7wDAGAHVxyqJTgBAKaxWFzvknsE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AACVnCt2nOVaVVu/fn0tXLhQZ86ckb+/v5NLAgDg+lWujvPAgQO677771L9/f506dUqhoaHat2+fs2sDAFRyrthxlis44+Li9MYbb8jf318333yzYmNjFRMT4+zaAACVnMXN4vDNLOUKzvPnz6tJkya2+126dFF+fr7TigIA3BhcseMs1xynv7+/MjIybKejrF27llW1AIAKc8XzOMsVnLGxsYqMjNShQ4fUvn17NWzYUHPmzHF2bQCASq7SBmdeXp6WLVumc+fOqaioSL6+vtq5c6eTSwMAVHaV7oOst2/frqKiIk2dOlXx8fEyDEOSVFBQoNjYWK1bt+6aFAkAwPWi1ODcvHmztm7dqt9++03z5s37vxd5eGjw4MFOLw4AULlVuqHaZ555RpK0evVqPfDAA/Lw8JDVapXValW1atWuSYEAgMrLFT9WrFwle3p6asCAAZKkX3/9Vb1799b69eudWhgAoPJzxdNRyhWcCxYs0OLFiyVJAQEBSklJUUJCglMLAwBUfhaLxeGbWcq1qtZqtap27dq2+7Vq1bItFAIAwFGVbo7zonbt2mnChAnq27evLBaLPvnkE7Vp08bJpQEAKrtKG5wxMTFKSkrS+++/Lw8PD7Vv317h4eHOrg0AgOuOxShlzPX06dOqU6eOfvnllxIfv+WWW5xS1PmCzU7ZL3AtnSv43ewSgKuilnc/p+27+yebHH5tWp8uV7GS8iu145w6daoSExP16KOPymKxyDCMYv9PTU29VnUCACqhSnfloMTEREnShg0brkkxAIAbS6ULzkmTJpX64lmzZl3VYgAANxY3i+udoVHqeZwdOnRQhw4dlJubq99++02dOnVScHCwzp49y+koAIAKc7M4fjNLqR3nxasFLV26VO+//77c3P7K2d69e+uRRx5xfnUAgErNWVfcs1qtioqK0okTJ+Tm5qaZM2fKw8NDUVFRslgsatq0qWJiYmy5Zo9yvSI7O1tnzpyx3f/999917tw5uw8GAMC1sHHjRhUUFGj58uUaM2aMXnvtNc2aNUvjxo3T0qVLZRiGwwtcy3Ue56hRo9SvXz8FBQXJMAzt3LlT06ZNc+iAAABc5Kw5zttuu02FhYUqKipSTk6OPDw8tHPnTnXo0EGSFBISok2bNik0NNTufZcrOPv376977rlHO3bskMViUWxsrGrVqmX3wQAAuJSz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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "predict_unseen = predict_model(final_model, data=unseen);\n", + "score_unseen = test_score_report(unseen, predict_unseen)\n", + "print(score_unseen.to_string(index=False))\n", + "conf_mat(unseen, predict_unseen);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, the unseen data was well predicted on the model, with a high F1-Score showing a good balance between Recall and precision." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 6. Conclusion\n", + "The following conclusions can be drawed:\n", + "* The Model just needed 4 Topics Modelled to compare the sentences.\n", + "* Character length is important to compare the sentences.\n", + "* Recall was excellent, getting about 95% of the positive labels.\n", + "* Precision was excellent too, predicting correctly about 90% of the values labeled as positives.\n", + "* F1-Score was about 92% with a good balance between recall and precision.\n", + "* The Length on the `sentence_y` is important to model prediction performance." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "nteract": { + "version": "0.24.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} -- GitLab