{ "cells": [ { "cell_type": "markdown", "id": "81880ec8", "metadata": {}, "source": [ "\n", "

Building a Recommender using AutoMLx

\n", "

by the Oracle AutoMLx Team

\n", "\n", "***" ] }, { "cell_type": "markdown", "id": "ed4786de", "metadata": {}, "source": [ "Recommendation Demo Notebook.\n", "\n", "Copyright © 2025, Oracle and/or its affiliates.\n", "\n", "Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/" ] }, { "cell_type": "markdown", "id": "96fd4d93", "metadata": {}, "source": [ "# Overview of this Notebook\n", "\n", "In this notebook we will build a recommender using the Oracle AutoMLx tool for the Movielens 100k dataset to predict the next item that users will most likely watch, based on their ratings history.\n", "We explore the various options provided by the Oracle AutoMLx tool, allowing the user to control the AutoMLx training process. We finally evaluate the different models trained by AutoMLx. Depending on the machine running this notebook, it can take up to minutes.\n", "\n", "---\n", "## Prerequisites:\n", "\n", " - Experience level: Novice (Python and Machine Learning)\n", " - Professional experience: Some industry experience\n", "---\n", "\n", "## Business Use:\n", "\n", "Data analytics and modeling problems using Machine Learning (ML) are becoming popular and often rely on data science expertise to build accurate ML models. Such modeling tasks primarily involve the following steps:\n", "- Preprocess dataset (clean, impute, engineer features, normalize).\n", "- Pick an appropriate model for the given dataset and prediction task at hand.\n", "- Tune the chosen model’s hyperparameters for the given dataset.\n", "\n", "All of these steps are significantly time consuming and heavily rely on data scientist expertise. Unfortunately, to make this problem harder, the best feature subset, model, and hyperparameter choice widely varies with the dataset and the prediction task. Hence, there is no one-size-fits-all solution to achieve reasonably good model performance. Using a simple Python API, AutoML can quickly jump-start the datascience process with an accurately-tuned model and appropriate features for a given prediction task.\n", "\n", "## Table of Contents\n", "\n", "- Setup\n", "- Load the Movielens 100k dataset\n", " - Define the column types\n", " - Splitting the dataset\n", "- AutoML\n", " - Create an Instance of AutoMLx\n", " - Train a Model using AutoMLx\n", " - Generate recommendations \n", " - Analyze the AutoMLx optimization process \n", " - Algorithm Selection\n", " - Hyperparameter Tuning\n", " - Advanced AutoMLx Configuration\n", " - Use a custom validation set\n", " - Final evaluation of the best model\n", "\n", "\n", "## Setup\n", "\n", "Basic setup for the Notebook." ] }, { "cell_type": "code", "execution_count": 1, "id": "f21246b4", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:34:49.524994Z", "iopub.status.busy": "2025-04-25T10:34:49.524508Z", "iopub.status.idle": "2025-04-25T10:34:56.014433Z", "shell.execute_reply": "2025-04-25T10:34:56.013264Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:34:51,937] [automlx.backend] Overwriting ray session directory to /tmp/1frrc9a7/ray, which will be deleted at engine shutdown. If you wish to retain ray logs, provide _temp_dir in ray_setup dict of engine_opts when initializing the AutoMLx engine.\n" ] } ], "source": [ "\n", "\n", "import datetime\n", "import logging\n", "import os\n", "import time\n", "import urllib\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "from automlx import AutoRecommender, init\n", "\n", "# Settings for plots\n", "plt.rcParams[\"figure.figsize\"] = [10, 7]\n", "plt.rcParams[\"font.size\"] = 15\n", "\n", "# Silence unnecessary warnings\n", "logging.getLogger(\"sanerec.autotuning.parameter\").setLevel(logging.ERROR)\n", "\n", "# Initialize the parallelization engine of AutoMLx\n", "init(engine='ray', engine_opts={\"ray_setup\": {\"log_to_driver\": False}})" ] }, { "cell_type": "markdown", "id": "60de0bc8", "metadata": {}, "source": [ "\n", "## Load Movielens 100k data\n", "Movielens 100k dataset is one of the most common public datasets for movie recommendation. It contains 100k ratings from about 1k users on 1.6k movies, some information about user demographic, and additional movie characteristics. For more information about this dataset, you can visit the [Movielens website](https://grouplens.org/datasets/movielens/100k/).\n", "\n", "In this demo, we use the ratings to train a movie recommendation model, exploiting AutoMLx to find the best recommendation model and hyperparameters to use in terms of recommendation accuracy.\n", "Therefore, we start retrieving and loading the ratings data of the Movielens 100k dataset.\n", "To make this notebook lighter and quicker, we also subsample the ratings in the dataset, keeping only 50%." ] }, { "cell_type": "code", "execution_count": 2, "id": "10d71715", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:34:56.019370Z", "iopub.status.busy": "2025-04-25T10:34:56.018522Z", "iopub.status.idle": "2025-04-25T10:35:01.532354Z", "shell.execute_reply": "2025-04-25T10:35:01.531578Z" }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ "\n", "\n", "get_ipython().system(' wget https://files.grouplens.org/datasets/movielens/ml-100k/u.data --no-check-certificate -q -O ./ml100k_interactions.tsv')" ] }, { "cell_type": "code", "execution_count": 3, "id": "d5f67d34", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:01.534915Z", "iopub.status.busy": "2025-04-25T10:35:01.534278Z", "iopub.status.idle": "2025-04-25T10:35:01.580798Z", "shell.execute_reply": "2025-04-25T10:35:01.580270Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idmovie_idratingtimestamp
436605081855883777430
872785187425876823804
14317178285882826806
819328992914884122279
953211151174881171009
\n", "
" ], "text/plain": [ " user_id movie_id rating timestamp\n", "43660 508 185 5 883777430\n", "87278 518 742 5 876823804\n", "14317 178 28 5 882826806\n", "81932 899 291 4 884122279\n", "95321 115 117 4 881171009" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "\n", "dataset = pd.read_csv(\n", " \"./ml100k_interactions.tsv\",\n", " sep=\"\\t\",\n", " names=[\"user_id\", \"movie_id\", \"rating\", \"timestamp\"],\n", ").sample(frac=0.5, random_state=1)\n", "\n", "dataset.head(5)" ] }, { "cell_type": "markdown", "id": "ff0c9b09", "metadata": {}, "source": [ "In order to be used for the recommendation task, the data must have a timestamp column that is used to infer the temporal order of the samples. We also require to set the timestamp column as index of the dataframes used in our AutoML pipelines.\n", "\n", "Movielens contains a `timestamp` column that contains the time when a rating was given, so we set it as index of our dataframe." ] }, { "cell_type": "code", "execution_count": 4, "id": "812d547d", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:01.582716Z", "iopub.status.busy": "2025-04-25T10:35:01.582278Z", "iopub.status.idle": "2025-04-25T10:35:01.588223Z", "shell.execute_reply": "2025-04-25T10:35:01.587772Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idmovie_idrating
timestamp
8837774305081855
8768238045187425
882826806178285
8841222798992914
8811710091151174
\n", "
" ], "text/plain": [ " user_id movie_id rating\n", "timestamp \n", "883777430 508 185 5\n", "876823804 518 742 5\n", "882826806 178 28 5\n", "884122279 899 291 4\n", "881171009 115 117 4" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "\n", "dataset = dataset.set_index(\"timestamp\")\n", "dataset.head(5)" ] }, { "cell_type": "markdown", "id": "b963f4dc", "metadata": {}, "source": [ "\n", "### Define types of columns in the dataframe\n", "\n", "The recommendation task requires to define the two main entities involved in the recommendation:\n", "- the `recommendation`, which represents the entity type that is going to be recommended;\n", "- the `recommendation_subject`, which represents the entity type that receives the recommendation.\n", "\n", "For this reason, AutoML requires to indicate what are the columns in the dataset that refer to these two concepts, and, in particular, the two columns that contain their unique identifiers.\n", "\n", "In our demo we want to recommend movies (`recommendation`), identified by the `movie_id` column, to users (`recommendation_subject`), identified by the `user_id` column. We declare this binding in a python dictionary that we will reuse throughout the demo." ] }, { "cell_type": "code", "execution_count": 5, "id": "cfc2901b", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:01.590086Z", "iopub.status.busy": "2025-04-25T10:35:01.589606Z", "iopub.status.idle": "2025-04-25T10:35:01.592388Z", "shell.execute_reply": "2025-04-25T10:35:01.591922Z" } }, "outputs": [], "source": [ "\n", "\n", "col_types = {\"movie_id\": \"recommendation\", \"user_id\": \"recommendation_subject\"}" ] }, { "cell_type": "markdown", "id": "b46f96e5", "metadata": {}, "source": [ "\n", "## Splitting the dataset\n", "\n", "We split the dataset into training and test datasets using a leave-last-out technique.\n", "The training set will be used to create a Machine Learning model using Oracle AutoMLx, and the test set will be used to evaluate the model's performance on unseen data.\n", "\n", "The leave-last-out splitting technique consists in keeping in the test set only the last data sample, as determined by its timestamp, for each `recommendation_subject` (user in this case). All the other samples form the training set. This corresponds to the common next item recommendation use case, where given the history of all the past data concerning a `recommendation_subject` in the training set, we want to predict what should be recommended next to the same subject, and check if it corresponds to the actual sample in the test set." ] }, { "cell_type": "code", "execution_count": 6, "id": "278bbc69", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:01.594188Z", "iopub.status.busy": "2025-04-25T10:35:01.593720Z", "iopub.status.idle": "2025-04-25T10:35:06.946927Z", "shell.execute_reply": "2025-04-25T10:35:06.946304Z" } }, "outputs": [], "source": [ "\n", "\n", "training_data, test_data = AutoRecommender.train_test_split(data=dataset, col_types=col_types)" ] }, { "cell_type": "markdown", "id": "16104052", "metadata": {}, "source": [ "\n", "# AutoML\n", "\n", "\n", "## Create an instance of Oracle AutoMLx\n", "\n", "The Oracle AutoMLx solution provides a pipeline that automatically finds a tuned model given a prediction task and a training dataset. In particular, it allows finding a tuned model for any supervised prediction task, for example, classification or regression where the target can be binary, categorical or real-valued.\n", "\n", "In this demo we want a model that performs a recommendation task, so we create a pipeline of type `AutoRecommender`, and we configure it with default parameters. You can find the complete list of all the available parameters and their meaning in our documentation." ] }, { "cell_type": "code", "execution_count": 7, "id": "c041b433", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:06.949707Z", "iopub.status.busy": "2025-04-25T10:35:06.948792Z", "iopub.status.idle": "2025-04-25T10:35:06.952588Z", "shell.execute_reply": "2025-04-25T10:35:06.952107Z" } }, "outputs": [], "source": [ "\n", "\n", "automl_pipeline = AutoRecommender().configure()" ] }, { "cell_type": "markdown", "id": "0974f27a", "metadata": {}, "source": [ "\n", "## Train a model using AutoMLx\n", "\n", "The training data is passed to the `fit()` function which executes the model selection and hyperparameter tuning steps." ] }, { "cell_type": "code", "execution_count": 8, "id": "8b379a85", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:35:06.954439Z", "iopub.status.busy": "2025-04-25T10:35:06.953936Z", "iopub.status.idle": "2025-04-25T10:36:14.308745Z", "shell.execute_reply": "2025-04-25T10:36:14.308200Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:07,292] [automlx.interface] Dataset shape: (49055,3)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:07,362] [automlx.process] Running Model Generation\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:07,402] [automlx.process] Model Generation completed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:07,446] [automlx.model_selection] Running Model Selection\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:56,451] [automlx.model_selection] Model Selection completed - Took 49.005 sec - Selected models: [['ItemKNNRecommender']]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:35:56,513] [automlx.trials] Running Model Tuning for ['ItemKNNRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:12,913] [automlx.trials] Best parameters for ItemKNNRecommender: {'n_recommendations': 10, 'num_of_neighbors': 506, 'bias': 0.0001, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:12,915] [automlx.trials] Model Tuning completed. Took: 16.401 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:13,337] [automlx.interface] Re-fitting pipeline\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:13,344] [automlx.final_fit] Skipping updating parameter seed, already fixed by FinalFit_19cf1d36-6\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:14,240] [automlx.interface] AutoMLx completed.\n" ] } ], "source": [ "\n", "\n", "automl_pipeline = automl_pipeline.fit(data=training_data, col_types=col_types)" ] }, { "cell_type": "markdown", "id": "4a4d8214", "metadata": {}, "source": [ "\n", "## Generate recommendations\n", "\n", "Once the AutoML pipeline is completed, we predict 5 recommendations for a random user in the dataset." ] }, { "cell_type": "code", "execution_count": 9, "id": "e31a99f9", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.310959Z", "iopub.status.busy": "2025-04-25T10:36:14.310411Z", "iopub.status.idle": "2025-04-25T10:36:14.371178Z", "shell.execute_reply": "2025-04-25T10:36:14.370685Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idmovie_idscore
062833015.370814
162828615.029380
262825814.119169
362827213.703196
462831313.564656
\n", "
" ], "text/plain": [ " user_id movie_id score\n", "0 628 330 15.370814\n", "1 628 286 15.029380\n", "2 628 258 14.119169\n", "3 628 272 13.703196\n", "4 628 313 13.564656" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "\n", "recommendation_subjects = test_data.sample(1)[['user_id']]\n", "automl_pipeline.predict(subjects=recommendation_subjects, n_recommendations=5)" ] }, { "cell_type": "markdown", "id": "801fc125", "metadata": {}, "source": [ "\n", "## Analyze the AutoMLx optimization process\n", "\n", "During the Oracle AutoMLx process for recommendation, a summary of the optimization process is logged, containing:\n", "- Information about the training data.\n", "- Information about the AutoMLx Pipeline, such as:\n", " - Selected algorithm that was the best choice for this data;\n", " - Selected hyperparameters for the selected algorithm.\n", "\n", "AutoMLx provides a `print_summary` API to output all the different trials performed." ] }, { "cell_type": "code", "execution_count": 10, "id": "d7fa1f8f", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.373161Z", "iopub.status.busy": "2025-04-25T10:36:14.372643Z", "iopub.status.idle": "2025-04-25T10:36:14.387085Z", "shell.execute_reply": "2025-04-25T10:36:14.386548Z" } }, "outputs": [ { "data": { "text/html": [ "
General Summary
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
None
None
ManualSplit(Shuffle=False, Seed=7)
SanerecMetric
ItemKNNRecommender
{'n_recommendations': 10, 'num_of_neighbors': 506, 'bias': 0.0001, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}
25.2.1
3.9.21 (main, Dec 11 2024, 16:24:11) \\n[GCC 11.2.0]
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trials Summary
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Step# Samples# FeaturesAlgorithmHyperparametersScore (SanerecMetric)All MetricsRuntime (Seconds)Memory Usage (GB)Finished
Model Selection481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 100, 'bias': 25, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0882{'hr': 0.08820403825717323}1.03190.7063Fri Apr 25 03:35:20 2025
Model Selection481142AlsRecommender{'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.01, 'cache_users_states': True}0.0691{'hr': 0.06907545164718384}4.58450.7055Fri Apr 25 03:35:19 2025
Model Selection481142TRexxRecommender{'n_recommendations': 10, 'embedding_dim': 32, 'sequence_length': 5, 'num_sampled': 100, 'dropout_rate': 0.2, 'num_blocks': 2, 'num_head': 4, 'l2_reg_embedding': 1e-06, 'dnn_activation': 'tanh', 'optimizer_name': 'lazyadam', 'optimizer_learning_rate': 0.01, 'future_blinding': False, 'embeddings_on_cpu': False, 'cache_users_states': False, 'negative_sampling_method': CandidateSamplingMethod.UNIFORM_CANDIDATE_SAMPLING, 'epochs': 10, 'batch_size': 512, 'verbose': 1, 'augment_data': True, 'early_stopping_patience': -1}0.0531{'hr': 0.053134962805526036}35.10171.1860Fri Apr 25 03:35:56 2025
Model Selection481142BprRecommender{'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.01, 'cache_users_states': True}0.0372{'hr': 0.03719447396386823}0.41480.7046Fri Apr 25 03:35:21 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 505, 'bias': 0.0001, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0999{'hr': 0.09989373007438895}1.39550.6848Fri Apr 25 03:36:10 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 506, 'bias': 0.0001, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0999{'hr': 0.09989373007438895}1.09100.6842Fri Apr 25 03:36:12 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 506, 'bias': 0.0001, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0999{'hr': 0.09989373007438895}1.35820.6869Fri Apr 25 03:36:09 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 28.25660795027468, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0956{'hr': 0.09564293304994687}1.44620.6762Fri Apr 25 03:36:08 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 28.26160794927468, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0956{'hr': 0.09564293304994687}1.13240.6785Fri Apr 25 03:36:10 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 28.26160794927468, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0956{'hr': 0.09564293304994687}1.35470.6758Fri Apr 25 03:36:08 2025
..............................
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.084{'hr': 0.08395324123273114}1.31910.6742Fri Apr 25 03:36:08 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 21, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.084{'hr': 0.08395324123273114}1.33250.6755Fri Apr 25 03:36:08 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 505, 'bias': 25, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0829{'hr': 0.08289054197662062}1.13551.1758Fri Apr 25 03:36:01 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 506, 'bias': 25, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0829{'hr': 0.08289054197662062}1.39341.1758Fri Apr 25 03:36:02 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 752, 'bias': 25, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0818{'hr': 0.0818278427205101}1.42941.1812Fri Apr 25 03:36:05 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 753, 'bias': 25, 'hist_len': 20, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0818{'hr': 0.0818278427205101}1.25251.1812Fri Apr 25 03:36:04 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 132, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0797{'hr': 0.07970244420828905}1.44490.6758Fri Apr 25 03:36:09 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 133, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0797{'hr': 0.07970244420828905}1.30440.6773Fri Apr 25 03:36:08 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 255, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0797{'hr': 0.07970244420828905}1.44710.6760Fri Apr 25 03:36:09 2025
Model Tuning481142ItemKNNRecommender{'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.0001, 'hist_len': 256, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}0.0797{'hr': 0.07970244420828905}1.48310.6730Fri Apr 25 03:36:09 2025
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "\n", "automl_pipeline.print_summary()" ] }, { "cell_type": "markdown", "id": "30691ab3", "metadata": {}, "source": [ "We also provide the capability to visualize the results of each stage of the AutoMLx pipeline.\n", "\n", "\n", "### Algorithm Selection\n", "\n", "The plot below shows the scores predicted by Algorithm Selection for each algorithm. The horizontal line shows the average score across all algorithms. Algorithms below the line are colored turquoise, whereas those with a score higher than the mean are colored teal. The selected algorithm is in orange." ] }, { "cell_type": "code", "execution_count": 11, "id": "faccd1b4", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.388999Z", "iopub.status.busy": "2025-04-25T10:36:14.388508Z", "iopub.status.idle": "2025-04-25T10:36:14.578365Z", "shell.execute_reply": "2025-04-25T10:36:14.577825Z" } }, "outputs": [ { "data": { "image/png": "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mDn06NGj2V6LuH///hxnec3NX6+Hy85fj+LlNPkLAHPjnQugWMsoXl27ds11UpAMvXr1kiR98sknunnzZp7jLRaLpkyZIunWtXIDBgzINInEwoUL9eyzz6ps2bLZrl+yZElrUVu2bJkGDx6sP//8U9KtySXmzZtnnQK/d+/eatSoUZ6ZCqpMmTLWiSMWL16cr9f9TzR37lxVrVpVw4YN0+bNm5WQkGBdlpCQoC+//FItWrSwlusXXngh0/r9+vXTAw88IMMw1L17d02fPt36u5ZuTbG/ZcsWDRkyREFBQfnOVaZMGb311luSpC+++EIPP/ywdu/ebT1qlZ6ersOHD+uNN95Q3bp19e2332Za/5VXXpGvr68uXryoli1b6ssvv9T169cl3Tp6FhkZqf/+97/69NNPM6137733SrpVQHM6ZTc3TZo00WOPPSZJGjZsmObPn28txOfOndN//vMf6zVb06ZNk7u7e4Gf45+kY8eOcnJy0qVLl9S3b1/rzzQ1NVVffvmlOnbsmOsEKzn54osv1LJlS73//vs6fvy49fG0tDRt2LBBY8eOlSQ1b948x//OADA3ChuAYis8PFy//fabpP9fxPKSMe7PP//Ud999l691+vTpYy1Vn376qQICAuTj4yMvLy8988wzat68uQYPHixJ2e60Dh06VKNGjZJ062hapUqV5OPjI29vb40YMUI3btxQ27Zt9eGHH+YrT2Fk5Hv77bdVunRpVa1aVdWqVbMeRXEEJUqU0MWLFzV//nx16NBB3t7e8vLykqenp7y9vdW7d2/9+uuv1nvaDRkyJNP6zs7OWrFihR555BGlpqZqwoQJqly5sry9vVW2bFl5enqqXbt2WrBgQYFmAZRuzVL67rvvytXVVevXr1ezZs3k4eEhX19fubu765577tGLL76o33//PctEIwEBAdqwYYMqV66sU6dOqXfv3vL09JSvr688PDz0r3/9S6+//nqW0+UGDBggd3d3RUVFqWrVqqpYsaKqVaumatWq5Xva+YULF6p169ZKTU3VsGHD5O3tLR8fH/n7+1uPur344ovWvy9HVrNmTf33v/+VJK1cuVIBAQEqU6aMSpcurd69e6t06dKaN29egbdrGIZ27typwYMHq0aNGnJ3d5evr69cXV3VqVMnnT59Wv7+/lq0aNGdfkkAbITCBqDYyji65u3trY4d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86YtYgE24+SU/xOJLBaL0tLSijANYF8xMTF69dVX9emnn+qZZ56xfoiX03WeVatWtXFC5ITCBocWFBSk9PR0nTp1StKtf5DLly+f46erx44ds3VEoMhUq1Ytz6L2VydOnCjCNIDthYWFFWg8EzLAkTk5OclisfAh3j8QhQ0OrSCfrkpSenp6ESUBAACwnzZt2hToQ7wtW7YUYRoUBIUNAAAAAEzKxd4BAAC2kZKSokuXLsnNzU0+Pj72jgPYzMWLF7V06VLt2bNHcXFxat++vcaMGSNJOnTokI4dO6YHHnhAHh4edk4KAFkxrT8AOLgPPvhADRs2VKlSpRQQEKAXX3zRumzlypXq0aOHoqKi7JgQKDpfffWVgoKCNHr0aC1btkybN2/OdKuLM2fOqHv37lq5cqUdUwK298cff2jXrl06evSovaMgDxQ2FAsbN25U9+7dVblyZbm5uenpp5+2LtuwYYNGjx6ts2fP2jEhcOelpaWpe/fueu6553T48GHdfffd+vtZ8PXr19fq1au1fPlyO6UEis6uXbvUp08fubi46I033tCePXuyvAfat28vb29vChuKhZSUFL388svy9fVVnTp1dP/992vmzJnW5UuXLlVwcLD2799vv5DIgsIGhzdixAg99NBD+uabb3T16lXduHEj0z/YlSpV0ltvvcUOKxzO/Pnz9c033+ihhx5SdHS0fv311yxjatSoobvuukvr16+3Q0KgaL366qtycnLSpk2bNHLkSDVu3DjLGGdnZwUHBysyMtIOCQHbuX79utq0aaPXXntNrq6u6ty5c5YPMNq1a6cDBw7oyy+/tFNKZIfCBof2ySef6O2331ajRo0UERGhhISELGPq1aunKlWqaO3atXZICBSdJUuWqEKFClq+fLkqVKiQ47h77rlH0dHRNkwG2MbOnTvVvHlzBQcH5zquYsWKio2NtVEqwD5mzZql3bt3KzQ0VMePH892v8ff31/33HOPNm/ebIeEyAmFDQ7t3XffVZkyZfTdd9+pQYMGOY6rV6+ejh8/brtggA0cOXJETZs2ValSpXIdV6pUKV24cMFGqQDbSUpKkp+fX57jLl++bIM0gH0tX75cVatW1bvvvpvjzbIlqXbt2tb718IcKGxwaJGRkWrRokWe/2B7e3vrzz//tFEqwDZKlCih5OTkPMfFxMTI09PTBokA26pcubIOHTqU6xjDMBQZGanq1avbKBVgHydOnFDjxo3l4pL7JPGurq58iGEyFDY4vPzcJPLs2bMqWbKkDdIAtlO3bl3t27dPV69ezXHM+fPntX///lyPQAP/VJ06ddKRI0f0xRdf5Djmo48+0qlTp/Twww/bMBlgeyVLlsxXETtx4oTKli1rg0TILwobHFrNmjUVERGhGzdu5Djm6tWr2r9/v+rWrWvDZEDR+/e//62LFy9q8ODBSk1NzbI8LS1NQ4YMUVJSkgYMGGCHhEDRGjt2rLy9vdW/f3+99NJLCg8PlyRdu3ZNv/zyiyZOnKhhw4bJz89Po0aNsnNaoGg1aNBAe/fuzfUU+BMnTuiXX37RfffdZ8NkyAuFDQ6tV69eio2N1dixY3McM27cOMXHx+uJJ56wYTKg6A0aNEht2rTRsmXLVLt2bQ0ePFiSdODAAY0YMUK1atXSihUr1KFDB/Xt29fOaYE7LyAgQN999518fX01e/ZstWzZUhaLRV9//bUaN26s6dOnq0yZMlqzZo3Kly9v77hAkfrPf/6jq1ev6sknn1RcXFyW5VeuXFFoaKhu3LihQYMG2SEhcmIx/j6fJ+BArl+/rmbNmikyMlJNmjRR165d9fLLLyskJETdunXTqlWrtH37dgUHB2vnzp1ydXW1d2TgjkpOTtYLL7ygjz76KMuRZmdnZ4WGhmru3Lm5XoAO/NNdvXpVCxcu1KZNm3Ty5Emlp6crICBAHTp00LPPPitvb297RwRsok+fPvriiy9UunRptWjRQhs3blTNmjVVp04dhYWFKSEhQf3799eSJUvsHRV/QWGDw7tw4YIGDhyo9evXy2KxZLnnSIcOHbR06dJ8zSQG/FNduHBBW7duzbSz2rZtW/n7+9s7GgDARgzD0Ouvv67Zs2dnOcrm7e2tMWPGaOzYsfm6/h+2Q2FDsXHgwAFt3Lgxy6erTZo0sXc0AAAAm0lLS1NERESmfaL77ruPM41MisIGAAAcQkxMzG2tX7Vq1TuUBADuHAobADiIqVOnFnpdi8WiCRMm3ME0gO05OTkV+lQui8Wimzdv3uFEAHD7KGxwKJ988sltrd+/f/87lASwvYyd1b//Z/2vO7AZy/7+mMViUVpamm2CAkWkTZs2WQpbSkqKdTr/smXLKjAwUNKto3GXLl2SxWJR06ZN5ebmpi1bttg8M1BUQkNDC72uxWLRwoUL72Aa3A4KGxxKYT9dZYcVjuDjjz/O8tiuXbv0wQcfKCAgQD179lS1atUkSdHR0VqxYoViYmI0aNAgNW/enHuxweFcvXpV7dq1U0pKimbPnq0HH3ww0/KNGzdqzJgxKlGihH788Ud5enraKSlw5zk5ZX/3roz9pJw+3GOfyHwobHAokydPzlLYjh07pqVLl8rDw0MdO3bMtMO6ceNGXbt2Tf369VONGjU0adIkO6QGisaePXvUunVrjRo1SlOnTpWLi0um5WlpaZo4caLeeOMNhYWFqWnTpnZKChSNkSNH6pNPPtHRo0fl6+ub7Zi4uDjVqlVL/fr107x582ycECg6YWFhWR776quvtGDBAjVt2lRPPvlkpn2iZcuWKTw8XEOGDFHPnj3VunVrGydGTihscGh//PGHmjRpoi5duuitt96Sj49PpuWXL1/WyJEjtXbtWoWHh6tWrVp2SgrceZ06ddLp06cVGRmZ67h7771XlStX1oYNG2yUDLCNqlWrqkmTJvr6669zHdezZ0/t3r1bp06dslEywPY2bNighx9+WPPnz9fgwYOzHfP+++9ryJAh+vbbb9WpUycbJ0ROKGxwaD179lRERIT++OMPOTs7Zzvm5s2bqlWrlho2bKgVK1bYOCFQdMqWLavOnTvrs88+y3Vc3759tW7dOl2+fNlGyQDbKFmypB588EGtXr0613HdunXThg0bdP36ddsEA+ygVatWSk5O1p49e3Id17RpU5UoUULbt2+3UTLkJfuTWwEHsXXrVjVr1izHsiZJLi4uatasWbanDgD/ZGlpaTp+/Hie444fP861CnBI1apV0w8//JDrkbNTp07phx9+sJ4aBjiq/fv3q2bNmnmOu+uuu3Tw4EEbJEJ+Udjg0K5fv67Y2Ng8x507d07Jyck2SATYTpMmTbRnz55cZ0/95JNPtHv3bm4gD4f09NNP69q1a2rdurU++eSTTP+dT0lJ0aeffqrWrVsrKSlJTz/9tB2TAkXPxcUlz1PkJSkyMjLLNc+wL06JhENr3ry5fv75Z33//fd64IEHsh3zww8/6MEHH1STJk20c+dOGycEis6OHTvUtm1bpaWlqXXr1urdu7d1SvPo6Gh9+eWX2rp1q5ydnbVlyxa1bNnSzomBOys9PV19+/bV8uXLrRNS+fn5SZIuXLgg6daMeL169dKyZctynFUPcATdunXT2rVrNWnSJE2YMCHbWbWnTZumSZMm6dFHH83zVGLYDoUNDm3NmjXq1q2bXF1d1adPn2x3WD/77DPduHFDq1at0qOPPmrnxMCd9e233yo0NFRxcXFZ/nE2DEPlypXTwoUL+duHQ1u+fLkWLFig3bt3KzU1VZLk6uqqpk2b6rnnntMTTzxh54RA0fvtt9/UrFkzXbt2TUFBQerZs2emfaIVK1bo2LFjKlWqlHbt2qW6devaOTEyUNjg8N577z2NHj1aycnJ2e6wurm56Y033tDzzz9vp4RA0UpMTNTXX3+tbdu26ezZs5KkSpUqKSQkRL169VLp0qXtnBCwjZs3b+rixYuSpHLlynHaF4qdvXv3asCAATp8+LCkrPdkq1OnjpYsWcJp8iZDYUOxEBMTo4ULF2r79u1ZdlifeuopLjYHAADFxtatW7P9EK9NmzbZnioJ+6KwAQAAAIBJcS4AADi4pKQk7d27V7GxsUpJSclxXP/+/W2YCrCN3377TbNmzdJPP/2k2NhY6zVsf2exWHTz5k0bpwOAvHGEDcVGTExMnjusrVq1smEioOhNnDhRb775ppKSknIcYxiGLBYL92KDw9m1a5ceeOAB6w2xfXx85OnpmeP4EydO2CoaYDcnTpzQtm3bct0nslgsmjBhgo2TIScUNji8RYsWadq0aYqJiclzLDuscCSzZs3S2LFj5ezsrIceeki1atXKdWd10qRJNkwHFL02bdrop59+0siRIzV+/Hj5+PjYOxJgN6mpqXrmmWf02WefSfr/E41khw/xzIVTIuHQFi9erGeeeUaSdO+99+a5wwo4kg8//FAlS5bUtm3bFBwcbO84gM3t3btXDRo00Jw5c+wdBbC7iRMnaunSpSpTpoz69evHPtE/CIUNDm3OnDlycXHR119/zX2mUOycOnVK7dq1o6yh2HJ1dVWdOnXsHQMwhc8//1xlypTRL7/8Yr3/Gv4ZnOwdAChKf/zxh1q1akVZQ7FUsWJFlSpVyt4xALu5//779dtvv9k7BmAK58+fV0hICGXtH4jCBofm4+MjX19fe8cA7OKJJ57Q1q1bde3aNXtHAezi1VdfVVRUlN555x17RwHsjqL2z8WkI3Bozz33nL799lsdP35cJUqUsHccwKaSk5PVsWNHlShRQu+//77uuusue0cCbOqTTz7Rzz//rAULFuj+++9Xhw4dFBAQICen7D+v5tYWcGSvvfaa9UMMPz8/e8dBAVDY4NAuX76s5s2bq3Hjxnr77bdVtmxZe0cCbKZdu3ZKTU3Vrl275OTkpMDAwBx3Vi0Wi3744Qc7pASKjpOTkywWS6bZ8CwWS5Zx3NoCxUF6err69OmjyMhIvf3222rTpk227weYD4UNDi00NFRXrlzRN998Iy8vLzVq1CjXHdaFCxfaISVQNHI6ipAddlbhiCZPnlygHVJubQFHFhQUJEmKjo6WJJUoUUIVK1bMcZ/o2LFjNs2HnFHY4NDYYUVxlvGPcn5xfQMAOK6C7BNJt47IwRyY1h8ObcuWLfaOANgNBQwAkIEC9s/FETYAAODwDhw4oD179iguLk5169a13u4lJSVFKSkp8vLysnNCAMge0/oDgIP77bffNGrUKLVs2VK1a9fWmDFjrMt27typefPm6dKlS3ZMCBSdI0eOqEWLFgoODtbgwYM1fvx4rV692rr8888/V9myZfX999/bLyQA5ILChmLh4sWLmjt3rvr27asHH3xQs2bNsi47dOiQ1qxZo6SkJDsmBIrGnDlz1KBBA82dO1e7du1SVFSU4uLiMo0ZNWqUvvrqKzslBIrOqVOn1KpVK4WHh6tLly6aNWuW/n5i0eOPPy5XV1etWLHCTikB29q4caO6d++uypUry83NTU8//bR12YYNGzR69GidPXvWjgnxdxQ2OLyvvvpKQUFBGj16tJYtW6bNmzfr999/ty4/c+aMunfvrpUrV9oxJXDnfffdd3rxxRdVpUoVrVy5UufPn8+ys9qiRQv5+fnpm2++sVNKoOhMnTpVcXFx+uijj7R69Wq98MILWcaUKlVKDRo00O7du+2QELCtESNG6KGHHtI333yjq1ev6saNG5n+XahUqZLeeustLV++3I4p8XcUNji0Xbt2qU+fPnJxcdEbb7yhPXv2ZNlhbd++vby9vSlscDhz5sxRqVKltGnTJnXr1k2+vr7ZjmvQoIGOHDli43RA0fv+++9Vr149hYaG5jquWrVqOnPmjI1SAfbxySef6O2331ajRo0UERGhhISELGPq1aunKlWqaO3atXZIiJwwSyQc2quvvionJydt2rRJwcHB2Y5xdnZWcHCwIiMjbZwOKFr79u1Ts2bNrPfeyYmvr6+2bdtmo1SA7Zw/f14tW7bMc9yNGzc4LR4O791331WZMmX03Xffyc/PL8dx9erV06+//mrDZMgLR9jg0Hbu3KnmzZvnWNYyVKxYUbGxsTZKBdhGamqqPD098xx3/vx5ubjw+R0cT7ly5RQTE5PnuKNHj6pSpUo2SATYT2RkpPU0+Nx4e3vrzz//tFEq5AeFDQ4tKSkpz/8wSdLly5dtkAawrerVq+vAgQO5jklNTdXBgwdVq1YtG6UCbKdly5b6+eeftX///hzHhIWFKTIyUm3atLFZLsBeLBZLnmPOnj2rkiVL2iAN8ovCBodWuXJlHTp0KNcxhmEoMjJS1atXt1EqwDYeffRRnTx5UnPmzMlxzKxZs3ThwgX16NHDhskA23jxxRdlGIa6du2q9evXKy0tLdPyH3/8Uf/+97/l4uKikSNH2ickYCM1a9ZURESEbty4keOYq1evav/+/apbt64NkyEvFDY4tE6dOunIkSP64osvchzz0Ucf6dSpU3r44YdtmAwoemPGjFHlypX13//+V71797a+D/7880+tWrVK/fv316RJk1S9enUNHTrUzmmBO69p06aaN2+ezp49q0ceeURlypSRxWLRihUrVLZsWXXo0EFnz57V/PnzVa9ePXvHBYpUr169FBsbq7Fjx+Y4Zty4cYqPj9cTTzxhw2TIi8X4+5R5gAM5ffq06tWrp8TERI0aNUrdu3dXixYt1KtXL40dO1arVq3SrFmz5O3trV9//VXly5e3d2Tgjjp69Kh69uypyMhIWSwWGYZhPSXGMAzdc889Wr16te666y47JwWKTnh4uGbOnKkff/xRiYmJkiR3d3e1adNG//vf//I1MQnwT3f9+nU1a9ZMkZGRatKkibp27aqXX35ZISEh6tatm1atWqXt27crODhYO3fulKurq70j4/9Q2ODwdu3apccee0znzp3Lcu62YRgqX768vvnmGzVt2tROCYGilZ6errVr12rjxo06efKk0tPTFRAQoA4dOuixxx6Ts7OzvSMCNmEYhuLi4pSeni5fX1/+9lHsXLhwQQMHDtT69eutH+L9VYcOHbR06dJ8Xf8P26GwoVi4evWqFi5cqE2bNmXZYX322Wfl7e1t74gAAAA2ceDAgWw/xGvSpIm9oyEbFDYAAAAAMCluvAMADi4pKUl79+5VbGysUlJSchzXv39/G6YCbOPQoUN6/fXXFRYWptjYWKWmpmY7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GRkZGXpMRkRERERUPz5hI1k7ffo0+vbt+9BiDQDMzc1RUFCgp1RERERERA3Dgo1kraqqCi1btqx3XmFhIQwN+cCZiIiIiJoWFmwka3Z2djh37txD51RVVSE9PR3dunXTUyoiIiIiooZhwUay5uXlhdzcXERFRdU5JzIyEkVFRRg7dqwekxERERER1U8Q/9kyj0hGbt26BScnJ1y7dg3e3t4YM2YMxo8fjxEjRuDNN9/E9u3bsWXLFtjZ2SEtLa1ByyeJiIiIiPSFBRvJXmZmJry9vfHrr79CEASIoghBEAAAoiiiZ8+e2LFjB7p27SpxUiIiIiKi6liw0VNBrVZj9+7dOHjwIHJzc6FWq2FtbY0hQ4Zg3LhxMDAwkDoiEREREVENLNiIiIiIiIiaKDYdIVkLCgpCTExMvfM2bdqEoKAgPSQiIiIiImo4Fmwka5s2bUJKSkq983788UfExsbqIRERERERUcOxYCPC/b3Y+B4bERERETU1LNjoqSeKIs6cOYP27dtLHYWIiIiIqBpDqQMQadugQYOq/Xv//v01jj2gVCqRnZ2NgoICBAQE6CMeEREREVGDsUskyY5C8b8Hxw/2XXsYIyMjDB8+HBs3boS5ubmu4xERERERNRgLNpKdvLw8APeXOtrb28Pb2xsrV66sda6xsTHMzc1hZGSkz4hERERERA3CJZEkOzY2Npq/L168GC4uLtWOERERERE9KfiEjYiIiIiIqIlil0giIiIiIqImiksiSVYas5eaIAhQKpVaTENERERE1Dgs2EhWGrPCl6uDiYiIiKip4TtsRERERERETRTfYSMiIiIiImqiWLARERERERE1USzYiIiIiIiImigWbERERERERE0UCzYiIiIiIqImigUbERERERFRE8WCjYiIiIiIqIn6Pwz//u204nVQAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "\n", "def plot_model_selection_scores(_pipeline):\n", " # Each trial is a row in a dataframe that contains\n", " # Algorithm, Number of Samples, Number of Features, Hyperparameters, Score, Runtime, Memory Usage, Step as features\n", " trials = _pipeline.completed_trials_summary_[\n", " _pipeline.completed_trials_summary_[\"Step\"].str.contains(\"Model Selection\")\n", " ]\n", " name_of_score_column = f\"Score ({_pipeline._inferred_score_metric[0].name})\"\n", " trials.replace([np.inf, -np.inf], np.nan, inplace=True)\n", " trials.dropna(subset=[name_of_score_column], inplace=True)\n", " scores = trials[name_of_score_column].tolist()\n", " models = trials[\"Algorithm\"].tolist()\n", "\n", " y_margin = 0.10 * (max(scores) - min(scores))\n", " s = pd.Series(scores, index=models).sort_values(ascending=False)\n", "\n", " colors = []\n", " for f in s.keys():\n", " if f.strip() == _pipeline.selected_model_.strip():\n", " colors.append(\"orange\")\n", " elif s[f] >= s.mean():\n", " colors.append(\"teal\")\n", " else:\n", " colors.append(\"turquoise\")\n", "\n", " fig, ax = plt.subplots(1)\n", " ax.set_title(\"Algorithm Selection Trials\")\n", " ax.set_ylim(min(scores) - y_margin, max(scores) + y_margin)\n", " ax.set_ylabel(\"Hit Rate\")\n", " s.plot.bar(ax=ax, color=colors, edgecolor=\"black\")\n", " ax.axhline(y=s.mean(), color=\"black\", linewidth=0.5)\n", " plt.show()\n", "\n", "plot_model_selection_scores(automl_pipeline)" ] }, { "cell_type": "markdown", "id": "b1bd701b", "metadata": {}, "source": [ "\n", "### Hyperparameter Tuning\n", "\n", "Hyperparameter Tuning is the last stage of the AutoMLx pipeline, and focuses on improving the chosen algorithm's score on the dataset. We use a novel iterative algorithm to search across many hyperparameter dimensions, and converge automatically when optimal hyperparameters are identified. Each trial represents a particular hyperparameter configuration for the selected model.\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "efc97132", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.580268Z", "iopub.status.busy": "2025-04-25T10:36:14.579872Z", "iopub.status.idle": "2025-04-25T10:36:14.768618Z", "shell.execute_reply": "2025-04-25T10:36:14.768077Z" } }, "outputs": [ { "data": { "image/png": "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WrlypaWI7Nu3r3766Se1adNGCxYs0KFDh9SyZUub154wYYLGjx9veZ2SkqLQ0FAFeAbI17Nii7EU4IFYOCrGJhwZ4xOOrKLjM8AzQHcEV1IywHX497PyuOSUvnxzyBm9ggVQ0tPTbR4veIbOx8enymLNnj1b99xzj44ePaq+ffvK19dX7dq1044dOzRt2jRJRZ/hK7jW73//e0uRV+COO+5Q586dJUnr168vNl93d3f5+vpa/QEAAACAsnDIGb1G1x4CPnXqlM3jBe1hYWFVFsvf319r167VypUrtXbtWssqoI8//rgOHDggSbr99tut+oSFhSk5OVmNGze2ea3GjRsrOjpaFy5cKDFvAACAmyHy+HHtuXBB3UND1TEkxN7pAKgkDlnotW3bVpIUExNj83hBe5s2bao0lslk0oABAzRgwACr9tmzZ0uSevXqZdXevn177dq1y/Ks3vWSkq4+3GxrywYAAAB7WLB/vz7dvl0TevSg0AOqEYe8dbN79+7y8/PT0aNHtWvXriLHFyxYIEkaNGhQibH69+8vJycnbdiwochMWlZWlpYtWyZnZ+cixVxx0tPTNXv2bLm5uWn48OFWxx588EFJ0rp164r0S0tLsxSVtvYGBAAAsIeOISF6+LbbdFeDBvZOBUAlcshCz83NTWPGjJEkjR492vIcnSRNnz5dsbGx6tmzpzp27GhpnzVrlsLDwzVhwgSrWPXr19ejjz6q7OxsPfvss8rN/d8WBS+//LIuXryoJ554QsHB1k8gHzp0yLK1QYGkpCQ98sgjSkhI0Kuvvlpky4ZBgwbptttu0+bNm/Xpp59a2vPy8jR+/HglJSXpjjvuUI8ePcr5yQAAAFSuke3ba8Ef/qAh4eH2TgVAJXLIWzcl6fXXX9fq1au1efNmtWjRQhEREYqPj9fWrVsVFBSkr776yur8xMRExcXF6ezZs0ViffTRR4qKitLChQsVHh6uTp06ad++fdq7d69atGih6dOnF+kzb948vffee+rcubMaNGggs9msDRs2KC0tTSNGjNDEiROL9HF2dta8efPUs2dPjR49Wl988YWaN2+unTt36tixYwoMDNS8efPYNB0AAABAlXLYQs/Dw0ORkZGaOnWq5s2bpyVLliggIEAjRozQlClTit0A3ZY6deooOjpakyZN0pIlS7R48WLVrVtXY8eO1eTJk21u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njx5yWsVFhbqySefVHR0tKxWq6Kjo5WamqqzZ8/WO+fQoUMaO3asoqOj5efnp+DgYN14442aM2eOqqqqmnTeX/ziF7JYLLJYLPruu+8uOW8AAAAAuFRu2+idO3dOt912m1544QWVlpZq+PDhioqK0qJFixQfH6+jR482ea28vDz169dPr776qnx8fDRixAgFBwdr3rx5+tnPfqaCggKHOVu3blV8fLwWL16soKAgjRgxQjfffLP279+vyZMna/Dgwaqurm7wvIsXL9batWtlsVgu+fMDAAAAwOVy20bvj3/8o7Zt26b+/fvr0KFDWrp0qbZv365Zs2bpzJkzGjduXJPXSk1N1eHDhzVq1ChlZ2dr6dKl2rdvnyZOnKhDhw5p8uTJDnMmTJig8vJyTZ8+XQcOHNDf//53rVmzRocPH9Z1112nDRs26P3336/3nGfOnNFvf/tbDR48WF26dLmsnwEAAAAAXA63bPSqqqo0f/58SdKCBQt0zTXX2GOTJ09W7969tWHDBu3atavRtU6fPq0PP/xQfn5+ev311+Xj42OPvfLKKwoPD9eSJUv0ww8/2MdLS0u1e/duBQYG6qmnnqqzXmRkpCZMmCBJ2rFjR73nTU1NVXl5uV5//fWmfWgAAAAAaCZu2eht2bJFRUVFio2NVXx8vEP87rvvliSlp6c3utbq1atVW1urpKQkdejQoU7MarVq2LBhqqmp0apVq+zjvr6+8vJq/EcTFhZW7zk/+OADTZ06VbGxsY2uAwAAAADNyS0bvb1790qS+vbt6zRuG8/KymqRtaxWq2655RaVl5drxowZdY4/deqUFixYIF9fX91///0O65WVlenxxx9Xjx49HK4GAgAAAEBr8Gn8kNaXm5srSercubPTuG08JyenxdZ68803NWjQIE2ZMkXvvfeeevXqpeLiYm3cuFERERFauXKlunXr5rDetGnTdPz4ca1fv15+fn6N5vdjlZWVqqystH9fXFwsSSqoKFC1b8ObvzSmsKLwiuYDLYXahDujPuHOqE+4M+qz+RVXFDf5WLds9EpLSyVJgYGBTuNBQUGSpJKSkhZbq3v37tq8ebNGjhypzMxMHTx4UJJksVh06623qmfPng5rZWZmat68eXrwwQeVnJzcaG7OTJ8+Xc8///xlzQUAAAAAyU0bPXewbt063XXXXYqKitK6deuUmJio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VVVVslqtrbYDpcViqTfm5dU8T3TYbtvs16+f0/ju3bslXdh0BgDQMmj0AAC4SOfOnZWdna2nn35aCQkJzbLmJ598Ikl64403NHTo0Dqxo0ePNss5bCIjI5Wdna2cnBz17NnTIW67YtmpU6dmPe/FbLdtxsfHO43T6AFAy2MzFgDAVcXPz0+SVF1d7TQ+aNAgSf9uzppDYWGhJOe3Rv797393OqexPOtje4bwww8/dIhVVVXpo48+qnNcS2hKoxccHKzY2NgWywEArnY0egCAq0q7du3k6+urI0eOqKamxiH+6KOPqn379poxY4b+/Oc/22/ltKmurtaaNWu0b9++Jp/TtpnJn//85zq3aG7atEmvvPLKZeVZn4ceekgBAQH629/+ppUrV9rHa2tr9cwzz+jkyZNKSEho9BnEK2G7ddNZo5ebm6uCggL17t27wdtIAQBXhkYPAHBV8fPzU0pKir7//nv16dNHDzzwgB5++GEtWrRIkhQaGqoVK1YoJCREjz76qGJiYjRkyBD95je/0c9//nOFh4crJSVFhw8fbvI5J02apKCgIL3++uvq1auX7r33Xt1yyy1KTk7WY489dll51qdLly566623VFtbq2HDhikpKUm//vWvdcMNN2jWrFnq0KFDva+GaA7V1dU6cOCAOnXqpPDwcIc4t20CQOug0QMAXHX+8pe/6P7771d+fr4++OADLVy4UBs2bLDHb7rpJn3zzTd66qmn1KZNG23YsEHLly9XTk6OkpOTtXjxYv3iF79o8vm6deumnTt3atiwYcrLy9Onn36q0tJSvfXWW/Ve0WtKnvW5//77tWnTJt155506ePCgli1bpoqKCj3++OPatWuX041kmsu//vUvVVZW1tvI0egBQOuwmNba5gsAAAAA0Cq4ogcAAAAAHoZGDwAAAAA8DI0eAAAAAHgYGj0AAAAA8DA0egAAAADgYWj0AAAAAMDD0OgBAAAAgIeh0QMAAAAAD0OjBwAAAAAehkYPAAAAADwMjR4AAAAAeBgaPQAAAADwMP8ftYQk/PUdiEIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "\n", "def plot_hp_tuning_scores(_pipeline):\n", " # Each trial is a row in a dataframe that contains\n", " # Algorithm, Number of Samples, Number of Features, Hyperparameters, Score, Runtime, Memory Usage, Step as features\n", " trials = _pipeline.completed_trials_summary_[\n", " _pipeline.completed_trials_summary_[\"Step\"].str.contains(\"Model Tuning\")\n", " ]\n", " name_of_score_column = f\"Score ({_pipeline._inferred_score_metric[0].name})\"\n", " trials.replace([np.inf, -np.inf], np.nan, inplace=True)\n", " trials.dropna(subset=[name_of_score_column], inplace=True)\n", " trials.drop(trials[trials[\"Finished\"] == -1].index, inplace=True)\n", " trials[\"Finished\"] = trials[\"Finished\"].apply(\n", " lambda x: time.mktime(datetime.datetime.strptime(x, \"%a %b %d %H:%M:%S %Y\").timetuple())\n", " )\n", " trials.sort_values(by=[\"Finished\"], ascending=True, inplace=True)\n", " scores = trials[name_of_score_column].tolist()\n", " score = []\n", " score.append(scores[0])\n", " for i in range(1, len(scores)):\n", " if scores[i] >= score[i - 1]:\n", " score.append(scores[i])\n", " else:\n", " score.append(score[i - 1])\n", " y_margin = 0.10 * (max(score) - min(score))\n", " fig, ax = plt.subplots(1)\n", " ax.set_title(\"Hyperparameter Tuning Trials\")\n", " ax.set_xlabel(\"Iteration $n$\")\n", " ax.set_ylabel(\"Hit Rate\")\n", " ax.grid(color=\"g\", linestyle=\"-\", linewidth=0.1)\n", " ax.set_ylim(min(score) - y_margin, max(score) + y_margin)\n", " ax.plot(range(1, len(trials) + 1), score, \"k:\", marker=\"s\", color=\"teal\", markersize=3)\n", " plt.show()\n", "\n", "plot_hp_tuning_scores(automl_pipeline)" ] }, { "cell_type": "markdown", "id": "e419e8b2", "metadata": {}, "source": [ "\n", "## Advanced AutoMLx Configuration\n", "\n", "You can also configure the AutoRecommender pipeline with suitable parameters according to your needs." ] }, { "cell_type": "code", "execution_count": 13, "id": "cce288b6", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.770632Z", "iopub.status.busy": "2025-04-25T10:36:14.770102Z", "iopub.status.idle": "2025-04-25T10:36:14.773855Z", "shell.execute_reply": "2025-04-25T10:36:14.773370Z" } }, "outputs": [], "source": [ "\n", "\n", "custom_pipeline = AutoRecommender().configure(\n", " model_list=[ # Specify the models you want the AutoMLx to consider\n", " \"ItemKNNRecommender\",\n", " \"AlsRecommender\",\n", " \"BprRecommender\",\n", " ],\n", " n_algos_tuned=2, # Choose how many models to tune\n", " search_space={ # You can specify the hyperparameters and ranges we search for each model\n", " \"ItemKNNRecommender\": {\"num_of_neighbors\": {\"range\": [10, 30], \"type\": \"continuous\"}}\n", " },\n", " max_tuning_trials=20, # The maximum number of tuning trials. Can be integer or Dict (max number for each model)\n", " score_metric=\"recall\", # Any of the metrics available, see the documentation for a list of supported values\n", ")" ] }, { "cell_type": "markdown", "id": "f68bee6c", "metadata": {}, "source": [ "\n", "## Use a custom validation set\n", "\n", "You can specify a custom validation set that you want AutoMLx to use to evaluate the quality of models and configurations." ] }, { "cell_type": "code", "execution_count": 14, "id": "a8f1a67e", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.775669Z", "iopub.status.busy": "2025-04-25T10:36:14.775187Z", "iopub.status.idle": "2025-04-25T10:36:14.947404Z", "shell.execute_reply": "2025-04-25T10:36:14.946822Z" } }, "outputs": [], "source": [ "\n", "\n", "training_data, validation_data = AutoRecommender.train_test_split(data=training_data, col_types=col_types)\n", "\n", "\n", "# We run again the AutoML pipeline with the custom training/validation split we just created, and some advanced settings that we can specify directly in the fit method." ] }, { "cell_type": "code", "execution_count": 15, "id": "0787d525", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:14.949398Z", "iopub.status.busy": "2025-04-25T10:36:14.948881Z", "iopub.status.idle": "2025-04-25T10:36:25.228649Z", "shell.execute_reply": "2025-04-25T10:36:25.228075Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:15,105] [automlx.interface] Dataset shape: (49055,3)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:15,170] [automlx.process] Running Model Generation\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:15,215] [automlx.process] Model Generation completed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:15,246] [automlx.model_selection] Running Model Selection\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:16,875] [automlx.model_selection] Model Selection completed - Took 1.629 sec - Selected models: [['ItemKNNRecommender', 'AlsRecommender']]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:16,953] [automlx.trials] Running Model Tuning for ['ItemKNNRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:20,323] [automlx.trials] Best parameters for ItemKNNRecommender: {'n_recommendations': 10, 'num_of_neighbors': 10, 'bias': 0.010099998000000002, 'hist_len': 10, 'reciprocal_ranking': False, 'normalize_scores': False, 'cache_users_states': True}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:20,324] [automlx.trials] Model Tuning completed. Took: 3.371 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:20,456] [automlx.trials] Running Model Tuning for ['AlsRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:23,155] [automlx.trials] Best parameters for AlsRecommender: {'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.00044721247746457157, 'cache_users_states': True}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:23,156] [automlx.trials] Model Tuning completed. Took: 2.700 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:23,552] [automlx.interface] Re-fitting pipeline\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:23,562] [automlx.final_fit] Skipping updating parameter seed, already fixed by FinalFit_22bd3002-a\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-04-25 03:36:25,050] [automlx.interface] AutoMLx completed.\n" ] } ], "source": [ "\n", "\n", "custom_pipeline = custom_pipeline.fit(\n", " training_data,\n", " col_types,\n", " validation_data,\n", " time_budget=20, # Specify time budget in seconds\n", ")" ] }, { "cell_type": "markdown", "id": "f90f31e9", "metadata": {}, "source": [ "Now that the custom AutoML pipeline is completed, we can generate recommendations.\n", "Note that the pipeline's `recommend` method is equivalent to `predict`." ] }, { "cell_type": "code", "execution_count": 16, "id": "03976c22", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:25.230997Z", "iopub.status.busy": "2025-04-25T10:36:25.230474Z", "iopub.status.idle": "2025-04-25T10:36:25.290481Z", "shell.execute_reply": "2025-04-25T10:36:25.290013Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idmovie_idscore
062828613.964525
162833013.761287
262827212.332191
362833112.210435
462831312.163628
\n", "
" ], "text/plain": [ " user_id movie_id score\n", "0 628 286 13.964525\n", "1 628 330 13.761287\n", "2 628 272 12.332191\n", "3 628 331 12.210435\n", "4 628 313 12.163628" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "\n", "custom_pipeline.recommend(subjects=recommendation_subjects, n_recommendations=5)" ] }, { "cell_type": "markdown", "id": "b3867203", "metadata": {}, "source": [ "\n", "## Final evaluation of the best model\n", "\n", "Finally, we evaluate the best model found on the test data we have. If no metric is specified, the pipeline computes the score using the same metric used to run the Hyperparameter Tuning, which in this case is the Recall, as we defined at pipeline creation.\n", "\n", "In this example, instead, we ask the pipeline to perform the evaluation using Normalized Discounted Cumulative Gain (NDCG), a common ranking metric. Our online documentation provides the list of the available metrics and how they are computed." ] }, { "cell_type": "code", "execution_count": 17, "id": "a7cfe11a", "metadata": { "execution": { "iopub.execute_input": "2025-04-25T10:36:25.292408Z", "iopub.status.busy": "2025-04-25T10:36:25.291898Z", "iopub.status.idle": "2025-04-25T10:36:25.822968Z", "shell.execute_reply": "2025-04-25T10:36:25.822432Z" }, "lines_to_next_cell": 2 }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0dc5ce11a5664847a51c68144c131631", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/939 [00:00