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
73
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
142 def invoke(self, Xname, rName=None, **kwargs):
143 omega_invoke = self.task('omegaml.tasks.omega_invoke')
144 Xname = self._ensure_data_is_stored(Xname, as_payload=True)
145 return omega_invoke.delay(self.modelname, Xname, rName=rName, **kwargs)
146
147 def transcribe(self, Xname, rName=None, **kwargs):
148 omega_transcribe = self.task('omegaml.tasks.omega_transcribe')
149 Xname = self._ensure_data_is_stored(Xname)
150 return omega_transcribe.delay(self.modelname, Xname, rName=rName, **kwargs)
151
152 def speech(self, Xname, rName=None, **kwargs):
153 omega_speech = self.task('omegaml.tasks.omega_speech')
154 Xname = self._ensure_data_is_stored(Xname)
155 return omega_speech.delay(self.modelname, Xname, rName=rName, **kwargs)
156
[docs]
157 def embed(self, Xname, rName=None, **kwargs):
158 """
159 embed
160
161 Calls :code:`.embed(X)`. If rName is given the result is
162 stored as object rName
163
164 :param Xname: name of the X dataset
165 :param rName: name of the resulting dataset (optional)
166 :return: the data returned by .embed, or the metadata of the rName
167 dataset if rName was given
168 """
169 omega_embed = self.task('omegaml.tasks.omega_embed')
170 Xname = self._ensure_data_is_stored(Xname)
171 return omega_embed.delay(self.modelname, Xname, rName=rName, **kwargs)
172
[docs]
173 def score(self, Xname, Yname=None, rName=None, **kwargs):
174 """
175 calculate score
176
177 Calls :code:`.score(X, y, **kwargs)`. If rName is given the result is
178 stored as object rName
179
180 :param Xname: name of the X dataset
181 :param yName: name of the y dataset
182 :param rName: name of the resulting dataset (optional)
183 :return: the data returned by .score, or the metadata of the rName
184 dataset if rName was given
185 """
186 omega_score = self.task('omegaml.tasks.omega_score')
187 Xname = self._ensure_data_is_stored(Xname)
188 YName = self._ensure_data_is_stored(Yname)
189 return omega_score.delay(self.modelname, Xname, Yname=YName, rName=rName, **kwargs)
190
[docs]
191 def decision_function(self, Xname, rName=None, **kwargs):
192 """
193 calculate score
194
195 Calls :code:`.decision_function(X, y, **kwargs)`. If rName is given the result is
196 stored as object rName
197
198 :param Xname: name of the X dataset
199 :param rName: name of the resulting dataset (optional)
200 :return: the data returned by .score, or the metadata of the rName
201 dataset if rName was given
202 """
203 omega_decision_function = self.task('omegaml.tasks.omega_decision_function')
204 Xname = self._ensure_data_is_stored(Xname)
205 return omega_decision_function.delay(self.modelname, Xname, rName=rName, **kwargs)
206
207 def reduce(self, rName=None, **kwargs):
208 omega_reduce = self.task('omegaml.tasks.omega_reduce')
209 return omega_reduce.delay(modelName=self.modelname, rName=rName, **kwargs)
210
211 def _ensure_data_is_stored(self, name_or_data, prefix='_temp', as_payload=False):
212 from omegaml.mixins.store.passthrough import PassthroughDataset
213
214 if as_payload:
215 return PassthroughDataset(name_or_data)
216 elif isinstance(name_or_data, str):
217 name = name_or_data
218 elif isinstance(name_or_data, PassthroughDataset):
219 return name_or_data
220 elif isinstance(name_or_data, (list, tuple, dict)):
221 if sys.getsizeof(name_or_data) <= PassthroughDataset.MAX_SIZE:
222 return PassthroughDataset(name_or_data)
223 else:
224 warnings.warn(
225 f'size of dataset is larger than {PassthroughDataset.MAX_SIZE} bytes, storing in om.datasets'
226 )
227 name = '%s_%s' % (prefix, uuid4().hex)
228 self.runtime.omega.datasets.put(name_or_data, name)
229 elif is_dataframe(name_or_data) or is_series(name_or_data) or is_ndarray(name_or_data):
230 name = '%s_%s' % (prefix, uuid4().hex)
231 self.runtime.omega.datasets.put(name_or_data, name)
232 else:
233 raise TypeError('invalid type for Xpath_or_data', type(name_or_data))
234 return name