Adapt Sklearn¶
Adapt Scikit-learn — mvp.adapt_sklearn
Cluster: ML & Optimisation | Type: component | MCP Tools: 37
Overview¶
adapt_sklearn wraps scikit-learn estimators as AIBlocks, supporting fit, predict, fit_predict, and decision-tree explainability modes with configurable model selection via ModelConfig. The MCP sub-package adds 30 operations for training, prediction, evaluation, model persistence, pipeline composition, hyperparameter search, feature selection, vectorization, experiment tracking, heuristic storage, model comparison, and an advisory agentic estimator recommender (estimator_recommend + list_patterns).
When to use:
- Training classifiers or regressors within a G6 pipeline
- Cross-validation and model evaluation with stored experiment history
- Preprocessing (scaling, encoding) and feature importance analysis
Production Caveats¶
Surface these caveats to users before they depend on this component:
AdaptSklearnBlockexpects numericX: list[list[float]]. It does not ingest CSV files, spreadsheets, text columns, categorical strings, missing values, or dates directly. Useadapt_pandas,preprocess_encode,preprocess_scale, orvectorizefirst.- The Tier 1 block keeps fitted models in process memory only. A
predictcall works only on the same block instance afterfitorfit_predict. Use the MCPmodel_saveandmodel_loadoperations when a model must survive restart or move between processes. fit_predictreports training-set predictions and a training-set score for supervised estimators. Treat this as a smoke-test signal, not evidence of real-world accuracy. Usemodel_evaluatewith cross-validation or an explicit holdout split before making claims.- Classification scores are labelled as
accuracy, regression scores asr2, and KMeans-style clustering scores asinertia. These metrics are not interchangeable; compare models only within the same task and metric. - Supervised estimators require
y. Clustering estimators do not requirey, but their cluster IDs are arbitrary labels, not ground truth categories. extract_rulesandexplainare decision-tree-only modes. They will fail on a block whose state contains a previously fitted non-tree estimator; use a fresh block or fit a decision tree first.- Hyperparameters are passed directly to scikit-learn constructors. Invalid parameter names or values return
[SKLEARN_ERROR]rather than being auto-corrected. - This is a classical scikit-learn adapter, not full AutoML. For automatic model search over multiple backends, use
adapt_automloradapt_autosklearn. - For healthcare, legal, accounting, or other high-stakes workflows, outputs are decision support only. Keep human review and domain-specific validation gates in the workflow.
Example:
from mvp.adapt_sklearn import AdaptSklearnBlock, MLInput, ModelConfig
block = AdaptSklearnBlock(name="ml")
result = block.infer(MLInput(
X=[[0, 0], [1, 1]], y=[0, 1],
mode="fit_predict",
model_config_data=ModelConfig(estimator_type="logistic_regression"),
))
# result.ok → True; result.value → MLOutput with predictions and score
Works well with: adapt_pandas, adapt_pygad, align_evals, grounding
Public API¶
ModelConfig(BaseModel)¶
Configuration for which scikit-learn estimator to use.
| Field | Type | Default |
|---|---|---|
estimator_type | Literal['decision_tree', 'decision_tree_classifier', 'decision_tree_regressor', 'knn_classifier', 'gradient_boosting_classifier', 'gradient_boosting_regressor', 'logistic_regression', 'linear_regression', 'ridge_regression', 'lasso_regression', 'random_forest_classifier', 'random_forest_regressor', 'kmeans', 'dbscan', 'agglomerative', 'gaussian_mixture', 'mini_batch_kmeans', 'svm_classifier', 'svr'] | 'decision_tree' |
params | dict[str, Any] | Field(default_factory=dict) |
MLInput(BaseModel)¶
Feature matrix X plus optional labels y.
| Field | Type | Default |
|---|---|---|
X | list[list[float]] | required |
y | list[float \| int \| str] \| None | None |
mode | Literal['fit', 'predict', 'fit_predict', 'extract_rules', 'explain'] | 'fit_predict' |
model_config_data | ModelConfig | ModelConfig() |
feature_names | list[str] \| None | None |
MLOutput(BaseModel)¶
Predictions and optional score.
| Field | Type | Default |
|---|---|---|
predictions | list[float \| int \| str] \| None | None |
score | float \| None | None |
metric_name | str | '' |
n_samples | int | 0 |
n_features | int | 0 |
estimator_type | str | '' |
rules | str \| None | None |
explanation | dict[str, Any] \| None | None |
interpretation | str | '' |
degraded | bool | False |
degradation_reason | str | '' |
AdaptSklearnBlock(AIBlock[MLInput, MLOutput, Any])¶
Wraps a scikit-learn estimator as an AIBlock.
| Field | Type | Default |
|---|---|---|
name | str | 'adapt_sklearn' |
model_config_data | ModelConfig | field(default_factory=ModelConfig) |
resource_bounds | ResourceBounds \| None | None |
usage | ResourceUsage | field(default_factory=ResourceUsage) |
Methods:
infer(data: MLInput) -> Result[MLOutput]¶
bias() -> dict¶
MCPSklearnInput(BaseModel)¶
Input schema for AdaptSklearnMCPBlock.
| Field | Type | Default |
|---|---|---|
op | SklearnOp | Field(..., description='Operation to perform') |
model_name | str | Field('', description='Named model identifier') |
estimator_type | str | Field('', description='Estimator type key') |
task_type | str | Field('', description='classification / regression / clustering') |
X | list[list[float]] | Field(default_factory=list, description='Feature matrix rows') |
y | list[Any] | Field(default_factory=list, description='Target labels/values') |
X_test | list[list[float]] | Field(default_factory=list, description='Test feature matrix') |
params | dict[str, Any] | Field(default_factory=dict, description='Estimator hyperparams') |
cv | int | Field(5, description='Cross-validation folds') |
scoring | str | Field('', description='Scoring metric for CV') |
scaler_type | str | Field('standard', description='standard | minmax') |
name | str | Field('', description='Generic name field (experiments/heuristics/models)') |
description | str | Field('', description='Description/notes') |
domain | str | Field('', description='Domain for heuristics') |
condition | str | Field('', description='Heuristic condition') |
action | str | Field('', description='Heuristic action') |
query | str | Field('', description='Search query') |
score | float | Field(0.0, description='Score value') |
min_score | float | Field(0.0, description='Minimum score filter') |
n_samples | int | Field(0, description='Number of samples') |
n_features | int | Field(0, description='Number of features') |
tags | str | Field('', description='Comma-separated tags') |
notes | str | Field('', description='Notes/metadata') |
compare_name_a | str | Field('', description='First model for comparison') |
compare_name_b | str | Field('', description='Second model for comparison') |
feature_names | list[str] | Field(default_factory=list, description='Feature names for importance') |
model_name_b | str | Field('', description='Alias for compare_name_b') |
artifact_path | str | Field('', description='File path for model_save/model_load') |
pipeline_steps | list[dict[str, Any]] | Field(default_factory=list, description="Pipeline steps: [{'type':'scale','scaler':'standard'}, {'type':'estimator','key':'random_forest_classifier','params':{}}]") |
search_strategy | str | Field('grid', description='grid | random for hyperparameter_search') |
param_grid | dict[str, list[Any]] | Field(default_factory=dict, description='Parameter grid for hyperparameter_search') |
n_iter | int | Field(10, description='Iterations for RandomizedSearchCV') |
select_strategy | str | Field('k_best', description='k_best | rfe | variance_threshold for feature_select') |
k_features | int | Field(10, description='Number of features to select (k_best / rfe)') |
variance_threshold | float | Field(0.0, description='Threshold for variance_threshold strategy') |
text_data | list[str] | Field(default_factory=list, description='Raw text documents for vectorize op') |
vectorizer_type | str | Field('tfidf', description='tfidf | count for vectorize op') |
max_features | int | Field(0, description='Max vocabulary size for vectorize (0 = unlimited)') |
test_size | float | Field(0.0, description='Fraction of data held out as test set (0 = no split)') |
cv_strategy | str | Field('kfold', description='kfold | stratified | group for model_evaluate') |
request_id | str | Field('', description='Caller request identifier for reliability envelope') |
task_id | str | Field('', description='Caller task identifier for reliability envelope') |
run_id | str | Field('', description='Caller run identifier for reliability envelope') |
method | str | Field('', description='Allowlisted native method name') |
metric_name | str | Field('', description='Allowlisted sklearn metric name') |
transformer_type | str | Field('', description='Allowlisted native transformer key') |
step_name | str | Field('', description='Pipeline step name for native_pipeline_step') |
y_pred | list[Any] | Field(default_factory=list, description='Predicted labels/values for native metrics') |
y_score | list[Any] | Field(default_factory=list, description='Scores/probabilities for native metrics') |
baseline_score | float | Field(0.0, description='Optional contract threshold for model_evaluate. When > 0, the resulting cv_mean MUST clear this baseline or the output is marked degraded=True / degradation_reason=below_baseline.') |
MCPSklearnOutput(BaseModel)¶
Output schema for AdaptSklearnMCPBlock.
| Field | Type | Default |
|---|---|---|
op | str | '' |
success | bool | True |
data | dict[str, Any] | Field(default_factory=dict) |
error | str | '' |
degraded | bool | False |
degradation_reason | str | '' |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
completion_state | str | 'qualified-draft' |
warning_card | dict[str, Any] \| None | None |
evidence | dict[str, Any] | Field(default_factory=dict) |
MCPSklearnRecord(BaseModel)¶
A stored record from any sklearn MCP table.
| Field | Type | Default |
|---|---|---|
table | str | '' |
record_id | int | 0 |
data | dict[str, Any] | Field(default_factory=dict) |
AdaptSklearnMCPBlock(AIBlock[MCPSklearnInput, MCPSklearnOutput, dict])¶
Stateful sklearn MCP block: 30 ops, SQLite-backed.
| Field | Type | Default |
|---|---|---|
name | str | field(default='adapt_sklearn_mcp') |
db_path | str | field(default='') |
agentic_planner | Any | field(default=None) |
Methods:
infer(inp: MCPSklearnInput) -> Result[MCPSklearnOutput]¶
MCP Tools¶
| Operation | Source |
|---|---|
ops | sklearn_mcp |
help | sklearn_mcp |
model_fit | sklearn_mcp |
model_predict | sklearn_mcp |
model_fit_predict | sklearn_mcp |
model_evaluate | sklearn_mcp |
ml_status | sklearn_mcp |
model_store | sklearn_mcp |
model_retrieve | sklearn_mcp |
model_list | sklearn_mcp |
model_compare | sklearn_mcp |
estimator_list | sklearn_mcp |
estimator_recommend | sklearn_mcp |
estimator_info | sklearn_mcp |
preprocess_scale | sklearn_mcp |
preprocess_encode | sklearn_mcp |
feature_importance | sklearn_mcp |
experiment_store | sklearn_mcp |
experiment_query | sklearn_mcp |
heuristic_store | sklearn_mcp |
heuristic_retrieve | sklearn_mcp |
sklearn_info | sklearn_mcp |
model_save | sklearn_mcp |
model_load | sklearn_mcp |
pipeline_build | sklearn_mcp |
pipeline_fit | sklearn_mcp |
pipeline_predict | sklearn_mcp |
hyperparameter_search | sklearn_mcp |
feature_select | sklearn_mcp |
vectorize | sklearn_mcp |
partial_fit | sklearn_mcp |
list_patterns | sklearn_mcp |
native_capability_info | sklearn_mcp |
native_estimator_call | sklearn_mcp |
native_pipeline_step | sklearn_mcp |
native_metric_score | sklearn_mcp |
native_transform_call | sklearn_mcp |