{ "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 ProcessingConfig\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": [ "from AutoCarver.combinations.binary import CramervCombinations\n", "\n", "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, numericals=quantitatives)\n", " config = ProcessingConfig(verbose=True) # showing statistics\n", " combination_evaluator = CramervCombinations() if kind == 'binary' else None\n", " carver = Carver(features=features, min_freq=MIN_FREQ, max_n_mod=MAX_N_MOD, config=config,combination_evaluator=combination_evaluator)\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, carver\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, binners\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, kbd" ] }, { "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": 4, "id": "381a7051", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train=600, dev=200, test=200\n", "categoricals=13, numericals=7\n", "bad rate (train)=0.300, (test)=0.300\n" ] } ], "source": [ "credit = fetch_openml(data_id=31, as_frame=True)\n", "df = credit.frame.copy()\n", "\n", "y_binary = (df['class'] == 'bad').astype(int)\n", "X_binary = df.drop(columns=['class'])\n", "\n", "X_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", ")\n", "X_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", "\n", "categoricals = [c for c in X_binary.columns if X_binary[c].dtype == object or isinstance(X_binary[c].dtype, pd.CategoricalDtype)]\n", "quantitatives = [c for c in X_binary.columns if c not in categoricals]\n", "\n", "print(f'train={len(X_train)}, dev={len(X_dev)}, test={len(X_test)}')\n", "print(f'categoricals={len(categoricals)}, numericals={len(quantitatives)}')\n", "print(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", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
no checking0.13170.4050243
>=2000.27780.060036
0<=X<2000.38960.2567154
<00.46710.2783167
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.06940.360072
0.08330.060012
0.37100.310062
0.57410.270054
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
no checking0.13170.4050243
>=2000.27780.060036
0<=X<2000.38960.2567154
<00.46710.2783167
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.06940.360072
0.08330.060012
0.37100.310062
0.57410.270054
\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", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
critical/other existing credit0.16760.2883173
existing paid0.31850.5233314
delayed previously0.36210.096758
all paid0.54550.055033
no credits/all paid0.54550.036722
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.22410.290058
0.27030.5550111
0.35710.070014
0.72730.055011
0.66670.03006
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
critical/other existing credit0.16760.2883173
existing paid0.31850.5233314
delayed previously0.36210.096758
all paid, no credits/all paid0.54550.091755
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.22410.290058
0.27030.5550111
0.35710.070014
0.70590.085017
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
used car0.18750.106764
other, retraining0.22220.01509
radio/tv0.23030.2750165
domestic appliance0.30000.016710
furniture/equipment0.33330.1700102
new car0.34010.2450147
business0.37290.098359
repairs0.37500.026716
education0.46430.046728
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.12500.080016
0.30000.050010
0.22950.305061
0.00000.00501
0.32350.170034
0.42220.225045
0.27780.090018
0.00000.01002
0.46150.065013
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
used car0.18750.106764
radio/tv, other, retraining0.22990.2900174
furniture/equipment, domestic appliance0.33040.1867112
new car, business, repairs0.35140.3700222
education0.46430.046728
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.12500.080016
0.23940.355071
0.31430.175035
0.36920.325065
0.46150.065013
\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", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
>=10000.06670.050030
500<=X<10000.16220.061737
no known savings0.17140.1750105
100<=X<5000.33330.115069
<1000.36490.5983359
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.33330.03006
0.12500.080016
0.16670.180036
0.38890.090018
0.34680.6200124
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
no known savings, >=1000, 500<=X<10000.15120.2867172
<100, 100<=X<5000.35980.7133428
\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_meanfrequencycount
0.17240.290058
0.35210.7100142
\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", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
4<=X<70.19350.155093
>=70.25160.2650159
1<=X<40.29110.3550213
<10.42720.1717103
unemployed0.50000.053332
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.26320.190038
0.26000.250050
0.36210.290058
0.33330.180036
0.22220.090018
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
>=7, 4<=X<70.23020.4200252
unemployed, 1<=X<4, <10.35060.5800348
\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_meanfrequencycount
0.26140.440088
0.33040.5600112
\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", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
male single0.26790.5600336
male mar/wid0.27780.090054
female div/dep/mar0.35590.2950177
male div/sep0.36360.055033
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.28300.5300106
0.23810.105021
0.33850.325065
0.37500.04008
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
male single, male mar/wid0.26920.6500390
female div/dep/mar0.35590.2950177
male div/sep0.36360.055033
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.27560.6350127
0.33850.325065
0.37500.04008
\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", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
guarantor0.17860.046728
none0.29960.9067544
co applicant0.42860.046728
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.25000.04008
0.29890.9200184
0.37500.04008
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
guarantor0.17860.046728
none0.29960.9067544
co applicant0.42860.046728
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.25000.04008
0.29890.9200184
0.37500.04008
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Categorical('property_magnitude') (8/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_meanfrequencycount
real estate0.21300.2817169
life insurance0.31250.2133128
car0.31430.3500210
no known property0.40860.155093
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.21820.275055
0.26000.250050
0.32810.320064
0.45160.155031
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
real estate0.21300.2817169
life insurance0.31250.2133128
car0.31430.3500210
no known property0.40860.155093
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.21820.275055
0.26000.250050
0.32810.320064
0.45160.155031
\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", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
none0.26190.8083485
stores0.43750.053332
bank0.46990.138383
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.28660.8200164
0.44440.04509
0.33330.135027
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
none0.26190.8083485
bank, stores0.46090.1917115
\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_meanfrequencycount
0.28660.8200164
0.36110.180036
\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", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
own0.25580.7233434
for free0.37500.106764
rent0.44120.1700102
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.28570.7350147
0.43480.115023
0.26670.150030
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
own0.25580.7233434
for free, rent0.41570.2767166
\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_meanfrequencycount
0.28570.7350147
0.33960.265053
\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", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
skilled0.28980.6383383
unskilled resident0.29660.1967118
high qualif/self emp/mgmt0.32580.148389
unemp/unskilled non res0.50000.016710
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.25410.6100122
0.31710.205041
0.48390.155031
0.16670.03006
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
skilled0.28980.6383383
unskilled resident0.29660.1967118
high qualif/self emp/mgmt, unemp/unskilled non res0.34340.165099
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.25410.6100122
0.31710.205041
0.43240.185037
\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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
yes0.26450.4033242
none0.32400.5967358
\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_meanfrequencycount
0.31250.400080
0.29170.6000120
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "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" ] }, { "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", "
X distribution
 target_meanfrequencycount
no0.04350.038323
yes0.31020.9617577
\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_meanfrequencycount
0.33330.03006
0.29900.9700194
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "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 Numerical('duration') (14/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", "
X distribution
 target_meanfrequencycount
(-inf, 8.00e+00]0.09800.085051
(8.00e+00, 9.00e+00]0.23330.050030
(9.00e+00, 1.10e+01]0.08700.038323
(1.10e+01, 1.20e+01]0.28830.1850111
(1.20e+01, 1.50e+01]0.22730.073344
(1.50e+01, 1.80e+01]0.36920.108365
(1.80e+01, 2.20e+01]0.23810.035021
(2.20e+01, 2.40e+01]0.33330.1950117
(2.40e+01, 2.80e+01]0.22220.01509
(2.80e+01, 3.30e+01]0.38460.043326
(3.30e+01, 3.60e+01]0.47270.091755
(3.60e+01, 4.70e+01]0.26670.025015
(4.70e+01, inf)0.42420.055033
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.10000.100020
0.30770.065013
0.00000.04008
0.24320.185037
0.07140.070014
0.30430.115023
0.44440.04509
0.35480.155031
0.75000.02004
0.42860.03507
0.35290.085017
0.66670.01503
0.57140.070014
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 8.00e+00]0.09800.085051
(8.00e+00, 1.10e+01]0.16980.088353
(1.10e+01, 1.50e+01]0.27100.2583155
(1.50e+01, 2.80e+01]0.33020.3533212
(2.80e+01, inf)0.41860.2150129
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.10000.100020
0.19050.105021
0.19610.255051
0.37310.335067
0.46340.205041
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 6.18e+02]0.20000.025015
(6.18e+02, 7.08e+02]0.40000.025015
(7.08e+02, 7.97e+02]0.33330.025015
(7.97e+02, 9.09e+02]0.40000.025015
(9.09e+02, 1.03e+03]0.40000.025015
(1.03e+03, 1.16e+03]0.20000.025015
(1.16e+03, 1.21e+03]0.26670.025015
(1.21e+03, 1.26e+03]0.20000.025015
(1.26e+03, 1.31e+03]0.33330.025015
(1.31e+03, 1.37e+03]0.46670.025015
(1.37e+03, 1.41e+03]0.12500.026716
(1.41e+03, 1.47e+03]0.14290.023314
(1.47e+03, 1.53e+03]0.26670.025015
(1.53e+03, 1.60e+03]0.20000.025015
(1.60e+03, 1.82e+03]0.20000.025015
(1.82e+03, 1.92e+03]0.50000.026716
(1.92e+03, 1.98e+03]0.28570.023314
(1.98e+03, 2.12e+03]0.33330.025015
(2.12e+03, 2.21e+03]0.26670.025015
(2.21e+03, 2.30e+03]0.26670.025015
(2.30e+03, 2.38e+03]0.20000.025015
(2.38e+03, 2.48e+03]0.40000.025015
(2.48e+03, 2.62e+03]0.26670.025015
(2.62e+03, 2.75e+03]0.33330.025015
(2.75e+03, 2.92e+03]0.20000.025015
(2.92e+03, 3.07e+03]0.20000.025015
(3.07e+03, 3.35e+03]0.40000.025015
(3.35e+03, 3.51e+03]0.13330.025015
(3.51e+03, 3.63e+03]0.13330.025015
(3.63e+03, 3.91e+03]0.06670.025015
(3.91e+03, 4.24e+03]0.46670.025015
(4.24e+03, 4.66e+03]0.40000.025015
(4.66e+03, 5.08e+03]0.46670.025015
(5.08e+03, 5.80e+03]0.20000.025015
(5.80e+03, 6.36e+03]0.26670.025015
(6.36e+03, 6.85e+03]0.46670.025015
(6.85e+03, 7.48e+03]0.20000.025015
(7.48e+03, 8.23e+03]0.46670.025015
(8.23e+03, 9.57e+03]0.40000.025015
(9.57e+03, inf)0.53330.025015
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.20000.02505
0.50000.02004
0.50000.03006
0.00000.01002
0.33330.03006
0.14290.03507
0.50000.01002
0.33330.060012
0.00000.01002
0.28570.03507
0.00000.01503
0.33330.03006
0.25000.02004
0.00000.01503
0.33330.03006
0.28570.03507
0.25000.02004
0.00000.04008
0.50000.01002
0.50000.01002
0.00000.01503
0.00000.00501
0.66670.01503
0.00000.02004
0.00000.02004
0.33330.01503
0.20000.050010
0.50000.04008
0.00000.03006
0.10000.050010
0.25000.02004
0.80000.02505
0.33330.01503
0.40000.02505
0.28570.03507
0.00000.02004
0.66670.01503
0.66670.01503
0.66670.01503
0.61540.065013
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 3.51e+03]0.28330.7000420
(3.51e+03, 3.91e+03]0.10000.050030
(3.91e+03, 5.08e+03]0.44440.075045
(5.08e+03, 7.48e+03]0.28330.100060
(7.48e+03, inf)0.46670.075045
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.26120.6700134
0.06250.080016
0.50000.060012
0.31580.095019
0.63160.095019
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 1.00e+00]0.24360.130078
(1.00e+00, 2.00e+00]0.26060.2367142
(2.00e+00, 3.00e+00]0.29790.156794
(3.00e+00, inf)0.33570.4767286
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.10710.140028
0.26670.225045
0.24140.145029
0.38780.490098
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 2.00e+00]0.25450.3667220
(2.00e+00, 3.00e+00]0.29790.156794
(3.00e+00, inf)0.33570.4767286
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.20550.365073
0.24140.145029
0.38780.490098
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 1.00e+00]0.31170.128377
(1.00e+00, 2.00e+00]0.29050.2983179
(2.00e+00, 3.00e+00]0.30000.1667100
(3.00e+00, inf)0.30330.4067244
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.21740.115023
0.35290.340068
0.33330.150030
0.26580.395079
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: No robust combination for Numerical('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 Numerical('age') (18/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", "
X distribution
 target_meanfrequencycount
(-inf, 2.10e+01]0.40000.025015
(2.10e+01, 2.20e+01]0.36840.031719
(2.20e+01, 2.30e+01]0.45000.033320
(2.30e+01, 2.40e+01]0.33330.035021
(2.40e+01, 2.50e+01]0.51610.051731
(2.50e+01, 2.60e+01]0.25000.046728
(2.60e+01, 2.70e+01]0.22580.051731
(2.70e+01, 2.80e+01]0.40910.036722
(2.80e+01, 2.90e+01]0.39130.038323
(2.90e+01, 3.00e+01]0.21430.046728
(3.00e+01, 3.10e+01]0.23080.043326
(3.10e+01, 3.20e+01]0.25000.033320
(3.20e+01, 3.30e+01]0.36360.036722
(3.30e+01, 3.40e+01]0.36360.036722
(3.40e+01, 3.50e+01]0.17240.048329
(3.50e+01, 3.60e+01]0.20830.040024
(3.60e+01, 3.70e+01]0.33330.025015
(3.70e+01, 3.80e+01]0.18750.026716
(3.80e+01, 3.90e+01]0.29410.028317
(3.90e+01, 4.10e+01]0.31820.036722
(4.10e+01, 4.20e+01]0.27270.018311
(4.20e+01, 4.40e+01]0.19050.035021
(4.40e+01, 4.60e+01]0.26320.031719
(4.60e+01, 4.70e+01]0.40000.016710
(4.70e+01, 4.90e+01]0.14290.023314
(4.90e+01, 5.10e+01]0.14290.023314
(5.10e+01, 5.40e+01]0.29410.028317
(5.40e+01, 5.70e+01]0.33330.020012
(5.70e+01, 6.30e+01]0.43750.026716
(6.30e+01, inf)0.26670.025015
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.33330.03006
0.50000.02004
0.33330.075015
0.63640.055011
0.33330.01503
0.33330.060012
0.15380.065013
0.14290.03507
0.40000.02505
0.50000.050010
0.33330.03006
0.20000.02505
0.37500.04008
0.33330.01503
0.25000.02004
0.14290.03507
0.25000.04008
0.25000.02004
0.00000.00501
0.23080.065013
0.60000.02505
0.33330.03006
0.12500.04008
0.00000.02004
0.20000.02505
0.50000.01002
0.60000.02505
0.25000.02004
0.25000.04008
0.00000.04008
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 2.50e+01]0.42450.1767106
(2.50e+01, 3.20e+01]0.27530.2967178
(3.20e+01, 3.40e+01]0.36360.073344
(3.40e+01, 3.60e+01]0.18870.088353
(3.60e+01, inf)0.27400.3650219
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
0.43590.195039
0.29310.290058
0.36360.055011
0.18180.055011
0.24690.405081
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [BinaryCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 1.00e+00]0.30610.6317379
(1.00e+00, 2.00e+00]0.28990.3450207
(2.00e+00, inf)0.28570.023314
\n", " \n", "\n", " \n", " \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_meanfrequencycount
0.30000.6500130
0.30160.315063
0.28570.03507
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: No robust combination for Numerical('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 Numerical('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", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 1.0e+00]0.29840.8433506
(1.0e+00, inf)0.30850.156794
\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_meanfrequencycount
0.30000.8500170
0.30000.150030
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING: No robust combination for Numerical('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
0AutoCarver2.6900.01390.84960.80440.0451
1optbinning1.2160.01450.85230.79310.0592
2KBinsDiscretizer0.0030.00090.84010.79430.0458
\n", "
" ], "text/plain": [ " library fit_s transform_s train_auc test_auc auc_drop\n", "0 AutoCarver 2.690 0.0139 0.8496 0.8044 0.0451\n", "1 optbinning 1.216 0.0145 0.8523 0.7931 0.0592\n", "2 KBinsDiscretizer 0.003 0.0009 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, carver = 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": "8003c457", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJwAAAFcCAYAAACN/qTPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWIZJREFUeJzt3QucTfX+//GP67jEuOWaUOSSW4hIoRyURKeEzokk59SJSEkkQyqp43aipJJUIiWVNJJMdQ6SW9JBKbfKuFTIYBTr/3h/f/+9z94ze8YMa+6v5+OxMnvt71p73fb6tj77+/1883me5xkAAAAAAADgk/x+rQgAAAAAAAAg4AQAAAAAAADf0cIJAAAAAAAAviLgBAAAAAAAAF8RcAIAAAAAAICvCDgBAAAAAADAVwScAAAAAAAA4CsCTgAAAAAAAPAVAScAAAAAAAD4ioATAADIErNmzbJ8+fLZjh07gvPatm3rpuzmtttus3POOSdNZbVPo0ePttxKx6J69erZ6rqRp556yi644AIrUKCANW7c2M3Tdmp7M5vOv7YRAIC8jIATACDX2r59uw0YMMAuuugiK1asmJvq1atnd999t23cuNHyug0bNthf//pXq1q1qkVFRVmZMmWsffv29tJLL9nJkyctO/jpp5/cw7u2FUjJhx9+aA888IBdfvnl7vp9/PHHM/xgHT161F2bcXFxnBgAACIoGGkmAAA53aJFi6xHjx5WsGBB+8tf/mKNGjWy/Pnz25YtW2zBggX27LPPuoBUtWrVLC964YUX7M4777QKFSrYrbfearVq1bLffvvNli1bZv369bM9e/bYiBEjsiRwkDTgNGbMGNdSJdBqJbs7duyYu+6QMXS99uzZ0wVJAz7++GP3/X7xxRetcOHCwflbt2518zMq4KRrU5K2yhs5cqQ9+OCDGfK5AADkFPzfEAAg1/nuu+/cA6mCSQqgVKpUKez98ePH2zPPPOPbg2hCQoIVL17ccopVq1a5YFPLli1t8eLFVqJEieB7gwcPtjVr1timTZtSXP6PP/6wU6dOhT3Y+yUj1pnZihQpkumf6XmeHT9+3IoWLWq5nbrMaQq1b98+t+9Jr5/QoFRmUsCRoCMAIK+jSx0AINd58sknXRBIXWuSBptED4L33HOP60oWSq2fbrrpJte1TEGDZs2a2bvvvhsxf8wnn3xi//jHP6x8+fJ23nnnBVs51K9f33XXa9OmjevCV7NmTXvzzTfd+1qmRYsW7sG4du3a9tFHH4Wte+fOnW6dek9lypYta927d0+WqyawDf/5z39syJAhdu6557qA1w033GD79+8/7fFRqwwt/9prr4UFmwK034G8N/pslf3nP/9pkydPtgsvvNA9xP/3v/9N8zGTr7/+2q666iq3Xzpejz76qAtaJRWaw0ldlS699FL3d9++fd12aNL+Z5Xvv//eOnbs6I535cqV7ZFHHnHBntRyOAXy+Wzbts0d11KlSll0dLTbJ7WSCaVrVsdJ15WOs7qAqjVeUmrxdd1119mSJUvcMddxfe6559x1p9Z8kei60rafzgcffODWo2ujZMmS7hzMmTMn1WV0fbRq1cpds9qWpk2bBq/7UEuXLrXWrVu7Y6CcWNqmpC3pnn76abv44ovd96d06dJu/0I/P2kOJ/2t46bvfNJrJFIOp4MHD9q9997r3tMx1vXYu3dvO3DggHv/xIkTNmrUKLcPOk8611dccYUtX748uA59tr53od+n0PMeKYeTArVjx44Nfof0+dr3xMTEiOf23//+tzVv3tx9r5Sbavbs2ameAwAAshtaOAEAcmV3OgV6FNxJKwVElP+lSpUqriuMHjLfeOMN69atm7311lsumBNKgSE9cOrBVA+6Ab/++qt7WFQLKwWLFCzQ3wruqPWQWhbdcsstLsGxAjW7d+8OBn2++OILW7FihSuvh2A91Gp5BWAU4NEDeKiBAwe6B/KYmBhXVgEh5ayaN29eivupAIdafV155ZV2/vnnp/n46IFeLWj+9re/BfM9pfWYxcfHW7t27dwDd6DcjBkzTtsap27dui6go2Osz9VDvyiwkRWU16pTp0522WWXuaBmbGysO/baL23n6dx8881Wo0YNGzdunK1bt851a1RgSS3uAnS+FWy5/vrrXWD0vffec9eagnPKPRZK3cV69eplf//7361///4ueKMgjv5WCzUFPwN0bX3zzTeuq1dqFKi5/fbb3TYMHz7cBYbWr1/v9lXXbUqmTJnitlndVxWwmTt3rrv+9V3s3LmzK6PrRd+Nhg0buuOl60hBOAVOA55//nkXDNZ3Y9CgQe6aUwD3888/T/HzX3nlFXc9rV692h3T1K6RI0eOuOto8+bNbj+bNGniAk0Kkv7www9Wrlw5O3z4sFuP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hLrPKYeSEq0rKfxjjz2W1ZsEAADyKAJOAAAAAAAA8FV+f1cHAAAAAACAvI6AEwAAAAAAAHxFwAkAAAAAAAC+IuAEAAAAAAAAXxFwAgAAAAAAgK8IOAEAAAAAAMBXBJwAAAAAAADgKwJOAAAAAAAA8BUBJwAAAAAAAPiKgBMAAAAAAAB8RcAJAAAAAAAAviLgBAAAAAAAAF8RcAIAAAAAAICvCDgBAAAAAADAVwScAAAAAAAA4CsCTgAAAAAAAPAVAScAAAAAAAD4ioATAAAAAAAAfEXACQAAAAAAAL4i4AQAAAAAAABfEXACAAAAAACArwg4AQAAAAAAwFcEnJDnffHFF9aqVSsrXry45cuXz7p16+b+BQAAAIDsatasWe65ZceOHVm9KUBEBJyQp/3+++/WvXt3++WXX2zSpEn2yiuvWLVq1ZKVe/zxx23hwoVZso0AgLO3YsUKGz16tB08eDDDDid1BQAAwP8QcEKe9t1339nOnTvt/vvvt7/97W/217/+1SZMmGDHjh0LK8dDBADk/IDTmDFjCDgBAABkEgJOyNP27dvn/i1VqlRwXsGCBa1IkSJZuFUAAAAAcPY8z0v2YzqQWQg4Ic+67bbbrE2bNu5vdatT/+e2bdu6LhehOZz0d0JCgr388svub01aNq3mzp1rTZs2tRIlSljJkiWtQYMGNmXKlAzZJwBAcrqvDx061P1do0aN4L08kPPi1VdfdffpokWLWpkyZaxnz562e/fusHV8++23duONN1rFihXdjxLnnXeeK3fo0CFf6op//vOfLp9g2bJl3XZoe958882wMtperVc5O5LSfO1nqB9//NH69etnlStXtqioKLfvd911l504cYLLBAAiUM+Hf/zjH1a7dm13L9Y9Wc8JSXMkJX1eOF1OpQ8++MA9dwSeBy699FKbM2dOus7B119/bVdddZXbLtVBjz76qJ06dSpZuerVq9t1111nS5YssWbNmrnyzz33nHvv+++/d/ujuq5YsWJ22WWX2fvvvx+2fFxcnNuHefPm2YgRI1y9p1y3119/fbK6ETidgqctAeRSf//7361KlSquu9w999zjbvwVKlSw//znP2HllNfpjjvusObNm7tud3LhhRem6TOWLl1qvXr1squvvtrGjx/v5m3evNl9xqBBgzJgrwAASf35z3+2b775xl5//XWXr69cuXJu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P/20NW/ePMXyBw8etIceesjVOb/88otVq1bNJk+eTN0BAMgVcnNri+za0gJANm/h9Mknn9jdd99tq1atsqVLl9rvv/9uHTp0sISEhBSXWbFihfXq1cv69etn69evt27durlp06ZNfmw/ACCbmzdvng0ZMsRiYmJs3bp1LuDUsWNH27dvX8TyJ06csD/96U/uR4o333zTtm7das8//7xVqVIl07cdAAAAQCa0cIqNjQ17PWvWLCtfvrytXbvWrrzyyojLTJkyxTp16mRDhw51r8eOHeuCVVOnTrXp06ef4WYDAHKKiRMnWv/+/a1v377ute7977//vs2cOdMefPDBZOU1X62a9INFoUKF3Lzq1atn+nYDAAAAyKIcTocOHXL/lilTJsUyK1eutPbt24fN0y/bmg8AyN3UWkk/SoTWA/nz53evU6oH3n33XWvZsqVrUVuhQgWrX7++Pf7443by5MkUPycxMdEOHz4cNgEAAADIgQGnU6dO2eDBg+3yyy93DwMpUb4OPTCE0mvNTwkPDgCQOxw4cMAFitJTD3z//feuK52WW7x4scsBOGHCBHv00UdTzTEYHR0dnKpWrer7vgAAAADIhICTfnlWHqa5c+ea33hwAIC8Sz9oqLv2jBkzrGnTptajRw+XQDy1btjDhw93rW4D0+7duzN1mwEAAAD4EHAaMGCALVq0yJYvX27nnXdeqmUrVqxoe/fuDZun15qfEh4cACB3KFeunBUoUCBd9UClSpXsoosucssF1K1b17WIUhe9SKKioqxkyZJhEwAAAIAcEnDyPM8Fm95++237+OOPrUaNGqddRnk4li1bFjZPScM1PyU8OABA7lC4cGHXSim0HlALJr1OqR5QV+1t27a5cgHffPONC0RpfQAAAAByWcBJ3eheffVVmzNnjpUoUcL92qzp2LFjwTK9e/d2LZQCBg0a5Ea3U/6NLVu22OjRo23NmjUucAUAyP2GDBlizz//vL388su2efNmu+uuuywhISE4al3SekPva5Q61R8KNGlEOyUNVx0EAAAAIGcomJ7Czz77rPu3bdu2YfNfeuklu+2229zfu3btciMQBbRq1coFqEaOHGkjRoywWrVq2cKFC1NNNA4AyD2Ug2n//v02atQo9yNF48aN3Q8RgUTiSesNJfxesmSJ3XvvvdawYUOrUqWKCz4NGzYsC/cCAAAA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fvvtsHm//fabd+DAgSzbJpwZ6o28i3oj7ag3zh71Ru5BvZF3UW+kHfVG7q838mQLpxdffNEGDhxon376qf3000+Z8pknTpywjh072hNPPOGGbF2xYoWtXr3a7r77bnv66aft66+/PuN1//7775ZR24z/qVixohvi0k/R0dFWqlSpHHGYX3jhBfvLX/5izz77rN13331uXqdOnWzPnj1uWrZsmRUsWNCuu+664DIFChRwx03z/bR161b33f3iiy9s2LBh9tFHH7nhkb/66qtMObZn850755xzrGzZspZR+N5mDOoNrr8zQb1BvRFAvZH3UG+kDf/fEo56g3oj19UbXh6jaN8555zjbdmyxevRo4f32GOPpRqNVrQwcJj0fmiLDk2aJzt37vSuv/56r3jx4l6JEiW87t27e/Hx8cH1qGWTWlWtW7cu2TapddORI0fc3x988IF3+eWXu+1Qi5HOnTt727ZtC5bdvn27+9y5c+d6V155pWttMmXKFK9IkSLe4sWLw9a7YMECt68JCQnu9a5du9x2ad2lS5d226v1JY0wP/roo16lSpW86tWre9mNWhgNHDjQO/fcc92+61itXr06rPXLokWLvAYNGrj3W7Ro4X311Vdh74dOarEWaOH0yCOPeD179vSKFSvmVa5c2Zs6dWqK0ePAeXjrrbe8tm3buhZrarmmX7OSXk+xsbFenTp13LWhFkChLXGSRvXbtGnj9k8tdnSOKlSoENzGgM2bN7v91v7VrVvXW7p0acTI9tkK3TZdv7rGdE2ltO3y2WefuW3Zt29f2HFav3592Dn46KOPvKZNm7rj1rJlS/d9DNiwYYM7prp29V1q0qSJ98UXX4Qtn7Tl0tGjR73atWu745LS9ql1Vv369d1+6Lt19dVXB7938uKLL3r16tXzChcu7FWsWNG7++67g+/pM5955hmvS5cu7voInJOFCxd6l1xyiTsXNWrU8EaPHh1szaVrKvRa0+tIrSSTXpOhZUXXb6dOndz1U758ee+vf/2rt3///rBrRts6aNAg12pSxw7+ot6g3qDeSBvqDeoNUG/wvMHzRnpQb9yd65838lzASQ+VzZo1c3+/99573oUXXuidOnUqTQEnPdTed9993sUXX+y6CWnSvJMnT7puPa1bt/bWrFnjrVq1yj1M68QEKBjRoUOH027fm2++6YIY3377rXtI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", "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", "numericals=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'numericals={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', 'Latitude', 'Longitude'])\n", "------\n", "\n", "---------\n", "------ [ContinuousCarver] Fit Features(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n", "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 1.335e+00]1.19840.0250310
(1.335e+00, 1.593e+00]1.01050.0250310
(1.593e+00, 1.740e+00]1.11330.0250309
(1.740e+00, 1.906e+00]1.15350.0252312
(1.906e+00, 2.029e+00]1.20900.0248307
(2.029e+00, 2.152e+00]1.21410.0251311
(2.152e+00, 2.243e+00]1.24170.0250310
(2.243e+00, 2.350e+00]1.38270.0249308
(2.350e+00, 2.468e+00]1.36140.0250310
(2.468e+00, 2.569e+00]1.41900.0250309
(2.569e+00, 2.655e+00]1.52640.0250310
(2.655e+00, 2.737e+00]1.54280.0250309
(2.737e+00, 2.862e+00]1.57080.0250310
(2.862e+00, 2.974e+00]1.66300.0250310
(2.974e+00, 3.054e+00]1.62700.0250309
(3.054e+00, 3.135e+00]1.70790.0250310
(3.135e+00, 3.216e+00]1.85540.0250309
(3.216e+00, 3.315e+00]1.83730.0250310
(3.315e+00, 3.423e+00]1.91210.0250309
(3.423e+00, 3.531e+00]1.91620.0251311
(3.531e+00, 3.633e+00]1.96780.0250309
(3.633e+00, 3.723e+00]2.02260.0250309
(3.723e+00, 3.839e+00]1.98910.0251311
(3.839e+00, 3.971e+00]2.04930.0249308
(3.971e+00, 4.073e+00]2.05380.0252312
(4.073e+00, 4.179e+00]2.20040.0249308
(4.179e+00, 4.315e+00]2.24170.0250309
(4.315e+00, 4.464e+00]2.23940.0250310
(4.464e+00, 4.611e+00]2.25770.0252312
(4.611e+00, 4.757e+00]2.43510.0248307
(4.757e+00, 4.946e+00]2.34820.0250309
(4.946e+00, 5.117e+00]2.45920.0250310
(5.117e+00, 5.308e+00]2.57840.0250309
(5.308e+00, 5.538e+00]2.68920.0250310
(5.538e+00, 5.828e+00]2.78670.0251311
(5.828e+00, 6.148e+00]3.09430.0249308
(6.148e+00, 6.599e+00]3.30310.0250310
(6.599e+00, 7.313e+00]3.60640.0250309
(7.313e+00, 8.433e+00]4.01910.0250310
(8.433e+00, inf)4.73430.0250310
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.25070.0247102
1.03190.0262108
1.15870.0257106
1.08550.0252104
1.25230.022593
1.26060.0293121
1.26430.020886
1.33350.0274113
1.45280.0257106
1.48870.0305126
1.51420.023798
1.64850.020886
1.55440.0293121
1.61890.0257106
1.74330.023396
1.63690.021388
1.78020.0276114
1.97210.0283117
1.82870.0279115
1.82950.0242100
1.99070.0300124
1.95170.021689
2.02200.0269111
2.15090.0269111
2.09770.0291120
2.20540.022593
2.29790.0274113
2.35530.0274113
2.29240.018476
2.44010.021388
2.29310.0250103
2.49400.023798
2.61330.0250103
2.71770.018978
2.91100.0276114
3.07290.021388
3.07590.0271112
3.59850.022894
4.03850.020685
4.61310.0264109
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 2.47e+00]1.20930.22502787
(2.47e+00, 3.13e+00]1.57960.17502167
(3.13e+00, 4.07e+00]1.95600.22512788
(4.07e+00, 5.83e+00]2.42380.24993095
(5.83e+00, inf)3.75240.12491547
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.23230.2275939
1.59340.1747721
1.96040.24251001
2.46520.2372979
3.68700.1182488
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 5.00e+00]2.23580.0271336
(5.00e+00, 8.00e+00]1.97270.0263326
(8.00e+00, 1.10e+01]1.81330.0352436
(1.10e+01, 1.40e+01]1.85380.0468579
(1.40e+01, 1.60e+01]1.93550.0652807
(1.60e+01, 1.70e+01]1.89290.0319395
(1.70e+01, 1.80e+01]1.94550.0276342
(1.80e+01, 2.00e+01]1.94700.0470582
(2.00e+01, 2.30e+01]1.99340.0632783
(2.30e+01, 2.50e+01]2.17130.0480595
(2.50e+01, 2.60e+01]2.09370.0304377
(2.60e+01, 2.70e+01]2.05680.0245303
(2.70e+01, 2.80e+01]1.98270.0241299
(2.80e+01, 2.90e+01]2.02030.0232287
(2.90e+01, 3.00e+01]2.05150.0236292
(3.00e+01, 3.20e+01]2.04530.0484599
(3.20e+01, 3.30e+01]2.03430.0316391
(3.30e+01, 3.40e+01]2.13570.0320396
(3.40e+01, 3.50e+01]2.00040.0399494
(3.50e+01, 3.60e+01]2.11480.0437541
(3.60e+01, 3.70e+01]2.00040.0257318
(3.70e+01, 3.90e+01]2.01330.0355440
(3.90e+01, 4.20e+01]2.01480.0440545
(4.20e+01, 4.40e+01]2.07420.0351435
(4.40e+01, 4.70e+01]2.08520.0343425
(4.70e+01, inf)2.58480.08571061
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.07200.0245101
1.92010.0269111
1.90540.0344142
1.85810.0412170
1.88260.0606250
1.85920.0375155
1.87990.0283117
1.87460.0436180
2.11280.0577238
2.08470.0579239
2.07780.0296122
2.17840.021689
2.22420.020886
1.78020.021388
1.76290.023396
2.04930.0504208
1.93430.0259107
2.08370.0349144
2.19570.0417172
2.01570.0431178
2.20060.0296122
2.00260.0351145
1.93580.0499206
2.01170.0312129
2.08390.0380157
2.59680.0911376
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 2.30e+01]1.94660.37034586
(2.30e+01, 2.60e+01]2.14120.0785972
(2.60e+01, 3.60e+01]2.05260.29093602
(3.60e+01, 4.70e+01]2.03810.17472163
(4.70e+01, inf)2.58480.08571061
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.93160.35471464
2.08240.0875361
2.03830.28291168
2.03470.1839759
2.59680.0911376
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 3.066e+00]1.95060.0250310
(3.066e+00, 3.432e+00]1.88800.0250310
(3.432e+00, 3.647e+00]1.82330.0250309
(3.647e+00, 3.792e+00]1.82920.0250310
(3.792e+00, 3.933e+00]1.78470.0250309
(3.933e+00, 4.052e+00]1.84990.0250310
(4.052e+00, 4.168e+00]1.87180.0250310
(4.168e+00, 4.276e+00]1.83330.0250309
(4.276e+00, 4.365e+00]1.79650.0250310
(4.365e+00, 4.454e+00]1.69520.0250309
(4.454e+00, 4.536e+00]1.75350.0250310
(4.536e+00, 4.621e+00]1.79520.0250309
(4.621e+00, 4.705e+00]1.84650.0250310
(4.705e+00, 4.794e+00]1.74860.0250310
(4.794e+00, 4.874e+00]1.77190.0250309
(4.874e+00, 4.941e+00]1.72190.0251311
(4.941e+00, 5.014e+00]1.71760.0249308
(5.014e+00, 5.088e+00]1.77070.0250310
(5.088e+00, 5.160e+00]1.79180.0250309
(5.160e+00, 5.233e+00]1.77910.0250310
(5.233e+00, 5.315e+00]1.82090.0250310
(5.315e+00, 5.384e+00]1.91070.0250309
(5.384e+00, 5.460e+00]1.77280.0250310
(5.460e+00, 5.532e+00]1.89960.0250309
(5.532e+00, 5.616e+00]1.88720.0250310
(5.616e+00, 5.694e+00]1.99050.0250309
(5.694e+00, 5.778e+00]2.00290.0250310
(5.778e+00, 5.858e+00]2.01070.0250310
(5.858e+00, 5.959e+00]2.11370.0250309
(5.959e+00, 6.059e+00]2.04690.0250310
(6.059e+00, 6.157e+00]2.14500.0250309
(6.157e+00, 6.270e+00]2.24770.0250310
(6.270e+00, 6.396e+00]2.34950.0250309
(6.396e+00, 6.543e+00]2.42320.0250310
(6.543e+00, 6.717e+00]2.62410.0250310
(6.717e+00, 6.946e+00]2.75730.0250309
(6.946e+00, 7.233e+00]3.07630.0250310
(7.233e+00, 7.637e+00]3.11180.0250309
(7.637e+00, 8.324e+00]3.58460.0250310
(8.324e+00, inf)2.73910.0250310
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.09080.023396
1.85790.0264109
2.00310.0242100
1.80600.0274113
1.81370.024099
1.77250.021187
1.77230.0283117
1.78390.0247102
1.79020.0286118
1.81210.0264109
1.62650.0264109
1.83490.0276114
1.83390.0247102
1.77250.0342141
1.81880.0254105
1.84800.019179
1.83330.023597
1.81910.0266110
1.74190.0266110
1.76420.022091
1.76450.0303125
1.79170.0266110
1.86510.0262108
1.86450.0274113
1.80820.0286118
1.84830.017773
2.07780.024099
2.00050.018777
1.97240.0291120
2.26230.023597
2.08180.023095
2.28890.0250103
2.32800.021388
2.53730.0254105
2.67870.020183
2.74570.021187
3.01080.0303125
3.15960.023396
3.43400.023597
2.75680.0245101
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 3.43e+00]1.91930.0501620
(3.43e+00, 5.62e+00]1.80310.57497120
(5.62e+00, 6.16e+00]2.05160.15001857
(6.16e+00, 6.54e+00]2.34010.0750929
(6.54e+00, inf)2.98230.15001858
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.96700.0497205
1.80450.60002477
2.04740.1359561
2.38860.0717296
2.97520.1427589
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 9.1220e-01]2.05110.0250310
(9.1220e-01, 9.4022e-01]2.12640.0250310
(9.4022e-01, 9.5595e-01]2.06380.0250309
(9.5595e-01, 9.6743e-01]2.07560.0251311
(9.6743e-01, 9.7590e-01]2.25620.0249308
(9.7590e-01, 9.8343e-01]2.17090.0250310
(9.8343e-01, 9.8987e-01]2.14500.0250310
(9.8987e-01, 9.9592e-01]2.17720.0250309
(9.9592e-01, 1.0019e+00]2.19150.0251311
(1.0019e+00, 1.0068e+00]2.09490.0249308
(1.0068e+00, 1.0112e+00]2.24400.0250310
(1.0112e+00, 1.0156e+00]2.16870.0250310
(1.0156e+00, 1.0204e+00]2.17230.0250309
(1.0204e+00, 1.0250e+00]2.20030.0254314
(1.0250e+00, 1.0290e+00]2.13240.0246305
(1.0290e+00, 1.0331e+00]2.18400.0250310
(1.0331e+00, 1.0369e+00]2.03210.0250309
(1.0369e+00, 1.0412e+00]2.17460.0250310
(1.0412e+00, 1.0453e+00]2.25360.0250309
(1.0453e+00, 1.0493e+00]2.15460.0250310
(1.0493e+00, 1.0534e+00]2.07380.0251311
(1.0534e+00, 1.0574e+00]2.12240.0249308
(1.0574e+00, 1.0615e+00]2.04140.0250310
(1.0615e+00, 1.0662e+00]2.15690.0251311
(1.0662e+00, 1.0712e+00]2.09720.0250309
(1.0712e+00, 1.0763e+00]2.07140.0249308
(1.0763e+00, 1.0816e+00]2.02440.0250310
(1.0816e+00, 1.0874e+00]2.01350.0252312
(1.0874e+00, 1.0933e+00]2.22390.0249308
(1.0933e+00, 1.1000e+00]2.02440.0262324
(1.1000e+00, 1.1071e+00]2.00770.0242300
(1.1071e+00, 1.1160e+00]1.95640.0245304
(1.1160e+00, 1.1267e+00]2.00770.0250310
(1.1267e+00, 1.1387e+00]1.93050.0250309
(1.1387e+00, 1.1538e+00]1.81300.0258319
(1.1538e+00, 1.1739e+00]1.80600.0242300
(1.1739e+00, 1.2074e+00]1.91090.0250310
(1.2074e+00, 1.2730e+00]1.89500.0250309
(1.2730e+00, 1.5018e+00]1.79620.0250310
(1.5018e+00, inf)1.49310.0250310
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.79610.0252104
2.00980.0298123
2.30390.0257106
2.23900.0262108
2.32930.024099
1.93180.019480
2.15750.019982
2.17400.0291120
2.22070.0337139
2.18110.023396
2.04750.0262108
2.27430.021890
2.26270.0293121
2.10680.0247102
2.44590.022894
2.12800.0269111
2.11930.024099
2.22800.0259107
2.03360.023798
2.01950.021689
1.98980.023597
2.22700.021689
1.92440.0254105
2.15090.023798
2.22230.0274113
1.96540.0271112
2.10850.0257106
2.03320.024099
1.92620.0264109
2.11390.0274113
1.90250.022593
1.86280.0271112
1.95010.0259107
2.02310.020685
1.86220.0271112
1.81370.0250103
2.03990.0259107
1.63920.021890
1.72210.0250103
1.60190.024099
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 1.049e+00]2.15350.50006192
(1.049e+00, 1.093e+00]2.09150.22502787
(1.093e+00, 1.139e+00]1.98570.12491547
(1.139e+00, 1.273e+00]1.85630.10001238
(1.273e+00, inf)1.64460.0501620
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.15260.50292076
2.05820.2248928
1.97070.1235510
1.84750.0998412
1.66320.0489202
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 2.08e+02]1.90500.0251311
(2.08e+02, 3.53e+02]2.02770.0251311
(3.53e+02, 4.42e+02]2.06550.0250310
(4.42e+02, 5.12e+02]2.20670.0249308
(5.12e+02, 5.75e+02]2.13270.0250310
(5.75e+02, 6.27e+02]2.07310.0250310
(6.27e+02, 6.75e+02]2.36270.0249308
(6.75e+02, 7.16e+02]2.20060.0250309
(7.16e+02, 7.56e+02]2.09000.0253313
(7.56e+02, 7.94e+02]2.01910.0251311
(7.94e+02, 8.32e+02]2.32480.0251311
(8.32e+02, 8.67e+02]2.07630.0253313
(8.67e+02, 9.02e+02]2.03130.0247306
(9.02e+02, 9.40e+02]2.11850.0247306
(9.40e+02, 9.78e+02]2.17900.0253313
(9.78e+02, 1.02e+03]2.07460.0249308
(1.02e+03, 1.06e+03]1.95220.0247306
(1.06e+03, 1.09e+03]2.11860.0250310
(1.09e+03, 1.13e+03]2.05920.0252312
(1.13e+03, 1.17e+03]2.06400.0252312
(1.17e+03, 1.22e+03]2.01340.0249308
(1.22e+03, 1.26e+03]2.16900.0250310
(1.26e+03, 1.30e+03]2.05580.0248307
(1.30e+03, 1.35e+03]1.97110.0249308
(1.35e+03, 1.41e+03]2.01850.0250310
(1.41e+03, 1.46e+03]2.00040.0251311
(1.46e+03, 1.52e+03]2.09110.0248307
(1.52e+03, 1.59e+03]2.13220.0254315
(1.59e+03, 1.66e+03]1.99490.0246305
(1.66e+03, 1.73e+03]2.02330.0250309
(1.73e+03, 1.82e+03]1.89460.0253313
(1.82e+03, 1.91e+03]1.95040.0247306
(1.91e+03, 2.02e+03]2.00740.0250310
(2.02e+03, 2.16e+03]2.02130.0250310
(2.16e+03, 2.32e+03]2.05410.0250309
(2.32e+03, 2.56e+03]2.07570.0250310
(2.56e+03, 2.86e+03]2.01420.0250309
(2.86e+03, 3.28e+03]1.91960.0250309
(3.28e+03, 4.25e+03]2.04390.0250310
(4.25e+03, inf)2.00100.0250310
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.98950.0269111
1.81890.0271112
2.14790.0271112
2.24340.0266110
2.12810.0269111
2.29080.0257106
2.09260.0283117
2.17570.021388
2.21820.0259107
2.14330.0286118
2.07690.0293121
2.18890.024099
2.04880.021890
2.15850.0247102
2.06990.0259107
2.03960.0247102
1.98430.0254105
2.10620.021388
1.98230.0242100
2.13530.0271112
2.11320.023095
1.96960.0252104
2.12430.019681
1.97740.0245101
1.80020.0245101
2.15000.0264109
1.94710.0293121
1.95350.0262108
2.09150.0274113
2.03900.022894
2.13800.021187
1.97060.020384
1.87170.0264109
1.90820.0247102
2.08950.023396
1.81310.0266110
2.00190.0269111
2.02340.020183
2.15580.0262108
2.03390.022593
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 3.53e+02]1.96630.0502622
(3.53e+02, 8.32e+02]2.16360.22532790
(8.32e+02, 1.73e+03]2.06040.47455876
(1.73e+03, 2.16e+03]1.96830.10001239
(2.16e+03, inf)2.01810.15001857
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.90380.0540223
2.16590.2398990
2.04450.46801932
1.96390.0925382
2.01690.1456601
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
(-inf, 1.699e+00]2.61410.0250310
(1.699e+00, 1.868e+00]2.79860.0250310
(1.868e+00, 1.976e+00]2.69790.0250309
(1.976e+00, 2.071e+00]2.55580.0250310
(2.071e+00, 2.161e+00]2.45820.0250309
(2.161e+00, 2.228e+00]2.27570.0250310
(2.228e+00, 2.288e+00]2.35920.0250310
(2.288e+00, 2.341e+00]2.25070.0250309
(2.341e+00, 2.388e+00]2.13710.0250310
(2.388e+00, 2.435e+00]2.27080.0250309
(2.435e+00, 2.475e+00]2.19890.0250310
(2.475e+00, 2.515e+00]2.15640.0250309
(2.515e+00, 2.557e+00]2.12790.0250310
(2.557e+00, 2.598e+00]2.24280.0250310
(2.598e+00, 2.639e+00]2.11160.0250309
(2.639e+00, 2.674e+00]2.23430.0250310
(2.674e+00, 2.712e+00]2.04890.0250309
(2.712e+00, 2.746e+00]2.21960.0250310
(2.746e+00, 2.784e+00]2.12110.0250309
(2.784e+00, 2.824e+00]2.26450.0250310
(2.824e+00, 2.861e+00]2.15650.0251311
(2.861e+00, 2.899e+00]2.23230.0250309
(2.899e+00, 2.943e+00]2.07140.0250309
(2.943e+00, 2.984e+00]2.04950.0250309
(2.984e+00, 3.026e+00]1.99170.0250310
(3.026e+00, 3.071e+00]1.96230.0250309
(3.071e+00, 3.117e+00]2.04910.0250310
(3.117e+00, 3.168e+00]1.93360.0250310
(3.168e+00, 3.221e+00]1.94720.0250310
(3.221e+00, 3.279e+00]1.89380.0250309
(3.279e+00, 3.344e+00]1.88040.0250309
(3.344e+00, 3.424e+00]1.87240.0250310
(3.424e+00, 3.508e+00]1.80000.0250309
(3.508e+00, 3.606e+00]1.65710.0250310
(3.606e+00, 3.719e+00]1.56240.0250310
(3.719e+00, 3.870e+00]1.57090.0250309
(3.870e+00, 4.089e+00]1.48540.0250310
(4.089e+00, 4.317e+00]1.42400.0250309
(4.317e+00, 4.705e+00]1.32330.0250310
(4.705e+00, inf)1.52800.0250310
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.75240.022091
2.77630.0293121
2.65020.0257106
2.59900.0242100
2.48280.0296122
2.40390.0247102
2.25670.0281116
2.41370.023095
2.34710.021187
2.24250.0300124
2.09110.0252104
2.20720.0259107
2.13700.0262108
2.09730.0281116
2.01880.023095
2.08250.022593
2.26150.0247102
2.01140.021388
2.23140.0257106
2.02030.023396
2.09080.0286118
1.88870.023396
1.98940.0250103
2.23160.022894
2.08910.0291120
1.97870.022392
2.08180.0279115
1.86020.020384
1.96110.018978
1.72650.023095
1.77890.0259107
1.83410.0274113
1.64810.021187
1.69890.0247102
1.62670.0271112
1.55470.0250103
1.41500.0293121
1.53640.022091
1.42450.0262108
1.55980.0266110
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 2.16e+00]2.62500.12501548
(2.16e+00, 2.90e+00]2.20050.42515264
(2.90e+00, 3.51e+00]1.95010.27493404
(3.51e+00, 3.87e+00]1.59680.0750929
(3.87e+00, inf)1.44020.10001239
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.64840.1308540
2.16650.42471753
1.93110.26361088
1.62650.0768317
1.48010.1042430
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 3.275e+01]1.59120.0287355
(3.275e+01, 3.321e+01]2.02990.0466577
(3.321e+01, 3.365e+01]2.78330.0279345
(3.365e+01, 3.374e+01]2.43260.0268332
(3.374e+01, 3.379e+01]2.18290.0262325
(3.379e+01, 3.383e+01]2.42320.0229283
(3.383e+01, 3.387e+01]2.30030.0241299
(3.387e+01, 3.391e+01]2.15700.0279345
(3.391e+01, 3.394e+01]1.63000.0242300
(3.394e+01, 3.397e+01]1.85940.0225279
(3.397e+01, 3.400e+01]1.94820.0224278
(3.400e+01, 3.403e+01]2.12670.0277343
(3.403e+01, 3.406e+01]2.40210.0339420
(3.406e+01, 3.410e+01]2.17600.0417516
(3.410e+01, 3.413e+01]2.36460.0242300
(3.413e+01, 3.417e+01]2.77710.0301373
(3.417e+01, 3.427e+01]2.41000.0435539
(3.427e+01, 3.453e+01]2.45590.0240297
(3.453e+01, 3.532e+01]1.49140.0246305
(3.532e+01, 3.623e+01]0.92080.0250310
(3.623e+01, 3.672e+01]1.24410.0262324
(3.672e+01, 3.697e+01]1.31290.0253313
(3.697e+01, 3.729e+01]2.62410.0239296
(3.729e+01, 3.737e+01]2.65740.0258320
(3.737e+01, 3.753e+01]3.01050.0255316
(3.753e+01, 3.765e+01]2.41970.0243301
(3.765e+01, 3.772e+01]2.11740.0256317
(3.772e+01, 3.777e+01]2.55370.0286354
(3.777e+01, 3.793e+01]2.68870.0459569
(3.793e+01, 3.800e+01]1.76220.0250310
(3.800e+01, 3.826e+01]1.59240.0243301
(3.826e+01, 3.850e+01]1.85700.0254315
(3.850e+01, 3.863e+01]1.39810.0241298
(3.863e+01, 3.898e+01]1.39620.0251311
(3.898e+01, 3.975e+01]1.12410.0255316
(3.975e+01, inf)0.84420.0244302
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.57610.0320132
2.07680.0552228
2.71150.0264109
2.43680.0262108
2.29100.0291120
2.35280.022091
2.32330.023396
2.09370.0368152
1.63190.023095
1.79920.023597
1.94080.0250103
2.12920.0250103
2.32610.0334138
2.27620.0443183
2.22280.021689
2.82240.0303125
2.29380.0465192
2.50250.0252104
1.37190.020183
0.93360.021890
1.25160.0259107
1.25970.0274113
2.55070.024099
2.53510.0266110
2.98270.0283117
2.65190.019480
2.08690.020384
2.61450.0242100
2.58530.0516213
1.66300.0250103
1.51560.020685
1.75490.022593
1.31010.019681
1.39970.0279115
1.11140.023597
0.86710.022593
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, 3.45e+01]2.23110.52546506
(3.45e+01, 3.70e+01]1.24150.10111252
(3.70e+01, 3.79e+01]2.59270.19972473
(3.79e+01, 3.90e+01]1.60350.12401535
(3.90e+01, inf)0.98730.0499618
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.21110.54872265
1.20650.0952393
2.59020.1945803
1.53120.1156477
0.99180.0460190
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "--- [ContinuousCarver] Fit Numerical('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", " \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_meanfrequencycount
(-inf, -1.2269e+02]1.40630.0259321
(-1.2269e+02, -1.2247e+02]2.88780.0259321
(-1.2247e+02, -1.2241e+02]3.23970.0245303
(-1.2241e+02, -1.2229e+02]2.15820.0262324
(-1.2229e+02, -1.2215e+02]2.30710.0476589
(-1.2215e+02, -1.2206e+02]2.56650.0263326
(-1.2206e+02, -1.2199e+02]2.62650.0253313
(-1.2199e+02, -1.2191e+02]2.69240.0237294
(-1.2191e+02, -1.2181e+02]2.29190.0255316
(-1.2181e+02, -1.2157e+02]1.71030.0242300
(-1.2157e+02, -1.2139e+02]1.17360.0252312
(-1.2139e+02, -1.2127e+02]1.32700.0263326
(-1.2127e+02, -1.2101e+02]1.48570.0238295
(-1.2101e+02, -1.2064e+02]1.47160.0245304
(-1.2064e+02, -1.2007e+02]1.33760.0254314
(-1.2007e+02, -1.1972e+02]1.26240.0258319
(-1.1972e+02, -1.1929e+02]1.33320.0239296
(-1.1929e+02, -1.1897e+02]1.33000.0250310
(-1.1897e+02, -1.1852e+02]2.72110.0258319
(-1.1852e+02, -1.1843e+02]3.16530.0284352
(-1.1843e+02, -1.1838e+02]3.44320.0238295
(-1.1838e+02, -1.1834e+02]2.74800.0249308
(-1.1834e+02, -1.1830e+02]2.34350.0271336
(-1.1830e+02, -1.1822e+02]1.74760.0480594
(-1.1822e+02, -1.1818e+02]1.80550.0227281
(-1.1818e+02, -1.1813e+02]2.14800.0287356
(-1.1813e+02, -1.1808e+02]2.24940.0243301
(-1.1808e+02, -1.1801e+02]2.40790.0245303
(-1.1801e+02, -1.1790e+02]2.23040.0468580
(-1.1790e+02, -1.1780e+02]2.48200.0266329
(-1.1780e+02, -1.1766e+02]2.28640.0248307
(-1.1766e+02, -1.1739e+02]1.67910.0237294
(-1.1739e+02, -1.1725e+02]1.63800.0290359
(-1.1725e+02, -1.1716e+02]2.05120.0229284
(-1.1716e+02, -1.1708e+02]1.51130.0249308
(-1.1708e+02, -1.1696e+02]1.66690.0235291
(-1.1696e+02, inf)1.17690.0245304
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
1.39270.021689
3.01290.023396
3.18990.022593
2.19110.0271112
2.30350.0453187
2.98620.024099
2.54710.024099
2.69690.023095
2.14640.0250103
1.71050.021890
1.09590.022091
1.29180.0291120
1.37810.023095
1.47670.022593
1.24410.0252104
1.28100.0281116
1.28130.0252104
1.42230.0274113
2.70810.021890
3.25480.0266110
3.36040.0242100
2.80640.0262108
2.23950.0305126
1.76310.0434179
1.61750.0298123
2.08810.0264109
2.34870.0245101
2.43220.023597
2.18500.0497205
2.52020.0288119
2.27010.023597
1.74640.022593
1.87480.0310128
2.14660.0266110
1.44790.0279115
1.57460.0271112
1.24650.0259107
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [ContinuousCarver] 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X distribution
 target_meanfrequencycount
