メインコンテンツへスキップ

Singularity Machine Learning - Classification:Multiverse Computing による Qiskit Function

注記
  • Qiskit Functions は、IBM Quantum® Premium Plan・Flex Plan・On-Prem(IBM Quantum Platform API 経由)プランのユーザーのみが利用できる実験的機能です。現在プレビュー リリースの段階にあり、変更される場合があります。

概要

「Singularity Machine Learning - Classification」関数を使用すると、量子の専門知識を必要とせずに、実世界の機械学習問題を量子ハードウェア上で解くことができます。アンサンブル手法をベースにしたこの Application 関数は、ハイブリッド分類器です。初期のアンサンブル学習にはブースティング・バギング・スタッキングといった古典的な手法を活用し、その後、変分量子固有値ソルバー(VQE)や量子近似最適化アルゴリズム(QAOA)などの量子アルゴリズムを用いて、学習済みアンサンブルの多様性・汎化能力・全体的な複雑さを向上させます。

他の量子機械学習ソリューションとは異なり、この関数は QPU の量子ビット数に制限されることなく、数百万のサンプルと特徴量を持つ大規模データセットを処理できます。量子ビット数は学習できるアンサンブルのサイズのみを決定します。また、高い柔軟性を持ち、金融・医療・サイバーセキュリティなど幅広い分野の分類問題に適用可能です。 高次元・ノイズが多い・クラス不均衡といった古典的に困難な問題においても、一貫して高い精度を達成します。 動作原理 この関数は、以下のような方々のために構築されています。

  1. 量子機械学習を自社の製品やサービスに統合することで技術力強化を図る企業のエンジニアおよびデータサイエンティスト、
  2. 量子機械学習の応用を探求し、分類タスクに量子コンピューティングを活用しようとしている量子研究所の研究者、
  3. 機械学習などの講義で量子コンピューティングの優位性を示したい教育機関の学生および教員。

以下の例では、createlistfitpredict などのさまざまな機能を紹介するとともに、非線形な決定境界のために特に困難とされる問題である、2 つの交差する半円からなる合成問題への使用方法を示します。

関数の説明

この Qiskit Function を使用すると、Singularity の量子強化アンサンブル分類器を使って 2 値分類問題を解くことができます。内部では、ラベル付きデータセット上でアンサンブル分類器を古典的に学習するハイブリッドアプローチを採用し、その後 IBM® QPU 上の量子近似最適化アルゴリズム(QAOA)を用いて最大の多様性と汎化性能が得られるよう最適化します。ユーザーフレンドリーなインターフェースを通じて、要件に合わせて分類器を設定し、任意のデータセットで学習させ、未知のデータセットに対して予測を行えます。

汎用的な分類問題を解くには、以下の手順を実施してください。

  1. データセットを前処理し、学習セットとテストセットに分割します。必要に応じて、学習セットをさらに学習セットと検証セットに分割できます。これには scikit-learn を使用できます。
  2. 学習セットがクラス不均衡の場合は、imbalanced-learn を使用してクラスを均衡化するためにリサンプリングできます。
  3. カタログの file_upload メソッドに都度関連するパスを渡して、学習・検証・テストセットをそれぞれ関数のストレージにアップロードします。
  4. 関数の create アクションを使用して量子分類器を初期化します。このアクションは、学習器の数と種類・正則化(ラムダ値)・レイヤー数・古典オプティマイザーの種類・量子バックエンドなどの最適化オプションといったハイパーパラメータを受け付けます。
  5. 関数の fit アクションを使用して、ラベル付き学習セット(および該当する場合は検証セット)を渡し、量子分類器を学習セットで学習します。
  6. 関数の predict アクションを使用して、未知のテストセットに対して予測を行います。

アクションベースのアプローチ

この関数はアクションベースのアプローチを採用しています。アクションを使ってタスクを実行したり状態を変更したりできる仮想環境と捉えることができます。現在利用可能なアクションは、listcreatedeletefitpredictfit_predictcreate_fit_predict です。以下の例では 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

