Невозможно использовать модель машинного обучения, сохраненную как файл pickle в приложении flask - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь создать API, используя flask, который будет использовать мою сохраненную модель ML. Модель была построена с использованием sklearn, конвейера и вспомогательной функции (lemmatizer_preprocessing) и сохранена в формате pickle с использованием joblib. Теперь, когда я пытаюсь использовать эту модель для создания моего приложения flask, она дала ошибку атрибута

AttributeError: module '__main__' has no attribute 'lemmatizer_preprocessing'

Код, который использовался для построения и сохранения модели.

def lemmatizer_preprocessing(mess):
    nopunc = [char for char in mess if char not in string.punctuation]
    nopunc = ''.join(nopunc)
    nopunc = [lemmatizer.lemmatize(word) for word in nopunc.split()]
    nopunc = [word for word in nopunc if word.lower() not in stopwords.words('english')]
    temp =  ' '.join(nopunc).strip()
    return re.sub(r'[^\w]', ' ', temp)
....
....
....
pipeline1 = Pipeline([
    ('bow', CountVectorizer(analyzer=lemmatizer_preprocessing)),
    ('classifier', MultinomialNB()),
    ...
])
....
....
....
joblib.dump(pipeline1, 'filename.pkl')

Теперь всякий раз, когда я пытаюсь импортировать эту модель, появляется указанная выше ошибка. Я знаю, что он показывает ошибку, поскольку функция lemmatizer_preprocessing требуется joblib для правильной десериализации модели, но по какой-то причине функция не регистрируется. Я использую два файла для разделения кода для моего приложения flask, app.py и predictor.py Код для app.py:

from flask import Flask, jsonify, request, make_response
from predictor import predict_jihad
app = Flask(__name__, instance_relative_config=True)
predict_jihad = predict_jihad()

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)
@app.errorhandler(500)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 500)

@app.route('/')
def index():
    text = request.args.get('text')
    if type(text) is str and len(text)!=0:
        return jsonify({"probability":predict_jihad.get_prediction(text)})
    else:
        return jsonify({"error":"check passed value"})

app.run(debug=False)

Код для predictor.py:

from nltk.corpus import stopwords
import string
from sklearn.feature_extraction.text import TfidfTransformer ,CountVectorizer
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
import re
from nltk.stem import WordNetLemmatizer
import joblib

class predict_jihad:
    def __init__(self):
        super().__init__()
        lemmatizer = WordNetLemmatizer()
        file = './filename.pkl'
    def deserialize(self):
        def lemmatizer_preprocessing(mess):
            lemmatizer = WordNetLemmatizer()
            nopunc = [char for char in mess if char not in string.punctuation]
            nopunc = ''.join(nopunc)
            nopunc = [self.lemmatizer.lemmatize(word) for word in nopunc.split()]
            nopunc = [word for word in nopunc if word.lower() not in stopwords.words('english')]
            temp =  ' '.join(nopunc).strip()
            return re.sub(r'[^\w]', ' ', temp)
        model = joblib.load(open('filename.pkl','rb'))
        return model

    def get_prediction(self,text):
        model = self.deserialize()
        return model.predict_proba([text])[0][1]

Все остальные файлы находятся на месте, и никаких других ошибок не регистрируется. Пожалуйста, предоставьте решения.

1 Ответ

0 голосов
/ 26 мая 2020

Leaky Pipes Проблема в том, что мы определили наш класс lemmatizer_preprocessing в одном проекте, он не знает, как интерпретировать эти части протравленного конвейера, когда он пытается загрузить модель. .

Вы можете:

if __name__ == "__main__":
    normalizer = lemmatizer_preprocessing()
    lemmatizer_preprocessing.__module__ = "model_maker"
    normalizer.save("normalizer.pkl")

основной-модуль-без-атрибута

python -pickling-and-deal-with-attributeerror-module-object-has-no-attribute-thing

...