Przejdź do głównej treści

Singularity Machine Learning - Classification: Funkcja Qiskit od Multiverse Computing

Uwaga
  • Funkcje Qiskit to funkcja eksperymentalna dostępna wyłącznie dla użytkowników planów IBM Quantum® Premium Plan, Flex Plan oraz On-Prem (za pośrednictwem interfejsu API IBM Quantum Platform). Mają status wersji zapoznawczej i mogą ulec zmianie.

Przegląd

Funkcja „Singularity Machine Learning - Classification" pozwala rozwiązywać rzeczywiste problemy uczenia maszynowego na sprzęcie kwantowym bez konieczności posiadania wiedzy z zakresu informatyki kwantowej. Ta funkcja aplikacyjna, oparta na metodach zespołowych, jest hybrydowym klasyfikatorem. Wykorzystuje klasyczne metody, takie jak boosting, bagging i stacking, do wstępnego trenowania zespołu. Następnie stosuje algorytmy kwantowe — wariacyjny solver własny (VQE) oraz kwantowy algorytm przybliżonej optymalizacji (QAOA) — w celu zwiększenia różnorodności wytrenowanego zespołu, jego zdolności do generalizacji oraz ogólnej złożoności.

W przeciwieństwie do innych rozwiązań z zakresu kwantowego uczenia maszynowego, ta funkcja potrafi obsługiwać wielkoskalowe zbiory danych zawierające miliony przykładów i cech, nie będąc ograniczona liczbą Qubitów w docelowym QPU. Liczba Qubitów określa jedynie rozmiar zespołu, który można wytrenować. Funkcja jest również bardzo elastyczna i może być stosowana do rozwiązywania problemów klasyfikacyjnych w szerokim zakresie dziedzin, w tym finansów, opieki zdrowotnej i cyberbezpieczeństwa. Konsekwentnie osiąga wysoką dokładność na klasycznie trudnych problemach obejmujących wielowymiarowe, zaszumione i niezrównoważone zbiory danych. Jak to działa Przeznaczona jest dla:

  1. Inżynierów i naukowców zajmujących się danymi w firmach, którzy chcą wzbogacić swoją ofertę technologiczną, integrując kwantowe uczenie maszynowe ze swoimi produktami i usługami,
  2. Badaczy w laboratoriach badań kwantowych eksplorujących zastosowania kwantowego uczenia maszynowego i pragnących wykorzystać obliczenia kwantowe do zadań klasyfikacyjnych, oraz
  3. Studentów i nauczycieli w instytucjach edukacyjnych, na kursach takich jak uczenie maszynowe, którzy chcą zademonstrować przewagi obliczeń kwantowych.

Poniższy przykład prezentuje różne funkcjonalności, w tym create, list, fit i predict, oraz demonstruje ich użycie na syntetycznym problemie złożonym z dwóch przeplatających się półokręgów — notorrycznie trudnym ze względu na nieliniową granicę decyzyjną.

Opis funkcji

Ta funkcja Qiskit umożliwia użytkownikom rozwiązywanie binarnych problemów klasyfikacyjnych za pomocą kwantowo ulepszonego klasyfikatora zespołowego Singularity. W tle wykorzystuje podejście hybrydowe: klasycznie trenuje zespół klasyfikatorów na oznaczonym zbiorze danych, a następnie optymalizuje go pod kątem maksymalnej różnorodności i generalizacji przy użyciu Kwantowego Algorytmu Przybliżonej Optymalizacji (QAOA) na QPU IBM®. Dzięki przyjaznemu interfejsowi użytkownicy mogą skonfigurować klasyfikator zgodnie ze swoimi wymaganiami, wytrenować go na wybranym zbiorze danych i użyć do przewidywania na wcześniej niewidzianym zbiorze danych.

