def _process_using_meta_feature_generator(self, X, meta_feature_generator):
        """Process using secondary learner meta-feature generator

        Since secondary learner meta-feature generator can be anything e.g. predict, predict_proba,
        this internal method gives the ability to use any string. Just make sure secondary learner
        has the method.

        Args:
            X (array-like): Features array

            meta_feature_generator (str, unicode): Method for use by secondary learner
        """

        all_learner_meta_features = []
        for idx, base_learner in enumerate(self.base_learners):
            single_learner_meta_features = getattr(base_learner,
                                                   self.meta_feature_generators[idx])(X)

            if len(single_learner_meta_features.shape) == 1:
                single_learner_meta_features = single_learner_meta_features.reshape(-1, 1)
            all_learner_meta_features.append(single_learner_meta_features)

        all_learner_meta_features = np.concatenate(all_learner_meta_features, axis=1)

        out = getattr(self.secondary_learner, meta_feature_generator)(all_learner_meta_features)

        return out
Process using secondary learner meta-feature generator

        Since secondary learner meta-feature generator can be anything e.g. predict, predict_proba,
        this internal method gives the ability to use any string. Just make sure secondary learner
        has the method.

        Args:
            X (array-like): Features array

            meta_feature_generator (str, unicode): Method for use by secondary learner