Vai al contenuto principale

Singularity Machine Learning - Classification: una Qiskit Function di Multiverse Computing

Nota
  • Le Qiskit Functions sono una funzionalità sperimentale disponibile solo per gli utenti dei piani IBM Quantum® Premium, Flex e On-Prem (tramite IBM Quantum Platform API). Sono in stato di anteprima e soggette a modifiche.

Panoramica

Con la funzione "Singularity Machine Learning - Classification", puoi risolvere problemi reali di machine learning su hardware quantistico senza necessitare di competenze specifiche in ambito quantistico. Questa funzione applicativa, basata su metodi ensemble, è un classificatore ibrido. Sfrutta metodi classici come boosting, bagging e stacking per l'addestramento iniziale dell'ensemble. Successivamente, algoritmi quantistici come il variational quantum eigensolver (VQE) e il quantum approximate optimization algorithm (QAOA) vengono impiegati per migliorare la diversità, le capacità di generalizzazione e la complessità complessiva dell'ensemble addestrato.

A differenza di altre soluzioni di machine learning quantistico, questa funzione è in grado di gestire dataset su larga scala con milioni di esempi e feature senza essere limitata dal numero di qubit nel QPU di destinazione. Il numero di qubit determina soltanto la dimensione dell'ensemble che può essere addestrato. È anche molto flessibile e può essere utilizzata per risolvere problemi di classificazione in un'ampia gamma di domini, tra cui finanza, sanità e cybersicurezza. Raggiunge costantemente alte accuratezze su problemi classicamente difficili che coinvolgono dataset ad alta dimensionalità, rumorosi e sbilanciati. Come funziona È pensata per:

  1. Ingegneri e data scientist di aziende che desiderano potenziare la propria offerta tecnologica integrando il machine learning quantistico nei propri prodotti e servizi,
  2. Ricercatori di laboratori di ricerca quantistica che esplorano applicazioni di machine learning quantistico e vogliono sfruttare il calcolo quantistico per attività di classificazione, e
  3. Studenti e docenti di istituzioni educative in corsi come quello di machine learning, che desiderano dimostrare i vantaggi del calcolo quantistico.

Il seguente esempio ne mostra le varie funzionalità, tra cui create, list, fit e predict, e ne dimostra l'utilizzo su un problema sintetico composto da due semicerchi a forma di mezza luna che si intrecciano, un problema notoriamente difficile a causa del suo confine decisionale non lineare.

Descrizione della funzione

Questa Qiskit Function permette agli utenti di risolvere problemi di classificazione binaria utilizzando il classificatore ensemble potenziato quantisticamente di Singularity. Dietro le quinte, usa un approccio ibrido per addestrare classicamente un ensemble di classificatori sul dataset etichettato, e poi lo ottimizza per massimizzare la diversità e la generalizzazione usando il Quantum Approximate Optimization Algorithm (QAOA) sui QPU IBM®. Tramite un'interfaccia intuitiva, gli utenti possono configurare un classificatore in base alle proprie esigenze, addestrarlo sul dataset desiderato e usarlo per fare previsioni su un dataset mai visto in precedenza.

Per risolvere un generico problema di classificazione:

  1. Preelabora il dataset e suddividilo in set di addestramento e di test. Facoltativamente, puoi suddividere ulteriormente il set di addestramento in set di addestramento e di validazione. Questo può essere ottenuto usando scikit-learn.
  2. Se il set di addestramento è sbilanciato, puoi ricampionarlo per bilanciare le classi usando imbalanced-learn.
  3. Carica separatamente i set di addestramento, validazione e test nell'archiviazione della funzione usando il metodo file_upload del catalogo, passando il percorso corrispondente ogni volta.
  4. Inizializza il classificatore quantistico usando l'azione create della funzione, che accetta iperparametri come il numero e i tipi di learner, la regolarizzazione (valore lambda) e le opzioni di ottimizzazione inclusi il numero di livelli, il tipo di ottimizzatore classico, il backend quantistico e così via.
  5. Addestra il classificatore quantistico sul set di addestramento usando l'azione fit della funzione, passandogli il set di addestramento etichettato e il set di validazione se applicabile.
  6. Esegui previsioni sul set di test precedentemente non visto usando l'azione predict della funzione.

