Source code for omegaml.runtimes.mixins.modelmixin

  1import logging
  2import sys
  3import warnings
  4from uuid import uuid4
  5
  6from omegaml.util import is_dataframe, is_ndarray, is_series
  7
  8logger = logging.getLogger(__file__)
  9
 10
[docs] 11class ModelMixin: 12 """mixin methods to OmegaModelProxy""" 13
[docs] 14 def fit(self, Xname, Yname=None, **kwargs): 15 """ 16 fit the model 17 18 Calls :code:`.fit(X, Y, **kwargs)`. If instead of dataset names actual data 19 is given, the data is stored using _fitX/fitY prefixes and a unique 20 name. 21 22 After fitting, a new model version is stored with its attributes 23 fitX and fitY pointing to the datasets, as well as the sklearn 24 version used. 25 26 :param Xname: name of X dataset or data 27 :param Yname: name of Y dataset or data 28 :return: the model (self) or the string representation (python clients) 29 """ 30 omega_fit = self.task('omegaml.tasks.omega_fit') 31 Xname = self._ensure_data_is_stored(Xname, prefix='_fitX') 32 if Yname is not None: 33 Yname = self._ensure_data_is_stored(Yname, prefix='_fitY') 34 return omega_fit.delay(self.modelname, Xname, Yname=Yname, **kwargs)
35
[docs] 36 def partial_fit(self, Xname, Yname=None, **kwargs): 37 """ 38 update the model 39 40 Calls :code:`.partial_fit(X, Y, **kwargs)`. If instead of dataset names actual 41 data is given, the data is stored using _fitX/fitY prefixes and 42 a unique name. 43 44 After fitting, a new model version is stored with its attributes 45 fitX and fitY pointing to the datasets, as well as the sklearn 46 version used. 47 48 :param Xname: name of X dataset or data 49 :param Yname: name of Y dataset or data 50 :return: the model (self) or the string representation (python clients) 51 """ 52 omega_fit = self.task('omegaml.tasks.omega_partial_fit') 53 Xname = self._ensure_data_is_stored(Xname, prefix='_fitX') 54 if Yname is not None: 55 Yname = self._ensure_data_is_stored(Yname, prefix='_fitY') 56 return omega_fit.delay(self.modelname, Xname, Yname=Yname, **kwargs)
57
[docs] 58 def transform(self, Xname, rName=None, **kwargs): 59 """ 60 transform X 61 62 Calls :code:`.transform(X, **kwargs)`. If rName is given the result is 63 stored as object rName 64 65 :param Xname: name of the X dataset 66 :param rName: name of the resulting dataset (optional) 67 :return: the data returned by .transform, or the metadata of the rName 68 dataset if rName was given 69 """ 70 omega_transform = self.task('omegaml.tasks.omega_transform') 71 Xname = self._ensure_data_is_stored(Xname) 72 return omega_transform.delay(self.modelname, Xname, rName=rName, **kwargs)
73
[docs] 74 def fit_transform(self, Xname, Yname=None, rName=None, **kwargs): 75 """ 76 fit & transform X 77 78 Calls :code:`.fit_transform(X, Y, **kwargs)`. If rName is given the result is 79 stored as object rName 80 81 :param Xname: name of the X dataset 82 :param Yname: name of the Y dataset 83 :param rName: name of the resulting dataset (optional) 84 :return: the data returned by .fit_transform, or the metadata of the rName 85 dataset if rName was given 86 """ 87 88 omega_fit_transform = self.task('omegaml.tasks.omega_fit_transform') 89 Xname = self._ensure_data_is_stored(Xname) 90 if Yname is not None: 91 Yname = self._ensure_data_is_stored(Yname) 92 return omega_fit_transform.delay(self.modelname, Xname, Yname=Yname, rName=rName, **kwargs)
93
[docs] 94 def predict(self, Xpath_or_data, rName=None, **kwargs): 95 """ 96 predict 97 98 Calls :code:`.predict(X)`. If rName is given the result is 99 stored as object rName 100 101 :param Xname: name of the X dataset 102 :param rName: name of the resulting dataset (optional) 103 :return: the data returned by .predict, or the metadata of the rName 104 dataset if rName was given 105 """ 106 omega_predict = self.task('omegaml.tasks.omega_predict') 107 Xname = self._ensure_data_is_stored(Xpath_or_data) 108 return omega_predict.delay(self.modelname, Xname, rName=rName, **kwargs)
109
[docs] 110 def predict_proba(self, Xpath_or_data, rName=None, **kwargs): 111 """ 112 predict probabilities 113 114 Calls :code:`.predict_proba(X)`. If rName is given the result is 115 stored as object rName 116 117 :param Xname: name of the X dataset 118 :param rName: name of the resulting dataset (optional) 119 :return: the data returned by .predict_proba, or the metadata of the rName 120 dataset if rName was given 121 """ 122 omega_predict_proba = self.task('omegaml.tasks.omega_predict_proba') 123 Xname = self._ensure_data_is_stored(Xpath_or_data) 124 return omega_predict_proba.delay(self.modelname, Xname, rName=rName, **kwargs)
125
[docs] 126 def complete(self, Xname, rName=None, **kwargs): 127 """ 128 complete 129 130 Calls :code:`.complete(X)`. If rName is given the result is 131 stored as object rName 132 133 :param Xname: name of the X dataset 134 :param rName: name of the resulting dataset (optional) 135 :return: the data returned by .complete, or the metadata of the rName 136 dataset if rName was given 137 """ 138 omega_complete = self.task('omegaml.tasks.omega_complete') 139 Xname = self._ensure_data_is_stored(Xname) 140 return omega_complete.delay(self.modelname, Xname, rName=rName, **kwargs)
141
[docs] 142 def embed(self, Xname, rName=None, **kwargs): 143 """ 144 embed 145 146 Calls :code:`.embed(X)`. If rName is given the result is 147 stored as object rName 148 149 :param Xname: name of the X dataset 150 :param rName: name of the resulting dataset (optional) 151 :return: the data returned by .embed, or the metadata of the rName 152 dataset if rName was given 153 """ 154 omega_embed = self.task('omegaml.tasks.omega_embed') 155 Xname = self._ensure_data_is_stored(Xname) 156 return omega_embed.delay(self.modelname, Xname, rName=rName, **kwargs)
157
[docs] 158 def score(self, Xname, Yname=None, rName=None, **kwargs): 159 """ 160 calculate score 161 162 Calls :code:`.score(X, y, **kwargs)`. If rName is given the result is 163 stored as object rName 164 165 :param Xname: name of the X dataset 166 :param yName: name of the y dataset 167 :param rName: name of the resulting dataset (optional) 168 :return: the data returned by .score, or the metadata of the rName 169 dataset if rName was given 170 """ 171 omega_score = self.task('omegaml.tasks.omega_score') 172 Xname = self._ensure_data_is_stored(Xname) 173 YName = self._ensure_data_is_stored(Yname) 174 return omega_score.delay(self.modelname, Xname, Yname=YName, rName=rName, **kwargs)
175
[docs] 176 def decision_function(self, Xname, rName=None, **kwargs): 177 """ 178 calculate score 179 180 Calls :code:`.decision_function(X, y, **kwargs)`. If rName is given the result is 181 stored as object rName 182 183 :param Xname: name of the X dataset 184 :param rName: name of the resulting dataset (optional) 185 :return: the data returned by .score, or the metadata of the rName 186 dataset if rName was given 187 """ 188 omega_decision_function = self.task('omegaml.tasks.omega_decision_function') 189 Xname = self._ensure_data_is_stored(Xname) 190 return omega_decision_function.delay(self.modelname, Xname, rName=rName, **kwargs)
191 192 def reduce(self, rName=None, **kwargs): 193 omega_reduce = self.task('omegaml.tasks.omega_reduce') 194 return omega_reduce.delay(modelName=self.modelname, rName=rName, **kwargs) 195 196 def _ensure_data_is_stored(self, name_or_data, prefix='_temp', as_payload=False): 197 from omegaml.mixins.store.passthrough import PassthroughDataset 198 199 if as_payload: 200 return PassthroughDataset(name_or_data) 201 elif isinstance(name_or_data, str): 202 name = name_or_data 203 elif isinstance(name_or_data, PassthroughDataset): 204 return name_or_data 205 elif isinstance(name_or_data, (list, tuple, dict)): 206 if sys.getsizeof(name_or_data) <= PassthroughDataset.MAX_SIZE: 207 return PassthroughDataset(name_or_data) 208 else: 209 warnings.warn( 210 f'size of dataset is larger than {PassthroughDataset.MAX_SIZE} bytes, storing in om.datasets' 211 ) 212 name = '%s_%s' % (prefix, uuid4().hex) 213 self.runtime.omega.datasets.put(name_or_data, name) 214 elif is_dataframe(name_or_data) or is_series(name_or_data) or is_ndarray(name_or_data): 215 name = '%s_%s' % (prefix, uuid4().hex) 216 self.runtime.omega.datasets.put(name_or_data, name) 217 else: 218 raise TypeError('invalid type for Xpath_or_data', type(name_or_data)) 219 return name