class_docstr: A simple preprocessor.
  
  Detects variable types, encodes everything as floats
  for use with sklearn.
  
  Applies one-hot encoding, missing value imputation and scaling.
  
  Attributes
  ----------
  ct_ : ColumnTransformer
      Main container for all transformations.
  
  columns_ : pandas columns
      Columns of training data.
  
  dtypes_ : Series of dtypes
      Dtypes of training data columns.
  
  types_ : something
      Inferred input types.
  
  
  Parameters
  ----------
  scale : boolean, default=True
      Whether to scale continuous data.
  
  force_imputation : bool, default=True
      Whether to create imputers even if no training data is missing.
  
  verbose : int, default=0
      Control output verbosity.
class_docstr_tok: ["A","simple","preprocessor",".","Detects","variable","types",",","encodes","everything","as","floats","for","use","with","sklearn",".","Applies","one-hot","encoding",",","missing","value","imputation","and","scaling",".","Attributes","--","--","--","--","--","ct_",":","ColumnTransformer","Main","container","for","all","transformations",".","columns_",":","pandas","columns","Columns","of","training","data",".","dtypes_",":","Series","of","dtypes","Dtypes","of","training","data","columns",".","types_",":","something","Inferred","input","types",".","Parameters","--","--","--","--","--","scale",":","boolean",",","default=True","Whether","to","scale","continuous","data",".","force_imputation",":","bool",",","default=True","Whether","to","create","imputers","even","if","no","training","data","is","missing",".","verbose",":","int",",","default=0","Control","output","verbosity","."]
code: def get_feature_names_out(self):
      # this can go soon hopefully
      feature_names = []
      for name, trans, cols in self.ct_.transformers_:
          if name == "continuous":
              # three should be no all-nan columns in the imputer
              if (
                  trans.steps[0][0] == "simpleimputer"
                  and np.isnan(trans.steps[0][1].statistics_).any()
              ):
                  raise ValueError(
                      "So unexpected! Looks like the imputer"
                      " dropped some all-NaN columns."
                      "Try calling 'clean' on your data first."
                  )
              feature_names.extend(cols.index[cols])
          elif name == "categorical":
              # this is the categorical pipe, extract one hot encoder
              ohe = trans.steps[-1][1]
              imputer = trans.steps[0][1]
  
              ohe_cols = cols[cols].index
              added_cols = ohe_cols[imputer.indicator_.features_].map(
                  lambda x: "{}_imputed".format(x)
              )
              ohe_cols = ohe_cols.to_list()
              ohe_cols.extend(added_cols)
  
              feature_names.extend(ohe.get_feature_names_out(ohe_cols))
          elif name == "remainder":
              assert trans == "drop"
          elif name == "dirty_float":
              raise ValueError(
                  "Can't compute feature names when handling dirty floats. "
                  "Call 'clean' as a workaround"
              )
          else:
              raise ValueError(
                  "Can't compute feature names for {}".format(name)
              )
      return np.array(feature_names)
  
imports: from importlib.metadata import version
  from joblib import hash
  import warnings
  from warnings import warn
  import numpy
  import pandas
  from sklearn.base import BaseEstimator, TransformerMixin
  from sklearn.compose import make_column_transformer, ColumnTransformer
  from sklearn.impute import SimpleImputer
  from sklearn.pipeline import make_pipeline
  from sklearn.preprocessing import OneHotEncoder, StandardScaler
  from sklearn.utils.validation import check_is_fitted
label_desc: Use image node_id 3 for calling the EasyPreprocessor obj's underlying member method code with example usage: obj.get_feature_names_out() and returns: np