我已经使用 pycaret 构建了一个分类模型,并且已经生成了 pickle 文件。然后,我尝试构建一个 API 并使用 fastapi 加载 pickle 文件。
import logging
import pickle
from pydantic import BaseModel
import numpy as np
from pycaret.classification import *
import uvicorn
from fastapi import FastAPI
from fastapi import Depends
app = FastAPI()
model = load_model('catboost_cm_creditable')
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
@app.post("/predict")
def predict(data: Data = Depends()):
predictions_df = predict_model(estimator=model, data=data)
predictions = predictions_df["Score"][0]
return predictions
api 运行完美,但事情是当我尝试测试 api 并根据它返回的功能为其提供输入时:
INFO: 127.0.0.1:60235 - "POST /predict?age=24&live_province=DKI%20Jakarta&live_city=Jakarta%20Selatan&live_area_big=Pesanggrahan&live_area_small=Bintaro&sex=1&marital=2&bank=BCA&salary=7000000&amount=1000000 HTTP/1.1" 500 Internal Server Error
ERROR: Exception in ASGI application
Traceback (most recent call last):
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 390, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/applications.py", line 179, in __call__
await super().__call__(scope, receive, send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/applications.py", line 111, in __call__
await self.middleware_stack(scope, receive, send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/middleware/errors.py", line 181, in __call__
raise exc from None
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/middleware/errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/exceptions.py", line 82, in __call__
raise exc from None
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 566, in __call__
await route.handle(scope, receive, send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 227, in handle
await self.app(scope, receive, send)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/routing.py", line 41, in app
response = await func(request)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/routing.py", line 183, in app
dependant=dependant, values=values, is_coroutine=is_coroutine
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/fastapi/routing.py", line 135, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/starlette/concurrency.py", line 34, in run_in_threadpool
return await loop.run_in_executor(None, func, *args)
File "/Users/bhaskoromuthohar/anaconda3/lib/python3.7/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "./main.py", line 31, in predict
predictions_df = predict_model(estimator=model, data=data)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/pycaret/classification.py", line 10700, in predict_model
Xtest = prep_pipe_transformer.transform(data)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/sklearn/pipeline.py", line 549, in _transform
Xt = transform.transform(Xt)
File "/Users/bhaskoromuthohar/dev/Credit-Scoring-App/.venv/lib/python3.7/site-packages/pycaret/preprocess.py", line 300, in transform
data.columns = [str(i) for i in data.columns]
AttributeError: 'Data' object has no attribute 'columns'
我认为问题在于我将泡菜加载到 API 中的方式。你们能给我建议加载泡菜的正确方法吗?