def test_StackingClassifier_drop_last_proba(): np.random.seed(123) lr1 = LogisticRegression(solver='liblinear', multi_class='ovr') sclf1 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, drop_last_proba=False, meta_classifier=lr1) sclf1.fit(X, y) r1 = sclf1.predict_meta_features(X[:2]) assert r1.shape == (2, 6) sclf2 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, drop_last_proba=True, meta_classifier=lr1) sclf2.fit(X, y) r2 = sclf2.predict_meta_features(X[:2]) assert r2.shape == (2, 4), r2.shape sclf3 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, drop_last_proba=True, meta_classifier=lr1) sclf3.fit(X[0:100], y[0:100]) # only 2 classes r3 = sclf3.predict_meta_features(X[:2]) assert r3.shape == (2, 2), r3.shape
def test_StackingClassifier_avg_vs_concat(): np.random.seed(123) lr1 = LogisticRegression(solver='liblinear', multi_class='ovr') sclf1 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, average_probas=True, meta_classifier=lr1) sclf1.fit(X, y) r1 = sclf1.predict_meta_features(X[:2]) assert r1.shape == (2, 3) assert_almost_equal(np.sum(r1[0]), 1.0, decimal=6) assert_almost_equal(np.sum(r1[1]), 1.0, decimal=6) sclf2 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, average_probas=False, meta_classifier=lr1) sclf2.fit(X, y) r2 = sclf2.predict_meta_features(X[:2]) assert r2.shape == (2, 6) assert_almost_equal(np.sum(r2[0]), 2.0, decimal=6) assert_almost_equal(np.sum(r2[1]), 2.0, decimal=6) np.array_equal(r2[0][:3], r2[0][3:])
def test_StackingClassifier_avg_vs_concat(): np.random.seed(123) lr1 = LogisticRegression() sclf1 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, average_probas=True, meta_classifier=lr1) sclf1.fit(X, y) r1 = sclf1.predict_meta_features(X[:2]) assert r1.shape == (2, 3) assert_almost_equal(np.sum(r1[0]), 1.0, places=6) assert_almost_equal(np.sum(r1[1]), 1.0, places=6) sclf2 = StackingClassifier(classifiers=[lr1, lr1], use_probas=True, average_probas=False, meta_classifier=lr1) sclf2.fit(X, y) r2 = sclf2.predict_meta_features(X[:2]) assert r2.shape == (2, 6) assert_almost_equal(np.sum(r2[0]), 2.0, places=6) assert_almost_equal(np.sum(r2[1]), 2.0, places=6) np.array_equal(r2[0][:3], r2[0][3:])
def fit(self, X, y): meta_features = X target = y stack_clf = None for layer_num, classifiers in zip(range(self.layer_num), self.multi_classifiers): classifiers = [clf() for clf in classifiers] meta_classifier = self.meta_classifier() stack_clf = StackingClassifier(classifiers=classifiers, meta_classifier=meta_classifier) stack_clf.fit(meta_features, target) if layer_num != self.layer_num - 1: meta_features = stack_clf.predict_meta_features(meta_features) self._meta_clf.append(stack_clf) else: self._stack_slf = stack_clf