code: def build(explainable: Any, **kwargs):
      # copy to avoid changing while iterating
      param_map = {
          varname: vv
          for varname, vv in explainable.__dict__.items()
          if isinstance(varname, str) and isinstance(vv, Param)
      }
  
      for varname, vv in param_map.items():
          param_name = from_camel_case(vv.name)
          assert (
              param_name != vv.name
          ), f"must use a camelCase name so that it is different from camel_case"
  
          add_getter_and_setter = True
  
          if (
              isinstance(explainable, HasInputCol)
              and vv.name == "inputCol"
          ):
              add_getter_and_setter = False
          elif (
              isinstance(explainable, HasOutputCol)
              and vv.name == "outputCol"
          ):
              add_getter_and_setter = False
  
          assert param_name == from_camel_case(varname), (
              param_name,
              varname,
              from_camel_case(varname),
          )
  
          getter = make_get_param(varname)
          setter = make_set_param(varname)
  
          if add_getter_and_setter:
              setattr(
                  explainable.__class__,
                  to_camel_case("get", param_name),
                  getter,
              )
              setattr(
                  explainable.__class__,
                  to_camel_case("set", param_name),
                  setter,
              )
          else:
              assert (
                  ExplainBuilder.get_method(
                      explainable,
                      to_camel_case("get", param_name),
                  )
                  is not None
              ), "no_getter"
              assert (
                  ExplainBuilder.get_method(
                      explainable,
                      to_camel_case("set", param_name),
                  )
                  is not None
              ), "no_setter"
  
          setattr(
              explainable.__class__,
              f"{param_name}",
              property(getter, setter),
          )
  
      # noinspection PyProtectedMember
      explainable._set(**kwargs)
  
imports: from typing import Any, List, Union
  from pyspark.ml.param.shared import HasInputCol, HasOutputCol, Param
  from pyspark.sql import DataFrame, SparkSession, functions, types
  from pyspark.sql.window import Window
label_desc: Use image node_id 4 for calling the ExplainBuilder obj's underlying member method code with example usage: obj.build(explainable) without return types