def test_configured(self):
        X_train, X_test, y_train, y_test, feature_names = self.load_data(
            multiclass=False)

        actual = GradientBoostingClassifier(random_state=42)
        config = self.get_config(actual)

        actual.set_hyperparameters(config)
        actual.fit(X_train, y_train)
        y_actual = actual.predict(X_test)

        config['max_depth'] = max(
            resolve_factor(config['max_depth_factor'], X_train.shape[1]), 2)
        del config['max_depth_factor']

        config['max_leaf_nodes'] = max(
            resolve_factor(config['max_leaf_nodes_factor'], X_train.shape[0]),
            2)
        del config['max_leaf_nodes_factor']

        config['min_samples_leaf'] = resolve_factor(
            config['min_samples_leaf_factor'], X_train.shape[0])
        del config['min_samples_leaf_factor']

        expected = HistGradientBoostingClassifier(**config,
                                                  scoring='f1_weighted',
                                                  random_state=42)
        expected.fit(X_train, y_train)
        y_expected = expected.predict(X_test)

        assert actual.get_feature_names_out(feature_names).tolist() == [
            'prediction'
        ]
        assert repr(actual.estimator_) == repr(expected)
        assert np.allclose(y_actual, y_expected)
    def _run_GB_trees_classifier_converter(self, num_classes, extra_config={}, labels_shift=0):
        warnings.filterwarnings("ignore")
        for max_depth in [2, 3, 8, 10, 12, None]:
            model = HistGradientBoostingClassifier(max_iter=10, max_depth=max_depth)
            X = [[0, 1], [1, 1], [2, 0]]
            X = np.array(X, dtype=np.float32)
            y = np.array([100, -10, 50]) + labels_shift

            model.fit(X, y)
            pytorch_model = hummingbird.ml.convert(model, "pytorch", extra_config=extra_config)
            self.assertTrue(pytorch_model is not None)
            np.testing.assert_allclose(model.predict_proba(X), pytorch_model.predict_proba(X), rtol=1e-06, atol=1e-06)
    def test_float64_GB_trees_classifier_converter(self):
        warnings.filterwarnings("ignore")
        num_classes = 3
        for max_depth in [2, 3, 8, 10, 12, None]:
            model = HistGradientBoostingClassifier(max_iter=10, max_depth=max_depth)
            np.random.seed(0)
            X = np.random.rand(100, 200)
            y = np.random.randint(num_classes, size=100)

            model.fit(X, y)
            torch_model = hummingbird.ml.convert(model, "torch", extra_config={})
            self.assertTrue(torch_model is not None)
            np.testing.assert_allclose(model.predict_proba(X), torch_model.predict_proba(X), rtol=1e-06, atol=1e-06)
    def _run_GB_trees_classifier_converter(self, num_classes, extra_config={}, labels_shift=0):
        warnings.filterwarnings("ignore")
        for max_depth in [2, 3, 8, 10, 12, None]:
            model = HistGradientBoostingClassifier(max_iter=10, max_depth=max_depth)
            np.random.seed(0)
            X = np.random.rand(100, 200)
            X = np.array(X, dtype=np.float32)
            y = np.random.randint(num_classes, size=100) + labels_shift

            model.fit(X, y)
            torch_model = hummingbird.ml.convert(model, "torch", extra_config=extra_config)
            self.assertTrue(torch_model is not None)
            np.testing.assert_allclose(model.predict_proba(X), torch_model.predict_proba(X), rtol=1e-06, atol=1e-06)
    def test_default(self):
        X_train, X_test, y_train, y_test, feature_names = self.load_data()

        actual = GradientBoostingClassifier(random_state=42)
        config = self.get_default(actual)

        actual.set_hyperparameters(config)
        actual.fit(X_train, y_train)
        y_actual = actual.predict(X_test)

        expected = HistGradientBoostingClassifier(n_iter_no_change=10,
                                                  l2_regularization=1e-10,
                                                  scoring='f1_weighted',
                                                  random_state=42)
        expected.fit(X_train, y_train)
        y_expected = expected.predict(X_test)

        assert actual.get_feature_names_out(feature_names).tolist() == [
            'prediction'
        ]
        assert repr(actual.estimator_) == repr(expected)
        assert np.allclose(y_actual, y_expected)