diff --git a/src/python/nimbusml/pipeline.py b/src/python/nimbusml/pipeline.py index 8a2d88af..3323f646 100644 --- a/src/python/nimbusml/pipeline.py +++ b/src/python/nimbusml/pipeline.py @@ -2073,13 +2073,9 @@ def _predict(self, X, y=None, isinstance(X, DataFrame) and isinstance(y, (str, tuple))): y = y_temp - is_transformer_chain = False - with ZipFile(self.model) as model_zip: - is_transformer_chain = any('TransformerChain' in item - for item in model_zip.namelist()) - all_nodes = [] - if is_transformer_chain: + if (hasattr(self, '_is_transformer_chain') and + self._is_transformer_chain): inputs = dict([('data', ''), ('transform_model', self.model)]) if isinstance(X, FileDataStream): importtext_node = data_customtextloader( @@ -2171,10 +2167,12 @@ def _predict(self, X, y=None, self._run_time = time.time() - start_time raise e - if is_transformer_chain: + if (hasattr(self, '_is_transformer_chain') + and self._is_transformer_chain + and hasattr(out_data, 'PredictedLabel') + and out_data.PredictedLabel.dtype == 'bool'): out_data['PredictedLabel'] = out_data['PredictedLabel']*1 - if y is not None: # We need to fix the schema for ranking metrics if evaltype == 'ranking': @@ -2617,6 +2615,10 @@ def load_model(self, src): self.model = src self.steps = [] + with ZipFile(self.model) as model_zip: + self._is_transformer_chain = any('TransformerChain' in item + for item in model_zip.namelist()) + def __getstate__(self): odict = {'export_version': 2} diff --git a/src/python/nimbusml/tests/pipeline/test_load_save.py b/src/python/nimbusml/tests/pipeline/test_load_save.py index 3807507e..9bb29a14 100644 --- a/src/python/nimbusml/tests/pipeline/test_load_save.py +++ b/src/python/nimbusml/tests/pipeline/test_load_save.py @@ -11,7 +11,7 @@ import numpy as np import pandas as pd -from nimbusml import Pipeline +from nimbusml import FileDataStream, Pipeline from nimbusml.datasets import get_dataset from nimbusml.feature_extraction.categorical import OneHotVectorizer from nimbusml.linear_model import FastLinearBinaryClassifier, OnlineGradientDescentRegressor @@ -33,6 +33,8 @@ (train, label) = get_X_y(train_file, label_column, sep=',') (test, test_label) = get_X_y(test_file, label_column, sep=',') +mlnet_model = os.path.join(os.path.dirname(__file__), '..', 'utils', 'models', 'UciAdultMlNetModel.zip') + def get_temp_file(suffix=None): fd, file_name = tempfile.mkstemp(suffix=suffix) fl = os.fdopen(fd, 'w') @@ -148,6 +150,12 @@ def test_model_datastream(self): os.remove(model_filename) + def test_mlnet_model_can_be_scored(self): + data = FileDataStream.read_csv(test_file, sep=',', numeric_dtype=np.float32) + model = Pipeline() + model.load_model(mlnet_model) + model.predict(data) + def test_pipeline_saves_complete_model_file_when_pickled(self): model_nimbusml = Pipeline( steps=[ diff --git a/src/python/nimbusml/tests/utils/models/UciAdultMlNetModel.zip b/src/python/nimbusml/tests/utils/models/UciAdultMlNetModel.zip new file mode 100644 index 00000000..6bb4318c Binary files /dev/null and b/src/python/nimbusml/tests/utils/models/UciAdultMlNetModel.zip differ