prefit report · MedHouseVal

target: MedHouseValtask: regression (inferred, confirmed)16,512 development rows8 features
0questions awaiting your answer
0critical or review decisions

Next step: Export the model recipe with report.export(estimator) and evaluate it once on the held-out data.

Data partition. Every statistic, figure, decision and experiment in this report comes from 16,512 development rows. Prefit did not reserve an internal holdout; an test set of 4,128 rows was registered (metadata only, never profiled). No exact row overlap with the development data.

Actions

Needs your attention

Metrics

Optimize
MAE
Alongside
median absolute error, RMSE, R²
Avoid
RMSE (alone) — The target is skewed / heavy-tailed: RMSE is dominated by a few large values. Report it next to MAE; the RMSE/MAE gap is itself informative.
Avoid
R² (alone) — Can look healthy while large-error behaviour is poor.
Baseline (MAE, RepeatedKFold(n_splits=5, n_repeats=2) — the export splitter, repeated, 16,512 dev rows)
modelestimatormeanstd
dummyprior / median0.880.01468
userHistGradientBoostingRegressor0.31750.005152

Roadmap

Ordered from split to final evaluation. Only applied, confirmed or verified steps enter the exported model recipe.

1. Set up validation · 1 confirmed · 1 applied

confirmedneeds your context

Treat the task as regression

WhyInferred from the target: continuous numeric target. (Task inference = continuous numeric target)

DoAnalyze and evaluate as a regression problem.

Show evidence
evidencevalue95% intervalmethodfigures
Task inferencecontinuous numeric targetdtype + distinct-value heuristic on the target
Show rule and benchmark details
Rule
task_confirmation v1
Benchmark
rule detection pass rate on benchmark 2026.11-2: 1/1 checks (known-hazard fixtures; not a real-world accuracy claim)
Findings
f.task_inferred Task inferred as regression (continuous numeric target).
Columns
MedHouseVal
Full action
Analyze and evaluate as a regression problem.
Full reason
Inferred from the target: continuous numeric target.
Risk
A wrong task changes every metric and split recommendation.
Class
needs your context: Cannot be decided from data; applied only after you answer.
appliedprocedural

Cross-validate with KFold

WhyStandard shuffled k-fold. (Rows profiled (dev) = 16512)

DoUse KFold(n_splits=5, random_state=0, shuffle=True).

Show evidence
evidencevalue95% intervalmethodfigures
Rows profiled (dev)16512row count after holdout/sampling
Show rule and benchmark details
Rule
validation_split v2
Full action
Use KFold(n_splits=5, random_state=0, shuffle=True). Verification experiments and baselines use the same splitter repeated 2x (RepeatedKFold), for statistical power.
Full reason
Standard shuffled k-fold.
Risk
Without groups or a time column, rows that belong together (same patient, same customer, later in time) can still leak across folds.
Class
procedural: About how to evaluate; correct regardless of the data. Applied.

2. Preprocess inside the folds · 1 applied · 1 inconclusive

appliedprocedural

Fit all preprocessing inside each fold

WhyStatistics fit on all rows leak test-fold information into the score. (Column kinds = numeric=8)

DoKeep imputation and encoding inside the exported Pipeline.

Show evidence
evidencevalue95% intervalmethodfigures
Column kindsnumeric=8column-kind inference
Show rule and benchmark details
Rule
fit_in_fold v2
Full action
Put every preprocessing step in one sklearn Pipeline so it is re-fit on each training fold (defaults: 8 numeric/boolean: median imputation).
Full reason
Statistics computed on the full data (medians, category lists, encoders) leak test-fold information into the score.
Risk
The imputation and encoding defaults are generic; replace them where domain knowledge says otherwise. Feature scaling is estimator-dependent and is not part of this decision: export adds it with scale=True (default) and you can turn it off.
Class
procedural: About how to evaluate; correct regardless of the data. Applied.
inconclusiveconditional

Power-transform 4 skewed feature(s)

Why4 skewed feature(s) have |skew| >= 2; whether that matters depends on the model family. (Skewness · AveRooms = 21.98 [13.12, 25.58])

DoTest a Yeo-Johnson transform with your estimator (report.verify).

Experimentuser (HistGradientBoostingRegressor): MAE change +0 (higher = better), 0/10 folds better, Holm p=1 -> no_difference