Approccio basato su azioni

La funzione utilizza un approccio basato su azioni. Puoi pensarla come un ambiente virtuale in cui usi le azioni per eseguire attività o modificarne lo stato. Attualmente, offre le seguenti azioni: list, create, delete, fit, predict, fit_predict e create_fit_predict. L'esempio seguente illustra l'azione 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

L'azione list recupera tutti i classificatori memorizzati in formato *.pkl.tar dalla directory dati condivisa. Puoi anche accedere al contenuto di questa directory usando il metodo catalog.files(). In generale, l'azione list cerca file con l'estensione *.pkl.tar nella directory dati condivisa e li restituisce in formato lista.

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione tra create, list, fit, predict, fit_predict, create_fit_predict e delete.

Utilizzo

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

2. Create

L'azione create crea un classificatore del tipo quantum_classifier specificato usando i parametri forniti, e lo salva nella directory dati condivisa.

nota

La funzione attualmente supporta solo QuantumEnhancedEnsembleClassifier.

Input

NomeTipoDescrizioneObbligatorioPredefinito
actionstrIl nome dell'azione tra create, list, fit, predict, fit_predict, create_fit_predict e delete.-
namestrIl nome del classificatore quantistico, ad es. spam_classifier.-
instancestrIstanza IBM.-
backend_namestrRisorsa di calcolo IBM. Il valore predefinito è None, il che significa che verrà usato il backend con il minor numero di job in coda.NoNone
quantum_classifierstrIl tipo di classificatore quantistico, ovvero QuantumEnhancedEnsembleClassifier.NoQuantumEnhancedEnsembleClassifier
num_learnersintegerIl numero di learner nell'ensemble.No10
learners_typeslistTipi di learner. Tra i tipi supportati vi sono: DecisionTreeClassifier, GaussianNB, KNeighborsClassifier, MLPClassifier e LogisticRegression. Ulteriori dettagli su ciascuno sono disponibili nella documentazione di scikit-learn.No[DecisionTreeClassifier]
learners_proportionslistProporzioni di ciascun tipo di learner nell'ensemble.No[1.0]
learners_optionslistOpzioni per ciascun tipo di learner nell'ensemble. Per un elenco completo delle opzioni corrispondenti al tipo o ai tipi di learner scelti, consulta la documentazione di scikit-learn.No[{"max_depth": 3, "splitter": "random", "class_weight": None}]
regularization_typestr o listTipo/i di regolarizzazione da utilizzare: onsite o alpha. onsite controlla il termine onsite dove valori più alti portano a ensemble più sparsi. alpha controlla il compromesso tra termini di interazione e onsite dove valori più bassi portano a ensemble più sparsi. Se viene fornita una lista, verranno addestrati modelli per ciascun tipo e verrà selezionato quello con le prestazioni migliori.Noonsite
regularizationstr o float o listValore di regolarizzazione. Compreso tra 0 e +inf se regularization_type è onsite. Compreso tra 0 e 1 se regularization_type è alpha. Se impostato su auto, viene usata la regolarizzazione automatica: il parametro di regolarizzazione ottimale viene trovato tramite ricerca binaria con il rapporto desiderato di classificatori selezionati sul totale (regularization_desired_ratio) e il limite superiore per il parametro di regolarizzazione (regularization_upper_bound). Se viene fornita una lista, verranno addestrati modelli per ciascun valore e verrà selezionato quello con le prestazioni migliori.No0.01
regularization_desired_ratiofloat o listRapporto/i desiderato/i di classificatori selezionati sul totale per la regolarizzazione automatica. Se viene fornita una lista, verranno addestrati modelli per ciascun rapporto e verrà selezionato quello con le prestazioni migliori.No0.75
regularization_upper_boundfloat o listLimite/i superiore/i per il parametro di regolarizzazione quando si usa la regolarizzazione automatica. Se viene fornita una lista, verranno addestrati modelli per ciascun limite superiore e verrà selezionato quello con le prestazioni migliori.No200
weight_update_methodstrMetodo per l'aggiornamento dei pesi dei campioni tra logarithmic e quadratic.Nologarithmic
sample_scalingbooleanSe applicare il ridimensionamento dei campioni.NoFalse
prediction_scalingfloatFattore di scala per le previsioni.NoNone
optimizer_optionsdictionaryOpzioni dell'ottimizzatore QAOA. Un elenco delle opzioni disponibili è presentato più avanti in questa documentazione.No...
votingstrUsa il voto di maggioranza (hard) o la media delle probabilità (soft) per aggregare le previsioni/probabilità dei learner.Nohard
prob_thresholdfloatSoglia di probabilità ottimale.No0.5
random_stateintegerControlla la casualità per la riproducibilità.NoNone
  • Inoltre, le optimizer_options sono elencate come segue:
