{ "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
x <= 8.00e+000.09800.085051
8.00e+00 < x <= 9.00e+000.23330.050030
9.00e+00 < x <= 1.10e+010.08700.038323
1.10e+01 < x <= 1.20e+010.28830.1850111
1.20e+01 < x <= 1.50e+010.22730.073344
1.50e+01 < x <= 1.80e+010.36920.108365
1.80e+01 < x <= 2.20e+010.23810.035021
2.20e+01 < x <= 2.40e+010.33330.1950117
2.40e+01 < x <= 2.80e+010.22220.01509
2.80e+01 < x <= 3.30e+010.38460.043326
3.30e+01 < x <= 3.60e+010.47270.091755
3.60e+01 < x <= 4.70e+010.26670.025015
4.70e+01 < x0.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
x <= 8.00e+000.09800.085051
8.00e+00 < x <= 1.10e+010.16980.088353
1.10e+01 < x <= 1.50e+010.27100.2583155
1.50e+01 < x <= 2.80e+010.33020.3533212
2.80e+01 < x0.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
x <= 6.18e+020.20000.025015
6.18e+02 < x <= 7.08e+020.40000.025015
7.08e+02 < x <= 7.97e+020.33330.025015
7.97e+02 < x <= 9.09e+020.40000.025015
9.09e+02 < x <= 1.03e+030.40000.025015
1.03e+03 < x <= 1.16e+030.20000.025015
1.16e+03 < x <= 1.21e+030.26670.025015
1.21e+03 < x <= 1.26e+030.20000.025015
1.26e+03 < x <= 1.31e+030.33330.025015
1.31e+03 < x <= 1.37e+030.46670.025015
1.37e+03 < x <= 1.41e+030.12500.026716
1.41e+03 < x <= 1.47e+030.14290.023314
1.47e+03 < x <= 1.53e+030.26670.025015
1.53e+03 < x <= 1.60e+030.20000.025015
1.60e+03 < x <= 1.82e+030.20000.025015
1.82e+03 < x <= 1.92e+030.50000.026716
1.92e+03 < x <= 1.98e+030.28570.023314
1.98e+03 < x <= 2.12e+030.33330.025015
2.12e+03 < x <= 2.21e+030.26670.025015
2.21e+03 < x <= 2.30e+030.26670.025015
2.30e+03 < x <= 2.38e+030.20000.025015
2.38e+03 < x <= 2.48e+030.40000.025015
2.48e+03 < x <= 2.62e+030.26670.025015
2.62e+03 < x <= 2.75e+030.33330.025015
2.75e+03 < x <= 2.92e+030.20000.025015
2.92e+03 < x <= 3.07e+030.20000.025015
3.07e+03 < x <= 3.35e+030.40000.025015
3.35e+03 < x <= 3.51e+030.13330.025015
3.51e+03 < x <= 3.63e+030.13330.025015
3.63e+03 < x <= 3.91e+030.06670.025015
3.91e+03 < x <= 4.24e+030.46670.025015
4.24e+03 < x <= 4.66e+030.40000.025015
4.66e+03 < x <= 5.08e+030.46670.025015
5.08e+03 < x <= 5.80e+030.20000.025015
5.80e+03 < x <= 6.36e+030.26670.025015
6.36e+03 < x <= 6.85e+030.46670.025015
6.85e+03 < x <= 7.48e+030.20000.025015
7.48e+03 < x <= 8.23e+030.46670.025015
8.23e+03 < x <= 9.57e+030.40000.025015
9.57e+03 < x0.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
x <= 1.03e+030.34670.125075
1.03e+03 < x <= 3.35e+030.27580.5500330
3.35e+03 < x <= 3.91e+030.11110.075045
3.91e+03 < x <= 7.48e+030.35240.1750105
7.48e+03 < x0.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.34780.115023
0.22330.5150103
0.20830.120024
0.38710.155031
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
x <= 1.00e+000.24360.130078
1.00e+00 < x <= 2.00e+000.26060.2367142
2.00e+00 < x <= 3.00e+000.29790.156794
3.00e+00 < x0.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
x <= 2.00e+000.25450.3667220
2.00e+00 < x <= 3.00e+000.29790.156794
3.00e+00 < x0.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
x <= 1.00e+000.31170.128377
1.00e+00 < x <= 2.00e+000.29050.2983179
2.00e+00 < x <= 3.00e+000.30000.1667100
3.00e+00 < x0.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
x <= 2.10e+010.40000.025015
2.10e+01 < x <= 2.20e+010.36840.031719
2.20e+01 < x <= 2.30e+010.45000.033320
2.30e+01 < x <= 2.40e+010.33330.035021
2.40e+01 < x <= 2.50e+010.51610.051731
2.50e+01 < x <= 2.60e+010.25000.046728
2.60e+01 < x <= 2.70e+010.22580.051731
2.70e+01 < x <= 2.80e+010.40910.036722
2.80e+01 < x <= 2.90e+010.39130.038323
2.90e+01 < x <= 3.00e+010.21430.046728
3.00e+01 < x <= 3.10e+010.23080.043326
3.10e+01 < x <= 3.20e+010.25000.033320
3.20e+01 < x <= 3.30e+010.36360.036722
3.30e+01 < x <= 3.40e+010.36360.036722
3.40e+01 < x <= 3.50e+010.17240.048329
3.50e+01 < x <= 3.60e+010.20830.040024
3.60e+01 < x <= 3.70e+010.33330.025015
3.70e+01 < x <= 3.80e+010.18750.026716
3.80e+01 < x <= 3.90e+010.29410.028317
3.90e+01 < x <= 4.10e+010.31820.036722
4.10e+01 < x <= 4.20e+010.27270.018311
4.20e+01 < x <= 4.40e+010.19050.035021
4.40e+01 < x <= 4.60e+010.26320.031719
4.60e+01 < x <= 4.70e+010.40000.016710
4.70e+01 < x <= 4.90e+010.14290.023314
4.90e+01 < x <= 5.10e+010.14290.023314
5.10e+01 < x <= 5.40e+010.29410.028317
5.40e+01 < x <= 5.70e+010.33330.020012
5.70e+01 < x <= 6.30e+010.43750.026716
6.30e+01 < x0.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
x <= 2.50e+010.42450.1767106
2.50e+01 < x <= 3.20e+010.27530.2967178
3.20e+01 < x <= 3.40e+010.36360.073344
3.40e+01 < x <= 3.60e+010.18870.088353
3.60e+01 < x0.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
x <= 1.00e+000.30610.6317379
1.00e+00 < x <= 2.00e+000.28990.3450207
2.00e+00 < x0.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
x <= 1.0e+000.29840.8433506
1.0e+00 < x0.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.0310.02330.84740.81180.0356
1optbinning1.0810.01330.85230.79310.0592
2KBinsDiscretizer0.0030.00080.84010.79430.0458
\n", "
" ], "text/plain": [ " library fit_s transform_s train_auc test_auc auc_drop\n", "0 AutoCarver 2.031 0.0233 0.8474 0.8118 0.0356\n", "1 optbinning 1.081 0.0133 0.8523 0.7931 0.0592\n", "2 KBinsDiscretizer 0.003 0.0008 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": "1ea9c0a3", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJQAAAFcCAYAAACeKeQ7AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVcdJREFUeJzt3Qu8TXX+//GP+y2HECI5KteIQU6kpAxKoiLURJKZaXJLyZAcUqkmtxlKKkklUlJJJGVqxi23pKKUW+VaIYRi/R/v7++/9ux9zj6XxT731/PxWGWvve5r7fU967O+3883n+d5ngEAAAAAAADplD+9EwIAAAAAAAAElAAAAAAAABAYNZQAAAAAAAAQCAElAAAAAAAABEJACQAAAAAAAIEQUAIAAAAAAEAgBJQAAAAAAAAQCAElAAAAAAAABEJACQAAAAAAAIEQUAIAADE3bdo0y5cvn23dujU07oorrnBDdnPbbbfZGWecka5ptU8jRoyw3ErHIj4+PltdN/KPf/zDzjvvPCtQoIA1aNDAjdN2anszm86/thEAgLyOgBIAIEfasmWL9enTx2rUqGHFixd3Q506deyuu+6y9evXW163bt06+9Of/mRVqlSxIkWKWJkyZaxVq1b2/PPP24kTJyw7+OGHH9zDubYVSMl7771n9913n1166aXu+n3kkUcy/GAdOXLEXZtLlizhxAAAkIKCKX0BAEB2NW/ePOvSpYsVLFjQbrnlFqtfv77lz5/fNm7caHPmzLGnnnrKBZyqVq1qedGzzz5rf/3rX61ChQp26623WvXq1e2XX36xxYsXW69evWznzp02dOjQLAkMJA0ojRw50tU08WudZHe//vqru+6QMXS9du3a1QVBfR988IH7fT/33HNWuHDh0PhNmza58RkVUNK1KUlr1Q0bNsz+/ve/Z8h6AQDISfiLCACQo3zzzTfugVPBIgVIzj777IjvH3vsMXvyySdj9qB5+PBhK1GihOUUy5cvd8Gkpk2b2vz5861kyZKh7wYMGGCrVq2yDRs2pDj/77//bidPnox4cI+VjFhmZitatGimr9PzPDt69KgVK1bMcjs1adMQbs+ePW7fk14/4UGnzKSAIkFFAABo8gYAyGEef/xxF+RR05ekwSTRg16/fv1cU69wqr3UqVMn1/RLQYHGjRvbW2+9FTV/y7///W/729/+ZuXLl7dzzjknVEuhbt26rjldixYtXBO7Cy64wF577TX3veZJSEhwD741a9a0999/P2LZ27Ztc8vUd5qmbNmy1rlz52S5Yvxt+O9//2sDBw60s846ywW0rr/+etu7d2+ax0e1KjT/yy+/HBFM8mm//bwzWremfeKJJ2z8+PF2/vnnu4f0L774It3HTD7//HO78sor3X7peD300EMuKJVUeA4lNSW6+OKL3b979uzptkOD9j+rfPvtt9amTRt3vCtVqmQPPvigC+aklkPJz6ezefNmd1xLly5tpUqVcvukWi7hdM3qOOm60nFWE03VpktKNbauvfZaW7hwoTvmOq5PP/20u+5UGy8aXVfa9rS8++67bjm6NuLi4tw5mDFjRqrz6Ppo1qyZu2a1LY0aNQpd9+EWLVpkzZs3d8dAOam0TUlrwv3rX/+yCy+80P1+zjzzTLd/4etPmkNJ/9Zx028+6TUSLYfS/v377e6773bf6Rjreuzevbvt27fPfX/8+HEbPny42wedJ53ryy67zD788MPQMrRu/e7Cf0/h5z1aDiUFYkeNGhX6DWn92vdjx45FPbf/+c9/rEmTJu53pdxQ06dPT/UcAACQHVFDCQCQ45q7KZCj4E16KeCh/CuVK1d2TVX0EPnqq69ax44d7fXXX3fBmnAK/OiBUg+eepD1/fzzz+5hUDWkFAxSMED/VvBGtX9UM+jmm292CYQViNmxY0coqPPJJ5/Y0qVL3fR6yNVDq+ZXgEUBHD1gh+vbt6974E5MTHTTKuCjnFGzZs1KcT8VwFCtrcsvv9zOPffcdB8fPbCrBsyf//znUL6l9B6zXbt2WcuWLd0DtT/dlClT0qxNU7t2bRew0THWevVQLwpcZAXllWrbtq1dcsklLmi5YMECd+y1X9rOtNx0001WrVo1Gz16tK1Zs8Y1O1TgSDXmfDrfCqZcd911LvD59ttvu2tNwTfl/gqn5lzdunWzv/zlL9a7d28XnFGQRv9WDTMFN326tr766ivXFCs1CsTcfvvtbhuGDBniAj9r1651+6rrNiUTJkxw26zmpQrIzJw5013/+i22a9fOTaPrRb+Niy66yB0vXUcKsikw6nvmmWdcsFe/jf79+7trTgHaFStWpLj+F1980V1PK1eudMc0tWvk0KFD7jr68ssv3X42bNjQBZIUBP3uu++sXLlydvDgQbccHVsdSzUFVVM6BeO0DjW91G9f5+rOO+901/kNN9zglq99S8kdd9xhL7zwgtu3e+65x+2TrgVtyxtvvBExrY6LplPz0x49etjUqVNdYExBLp0bAAByDA8AgBziwIEDqi7idezYMdl3P//8s7d3797QcOTIkdB3V111lVevXj3v6NGjoXEnT570mjVr5lWvXj007vnnn3fLb968uff7779HLL9FixbuuxkzZoTGbdy40Y3Lnz+/t3z58tD4hQsXuvFani98e3zLli1z002fPj3ZNrRq1cpto+/uu+/2ChQo4O3fvz/F4/Ppp5+6efv37++lx5YtW9z0cXFx3p49eyK+S+8xGzBggFvGihUrQuO0rFKlSrnxWkf4MdTg++STT5Idp6zQo0cPtx19+/aN2Nd27dp5hQsXdteTT9MlJiaGPuvfGnf77bdHLPP666/3ypYtGzEu2jXQpk0b77zzzosYV7VqVbfMBQsWRIzXuS9atKg3ePDgiPH9+vXzSpQo4R06dCjFfdS8JUuW9BISErxff/014rvw60zHQutPbbuPHz/u1a1b17vyyitD48aNG+e2OfxYJdWhQwfvwgsv9FLjX//h1422SfuXlLZT3/mGDx/u5p0zZ06yaf191O/62LFjye4dFSpUiDiH2o+k5zrpOfetW7fOfb7jjjsiprv33nvd+A8++CBimzXuo48+ivi9FClSxLvnnntSPTYAAGQ39PIGAMgxVLtAonXxrpo+qlngD5MmTXLjf/rpJ5fUVzVIVBtBNRY0/Pjjj65Wwtdff23ff/99xLJUcyFpHhd/vaph5FOtEdXyUG2b8BpT/r/VhMoXXmPnt99+c+tXTSvNrxotSanWTnizGtW8UC0aNZ1L6/hEa+qWmhtvvDHUxCfoMVOeJtXqUfMdn5al2iw5jWqA+XTs9Vk1cpI2X4xGtdPC6XzpePnnJOk1cODAAXdM1fxM14k+h1Ntp6RN2NREq0OHDvbKK6+EmuLpmlCtNdUcSy3Xl5qj6VyqFlnSPFBJm28lFb7dqqWnbdX+hV+3uo7lzTffjNrc0Z9GNYVUoyojqOacmgQmrXEYvo/6Xfu5mLSdutZVC01N76L9DtNDvwFRE9Vwqqkk77zzTsR4NXX0a+T5vxfdS8LvFwAA5AQ0eQMA5Bh+oERNW5JSjhk9MO/evdv+9Kc/RTQv0cP3Aw884IZolPRXTbvCH+ajUVO1pA/feshPmq9J4/yH7/DewdQERs3LFIwJz82TNJggSZusqflb0mUmpZw4ouMQRNL9DXLMFOCK1vxQD8ixpMCOHv5PhQIIasaXGiVxVy6bcDVq1HD/T5rnKprUzpd/XtT8S83oli1bliy/kq4B/7pJ7RpUPiAFkD7++GPXtFHBLl3z6h0trWT2Et5ULr3UtE15sdatWxeREyj8t6BeF9WUTE2/FLS66qqrXFMxNe3yE+QPHjzYba+Cjwqmtm7d2jV1U9PKWNA+KjiaFjVNGzNmjMsRpuBuWsc8LfoNaB+1T+EqVqzogmhJg8DRmqPqeknttw0AQHZEQAkAkGPogVuJuKP1UuYHNZI+/Pu1Je69994UkxYnfRBMKf9PtFpLqY0PDxopJ5KCScq1pB7YtC96IFeNp2g1OtKzzGj7odw8n332mQWRdH9P5ZhlNOWfUq6mU6FaQEoCnpHSOl8KdijIUqtWLRs7dqwLQirQpdot48aNS3YNpHQN6nxUqFDBXnrpJRdQ0v8VuGjVqlUG7JW5wJXyJ2ld6j1Rv79ChQq5azk8mba296OPPnLJrVUjR3mZFPhSEvL33nvPHR/V5FNuKAWo9L1qFGmZyqOl5NeZQcdL+YpUo2vQoEEuz5W2TcFeP+h2qtKq6XU6v20AALIjAkoAgBxFSYBVE0IJdMObWaXEr3Wih+CMeuhOD/WKpQS8qhnhU1Ji9UoVK0rsrQd4NVdTQvCkNafSK8gxq1q1qmsCl5QCB7F6ABc1ZVKzrVPh1xZKjQI6anLk10oSJbr2e+Y6XUrArdo9ShAdXkMlvHex9AYjVKtHCbaV8Hvu3LkpNtEMp97HRMHYIMFABX3URE49zinRtk8BpaRUS0dBMw0Kmj3yyCN2//33u330ryM1y1NtJg2qdaZaTA8//LBLEp60KV5Q2sdoweakv0Nd33PmzIm4/lRz7FSvTf0GdP3od6CgmU81x/T71vcAAORG5FACAOQo9913nwucqBcnPbCl9ZZfNRCUX0lN4nbu3Jls+r1791pm0AN/0m1TF+rKgRNLejDWetQEKlrTwNWrV7smP6kJcsyuueYaW758uQvwhX+vnu/S4uf8SU9QTUEhBSVOZVDvWekxceLE0L91DPVZQTUFSE6XH/BJ2tQxWmAmLTq3ah6lHuB0jsObeKZEzcvUZFQ1cRTITG/NGG23givh16lqASqQFS5ac0T1mCZ+MznllAqnGlrKJ6T1hzc9O1Vq7vbpp58m61UtfB+jnQf1yKZmiOH8XhfTc23qNyDqiTGcgmri94QHAEBuQw0lAECOUr16ddfURt1+K0+Pkj+r9ooeELds2eK+U00J5TvyKUF38+bNrV69eq42h2ooKBilh0glCdZDaEZTl+rqAl1N3fQQrXUrn0zZsmVjuh51qa79VXf0al6l4IOOmfIqqdmXasgoH05a0nvMFODTfrVt29Z1Ba8gkbp5V60MdQmfVo0S5ZiZPHmyC3ZoXjVdPNVcNqdDtWPUDEu1yLQN7777rmu6NXTo0IiE5adKAR0FUNq3bx8KBD3zzDMueBctaJeaP/zhDy4X0uzZs12NmIYNG6Y5j/I4qWmdchxdfPHFrpaTgnQ6j8rnlFKQUcEQBUZ0fjWPcmfp2lAtp/Dz++CDD7omb5pe517TqTmbfoe6jvxjoOZ5ypmkZntffvmlC9ppnqCJ5KNREzbVQOrcubMLOCuQqECXrnldY7pP6Heo2klK3K316p6h7/SbDA/AqgmfxqnZnmqtKQeXjnm0HFRarq4bXfcKQKmJpQKsOqZqWneqTTUBAMjuCCgBAHIc9XSlPEFqPqb8LFOnTnW1KPQgq4dE9bilhzyfHgxXrVrl8rSoqZBqSuhBXg/myt+SGSZMmOBqR6jmjmqI6KFaAaWUchSdDgUsFDTQ8Zk+fbqrMaQe6hR4UI2Y9NRoSe8xU04dNWlSjqhHH33UBch0/CtVqmS9evVKdR2q/aOHbjV30jzqbUvblxUBJZ0bBZTuvPNOF5hQgEO1vWJ1fSj4qWDHsGHDXG4qBVa0LgWrFPwISsm5FcxLKxl3OJ0PnUOdp1GjRrnjr6Dj3XffneI8akL53HPPuXmU/0vnRk3tVEspPKCkPEsap9+ieq8rV66cC6zo+vGTjeu61PWvAJWCNwo29evXzx2TWNA1rpxPOm+qpaRrS/urGmZ+gFn5k3bt2uVq36kZn65z5VVScC5pni01rdV1reOj5nlabkpJzTWtgq76rWjdOr+6rpM2pQMAIDfJ55EBEAAAIEdRgFKBDgVxovUaBgAAkNEIKAEAAOQgeheoGniqDRY0qTcAAECs0OQNAAAgBzh8+LDLB6Qgkpp8vvnmm1m9SQAAIA+jhhIAAEAOoOZtymGkROZKuv7www9n9SYBAIA8jIASAAAAAAAAAskfbHIAAAAAAADkdQSUAAAAAAAAEAgBJQAAAAAAAARCQAkAAAAAAACBEFACAAAAAABAIASUAAAAAAAAEAgBJQAAAAAAAARCQAkAAAAAAACBEFACAAAAAABAIASUAAAAAAAAEAgBJQAAAAAAAARCQAkAAAAAAACBEFACAAAAAABAIASUAAAAAAAAEAgBJQAAAAAAAARCQAkAAAAAAACBEFACAAAAAABAIASUAAAAAAAAEAgBJQAAAAAAAARCQAkAAAAAAACBEFACAAAAAABAIASUAAAAAAAAEAgBJeRZn3zyiTVr1sxKlChh+fLls44dO7r/AwAAAEBWmzZtmns+2bp1a1ZvChAVASXkSb/99pt17tzZfvrpJxs3bpy9+OKLVrVq1WTTPfLIIzZ37tws2UYAwKlbunSpjRgxwvbv359hh5EyAgAA5GUElJAnffPNN7Zt2za799577c9//rP96U9/sjFjxtivv/4aMR0PCwCQcwNKI0eOJKAEAACQQQgoIU/as2eP+3/p0qVD4woWLGhFixbNwq0CAAAAgPTzPC/ZS3EgsxBQQp5z2223WYsWLdy/1exN7ZKvuOIK1zQiPIeS/n348GF74YUX3L81aN70mjlzpjVq1MhKlixpcXFxVq9ePZswYUKG7BMA4H90Px80aJD7d7Vq1UL3cD8HxUsvveTuz8WKFbMyZcpY165dbceOHRGH8Ouvv7Ybb7zRKlas6F42nHPOOW66AwcOxKSMeOKJJ1wev7Jly7rt0Pa89tprEdNoe7Vc5dBISuO1n+G+//5769Wrl1WqVMmKFCni9v3OO++048ePc3kAgJlrofC3v/3Natas6e69ugfreSBpjqKkzwVp5TR699133fOF/3f/xRdfbDNmzAh0zD///HO78sor3XapzHnooYfs5MmTyaaLj4+3a6+91hYuXGiNGzd20z/99NPuu2+//dbtj8q24sWL2yWXXGLvvPNOxPxLlixx+zBr1iwbOnSoK+eUU/a6665LVhYCaSmY5hRALvOXv/zFKleu7Jqz9evXz93wK1SoYP/9738jplNepTvuuMOaNGnimsXJ+eefn651LFq0yLp162ZXXXWVPfbYY27cl19+6dbRv3//DNgrAIDvhhtusK+++speeeUVlyevXLlybvxZZ51lDz/8sD3wwAN20003uXv83r177V//+pddfvnltnbtWldzVQGYNm3a2LFjx6xv377uj20Fa+bNm+ea0JUqVeq0ygjRCwb98X7LLbe49eklhB4CtI527doFPpk//PCD2xZtn7anVq1abpsVpDpy5IgVLlyYCwRAnqdOedQkWi8IFLRRYOipp55yL5e/+OILF4QJSkGm22+/3S688EIbMmSIK0dUnixYsMBuvvnmdC1j165d1rJlS/v999/t73//uwvwTJkyxQWLotm0aZN71tBzTe/evV2AbPfu3e5Fhe75esZRsEwvPVTWqCy4/vrrI5ah8lCBpcGDB7vWG+PHj7dWrVrZunXrUlwvkIwH5EEffvihp8t/9uzZoXGJiYluXLgSJUp4PXr0CLz8/v37e3Fxcd7vv/8ek+0FAATzj3/8w93Tt2zZEhq3detWr0CBAt7DDz8cMe1nn33mFSxYMDR+7dq1ycqIaE61jJAjR45EfD5+/LhXt25d78orrwyN07ZrO55//vlk82u8yi1f9+7dvfz583uffPJJsmlPnjx5StsIALlN0nuvLFu2zN1Tp0+fnupzgeh+HF627N+/3ytZsqSXkJDg/frrr6d87x0wYIBb7ooVK0Lj9uzZ45UqVSpZWVa1alU3bsGCBVGX8fHHH4fG/fLLL161atW8+Ph478SJExHPQZUrV/YOHjwYmvbVV1914ydMmJDu7QZo8gZkAL2ZUFMI1VQCAGQPc+bMcc0HVDtp3759oUE1kKpXr24ffvihm041kETNCfSmNyOEv/39+eefXVO6yy67zNasWRN4Wdon9Ujavn171/whqWjNNgAgLwq/96rX5x9//NEuuOAC97f7qdx/9bf+L7/84moVJc3FGuTeO3/+fNc8TTVNfapVq1qs0ahJs2rSJl2G5m/evHlo3BlnnOFqraomlmpghevevbtroufr1KmTnX322W45QHoRUAIygNpm16hRw66++mpXnVbVYFXtFQCQdZQXSZV7FDzSH+rhg5ol+x026A/1gQMH2rPPPuuay+mP9kmTJoXyJ8WCmrbp4UEPIMp1oW1Qs4tTWYea7R08eNDq1q0bs+0DgNxIyauHDx9uVapUcbnmdI/X/VfNhU/l/queo+V077/K7aSyKSk1ZYtG5VS0ZUSbvnbt2qHvwyVdnwJgCq4lzQ8FpIYcSkAGKF++vGt/rLfbStKn4fnn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1So0Ln/+/O7zsmXLos7z1ltvWdOmTV2TtwoVKljdunXtkUcesRMnTmTilgMAAADIsBpKQSmIpDfTjRs3tmPHjtmzzz5rV1xxha1YscIaNmwYdR5Np8F38ODBjN5MAECM7Nu3zwWCFBgKp88bN26MOs+3335rH3zwgd1yyy0ub9LmzZvtb3/7m/3222+WmJgYdR7KCgAAACAXB5Rq1qzpBl+zZs3sm2++sXHjxtmLL74YdZ7Ro0fbyJEjM3rTAADZxMmTJ13T6ClTpliBAgWsUaNG9v3339s//vGPFANKlBUAAABAHmjyFq5Jkybu7XNKhgwZYgcOHAgNO3bsyNTtAwCcunLlyrmg0O7duyPG63PFihVTrM2qXt00n6927dquR1A1oYuGsgIAAADIYwGldevWuYeHlKi7aPUIFz4AAHKGwoULuxpGixcvjqiBpM/KkxTNpZde6l40aDrfV1995coKLS8aygoAAAAgBzV5O3ToUETtoi1btrgAUZkyZezcc891b4zVTGH69Onue3UVXa1aNbvwwgvt6NGjLoeS8mS89957sd0TAEC2MXDgQOvRo4fLn6daqSoLDh8+HOr1rXv37la5cmXXbE3uvPNOmzhxovXv39/69u1rX3/9tUvK3a9fvyzeEwAAAAAxCSitWrXKWrZsGfHQIHpwmDZtmu3cudO2b98e+l5NFe655x4XZCpevLhddNFF9v7770csAwCQu3Tp0sX27t1rw4cPd83W1NPnggULQom6VU6o5zdflSpVbOHChXb33Xe7ckLBJgWXBg8enIV7AQAAACBmASX10OZ5XorfK6gU7r777nMDACBv6dOnjxuiWbJkSbJxag63fPnyTNgyAAAAADkyhxIAAAAAAAByLgJKAAAAAAAACISAEgAAAAAAAAIhoAQAAAAAAIBACCgBAAAAiLlJkyZZfHy8FS1a1BISEmzlypWpTj979myrVauWm75evXo2f/78FKf961//avny5bPx48dz5gAgixBQAgAAABBTs2bNsoEDB1piYqKtWbPG6tevb23atLE9e/ZEnX7p0qXWrVs369Wrl61du9Y6duzohg0bNiSb9o033nC9glaqVImzBgBZiIASAAAAgJgaO3as9e7d23r27Gl16tSxyZMnW/HixW3q1KlRp58wYYK1bdvWBg0aZLVr17ZRo0ZZw4YNbeLEiRHT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WLGid9ddd4W+0zqffPJJr3379u7a8M/H3LlzvT/84Q/uPFSrVs0bMWJEqDaWrqfw60yfo9VwTHo9hk8runbbtm3rrp3y5ct7f/rTn7y9e/dGXC/a1v79+7sajzp2iA3KCsoKyoq0UVZQVuR1lBWUFZQVaaOsuCvXP1fkqYCSHhwbN27s/v322297559/vnfy5Ml0BZT04HrPPfd4F154oWvKo0HjTpw44ZreNG/e3Fu1apW3fPly98Csk+JTsKF169Zpbt9rr73mghRff/21exDXxabgiNYR/pCuYI+m+/bbb12AolOnTu6iCHfjjTeGxilopeDD7bff7q1fv9774osvvJtvvtk9iKspnv9j14P8rbfe6m3YsMEN2U2/fv1csEfBs88//9xtswIvP/74YyjgoP1877333H5ee+217lhp/7Wf48ePd02l/POnPwREPzYFMEaPHu1t2rTJ++c//+kVKFDALSe1gJICRQpgaR6dAy3H//HreipUqJDXqlUrFxRZvXq12zYd99QCSto+3US++uor74UXXnDNu/ztUDMynbM//vGPLviiIE6TJk0yLKB03333uWtCQaBo3/t0HP/yl794F1xwQbJrNWlASUG+JUuWuPN32WWXuWafPv22dM0qaKb9f/XVV91+hs8frSmbmivqu927dyfbPv0+ChYs6I0dO9Ztk66LSZMmhc69buoKNOna0HlUgDK8+aOWq5uumqZ+8803Lnj80UcfufM0bdo0N07nR9eZzpsoqOYHnHWd+UG2pDd+/zrUoMCxjp9+f6L9VOB0yJAh7ngoGK3z3rJly4jrRedHAUgF5sKDczg9lBWUFZQVaaOsoKzI6ygrKCsoK9JGWTEu1z9X5KmAkh5e9eAoevAvV66ce1BNT0AppRxKOukKPqgGkE8Py5rPrz2j2hgKhgSlqKGW49ey8R/S/X0I387w2kgHDhxwD8mq8SQvvviiC0T4wTNRgEXbtXDhwtCPXTVi/ABTdqMaJQrQvPzyy6FxChQpwPT444+HAg6qveVToEn7OGvWrDTbOitiG0412K6++upUA0rPPvtssnOuH6m/Ln0Or2GmQIaOcWoBJQUmw1188cXe4MGD3b91PhUc0Y3Cl1E1lFRbR8tdvHhx1O91zSvCrUHTqVabgma+1Goo+d555x037tdff3WfFdTTzTSa1AJKOi76bsWK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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": "afa44e90", "metadata": {}, "source": [ "Here, **AutoCarver** has dropped 6 columns that were not stable on dev set." ] }, { "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
x <= 1.335e+001.19840.0250310
1.335e+00 < x <= 1.593e+001.01050.0250310
1.593e+00 < x <= 1.740e+001.11330.0250309
1.740e+00 < x <= 1.906e+001.15350.0252312
1.906e+00 < x <= 2.029e+001.20900.0248307
2.029e+00 < x <= 2.152e+001.21410.0251311
2.152e+00 < x <= 2.243e+001.24170.0250310
2.243e+00 < x <= 2.350e+001.38270.0249308
2.350e+00 < x <= 2.468e+001.36140.0250310
2.468e+00 < x <= 2.569e+001.41900.0250309
2.569e+00 < x <= 2.655e+001.52640.0250310
2.655e+00 < x <= 2.737e+001.54280.0250309
2.737e+00 < x <= 2.862e+001.57080.0250310
2.862e+00 < x <= 2.974e+001.66300.0250310
2.974e+00 < x <= 3.054e+001.62700.0250309
3.054e+00 < x <= 3.135e+001.70790.0250310
3.135e+00 < x <= 3.216e+001.85540.0250309
3.216e+00 < x <= 3.315e+001.83730.0250310
3.315e+00 < x <= 3.423e+001.91210.0250309
3.423e+00 < x <= 3.531e+001.91620.0251311
3.531e+00 < x <= 3.633e+001.96780.0250309
3.633e+00 < x <= 3.723e+002.02260.0250309
3.723e+00 < x <= 3.839e+001.98910.0251311
3.839e+00 < x <= 3.971e+002.04930.0249308
3.971e+00 < x <= 4.073e+002.05380.0252312
4.073e+00 < x <= 4.179e+002.20040.0249308
4.179e+00 < x <= 4.315e+002.24170.0250309
4.315e+00 < x <= 4.464e+002.23940.0250310
4.464e+00 < x <= 4.611e+002.25770.0252312
4.611e+00 < x <= 4.757e+002.43510.0248307
4.757e+00 < x <= 4.946e+002.34820.0250309
4.946e+00 < x <= 5.117e+002.45920.0250310
5.117e+00 < x <= 5.308e+002.57840.0250309
5.308e+00 < x <= 5.538e+002.68920.0250310
5.538e+00 < x <= 5.828e+002.78670.0251311
5.828e+00 < x <= 6.148e+003.09430.0249308
6.148e+00 < x <= 6.599e+003.30310.0250310
6.599e+00 < x <= 7.313e+003.60640.0250309
7.313e+00 < x <= 8.433e+004.01910.0250310
8.433e+00 < x4.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
x <= 2.47e+001.20930.22502787
2.47e+00 < x <= 3.13e+001.57960.17502167
3.13e+00 < x <= 4.07e+001.95600.22512788
4.07e+00 < x <= 5.83e+002.42380.24993095
5.83e+00 < x3.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
x <= 5.00e+002.23580.0271336
5.00e+00 < x <= 8.00e+001.97270.0263326
8.00e+00 < x <= 1.10e+011.81330.0352436
1.10e+01 < x <= 1.40e+011.85380.0468579
1.40e+01 < x <= 1.60e+011.93550.0652807
1.60e+01 < x <= 1.70e+011.89290.0319395
1.70e+01 < x <= 1.80e+011.94550.0276342
1.80e+01 < x <= 2.00e+011.94700.0470582
2.00e+01 < x <= 2.30e+011.99340.0632783
2.30e+01 < x <= 2.50e+012.17130.0480595
2.50e+01 < x <= 2.60e+012.09370.0304377
2.60e+01 < x <= 2.70e+012.05680.0245303
2.70e+01 < x <= 2.80e+011.98270.0241299
2.80e+01 < x <= 2.90e+012.02030.0232287
2.90e+01 < x <= 3.00e+012.05150.0236292
3.00e+01 < x <= 3.20e+012.04530.0484599
3.20e+01 < x <= 3.30e+012.03430.0316391
3.30e+01 < x <= 3.40e+012.13570.0320396
3.40e+01 < x <= 3.50e+012.00040.0399494
3.50e+01 < x <= 3.60e+012.11480.0437541
3.60e+01 < x <= 3.70e+012.00040.0257318
3.70e+01 < x <= 3.90e+012.01330.0355440
3.90e+01 < x <= 4.20e+012.01480.0440545
4.20e+01 < x <= 4.40e+012.07420.0351435
4.40e+01 < x <= 4.70e+012.08520.0343425
4.70e+01 < x2.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
x <= 2.30e+011.94660.37034586
2.30e+01 < x <= 2.60e+012.14120.0785972
2.60e+01 < x <= 3.60e+012.05260.29093602
3.60e+01 < x <= 4.70e+012.03810.17472163
4.70e+01 < x2.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
x <= 3.066e+001.95060.0250310
3.066e+00 < x <= 3.432e+001.88800.0250310
3.432e+00 < x <= 3.647e+001.82330.0250309
3.647e+00 < x <= 3.792e+001.82920.0250310
3.792e+00 < x <= 3.933e+001.78470.0250309
3.933e+00 < x <= 4.052e+001.84990.0250310
4.052e+00 < x <= 4.168e+001.87180.0250310
4.168e+00 < x <= 4.276e+001.83330.0250309
4.276e+00 < x <= 4.365e+001.79650.0250310
4.365e+00 < x <= 4.454e+001.69520.0250309
4.454e+00 < x <= 4.536e+001.75350.0250310
4.536e+00 < x <= 4.621e+001.79520.0250309
4.621e+00 < x <= 4.705e+001.84650.0250310
4.705e+00 < x <= 4.794e+001.74860.0250310
4.794e+00 < x <= 4.874e+001.77190.0250309
4.874e+00 < x <= 4.941e+001.72190.0251311
4.941e+00 < x <= 5.014e+001.71760.0249308
5.014e+00 < x <= 5.088e+001.77070.0250310
5.088e+00 < x <= 5.160e+001.79180.0250309
5.160e+00 < x <= 5.233e+001.77910.0250310
5.233e+00 < x <= 5.315e+001.82090.0250310
5.315e+00 < x <= 5.384e+001.91070.0250309
5.384e+00 < x <= 5.460e+001.77280.0250310
5.460e+00 < x <= 5.532e+001.89960.0250309
5.532e+00 < x <= 5.616e+001.88720.0250310
5.616e+00 < x <= 5.694e+001.99050.0250309
5.694e+00 < x <= 5.778e+002.00290.0250310
5.778e+00 < x <= 5.858e+002.01070.0250310
5.858e+00 < x <= 5.959e+002.11370.0250309
5.959e+00 < x <= 6.059e+002.04690.0250310
6.059e+00 < x <= 6.157e+002.14500.0250309
6.157e+00 < x <= 6.270e+002.24770.0250310
6.270e+00 < x <= 6.396e+002.34950.0250309
6.396e+00 < x <= 6.543e+002.42320.0250310
6.543e+00 < x <= 6.717e+002.62410.0250310
6.717e+00 < x <= 6.946e+002.75730.0250309
6.946e+00 < x <= 7.233e+003.07630.0250310
7.233e+00 < x <= 7.637e+003.11180.0250309
7.637e+00 < x <= 8.324e+003.58460.0250310
8.324e+00 < x2.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
x <= 3.43e+001.91930.0501620
3.43e+00 < x <= 5.62e+001.80310.57497120
5.62e+00 < x <= 6.16e+002.05160.15001857
6.16e+00 < x <= 6.54e+002.34010.0750929
6.54e+00 < x2.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
x <= 9.1220e-012.05110.0250310
9.1220e-01 < x <= 9.4022e-012.12640.0250310
9.4022e-01 < x <= 9.5595e-012.06380.0250309
9.5595e-01 < x <= 9.6743e-012.07560.0251311
9.6743e-01 < x <= 9.7590e-012.25620.0249308
9.7590e-01 < x <= 9.8343e-012.17090.0250310
9.8343e-01 < x <= 9.8987e-012.14500.0250310
9.8987e-01 < x <= 9.9592e-012.17720.0250309
9.9592e-01 < x <= 1.0019e+002.19150.0251311
1.0019e+00 < x <= 1.0068e+002.09490.0249308
1.0068e+00 < x <= 1.0112e+002.24400.0250310
1.0112e+00 < x <= 1.0156e+002.16870.0250310
1.0156e+00 < x <= 1.0204e+002.17230.0250309
1.0204e+00 < x <= 1.0250e+002.20030.0254314
1.0250e+00 < x <= 1.0290e+002.13240.0246305
1.0290e+00 < x <= 1.0331e+002.18400.0250310
1.0331e+00 < x <= 1.0369e+002.03210.0250309
1.0369e+00 < x <= 1.0412e+002.17460.0250310
1.0412e+00 < x <= 1.0453e+002.25360.0250309
1.0453e+00 < x <= 1.0493e+002.15460.0250310
1.0493e+00 < x <= 1.0534e+002.07380.0251311
1.0534e+00 < x <= 1.0574e+002.12240.0249308
1.0574e+00 < x <= 1.0615e+002.04140.0250310
1.0615e+00 < x <= 1.0662e+002.15690.0251311
1.0662e+00 < x <= 1.0712e+002.09720.0250309
1.0712e+00 < x <= 1.0763e+002.07140.0249308
1.0763e+00 < x <= 1.0816e+002.02440.0250310
1.0816e+00 < x <= 1.0874e+002.01350.0252312
1.0874e+00 < x <= 1.0933e+002.22390.0249308
1.0933e+00 < x <= 1.1000e+002.02440.0262324
1.1000e+00 < x <= 1.1071e+002.00770.0242300
1.1071e+00 < x <= 1.1160e+001.95640.0245304
1.1160e+00 < x <= 1.1267e+002.00770.0250310
1.1267e+00 < x <= 1.1387e+001.93050.0250309
1.1387e+00 < x <= 1.1538e+001.81300.0258319
1.1538e+00 < x <= 1.1739e+001.80600.0242300
1.1739e+00 < x <= 1.2074e+001.91090.0250310
1.2074e+00 < x <= 1.2730e+001.89500.0250309
1.2730e+00 < x <= 1.5018e+001.79620.0250310
1.5018e+00 < x1.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
x <= 1.049e+002.15350.50006192
1.049e+00 < x <= 1.093e+002.09150.22502787
1.093e+00 < x <= 1.139e+001.98570.12491547
1.139e+00 < x <= 1.273e+001.85630.10001238
1.273e+00 < x1.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
x <= 2.08e+021.90500.0251311
2.08e+02 < x <= 3.53e+022.02770.0251311
3.53e+02 < x <= 4.42e+022.06550.0250310
4.42e+02 < x <= 5.12e+022.20670.0249308
5.12e+02 < x <= 5.75e+022.13270.0250310
5.75e+02 < x <= 6.27e+022.07310.0250310
6.27e+02 < x <= 6.75e+022.36270.0249308
6.75e+02 < x <= 7.16e+022.20060.0250309
7.16e+02 < x <= 7.56e+022.09000.0253313
7.56e+02 < x <= 7.94e+022.01910.0251311
7.94e+02 < x <= 8.32e+022.32480.0251311
8.32e+02 < x <= 8.67e+022.07630.0253313
8.67e+02 < x <= 9.02e+022.03130.0247306
9.02e+02 < x <= 9.40e+022.11850.0247306
9.40e+02 < x <= 9.78e+022.17900.0253313
9.78e+02 < x <= 1.02e+032.07460.0249308
1.02e+03 < x <= 1.06e+031.95220.0247306
1.06e+03 < x <= 1.09e+032.11860.0250310
1.09e+03 < x <= 1.13e+032.05920.0252312
1.13e+03 < x <= 1.17e+032.06400.0252312
1.17e+03 < x <= 1.22e+032.01340.0249308
1.22e+03 < x <= 1.26e+032.16900.0250310
1.26e+03 < x <= 1.30e+032.05580.0248307
1.30e+03 < x <= 1.35e+031.97110.0249308
1.35e+03 < x <= 1.41e+032.01850.0250310
1.41e+03 < x <= 1.46e+032.00040.0251311
1.46e+03 < x <= 1.52e+032.09110.0248307
1.52e+03 < x <= 1.59e+032.13220.0254315
1.59e+03 < x <= 1.66e+031.99490.0246305
1.66e+03 < x <= 1.73e+032.02330.0250309
1.73e+03 < x <= 1.82e+031.89460.0253313
1.82e+03 < x <= 1.91e+031.95040.0247306
1.91e+03 < x <= 2.02e+032.00740.0250310
2.02e+03 < x <= 2.16e+032.02130.0250310
2.16e+03 < x <= 2.32e+032.05410.0250309
2.32e+03 < x <= 2.56e+032.07570.0250310
2.56e+03 < x <= 2.86e+032.01420.0250309
2.86e+03 < x <= 3.28e+031.91960.0250309
3.28e+03 < x <= 4.25e+032.04390.0250310
4.25e+03 < x2.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
x <= 3.53e+021.96630.0502622
3.53e+02 < x <= 8.32e+022.16360.22532790
8.32e+02 < x <= 1.73e+032.06040.47455876
1.73e+03 < x <= 2.16e+031.96830.10001239
2.16e+03 < x2.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
x <= 1.699e+002.61410.0250310
1.699e+00 < x <= 1.868e+002.79860.0250310
1.868e+00 < x <= 1.976e+002.69790.0250309
1.976e+00 < x <= 2.071e+002.55580.0250310
2.071e+00 < x <= 2.161e+002.45820.0250309
2.161e+00 < x <= 2.228e+002.27570.0250310
2.228e+00 < x <= 2.288e+002.35920.0250310
2.288e+00 < x <= 2.341e+002.25070.0250309
2.341e+00 < x <= 2.388e+002.13710.0250310
2.388e+00 < x <= 2.435e+002.27080.0250309
2.435e+00 < x <= 2.475e+002.19890.0250310
2.475e+00 < x <= 2.515e+002.15640.0250309
2.515e+00 < x <= 2.557e+002.12790.0250310
2.557e+00 < x <= 2.598e+002.24280.0250310
2.598e+00 < x <= 2.639e+002.11160.0250309
2.639e+00 < x <= 2.674e+002.23430.0250310
2.674e+00 < x <= 2.712e+002.04890.0250309
2.712e+00 < x <= 2.746e+002.21960.0250310
2.746e+00 < x <= 2.784e+002.12110.0250309
2.784e+00 < x <= 2.824e+002.26450.0250310
2.824e+00 < x <= 2.861e+002.15650.0251311
2.861e+00 < x <= 2.899e+002.23230.0250309
2.899e+00 < x <= 2.943e+002.07140.0250309
2.943e+00 < x <= 2.984e+002.04950.0250309
2.984e+00 < x <= 3.026e+001.99170.0250310
3.026e+00 < x <= 3.071e+001.96230.0250309
3.071e+00 < x <= 3.117e+002.04910.0250310
3.117e+00 < x <= 3.168e+001.93360.0250310
3.168e+00 < x <= 3.221e+001.94720.0250310
3.221e+00 < x <= 3.279e+001.89380.0250309
3.279e+00 < x <= 3.344e+001.88040.0250309
3.344e+00 < x <= 3.424e+001.87240.0250310
3.424e+00 < x <= 3.508e+001.80000.0250309
3.508e+00 < x <= 3.606e+001.65710.0250310
3.606e+00 < x <= 3.719e+001.56240.0250310
3.719e+00 < x <= 3.870e+001.57090.0250309
3.870e+00 < x <= 4.089e+001.48540.0250310
4.089e+00 < x <= 4.317e+001.42400.0250309
4.317e+00 < x <= 4.705e+001.32330.0250310
4.705e+00 < x1.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
x <= 2.16e+002.62500.12501548
2.16e+00 < x <= 2.90e+002.20050.42515264
2.90e+00 < x <= 3.51e+001.95010.27493404
3.51e+00 < x <= 3.87e+001.59680.0750929
3.87e+00 < x1.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
x <= 3.275e+011.59120.0287355
3.275e+01 < x <= 3.321e+012.02990.0466577
3.321e+01 < x <= 3.365e+012.78330.0279345
3.365e+01 < x <= 3.374e+012.43260.0268332
3.374e+01 < x <= 3.379e+012.18290.0262325
3.379e+01 < x <= 3.383e+012.42320.0229283
3.383e+01 < x <= 3.387e+012.30030.0241299
3.387e+01 < x <= 3.391e+012.15700.0279345
3.391e+01 < x <= 3.394e+011.63000.0242300
3.394e+01 < x <= 3.397e+011.85940.0225279
3.397e+01 < x <= 3.400e+011.94820.0224278
3.400e+01 < x <= 3.403e+012.12670.0277343
3.403e+01 < x <= 3.406e+012.40210.0339420
3.406e+01 < x <= 3.410e+012.17600.0417516
3.410e+01 < x <= 3.413e+012.36460.0242300
3.413e+01 < x <= 3.417e+012.77710.0301373
3.417e+01 < x <= 3.427e+012.41000.0435539
3.427e+01 < x <= 3.453e+012.45590.0240297
3.453e+01 < x <= 3.532e+011.49140.0246305
3.532e+01 < x <= 3.623e+010.92080.0250310
3.623e+01 < x <= 3.672e+011.24410.0262324
3.672e+01 < x <= 3.697e+011.31290.0253313
3.697e+01 < x <= 3.729e+012.62410.0239296
3.729e+01 < x <= 3.737e+012.65740.0258320
3.737e+01 < x <= 3.753e+013.01050.0255316
3.753e+01 < x <= 3.765e+012.41970.0243301
3.765e+01 < x <= 3.772e+012.11740.0256317
3.772e+01 < x <= 3.777e+012.55370.0286354
3.777e+01 < x <= 3.793e+012.68870.0459569
3.793e+01 < x <= 3.800e+011.76220.0250310
3.800e+01 < x <= 3.826e+011.59240.0243301
3.826e+01 < x <= 3.850e+011.85700.0254315
3.850e+01 < x <= 3.863e+011.39810.0241298
3.863e+01 < x <= 3.898e+011.39620.0251311
3.898e+01 < x <= 3.975e+011.12410.0255316
3.975e+01 < x0.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
x <= 3.45e+012.23110.52546506
3.45e+01 < x <= 3.70e+011.24150.10111252
3.70e+01 < x <= 3.79e+012.59270.19972473
3.79e+01 < x <= 3.90e+011.60350.12401535
3.90e+01 < x0.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
x <= -1.2269e+021.40630.0259321
-1.2269e+02 < x <= -1.2247e+022.88780.0259321
-1.2247e+02 < x <= -1.2241e+023.23970.0245303
-1.2241e+02 < x <= -1.2229e+022.15820.0262324
-1.2229e+02 < x <= -1.2215e+022.30710.0476589
-1.2215e+02 < x <= -1.2206e+022.56650.0263326
-1.2206e+02 < x <= -1.2199e+022.62650.0253313
-1.2199e+02 < x <= -1.2191e+022.69240.0237294
-1.2191e+02 < x <= -1.2181e+022.29190.0255316
-1.2181e+02 < x <= -1.2157e+021.71030.0242300
-1.2157e+02 < x <= -1.2139e+021.17360.0252312
-1.2139e+02 < x <= -1.2127e+021.32700.0263326
-1.2127e+02 < x <= -1.2101e+021.48570.0238295
-1.2101e+02 < x <= -1.2064e+021.47160.0245304
-1.2064e+02 < x <= -1.2007e+021.33760.0254314
-1.2007e+02 < x <= -1.1972e+021.26240.0258319
-1.1972e+02 < x <= -1.1929e+021.33320.0239296
-1.1929e+02 < x <= -1.1897e+021.33000.0250310
-1.1897e+02 < x <= -1.1852e+022.72110.0258319
-1.1852e+02 < x <= -1.1843e+023.16530.0284352
-1.1843e+02 < x <= -1.1838e+023.44320.0238295
-1.1838e+02 < x <= -1.1834e+022.74800.0249308
-1.1834e+02 < x <= -1.1830e+022.34350.0271336
-1.1830e+02 < x <= -1.1822e+021.74760.0480594
-1.1822e+02 < x <= -1.1818e+021.80550.0227281
-1.1818e+02 < x <= -1.1813e+022.14800.0287356
-1.1813e+02 < x <= -1.1808e+022.24940.0243301
-1.1808e+02 < x <= -1.1801e+022.40790.0245303
-1.1801e+02 < x <= -1.1790e+022.23040.0468580
-1.1790e+02 < x <= -1.1780e+022.48200.0266329
-1.1780e+02 < x <= -1.1766e+022.28640.0248307
-1.1766e+02 < x <= -1.1739e+021.67910.0237294
-1.1739e+02 < x <= -1.1725e+021.63800.0290359
-1.1725e+02 < x <= -1.1716e+022.05120.0229284
-1.1716e+02 < x <= -1.1708e+021.51130.0249308
-1.1708e+02 < x <= -1.1696e+021.66690.0235291
-1.1696e+02 < x1.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
x <= -1.218e+022.44380.25093107
-1.218e+02 < x <= -1.190e+021.37870.22422776
-1.190e+02 < x <= -1.183e+023.01750.10291274
-1.183e+02 < x <= -1.177e+022.16010.27353387
-1.177e+02 < x1.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.1410.06940.66520.65950.0057
1optbinning2.6550.00960.51450.50770.0068
2KBinsDiscretizer0.0080.00180.61810.6192-0.0011
\n", "
" ], "text/plain": [ " library fit_s transform_s train_r2 test_r2 r2_drop\n", "0 AutoCarver 5.141 0.0694 0.6652 0.6595 0.0057\n", "1 optbinning 2.655 0.0096 0.5145 0.5077 0.0068\n", "2 KBinsDiscretizer 0.008 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": "iVBORw0KGgoAAAANSUhEUgAABJ0AAAFcCAYAAABiPM/xAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUbtJREFUeJzt3Qd0VNXWwPEdEpPQEpoQwEhoSicSBCkCPtFQRPApIpYgIjbQ8FBQEBOaoghIfaAogggfiAoqYhQp+hQUqYIUQcGgSFPpTcL91j5v3XkzySRkwp2Uyf+31jXMnXP7nTnePefsE2RZliUAAAAAAACAg4o4uTIAAAAAAACAoBMAAAAAAAD8gpZOAAAAAAAAcBxBJwAAAAAAADiOoBMAAAAAAAAcR9AJAAAAAAAAjiPoBAAAAAAAAMcRdAIAAAAAAIDjCDoBAAAAAADAcQSdAADIJ9q0aWMm2549eyQoKEhmzpzpUS4lJUViY2MlPDzcvH/kyJFc3U/dH92u7l9hMnToUHPcKNhWrlxprqP+BQAA/kXQCQCAHPrpp5/k4YcflmrVqpkAUEREhLRo0UImTJggp0+f9st5/eOPP+TOO++UokWLypQpU2T27NlSvHhxKcjsINbatWu9vq+BuHr16uX6fgEAAODShFzi8gAAFEoff/yxdO3aVcLCwiQhIcEERc6dOydfffWVDBgwQH744Qd57bXXLmkbVapUMcGryy67zDXvu+++k+PHj8uIESOkbdu2khfuu+8+ueuuu8yxFyZDhgyRZ555Jq93A5eoVatW5nMVGhrKuQQAwM8IOgEA4KPdu3eboIsGhZYvXy4VK1Z0vdenTx/ZtWuXCUpdKm39oy2o3B08eND8LVWqlGPX7eTJkz61lgoODjZTYRMSEmKmQGZZlpw5c8a0pMsNvt57TihSpEiGzxUAAPAPutcBAOCj0aNHy4kTJ+SNN97wCDjZatSoIYmJia7Xb775pvzjH/+Q8uXLm9ZBderUkalTp150O+lzOmk3sx49eph/X3vttea9+++/31V+wYIFEhcXZwIG5cqVk3vvvVd+++03j3Vq+RIlSpiugR06dJCSJUvKPffcY97T9fXt21cWLVpkWm7pvtatW9fkkLpYTqcPPvhAOnbsKJUqVTLLVa9e3bTGSktLE384f/68Wb9uR7cXExMjgwcPlrNnz3qU0/3UXEzpaXn3c/f333/LsGHDpGbNmiYgUbZsWWnZsqUsXbo0y5xO2T1nSnMINW7c2Kxf9/vVV1/N8zxReh5uueUW+fTTT82+6b2j+6U0V1i/fv0kOjraHJfe1y+99JJcuHAhQ5dPbf2m3Us1GKr36KZNmzLkI8vq3tN1jh8/3pw7PT8VKlQwXVf/+usvj21pF8z4+Hhzf+u+Vq1aVR544AGPMvPmzTOfA12/7lP9+vVNl9eL5XTy5fOj87t06WL+ffnll8tTTz3lt3sdAICCLLB/rgMAwA8++ugjk8epefPm2SqvASZ9mL711ltNSxld/rHHHjMP2toyKrueffZZufrqq023veHDh5sHbg1eKH2479mzpwlGjRo1Sg4cOGAetL/++mvZsGGDR8soDdjog7sGVcaMGSPFihVzvafdA99//32zf/rQPnHiRLn99tslNTXVBGIyo9vXB/D+/fubv9oCLCkpSY4dOyYvv/xyto7v6NGjcvjw4QzzNSCU3oMPPiizZs2SO+64Q5588kn59ttvzXFv27ZNFi5cKL7S4I8ur+tt0qSJ2W8NcKxfv15uuummLJfNzjnTa9CuXTsTpNTglgYo9BpqwCKv7dixQ7p3726CPL179zb32KlTp6R169YmuKLzr7zySlm1apUMGjRIfv/9dxMgUnoPd+rUSdasWSOPPvqo1KpVywQg7eBoepnde7oN+x5+4oknTGvCyZMnm/Om97B2MdVWfjfffLM5Z9rNUe9pDXzqubdpkFCP5cYbbzQBMqX3hK7DPRCcni+fH712egxNmzY1x/D555/L2LFjzWdRzwEAAHBjAQCAbDt69Kil1Wfnzp2zvcypU6cyzIuPj7eqVavmMa9169Zmsu3evdts680333TN03/rvO+++84179y5c1b58uWtevXqWadPn3bNX7x4sSmblJTkmtejRw8z75lnnsmwTzo/NDTU2rVrl2vepk2bzPxJkyZl2Afdv6yO8eGHH7aKFStmnTlzJsvzY68vq6lu3bqu8hs3bjTzHnzwQY/1PPXUU2b+8uXLPY4pOTk5wzarVKlizoWtYcOGVseOHbPcT11P+v91yu4569SpkzkXv/32m2vezp07rZCQkAzrzE16HnT7KSkpHvNHjBhhFS9e3Prxxx895ut9ExwcbKWmpprX7733nll+/PjxrjJpaWnWP/7xjwz3bmb3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Xjz22GNmmFNtiqrNV3XY05SUFM4VAAQIzdOk3SA0wKT/g+4+aXdqe8AKzQPVv39/ef311023CO1qN2XKFFc+J6fodrKSlpZm8khpfo53331XKlWq5Oj2AQDOf39rfqTbbrvN5GLSesQXv/zyi/mr9VR6V199dbb2xV6Ht/I6Erj+2KI/tLtLvz3tLq45qhgpDzlFTifAi/Lly5tfBfSX7U8++cRM2kc6ISHBJIoFABRs2spJE6bq93twcHCG90uUKOH699ixY82vxB988IHJr6H5BO1cF5nl1fCVtl7KSu/evU0eqTlz5vj0SzkAwL8y+/7WQSluvvlm00pJWwnp4ET+drG6JCfcB2oCcoKgEwLapXxJ6vCinTp1MpM+nGjrp1dffdUkna1Ro4aj+wkAyN26QH+51ZZO+quwtmy9GB3BVKchQ4bIqlWrTALWadOmuYa+9uf/lOvoe/rDh45IpINcAADyN034rQEnHYRi2bJlUrFiRZ/XUaVKFVfL3PR27Njh0zq8lddWWNqCV0e0c6fbc28xtWvXLvMslD7hOJBddK9DQNMvUR1dKCcVhTttUqp9n5VWHgCAgsP+H2r3+kBHtdMWTppnI/1oQ/rargeOHTsm58+f93hfg09aL7jXBzmtby7m5ZdfNkNgDx48mNFTAaAA0O5qHTp0MCOdagsnb93jskMDVbGxsaaXhXuXbs05q12tfV2Hex21ZcsW03JX9zM97ULuTke6U5p2BMgJWjohoMXFxZlhQseNG2fyX2jUvmnTphddToe+/vPPP00XBu06of2h9QtXv7S1/zMAoGDVBerZZ581eZEuu+wy04pVWykNGjTI5Kno0qWL6fqwe/duWbhwoRlu+qmnnpLly5dL3759TQJvbRGlAajZs2ebgJUmbL3U+iYruh8DBw40Dyxa97z99tse72sS2AoVKlzSNgAAzrrnnntkzZo1Jies5gjUyb3rttY32aVduTt27CgtW7Y069PnE30mqVu3rpw4cSLbP15owKhZs2bSq1cvOX36tFmHdvsbOnRohvJaD956663Srl07Wb16tal77r77bmnYsGG29xvwkKMx74A8tmLFigxDWNvDfLrbvn271apVK6to0aLmvewOZ/3uu+9aN998sxleNDQ01Lryyiuthx9+2Pr9998dPxYAgP/pcNWVK1c2Q0RrfaDDS6v33nvPatmypVW8eHEz1apVy+rTp4+1Y8cO8/7PP/9sPfDAA1b16tWt8PBwq0yZMtYNN9xgff75547UN/Yw1y+//HKG9+x6LbNJ60IAQN6wv6MPHTrkMb9KlSqZfm/re77Seqp27dpWWFiYVadOHev99983dYz7urKqS5TWWS1atDB1VEREhNWpUydr69atXo9H599xxx1WyZIlrdKlS1t9+/a1Tp8+7fN+A7Yg/Y9nGAoAAAAAABQW2upJu5wfOnTI5HoCnEJOJwAAAAAAADiOnE4oVNLS0kz0Piva19p9qGwAAKhvAABO0cTgmlspK1FRUZxwBASCTihU9u7d6zEEqDfJyclek+oBAEB9AwC4VImJiWZEuayQBQeBgpxOKFTOnDkjX331VZZlqlWrZiYAAKhvAABO27p1q+zbty/LMm3btuXEIyAQdAIAAAAAAIDjSCQOAAAAAACAgp/T6cKFC6YpYcmSJSUoKCi3Nw8AeU776B8/flwqVaokRYoQ+3cSdQyAwo46xn+oYwAUdlYOnmNyPeikAafo6Ojc3iwA5MvE9ldccUVe70ZAoY4BgP+ijqGOAYD8UMfketBJWzjZOxkREZHbmweAPHfs2DETfLe/D+Ec6hgAhR11jP9QxwAo7I7l4Dkm14NOdpc6DTgRdAJQmNHF2H/nlDoGQGFHHeO/c0odA6CwC/IhVRLJRAAAAAAAAOA4gk4AAAAAAABwHEEnAAAAAAAAOI6gEwAAAAAAABxH0AkAAAAAAACOI+gEAAAAAAAAxxF0AgAAAAAAgOMIOgEAAAAAAMBxIc6vEgAAAACAwqHTkx9IIPpobOe83gUEgIAOOvHhBwBQz/iG/8EEAACAU+heBwAAAAAAgLwNOg0dOlSCgoI8plq1ajm/VwAAAAAAAChc3evq1q0rn3/++f9WEBLQPfQAAAAAAACQAz5HjDTIFBUVlZNtAQAAAAAAoJDwOafTzp07pVKlSlKtWjW55557JDU1NcvyZ8+elWPHjnlMAAAAAAAACGw+BZ2aNm0qM2fOlJSUFJk6dars3r1brr/+ejl+/Himy4waNUoiIyNdU3R0tBP7DQAAAAAAgEAJOrVv3166du0qDRo0kPj4eFmyZIkcOXJE3nnnnUyXGTRokBw9etQ17d2714n9BgAAAAAAQD52SVnAS5UqJVdddZXs2rUr0zJhYWFmAgAAAAAAQOHhc04ndydOnJCffvpJKlas6NweAQAAAAAAoHAFnZ566in54osvZM+ePbJq1Sq57bbbJDg4WLp37+6/PQQAAAAAAEBgd6/79ddfTYDpjz/+kMsvv1xatmwp33zzjfk3AAAAAAAAkKOg07x583wpDgAAAAAAgELqknI6AQAAAAAAAI6PXgcAAAA4rdOTHwTcSf1obOe83gUAAHIdLZ0AAAAAAADgOIJOAAC/mTJlisTExEh4eLg0bdpU1qxZk2X5I0eOSJ8+faRixYoSFhYmV111lSxZsoQrBAAAABRABJ0AAH4xf/586d+/vyQnJ8v69eulYcOGEh8fLwcPHvRa/ty5c3LTTTfJnj175N1335UdO3bI9OnTpXLlylwhACjEP0gsWLBAatWqZcrXr18/w48RlmVJUlKS+cGiaNGi0rZtW9m5c2eG9Xz88cdme1qmdOnS0qVLF8ePDQDgiaATAMAvxo0bJ71795aePXtKnTp1ZNq0aVKsWDGZMWOG1/I6/88//5RFixZJixYtzANJ69atTbAKAFA4f5BYtWqVdO/eXXr16iUbNmwwgSKdtmzZ4iozevRomThxoqlnvv32WylevLhZ55kzZ1xl3nvvPbnvvvtMnbRp0yb5+uuv5e67786VYwaAwoygEwDAcdpqad26debXZleFU6SIeb169Wqvy3z44YfSrFkz072uQoUKUq9ePXnhhRckLS2NKwQAhfQHiQkTJki7du1kwIABUrt2bRkxYoQ0atRIJk+e7GrlNH78eBkyZIh07txZGjRoIG+99Zbs27fP/Iihzp8/L4mJifLyyy/LI488Yrpu67bvvPPOXD12ACiMCDoBABx3+PBhEyzS4JE7fb1//36vy/z888+mW50up10nnnvuORk7dqyMHDky0+2cPXtWjh075jEBAALnBwmd715eaSsmu/zu3btNveJeJjIy0nSjs8toi6rffvvNbOuaa64x3fDat2/v0VrKG+oYALh0BJ0AAPnChQsXpHz58vLaa69JXFycdOvWTZ599lnzK3hmRo0aZR4u7Ck6OjpX9xkA4N8fJHR+VuXtv1mV0R811NChQ02LqMWLF5ucTm3atDHdujNDHQMAl46gEwDAceXKlZPg4GA5cOCAx3x9HRUV5XUZ/eVZuzzocjbtSqEPDfrruDeDBg2So0ePuqa9e/c6fCQAgED4UUPp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kX1asWKFa3tBQUFWRESEFRsbaw0YMMDat29fvjufup8LFy70mHf8+HHr8OHDebZPyDvUMYULdUzWqGMuHXUM3FHHFC7UMVmjjgn8OqbAtnR644035PHHH5cvv/xS9u3blyvbPHfunMTHx8uLL74oDz30kKxatUrWrFkjffr0kUmTJskPP/yQ43X//fff4q99LuyioqLMkJVOioyMlFKlSkl+9frrr8s999wjU6dOlSeffNLMa9eunfz+++9mWrZsmYSEhMgtt9ziWiY4ONicK53vpB07dpjP6HfffSdPP/20fP7551KvXj3ZvHlzrpzPS/lslShRQsqWLSv+wucz/6KOyR7uYeoY6hjqGFDH8BzjPzzH8BwTEM8xVgGkUbsSJUpY27dvt7p162Y9//zzWUaSNepnH6q+797iQyedp3755Rfr1ltvtYoXL26VLFnS6tq1q7V//37XerSFk7auWr9+fYZ90lZOJ06cMP/+5JNPrBYtWpj90BYlHTt2tHbt2uUqu3v3brPdefPmWa1atTKtUSZMmGCFh4dbS5Ys8Vjv+++/b4715MmT5nVqaqrZL1136dKlzf7q+tJHikeOHGlVrFjRiomJsfIDbWn0+OOPW5dffrk5Xj0/a9as8WgRs3jxYqt+/frm/aZNm1qbN2/2eN990tZqdkun4cOHW3fddZdVrFgxq1KlStbkyZMzjfza5/69996z2rRpY1qraas1/cUp/T2UkpJi1apVy9wP2irIvXVO+oh869atzfFpKx69LhUqVHDto23btm3muPX4ateubS1dutRrVDon3PdH71O9l/TeyWx/1X/+8x+z/YMHD3qcmw0bNnic988//9yKi4sz56pZs2bmc2fbuHGjOY96j+pnplGjRtZ3333nsXz6FkynTp2yrr76anMuMts/baVVr149cxz6Gbrxxhtdny/1xhtvWHXq1LFCQ0OtqKgoq0+fPq73dJv//ve/rU6dOpl7wr4OixYtsq655hpz/qtWrWoNHTrU1apL7yP3+0tfe2sVmf4+dC+r9J5t166duWfKly9v3XvvvdahQ4c87hPd18TERNNKUs8d8h/qGOoY6hhP1DHUMaCOsfEcw3MMzzE8x5T18TmmQAad9IGzcePG5t8fffSRVb16devChQvZCjrpA++TTz5p1a1b13Ql0knnpaWlma4/LVu2tNauXWt988035kFbHxJtGpy4+eabL7p/7777rglq7Ny50zzA68OvBlN0G+5f1hoQ0nI///yzCWjccccd5iHV3e233+6ap4Et/ZA/8MAD1vfff29t3brVuvvuu80DvHb7s//HUAMA9913n7VlyxYz5QdPPPGECQhpUO2HH34w+6nBmT/++MMVnNBj++yzz8yx3XLLLeb86DHrsY0fP950z7KvmT4UKn3g12DHqFGjrB07dlgTJ060goODzXqyCjppMEmDXLqMnnddjx2A0Hvosssus9q2bWsCKOvWrTP7puc6q6CT7p8GMn788Udr1qxZpkuZvR/adU2v00033WQCNRrwadKkieNBp4EDB5rrr4Eib+/b9Pw9/PDDVo0aNTLcl+mDThoAXLlypblu119/velOatPPkd6fGlDT437nnXfM8bkv763bnHaJ1PcOHDiQYf/0sxASEmKNGzfO7JPeD1OmTHFdcw0oaTBK7wm9fhq8dO9iqevVgI92ef3pp59MMPnLL78012fmzJlmnl4Xvb/0eikNvNkBaL2/7EBc+qCTff/ppIFkPX/6WVN6nBpUHTRokDkfGpzW633DDTd43Cd6fTQ4qcE79wAe8g/qGOoY6hhP1DHUMaCO4TmG5xieY/6L55gBPj/HFMigkz706gOn0kBBuXLlzANudoJOmeV00odQDVZoSyKbPmTrcnaLHG3pocETX2lLB12P3XLHfri3j8F9P91bNR09etQ8XGvLKTV79mwTuLADbEoDMrpfn376qet/DLWVjR2Eyg+0hYoGcebMmeOap8EkDUKNHj3aFZzQll82DUbpcc2fP/+ifaG1ZYk7bf3Wvn37LINOr7/+eobrrIECe1v62r11mgY99LxmFXTSgKW7a6+91nr66afNv/UaaiBFgxU2p1s6aasfXd+yZcu8vq/3t7bA0UnLaUs4DajZsmrpZPv444/NvNOnT5vXGvDTQI43WQWd9Hzoe99++22G86n7pO/t2bPH63r1vnn22WczPRe6bL9+/TzmaUupF154wWOefp70HLgvl/5aZJb/TT+Dt912mwlMa9BajRgxIkNQeu/evWa9Ghyz7xNtbYX8jTqGOsZGHfNf1DH/Qx0D6hieY3iO4TmG55gAz+mk+WE0j1L37t3Na80/061bN5N/41Js27ZNoqOjzWSrU6eOyTOj76n//r/Gxe3cudPsX7Vq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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 }