Как использовать переменную в методе загрузки (из поезда), чтобы предсказать метод? - PullRequest
1 голос
/ 20 февраля 2020

Пожалуйста, помогите мне! Я получил некоторую ошибку. Я пытаюсь обучить данные из файла запроса. Но, когда я пытаюсь предсказать, у меня возникает ошибка, как использовать переменную в методе загрузки (из поезда), чтобы предсказать метод (сделать переменную text_clf общей областью действия между загрузкой и прогнозированием)? и как, если я не загружаю (тренируюсь) из загружаемого файла, я все еще использую набор данных ранее?

Это код

@app.route('/upload', methods=['GET','POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        df = pd.read_csv(file)
        df['label'] = df['label'].map({'HS': 0, 'Non_HS': 1})
        X = df['clean']
        y = df['label']

        from sklearn.model_selection import train_test_split
        X = X.replace([np.inf, -np.inf], np.nan)
        y = y.replace([np.inf, -np.inf], np.nan)
        X = X.dropna()
        y = y.dropna()
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

        from sklearn.feature_extraction.text import TfidfVectorizer
        from sklearn.svm import LinearSVC
        from sklearn.pipeline import Pipeline
        text_clf = Pipeline([('tfidf',TfidfVectorizer()),('clf',LinearSVC())])
        text_clf.fit(X_train,y_train)
        joblib.dump(text_clf, 'SVM_model.pkl')
        return redirect(url_for('upload', file=file))
    return render_template('upload_data.html')

@app.route('/predict',methods=['POST'])
def predict():
    #df = pd.read_csv('Dataset/preprocess1109v2.csv', encoding="latin-1")
    # Features and Labels
    SVM_model = open('SVM_model.pkl','rb')
    text_clf = joblib.load(SVM_model)
    if request.method == 'POST':
        message = request.form['message']
        data = [message]
        #vect = count_vect.transform(data).toarray()
        my_prediction = text_clf.predict(data)

    return render_template('classification.html',prediction = my_prediction)

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

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

см. https://scikit-learn.org/stable/modules/model_persistence.html

1 голос
/ 20 февраля 2020

Как видите, ваша переменная text_clf создается в функции upload(), поэтому область действия предназначена только для этой функции. В функции predict() доступ к переменной text_clf невозможен.

Попробуйте импортировать flask, задав для переменной text_clf значение flask.g, а затем получить ее, используя flask.g.get():

from flask import *
@app.route('/upload', methods=['GET','POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        df = pd.read_csv(file)
        df['label'] = df['label'].map({'HS': 0, 'Non_HS': 1})
        X = df['clean']
        y = df['label']

        from sklearn.model_selection import train_test_split
        X = X.replace([np.inf, -np.inf], np.nan)
        y = y.replace([np.inf, -np.inf], np.nan)
        X = X.dropna()
        y = y.dropna()
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

        from sklearn.feature_extraction.text import TfidfVectorizer
        from sklearn.svm import LinearSVC
        from sklearn.pipeline import Pipeline
        text_clf = Pipeline([('tfidf',TfidfVectorizer()),('clf',LinearSVC())])
        text_clf.fit(X_train,y_train)
        g.x = text_clf
        return redirect(url_for('upload', file=file))
    return render_template('upload_data.html')

@app.route('/predict',methods=['POST'])
def predict():
    #df = pd.read_csv('Dataset/preprocess1109v2.csv', encoding="latin-1")
    # Features and Labels

    if request.method == 'POST':
        message = request.form['message']
        data = [message]
        #vect = count_vect.transform(data).toarray()
        text_clf = g.get('x', None)
        my_prediction = text_clf.predict(data)
    return render_template('classification.html',prediction = my_prediction)

РЕДАКТИРОВАТЬ: также сказать, что пользователь @Jorge Luís Melgarejo ответ является лучшим способом go, я просто даю «обходное» решение для этой конкретной c проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...