Show evidence
evidencevalue95% intervalmethodfigures
Skewness · AveRooms21.98[13.12, 25.58]bootstrap 95% percentile interval (seeded)fig.col.AveRooms
Skewness · AveBedrms31.95[20.8, 37.42]bootstrap 95% percentile interval (seeded)fig.col.AveBedrms
Skewness · Population5.255[3.903, 7.638]bootstrap 95% percentile interval (seeded)fig.col.Population
Skewness · AveOccup87.5[41.7, 78.12]bootstrap 95% percentile interval (seeded)fig.col.AveOccup
Show experiment details
familyestimatormetricmean diff95% CIp (Holm)practical thresholdfolds improvedper-fold differencesoutcome
userHistGradientBoostingRegressorMAE0[0, 0]10.0031750/10+0, +0, +0, +0, +0, +0, +0, +0, +0, +0no_difference
Show related figures
Show rule and benchmark details
Rule
skewed_features v2 · thresholds: abs_skew = 2
Findings
f.skewed_features 4 skewed numeric feature(s) (|skew| >= 2; near-threshold = interval straddles 2).
Columns
AveBedrms, AveOccup, AveRooms, Population
Full action
Apply a Yeo-Johnson transform to ['AveRooms', 'AveBedrms', 'Population', 'AveOccup'].
Full reason
Skewed inputs can hurt linear and distance-based models; tree ensembles are usually far less sensitive. The effect is model-dependent, so it is tested, not assumed.
Risk
Transforms make coefficients harder to interpret and can amplify noise in the tails.
Check
Compare CV scores with and without the transform for your model family.
Class
conditional: May help or hurt depending on data and model; only an experiment can support it.

3. Target and class handling · 1 verified

verifiedconditional

Model log(1 + target)

WhyThe target is skewed (skew 0.98, 5.2% IQR-outliers) and non-negative. (Target skewness = 0.9833 [0.9592, 1.005])

DoTest log(1 + y) with your estimator (report.verify).

Experimentuser (HistGradientBoostingRegressor): MAE change +0.006122 (higher = better), 10/10 folds better, Holm p=0.000131 -> improved

NoteThe trigger itself was near its threshold.

Show evidence
evidencevalue95% intervalmethodfigures
Target skewness0.9833[0.9592, 1.005]bootstrap 95% percentile interval (seeded)fig.target, fig.target_log
Target IQR-outlier fraction0.05166[0.04821, 0.0546]share outside [Q1 - 1.5 IQR, Q3 + 1.5 IQR]; bootstrap 95% percentile interval (seeded)fig.target
Show experiment details
familyestimatormetricmean diff95% CIp (Holm)practical thresholdfolds improvedper-fold differencesoutcome
userHistGradientBoostingRegressorMAE0.006122[0.004135, 0.00811]0.0001310.00317510/10+0.0034, +0.00734, +0.00602, +0.00737, +0.00673, +0.00743, +0.00621, +0.00748, +0.00534, +0.00392improved
Show related figures
Show rule and benchmark details
Rule
target_skew v1 · thresholds: abs_skew = 1; outlier_fraction = 0.05
Benchmark
rule detection pass rate on benchmark 2026.11-2: 2/2 checks (known-hazard fixtures; not a real-world accuracy claim)
Findings
f.target_skew Target is skewed (skew=0.98, 5.2% IQR-outliers): squared-error metrics will be driven by the largest values.
Columns
MedHouseVal
Full action
Wrap the estimator in TransformedTargetRegressor(func=log1p, inverse_func=expm1).
Full reason
On a skewed, non-negative target, fitting on the log scale often reduces absolute error; it also changes what the model optimizes (closer to relative error).
Risk
Predictions back-transformed from the log scale are biased low for the mean; RMSE can get worse while MAE improves.
Check
Compare MAE and RMSE with and without the transform.
Class
conditional: May help or hurt depending on data and model; only an experiment can support it.

4. Pick the metric · 1 confirmed

confirmedneeds your context

Choose the metric from the cost of errors

WhyWhich metric to optimize depends on what an error costs; the data only says which ones mislead.

DoOptimize MAE; report the others alongside.

Show rule and benchmark details
Rule
metric_policy v1
Full action
Optimize and report: MAE; report alongside: median absolute error, RMSE, R².
Full reason
The data shows which metrics mislead here (see 'avoid'); which one to optimize depends on what an error costs, which only you know.
Risk
Optimizing a metric that does not match the real cost produces a model that looks good and fails where it matters.
Class
needs your context: Cannot be decided from data; applied only after you answer.

5. Final evaluation · 1 applied

appliedprocedural

Evaluate on the test set once, at the end

