앞서 보았듯이 모든 가정을 만족한다면 앙상블의 에러율(0.034)은 개별 분류기의 에러율(0.25)보다 훨씬 낮습니다. 만약 에러율이 0.5인 분류기가 짝수 개일 때 예측이 반반으로 나뉘면 에러로 취급됩니다. 이상적인 앙상블 분류기와 다양한 범위의 분류기를 가진 경우와 비교하기 위해 파이썬으로 확률 질량 함수를 구현해 보겠습니다.3
>>> from scipy.special import comb
>>> import math
>>> def ensemble_error(n_classifier, error):
... k_start = int(math.ceil(n_classifier / 2.))
... probs = [comb(n_classifier, k) *
... error**k *
... (1-error)**(n_classifier - k)
... for k in range(k_start, n_classifier + 1)]
... return sum(probs)
>>> ensemble_error(n_classifier=11, error=0.25)
0.03432750701904297
ensemble_error 함수를 구현한 후 분류기 에러가 0.0에서 1.0까지 걸쳐 있을 때 앙상블의 에러율을 계산하겠습니다. 그다음 앙상블과 개별 분류기 에러 사이의 관계를 선 그래프로 시각화해 보죠.
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> error_range = np.arange(0.0, 1.01, 0.01)
>>> ens_errors = [ensemble_error(n_classifier=11, error=error)
... for error in error_range]
>>> plt.plot(error_range, ens_errors,
... label='Ensemble error',
... linewidth=2)
>>> plt.plot(error_range, error_range,
... linestyle='--', label='Base error',
... linewidth=2)
>>> plt.xlabel('Base error')
>>> plt.ylabel('Base/Ensemble error')
>>> plt.legend(loc='upper left')
>>> plt.grid(alpha=0.5)
>>> plt.show()
3 역주 확률 질량 함수의 누적 값은 사이파이 binom.cdf()를 사용하면 간단하게 구할 수 있습니다. 실패 확률 25%인 분류기가 여섯 개 이상 실패할 확률을 누적한 것은 성공 확률 75%인 분류기가 다섯 개 이하로 성공할 확률을 누적한 것과 같으므로 다음과 같이 구할 수 있습니다.
from scipy.stats import binom; binom.cdf(5, 11, 0.75)