list アクションは、共有データディレクトリから *.pkl.tar 形式で保存されているすべての分類器を取得します。catalog.files() メソッドを使用してこのディレクトリの内容にアクセスすることもできます。一般に、list アクションは共有データディレクトリ内で *.pkl.tar 拡張子を持つファイルを検索し、リスト形式で返します。

入力

名前説明必須
actionstrcreatelistfitpredictfit_predictcreate_fit_predictdelete の中からアクション名を指定します。はい

使用方法

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

2. Create

create アクションは、指定された quantum_classifier タイプの分類器を指定されたパラメータを使って作成し、共有データディレクトリに保存します。

備考

現在、この関数がサポートしているのは QuantumEnhancedEnsembleClassifier のみです。

入力

名前説明必須デフォルト
actionstrcreatelistfitpredictfit_predictcreate_fit_predictdelete の中からアクション名を指定します。はい-
namestr量子分類器の名前(例:spam_classifier)。はい-
instancestrIBM インスタンス。はい-
backend_namestrIBM コンピュートリソース。デフォルトは None で、保留中のジョブ数が最も少ないバックエンドが使用されます。いいえNone
quantum_classifierstr量子分類器のタイプ(QuantumEnhancedEnsembleClassifier)。いいえQuantumEnhancedEnsembleClassifier
num_learnersintegerアンサンブル内の学習器の数。いいえ10
learners_typeslist学習器のタイプ。サポートされているタイプには DecisionTreeClassifierGaussianNBKNeighborsClassifierMLPClassifierLogisticRegression などがあります。各タイプの詳細は scikit-learn のドキュメントを参照してください。いいえ[DecisionTreeClassifier]
learners_proportionslistアンサンブル内の各学習器タイプの割合。いいえ[1.0]
learners_optionslistアンサンブル内の各学習器タイプのオプション。選択した学習器タイプに対応するオプションの完全な一覧は scikit-learn のドキュメントを参照してください。いいえ[{"max_depth": 3, "splitter": "random", "class_weight": None}]
regularization_typestr または list使用する正則化のタイプ:onsite または alphaonsite はオンサイト項を制御し、値が大きいほどスパースなアンサンブルになります。alpha は相互作用項とオンサイト項のトレードオフを制御し、値が小さいほどスパースなアンサンブルになります。リストを指定した場合、各タイプでモデルが学習され、最もパフォーマンスの高いものが選択されます。いいえonsite
regularizationstr または float または list正則化の値。regularization_typeonsite の場合は 0 から +inf の範囲、alpha の場合は 0 から 1 の範囲で指定します。auto に設定すると、自動正則化が使用され、選択された分類器と総分類器の比率(regularization_desired_ratio)と正則化パラメータの上限(regularization_upper_bound)を指定した二分探索によって最適な正則化パラメータが求められます。リストを指定した場合、各値でモデルが学習され、最もパフォーマンスの高いものが選択されます。いいえ0.01
regularization_desired_ratiofloat または list自動正則化における、選択された分類器と総分類器の目標比率。リストを指定した場合、各比率でモデルが学習され、最もパフォーマンスの高いものが選択されます。いいえ0.75
regularization_upper_boundfloat または list自動正則化使用時の正則化パラメータの上限。リストを指定した場合、各上限値でモデルが学習され、最もパフォーマンスの高いものが選択されます。いいえ200
weight_update_methodstrサンプルウェイトの更新方法:logarithmic(対数)または quadratic(二乗)。いいえlogarithmic
sample_scalingbooleanサンプルスケーリングを適用するかどうか。いいえFalse
prediction_scalingfloat予測のスケーリング係数。いいえNone
optimizer_optionsdictionaryQAOA オプティマイザーのオプション。利用可能なオプションの一覧は本ドキュメントで後述します。いいえ...
votingstr学習器の予測・確率を集約する際に多数決(hard)または確率の平均(soft)を使用します。いいえhard
prob_thresholdfloat最適確率のしきい値。いいえ0.5
random_stateinteger再現性のためにランダム性を制御します。いいえNone
  • また、optimizer_options は以下の通りです。