WhyPrefit did not reserve an internal holdout; the analysis ran on the frame you passed, and the registered test set (4128 rows) was kept out of it. (External holdout (registered) = 4128 rows (test set))

DoScore the final model on the test set once.

Show evidence
evidencevalue95% intervalmethodfigures
External holdout (registered)4128 rows (test set)registered with report.register_external_holdout; metadata only, never profiled
Show rule and benchmark details
Rule
holdout_policy v2
Full action
Score the final model on the test set once.
Full reason
Prefit did not reserve an internal holdout; the analysis ran on the frame you passed, and the registered test set (4128 rows) was kept out of it.
Risk
Re-using it to choose between models turns it into a second dev set.
Class
procedural: About how to evaluate; correct regardless of the data. Applied.

Review · after training

regression · n=4128. Only predictions on the untouched holdout give an unbiased estimate.

metricvalue
MAE0.2973
RMSE0.4517
median_abs_error0.1936
R20.8511
RMSE_MAE_ratio1.519
worst5pct_error_share0.2354
baseline MAE (predict the median)0.898

Did the roadmap's hypotheses hold?

verdicthypothesisresultreference
heldA few large errors dominate squared-error metrics (skewed/heavy-tailed target).Held: RMSE/MAE=1.52, the worst 5% carry 24% of total error. Keep MAE primary unless large errors are what you care about.Gaussian errors give RMSE/MAE = 1.25 and worst-5% share = 0.15; 'tails dominate' = ratio >= 1.2x or share >= 2x those.
heldThe model beats a constant (median) prediction.MAE 0.2973 vs 0.898 (+66.9%).MAE of always predicting the median of y_true

Worst segments

segmentvaluenmetricscore
house_age30y or newer2189MAE0.308
house_ageolder than 30y1939MAE0.2853

Assumptions that were never verified

Residuals (prediction − truth)

Shows: Histogram of residuals with a quantile box.

Why this figure: Shows bias (off-centre) and tail weight of the errors.

Data table
quantileresidual
0.01-1.54
0.05-0.7592
0.25-0.1859
0.50.026
0.750.1991
0.950.5976
0.991.062

How concentrated the error is

Shows: Cumulative share of total absolute error carried by the worst x% of rows; dashed: equal errors.

Why this figure: A steep start means a few rows drive the error metrics.

Data table
worst share of rowsshare of error
0%0.0%
10%36.6%
20%55.2%
30%68.1%
40%77.7%
50%85.1%
60%90.8%
70%95.0%
80%97.9%
90%99.5%
100%100.0%

MAE by segment (worst 10)

Shows: Mean absolute error per segment value with at least 20 rows.

Why this figure: Average error can hide segments where the model fails.

Data table
segmentvaluenMAE
house_age30y or newer21890.308
house_ageolder than 30y19390.2853

Details

Limitations

All diagnostics (10 figures)

Target distribution · MedHouseVal

Shows: Histogram of the target with a quantile box (whiskers at 1.5 IQR).

Why this figure: Skew, tails and zeros in the target decide which error metrics mislead and whether a target transform is worth testing.

Data table
quantilevalue
p000.15
p010.5021
p050.665
p251.2
p501.798
p752.642
p954.867
p995
p1005

log(1 + MedHouseVal)

Shows: The same target on the log scale the transform decision would model.

Why this figure: Shows how much the transform reduces the skew before any experiment is run.

Data table
statisticrawlog1p
skew0.9830.281

How well each feature predicts the target on its own

Shows: 2-fold cross-validated single-feature score per feature (top 20). Dashed line: leakage-hint threshold 0.95.

Why this figure: A feature near 1.0 alone is the classic signature of target leakage; the ranking also shows where signal is.

Data table
featurescore
MedInc0.4712
Longitude0.296
Latitude0.2376
AveRooms0.145
AveOccup0.069
HouseAge0.0225
AveBedrms0
Population0

Experiment · Model log(1 + target)

Shows: Per-fold score difference (dots), mean with its corrected 95% interval (diamond), and the practical-effect band (shaded): differences inside it count as negligible. Dashed line: no change.

Why this figure: Shows whether the conditional decision helps beyond fold-to-fold noise and beyond the practical threshold, per model family.

Data table
familymetricmean diff95% CIp (Holm)practical thresholdfolds improvedper-fold differencesoutcome
userneg_mean_absolute_error0.006122[0.004135, 0.00811]0.0001310.00317510/10+0.003397, +0.007339, +0.006019, +0.007367, +0.006731, +0.007426, +0.006212, +0.007477, +0.005339, +0.003918improved

