2017-04-04 14 views
0

私は、Irisデータセットを使用して機械学習モデルを作成しようとしています(チュートリアル、機械学習とデータサイエンス)、これまでのところ、私はランダムフォレスト分類子を使用して、それを分類しているが、今、私はカスタム入力に対する私の予測を確認したい、分類のための私のメインのコードは次のようになります。JSONDecodeError:期待値:Irisデータセットの行1列1(char 0)

X= iris.data 
y= iris.target 
X_train, X_test, y_train, y_test = train_test_split(X,y) 
rfc = RandomForestClassifier(n_estimators=100, n_jobs=2) 
rfc.fit(X_train, y_train) 
print ("Accuracy = %0.2f" % accuracy_score(y_test, rfc.predict(X_test))) 
print (classification_report(y_test, rfc.predict(X_test))) 
pickle.dump(rfc, open("iris_rfc1.pkl", "wb")) 
my_random_forest = pickle.load(open("iris_rfc1.pkl","rb")) 
url= "http://localhost:9000/api" 
data = json.dumps({'sl':5.8,'sw':4,'pl':2,'pw':9}) 
r = requests.post(url, data) 

print (r.json()) 

私は、接続を行うために使用フラスコファイル:

my_random_forest = pickle.load(open('iris_rfc1.pkl','rb')) 
app = Flask(__name__) 

@app.route('/api', methods=['POST']) 
def make_predict(): 
    data = request.get_json(force = True) 
    predict_request = [data['sl'],data['sw'], data['pl'], data['pw']] 
    predict_request = np.array(predict_request) 
    y_hat = my_random_forest.predict(predict_request) 
    output = [y_hat[0]] 
    return jsonify(results = output) 

if __name__ == '__main__': 
    app.run(port=9000, debug = True) 

私がプログラムを実行すると、エラー "JSOND ecodeError:期待値:行1列1(CHAR 0)」

その他の詳細:私はフラスコファイルを作成するための予測とアトムを作るためJupyterノートブックを使用しています、Pyhtonバージョン3

答えて

0

で配信結果関数make_predict()はエラーが発生する場所です。

JSON(Java Script Object Notation)は、制限付きのgroupのデータ型しか表現/シリアル化できず、Numpyオブジェクトはそのグループに属しません。

エラーメッセージを見ると、数字0はランダムフォレストクラシファイアによって生成された予測でなければならず、RFCはNumpyアレイでのみ動作します。それらの出力も同じデータ型である。 .json()メソッドはnumpyオブジェクトをシリアル化する方法を知らない。

>>>a = rfc.predict(np.array([1,2,3,4]).reshape(1,-1)) 
>>>a, type(a) 
(array([1]), numpy.ndarray) 

>>>b = a[0] 
>>>b, type(b) 
(1, numpy.int32) 

>>>c = np.asscalar(b) 
>>>c, type(c) 
(1, int) 

y_hatはnumpyのアレイ、y_hat(出力変数)の最初の要素型np.int32のものです。 np.asscalar()メソッドを使用してintとしてキャストすると、json()がそれを識別できるようになります。

関連する問題