code: def feature_names(self, feature_names):
          
          if feature_names is not None:
              # validate feature name
              try:
                  if not isinstance(feature_names, str):
                      feature_names = [n for n in iter(feature_names)]
                  else:
                      feature_names = [feature_names]
              except TypeError:
                  feature_names = [feature_names]
  
              if len(feature_names) != len(set(feature_names)):
                  raise ValueError('feature_names must be unique')
              if len(feature_names) != self.num_col():
                  msg = 'feature_names must have the same length as data'
                  raise ValueError(msg)
              # prohibit to use symbols may affect to parse. e.g. []<
              if not all(isinstance(f, STRING_TYPES) and
                         not any(x in f for x in set(('[', ']', '<')))
                         for f in feature_names):
                  raise ValueError('feature_names may not contain [, ] or <')
          else:
              # reset feature_types also
              self.feature_types = None
          self._feature_names = feature_names
docs: Set feature names (column labels).
  
          Parameters
          ----------
          feature_names : list or None
              Labels for features. None will reset existing feature names