Aby rozwiązać ogólny problem klasyfikacyjny:

  1. Przygotuj wstępnie zbiór danych i podziel go na zestawy treningowy i testowy. Opcjonalnie możesz dalej podzielić zestaw treningowy na zestawy treningowy i walidacyjny. Można to osiągnąć za pomocą scikit-learn.
  2. Jeśli zestaw treningowy jest niezrównoważony, możesz go próbkować ponownie, aby wyrównać klasy, używając imbalanced-learn.
  3. Prześlij zestawy treningowy, walidacyjny i testowy osobno do magazynu funkcji, używając metody file_upload katalogu i podając odpowiednią ścieżkę za każdym razem.
  4. Zainicjuj klasyfikator kwantowy, używając akcji create funkcji, która przyjmuje hiperparametry, takie jak liczba i typy uczących się modeli, regularyzacja (wartość lambda) oraz opcje optymalizacji, w tym liczba warstw, typ klasycznego optymalizatora, Backend kwantowy itd.
  5. Wytrenuj klasyfikator kwantowy na zestawie treningowym, używając akcji fit funkcji, podając oznaczony zestaw treningowy i zestaw walidacyjny (jeśli dotyczy).
  6. Wykonaj przewidywania na wcześniej niewidzianym zestawie testowym, używając akcji predict funkcji.

Podejście oparte na akcjach

Funkcja korzysta z podejścia opartego na akcjach. Możesz myśleć o niej jak o wirtualnym środowisku, w którym używasz akcji do wykonywania zadań lub zmiany jego stanu. Obecnie oferuje następujące akcje: list, create, delete, fit, predict, fit_predict i create_fit_predict. Poniższy przykład demonstruje akcję create_fit_predict.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit-ibm-catalog scikit-learn
# 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): [1, 0, 0, 1, 0]
Probabilities (first five results): [[0.16849563539001172, 0.8315043646099888], [0.8726393386620336, 0.12736066133796647], [0.795344837290717, 0.20465516270928288], [0.36822585748882725, 0.6317741425111725], [0.6656662698604361, 0.3343337301395641]]
Usage metadata: {'RUNNING: MAPPING': {'CPU_TIME': 7.945035696029663}, 'RUNNING: WAITING_QPU': {'CPU_TIME': 82.41029238700867}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 77.3459484577179}, 'RUNNING: EXECUTING_QPU': {'QPU_TIME': 71.27004957199097}}

1. List

Akcja list pobiera wszystkie zapisane klasyfikatory w formacie *.pkl.tar ze współdzielonego katalogu danych. Zawartość tego katalogu możesz też przeglądać metodą catalog.files(). Ogólnie rzecz biorąc, akcja list wyszukuje pliki z rozszerzeniem *.pkl.tar we współdzielonym katalogu danych i zwraca je w postaci listy.

Wejście

NazwaTypOpisWymagane
actionstrNazwa akcji spośród: create, list, fit, predict, fit_predict, create_fit_predict i delete.Tak

Użycie

job = singularity.run(action="list")

2. Create

Akcja create tworzy klasyfikator określonego typu quantum_classifier, korzystając z podanych parametrów, i zapisuje go we współdzielonym katalogu danych.

uwaga

Funkcja obsługuje obecnie wyłącznie QuantumEnhancedEnsembleClassifier.

Wejście

