class_docstr: Wrap ``VotingClassifier`` and ``VotingRegressor`` from scikit-learn.
  
  Note that this class does not inherit from the ``Learner`` class but rather
  uses different ``Learner`` instances underlyingly.
  
  Parameters
  ----------
  learner_names : List[str]
      List of the learner names that will participate in the voting process.
  voting : Optional[str], default="hard"
      One of "hard" or "soft". If "hard", the predicted class labels
      are used for majority rule voting. If "soft", the predicted class
      label is based on the argmax of the sums of the predicted
      probabilities from each of the underlying learnrs. This parameter
      is only relevant for classification.
  custom_learner_path : Optional[:class:`skll.types.PathOrStr`], default=None
      Path to a Python file containing the definitions of any custom
      learners. Any and all custom learners in ``estimator_names`` must
      be defined in this file. If the custom learner does not inherit
      from an already existing scikit-learn estimator, it must explicitly
      define an `_estimator_type` attribute indicating whether it's a
      "classifier" or a "regressor".
  feature_scaling : str, default="none"
      How to scale the features, if at all for each estimator. Options are
      -  "with_std": scale features using the standard deviation
      -  "with_mean": center features using the mean
      -  "both": do both scaling as well as centering
      -  "none": do neither scaling nor centering
  pos_label : Optional[:class:`skll.types.LabelType`], default=None
      A string denoting the label of the class to be
      treated as the positive class in a binary classification
      setting, for each estimator. If ``None``, the class represented
      by the label that appears second when sorted is chosen as the
      positive class. For example, if the two labels in data are "A"
      and "B" and ``pos_label`` is not specified, "B" will
      be chosen as the positive class.
  min_feature_count : int, default=1
      The minimum number of examples a feature must have a nonzero
      value in to be included, for each estimator.
  model_kwargs_list : Optional[List[Dict[str, Any]]], default=None
      A list of dictionaries of keyword arguments to pass to the
      initializer for each of the estimators. There's a one-to-one
      correspondence between the order of this list and the order
      of the ``learner_names`` list.
  sampler_list : Optional[List[str]], default=None
      The samplers to use for kernel approximation, if desired, for each
      estimator. Valid values are:
      -  "AdditiveChi2Sampler"
      -  "Nystroem"
      -  "RBFSampler"
      -  "SkewedChi2Sampler"
      There's a one-to-one correspondence between the order of this list
      and the order of the ``learner_names`` list.
  sampler_kwargs_list : Optional[List[Dict[str, Any]]], default=None
      A list of dictionaries of keyword arguments to pass to the
      initializer for the specified sampler, one per estimator.
      There's a one-to-one correspondence between the order of this
      list and the order of the ``learner_names`` list.
  logger : Optional[logging.Logger], default=None
      A logging object. If ``None`` is passed, get logger from ``__name__``.
docstr: Save the ``VotingLearner`` instance to a file.
  
  Parameters
  ----------
  learner_path : :class:`skll.types.PathOrStr`
      The path to save the ``VotingLearner`` instance to.
docstr_tok: ["Save","the","``","VotingLearner","``","instance","to","a","file",".","Parameters","--","--","--","--","--","learner_path",":",":","class",":","`","skll.types.PathOrStr","`","The","path","to","save","the","``","VotingLearner","``","instance","to","."]
code: def save(self, learner_path: PathOrStr) -> None:
      """
      Save the ``VotingLearner`` instance to a file.
  
      Parameters
      ----------
      learner_path : :class:`skll.types.PathOrStr`
          The path to save the ``VotingLearner`` instance to.
      """
      _save_learner_to_disk(self, learner_path)
  
imports: import copy
  import logging
  from importlib import import_module
  from itertools import zip_longest
  from multiprocessing import cpu_count
  from typing import Any, Dict, List, Optional, Tuple, Union
  import joblib
  import numpy
  from sklearn.ensemble import VotingClassifier, VotingRegressor
  from sklearn.utils import shuffle
  from sklearn.utils.multiclass import type_of_target
  from skll.data import FeatureSet
  from skll.data.dict_vectorizer import DictVectorizer
  from skll.learner import Learner
  from skll.types import EvaluateTaskResults, FoldMapping, LabelType, LearningCurveSizes, PathOrStr, VotingCrossValidateTaskResults
  from skll.utils.constants import MAX_CONCURRENT_PROCESSES
  from .utils import _load_learner_from_disk, _save_learner_to_disk, add_unseen_labels, compute_evaluation_metrics, get_acceptable_classification_metrics, get_acceptable_regression_metrics, get_predictions, setup_cv_fold_iterator, setup_cv_split_iterator, train_and_score, write_predictions
label_desc: Use image node_id 7 for calling the VotingLearner obj's underlying member method code with example usage: obj.save(learner_path) without return types