Sari la conținutul principal

Singularity Machine Learning - Classification: A Qiskit Function by Multiverse Computing

Notă
  • Funcțiile Qiskit sunt o funcționalitate experimentală disponibilă doar utilizatorilor IBM Quantum® Premium Plan, Flex Plan și On-Prem (prin IBM Quantum Platform API) Plan. Acestea se află în stare de previzualizare și pot suferi modificări.

Prezentare generală

Cu funcția „Singularity Machine Learning - Classification" poți rezolva probleme reale de machine learning pe hardware cuantic fără a necesita expertiză cuantică. Această funcție applicație, bazată pe metode ensemble, este un clasificator hibrid. Utilizează metode clasice precum boosting, bagging și stacking pentru antrenarea inițială a ensemble-ului. Ulterior, se folosesc algoritmi cuantici precum variational quantum eigensolver (VQE) și quantum approximate optimization algorithm (QAOA) pentru a îmbunătăți diversitatea, capacitățile de generalizare și complexitatea globală a ensemble-ului antrenat.

Spre deosebire de alte soluții de quantum machine learning, această funcție este capabilă să gestioneze seturi de date la scară largă cu milioane de exemple și caracteristici, fără a fi limitată de numărul de qubiți din QPU-ul țintă. Numărul de qubiți determină doar dimensiunea ensemble-ului care poate fi antrenat. De asemenea, este extrem de flexibilă și poate fi utilizată pentru a rezolva probleme de clasificare într-o gamă largă de domenii, inclusiv finanțe, sănătate și securitate cibernetică. Obține în mod consistent acuratețe ridicată pe probleme clasic dificile, care implică seturi de date de înaltă dimensionalitate, zgomotoase și dezechilibrate. Cum funcționează Este construită pentru:

  1. Ingineri și oameni de știință din domeniul datelor din companii care caută să-și îmbunătățească oferta tehnologică integrând quantum machine learning în produsele și serviciile lor,
  2. Cercetători din laboratoare de cercetare cuantică care explorează aplicații de quantum machine learning și doresc să valorifice calculul cuantic pentru sarcini de clasificare, și
  3. Studenți și profesori din instituții de învățământ în cursuri precum machine learning, care caută să demonstreze avantajele calculului cuantic.

Următorul exemplu prezintă diversele funcționalități ale acesteia, inclusiv create, list, fit și predict, și demonstrează utilizarea sa într-o problemă sintetică ce cuprinde două semicercuri interconectate, o problemă notorie dificilă din cauza graniței sale de decizie neliniare.

Descrierea funcției

Această funcție Qiskit permite utilizatorilor să rezolve probleme de clasificare binară folosind clasificatorul ensemble îmbunătățit cuantic al Singularity. În spatele scenei, folosește o abordare hibridă pentru a antrena clasic un ensemble de clasificatoare pe setul de date etichetat, iar apoi îl optimizează pentru diversitate maximă și generalizare folosind Quantum Approximate Optimization Algorithm (QAOA) pe QPU-urile IBM®. Printr-o interfață prietenoasă cu utilizatorul, poți configura un clasificator conform cerințelor tale, îl antrenezi pe setul de date dorit și îl utilizezi pentru a face predicții pe un set de date nevăzut anterior.

Pentru a rezolva o problemă generică de clasificare:

  1. Preprocesează setul de date și împarte-l în seturi de antrenare și testare. Opțional, poți împărți în continuare setul de antrenare în seturi de antrenare și validare. Acest lucru poate fi realizat folosind scikit-learn.
  2. Dacă setul de antrenare este dezechilibrat, îl poți reeșantiona pentru a echilibra clasele folosind imbalanced-learn.
  3. Încarcă seturile de antrenare, validare și testare separat în stocarea funcției folosind metoda file_upload a catalogului, pasând calea relevantă de fiecare dată.
  4. Inițializează clasificatorul cuantic folosind acțiunea create a funcției, care acceptă hiperparametri precum numărul și tipurile de algoritmi de învățare, regularizarea (valoarea lambda) și opțiunile de optimizare, inclusiv numărul de straturi, tipul de optimizer clasic, Backend-ul cuantic și altele.
  5. Antrenează clasificatorul cuantic pe setul de antrenare folosind acțiunea fit a funcției, pasând setul de antrenare etichetat și setul de validare dacă este aplicabil.
  6. Realizează predicții pe setul de testare nevăzut anterior folosind acțiunea predict a funcției.

Abordare bazată pe acțiuni