(-inf, -1.218e+02]2.44380.25093107
(-1.218e+02, -1.190e+02]1.37870.22422776
(-1.190e+02, -1.183e+02]3.01750.10291274
(-1.183e+02, -1.177e+02]2.16010.27353387
(-1.177e+02, inf)1.61550.14861840
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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_meanfrequencycount
2.47800.2357973
1.34870.2243926
3.04140.0988408
2.13280.28001156
1.67630.1611665
\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
0AutoCarver5.8900.08890.66520.65950.0057
1optbinning2.8760.00830.51450.50770.0068
2KBinsDiscretizer0.0090.00180.61810.6192-0.0011
\n", "
" ], "text/plain": [ " library fit_s transform_s train_r2 test_r2 r2_drop\n", "0 AutoCarver 5.890 0.0889 0.6652 0.6595 0.0057\n", "1 optbinning 2.876 0.0083 0.5145 0.5077 0.0068\n", "2 KBinsDiscretizer 0.009 0.0018 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, carver = 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": "b7da7c9b", "metadata": {}, "outputs": [ { "data": { "image/png": "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u+lde//5z3/M/Llz53rM131yn79o0aI0135q/fv3t0JCQqwLFy6kW2blypVmPfo3u9+fESNGeKzzuuuusxo3bpzuNgEAKKjoXgcAQBZoCxilLVoyyz0/jt2aR1uR7N2717y+XNoiR1uBaEsb91w12t1NW554yy+VXosMTU5ut55SDRs2NF2UdF8z+xk10bl+xptuusm0mNm5c2emPoeOxqctVVJPug/uli5dav5qqyp32uJJZSeflrZk0eTvu3fvzvKylzpm2jJGW8NodyztfmjT7modOnSQ3KYt5rTlTuquZnr+ypQpY86lPeln1c/zzTffmHLajVBbIWkLKfecSRm14Et97em2SpUqZVqUuW9Lu7ppq7mVK1eacnZroyVLlnht/WaX0TxR7t0iffH9efzxxz1e67G61HcEAICCiO51AABkgQYT7MBKZmkXnbi4OFmzZo0JwrjToJPecF+OX3/91fzVblGp6U2zdv9yp138qlat6nVd2o0qNQ08pM6tk5oGbHR0N+1WZwfmbJkNrGm3Ns0r5G377t3u9PNqYEODNu5CQ0NN0ME+HlmhXd06d+4sV199tcnNpF3hNE9R6oBXdo6ZBjR0tLTU+6u8zUtN84fplB0atNHpUkGn1DT49sMPP6Tb/c9OaK/HWrsMunfRzOhzebv2dFt6jWjOs4y2pYFa7bao3RPfeOMNk+NMA3kPPPCAayRFDRy9//77JphXpUoV0x3vvvvuM+fTqe+PBqZSH5fMfEcAACiICDoBAJDFoJO2Vtm+fXumymvSZM0vozev48aNM0mZdah2ba2jN86pkzLnBL1B16CNN+mNSvffnmTeacJpDQjosdHgjbb60RtzzYf0/PPP++wzXk4C7tRJn2+++WZzrjQf0ZdffilvvfWWOT/Tpk0zeZ4ykp1jlhWaN0gDLdmhwU5vidTdeRupTs+ZtjwaPHiw12U0OOfUtafb0oDT3LlzvS5jB3j0fH/wwQeydu1akxdNk59rEnHNp6TzNLim69myZYt57/PPPzeTJvKPiooyOcCcUBBHbgQAILsIOgEAkEU62pcm89aWS82bN8+wrN4c64hqn3zyiUeLGLvLkBOqV6/uSgito+S503n2+76io4DpCGaa0FmDNzZNBu0L+nk0UKEtZOrVq+ear8mfNQDm/nm1BYrOc3f+/HmTDDu1smXLmmTSOmnL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x4xcV79+fSnI+B7kL5yv/INzBfBdyG/43co/OFf/U8hiPFUAAAAAAAA4LEs5nQAAAAAAAIDMIOgEAAAAAAAAxxF0AgAAAAAAgOMIOiFfCwsLMyNiZaRQoUImGbGTevbsKV26dBF/sn//fnOstmzZkuPbzqvHc9iwYSb5NYCCiTrGOdQxaVHHAAUbdYxzqGPyeB1j5VOrV6+2ChcubN1xxx1ZXjYuLs5q1KhRtrabnJxsvfbaa1bDhg2tokWLWuXKlbNatGhhzZw50zp//ny21olLmzVrllWqVKk086tXr2698cYbGS77+++/W+fOnXP0MJ84ccL666+/rLwiOjra6ty5s8e8hQsXWkFBQdaYMWPM+/p1t6eyZctakZGR1tatW13lL1y4YI7VP//848g+rVy50rW9QoUKWSEhIVZERIQ1aNAg69ChQ3nueOp+Llq0yGPeqVOnrOPHj+faPiH3UMcULNQxGaOOuXzUMXBHHVOwUMdkjDrG/+uYfNvS6e2335annnpKvvnmGzl06FCObPP8+fMSGRkpr776qjz66KOyevVqWb9+vfTt21cmTZokP/74Y7bX/c8//4iv9rmgCw0NNUNWOqlUqVJSunRpyaveeust6dGjh0ydOlWeffZZM699+/by+++/m2n58uVSpEgRufPOO13LBAQEmGOl8520a9cu8x39/vvv5fnnn5evvvpK6tevL9u2bcuR43k5360SJUpIuXLlxFf4fuZd1DGZwzVMHUMdQx0D6hjuY3yH+xjuY/ziPsbKhzRqV6JECWvnzp1Wt27drJdffjnDSLJG/eyPqu+7t/jQSeepX3/91brrrrus4sWLWyVLlrS6du1qHT582LUebeGkras2bdqUZp+0ldPp06fNvz///HOrZcuWZj+0RUnHjh2tPXv2uMru27fPbHf+/PnWzTffbFqjTJgwwQoODraWLl3qsd6PPvrIfNYzZ86Y1wcOHDD7pesuU6aM2V9dX+pI8ahRo6xKlSpZYWFhVl6gLY2eeuop68orrzSfV4/P+vXrPVrELFmyxGrQoIF5v1mzZta2bds83neftLWa3dJpxIgR1v33328VK1bMqly5sjV58uR0I7/2sf/www+tNm3amNZq2mpNnzilvoYSEhKsunXrmutBWwW5t85JHZFv3bq1+XzaikfPS8WKFV37aPvpp5/M59bPV69ePWvZsmVeo9LZ4b4/ep3qtaTXTnr7q/7zn/+Y7R89etTj2GzevNnjuH/11VdW48aNzbFq3ry5+d7ZtmzZYo6jXqP6nbn++uut77//3mP51C2Y/v77b+uaa64xxyK9/dNWWvXr1zefQ79Dt956q+v7pd5++20rPDzcCgwMtEJDQ62+ffu63tNt/vvf/7Y6depkrgn7PCxevNi67rrrzPGvUaOGNWzYMFerLr2O3K8vfe2tVWTq69C9rNJrtn379uaaqVChgvXggw9ax44d87hOdF/79+9vWknqsUPeQx1DHUMd44k6hjoG1DE27mO4j+E+hvuYclm8j8mXQSe94WzSpIn596effmrVqlXLunjxYqaCTnrD++yzz1rXXnut6Uqkk85LSUkxXX9atWplbdiwwVq7dq250dabRJsGJ26//fZL7t8HH3xgghq7d+82N/B686vBFN2G+4+1BoS03N69e01A49577zU3qe7uuece1zwNbOmX/OGHH7Z++OEHa8eOHdYDDzxgbuC125/9P4YaAHjooYes7du3mykvePrpp01ASINqP/74o9lPDc788ccfruCEfrYvv/zSfLY777zTHB/9zPrZxo8fb7pn2edMbwqV3vBrsCM+Pt7atWuXNXHiRCsgIMCsJ6OgkwaTNMily+hx1/XYAQi9hq644gqrXbt2JoCyceNGs296rDMKOun+aSDj559/tt555x3TpczeD+26pufptttuM4EaDfg0bdrU8aDT4MGDzfnXQJG39216/B577DGrdu3aaa7L1EEnDQCuWrXKnLebbrrJdCe16fdIr08NqOnnfv/9983nc1/eW7c57RKp7x05ciTN/ul3oUiRIta4cePMPun1MGXKFNc514CSBqP0mtDzp8FL9y6Wul4N+GiX119++cUEk7/55htzfmbPnm3m6XnR60vPl9LAmx2A1uvLDsSlDjrZ159OGkjW46ffNaWfU4OqMTEx5nhocFrPd9u2bT2uEz0/GpzU4J17AA95B3UMdQx1jCfqGOoYUMdwH8N9DPcx/8V9zKAs38fky6CT3vTqDafSQEH58uXNDW5mgk7p5XTSm1ANVmhLIpveZOtydoscbemhwZOs0pYOuh675Y59c29/Bvf9dG/VlJSUZG6uteWUmjNnjglc2AE2pQEZ3a8vvvjC9T+G2srGDkLlBdpCRYM4c+fOdc3T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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." ] } ], "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.11.15" } }, "nbformat": 4, "nbformat_minor": 5 }