{ "cells": [ { "cell_type": "markdown", "id": "06a5f433", "metadata": {}, "source": [ "\n", "

Building a Recommender using AutoMLx

\n", "

by the Oracle AutoMLx Team

\n", "\n", "***" ] }, { "cell_type": "markdown", "id": "ba30d145", "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": "461f9bf8", "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": "96b89fb7", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:40.617151Z", "iopub.status.busy": "2025-05-22T12:33:40.616791Z", "iopub.status.idle": "2025-05-22T12:33:47.612467Z", "shell.execute_reply": "2025-05-22T12:33:47.611412Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:33:43,584] [automlx.backend] Overwriting ray session directory to /tmp/dd53z4r9/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": "7e230f8d", "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": "cf715830", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:47.615459Z", "iopub.status.busy": "2025-05-22T12:33:47.614822Z", "iopub.status.idle": "2025-05-22T12:33:48.124233Z", "shell.execute_reply": "2025-05-22T12:33:48.123469Z" }, "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": "156d2b43", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:48.126752Z", "iopub.status.busy": "2025-05-22T12:33:48.126373Z", "iopub.status.idle": "2025-05-22T12:33:48.171028Z", "shell.execute_reply": "2025-05-22T12:33:48.170413Z" } }, "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": "56678702", "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": "7100daf2", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:48.173343Z", "iopub.status.busy": "2025-05-22T12:33:48.172820Z", "iopub.status.idle": "2025-05-22T12:33:48.180698Z", "shell.execute_reply": "2025-05-22T12:33:48.180078Z" } }, "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": "fb61014c", "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": "571620a1", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:48.182829Z", "iopub.status.busy": "2025-05-22T12:33:48.182348Z", "iopub.status.idle": "2025-05-22T12:33:48.185562Z", "shell.execute_reply": "2025-05-22T12:33:48.184956Z" } }, "outputs": [], "source": [ "\n", "\n", "col_types = {\"movie_id\": \"recommendation\", \"user_id\": \"recommendation_subject\"}" ] }, { "cell_type": "markdown", "id": "1f64d908", "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": "1af22d1c", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:48.187640Z", "iopub.status.busy": "2025-05-22T12:33:48.187082Z", "iopub.status.idle": "2025-05-22T12:33:53.424425Z", "shell.execute_reply": "2025-05-22T12:33:53.423689Z" } }, "outputs": [], "source": [ "\n", "\n", "training_data, test_data = AutoRecommender.train_test_split(data=dataset, col_types=col_types)" ] }, { "cell_type": "markdown", "id": "f45bfd0f", "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": "3c249aac", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:53.427665Z", "iopub.status.busy": "2025-05-22T12:33:53.426586Z", "iopub.status.idle": "2025-05-22T12:33:53.430815Z", "shell.execute_reply": "2025-05-22T12:33:53.430189Z" } }, "outputs": [], "source": [ "\n", "\n", "automl_pipeline = AutoRecommender().configure()" ] }, { "cell_type": "markdown", "id": "67f55f1c", "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": "3addf298", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:33:53.432821Z", "iopub.status.busy": "2025-05-22T12:33:53.432369Z", "iopub.status.idle": "2025-05-22T12:35:03.218983Z", "shell.execute_reply": "2025-05-22T12:35:03.218376Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:33:53,772] [automlx.interface] Dataset shape: (49055,3)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:33:53,843] [automlx.process] Running Model Generation\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:33:53,883] [automlx.process] Model Generation completed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:33:53,928] [automlx.model_selection] Running Model Selection\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:34:44,101] [automlx.model_selection] Model Selection completed - Took 50.173 sec - Selected models: [['ItemKNNRecommender']]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:34:44,143] [automlx.trials] Running Model Tuning for ['ItemKNNRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:01,774] [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-05-22 05:35:01,777] [automlx.trials] Model Tuning completed. Took: 17.634 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:02,270] [automlx.interface] Re-fitting pipeline\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:02,277] [automlx.final_fit] Skipping updating parameter seed, already fixed by FinalFit_29765b3f-3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:03,130] [automlx.interface] AutoMLx completed.\n" ] } ], "source": [ "\n", "\n", "automl_pipeline = automl_pipeline.fit(data=training_data, col_types=col_types)" ] }, { "cell_type": "markdown", "id": "0bedd242", "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": "dadc63df", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.221248Z", "iopub.status.busy": "2025-05-22T12:35:03.220741Z", "iopub.status.idle": "2025-05-22T12:35:03.280214Z", "shell.execute_reply": "2025-05-22T12:35:03.279719Z" } }, "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
055012128.218944
1550725.928565
25502525.786326
355011725.769397
455074224.947235
\n", "
" ], "text/plain": [ " user_id movie_id score\n", "0 550 121 28.218944\n", "1 550 7 25.928565\n", "2 550 25 25.786326\n", "3 550 117 25.769397\n", "4 550 742 24.947235" ] }, "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": "a57e8e74", "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": "1e3db309", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.281812Z", "iopub.status.busy": "2025-05-22T12:35:03.281626Z", "iopub.status.idle": "2025-05-22T12:35:03.294289Z", "shell.execute_reply": "2025-05-22T12:35:03.293794Z" } }, "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", "
(48114, 4)
(941, 4)
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}
24.4.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", "
Step# Samples# FeaturesAlgorithmHyperparametersScore (SanerecMetric)Runtime (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.08821.07511.2225Thu May 22 05:34:43 2025
Model Selection481142AlsRecommender{'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.01, 'cache_users_states': True}0.07654.71780.6711Thu May 22 05:34:05 2025
Model Selection481142BprRecommender{'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.01, 'cache_users_states': True}0.04360.43361.2218Thu May 22 05:34:42 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.039336.81911.2217Thu May 22 05:34:42 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.09991.25560.6840Thu May 22 05:34:58 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.09991.12970.6867Thu May 22 05:35:01 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.09991.35680.6848Thu May 22 05:34:58 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.09561.38450.6717Thu May 22 05:34:57 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.09561.10490.6777Thu May 22 05:34:58 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.09561.46640.6764Thu May 22 05:34:57 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.0841.37180.6718Thu May 22 05:34:57 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.0841.52540.6763Thu May 22 05:34:57 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.08291.39301.2117Thu May 22 05:34:49 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.08291.37071.2117Thu May 22 05:34:50 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.08181.25191.2170Thu May 22 05:34:52 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.08181.29131.2170Thu May 22 05:34:53 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.07971.46830.6743Thu May 22 05:34:57 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.07971.30120.6728Thu May 22 05:34:57 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.07971.35230.6761Thu May 22 05:34:57 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.07971.46400.6722Thu May 22 05:34:57 2025
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "\n", "automl_pipeline.print_summary()" ] }, { "cell_type": "markdown", "id": "fbef7aa7", "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": "01d0e2ba", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.296171Z", "iopub.status.busy": "2025-05-22T12:35:03.295673Z", "iopub.status.idle": "2025-05-22T12:35:03.489821Z", "shell.execute_reply": "2025-05-22T12:35:03.489286Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAANHCAYAAABKB96kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACc8ElEQVR4nOzdeVxU9eL/8fcAAqKAIriCKC5Zdl3QXEPU0swylzRLveq1rnlzSa1r2nVLLU3L0sxWl8pSK5e0LJdSckNTUsMMwwVQMcUFRAQUzu8Pf8w3YkeZOQ2v5+PBo5jzOWfeA4wz7znnfI7FMAxDAAAAAADTcbJ3AAAAAABA7ihsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAHAbTJ06VRaLRe3bt7d3lGKzWCyyWCzatm1bsdZfunSpLBaLatWqdVtzlRbt27eXxWLR1KlT7R2lSGrVqiWLxaKlS5faO4opDB48WBaLRYMHD76t2+X5BZReFDYA+ItLly6pbNmy1gLz+++/2zuSXV2+fFlTp07V1KlTdfnyZXvHKXHnz5/Xyy+/rHvvvVe+vr4qU6aMfH191bBhQ3Xr1k2vvvqqdu3aZe+YJW7p0qWaOnVqsQu8GZ08edL6vC7OlyP9LAD8fbjYOwAAmM2nn36q1NRU6/eLFy/WzJkz7ZjINu644w5JkoeHR7bbL1++rJdeeknSzb0HFSpUsHU0m/n+++/12GOP6eLFi9bbypUrp+vXr+vXX3/Vr7/+qq+//lqSZBiGvWLaxNKlSxUWFiZJ+e45rlOnjtzd3eXt7W2jZMXn7OysKlWq5LosMTFRqampcnJykp+fX65jXF1dC7yPatWq6Y477lC1atVuKSsAZKGwAcBfLFq0SJI0cuRIvfXWW/roo480Y8YMOTs72zlZyfrtt9/sHcGuYmNj1aNHDyUnJ6tWrVqaPHmyevbsaS2oiYmJ2rNnj9atW6fPPvvMvmFN5Pvvv7d3hEILCAjQ2bNnc102ePBgffTRRwoICNDJkyeLfR8zZ84sFR/wALAdDokEgD+JiIjQgQMHVKFCBc2ePVu1a9dWfHy8NmzYYO9oKGHvvfeekpOT5erqqrCwMP3rX//KtjfR29tbnTt31oIFC3T69Gn7BQUAlCoUNgD4k6y9a3379pW7u7sGDhwo6eZhkbfqq6++UseOHVWhQgWVL19ejRs31uzZs3X9+vVCTVqybds29enTRzVq1JCbm5t8fX113333acmSJcrIyMh1nb9ud9WqVercubMqV64sJyenbBNc5HaeTvv27VW7dm3r97Vr1852Tk9+effv36/HHntM1apVk5ubm4KCgjR27FhdunSpUFnXrVun++67T5UqVZKXl5fatGmjtWvXZlvnk08+Udu2bVWxYkWVL19e7dq1K/YenwMHDkiSmjRpopo1a+Y7tmzZsnkuy8zM1KeffqquXbuqSpUqcnV1lZ+fnzp37qzly5ff0qGUkZGRGjp0qOrVqycPDw+VL19ejRo10v/+9z8lJCTku+7Vq1c1d+5chYaGytfXV66urvL391doaKhef/11/fHHH5L+b3KLrMMhX3rppRzncv15D1RBk45kZGRo8eLF6tixo3x9feXm5qYaNWqoT58++Z4T9udJWAzD0AcffKCWLVvKy8tLnp6eat26tZYtW1akn19x/fnct5MnT+rYsWMaOnSoateuLTc3t2wTgeQ36cilS5e0aNEiPfbYY/rHP/4hHx8fubu7KzAwUP369VN4eHixM+7Zs0f9+/dX7dq15e7urnLlyikwMFChoaGaPn26Tp06VextA7AzAwBgGIZhXLt2zahQoYIhydi5c6dhGIZx7Ngxw2KxGC4uLsbZs2fzXHfKlCmGJCM0NDTX5c8995whyfpVoUIFw8XFxZBktGvXznjxxRfzXX/MmDHWdS0Wi1GhQgXD2dnZelvHjh2NpKSkfHONHTvWun7FihUNZ2dnY8qUKdaxWdvaunWr9baePXsavr6+1mW+vr5GlSpVrF89e/a0jl2yZIkhyQgMDDQ+/fRTo0yZMoYkw9vb23BycrJuo2HDhsaVK1fyzTp58mRDkuHk5GR4e3tn+9m9++67RmZmpjFo0CBDkuHi4mJ4enpalzs7Oxtff/11nr+rvHTt2tWQZPj7+xuZmZlFXt8wDOPChQtGu3btsuX9a/5HHnnESEtLy7FuaGioISnb7+TPXn311Ww/Rw8PD8PV1dX6fbVq1YyIiIhc192/f78REBBgHevk5GT4+PgYbm5u1tveeOMNwzAMY8WKFUaVKlWsv79y5cpl+51XqVLFiI2NtW47MDDQkGQsWbIkx/1evnzZaN++fbbf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CRN011136bHHHlOXLl1Ut25dGYahb775RvXr18/3vtPS0pSUlJTtCwAAAAAKy6XgIbaXnJwsSfLw8Mh1ebly5SRJV65cKbFt3XHHHdqxY4d69uypiIgIHTlyRJJksVjUoUMHNWzYsMD7njlzpl566aUCxwEAAABAbky5h80MfvjhBzVu3FjXr1/XDz/8oKSkJJ04cUL/+9//tGTJErVt21bnz5/PdxsTJkxQYmKi9SsuLs5G6QEAAAA4AlPuYcuaFTIlJSXX5VevXpUkeXp6lsi2Ll68qD59+uj69ev69ttvVaNGDeuY6dOnKzExUW+99ZZee+01vfrqq3net5ubm9zc3ArMCAAAAAC5MeUetpo1a0qSTp06levyrNsDAwNLZFvffPONLl68qFatWlnL2p/16dNHkvTjjz8WeP8AAAAAUFymLGyNGzeWJEVEROS6POv2Ro0alci2skqct7d3rutk3X7p0qUC7x8AAAAAisuUha1t27by9vbWsWPHdODAgRzLv/zyS0lSt27dCtxWly5d5OTkpO3bt2e7OLZ0cxbH9evXy9nZWV27drXeXrVqVUnSzz//rIyMjBzbzLpgdq1atQr7kAAAAACgyExZ2FxdXTVixAhJ0vDhw63nmUnS3LlzdejQIYWGhqpZs2bW2xcsWKAGDRpowoQJ2bZVrVo1PfHEE0pPT9czzzyjGzduWJeNGzdO58+f14ABA1S5cmXr7V26dJGbm5tOnDihSZMmKTMz07osKipKkydPlvR/F/AGAAAAgJJgyklHJGnixInasmWLdu3apXr16ikkJEQxMTHas2eP/Pz8tHjx4mzjExISFBUVpfj4+BzbevPNNxUeHq5Vq1apQYMGat68uQ4fPqzIyEjVq1dPc+fOzTa+WrVqeu211zRq1CjNnDlTK1euVNOmTXXhwgXt3r1baWlp6tq1qwYPHlySPwIAAAAApZwp97BJkru7u7Zu3apJkybJw8NDa9euVUxMjAYPHqyIiAgFBQUVelu+vr7au3evRo4cqfT0dK1Zs0aJiYkaNWqU9u7dKx8fnxzrjBgxQj/88IN69OihlJQUffXVV4qIiFDTpk319ttva926dXJxMW3fBQAAAOAALIZhGPYOUVokJSXJ29tbiYmJ8vLysnecIouIiFCzZs20f4YUXNveaUqniBNSs4nS/v37FRwcbO84AAAAKKbCdgPT7mEDAAAAgNKOwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApFzsHQAA/m5iY2OVkJBg7xilmq+vr2rWrGnvGAAAlDgKGwAUQWxsrO5o0ECp167ZO0qp5l62rKJ++43SBgBweBQ2ACiChISEm2WtVy/J19fecUqnhASlrl6thIQEChsAwOFR2ACgOHx9perV7Z0CAAA4OCYdAQAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgElR2AAAAADApChsAAAAAGBSFDYAAAAAMCkKGwAAAACYFIUNAAAAAEyKwgYAAAAAJkVhAwAAAACTorABAAAAgEmZurBdu3ZNkydPVv369eXu7q7q1atryJAhOn36dJG3denSJT377LMKDAyUm5ubAgMDNXr0aF2+fDnH2JMnT8pisRT4NWTIkNvwKAEAAAAgdy72DpCX1NRUdezYUeHh4apWrZq6d++ukydPasmSJfr6668VHh6uoKCgQm0rISFBrVu3VnR0tIKCgtSjRw8dPnxY8+bN07fffqvdu3fLx8fHOr58+fIaNGhQnttbuXKlUlNTFRIScsuPEwAAAADyYtrCNmPGDIWHh6t169batGmTypcvL0maO3eunnvu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fphzelBqODs7S5IMw5DFYsl3rMVi0Y0bN2wRC7C52NhYvfLKK/rkk0/01FNPWT+8yOu8npo1a9o4IVBynJwKf0CdxWJRRkZGCaZBcVDY4NCCgoKUmZmpuLg4STf/IapcuXKenyodO3bM1hGBElOrVq0Ci9qfnThxogTTAPbj5OQki8XChxcolcLCwoo0ngl6zIfCBodWlE+VJCkzM7OEkgAA7KV9+/ZF+vBi69atJZgGAIqGwgYAAAAAJuVi7wAAANtIS0vTxYsX5ebmJh8fH3vHAQDY0IULF7Rs2TLt3btXCQkJuu+++zRu3DhJ0uHDh3Xs2DHdf//98vDwsHNS/BXT+gOAg3v//ffVtGlTlStXTv7+/nr++eety1avXq1evXopOjrajgkB2/r999+1e/duHT161N5RAJv44osvFBQUpLFjx2r58uXasmVLtku+nD59Wj179tTq1avtmBJ5obChVNi0aZN69uypGjVqyM3NTU8++aR12caNGzV27FidOXPGjgmB2y8jI0M9e/bUf/7zHx05ckR33nmn/noUfOPGjbV27VqtXLnSTikB20hLS9OLL74oX19fNWjQQPfee69mzZplXb5s2TIFBwfrwIED9gsJlIDdu3erX79+cnFx0euvv669e/fmeC2477775O3tTWEzKQobHN6zzz6rBx98UF999ZWuXLmi69evZ/uHqlq1anrzzTd5wwqHs2DBAn311Vd68MEHFRMTo19++SXHmDp16qhu3br69ttv7ZAQsI1r166pffv2evXVV+Xq6qquXbvmeMPasWNHHTx4UJ9//rmdUgIl45VXXpGTk5M2b96s0aNHq3nz5jnGODs7Kzg4WJGRkXZIiIJQ2ODQPv74Y7311ltq1qyZIiIilJSUlGNMo0aNFBAQoPXr19shIVByli5dqipVqmjlypWqUqVKnuPuuusuxcTE2DAZYFuzZ8/Wnj17NGTIEB0/fjzXf++rV6+uu+66S1u2bLFDQqDk7Nq1S61bt1ZwcHC+46pWrar4+HgbpUJRUNjg0N555x1VqFBB33zzjZo0aZLnuEaNGun48eO2CwbYQFRUlFq2bKly5crlO65cuXI6f/68jVIBtrdy5UrVrFlT77zzTp4Xy5akO+64w3rdTsBRpKSkyM/Pr8Bxly5dskEaFAeFDQ4tMjJSbdq0KfAfKm9vb/3xxx82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IyNhYmKCw4cPw87OrtZ5Tk5OSE9P12MyIiIiIqK68QkbydrZs2fRr1+/xxZrAGBubo68vDw9pSIiIiIiqh8WbCRrlZWVaNWqVZ3z8vPz0awZHzgTERERUePCgo1kzdbWFhcuXHjsnMrKSqSlpaF79+56SkVEREREVD8s2EjWvLy8kJ2djcjIyFrnREREoKCgAOPGjdNjMiIiIiKiugniP1vmEcnI3bt34ejoiJs3b8Lb2xtjx47FxIkTMXLkSLz11lvYsWMHtm7dCltbW6SmptZr+SQRERERkb6wYCPZu3LlCry9vfHbb79BEASIoghBEAAAoiiiV69e2LlzJ7p16yZxUiIiIiKiqliwUZOgVquxZ88eHDp0CNnZ2VCr1bCyssKwYcMwfvx4GBgYSB2RiIiIiKgaFmxERERERESNFJuOkKwFBgYiJiamznmbN29GYGCgHhIREREREdUfCzaStc2bNyMpKanOeT/99BNiY2P1kIiIiIiIqP5YsBHh4V5sfI+NiIiIiBobFmzU5ImiiHPnzqF9+/ZSRyEiIiIiqqKZ1AGItG3IkCFV/n7gwIFqxx5RKpXIzMxEXl4e/P399RGPiIiIiKje2CWSZEeh+O+D40f7rj2OoaEhPDw8sGnTJpibm+s6HhERERFRvbFgI9nJyckB8HCpo52dHby9vbF69eoa5xoZGcHc3ByGhob6jEhEREREVC9cEkmyY21trfnz0qVL4ezsXOUYEREREdGzgk/YiIiIiIiIGil2iSQiIiIiImqkuCSSZKUhe6kJggClUqnFNEREREREDcOCjWSlISt8uTqYiIiIiBobvsNGRERERETUSPEdNiIiIiIiokaKBRsREREREVEjxYKNiIiIiIiokWLBRkRERERE1EixYCMiIiIiImqkWLARERERERE1UizYiIiIiIiIGqn/B8gRT489/fVsAAAAAElFTkSuQmCC", "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": "9c8a8dce", "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": "25e765b8", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.491793Z", "iopub.status.busy": "2025-05-22T12:35:03.491324Z", "iopub.status.idle": "2025-05-22T12:35:03.684496Z", "shell.execute_reply": "2025-05-22T12:35:03.683929Z" } }, "outputs": [ { "data": { "image/png": "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", "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": "fbfbbc5c", "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": "18ea54f1", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.686682Z", "iopub.status.busy": "2025-05-22T12:35:03.686117Z", "iopub.status.idle": "2025-05-22T12:35:03.689956Z", "shell.execute_reply": "2025-05-22T12:35:03.689457Z" } }, "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": "63367d59", "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": "f6adc660", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.691824Z", "iopub.status.busy": "2025-05-22T12:35:03.691399Z", "iopub.status.idle": "2025-05-22T12:35:03.860679Z", "shell.execute_reply": "2025-05-22T12:35:03.860061Z" } }, "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": "211aa25d", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:03.862935Z", "iopub.status.busy": "2025-05-22T12:35:03.862401Z", "iopub.status.idle": "2025-05-22T12:35:14.199358Z", "shell.execute_reply": "2025-05-22T12:35:14.198664Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:04,023] [automlx.interface] Dataset shape: (49055,3)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:04,090] [automlx.process] Running Model Generation\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:04,135] [automlx.process] Model Generation completed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:04,166] [automlx.model_selection] Running Model Selection\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:05,776] [automlx.model_selection] Model Selection completed - Took 1.610 sec - Selected models: [['ItemKNNRecommender', 'AlsRecommender']]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:05,845] [automlx.trials] Running Model Tuning for ['ItemKNNRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:09,216] [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-05-22 05:35:09,218] [automlx.trials] Model Tuning completed. Took: 3.374 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:09,391] [automlx.trials] Running Model Tuning for ['AlsRecommender']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:12,002] [automlx.trials] Best parameters for AlsRecommender: {'n_recommendations': 10, 'iterations': 10, 'factors': 16, 'regularization': 0.01, 'cache_users_states': True}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:12,004] [automlx.trials] Model Tuning completed. Took: 2.614 secs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:12,464] [automlx.interface] Re-fitting pipeline\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:12,475] [automlx.final_fit] Skipping updating parameter seed, already fixed by FinalFit_836245be-e\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[2025-05-22 05:35:14,026] [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": "592b6260", "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": "2717cd7f", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:14.202111Z", "iopub.status.busy": "2025-05-22T12:35:14.201551Z", "iopub.status.idle": "2025-05-22T12:35:14.261614Z", "shell.execute_reply": "2025-05-22T12:35:14.261091Z" } }, "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
055012127.870747
15502525.221432
255010023.984905
3550723.856528
455011822.179071
\n", "
" ], "text/plain": [ " user_id movie_id score\n", "0 550 121 27.870747\n", "1 550 25 25.221432\n", "2 550 100 23.984905\n", "3 550 7 23.856528\n", "4 550 118 22.179071" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "\n", "custom_pipeline.recommend(subjects=recommendation_subjects, n_recommendations=5)" ] }, { "cell_type": "markdown", "id": "050513f5", "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": "82b47a8e", "metadata": { "execution": { "iopub.execute_input": "2025-05-22T12:35:14.263708Z", "iopub.status.busy": "2025-05-22T12:35:14.263214Z", "iopub.status.idle": "2025-05-22T12:35:14.842348Z", "shell.execute_reply": "2025-05-22T12:35:14.841681Z" }, "lines_to_next_cell": 2 }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "718f5b84003740a3bde9ac2ef7aa878c", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/939 [00:00