Skip to main content
IBM Quantum Platform

하이브리드 양자 강화 앙상블 분류 (전력망 안정성 워크플로우)

사용량 예상: Eagle r3 프로세서에서 각 작업당 20분의 QPU 시간이 소요됩니다. (참고: 이는 추정치일 뿐입니다. 런타임은 다를 수 있습니다.)


배경

이 튜토리얼에서는 양자 최적화 단계를 통해 고전적 앙상블을 강화하는 양자-고전 하이브리드 워크플로를 보여줍니다. Multiverse Computing의 “Singularity Machine Learning –Classification”(Qiskit 함수)을 사용하여, 기존 학습 알고리즘(예: 의사결정 트리, k-NN, 로지스틱 회귀)으로 구성된 학습 모델 집합을 훈련한 다음, 양자 레이어를 적용해 해당 집합을 정교화함으로써 다양성과 일반화 능력을 향상시킵니다. 목적은 실용적입니다. 실제 전력망 안정성 예측 과제에서, 동일한 데이터 분할 조건 하에 강력한 기존 기준 모델과 양자 최적화 대안을 비교함으로써, 양자 기법이 어떤 부분에서 도움이 되고 어떤 대가를 치르는지 확인할 수 있습니다.

이것이 중요한 이유: 많은 약한 학습자 중에서 좋은 하위 집합을 선택하는 것은 앙상블의 크기에 따라 빠르게 증가하는 조합 문제입니다. 부스팅, 배깅, 스태킹과 같은 고전적인 휴리스틱은 적당한 규모에서는 잘 작동하지만, 대규모의 중복 모델 라이브러리를 효율적으로 탐색하는 데는 어려움을 겪을 수 있습니다. 이 기능은 양자 알고리즘, 특히 QAOA(및 다른 구성의 경우 선택적으로 VQE)를 통합하여 기존 학습자가 학습된 후 해당 공간을 더 효과적으로 검색하여 일반화가 잘 되는 작고 다양한 하위 집합을 찾을 확률을 높입니다.

결정적으로, 데이터 확장성은 큐비트에 의해 제한되지 않습니다. 전처리, 학습자 풀 훈련, 평가 등 데이터에 대한 무거운 작업은 여전히 고전적이며 수백만 개의 예제를 처리할 수 있습니다. 큐비트는 양자 선택 단계에서 사용되는 앙상블 크기만 결정합니다. 이러한 디커플링 덕분에 오늘날의 하드웨어에서 접근 방식을 실행할 수 있습니다. 데이터 및 모델 학습에 익숙한 스키킷 학습 워크플로를 유지하면서 Qiskit Functions 의 클린 액션 인터페이스를 통해 퀀텀 단계를 호출할 수 있습니다.

실제로는 앙상블에 다양한 학습자 유형(예: 의사 결정 트리, 로지스틱 회귀 또는 k-NN)을 제공할 수 있지만, 의사 결정 트리가 가장 잘 작동하는 경향이 있습니다. 최적화 도구는 일관되게 더 강력한 앙상블 멤버를 선호합니다. 이질적인 학습자가 제공되면 선형 회귀와 같은 약한 모델은 일반적으로 의사 결정 트리와 같은 더 표현력이 뛰어난 모델을 선호하여 가지치기를 합니다.

여기서 수행할 작업: 그리드 안정성 데이터 세트 준비 및 균형 조정, 고전적인 AdaBoost 기준 설정, 앙상블 폭과 정규화를 달리하는 여러 양자 구성 실행, IBM® 시뮬레이터 또는 Qiskit Serverless 을 통해 QPU에서 실행, 모든 실행에서 정확도, 정밀도, 리콜 및 F1 비교. 이 과정에서 함수의 동작 패턴(create, fit, predict, fit_predict, create_fit_predict)과 키 컨트롤을 사용하게 됩니다:

  • 정규화 유형: 직접 희소성의 경우 onsite (λ), 상호작용과 현장 조건 간의 비율 기반 트레이드 오프의 경우 alpha
  • 자동 정규화: 목표 선택 비율로 regularization="auto" 설정하여 희소성을 자동으로 조정합니다
  • 최적화기 옵션: 시뮬레이터 대 QPU, 반복 횟수, 클래식 최적화기 및 관련 옵션, 트랜스파일링 깊이, 그리고 IBM Quantum 의 샘플러 또는 추정기 설정

문서의 벤치마크에 따르면 어려운 문제에서 학습자(큐비트) 수가 증가할수록 정확도가 향상되며, 양자 분류기가 유사한 클래식 앙상블과 일치하거나 이를 능가하는 것으로 나타났습니다. 이 튜토리얼에서는 워크플로우를 엔드 투 엔드로 재현하고 앙상블 폭을 늘리거나 적응형 정규화로 전환하는 것이 합리적인 리소스 사용량에서 더 나은 F1 결과를 가져오는지 살펴봅니다. 그 결과 양자 최적화 단계가 실제 애플리케이션에서 기존 앙상블 학습을 대체하는 것이 아니라 보완하는 방법에 대한 근거 있는 관점을 제시합니다.