名前説明必須デフォルト
num_solutionsinteger解の数いいえ1024
repsinteger繰り返し回数いいえ4
sparsifyfloatスパース化のしきい値いいえ0.001
thetafloatQAOA の変分パラメータ theta の初期値いいえNone
simulatorbooleanシミュレーターを使用するか QPU を使用するかいいえFalse
classical_optimizerstrQAOA の古典オプティマイザー名。SciPy が提供するすべてのソルバー(こちらに一覧があります)が使用可能です。それに合わせて classical_optimizer_options を設定する必要があります。いいえCOBYLA
classical_optimizer_optionsdictionary古典オプティマイザーのオプション。利用可能なオプションの完全な一覧は SciPy のドキュメントを参照してください。いいえ{"maxiter": 60}
optimization_levelintegerQAOA 回路の深さいいえ3
num_transpiler_runsintegerトランスパイラーの実行回数いいえ30
pass_manager_optionsdictionaryプリセットパスマネージャー生成のオプションいいえ{"approximation_degree": 1.0}
estimator_optionsdictionaryEstimator のオプション。利用可能なオプションの完全な一覧は Qiskit Runtime Client のドキュメントを参照してください。いいえNone
sampler_optionsdictionarySampler のオプション。利用可能なオプションの完全な一覧は Qiskit Runtime Client のドキュメントを参照してください。いいえNone
  • estimator_options のデフォルト値は以下の通りです。
名前
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 のデフォルト値は以下の通りです。
名前
default_shotsinteger1024
resilience_levelinteger1
twirlingdictionary{"enable_gates": True}
dynamical_decouplingdictionary{"enable": True}

使用方法

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

バリデーション

  • name:
    • 名前は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • 共有データディレクトリに同じ名前の分類器が既に存在していてはなりません。

3. Delete

delete アクションは、共有データディレクトリから分類器を削除します。

入力

名前説明必須
actionstrアクション名。delete である必要があります。はい
namestr削除する分類器の名前。はい

使用方法

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

バリデーション

  • name:
    • 名前は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • 共有データディレクトリに同じ名前の分類器が既に存在している必要があります。

4. Fit

fit アクションは、提供された学習データを使って分類器を学習します。

入力

名前説明必須
actionstrアクション名。fit である必要があります。はい
namestr学習する分類器の名前。はい
Xarray または list または str学習データ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
yarray または list または str学習の目標値。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
fit_paramsdictionary分類器の fit メソッドに渡す追加パラメータ。いいえ
fit_params
名前説明必須デフォルト
validation_datatuple検証データとラベル。いいえNone
pos_labelinteger または str1 にマッピングするクラスラベル。いいえNone
optimization_datastrアンサンブルを最適化するデータセット。trainvalidationboth のいずれかを指定できます。いいえtrain

使用方法

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
)

バリデーション

  • name:
    • 名前は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • 共有データディレクトリに同じ名前の分類器が既に存在している必要があります。

5. Predict

predict アクションは、ハードおよびソフト予測(確率)を取得するために使用します。

入力

名前説明必須
actionstrアクション名。predict である必要があります。はい
namestr使用する分類器の名前。はい
Xarray または list または strテストデータ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
options["out"]str予測を共有データディレクトリに保存する出力 JSON ファイル名。指定しない場合、予測はジョブの結果として返されます。いいえ

使用方法

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

バリデーション

  • name:
    • 名前は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • 共有データディレクトリに同じ名前の分類器が既に存在している必要があります。
  • options["out"]:
    • ファイル名は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • .json 拡張子が必要です。

6. Fit-predict

fit_predict アクションは、学習データを使って分類器を学習し、その後ハードおよびソフト予測(確率)を取得します。

入力

名前説明必須
actionstrアクション名。fit_predict である必要があります。はい
namestr使用する分類器の名前。はい
X_trainarray または list または str学習データ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
y_trainarray または list または str学習の目標値。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
X_testarray または list または strテストデータ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
fit_paramsdictionary分類器の fit メソッドに渡す追加パラメータ。いいえ
options["out"]str予測を共有データディレクトリに保存する出力 JSON ファイル名。指定しない場合、予測はジョブの結果として返されます。いいえ