Experiment · Power-transform 4 skewed feature(s)

Shows: Per-fold score difference (dots), mean with its corrected 95% interval (diamond), and the practical-effect band (shaded): differences inside it count as negligible. Dashed line: no change.

Why this figure: Shows whether the conditional decision helps beyond fold-to-fold noise and beyond the practical threshold, per model family.

Data table
familymetricmean diff95% CIp (Holm)practical thresholdfolds improvedper-fold differencesoutcome
userneg_mean_absolute_error0[0.0, 0.0]10.0031750/10+0, +0, +0, +0, +0, +0, +0, +0, +0, +0no_difference

Distribution · AveBedrms

Shows: Histogram of 'AveBedrms' with a quantile box.

Why this figure: 'AveBedrms' is named by a decision (d.power_transform); the shape shows what that decision would act on.

Data table
quantilevalue
p000.3333
p010.8673
p050.9372
p251.006
p501.049
p751.1
p951.275
p992.154
p10034.07

Distribution · AveOccup

Shows: Histogram of 'AveOccup' with a quantile box.

Why this figure: 'AveOccup' is named by a decision (d.power_transform); the shape shows what that decision would act on.

Data table
quantilevalue
p000.9706
p011.539
p051.868
p252.428
p502.817
p753.281
p954.348
p995.477
p1001243

Distribution · AveRooms

Shows: Histogram of 'AveRooms' with a quantile box.

Why this figure: 'AveRooms' is named by a decision (d.power_transform); the shape shows what that decision would act on.

Data table
quantilevalue
p000.8462
p012.581
p053.431
p254.438
p505.229
p756.053
p957.645
p9910.44
p100141.9

Distribution · Population

Shows: Histogram of 'Population' with a quantile box.

Why this figure: 'Population' is named by a decision (d.power_transform); the shape shows what that decision would act on.

Data table
quantilevalue
p005
p0186
p05344.6
p25787
p501169
p751735
p953317
p995807
p1003.568e+04

Rank correlation between numeric features

Shows: Spearman correlation among the 8 numeric features most associated with the target.

Why this figure: Near-collinear pairs make coefficients and importances unstable.

Data table
featureMedIncLongitudeLatitudeAveRoomsAveOccupHouseAgeAveBedrmsPopulation
MedInc1-0.004-0.0920.642-0.038-0.153-0.2560.007
Longitude-0.0041-0.879-0.0410.179-0.1490.0070.126
Latitude-0.092-0.87910.125-0.1510.0310.052-0.125
AveRooms0.642-0.0410.12510.026-0.2370.082-0.104
AveOccup-0.0380.179-0.1510.0261-0.023-0.1320.25
HouseAge-0.153-0.1490.031-0.237-0.0231-0.125-0.282
AveBedrms-0.2560.0070.0520.082-0.132-0.12510.029
Population0.0070.126-0.125-0.1040.25-0.2820.0291
Findings (3)
severityfindingevidencerulethresholds
infoTask inferred as regression (continuous numeric target).ev.task.inferencetask_confirmation v1
info4 skewed numeric feature(s) (|skew| >= 2; near-threshold = interval straddles 2).ev.col.AveRooms.skew, ev.col.AveBedrms.skew, ev.col.Population.skew, ev.col.AveOccup.skewskewed_features v2abs_skew=2
info · near thresholdTarget is skewed (skew=0.98, 5.2% IQR-outliers): squared-error metrics will be driven by the largest values.ev.target.skew, ev.target.outlierstarget_skew v1abs_skew=1; outlier_fraction=0.05
Evidence (10)
idmeasurevalue95% intervalmethodfigures
ev.task.inferenceTask inferencecontinuous numeric targetdtype + distinct-value heuristic on the target
ev.dataset.n_rowsRows profiled (dev)16512row count after holdout/sampling
ev.holdoutExternal holdout (registered)4128 rows (test set)registered with report.register_external_holdout; metadata only, never profiled
ev.columns.kindsColumn kindsnumeric=8column-kind inference
ev.col.AveRooms.skewSkewness · AveRooms21.98[13.12, 25.58]bootstrap 95% percentile interval (seeded)fig.col.AveRooms
ev.col.AveBedrms.skewSkewness · AveBedrms31.95[20.8, 37.42]bootstrap 95% percentile interval (seeded)fig.col.AveBedrms
ev.col.Population.skewSkewness · Population5.255[3.903, 7.638]bootstrap 95% percentile interval (seeded)fig.col.Population
ev.col.AveOccup.skewSkewness · AveOccup87.5[41.7, 78.12]bootstrap 95% percentile interval (seeded)fig.col.AveOccup
ev.target.skewTarget skewness0.9833[0.9592, 1.005]bootstrap 95% percentile interval (seeded)fig.target, fig.target_log
ev.target.outliersTarget IQR-outlier fraction0.05166[0.04821, 0.0546]share outside [Q1 - 1.5 IQR, Q3 + 1.5 IQR]; bootstrap 95% percentile interval (seeded)fig.target
Dataset profile
measurevalue
rows passed to analyze16512
development rows profiled16512
features8
column kindsnumeric=8
exact duplicate rows0 (0.00%)
identical features, different target0
target missing0 (0.0%)
taskregression — continuous numeric target

