class_docstr: FIGSExt (sum of trees) classifier.
  Fast Interpretable Greedy-Tree Sums (FIGS) is an algorithm for fitting concise rule-based models.
  Specifically, FIGS generalizes CART to simultaneously grow a flexible number of trees in a summation.
  The total number of splits across all the trees can be restricted by a pre-specified threshold, keeping the model interpretable.
  Experiments across a wide array of real-world datasets show that FIGS achieves state-of-the-art prediction performance when restricted to just a few splits (e.g. less than 20).
  https://arxiv.org/abs/2201.11931
code: def plot(
      self,
      cols=2,
      feature_names=None,
      filename=None,
      label="all",
      impurity=False,
      tree_number=None,
      dpi=150,
      fig_size=None,
  ):
      is_single_tree = len(self.trees_) < 2 or tree_number is not None
      n_cols = int(cols)
      n_rows = int(np.ceil(len(self.trees_) / n_cols))
      # if is_single_tree:
      #     fig, ax = plt.subplots(1)
      # else:
      #     fig, axs = plt.subplots(n_rows, n_cols)
      n_plots = int(len(self.trees_)) if tree_number is None else 1
      fig, axs = plt.subplots(n_plots, dpi=dpi)
      if fig_size is not None:
          fig.set_size_inches(fig_size, fig_size)
      criterion = (
          "squared_error"
          if self.prediction_task == "regression"
          else "gini"
      )
      n_classes = 1 if self.prediction_task == "regression" else 2
      ax_size = int(len(self.trees_))  # n_cols * n_rows
      for i in range(n_plots):
          r = i // n_cols
          c = i % n_cols
          if not is_single_tree:
              # ax = axs[r, c]
              ax = axs[i]
          else:
              ax = axs
          try:
              dt = extract_sklearn_tree_from_figs(
                  self,
                  i if tree_number is None else tree_number,
                  n_classes,
              )
              plot_tree(
                  dt,
                  ax=ax,
                  feature_names=feature_names,
                  label=label,
                  impurity=impurity,
              )
          except IndexError:
              ax.axis("off")
              continue
  
          ax.set_title(f"Tree {i}")
      if filename is not None:
          plt.savefig(filename)
          return
      plt.show()
  
imports: from copy import deepcopy
  import numpy
  from matplotlib import pyplot
  from sklearn import datasets
  from sklearn import tree
  from sklearn.base import BaseEstimator
  from sklearn.linear_model import RidgeCV, RidgeClassifierCV
  from sklearn.model_selection import train_test_split
  from sklearn.tree import plot_tree
  from sklearn.utils import check_X_y
  from imodels.tree.viz_utils import extract_sklearn_tree_from_figs
label_desc: Use image node_id 13 for calling the FIGSExt obj's underlying member method code with example usage: obj.plot(cols, feature_names, filename, label, impurity, tree_number, dpi, fig_size) without return types