class_docstr: Handles parameter management for classifiers composed of named estimators.
      
code: def _set_params(self, attr, **params):
      # Ensure strict ordering of parameter setting:
      # 1. All steps
      if attr in params:
          setattr(self, attr, params.pop(attr))
      # 2. Step replacement
      items = getattr(self, attr)
      names = []
      if items:
          names, _ = zip(*items)
      for name in list(params.keys()):
          if "__" not in name and name in names:
              self._replace_estimator(attr, name, params.pop(name))
      # 3. Step parameters and other initialisation arguments
      super().set_params(**params)
      return self
  
file_path: cuml/python/cuml/_thirdparty/sklearn/utils/skl_dependencies.py
imports: from cuml.internals.array_sparse import SparseCumlArray
  from ....internals.base import Base
  from ..utils.validation import check_X_y
  from ....thirdparty_adapters import check_array
label_desc: Use image node_id 2 for calling the BaseComposition obj's underlying member method code with example usage: obj._set_params(attr) and returns: self