⼿把⼿教你如何开发⼀个NLP机器学习模型,并将它部署在
Flask的Web平台上(译)
今天我们要开发⼀个⽤来识别垃圾短信(邮件)的NLP机器学习模型,并将其部署在Flask的Web平台上,我们的NLP机器学习系统的开发过程是这样的:1.线下训练模型-->2.将模型部署成⼀个web服务-->3.线上实现预测。
1. 开发⼀个NLP模型,并在线下完成训练
2. 将训练好的模型部署成⼀个web服务在线供⽤户使⽤
当我们开发好⼀个机器学习模型后,如何来部署这模型,如何让其他⽤户⽅便的使⽤它呢?
⽬前有很多机器学习/深度学习的线上线下课程,它们的主要任务是在教会⼤家如何构建和优化机器学习/深度学习模型,但它们很少会教会⼯程师们当模型开发好以后,下⼀步该如何做?成功的开发⼀个模型与让模型能够为实际⽤户提供服务之间还是有很⼤的差异。
在本⽂中,我们将重点在于:构建垃圾短信分类的机器学习模型,然后使⽤(Python的轻量级web框架)为模型创建API。⽤户可以通过HTTP请求来调⽤API,并实现对⽤户的⽂本信息进⾏识别, 好了让我们开始吧!
构建模型
我们的数据来⾃于Kaggle,可以在这⾥,数据已经被标注了垃圾和⾮垃圾的两类标签。我们将使⽤此数据集构建预测模型,然后⽤模型准确识别出哪些⽂本是垃圾邮件。
朴素贝叶斯分类器是⼀种⾮常著名的电⼦邮件过滤统计技术。 它通常使⽤词袋⽅法来识别垃圾邮件。因此我们将根据朴素贝叶斯定理构建⼀个简单的消息分类器。
import pandas as pd
import numpy as np
from sklearn. import CountVectorizer
del_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
ics import classification_report
als import joblib
#整理数据,查看数据
df = pd.read_csv('./data/spam.csv', encoding="latin-1")
df=df[['v1','v2']]
df['label'] = df['v1'].map({'ham': 0, 'spam': 1})
df.head()
#构造训练集和测试集
X = df['message']
y = df['label']
cv = CountVectorizer()
X = cv.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
#朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train,y_train)
clf.score(X_test,y_test)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
朴素贝叶斯分类器不但使⽤起来⾮常⽅便⽽且预测精度⾮常⾼
模型训练好以后,我们可以使⽤持久化的⽅法将模型保存起来,这样下次使⽤模型时就不需要重新训练模型,⽽直接加载模型就可以了,为实现此⽬的,我们可以将模型保存为.pkl⽂件以供以后使⽤。
#将模型持久化,以便以后使⽤
joblib.dump(clf, 'NB_spam_model.pkl')
我们可以再次加载模型,⽽不需要重新训练模型
#加载模型
NB_spam_model = open('NB_spam_model.pkl','rb')
clf = joblib.load(NB_spam_model)
接下来我们要将该模型部署到Flask微服务中,并提供⼀个接⼝来接受客户端的请求。
将垃圾邮件分类器转变成Web应⽤程序
前⾯我们已经完成了垃圾邮件分类器的所有代码,是不是很简单?接下来,我们将开发⼀个Web应⽤程序,该应⽤程序由两个简单的Web页⾯组成,第⼀个页⾯包含了⽤户输⼊消息的表单字段。 在将消息提
交给Web应⽤程序后,预测结果将显⽰在另外⼀个页⾯上.(是垃圾邮件或不是垃圾邮件)
⾸先,我们为这个项⽬创建⼀个名为Spam-Detector的⽂件夹,下⾯是该⽂件夹中的⽬录树。 我们将解释其中的每个⽂件。
spam.csv
app.py
templates/
home.html
result.html
static/
style.css
templates是模板⽂件夹,⾥⾯存放了两个静态⽂件home.html和result.html,Flask会从模板⽂件夹中查静态页⾯并将其展⽰在web浏览器中。
app.py
app.py⽂件包含将由Python解释器执⾏以运⾏Flask Web应⽤程序的主要代码,它包含⽤于对消息进⾏分类的机器学习代码:
from flask import Flask,render_template,url_for,request
import pandas as pd
import pickle
from sklearn. import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
als import joblib
app = Flask(__name__)
@ute('/')
def home():
return render_template('home.html')
@ute('/predict',methods=['POST'])
def predict():
df = pd.read_csv('spam.csv', encoding="latin-1")
df=df[['v1','v2']]
df['label'] = df['v1'].map({'ham': 0, 'spam': 1})
X = df['message']
y = df['label']
cv = CountVectorizer()
X = cv.fit_transform(X)
del_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
clf = MultinomialNB()
clf.fit(X_train,y_train)
clf.score(X_test,y_test)
#Alternative Usage of Saved Model
# joblib.dump(clf, 'NB_spam_model.pkl')
# NB_spam_model = open('NB_spam_model.pkl','rb')
# clf = joblib.load(NB_spam_model)
hod == 'POST':
message = request.form['message']
data = [message]
vect = cv.transform(data).toarray()
my_prediction = clf.predict(vect)
return render_template('result.html',prediction = my_prediction)
if __name__ == '__main__':
app.run(debug=True)
我们把web应⽤程序作为单个模块运⾏; 因此我们使⽤参数__name__初始化了⼀个新的Flask实例,让Flask知道它可以在它所在的同⼀⽬录中到HTML模板⽂件夹。
接下来,我们使⽤route decorator(@ ute('/'))来指定应该触发home函数执⾏的URL。
我们的home函数只是呈现home.html HTML⽂件,该⽂件位于templates⽂件夹中。
在预测函数(predict)中,我们访问垃圾邮件数据集,预处理⽂本,进⾏预测,然后存储模型。 我们接收⽤户输⼊的新消息,并使⽤我们的模型对其标签进⾏预测。
我们使⽤POST⽅法将表单数据中的⽤户输⼊信息传输给服务器。 最后,通过在app.run⽅法中设置debug = True进⽽激活了Flask的调试器。
最后,我们使⽤run函数仅在Python解释器直接执⾏此脚本时在服务器上运⾏应⽤程序
home.html
以下是home.html⽂件的内容,该⽂件将呈现⽤户可以输⼊消息的⽂本框:
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
<!-- <link rel="stylesheet" type="text/css" href="../static/css/styles.css"> -->
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<header>
开发一个平台需要多少钱<div class="container">
<div id="brandname">
Machine Learning App with Flask
</div>
<h2>Spam Detector For SMS Messages</h2>
</div>
</header>
<div class="ml-container">
<form action="{{ url_for('predict')}}" method="POST">
<p>Enter Your Message Here</p>
<!-- <input type="text" name="comment"/> -->
<textarea name="message" rows="4" cols="50"></textarea>
<br/>
<input type="submit" class="btn-info" value="predict">
</form>
</div>
</body>
</html>
style.css
系统在加载home.html的title部分时,会同时加载了styles.css样式⽂件。 CSS⽂件定义了HTML⽂件的
外观和样式。 styles.css必须保存在⼀个名为static的⼦⽬录中,这是Flask查静态⽂件(如CSS)的默认⽬录。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论