From 2d0746b6d70415720a22a49a05432c82ce27dfc9 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Fri, 6 Dec 2024 23:05:39 -0800 Subject: [PATCH] Adds modular model pipeline example This shows how you can construct a pipeline from components and then use subdag to parameterize it for reuse. --- .../model_examples/modular_example/README.md | 34 ++ .../modular_example/features.py | 9 + .../modular_example/inference.py | 7 + .../model_examples/modular_example/my_dag.png | Bin 0 -> 118652 bytes .../modular_example/notebook.ipynb | 304 ++++++++++++++++++ .../modular_example/pipeline.py | 37 +++ .../model_examples/modular_example/run.py | 18 ++ .../model_examples/modular_example/train.py | 32 ++ 8 files changed, 441 insertions(+) create mode 100644 examples/model_examples/modular_example/README.md create mode 100644 examples/model_examples/modular_example/features.py create mode 100644 examples/model_examples/modular_example/inference.py create mode 100644 examples/model_examples/modular_example/my_dag.png create mode 100644 examples/model_examples/modular_example/notebook.ipynb create mode 100644 examples/model_examples/modular_example/pipeline.py create mode 100644 examples/model_examples/modular_example/run.py create mode 100644 examples/model_examples/modular_example/train.py diff --git a/examples/model_examples/modular_example/README.md b/examples/model_examples/modular_example/README.md new file mode 100644 index 000000000..9a821f6ba --- /dev/null +++ b/examples/model_examples/modular_example/README.md @@ -0,0 +1,34 @@ +# Modular pipeline example + +In this example we show how you can compose a pipeline from multiple modules. +This is a common pattern in Hamilton, where you can define a module that encapsulates +a set of "assets" and then use that module in a parameterized manner. + +The use case here is that: + +1. we have common data/feature engineering code. +2. we have a training set that creates a model +3. we have an inference step that given a model and a dataset, predicts the outcome on that dataset. + +With these 3 things we want to create a single pipeline that: + +1. trains a model and predicts on the training set. +2. uses that trained model to then predict on a separate dataset. + +We do this by creating our base components: + +1. Creating a module that contains the common data/feature engineering code. +2. Creating a module that trains a model. +3. Creating a module that predicts on a dataset. + +We can then create two pipelines that use these modules in different ways: + +1. For training and predicting on the training set we use all 3 modules. +2. For predicting on a separate dataset we use only the feature engineering module and the prediction module. +3. We wire the two together so that the trained model then gets used in the prediction step for the separate dataset. + +By using `@subdag` we namespace the reuse of the modules and that's how we can +reuse the same functions in different pipelines. + +See: +![single_pipeline](my_dag.png) diff --git a/examples/model_examples/modular_example/features.py b/examples/model_examples/modular_example/features.py new file mode 100644 index 000000000..a18f7e84b --- /dev/null +++ b/examples/model_examples/modular_example/features.py @@ -0,0 +1,9 @@ +import pandas as pd + + +def raw_data(path: str) -> pd.DataFrame: + return pd.read_csv(path) + + +def transformed_data(raw_data: pd.DataFrame) -> pd.DataFrame: + return raw_data.dropna() diff --git a/examples/model_examples/modular_example/inference.py b/examples/model_examples/modular_example/inference.py new file mode 100644 index 000000000..fdf79e73a --- /dev/null +++ b/examples/model_examples/modular_example/inference.py @@ -0,0 +1,7 @@ +from typing import Any + +import pandas as pd + + +def predicted_data(transformed_data: pd.DataFrame, fit_model: Any) -> pd.DataFrame: + return fit_model.predict(transformed_data) diff --git a/examples/model_examples/modular_example/my_dag.png b/examples/model_examples/modular_example/my_dag.png new file mode 100644 index 0000000000000000000000000000000000000000..0f152fdeaeb4d04708ca45b653496396baa9f743 GIT binary patch literal 118652 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≤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 KQVyTL^8WzIGSq+o literal 0 HcmV?d00001 diff --git a/examples/model_examples/modular_example/notebook.ipynb b/examples/model_examples/modular_example/notebook.ipynb new file mode 100644 index 000000000..57b6cdde8 --- /dev/null +++ b/examples/model_examples/modular_example/notebook.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "%pip install sf-hamilton[visualization]", + "id": "6b12abc0bf96a1fa" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Modular Pipeline Example [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/dagworks-inc/hamilton/blob/main/examples/model_examples/modular_example/notebook.ipynb) [![GitHub badge](https://img.shields.io/badge/github-view_source-2b3137?logo=github)](https://github.com/dagworks-inc/hamilton/blob/main/examples/model_examples/modular_example/notebook.ipynb)\n", + "This uses the jupyter magic commands to create a simple example of how to reuse pipelines in a modular manner with subdag. " + ], + "id": "5fdf2bac7ddc6f79" + }, + { + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-12-07T06:57:19.359572Z", + "start_time": "2024-12-07T06:57:13.119759Z" + } + }, + "cell_type": "code", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/stefankrawczyk/.pyenv/versions/knowledge_retrieval-py39/lib/python3.9/site-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + } + ], + "execution_count": 1, + "source": "%load_ext hamilton.plugins.jupyter_magic", + "id": "initial_id" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T06:57:19.627950Z", + "start_time": "2024-12-07T06:57:19.368576Z" + } + }, + "cell_type": "code", + "source": [ + "%%cell_to_module features --display\n", + "\n", + "import pandas as pd\n", + "\n", + "def raw_data(path: str) -> pd.DataFrame:\n", + " return pd.read_csv(path)\n", + "\n", + "def transformed_data(raw_data: pd.DataFrame) -> pd.DataFrame:\n", + " return raw_data.dropna()" + ], + "id": "7fafbffaf2f6f68a", + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\ncluster__legend\n\nLegend\n\n\n\ntransformed_data\n\ntransformed_data\nDataFrame\n\n\n\nraw_data\n\nraw_data\nDataFrame\n\n\n\nraw_data->transformed_data\n\n\n\n\n\n_raw_data_inputs\n\npath\nstr\n\n\n\n_raw_data_inputs->raw_data\n\n\n\n\n\ninput\n\ninput\n\n\n\nfunction\n\nfunction\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T06:57:19.971271Z", + "start_time": "2024-12-07T06:57:19.724804Z" + } + }, + "cell_type": "code", + "source": [ + "%%cell_to_module train --config '{\"model\":\"RandomForest\"}'--display\n", + "\n", + "from typing import Any\n", + "import pandas as pd\n", + "\n", + "from hamilton.function_modifiers import config\n", + "\n", + "@config.when(model=\"RandomForest\")\n", + "def base_model__rf(model_params: dict) -> Any:\n", + " from sklearn.ensemble import RandomForestClassifier\n", + " return RandomForestClassifier(**model_params)\n", + "\n", + "@config.when(model=\"LogisticRegression\")\n", + "def base_model__lr(model_params: dict) -> Any:\n", + " from sklearn.linear_model import LogisticRegression\n", + " return LogisticRegression(**model_params)\n", + "\n", + "@config.when(model=\"XGBoost\")\n", + "def base_model__xgb(model_params: dict) -> Any:\n", + " from xgboost import XGBClassifier\n", + " return XGBClassifier(**model_params)\n", + "\n", + "\n", + "def fit_model(transformed_data: pd.DataFrame, base_model: Any) -> Any:\n", + " \"\"\"Fit a model to transformed data.\"\"\"\n", + " base_model.fit(transformed_data.drop(\"target\", axis=1), transformed_data[\"target\"])\n", + " return base_model\n" + ], + "id": "eae523c3fba37c93", + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\ncluster__legend\n\nLegend\n\n\n\nmodel\n\n\n\nmodel\nRandomForest\n\n\n\nbase_model\n\nbase_model: model\ntyping.Any\n\n\n\nfit_model\n\nfit_model\ntyping.Any\n\n\n\nbase_model->fit_model\n\n\n\n\n\n_base_model_inputs\n\nmodel_params\ndict\n\n\n\n_base_model_inputs->base_model\n\n\n\n\n\n_fit_model_inputs\n\ntransformed_data\nDataFrame\n\n\n\n_fit_model_inputs->fit_model\n\n\n\n\n\nconfig\n\n\n\nconfig\n\n\n\ninput\n\ninput\n\n\n\nfunction\n\nfunction\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T06:57:20.363768Z", + "start_time": "2024-12-07T06:57:20.114344Z" + } + }, + "cell_type": "code", + "source": [ + "%%cell_to_module inference --display\n", + "from typing import Any\n", + "import pandas as pd\n", + "\n", + "\n", + "def predicted_data(transformed_data: pd.DataFrame, fit_model: Any) -> pd.DataFrame:\n", + " return fit_model.predict(transformed_data)\n", + "\n" + ], + "id": "2ad9e61062f6516a", + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\ncluster__legend\n\nLegend\n\n\n\npredicted_data\n\npredicted_data\nDataFrame\n\n\n\n_predicted_data_inputs\n\ntransformed_data\nDataFrame\nfit_model\ntyping.Any\n\n\n\n_predicted_data_inputs->predicted_data\n\n\n\n\n\ninput\n\ninput\n\n\n\nfunction\n\nfunction\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T07:00:23.770491Z", + "start_time": "2024-12-07T07:00:23.481869Z" + } + }, + "cell_type": "code", + "source": [ + "%%cell_to_module pipeline --config '{\"model\":\"RandomForest\"}' --display\n", + "from typing import Any\n", + "\n", + "import pandas as pd\n", + "\n", + "from hamilton.function_modifiers import subdag, extract_fields, value, source\n", + "import features\n", + "import train\n", + "import inference\n", + "\n", + "@extract_fields(\n", + " {'fit_model': Any, 'training_prediction': pd.DataFrame}\n", + ")\n", + "@subdag(\n", + " features, train, inference,\n", + " inputs={\n", + " \"path\": source(\"path\"),\n", + " \"model_params\": source(\"model_params\"),\n", + " },\n", + " # config={\n", + " # \"model\": source(\"model\")\n", + " # },\n", + ")\n", + "def trained_pipeline(fit_model: Any, predicted_data: pd.DataFrame) -> dict:\n", + " return {'fit_model': fit_model, 'training_prediction': predicted_data}\n", + "\n", + "@subdag(\n", + " features, inference,\n", + " inputs={\n", + " \"path\": source(\"predict_path\"),\n", + " \"fit_model\": source(\"fit_model\"),\n", + " },\n", + ")\n", + "def predicted_data(predicted_data: pd.DataFrame) -> pd.DataFrame:\n", + " return predicted_data" + ], + "id": "6d1585dad64464d7", + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\ncluster__legend\n\nLegend\n\n\n\nmodel\n\n\n\nmodel\nRandomForest\n\n\n\ntrained_pipeline.base_model\n\ntrained_pipeline.base_model: model\ntyping.Any\n\n\n\ntrained_pipeline.fit_model\n\ntrained_pipeline.fit_model\ntyping.Any\n\n\n\ntrained_pipeline.base_model->trained_pipeline.fit_model\n\n\n\n\n\nfit_model\n\nfit_model\ntyping.Any\n\n\n\npredicted_data.fit_model\n\npredicted_data.fit_model\ntyping.Any\n\n\n\nfit_model->predicted_data.fit_model\n\n\n\n\n\npredicted_data.raw_data\n\npredicted_data.raw_data\nDataFrame\n\n\n\npredicted_data.transformed_data\n\npredicted_data.transformed_data\nDataFrame\n\n\n\npredicted_data.raw_data->predicted_data.transformed_data\n\n\n\n\n\npredicted_data.predicted_data\n\npredicted_data.predicted_data\nDataFrame\n\n\n\npredicted_data.transformed_data->predicted_data.predicted_data\n\n\n\n\n\ntrained_pipeline.predicted_data\n\ntrained_pipeline.predicted_data\nDataFrame\n\n\n\ntrained_pipeline\n\ntrained_pipeline\ndict\n\n\n\ntrained_pipeline.predicted_data->trained_pipeline\n\n\n\n\n\ntrained_pipeline.transformed_data\n\ntrained_pipeline.transformed_data\nDataFrame\n\n\n\ntrained_pipeline.transformed_data->trained_pipeline.predicted_data\n\n\n\n\n\ntrained_pipeline.transformed_data->trained_pipeline.fit_model\n\n\n\n\n\npredicted_data\n\npredicted_data\nDataFrame\n\n\n\npredicted_data.predicted_data->predicted_data\n\n\n\n\n\ntrained_pipeline.model_params\n\ntrained_pipeline.model_params\ndict\n\n\n\ntrained_pipeline.model_params->trained_pipeline.base_model\n\n\n\n\n\ntrained_pipeline.fit_model->trained_pipeline.predicted_data\n\n\n\n\n\ntrained_pipeline.fit_model->trained_pipeline\n\n\n\n\n\npredicted_data.fit_model->predicted_data.predicted_data\n\n\n\n\n\npredicted_data.path\n\npredicted_data.path\nstr\n\n\n\npredicted_data.path->predicted_data.raw_data\n\n\n\n\n\ntrained_pipeline.path\n\ntrained_pipeline.path\nstr\n\n\n\ntrained_pipeline.raw_data\n\ntrained_pipeline.raw_data\nDataFrame\n\n\n\ntrained_pipeline.path->trained_pipeline.raw_data\n\n\n\n\n\ntrained_pipeline->fit_model\n\n\n\n\n\ntraining_prediction\n\ntraining_prediction\nDataFrame\n\n\n\ntrained_pipeline->training_prediction\n\n\n\n\n\ntrained_pipeline.raw_data->trained_pipeline.transformed_data\n\n\n\n\n\n_trained_pipeline.model_params_inputs\n\nmodel_params\ndict\n\n\n\n_trained_pipeline.model_params_inputs->trained_pipeline.model_params\n\n\n\n\n\n_predicted_data.path_inputs\n\npredict_path\nstr\n\n\n\n_predicted_data.path_inputs->predicted_data.path\n\n\n\n\n\n_trained_pipeline.path_inputs\n\npath\nstr\n\n\n\n_trained_pipeline.path_inputs->trained_pipeline.path\n\n\n\n\n\nconfig\n\n\n\nconfig\n\n\n\ninput\n\ninput\n\n\n\nfunction\n\nfunction\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T06:57:20.874962Z", + "start_time": "2024-12-07T06:57:20.643256Z" + } + }, + "cell_type": "code", + "source": [ + "from hamilton import driver\n", + "\n", + "dr = (\n", + " driver.Builder()\n", + " .with_config({\"model\": \"RandomForest\", \"model_params\": {\"n_estimators\": 100}})\n", + " .with_modules(pipeline)\n", + " .build()\n", + ")\n", + "dr.display_all_functions()" + ], + "id": "f72146c07a654ca4", + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\ncluster__legend\n\nLegend\n\n\n\nmodel\n\n\n\nmodel\nRandomForest\n\n\n\nmodel_params\n\n\n\nmodel_params\n{'n_estimators': 100}\n\n\n\ntrained_pipeline.base_model\n\ntrained_pipeline.base_model: model\ntyping.Any\n\n\n\ntrained_pipeline.fit_model\n\ntrained_pipeline.fit_model\ntyping.Any\n\n\n\ntrained_pipeline.base_model->trained_pipeline.fit_model\n\n\n\n\n\nfit_model\n\nfit_model\ntyping.Any\n\n\n\npredicted_data.fit_model\n\npredicted_data.fit_model\ntyping.Any\n\n\n\nfit_model->predicted_data.fit_model\n\n\n\n\n\ntrained_pipeline.model\n\ntrained_pipeline.model\nUpstreamDependency\n\n\n\npredicted_data.raw_data\n\npredicted_data.raw_data\nDataFrame\n\n\n\npredicted_data.transformed_data\n\npredicted_data.transformed_data\nDataFrame\n\n\n\npredicted_data.raw_data->predicted_data.transformed_data\n\n\n\n\n\npredicted_data.predicted_data\n\npredicted_data.predicted_data\nDataFrame\n\n\n\npredicted_data.transformed_data->predicted_data.predicted_data\n\n\n\n\n\ntrained_pipeline.predicted_data\n\ntrained_pipeline.predicted_data\nDataFrame\n\n\n\ntrained_pipeline\n\ntrained_pipeline\ndict\n\n\n\ntrained_pipeline.predicted_data->trained_pipeline\n\n\n\n\n\ntrained_pipeline.transformed_data\n\ntrained_pipeline.transformed_data\nDataFrame\n\n\n\ntrained_pipeline.transformed_data->trained_pipeline.predicted_data\n\n\n\n\n\ntrained_pipeline.transformed_data->trained_pipeline.fit_model\n\n\n\n\n\npredicted_data\n\npredicted_data\nDataFrame\n\n\n\npredicted_data.predicted_data->predicted_data\n\n\n\n\n\ntrained_pipeline.model_params\n\ntrained_pipeline.model_params\ndict\n\n\n\ntrained_pipeline.model_params->trained_pipeline.base_model\n\n\n\n\n\ntrained_pipeline.fit_model->trained_pipeline.predicted_data\n\n\n\n\n\ntrained_pipeline.fit_model->trained_pipeline\n\n\n\n\n\npredicted_data.fit_model->predicted_data.predicted_data\n\n\n\n\n\npredicted_data.path\n\npredicted_data.path\nstr\n\n\n\npredicted_data.path->predicted_data.raw_data\n\n\n\n\n\ntrained_pipeline.path\n\ntrained_pipeline.path\nstr\n\n\n\ntrained_pipeline.raw_data\n\ntrained_pipeline.raw_data\nDataFrame\n\n\n\ntrained_pipeline.path->trained_pipeline.raw_data\n\n\n\n\n\ntrained_pipeline->fit_model\n\n\n\n\n\ntraining_prediction\n\ntraining_prediction\nDataFrame\n\n\n\ntrained_pipeline->training_prediction\n\n\n\n\n\ntrained_pipeline.raw_data->trained_pipeline.transformed_data\n\n\n\n\n\n_trained_pipeline.model_params_inputs\n\nmodel_params\ndict\n\n\n\n_trained_pipeline.model_params_inputs->trained_pipeline.model_params\n\n\n\n\n\n_predicted_data.path_inputs\n\npredict_path\nstr\n\n\n\n_predicted_data.path_inputs->predicted_data.path\n\n\n\n\n\n_trained_pipeline.path_inputs\n\npath\nstr\n\n\n\n_trained_pipeline.path_inputs->trained_pipeline.path\n\n\n\n\n\nconfig\n\n\n\nconfig\n\n\n\ninput\n\ninput\n\n\n\nfunction\n\nfunction\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-07T06:57:34.959772Z", + "start_time": "2024-12-07T06:57:34.956204Z" + } + }, + "cell_type": "code", + "source": [ + "# this wont work because we don't actually have data...\n", + "# dr.execute([\"trained_pipeline\", \"predicted_data\"], \n", + "# inputs={\"path\": \"data.csv\", \"predict_path\": \"data.csv\"})" + ], + "id": "b3abca24b1a86329", + "outputs": [], + "execution_count": 7 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "1b3dba37a6c00d7c" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/model_examples/modular_example/pipeline.py b/examples/model_examples/modular_example/pipeline.py new file mode 100644 index 000000000..7ccecbf0d --- /dev/null +++ b/examples/model_examples/modular_example/pipeline.py @@ -0,0 +1,37 @@ +from typing import Any + +import features +import inference +import pandas as pd +import train + +from hamilton.function_modifiers import extract_fields, source, subdag + + +@extract_fields({"fit_model": Any, "training_prediction": pd.DataFrame}) +@subdag( + features, + train, + inference, + inputs={ + "path": source("path"), + "model_params": source("model_params"), + }, + config={ + "model": source("model"), # not strictly required but allows us to remap. + }, +) +def trained_pipeline(fit_model: Any, predicted_data: pd.DataFrame) -> dict: + return {"fit_model": fit_model, "training_prediction": predicted_data} + + +@subdag( + features, + inference, + inputs={ + "path": source("predict_path"), + "fit_model": source("fit_model"), + }, +) +def predicted_data(predicted_data: pd.DataFrame) -> pd.DataFrame: + return predicted_data diff --git a/examples/model_examples/modular_example/run.py b/examples/model_examples/modular_example/run.py new file mode 100644 index 000000000..4b388c943 --- /dev/null +++ b/examples/model_examples/modular_example/run.py @@ -0,0 +1,18 @@ +import pipeline + +from hamilton import driver + + +def run(): + dr = ( + driver.Builder() + .with_config({"model": "RandomForest", "model_params": {"n_estimators": 100}}) + .with_modules(pipeline) + .build() + ) + dr.display_all_functions("./my_dag.png") + # dr.execute(["trained_pipeline", "predicted_data"]) + + +if __name__ == "__main__": + run() diff --git a/examples/model_examples/modular_example/train.py b/examples/model_examples/modular_example/train.py new file mode 100644 index 000000000..9d0d93bea --- /dev/null +++ b/examples/model_examples/modular_example/train.py @@ -0,0 +1,32 @@ +from typing import Any + +import pandas as pd + +from hamilton.function_modifiers import config + + +@config.when(model="RandomForest") +def base_model__rf(model_params: dict) -> Any: + from sklearn.ensemble import RandomForestClassifier + + return RandomForestClassifier(**model_params) + + +@config.when(model="LogisticRegression") +def base_model__lr(model_params: dict) -> Any: + from sklearn.linear_model import LogisticRegression + + return LogisticRegression(**model_params) + + +@config.when(model="XGBoost") +def base_model__xgb(model_params: dict) -> Any: + from xgboost import XGBClassifier + + return XGBClassifier(**model_params) + + +def fit_model(transformed_data: pd.DataFrame, base_model: Any) -> Any: + """Fit a model to transformed data.""" + base_model.fit(transformed_data.drop("target", axis=1), transformed_data["target"]) + return base_model