-
Notifications
You must be signed in to change notification settings - Fork 57
Multi-class Classification examples #28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
035d432
78f591d
f2e48f1
433c7ce
d621a40
66d95f7
a447f20
95a2a2b
fa00772
8db1e3e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| # Binary classification: Is this bottle of wine red or white? | ||
| This is the root directory for an example project for the | ||
| [MLflow Classification Recipe](https://mlflow.org/docs/latest/recipes.html#classification-recipe). | ||
| Follow the instructions [here](../README.md) to set up your environment first, | ||
| then use this directory to create a classifier and evaluate its performance, | ||
| all out of box! | ||
|
|
||
|
|
||
| In this [notebook](notebooks/jupyter.ipynb) ([the Databricks version](notebooks/databricks.py)), | ||
| we show how to build and evaluate a very simple classifier step by step, | ||
| following the best practices of machine learning engineering. | ||
| By the end of this example, | ||
| you will learn how to use MLflow Recipes to | ||
| - Ingest the raw source data. | ||
| - Splits the dataset into training/validation/test. | ||
| - Create an identity transformer and transform the dataset. | ||
| - Train a linear model (classifier) to tell if a bottle of wine is red. | ||
| - Evaluate the trained model, and improve it by iterating through the `transform` and `train` steps. | ||
| - Register the model for production inference. | ||
|
|
||
| All of these can be done with Jupyter notebook or on the Databricks environment. | ||
| Finally, challenge yourself to build a better model. Try the following: | ||
| - Find a better data source with more training data and more raw feature columns. | ||
| - Clean the dataset to make it less noisy. | ||
| - Find better feature transformations. | ||
| - Fine tune the hyperparameters of the model. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,151 @@ | ||
| sepal length,sepal width,petal length,petal width,class | ||
| 5.1,3.5,1.4,0.2,setosa | ||
| 4.9,3,1.4,0.2,setosa | ||
| 4.7,3.2,1.3,0.2,setosa | ||
| 4.6,3.1,1.5,0.2,setosa | ||
| 5,3.6,1.4,0.2,setosa | ||
| 5.4,3.9,1.7,0.4,setosa | ||
| 4.6,3.4,1.4,0.3,setosa | ||
| 5,3.4,1.5,0.2,setosa | ||
| 4.4,2.9,1.4,0.2,setosa | ||
| 4.9,3.1,1.5,0.1,setosa | ||
| 5.4,3.7,1.5,0.2,setosa | ||
| 4.8,3.4,1.6,0.2,setosa | ||
| 4.8,3,1.4,0.1,setosa | ||
| 4.3,3,1.1,0.1,setosa | ||
| 5.8,4,1.2,0.2,setosa | ||
| 5.7,4.4,1.5,0.4,setosa | ||
| 5.4,3.9,1.3,0.4,setosa | ||
| 5.1,3.5,1.4,0.3,setosa | ||
| 5.7,3.8,1.7,0.3,setosa | ||
| 5.1,3.8,1.5,0.3,setosa | ||
| 5.4,3.4,1.7,0.2,setosa | ||
| 5.1,3.7,1.5,0.4,setosa | ||
| 4.6,3.6,1,0.2,setosa | ||
| 5.1,3.3,1.7,0.5,setosa | ||
| 4.8,3.4,1.9,0.2,setosa | ||
| 5,3,1.6,0.2,setosa | ||
| 5,3.4,1.6,0.4,setosa | ||
| 5.2,3.5,1.5,0.2,setosa | ||
| 5.2,3.4,1.4,0.2,setosa | ||
| 4.7,3.2,1.6,0.2,setosa | ||
| 4.8,3.1,1.6,0.2,setosa | ||
| 5.4,3.4,1.5,0.4,setosa | ||
| 5.2,4.1,1.5,0.1,setosa | ||
| 5.5,4.2,1.4,0.2,setosa | ||
| 4.9,3.1,1.5,0.2,setosa | ||
| 5,3.2,1.2,0.2,setosa | ||
| 5.5,3.5,1.3,0.2,setosa | ||
| 4.9,3.6,1.4,0.1,setosa | ||
| 4.4,3,1.3,0.2,setosa | ||
| 5.1,3.4,1.5,0.2,setosa | ||
| 5,3.5,1.3,0.3,setosa | ||
| 4.5,2.3,1.3,0.3,setosa | ||
| 4.4,3.2,1.3,0.2,setosa | ||
| 5,3.5,1.6,0.6,setosa | ||
| 5.1,3.8,1.9,0.4,setosa | ||
| 4.8,3,1.4,0.3,setosa | ||
| 5.1,3.8,1.6,0.2,setosa | ||
| 4.6,3.2,1.4,0.2,setosa | ||
| 5.3,3.7,1.5,0.2,setosa | ||
| 5,3.3,1.4,0.2,setosa | ||
| 7,3.2,4.7,1.4,versicolor | ||
| 6.4,3.2,4.5,1.5,versicolor | ||
| 6.9,3.1,4.9,1.5,versicolor | ||
| 5.5,2.3,4,1.3,versicolor | ||
| 6.5,2.8,4.6,1.5,versicolor | ||
| 5.7,2.8,4.5,1.3,versicolor | ||
| 6.3,3.3,4.7,1.6,versicolor | ||
| 4.9,2.4,3.3,1,versicolor | ||
| 6.6,2.9,4.6,1.3,versicolor | ||
| 5.2,2.7,3.9,1.4,versicolor | ||
| 5,2,3.5,1,versicolor | ||
| 5.9,3,4.2,1.5,versicolor | ||
| 6,2.2,4,1,versicolor | ||
| 6.1,2.9,4.7,1.4,versicolor | ||
| 5.6,2.9,3.6,1.3,versicolor | ||
| 6.7,3.1,4.4,1.4,versicolor | ||
| 5.6,3,4.5,1.5,versicolor | ||
| 5.8,2.7,4.1,1,versicolor | ||
| 6.2,2.2,4.5,1.5,versicolor | ||
| 5.6,2.5,3.9,1.1,versicolor | ||
| 5.9,3.2,4.8,1.8,versicolor | ||
| 6.1,2.8,4,1.3,versicolor | ||
| 6.3,2.5,4.9,1.5,versicolor | ||
| 6.1,2.8,4.7,1.2,versicolor | ||
| 6.4,2.9,4.3,1.3,versicolor | ||
| 6.6,3,4.4,1.4,versicolor | ||
| 6.8,2.8,4.8,1.4,versicolor | ||
| 6.7,3,5,1.7,versicolor | ||
| 6,2.9,4.5,1.5,versicolor | ||
| 5.7,2.6,3.5,1,versicolor | ||
| 5.5,2.4,3.8,1.1,versicolor | ||
| 5.5,2.4,3.7,1,versicolor | ||
| 5.8,2.7,3.9,1.2,versicolor | ||
| 6,2.7,5.1,1.6,versicolor | ||
| 5.4,3,4.5,1.5,versicolor | ||
| 6,3.4,4.5,1.6,versicolor | ||
| 6.7,3.1,4.7,1.5,versicolor | ||
| 6.3,2.3,4.4,1.3,versicolor | ||
| 5.6,3,4.1,1.3,versicolor | ||
| 5.5,2.5,4,1.3,versicolor | ||
| 5.5,2.6,4.4,1.2,versicolor | ||
| 6.1,3,4.6,1.4,versicolor | ||
| 5.8,2.6,4,1.2,versicolor | ||
| 5,2.3,3.3,1,versicolor | ||
| 5.6,2.7,4.2,1.3,versicolor | ||
| 5.7,3,4.2,1.2,versicolor | ||
| 5.7,2.9,4.2,1.3,versicolor | ||
| 6.2,2.9,4.3,1.3,versicolor | ||
| 5.1,2.5,3,1.1,versicolor | ||
| 5.7,2.8,4.1,1.3,versicolor | ||
| 6.3,3.3,6,2.5,virginica | ||
| 5.8,2.7,5.1,1.9,virginica | ||
| 7.1,3,5.9,2.1,virginica | ||
| 6.3,2.9,5.6,1.8,virginica | ||
| 6.5,3,5.8,2.2,virginica | ||
| 7.6,3,6.6,2.1,virginica | ||
| 4.9,2.5,4.5,1.7,virginica | ||
| 7.3,2.9,6.3,1.8,virginica | ||
| 6.7,2.5,5.8,1.8,virginica | ||
| 7.2,3.6,6.1,2.5,virginica | ||
| 6.5,3.2,5.1,2,virginica | ||
| 6.4,2.7,5.3,1.9,virginica | ||
| 6.8,3,5.5,2.1,virginica | ||
| 5.7,2.5,5,2,virginica | ||
| 5.8,2.8,5.1,2.4,virginica | ||
| 6.4,3.2,5.3,2.3,virginica | ||
| 6.5,3,5.5,1.8,virginica | ||
| 7.7,3.8,6.7,2.2,virginica | ||
| 7.7,2.6,6.9,2.3,virginica | ||
| 6,2.2,5,1.5,virginica | ||
| 6.9,3.2,5.7,2.3,virginica | ||
| 5.6,2.8,4.9,2,virginica | ||
| 7.7,2.8,6.7,2,virginica | ||
| 6.3,2.7,4.9,1.8,virginica | ||
| 6.7,3.3,5.7,2.1,virginica | ||
| 7.2,3.2,6,1.8,virginica | ||
| 6.2,2.8,4.8,1.8,virginica | ||
| 6.1,3,4.9,1.8,virginica | ||
| 6.4,2.8,5.6,2.1,virginica | ||
| 7.2,3,5.8,1.6,virginica | ||
| 7.4,2.8,6.1,1.9,virginica | ||
| 7.9,3.8,6.4,2,virginica | ||
| 6.4,2.8,5.6,2.2,virginica | ||
| 6.3,2.8,5.1,1.5,virginica | ||
| 6.1,2.6,5.6,1.4,virginica | ||
| 7.7,3,6.1,2.3,virginica | ||
| 6.3,3.4,5.6,2.4,virginica | ||
| 6.4,3.1,5.5,1.8,virginica | ||
| 6,3,4.8,1.8,virginica | ||
| 6.9,3.1,5.4,2.1,virginica | ||
| 6.7,3.1,5.6,2.4,virginica | ||
| 6.9,3.1,5.1,2.3,virginica | ||
| 5.8,2.7,5.1,1.9,virginica | ||
| 6.8,3.2,5.9,2.3,virginica | ||
| 6.7,3.3,5.7,2.5,virginica | ||
| 6.7,3,5.2,2.3,virginica | ||
| 6.3,2.5,5,1.9,virginica | ||
| 6.5,3,5.2,2,virginica | ||
| 6.2,3.4,5.4,2.3,virginica | ||
| 5.9,3,5.1,1.8,virginica |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,99 @@ | ||
| # Databricks notebook source | ||
| # MAGIC %md | ||
| # MAGIC # MLflow Classification Recipe Databricks Notebook | ||
| # MAGIC This notebook runs the MLflow Classification Recipe on Databricks and inspects its results. | ||
| # MAGIC | ||
| # MAGIC For more information about the MLflow Classification Recipe, including usage examples, | ||
| # MAGIC see the [Classification Recipe overview documentation](https://mlflow.org/docs/latest/recipes.html#classification-recipe) | ||
| # MAGIC and the [Classification Recipe API documentation](https://mlflow.org/docs/latest/python_api/mlflow.recipes.html#module-mlflow.recipes.classification.v1.recipe). | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %pip install -r ../../requirements.txt | ||
| # MAGIC %pip install git+https://github.com/mshtelma/mlflow.git@multiclassclassification | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove this once MLFlow is released.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We just released MLflow 2.1.0 so we should be good to remove this now :) |
||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Start with a recipe: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| from mlflow.recipes import Recipe | ||
|
|
||
| r = Recipe(profile="databricks") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.clean() | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Inspect recipe DAG: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.inspect() | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Ingest the dataset: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("ingest") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Split the dataset into train, validation and test: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("split") | ||
|
Comment on lines
+49
to
+51
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we do a bit of EDA here before proceeding to split? |
||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("transform") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Train the model: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("train") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Evaluate the model: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("evaluate") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| # MAGIC %md ### Register the model: | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.run("register") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| r.inspect("train") | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| training_data = r.get_artifact("training_data") | ||
| training_data.describe() | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| training_data[:1].to_json() | ||
|
|
||
| # COMMAND ---------- | ||
|
|
||
| trained_model = r.get_artifact("model") | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we use the model to make a prediction on one hand-generated input example here? |
||
| print(trained_model) | ||
|
|
||
| # COMMAND ---------- | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[MLflow Classification Recipe] --> [MLflow Multi Class Classification Recipe]
What do you think?