Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用sklearn模型访问API端点?_Python_Python 3.x_Api_Flask - Fatal编程技术网

Python 如何使用sklearn模型访问API端点?

Python 如何使用sklearn模型访问API端点?,python,python-3.x,api,flask,Python,Python 3.x,Api,Flask,我目前一直在尝试加载一个模型来进行预测,并将结果加载到API端点。我有这段代码,其中包含模型并将模型保存为pickle文件 from sklearn.cluster import KMeans import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import pickle from sklearn import datasets#Iris Dataset iris =

我目前一直在尝试加载一个模型来进行预测,并将结果加载到API端点。我有这段代码,其中包含模型并将模型保存为pickle文件

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pickle
from sklearn import datasets#Iris Dataset
iris = datasets.load_iris()
X = iris.data#KMeans
km = KMeans(n_clusters=3)
km.fit(X)
km.predict(X)
labels = km.labels_#Plotting
fig = plt.figure(1, figsize=(7,7))
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
ax.scatter(X[:, 3], X[:, 0], X[:, 2],
          c=labels.astype(np.float), edgecolor="k", s=50)
ax.set_xlabel("Petal width")
ax.set_ylabel("Sepal length")
ax.set_zlabel("Petal length")
plt.title("K Means", fontsize=14)

with open('C:\\Users\\ryans\\kmeans.pkl', 'wb') as f:
    pickle.dump(km, f)
这似乎很好,但最后两行,即pickle文件并保存它,似乎只有在第一次运行时才有必要。如果我使用下面的代码打开文件,我看不出有必要重新保存拾取的文件。不管怎么说,下面是我正在测试的代码,用于访问API端点

from flask import Flask, jsonify
import pickle
import pandas as pd
import requests

api = Flask(__name__)
@api.route('/predict', methods=['POST'])
def predict():
     json_features = requests.json
     query_df = pd.DataFrame(json_features)
     features = pd.get_dummies(query_df)
     prediction = kmeans.predict(features)
     return jsonify({'prediction': list(prediction)})
 
if __name__ == '__main__':
     try:
         kmeans = pickle.load(open("C:\\Users\\ryans\\kmeans.pkl", "rb"))
         api.run(debug=True, port=8000)
         traceback.print_exc(file=sys.stdout)
     except:
        print("Exception in user code:")
        print('-'*60)
        traceback.print_exc(file=sys.stdout)
        print('-'*60)
当我运行那个代码时,我得到了这个错误

 * Serving Flask app "untitled41" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with windowsapi reloader
Exception in user code:
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-48-1749e4d56106>", line 19, in <module>
    api.run(debug=True, port=8000)
  File "C:\Users\ryans\Anaconda3\lib\site-packages\flask\app.py", line 990, in run
    run_simple(host, port, self, **options)
  File "C:\Users\ryans\Anaconda3\lib\site-packages\werkzeug\serving.py", line 1050, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
  File "C:\Users\ryans\Anaconda3\lib\site-packages\werkzeug\_reloader.py", line 339, in run_with_reloader
    sys.exit(reloader.restart_with_reloader())
SystemExit: 1
------------------------------------------------------------
现在,我转到浏览器并输入以下内容:'http://localhost:8000/predict"

我看到这个结果:

Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
我测试了一个非常简单的示例脚本:

from flask import Flask

app = Flask(__name__)

@app.route('/api', methods=['GET','POST','DELETE'])
def api():
    return 'YOU MADE IT!'

if __name__ == '__main__':
    app.run(debug=True, port=8000, use_reloader=False)
这对我来说非常好

最后,我不明白这部分:

export FLASK_APP=my_app.py
export FLASK_DEBUG=1
flask run

这是否在“kmeans.py”脚本的末尾?当我添加它时,三行中的第一行出现了“无效语法”。

我假设您正在使用笔记本(Ipython环境)中的flask代码,并且
debug=True
正在强制重新加载进程,这导致了此问题,您可以将use_reload设置为
False

api.run(debug=True, port=8000, use_reloader=False)
另外,尝试使用flask命令(从命令行/控制台)在脚本中运行它,方法是首先将代码保存在文件中(例如app.py),并按如下所示设置脚本名称和调试模式

export FLASK_APP=my_app.py
export FLASK_DEBUG=1
flask run

你在笔记本上运行这个烧瓶代码吗?不,我在Spyder上运行。我注意到“app.py”中存在某种错误。我认为某些东西可能在某个时候损坏了,所以我只是卸载了Flask,然后重新安装了Flask。我仍然收到相同的错误消息。你能试试我的建议,让我知道它是否有用吗?我尝试了你的建议,并用我的发现更新了我的原始帖子。如果第一部分对你有效,你不需要第二件事,这只是一种通过命令行运行flask的方法。请随时向上投票,并接受它作为一个答案,如果它工作它不工作。当我输入“”或“”时,我得到以下信息:“不允许使用方法请求的URL不允许使用该方法。”。我一定错过了一些简单的东西。这看起来非常接近,我认为代码非常有意义,但这里仍然有一些问题。首先,您解决了与此问题相关的主要问题,作为一个有经验的stackoverflow用户,您应该知道您需要为不同的问题创建不同的问题。其次,在您的代码中,您正在捕获POST请求,这里是send-get请求到/predict
export FLASK_APP=my_app.py
export FLASK_DEBUG=1
flask run