NomeTipoDescrizioneObbligatorioPredefinito
num_solutionsintegerIl numero di soluzioniNo1024
repsintegerIl numero di ripetizioniNo4
sparsifyfloatLa soglia di sparsificazioneNo0.001
thetafloatIl valore iniziale di theta, un parametro variazionale di QAOANoNone
simulatorbooleanSe usare un simulatore o un QPUNoFalse
classical_optimizerstrNome dell'ottimizzatore classico per il QAOA. Sono utilizzabili tutti i solver offerti da SciPy, elencati qui. Dovrai impostare classical_optimizer_options di conseguenza.NoCOBYLA
classical_optimizer_optionsdictionaryOpzioni dell'ottimizzatore classico. Per un elenco completo delle opzioni disponibili, consulta la documentazione di SciPyNo{"maxiter": 60}
optimization_levelintegerLa profondità del circuito QAOANo3
num_transpiler_runsintegerNumero di esecuzioni del TranspilerNo30
pass_manager_optionsdictionaryOpzioni per la generazione del preset pass managerNo{"approximation_degree": 1.0}
estimator_optionsdictionaryOpzioni dell'Estimator. Per un elenco completo delle opzioni disponibili, consulta la documentazione del Qiskit Runtime ClientNoNone
sampler_optionsdictionaryOpzioni del Sampler. Per un elenco completo delle opzioni disponibili, consulta la documentazione del Qiskit Runtime ClientNoNone
  • Le estimator_options predefinite sono:
NomeTipoValore
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"],}}
  • Le sampler_options predefinite sono:
NomeTipoValore
default_shotsinteger1024
resilience_levelinteger1
twirlingdictionary{"enable_gates": True}
dynamical_decouplingdictionary{"enable": True}

Utilizzo

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

Validazioni

  • name:
    • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Non deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.

3. Delete

L'azione delete rimuove un classificatore dalla directory dati condivisa.

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione. Deve essere delete.
namestrIl nome del classificatore da eliminare.

Utilizzo

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

Validazioni

  • name:
    • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.

4. Fit

L'azione fit addestra un classificatore usando i dati di addestramento forniti.

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione. Deve essere fit.
namestrIl nome del classificatore da addestrare.
Xarray o list o strI dati di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
yarray o list o strI valori target di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
fit_paramsdictionaryParametri aggiuntivi da passare al metodo fit del classificatore.No
fit_params
NomeTipoDescrizioneObbligatorioPredefinito
validation_datatupleI dati di validazione e le etichette.NoNone
pos_labelinteger o strL'etichetta di classe da mappare a 1.NoNone
optimization_datastrDataset su cui ottimizzare l'ensemble. Può essere uno tra: train, validation, both.Notrain

Utilizzo

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
)

Validazioni

  • name:
    • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.

5. Predict

L'azione predict viene usata per ottenere previsioni hard e soft (probabilità).

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione. Deve essere predict.
namestrIl nome del classificatore da utilizzare.
Xarray o list o strI dati di test. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
options["out"]strIl nome del file JSON di output per salvare le previsioni nella directory dati condivisa. Se non fornito, le previsioni vengono restituite nel risultato del job.No

Utilizzo

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

Validazioni

  • name:
    • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.
  • options["out"]:
    • Il nome del file deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve avere l'estensione .json.