NazwaTypOpisWymaganeDomyślnie
actionstrNazwa akcji spośród: create, list, fit, predict, fit_predict, create_fit_predict i delete.Tak-
namestrNazwa klasyfikatora kwantowego, np. spam_classifier.Tak-
instancestrInstancja IBM.Tak-
backend_namestrZasób obliczeniowy IBM. Domyślnie None, co oznacza użycie Backend z najmniejszą liczbą oczekujących zadań.NieNone
quantum_classifierstrTyp klasyfikatora kwantowego, tj. QuantumEnhancedEnsembleClassifier.NieQuantumEnhancedEnsembleClassifier
num_learnersintegerLiczba uczących się modeli w zespole.Nie10
learners_typeslistTypy uczących się modeli. Wśród obsługiwanych typów znajdują się: DecisionTreeClassifier, GaussianNB, KNeighborsClassifier, MLPClassifier i LogisticRegression. Szczegółowe informacje na temat każdego z nich znajdziesz w dokumentacji scikit-learn.Nie[DecisionTreeClassifier]
learners_proportionslistProporcje każdego typu uczącego się modelu w zespole.Nie[1.0]
learners_optionslistOpcje dla każdego typu uczącego się modelu w zespole. Pełną listę opcji odpowiadających wybranym typom modeli znajdziesz w dokumentacji scikit-learn.Nie[{"max_depth": 3, "splitter": "random", "class_weight": None}]
regularization_typestr lub listTyp(y) regularyzacji: onsite lub alpha. Wartość onsite kontroluje człon onsite — wyższe wartości prowadzą do rzadszych zespołów. Wartość alpha kontroluje stosunek między członem interakcji a członem onsite — niższe wartości prowadzą do rzadszych zespołów. Jeśli podasz listę, dla każdego typu zostaną wytrenowane modele, a najlepszy zostanie wybrany.Nieonsite
regularizationstr lub float lub listWartość regularyzacji. Ograniczona do przedziału od 0 do +inf, jeśli regularization_type wynosi onsite. Ograniczona do przedziału od 0 do 1, jeśli regularization_type wynosi alpha. Jeśli ustawiono auto, stosowana jest auto-regularyzacja — optymalny parametr regularyzacji jest wyznaczany metodą przeszukiwania binarnego przy zadanym współczynniku wybranych klasyfikatorów do wszystkich klasyfikatorów (regularization_desired_ratio) oraz górnym ograniczeniu parametru regularyzacji (regularization_upper_bound). Jeśli podasz listę, dla każdej wartości zostaną wytrenowane modele, a najlepszy zostanie wybrany.Nie0.01
regularization_desired_ratiofloat lub listŻądany współczynnik(i) wybranych klasyfikatorów do wszystkich klasyfikatorów przy auto-regularyzacji. Jeśli podasz listę, dla każdego współczynnika zostaną wytrenowane modele, a najlepszy zostanie wybrany.Nie0.75
regularization_upper_boundfloat lub listGórne ograniczenie(a) parametru regularyzacji przy stosowaniu auto-regularyzacji. Jeśli podasz listę, dla każdego górnego ograniczenia zostaną wytrenowane modele, a najlepszy zostanie wybrany.Nie200
weight_update_methodstrMetoda aktualizacji wag próbek spośród logarithmic i quadratic.Nielogarithmic
sample_scalingbooleanCzy należy zastosować skalowanie próbek.NieFalse
prediction_scalingfloatWspółczynnik skalowania prognoz.NieNone
optimizer_optionsdictionaryOpcje optymalizatora QAOA. Lista dostępnych opcji przedstawiona jest w dalszej części tej dokumentacji.Nie...
votingstrUżyj głosowania większościowego (hard) lub średniej prawdopodobieństw (soft) do agregowania prognoz/prawdopodobieństw modeli.Niehard
prob_thresholdfloatOptymalny próg prawdopodobieństwa.Nie0.5
random_stateintegerKontroluj losowość w celu zapewnienia powtarzalności.NieNone
  • Dodatkowo, opcje optimizer_options są wymienione poniżej:
NazwaTypOpisWymaganeDomyślnie
num_solutionsintegerLiczba rozwiązańNie1024
repsintegerLiczba powtórzeńNie4
sparsifyfloatPróg rzadkościNie0.001
thetafloatWartość początkowa parametru theta, parametru wariacyjnego QAOANieNone
simulatorbooleanCzy używać symulatora czy QPUNieFalse
classical_optimizerstrNazwa klasycznego optymalizatora dla QAOA. Można użyć wszystkich solwerów oferowanych przez SciPy, wymienionych tutaj. Należy odpowiednio ustawić classical_optimizer_optionsNieCOBYLA
classical_optimizer_optionsdictionaryOpcje klasycznego optymalizatora. Pełną listę dostępnych opcji znajdziesz w dokumentacji SciPyNie{"maxiter": 60}
optimization_levelintegerGłębokość Circuit QAOANie3
num_transpiler_runsintegerLiczba uruchomień TranspilerNie30
pass_manager_optionsdictionaryOpcje generowania menedżera przejść (preset pass manager)Nie{"approximation_degree": 1.0}
estimator_optionsdictionaryOpcje Estimator. Pełną listę dostępnych opcji znajdziesz w dokumentacji Qiskit Runtime ClientNieNone
sampler_optionsdictionaryOpcje Sampler. Pełną listę dostępnych opcji znajdziesz w dokumentacji Qiskit Runtime ClientNieNone
  • Domyślne wartości estimator_options:
