15

I am new to python and machine learning. I have a Linear Regression model which is able to predict output based on the input which I have dumped to be used with a web service. See the code below:

      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

        regression_model = LinearRegression()
        regression_model.fit(X_train, y_train)
    print(regression_model.predict(np.array([[21, 0, 0, 0, 1, 0, 0, 1, 1, 1]]))) # this is returning my expected output

joblib.dump(regression_model, '../trainedModels/MyTrainedModel.pkl')

Using flask I am trying this to expose as a web service as below:

 @app.route('/predict', methods=['POST'])
def predict():


    X = [[21, 0, 0, 0, 1, 0, 0, 1, 1, 1]]
    model = joblib.load('../trainedModels/MyTrainedModel.pkl')
    prediction = model.predict(np.array(X).tolist())
    return jsonify({'prediction': list(prediction)})

But it is throwing the following exception

Object of type 'ndarray' is not JSON serializable

I tried NumPy array is not JSON serializable

but still the same error. How can i solve this issue

user1188867
  • 3,726
  • 5
  • 43
  • 69

2 Answers2

33

Try to convert your ndarray with tolist() method:

prediction = model.predict(np.array(X).tolist()).tolist()
return jsonify({'prediction': prediction})

Example with json package:

a = np.array([1,2,3,4,5]).tolist()
json.dumps({"prediction": a})

That should output:

'{"prediction": [1, 2, 3, 4, 5]}'
  • Thanks @mxmt. You saved my day :) – user1188867 Aug 04 '18 at 12:57
  • @user1188867 You are welcome! Also, read the comments in this [discussion](https://github.com/numpy/numpy/issues/10494). Briefly, `list()` does not convert types to native Python ones. So, it's not a "safe" function for JSON serialization. – Maksim Terpilowski Aug 04 '18 at 15:02
0

I wrote a simple module to export complex data structures in python:

pip install jdata

then

import jdata as jd;
import numpy as np; 
a={'str':'test','num':1.2,'np':np.arange(1,5,dtype=np.uint8)}; 
jd.show(a);
jd.save(a,'test.json');
FangQ
  • 1,444
  • 10
  • 18