6. Fit-predict

L'azione fit_predict addestra un classificatore usando i dati di addestramento e poi lo usa per ottenere previsioni hard e soft (probabilità).

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione. Deve essere fit_predict.
namestrIl nome del classificatore da utilizzare.
X_trainarray o list o strI dati di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
y_trainarray o list o strI valori target di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
X_testarray o list o strI dati di test. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
fit_paramsdictionaryParametri aggiuntivi da passare al metodo fit del classificatore.No
options["out"]strIl nome del file JSON di output per salvare le previsioni nella directory dati condivisa. Se non fornito, le previsioni vengono restituite nel risultato del job.No

Utilizzo

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

Validazioni

  • name:

    • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.
  • options["out"]:

    • Il nome del file deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve avere l'estensione .json.

7. Create-fit-predict

L'azione create_fit_predict crea un classificatore, lo addestra usando i dati di addestramento forniti e poi lo usa per ottenere previsioni hard e soft (probabilità).

Input

NomeTipoDescrizioneObbligatorio
actionstrIl nome dell'azione tra create, list, fit, predict, fit_predict, create_fit_predict e delete.
namestrIl nome del classificatore da utilizzare.
quantum_classifierstrIl tipo di classificatore, ovvero QuantumEnhancedEnsembleClassifier. Il valore predefinito è QuantumEnhancedEnsembleClassifier.No
X_trainarray o list o strI dati di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
y_trainarray o list o strI valori target di addestramento. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
X_testarray o list o strI dati di test. Può essere un array NumPy, una lista o una stringa che fa riferimento a un nome di file nella directory dati condivisa.
fit_paramsdictionaryParametri aggiuntivi da passare al metodo fit del classificatore.No
options["save"]booleanSe salvare il classificatore addestrato nella directory dati condivisa. Il valore predefinito è True.No
options["out"]strIl nome del file JSON di output per salvare le previsioni nella directory dati condivisa. Se non fornito, le previsioni vengono restituite nel risultato del job.No

Utilizzo

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

Validazioni

  • name:

    • Se options["save"] è impostato su True:
      • Il nome deve essere univoco, una stringa di massimo 64 caratteri.
      • Può contenere solo caratteri alfanumerici e underscore.
      • Deve iniziare con una lettera e non può terminare con un underscore.
      • Non deve esistere già un classificatore con lo stesso nome nella directory dati condivisa.
  • options["out"]:

    • Il nome del file deve essere univoco, una stringa di massimo 64 caratteri.
    • Può contenere solo caratteri alfanumerici e underscore.
    • Deve iniziare con una lettera e non può terminare con un underscore.
    • Deve avere l'estensione .json.

Per iniziare

Autenticati usando la tua chiave API di IBM Quantum Platform e seleziona la Qiskit Function come segue:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

Esempio

In questo esempio, utilizzerai la funzione "Singularity Machine Learning - Classification" per classificare un dataset composto da due semicerchi a forma di mezza luna che si intrecciano. Il dataset è sintetico, bidimensionale ed etichettato con etichette binarie. È stato creato per essere difficile per algoritmi come il clustering basato su centroide e la classificazione lineare. Dataset moons Attraverso questo processo, imparerai come creare il classificatore, addestrarlo sui dati di addestramento, usarlo per effettuare previsioni sui dati di test ed eliminarlo al termine. Prima di iniziare, devi installare scikit-learn. Installalo usando il seguente comando:

python3 -m pip install scikit-learn

Esegui i seguenti passaggi:

  1. Crea il dataset sintetico usando la funzione make_moons di scikit-learn.
  2. Carica il dataset sintetico generato nella directory dati condivisa.
  3. Crea il classificatore potenziato quantisticamente usando l'azione create.
  4. Elenca i tuoi classificatori usando l'azione list.
  5. Addestra il classificatore sui dati di addestramento usando l'azione fit.
  6. Usa il classificatore addestrato per effettuare previsioni sui dati di test con l'azione predict.
  7. Elimina il classificatore usando l'azione delete.
  8. Fai pulizia quando hai finito.

