{
"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": 13,
"id": "imports",
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"import warnings\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.datasets import fetch_california_housing, fetch_openml\n",
"from sklearn.linear_model import LogisticRegression, Ridge\n",
"from sklearn.metrics import r2_score, roc_auc_score\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import KBinsDiscretizer\n",
"\n",
"from AutoCarver import BinaryCarver, ContinuousCarver, Features\n",
"from AutoCarver.discretizers.utils.base_discretizer import DiscretizerConfig\n",
"\n",
"try:\n",
" from optbinning import ContinuousOptimalBinning, OptimalBinning\n",
"\n",
" HAS_OPTBINNING = True\n",
"except ImportError:\n",
" HAS_OPTBINNING = False\n",
" print('optbinning is not installed \\u2014 its rows will be skipped.')\n",
"\n",
"SEED = 42\n",
"warnings.filterwarnings('ignore')\n",
"plt.rcParams['figure.figsize'] = (10, 3.5)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"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": 15,
"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, quantitatives=quantitatives)\n",
" config = DiscretizerConfig(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": 16,
"id": "381a7051",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"train=600, dev=200, test=200\n",
"categoricals=13, quantitatives=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)}, quantitatives={len(quantitatives)}')\n",
"print(f'bad rate (train)={y_train.mean():.3f}, (test)={y_test.mean():.3f}')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" no checking \n",
" 0.1317 \n",
" 0.4050 \n",
" 243 \n",
" \n",
" \n",
" >=200 \n",
" 0.2778 \n",
" 0.0600 \n",
" 36 \n",
" \n",
" \n",
" 0<=X<200 \n",
" 0.3896 \n",
" 0.2567 \n",
" 154 \n",
" \n",
" \n",
" <0 \n",
" 0.4671 \n",
" 0.2783 \n",
" 167 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.0694 \n",
" 0.3600 \n",
" 72 \n",
" \n",
" \n",
" 0.0833 \n",
" 0.0600 \n",
" 12 \n",
" \n",
" \n",
" 0.3710 \n",
" 0.3100 \n",
" 62 \n",
" \n",
" \n",
" 0.5741 \n",
" 0.2700 \n",
" 54 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" no checking \n",
" 0.1317 \n",
" 0.4050 \n",
" 243 \n",
" \n",
" \n",
" >=200 \n",
" 0.2778 \n",
" 0.0600 \n",
" 36 \n",
" \n",
" \n",
" 0<=X<200 \n",
" 0.3896 \n",
" 0.2567 \n",
" 154 \n",
" \n",
" \n",
" <0 \n",
" 0.4671 \n",
" 0.2783 \n",
" 167 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.0694 \n",
" 0.3600 \n",
" 72 \n",
" \n",
" \n",
" 0.0833 \n",
" 0.0600 \n",
" 12 \n",
" \n",
" \n",
" 0.3710 \n",
" 0.3100 \n",
" 62 \n",
" \n",
" \n",
" 0.5741 \n",
" 0.2700 \n",
" 54 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" critical/other existing credit \n",
" 0.1676 \n",
" 0.2883 \n",
" 173 \n",
" \n",
" \n",
" existing paid \n",
" 0.3185 \n",
" 0.5233 \n",
" 314 \n",
" \n",
" \n",
" delayed previously \n",
" 0.3621 \n",
" 0.0967 \n",
" 58 \n",
" \n",
" \n",
" all paid \n",
" 0.5455 \n",
" 0.0550 \n",
" 33 \n",
" \n",
" \n",
" no credits/all paid \n",
" 0.5455 \n",
" 0.0367 \n",
" 22 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2241 \n",
" 0.2900 \n",
" 58 \n",
" \n",
" \n",
" 0.2703 \n",
" 0.5550 \n",
" 111 \n",
" \n",
" \n",
" 0.3571 \n",
" 0.0700 \n",
" 14 \n",
" \n",
" \n",
" 0.7273 \n",
" 0.0550 \n",
" 11 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" critical/other existing credit \n",
" 0.1676 \n",
" 0.2883 \n",
" 173 \n",
" \n",
" \n",
" existing paid \n",
" 0.3185 \n",
" 0.5233 \n",
" 314 \n",
" \n",
" \n",
" delayed previously \n",
" 0.3621 \n",
" 0.0967 \n",
" 58 \n",
" \n",
" \n",
" all paid, no credits/all paid \n",
" 0.5455 \n",
" 0.0917 \n",
" 55 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2241 \n",
" 0.2900 \n",
" 58 \n",
" \n",
" \n",
" 0.2703 \n",
" 0.5550 \n",
" 111 \n",
" \n",
" \n",
" 0.3571 \n",
" 0.0700 \n",
" 14 \n",
" \n",
" \n",
" 0.7059 \n",
" 0.0850 \n",
" 17 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" used car \n",
" 0.1875 \n",
" 0.1067 \n",
" 64 \n",
" \n",
" \n",
" other, retraining \n",
" 0.2222 \n",
" 0.0150 \n",
" 9 \n",
" \n",
" \n",
" radio/tv \n",
" 0.2303 \n",
" 0.2750 \n",
" 165 \n",
" \n",
" \n",
" domestic appliance \n",
" 0.3000 \n",
" 0.0167 \n",
" 10 \n",
" \n",
" \n",
" furniture/equipment \n",
" 0.3333 \n",
" 0.1700 \n",
" 102 \n",
" \n",
" \n",
" new car \n",
" 0.3401 \n",
" 0.2450 \n",
" 147 \n",
" \n",
" \n",
" business \n",
" 0.3729 \n",
" 0.0983 \n",
" 59 \n",
" \n",
" \n",
" repairs \n",
" 0.3750 \n",
" 0.0267 \n",
" 16 \n",
" \n",
" \n",
" education \n",
" 0.4643 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1250 \n",
" 0.0800 \n",
" 16 \n",
" \n",
" \n",
" 0.3000 \n",
" 0.0500 \n",
" 10 \n",
" \n",
" \n",
" 0.2295 \n",
" 0.3050 \n",
" 61 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0050 \n",
" 1 \n",
" \n",
" \n",
" 0.3235 \n",
" 0.1700 \n",
" 34 \n",
" \n",
" \n",
" 0.4222 \n",
" 0.2250 \n",
" 45 \n",
" \n",
" \n",
" 0.2778 \n",
" 0.0900 \n",
" 18 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.4615 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" used car \n",
" 0.1875 \n",
" 0.1067 \n",
" 64 \n",
" \n",
" \n",
" radio/tv, other, retraining \n",
" 0.2299 \n",
" 0.2900 \n",
" 174 \n",
" \n",
" \n",
" furniture/equipment, domestic appliance \n",
" 0.3304 \n",
" 0.1867 \n",
" 112 \n",
" \n",
" \n",
" new car, business, repairs \n",
" 0.3514 \n",
" 0.3700 \n",
" 222 \n",
" \n",
" \n",
" education \n",
" 0.4643 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1250 \n",
" 0.0800 \n",
" 16 \n",
" \n",
" \n",
" 0.2394 \n",
" 0.3550 \n",
" 71 \n",
" \n",
" \n",
" 0.3143 \n",
" 0.1750 \n",
" 35 \n",
" \n",
" \n",
" 0.3692 \n",
" 0.3250 \n",
" 65 \n",
" \n",
" \n",
" 0.4615 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" >=1000 \n",
" 0.0667 \n",
" 0.0500 \n",
" 30 \n",
" \n",
" \n",
" 500<=X<1000 \n",
" 0.1622 \n",
" 0.0617 \n",
" 37 \n",
" \n",
" \n",
" no known savings \n",
" 0.1714 \n",
" 0.1750 \n",
" 105 \n",
" \n",
" \n",
" 100<=X<500 \n",
" 0.3333 \n",
" 0.1150 \n",
" 69 \n",
" \n",
" \n",
" <100 \n",
" 0.3649 \n",
" 0.5983 \n",
" 359 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.1250 \n",
" 0.0800 \n",
" 16 \n",
" \n",
" \n",
" 0.1667 \n",
" 0.1800 \n",
" 36 \n",
" \n",
" \n",
" 0.3889 \n",
" 0.0900 \n",
" 18 \n",
" \n",
" \n",
" 0.3468 \n",
" 0.6200 \n",
" 124 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" no known savings, >=1000, 500<=X<1000 \n",
" 0.1512 \n",
" 0.2867 \n",
" 172 \n",
" \n",
" \n",
" <100, 100<=X<500 \n",
" 0.3598 \n",
" 0.7133 \n",
" 428 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1724 \n",
" 0.2900 \n",
" 58 \n",
" \n",
" \n",
" 0.3521 \n",
" 0.7100 \n",
" 142 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 4<=X<7 \n",
" 0.1935 \n",
" 0.1550 \n",
" 93 \n",
" \n",
" \n",
" >=7 \n",
" 0.2516 \n",
" 0.2650 \n",
" 159 \n",
" \n",
" \n",
" 1<=X<4 \n",
" 0.2911 \n",
" 0.3550 \n",
" 213 \n",
" \n",
" \n",
" <1 \n",
" 0.4272 \n",
" 0.1717 \n",
" 103 \n",
" \n",
" \n",
" unemployed \n",
" 0.5000 \n",
" 0.0533 \n",
" 32 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2632 \n",
" 0.1900 \n",
" 38 \n",
" \n",
" \n",
" 0.2600 \n",
" 0.2500 \n",
" 50 \n",
" \n",
" \n",
" 0.3621 \n",
" 0.2900 \n",
" 58 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.1800 \n",
" 36 \n",
" \n",
" \n",
" 0.2222 \n",
" 0.0900 \n",
" 18 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" >=7, 4<=X<7 \n",
" 0.2302 \n",
" 0.4200 \n",
" 252 \n",
" \n",
" \n",
" unemployed, 1<=X<4, <1 \n",
" 0.3506 \n",
" 0.5800 \n",
" 348 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2614 \n",
" 0.4400 \n",
" 88 \n",
" \n",
" \n",
" 0.3304 \n",
" 0.5600 \n",
" 112 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" male single \n",
" 0.2679 \n",
" 0.5600 \n",
" 336 \n",
" \n",
" \n",
" male mar/wid \n",
" 0.2778 \n",
" 0.0900 \n",
" 54 \n",
" \n",
" \n",
" female div/dep/mar \n",
" 0.3559 \n",
" 0.2950 \n",
" 177 \n",
" \n",
" \n",
" male div/sep \n",
" 0.3636 \n",
" 0.0550 \n",
" 33 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2830 \n",
" 0.5300 \n",
" 106 \n",
" \n",
" \n",
" 0.2381 \n",
" 0.1050 \n",
" 21 \n",
" \n",
" \n",
" 0.3385 \n",
" 0.3250 \n",
" 65 \n",
" \n",
" \n",
" 0.3750 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" male single, male mar/wid \n",
" 0.2692 \n",
" 0.6500 \n",
" 390 \n",
" \n",
" \n",
" female div/dep/mar \n",
" 0.3559 \n",
" 0.2950 \n",
" 177 \n",
" \n",
" \n",
" male div/sep \n",
" 0.3636 \n",
" 0.0550 \n",
" 33 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2756 \n",
" 0.6350 \n",
" 127 \n",
" \n",
" \n",
" 0.3385 \n",
" 0.3250 \n",
" 65 \n",
" \n",
" \n",
" 0.3750 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" guarantor \n",
" 0.1786 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
" none \n",
" 0.2996 \n",
" 0.9067 \n",
" 544 \n",
" \n",
" \n",
" co applicant \n",
" 0.4286 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.2989 \n",
" 0.9200 \n",
" 184 \n",
" \n",
" \n",
" 0.3750 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" guarantor \n",
" 0.1786 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
" none \n",
" 0.2996 \n",
" 0.9067 \n",
" 544 \n",
" \n",
" \n",
" co applicant \n",
" 0.4286 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.2989 \n",
" 0.9200 \n",
" 184 \n",
" \n",
" \n",
" 0.3750 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" real estate \n",
" 0.2130 \n",
" 0.2817 \n",
" 169 \n",
" \n",
" \n",
" life insurance \n",
" 0.3125 \n",
" 0.2133 \n",
" 128 \n",
" \n",
" \n",
" car \n",
" 0.3143 \n",
" 0.3500 \n",
" 210 \n",
" \n",
" \n",
" no known property \n",
" 0.4086 \n",
" 0.1550 \n",
" 93 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2182 \n",
" 0.2750 \n",
" 55 \n",
" \n",
" \n",
" 0.2600 \n",
" 0.2500 \n",
" 50 \n",
" \n",
" \n",
" 0.3281 \n",
" 0.3200 \n",
" 64 \n",
" \n",
" \n",
" 0.4516 \n",
" 0.1550 \n",
" 31 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" real estate \n",
" 0.2130 \n",
" 0.2817 \n",
" 169 \n",
" \n",
" \n",
" life insurance \n",
" 0.3125 \n",
" 0.2133 \n",
" 128 \n",
" \n",
" \n",
" car \n",
" 0.3143 \n",
" 0.3500 \n",
" 210 \n",
" \n",
" \n",
" no known property \n",
" 0.4086 \n",
" 0.1550 \n",
" 93 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2182 \n",
" 0.2750 \n",
" 55 \n",
" \n",
" \n",
" 0.2600 \n",
" 0.2500 \n",
" 50 \n",
" \n",
" \n",
" 0.3281 \n",
" 0.3200 \n",
" 64 \n",
" \n",
" \n",
" 0.4516 \n",
" 0.1550 \n",
" 31 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" none \n",
" 0.2619 \n",
" 0.8083 \n",
" 485 \n",
" \n",
" \n",
" stores \n",
" 0.4375 \n",
" 0.0533 \n",
" 32 \n",
" \n",
" \n",
" bank \n",
" 0.4699 \n",
" 0.1383 \n",
" 83 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2866 \n",
" 0.8200 \n",
" 164 \n",
" \n",
" \n",
" 0.4444 \n",
" 0.0450 \n",
" 9 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.1350 \n",
" 27 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" none \n",
" 0.2619 \n",
" 0.8083 \n",
" 485 \n",
" \n",
" \n",
" bank, stores \n",
" 0.4609 \n",
" 0.1917 \n",
" 115 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2866 \n",
" 0.8200 \n",
" 164 \n",
" \n",
" \n",
" 0.3611 \n",
" 0.1800 \n",
" 36 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" own \n",
" 0.2558 \n",
" 0.7233 \n",
" 434 \n",
" \n",
" \n",
" for free \n",
" 0.3750 \n",
" 0.1067 \n",
" 64 \n",
" \n",
" \n",
" rent \n",
" 0.4412 \n",
" 0.1700 \n",
" 102 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2857 \n",
" 0.7350 \n",
" 147 \n",
" \n",
" \n",
" 0.4348 \n",
" 0.1150 \n",
" 23 \n",
" \n",
" \n",
" 0.2667 \n",
" 0.1500 \n",
" 30 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" own \n",
" 0.2558 \n",
" 0.7233 \n",
" 434 \n",
" \n",
" \n",
" for free, rent \n",
" 0.4157 \n",
" 0.2767 \n",
" 166 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2857 \n",
" 0.7350 \n",
" 147 \n",
" \n",
" \n",
" 0.3396 \n",
" 0.2650 \n",
" 53 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" skilled \n",
" 0.2898 \n",
" 0.6383 \n",
" 383 \n",
" \n",
" \n",
" unskilled resident \n",
" 0.2966 \n",
" 0.1967 \n",
" 118 \n",
" \n",
" \n",
" high qualif/self emp/mgmt \n",
" 0.3258 \n",
" 0.1483 \n",
" 89 \n",
" \n",
" \n",
" unemp/unskilled non res \n",
" 0.5000 \n",
" 0.0167 \n",
" 10 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2541 \n",
" 0.6100 \n",
" 122 \n",
" \n",
" \n",
" 0.3171 \n",
" 0.2050 \n",
" 41 \n",
" \n",
" \n",
" 0.4839 \n",
" 0.1550 \n",
" 31 \n",
" \n",
" \n",
" 0.1667 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" skilled \n",
" 0.2898 \n",
" 0.6383 \n",
" 383 \n",
" \n",
" \n",
" unskilled resident \n",
" 0.2966 \n",
" 0.1967 \n",
" 118 \n",
" \n",
" \n",
" high qualif/self emp/mgmt, unemp/unskilled non res \n",
" 0.3434 \n",
" 0.1650 \n",
" 99 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2541 \n",
" 0.6100 \n",
" 122 \n",
" \n",
" \n",
" 0.3171 \n",
" 0.2050 \n",
" 41 \n",
" \n",
" \n",
" 0.4324 \n",
" 0.1850 \n",
" 37 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" yes \n",
" 0.2645 \n",
" 0.4033 \n",
" 242 \n",
" \n",
" \n",
" none \n",
" 0.3240 \n",
" 0.5967 \n",
" 358 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3125 \n",
" 0.4000 \n",
" 80 \n",
" \n",
" \n",
" 0.2917 \n",
" 0.6000 \n",
" 120 \n",
" \n",
" \n",
"
\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",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" no \n",
" 0.0435 \n",
" 0.0383 \n",
" 23 \n",
" \n",
" \n",
" yes \n",
" 0.3102 \n",
" 0.9617 \n",
" 577 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.2990 \n",
" 0.9700 \n",
" 194 \n",
" \n",
" \n",
"
\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 Quantitative('duration') (14/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 8.00e+00 \n",
" 0.0980 \n",
" 0.0850 \n",
" 51 \n",
" \n",
" \n",
" 8.00e+00 < x <= 9.00e+00 \n",
" 0.2333 \n",
" 0.0500 \n",
" 30 \n",
" \n",
" \n",
" 9.00e+00 < x <= 1.10e+01 \n",
" 0.0870 \n",
" 0.0383 \n",
" 23 \n",
" \n",
" \n",
" 1.10e+01 < x <= 1.20e+01 \n",
" 0.2883 \n",
" 0.1850 \n",
" 111 \n",
" \n",
" \n",
" 1.20e+01 < x <= 1.50e+01 \n",
" 0.2273 \n",
" 0.0733 \n",
" 44 \n",
" \n",
" \n",
" 1.50e+01 < x <= 1.80e+01 \n",
" 0.3692 \n",
" 0.1083 \n",
" 65 \n",
" \n",
" \n",
" 1.80e+01 < x <= 2.20e+01 \n",
" 0.2381 \n",
" 0.0350 \n",
" 21 \n",
" \n",
" \n",
" 2.20e+01 < x <= 2.40e+01 \n",
" 0.3333 \n",
" 0.1950 \n",
" 117 \n",
" \n",
" \n",
" 2.40e+01 < x <= 2.80e+01 \n",
" 0.2222 \n",
" 0.0150 \n",
" 9 \n",
" \n",
" \n",
" 2.80e+01 < x <= 3.30e+01 \n",
" 0.3846 \n",
" 0.0433 \n",
" 26 \n",
" \n",
" \n",
" 3.30e+01 < x <= 3.60e+01 \n",
" 0.4727 \n",
" 0.0917 \n",
" 55 \n",
" \n",
" \n",
" 3.60e+01 < x <= 4.70e+01 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 4.70e+01 < x \n",
" 0.4242 \n",
" 0.0550 \n",
" 33 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1000 \n",
" 0.1000 \n",
" 20 \n",
" \n",
" \n",
" 0.3077 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.2432 \n",
" 0.1850 \n",
" 37 \n",
" \n",
" \n",
" 0.0714 \n",
" 0.0700 \n",
" 14 \n",
" \n",
" \n",
" 0.3043 \n",
" 0.1150 \n",
" 23 \n",
" \n",
" \n",
" 0.4444 \n",
" 0.0450 \n",
" 9 \n",
" \n",
" \n",
" 0.3548 \n",
" 0.1550 \n",
" 31 \n",
" \n",
" \n",
" 0.7500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.4286 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.3529 \n",
" 0.0850 \n",
" 17 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.5714 \n",
" 0.0700 \n",
" 14 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 8.00e+00 \n",
" 0.0980 \n",
" 0.0850 \n",
" 51 \n",
" \n",
" \n",
" 8.00e+00 < x <= 1.10e+01 \n",
" 0.1698 \n",
" 0.0883 \n",
" 53 \n",
" \n",
" \n",
" 1.10e+01 < x <= 1.50e+01 \n",
" 0.2710 \n",
" 0.2583 \n",
" 155 \n",
" \n",
" \n",
" 1.50e+01 < x <= 2.80e+01 \n",
" 0.3302 \n",
" 0.3533 \n",
" 212 \n",
" \n",
" \n",
" 2.80e+01 < x \n",
" 0.4186 \n",
" 0.2150 \n",
" 129 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1000 \n",
" 0.1000 \n",
" 20 \n",
" \n",
" \n",
" 0.1905 \n",
" 0.1050 \n",
" 21 \n",
" \n",
" \n",
" 0.1961 \n",
" 0.2550 \n",
" 51 \n",
" \n",
" \n",
" 0.3731 \n",
" 0.3350 \n",
" 67 \n",
" \n",
" \n",
" 0.4634 \n",
" 0.2050 \n",
" 41 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [BinaryCarver] Fit Quantitative('credit_amount') (15/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 6.18e+02 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 6.18e+02 < x <= 7.08e+02 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 7.08e+02 < x <= 7.97e+02 \n",
" 0.3333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 7.97e+02 < x <= 9.09e+02 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 9.09e+02 < x <= 1.03e+03 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.03e+03 < x <= 1.16e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.16e+03 < x <= 1.21e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.21e+03 < x <= 1.26e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.26e+03 < x <= 1.31e+03 \n",
" 0.3333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.31e+03 < x <= 1.37e+03 \n",
" 0.4667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.37e+03 < x <= 1.41e+03 \n",
" 0.1250 \n",
" 0.0267 \n",
" 16 \n",
" \n",
" \n",
" 1.41e+03 < x <= 1.47e+03 \n",
" 0.1429 \n",
" 0.0233 \n",
" 14 \n",
" \n",
" \n",
" 1.47e+03 < x <= 1.53e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.53e+03 < x <= 1.60e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.60e+03 < x <= 1.82e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 1.82e+03 < x <= 1.92e+03 \n",
" 0.5000 \n",
" 0.0267 \n",
" 16 \n",
" \n",
" \n",
" 1.92e+03 < x <= 1.98e+03 \n",
" 0.2857 \n",
" 0.0233 \n",
" 14 \n",
" \n",
" \n",
" 1.98e+03 < x <= 2.12e+03 \n",
" 0.3333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.12e+03 < x <= 2.21e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.21e+03 < x <= 2.30e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.30e+03 < x <= 2.38e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.38e+03 < x <= 2.48e+03 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.48e+03 < x <= 2.62e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.62e+03 < x <= 2.75e+03 \n",
" 0.3333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.75e+03 < x <= 2.92e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.92e+03 < x <= 3.07e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.07e+03 < x <= 3.35e+03 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.35e+03 < x <= 3.51e+03 \n",
" 0.1333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.51e+03 < x <= 3.63e+03 \n",
" 0.1333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.63e+03 < x <= 3.91e+03 \n",
" 0.0667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.91e+03 < x <= 4.24e+03 \n",
" 0.4667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 4.24e+03 < x <= 4.66e+03 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 4.66e+03 < x <= 5.08e+03 \n",
" 0.4667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 5.08e+03 < x <= 5.80e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 5.80e+03 < x <= 6.36e+03 \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 6.36e+03 < x <= 6.85e+03 \n",
" 0.4667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 6.85e+03 < x <= 7.48e+03 \n",
" 0.2000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 7.48e+03 < x <= 8.23e+03 \n",
" 0.4667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 8.23e+03 < x <= 9.57e+03 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 9.57e+03 < x \n",
" 0.5333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.1429 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0600 \n",
" 12 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.2857 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.2857 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0050 \n",
" 1 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.2000 \n",
" 0.0500 \n",
" 10 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.1000 \n",
" 0.0500 \n",
" 10 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.8000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.4000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.2857 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.6667 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.6154 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.03e+03 \n",
" 0.3467 \n",
" 0.1250 \n",
" 75 \n",
" \n",
" \n",
" 1.03e+03 < x <= 3.35e+03 \n",
" 0.2758 \n",
" 0.5500 \n",
" 330 \n",
" \n",
" \n",
" 3.35e+03 < x <= 3.91e+03 \n",
" 0.1111 \n",
" 0.0750 \n",
" 45 \n",
" \n",
" \n",
" 3.91e+03 < x <= 7.48e+03 \n",
" 0.3524 \n",
" 0.1750 \n",
" 105 \n",
" \n",
" \n",
" 7.48e+03 < x \n",
" 0.4667 \n",
" 0.0750 \n",
" 45 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3478 \n",
" 0.1150 \n",
" 23 \n",
" \n",
" \n",
" 0.2233 \n",
" 0.5150 \n",
" 103 \n",
" \n",
" \n",
" 0.2083 \n",
" 0.1200 \n",
" 24 \n",
" \n",
" \n",
" 0.3871 \n",
" 0.1550 \n",
" 31 \n",
" \n",
" \n",
" 0.6316 \n",
" 0.0950 \n",
" 19 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [BinaryCarver] Fit Quantitative('installment_commitment') (16/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.00e+00 \n",
" 0.2436 \n",
" 0.1300 \n",
" 78 \n",
" \n",
" \n",
" 1.00e+00 < x <= 2.00e+00 \n",
" 0.2606 \n",
" 0.2367 \n",
" 142 \n",
" \n",
" \n",
" 2.00e+00 < x <= 3.00e+00 \n",
" 0.2979 \n",
" 0.1567 \n",
" 94 \n",
" \n",
" \n",
" 3.00e+00 < x \n",
" 0.3357 \n",
" 0.4767 \n",
" 286 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.1071 \n",
" 0.1400 \n",
" 28 \n",
" \n",
" \n",
" 0.2667 \n",
" 0.2250 \n",
" 45 \n",
" \n",
" \n",
" 0.2414 \n",
" 0.1450 \n",
" 29 \n",
" \n",
" \n",
" 0.3878 \n",
" 0.4900 \n",
" 98 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.00e+00 \n",
" 0.2545 \n",
" 0.3667 \n",
" 220 \n",
" \n",
" \n",
" 2.00e+00 < x <= 3.00e+00 \n",
" 0.2979 \n",
" 0.1567 \n",
" 94 \n",
" \n",
" \n",
" 3.00e+00 < x \n",
" 0.3357 \n",
" 0.4767 \n",
" 286 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2055 \n",
" 0.3650 \n",
" 73 \n",
" \n",
" \n",
" 0.2414 \n",
" 0.1450 \n",
" 29 \n",
" \n",
" \n",
" 0.3878 \n",
" 0.4900 \n",
" 98 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [BinaryCarver] Fit Quantitative('residence_since') (17/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.00e+00 \n",
" 0.3117 \n",
" 0.1283 \n",
" 77 \n",
" \n",
" \n",
" 1.00e+00 < x <= 2.00e+00 \n",
" 0.2905 \n",
" 0.2983 \n",
" 179 \n",
" \n",
" \n",
" 2.00e+00 < x <= 3.00e+00 \n",
" 0.3000 \n",
" 0.1667 \n",
" 100 \n",
" \n",
" \n",
" 3.00e+00 < x \n",
" 0.3033 \n",
" 0.4067 \n",
" 244 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.2174 \n",
" 0.1150 \n",
" 23 \n",
" \n",
" \n",
" 0.3529 \n",
" 0.3400 \n",
" 68 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.1500 \n",
" 30 \n",
" \n",
" \n",
" 0.2658 \n",
" 0.3950 \n",
" 79 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING: No robust combination for Quantitative('residence_since'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n",
"--- [BinaryCarver] Fit Quantitative('age') (18/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.10e+01 \n",
" 0.4000 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 2.10e+01 < x <= 2.20e+01 \n",
" 0.3684 \n",
" 0.0317 \n",
" 19 \n",
" \n",
" \n",
" 2.20e+01 < x <= 2.30e+01 \n",
" 0.4500 \n",
" 0.0333 \n",
" 20 \n",
" \n",
" \n",
" 2.30e+01 < x <= 2.40e+01 \n",
" 0.3333 \n",
" 0.0350 \n",
" 21 \n",
" \n",
" \n",
" 2.40e+01 < x <= 2.50e+01 \n",
" 0.5161 \n",
" 0.0517 \n",
" 31 \n",
" \n",
" \n",
" 2.50e+01 < x <= 2.60e+01 \n",
" 0.2500 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
" 2.60e+01 < x <= 2.70e+01 \n",
" 0.2258 \n",
" 0.0517 \n",
" 31 \n",
" \n",
" \n",
" 2.70e+01 < x <= 2.80e+01 \n",
" 0.4091 \n",
" 0.0367 \n",
" 22 \n",
" \n",
" \n",
" 2.80e+01 < x <= 2.90e+01 \n",
" 0.3913 \n",
" 0.0383 \n",
" 23 \n",
" \n",
" \n",
" 2.90e+01 < x <= 3.00e+01 \n",
" 0.2143 \n",
" 0.0467 \n",
" 28 \n",
" \n",
" \n",
" 3.00e+01 < x <= 3.10e+01 \n",
" 0.2308 \n",
" 0.0433 \n",
" 26 \n",
" \n",
" \n",
" 3.10e+01 < x <= 3.20e+01 \n",
" 0.2500 \n",
" 0.0333 \n",
" 20 \n",
" \n",
" \n",
" 3.20e+01 < x <= 3.30e+01 \n",
" 0.3636 \n",
" 0.0367 \n",
" 22 \n",
" \n",
" \n",
" 3.30e+01 < x <= 3.40e+01 \n",
" 0.3636 \n",
" 0.0367 \n",
" 22 \n",
" \n",
" \n",
" 3.40e+01 < x <= 3.50e+01 \n",
" 0.1724 \n",
" 0.0483 \n",
" 29 \n",
" \n",
" \n",
" 3.50e+01 < x <= 3.60e+01 \n",
" 0.2083 \n",
" 0.0400 \n",
" 24 \n",
" \n",
" \n",
" 3.60e+01 < x <= 3.70e+01 \n",
" 0.3333 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
" 3.70e+01 < x <= 3.80e+01 \n",
" 0.1875 \n",
" 0.0267 \n",
" 16 \n",
" \n",
" \n",
" 3.80e+01 < x <= 3.90e+01 \n",
" 0.2941 \n",
" 0.0283 \n",
" 17 \n",
" \n",
" \n",
" 3.90e+01 < x <= 4.10e+01 \n",
" 0.3182 \n",
" 0.0367 \n",
" 22 \n",
" \n",
" \n",
" 4.10e+01 < x <= 4.20e+01 \n",
" 0.2727 \n",
" 0.0183 \n",
" 11 \n",
" \n",
" \n",
" 4.20e+01 < x <= 4.40e+01 \n",
" 0.1905 \n",
" 0.0350 \n",
" 21 \n",
" \n",
" \n",
" 4.40e+01 < x <= 4.60e+01 \n",
" 0.2632 \n",
" 0.0317 \n",
" 19 \n",
" \n",
" \n",
" 4.60e+01 < x <= 4.70e+01 \n",
" 0.4000 \n",
" 0.0167 \n",
" 10 \n",
" \n",
" \n",
" 4.70e+01 < x <= 4.90e+01 \n",
" 0.1429 \n",
" 0.0233 \n",
" 14 \n",
" \n",
" \n",
" 4.90e+01 < x <= 5.10e+01 \n",
" 0.1429 \n",
" 0.0233 \n",
" 14 \n",
" \n",
" \n",
" 5.10e+01 < x <= 5.40e+01 \n",
" 0.2941 \n",
" 0.0283 \n",
" 17 \n",
" \n",
" \n",
" 5.40e+01 < x <= 5.70e+01 \n",
" 0.3333 \n",
" 0.0200 \n",
" 12 \n",
" \n",
" \n",
" 5.70e+01 < x <= 6.30e+01 \n",
" 0.4375 \n",
" 0.0267 \n",
" 16 \n",
" \n",
" \n",
" 6.30e+01 < x \n",
" 0.2667 \n",
" 0.0250 \n",
" 15 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0750 \n",
" 15 \n",
" \n",
" \n",
" 0.6364 \n",
" 0.0550 \n",
" 11 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0600 \n",
" 12 \n",
" \n",
" \n",
" 0.1538 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
" 0.1429 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.4000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0500 \n",
" 10 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.2000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.3750 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0150 \n",
" 3 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.1429 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0050 \n",
" 1 \n",
" \n",
" \n",
" 0.2308 \n",
" 0.0650 \n",
" 13 \n",
" \n",
" \n",
" 0.6000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.3333 \n",
" 0.0300 \n",
" 6 \n",
" \n",
" \n",
" 0.1250 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.2000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.5000 \n",
" 0.0100 \n",
" 2 \n",
" \n",
" \n",
" 0.6000 \n",
" 0.0250 \n",
" 5 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0200 \n",
" 4 \n",
" \n",
" \n",
" 0.2500 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
" 0.0000 \n",
" 0.0400 \n",
" 8 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [BinaryCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.50e+01 \n",
" 0.4245 \n",
" 0.1767 \n",
" 106 \n",
" \n",
" \n",
" 2.50e+01 < x <= 3.20e+01 \n",
" 0.2753 \n",
" 0.2967 \n",
" 178 \n",
" \n",
" \n",
" 3.20e+01 < x <= 3.40e+01 \n",
" 0.3636 \n",
" 0.0733 \n",
" 44 \n",
" \n",
" \n",
" 3.40e+01 < x <= 3.60e+01 \n",
" 0.1887 \n",
" 0.0883 \n",
" 53 \n",
" \n",
" \n",
" 3.60e+01 < x \n",
" 0.2740 \n",
" 0.3650 \n",
" 219 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.4359 \n",
" 0.1950 \n",
" 39 \n",
" \n",
" \n",
" 0.2931 \n",
" 0.2900 \n",
" 58 \n",
" \n",
" \n",
" 0.3636 \n",
" 0.0550 \n",
" 11 \n",
" \n",
" \n",
" 0.1818 \n",
" 0.0550 \n",
" 11 \n",
" \n",
" \n",
" 0.2469 \n",
" 0.4050 \n",
" 81 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [BinaryCarver] Fit Quantitative('existing_credits') (19/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.00e+00 \n",
" 0.3061 \n",
" 0.6317 \n",
" 379 \n",
" \n",
" \n",
" 1.00e+00 < x <= 2.00e+00 \n",
" 0.2899 \n",
" 0.3450 \n",
" 207 \n",
" \n",
" \n",
" 2.00e+00 < x \n",
" 0.2857 \n",
" 0.0233 \n",
" 14 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3000 \n",
" 0.6500 \n",
" 130 \n",
" \n",
" \n",
" 0.3016 \n",
" 0.3150 \n",
" 63 \n",
" \n",
" \n",
" 0.2857 \n",
" 0.0350 \n",
" 7 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING: No robust combination for Quantitative('existing_credits'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n",
"--- [BinaryCarver] Fit Quantitative('num_dependents') (20/20)\n",
" [BinaryCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.0e+00 \n",
" 0.2984 \n",
" 0.8433 \n",
" 506 \n",
" \n",
" \n",
" 1.0e+00 < x \n",
" 0.3085 \n",
" 0.1567 \n",
" 94 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 0.3000 \n",
" 0.8500 \n",
" 170 \n",
" \n",
" \n",
" 0.3000 \n",
" 0.1500 \n",
" 30 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING: No robust combination for Quantitative('num_dependents'). Consider increasing the size of X_dev or dropping the feature (X not representative of X_dev for this feature).\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" library \n",
" fit_s \n",
" transform_s \n",
" train_auc \n",
" test_auc \n",
" auc_drop \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" AutoCarver \n",
" 1.948 \n",
" 0.0115 \n",
" 0.8474 \n",
" 0.8118 \n",
" 0.0356 \n",
" \n",
" \n",
" 1 \n",
" optbinning \n",
" 1.025 \n",
" 0.0141 \n",
" 0.8523 \n",
" 0.7931 \n",
" 0.0592 \n",
" \n",
" \n",
" 2 \n",
" KBinsDiscretizer \n",
" 0.002 \n",
" 0.0009 \n",
" 0.8401 \n",
" 0.7943 \n",
" 0.0458 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" library fit_s transform_s train_auc test_auc auc_drop\n",
"0 AutoCarver 1.948 0.0115 0.8474 0.8118 0.0356\n",
"1 optbinning 1.025 0.0141 0.8523 0.7931 0.0592\n",
"2 KBinsDiscretizer 0.002 0.0009 0.8401 0.7943 0.0458"
]
},
"execution_count": 17,
"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": 18,
"id": "1ea9c0a3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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V9L1xx57LKs3CQAA5GEElAAAAAAAAOBLfn+TAwAAAAAAIK8joAQAAAAAAABfCCgBAAAAAADAFwJKAAAAAAAA8IWAEgAAAAAAAHwhoAQAAAAAAABfCCgBAAAAAADAFwJKAAAAAAAA8IWAEgAAAAAAAHwhoAQAAAAAAABfCCgBAAAAAADAFwJKAAAAAAAA8IWAEgAAAAAAAHwhoAQAAAAAAABfCCgBAAAAAADAFwJKAAAAAAAA8IWAEgAAAAAAAHwhoAQAAAAAAABfCCgBAAAAAADAFwJKAAAAAAAA8IWAEgAAAAAAAHwhoAQAAAAAAABfCCghz/r888+tefPmVrx4ccuXL5917tzZ/R8AAAAAstr06dPd88mOHTuyelOAiAgoIU/6/fffrWvXrvbzzz/b+PHj7aWXXrKqVasmm+7xxx+3efPmZck2AgBO3/Lly23EiBF26NChDDuMlBEAACAvI6CEPOm7776znTt32gMPPGB//etf7dZbb7WxY8fab7/9FjYdDwsAkHMDSiNHjiSgBAAAkEEIKCFP2r9/v/t/yZIlg+MKFixoRYoUycKtAgAAAID08zwv2UtxILMQUEKec/vtt1vLli3d32r2pnbJrVq1ck0jQnMo6e+EhAR78cUX3d8aNG96zZo1yxo3bmznnHOOxcTEWL169WzixIkZsk8AgP/R/XzQoEHu72rVqgXv4YEcFC+//LK7PxctWtRKlSplN910k+3evTvsEH777bd2ww03WIUKFdzLhj/96U9uusOHD0eljHjqqadcHr/SpUu77dD2vP7662HTaHu1XOXQSErjtZ+hfvjhB+vdu7dVqlTJChcu7Pb97rvvthMnTnB5AICZa6Hw97//3WrWrOnuvboH63kgaY6ipM8FaeU0eu+999zzReDf/ZdcconNnDnT1zH/6quv7Morr3TbpTLn0UcftVOnTiWbLjY21q699lpbtGiRNWnSxE3/n//8x323bds2tz8q24oVK2aXXnqpvfvuu2HzL1u2zO3D7NmzbejQoa6cU07Z6667LllZCKSlYJpTALnM3/72N6tcubJrznbvvfe6G3758uXt008/DZtOeZXuvPNOa9q0qWsWJxdccEG61rF48WLr3r27XXXVVTZmzBg3btOmTW4d/fv3z4C9AgAE/OUvf7FvvvnGXn31VZcnr0yZMm582bJl7bHHHrOHH37YbrzxRnePP3DggP373/+2K664wtatW+dqrioA065dO0tMTLR+/fq5f2wrWPPOO++4JnQlSpQ4ozJC9IJB/3i/5ZZb3Pr0EkIPAVpHhw4dfJ/MH3/80W2Ltk/bU6tWLbfNClIdO3bMChUqxAUCIM9TpzxqEq0XBAraKDD0zDPPuJfLX3/9tQvC+KUg0x133GEXXXSRDRkyxJUjKk8WLlxoN998c7qWsXfvXmvdurX98ccf9o9//MMFeKZOneqCRZFs2bLFPWvouaZPnz4uQLZv3z73okL3fD3jKFimlx4qa1QWXH/99WHLUHmowNLgwYNd640JEyZYmzZtbP369SmuF0jGA/KgpUuXerr858yZExwXHx/vxoUqXry417NnT9/L79+/vxcTE+P98ccfUdleAIA///znP909ffv27cFxO3bs8AoUKOA99thjYdN++eWXXsGCBYPj161bl6yMiOR0ywg5duxY2OcTJ054devW9a688srgOG27tuOFF15INr/Gq9wK6NGjh5c/f37v888/TzbtqVOnTmsbASC3SXrvlRUrVrh76owZM1J9LhDdj0PLlkOHDnnnnHOOFxcX5/3222+nfe8dMGCAW+7KlSuD4/bv3++VKFEiWVlWtWpVN27hwoURl/Hxxx8Hx/36669etWrVvNjYWO/kyZNhz0GVK1f2jhw5Epz2tddec+MnTpyY7u0GaPIGZAC9mVBTCNVUAgBkD3PnznXNB1Q76eDBg8FBNZCqV69uS5cuddOpBpKoOYHe9GaE0Le/v/zyi2tKd/nll9vatWt9L0v7pB5JO3bs6Jo/JBWp2QYA5EWh9171+vzTTz/ZhRde6P7tfjr3X/1b/9dff3W1ipLmYvVz712wYIFrnqaapgGqVatarJGoSbNq0iZdhuZv0aJFcNzZZ5/taq2qJpZqYIXq0aOHa6IX0KVLF6tYsaJbDpBeBJSADKC22TVq1LCrr77aVadVNVhVewUAZB3lRVLlHgWP9A/10EHNkgMdNugf6gMHDrTnnnvONZfTP9onT54czJ8UDWrapocHPYAo14W2Qc0uTmcdarZ35MgRq1u3btS2DwByIyWvHj58uFWpUsXlmtM9XvdfNRc+nfuveo6WM73/KreTyqak1JQtEpVTkZYRafratWsHvw+VdH0KgCm4ljQ/FJAacigBGaBcuXKu/bHebitJ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AICoOXHihK1Zs8batGnzv4eO/Pnd5xUrVkScR+NDpxfVaEo6/bJly6xcuXJWs2ZNu/vuu+2nn35KdVsSExPtyJEjYQMAIDoIKAEAAACImoMHD9rJkyetfPnyYeP1ee/evRHn0fi0plcNphkzZtiSJUtszJgx9t///teuvvpqt66UjB492kqUKBEcqlSpcsb7BwD4/wr+3/8BAAAAINu66aabgn8raXf9+vXtggsucLWWrrrqqojzDBkyxOVyClANJYJKABAd1FACAAAAEDVlypSxAgUK2L59+8LG67PyHkWi8X6ml/PPP9+ta+vWrSlOo5xLMTExYQMAIDoIKAEAAACImkKFClnjxo1d07SAU6dOuc/NmjWLOI/Gh04vixcvTnF6+f77710OpYoVK3L2ACALEFACAAAAEFVqZvbss8/aiy++aJs2bXIJtBMSElyvb9KjRw/XHC2gf//+tnDhQhs7dqxt3rzZRowYYatXr7a+ffu6748ePep6gPvss89sx44dLvjUqVMnu/DCC13ybgBA5iOHEgAAAICo6tatmx04cMCGDx/uEms3bNjQBYwCibd37drlen4LaN68uc2cOdOGDRtmQ4cOterVq9u8efOsbt267ns1oduwYYMLUB06dMgqVapkbdu2tVGjRrlmbQCAzEdACQAAAEDUqXZRoIZRUkqknVTXrl3dEEnRokVt0aJFUd9GAMDpo8kbAAAAAAAAfCGgBAAAAAAAAF8IKAEAAAAAAMAXAkoAAAAAAADwhYASAAAAAAAAfCGgBAAAAAAAgIwNKH300UfWsWNHq1SpkuXLl8/mzZuX6vTqElTTJR327t3rd9UAAAAAAADIiQGlhIQEa9CggU2ePNnXfFu2bLE9e/YEh3LlyvldNQAAAAAAALKBgn5nuPrqq93glwJIJUuW9D0fAAAAAAAA8mgOpYYNG1rFihXtz3/+s3366aeZtVoAAAAAAABkdQ0lvxREmjJlijVp0sQSExPtueees1atWtnKlSutUaNGEefRdBoCjhw5ktGbCQAAAAAAcqCO98+33OrtsZ0szwaUatas6YaA5s2b23fffWfjx4+3l156KeI8o0ePtpEjR2b0pgEAAAAAACA7N3kL1bRpU9u6dWuK3w8ZMsQOHz4cHHbv3p2p2wcAAAAAAIBsFlBav369awqXksKFC1tMTEzYAADIWdQb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QMYGlD766CPr2LGjVapUyfLly2fz5s1Lc55ly5ZZo0aNrHDhwnbhhRfa9OnT/a4WAAAAAAAAOTWglJCQYA0aNLDJkyena/rt27dbhw4drHXr1rZ+/XobMGCA3XnnnbZo0aLT2V4AAAAAOYCeF2JjY61IkSIWFxdnq1atSnX6OXPmWK1atdz09erVswULFoR9P2LECPd98eLF7dxzz7U2bdrYypUrM3gvAAApKWg+XX311W5IrylTpli1atVs7Nix7nPt2rXtk08+sfHjx1u7du38rh5IUcf75+fKo/P22E5ZvQkAAAC+zJ492wYOHOieBRRMmjBhgvu3/5YtW6xcuXLJpl++fLl1797dRo8ebddee63NnDnTOnfubGvXrrW6deu6aWrUqGGTJk2y888/33777Tf3PNG2bVvbunWrlS1bljMEALkth9KKFSvc24NQKkw0PiWJiYl25MiRsAEAAABAzjBu3Djr06eP9erVy+rUqeMCS8WKFbNp06ZFnH7ixInWvn17GzRokHsBPWrUKJcyQwGkgJtvvtk9VyigdNFFF7l16Dlhw4YNmbhnAIBMCyjt3bvXypcvHzZOn3Xz15uFSPRmokSJEsGhSpUqGb2ZAAAAAKLgxIkTtmbNmrCXyvnz53efU3qp7PcltNYxdepU96ygdBwAgMyXLXt5GzJkiB0+fDg47N69O6s3CQCQwbkzAmbNmuU6fVBTBwBAznPw4EE7efJkxJfKetns5yV00unfeecdO/vss13ZoiZvixcvtjJlyqS4LbR8AIAcHFCqUKGC7du3L2ycPsfExFjRokUjzqPe4PR96AAAyHm5M+Lj413+C7091pvm/fv3pzrfjh077IEHHrDLL78807YVAJBzBDr6Uc4lNZG78cYbUy1baPkAADk4oNSsWTNbsmRJ2Di9SdB4AEDu5Dd3huht9i233GIjR450+TEAADmTagwVKFAg4ktlvWz28xI66fTq4e3CCy+0Sy+91J5//nkrWLCg+39KaPkAANkooHT06FH3VkCDbN++3f29a9eu4E27R48ewenvuusu27Ztmz344IO2efNme/rpp+21116z++67L5r7AQDIwbkz5JFHHnE9//Tu3Ttd66EZAwBkT4UKFbLGjRuHvVQ+deqU+5zSS+XTfQmt5ao8SAktHwAg4xT0O8Pq1atdVdMANWmQnj172vTp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m9x+a/9q167tLV68OGLU+kyEbpeuXV1fup5S2m75+OOP3Xbs378/7BitW7cu7Ph/8MEHXuPGjd0xa9asmfstBqxfv94dT123+h01atTI+/zzz8PmT1rz6NixY17NmjXdMUlp+1S7qm7dum4/9Lu66qqrgr85ef755706dep4hQoV8ipUqODdc889we+0zqefftrr2LGjuzYC52PevHnexRdf7M5DtWrVvBEjRgRrY+l6Cr3O9DlSDcek12PotKJrt3379u7aKVeunHfrrbd6Bw4cCLtetK39+/d3NR517BAdlBWUFZQVaaOsoKzI6ygrKCsoK9JGWXFPrn+uyFMBJT04NmnSxP399ttvexdccIF36tSpdAWU9OB6//33exdddJFryqNB406ePOma3rRo0cJbvXq199lnn7kHZp2UAAUb2rZtm+b2vf766y5I8e2337oHcV1sCo5oHaEP6Qr2aLpt27a5AEWXLl3cRRHqhhtuCI5T0ErBhzvuuMPbsGGD9/XXX3s333yzexBXU7zAj10P8rfddpu3ceNGN2Q39957rwv2KHj21VdfuW1W4OWnn34KBhy0n++//77bz2uvvdYdK+2/9nPChAmuqVTg/OkfAqIfmwIYo0eP9rZs2eL961//8goUKOCWk1pASYEiBbA0j86BlhP48et6Ouuss7w2bdq4oMiaNWvctum4pxZQ0vbpJvLNN994L774omveFdgONSPTOfvzn//sgi8K4jRt2jTDAkoPPviguyYUBIr0fYCO49/+9jfvwgsvTHatJg0oKci3bNkyd/4uv/xy1+wzQL8tXbMKmmn/X3vtNbefofNHasqm5or6bt++fcm2T7+PggULeuPGjXPbpOti8uTJwXOvm7oCTbo2dB4VoAxt/qjl6qarpqnfffedCx5/9NFH7jxNnz7djdP50XWm8yYKqgUCzrrOAkG2pDf+wHWoQYFjHT/9/kT7qcDpkCFD3PFQMFrnvXXr1mHXi86PApAKzIUG53BmKCsoKygr0kZZQVmR11FWUFZQVqSNsmJ8rn+uyFMBJT286sFR9OBfpkwZ96CanoBSSjmUdNIVfFANoAA9LGu+QO0Z1cZQMMQvRQ21nEAtm8BDemAfQrcztDbS4cOH3UOyajzJSy+95AIRgeCZKMCi7Vq0aFHwx64aMYEAU3ajGiUK0LzyyivBcQoUKcD05JNPBgMOqr0VoECT9nH27NlptnVWxDaUarBdffXVqQaUnnvuuWTnXD/SwLr0ObSGmQIZOsapBZQUmAx1ySWXeIMHD3Z/63wqOKIbRUBG1VBSbR0td8mSJRG/1zWvCLcGTadabQqaBaRWQyng3XffdeN+++0391lBPd1MI0ktoKTjou9WrlyZ7Lhqm/Tdjh07Ii5X189DDz2U4rHQvAMGDAgbpxpOjz/+eNg4/cZ0DELnS3pOUsrBpt/l9ddf7wLRClLLqFGjkgWhd+/e7ZarwFfgetHbDEQfZQVlBWVF2igr/oeyIm+irKCsoKxIG2VF7i8r8kwOJeVeUd6i7t27u8/K7dKtWzfX9vlMbNq0yapUqeKGgDp16rgcLvpO/v91kLZvv/3Wbd/5559vMTExrpcA2bVrV9h0TZo0Cft8zTXX2FlnnWVvvfWW+/zGG2+4+du0aeM+f/HFF7Z161Y755xzXHtLDaVKlbLjx4/bd999F1xOvXr1rFChQpYdaTvVzvSyyy4LjtM+N23aNHicpVmzZsG/tY81a9YM+z4lofMFPqc1X/369YN/V6xY0f1///79wXHFihWzCy64IGya0O/TWmbSeXQN6zpTu+sA7X9G0Hbo+ouPj7ejR48m+75169auBzcN+l0pR9jVV19tO3fuTHO5KR2zgQMH2p133umuW+UbC702UxP4falXuaQaNGhgV111lbu2u3btas8++6z98ssvwfUqH5O+T03S35t+T4888kjwt6ShT58+Lp/UsWPHzK+hQ4faihUrbP78+Va0aNHgOpYuXRq2jlq1arnvQo9L48aNfa8PqaOsoKxIDWVFOMqK/6GsyFsoKygrUkNZEY6yIneXFdHNmJuNKXD0xx9/WKVKlcIeRJVoedKkSZY/f/5kgZ9oJbyuUaOGbd68Oc3pOnbsaFWrVnUPvdrOU6dOuYTDSZNiFS9ePOyzgkBdunSxmTNn2k033eT+r2BZICGyAgK6QF555ZVk6yxbtmyKy0XqFNAKCAQzdM4ifR+YJq3gYqR5QpeZWSpXrmyvv/66CxwpAfd7773nApKh18qFF14YlrhbybB17T766KOndczU/eXNN99s7777rlufglmzZs2y66+/PtVtDQT+AgHYUEoOvnjxYpcI//3333dJ8B966CFbuXKllSlTJl3HIunvQr+nkSNH2l/+8pdk0xYpUsT8ePnll238+PG2bNkyd8xD16H7wZgxY5LNEwjERdo2nDnKCsqKaKOsoKxIirIi56OsoKyINsoKyoqcWlbkiRpKCiTNmDHDxo4dG6xVoUHROgVuXn31VRdY+fXXXy0hISE4n6ZJGrg5efJk2LjatWvb7t273RDw9ddf26FDh1xNJdFDsnqjWrduXbJtU9BK6/zpp5/c245hw4a5GhNabqAmRXqoF66FCxe6HuM+/PBD9zmgUaNGrvZTuXLlXBAgdFAQICdQTR8d/08//TTs2Km3r8Bxls8++yz4t47fN998445lSucv0nyBz4H5sgvVttJ1tm/fvuA47X9GUXDzv//9r+3du9cFlfT7SImCQwrK/vbbb2ccfL3vvvtc8EcBmxdeeCHV6bW+qVOn2hVXXBEWHE26barZpiCQfoO6Dt58800XIFMQSr3U+aHfk36rSX9LGnQMAv8oSOlaC9DbA9XI+s9//mOXXnppsnXot6ztS7oOgkgZh7KCskIoK/yhrIiMsiL3oqygrBDKCn8oK3JvWZEnAkrvvPOOCy707t3b1fgJHW644Qb3liEuLs41UVI1MVX9Ui2f6dOnhy1HJ2H79u0u0HTw4EFLTEx0zXPUnEYBnLVr17rmPz169LCWLVsGq7QNGDDAPdAqUDR58mQXyNq2bZu99tpr7oQr2HPuuee6rv/0cKzmaQoKqQlQeumBWk2htB3VqlVz+xOgcaqN0alTJ/v444/dPihyee+999r3339vOYEu9rvvvtsGDRrkAmcK2qk6oKoC6rwGqMqgAgQbN26022+/3e13586dg+dPEVp9r/MXWo1Qgaonn3zSBaB0jubMmWP9+/e37OTPf/6zC6z17NnTNmzY4LZZAciUmntFg5rY6VpR8zA1azty5Igbr2tfgSYNqiHUr1+/YPT7dCgw1LdvX7cuNZvTvilYljSop+3QOvWbUe0l/a50Lp955pmIy1VNpMcff9xWr17tmo7OnTvXDhw4EFyuakUp0Pyvf/3LLVO/YdViSs3w4cNdgFoBKt2ctf/alsC5kECgStsaKTCs8ap5pRqFOq6BY6ltk3vuucd+/vln1wRWx0H3pEWLFlmvXr3SLFBw+igrKCsCv1/KCn8oK5KjrMi9KCsoK4Sywj/KilxaVnh5gHr7uuaaayJ+p0S+OgxffPGFS3aljOhK5Kx5pk6dGpaUW93Wq/e0kiVLBrOtizK0X3fddS5BsRILd+3a1du7d2/YejSvehFTr22B7svV1bmSEAd6BlOCZfUEpi4D1TOcesOKlAw6kOg4KfXKpe+HDx+e7Dslcu7Ro4dLRK7ln3/++V6fPn1cAu+UuoLPbpS8uV+/fsF90PELJD4PJG1W733qLUxJpdUDms5rqLvuust1hahpA101Kin3yJEj3XlTF47qOn7ixIlh86V1HpQsWuP8JHmPlJRbXTWG0veaLkBJv7Xf2j/1Mqf91TIXLlzoRUuka+H777/3qlev7l166aUu0Vtol5S65pU8XL0UppWUOzSptr7TOE2rZPA33XSTV6VKFbdvSpbdt2/fYMLuwPwa1POd1qlEdOqJIDRJedLtV4+G7dq1cz0b6JqpUaOG9+9//zts+ilTprik9Ur6rgR4usYCUkp4ruOtZJy6V6hnBl1rul8EvPXWW+5eoiTqkbr3DN2flLr3VE93Ota632g9Ot9K5BdIrh/pesGZoaygrAigrEgbZQVlRV5FWUFZEUBZkTbKin65/rki3//tHJCjqWaL8v0oaquE6HmFavK0aNHC1WoLTQAOAEiOsoKyAgDSQllBWYH0yzNJuYHcQLl/lJm/evXqLoikZnlq9kUwCQBAWQEA4LkCmYmAEpCDKDH24MGDXT4g5YdSDi/lAAIAgLICAMBzBTITTd4AAAAAAADgS57o5Q0AAAAAAADRQ0AJAAAAAAAAvhBQAgAAAAAAgC8ElAAAAAAAAOALASUAAAAAAAD4QkAJAAAAAAAAvhBQAgAAAAAAgC8ElAAAAAAAAOALASUAAAAAAACYH/8PhHURfnhHqV4AAAAASUVORK5CYII=",
"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": 19,
"id": "load-regression",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"train=12384, dev=4128, test=4128\n",
"quantitatives=8 (['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'])\n"
]
}
],
"source": [
"housing = fetch_california_housing(as_frame=True)\n",
"X_reg = housing.frame.drop(columns=['MedHouseVal'])\n",
"y_reg = housing.frame['MedHouseVal']\n",
"\n",
"X_train, X_rest, y_train, y_rest = train_test_split(X_reg, y_reg, test_size=0.4, random_state=SEED)\n",
"X_dev, X_test, y_dev, y_test = train_test_split(X_rest, y_rest, test_size=0.5, random_state=SEED)\n",
"\n",
"quantitatives = list(X_reg.columns)\n",
"categoricals = []\n",
"\n",
"print(f'train={len(X_train)}, dev={len(X_dev)}, test={len(X_test)}')\n",
"print(f'quantitatives={len(quantitatives)} ({quantitatives})')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"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 Quantitative('MedInc') (1/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.335e+00 \n",
" 1.1984 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.335e+00 < x <= 1.593e+00 \n",
" 1.0105 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.593e+00 < x <= 1.740e+00 \n",
" 1.1133 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.740e+00 < x <= 1.906e+00 \n",
" 1.1535 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 1.906e+00 < x <= 2.029e+00 \n",
" 1.2090 \n",
" 0.0248 \n",
" 307 \n",
" \n",
" \n",
" 2.029e+00 < x <= 2.152e+00 \n",
" 1.2141 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 2.152e+00 < x <= 2.243e+00 \n",
" 1.2417 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.243e+00 < x <= 2.350e+00 \n",
" 1.3827 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 2.350e+00 < x <= 2.468e+00 \n",
" 1.3614 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.468e+00 < x <= 2.569e+00 \n",
" 1.4190 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.569e+00 < x <= 2.655e+00 \n",
" 1.5264 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.655e+00 < x <= 2.737e+00 \n",
" 1.5428 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.737e+00 < x <= 2.862e+00 \n",
" 1.5708 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.862e+00 < x <= 2.974e+00 \n",
" 1.6630 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.974e+00 < x <= 3.054e+00 \n",
" 1.6270 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.054e+00 < x <= 3.135e+00 \n",
" 1.7079 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.135e+00 < x <= 3.216e+00 \n",
" 1.8554 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.216e+00 < x <= 3.315e+00 \n",
" 1.8373 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.315e+00 < x <= 3.423e+00 \n",
" 1.9121 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.423e+00 < x <= 3.531e+00 \n",
" 1.9162 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 3.531e+00 < x <= 3.633e+00 \n",
" 1.9678 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.633e+00 < x <= 3.723e+00 \n",
" 2.0226 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.723e+00 < x <= 3.839e+00 \n",
" 1.9891 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 3.839e+00 < x <= 3.971e+00 \n",
" 2.0493 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 3.971e+00 < x <= 4.073e+00 \n",
" 2.0538 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 4.073e+00 < x <= 4.179e+00 \n",
" 2.2004 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 4.179e+00 < x <= 4.315e+00 \n",
" 2.2417 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.315e+00 < x <= 4.464e+00 \n",
" 2.2394 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.464e+00 < x <= 4.611e+00 \n",
" 2.2577 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 4.611e+00 < x <= 4.757e+00 \n",
" 2.4351 \n",
" 0.0248 \n",
" 307 \n",
" \n",
" \n",
" 4.757e+00 < x <= 4.946e+00 \n",
" 2.3482 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.946e+00 < x <= 5.117e+00 \n",
" 2.4592 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.117e+00 < x <= 5.308e+00 \n",
" 2.5784 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.308e+00 < x <= 5.538e+00 \n",
" 2.6892 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.538e+00 < x <= 5.828e+00 \n",
" 2.7867 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 5.828e+00 < x <= 6.148e+00 \n",
" 3.0943 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 6.148e+00 < x <= 6.599e+00 \n",
" 3.3031 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.599e+00 < x <= 7.313e+00 \n",
" 3.6064 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 7.313e+00 < x <= 8.433e+00 \n",
" 4.0191 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 8.433e+00 < x \n",
" 4.7343 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.2507 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 1.0319 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 1.1587 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 1.0855 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 1.2523 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 1.2606 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 1.2643 \n",
" 0.0208 \n",
" 86 \n",
" \n",
" \n",
" 1.3335 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.4528 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 1.4887 \n",
" 0.0305 \n",
" 126 \n",
" \n",
" \n",
" 1.5142 \n",
" 0.0237 \n",
" 98 \n",
" \n",
" \n",
" 1.6485 \n",
" 0.0208 \n",
" 86 \n",
" \n",
" \n",
" 1.5544 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 1.6189 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 1.7433 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 1.6369 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 1.7802 \n",
" 0.0276 \n",
" 114 \n",
" \n",
" \n",
" 1.9721 \n",
" 0.0283 \n",
" 117 \n",
" \n",
" \n",
" 1.8287 \n",
" 0.0279 \n",
" 115 \n",
" \n",
" \n",
" 1.8295 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 1.9907 \n",
" 0.0300 \n",
" 124 \n",
" \n",
" \n",
" 1.9517 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 2.0220 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 2.1509 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 2.0977 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 2.2054 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 2.2979 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 2.3553 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 2.2924 \n",
" 0.0184 \n",
" 76 \n",
" \n",
" \n",
" 2.4401 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 2.2931 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.4940 \n",
" 0.0237 \n",
" 98 \n",
" \n",
" \n",
" 2.6133 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.7177 \n",
" 0.0189 \n",
" 78 \n",
" \n",
" \n",
" 2.9110 \n",
" 0.0276 \n",
" 114 \n",
" \n",
" \n",
" 3.0729 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 3.0759 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 3.5985 \n",
" 0.0228 \n",
" 94 \n",
" \n",
" \n",
" 4.0385 \n",
" 0.0206 \n",
" 85 \n",
" \n",
" \n",
" 4.6131 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.47e+00 \n",
" 1.2093 \n",
" 0.2250 \n",
" 2787 \n",
" \n",
" \n",
" 2.47e+00 < x <= 3.13e+00 \n",
" 1.5796 \n",
" 0.1750 \n",
" 2167 \n",
" \n",
" \n",
" 3.13e+00 < x <= 4.07e+00 \n",
" 1.9560 \n",
" 0.2251 \n",
" 2788 \n",
" \n",
" \n",
" 4.07e+00 < x <= 5.83e+00 \n",
" 2.4238 \n",
" 0.2499 \n",
" 3095 \n",
" \n",
" \n",
" 5.83e+00 < x \n",
" 3.7524 \n",
" 0.1249 \n",
" 1547 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.2323 \n",
" 0.2275 \n",
" 939 \n",
" \n",
" \n",
" 1.5934 \n",
" 0.1747 \n",
" 721 \n",
" \n",
" \n",
" 1.9604 \n",
" 0.2425 \n",
" 1001 \n",
" \n",
" \n",
" 2.4652 \n",
" 0.2372 \n",
" 979 \n",
" \n",
" \n",
" 3.6870 \n",
" 0.1182 \n",
" 488 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('HouseAge') (2/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 5.00e+00 \n",
" 2.2358 \n",
" 0.0271 \n",
" 336 \n",
" \n",
" \n",
" 5.00e+00 < x <= 8.00e+00 \n",
" 1.9727 \n",
" 0.0263 \n",
" 326 \n",
" \n",
" \n",
" 8.00e+00 < x <= 1.10e+01 \n",
" 1.8133 \n",
" 0.0352 \n",
" 436 \n",
" \n",
" \n",
" 1.10e+01 < x <= 1.40e+01 \n",
" 1.8538 \n",
" 0.0468 \n",
" 579 \n",
" \n",
" \n",
" 1.40e+01 < x <= 1.60e+01 \n",
" 1.9355 \n",
" 0.0652 \n",
" 807 \n",
" \n",
" \n",
" 1.60e+01 < x <= 1.70e+01 \n",
" 1.8929 \n",
" 0.0319 \n",
" 395 \n",
" \n",
" \n",
" 1.70e+01 < x <= 1.80e+01 \n",
" 1.9455 \n",
" 0.0276 \n",
" 342 \n",
" \n",
" \n",
" 1.80e+01 < x <= 2.00e+01 \n",
" 1.9470 \n",
" 0.0470 \n",
" 582 \n",
" \n",
" \n",
" 2.00e+01 < x <= 2.30e+01 \n",
" 1.9934 \n",
" 0.0632 \n",
" 783 \n",
" \n",
" \n",
" 2.30e+01 < x <= 2.50e+01 \n",
" 2.1713 \n",
" 0.0480 \n",
" 595 \n",
" \n",
" \n",
" 2.50e+01 < x <= 2.60e+01 \n",
" 2.0937 \n",
" 0.0304 \n",
" 377 \n",
" \n",
" \n",
" 2.60e+01 < x <= 2.70e+01 \n",
" 2.0568 \n",
" 0.0245 \n",
" 303 \n",
" \n",
" \n",
" 2.70e+01 < x <= 2.80e+01 \n",
" 1.9827 \n",
" 0.0241 \n",
" 299 \n",
" \n",
" \n",
" 2.80e+01 < x <= 2.90e+01 \n",
" 2.0203 \n",
" 0.0232 \n",
" 287 \n",
" \n",
" \n",
" 2.90e+01 < x <= 3.00e+01 \n",
" 2.0515 \n",
" 0.0236 \n",
" 292 \n",
" \n",
" \n",
" 3.00e+01 < x <= 3.20e+01 \n",
" 2.0453 \n",
" 0.0484 \n",
" 599 \n",
" \n",
" \n",
" 3.20e+01 < x <= 3.30e+01 \n",
" 2.0343 \n",
" 0.0316 \n",
" 391 \n",
" \n",
" \n",
" 3.30e+01 < x <= 3.40e+01 \n",
" 2.1357 \n",
" 0.0320 \n",
" 396 \n",
" \n",
" \n",
" 3.40e+01 < x <= 3.50e+01 \n",
" 2.0004 \n",
" 0.0399 \n",
" 494 \n",
" \n",
" \n",
" 3.50e+01 < x <= 3.60e+01 \n",
" 2.1148 \n",
" 0.0437 \n",
" 541 \n",
" \n",
" \n",
" 3.60e+01 < x <= 3.70e+01 \n",
" 2.0004 \n",
" 0.0257 \n",
" 318 \n",
" \n",
" \n",
" 3.70e+01 < x <= 3.90e+01 \n",
" 2.0133 \n",
" 0.0355 \n",
" 440 \n",
" \n",
" \n",
" 3.90e+01 < x <= 4.20e+01 \n",
" 2.0148 \n",
" 0.0440 \n",
" 545 \n",
" \n",
" \n",
" 4.20e+01 < x <= 4.40e+01 \n",
" 2.0742 \n",
" 0.0351 \n",
" 435 \n",
" \n",
" \n",
" 4.40e+01 < x <= 4.70e+01 \n",
" 2.0852 \n",
" 0.0343 \n",
" 425 \n",
" \n",
" \n",
" 4.70e+01 < x \n",
" 2.5848 \n",
" 0.0857 \n",
" 1061 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.0720 \n",
" 0.0245 \n",
" 101 \n",
" \n",
" \n",
" 1.9201 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 1.9054 \n",
" 0.0344 \n",
" 142 \n",
" \n",
" \n",
" 1.8581 \n",
" 0.0412 \n",
" 170 \n",
" \n",
" \n",
" 1.8826 \n",
" 0.0606 \n",
" 250 \n",
" \n",
" \n",
" 1.8592 \n",
" 0.0375 \n",
" 155 \n",
" \n",
" \n",
" 1.8799 \n",
" 0.0283 \n",
" 117 \n",
" \n",
" \n",
" 1.8746 \n",
" 0.0436 \n",
" 180 \n",
" \n",
" \n",
" 2.1128 \n",
" 0.0577 \n",
" 238 \n",
" \n",
" \n",
" 2.0847 \n",
" 0.0579 \n",
" 239 \n",
" \n",
" \n",
" 2.0778 \n",
" 0.0296 \n",
" 122 \n",
" \n",
" \n",
" 2.1784 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 2.2242 \n",
" 0.0208 \n",
" 86 \n",
" \n",
" \n",
" 1.7802 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 1.7629 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 2.0493 \n",
" 0.0504 \n",
" 208 \n",
" \n",
" \n",
" 1.9343 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.0837 \n",
" 0.0349 \n",
" 144 \n",
" \n",
" \n",
" 2.1957 \n",
" 0.0417 \n",
" 172 \n",
" \n",
" \n",
" 2.0157 \n",
" 0.0431 \n",
" 178 \n",
" \n",
" \n",
" 2.2006 \n",
" 0.0296 \n",
" 122 \n",
" \n",
" \n",
" 2.0026 \n",
" 0.0351 \n",
" 145 \n",
" \n",
" \n",
" 1.9358 \n",
" 0.0499 \n",
" 206 \n",
" \n",
" \n",
" 2.0117 \n",
" 0.0312 \n",
" 129 \n",
" \n",
" \n",
" 2.0839 \n",
" 0.0380 \n",
" 157 \n",
" \n",
" \n",
" 2.5968 \n",
" 0.0911 \n",
" 376 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.30e+01 \n",
" 1.9466 \n",
" 0.3703 \n",
" 4586 \n",
" \n",
" \n",
" 2.30e+01 < x <= 2.60e+01 \n",
" 2.1412 \n",
" 0.0785 \n",
" 972 \n",
" \n",
" \n",
" 2.60e+01 < x <= 3.60e+01 \n",
" 2.0526 \n",
" 0.2909 \n",
" 3602 \n",
" \n",
" \n",
" 3.60e+01 < x <= 4.70e+01 \n",
" 2.0381 \n",
" 0.1747 \n",
" 2163 \n",
" \n",
" \n",
" 4.70e+01 < x \n",
" 2.5848 \n",
" 0.0857 \n",
" 1061 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.9316 \n",
" 0.3547 \n",
" 1464 \n",
" \n",
" \n",
" 2.0824 \n",
" 0.0875 \n",
" 361 \n",
" \n",
" \n",
" 2.0383 \n",
" 0.2829 \n",
" 1168 \n",
" \n",
" \n",
" 2.0347 \n",
" 0.1839 \n",
" 759 \n",
" \n",
" \n",
" 2.5968 \n",
" 0.0911 \n",
" 376 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('AveRooms') (3/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 3.066e+00 \n",
" 1.9506 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.066e+00 < x <= 3.432e+00 \n",
" 1.8880 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.432e+00 < x <= 3.647e+00 \n",
" 1.8233 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.647e+00 < x <= 3.792e+00 \n",
" 1.8292 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.792e+00 < x <= 3.933e+00 \n",
" 1.7847 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.933e+00 < x <= 4.052e+00 \n",
" 1.8499 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.052e+00 < x <= 4.168e+00 \n",
" 1.8718 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.168e+00 < x <= 4.276e+00 \n",
" 1.8333 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.276e+00 < x <= 4.365e+00 \n",
" 1.7965 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.365e+00 < x <= 4.454e+00 \n",
" 1.6952 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.454e+00 < x <= 4.536e+00 \n",
" 1.7535 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.536e+00 < x <= 4.621e+00 \n",
" 1.7952 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.621e+00 < x <= 4.705e+00 \n",
" 1.8465 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.705e+00 < x <= 4.794e+00 \n",
" 1.7486 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.794e+00 < x <= 4.874e+00 \n",
" 1.7719 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.874e+00 < x <= 4.941e+00 \n",
" 1.7219 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 4.941e+00 < x <= 5.014e+00 \n",
" 1.7176 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 5.014e+00 < x <= 5.088e+00 \n",
" 1.7707 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.088e+00 < x <= 5.160e+00 \n",
" 1.7918 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.160e+00 < x <= 5.233e+00 \n",
" 1.7791 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.233e+00 < x <= 5.315e+00 \n",
" 1.8209 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.315e+00 < x <= 5.384e+00 \n",
" 1.9107 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.384e+00 < x <= 5.460e+00 \n",
" 1.7728 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.460e+00 < x <= 5.532e+00 \n",
" 1.8996 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.532e+00 < x <= 5.616e+00 \n",
" 1.8872 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.616e+00 < x <= 5.694e+00 \n",
" 1.9905 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.694e+00 < x <= 5.778e+00 \n",
" 2.0029 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.778e+00 < x <= 5.858e+00 \n",
" 2.0107 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.858e+00 < x <= 5.959e+00 \n",
" 2.1137 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 5.959e+00 < x <= 6.059e+00 \n",
" 2.0469 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.059e+00 < x <= 6.157e+00 \n",
" 2.1450 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 6.157e+00 < x <= 6.270e+00 \n",
" 2.2477 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.270e+00 < x <= 6.396e+00 \n",
" 2.3495 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 6.396e+00 < x <= 6.543e+00 \n",
" 2.4232 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.543e+00 < x <= 6.717e+00 \n",
" 2.6241 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.717e+00 < x <= 6.946e+00 \n",
" 2.7573 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 6.946e+00 < x <= 7.233e+00 \n",
" 3.0763 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 7.233e+00 < x <= 7.637e+00 \n",
" 3.1118 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 7.637e+00 < x <= 8.324e+00 \n",
" 3.5846 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 8.324e+00 < x \n",
" 2.7391 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.0908 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 1.8579 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 2.0031 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 1.8060 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.8137 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 1.7725 \n",
" 0.0211 \n",
" 87 \n",
" \n",
" \n",
" 1.7723 \n",
" 0.0283 \n",
" 117 \n",
" \n",
" \n",
" 1.7839 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 1.7902 \n",
" 0.0286 \n",
" 118 \n",
" \n",
" \n",
" 1.8121 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 1.6265 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 1.8349 \n",
" 0.0276 \n",
" 114 \n",
" \n",
" \n",
" 1.8339 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 1.7725 \n",
" 0.0342 \n",
" 141 \n",
" \n",
" \n",
" 1.8188 \n",
" 0.0254 \n",
" 105 \n",
" \n",
" \n",
" 1.8480 \n",
" 0.0191 \n",
" 79 \n",
" \n",
" \n",
" 1.8333 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 1.8191 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 1.7419 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 1.7642 \n",
" 0.0220 \n",
" 91 \n",
" \n",
" \n",
" 1.7645 \n",
" 0.0303 \n",
" 125 \n",
" \n",
" \n",
" 1.7917 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 1.8651 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 1.8645 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.8082 \n",
" 0.0286 \n",
" 118 \n",
" \n",
" \n",
" 1.8483 \n",
" 0.0177 \n",
" 73 \n",
" \n",
" \n",
" 2.0778 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.0005 \n",
" 0.0187 \n",
" 77 \n",
" \n",
" \n",
" 1.9724 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 2.2623 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 2.0818 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 2.2889 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.3280 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 2.5373 \n",
" 0.0254 \n",
" 105 \n",
" \n",
" \n",
" 2.6787 \n",
" 0.0201 \n",
" 83 \n",
" \n",
" \n",
" 2.7457 \n",
" 0.0211 \n",
" 87 \n",
" \n",
" \n",
" 3.0108 \n",
" 0.0303 \n",
" 125 \n",
" \n",
" \n",
" 3.1596 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 3.4340 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 2.7568 \n",
" 0.0245 \n",
" 101 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 3.43e+00 \n",
" 1.9193 \n",
" 0.0501 \n",
" 620 \n",
" \n",
" \n",
" 3.43e+00 < x <= 5.62e+00 \n",
" 1.8031 \n",
" 0.5749 \n",
" 7120 \n",
" \n",
" \n",
" 5.62e+00 < x <= 6.16e+00 \n",
" 2.0516 \n",
" 0.1500 \n",
" 1857 \n",
" \n",
" \n",
" 6.16e+00 < x <= 6.54e+00 \n",
" 2.3401 \n",
" 0.0750 \n",
" 929 \n",
" \n",
" \n",
" 6.54e+00 < x \n",
" 2.9823 \n",
" 0.1500 \n",
" 1858 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.9670 \n",
" 0.0497 \n",
" 205 \n",
" \n",
" \n",
" 1.8045 \n",
" 0.6000 \n",
" 2477 \n",
" \n",
" \n",
" 2.0474 \n",
" 0.1359 \n",
" 561 \n",
" \n",
" \n",
" 2.3886 \n",
" 0.0717 \n",
" 296 \n",
" \n",
" \n",
" 2.9752 \n",
" 0.1427 \n",
" 589 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('AveBedrms') (4/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 9.1220e-01 \n",
" 2.0511 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 9.1220e-01 < x <= 9.4022e-01 \n",
" 2.1264 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 9.4022e-01 < x <= 9.5595e-01 \n",
" 2.0638 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 9.5595e-01 < x <= 9.6743e-01 \n",
" 2.0756 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 9.6743e-01 < x <= 9.7590e-01 \n",
" 2.2562 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 9.7590e-01 < x <= 9.8343e-01 \n",
" 2.1709 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 9.8343e-01 < x <= 9.8987e-01 \n",
" 2.1450 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 9.8987e-01 < x <= 9.9592e-01 \n",
" 2.1772 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 9.9592e-01 < x <= 1.0019e+00 \n",
" 2.1915 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 1.0019e+00 < x <= 1.0068e+00 \n",
" 2.0949 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.0068e+00 < x <= 1.0112e+00 \n",
" 2.2440 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0112e+00 < x <= 1.0156e+00 \n",
" 2.1687 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0156e+00 < x <= 1.0204e+00 \n",
" 2.1723 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.0204e+00 < x <= 1.0250e+00 \n",
" 2.2003 \n",
" 0.0254 \n",
" 314 \n",
" \n",
" \n",
" 1.0250e+00 < x <= 1.0290e+00 \n",
" 2.1324 \n",
" 0.0246 \n",
" 305 \n",
" \n",
" \n",
" 1.0290e+00 < x <= 1.0331e+00 \n",
" 2.1840 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0331e+00 < x <= 1.0369e+00 \n",
" 2.0321 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.0369e+00 < x <= 1.0412e+00 \n",
" 2.1746 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0412e+00 < x <= 1.0453e+00 \n",
" 2.2536 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.0453e+00 < x <= 1.0493e+00 \n",
" 2.1546 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0493e+00 < x <= 1.0534e+00 \n",
" 2.0738 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 1.0534e+00 < x <= 1.0574e+00 \n",
" 2.1224 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.0574e+00 < x <= 1.0615e+00 \n",
" 2.0414 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0615e+00 < x <= 1.0662e+00 \n",
" 2.1569 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 1.0662e+00 < x <= 1.0712e+00 \n",
" 2.0972 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.0712e+00 < x <= 1.0763e+00 \n",
" 2.0714 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.0763e+00 < x <= 1.0816e+00 \n",
" 2.0244 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.0816e+00 < x <= 1.0874e+00 \n",
" 2.0135 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 1.0874e+00 < x <= 1.0933e+00 \n",
" 2.2239 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.0933e+00 < x <= 1.1000e+00 \n",
" 2.0244 \n",
" 0.0262 \n",
" 324 \n",
" \n",
" \n",
" 1.1000e+00 < x <= 1.1071e+00 \n",
" 2.0077 \n",
" 0.0242 \n",
" 300 \n",
" \n",
" \n",
" 1.1071e+00 < x <= 1.1160e+00 \n",
" 1.9564 \n",
" 0.0245 \n",
" 304 \n",
" \n",
" \n",
" 1.1160e+00 < x <= 1.1267e+00 \n",
" 2.0077 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.1267e+00 < x <= 1.1387e+00 \n",
" 1.9305 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.1387e+00 < x <= 1.1538e+00 \n",
" 1.8130 \n",
" 0.0258 \n",
" 319 \n",
" \n",
" \n",
" 1.1538e+00 < x <= 1.1739e+00 \n",
" 1.8060 \n",
" 0.0242 \n",
" 300 \n",
" \n",
" \n",
" 1.1739e+00 < x <= 1.2074e+00 \n",
" 1.9109 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.2074e+00 < x <= 1.2730e+00 \n",
" 1.8950 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.2730e+00 < x <= 1.5018e+00 \n",
" 1.7962 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.5018e+00 < x \n",
" 1.4931 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.7961 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 2.0098 \n",
" 0.0298 \n",
" 123 \n",
" \n",
" \n",
" 2.3039 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 2.2390 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.3293 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 1.9318 \n",
" 0.0194 \n",
" 80 \n",
" \n",
" \n",
" 2.1575 \n",
" 0.0199 \n",
" 82 \n",
" \n",
" \n",
" 2.1740 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 2.2207 \n",
" 0.0337 \n",
" 139 \n",
" \n",
" \n",
" 2.1811 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 2.0475 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.2743 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 2.2627 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 2.1068 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 2.4459 \n",
" 0.0228 \n",
" 94 \n",
" \n",
" \n",
" 2.1280 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 2.1193 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.2280 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.0336 \n",
" 0.0237 \n",
" 98 \n",
" \n",
" \n",
" 2.0195 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 1.9898 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 2.2270 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 1.9244 \n",
" 0.0254 \n",
" 105 \n",
" \n",
" \n",
" 2.1509 \n",
" 0.0237 \n",
" 98 \n",
" \n",
" \n",
" 2.2223 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.9654 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 2.1085 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 2.0332 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 1.9262 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 2.1139 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.9025 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 1.8628 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 1.9501 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.0231 \n",
" 0.0206 \n",
" 85 \n",
" \n",
" \n",
" 1.8622 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 1.8137 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.0399 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 1.6392 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 1.7221 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 1.6019 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.049e+00 \n",
" 2.1535 \n",
" 0.5000 \n",
" 6192 \n",
" \n",
" \n",
" 1.049e+00 < x <= 1.093e+00 \n",
" 2.0915 \n",
" 0.2250 \n",
" 2787 \n",
" \n",
" \n",
" 1.093e+00 < x <= 1.139e+00 \n",
" 1.9857 \n",
" 0.1249 \n",
" 1547 \n",
" \n",
" \n",
" 1.139e+00 < x <= 1.273e+00 \n",
" 1.8563 \n",
" 0.1000 \n",
" 1238 \n",
" \n",
" \n",
" 1.273e+00 < x \n",
" 1.6446 \n",
" 0.0501 \n",
" 620 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.1526 \n",
" 0.5029 \n",
" 2076 \n",
" \n",
" \n",
" 2.0582 \n",
" 0.2248 \n",
" 928 \n",
" \n",
" \n",
" 1.9707 \n",
" 0.1235 \n",
" 510 \n",
" \n",
" \n",
" 1.8475 \n",
" 0.0998 \n",
" 412 \n",
" \n",
" \n",
" 1.6632 \n",
" 0.0489 \n",
" 202 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('Population') (5/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.08e+02 \n",
" 1.9050 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 2.08e+02 < x <= 3.53e+02 \n",
" 2.0277 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 3.53e+02 < x <= 4.42e+02 \n",
" 2.0655 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.42e+02 < x <= 5.12e+02 \n",
" 2.2067 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 5.12e+02 < x <= 5.75e+02 \n",
" 2.1327 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 5.75e+02 < x <= 6.27e+02 \n",
" 2.0731 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 6.27e+02 < x <= 6.75e+02 \n",
" 2.3627 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 6.75e+02 < x <= 7.16e+02 \n",
" 2.2006 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 7.16e+02 < x <= 7.56e+02 \n",
" 2.0900 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" 7.56e+02 < x <= 7.94e+02 \n",
" 2.0191 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 7.94e+02 < x <= 8.32e+02 \n",
" 2.3248 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 8.32e+02 < x <= 8.67e+02 \n",
" 2.0763 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" 8.67e+02 < x <= 9.02e+02 \n",
" 2.0313 \n",
" 0.0247 \n",
" 306 \n",
" \n",
" \n",
" 9.02e+02 < x <= 9.40e+02 \n",
" 2.1185 \n",
" 0.0247 \n",
" 306 \n",
" \n",
" \n",
" 9.40e+02 < x <= 9.78e+02 \n",
" 2.1790 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" 9.78e+02 < x <= 1.02e+03 \n",
" 2.0746 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.02e+03 < x <= 1.06e+03 \n",
" 1.9522 \n",
" 0.0247 \n",
" 306 \n",
" \n",
" \n",
" 1.06e+03 < x <= 1.09e+03 \n",
" 2.1186 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.09e+03 < x <= 1.13e+03 \n",
" 2.0592 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 1.13e+03 < x <= 1.17e+03 \n",
" 2.0640 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" 1.17e+03 < x <= 1.22e+03 \n",
" 2.0134 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.22e+03 < x <= 1.26e+03 \n",
" 2.1690 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.26e+03 < x <= 1.30e+03 \n",
" 2.0558 \n",
" 0.0248 \n",
" 307 \n",
" \n",
" \n",
" 1.30e+03 < x <= 1.35e+03 \n",
" 1.9711 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" 1.35e+03 < x <= 1.41e+03 \n",
" 2.0185 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.41e+03 < x <= 1.46e+03 \n",
" 2.0004 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 1.46e+03 < x <= 1.52e+03 \n",
" 2.0911 \n",
" 0.0248 \n",
" 307 \n",
" \n",
" \n",
" 1.52e+03 < x <= 1.59e+03 \n",
" 2.1322 \n",
" 0.0254 \n",
" 315 \n",
" \n",
" \n",
" 1.59e+03 < x <= 1.66e+03 \n",
" 1.9949 \n",
" 0.0246 \n",
" 305 \n",
" \n",
" \n",
" 1.66e+03 < x <= 1.73e+03 \n",
" 2.0233 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.73e+03 < x <= 1.82e+03 \n",
" 1.8946 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" 1.82e+03 < x <= 1.91e+03 \n",
" 1.9504 \n",
" 0.0247 \n",
" 306 \n",
" \n",
" \n",
" 1.91e+03 < x <= 2.02e+03 \n",
" 2.0074 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.02e+03 < x <= 2.16e+03 \n",
" 2.0213 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.16e+03 < x <= 2.32e+03 \n",
" 2.0541 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.32e+03 < x <= 2.56e+03 \n",
" 2.0757 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.56e+03 < x <= 2.86e+03 \n",
" 2.0142 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.86e+03 < x <= 3.28e+03 \n",
" 1.9196 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.28e+03 < x <= 4.25e+03 \n",
" 2.0439 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.25e+03 < x \n",
" 2.0010 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.9895 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 1.8189 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 2.1479 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 2.2434 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 2.1281 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 2.2908 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 2.0926 \n",
" 0.0283 \n",
" 117 \n",
" \n",
" \n",
" 2.1757 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 2.2182 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.1433 \n",
" 0.0286 \n",
" 118 \n",
" \n",
" \n",
" 2.0769 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 2.1889 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.0488 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 2.1585 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 2.0699 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.0396 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 1.9843 \n",
" 0.0254 \n",
" 105 \n",
" \n",
" \n",
" 2.1062 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 1.9823 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 2.1353 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 2.1132 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 1.9696 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 2.1243 \n",
" 0.0196 \n",
" 81 \n",
" \n",
" \n",
" 1.9774 \n",
" 0.0245 \n",
" 101 \n",
" \n",
" \n",
" 1.8002 \n",
" 0.0245 \n",
" 101 \n",
" \n",
" \n",
" 2.1500 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 1.9471 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 1.9535 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.0915 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 2.0390 \n",
" 0.0228 \n",
" 94 \n",
" \n",
" \n",
" 2.1380 \n",
" 0.0211 \n",
" 87 \n",
" \n",
" \n",
" 1.9706 \n",
" 0.0203 \n",
" 84 \n",
" \n",
" \n",
" 1.8717 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 1.9082 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 2.0895 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 1.8131 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 2.0019 \n",
" 0.0269 \n",
" 111 \n",
" \n",
" \n",
" 2.0234 \n",
" 0.0201 \n",
" 83 \n",
" \n",
" \n",
" 2.1558 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.0339 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 3.53e+02 \n",
" 1.9663 \n",
" 0.0502 \n",
" 622 \n",
" \n",
" \n",
" 3.53e+02 < x <= 8.32e+02 \n",
" 2.1636 \n",
" 0.2253 \n",
" 2790 \n",
" \n",
" \n",
" 8.32e+02 < x <= 1.73e+03 \n",
" 2.0604 \n",
" 0.4745 \n",
" 5876 \n",
" \n",
" \n",
" 1.73e+03 < x <= 2.16e+03 \n",
" 1.9683 \n",
" 0.1000 \n",
" 1239 \n",
" \n",
" \n",
" 2.16e+03 < x \n",
" 2.0181 \n",
" 0.1500 \n",
" 1857 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.9038 \n",
" 0.0540 \n",
" 223 \n",
" \n",
" \n",
" 2.1659 \n",
" 0.2398 \n",
" 990 \n",
" \n",
" \n",
" 2.0445 \n",
" 0.4680 \n",
" 1932 \n",
" \n",
" \n",
" 1.9639 \n",
" 0.0925 \n",
" 382 \n",
" \n",
" \n",
" 2.0169 \n",
" 0.1456 \n",
" 601 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('AveOccup') (6/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 1.699e+00 \n",
" 2.6141 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.699e+00 < x <= 1.868e+00 \n",
" 2.7986 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 1.868e+00 < x <= 1.976e+00 \n",
" 2.6979 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 1.976e+00 < x <= 2.071e+00 \n",
" 2.5558 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.071e+00 < x <= 2.161e+00 \n",
" 2.4582 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.161e+00 < x <= 2.228e+00 \n",
" 2.2757 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.228e+00 < x <= 2.288e+00 \n",
" 2.3592 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.288e+00 < x <= 2.341e+00 \n",
" 2.2507 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.341e+00 < x <= 2.388e+00 \n",
" 2.1371 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.388e+00 < x <= 2.435e+00 \n",
" 2.2708 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.435e+00 < x <= 2.475e+00 \n",
" 2.1989 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.475e+00 < x <= 2.515e+00 \n",
" 2.1564 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.515e+00 < x <= 2.557e+00 \n",
" 2.1279 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.557e+00 < x <= 2.598e+00 \n",
" 2.2428 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.598e+00 < x <= 2.639e+00 \n",
" 2.1116 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.639e+00 < x <= 2.674e+00 \n",
" 2.2343 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.674e+00 < x <= 2.712e+00 \n",
" 2.0489 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.712e+00 < x <= 2.746e+00 \n",
" 2.2196 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.746e+00 < x <= 2.784e+00 \n",
" 2.1211 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.784e+00 < x <= 2.824e+00 \n",
" 2.2645 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 2.824e+00 < x <= 2.861e+00 \n",
" 2.1565 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 2.861e+00 < x <= 2.899e+00 \n",
" 2.2323 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.899e+00 < x <= 2.943e+00 \n",
" 2.0714 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.943e+00 < x <= 2.984e+00 \n",
" 2.0495 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 2.984e+00 < x <= 3.026e+00 \n",
" 1.9917 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.026e+00 < x <= 3.071e+00 \n",
" 1.9623 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.071e+00 < x <= 3.117e+00 \n",
" 2.0491 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.117e+00 < x <= 3.168e+00 \n",
" 1.9336 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.168e+00 < x <= 3.221e+00 \n",
" 1.9472 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.221e+00 < x <= 3.279e+00 \n",
" 1.8938 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.279e+00 < x <= 3.344e+00 \n",
" 1.8804 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.344e+00 < x <= 3.424e+00 \n",
" 1.8724 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.424e+00 < x <= 3.508e+00 \n",
" 1.8000 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.508e+00 < x <= 3.606e+00 \n",
" 1.6571 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.606e+00 < x <= 3.719e+00 \n",
" 1.5624 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.719e+00 < x <= 3.870e+00 \n",
" 1.5709 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 3.870e+00 < x <= 4.089e+00 \n",
" 1.4854 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.089e+00 < x <= 4.317e+00 \n",
" 1.4240 \n",
" 0.0250 \n",
" 309 \n",
" \n",
" \n",
" 4.317e+00 < x <= 4.705e+00 \n",
" 1.3233 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 4.705e+00 < x \n",
" 1.5280 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.7524 \n",
" 0.0220 \n",
" 91 \n",
" \n",
" \n",
" 2.7763 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 2.6502 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 2.5990 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 2.4828 \n",
" 0.0296 \n",
" 122 \n",
" \n",
" \n",
" 2.4039 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 2.2567 \n",
" 0.0281 \n",
" 116 \n",
" \n",
" \n",
" 2.4137 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 2.3471 \n",
" 0.0211 \n",
" 87 \n",
" \n",
" \n",
" 2.2425 \n",
" 0.0300 \n",
" 124 \n",
" \n",
" \n",
" 2.0911 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 2.2072 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 2.1370 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.0973 \n",
" 0.0281 \n",
" 116 \n",
" \n",
" \n",
" 2.0188 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 2.0825 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 2.2615 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 2.0114 \n",
" 0.0213 \n",
" 88 \n",
" \n",
" \n",
" 2.2314 \n",
" 0.0257 \n",
" 106 \n",
" \n",
" \n",
" 2.0203 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 2.0908 \n",
" 0.0286 \n",
" 118 \n",
" \n",
" \n",
" 1.8887 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 1.9894 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.2316 \n",
" 0.0228 \n",
" 94 \n",
" \n",
" \n",
" 2.0891 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 1.9787 \n",
" 0.0223 \n",
" 92 \n",
" \n",
" \n",
" 2.0818 \n",
" 0.0279 \n",
" 115 \n",
" \n",
" \n",
" 1.8602 \n",
" 0.0203 \n",
" 84 \n",
" \n",
" \n",
" 1.9611 \n",
" 0.0189 \n",
" 78 \n",
" \n",
" \n",
" 1.7265 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 1.7789 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 1.8341 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 1.6481 \n",
" 0.0211 \n",
" 87 \n",
" \n",
" \n",
" 1.6989 \n",
" 0.0247 \n",
" 102 \n",
" \n",
" \n",
" 1.6267 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 1.5547 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 1.4150 \n",
" 0.0293 \n",
" 121 \n",
" \n",
" \n",
" 1.5364 \n",
" 0.0220 \n",
" 91 \n",
" \n",
" \n",
" 1.4245 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 1.5598 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 2.16e+00 \n",
" 2.6250 \n",
" 0.1250 \n",
" 1548 \n",
" \n",
" \n",
" 2.16e+00 < x <= 2.90e+00 \n",
" 2.2005 \n",
" 0.4251 \n",
" 5264 \n",
" \n",
" \n",
" 2.90e+00 < x <= 3.51e+00 \n",
" 1.9501 \n",
" 0.2749 \n",
" 3404 \n",
" \n",
" \n",
" 3.51e+00 < x <= 3.87e+00 \n",
" 1.5968 \n",
" 0.0750 \n",
" 929 \n",
" \n",
" \n",
" 3.87e+00 < x \n",
" 1.4402 \n",
" 0.1000 \n",
" 1239 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.6484 \n",
" 0.1308 \n",
" 540 \n",
" \n",
" \n",
" 2.1665 \n",
" 0.4247 \n",
" 1753 \n",
" \n",
" \n",
" 1.9311 \n",
" 0.2636 \n",
" 1088 \n",
" \n",
" \n",
" 1.6265 \n",
" 0.0768 \n",
" 317 \n",
" \n",
" \n",
" 1.4801 \n",
" 0.1042 \n",
" 430 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('Latitude') (7/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 3.275e+01 \n",
" 1.5912 \n",
" 0.0287 \n",
" 355 \n",
" \n",
" \n",
" 3.275e+01 < x <= 3.321e+01 \n",
" 2.0299 \n",
" 0.0466 \n",
" 577 \n",
" \n",
" \n",
" 3.321e+01 < x <= 3.365e+01 \n",
" 2.7833 \n",
" 0.0279 \n",
" 345 \n",
" \n",
" \n",
" 3.365e+01 < x <= 3.374e+01 \n",
" 2.4326 \n",
" 0.0268 \n",
" 332 \n",
" \n",
" \n",
" 3.374e+01 < x <= 3.379e+01 \n",
" 2.1829 \n",
" 0.0262 \n",
" 325 \n",
" \n",
" \n",
" 3.379e+01 < x <= 3.383e+01 \n",
" 2.4232 \n",
" 0.0229 \n",
" 283 \n",
" \n",
" \n",
" 3.383e+01 < x <= 3.387e+01 \n",
" 2.3003 \n",
" 0.0241 \n",
" 299 \n",
" \n",
" \n",
" 3.387e+01 < x <= 3.391e+01 \n",
" 2.1570 \n",
" 0.0279 \n",
" 345 \n",
" \n",
" \n",
" 3.391e+01 < x <= 3.394e+01 \n",
" 1.6300 \n",
" 0.0242 \n",
" 300 \n",
" \n",
" \n",
" 3.394e+01 < x <= 3.397e+01 \n",
" 1.8594 \n",
" 0.0225 \n",
" 279 \n",
" \n",
" \n",
" 3.397e+01 < x <= 3.400e+01 \n",
" 1.9482 \n",
" 0.0224 \n",
" 278 \n",
" \n",
" \n",
" 3.400e+01 < x <= 3.403e+01 \n",
" 2.1267 \n",
" 0.0277 \n",
" 343 \n",
" \n",
" \n",
" 3.403e+01 < x <= 3.406e+01 \n",
" 2.4021 \n",
" 0.0339 \n",
" 420 \n",
" \n",
" \n",
" 3.406e+01 < x <= 3.410e+01 \n",
" 2.1760 \n",
" 0.0417 \n",
" 516 \n",
" \n",
" \n",
" 3.410e+01 < x <= 3.413e+01 \n",
" 2.3646 \n",
" 0.0242 \n",
" 300 \n",
" \n",
" \n",
" 3.413e+01 < x <= 3.417e+01 \n",
" 2.7771 \n",
" 0.0301 \n",
" 373 \n",
" \n",
" \n",
" 3.417e+01 < x <= 3.427e+01 \n",
" 2.4100 \n",
" 0.0435 \n",
" 539 \n",
" \n",
" \n",
" 3.427e+01 < x <= 3.453e+01 \n",
" 2.4559 \n",
" 0.0240 \n",
" 297 \n",
" \n",
" \n",
" 3.453e+01 < x <= 3.532e+01 \n",
" 1.4914 \n",
" 0.0246 \n",
" 305 \n",
" \n",
" \n",
" 3.532e+01 < x <= 3.623e+01 \n",
" 0.9208 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.623e+01 < x <= 3.672e+01 \n",
" 1.2441 \n",
" 0.0262 \n",
" 324 \n",
" \n",
" \n",
" 3.672e+01 < x <= 3.697e+01 \n",
" 1.3129 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" 3.697e+01 < x <= 3.729e+01 \n",
" 2.6241 \n",
" 0.0239 \n",
" 296 \n",
" \n",
" \n",
" 3.729e+01 < x <= 3.737e+01 \n",
" 2.6574 \n",
" 0.0258 \n",
" 320 \n",
" \n",
" \n",
" 3.737e+01 < x <= 3.753e+01 \n",
" 3.0105 \n",
" 0.0255 \n",
" 316 \n",
" \n",
" \n",
" 3.753e+01 < x <= 3.765e+01 \n",
" 2.4197 \n",
" 0.0243 \n",
" 301 \n",
" \n",
" \n",
" 3.765e+01 < x <= 3.772e+01 \n",
" 2.1174 \n",
" 0.0256 \n",
" 317 \n",
" \n",
" \n",
" 3.772e+01 < x <= 3.777e+01 \n",
" 2.5537 \n",
" 0.0286 \n",
" 354 \n",
" \n",
" \n",
" 3.777e+01 < x <= 3.793e+01 \n",
" 2.6887 \n",
" 0.0459 \n",
" 569 \n",
" \n",
" \n",
" 3.793e+01 < x <= 3.800e+01 \n",
" 1.7622 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" 3.800e+01 < x <= 3.826e+01 \n",
" 1.5924 \n",
" 0.0243 \n",
" 301 \n",
" \n",
" \n",
" 3.826e+01 < x <= 3.850e+01 \n",
" 1.8570 \n",
" 0.0254 \n",
" 315 \n",
" \n",
" \n",
" 3.850e+01 < x <= 3.863e+01 \n",
" 1.3981 \n",
" 0.0241 \n",
" 298 \n",
" \n",
" \n",
" 3.863e+01 < x <= 3.898e+01 \n",
" 1.3962 \n",
" 0.0251 \n",
" 311 \n",
" \n",
" \n",
" 3.898e+01 < x <= 3.975e+01 \n",
" 1.1241 \n",
" 0.0255 \n",
" 316 \n",
" \n",
" \n",
" 3.975e+01 < x \n",
" 0.8442 \n",
" 0.0244 \n",
" 302 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.5761 \n",
" 0.0320 \n",
" 132 \n",
" \n",
" \n",
" 2.0768 \n",
" 0.0552 \n",
" 228 \n",
" \n",
" \n",
" 2.7115 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 2.4368 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.2910 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 2.3528 \n",
" 0.0220 \n",
" 91 \n",
" \n",
" \n",
" 2.3233 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 2.0937 \n",
" 0.0368 \n",
" 152 \n",
" \n",
" \n",
" 1.6319 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 1.7992 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 1.9408 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.1292 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 2.3261 \n",
" 0.0334 \n",
" 138 \n",
" \n",
" \n",
" 2.2762 \n",
" 0.0443 \n",
" 183 \n",
" \n",
" \n",
" 2.2228 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 2.8224 \n",
" 0.0303 \n",
" 125 \n",
" \n",
" \n",
" 2.2938 \n",
" 0.0465 \n",
" 192 \n",
" \n",
" \n",
" 2.5025 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 1.3719 \n",
" 0.0201 \n",
" 83 \n",
" \n",
" \n",
" 0.9336 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 1.2516 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
" 1.2597 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 2.5507 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.5351 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 2.9827 \n",
" 0.0283 \n",
" 117 \n",
" \n",
" \n",
" 2.6519 \n",
" 0.0194 \n",
" 80 \n",
" \n",
" \n",
" 2.0869 \n",
" 0.0203 \n",
" 84 \n",
" \n",
" \n",
" 2.6145 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 2.5853 \n",
" 0.0516 \n",
" 213 \n",
" \n",
" \n",
" 1.6630 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 1.5156 \n",
" 0.0206 \n",
" 85 \n",
" \n",
" \n",
" 1.7549 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 1.3101 \n",
" 0.0196 \n",
" 81 \n",
" \n",
" \n",
" 1.3997 \n",
" 0.0279 \n",
" 115 \n",
" \n",
" \n",
" 1.1114 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 0.8671 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= 3.45e+01 \n",
" 2.2311 \n",
" 0.5254 \n",
" 6506 \n",
" \n",
" \n",
" 3.45e+01 < x <= 3.70e+01 \n",
" 1.2415 \n",
" 0.1011 \n",
" 1252 \n",
" \n",
" \n",
" 3.70e+01 < x <= 3.79e+01 \n",
" 2.5927 \n",
" 0.1997 \n",
" 2473 \n",
" \n",
" \n",
" 3.79e+01 < x <= 3.90e+01 \n",
" 1.6035 \n",
" 0.1240 \n",
" 1535 \n",
" \n",
" \n",
" 3.90e+01 < x \n",
" 0.9873 \n",
" 0.0499 \n",
" 618 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.2111 \n",
" 0.5487 \n",
" 2265 \n",
" \n",
" \n",
" 1.2065 \n",
" 0.0952 \n",
" 393 \n",
" \n",
" \n",
" 2.5902 \n",
" 0.1945 \n",
" 803 \n",
" \n",
" \n",
" 1.5312 \n",
" 0.1156 \n",
" 477 \n",
" \n",
" \n",
" 0.9918 \n",
" 0.0460 \n",
" 190 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- [ContinuousCarver] Fit Quantitative('Longitude') (8/8)\n",
" [ContinuousCarver] Raw distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= -1.2269e+02 \n",
" 1.4063 \n",
" 0.0259 \n",
" 321 \n",
" \n",
" \n",
" -1.2269e+02 < x <= -1.2247e+02 \n",
" 2.8878 \n",
" 0.0259 \n",
" 321 \n",
" \n",
" \n",
" -1.2247e+02 < x <= -1.2241e+02 \n",
" 3.2397 \n",
" 0.0245 \n",
" 303 \n",
" \n",
" \n",
" -1.2241e+02 < x <= -1.2229e+02 \n",
" 2.1582 \n",
" 0.0262 \n",
" 324 \n",
" \n",
" \n",
" -1.2229e+02 < x <= -1.2215e+02 \n",
" 2.3071 \n",
" 0.0476 \n",
" 589 \n",
" \n",
" \n",
" -1.2215e+02 < x <= -1.2206e+02 \n",
" 2.5665 \n",
" 0.0263 \n",
" 326 \n",
" \n",
" \n",
" -1.2206e+02 < x <= -1.2199e+02 \n",
" 2.6265 \n",
" 0.0253 \n",
" 313 \n",
" \n",
" \n",
" -1.2199e+02 < x <= -1.2191e+02 \n",
" 2.6924 \n",
" 0.0237 \n",
" 294 \n",
" \n",
" \n",
" -1.2191e+02 < x <= -1.2181e+02 \n",
" 2.2919 \n",
" 0.0255 \n",
" 316 \n",
" \n",
" \n",
" -1.2181e+02 < x <= -1.2157e+02 \n",
" 1.7103 \n",
" 0.0242 \n",
" 300 \n",
" \n",
" \n",
" -1.2157e+02 < x <= -1.2139e+02 \n",
" 1.1736 \n",
" 0.0252 \n",
" 312 \n",
" \n",
" \n",
" -1.2139e+02 < x <= -1.2127e+02 \n",
" 1.3270 \n",
" 0.0263 \n",
" 326 \n",
" \n",
" \n",
" -1.2127e+02 < x <= -1.2101e+02 \n",
" 1.4857 \n",
" 0.0238 \n",
" 295 \n",
" \n",
" \n",
" -1.2101e+02 < x <= -1.2064e+02 \n",
" 1.4716 \n",
" 0.0245 \n",
" 304 \n",
" \n",
" \n",
" -1.2064e+02 < x <= -1.2007e+02 \n",
" 1.3376 \n",
" 0.0254 \n",
" 314 \n",
" \n",
" \n",
" -1.2007e+02 < x <= -1.1972e+02 \n",
" 1.2624 \n",
" 0.0258 \n",
" 319 \n",
" \n",
" \n",
" -1.1972e+02 < x <= -1.1929e+02 \n",
" 1.3332 \n",
" 0.0239 \n",
" 296 \n",
" \n",
" \n",
" -1.1929e+02 < x <= -1.1897e+02 \n",
" 1.3300 \n",
" 0.0250 \n",
" 310 \n",
" \n",
" \n",
" -1.1897e+02 < x <= -1.1852e+02 \n",
" 2.7211 \n",
" 0.0258 \n",
" 319 \n",
" \n",
" \n",
" -1.1852e+02 < x <= -1.1843e+02 \n",
" 3.1653 \n",
" 0.0284 \n",
" 352 \n",
" \n",
" \n",
" -1.1843e+02 < x <= -1.1838e+02 \n",
" 3.4432 \n",
" 0.0238 \n",
" 295 \n",
" \n",
" \n",
" -1.1838e+02 < x <= -1.1834e+02 \n",
" 2.7480 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" -1.1834e+02 < x <= -1.1830e+02 \n",
" 2.3435 \n",
" 0.0271 \n",
" 336 \n",
" \n",
" \n",
" -1.1830e+02 < x <= -1.1822e+02 \n",
" 1.7476 \n",
" 0.0480 \n",
" 594 \n",
" \n",
" \n",
" -1.1822e+02 < x <= -1.1818e+02 \n",
" 1.8055 \n",
" 0.0227 \n",
" 281 \n",
" \n",
" \n",
" -1.1818e+02 < x <= -1.1813e+02 \n",
" 2.1480 \n",
" 0.0287 \n",
" 356 \n",
" \n",
" \n",
" -1.1813e+02 < x <= -1.1808e+02 \n",
" 2.2494 \n",
" 0.0243 \n",
" 301 \n",
" \n",
" \n",
" -1.1808e+02 < x <= -1.1801e+02 \n",
" 2.4079 \n",
" 0.0245 \n",
" 303 \n",
" \n",
" \n",
" -1.1801e+02 < x <= -1.1790e+02 \n",
" 2.2304 \n",
" 0.0468 \n",
" 580 \n",
" \n",
" \n",
" -1.1790e+02 < x <= -1.1780e+02 \n",
" 2.4820 \n",
" 0.0266 \n",
" 329 \n",
" \n",
" \n",
" -1.1780e+02 < x <= -1.1766e+02 \n",
" 2.2864 \n",
" 0.0248 \n",
" 307 \n",
" \n",
" \n",
" -1.1766e+02 < x <= -1.1739e+02 \n",
" 1.6791 \n",
" 0.0237 \n",
" 294 \n",
" \n",
" \n",
" -1.1739e+02 < x <= -1.1725e+02 \n",
" 1.6380 \n",
" 0.0290 \n",
" 359 \n",
" \n",
" \n",
" -1.1725e+02 < x <= -1.1716e+02 \n",
" 2.0512 \n",
" 0.0229 \n",
" 284 \n",
" \n",
" \n",
" -1.1716e+02 < x <= -1.1708e+02 \n",
" 1.5113 \n",
" 0.0249 \n",
" 308 \n",
" \n",
" \n",
" -1.1708e+02 < x <= -1.1696e+02 \n",
" 1.6669 \n",
" 0.0235 \n",
" 291 \n",
" \n",
" \n",
" -1.1696e+02 < x \n",
" 1.1769 \n",
" 0.0245 \n",
" 304 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 1.3927 \n",
" 0.0216 \n",
" 89 \n",
" \n",
" \n",
" 3.0129 \n",
" 0.0233 \n",
" 96 \n",
" \n",
" \n",
" 3.1899 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 2.1911 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 2.3035 \n",
" 0.0453 \n",
" 187 \n",
" \n",
" \n",
" 2.9862 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.5471 \n",
" 0.0240 \n",
" 99 \n",
" \n",
" \n",
" 2.6969 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 2.1464 \n",
" 0.0250 \n",
" 103 \n",
" \n",
" \n",
" 1.7105 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 1.0959 \n",
" 0.0220 \n",
" 91 \n",
" \n",
" \n",
" 1.2918 \n",
" 0.0291 \n",
" 120 \n",
" \n",
" \n",
" 1.3781 \n",
" 0.0230 \n",
" 95 \n",
" \n",
" \n",
" 1.4767 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 1.2441 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 1.2810 \n",
" 0.0281 \n",
" 116 \n",
" \n",
" \n",
" 1.2813 \n",
" 0.0252 \n",
" 104 \n",
" \n",
" \n",
" 1.4223 \n",
" 0.0274 \n",
" 113 \n",
" \n",
" \n",
" 2.7081 \n",
" 0.0218 \n",
" 90 \n",
" \n",
" \n",
" 3.2548 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 3.3604 \n",
" 0.0242 \n",
" 100 \n",
" \n",
" \n",
" 2.8064 \n",
" 0.0262 \n",
" 108 \n",
" \n",
" \n",
" 2.2395 \n",
" 0.0305 \n",
" 126 \n",
" \n",
" \n",
" 1.7631 \n",
" 0.0434 \n",
" 179 \n",
" \n",
" \n",
" 1.6175 \n",
" 0.0298 \n",
" 123 \n",
" \n",
" \n",
" 2.0881 \n",
" 0.0264 \n",
" 109 \n",
" \n",
" \n",
" 2.3487 \n",
" 0.0245 \n",
" 101 \n",
" \n",
" \n",
" 2.4322 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 2.1850 \n",
" 0.0497 \n",
" 205 \n",
" \n",
" \n",
" 2.5202 \n",
" 0.0288 \n",
" 119 \n",
" \n",
" \n",
" 2.2701 \n",
" 0.0235 \n",
" 97 \n",
" \n",
" \n",
" 1.7464 \n",
" 0.0225 \n",
" 93 \n",
" \n",
" \n",
" 1.8748 \n",
" 0.0310 \n",
" 128 \n",
" \n",
" \n",
" 2.1466 \n",
" 0.0266 \n",
" 110 \n",
" \n",
" \n",
" 1.4479 \n",
" 0.0279 \n",
" 115 \n",
" \n",
" \n",
" 1.5746 \n",
" 0.0271 \n",
" 112 \n",
" \n",
" \n",
" 1.2465 \n",
" 0.0259 \n",
" 107 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" [ContinuousCarver] Carved distribution\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
" X distribution \n",
" \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" x <= -1.218e+02 \n",
" 2.4438 \n",
" 0.2509 \n",
" 3107 \n",
" \n",
" \n",
" -1.218e+02 < x <= -1.190e+02 \n",
" 1.3787 \n",
" 0.2242 \n",
" 2776 \n",
" \n",
" \n",
" -1.190e+02 < x <= -1.183e+02 \n",
" 3.0175 \n",
" 0.1029 \n",
" 1274 \n",
" \n",
" \n",
" -1.183e+02 < x <= -1.177e+02 \n",
" 2.1601 \n",
" 0.2735 \n",
" 3387 \n",
" \n",
" \n",
" -1.177e+02 < x \n",
" 1.6155 \n",
" 0.1486 \n",
" 1840 \n",
" \n",
" \n",
"
\n",
" \n",
"\n",
" X_dev distribution \n",
" \n",
" \n",
" target_mean \n",
" frequency \n",
" count \n",
" \n",
" \n",
" \n",
" \n",
" 2.4780 \n",
" 0.2357 \n",
" 973 \n",
" \n",
" \n",
" 1.3487 \n",
" 0.2243 \n",
" 926 \n",
" \n",
" \n",
" 3.0414 \n",
" 0.0988 \n",
" 408 \n",
" \n",
" \n",
" 2.1328 \n",
" 0.2800 \n",
" 1156 \n",
" \n",
" \n",
" 1.6763 \n",
" 0.1611 \n",
" 665 \n",
" \n",
" \n",
"
\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" library \n",
" fit_s \n",
" transform_s \n",
" train_r2 \n",
" test_r2 \n",
" r2_drop \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" AutoCarver \n",
" 5.245 \n",
" 0.0778 \n",
" 0.6652 \n",
" 0.6595 \n",
" 0.0057 \n",
" \n",
" \n",
" 1 \n",
" optbinning \n",
" 2.404 \n",
" 0.0083 \n",
" 0.5145 \n",
" 0.5077 \n",
" 0.0068 \n",
" \n",
" \n",
" 2 \n",
" KBinsDiscretizer \n",
" 0.007 \n",
" 0.0015 \n",
" 0.6181 \n",
" 0.6192 \n",
" -0.0011 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" library fit_s transform_s train_r2 test_r2 r2_drop\n",
"0 AutoCarver 5.245 0.0778 0.6652 0.6595 0.0057\n",
"1 optbinning 2.404 0.0083 0.5145 0.5077 0.0068\n",
"2 KBinsDiscretizer 0.007 0.0015 0.6181 0.6192 -0.0011"
]
},
"execution_count": 20,
"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": 21,
"id": "b7da7c9b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_bars(regression_results, ['fit_s', 'test_r2', 'r2_drop'], 'California Housing \\u2014 regression')"
]
},
{
"cell_type": "markdown",
"id": "notes-md",
"metadata": {},
"source": [
"## How to read these numbers\n",
"\n",
"- **`fit_s` / `transform_s`** measure only `.fit` / `.transform` wall-clock — not data loading, not one-hot encoding, not the downstream model.\n",
"- **`test_auc` / `test_r2`** are the headline metric. They reflect how well a *simple* downstream model performs on each library's binned output. A tree-based downstream model would tell a different (and less binning-sensitive) story.\n",
"- **`auc_drop` / `r2_drop`** are `train - test` and measure how much each library's bins overfit. Lower is more robust. AutoCarver's dev-set veto is designed to keep this small.\n",
"- **Same data, same seed, same downstream model** across libraries — but a single run, on one machine, with one set of hyper-parameters. Treat as illustrative.\n",
"\n",
"## When the result will move\n",
"\n",
"- **Bigger `max_n_mod` / smaller `min_freq`** will improve AutoCarver and optbinning's in-sample scores at the cost of `*_drop`. KBins doesn't have a target, so it's mostly insensitive.\n",
"- **Different downstream model.** Gradient-boosted trees on the raw features beat any binning + linear pipeline. The point of binning is interpretability, not raw accuracy.\n",
"- **Different dataset.** German Credit is small; on a 10M-row credit-risk dataset, `fit_s` is what dominates the comparison.\n",
"\n",
"See [comparison.rst](../../comparison.html) for the qualitative scope and algorithmic comparison."
]
}
],
"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
}