Перейти до основного вмісту

Singularity Machine Learning — Класифікація: функція Qiskit від Multiverse Computing

See the API reference

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

scikit-learn~=1.8.0
Примітка
  • Функції Qiskit — це експериментальна можливість, доступна лише користувачам IBM Quantum® Premium Plan, Flex Plan і On-Prem (через IBM Quantum Platform API) Plan. Вони перебувають у статусі попереднього випуску та можуть змінюватися.

Огляд

За допомогою функції "Singularity Machine Learning — Класифікація" ти можеш вирішувати реальні задачі машинного навчання на квантовому апаратному забезпеченні без необхідності мати квантову експертизу. Ця прикладна функція, заснована на методах ансамблів, є гібридним класифікатором. Вона використовує класичні методи, такі як бустинг, беґінг та стекінг, для початкового навчання ансамблю. Потім застосовуються квантові алгоритми — варіаційний квантовий власний розв'язувач (VQE) та квантовий апроксимаційний алгоритм оптимізації (QAOA) — щоб підвищити різноманітність навченого ансамблю, його здатність до узагальнення та загальну складність.

На відміну від інших рішень квантового машинного навчання, ця функція здатна обробляти великомасштабні датасети з мільйонами прикладів та ознак, не будучи обмеженою кількістю кубітів у цільовому QPU. Кількість кубітів визначає лише розмір ансамблю, який можна навчити. Функція також є надзвичайно гнучкою і може використовуватися для вирішення задач класифікації в найрізноманітніших галузях, зокрема у фінансах, охороні здоров'я та кібербезпеці. Вона стабільно досягає високої точності на класично складних задачах з висококимірними, зашумленими та незбалансованими датасетами. Як це працює Вона створена для:

  1. Інженерів і науковців з даних у компаніях, які прагнуть розширити свої технологічні пропозиції шляхом інтеграції квантового машинного навчання у свої продукти та послуги,
  2. Дослідників у квантових дослідницьких лабораторіях, які вивчають застосування квантового машинного навчання та хочуть використовувати квантові обчислення для задач класифікації, і
  3. Студентів та викладачів у навчальних закладах на курсах з машинного навчання, які прагнуть продемонструвати переваги квантових обчислень.

Наступний приклад демонструє різноманітні функціональні можливості, зокрема create, list, fit і predict, та показує їх використання на синтетичній задачі, яка складається з двох взаємопроникних напівкіл — задачі, відомо складної через нелінійну межу рішення.

Опис функції

Ця функція Qiskit дозволяє користувачам вирішувати задачі бінарної класифікації за допомогою квантово-покращеного ансамблевого класифікатора Singularity. За лаштунками вона використовує гібридний підхід для класичного навчання ансамблю класифікаторів на розміченому датасеті, а потім оптимізує його для максимальної різноманітності та узагальнення за допомогою Квантового апроксимаційного алгоритму оптимізації (QAOA) на QPU IBM®. Через зручний інтерфейс користувачі можуть налаштувати класифікатор відповідно до своїх вимог, навчити його на датасеті за власним вибором і використовувати для прогнозування на раніше невідомому датасеті.

Щоб вирішити загальну задачу класифікації:

  1. Попередньо обробити датасет і розділити його на навчальну та тестову вибірки. Необов'язково можна додатково розділити навчальну вибірку на навчальну та валідаційну. Це можна зробити за допомогою scikit-learn.
  2. Якщо навчальна вибірка незбалансована, ти можеш перевибрати її для балансування класів за допомогою imbalanced-learn.
  3. Завантажити навчальну, валідаційну та тестову вибірки окремо до сховища функції за допомогою методу file_upload каталогу, щоразу передаючи відповідний шлях.
  4. Ініціалізувати квантовий класифікатор за допомогою дії create функції, яка приймає гіперпараметри, такі як кількість та типи учнів, регуляризацію (значення лямбда), а також параметри оптимізації, включаючи кількість шарів, тип класичного оптимізатора, квантовий бекенд тощо.
  5. Навчити квантовий класифікатор на навчальній вибірці за допомогою дії fit функції, передавши їй розмічену навчальну вибірку та, якщо застосовно, валідаційну вибірку.
  6. Зробити прогнози на раніше невідомій тестовій вибірці за допомогою дії predict функції.

Початок роботи

