class_docstr: Base class for all ensembles.
  
  Ensembles wrap sets of Lightwood mixers, with the objective of generating better predictions based on the output of each mixer. 
  
  There are two important methods for any ensemble to work:
      1. `__init__()` should prepare all mixers and internal ensemble logic.
      2. `__call__()` applies any aggregation rules to generate final predictions based on the output of each mixer. 
  
  Class Attributes:
  - mixers: List of mixers the ensemble will use.
  - supports_proba: For classification tasks, whether the ensemble supports yielding per-class scores rather than only returning the predicted label. 
  
  NOTE: this ensemble is not functional. Do not use it when generating custom JsonAI objects, as the learning process will fail.
code: def __init__(
      self,
      target,
      mixers: List[BaseMixer],
      data: EncodedDs,
      fit: Optional[bool] = True,
  ) -> None:
      self.data = data
      self.mixers = mixers
      self.best_index = 0
      self.supports_proba = False
      self.submodel_data = []
  
file_path: lightwood/lightwood/ensemble/base.py
imports: from typing import List, Optional
  import pandas
  from lightwood.mixer.base import BaseMixer
  from lightwood.data.encoded_ds import EncodedDs
  from lightwood.api.types import PredictionArguments, SubmodelData
label_desc: Use image node_id 1 to create a new BaseEnsemble object  with example: obj = BaseEnsemble(target, mixers, data, fit)