class_docstr: The class object for the Random Forest Plus (RF+) estimator, which can
  be used as a prediction model or interpreted via generalized
  mean decrease in impurity (MDI+). For more details, refer to [paper].
  
  Parameters
  ----------
  rf_model: scikit-learn random forest object or None
      The RF model to be used to build RF+. If None, then a new
      RandomForestRegressor() or RandomForestClassifier() is instantiated.
  prediction_model: A PartialPredictionModelBase object, scikit-learn type estimator, or "auto"
      The prediction model to be used for making (full and partial) predictions
      using the block transformed data.
      If value is set to "auto", then a default is chosen as follows:
       - For RandomForestPlusRegressor, RidgeRegressorPPM is used.
       - For RandomForestPlusClassifier, LogisticClassifierPPM is used.
  sample_split: string in {"loo", "oob", "inbag"} or None
      The sample splitting strategy to be used for fitting RF+. If "oob",
      RF+ is trained on the out-of-bag data. If "inbag", RF+ is trained on the
      in-bag data. Otherwise, RF+ is trained on the full training data.
  include_raw: bool
      Flag for whether to augment the local decision stump features extracted
      from the RF model with the original features.
  drop_features: bool
      Flag for whether to use an intercept model for the partial predictions
      on a given feature if a tree does not have any nodes that split on it,
      or to use a model on the raw feature (if include_raw is True).
  add_transformers: list of BlockTransformerBase objects or None
      Additional block transformers (if any) to include in the RF+ model.
  center: bool
      Flag for whether to center the transformed data in the transformers.
  normalize: bool
      Flag for whether to rescale the transformed data to have unit
      variance in the transformers.
docstr: Predict class probabilities on new data using the fitted
  (classification) model.
  
  Parameters
  ----------
  X: ndarray of shape (n_samples, n_features)
      The covariate matrix, for which to make predictions.
  
  Returns
  -------
  y: ndarray of shape (n_samples, n_classes)
      The predicted class probabilities.
docstr_tok: ["Predict","class","probabilities","on","new","data","using","the","fitted","(","classification",")","model",".","Parameters","--","--","--","--","--","X",":","ndarray","of","shape","(","n_samples",",","n_features",")","The","covariate","matrix",",","for","which","to","make","predictions",".","Returns","--","--","--","-","y",":","ndarray","of","shape","(","n_samples",",","n_classes",")","The","predicted","class","probabilities","."]
code: def predict_proba(self, X):
      """
      Predict class probabilities on new data using the fitted
      (classification) model.
  
      Parameters
      ----------
      X: ndarray of shape (n_samples, n_features)
          The covariate matrix, for which to make predictions.
  
      Returns
      -------
      y: ndarray of shape (n_samples, n_classes)
          The predicted class probabilities.
  
      """
      X = check_array(X)
      check_is_fitted(self, "estimators_")
      if not hasattr(self.estimators_[0], "predict_proba"):
          raise AttributeError(
              "'{}' object has no attribute 'predict_proba'".format(
                  self.estimators_[0].__class__.__name__
              )
          )
      if isinstance(X, pd.DataFrame):
          if self.feature_names_ is not None:
              X_array = X.loc[:, self.feature_names_].values
          else:
              X_array = X.values
      elif isinstance(X, np.ndarray):
          X_array = X
      else:
          raise ValueError(
              "Input X must be a pandas DataFrame or numpy array."
          )
  
      predictions = 0
      for estimator, transformer in zip(
          self.estimators_, self.transformers_
      ):
          blocked_data = transformer.transform(
              X_array, center=self.center, normalize=self.normalize
          )
          predictions += estimator.predict_proba(
              blocked_data.get_all_data()
          )
      predictions = predictions / len(self.estimators_)
      return predictions
  
imports: import copy
  import numpy
  import pandas
  from sklearn.base import BaseEstimator, RegressorMixin, ClassifierMixin
  from sklearn.utils import check_array
  from sklearn.utils.validation import check_is_fitted
  from sklearn.metrics import r2_score, roc_auc_score, log_loss
  from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
  from sklearn.preprocessing import OneHotEncoder
  from imodels.importance.block_transformers import MDIPlusDefaultTransformer, TreeTransformer, CompositeTransformer, IdentityTransformer
  from imodels.importance.ppms import PartialPredictionModelBase, GlmClassifierPPM, RidgeRegressorPPM, LogisticClassifierPPM
  from imodels.importance.mdi_plus import ForestMDIPlus, _get_default_sample_split, _validate_sample_split, _get_sample_split_data
label_desc: Use image node_id 4 for calling the _RandomForestPlus obj's underlying member method code with example usage: obj.predict_proba(X) and returns: predictions