Автентифікуйся за допомогою свого API-ключа IBM Quantum Platform та вибери Qiskit Function таким чином:

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit-ibm-catalog scikit-learn
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# load function
singularity = catalog.load("multiverse/singularity")

Приклади

Класифікація датасету

У цьому прикладі ти використаєш функцію "Singularity Machine Learning - Classification" для класифікації набору даних, що складається з двох взаємно переплетених, місяцеподібних півкіл. Набір даних є синтетичним, двовимірним та позначеним бінарними мітками. Він створений таким чином, щоб бути складним для алгоритмів, як-от кластеризація на основі центроїдів і лінійна класифікація. Набір даних "місяці" У процесі ти навчишся створювати класифікатор, навчати його на тренувальних даних, використовувати для передбачення на тестових даних та видаляти класифікатор після завершення роботи. Перед початком тобі потрібно встановити scikit-learn. Встанови його за допомогою наступної команди:

python3 -m pip install scikit-learn

Виконай наступні кроки:

  1. Створи синтетичний набір даних за допомогою функції make_moons з scikit-learn.
  2. Завантаж згенерований синтетичний набір даних до спільної директорії даних.
  3. Створи квантово-покращений класифікатор за допомогою дії create.
  4. Перелічи свої класифікатори за допомогою дії list.
  5. Навчи класифікатор на тренувальних даних за допомогою дії fit.
  6. Використай навчений класифікатор для передбачення на тестових даних за допомогою дії predict.
  7. Видали класифікатор за допомогою дії delete.
  8. Очисти ресурси після завершення роботи. Крок 1. Імпортуй необхідні модулі та згенеруй синтетичний набір даних, а потім розділи його на тренувальний і тестовий набори.
# import the necessary modules for this example
import os
import tarfile
import numpy as np

# Import the make_moons and the train_test_split functions from scikit-learn
# to create a synthetic dataset and split it into training and test datasets
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

# generate the synthetic dataset
X, y = make_moons(n_samples=10000)

# split the data into training and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# print the first 10 samples of the training dataset
print("Features:", X_train[:10, :])
print("Targets:", y_train[:10])
Features: [[ 0.84757037 -0.48831433]
[ 0.98132552 0.19235443]
[-0.71626723 0.6978261 ]
[ 1.18957848 -0.48186557]
[ 0.52118982 -0.37791846]
[ 0.81115408 0.58483251]
[ 0.48706462 0.87336593]
[-0.81880144 0.57407682]
[ 1.67335408 -0.23932015]
[ 0.50181306 0.8649761 ]]
Targets: [1 0 0 1 1 0 0 0 1 0]

Крок 2. Збережи позначені тренувальний і тестовий набори даних на локальному диску, а потім завантаж їх до спільної директорії даних.

def make_tarfile(file_path, tar_file_name):
with tarfile.open(tar_file_name, "w") as tar:
tar.add(file_path, arcname=os.path.basename(file_path))

# save the training and test datasets on your local disk
np.save("X_train.npy", X_train)
np.save("y_train.npy", y_train)
np.save("X_test.npy", X_test)
np.save("y_test.npy", y_test)

# create tar files for the datasets
make_tarfile("X_train.npy", "X_train.npy.tar")
make_tarfile("y_train.npy", "y_train.npy.tar")
make_tarfile("X_test.npy", "X_test.npy.tar")
make_tarfile("y_test.npy", "y_test.npy.tar")

# upload the datasets to the shared data directory
catalog.file_upload("X_train.npy.tar", singularity)
catalog.file_upload("y_train.npy.tar", singularity)
catalog.file_upload("X_test.npy.tar", singularity)
catalog.file_upload("y_test.npy.tar", singularity)

# view/enlist the uploaded files in the shared data directory
print(catalog.files(singularity))
['X_test.npy.tar', 'X_train.npy.tar', 'y_test.npy.tar', 'y_train.npy.tar']

Крок 3. Створи квантово-покращений класифікатор за допомогою дії create.

job = singularity.run(
action="create",
name="my_classifier",
num_learners=10,
learners_types=[
"DecisionTreeClassifier",
"KNeighborsClassifier",
],
learners_proportions=[0.5, 0.5],
learners_options=[{}, {}],
regularization=0.01,
weight_update_method="logarithmic",
sample_scaling=True,
optimizer_options={"simulator": True},
voting="soft",
prob_threshold=0.5,
)

