class_docstr: Transforms numeric data into k-means cluster memberships.
  From the Feature Engineering Book by Alice Zheng
  https://github.com/alicezheng/feature-engineering-book/blob/master/kmeans_featurizer.py
  This transformer runs k-means on the input data and converts each data point
  into the id of the closest cluster. If a target variable is present, it is
  scaled and included as input to k-means in order to derive clusters that
  obey the classification boundary as well as group similar points together.
  Parameters
  ----------
  k: integer, optional, default 100
      The number of clusters to group data into.
  target_scale: float, [0, infty], optional, default 5.0
      The scaling factor for the target variable. Set this to zero to ignore
      the target. For classification problems, larger `target_scale` values
      will produce clusters that better respect the class boundary.
  random_state : integer or numpy.RandomState, optional
      This is passed to k-means as the generator used to initialize the
      kmeans centers. If an integer is given, it fixes the seed. Defaults to
      the global numpy random number generator.
  Attributes
  ----------
  cluster_centers_ : array, [k, n_features]
      Coordinates of cluster centers. n_features does count the target column.
class_docstr_tok: ["Transforms","numeric","data","into","k-means","cluster","memberships",".","From","the","Feature","Engineering","Book","by","Alice","Zheng","https",":","\/\/github.com\/alicezheng\/feature-engineering-book\/blob\/master\/kmeans_featurizer.py","This","transformer","runs","k-means","on","the","input","data","and","converts","each","data","point","into","the","id","of","the","closest","cluster",".","If","a","target","variable","is","present",",","it","is","scaled","and","included","as","input","to","k-means","in","order","to","derive","clusters","that","obey","the","classification","boundary","as","well","as","group","similar","points","together",".","Parameters","--","--","--","--","--","k",":","integer",",","optional",",","default","100","The","number","of","clusters","to","group","data","into",".","target_scale",":","float",",","[","0",",","infty","]",",","optional",",","default","5.0","The","scaling","factor","for","the","target","variable",".","Set","this","to","zero","to","ignore","the","target",".","For","classification","problems",",","larger","`","target_scale","`","values","will","produce","clusters","that","better","respect","the","class","boundary",".","random_state",":","integer","or","numpy.RandomState",",","optional","This","is","passed","to","k-means","as","the","generator","used","to","initialize","the","kmeans","centers",".","If","an","integer","is","given",",","it","fixes","the","seed",".","Defaults","to","the","global","numpy","random","number","generator",".","Attributes","--","--","--","--","--","cluster_centers_",":","array",",","[","k",",","n_features","]","Coordinates","of","cluster","centers",".","n_features","does","count","the","target","column","."]
docstr: Runs k-means on the input data and find centroids.
  If no target is given (`y` is None) then run vanilla k-means on input
  `X`.
  If target `y` is given, then include the target (weighted by
  `target_scale`) as an extra dimension for k-means clustering. In this
  case, run k-means twice, first with the target, then an extra iteration
  without.
  After fitting, the attribute `cluster_centers_` are set to the k-means
  centroids in the input space represented by `X`.
  Parameters
  ----------
  X : array-like or sparse matrix, shape=(n_data_points, n_features)
  y : vector of length n_data_points, optional, default None
      If provided, will be weighted with `target_scale` and included in
      k-means clustering as hint.
docstr_tok: ["Runs","k-means","on","the","input","data","and","find","centroids",".","If","no","target","is","given","(","`","y","`","is","None",")","then","run","vanilla","k-means","on","input","`","X","`",".","If","target","`","y","`","is","given",",","then","include","the","target","(","weighted","by","`","target_scale","`",")","as","an","extra","dimension","for","k-means","clustering",".","In","this","case",",","run","k-means","twice",",","first","with","the","target",",","then","an","extra","iteration","without",".","After","fitting",",","the","attribute","`","cluster_centers_","`","are","set","to","the","k-means","centroids","in","the","input","space","represented","by","`","X","`",".","Parameters","--","--","--","--","--","X",":","array-like","or","sparse","matrix",",","shape=","(","n_data_points",",","n_features",")","y",":","vector","of","length","n_data_points",",","optional",",","default","None","If","provided",",","will","be","weighted","with","`","target_scale","`","and","included","in","k-means","clustering","as","hint","."]
code: def fit(self, X, y=None):
      """Runs k-means on the input data and find centroids.
      If no target is given (`y` is None) then run vanilla k-means on input
      `X`.
      If target `y` is given, then include the target (weighted by
      `target_scale`) as an extra dimension for k-means clustering. In this
      case, run k-means twice, first with the target, then an extra iteration
      without.
      After fitting, the attribute `cluster_centers_` are set to the k-means
      centroids in the input space represented by `X`.
      Parameters
      ----------
      X : array-like or sparse matrix, shape=(n_data_points, n_features)
      y : vector of length n_data_points, optional, default None
          If provided, will be weighted with `target_scale` and included in
          k-means clustering as hint.
      """
      n_features = X.shape[1]
      if y is None:
          # No target variable, just do plain k-means
          km_model = KMeans(
              n_clusters=self.k,
              n_init=20,
              random_state=self.random_state,
          )
          km_model.fit(X)
  
          self.km_model_ = km_model
          self.cluster_centers_ = km_model.cluster_centers_
          return self
  
      # There is target information. Apply appropriate scaling and include
      # into input data to k-means
      data_with_target = np.hstack(
          (X, y[:, np.newaxis] * self.target_scale)
      )
  
      # Build a pre-training k-means model on data and target
      km_model_pretrain = KMeans(
          n_clusters=self.k, n_init=20, random_state=self.random_state
      )
      km_model_pretrain.fit(data_with_target)
  
      # Run k-means a second time to get the clusters in the original space
      # without target info. Initialize using centroids found in pre-training.
      # Go through a single iteration of cluster assignment and centroid
      # recomputation.
      km_model = KMeans(
          n_clusters=self.k,
          init=km_model_pretrain.cluster_centers_[:, :n_features],
          n_init=1,
          max_iter=1,
      )
      km_model.fit(X)
  
      self.km_model = km_model
      self.cluster_centers_ = km_model.cluster_centers_
      return self
  
file_path: Auto_ViML/autoviml/Transform_KM_Features.py
imports: import numpy
  import pandas
  from sklearn.cluster import KMeans
  import sklearn
  import scipy
  from collections import defaultdict
  import operator
  import pdb
  import copy
  from sklearn.model_selection import train_test_split
label_desc: Use image node_id 2 for calling the KMeansFeaturizer obj's underlying member method code with example usage: obj.fit(X, y) and returns: self, self