问题描述
Python版本:3.6.9
我曾使用pickle
将机器学习模型转储到一个文件中,当我尝试使用Flask来对其运行预测时,它失败了,错误为ModuleNotFoundError: No module named 'predictors'
。我如何修复此错误,以便它识别我的模型,无论我是尝试通过Flask还是通过Python命令(例如python predict_edu.py
)运行预测?
以下是我的文件结构:
- video_discovery
__init__.py
- data_science
- model
- __init__.py
- predict_edu.py
- predictors.py
- train_model.py
以下是我的Forecast_edu.py文件:
import pickle
with open('model', 'rb') as f:
bow_model = pickle.load(f)
这是我的prerectors.py文件:
from sklearn.base import TransformerMixin
# Basic function to clean the text
def clean_text(text):
# Removing spaces and converting text into lowercase
return text.strip().lower()
# Custom transformer using spaCy
class predictor_transformer(TransformerMixin):
def transform(self, X, **transform_params):
# Cleaning Text
return [clean_text(text) for text in X]
def fit(self, X, y=None, **fit_params):
return self
def get_params(self, deep=True):
return {}
我是如何训练我的模特的:
python data_science/train_model.py
这是我的Train_Model.py文件:
from predictors import predictor_transformer
# pipeline = Pipeline([("cleaner", predictor_transformer()), ('vectorizer', bow_vector), ('classifier', classifier_18p)])
pipeline = Pipeline([("cleaner", predictor_transformer())])
with open('model', 'wb') as f:
pickle.dump(pipeline, f)
我的Flaskapp在:video_discovery/__init__.py
我是如何运行我的Flaskapp的:
FLASK_ENV=development FLASK_APP=video_discovery flask run
我认为这个问题可能是因为我通过直接运行Python脚本而不是使用Flask来训练模型,所以可能会有一些名称空间问题,但我不确定如何修复这个问题。训练我的模型需要一段时间,所以我不能准确地等待HTTP请求。
我遗漏了哪些可能解决此问题的内容?
推荐答案
发自https://docs.python.org/3/library/pickle.html:
pickle
可以透明地保存和还原类实例,但是类定义必须是可导入的,并且与存储对象时位于同一模块中。
当您运行python data_science/train_model.py
并导入from predictors
时,predictors
作为顶级模块导入,predictor_transformer
位于该模块中。
但是,当您从video_discovery
的父文件夹通过烧瓶运行预测时,predictor_transformer
位于video_discovery.data_science.predictors
模块中。
使用相对导入并从一致路径运行
Train_Model.py:使用相对导入
# from predictors import predictor_transformer # -
from .predictors import predictor_transformer # +
培训模型:以video_discovery
作为顶层模块运行train_model
# python data_science/train_model.py # -
python -m video_discovery.data_science.train_model # +
通过Python命令运行预测:以video_discovery
作为顶级模块运行predict_edu
# python predict_edu.py # -
python -m video_discovery.data_science.predict_edu # +
通过烧瓶运行预测:(无变化,已作为顶层模块video_discovery
运行)
FLASK_ENV=development FLASK_APP=video_discovery flask run