code: def _combine_cols(data, cols, col_name="features", val_data=None):
      if isinstance(cols, list):
          if len(cols) == 1:
              col_name = cols[0]
          else:
              from pyspark.ml.feature import VectorAssembler
  
              assembler = VectorAssembler(
                  inputCols=cols, outputCol=col_name
              )
              data = assembler.transform(data)
              if val_data is not None:
                  val_data = assembler.transform(val_data)
      return data, val_data, col_name
  
imports: from zoo.orca.learn.metrics import Metric
  from zoo.orca.learn.utils import bigdl_metric_results_to_dict
  from zoo.pipeline.nnframes import NNEstimator, NNModel
  from zoo.pipeline.estimator import Estimator
  from zoo.orca.learn.spark_estimator import Estimator
  from zoo.orca.data import SparkXShards
  from bigdl.optim.optimizer import MaxEpoch
  from zoo.feature.common import FeatureSet
  from zoo.orca.learn.metrics import Accuracy
  from pyspark.sql.dataframe import DataFrame
label_desc: Use image node_id 14 for calling the BigDLEstimator obj's underlying member method code with example usage: obj._combine_cols(data, cols, col_name, val_data) and returns: data,  val_data,  col_name