使用方法

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

バリデーション

  • name:

    • 名前は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • 共有データディレクトリに同じ名前の分類器が既に存在している必要があります。
  • options["out"]:

    • ファイル名は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • .json 拡張子が必要です。

7. Create-fit-predict

create_fit_predict アクションは、分類器を作成し、提供された学習データを使って学習した後、ハードおよびソフト予測(確率)を取得します。

入力

名前説明必須
actionstrcreatelistfitpredictfit_predictcreate_fit_predictdelete の中からアクション名を指定します。はい
namestr使用する分類器の名前。はい
quantum_classifierstr分類器のタイプ(QuantumEnhancedEnsembleClassifier)。デフォルトは QuantumEnhancedEnsembleClassifier です。いいえ
X_trainarray または list または str学習データ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
y_trainarray または list または str学習の目標値。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
X_testarray または list または strテストデータ。NumPy 配列・リスト、または共有データディレクトリ内のファイル名を参照する文字列を指定できます。はい
fit_paramsdictionary分類器の fit メソッドに渡す追加パラメータ。いいえ
options["save"]boolean学習済み分類器を共有データディレクトリに保存するかどうか。デフォルトは True です。いいえ
options["out"]str予測を共有データディレクトリに保存する出力 JSON ファイル名。指定しない場合、予測はジョブの結果として返されます。いいえ

使用方法

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

バリデーション

  • name:

    • options["save"]True に設定されている場合:
      • 名前は一意である必要があり、最大 64 文字の文字列です。
      • 英数字とアンダースコアのみ使用できます。
      • 文字で始まり、アンダースコアで終わってはなりません。
      • 共有データディレクトリに同じ名前の分類器が既に存在していてはなりません。
  • options["out"]:

    • ファイル名は一意である必要があり、最大 64 文字の文字列です。
    • 英数字とアンダースコアのみ使用できます。
    • 文字で始まり、アンダースコアで終わってはなりません。
    • .json 拡張子が必要です。

はじめに

IBM Quantum Platform APIキーを使用して認証し、以下のようにQiskit Functionを選択してください。

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

使用例

この例では、「Singularity Machine Learning - Classification」ファンクションを使用して、2つの互い違いに絡み合った三日月形の半円から構成されるデータセットを分類します。このデータセットは合成的かつ2次元であり、バイナリラベルが付与されています。重心ベースのクラスタリングや線形分類などのアルゴリズムに対して難しいデータセットとして作成されています。 Moonsデータセット このプロセスを通じて、分類器の作成、トレーニングデータへのフィッティング、テストデータへの予測、および終了後の分類器の削除方法を学びます。 開始前に、scikit-learnをインストールする必要があります。以下のコマンドを使用してインストールしてください。

python3 -m pip install scikit-learn

以下の手順を実行してください。

  1. scikit-learnmake_moons関数を使用して合成データセットを作成します。
  2. 生成した合成データセットを共有データディレクトリにアップロードします。
  3. createアクションを使用して量子強化分類器を作成します。
  4. listアクションを使用して分類器の一覧を表示します。
  5. fitアクションを使用して、トレーニングデータで分類器を学習させます。
  6. predictアクションを使用して、学習済み分類器でテストデータを予測します。
  7. deleteアクションを使用して分類器を削除します。
  8. 完了後にクリーンアップを行います。

ステップ1. 必要なモジュールをインポートして合成データセットを生成し、トレーニングデータセットとテストデータセットに分割します。

# import the necessary modules for this example
import os
import tarfile
import numpy as np

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

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

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

# print the first 10 samples of the training dataset
print("Features:", X_train[:10, :])
print("Targets:", y_train[:10])
Features: [[-0.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]

ステップ2. ラベル付きのトレーニングデータセットとテストデータセットをローカルディスクに保存し、共有データディレクトリにアップロードします。

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

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

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

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

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

ステップ3. createアクションを使用して量子強化分類器を作成します。

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

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

print(job.result())

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

ステップ4. fitアクションを使用して量子強化分類器を学習させます。

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

print(job.result())
{'status': 'ok', 'message': 'Classifier fitted.', 'data': {}, 'metadata': {'resource_usage': {'RUNNING: MAPPING': {'CPU_TIME': 8.45469617843628}, 'RUNNING: WAITING_QPU': {'CPU_TIME': 69.4949426651001}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 73.01881957054138}, 'RUNNING: EXECUTING_QPU': {'QPU_TIME': 75.4787163734436}}}}