print(job.result())
{'status': 'ok', 'message': 'Classifier created.', 'data': {}, 'metadata': {'resource_usage': {}}}
# list available classifiers using the list action
job = singularity.run(action="list")

print(job.result())

# you can also find your classifiers in the shared data directory with a *.pkl.tar extension
print(catalog.files(singularity))
{'status': 'ok', 'message': 'Classifiers listed.', 'data': {'classifiers': ['my_classifier']}, 'metadata': {'resource_usage': {}}}
['X_test.npy.tar', 'X_train.npy.tar', 'my_classifier.pkl.tar', 'y_test.npy.tar', 'y_train.npy.tar']

Крок 4. Навчи квантово-покращений класифікатор за допомогою дії fit.

job = singularity.run(
action="fit",
name="my_classifier",
X="X_train.npy", # you do not need to specify the tar extension
y="y_train.npy", # you do not need to specify the tar extension
)

print(job.result())
{'status': 'ok', 'message': 'Classifier fitted.', 'data': {}, 'metadata': {'resource_usage': {'RUNNING: MAPPING': {'CPU_TIME': 13.655871629714966}, 'RUNNING: WAITING_QPU': {'CPU_TIME': 54.688621282577515}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 56.92286920547485}, 'RUNNING: EXECUTING_QPU': {'QPU_TIME': 57.92738223075867}}}}

Крок 5. Отримай передбачення та імовірності від квантово-покращеного класифікатора за допомогою дії predict.

job = singularity.run(
action="predict",
name="my_classifier",
X="X_test.npy", # you do not need to specify the tar extension
)

result = job.result()

print("Action result status: ", result["status"])
print("Action result message: ", result["message"])
print("Predictions (first five results):", result["data"]["predictions"][:5])
print(
"Probabilities (first five results):", result["data"]["probabilities"][:5]
)
Action result status:  ok
Action result message: Classifier predicted.
Predictions (first five results): [0, 0, 1, 0, 1]
Probabilities (first five results): [[1.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 0.0], [0.0, 1.0]]

Крок 6. Видали квантово-покращений класифікатор за допомогою дії delete.

job = singularity.run(
action="delete",
name="my_classifier",
)

# or you can delete from the shared data directory
# catalog.file_delete("my_classifier.pkl.tar", singularity)

print(job.result())
{'status': 'ok', 'message': 'Classifier deleted.', 'data': {}, 'metadata': {'resource_usage': {}}}

Крок 7. Очисти локальну та спільну директорії даних.

# delete the numpy files from your local disk
os.remove("X_train.npy")
os.remove("y_train.npy")
os.remove("X_test.npy")
os.remove("y_test.npy")

# delete the tar files from your local disk
os.remove("X_train.npy.tar")
os.remove("y_train.npy.tar")
os.remove("X_test.npy.tar")
os.remove("y_test.npy.tar")

# delete the tar files from the shared data
catalog.file_delete("X_train.npy.tar", singularity)
catalog.file_delete("y_train.npy.tar", singularity)
catalog.file_delete("X_test.npy.tar", singularity)
catalog.file_delete("y_test.npy.tar", singularity)
'Requested file was deleted.'

Приклад create_fit_predict

Наступний приклад демонструє дію create_fit_predict.

# Import QiskitFunctionsCatalog to load the
# "Singularity Machine Learning - Classification" function by Multiverse Computing
from qiskit_ibm_catalog import QiskitFunctionsCatalog

# Import the make_moons and the train_test_split functions from scikit-learn
# to create a synthetic dataset and split it into training and test datasets
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

# authentication
# If you have not previously saved your credentials, follow instructions at
# /docs/guides/functions
# to authenticate with your API key.
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# load "Singularity Machine Learning - Classification" function by Multiverse Computing
singularity = catalog.load("multiverse/singularity")

# generate the synthetic dataset
X, y = make_moons(n_samples=1000)

# split the data into training and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

job = singularity.run(
action="create_fit_predict",
num_learners=10,
regularization=0.01,
optimizer_options={"simulator": True},
X_train=X_train,
y_train=y_train,
X_test=X_test,
options={"save": False},
)

# get job status and result
status = job.status()
result = job.result()