NazwaTypWartość
default_shotsinteger1024
resilience_levelinteger2
twirlingdictionary{"enable_gates": True}
dynamical_decouplingdictionary{"enable": True}
resilience_optionsdictionary{"zne_mitigation": False, "zne": {"amplifier": "pea", "noise_factors": [1.0, 1.3, 1.6], "extrapolator": ["linear", "polynomial_degree_2", "exponential"],}}
  • Domyślne wartości sampler_options:
NazwaTypWartość
default_shotsinteger1024
resilience_levelinteger1
twirlingdictionary{"enable_gates": True}
dynamical_decouplingdictionary{"enable": True}

Użycie

job = singularity.run(
action="create",
name="classifier_name", # specify your custom name for the classifier here
num_learners=10,
regularization=0.01,
optimizer_options={"simulator": True},
)

Walidacje

  • name:
    • Nazwa musi być unikalna i zawierać maksymalnie 64 znaki.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • We współdzielonym katalogu danych nie może już istnieć żaden klasyfikator o tej samej nazwie.

3. Delete

Akcja delete usuwa klasyfikator ze współdzielonego katalogu danych.

Wejście

NazwaTypOpisWymagane
actionstrNazwa akcji. Musi wynosić delete.Tak
namestrNazwa klasyfikatora do usunięcia.Tak

Użycie

job = singularity.run(
action="delete",
name="classifier_name", # specify the name of the classifier to delete here
)

Walidacje

  • name:
    • Nazwa musi być unikalna i zawierać maksymalnie 64 znaki.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • We współdzielonym katalogu danych musi już istnieć klasyfikator o tej samej nazwie.

4. Fit

Akcja fit trenuje klasyfikator przy użyciu dostarczonych danych treningowych.

Dane wejściowe

NazwaTypOpisWymagane
actionstrNazwa akcji. Musi mieć wartość fit.Tak
namestrNazwa klasyfikatora do wytrenowania.Tak
Xarray lub list lub strDane treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
yarray lub list lub strDocelowe wartości treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
fit_paramsdictionaryDodatkowe parametry przekazywane do metody fit klasyfikatora.Nie
fit_params
NazwaTypOpisWymaganeDomyślnie
validation_datatupleDane walidacyjne i etykiety.NieNone
pos_labelinteger lub strEtykieta klasy mapowana na 1.NieNone
optimization_datastrZbiór danych do optymalizacji zespołu. Może przyjmować jedną z wartości: train, validation, both.Nietrain

Użycie

job = singularity.run(
action="fit",
name="classifier_name", # specify the name of the classifier to train here
X=X_train, # or "X_train.npy" if you uploaded it in the shared data directory
y=y_train, # or "y_train.npy" if you uploaded it in the shared data directory
fit_params={}, # define the fit parameters here
)

Walidacje

  • name:
    • Nazwa musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Klasyfikator o tej samej nazwie powinien już istnieć we współdzielonym katalogu danych.

5. Predict

Akcja predict służy do uzyskiwania twardych i miękkich prognoz (prawdopodobieństw).

Dane wejściowe

NazwaTypOpisWymagane
actionstrNazwa akcji. Musi mieć wartość predict.Tak
namestrNazwa klasyfikatora do użycia.Tak
Xarray lub list lub strDane testowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
options["out"]strNazwa pliku wyjściowego JSON do zapisania prognoz we współdzielonym katalogu danych. Jeśli nie zostanie podana, prognozy są zwracane w wyniku zadania.Nie

