특이점 Machine Learning - 분류: Multiverse Computing의 Qiskit 함수
API 참조 보기
이 페이지의 코드는 다음 요구 사항을 바탕으로 개발되었습니다. 이 버전 이상을 사용하시기를 권장합니다.
scikit-learn~=1.8.0
- 키스킷 기능은 IBM 퀀텀 프리미엄 요금제, 플렉스 요금제 및 온프레미스( IBM 퀀텀 플랫폼 API를 통해) 요금제 사용자에게만 제공되는 실험적 기능입니다. 프리뷰 릴리스 상태이며 변경될 수 있습니다.
개요
"특이점 Machine Learning - 분류" 기능을 사용하면 양자 전문 지식이 없어도 양자 하드웨어에서 실제 머신 러닝 문제를 해결할 수 있습니다. 앙상블 메서드를 기반으로 하는 이 애플리케이션 함수는 하이브리드 분류기입니다. 초기 앙상블 훈련에는 부스팅, 배깅, 스태킹과 같은 고전적인 방법을 활용합니다. 그 후, 가변 양자 아이겐솔버(VQE) 및 양자 근사 최적화 알고리즘(QAOA)과 같은 양자 알고리즘을 사용하여 학습된 앙상블의 다양성, 일반화 기능 및 전반적인 복잡성을 향상시킵니다.
다른 양자 머신 러닝 솔루션과 달리, 이 기능은 대상 QPU의 큐비트 수에 제한을 받지 않고 수백만 개의 예제와 기능이 포함된 대규모 데이터 세트를 처리할 수 있습니다. 큐비트 수에 따라 학습할 수 있는 앙상블의 크기만 결정됩니다. 또한 유연성이 뛰어나 금융, 의료, 사이버 보안 등 다양한 분야에서 분류 문제를 해결하는 데 사용할 수 있습니다.
고차원적이고 노이즈가 많으며 불균형한 데이터 세트와 관련된 고전적으로 까다로운 문제에서도 일관되게 높은 정확도를 달성합니다.
용도에 맞게 설계되었습니다:
- 양자 머신러닝을 제품 및 서비스에 통합하여 기술 서비스를 개선하고자 하는 기업의 엔지니어와 데이터 과학자,
- 양자 머신 러닝 애플리케이션을 탐색하고 분류 작업에 양자 컴퓨팅을 활용하고자 하는 양자 연구소의 연구원들, 그리고
- 머신 러닝과 같은 과정을 수강하는 교육 기관의 학생과 교사, 그리고 양자 컴퓨팅의 장점을 입증하고자 하는 분들을 대상으로 합니다.
다음 예제에서는 create, list, fit, predict 등 다양한 기능을 소개하고, 비선형 결정 경계로 인해 까다롭기로 악명 높은 두 개의 인터리빙 반원으로 구성된 합성 문제에서 이를 사용하는 방법을 보여줍니다.
기능 설명
이 키스킷 함수를 사용하면 Singularity의 양자 강화 앙상블 분류기를 사용하여 이진 분류 문제를 해결할 수 있습니다. 그 이면에서는 하이브리드 접근 방식을 사용해 라벨이 지정된 데이터 세트에서 분류기 앙상블을 고전적으로 훈련한 다음, IBM® QPU의 양자 근사 최적화 알고리즘(QAOA)을 사용해 다양성과 일반화를 극대화하도록 최적화합니다. 사용자 친화적인 인터페이스를 통해 사용자는 요구 사항에 따라 분류기를 구성하고, 원하는 데이터 세트에 대해 학습하고, 이전에 보지 못한 데이터 세트에 대해 예측하는 데 사용할 수 있습니다.
일반적인 분류 문제를 해결합니다:
- 데이터 집합을 전처리하고 학습 및 테스트 집합으로 분할합니다. 선택 사항으로 트레이닝 세트를 트레이닝 세트와 유효성 검사 세트로 더 분할할 수 있습니다. 이는 scikit-learn을 사용하여 달성할 수 있습니다.
- 훈련 세트가 불균형한 경우, 불균형 학습을 사용하여 샘플을 다시 샘플링하여 클래스의 균형을 맞출 수 있습니다.
- 카탈로그의
file_upload방법을 사용하여 트레이닝, 유효성 검사 및 테스트 세트를 함수의 저장소에 개별적으로 업로드하고 매번 관련 경로를 전달합니다. - 학습자의 수와 유형, 정규화(람다 값), 레이어 수, 클래식 옵티마이저 유형, 양자 백엔드 등의 최적화 옵션과 같은 하이퍼파라미터를 허용하는
create함수를 사용하여 양자 분류기를 초기화합니다. - 함수의
fit액션을 사용하여 레이블이 지정된 학습 세트와 해당되는 경우 유효성 검사 세트를 전달하여 학습 세트에 대한 양자 분류기를 학습시킵니다. - 함수의
predict액션을 사용하여 이전에 보이지 않던 테스트 집합을 예측합니다.
시작하기
IBM 퀀텀 플랫폼 API 키를 사용하여 인증하고 다음과 같이 키스킷 함수를 선택합니다:
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# Verify that you have access to the function
catalog.list()Output:
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# load function
singularity = catalog.load("multiverse/singularity")예
데이터셋 분류하기
이 예에서는 '특이점 Machine Learning - 분류' 함수를 사용하여 두 개의 교차하는 달 모양의 반원으로 구성된 데이터 집합을 분류합니다. 데이터 세트는 합성된 2차원이며 이진 레이블로 레이블이 지정되어 있습니다. 중심점 기반 클러스터링 및 선형 분류와 같은 알고리즘에는 까다롭게 만들어졌습니다.
이 과정을 통해 분류기를 생성하고, 학습 데이터에 맞추고, 테스트 데이터에서 예측하는 데 사용하고, 완료되면 분류기를 삭제하는 방법을 배우게 됩니다.
시작하기 전에 scikit-learn을 설치해야 합니다. 다음 명령을 사용하여 설치합니다:
python3 -m pip install scikit-learn다음 단계를 수행하십시오.
- scikit-learn 의 함수를
make_moons사용하여 합성 데이터셋을 생성합니다. - 생성된 합성 데이터셋을 공유 데이터 디렉터리에 업로드하십시오.
- action을
create사용하여 양자 강화 분류기를 생성합니다. - ... 작업을
list사용하여 분류기를 등록하세요. - action
fit을 사용하여 훈련 데이터로 분류기를 훈련시킵니다. - action
predict을 사용하여 훈련된 분류기를 통해 테스트 데이터에 대한 예측을 수행합니다. - [동작]
delete을 사용하여 분류기를 삭제합니다. - 완료한 후에는 정리하세요.
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단계. action을 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개 기능 | 65 | 65 | 76% | 92% | 16% |
| 그리드 안정성 | 5000개 예제, 12개 기능 | 75 | 75 | 76% | 94% | 18% |
| 그리드 안정성 | 5000개 예제, 12개 기능 | 85 | 85 | 76% | 94% | 18% |
| 그리드 안정성 | 5000개 예제, 12개 기능 | 100 | 100 | 76% | 95% | 19% |
양자 하드웨어가 발전하고 확장됨에 따라 양자 분류기에 대한 의미는 점점 더 중요해지고 있습니다. 큐비트 수는 활용할 수 있는 앙상블의 크기에 제한을 두지만, 처리할 수 있는 데이터의 양에는 제한을 두지 않습니다. 이 강력한 기능을 통해 분류기는 수백만 개의 데이터 포인트와 수천 개의 피처가 포함된 데이터 세트를 효율적으로 처리할 수 있습니다. 중요한 것은 대규모 버전의 분류기 구현을 통해 앙상블 크기와 관련된 제약 조건을 해결할 수 있다는 점입니다. 반복적인 외부 루프 접근 방식을 활용하면 앙상블을 동적으로 확장하여 유연성과 전반적인 성능을 향상시킬 수 있습니다. 하지만 이 기능은 현재 버전의 분류기에서는 아직 구현되지 않았다는 점에 유의할 필요가 있습니다.
변경 로그
2025년 6월 4일
- 다음 업데이트를 통해
QuantumEnhancedEnsembleClassifier을 업그레이드했습니다:- 온사이트/알파 정규화가 추가되었습니다.
regularization_type을onsite또는alpha - 자동 정규화 기능이 추가되었습니다.
regularization을auto으로 설정하여 자동 정규화를 사용할 수 있습니다 fit메서드에optimization_data파라미터를 추가하여 양자 최적화를 위한 최적화 데이터를 선택할 수 있도록 했습니다. 다음 옵션 중 하나를 사용할 수 있습니다:train,validation, 또는both- 전반적인 성능 향상
- 온사이트/알파 정규화가 추가되었습니다.
- 실행 중인 작업에 대한 자세한 상태 추적 기능 추가
2025년 5월 20일
- 표준화된 오류 처리
2025년 3월 18일
- 키스킷-서버리스가 0.20.0 로, 기본 이미지가 다음과 같이 업그레이드되었습니다 0.20.1
2025년 2월 14일
- 기본 이미지를 다음과 같이 업그레이드했습니다 0.19.1
2025년 2월 6일
- 키스킷-서버리스가 0.19.0 로, 기본 이미지가 다음과 같이 업그레이드되었습니다 0.19.0
2024년 11월 13일
- 싱귤래리티 출시 Machine Learning - 분류
지원 받기
궁금한 점이 있으면 멀티버스 컴퓨팅에 문의하세요.
다음과 같은 정보가 포함되어야 합니다.
- 키스킷 함수 작업 ID (
job.job_id) - 문제에 대한 자세한 설명
- 관련 오류 메시지 또는 코드
- 이 문제를 재현하는 단계
다음 단계
- 멀티버스 컴퓨팅의 싱귤래리티 Machine Learning 분류 기능에 대한 액세스를 요청하세요.
- 이 Qiskit 함수에 대한 API 참조 를 확인해 보세요.
- 리클레르, L. 검토 등 (2023). 중성자 원자 양자 프로세서를 활용한 금융 위험 관리 Physical Review Research, 5, 043117.