코드의 각 부분을 설명하려고 많은 주석을 넣었습니다. 나머지 메서드를 구현하기 전에 잠시 한숨 돌리면서 복잡해 보일 수 있는 부분을 설명하겠습니다. BaseEstimator와 ClassifierMixin 클래스를 상속하여 기본적인 기능들을 자동으로 갖춥니다. 여기에는 분류기의 매개변수를 설정하고 반환하는 get_params와 set_params 메서드가 있고 예측 정확도를 계산하는 score 메서드가 포함됩니다.8
그다음 predict 메서드를 만듭니다. 이 메서드는 vote='classlabel'로 MajorityVoteClassifier 객체가 만들어졌다면 클래스 레이블에 기반을 둔 다수결 투표를 사용하여 클래스 레이블을 예측합니다. vote='probability'로 만들어졌을 경우에는 클래스 소속 확률을 기반으로 클래스 레이블을 예측합니다. ROC AUC를 계산하기 위해 평균 확률을 반환하는 predict_proba 메서드도 추가하겠습니다.
def predict(self, X):
"""X 에 대한 클래스 레이블을 예측합니다
매개변수
----------
X : {배열 타입, 희소 행렬},
크기 = [n_samples, n_features]
샘플 데이터 행렬
반환값
----------
maj_vote : 배열 타입, 크기 = [n_samples]
예측된 클래스 레이블
"""
if self.vote == 'probability':
maj_vote = np.argmax(self.predict_proba(X),
axis=1)
else: # 'classlabel' 투표
# clf.predict 메서드를 사용하여 결과를 모읍니다
predictions = np.asarray([clf.predict(X)
for clf in
self.classifiers_]).T
maj_vote = np.apply_along_axis(
lambda x:
np.argmax(np.bincount(x,
weights=self.weights)),
axis=1,
arr=predictions)
maj_vote = self.lablenc_.inverse_transform(maj_vote)
return maj_vote
def predict_proba(self, X):
"""X에 대한 클래스 확률을 예측합니다
매개변수
----------
X : {배열 타입, 희소 행렬},
크기 = [n_samples, n_features]
n_samples 는 샘플의 개수고 n_features 는 특성의 개수인
샘플 데이터 행렬
반환값
----------
avg_proba : 배열 타입,
크기 = [n_samples, n_classes]
샘플마다 가중치가 적용된 클래스의 평균 확률
"""
probas = np.asarray([clf.predict_proba(X)
for clf in self.classifiers_])
avg_proba = np.average(probas,
axis=0, weights=self.weights)
return avg_proba
def get_params(self, deep=True):
"""GridSearch를 위해 분류기의 매개변수 이름을 반환합니다"""
if not deep:
return super(MajorityVoteClassifier,
self).get_params(deep=False)
else:
out = self.named_classifiers.copy()
for name, step in\
six.iteritems(self.named_classifiers):
for key, value in six.iteritems(
step.get_params(deep=True)):
out['%s__%s' % (name, key)] = value
return out
8 역주 BaseEstimator로부터 상속받는 get_params와 set_params 메서드는 사이킷런의 파이프라인과 그리드 탐색에 꼭 필요한 메서드입니다. 이 두 메서드는 생성자에 명시된 매개변수만 참조하므로 __init__ 함수에 *args나 **kargs를 사용해서는 안 됩니다. ClassifierMixin 클래스에서 상속되는 score 메서드는 정확도를 계산합니다. 이와 비슷하게 회귀 모델의 경우는 RegressorMixin을 상속하며 R2 점수를 계산하는 score 메서드가 추가됩니다.