요구사항

이 튜토리얼을 시작하기 전에 Python 환경에 다음 패키지가 설치되어 있는지 확인하세요:

  • qiskit[visualization]~=2.1.0
  • qiskit-serverless~=0.24.0
  • qiskit-ibm-runtime v0.40.1
  • qiskit-ibm-catalog~=0.8.0
  • scikit-learn==1.5.2
  • pandas>=2.0.0,<3.0.0
  • imbalanced-learn~=0.12.3

설정

이 섹션에서는 Qiskit Serverless 클라이언트를 초기화하고 멀티버스 컴퓨팅에서 제공하는 싱귤래리티 Machine Learning - 분류 기능을 로드합니다. Qiskit Serverless 을 사용하면 리소스 관리에 대한 걱정 없이 IBM 관리형 클라우드 인프라에서 하이브리드 퀀텀-클래식 워크플로우를 실행할 수 있습니다. 인증하고 Qiskit Functions 에 액세스하려면 IBM Quantum Platform API 키와 클라우드 리소스 이름(CRN)이 필요합니다.

데이터셋을 다운로드하세요

이 튜토리얼에서는 레이블이 지정된 전력 시스템 센서 판독값이 포함된 사전 처리된 그리드 안정성 분류 데이터 세트를 사용합니다. 다음 셀은 필요한 폴더 구조를 자동으로 생성하고 wget 을 사용하여 교육 및 테스트 파일을 모두 사용자 환경에 직접 다운로드합니다. 이러한 파일이 이미 로컬에 있는 경우 이 단계를 수행하면 버전 일관성을 유지하기 위해 안전하게 덮어쓰게 됩니다.

## Download dataset for Grid Stability Classification

# Create data directory if it doesn't exist
!mkdir -p data_tutorial/grid_stability

# Download the training and test sets from the official Qiskit documentation repo
base_url = (
    "https://raw.githubusercontent.com/Qiskit/documentation/"
    "main/datasets/tutorials/grid_stability"
)
!wget -q --show-progress -O data_tutorial/grid_stability/train.csv {base_url}/train.csv

!wget -q --show-progress -O data_tutorial/grid_stability/test.csv {base_url}/test.csv