Funcția folosește o abordare bazată pe acțiuni. O poți gândi ca un mediu virtual în care folosești acțiuni pentru a efectua sarcini sau a-i schimba starea. În prezent, oferă următoarele acțiuni: list, create, delete, fit, predict, fit_predict și create_fit_predict. Următorul exemplu demonstrează acțiunea 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

Acțiunea list recuperează toți clasificatorii stocați în format *.pkl.tar din directorul de date partajat. Poți accesa și conținutul acestui director folosind metoda catalog.files(). În general, acțiunea list caută fișiere cu extensia *.pkl.tar în directorul de date partajat și le returnează în format de listă.

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii dintre create, list, fit, predict, fit_predict, create_fit_predict și delete.Da

Utilizare

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

2. Create

Acțiunea create creează un clasificator de tipul quantum_classifier specificat, folosind parametrii furnizați, și îl salvează în directorul de date partajate.

notă

Funcția acceptă momentan doar QuantumEnhancedEnsembleClassifier.

Intrări

NumeTipDescriereObligatoriuImplicit
actionstrNumele acțiunii, dintre create, list, fit, predict, fit_predict, create_fit_predict și delete.Da-
namestrNumele clasificatorului quantum, de ex. spam_classifier.Da-
instancestrInstanța IBM.Da-
backend_namestrResursa de calcul IBM. Implicit este None, ceea ce înseamnă că va fi folosit Backend-ul cu cele mai puține job-uri în așteptare.NuNone
quantum_classifierstrTipul clasificatorului quantum, adică QuantumEnhancedEnsembleClassifier.NuQuantumEnhancedEnsembleClassifier
num_learnersintegerNumărul de learner-e din ansamblu.Nu10
learners_typeslistTipurile de learner-e. Printre tipurile acceptate se numără: DecisionTreeClassifier, GaussianNB, KNeighborsClassifier, MLPClassifier și LogisticRegression. Detalii suplimentare despre fiecare pot fi găsite în documentația scikit-learn.Nu[DecisionTreeClassifier]
learners_proportionslistProporțiile fiecărui tip de learner în ansamblu.Nu[1.0]
learners_optionslistOpțiuni pentru fiecare tip de learner din ansamblu. Pentru o listă completă a opțiunilor corespunzătoare tipului/tipurilor de learner ales/alese, consultă documentația scikit-learn.Nu[{"max_depth": 3, "splitter": "random", "class_weight": None}]
regularization_typestr sau listTipul/tipurile de regularizare care vor fi utilizate: onsite sau alpha. onsite controlează termenul onsite, unde valori mai mari duc la ansambluri mai rare. alpha controlează echilibrul dintre termenii de interacțiune și cei onsite, unde valori mai mici duc la ansambluri mai rare. Dacă se furnizează o listă, modelele vor fi antrenate pentru fiecare tip, iar cel mai performant va fi selectat.Nuonsite
regularizationstr sau float sau listValoarea de regularizare. Cuprinsă între 0 și +inf dacă regularization_type este onsite. Cuprinsă între 0 și 1 dacă regularization_type este alpha. Dacă este setat la auto, se folosește auto-regularizarea — parametrul optim de regularizare este găsit prin căutare binară, cu raportul dorit de clasificatori selectați față de totalul clasificatorilor (regularization_desired_ratio) și limita superioară a parametrului de regularizare (regularization_upper_bound). Dacă se furnizează o listă, modelele vor fi antrenate pentru fiecare valoare, iar cel mai performant va fi selectat.Nu0.01
regularization_desired_ratiofloat sau listRaportul/rapoartele dorite de clasificatori selectați față de totalul clasificatorilor pentru auto-regularizare. Dacă se furnizează o listă, modelele vor fi antrenate pentru fiecare raport, iar cel mai performant va fi selectat.Nu0.75
regularization_upper_boundfloat sau listLimita/limitele superioare ale parametrului de regularizare când se folosește auto-regularizarea. Dacă se furnizează o listă, modelele vor fi antrenate pentru fiecare limită superioară, iar cel mai performant va fi selectat.Nu200
weight_update_methodstrMetoda de actualizare a ponderilor eșantioanelor, dintre logarithmic și quadratic.Nulogarithmic
sample_scalingbooleanDacă scalarea eșantioanelor trebuie aplicată.NuFalse
prediction_scalingfloatFactorul de scalare pentru predicții.NuNone
optimizer_optionsdictionaryOpțiunile optimizatorului QAOA. O listă cu opțiunile disponibile este prezentată mai jos în această documentație.Nu...
votingstrFolosește votul majoritar (hard) sau media probabilităților (soft) pentru agregarea predicțiilor/probabilităților learner-elor.Nuhard
prob_thresholdfloatPragul optim de probabilitate.Nu0.5
random_stateintegerControlează aleatorismul pentru reproductibilitate.NuNone
  • În plus, optimizer_options sunt enumerate după cum urmează:
NumeTipDescriereObligatoriuImplicit
num_solutionsintegerNumărul de soluțiiNu1024
repsintegerNumărul de repetițiiNu4
sparsifyfloatPragul de sparsificareNu0.001
thetafloatValoarea inițială a lui theta, un parametru variațional al QAOANuNone
simulatorbooleanDacă să fie folosit un simulator sau un QPUNuFalse
classical_optimizerstrNumele optimizatorului clasic pentru QAOA. Toți solverii oferiți de SciPy, enumerați aici, pot fi utilizați. Va trebui să setezi classical_optimizer_options corespunzătorNuCOBYLA
classical_optimizer_optionsdictionaryOpțiunile optimizatorului clasic. Pentru o listă completă a opțiunilor disponibile, consultă documentația SciPyNu{"maxiter": 60}
optimization_levelintegerAdâncimea Circuit-ului QAOANu3
num_transpiler_runsintegerNumărul de rulări ale Transpiler-uluiNu30
pass_manager_optionsdictionaryOpțiuni pentru generarea pass manager-ului presetNu{"approximation_degree": 1.0}
estimator_optionsdictionaryOpțiunile Estimator-ului. Pentru o listă completă a opțiunilor disponibile, consultă documentația Qiskit Runtime ClientNuNone
sampler_optionsdictionaryOpțiunile Sampler-ului. Pentru o listă completă a opțiunilor disponibile, consultă documentația Qiskit Runtime ClientNuNone
  • estimator_options implicite sunt:
NumeTipValoare
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"],}}
  • sampler_options implicite sunt:
NumeTipValoare
default_shotsinteger1024
resilience_levelinteger1
twirlingdictionary{"enable_gates": True}
dynamical_decouplingdictionary{"enable": True}

Utilizare

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},
)

Validări

  • name:
    • Numele trebuie să fie unic, un șir de maximum 64 de caractere.
    • Poate conține doar caractere alfanumerice și liniuțe de subliniere.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu o liniuță de subliniere.
    • Niciun clasificator cu același nume nu ar trebui să existe deja în directorul de date partajate.

3. Delete

Acțiunea delete elimină un clasificator din directorul de date partajate.

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii. Trebuie să fie delete.Da
namestrNumele clasificatorului de șters.Da

Utilizare

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

Validări

  • name:
    • Numele trebuie să fie unic, un șir de maximum 64 de caractere.
    • Poate conține doar caractere alfanumerice și liniuțe de subliniere.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu o liniuță de subliniere.
    • Un clasificator cu același nume trebuie să existe deja în directorul de date partajate.

4. Fit

Acțiunea fit antrenează un clasificator folosind datele de antrenament furnizate.

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii. Trebuie să fie fit.Da
namestrNumele clasificatorului de antrenat.Da
Xarray sau list sau strDatele de antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un fișier din directorul de date partajate.Da
yarray sau list sau strValorile țintă pentru antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un fișier din directorul de date partajate.Da
fit_paramsdictionaryParametri suplimentari de transmis metodei fit a clasificatorului.Nu
fit_params
NumeTipDescriereObligatoriuImplicit
validation_datatupleDatele și etichetele de validare.NuNone
pos_labelinteger sau strEticheta de clasă care va fi mapată la 1.NuNone
optimization_datastrSetul de date pe care să fie optimizat ansamblul. Poate fi unul dintre: train, validation, both.Nutrain

Utilizare

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
)

Validări

  • name:
    • Numele trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Un clasificator cu același nume trebuie să existe deja în directorul de date partajate.

5. Predict

Acțiunea predict este folosită pentru a obține predicții tari și moi (probabilități).

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii. Trebuie să fie predict.Da
namestrNumele clasificatorului care va fi folosit.Da
Xarray sau list sau strDatele de test. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
options["out"]strNumele fișierului JSON de ieșire în care să fie salvate predicțiile în directorul de date partajate. Dacă nu este furnizat, predicțiile sunt returnate în rezultatul job-ului.Nu

Utilizare

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",
},
)

