Note
Go to the end to download the full example code.
SKD014 & SKD015: Hyperparameter search pitfalls#
This example walks through mitigations when checks
SKD014 and
SKD015 fire on a fitted search
object. SKD014 is an issue: numeric best_params_ sit on the minimum or
maximum value tried, so the true optimum may lie outside the searched range.
SKD015 is a tip: a hyperparameter is missing from the search space, which
is incomplete rather than necessarily wrong.
Usually, those tests are related to the search CV object and we advocate to address them jointly when both fire.
Mitigations from the Automated checks user guide:
SKD014: hyperparameters at search edge (issue)
extend
param_gridorparam_distributionsbeyond the flagged bounds,for
RandomizedSearchCV, increasen_iterand sample from a wider range,if SKD015 also fires, widen the search on every recommended hyperparameter.
SKD015: hyperparameters worth tuning (tip)
add the suggested parameters to
param_gridorparam_distributions.
In this example, we tune a
HistGradientBoostingClassifier inside
tabular_pipeline() on a stratified subsample of the employee
salaries dataset (above-median salary as the positive class). The walkthrough
has three parts: missing hyperparameters (SKD015), edge hits (SKD014), then
one joint fix that clears both.
Load the employee salaries dataset#
The raw target is continuous salary. We turn the regression problem into a
binary classification task: predict whether an employee earns more than the
median salary among employees in the dataset. Mixed HR features suit
tabular_pipeline(). A 3,000-row stratified subsample keeps the
gallery grids short while preserving class balance.
from sklearn.model_selection import train_test_split
from skrub.datasets import fetch_employee_salaries
dataset = fetch_employee_salaries()
X_full = dataset.X
y_full = (dataset.y > dataset.y.median()).astype(int).rename("high_earner")
X, _, y, _ = train_test_split(
X_full,
y_full,
train_size=3_000,
stratify=y_full,
random_state=42,
)
Let us inspect predictors and the binary target with
TableReport.
from skrub import TableReport
TableReport(X)
| gender | department | department_name | division | assignment_category | employee_position_title | date_first_hired | year_first_hired | |
|---|---|---|---|---|---|---|---|---|
| 4,953 | F | FIN | Department of Finance | Payroll | Fulltime-Regular | Office Services Coordinator | 05/30/2000 | 2,000 |
| 86 | M | HRC | Office of Human Rights | Director's Office | Fulltime-Regular | Office Services Coordinator | 10/14/2002 | 2,002 |
| 8,215 | M | CAT | County Attorney's Office | Insurance Defense Litigation | Fulltime-Regular | Assistant County Attorney II | 09/26/2011 | 2,011 |
| 4,534 | F | CEC | Community Engagement Cluster | Gilchrist Center | Parttime-Regular | Program Specialist II | 12/14/2015 | 2,015 |
| 5,538 | M | COR | Correction and Rehabilitation | DS MCCF Unit 2 Security | Fulltime-Regular | Correctional Officer III (Corporal) | 07/04/1995 | 1,995 |
| 7,466 | M | FRS | Fire and Rescue Services | Station 2 | Fulltime-Regular | Firefighter/Rescuer III | 03/17/2008 | 2,008 |
| 8,072 | F | HHS | Department of Health and Human Services | Income Supports | Fulltime-Regular | Income Assistance Program Specialist II | 03/29/1999 | 1,999 |
| 7,986 | M | FRS | Fire and Rescue Services | Station 19 | Fulltime-Regular | Firefighter/Rescuer III | 12/13/2004 | 2,004 |
| 255 | M | DGS | Department of General Services | Fleet Automotive Heavy Equipment | Fulltime-Regular | Mechanic Technician II | 06/26/2000 | 2,000 |
| 5,665 | F | DLC | Department of Liquor Control | Kingsview | Parttime-Regular | Liquor Store Clerk I | 06/29/2015 | 2,015 |
gender
ObjectDType- Null values
- 7 (0.2%)
- Unique values
- 2 (< 0.1%)
Most frequent values
M
F
['M', 'F']
department
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 36 (1.2%)
Most frequent values
POL
HHS
DOT
FRS
COR
DGS
DLC
LIB
DPS
SHF
['POL', 'HHS', 'DOT', 'FRS', 'COR', 'DGS', 'DLC', 'LIB', 'DPS', 'SHF']
department_name
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 36 (1.2%)
Most frequent values
Department of Police
Department of Health and Human Services
Department of Transportation
Fire and Rescue Services
Correction and Rehabilitation
Department of General Services
Department of Liquor Control
Department of Public Libraries
Department of Permitting Services
Sheriff's Office
['Department of Police', 'Department of Health and Human Services', 'Department of Transportation', 'Fire and Rescue Services', 'Correction and Rehabilitation', 'Department of General Services', 'Department of Liquor Control', 'Department of Public Libraries', 'Department of Permitting Services', "Sheriff's Office"]
division
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
543 (18.1%)
This column has a high cardinality (> 40).
Most frequent values
Transit Silver Spring Ride On
School Health Services
Transit Gaithersburg Ride On
Highway Services
Child Welfare Services
Income Supports
PSB 3rd District Patrol
PSB 4th District Patrol
FSB Traffic Division School Safety Section
List:Fleet Management Fleet Services
['Transit Silver Spring Ride On', 'School Health Services', 'Transit Gaithersburg Ride On', 'Highway Services', 'Child Welfare Services', 'Income Supports', 'PSB 3rd District Patrol', 'PSB 4th District Patrol', 'FSB Traffic Division School Safety Section', 'Fleet Management Fleet Services']
assignment_category
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 2 (< 0.1%)
Most frequent values
Fulltime-Regular
Parttime-Regular
['Fulltime-Regular', 'Parttime-Regular']
employee_position_title
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
322 (10.7%)
This column has a high cardinality (> 40).
Most frequent values
Bus Operator
Police Officer III
Firefighter/Rescuer III
Office Services Coordinator
Manager III
Master Firefighter/Rescuer
School Health Room Technician I
Firefighter/Rescuer II
Police Officer II
List:Police Sergeant
['Bus Operator', 'Police Officer III', 'Firefighter/Rescuer III', 'Office Services Coordinator', 'Manager III', 'Master Firefighter/Rescuer', 'School Health Room Technician I', 'Firefighter/Rescuer II', 'Police Officer II', 'Police Sergeant']
date_first_hired
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
1,253 (41.8%)
This column has a high cardinality (> 40).
Most frequent values
01/14/2013
02/24/2014
12/12/2016
07/16/2012
03/10/2014
08/12/2013
09/22/2014
07/29/2013
01/28/2013
List:03/02/2008
['01/14/2013', '02/24/2014', '12/12/2016', '07/16/2012', '03/10/2014', '08/12/2013', '09/22/2014', '07/29/2013', '01/28/2013', '03/02/2008']
year_first_hired
Int64DType- Null values
- 0 (0.0%)
- Unique values
-
46 (1.5%)
This column has a high cardinality (> 40).
- Mean ± Std
- 2.00e+03 ± 9.27
- Median ± IQR
- 2,005 ± 14
- Min | Max
- 1,968 | 2,016
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
|
Column
|
Column name
|
dtype
|
Is sorted
|
Null values
|
Unique values
|
Mean
|
Std
|
Min
|
Median
|
Max
|
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | gender | ObjectDType | False | 7 (0.2%) | 2 (< 0.1%) | |||||
| 1 | department | ObjectDType | False | 0 (0.0%) | 36 (1.2%) | |||||
| 2 | department_name | ObjectDType | False | 0 (0.0%) | 36 (1.2%) | |||||
| 3 | division | ObjectDType | False | 0 (0.0%) | 543 (18.1%) | |||||
| 4 | assignment_category | ObjectDType | False | 0 (0.0%) | 2 (< 0.1%) | |||||
| 5 | employee_position_title | ObjectDType | False | 0 (0.0%) | 322 (10.7%) | |||||
| 6 | date_first_hired | ObjectDType | False | 0 (0.0%) | 1253 (41.8%) | |||||
| 7 | year_first_hired | Int64DType | False | 0 (0.0%) | 46 (1.5%) | 2.00e+03 | 9.27 | 1,968 | 2,005 | 2,016 |
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
gender
ObjectDType- Null values
- 7 (0.2%)
- Unique values
- 2 (< 0.1%)
Most frequent values
M
F
['M', 'F']
department
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 36 (1.2%)
Most frequent values
POL
HHS
DOT
FRS
COR
DGS
DLC
LIB
DPS
SHF
['POL', 'HHS', 'DOT', 'FRS', 'COR', 'DGS', 'DLC', 'LIB', 'DPS', 'SHF']
department_name
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 36 (1.2%)
Most frequent values
Department of Police
Department of Health and Human Services
Department of Transportation
Fire and Rescue Services
Correction and Rehabilitation
Department of General Services
Department of Liquor Control
Department of Public Libraries
Department of Permitting Services
Sheriff's Office
['Department of Police', 'Department of Health and Human Services', 'Department of Transportation', 'Fire and Rescue Services', 'Correction and Rehabilitation', 'Department of General Services', 'Department of Liquor Control', 'Department of Public Libraries', 'Department of Permitting Services', "Sheriff's Office"]
division
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
543 (18.1%)
This column has a high cardinality (> 40).
Most frequent values
Transit Silver Spring Ride On
School Health Services
Transit Gaithersburg Ride On
Highway Services
Child Welfare Services
Income Supports
PSB 3rd District Patrol
PSB 4th District Patrol
FSB Traffic Division School Safety Section
List:Fleet Management Fleet Services
['Transit Silver Spring Ride On', 'School Health Services', 'Transit Gaithersburg Ride On', 'Highway Services', 'Child Welfare Services', 'Income Supports', 'PSB 3rd District Patrol', 'PSB 4th District Patrol', 'FSB Traffic Division School Safety Section', 'Fleet Management Fleet Services']
assignment_category
ObjectDType- Null values
- 0 (0.0%)
- Unique values
- 2 (< 0.1%)
Most frequent values
Fulltime-Regular
Parttime-Regular
['Fulltime-Regular', 'Parttime-Regular']
employee_position_title
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
322 (10.7%)
This column has a high cardinality (> 40).
Most frequent values
Bus Operator
Police Officer III
Firefighter/Rescuer III
Office Services Coordinator
Manager III
Master Firefighter/Rescuer
School Health Room Technician I
Firefighter/Rescuer II
Police Officer II
List:Police Sergeant
['Bus Operator', 'Police Officer III', 'Firefighter/Rescuer III', 'Office Services Coordinator', 'Manager III', 'Master Firefighter/Rescuer', 'School Health Room Technician I', 'Firefighter/Rescuer II', 'Police Officer II', 'Police Sergeant']
date_first_hired
ObjectDType- Null values
- 0 (0.0%)
- Unique values
-
1,253 (41.8%)
This column has a high cardinality (> 40).
Most frequent values
01/14/2013
02/24/2014
12/12/2016
07/16/2012
03/10/2014
08/12/2013
09/22/2014
07/29/2013
01/28/2013
List:03/02/2008
['01/14/2013', '02/24/2014', '12/12/2016', '07/16/2012', '03/10/2014', '08/12/2013', '09/22/2014', '07/29/2013', '01/28/2013', '03/02/2008']
year_first_hired
Int64DType- Null values
- 0 (0.0%)
- Unique values
-
46 (1.5%)
This column has a high cardinality (> 40).
- Mean ± Std
- 2.00e+03 ± 9.27
- Median ± IQR
- 2,005 ± 14
- Min | Max
- 1,968 | 2,016
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
| Column 1 | Column 2 | Cramér's V | Pearson's Correlation |
|---|---|---|---|
| department | department_name | 1.00 | |
| division | assignment_category | 0.569 | |
| assignment_category | employee_position_title | 0.502 | |
| division | employee_position_title | 0.419 | |
| department_name | employee_position_title | 0.414 | |
| department | employee_position_title | 0.414 | |
| department | assignment_category | 0.409 | |
| department_name | assignment_category | 0.409 | |
| gender | department | 0.380 | |
| gender | department_name | 0.380 | |
| department | division | 0.366 | |
| department_name | division | 0.366 | |
| employee_position_title | date_first_hired | 0.357 | |
| gender | employee_position_title | 0.268 | |
| gender | division | 0.252 | |
| gender | assignment_category | 0.232 | |
| department | date_first_hired | 0.149 | |
| department_name | date_first_hired | 0.149 | |
| employee_position_title | year_first_hired | 0.139 | |
| date_first_hired | year_first_hired | 0.136 | |
| division | date_first_hired | 0.125 | |
| gender | date_first_hired | 0.0941 | |
| department | year_first_hired | 0.0816 | |
| department_name | year_first_hired | 0.0816 | |
| assignment_category | date_first_hired | 0.0753 | |
| division | year_first_hired | 0.0678 | |
| gender | year_first_hired | 0.0646 | |
| assignment_category | year_first_hired | 0.0637 |
Please enable javascript
The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").
| high_earner | |
|---|---|
| 4,953 | 0 |
| 86 | 0 |
| 8,215 | 1 |
| 4,534 | 0 |
| 5,538 | 1 |
| 7,466 | 0 |
| 8,072 | 1 |
| 7,986 | 1 |
| 255 | 1 |
| 5,665 | 0 |
high_earner
Int64DType- Null values
- 0 (0.0%)
- Unique values
- 2 (< 0.1%)
- Mean ± Std
- 0.500 ± 0.500
- Median ± IQR
- 1 ± 1
- Min | Max
- 0 | 1
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
|
Column
|
Column name
|
dtype
|
Is sorted
|
Null values
|
Unique values
|
Mean
|
Std
|
Min
|
Median
|
Max
|
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | high_earner | Int64DType | False | 0 (0.0%) | 2 (< 0.1%) | 0.500 | 0.500 | 0 | 1 | 1 |
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
high_earner
Int64DType- Null values
- 0 (0.0%)
- Unique values
- 2 (< 0.1%)
- Mean ± Std
- 0.500 ± 0.500
- Median ± IQR
- 1 ± 1
- Min | Max
- 0 | 1
No columns match the selected filter: . You can change the column filter in the dropdown menu above.
Please enable javascript
The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").
Shared search setup#
Let us wrap HGB in tabular_pipeline(). Early stopping lets a
wide max_iter grid pick an interior budget in the first beat below. The
outer hold-out uses TrainTestSplit when we call
evaluate(); each
GridSearchCV below sets its own inner
cv.
from sklearn.ensemble import HistGradientBoostingClassifier
from skrub import tabular_pipeline
base_pipeline = tabular_pipeline(
HistGradientBoostingClassifier(
max_iter=200,
random_state=42,
early_stopping=True,
validation_fraction=0.1,
n_iter_no_change=10,
)
)
base_pipeline
Pipeline(steps=[('tablevectorizer',
TableVectorizer(low_cardinality=ToCategorical())),
('histgradientboostingclassifier',
HistGradientBoostingClassifier(early_stopping=True,
max_iter=200,
random_state=42))])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
Parameters
Parameters
Parameters
Parameters
Parameters
Parameters
Trigger SKD015: grid with only max_iter#
max_iter is a budget parameter, not a complexity knob in the SKD015 table.
We use GridSearchCV (not randomized search)
so every candidate is evaluated and the run is reproducible. The grid is wide
on purpose: with early stopping, the best max_iter lands strictly inside
the list, so SKD014 stays quiet and this beat isolates the SKD015 tip about
missing recommended hyperparameters.
from sklearn.model_selection import GridSearchCV
from skore import TrainTestSplit, evaluate
splitter = TrainTestSplit(test_size=0.2, random_state=42, stratify=y)
max_iter_only_search = GridSearchCV(
base_pipeline,
param_grid={
"histgradientboostingclassifier__max_iter": [
10,
25,
50,
100,
200,
500,
1000,
],
},
cv=3,
scoring="neg_log_loss",
n_jobs=4,
refit=True,
)
report = evaluate(
max_iter_only_search,
X=X,
y=y,
pos_label=1,
splitter=splitter,
)
In the Tips tab, SKD015 should tip that learning rate, depth, and leaf size
were not searched. SKD014 should not fire here: the best max_iter is not
the minimum or maximum of the grid above. best_params_ only contains
max_iter: that incompleteness is the point. A search that only tweaks
training budget ignores the hyperparameters that usually move generalization
for tree ensembles.
report.checks.summarize(fast_mode=True)
No issues were detected in your report.
- [SKD015] Hyperparameters worth tuning. These hyperparameters are not in the grid and may be worth tuning: ['learning_rate', 'max_leaf_nodes'] for HistGradientBoostingClassifier.
- [SKD003] Inconsistent performance across splits. Not applicable to estimator reports.
- [SKD005] Underrepresented classes. ML task is not multiclass classification. Got binary-classification.
- [SKD006] Coefficient interpretation. Estimator is not a linear model: it does not have a `coef_` attribute.
- [SKD007] MDI biased for high-cardinality features. Estimator is not a tree-based model: it does not have a `feature_importances_` attribute.
- [SKD008] Highly correlated input features. Expected train data to have between 2 and 1000 features; got 1.
- [SKD013] Train-test overlap in time series. No datetime column found.
- [SKD016] Estimator not tuned. Estimator is a BaseSearchCV instance.
No checks were muted.
Fast mode is on: expensive checks are skipped unless already cached.
Mute a check by passing its code to ignore, e.g. .checks.summarize(ignore=['SKD001']).
{'histgradientboostingclassifier__max_iter': 50}
Trigger SKD014: two-point GridSearchCV#
With exactly two values on each searched hyperparameter, whichever value wins
is always the tried minimum or maximum, so SKD014 fires deterministically. We
still omit depth / leaf hyperparameters so SKD015 tips as well. Prefer a small
grid over RandomizedSearchCV here: every
candidate is evaluated, and the edge story does not depend on which draws were
sampled.
edge_search = GridSearchCV(
base_pipeline,
param_grid={
"histgradientboostingclassifier__learning_rate": [0.05, 0.1],
"histgradientboostingclassifier__max_iter": [100, 200],
},
cv=3,
scoring="neg_log_loss",
n_jobs=4,
refit=True,
)
report_edge = evaluate(
edge_search,
X=X,
y=y,
pos_label=1,
splitter=splitter,
)
SKD014 should list numeric parameters at search edges as an issue; in the Tips tab, SKD015 should tip because depth / leaf hyperparameters are still missing.
report_edge.checks.summarize(fast_mode=True)
- [SKD014] Hyperparameters at search edge. 2 hyperparameter(s) are on the edge of the explored search space: histgradientboostingclassifier__learning_rate (minimum), histgradientboostingclassifier__max_iter (minimum). Consider extending the search range or increasing the number of iterations for randomized search.
- [SKD015] Hyperparameters worth tuning. These hyperparameters are not in the grid and may be worth tuning: ['max_leaf_nodes'] for HistGradientBoostingClassifier.
- [SKD003] Inconsistent performance across splits. Not applicable to estimator reports.
- [SKD005] Underrepresented classes. ML task is not multiclass classification. Got binary-classification.
- [SKD006] Coefficient interpretation. Estimator is not a linear model: it does not have a `coef_` attribute.
- [SKD007] MDI biased for high-cardinality features. Estimator is not a tree-based model: it does not have a `feature_importances_` attribute.
- [SKD008] Highly correlated input features. Expected train data to have between 2 and 1000 features; got 1.
- [SKD013] Train-test overlap in time series. No datetime column found.
- [SKD016] Estimator not tuned. Estimator is a BaseSearchCV instance.
No checks were muted.
Fast mode is on: expensive checks are skipped unless already cached.
Mute a check by passing its code to ignore, e.g. .checks.summarize(ignore=['SKD001']).
{'histgradientboostingclassifier__learning_rate': 0.05, 'histgradientboostingclassifier__max_iter': 100}
report_edge.metrics.summarize(data_source="both").frame()
| GridSearchCV (train) | GridSearchCV (test) | |
|---|---|---|
| metric | ||
| score | -0.068762 | -0.189901 |
| accuracy | 0.986667 | 0.933333 |
| precision | 0.985050 | 0.942177 |
| recall | 0.988333 | 0.923333 |
| roc_auc | 0.997754 | 0.977394 |
| log_loss | 0.068762 | 0.189901 |
| brier_score | 0.014418 | 0.052530 |
| fit_time | 10.189327 | 10.189327 |
| predict_time | 0.182861 | 0.083963 |
SKD014 & SKD015: widen bounds and add recommended hyperparameters#
Let us pad beyond the previous two-point edges so those learning-rate values
become interior grid points, and add max_depth so SKD015 clears
(max_depth covers the tree-complexity family). None in max_depth
is non-numeric, so SKD014 ignores that hyperparameter and only watches
learning rate: fewer ways for the gallery to flake.
full_search = GridSearchCV(
base_pipeline,
param_grid={
"histgradientboostingclassifier__learning_rate": [0.01, 0.05, 0.1, 0.2],
"histgradientboostingclassifier__max_depth": [3, 5, None],
},
cv=3,
scoring="neg_log_loss",
n_jobs=4,
refit=True,
)
report_full = evaluate(
full_search,
X=X,
y=y,
pos_label=1,
splitter=splitter,
)
SKD015 should clear once a recommended complexity hyperparameter is present
with learning rate. SKD014 clears when the best learning rate sits strictly
inside [0.01, 0.05, 0.1, 0.2] (not at the padded ends). Check
best_params_ against the grid above.
report_full.checks.summarize(fast_mode=True)
No issues were detected in your report.
No tips were emitted for your report.
- [SKD003] Inconsistent performance across splits. Not applicable to estimator reports.
- [SKD005] Underrepresented classes. ML task is not multiclass classification. Got binary-classification.
- [SKD006] Coefficient interpretation. Estimator is not a linear model: it does not have a `coef_` attribute.
- [SKD007] MDI biased for high-cardinality features. Estimator is not a tree-based model: it does not have a `feature_importances_` attribute.
- [SKD008] Highly correlated input features. Expected train data to have between 2 and 1000 features; got 1.
- [SKD013] Train-test overlap in time series. No datetime column found.
- [SKD016] Estimator not tuned. Estimator is a BaseSearchCV instance.
No checks were muted.
Fast mode is on: expensive checks are skipped unless already cached.
Mute a check by passing its code to ignore, e.g. .checks.summarize(ignore=['SKD001']).
{'histgradientboostingclassifier__learning_rate': 0.05, 'histgradientboostingclassifier__max_depth': 5}
Compare search strategies#
Hold-out log-loss and ROC AUC for the incomplete grid, the two-point edge grid, and the joint fix. Clearing the findings means the search design improved; still judge models on validation metrics and cost, not check status alone.
from skore import compare
metrics = (
compare(
{
"max_iter_only": report,
"two_point_edge_grid": report_edge,
"padded_recommended_params": report_full,
}
)
.metrics.summarize(data_source="both", metric=["log_loss", "roc_auc"])
.frame()
)
metrics.transpose()
| metric | log_loss | roc_auc |
|---|---|---|
| max_iter_only (train) | 0.067503 | 0.997784 |
| max_iter_only (test) | 0.183736 | 0.978528 |
| two_point_edge_grid (train) | 0.068762 | 0.997754 |
| two_point_edge_grid (test) | 0.189901 | 0.977394 |
| padded_recommended_params (train) | 0.077473 | 0.997272 |
| padded_recommended_params (test) | 0.192798 | 0.976550 |
Conclusion#
SKD015 tips about incomplete search spaces; SKD014 issues when optima stick to
the boundary of the box you tried. In this walkthrough, a max_iter-only
search missed key hyperparameters, a two-point grid forced edge hits, and one
padded complete grid addressed both. Expand the search before deploying
best_params_: passing checks are about search hygiene, not a guarantee of
the best model.
Total running time of the script: (0 minutes 57.336 seconds)