From e5f77f67fc9440fe88a1abb4f27b4e0da199f88b Mon Sep 17 00:00:00 2001 From: Andrey Getmanov <91334765+andreygetmanov@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:08:19 +0400 Subject: [PATCH] Multimodal documentation (#1051) - added doc for multimodal tasks - fixed the links in notebooks.rst --- .../multimodal_pipeline_example.png | Bin 0 -> 34441 bytes docs/source/basics/multi_modal_tasks.rst | 87 ++++++++++++++++++ docs/source/examples/notebooks.rst | 7 +- .../advanced/multimodal_text_num_example.py | 25 ++--- 4 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 docs/source/basics/img_utilities/multimodal_pipeline_example.png diff --git a/docs/source/basics/img_utilities/multimodal_pipeline_example.png b/docs/source/basics/img_utilities/multimodal_pipeline_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c554872a917c2ce804d2fd56552614584337fb1c GIT binary patch literal 34441 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 section in our documentation. + +The ``fit()`` method begins the optimization and returns the resulting composite pipeline. + +.. code-block:: python + + model.fit(features=fit_data, target=fit_data.target) + +After the fitting is completed, you can look at the structure of the resulting pipeline. + +In text format: + +.. code-block:: python + + model.current_pipeline.print_structure() + +Output: + +.. code-block:: text + + Pipeline structure: + {'depth': 3, 'length': 4, 'nodes': [rf, data_source_table, tfidf, data_source_text/description]} + rf - {'n_jobs': -1, 'bootstrap': False, 'criterion': 'gini', 'max_features': 0.09622420420481334, 'min_samples_leaf': 1, 'min_samples_split': 8} + data_source_table - {} + tfidf - {'min_df': 0.026548403557843454, 'max_df': 0.9547108243944858, 'ngram_range': (1, 2)} + data_source_text/description - {} + +And in plot format: + +.. code-block:: python + + model.current_pipeline.show() + +|pipeline_structure| + +.. |pipeline_structure| image:: img_utilities/multimodal_pipeline_example.png + :width: 80% + + +The ``predict()`` method, which uses an already fitted pipeline, returns values for the target. + +.. code-block:: python + + prediction = model.predict(predict_data) + +The ``get_metrics()`` method estimates the quality of predictions according the selected metrics. + +.. code-block:: python + + prediction = model.get_metrics() + +Example of using FEDOT for multimodal data classification on Wine Reviews dataset: + +.. automodule:: examples.advanced.multimodal_text_num_example + :members: + :no-undoc-members: + +.. hint:: + + `Tutorial on using FEDOT for multimodal data classification `_ diff --git a/docs/source/examples/notebooks.rst b/docs/source/examples/notebooks.rst index 82c29b3956..ccd75aecbc 100644 --- a/docs/source/examples/notebooks.rst +++ b/docs/source/examples/notebooks.rst @@ -22,10 +22,13 @@ This repository contains following notebooks: * `Using FEDOT for hybrid modeling with custom model tuning `_ Notebook contains examples of custom model specification for Time Series Forecasting problem. +* `Using FEDOT for multimodal data classification `_ + A guide to FEDOT's functionality for multimodal data. + FEDOT can be used in cloud services, e.g. `VK Cloud's ML Platform `_. This `repository `_ contains examples of FEDOT usage with JupyterLab and MLflow: * `Amazon Employee Access Challenge - classification problem `_ * `Molhack AIRI - Regression problem `_ -* `Wine Reviews - Multimodal classification problem `_ -* `Sea level daily - Time Series Forecasting problem `_ +* `Wine Reviews - Multimodal classification problem `_ +* `Sea level daily - Time Series Forecasting problem `_ diff --git a/examples/advanced/multimodal_text_num_example.py b/examples/advanced/multimodal_text_num_example.py index cd4136c9f7..c36dcdcbaf 100644 --- a/examples/advanced/multimodal_text_num_example.py +++ b/examples/advanced/multimodal_text_num_example.py @@ -8,18 +8,19 @@ def run_multi_modal_example(file_path: str, visualization=False, with_tuning=True) -> float: """ - This is an example of FEDOT use on multimodal data. - The data is taken and adapted from Wine Reviews dataset (winemag-data_first150k): - https://www.kaggle.com/datasets/zynicide/wine-reviews - and contains information about wine country, region, price, etc. - Column that contains text features is 'description'. - Other columns contain numerical and categorical features. - The aim is to predict wine variety, so it's a classification task. - - :param file_path: path to the file with multimodal data - :param visualization: if True, then final pipeline will be visualised - - :return: F1 metrics of the model + Runs FEDOT on multimodal data from the `Wine Reviews dataset + `_. + The dataset contains information about wine country, region, price, etc. + with text features in the ``description`` column and other columns containing + numerical and categorical features. It is a classification task for wine variety prediction. + + Args: + file_path: path to the file with multimodal data. + visualization: if True, then final pipeline will be visualised. + with_tuning: if True, then pipeline will be tuned. + + Returns: + F1 metrics of the model. """ task = 'classification' path = Path(fedot_project_root(), file_path)