print("Job status: ", status)
print("Action result status: ", result["status"])
print("Action result message: ", result["message"])
print("Predictions (first five results): ", result["data"]["predictions"][:5])
print(
"Probabilities (first five results): ",
result["data"]["probabilities"][:5],
)
print("Usage metadata: ", result["metadata"]["resource_usage"])
Job status:  QUEUED
Action result status: ok
Action result message: Classifier created, fitted, and predicted.
Predictions (first five results): [0, 0, 1, 0, 0]
Probabilities (first five results): [[0.87119766531518, 0.1288023346848197], [0.87119766531518, 0.1288023346848197], [0.24470328446479797, 0.7552967155352032], [0.820524432250189, 0.17947556774981072], [0.6847610293419495, 0.31523897065805173]]
Usage metadata: {'RUNNING: MAPPING': {'CPU_TIME': 10.967791318893433}, 'RUNNING: WAITING_QPU': {'CPU_TIME': 59.91712307929993}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 59.097386837005615}, 'RUNNING: EXECUTING_QPU': {'QPU_TIME': 56.93338203430176}}

Бенчмарки

Ці бенчмарки показують, що класифікатор може досягати надзвичайно високої точності на складних задачах. Вони також демонструють, що збільшення кількості учнів в ансамблі (кількості кубітів) може призводити до підвищення точності.

"Класична точність" означає точність, отриману за допомогою відповідного класичного найкращого рішення, яким у цьому випадку є класифікатор AdaBoost на основі ансамблю розміром 75. "Квантова точність", натомість, означає точність, отриману за допомогою "Singularity Machine Learning - Classification".

ЗадачаРозмір набору данихРозмір ансамблюКількість кубітівКласична точністьКвантова точністьПокращення
Стабільність мережі5000 прикладів, 12 ознак555576%91%15%
Стабільність мережі5000 прикладів, 12 ознак656576%92%16%
Стабільність мережі5000 прикладів, 12 ознак757576%94%18%
Стабільність мережі5000 прикладів, 12 ознак858576%94%18%
Стабільність мережі5000 прикладів, 12 ознак10010076%95%19%

З розвитком і масштабуванням квантового апаратного забезпечення наслідки для нашого квантового класифікатора стають дедалі більш значущими. Хоча кількість кубітів справді накладає обмеження на розмір ансамблю, який можна використовувати, вона не обмежує обсяг даних, що можуть бути оброблені. Ця потужна можливість дозволяє класифікатору ефективно обробляти набори даних, що містять мільйони точок даних і тисячі ознак. Важливо зазначити, що обмеження, пов'язані з розміром ансамблю, можна вирішити шляхом реалізації великомасштабної версії класифікатора. Завдяки ітеративному підходу із зовнішнім циклом ансамбль можна динамічно розширювати, підвищуючи гнучкість і загальну продуктивність. Однак варто зауважити, що ця функція ще не реалізована в поточній версії класифікатора.

Журнал змін

4 червня 2025 р.

  • Оновлено QuantumEnhancedEnsembleClassifier з такими змінами:
    • Додано регуляризацію onsite/alpha. Можна вказати regularization_type як onsite або alpha
    • Додано авторегуляризацію. Можна встановити regularization на auto для використання авторегуляризації
    • Додано параметр optimization_data до методу fit для вибору даних оптимізації при квантовій оптимізації. Можна використати один з варіантів: train, validation або both
    • Покращено загальну продуктивність
  • Додано детальне відстеження статусу для запущених задач

20 травня 2025 р.

  • Стандартизовано обробку помилок

18 березня 2025 р.

  • Оновлено qiskit-serverless до 0.20.0 та базовий образ до 0.20.1

14 лютого 2025 р.

  • Оновлено базовий образ до 0.19.1

6 лютого 2025 р.

  • Оновлено qiskit-serverless до 0.19.0 та базовий образ до 0.19.0

13 листопада 2024 р.

  • Випуск Singularity Machine Learning - Classification

Отримати підтримку

З будь-яких питань звертайся до Multiverse Computing.

Обов'язково вкажи наступну інформацію:

  • ID задачі Qiskit Function (job.job_id)
  • Детальний опис проблеми
  • Будь-які відповідні повідомлення про помилки або коди
  • Кроки для відтворення проблеми

Наступні кроки