Validări

  • name:
    • Numele trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Un clasificator cu același nume trebuie să existe deja în directorul de date partajate.
  • options["out"]:
    • Numele fișierului trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Trebuie să aibă extensia .json.

6. Fit-predict

Acțiunea fit_predict antrenează un clasificator folosind datele de antrenament și apoi îl utilizează pentru a obține predicții tari și moi (probabilități).

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii. Trebuie să fie fit_predict.Da
namestrNumele clasificatorului care va fi folosit.Da
X_trainarray sau list sau strDatele de antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
y_trainarray sau list sau strValorile țintă de antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
X_testarray sau list sau strDatele de test. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
fit_paramsdictionaryParametri suplimentari care vor fi pasați metodei fit a clasificatorului.Nu
options["out"]strNumele fișierului JSON de ieșire în care să fie salvate predicțiile în directorul de date partajate. Dacă nu este furnizat, predicțiile sunt returnate în rezultatul job-ului.Nu

Utilizare

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",
},
)

Validări

  • name:

    • Numele trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Un clasificator cu același nume trebuie să existe deja în directorul de date partajate.
  • options["out"]:

    • Numele fișierului trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Trebuie să aibă extensia .json.

7. Create-fit-predict

Acțiunea create_fit_predict creează un clasificator, îl antrenează folosind datele de antrenament furnizate și apoi îl utilizează pentru a obține predicții tari și moi (probabilități).

Intrări

NumeTipDescriereObligatoriu
actionstrNumele acțiunii, dintre create, list, fit, predict, fit_predict, create_fit_predict și delete.Da
namestrNumele clasificatorului care va fi folosit.Da
quantum_classifierstrTipul clasificatorului, adică QuantumEnhancedEnsembleClassifier. Implicit este QuantumEnhancedEnsembleClassifier.Nu
X_trainarray sau list sau strDatele de antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
y_trainarray sau list sau strValorile țintă de antrenament. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
X_testarray sau list sau strDatele de test. Poate fi un array NumPy, o listă sau un șir de caractere care referențiază un nume de fișier din directorul de date partajate.Da
fit_paramsdictionaryParametri suplimentari care vor fi pasați metodei fit a clasificatorului.Nu
options["save"]booleanDacă clasificatorul antrenat să fie salvat în directorul de date partajate. Implicit este True.Nu
options["out"]strNumele fișierului JSON de ieșire în care să fie salvate predicțiile în directorul de date partajate. Dacă nu este furnizat, predicțiile sunt returnate în rezultatul job-ului.Nu

Utilizare

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",
},
)

Validări

  • name:

    • Dacă options["save"] este setat la True:
      • Numele trebuie să fie unic, un șir de caractere de până la 64 de caractere.
      • Poate conține doar caractere alfanumerice și underscore-uri.
      • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
      • Niciun clasificator cu același nume nu trebuie să existe deja în directorul de date partajate.
  • options["out"]:

    • Numele fișierului trebuie să fie unic, un șir de caractere de până la 64 de caractere.
    • Poate conține doar caractere alfanumerice și underscore-uri.
    • Trebuie să înceapă cu o literă și nu poate să se termine cu un underscore.
    • Trebuie să aibă extensia .json.

Primii pași

Autentifică-te folosind cheia ta de API IBM Quantum Platform și selectează Qiskit Function după cum urmează:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

Exemplu

În acest exemplu, vei folosi funcția „Singularity Machine Learning - Classification" pentru a clasifica un set de date format din două semicercuri interconectate în formă de lună. Setul de date este sintetic, bidimensional și etichetat cu etichete binare. Este creat pentru a fi dificil pentru algoritmi precum clustering bazat pe centroizi și clasificare liniară. Setul de date Moons Prin acest proces, vei învăța cum să creezi clasificatorul, să îl antrenezi pe datele de antrenament, să îl folosești pentru a face predicții pe datele de test și să îl ștergi când ai terminat. Înainte de a începe, trebuie să instalezi scikit-learn. Instalează-l folosind următoarea comandă:

python3 -m pip install scikit-learn

Efectuează pașii următori:

  1. Creează setul de date sintetic folosind funcția make_moons din scikit-learn.
  2. Încarcă setul de date sintetic generat în directorul de date partajate.
  3. Creează clasificatorul îmbunătățit cuantic folosind acțiunea create.
  4. Listează clasificatorii tăi folosind acțiunea list.
  5. Antrenează clasificatorul pe datele de antrenament folosind acțiunea fit.
  6. Folosește clasificatorul antrenat pentru a face predicții pe datele de test, utilizând acțiunea predict.
  7. Șterge clasificatorul folosind acțiunea delete.
  8. Fă curățenie după ce ai terminat. Pasul 1. Importă modulele necesare și generează setul de date sintetic, apoi împarte-l în seturi de antrenament și de test.