# Check the files have been downloaded
!echo "Dataset files downloaded:"
!ls -lh data_tutorial/grid_stability/*.csv

Output:

data_tutorial/grid_ 100%[===================>] 612.94K  --.-KB/s    in 0.01s   
data_tutorial/grid_ 100%[===================>] 108.19K  --.-KB/s    in 0.006s  
Dataset files downloaded:
-rw-r--r-- 1 coder coder 109K Nov  8 18:50 data_tutorial/grid_stability/test.csv
-rw-r--r-- 1 coder coder 613K Nov  8 18:50 data_tutorial/grid_stability/train.csv

필요한 패키지를 가져옵니다

이 섹션에서는 자습서 전체에서 사용된 모든 Python 패키지와 키스킷 모듈을 가져옵니다. 여기에는 데이터 처리 및 모델 평가를 위한 핵심 과학 라이브러리( NumPy, pandas, scikit-learn 등)와 함께 양자 강화 모델을 실행하기 위한 시각화 도구 및 키스킷 구성 요소가 포함됩니다. 또한 QiskitRuntimeServiceQiskitFunctionsCatalog 을 가져와 IBM Quantum® 서비스에 연결하고 Singularity Machine Learning 기능에 액세스합니다.

from pprint import pprint
from typing import Tuple
import warnings

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from imblearn.over_sampling import RandomOverSampler
from qiskit_ibm_catalog import QiskitFunctionsCatalog
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import (
    accuracy_score,
    f1_score,
    precision_score,
    recall_score,
)
from sklearn.model_selection import train_test_split

warnings.filterwarnings("ignore")

상수 변수 설정

IBM_TOKEN = ""
IBM_INSTANCE_TEST = ""
IBM_INSTANCE_QUANTUM = ""
FUNCTION_NAME = "multiverse/singularity"
RANDOM_STATE: int = 123
TRAIN_PATH = "data_tutorial/grid_stability/train.csv"
TEST_PATH = "data_tutorial/grid_stability/test.csv"

IBM Quantum 에 접속하여 싱귤래리티 기능을 로드하십시오

다음으로 IBM Quantum 서비스로 인증하고 Qiskit Functions Catalog 에서 Singularity Machine Learning - 분류 기능을 로드합니다. QiskitRuntimeService 은 API 토큰과 인스턴스 CRN을 사용하여 IBM Quantum Platform 에 보안 연결을 설정하여 퀀텀 백엔드에 액세스할 수 있도록 합니다. 그런 다음 QiskitFunctionsCatalog 은 이름("multiverse/singularity")으로 특이점 함수를 검색하는 데 사용되어 나중에 하이브리드 양자-클래식 계산을 위해 호출할 수 있습니다. 설정에 성공하면 기능이 올바르게 로드되었음을 나타내는 확인 메시지가 표시됩니다.

catalog = QiskitFunctionsCatalog(
    token=IBM_TOKEN,
    instance=IBM_INSTANCE_TEST,
    channel="ibm_quantum_platform",
)
backend = catalog.least_busy()

singularity = catalog.load(FUNCTION_NAME)
print(
    "Successfully connected to IBM Qiskit Serverless and "
    "loaded the Singularity function."
)
print("Catalog:", catalog)
print("Singularity function:", singularity)

Output:

Successfully connected to IBM Qiskit Serverless and loaded the Singularity function.
Catalog: <QiskitFunctionsCatalog>
Singularity function: QiskitFunction(multiverse/singularity)

헬퍼 함수 정의하기

주요 실험을 실행하기 전에 데이터 로딩과 모델 평가를 간소화하는 몇 가지 작은 유틸리티 함수를 정의합니다.

  • load_data() 는 입력 CSV 파일을 NumPy 배열로 읽고 scikit-learn 및 퀀텀 워크플로우와의 호환성을 위해 기능과 레이블을 분할합니다.
  • evaluate_predictions() 는 정확도, 정밀도, 리콜, F1-score 등 주요 성능 지표를 계산하고 타이밍 정보가 제공되는 경우 선택적으로 런타임을 보고합니다.

이러한 도우미 기능은 나중에 노트북에서 반복되는 작업을 간소화하고 클래식 및 퀀텀 분류기 모두에서 일관된 지표 보고를 보장합니다.

def load_data(data_path: str) -> Tuple[np.ndarray, np.ndarray]:
    """Load data from the given path to X and y arrays."""
    df: pd.DataFrame = pd.read_csv(data_path)
    return df.iloc[:, :-1].values, df.iloc[:, -1].values


def evaluate_predictions(predictions, y_true):
    """Compute and print accuracy, precision, recall, and F1 score."""
    accuracy = accuracy_score(y_true, predictions)
    precision = precision_score(y_true, predictions)
    recall = recall_score(y_true, predictions)
    f1 = f1_score(y_true, predictions)
    print("Accuracy:", accuracy)
    print("Precision:", precision)
    print("Recall:", recall)
    print("F1:", f1)
    return accuracy, precision, recall, f1

1단계: 고전적 입력을 양자 문제에 매핑하기

먼저 하이브리드 양자-클래식 실험을 위한 데이터 세트를 준비합니다. 이 단계의 목표는 원시 그리드 안정성 데이터를 기존 및 퀀텀 워크플로에서 일관되게 사용할 수 있는 균형 잡힌 훈련, 검증 및 테스트 스플릿으로 변환하는 것입니다. 동일한 분할을 유지하면 나중에 성능을 공정하고 재현 가능하게 비교할 수 있습니다.

데이터 로딩 및 전처리

먼저 학습 및 테스트 CSV 파일을 로드하고, 유효성 검사 분할을 생성하고, 무작위 오버샘플링을 사용하여 데이터 세트의 균형을 맞춥니다. 밸런싱은 다수 클래스에 대한 편향성을 방지하고 클래식 및 양자 앙상블 모델 모두에 보다 안정적인 학습 신호를 제공합니다.

# Load and upload the data
X_train, y_train = load_data(TRAIN_PATH)
X_test, y_test = load_data(TEST_PATH)
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.2, random_state=RANDOM_STATE
)

# Balance the dataset through over-sampling of the positive class
ros = RandomOverSampler(random_state=RANDOM_STATE)
X_train_bal, y_train_bal = ros.fit_resample(X_train, y_train)

print("Shapes:")
print("  X_train_bal:", X_train_bal.shape)
print("  y_train_bal:", y_train_bal.shape)
print("  X_val:", X_val.shape)
print("  y_val:", y_val.shape)
print("  X_test:", X_test.shape)
print("  y_test:", y_test.shape)

Output:

Shapes:
  X_train_bal: (5104, 12)
  y_train_bal: (5104,)
  X_val: (850, 12)
  y_val: (850,)
  X_test: (750, 12)
  y_test: (750,)

클래식 기준선: AdaBoost 참조

퀀텀 최적화를 실행하기 전에 동일한 균형 잡힌 데이터에 대해 강력한 클래식 기준선(표준 AdaBoost 분류기)을 훈련합니다. 이는 나중에 비교할 수 있는 재현 가능한 기준점을 제공하여 양자 최적화가 잘 조정된 클래식 앙상블을 넘어 일반화 또는 효율성을 향상시키는지 여부를 정량화하는 데 도움이 됩니다.

# ----- Classical baseline: AdaBoost -----
baseline = AdaBoostClassifier(n_estimators=60, random_state=RANDOM_STATE)
baseline.fit(X_train_bal, y_train_bal)
baseline_pred = baseline.predict(X_test)
print("Classical AdaBoost baseline:")
_ = evaluate_predictions(baseline_pred, y_test)

Output:

Classical AdaBoost baseline:
Accuracy: 0.7893333333333333
Precision: 1.0
Recall: 0.7893333333333333
F1: 0.8822652757078987

2단계: 양자 하드웨어 실행을 위한 문제 최적화

앙상블 선택 문제는 조합 최적화 문제로 정의되며, 여기서 각 약한 학습기는 이진 결정 변수가 되고, 목적 함수는 정규화 항을 통해 정확도와 스파스성을 균형 있게 조정한다. 이 방법은 IBM 하드웨어에서 QAOA를 활용하여 이 문제를 QuantumEnhancedEnsembleClassifier 해결하면서도, 시뮬레이터 기반의 탐색을 여전히 가능하게 합니다. 하이브리드 루프를 optimizer_options 제어하여: 회로를 선택된 QPU로 simulator=False 라우팅하고, 탐색 폭을 num_solutions 확대하며, ( classical_optimizer_options 내부 고전적 최적화기의 경우) 수렴을 조절합니다. 약 60회 반복 정도의 값이 품질과 실행 시간 사이에서 적절한 균형을 이룹니다. 양자 컴퓨팅 옵션(예: 적당한 회로 깊이(reps) 및 표준 변환 작업 등)은 다양한 기기에서 안정적인 성능을 보장하는 데 도움이 됩니다. 아래 구성은 하드웨어 실행에 사용할 “최적 결과” 프로필입니다. 또한, QPU 시간을 소모하지 않고 워크플로를 시뮬레이션으로만 실행하도록 simulator=True 설정을 전환하여 순수 시뮬레이션 버전을 생성할 수도 있습니다.

# QAOA / runtime configuration for best results on hardware
optimizer_options = {
    "simulator": False,  # set True to test locally without QPU
    "num_solutions": 100_000,  # broaden search over candidate ensembles
    "reps": 3,  # QAOA depth (circuit layers)
    "optimization_level": 3,  # transpilation effort
    "num_transpiler_runs": 30,  # explore multiple layouts
    "classical_optimizer": "COBYLA",  # robust default for this landscape
    "classical_optimizer_options": {
        "maxiter": 60  # practical convergence budget
    },
    # You can pass backend-specific options;
    # leaving None uses least-busy routing
    "estimator_options": None,
    "sampler_options": None,
}

print("Configured hardware optimization profile:")
for key, value in optimizer_options.items():
    print(f"  {key}: {value}")

Output:

Configured hardware optimization profile:
  simulator: False
  num_solutions: 100000
  reps: 3
  optimization_level: 3
  num_transpiler_runs: 30
  classical_optimizer: COBYLA
  classical_optimizer_options: {'maxiter': 60}
  estimator_options: None
  sampler_options: None

3단계: Qiskit primitives 명령어로 실행합니다

이제 Singularity 함수의 create_fit_predict 액션을 사용하여 전체 워크플로우를 실행하여 IBM 인프라에서 QuantumEnhancedEnsembleClassifier 엔드투엔드를 학습, 최적화 및 평가합니다. 이 함수는 앙상블을 빌드하고 Qiskit primitives 을 통해 퀀텀 최적화를 적용하며 예측과 작업 메타데이터(런타임 및 리소스 사용량 포함)를 모두 반환합니다. 1단계에서 분할된 클래식 데이터는 재현성을 위해 재사용되며, 유효성 검사 데이터는 fit_params 을 통해 전달되므로 최적화는 보류된 테스트 세트를 그대로 유지하면서 내부적으로 하이퍼파라미터를 조정할 수 있습니다.

이 단계에서는 양자 앙상블의 여러 구성을 살펴보고 주요 매개변수(특히 num_learnersregularization )가 결과 품질과 QPU 사용량에 어떤 영향을 미치는지 이해합니다.

  • num_learners 는 앙상블 폭(그리고 암시적으로 큐비트 수)을 결정하여 모델의 용량과 계산 비용에 영향을 줍니다.
  • regularization 는 희소성과 과적합을 제어하여 최적화 후에도 얼마나 많은 학습자가 활성 상태로 유지되는지를 설정합니다.

이러한 매개 변수를 변경하면 앙상블 폭과 정규화가 어떻게 상호 작용하는지 확인할 수 있습니다. 일반적으로 폭을 늘리면 F1 개선되지만 QPU 시간이 더 소요되는 반면, 더 강력하거나 적응형 정규화를 사용하면 거의 동일한 하드웨어 공간에서 일반화를 개선할 수 있습니다. 다음 하위 섹션에서는 이러한 효과를 설명하기 위해 세 가지 대표적인 구성을 살펴봅니다.

기준선

이 구성은 num_learners = 10regularization = 7 을 사용합니다.

  • num_learners 는 앙상블 폭을 제어합니다. 즉, 약한 학습자의 수를 효과적으로 결합하고, 양자 하드웨어에서는 필요한 큐비트 수를 제어합니다. 값이 클수록 조합 검색 공간이 넓어지고 정확도와 회상률이 향상되지만 회로 폭, 컴파일 시간 및 전체 QPU 사용량도 증가합니다.
  • regularization 는 추가 학습자를 포함할 때의 페널티 강도를 설정합니다. 기본 '현장' 정규화를 사용하면 값이 클수록 더 강한 희소성(유지되는 학습자 수)을 적용하고, 값이 작을수록 더 복잡한 앙상블을 허용합니다.

이 설정은 폭을 확장하거나 희소성을 조정하기 전에 작은 앙상블이 어떻게 작동하는지 보여주는 저비용 기준선을 제공합니다.

# Problem scale and regularization
NUM_LEARNERS = 10
REGULARIZATION = 7
# ----- Quantum-enhanced ensemble on IBM hardware -----
print("\n-- Submitting quantum-enhanced ensemble job --")
job_1 = singularity.run(
    action="create_fit_predict",
    name="grid_stability_qeec",
    quantum_classifier="QuantumEnhancedEnsembleClassifier",
    num_learners=NUM_LEARNERS,
    regularization=REGULARIZATION,
    optimizer_options=optimizer_options,  # from Step 2
    backend_name=backend,  # least-busy compatible backend
    instance=IBM_INSTANCE_QUANTUM,
    random_state=RANDOM_STATE,
    X_train=X_train_bal,
    y_train=y_train_bal,
    X_test=X_test,
    fit_params={"validation_data": (X_val, y_val)},
    options={"save": False},
)
result_1 = job_1.result()
print("Action status:", result_1.get("status"))
print("Action message:", result_1.get("message"))
print("Metadata:")
pprint(result_1.get("metadata"))
qeec_pred_job_1 = np.array(result_1["data"]["predictions"])
_ = evaluate_predictions(qeec_pred_job_1, y_test)

Output:


-- Submitting quantum-enhanced ensemble job --
Action status: ok
Action message: Classifier created, fitted, and predicted.
Metadata:
{'resource_usage': {'RUNNING: EXECUTING_QPU': {'QPU_TIME': 1550.1889700889587},
                    'RUNNING: MAPPING': {'CPU_TIME': 267.05158376693726},
                    'RUNNING: POST_PROCESSING': {'CPU_TIME': 152.4274561405182},
                    'RUNNING: WAITING_QPU': {'CPU_TIME': 3336.8785166740417}}}
Accuracy: 0.868
Precision: 1.0
Recall: 0.868
F1: 0.9293361884368309
status_1 = job_1.status()
print("\nQuantum job status:", status_1)

Output:


Quantum job status: DONE

학습자 수를 늘리다

여기서는 regularization = 7 을 유지하면서 num_learners 을 10개에서 30개로 늘립니다.

  • 더 많은 학습자가 가설 공간을 확장하여 모델이 더 미묘한 패턴을 포착할 수 있도록 하여 F1.
  • 대부분의 경우 10명 학습자와 30명 학습자 간의 런타임 차이는 크지 않으며, 이는 추가된 회로 폭으로 인해 실행 비용이 크게 증가하지 않음을 나타냅니다.
  • 품질 향상은 여전히 감소하는 수익률 곡선을 따르며, 앙상블이 성장함에 따라 초기 성과가 나타나지만 추가 학습자의 새로운 정보 기여가 줄어들면서 정체되는 양상을 보입니다.

이 실험은 백엔드 및 트랜스필레이션 조건에 따라 앙상블 폭을 늘리면 런타임에 큰 불이익 없이 약간의 정확도 향상을 얻을 수 있다는 품질과 효율성의 절충점을 강조합니다.

# Problem scale and regularization
NUM_LEARNERS = 30
REGULARIZATION = 7
# ----- Quantum-enhanced ensemble on IBM hardware -----
print("\n-- Submitting quantum-enhanced ensemble job --")
job_2 = singularity.run(
    action="create_fit_predict",
    name="grid_stability_qeec",
    quantum_classifier="QuantumEnhancedEnsembleClassifier",
    num_learners=NUM_LEARNERS,
    regularization=REGULARIZATION,
    optimizer_options=optimizer_options,  # from Step 2
    backend_name=backend,  # least-busy compatible backend
    instance=IBM_INSTANCE_QUANTUM,
    random_state=RANDOM_STATE,
    X_train=X_train_bal,
    y_train=y_train_bal,
    X_test=X_test,
    fit_params={"validation_data": (X_val, y_val)},
    options={"save": False},
)
result_2 = job_2.result()
print("Action status:", result_2.get("status"))
print("Action message:", result_2.get("message"))
print("QPU Time:")
pprint(result_2.get("metadata"))
qeec_pred_job_2 = np.array(result_2["data"]["predictions"])
_ = evaluate_predictions(qeec_pred_job_2, y_test)

Output:


-- Submitting quantum-enhanced ensemble job --
Action status: ok
Action message: Classifier created, fitted, and predicted.
QPU Time:
{'resource_usage': {'RUNNING: EXECUTING_QPU': {'QPU_TIME': 1095.822762966156},
                    'RUNNING: MAPPING': {'CPU_TIME': 680.2116754055023},
                    'RUNNING: POST_PROCESSING': {'CPU_TIME': 154.4466371536255},
                    'RUNNING: WAITING_QPU': {'CPU_TIME': 80.80395102500916}}}
Accuracy: 0.8946666666666667
Precision: 1.0
Recall: 0.8946666666666667
F1: 0.944405348346235
status_2 = job_2.status()
print("\nQuantum job status:", status_2)

Output:


Quantum job status: DONE

정규화

이 구성에서는 num_learners = 60 로 늘리고 적응형 정규화를 도입하여 희소성을 보다 직관적으로 관리합니다.

  • regularization = "auto" 을 사용하면 옵티마이저가 수동으로 페널티를 수정하는 대신 최종 앙상블을 위해 대략 regularization_ratio * num_learners 약한 학습자를 선택하는 적절한 정규화 강도를 자동으로 찾습니다. 이는 희소성과 앙상블 크기 사이의 균형을 관리하기 위한 보다 편리한 인터페이스를 제공합니다.
  • regularization_type = "alpha" 페널티 적용 방식을 정의합니다. onsite바인딩되지 않은 [0, ∞] 과 달리 alpha[0, 1] 사이에 바인딩되어 있어 조정 및 해석이 더 쉽습니다. 이 매개변수는 개별 페널티와 페어별 페널티 간의 절충점을 제어하여 보다 부드러운 구성 범위를 제공합니다.
  • regularization_desired_ratio ≈ 0.82 는 정규화 후에도 활성 상태로 유지할 학습자의 목표 비율을 지정합니다. 여기서는 약 82%의 학습자가 유지되고 가장 약한 18%는 자동으로 트리밍됩니다.

적응형 정규화는 구성을 간소화하고 균형 잡힌 앙상블을 유지하는 데 도움이 되지만, 반드시 더 나은 성능이나 안정적인 성능을 보장하지는 않습니다. 실제 품질은 적절한 정규화 매개변수를 선택하는 데 달려 있으며, 교차 검증을 통해 이를 미세 조정하는 것은 계산 비용이 많이 들 수 있습니다. 주요 장점은 직접적인 정확도 향상보다는 사용성과 해석 가능성 향상에 있습니다.

# Problem scale and regularization
NUM_LEARNERS = 60
REGULARIZATION = "auto"
REGULARIZATION_TYPE = "alpha"
REGULARIZATION_RATIO = 0.82
# ----- Quantum-enhanced ensemble on IBM hardware -----
print("\n-- Submitting quantum-enhanced ensemble job --")
job_3 = singularity.run(
    action="create_fit_predict",
    name="grid_stability_qeec",
    quantum_classifier="QuantumEnhancedEnsembleClassifier",
    num_learners=NUM_LEARNERS,
    regularization=REGULARIZATION,
    regularization_type=REGULARIZATION_TYPE,
    regularization_desired_ratio=REGULARIZATION_RATIO,
    optimizer_options=optimizer_options,  # from Step 2
    backend_name=backend,  # least-busy compatible backend
    instance=IBM_INSTANCE_QUANTUM,
    random_state=RANDOM_STATE,
    X_train=X_train_bal,
    y_train=y_train_bal,
    X_test=X_test,
    fit_params={"validation_data": (X_val, y_val)},
    options={"save": False},
)
result_3 = job_3.result()
print("Action status:", result_3.get("status"))
print("Action message:", result_3.get("message"))
print("Metadata:")
pprint(result_3.get("metadata"))
qeec_pred_job_3 = np.array(result_3["data"]["predictions"])
_ = evaluate_predictions(qeec_pred_job_3, y_test)

Output:


-- Submitting quantum-enhanced ensemble job --
Action status: ok
Action message: Classifier created, fitted, and predicted.
Metadata:
{'resource_usage': {'RUNNING: EXECUTING_QPU': {'QPU_TIME': 1146.5584812164307},
                    'RUNNING: MAPPING': {'CPU_TIME': 1387.7451872825623},
                    'RUNNING: POST_PROCESSING': {'CPU_TIME': 171.78878355026245},
                    'RUNNING: WAITING_QPU': {'CPU_TIME': 95.41597843170166}}}
Accuracy: 0.908
Precision: 1.0
Recall: 0.908
F1: 0.9517819706498952
status_3 = job_3.status()
print("\nQuantum job status:", status_3)

Output:


Quantum job status: DONE

4단계: 후처리 수행 및 원하는 클래식 형식으로 결과 반환

이제 클래식 및 퀀텀 실행의 결과물을 후처리하여 다운스트림 평가를 위한 일관된 형식으로 변환합니다. 이 단계에서는 정확도, 정밀도, 리콜, F1 등의 표준 메트릭을 사용하여 예측 품질을 비교하고 앙상블 폭(num_learners)과 희소성 제어(regularization)가 성능과 계산 동작에 어떤 영향을 미치는지 분석합니다.

고전적인 AdaBoost 기준선은 소규모 학습을 위한 간결하고 안정적인 참조를 제공합니다. 제한된 앙상블과 무시할 수 있는 컴퓨팅 오버헤드로 우수한 성능을 발휘하며, 가설 공간이 여전히 추적 가능한 경우 기존 부스팅의 강점을 반영합니다. 양자 구성(qeec_pred_job_1, qeec_pred_job_2, qeec_pred_job_3)은 앙상블 선택 프로세스를 가변적 양자 최적화 루프에 포함시킴으로써 이 기준을 확장합니다. 이를 통해 시스템은 기하급수적으로 큰 학습자 하위 집합을 동시에 중첩하여 탐색할 수 있으므로 규모가 커짐에 따라 앙상블 선택의 조합적 특성을 보다 효율적으로 처리할 수 있습니다.

결과에 따르면 num_learners 을 10개에서 30개로 늘리면 기억력이 향상되고 F1, 더 넓은 앙상블이 약한 학습자들 사이에서 더 풍부한 상호작용을 포착하는 것으로 확인되었습니다. 현재 하드웨어에서는 학습자가 추가될 때마다 정확도가 더 작게 증가하는 등 이득이 선형적이지 않지만, 양자 최적화 도구가 기존 하위 집합 선택의 전형적인 기하급수적인 폭증 없이 더 넓은 구성 공간을 검색할 수 있기 때문에 기본 확장 동작은 여전히 유리하게 유지됩니다. 고정 λ=7은 일관된 희소성을 적용하고 수렴을 안정화하는 반면, 적응형 α 정규화는 학습자 간의 상관관계를 기반으로 희소성을 자동으로 조정합니다. 이 동적 가지치기는 종종 동일한 큐비트 폭에 대해 약간 더 높은 F1 을 달성하여 모델 복잡성과 일반화의 균형을 맞춥니다.

AdaBoost 기준과 직접 비교했을 때, 가장 작은 양자 구성( L=10 )은 비슷한 정확도를 재현하여 하이브리드 파이프라인의 정확성을 검증합니다. 더 큰 폭에서는 양자 변형(특히 자동 정규화를 사용하는 경우)이 기존 기준선을 완만하게 능가하기 시작하여 계산 비용의 선형적 증가 없이 향상된 리콜 및 F1 을 보여줍니다. 이러한 개선은 즉각적인 '양자 우위'를 의미하는 것이 아니라 확장 효율성을 의미합니다. 양자 옵티마이저는 앙상블이 확장됨에 따라 기존 접근 방식이 하위 집합 선택 복잡성의 기하급수적 증가에 직면할 때에도 추적 가능한 성능을 유지합니다.

실제로:

  • 소규모 데이터 세트에 대한 빠른 검증 및 벤치마킹을 위해 기존 기준선을 사용하세요.
  • 모델 너비나 기능 복잡도가 증가하면 양자 앙상블을 적용합니다. 이러한 체제에서는 QAOA 기반 검색이 더욱 원활하게 확장됩니다.
  • 적응형 α 정규화를 사용하여 회로 폭을 늘리지 않고도 희소성과 일반화를 유지합니다.
  • QPU 시간과 깊이를 모니터링하여 단기적인 하드웨어 제약과 품질 향상 간의 균형을 맞출 수 있습니다.

이러한 실험을 통해 양자 최적화 앙상블은 작은 규모에서 기준 정확도를 재현하는 동시에 대규모 조합 학습 문제에서 효율적인 확장을 위한 경로를 제공함으로써 기존 방법을 보완한다는 것을 알 수 있습니다. 하드웨어가 개선됨에 따라 이러한 확장 이점이 복합적으로 작용하여 앙상블 기반 모델의 실현 가능한 크기와 깊이가 고전적으로 실용적인 수준 이상으로 확장될 것으로 예상됩니다.

각 구성에 대한 메트릭을 평가하십시오

이제 evaluate_predictions 도우미를 사용하여 동일한 테스트 세트에서 정확도, 정밀도, 리콜 및 F1 을 계산하기 위해 기존 AdaBoost 기준과 세 가지 양자 앙상블 등 모든 구성을 평가합니다. 이 비교는 양자 최적화가 기존 접근 방식에 비해 어떻게 확장되는지 명확히 보여줍니다. 작은 폭에서는 둘 다 비슷한 성능을 보이지만, 앙상블이 커질수록 양자 방식이 더 큰 가설 공간을 더 효율적으로 탐색할 수 있습니다. 결과 표는 이러한 추세를 일관되고 정량적인 형태로 캡처합니다.

results = []

# Classical baseline
acc_b, prec_b, rec_b, f1_b = evaluate_predictions(baseline_pred, y_test)
results.append(
    {
        "Config": "AdaBoost (Classical)",
        "Accuracy": acc_b,
        "Precision": prec_b,
        "Recall": rec_b,
        "F1": f1_b,
    }
)

# Quantum runs
for label, preds in [
    ("QEEC L=10, reg=7", qeec_pred_job_1),
    ("QEEC L=30, reg=7", qeec_pred_job_2),
    (f"QEEC L=60, reg=auto (α={REGULARIZATION_RATIO})", qeec_pred_job_3),
]:
    acc, prec, rec, f1 = evaluate_predictions(preds, y_test)
    results.append(
        {
            "Config": label,
            "Accuracy": acc,
            "Precision": prec,
            "Recall": rec,
            "F1": f1,
        }
    )


df_results = pd.DataFrame(results)
df_results

Output:

Accuracy: 0.7893333333333333
Precision: 1.0
Recall: 0.7893333333333333
F1: 0.8822652757078987
Accuracy: 0.868
Precision: 1.0
Recall: 0.868
F1: 0.9293361884368309
Accuracy: 0.8946666666666667
Precision: 1.0
Recall: 0.8946666666666667
F1: 0.944405348346235
Accuracy: 0.908
Precision: 1.0
Recall: 0.908
F1: 0.9517819706498952
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,0AdaBoost (Classical)0.7893331.00.7893330.8822651QEEC L=10, reg=70.8680001.00.8680000.9293362QEEC L=30, reg=70.8946671.00.8946670.9444053QEEC L=60, reg=auto (α=0.82)0.9080001.00.9080000.951782 ,

다양한 구성에 걸친 품질 추세를 시각화하십시오

아래 그룹화된 막대형 차트는 정확도F1 을 기존 기준선과 양자 앙상블(L=10, L=30, L=60 auto-α)에 걸쳐 비교합니다. 양자 앙상블 폭이 증가함에 따라 F1 정확도가 점차 향상되는 동안 정확도가 어떻게 안정화되는지 보여주며, 하이브리드 방식이 기존 하위 집합 선택의 전형적인 기하급수적인 비용 증가 없이 성능 확장을 유지한다는 것을 보여줍니다.

x = np.arange(len(df_results))
width = 0.35
plt.figure(figsize=(7.6, 4.6))
plt.bar(x - width / 2, df_results["Accuracy"], width=width, label="Accuracy")
plt.bar(x + width / 2, df_results["F1"], width=width, label="F1")
plt.xticks(x, df_results["Config"], rotation=10)
plt.ylabel("Score")
plt.title("Classical vs Quantum ensemble performance")
plt.legend()
plt.ylim(0, 1.0)
plt.tight_layout()
plt.show()

Output:

Output of the previous code cell

해석

플롯은 예상되는 스케일링 패턴을 확인합니다. 고전적인 AdaBoost 은 소규모 앙상블에서는 강력한 성능을 발휘하지만, 하위 집합 선택 문제가 조합적으로 확장되기 때문에 약한 학습자의 수가 증가함에 따라 확장 비용이 점점 더 많이 듭니다. 양자 강화 모델은 낮은 폭에서 기존 정확도를 복제하고 앙상블 크기가 증가함에 따라, 특히 적응형 α-규칙화 하에서 기존 정확도를 능가하기 시작합니다. 이는 중첩을 통해 많은 후보 하위 집합을 병렬로 샘플링하고 평가하여 더 넓은 폭에서도 추적 가능한 검색을 유지하는 양자 최적화 도구의 능력을 반영합니다. 현재의 하드웨어 오버헤드는 이론적 이득의 일부를 상쇄하지만, 이러한 추세는 양자 공식의 확장 효율성 이점을 보여줍니다. 실제로 경량 벤치마크에서는 여전히 고전적인 방법이 선호되는 반면, 양자 강화 앙상블은 모델 차원과 앙상블 크기가 확장됨에 따라 정확도, 일반화 및 계산 증가 사이의 더 나은 균형을 제공함으로써 유리해집니다.


부록: 확장성 이점 및 개선 사항

QuantumEnhancedEnsembleClassifier 의 확장성 이점은 앙상블 선택 프로세스가 양자 최적화에 매핑되는 방식에서 비롯됩니다. AdaBoost 또는 랜덤 포레스트와 같은 고전적인 앙상블 학습 방법은 최적의 하위 집합을 선택하는 것이 기하급수적으로 확장되는 조합 문제이므로 약한 학습자의 수가 증가함에 따라 계산 비용이 증가합니다.

반면, 양자 근사 최적화 알고리즘(QAOA)을 통해 구현된 양자 공식은 여러 구성을 중첩하여 평가함으로써 기하급수적으로 큰 검색 공간을 보다 효율적으로 탐색할 수 있습니다. 그 결과 학습자 수에 따라 훈련 시간이 크게 증가하지 않아 앙상블 폭이 증가하더라도 모델의 효율성을 유지할 수 있습니다.

현재의 하드웨어는 약간의 노이즈와 깊이 제한이 있지만, 이 워크플로에서는 클래식과 양자 구성 요소가 협력하는 단기적인 하이브리드 접근 방식을 보여줍니다. 양자 최적화 도구는 클래식 루프에 더 나은 초기화 환경을 제공하여 수렴 및 최종 모델 품질을 개선합니다. 양자 프로세서가 발전함에 따라 이러한 확장성의 이점은 더 큰 데이터 세트, 더 넓은 앙상블, 더 깊은 회로 깊이로 확장될 것으로 예상됩니다.


참조

  1. 소개 Qiskit Functions
  2. 멀티버스 컴퓨팅 특이점 Machine Learning

튜토리얼 설문조사

잠시 시간을 내어 이 튜토리얼에 대한 피드백을 제공해 주세요. 여러분의 인사이트는 콘텐츠 제공과 사용자 경험을 개선하는 데 도움이 됩니다.

설문조사 링크

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.