All columns

columnkindwhy this kinddtypemissingdistinctskewsingle-feature 2-fold CV score
MedIncnumericnumeric dtypefloat640.0%109181.6430.4712
HouseAgenumericnumeric dtypefloat640.0%520.063680.0225
AveRoomsnumericnumeric dtypefloat640.0%1563521.980.145
AveBedrmsnumericnumeric dtypefloat640.0%1200731.950
Populationnumericnumeric dtypefloat640.0%36475.2550
AveOccupnumericnumeric dtypefloat640.0%1527087.50.069
Latitudenumericnumeric dtypefloat640.0%8430.46740.2376
Longitudenumericnumeric dtypefloat640.0%823-0.2980.296
Manifest and history
fieldvalue
prefit0.1.0
python3.13.1
packagesnumpy=2.5.4, pandas=3.1.0, pydantic=2.14.2, scikit-learn=1.9.1, scipy=1.18.1, plotly=7.1.0
seed0
rule versionstask_confirmation=1, validation_split=2, holdout_policy=2, external_holdout_overlap=1, small_data=1, temporal_order=1, target_missing=1, infinite_values=1, duplicate_rows=1, conflicting_duplicates=1, high_missingness=1, near_constant=1, high_correlation=1, constant_columns=1, unsupported_columns=2, id_like_columns=1, leakage_hint=2, fit_in_fold=2, skewed_features=2, high_cardinality=1, class_imbalance=1, target_skew=1, heavy_tailed_target=1, zero_inflation=1, metric_policy=1
profile optionsmax_rows=200000, n_bootstrap=200, bootstrap_rows=5000, max_corr_features=20, redact_values=no, max_labelled_cardinality=50
budgetmax_experiments=4, max_seconds=180, max_rows=20000, n_splits=5, n_repeats=2, alpha=0.05, min_relative_effect=0.01, min_effect=—
benchmark manifest2026.11-2
source fingerprintn_rows=16512, n_columns=9, column_schema_digest=3b8ee5c826e16d3d1ba420cb02e019657addcdcbbe1554c534e4de21a5bc084c, dtype_digest=fcdabef0544b56d5181e18caadd3762908efbcad843be738397049b2d1fdab06, index_digest=44df329af87639eadd42f1af2c912ab41c10729c22cb5a7f719f62509ca6bf9a, target_digest=83643c5ac8a30b1a2ed4926808e5396cf1bade0ecc0b7c40f12cf93aaec2fd6b, content_digest=35c99c5ae4ece452de9ff9b3ce289d072a4a50afea5fe68a72836c52b578ed91
external holdoutname=test set, n_rows=4128, n_columns=9, same_columns_as_dev=yes, content_digest=bc400153de267139e2cd312d6567c6abd65398279c867101310ce52cb2eebc06, column_schema_digest=3b8ee5c826e16d3d1ba420cb02e019657addcdcbbe1554c534e4de21a5bc084c, profiled=no, overlap_rows=0, overlap_columns_compared=9
revision3

History

revisionstepdetails
0analyzetarget=MedHouseVal, task=regression, task_inferred=yes, answers=, groups=—, time_col=—, holdout=—, estimator=HistGradientBoostingRegressor
1answeranswers=q.task=regression, q.metric_priority=typical_error
2verifyestimator=HistGradientBoostingRegressor, experiments=2, budget=max_experiments=4, max_seconds=180, max_rows=20000, n_splits=5, n_repeats=2, alpha=0.05, min_relative_effect=0.01, min_effect=—, protocol=repeated_kfold, cv=RepeatedKFold(n_splits=5, n_repeats=2) — the export splitter, repeated
3register_external_holdoutname=test set, n_rows=4128, overlap_rows=0