From 9e3388bee2e61ab90f38377701a44a1080cc7a75 Mon Sep 17 00:00:00 2001 From: Shelly Chahar Date: Tue, 6 Oct 2026 12:47:17 +0530 Subject: [PATCH] fix(tasks): infer task_type string from TaskType in create_task (#1766) - Add type_str property to TaskType enum mapping members to OpenML task strings - Resolve TODO in create_task() by passing task_type.type_str instead of hardcoded 'None' - Default task_type to task_type_id.type_str in OpenMLTask.__init__ if not provided - Add unit tests for task_type assignment and TaskType.type_str Signed-off-by: Shelly Chahar --- openml/tasks/functions.py | 2 +- openml/tasks/task.py | 18 ++++++++- tests/test_tasks/test_task_functions.py | 53 +++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/openml/tasks/functions.py b/openml/tasks/functions.py index e123b8638..ead8a8a5c 100644 --- a/openml/tasks/functions.py +++ b/openml/tasks/functions.py @@ -572,7 +572,7 @@ def create_task( return task_cls( task_id=None, task_type_id=task_type, - task_type="None", # TODO: refactor to get task type string from ID. + task_type=task_type.type_str, data_set_id=dataset_id, target_name=target_name, # type: ignore estimation_procedure_id=estimation_procedure_id, diff --git a/openml/tasks/task.py b/openml/tasks/task.py index ab3cb3da4..398ac8235 100644 --- a/openml/tasks/task.py +++ b/openml/tasks/task.py @@ -41,6 +41,22 @@ class TaskType(Enum): SUBGROUP_DISCOVERY = 8 MULTITASK_REGRESSION = 9 + @property + def type_str(self) -> str: + """Return the OpenML string representation of the task type.""" + mapping = { + TaskType.SUPERVISED_CLASSIFICATION: "Supervised Classification", + TaskType.SUPERVISED_REGRESSION: "Supervised Regression", + TaskType.LEARNING_CURVE: "Learning Curve", + TaskType.SUPERVISED_DATASTREAM_CLASSIFICATION: "Supervised Data Stream Classification", + TaskType.CLUSTERING: "Clustering", + TaskType.MACHINE_LEARNING_CHALLENGE: "Machine Learning Challenge", + TaskType.SURVIVAL_ANALYSIS: "Survival Analysis", + TaskType.SUBGROUP_DISCOVERY: "Subgroup Discovery", + TaskType.MULTITASK_REGRESSION: "Multi-task Regression", + } + return mapping[self] + class _EstimationProcedure(TypedDict): type: str | None @@ -90,7 +106,7 @@ def __init__( # noqa: PLR0913 ): self.task_id = int(task_id) if task_id is not None else None self.task_type_id = task_type_id - self.task_type = task_type + self.task_type = task_type if task_type is not None else task_type_id.type_str self.dataset_id = int(data_set_id) self.target_name = target_name resolved_estimation_procedure_id = self._resolve_estimation_procedure_id( diff --git a/tests/test_tasks/test_task_functions.py b/tests/test_tasks/test_task_functions.py index bf2fcfeae..dd73f7ce7 100644 --- a/tests/test_tasks/test_task_functions.py +++ b/tests/test_tasks/test_task_functions.py @@ -315,3 +315,56 @@ def test_delete_unknown_task(mock_delete, test_files_directory, test_server_v1, task_url = test_server_v1 + "task/9999999" assert task_url == mock_delete.call_args.args[0] assert test_apikey_v1 == mock_delete.call_args.kwargs.get("params", {}).get("api_key") + + +def test_create_task_sets_task_type() -> None: + task = openml.tasks.create_task( + TaskType.SUPERVISED_CLASSIFICATION, + dataset_id=1, + target_name="class", + estimation_procedure_id=1, + ) + assert task.task_type == "Supervised Classification" + assert task.task_type_id == TaskType.SUPERVISED_CLASSIFICATION + + task_reg = openml.tasks.create_task( + TaskType.SUPERVISED_REGRESSION, + dataset_id=1, + target_name="target", + estimation_procedure_id=7, + ) + assert task_reg.task_type == "Supervised Regression" + assert task_reg.task_type_id == TaskType.SUPERVISED_REGRESSION + + task_cluster = openml.tasks.create_task( + TaskType.CLUSTERING, + dataset_id=1, + estimation_procedure_id=17, + ) + assert task_cluster.task_type == "Clustering" + assert task_cluster.task_type_id == TaskType.CLUSTERING + + task_lc = openml.tasks.create_task( + TaskType.LEARNING_CURVE, + dataset_id=1, + target_name="class", + estimation_procedure_id=13, + ) + assert task_lc.task_type == "Learning Curve" + assert task_lc.task_type_id == TaskType.LEARNING_CURVE + + +def test_task_type_str() -> None: + expected = { + TaskType.SUPERVISED_CLASSIFICATION: "Supervised Classification", + TaskType.SUPERVISED_REGRESSION: "Supervised Regression", + TaskType.LEARNING_CURVE: "Learning Curve", + TaskType.SUPERVISED_DATASTREAM_CLASSIFICATION: "Supervised Data Stream Classification", + TaskType.CLUSTERING: "Clustering", + TaskType.MACHINE_LEARNING_CHALLENGE: "Machine Learning Challenge", + TaskType.SURVIVAL_ANALYSIS: "Survival Analysis", + TaskType.SUBGROUP_DISCOVERY: "Subgroup Discovery", + TaskType.MULTITASK_REGRESSION: "Multi-task Regression", + } + for task_type, expected_str in expected.items(): + assert task_type.type_str == expected_str