Użycie

job = singularity.run(
action="predict",
name="classifier_name", # specify the name of the classifier to use here
X=X_test, # or "X_test.npy" if you uploaded it to the shared data directory
options={
"out": "output.json",
},
)

Walidacje

  • name:
    • Nazwa musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Klasyfikator o tej samej nazwie powinien już istnieć we współdzielonym katalogu danych.
  • options["out"]:
    • Nazwa pliku musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Musi mieć rozszerzenie .json.

6. Fit-predict

Akcja fit_predict trenuje klasyfikator przy użyciu danych treningowych, a następnie używa go do uzyskiwania twardych i miękkich prognoz (prawdopodobieństw).

Dane wejściowe

NazwaTypOpisWymagane
actionstrNazwa akcji. Musi mieć wartość fit_predict.Tak
namestrNazwa klasyfikatora do użycia.Tak
X_trainarray lub list lub strDane treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
y_trainarray lub list lub strDocelowe wartości treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
X_testarray lub list lub strDane testowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
fit_paramsdictionaryDodatkowe parametry przekazywane do metody fit klasyfikatora.Nie
options["out"]strNazwa pliku wyjściowego JSON do zapisania prognoz we współdzielonym katalogu danych. Jeśli nie zostanie podana, prognozy są zwracane w wyniku zadania.Nie

Użycie

job = singularity.run(
action="fit_predict",
name="classifier_name", # specify the name of the classifier to use here
X_train=X_train, # or "X_train.npy" if you uploaded it in the shared data directory
y_train=y_train, # or "y_train.npy" if you uploaded it in the shared data directory
X_test=X_test, # or "X_test.npy" if you uploaded it in the shared data directory
fit_params={}, # define the fit parameters here
options={
"out": "output.json",
},
)

Walidacje

  • name:

    • Nazwa musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Klasyfikator o tej samej nazwie powinien już istnieć we współdzielonym katalogu danych.
  • options["out"]:

    • Nazwa pliku musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Musi mieć rozszerzenie .json.

7. Create-fit-predict

Akcja create_fit_predict tworzy klasyfikator, trenuje go przy użyciu dostarczonych danych treningowych, a następnie używa go do uzyskiwania twardych i miękkich prognoz (prawdopodobieństw).

Dane wejściowe

NazwaTypOpisWymagane
actionstrNazwa akcji spośród: create, list, fit, predict, fit_predict, create_fit_predict i delete.Tak
namestrNazwa klasyfikatora do użycia.Tak
quantum_classifierstrTyp klasyfikatora, tzn. QuantumEnhancedEnsembleClassifier. Domyślnie QuantumEnhancedEnsembleClassifier.Nie
X_trainarray lub list lub strDane treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
y_trainarray lub list lub strDocelowe wartości treningowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
X_testarray lub list lub strDane testowe. Może to być tablica NumPy, lista lub ciąg znaków wskazujący nazwę pliku w współdzielonym katalogu danych.Tak
fit_paramsdictionaryDodatkowe parametry przekazywane do metody fit klasyfikatora.Nie
options["save"]booleanCzy zapisać wytrenowany klasyfikator we współdzielonym katalogu danych. Domyślnie True.Nie
options["out"]strNazwa pliku wyjściowego JSON do zapisania prognoz we współdzielonym katalogu danych. Jeśli nie zostanie podana, prognozy są zwracane w wyniku zadania.Nie

Użycie

job = singularity.run(
action="create_fit_predict",
name="classifier_name", # specify your custom name for the classifier here
num_learners=10,
regularization=0.01,
optimizer_options={"simulator": True},
X_train=X_train, # or "X_train.npy" if you uploaded it in the shared data directory
y_train=y_train, # or "y_train.npy" if you uploaded it in the shared data directory
X_test=X_test, # or "X_test.npy" if you uploaded it in the shared data directory
fit_params={}, # define the fit parameters here
options={
"save": True,
"out": "output.json",
},
)

