Skip to main content
IBM Quantum Platform

特異点 Machine Learning - 分類: Multiverse Computing による Qiskit 関数

APIリファレンスを参照してください

  • このページのコードは、以下の要件に基づいて開発されました。 これらのバージョン以降のご利用をお勧めします。

    scikit-learn~=1.8.0
    
  • Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースの状態であり、変更される可能性がある。

概要

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

他の量子機械学習ソリューションとは異なり、この関数は、対象となるQPUの量子ビット数に制限されることなく、数百万の例と特徴を持つ大規模なデータセットを扱うことができる。 量子ビットの数は、学習可能なアンサンブルのサイズを決定するだけである。 また、非常に柔軟性があり、金融、ヘルスケア、サイバーセキュリティを含む幅広い分野の分類問題の解決に利用できます。

高次元でノイズが多く、不均衡なデータセットを含む古典的な難問に対して、一貫して高い精度を達成している。

仕組み

そのために作られた:

  1. 量子機械学習を製品やサービスに組み込むことで、技術提供を強化しようとしている企業のエンジニアやデータサイエンティスト、
  2. 量子研究所の研究者は、量子機械学習の応用を模索し、分類作業に量子コンピューティングを活用しようとしている
  3. 機械学習などのコースで、量子コンピューティングの利点を実証しようとしている教育機関の学生や教師。

以下の例では、 createlistfitpredict を含む様々な機能を紹介し、非線形の決定境界であるため難問として知られる、2つのインターリーブ半円からなる合成問題での使い方を示します。


関数の説明

この Qiskit 関数を使用すると、Singularity の量子強化アンサンブル分類器を使用してバイナリ分類問題を解くことができます。 その裏では、ハイブリッド・アプローチを使って、ラベル付きデータセット上で分類器のアンサンブルを古典的に訓練し、 IBM® QPU上で量子近似最適化アルゴリズム(QAOA)を使って多様性と汎化性を最大化するように最適化する。 ユーザーフレンドリーなインターフェイスを通じて、ユーザーは要件に応じて分類器を設定し、選択したデータセットで訓練し、未見のデータセットで予測を行うために使用することができます。

一般的な分類問題を解く:

  1. データセットを前処理し、トレーニングセットとテストセットに分ける。 オプションで、訓練セットをさらに訓練セットと検証セットに分けることができる。 これは scikit-learnを使って実現できる。
  2. トレーニングセットが不均衡な場合は、 imbalanced-learnを使ってクラスのバランスをとるために再サンプリングすることができる。
  3. トレーニングセット、検証セット、テストセットを別々に、カタログの file_upload メソッドを使用して関数のストレージにアップロードし、関連するパスを毎回渡します。
  4. create 学習者の数や種類、正則化(ラムダ値)、最適化オプション(レイヤー数、古典オプティマイザの種類、量子バックエンドなど)を含むハイパーパラメータを受け付けます。
  5. この関数の fit アクションを使用して、訓練セットで量子分類器を訓練します。訓練セットにはラベルを付け、検証セット(該当する場合)を渡します。
  6. 関数の predict アクションを使用して、以前に未見のテストセットで予測を行う。


使用を開始する

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次元で、2値ラベルでラベル付けされている。 セントロイドベースのクラスタリングや線形分類のようなアルゴリズムにとって挑戦的であるように作成されている。

月のデータセット

このプロセスを通して、分類器を作成する方法、学習データに適合させる方法、テストデータでの予測に使用する方法、そして終了時に分類器を削除する方法を学びます。

始める前に、 scikit-learnをインストールする必要がある。 以下のコマンドでインストールする:

python3 -m pip install scikit-learn

以下のステップを実行します。

  1. scikit-learnmake_moons 関数を使用して、合成データセットを作成します。
  2. 生成された合成データセットを共有データディレクトリにアップロードしてください。
  3. action create を使用して、量子強化型分類器を作成します。
  4. アクション list を使用して、分類器を登録してください。
  5. fit action を使用して、トレーニングデータで分類器を学習させます。
  6. トレーニング済みの分類器を使用して、predict action アクションを通じてテストデータに対する予測を行います。
  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])

Output:

Features: [[ 0.84757037 -0.48831433]
 [ 0.98132552  0.19235443]
 [-0.71626723  0.6978261 ]
 [ 1.18957848 -0.48186557]
 [ 0.52118982 -0.37791846]
 [ 0.81115408  0.58483251]
 [ 0.48706462  0.87336593]
 [-0.81880144  0.57407682]
 [ 1.67335408 -0.23932015]
 [ 0.50181306  0.8649761 ]]
Targets: [1 0 0 1 1 0 0 0 1 0]

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

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


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

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

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

# view/enlist the uploaded files in the shared data directory
print(catalog.files(singularity))

Output:

['X_test.npy.tar', 'X_train.npy.tar', 'y_test.npy.tar', 'y_train.npy.tar']

ステップ 3. action 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())

Output:

{'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))

Output:

{'status': 'ok', 'message': 'Classifiers listed.', 'data': {'classifiers': ['my_classifier']}, 'metadata': {'resource_usage': {}}}
['X_test.npy.tar', 'X_train.npy.tar', 'my_classifier.pkl.tar', 'y_test.npy.tar', 'y_train.npy.tar']

ステップ 4. action 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())

Output:

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

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

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

result = job.result()

print("Action result status: ", result["status"])
print("Action result message: ", result["message"])
print("Predictions (first five results):", result["data"]["predictions"][:5])
print(
    "Probabilities (first five results):", result["data"]["probabilities"][:5]
)

Output:

Action result status:  ok
Action result message:  Classifier predicted.
Predictions (first five results): [0, 0, 1, 0, 1]
Probabilities (first five results): [[1.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 0.0], [0.0, 1.0]]

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

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

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

print(job.result())

Output:

{'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)

Output:

'Requested file was deleted.'

create_fit_predict

次の例は、このアクションの create_fit_predict 動作を示しています。

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

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

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

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

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

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

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

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

print("Job status: ", status)
print("Action result status: ", result["status"])
print("Action result message: ", result["message"])
print("Predictions (first five results): ", result["data"]["predictions"][:5])
print(
    "Probabilities (first five results): ",
    result["data"]["probabilities"][:5],
)
print("Usage metadata: ", result["metadata"]["resource_usage"])

Output:

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

ベンチマーク

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

「古典的精度」とは、この場合、サイズ75のアンサンブルに基づく AdaBoost 分類器である。 一方、"量子精度 "とは、"特異点 Machine Learning - 分類 "を使って得られた精度のことである。

問題点
データセット・サイズ
アンサンブル・サイズ
キュービット数
古典的な精度
量子精度
向上
送電網の安定性5000例、12機能55カ所55カ所76%91%15%
送電網の安定性5000例、12機能656576%92%16%
送電網の安定性5000例、12機能75%75%76%94%18%
送電網の安定性5000例、12機能858576%94%18%
送電網の安定性5000例、12機能10010076%95%19%

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


変更ログ

2025年6月4日

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

2025年5月20日

  • 標準化されたエラー処理

2025年3月18日

  • qiskit-serverless を 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日

  • シンギュラリティのリリース Machine Learning - 分類

サポートの利用

ご質問は Multiverse Computingまでお問い合わせください。

次の情報を必ずご記入ください。

  • Qiskitファンクション 求人ID (job.job_id)
  • 問題の詳細
  • 関連するエラーメッセージやコード
  • 問題を再現する手順

次のステップ

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。