code: def test_xgb_classifier_with_categorical(n_classes):
      n_samples = 100
      n_features = 8
      X, y = make_classification_with_categorical(
          n_samples=n_samples,
          n_features=n_features,
          n_categorical=4,
          n_informative=n_features,
          n_redundant=0,
          n_repeated=0,
          n_classes=n_classes,
          random_state=2022,
      )
  
      dtrain = xgb.DMatrix(X, y, enable_categorical=True)
      params = {
          "tree_method": "gpu_hist",
          "max_depth": 6,
          "base_score": 0.5,
          "seed": 0,
          "predictor": "gpu_predictor",
      }
      if n_classes == 2:
          params["objective"] = "binary:logistic"
          params["eval_metric"] = "logloss"
      else:
          params["objective"] = "multi:softprob"
          params["eval_metric"] = "mlogloss"
          params["num_class"] = n_classes
      xgb_model = xgb.train(
          params, dtrain, num_boost_round=10, evals=[(dtrain, "train")]
      )
      assert (
          count_categorical_split(
              treelite.Model.from_xgboost(xgb_model)
          )
          > 0
      )
  
      # Insert NaN randomly into X
      X_test = X.values.copy()
      n_nan = int(np.floor(X.size * 0.1))
      rng = np.random.default_rng(seed=0)
      index_nan = rng.choice(X.size, size=n_nan, replace=False)
      X_test.ravel()[index_nan] = np.nan
  
      explainer = TreeExplainer(model=xgb_model)
      out = explainer.shap_values(X_test)
  
      dtest = xgb.DMatrix(X_test)
      ref_out = xgb_model.predict(
          dtest, pred_contribs=True, validate_features=False
      )
      if n_classes == 2:
          ref_out, ref_expected_value = ref_out[:, :-1], ref_out[0, -1]
      else:
          ref_out = ref_out.transpose((1, 0, 2))
          ref_out, ref_expected_value = (
              ref_out[:, :, :-1],
              ref_out[:, 0, -1],
          )
      np.testing.assert_almost_equal(out, ref_out, decimal=5)
      np.testing.assert_almost_equal(
          explainer.expected_value, ref_expected_value, decimal=5
      )
  
imports: from cuml.testing.utils import as_type
  import cuml
  from cuml.ensemble import RandomForestClassifier
  from cuml.ensemble import RandomForestRegressor
  from cuml.common.exceptions import NotFittedError
  from cuml.internals.import_utils import has_sklearn
  from cuml.internals.import_utils import has_lightgbm, has_shap
  from cuml.explainer.tree_shap import TreeExplainer
  from hypothesis import given, settings, assume, HealthCheck, strategies
  from cuml.internals.safe_imports import gpu_only_import
  import json
  import pytest
  import treelite
  from cuml.internals.safe_imports import cpu_only_import
label_desc: Use image node_id 13 for calling a global function with example usage: test_xgb_classifier_with_categorical(n_classes) without return types