Walidacje

  • name:

    • Jeśli options["save"] ma wartość True:
      • Nazwa musi być unikalna, ciąg znaków o długości do 64 znaków.
      • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
      • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
      • We współdzielonym katalogu danych nie powinien już istnieć klasyfikator o tej samej nazwie.
  • options["out"]:

    • Nazwa pliku musi być unikalna, ciąg znaków o długości do 64 znaków.
    • Może zawierać wyłącznie znaki alfanumeryczne i podkreślenia.
    • Musi zaczynać się od litery i nie może kończyć się podkreśleniem.
    • Musi mieć rozszerzenie .json.

Pierwsze kroki

Uwierzytelnij się przy użyciu klucza API IBM Quantum Platform i wybierz funkcję Qiskit w następujący sposób:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

Przykład

W tym przykładzie użyjesz funkcji „Singularity Machine Learning - Classification", aby sklasyfikować zbiór danych składający się z dwóch przeplatających się, półkolistych kształtów przypominających księżyce. Zbiór danych jest syntetyczny, dwuwymiarowy i opatrzony binarnymi etykietami. Został stworzony tak, by stanowił wyzwanie dla algorytmów takich jak grupowanie oparte na centroidach czy klasyfikacja liniowa. Zbiór danych moons Podczas tego procesu dowiesz się, jak utworzyć klasyfikator, dopasować go do danych treningowych, użyć go do przewidywania na danych testowych oraz usunąć klasyfikator po zakończeniu pracy. Przed rozpoczęciem musisz zainstalować scikit-learn. Zainstaluj go przy użyciu następującego polecenia:

python3 -m pip install scikit-learn

Wykonaj następujące kroki:

  1. Utwórz syntetyczny zbiór danych przy użyciu funkcji make_moons z biblioteki scikit-learn.
  2. Prześlij wygenerowany syntetyczny zbiór danych do wspólnego katalogu danych.
  3. Utwórz klasyfikator wspomagany kwantowo przy użyciu akcji create.
  4. Wypisz swoje klasyfikatory przy użyciu akcji list.
  5. Wytrenuj klasyfikator na danych treningowych przy użyciu akcji fit.
  6. Użyj wytrenowanego klasyfikatora do przewidywania na danych testowych przy użyciu akcji predict.
  7. Usuń klasyfikator przy użyciu akcji delete.
  8. Posprzątaj po zakończeniu.

Krok 1. Zaimportuj niezbędne moduły i wygeneruj syntetyczny zbiór danych, a następnie podziel go na zbiory treningowy i testowy.

# 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.99958218  0.02890441]
[ 0.03285169 0.24578719]
[ 1.13127903 -0.49134546]
[ 1.86951286 0.00608971]
[ 0.20190413 0.97940529]
[ 0.8831311 0.46912627]
[-0.10819442 0.99412975]
[-0.20005727 0.97978421]
[-0.78775705 0.61598607]
[ 1.82453236 -0.0658148 ]]
Targets: [0 1 1 1 0 0 0 0 0 1]

Krok 2. Zapisz oznaczone zbiory treningowy i testowy na lokalnym dysku, a następnie prześlij je do wspólnego katalogu danych.

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']

Krok 3. Utwórz klasyfikator wspomagany kwantowo przy użyciu akcji 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', 'y_test.npy.tar', 'y_train.npy.tar', 'my_classifier.pkl.tar']

Krok 4. Wytrenuj klasyfikator wspomagany kwantowo przy użyciu akcji 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': 8.45469617843628}, 'RUNNING: WAITING_QPU': {'CPU_TIME': 69.4949426651001}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 73.01881957054138}, 'RUNNING: EXECUTING_QPU': {'QPU_TIME': 75.4787163734436}}}}

Krok 5. Pobierz predykcje i prawdopodobieństwa z klasyfikatora wspomaganego kwantowo przy użyciu akcji 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, 1, 0, 0, 1]
Probabilities (first five results): [[1.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 0.0], [0.0, 1.0]]

