Trying to load model.pickle to API but raise ```AttributeError: 'Data' object has no attribute 'columns'```

Trying to load model.pickle to API but raise ```AttributeError: 'Data' object has no attribute 'columns'```

我已经使用 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 并根据它 returns 的功能给它输入时:

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'

! Output from the fastapi documentations

我认为问题出在我将 pickle 装入 API 的方式。你们能给我一些正确加载泡菜的建议吗?

我猜你的错误是由于这条线

def predict(data: Data = Depends()):

为了将 pydantic 模型声明为强制性的,您不必 运行 Depends()。只需使用 data: Data.

Depends只用于依赖注入,实际情况并非如此

有关请求正文的更多信息,请参阅文档https://fastapi.tiangolo.com/tutorial/body/