class_docstr: When called, this ensemble will return the mode prediction from the entire list of underlying mixers.
  
  If there are multiple modes, the mode whose voting mixers have the highest score will be returned.
  
  NOTE: can only be used in categorical tasks.
code: def __call__(
      self, ds: EncodedDs, args: PredictionArguments
  ) -> pd.DataFrame:
      assert self.prepared
      predictions_df = pd.DataFrame()
      for mixer in self.mixers:
          predictions_df[f"__mdb_mixer_{type(mixer).__name__}"] = mixer(
              ds, args=args
          )["prediction"]
  
      mode_df = predictions_df.apply(
          func=self._pick_mode_highest_score, axis="columns"
      )
  
      return pd.DataFrame(mode_df, columns=["prediction"])
  
file_path: lightwood/lightwood/ensemble/mode_ensemble.py
imports: from typing import List, Optional, Dict
  import pandas
  import numpy
  from lightwood.mixer.base import BaseMixer
  from lightwood.ensemble.base import BaseEnsemble
  from lightwood.api.types import PredictionArguments
  from lightwood.data.encoded_ds import EncodedDs
  from type_infer.dtype import dtype
  from mindsdb_evaluator import evaluate_accuracies
  from type_infer.helpers import is_nan_numeric
  from lightwood.helpers.log import log
label_desc: Use image node_id 3 for calling the ModeEnsemble obj's underlying member method code with example usage: obj.__call__(ds, args) and returns: pd