{ "cells": [ { "cell_type": "markdown", "id": "intro-md", "metadata": {}, "source": [ "# Benchmark: AutoCarver vs. optbinning vs. KBinsDiscretizer\n", "\n", "This notebook runs the three binning libraries side-by-side on two public datasets:\n", "\n", "1. **German Credit** — binary classification, mixed numeric / categorical features, 1,000 rows.\n", "2. **California Housing** — regression, all-numeric features, 20,640 rows.\n", "\n", "For each library and dataset, we report:\n", "\n", "- **`fit` and `transform` wall-clock** (seconds)\n", "- **Downstream-model score** — AUC for binary, R² for regression — using a linear model (logistic regression / ridge) on the one-hot-encoded bin output\n", "- **`train` → `test` score drop** as a coarse proxy for drift sensitivity\n", "\n", "All three libraries see the same `train + dev` data and are evaluated on the same held-out `test`. AutoCarver uses the dev sample for its built-in robustness veto; optbinning and KBinsDiscretizer don't have a dev-set concept and so treat the union of train + dev as one pooled training set — which is the comparison practitioners actually run.\n", "\n", "**This is not an IV / Tschuprow's T leaderboard.** Those metrics structurally favour the library whose objective they are. The downstream-model score is the metric a real scorecard team would use to pick a binner.\n", "\n", "Numbers come from a single run on a single machine with a fixed seed; treat them as illustrative, not as authoritative benchmark figures. Re-run on your own data before drawing conclusions." ] }, { "cell_type": "markdown", "id": "setup-md", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 1, "id": "imports", "metadata": {}, "outputs": [], "source": [ "import time\n", "import warnings\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.datasets import fetch_california_housing, fetch_openml\n", "from sklearn.linear_model import LogisticRegression, Ridge\n", "from sklearn.metrics import r2_score, roc_auc_score\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import KBinsDiscretizer\n", "\n", "from AutoCarver import BinaryCarver, ContinuousCarver, Features\n", "from AutoCarver.discretizers.utils.base_discretizer import DiscretizerConfig\n", "\n", "try:\n", " from optbinning import ContinuousOptimalBinning, OptimalBinning\n", "\n", " HAS_OPTBINNING = True\n", "except ImportError:\n", " HAS_OPTBINNING = False\n", " print('optbinning is not installed \\u2014 its rows will be skipped.')\n", "\n", "SEED = 42\n", "warnings.filterwarnings('ignore')\n", "plt.rcParams['figure.figsize'] = (10, 3.5)" ] }, { "cell_type": "code", "execution_count": 2, "id": "helpers", "metadata": {}, "outputs": [], "source": [ "def one_hot(df):\n", " \"\"\"Treat every bin label as a categorical level and one-hot encode it.\n", "\n", " Lets a linear downstream model consume any of the three libraries' outputs\n", " uniformly, without us computing WoE per bin.\n", " \"\"\"\n", " return pd.get_dummies(df.astype(str), drop_first=True).astype(float)\n", "\n", "\n", "def fit_eval_binary(X_train, X_test, y_train, y_test):\n", " Xtr = one_hot(X_train)\n", " Xte = one_hot(X_test).reindex(columns=Xtr.columns, fill_value=0.0)\n", " model = LogisticRegression(max_iter=1000, random_state=SEED).fit(Xtr, y_train)\n", " return {\n", " 'train_auc': roc_auc_score(y_train, model.predict_proba(Xtr)[:, 1]),\n", " 'test_auc': roc_auc_score(y_test, model.predict_proba(Xte)[:, 1]),\n", " }\n", "\n", "\n", "def fit_eval_regression(X_train, X_test, y_train, y_test):\n", " Xtr = one_hot(X_train)\n", " Xte = one_hot(X_test).reindex(columns=Xtr.columns, fill_value=0.0)\n", " model = Ridge(random_state=SEED).fit(Xtr, y_train)\n", " return {\n", " 'train_r2': r2_score(y_train, model.predict(Xtr)),\n", " 'test_r2': r2_score(y_test, model.predict(Xte)),\n", " }\n", "\n", "\n", "def plot_bars(results_df, score_cols, title):\n", " fig, axes = plt.subplots(1, len(score_cols), figsize=(4 * len(score_cols), 3.5))\n", " if len(score_cols) == 1:\n", " axes = [axes]\n", " for ax, col in zip(axes, score_cols):\n", " results_df.plot.bar(x='library', y=col, ax=ax, legend=False, color='#4C72B0')\n", " ax.set_title(col)\n", " ax.set_xlabel('')\n", " ax.tick_params(axis='x', rotation=0)\n", " fig.suptitle(title)\n", " fig.tight_layout()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "id": "binners", "metadata": {}, "outputs": [], "source": [ "MAX_N_MOD = 5\n", "MIN_FREQ = 0.05\n", "\n", "def bin_with_autocarver(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, kind):\n", " Carver = BinaryCarver if kind == 'binary' else ContinuousCarver\n", " features = Features(categoricals=categoricals, quantitatives=quantitatives)\n", " config = DiscretizerConfig(verbose=True) # showing statistics\n", " carver = Carver(features=features, min_freq=MIN_FREQ, max_n_mod=MAX_N_MOD, config=config)\n", "\n", " t0 = time.perf_counter()\n", " X_tr = carver.fit_transform(X_train.copy(), y_train, X_dev=X_dev.copy(), y_dev=y_dev)\n", " fit_t = time.perf_counter() - t0\n", "\n", " X_dv = carver.transform(X_dev.copy())\n", " t1 = time.perf_counter()\n", " X_te = carver.transform(X_test.copy())\n", " transform_t = time.perf_counter() - t1\n", " return pd.concat([X_tr, X_dv]), X_te, fit_t, transform_t\n", "\n", "\n", "def bin_with_optbinning(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, kind):\n", " Cls = OptimalBinning if kind == 'binary' else ContinuousOptimalBinning\n", " X_all = pd.concat([X_train, X_dev])\n", " y_all = pd.concat([y_train, y_dev])\n", " binners = {}\n", " train_binned = pd.DataFrame(index=X_all.index)\n", " test_binned = pd.DataFrame(index=X_test.index)\n", "\n", " t0 = time.perf_counter()\n", " for col in X_all.columns:\n", " dtype = 'categorical' if col in categoricals else 'numerical'\n", " binner = Cls(name=col, dtype=dtype, min_prebin_size=MIN_FREQ/2, max_n_bins=MAX_N_MOD)\n", " binner.fit(X_all[col].to_numpy(), y_all.to_numpy())\n", " binners[col] = binner\n", " train_binned[col] = binner.transform(X_all[col].to_numpy(), metric='bins')\n", " fit_t = time.perf_counter() - t0\n", "\n", " t1 = time.perf_counter()\n", " for col, b in binners.items():\n", " test_binned[col] = b.transform(X_test[col].to_numpy(), metric='bins')\n", " transform_t = time.perf_counter() - t1\n", " return train_binned, test_binned, fit_t, transform_t\n", "\n", "\n", "def bin_with_kbins(X_train, X_dev, X_test, categoricals, quantitatives, n_bins=5):\n", " X_all = pd.concat([X_train, X_dev])\n", " num_train = X_all[quantitatives].apply(lambda c: c.fillna(c.median()))\n", " num_test = X_test[quantitatives].apply(lambda c: c.fillna(c.median()))\n", " kbd = KBinsDiscretizer(n_bins=n_bins, encode='ordinal', strategy='quantile')\n", "\n", " t0 = time.perf_counter()\n", " binned_num_train = pd.DataFrame(\n", " kbd.fit_transform(num_train), columns=quantitatives, index=X_all.index\n", " )\n", " fit_t = time.perf_counter() - t0\n", "\n", " t1 = time.perf_counter()\n", " binned_num_test = pd.DataFrame(\n", " kbd.transform(num_test), columns=quantitatives, index=X_test.index\n", " )\n", " transform_t = time.perf_counter() - t1\n", "\n", " # KBins has no opinion on categoricals — pass them through as labels\n", " train = pd.concat([binned_num_train, X_all[categoricals].astype(str)], axis=1)\n", " test = pd.concat([binned_num_test, X_test[categoricals].astype(str)], axis=1)\n", " return train, test, fit_t, transform_t" ] }, { "cell_type": "markdown", "id": "binary-md", "metadata": {}, "source": [ "## Binary classification — German Credit\n", "\n", "20 features (numeric + categorical), 1,000 rows, target = `class == 'bad'`. Train / dev / test split = 60 / 20 / 20 %." ] }, { "cell_type": "code", "execution_count": null, "id": "381a7051", "metadata": {}, "outputs": [], "source": "credit = fetch_openml(data_id=31, as_frame=True)\ndf = credit.frame.copy()\n\ny_binary = (df['class'] == 'bad').astype(int)\nX_binary = df.drop(columns=['class'])\n\nX_train, X_rest, y_train, y_rest = train_test_split(\n X_binary, y_binary, test_size=0.4, random_state=SEED, stratify=y_binary,\n)\nX_dev, X_test, y_dev, y_test = train_test_split(\n X_rest, y_rest, test_size=0.5, random_state=SEED, stratify=y_rest,\n)\n\ncategoricals = [c for c in X_binary.columns if X_binary[c].dtype == object or isinstance(X_binary[c].dtype, pd.CategoricalDtype)]\nquantitatives = [c for c in X_binary.columns if c not in categoricals]\n\nprint(f'train={len(X_train)}, dev={len(X_dev)}, test={len(X_test)}')\nprint(f'categoricals={len(categoricals)}, quantitatives={len(quantitatives)}')\nprint(f'bad rate (train)={y_train.mean():.3f}, (test)={y_test.mean():.3f}')" }, { "cell_type": "code", "execution_count": 5, "id": "run-binary", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------\n", "--- [QuantitativeDiscretizer] Fit Features(['duration', 'credit_amount', 'installment_commitment', 'residence_since', 'age', 'existing_credits', 'num_dependents'])\n", " - [ContinuousDiscretizer] Fit Features(['duration', 'credit_amount', 'installment_commitment', 'residence_since', 'age', 'existing_credits', 'num_dependents'])\n", " - [OrdinalDiscretizer] Fit Features(['duration', 'installment_commitment', 'residence_since', 'existing_credits', 'num_dependents'])\n", "------\n", "\n", "------\n", "--- [QualitativeDiscretizer] Fit Features(['checking_status', 'credit_history', 'purpose', 'savings_status', 'employment', 'personal_status', 'other_parties', 'property_magnitude', 'other_payment_plans', 'housing', 'job', 'own_telephone', 'foreign_worker'])\n", " - [CategoricalDiscretizer] Fit Features(['checking_status', 'credit_history', 'purpose', 'savings_status', 'employment', 'personal_status', 'other_parties', 'property_magnitude', 'other_payment_plans', 'housing', 'job', 'own_telephone', 'foreign_worker'])\n", "------\n", "\n", "---------\n", "------ [BinaryCarver] Fit Features(['checking_status', 'credit_history', 'purpose', 'savings_status', 'employment', 'personal_status', 'other_parties', 'property_magnitude', 'other_payment_plans', 'housing', 'job', 'own_telephone', 'foreign_worker', 'duration', 'credit_amount', 'installment_commitment', 'residence_since', 'age', 'existing_credits', 'num_dependents'])\n", "--- [BinaryCarver] Fit Categorical('checking_status') (1/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
no checking0.13170.4050
>=2000.27780.0600
0<=X<2000.38960.2567
<00.46710.2783
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.06940.3600
0.08330.0600
0.37100.3100
0.57410.2700
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/7 [00:00\n", "#T_9087c_row0_col0, #T_9087c_row0_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_9087c_row1_col0, #T_9087c_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
no checking, >=2000.15050.4650
0<=X<200, <00.42990.5350
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.07140.4200
0.46550.5800
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('credit_history') (2/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
critical/other existing credit0.16760.2883
existing paid0.31850.5233
delayed previously0.36210.0967
all paid0.54550.0550
no credits/all paid0.54550.0367
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.22410.2900
0.27030.5550
0.35710.0700
0.72730.0550
0.66670.0300
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 15it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/15 [00:00\n", "#T_86c43_row0_col0, #T_86c43_row2_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_86c43_row0_col1 {\n", " background-color: #b7cff9;\n", " color: #000000;\n", "}\n", "#T_86c43_row1_col0 {\n", " background-color: #c5d6f2;\n", " color: #000000;\n", "}\n", "#T_86c43_row1_col1, #T_86c43_row2_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
critical/other existing credit0.16760.2883
existing paid, delayed previously0.32530.6200
all paid, no credits/all paid0.54550.0917
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.22410.2900
0.28000.6250
0.70590.0850
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('purpose') (3/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
used car0.18750.1067
radio/tv0.23030.2750
other, domestic appliance, retraining0.26320.0317
furniture/equipment0.33330.1700
new car0.34010.2450
business0.37290.0983
repairs0.37500.0267
education0.46430.0467
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.12500.0800
0.22950.3050
0.27270.0550
0.32350.1700
0.42220.2250
0.27780.0900
0.00000.0100
0.46150.0650
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 98it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/98 [00:00\n", "#T_3331b_row0_col0, #T_3331b_row0_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_3331b_row1_col0, #T_3331b_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
used car, radio/tv, other, domestic appliance, ret...0.22180.4133
new car, furniture/equipment, business, education,...0.35510.5867
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.21590.4400
0.36610.5600
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('savings_status') (4/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
>=10000.06670.0500
500<=X<10000.16220.0617
no known savings0.17140.1750
100<=X<5000.33330.1150
<1000.36490.5983
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.33330.0300
0.12500.0800
0.16670.1800
0.38890.0900
0.34680.6200
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 15it [00:00, 15040.54it/s]\n", "Testing robustness : 0%| | 0/15 [00:00\n", "#T_01992_row0_col0, #T_01992_row0_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_01992_row1_col0, #T_01992_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
no known savings, >=1000, 500<=X<10000.15120.2867
<100, 100<=X<5000.35980.7133
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.17240.2900
0.35210.7100
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('employment') (5/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
4<=X<70.19350.1550
>=70.25160.2650
1<=X<40.29110.3550
<10.42720.1717
unemployed0.50000.0533
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.26320.1900
0.26000.2500
0.36210.2900
0.33330.1800
0.22220.0900
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 15it [00:00, ?it/s]\n", "Testing robustness : 60%|██████ | 9/15 [00:00<00:00, 170.78it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " [BinaryCarver] Carved distribution\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", "
X distribution
 target_meanfrequency
>=7, 4<=X<70.23020.4200
unemployed, 1<=X<4, <10.35060.5800
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.26140.4400
0.33040.5600
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('personal_status') (6/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
male single0.26790.5600
male mar/wid0.27780.0900
female div/dep/mar0.35590.2950
male div/sep0.36360.0550
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.28300.5300
0.23810.1050
0.33850.3250
0.37500.0400
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/7 [00:00\n", "#T_8199b_row0_col0, #T_8199b_row1_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_8199b_row0_col1, #T_8199b_row1_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
male single, male mar/wid0.26920.6500
female div/dep/mar, male div/sep0.35710.3500
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.27560.6350
0.34250.3650
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('other_parties') (7/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
guarantor0.17860.0467
none0.29960.9067
co applicant0.42860.0467
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.25000.0400
0.29890.9200
0.37500.0400
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 3it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 3/3 [00:00<00:00, 498.35it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Categorical('other_parties'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n", "--- [BinaryCarver] Fit Categorical('property_magnitude') (8/20)\n", " [BinaryCarver] Raw distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
real estate0.21300.2817
life insurance0.31250.2133
car0.31430.3500
no known property0.40860.1550
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.21820.2750
0.26000.2500
0.32810.3200
0.45160.1550
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/7 [00:00\n", "#T_ed9f8_row0_col0, #T_ed9f8_row2_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_ed9f8_row0_col1 {\n", " background-color: #a2c1ff;\n", " color: #000000;\n", "}\n", "#T_ed9f8_row1_col0 {\n", " background-color: #e0dbd8;\n", " color: #000000;\n", "}\n", "#T_ed9f8_row1_col1, #T_ed9f8_row2_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
real estate0.21300.2817
car, life insurance0.31360.5633
no known property0.40860.1550
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.21820.2750
0.29820.5700
0.45160.1550
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('other_payment_plans') (9/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
none0.26190.8083
stores0.43750.0533
bank0.46990.1383
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.28660.8200
0.44440.0450
0.33330.1350
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 3it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/3 [00:00\n", "#T_0cd23_row0_col0, #T_0cd23_row1_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_0cd23_row0_col1, #T_0cd23_row1_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
none0.26190.8083
bank, stores0.46090.1917
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.28660.8200
0.36110.1800
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('housing') (10/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
own0.25580.7233
for free0.37500.1067
rent0.44120.1700
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.28570.7350
0.43480.1150
0.26670.1500
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 3it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/3 [00:00\n", "#T_49019_row0_col0, #T_49019_row1_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_49019_row0_col1, #T_49019_row1_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
own0.25580.7233
for free, rent0.41570.2767
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.28570.7350
0.33960.2650
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('job') (11/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
skilled0.28980.6383
unskilled resident0.29660.1967
high qualif/self emp/mgmt0.32580.1483
unemp/unskilled non res0.50000.0167
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.25410.6100
0.31710.2050
0.48390.1550
0.16670.0300
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 57%|█████▋ | 4/7 [00:00<00:00, 389.52it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [BinaryCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
skilled, unskilled resident0.29140.8350
high qualif/self emp/mgmt, unemp/unskilled non res0.34340.1650
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.26990.8150
0.43240.1850
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('own_telephone') (12/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
yes0.26450.4033
none0.32400.5967
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.31250.4000
0.29170.6000
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 1it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 1/1 [00:00<00:00, 195.15it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Categorical('own_telephone'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n", "--- [BinaryCarver] Fit Categorical('foreign_worker') (13/20)\n", " [BinaryCarver] Raw distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
no0.04350.0383
yes0.31020.9617
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.33330.0300
0.29900.9700
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 1it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 1/1 [00:00<00:00, 485.85it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Categorical('foreign_worker'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n", "--- [BinaryCarver] Fit Quantitative('duration') (14/20)\n", " [BinaryCarver] Raw distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 8.00e+000.09800.0850
8.00e+00 < x <= 9.00e+000.23330.0500
9.00e+00 < x <= 1.10e+010.08700.0383
1.10e+01 < x <= 1.20e+010.28830.1850
1.20e+01 < x <= 1.50e+010.22730.0733
1.50e+01 < x <= 1.80e+010.36920.1083
1.80e+01 < x <= 2.20e+010.23810.0350
2.20e+01 < x <= 2.40e+010.33330.1950
2.40e+01 < x <= 2.80e+010.22220.0150
2.80e+01 < x <= 3.30e+010.38460.0433
3.30e+01 < x <= 3.60e+010.47270.0917
3.60e+01 < x <= 4.70e+010.26670.0250
4.70e+01 < x0.42420.0550
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.10000.1000
0.30770.0650
0.00000.0400
0.24320.1850
0.07140.0700
0.30430.1150
0.44440.0450
0.35480.1550
0.75000.0200
0.42860.0350
0.35290.0850
0.66670.0150
0.57140.0700
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 793it [00:00, 72200.99it/s]\n", "Testing robustness : 0%| | 0/793 [00:00\n", "#T_959b9_row0_col0, #T_959b9_row0_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_959b9_row1_col0 {\n", " background-color: #f2cbb7;\n", " color: #000000;\n", "}\n", "#T_959b9_row1_col1, #T_959b9_row2_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "#T_959b9_row2_col1 {\n", " background-color: #5875e1;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 1.10e+010.13460.1733
1.10e+01 < x <= 2.80e+010.30520.6117
2.80e+01 < x0.41860.2150
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.14630.2050
0.29660.5900
0.46340.2050
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Quantitative('credit_amount') (15/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 6.18e+020.20000.0250
6.18e+02 < x <= 7.08e+020.40000.0250
7.08e+02 < x <= 7.97e+020.33330.0250
7.97e+02 < x <= 9.09e+020.40000.0250
9.09e+02 < x <= 1.03e+030.40000.0250
1.03e+03 < x <= 1.16e+030.20000.0250
1.16e+03 < x <= 1.21e+030.26670.0250
1.21e+03 < x <= 1.26e+030.20000.0250
1.26e+03 < x <= 1.31e+030.33330.0250
1.31e+03 < x <= 1.37e+030.46670.0250
1.37e+03 < x <= 1.41e+030.12500.0267
1.41e+03 < x <= 1.47e+030.14290.0233
1.47e+03 < x <= 1.53e+030.26670.0250
1.53e+03 < x <= 1.60e+030.20000.0250
1.60e+03 < x <= 1.82e+030.20000.0250
1.82e+03 < x <= 1.92e+030.50000.0267
1.92e+03 < x <= 1.98e+030.28570.0233
1.98e+03 < x <= 2.12e+030.33330.0250
2.12e+03 < x <= 2.21e+030.26670.0250
2.21e+03 < x <= 2.30e+030.26670.0250
2.30e+03 < x <= 2.38e+030.20000.0250
2.38e+03 < x <= 2.48e+030.40000.0250
2.48e+03 < x <= 2.62e+030.26670.0250
2.62e+03 < x <= 2.75e+030.33330.0250
2.75e+03 < x <= 2.92e+030.20000.0250
2.92e+03 < x <= 3.07e+030.20000.0250
3.07e+03 < x <= 3.35e+030.40000.0250
3.35e+03 < x <= 3.51e+030.13330.0250
3.51e+03 < x <= 3.63e+030.13330.0250
3.63e+03 < x <= 3.91e+030.06670.0250
3.91e+03 < x <= 4.24e+030.46670.0250
4.24e+03 < x <= 4.66e+030.40000.0250
4.66e+03 < x <= 5.08e+030.46670.0250
5.08e+03 < x <= 5.80e+030.20000.0250
5.80e+03 < x <= 6.36e+030.26670.0250
6.36e+03 < x <= 6.85e+030.46670.0250
6.85e+03 < x <= 7.48e+030.20000.0250
7.48e+03 < x <= 8.23e+030.46670.0250
8.23e+03 < x <= 9.57e+030.40000.0250
9.57e+03 < x0.53330.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.20000.0250
0.50000.0200
0.50000.0300
0.00000.0100
0.33330.0300
0.14290.0350
0.50000.0100
0.33330.0600
0.00000.0100
0.28570.0350
0.00000.0150
0.33330.0300
0.25000.0200
0.00000.0150
0.33330.0300
0.28570.0350
0.25000.0200
0.00000.0400
0.50000.0100
0.50000.0100
0.00000.0150
0.00000.0050
0.66670.0150
0.00000.0200
0.00000.0200
0.33330.0150
0.20000.0500
0.50000.0400
0.00000.0300
0.10000.0500
0.25000.0200
0.80000.0250
0.33330.0150
0.40000.0250
0.28570.0350
0.00000.0200
0.66670.0150
0.66670.0150
0.66670.0150
0.61540.0650
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 24828.55it/s]\n", "Testing robustness : 0%| | 0/92170 [00:00\n", "#T_c5550_row0_col0 {\n", " background-color: #f6bea4;\n", " color: #000000;\n", "}\n", "#T_c5550_row0_col1, #T_c5550_row2_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "#T_c5550_row1_col0, #T_c5550_row1_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_c5550_row2_col1 {\n", " background-color: #9bbcff;\n", " color: #000000;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 3.35e+030.28890.6750
3.35e+03 < x <= 3.91e+030.11110.0750
3.91e+03 < x0.38670.2500
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.24600.6300
0.20830.1200
0.48000.2500
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Quantitative('installment_commitment') (16/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.00e+000.24360.1300
1.00e+00 < x <= 2.00e+000.26060.2367
2.00e+00 < x <= 3.00e+000.29790.1567
3.00e+00 < x0.33570.4767
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.10710.1400
0.26670.2250
0.24140.1450
0.38780.4900
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 0%| | 0/7 [00:00\n", "#T_a0d9b_row0_col0, #T_a0d9b_row0_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_a0d9b_row1_col0, #T_a0d9b_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 2.0e+000.25450.3667
2.0e+00 < x0.32630.6333
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.20550.3650
0.35430.6350
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Quantitative('residence_since') (17/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.00e+000.31170.1283
1.00e+00 < x <= 2.00e+000.29050.2983
2.00e+00 < x <= 3.00e+000.30000.1667
3.00e+00 < x0.30330.4067
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.21740.1150
0.35290.3400
0.33330.1500
0.26580.3950
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 7it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 7/7 [00:00<00:00, 221.74it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Quantitative('residence_since'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n", "--- [BinaryCarver] Fit Quantitative('age') (18/20)\n", " [BinaryCarver] Raw distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 2.10e+010.40000.0250
2.10e+01 < x <= 2.20e+010.36840.0317
2.20e+01 < x <= 2.30e+010.45000.0333
2.30e+01 < x <= 2.40e+010.33330.0350
2.40e+01 < x <= 2.50e+010.51610.0517
2.50e+01 < x <= 2.60e+010.25000.0467
2.60e+01 < x <= 2.70e+010.22580.0517
2.70e+01 < x <= 2.80e+010.40910.0367
2.80e+01 < x <= 2.90e+010.39130.0383
2.90e+01 < x <= 3.00e+010.21430.0467
3.00e+01 < x <= 3.10e+010.23080.0433
3.10e+01 < x <= 3.20e+010.25000.0333
3.20e+01 < x <= 3.30e+010.36360.0367
3.30e+01 < x <= 3.40e+010.36360.0367
3.40e+01 < x <= 3.50e+010.17240.0483
3.50e+01 < x <= 3.60e+010.20830.0400
3.60e+01 < x <= 3.70e+010.33330.0250
3.70e+01 < x <= 3.80e+010.18750.0267
3.80e+01 < x <= 3.90e+010.29410.0283
3.90e+01 < x <= 4.10e+010.31820.0367
4.10e+01 < x <= 4.20e+010.27270.0183
4.20e+01 < x <= 4.40e+010.19050.0350
4.40e+01 < x <= 4.60e+010.26320.0317
4.60e+01 < x <= 4.70e+010.40000.0167
4.70e+01 < x <= 4.90e+010.14290.0233
4.90e+01 < x <= 5.10e+010.14290.0233
5.10e+01 < x <= 5.40e+010.29410.0283
5.40e+01 < x <= 5.70e+010.33330.0200
5.70e+01 < x <= 6.30e+010.43750.0267
6.30e+01 < x0.26670.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.33330.0300
0.50000.0200
0.33330.0750
0.63640.0550
0.33330.0150
0.33330.0600
0.15380.0650
0.14290.0350
0.40000.0250
0.50000.0500
0.33330.0300
0.20000.0250
0.37500.0400
0.33330.0150
0.25000.0200
0.14290.0350
0.25000.0400
0.25000.0200
0.00000.0050
0.23080.0650
0.60000.0250
0.33330.0300
0.12500.0400
0.00000.0200
0.20000.0250
0.50000.0100
0.60000.0250
0.25000.0200
0.25000.0400
0.00000.0400
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 27840it [00:00, 36056.63it/s]\n", "Testing robustness : 0%| | 0/27840 [00:00\n", "#T_11d09_row0_col0, #T_11d09_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "#T_11d09_row0_col1, #T_11d09_row1_col0 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 2.5e+010.42450.1767
2.5e+01 < x0.27330.8233
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.43590.1950
0.26710.8050
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Quantitative('existing_credits') (19/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.00e+000.30610.6317
1.00e+00 < x <= 2.00e+000.28990.3450
2.00e+00 < x0.28570.0233
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.30000.6500
0.30160.3150
0.28570.0350
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 3it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 3/3 [00:00<00:00, 287.10it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Quantitative('existing_credits'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n", "--- [BinaryCarver] Fit Quantitative('num_dependents') (20/20)\n", " [BinaryCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.0e+000.29840.8433
1.0e+00 < x0.30850.1567
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
0.30000.8500
0.30000.1500
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 1it [00:00, ?it/s]\n", "Testing robustness : 100%|██████████| 1/1 [00:00<00:00, 228.14it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "WARNING: No robust combination for Quantitative('num_dependents'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\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", "
libraryfit_stransform_strain_auctest_aucauc_drop
0AutoCarver6.4050.01100.83210.78740.0447
1optbinning1.0430.01490.85230.79310.0592
2KBinsDiscretizer0.0050.00120.84010.79430.0458
\n", "
" ], "text/plain": [ " library fit_s transform_s train_auc test_auc auc_drop\n", "0 AutoCarver 6.405 0.0110 0.8321 0.7874 0.0447\n", "1 optbinning 1.043 0.0149 0.8523 0.7931 0.0592\n", "2 KBinsDiscretizer 0.005 0.0012 0.8401 0.7943 0.0458" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train_full = pd.concat([y_train, y_dev])\n", "\n", "runs = [(\n", " 'AutoCarver',\n", " lambda: bin_with_autocarver(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, 'binary'),\n", ")]\n", "if HAS_OPTBINNING:\n", " runs.append((\n", " 'optbinning',\n", " lambda: bin_with_optbinning(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, 'binary'),\n", " ))\n", "runs.append((\n", " 'KBinsDiscretizer',\n", " lambda: bin_with_kbins(X_train, X_dev, X_test, categoricals, quantitatives),\n", "))\n", "\n", "rows = []\n", "for name, run in runs:\n", " X_tr, X_te, fit_t, transform_t = run()\n", " scores = fit_eval_binary(X_tr, X_te, y_train_full, y_test)\n", " rows.append({\n", " 'library': name,\n", " 'fit_s': round(fit_t, 3),\n", " 'transform_s': round(transform_t, 4),\n", " 'train_auc': round(scores['train_auc'], 4),\n", " 'test_auc': round(scores['test_auc'], 4),\n", " 'auc_drop': round(scores['train_auc'] - scores['test_auc'], 4),\n", " })\n", "\n", "binary_results = pd.DataFrame(rows)\n", "binary_results" ] }, { "cell_type": "code", "execution_count": 6, "id": "plot-binary", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJsAAAFcCAYAAABvIr+2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVotJREFUeJzt3QucTeX++PEvIzNuM+7XZCgMueU2kZKSSxIVoctIUkcuoyk5IxlSpBNRREToJFJIpRGiOsctt6Tcr5MwozLjklFm/V/f5/z3/u29Z8+YGWuP2Xs+79dr1ey111r7WZe9Huu7n+f7FLAsyxIAAAAAAADABgXt2AgAAAAAAABAsAkAAAAAAAC2omUTAAAAAAAAbEOwCQAAAAAAALYh2AQAAAAAAADbEGwCAAAAAACAbQg2AQAAAAAAwDYEmwAAAAAAAGAbgk0AAAAAAACwDcEmAABwVcyZM0cKFCgghw8fds67/fbbzZTXPPbYY1K8ePEsLav7NGrUKAlUeizCw8Pz1HWj/vWvf0mNGjUkKChIGjVqZOZpObW8uU3Pv5YRAID8imATACBgHTp0SAYOHCi1atWSokWLmqlu3boyYMAA2bFjh+R327dvl0ceeUSqVq0qwcHBUrp0aWnbtq289957cunSJckLfv31V/PgrmUFMvLVV1/J888/L7fccou5fseOHevzg3X+/Hlzba5du5YTAwCAh0KeMwAACASff/659OjRQwoVKiQPP/ywNGzYUAoWLCi7d++WxYsXy7Rp00wwqlq1apIfvfvuu/KPf/xDKlSoII8++qjUrFlTzpw5I6tXr5a+ffvK8ePHZfjw4VclaOAZbBo9erRpoeJorZLX/fnnn+a6g2/o9dqzZ08TIHX4+uuvzfd71qxZUrhwYef8PXv2mPm+Cjbptak8W+ONGDFC/vnPf/rkcwEA8Af8SwgAEHAOHDhgHkY1kKTBk0qVKrm9P378eHn77bdtewg9d+6cFCtWTPzFhg0bTKCpRYsWsnz5cilRooTzvSFDhsjmzZtl586dGa7/999/S1pamttDvV18sc3cFhISkuufaVmWXLhwQYoUKSKBTrvJ6eQqMTHR7Lvn9eMakMpNGmwk4AgAyM/oRgcACDivvfaaCQBpdxrPQJPSh8DBgweb7mOutNVTt27dTHcyDRg0bdpUli1b5jVfzDfffCNPP/20lC9fXq699lpn64Z69eqZLnqtW7c23fZuuOEG+fjjj837uk5kZKR5KK5du7asWrXKbdtHjhwx29T3dJkyZcpI9+7d0+WmcZThv//9r8TExEi5cuVMsOu+++6TpKSkyx4fbY2h63/wwQdugSYH3W9Hnhv9bF329ddfl0mTJsn1119vHuB//vnnLB8z9dNPP8kdd9xh9kuP18svv2wCVp5cczZp96RmzZqZv/v06WPKoZPu/9Vy8OBBad++vTnelStXlpdeeskEejLL2eTI37N//35zXEuWLClhYWFmn7R1jCu9ZvU46XWlx1m7fWorPE/a0uuee+6RFStWmGOux/Wdd94x15224vNGryst++V8+eWXZjt6bYSGhppzMH/+/EzX0eujZcuW5prVsjRp0sR53btauXKltGrVyhwDzYGlZfJsQffWW2/JjTfeaL4/pUqVMvvn+vmeOZv0bz1u+p33vEa85Ww6ffq0PPPMM+Y9PcZ6PUZFRcmpU6fM+xcvXpSRI0eafdDzpOf61ltvlTVr1ji3oZ+t3zvX75PrefeWs0mDtGPGjHF+h/Tzdd9TU1O9ntv//Oc/0rx5c/O90lxU8+bNy/QcAACQl9CyCQAQkF3oNMijgZ2s0mCI5nupUqWK6f6iD5gfffSRdO3aVT755BMTyHGlQSF92NSHUn3Idfjjjz/Mg6K2rNJAkQYK9G8N7GirIW1R9NBDD5lkxhqkSUhIcAZ8vv/+e1m3bp1ZXh+A9YFW19fgiwZ39OHb1aBBg8zDeFxcnFlWg0Gao2rhwoUZ7qcGN7S112233SbXXXddlo+PPsxry5knn3zSmd8pq8fsxIkT0qZNG/Ow7VhuxowZl22FU6dOHRPM0WOsn6sP/EqDGleD5rHq0KGD3HzzzSagGR8fb4697peW83IefPBBqV69uowbN062bt1qujJqUElb2jno+dZAy7333muCop999pm51jQwp7nGXGkXsV69eslTTz0l/fr1M4EbDeDo39oyTQOfDnpt7d2713TvyowGaR5//HFThtjYWBMU2rZtm9lXvW4zMnnyZFNm7bKqwZoFCxaY61+/i506dTLL6PWi340GDRqY46XXkQbgNGjqMHPmTBMI1u9GdHS0ueY0eLtx48YMP//9998319OmTZvMMc3sGjl79qy5jnbt2mX2s3HjxibIpAHSX375RcqWLSsp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jA67du0y+637V6dOHWvlypVeI9V2cS2jXs96zek1ltE+qO+++86UKTEx0e14bdu2ze1crFq1ymrSpIk5fi1atDDfT4ft27ebY6vXsn63GjdubH3//fdu63u2WDp//rxVu3Ztc3wyKp+2yqpXr57ZD/2u3Xnnnc7voZo1a5ZVt25dq3DhwlbFihWtAQMGON/Tz3z77betzp07m+vEcW6WLl1q3XTTTeacVK9e3Ro1apSzFZdeW67XnL721lrS89p0XVbpddyhQwdzHZUvX9565JFHrKSkJLdrR8saHR1tWk/qsYP9qEv8vy6hHqEeUdQj1CNXC/WI/9cjirokd+sSnkcGBPzziF8Hm/QBsmnTpubvzz77zLr++uuttLS0LAWb9AH22WeftW688UbTFUgnnXfp0iXTdadVq1bW5s2brQ0bNpgHZz3IDhqAaNeu3WXL9/HHH5vAxb59+8wDuV48GjDRz3B9WNebri538OBBE7To1q2bOcmuHnjgAec8DWjpl//xxx+3duzYYf3888/WQw89ZB7ItXuf48urD/SPPvqotXPnTjPlVYMHDzaBIA2w/fTTT6bsWln99ttvzn846v5+9dVXZn/vuecec8z0OOj+Tpo0yXS5cpxHrfCVfok0oDFu3Dhrz5491ptvvmkFBQWZ7WQWbNIgkga3dB09F7odx5dar6trrrnGatu2rQmSbNmyxZRNj39mwSYtn94c9u7da82dO9d0E3OUQ7uj6bm76667TDBGgzrNmzfPlWDT888/b64TDRB5e99Bj+lTTz1l3XDDDemuX89gkwYD165da87lrbfearqXOuj3Ta9jrcj0WHz00Udmn13X99Y9TrtD6nsnT55MVz79zhQqVMiaOHGiKZNeI1OnTnVeB3rj1iCUXid6TjWQ6dq9UrerN1btAnvgwAETbP7222/NOZszZ46Zp+dKrzk9h0oDbo4AtV5zjgCc583dcU3qpIFmPX76nVS6nxpgjY2NNcdDg9d6DbRp08bt2tHzo4FKDdq5Bu5gH+oS/69LqEeoRxT1CPXI1UI94v/1iKIuyd26hOeRNwL+ecSvg036EKsPkEqDAWXLljX/0MhKsCmjnE16EjUgoS2HHPShWddztLbRFht6M8oujRDqdhytchwP6459cC2nayum5ORk87CsLaXU+++/b24EjsCa0hu6lmvFihXOL6+2oHHc6PMqbX2iwZsPPvjAOU+DSBp8eu2115z/cNTWXw4ahNJ9Xbhw4WX7R2uU1pW2gOvYsWOmwaZ333033bnXL5/js/S1aws1DWzosc4s2KTBS1fNmjWzhg0bZv7W86rBEr0BOORGyyZt5aOfsXr1aq/v6/dAI9w66XL6a5QG1xwya9nk8MUXX5h5f/75p3mtwT+9YXqT2UOCHiN9b+PGjemOsZZJ3zt8+LDX7eq19MILL2R4LHTdIUOGuM3TllFjx451m6ffOz0Grut5np+M8sDpd/W+++4zgWsNaqsxY8akC1onJCSY7WpQzHHt6K8Z8C3qEv+uS6hHqEccqEeoR64W6hH/rkcUdUnu1yU8jwT+84jf5mzSvC6aJ6lXr17mteaN6dGjh+kvfSV27dolVatWNZND3bp1TX4YfU/977xe3r59+0z5atSoIaGhoWYkAnX06FG35Zo2ber2+u6775ZrrrlGli1bZl5/8sknZv22bdua1z/88IPs379fSpQoYfpk6lS6dGm5cOGCHDhwwLmd+vXrS+HChSUv0/Jqn9RbbrnFOU/3vXnz5s7jrVq0aOH8W/e1du3abu9nxHU9x+vLrdegQQPn35UqVTL/T0xMdM4rWrSoXH/99W7LuL5/uW16rqPXsl5v2lfbQfff17RMek3GxcXJ2bNn073fpk0bM9KcTvpd0zxlHTt2lCNHjlx2uxkdv5iYGHniiSfMtaw5z1yv18w4vnM6+p2nhg0byp133mmu9+7du8vMmTPljz/+cH6u5n/S9zPj+R3U79hLL73k/H7p1K9fP5O/6vz585Jdw4cPl/Xr18unn34qRYoUcX7GmjVr3D4jIiLCvOd6XJo0aZLtz0PWUZf4f11CPUI9khXUI/AV6hH/r0cUdcnVqUt4Hgns5xF7M/vmIg0q/f3331K5cmW3f0hosucpU6ZIwYIF0wWF7Eq+XatWLdm9e/dll+vcubNUq1bNPPxqOdPS0kyiY8+kWsWKFXN7rTfjbt26yfz586Vnz57m/xpIcyRi1sCAnvAPPvgg3WeWK1cuw+0iazTY5eAIbui58/a+Y5nLBSC9reO6zauhSpUq8vHHH5ugkiYD//LLL80/FlyvnxtuuMEt+asm5tbr+eWXX87R8dOhOB966CH54osvzOdpoGvBggVy3333ZVpWR4DQEbB1pYnKV65caRL1f/XVVyZJ/wsvvCAbN26UsmXLZulYeH5X9Ds2evRouf/++9MtGxISItnx73//W9544w1Zu3atOeaun6H3iPHjx6dbxxGk81Y22Iu6hLrEF6hH/od6hHokP6AeoR7xlfxQl/A8EtjPI37ZskmDTPPmzZMJEyY4W17opJE5Dep8+OGHJuhy5swZOXfunHM9XcYzqHPp0iW3eXXq1JGEhAQzOfz8889y+vRp08JJ6cOyjpC1bdu2dGXTgJZ+5m+//WaiwyNGjDCtKnS7jtYWWaEjg8XHx5uR7b7++mvz2qFx48am1VT58uVNMMB10mCAP9EWQnoe/vvf/7odQx2JzHG81YYNG5x/63Hcu3evOaYZnUdv6zleO9bLK7SVll5vJ0+edM7T/c8NGgz95ptv5MSJEybgpN+ZjGhlpEHcP//884qDtc8884wJDOnN87333st0ef28GTNmyG233eYWTPUsm7aO0xuyfi/1mliyZIkJnmmASkfTyw79jun31/P7pZMeA0dlndF156C/HmhLrnfeeUduvvnmdJ+h328tn+dnEGDKHdQlgVGXUI9Qj1CPUI9cLdQjgVGPKOqSq1eX8DwSuM8jfhls+vzzz03AoW/fvqalkOv0wAMPmF8YIiMjTXcnbS6mTcC0ddCcOXPctqMH9dChQyYIderUKUlNTTXde7SppwZ3tm7daroPRUVFSevWrZ1N24YMGWIebDWINHXqVBPkOnjwoHz00UfmBOpNt1SpUmbIQX1I1i5vGjDSLkRZpQ/W2oRRy1G9enWzPw46T1tsdOnSRb777juzDxqlHDx4sPzyyy/iT/Qi7t+/vwwdOtQE1zSwp80DtWmgnl8HbUKoAYOdO3fKY489Zva/a9euzvOoUVl9X8+ja7NCDWK99tprJjil52rRokUSHR0tecldd91lKrjevXvLjh07TJk1SJlRtzG7aXNZvX60y5l2lUtJSTHz9fugQSidtGXRoEGDnNHvnNCg0cCBA81naVc83U+twDyDf1oO/Uz9HmmrJ/2u6XmdNm2a1+1qC6axY8fK5s2bTRfVxYsXS1JSknO72ppKA9Nvvvmm2aZ+r7X1U2ZGjhxpAtoavNIbsO6/lsVxXpQjiKVl9RZI1vnaYktbJ+pxdRxLLZsaMGCA/P7776arrR4HvU+tWLFC+vTpc9lKA/agLgmMuoR6hHqEeoR65GqhHgmMekRRl1zduoTnkQB9HrH8kI5Gdvfdd3t9TxMI62798MMPJlmWZlvXJHW6zowZM9wShOvwljrKW8mSJZ2Z3JVmf9dhOzUxsiY07t69u3XixAm3z9F1dZQzHV3OMdy6DhOpyY8dI5dpQjUdqUyHKtQR7HSELm8JqR0Jlj3pSGH6/siRI9O9p4nboqKiTFJ03X6NGjWsfv36mWTiGQ1dn1dp8uhBgwY590WPoyMZuyPZp442qCOZaVJrHRVBz6+rf/zjH2YoRl3WMVSkJggfPXq0OX86hKQOeT958mS39S53PjRZtc7LTuJ5bwnCdahIV/q+Luc5zKjun46Gp/ur24yPj7d8wdv18csvv1g1a9a0br75ZpM8znV4TP0eaFJzHWHxcgnCXRN863s6T5fVxJA9e/a0qlatavZTE3cPHDjQmTzcsb5OOlqffqYmt9ORD1wTFXqWX0c+ad++vRlJQa+fWrVqWW+99Zbb8tOnTzdJ9TUZvSbV0+vNIaOkh3rsNeGn3j90JAi97vQe4rBs2TJzf9FEit6GGnXdn4yGGtUR+fRY6z1IP0fPvSYHdCT/93btwD7UJYFTl1CPUI8o6hHqkdxGPRI49YiiLsnduoTnkUEB/zxS4P/vHJAn6a8jmlNII7WapD2/0F8SWrVqZVrFuSYjBwBkD/UI9QgAXCnqEuoS5KME4UAg0fxCmv2/Zs2aJsCkXf20+xiBJgAA9QgAgGcS+BuCTUAeoIm5hw0bZnIOad93zR2meYYAAKAeAQDwTAJ/Qzc6AAAAAAAA2MYvR6MDAAAAAABA3kSwCQAAAAAAALYh2AQAAAAAAADbEGwCAAAAAACAbQg2AQAAAAAAwDYEmwAAAAAAAGAbgk0AAAAAAACwDcEmAAAAAAAA2IZgEwAAAAAAAMQu/w8K1O5rKhtv7wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_bars(binary_results, ['fit_s', 'test_auc', 'auc_drop'], 'German Credit \\u2014 binary classification')" ] }, { "cell_type": "markdown", "id": "regression-md", "metadata": {}, "source": [ "## Regression — California Housing\n", "\n", "6 numeric demographic features (Latitude / Longitude dropped — see comment in the next cell), 20,640 rows, target = median house value. Same 60 / 20 / 20 split." ] }, { "cell_type": "code", "execution_count": 7, "id": "load-regression", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train=12384, dev=4128, test=4128\n", "quantitatives=8 (['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n" ] } ], "source": [ "housing = fetch_california_housing(as_frame=True)\n", "X_reg = housing.frame.drop(columns=['MedHouseVal'])\n", "y_reg = housing.frame['MedHouseVal']\n", "\n", "X_train, X_rest, y_train, y_rest = train_test_split(X_reg, y_reg, test_size=0.4, random_state=SEED)\n", "X_dev, X_test, y_dev, y_test = train_test_split(X_rest, y_rest, test_size=0.5, random_state=SEED)\n", "\n", "quantitatives = list(X_reg.columns)\n", "categoricals = []\n", "\n", "print(f'train={len(X_train)}, dev={len(X_dev)}, test={len(X_test)}')\n", "print(f'quantitatives={len(quantitatives)} ({quantitatives})')" ] }, { "cell_type": "code", "execution_count": 8, "id": "adebc1c4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------\n", "--- [QuantitativeDiscretizer] Fit Features(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n", " - [ContinuousDiscretizer] Fit Features(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n", " - [OrdinalDiscretizer] Fit Features(['HouseAge'])\n", "------\n", "\n", "---------\n", "------ [ContinuousCarver] Fit Features(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n", "--- [ContinuousCarver] Fit Quantitative('MedInc') (1/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.335e+001.19840.0250
1.335e+00 < x <= 1.593e+001.01050.0250
1.593e+00 < x <= 1.740e+001.11330.0250
1.740e+00 < x <= 1.906e+001.15350.0252
1.906e+00 < x <= 2.029e+001.20900.0248
2.029e+00 < x <= 2.152e+001.21410.0251
2.152e+00 < x <= 2.243e+001.24170.0250
2.243e+00 < x <= 2.350e+001.38270.0249
2.350e+00 < x <= 2.468e+001.36140.0250
2.468e+00 < x <= 2.569e+001.41900.0250
2.569e+00 < x <= 2.655e+001.52640.0250
2.655e+00 < x <= 2.737e+001.54280.0250
2.737e+00 < x <= 2.862e+001.57080.0250
2.862e+00 < x <= 2.974e+001.66300.0250
2.974e+00 < x <= 3.054e+001.62700.0250
3.054e+00 < x <= 3.135e+001.70790.0250
3.135e+00 < x <= 3.216e+001.85540.0250
3.216e+00 < x <= 3.315e+001.83730.0250
3.315e+00 < x <= 3.423e+001.91210.0250
3.423e+00 < x <= 3.531e+001.91620.0251
3.531e+00 < x <= 3.633e+001.96780.0250
3.633e+00 < x <= 3.723e+002.02260.0250
3.723e+00 < x <= 3.839e+001.98910.0251
3.839e+00 < x <= 3.971e+002.04930.0249
3.971e+00 < x <= 4.073e+002.05380.0252
4.073e+00 < x <= 4.179e+002.20040.0249
4.179e+00 < x <= 4.315e+002.24170.0250
4.315e+00 < x <= 4.464e+002.23940.0250
4.464e+00 < x <= 4.611e+002.25770.0252
4.611e+00 < x <= 4.757e+002.43510.0248
4.757e+00 < x <= 4.946e+002.34820.0250
4.946e+00 < x <= 5.117e+002.45920.0250
5.117e+00 < x <= 5.308e+002.57840.0250
5.308e+00 < x <= 5.538e+002.68920.0250
5.538e+00 < x <= 5.828e+002.78670.0251
5.828e+00 < x <= 6.148e+003.09430.0249
6.148e+00 < x <= 6.599e+003.30310.0250
6.599e+00 < x <= 7.313e+003.60640.0250
7.313e+00 < x <= 8.433e+004.01910.0250
8.433e+00 < x4.73430.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.25070.0247
1.03190.0262
1.15870.0257
1.08550.0252
1.25230.0225
1.26060.0293
1.26430.0208
1.33350.0274
1.45280.0257
1.48870.0305
1.51420.0237
1.64850.0208
1.55440.0293
1.61890.0257
1.74330.0233
1.63690.0213
1.78020.0276
1.97210.0283
1.82870.0279
1.82950.0242
1.99070.0300
1.95170.0216
2.02200.0269
2.15090.0269
2.09770.0291
2.20540.0225
2.29790.0274
2.35530.0274
2.29240.0184
2.44010.0213
2.29310.0250
2.49400.0237
2.61330.0250
2.71770.0189
2.91100.0276
3.07290.0213
3.07590.0271
3.59850.0228
4.03850.0206
4.61310.0264
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 25379.50it/s]\n", "Testing robustness : 0%| | 0/92170 [00:00\n", "#T_9c689_row0_col0, #T_9c689_row4_col1 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_9c689_row0_col1, #T_9c689_row2_col1 {\n", " background-color: #ed8366;\n", " color: #f1f1f1;\n", "}\n", "#T_9c689_row1_col0 {\n", " background-color: #688aef;\n", " color: #f1f1f1;\n", "}\n", "#T_9c689_row1_col1 {\n", " background-color: #c0d4f5;\n", " color: #000000;\n", "}\n", "#T_9c689_row2_col0 {\n", " background-color: #9dbdff;\n", " color: #000000;\n", "}\n", "#T_9c689_row3_col0 {\n", " background-color: #d7dce3;\n", " color: #000000;\n", "}\n", "#T_9c689_row3_col1, #T_9c689_row4_col0 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 2.47e+001.20930.2250
2.47e+00 < x <= 3.13e+001.57960.1750
3.13e+00 < x <= 4.07e+001.95600.2251
4.07e+00 < x <= 5.83e+002.42380.2499
5.83e+00 < x3.75240.1249
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.23230.2275
1.59340.1747
1.96040.2425
2.46520.2372
3.68700.1182
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('HouseAge') (2/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 5.00e+002.23580.0271
5.00e+00 < x <= 8.00e+001.97270.0263
8.00e+00 < x <= 1.10e+011.81330.0352
1.10e+01 < x <= 1.30e+011.83580.0267
1.30e+01 < x <= 1.40e+011.87780.0200
1.40e+01 < x <= 1.60e+011.93550.0652
1.60e+01 < x <= 1.70e+011.89290.0319
1.70e+01 < x <= 1.80e+011.94550.0276
1.80e+01 < x <= 2.00e+011.94700.0470
2.00e+01 < x <= 2.10e+011.96300.0217
2.10e+01 < x <= 2.20e+012.06610.0195
2.20e+01 < x <= 2.30e+011.95930.0220
2.30e+01 < x <= 2.50e+012.17130.0480
2.50e+01 < x <= 2.60e+012.09370.0304
2.60e+01 < x <= 2.70e+012.05680.0245
2.70e+01 < x <= 2.80e+011.98270.0241
2.80e+01 < x <= 2.90e+012.02030.0232
2.90e+01 < x <= 3.00e+012.05150.0236
3.00e+01 < x <= 3.20e+012.04530.0484
3.20e+01 < x <= 3.30e+012.03430.0316
3.30e+01 < x <= 3.40e+012.13570.0320
3.40e+01 < x <= 3.50e+012.00040.0399
3.50e+01 < x <= 3.60e+012.11480.0437
3.60e+01 < x <= 3.70e+012.00040.0257
3.70e+01 < x <= 3.90e+012.01330.0355
3.90e+01 < x <= 4.10e+012.03060.0273
4.10e+01 < x <= 4.20e+011.98890.0167
4.20e+01 < x <= 4.40e+012.07420.0351
4.40e+01 < x <= 4.50e+012.29770.0132
4.50e+01 < x <= 4.70e+011.95170.0211
4.70e+01 < x2.58480.0857
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.07200.0245
1.92010.0269
1.90540.0344
1.87360.0216
1.84100.0196
1.88260.0606
1.85920.0375
1.87990.0283
1.87460.0436
1.98490.0206
2.21810.0170
2.15500.0201
2.08470.0579
2.07780.0296
2.17840.0216
2.22420.0208
1.78020.0213
1.76290.0233
2.04930.0504
1.93430.0259
2.08370.0349
2.19570.0417
2.01570.0431
2.20060.0296
2.00260.0351
1.94610.0305
1.91960.0194
2.01170.0312
2.13100.0155
2.05150.0225
2.59680.0911
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 31930it [00:01, 30868.38it/s]\n", "Testing robustness : 1%| | 310/31930 [00:01<01:51, 284.45it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 2.30e+011.94660.3703
2.30e+01 < x <= 2.60e+012.14120.0785
2.60e+01 < x <= 3.60e+012.05260.2909
3.60e+01 < x <= 4.70e+012.03810.1747
4.70e+01 < x2.58480.0857
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.93160.3547
2.08240.0875
2.03830.2829
2.03470.1839
2.59680.0911
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('AveRooms') (3/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 3.066e+001.95060.0250
3.066e+00 < x <= 3.432e+001.88800.0250
3.432e+00 < x <= 3.647e+001.82330.0250
3.647e+00 < x <= 3.792e+001.82920.0250
3.792e+00 < x <= 3.933e+001.78470.0250
3.933e+00 < x <= 4.052e+001.84990.0250
4.052e+00 < x <= 4.168e+001.87180.0250
4.168e+00 < x <= 4.276e+001.83330.0250
4.276e+00 < x <= 4.365e+001.79650.0250
4.365e+00 < x <= 4.454e+001.69520.0250
4.454e+00 < x <= 4.536e+001.75350.0250
4.536e+00 < x <= 4.621e+001.79520.0250
4.621e+00 < x <= 4.705e+001.84650.0250
4.705e+00 < x <= 4.794e+001.74860.0250
4.794e+00 < x <= 4.874e+001.77190.0250
4.874e+00 < x <= 4.941e+001.72190.0251
4.941e+00 < x <= 5.014e+001.71760.0249
5.014e+00 < x <= 5.088e+001.77070.0250
5.088e+00 < x <= 5.160e+001.79180.0250
5.160e+00 < x <= 5.233e+001.77910.0250
5.233e+00 < x <= 5.315e+001.82090.0250
5.315e+00 < x <= 5.384e+001.91070.0250
5.384e+00 < x <= 5.460e+001.77280.0250
5.460e+00 < x <= 5.532e+001.89960.0250
5.532e+00 < x <= 5.616e+001.88720.0250
5.616e+00 < x <= 5.694e+001.99050.0250
5.694e+00 < x <= 5.778e+002.00290.0250
5.778e+00 < x <= 5.858e+002.01070.0250
5.858e+00 < x <= 5.959e+002.11370.0250
5.959e+00 < x <= 6.059e+002.04690.0250
6.059e+00 < x <= 6.157e+002.14500.0250
6.157e+00 < x <= 6.270e+002.24770.0250
6.270e+00 < x <= 6.396e+002.34950.0250
6.396e+00 < x <= 6.543e+002.42320.0250
6.543e+00 < x <= 6.717e+002.62410.0250
6.717e+00 < x <= 6.946e+002.75730.0250
6.946e+00 < x <= 7.233e+003.07630.0250
7.233e+00 < x <= 7.637e+003.11180.0250
7.637e+00 < x <= 8.324e+003.58460.0250
8.324e+00 < x2.73910.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.09080.0233
1.85790.0264
2.00310.0242
1.80600.0274
1.81370.0240
1.77250.0211
1.77230.0283
1.78390.0247
1.79020.0286
1.81210.0264
1.62650.0264
1.83490.0276
1.83390.0247
1.77250.0342
1.81880.0254
1.84800.0191
1.83330.0235
1.81910.0266
1.74190.0266
1.76420.0220
1.76450.0303
1.79170.0266
1.86510.0262
1.86450.0274
1.80820.0286
1.84830.0177
2.07780.0240
2.00050.0187
1.97240.0291
2.26230.0235
2.08180.0230
2.28890.0250
2.32800.0213
2.53730.0254
2.67870.0201
2.74570.0211
3.01080.0303
3.15960.0233
3.43400.0235
2.75680.0245
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 24989.21it/s]\n", "Testing robustness : 0%| | 227/92170 [00:00<04:38, 329.59it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 3.65e+001.88740.0750
3.65e+00 < x <= 5.62e+001.80220.5500
5.62e+00 < x <= 6.16e+002.05160.1500
6.16e+00 < x <= 6.54e+002.34010.0750
6.54e+00 < x2.98230.1500
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.97880.0739
1.79620.5758
2.04740.1359
2.38860.0717
2.97520.1427
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('AveBedrms') (4/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 9.1220e-012.05110.0250
9.1220e-01 < x <= 9.4022e-012.12640.0250
9.4022e-01 < x <= 9.5595e-012.06380.0250
9.5595e-01 < x <= 9.6743e-012.07560.0251
9.6743e-01 < x <= 9.7590e-012.25620.0249
9.7590e-01 < x <= 9.8343e-012.17090.0250
9.8343e-01 < x <= 9.8987e-012.14500.0250
9.8987e-01 < x <= 9.9592e-012.17720.0250
9.9592e-01 < x <= 1.0019e+002.19150.0251
1.0019e+00 < x <= 1.0068e+002.09490.0249
1.0068e+00 < x <= 1.0112e+002.24400.0250
1.0112e+00 < x <= 1.0156e+002.16870.0250
1.0156e+00 < x <= 1.0204e+002.17230.0250
1.0204e+00 < x <= 1.0250e+002.20030.0254
1.0250e+00 < x <= 1.0290e+002.13240.0246
1.0290e+00 < x <= 1.0331e+002.18400.0250
1.0331e+00 < x <= 1.0369e+002.03210.0250
1.0369e+00 < x <= 1.0412e+002.17460.0250
1.0412e+00 < x <= 1.0453e+002.25360.0250
1.0453e+00 < x <= 1.0493e+002.15460.0250
1.0493e+00 < x <= 1.0534e+002.07380.0251
1.0534e+00 < x <= 1.0574e+002.12240.0249
1.0574e+00 < x <= 1.0615e+002.04140.0250
1.0615e+00 < x <= 1.0662e+002.15690.0251
1.0662e+00 < x <= 1.0712e+002.09720.0250
1.0712e+00 < x <= 1.0763e+002.07140.0249
1.0763e+00 < x <= 1.0816e+002.02440.0250
1.0816e+00 < x <= 1.0874e+002.01350.0252
1.0874e+00 < x <= 1.0933e+002.22390.0249
1.0933e+00 < x <= 1.1000e+002.02440.0262
1.1000e+00 < x <= 1.1071e+002.00770.0242
1.1071e+00 < x <= 1.1160e+001.95640.0245
1.1160e+00 < x <= 1.1267e+002.00770.0250
1.1267e+00 < x <= 1.1387e+001.93050.0250
1.1387e+00 < x <= 1.1538e+001.81300.0258
1.1538e+00 < x <= 1.1739e+001.80600.0242
1.1739e+00 < x <= 1.2074e+001.91090.0250
1.2074e+00 < x <= 1.2730e+001.89500.0250
1.2730e+00 < x <= 1.5018e+001.79620.0250
1.5018e+00 < x1.49310.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.79610.0252
2.00980.0298
2.30390.0257
2.23900.0262
2.32930.0240
1.93180.0194
2.15750.0199
2.17400.0291
2.22070.0337
2.18110.0233
2.04750.0262
2.27430.0218
2.26270.0293
2.10680.0247
2.44590.0228
2.12800.0269
2.11930.0240
2.22800.0259
2.03360.0237
2.01950.0216
1.98980.0235
2.22700.0216
1.92440.0254
2.15090.0237
2.22230.0274
1.96540.0271
2.10850.0257
2.03320.0240
1.92620.0264
2.11390.0274
1.90250.0225
1.86280.0271
1.95010.0259
2.02310.0206
1.86220.0271
1.81370.0250
2.03990.0259
1.63920.0218
1.72210.0250
1.60190.0240
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 24396.36it/s]\n", "Testing robustness : 2%|▏ | 1722/92170 [00:05<04:27, 338.26it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 1.049e+002.15350.5000
1.049e+00 < x <= 1.093e+002.09150.2250
1.093e+00 < x <= 1.139e+001.98570.1249
1.139e+00 < x <= 1.207e+001.84340.0750
1.207e+00 < x1.72790.0750
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.15260.5029
2.05820.2248
1.97070.1235
1.90570.0780
1.65580.0707
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('Population') (5/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 2.08e+021.90500.0251
2.08e+02 < x <= 3.53e+022.02770.0251
3.53e+02 < x <= 4.42e+022.06550.0250
4.42e+02 < x <= 5.12e+022.20670.0249
5.12e+02 < x <= 5.75e+022.13270.0250
5.75e+02 < x <= 6.27e+022.07310.0250
6.27e+02 < x <= 6.75e+022.36270.0249
6.75e+02 < x <= 7.16e+022.20060.0250
7.16e+02 < x <= 7.56e+022.09000.0253
7.56e+02 < x <= 7.94e+022.01910.0251
7.94e+02 < x <= 8.32e+022.32480.0251
8.32e+02 < x <= 8.67e+022.07630.0253
8.67e+02 < x <= 9.02e+022.03130.0247
9.02e+02 < x <= 9.40e+022.11850.0247
9.40e+02 < x <= 9.78e+022.17900.0253
9.78e+02 < x <= 1.02e+032.07460.0249
1.02e+03 < x <= 1.06e+031.95220.0247
1.06e+03 < x <= 1.09e+032.11860.0250
1.09e+03 < x <= 1.13e+032.05920.0252
1.13e+03 < x <= 1.17e+032.06400.0252
1.17e+03 < x <= 1.22e+032.01340.0249
1.22e+03 < x <= 1.26e+032.16900.0250
1.26e+03 < x <= 1.30e+032.05580.0248
1.30e+03 < x <= 1.35e+031.97110.0249
1.35e+03 < x <= 1.41e+032.01850.0250
1.41e+03 < x <= 1.46e+032.00040.0251
1.46e+03 < x <= 1.52e+032.09110.0248
1.52e+03 < x <= 1.59e+032.13220.0254
1.59e+03 < x <= 1.66e+031.99490.0246
1.66e+03 < x <= 1.73e+032.02330.0250
1.73e+03 < x <= 1.82e+031.89460.0253
1.82e+03 < x <= 1.91e+031.95040.0247
1.91e+03 < x <= 2.02e+032.00740.0250
2.02e+03 < x <= 2.16e+032.02130.0250
2.16e+03 < x <= 2.32e+032.05410.0250
2.32e+03 < x <= 2.56e+032.07570.0250
2.56e+03 < x <= 2.86e+032.01420.0250
2.86e+03 < x <= 3.28e+031.91960.0250
3.28e+03 < x <= 4.25e+032.04390.0250
4.25e+03 < x2.00100.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.98950.0269
1.81890.0271
2.14790.0271
2.24340.0266
2.12810.0269
2.29080.0257
2.09260.0283
2.17570.0213
2.21820.0259
2.14330.0286
2.07690.0293
2.18890.0240
2.04880.0218
2.15850.0247
2.06990.0259
2.03960.0247
1.98430.0254
2.10620.0213
1.98230.0242
2.13530.0271
2.11320.0230
1.96960.0252
2.12430.0196
1.97740.0245
1.80020.0245
2.15000.0264
1.94710.0293
1.95350.0262
2.09150.0274
2.03900.0228
2.13800.0211
1.97060.0203
1.87170.0264
1.90820.0247
2.08950.0233
1.81310.0266
2.00190.0269
2.02340.0201
2.15580.0262
2.03390.0225
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 23487.99it/s]\n", "Testing robustness : 1%| | 753/92170 [00:01<04:00, 380.31it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 3.53e+021.96630.0502
3.53e+02 < x <= 8.32e+022.16360.2253
8.32e+02 < x <= 1.73e+032.06040.4745
1.73e+03 < x <= 2.16e+031.96830.1000
2.16e+03 < x2.01810.1500
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.90380.0540
2.16590.2398
2.04450.4680
1.96390.0925
2.01690.1456
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('AveOccup') (6/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 1.699e+002.61410.0250
1.699e+00 < x <= 1.868e+002.79860.0250
1.868e+00 < x <= 1.976e+002.69790.0250
1.976e+00 < x <= 2.071e+002.55580.0250
2.071e+00 < x <= 2.161e+002.45820.0250
2.161e+00 < x <= 2.228e+002.27570.0250
2.228e+00 < x <= 2.288e+002.35920.0250
2.288e+00 < x <= 2.341e+002.25070.0250
2.341e+00 < x <= 2.388e+002.13710.0250
2.388e+00 < x <= 2.435e+002.27080.0250
2.435e+00 < x <= 2.475e+002.19890.0250
2.475e+00 < x <= 2.515e+002.15640.0250
2.515e+00 < x <= 2.557e+002.12790.0250
2.557e+00 < x <= 2.598e+002.24280.0250
2.598e+00 < x <= 2.639e+002.11160.0250
2.639e+00 < x <= 2.674e+002.23430.0250
2.674e+00 < x <= 2.712e+002.04890.0250
2.712e+00 < x <= 2.746e+002.21960.0250
2.746e+00 < x <= 2.784e+002.12110.0250
2.784e+00 < x <= 2.824e+002.26450.0250
2.824e+00 < x <= 2.861e+002.15650.0251
2.861e+00 < x <= 2.899e+002.23230.0250
2.899e+00 < x <= 2.943e+002.07140.0250
2.943e+00 < x <= 2.984e+002.04950.0250
2.984e+00 < x <= 3.026e+001.99170.0250
3.026e+00 < x <= 3.071e+001.96230.0250
3.071e+00 < x <= 3.117e+002.04910.0250
3.117e+00 < x <= 3.168e+001.93360.0250
3.168e+00 < x <= 3.221e+001.94720.0250
3.221e+00 < x <= 3.279e+001.89380.0250
3.279e+00 < x <= 3.344e+001.88040.0250
3.344e+00 < x <= 3.424e+001.87240.0250
3.424e+00 < x <= 3.508e+001.80000.0250
3.508e+00 < x <= 3.606e+001.65710.0250
3.606e+00 < x <= 3.719e+001.56240.0250
3.719e+00 < x <= 3.870e+001.57090.0250
3.870e+00 < x <= 4.089e+001.48540.0250
4.089e+00 < x <= 4.317e+001.42400.0250
4.317e+00 < x <= 4.705e+001.32330.0250
4.705e+00 < x1.52800.0250
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.75240.0220
2.77630.0293
2.65020.0257
2.59900.0242
2.48280.0296
2.40390.0247
2.25670.0281
2.41370.0230
2.34710.0211
2.24250.0300
2.09110.0252
2.20720.0259
2.13700.0262
2.09730.0281
2.01880.0230
2.08250.0225
2.26150.0247
2.01140.0213
2.23140.0257
2.02030.0233
2.09080.0286
1.88870.0233
1.98940.0250
2.23160.0228
2.08910.0291
1.97870.0223
2.08180.0279
1.86020.0203
1.96110.0189
1.72650.0230
1.77890.0259
1.83410.0274
1.64810.0211
1.69890.0247
1.62670.0271
1.55470.0250
1.41500.0293
1.53640.0220
1.42450.0262
1.55980.0266
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 25299.64it/s]\n", "Testing robustness : 0%| | 0/92170 [00:00\n", "#T_2b75c_row0_col0, #T_2b75c_row1_col1 {\n", " background-color: #b40426;\n", " color: #f1f1f1;\n", "}\n", "#T_2b75c_row0_col1 {\n", " background-color: #6788ee;\n", " color: #f1f1f1;\n", "}\n", "#T_2b75c_row1_col0 {\n", " background-color: #f6bfa6;\n", " color: #000000;\n", "}\n", "#T_2b75c_row2_col0 {\n", " background-color: #cad8ef;\n", " color: #000000;\n", "}\n", "#T_2b75c_row2_col1 {\n", " background-color: #edd1c2;\n", " color: #000000;\n", "}\n", "#T_2b75c_row3_col0 {\n", " background-color: #6384eb;\n", " color: #f1f1f1;\n", "}\n", "#T_2b75c_row3_col1, #T_2b75c_row4_col0 {\n", " background-color: #3b4cc0;\n", " color: #f1f1f1;\n", "}\n", "#T_2b75c_row4_col1 {\n", " background-color: #506bda;\n", " color: #f1f1f1;\n", "}\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequency
x <= 2.16e+002.62500.1250
2.16e+00 < x <= 2.90e+002.20050.4251
2.90e+00 < x <= 3.51e+001.95010.2749
3.51e+00 < x <= 3.87e+001.59680.0750
3.87e+00 < x1.44020.1000
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.64840.1308
2.16650.4247
1.93110.2636
1.62650.0768
1.48010.1042
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('Latitude') (7/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= 3.275e+011.59120.0287
3.275e+01 < x <= 3.284e+011.94710.0220
3.284e+01 < x <= 3.321e+012.10380.0246
3.321e+01 < x <= 3.365e+012.78330.0279
3.365e+01 < x <= 3.374e+012.43260.0268
3.374e+01 < x <= 3.379e+012.18290.0262
3.379e+01 < x <= 3.383e+012.42320.0229
3.383e+01 < x <= 3.387e+012.30030.0241
3.387e+01 < x <= 3.391e+012.15700.0279
3.391e+01 < x <= 3.394e+011.63000.0242
3.394e+01 < x <= 3.397e+011.85940.0225
3.397e+01 < x <= 3.400e+011.94820.0224
3.400e+01 < x <= 3.403e+012.12670.0277
3.403e+01 < x <= 3.406e+012.40210.0339
3.406e+01 < x <= 3.408e+012.24760.0214
3.408e+01 < x <= 3.410e+012.10030.0203
3.410e+01 < x <= 3.413e+012.36460.0242
3.413e+01 < x <= 3.417e+012.77710.0301
3.417e+01 < x <= 3.420e+012.50610.0174
3.420e+01 < x <= 3.427e+012.34630.0262
3.427e+01 < x <= 3.453e+012.45590.0240
3.453e+01 < x <= 3.532e+011.49140.0246
3.532e+01 < x <= 3.623e+010.92080.0250
3.623e+01 < x <= 3.672e+011.24410.0262
3.672e+01 < x <= 3.697e+011.31290.0253
3.697e+01 < x <= 3.729e+012.62410.0239
3.729e+01 < x <= 3.737e+012.65740.0258
3.737e+01 < x <= 3.753e+013.01050.0255
3.753e+01 < x <= 3.765e+012.41970.0243
3.765e+01 < x <= 3.772e+012.11740.0256
3.772e+01 < x <= 3.777e+012.55370.0286
3.777e+01 < x <= 3.781e+012.76470.0221
3.781e+01 < x <= 3.793e+012.61810.0238
3.793e+01 < x <= 3.800e+011.76220.0250
3.800e+01 < x <= 3.826e+011.59240.0243
3.826e+01 < x <= 3.850e+011.85700.0254
3.850e+01 < x <= 3.863e+011.39810.0241
3.863e+01 < x <= 3.898e+011.39620.0251
3.898e+01 < x <= 3.975e+011.12410.0255
3.975e+01 < x0.84420.0244
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.57610.0320
1.94450.0298
2.23180.0254
2.71150.0264
2.43680.0262
2.29100.0291
2.35280.0220
2.32330.0233
2.09370.0368
1.63190.0230
1.79920.0235
1.94080.0250
2.12920.0250
2.32610.0334
2.27130.0233
2.28170.0211
2.22280.0216
2.82240.0303
2.31780.0187
2.27780.0279
2.50250.0252
1.37190.0201
0.93360.0218
1.25160.0259
1.25970.0274
2.55070.0240
2.53510.0266
2.98270.0283
2.65190.0194
2.08690.0203
2.61450.0242
2.52720.0208
2.62460.0308
1.66300.0250
1.51560.0206
1.75490.0225
1.31010.0196
1.39970.0279
1.11140.0235
0.86710.0225
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 26786.63it/s]\n", "Testing robustness : 0%| | 1/92170 [00:00<5:13:31, 4.90it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= 3.45e+012.23110.5254
3.45e+01 < x <= 3.70e+011.24150.1011
3.70e+01 < x <= 3.79e+012.59270.1997
3.79e+01 < x <= 3.85e+011.73930.0748
3.85e+01 < x1.19070.0991
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.21110.5487
1.20650.0952
2.59020.1945
1.64880.0681
1.18010.0935
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Quantitative('Longitude') (8/8)\n", " [ContinuousCarver] Raw distribution\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", "
X distribution
 target_meanfrequency
x <= -1.2269e+021.40630.0259
-1.2269e+02 < x <= -1.2247e+022.88780.0259
-1.2247e+02 < x <= -1.2241e+023.23970.0245
-1.2241e+02 < x <= -1.2229e+022.15820.0262
-1.2229e+02 < x <= -1.2223e+022.34630.0260
-1.2223e+02 < x <= -1.2215e+022.25980.0216
-1.2215e+02 < x <= -1.2206e+022.56650.0263
-1.2206e+02 < x <= -1.2199e+022.62650.0253
-1.2199e+02 < x <= -1.2191e+022.69240.0237
-1.2191e+02 < x <= -1.2181e+022.29190.0255
-1.2181e+02 < x <= -1.2157e+021.71030.0242
-1.2157e+02 < x <= -1.2139e+021.17360.0252
-1.2139e+02 < x <= -1.2127e+021.32700.0263
-1.2127e+02 < x <= -1.2101e+021.48570.0238
-1.2101e+02 < x <= -1.2064e+021.47160.0245
-1.2064e+02 < x <= -1.2007e+021.33760.0254
-1.2007e+02 < x <= -1.1972e+021.26240.0258
-1.1972e+02 < x <= -1.1929e+021.33320.0239
-1.1929e+02 < x <= -1.1897e+021.33000.0250
-1.1897e+02 < x <= -1.1852e+022.72110.0258
-1.1852e+02 < x <= -1.1843e+023.16530.0284
-1.1843e+02 < x <= -1.1838e+023.44320.0238
-1.1838e+02 < x <= -1.1834e+022.74800.0249
-1.1834e+02 < x <= -1.1830e+022.34350.0271
-1.1830e+02 < x <= -1.1827e+021.84820.0207
-1.1827e+02 < x <= -1.1822e+021.67140.0273
-1.1822e+02 < x <= -1.1818e+021.80550.0227
-1.1818e+02 < x <= -1.1813e+022.14800.0287
-1.1813e+02 < x <= -1.1808e+022.24940.0243
-1.1808e+02 < x <= -1.1801e+022.40790.0245
-1.1801e+02 < x <= -1.1795e+022.17940.0252
-1.1795e+02 < x <= -1.1790e+022.28970.0216
-1.1790e+02 < x <= -1.1780e+022.48200.0266
-1.1780e+02 < x <= -1.1766e+022.28640.0248
-1.1766e+02 < x <= -1.1739e+021.67910.0237
-1.1739e+02 < x <= -1.1725e+021.63800.0290
-1.1725e+02 < x <= -1.1716e+022.05120.0229
-1.1716e+02 < x <= -1.1708e+021.51130.0249
-1.1708e+02 < x <= -1.1696e+021.66690.0235
-1.1696e+02 < x1.17690.0245
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
1.39270.0216
3.01290.0233
3.18990.0225
2.19110.0271
2.35760.0254
2.23420.0199
2.98620.0240
2.54710.0240
2.69690.0230
2.14640.0250
1.71050.0218
1.09590.0220
1.29180.0291
1.37810.0230
1.47670.0225
1.24410.0252
1.28100.0281
1.28130.0252
1.42230.0274
2.70810.0218
3.25480.0266
3.36040.0242
2.80640.0262
2.23950.0305
1.75510.0191
1.76950.0242
1.61750.0298
2.08810.0264
2.34870.0245
2.43220.0235
2.18310.0286
2.18750.0211
2.52020.0288
2.27010.0235
1.74640.0225
1.87480.0310
2.14660.0266
1.44790.0279
1.57460.0271
1.24650.0259
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Computing associations: 92170it [00:03, 24160.68it/s]\n", "Testing robustness : 0%| | 1/92170 [00:00<5:15:41, 4.87it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " [ContinuousCarver] Carved distribution\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\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", "
X distribution
 target_meanfrequency
x <= -1.218e+022.44380.2509
-1.218e+02 < x <= -1.190e+021.37870.2242
-1.190e+02 < x <= -1.183e+023.01750.1029
-1.183e+02 < x <= -1.177e+022.16010.2735
-1.177e+02 < x1.61550.1486
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_dev distribution
target_meanfrequency
2.47800.2357
1.34870.2243
3.04140.0988
2.13280.2800
1.67630.1611
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
libraryfit_stransform_strain_r2test_r2r2_drop
0AutoCarver40.2140.06190.66330.65660.0067
1optbinning2.6860.00780.51450.50770.0068
2KBinsDiscretizer0.0080.00140.61810.6192-0.0011
\n", "
" ], "text/plain": [ " library fit_s transform_s train_r2 test_r2 r2_drop\n", "0 AutoCarver 40.214 0.0619 0.6633 0.6566 0.0067\n", "1 optbinning 2.686 0.0078 0.5145 0.5077 0.0068\n", "2 KBinsDiscretizer 0.008 0.0014 0.6181 0.6192 -0.0011" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train_full = pd.concat([y_train, y_dev])\n", "\n", "runs = [(\n", " 'AutoCarver',\n", " lambda: bin_with_autocarver(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, 'continuous'),\n", ")]\n", "if HAS_OPTBINNING:\n", " runs.append((\n", " 'optbinning',\n", " lambda: bin_with_optbinning(X_train, y_train, X_dev, y_dev, X_test, categoricals, quantitatives, 'continuous'),\n", " ))\n", "runs.append((\n", " 'KBinsDiscretizer',\n", " lambda: bin_with_kbins(X_train, X_dev, X_test, categoricals, quantitatives),\n", "))\n", "\n", "rows = []\n", "for name, run in runs:\n", " X_tr, X_te, fit_t, transform_t = run()\n", " scores = fit_eval_regression(X_tr, X_te, y_train_full, y_test)\n", " rows.append({\n", " 'library': name,\n", " 'fit_s': round(fit_t, 3),\n", " 'transform_s': round(transform_t, 4),\n", " 'train_r2': round(scores['train_r2'], 4),\n", " 'test_r2': round(scores['test_r2'], 4),\n", " 'r2_drop': round(scores['train_r2'] - scores['test_r2'], 4),\n", " })\n", "\n", "regression_results = pd.DataFrame(rows)\n", "regression_results" ] }, { "cell_type": "code", "execution_count": 9, "id": "plot-regression", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_bars(regression_results, ['fit_s', 'test_r2', 'r2_drop'], 'California Housing \\u2014 regression')" ] }, { "cell_type": "markdown", "id": "notes-md", "metadata": {}, "source": [ "## How to read these numbers\n", "\n", "- **`fit_s` / `transform_s`** measure only `.fit` / `.transform` wall-clock — not data loading, not one-hot encoding, not the downstream model.\n", "- **`test_auc` / `test_r2`** are the headline metric. They reflect how well a *simple* downstream model performs on each library's binned output. A tree-based downstream model would tell a different (and less binning-sensitive) story.\n", "- **`auc_drop` / `r2_drop`** are `train - test` and measure how much each library's bins overfit. Lower is more robust. AutoCarver's dev-set veto is designed to keep this small.\n", "- **Same data, same seed, same downstream model** across libraries — but a single run, on one machine, with one set of hyper-parameters. Treat as illustrative.\n", "\n", "## When the result will move\n", "\n", "- **Bigger `max_n_mod` / smaller `min_freq`** will improve AutoCarver and optbinning's in-sample scores at the cost of `*_drop`. KBins doesn't have a target, so it's mostly insensitive.\n", "- **Different downstream model.** Gradient-boosted trees on the raw features beat any binning + linear pipeline. The point of binning is interpretability, not raw accuracy.\n", "- **Different dataset.** German Credit is small; on a 10M-row credit-risk dataset, `fit_s` is what dominates the comparison.\n", "\n", "See [comparison.rst](../../comparison.html) for the qualitative scope and algorithmic comparison." ] }, { "cell_type": "markdown", "id": "fe8171ac", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "AutoCarver", "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.13.13" } }, "nbformat": 4, "nbformat_minor": 5 }