# 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]

Pasul 2. Salvează seturile de date de antrenament și testare etichetate pe discul local, apoi încarcă-le în directorul de date partajate.

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

Pasul 3. Creează un clasificator îmbunătățit cuantic folosind acțiunea 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']

Pasul 4. Antrenează clasificatorul cu îmbunătățiri cuantice folosind acțiunea 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}}}}

Pasul 5. Obține predicții și probabilități de la clasificatorul cu îmbunătățiri cuantice folosind acțiunea 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]]

Pasul 6. Șterge clasificatorul cu îmbunătățiri cuantice folosind acțiunea 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': {}}}

Pasul 7. Curăță directoarele de date locale și partajate.

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

Benchmark-uri

Aceste benchmark-uri arată că clasificatorul poate atinge acuratețe extrem de ridicată pe probleme dificile. De asemenea, demonstrează că mărirea numărului de learner-e din ansamblu (numărul de Qubiți) poate conduce la o acuratețe mai mare.

„Acuratețea clasică" se referă la acuratețea obținută folosind metoda clasică corespunzătoare de ultimă generație, care în acest caz este un clasificator AdaBoost bazat pe un ansamblu de dimensiune 75. „Acuratețea cuantică" se referă, pe de altă parte, la acuratețea obținută folosind „Singularity Machine Learning - Classification".

ProblemăDimensiunea setului de dateDimensiunea ansambluluiNumărul de QubițiAcuratețe clasicăAcuratețe cuanticăÎmbunătățire
Stabilitate rețea5000 exemple, 12 caracteristici555576%91%15%
Stabilitate rețea5000 exemple, 12 caracteristici656576%92%16%
Stabilitate rețea5000 exemple, 12 caracteristici757576%94%18%
Stabilitate rețea5000 exemple, 12 caracteristici858576%94%18%
Stabilitate rețea5000 exemple, 12 caracteristici10010076%95%19%

Pe măsură ce hardware-ul cuantic evoluează și se extinde, implicațiile pentru clasificatorul nostru cuantic devin din ce în ce mai semnificative. Deși numărul de Qubiți impune limitări asupra dimensiunii ansamblului care poate fi utilizat, acesta nu restricționează volumul de date ce pot fi procesate. Această capabilitate puternică permite clasificatorului să gestioneze eficient seturi de date ce conțin milioane de puncte de date și mii de caracteristici. Important de menționat este că limitările legate de dimensiunea ansamblului pot fi abordate prin implementarea unei versiuni la scară largă a clasificatorului. Prin valorificarea unei abordări iterative cu buclă exterioară, ansamblul poate fi extins dinamic, sporind flexibilitatea și performanța generală. Totuși, merită remarcat că această funcționalitate nu a fost încă implementată în versiunea actuală a clasificatorului.

Jurnal de modificări

4 iunie 2025

  • Actualizat QuantumEnhancedEnsembleClassifier cu următoarele modificări:
    • Adăugată regularizare onsite/alpha. Poți specifica regularization_type ca onsite sau alpha
    • Adăugată auto-regularizare. Poți seta regularization la auto pentru a folosi auto-regularizarea
    • Adăugat parametrul optimization_data la metoda fit pentru a alege datele de optimizare pentru optimizarea cuantică. Poți folosi una dintre aceste opțiuni: train, validation sau both
    • Îmbunătățită performanța generală
  • Adăugată urmărire detaliată a stării pentru job-urile în execuție

20 mai 2025

  • Standardizată gestionarea erorilor

18 martie 2025

  • Actualizat qiskit-serverless la 0.20.0 și imaginea de bază la 0.20.1

14 februarie 2025

  • Actualizată imaginea de bază la 0.19.1

6 februarie 2025

  • Actualizat qiskit-serverless la 0.19.0 și imaginea de bază la 0.19.0

13 noiembrie 2024

  • Lansarea Singularity Machine Learning - Classification

Obține suport

Pentru orice întrebări, contactează Multiverse Computing.

Asigură-te că incluzi următoarele informații:

  • ID-ul job-ului Qiskit Function (job.job_id)
  • O descriere detaliată a problemei
  • Orice mesaje de eroare sau coduri relevante
  • Pașii pentru a reproduce problema

Pași următori