Krok 6. Usuń klasyfikator wspomagany kwantowo przy użyciu akcji 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': {}}}

Krok 7. Wyczyść lokalne i wspólne katalogi danych.

# 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)

Testy wydajności

Te testy wydajności pokazują, że klasyfikator może osiągać wyjątkowo wysoką dokładność na trudnych problemach. Pokazują one również, że zwiększenie liczby uczniów w zespole (liczby Qubitów) może prowadzić do wzrostu dokładności.

„Dokładność klasyczna" odnosi się do dokładności uzyskanej przy użyciu odpowiedniego klasycznego modelu najnowszej generacji, którym w tym przypadku jest klasyfikator AdaBoost oparty na zespole o rozmiarze 75. „Dokładność kwantowa" natomiast odnosi się do dokładności uzyskanej przy użyciu „Singularity Machine Learning - Classification".

ProblemRozmiar zbioru danychRozmiar zespołuLiczba QubitówDokładność klasycznaDokładność kwantowaPoprawa
Stabilność sieci5000 przykładów, 12 cech555576%91%15%
Stabilność sieci5000 przykładów, 12 cech656576%92%16%
Stabilność sieci5000 przykładów, 12 cech757576%94%18%
Stabilność sieci5000 przykładów, 12 cech858576%94%18%
Stabilność sieci5000 przykładów, 12 cech10010076%95%19%

W miarę jak sprzęt kwantowy ewoluuje i skaluje się, implikacje dla naszego klasyfikatora kwantowego stają się coraz bardziej znaczące. Choć liczba Qubitów narzuca ograniczenia na rozmiar zespołu, który można wykorzystać, nie ogranicza ona wolumenu danych, jakie można przetwarzać. Ta potężna właściwość umożliwia klasyfikatorowi efektywne obsługiwanie zbiorów danych zawierających miliony punktów danych i tysiące cech. Co istotne, ograniczenia związane z rozmiarem zespołu można rozwiązać poprzez implementację wersji klasyfikatora na dużą skalę. Dzięki zastosowaniu iteracyjnego podejścia z zewnętrzną pętlą zespół może być dynamicznie rozszerzany, co zwiększa elastyczność i ogólną wydajność. Warto jednak zauważyć, że ta funkcja nie została jeszcze zaimplementowana w bieżącej wersji klasyfikatora.

Dziennik zmian

4 czerwca 2025

  • Zaktualizowano QuantumEnhancedEnsembleClassifier o następujące zmiany:
    • Dodano regularyzację onsite/alpha. Możesz określić regularization_type jako onsite lub alpha
    • Dodano automatyczną regularyzację. Możesz ustawić regularization na auto, aby używać automatycznej regularyzacji
    • Dodano parametr optimization_data do metody fit, umożliwiający wybór danych optymalizacyjnych dla optymalizacji kwantowej. Możesz użyć jednej z tych opcji: train, validation lub both
    • Poprawiono ogólną wydajność
  • Dodano szczegółowe śledzenie statusu dla uruchomionych zadań

20 maja 2025

  • Ujednolicono obsługę błędów

18 marca 2025

  • Zaktualizowano qiskit-serverless do wersji 0.20.0 i obraz bazowy do 0.20.1

14 lutego 2025

  • Zaktualizowano obraz bazowy do wersji 0.19.1

6 lutego 2025

  • Zaktualizowano qiskit-serverless do wersji 0.19.0 i obraz bazowy do 0.19.0

13 listopada 2024

  • Wydanie Singularity Machine Learning - Classification

Uzyskaj wsparcie

W przypadku jakichkolwiek pytań skontaktuj się z Multiverse Computing.

Pamiętaj, aby dołączyć następujące informacje:

  • ID zadania Qiskit Function (job.job_id)
  • Szczegółowy opis problemu
  • Wszelkie istotne komunikaty lub kody błędów
  • Kroki do odtworzenia problemu

Następne kroki