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
[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