ステップ5. predictアクションを使用して、量子強化分類器から予測値と確率を取得します。

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

result = job.result()

print("Action result status: ", result["status"])
print("Action result message: ", result["message"])
print("Predictions (first five results):", result["data"]["predictions"][:5])
print(
"Probabilities (first five results):", result["data"]["probabilities"][:5]
)
Action result status:  ok
Action result message: Classifier predicted.
Predictions (first five results): [0, 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]]

ステップ6. deleteアクションを使用して量子強化分類器を削除します。

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

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

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

ステップ7. ローカルおよび共有データディレクトリをクリーンアップします。

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

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

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

ベンチマーク

これらのベンチマークは、この分類器が難しい問題に対して非常に高い精度を達成できることを示しています。また、アンサンブル内の学習器の数(量子ビット数)を増やすことで、精度の向上につながることも示されています。

「古典的精度」とは、対応する古典的な最先端手法(この場合はサイズ75のアンサンブルに基づくAdaBoost分類器)を使用して得られた精度を指します。一方「量子精度」とは、「Singularity Machine Learning - Classification」を使用して得られた精度を指します。

問題データセットサイズアンサンブルサイズ量子ビット数古典的精度量子精度改善幅
グリッド安定性5000サンプル、12特徴量555576%91%15%
グリッド安定性5000サンプル、12特徴量656576%92%16%
グリッド安定性5000サンプル、12特徴量757576%94%18%
グリッド安定性5000サンプル、12特徴量858576%94%18%
グリッド安定性5000サンプル、12特徴量10010076%95%19%

量子ハードウェアが進化・拡張するにつれて、量子分類器への影響はますます重要なものとなっています。量子ビット数はアンサンブルのサイズに制限を課しますが、処理できるデータ量を制限するものではありません。この強力な能力により、分類器は数百万のデータポイントと数千の特徴量を含むデータセットを効率的に処理することができます。アンサンブルサイズに関する制約は、分類器の大規模バージョンの実装によって対処できます。反復的な外部ループアプローチを活用することで、アンサンブルを動的に拡張し、柔軟性と全体的なパフォーマンスを向上させることができます。ただし、この機能は現在のバージョンの分類器にはまだ実装されていない点にご注意ください。

変更履歴

2025年6月4日

  • QuantumEnhancedEnsembleClassifierを以下の更新内容でアップグレードしました。
    • オンサイト/アルファ正則化を追加しました。regularization_typeonsiteまたはalphaを指定できます。
    • 自動正則化を追加しました。regularizationautoに設定することで自動正則化を使用できます。
    • 量子最適化に使用する最適化データを選択するためのoptimization_dataパラメーターをfitメソッドに追加しました。trainvalidation、またはbothのいずれかのオプションを使用できます。
    • 全体的なパフォーマンスを改善しました。
  • 実行中のジョブに対する詳細なステータストラッキングを追加しました。

2025年5月20日

  • エラー処理を標準化しました。

2025年3月18日

  • qiskit-serverslessを0.20.0に、ベースイメージを0.20.1にアップグレードしました。

2025年2月14日

  • ベースイメージを0.19.1にアップグレードしました。

2025年2月6日

  • qiskit-serverlessを0.19.0に、ベースイメージを0.19.0にアップグレードしました。

2024年11月13日

  • Singularity Machine Learning - Classificationをリリースしました。

サポートを受ける

ご質問がある場合は、Multiverse Computingへお問い合わせください

お問い合わせの際は、以下の情報をご記載ください。

  • Qiskit Function ジョブID(job.job_id
  • 問題の詳細な説明
  • 関連するエラーメッセージやエラーコード
  • 問題を再現する手順

次のステップ