Почему я сталкиваюсь с ошибкой Unpickling при попытке загрузить мою модель в Flask? - PullRequest
0 голосов
/ 07 марта 2020

Я пробовал мариновать и отжимать в лаборатории jupyter, и, похоже, он работает так, как положено, но когда я запускаю app.py, он выдает следующую ошибку.

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.7\fakenews\venv\lib\site-packages\sklearn\utils\deprecation.py:144: FutureWarning: The sklearn.linear_model.passive_aggressive module is  deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.linear_model. Anything that cannot be imported from sklearn.linear_model is now part of the private API.
  warnings.warn(message, FutureWarning)
Traceback (most recent call last):
  File "app.py", line 9, in <module>
    model = pickle.load(open('model.pkl', 'rb'))
_pickle.UnpicklingError: invalid load key, '\x17'.

Вот мои файлы. Model.py

import pandas as pd
import itertools
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import PassiveAggressiveClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
#Read the data
df=pd.read_csv('C:\\Users\\Hp\\Desktop\\mini project\\news\\news.csv')
#Get shape and head
df.shape
df.head()
#DataFlair - Get the labels
labels=df.label
labels.head()
#DataFlair - Split the dataset
x_train,x_test,y_train,y_test=train_test_split(df['text'], labels, test_size=0.2, random_state=7)
#DataFlair - Initialize a TfidfVectorizer
tfidf_vectorizer=TfidfVectorizer(stop_words='english', max_df=0.7)
#DataFlair - Fit and transform train set, transform test set
tfidf_train=tfidf_vectorizer.fit_transform(x_train) 
tfidf_test=tfidf_vectorizer.transform(x_test)
#DataFlair - Initialize a PassiveAggressiveClassifier
pac=PassiveAggressiveClassifier(max_iter=50)
pac.fit(tfidf_train,y_train)
#DataFlair - Predict on the test set and calculate accuracy
y_pred=pac.predict(tfidf_test)
score=accuracy_score(y_test,y_pred)
print(f'Accuracy: {round(score*100,2)}%')
#DataFlair - Build confusion matrix
confusion_matrix(y_test,y_pred, labels=['FAKE','REAL'])

App.py



import numpy as np
from flask import Flask, request, jsonify, render_template
import pickle
import pandas as pd
app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))
session.clear()
@app.route('/')
def home():
    return render_template('index.html')

@app.route('/predict',methods=['POST'])
def predict():

    news = request.form["newsT"]
    test1 = pd.Series(news, index=[11000])
    prediction = model.predict(test1)
    return render_template('index.html', prediction_text='Sales should be $ {}'.format(prediction))



if __name__ == "__main__":
    app.run(debug=True)

Я использовал этот код для засолки ---------------


# Save the model as a pickle in a file 
joblib.dump(pac, 'model.pkl') 

# Load the model from the file 
pac_from_joblib = joblib.load('model.pkl')  

# Use the loaded model to make predictions 
pac_from_joblib.predict(tfidf_test) 

Это хорошо работает в лаборатории, но, похоже, выдает ошибку удаления при загрузке app.py. Я довольно новичок в этой области и не могу понять, что не так даже после обширного поиска в Интернете.

1 Ответ

1 голос
/ 11 марта 2020

Кажется, это проблема кодирования. Это возможно, потому что вы joblib сохраняете модель маринада и пытаетесь загрузить ту же модель vai pickle библиотеку. Попробуйте загрузить модель еще раз, используя joblib

model = joblib.load('model.pkl')

Надеюсь, это поможет.

...