Passo 1. Importa i moduli necessari e genera il dataset sintetico, poi suddividilo in dataset di addestramento e di 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]

Passo 2. Salva i dataset di addestramento e di test etichettati sul disco locale, quindi caricali nella directory dati condivisa.

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

Passo 3. Crea un classificatore potenziato quantisticamente usando l'azione 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']

Passo 4. Addestra il classificatore potenziato quantisticamente usando l'azione 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}}}}

Passo 5. Ottieni previsioni e probabilità dal classificatore potenziato quantisticamente usando l'azione 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]]

Passo 6. Elimina il classificatore potenziato quantisticamente usando l'azione 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': {}}}

Passo 7. Pulisci le directory dati locali e condivise.

# 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

Questi benchmark mostrano che il classificatore può raggiungere accuratezze estremamente elevate su problemi difficili. Mostrano inoltre che aumentare il numero di learner nell'ensemble (numero di qubit) può portare a una maggiore accuratezza.

"Accuratezza classica" si riferisce all'accuratezza ottenuta usando il corrispondente stato dell'arte classico che, in questo caso, è un classificatore AdaBoost basato su un ensemble di dimensione 75. "Accuratezza quantistica", invece, si riferisce all'accuratezza ottenuta usando "Singularity Machine Learning - Classification".

ProblemaDimensione datasetDimensione ensembleNumero di qubitAccuratezza classicaAccuratezza quantisticaMiglioramento
Stabilità della rete5000 esempi, 12 feature555576%91%15%
Stabilità della rete5000 esempi, 12 feature656576%92%16%
Stabilità della rete5000 esempi, 12 feature757576%94%18%
Stabilità della rete5000 esempi, 12 feature858576%94%18%
Stabilità della rete5000 esempi, 12 feature10010076%95%19%

Con l'evoluzione e la crescita dell'hardware quantistico, le implicazioni per il nostro classificatore quantistico diventano sempre più significative. Sebbene il numero di qubit imponga limitazioni sulla dimensione dell'ensemble utilizzabile, non limita il volume di dati che può essere elaborato. Questa potente capacità consente al classificatore di gestire in modo efficiente dataset contenenti milioni di punti dati e migliaia di feature. È importante sottolineare che i vincoli relativi alla dimensione dell'ensemble possono essere affrontati attraverso l'implementazione di una versione su larga scala del classificatore. Sfruttando un approccio iterativo a ciclo esterno, l'ensemble può essere espanso dinamicamente, migliorando flessibilità e prestazioni complessive. Tuttavia, vale la pena notare che questa funzionalità non è ancora stata implementata nella versione attuale del classificatore.

Changelog

4 giugno 2025

  • Aggiornato QuantumEnhancedEnsembleClassifier con i seguenti aggiornamenti:
    • Aggiunta regolarizzazione onsite/alpha. Puoi specificare regularization_type come onsite o alpha
    • Aggiunta regolarizzazione automatica. Puoi impostare regularization su auto per usare la regolarizzazione automatica
    • Aggiunto il parametro optimization_data al metodo fit per scegliere i dati di ottimizzazione per l'ottimizzazione quantistica. Puoi usare una di queste opzioni: train, validation o both
    • Migliorate le prestazioni generali
  • Aggiunto tracciamento dettagliato dello stato per i job in esecuzione

20 maggio 2025

  • Standardizzata la gestione degli errori

18 marzo 2025

  • Aggiornato qiskit-serverless alla versione 0.20.0 e l'immagine base alla 0.20.1

14 febbraio 2025

  • Aggiornata l'immagine base alla 0.19.1

6 febbraio 2025

  • Aggiornato qiskit-serverless alla versione 0.19.0 e l'immagine base alla 0.19.0

13 novembre 2024

  • Rilascio di Singularity Machine Learning - Classification

Supporto

Per qualsiasi domanda, contatta Multiverse Computing.

Assicurati di includere le seguenti informazioni:

  • L'ID del job della Qiskit Function (job.job_id)
  • Una descrizione dettagliata del problema
  • Eventuali messaggi o codici di errore pertinenti
  • I passaggi per riprodurre il problema

Passi successivi