더북(TheBook)

코드의 각 부분을 설명하려고 많은 주석을 넣었습니다. 나머지 메서드를 구현하기 전에 잠시 한숨 돌리면서 복잡해 보일 수 있는 부분을 설명하겠습니다. BaseEstimatorClassifierMixin 클래스를 상속하여 기본적인 기능들을 자동으로 갖춥니다. 여기에는 분류기의 매개변수를 설정하고 반환하는 get_paramsset_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_paramsset_params 메서드는 사이킷런의 파이프라인과 그리드 탐색에 꼭 필요한 메서드입니다. 이 두 메서드는 생성자에 명시된 매개변수만 참조하므로 __init__ 함수에 *args**kargs를 사용해서는 안 됩니다. ClassifierMixin 클래스에서 상속되는 score 메서드는 정확도를 계산합니다. 이와 비슷하게 회귀 모델의 경우는 RegressorMixin을 상속하며 R2 점수를 계산하는 score 메서드가 추가됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.