摘要: 实用性教程!教你如何快速建立一个可用的机器学习程序!
截住到目前为止,咱们已经开发了许多机器学习模型,对测试数据进行了数值预测,并测试告终果。实际上,生成预测只是机器学习项目的一部分,尽管它是我认为最重要的部分。今天咱们来建立一个用于文档分类、垃圾过滤的天然语言处理模型,使用机器学习来检测垃圾短信文本消息。咱们的ML系统工做流程以下:离线训练->将模型做为服务提供->在线预测。css
一、经过垃圾邮件和非垃圾邮件训练离线分类器。html
二、通过训练的模型被部署为服务用户的服务。python
当咱们开发机器学习模型时,咱们须要考虑如何部署它,即如何使这个模型可供其余用户使用。Kaggle和数据科学训练营很是适合学习如何构建和优化模型,但他们并无教会工程师如何将它们带给其余用户使用,创建模型与实际为人们提供产品和服务之间存在重大差别。git
在本文中,咱们将重点关注:构建垃圾短信分类的机器学习模型,而后使用Flask(用于构建Web应用程序的Python微框架)为模型建立API。此API容许用户经过HTTP请求利用预测功能。让咱们开始吧!github
数据是标记为垃圾邮件或正常邮件的SMS消息的集合,可在此处找到。首先,咱们将使用此数据集构建预测模型,以准确分类哪些文本是垃圾邮件。朴素贝叶斯分类器是一种流行的电子邮件过滤统计技术。他们一般使用词袋功能来识别垃圾邮件。所以,咱们将使用Naive Bayes定理构建一个简单的消息分类器。flask
import pandas as pd import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report df = pd.read_csv('spam.csv', encoding="latin-1") df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True) df['label'] = df['class'].map({'ham': 0, 'spam': 1}) X = df['message'] y = df['label'] cv = CountVectorizer() X = cv.fit_transform(X) # Fit the Data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) #Naive Bayes Classifier 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))
Naive Bayes分类器不只易于实现,并且提供了很是好的性能。在训练模型以后,咱们都但愿有一种方法来保持模型以供未来使用而无需从新训练。为实现此目的,咱们添加如下行以将咱们的模型保存为.pkl文件供之后使用。浏览器
from sklearn.externals import joblib joblib.dump(clf, 'NB_spam_model.pkl')
咱们加载并使用保存的模型:服务器
NB_spam_model = open('NB_spam_model.pkl','rb') clf = joblib.load(NB_spam_model)
上述过程称为“标准格式的持久模型”,即模型以特定的开发语言的特定格式持久存储。下一步就是将模型在一个微服务中提供,该服务的公开端点用来接收来自客户端的请求。app
在上一节中准备好用于对SMS消息进行分类的代码以后,咱们将开发一个Web应用程序,该应用程序由一个简单的Web页面组成,该页面具备容许咱们输入消息的表单字段。在将消息提交给Web应用程序后,它将在新页面上呈现该消息,从而为咱们提供是否为垃圾邮件的结果。框架
首先,咱们为这个项目建立一个名为SMS-Message-Spam-Detector 的文件夹,这是该文件夹中的目录树,接下来咱们将解释每一个文件。
spam.csv app.py templates/ home.html result.html static/ style.css
子目录templates是Flask在Web浏览器中查找静态HTML文件的目录,在咱们的例子中,咱们有两个html文件:home.html和result.html 。
app.py
文件包含将由Python解释器执行以运行Flask Web应用程序的主代码,还包含用于对SMS消息进行分类的ML代码:
from flask import Flask,render_template,url_for,request import pandas as pd import pickle from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.externals import joblib app = Flask(__name__) @app.route('/') def home(): return render_template('home.html') @app.route('/predict',methods=['POST']) def predict(): df= pd.read_csv("spam.csv", encoding="latin-1") df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True) # Features and Labels df['label'] = df['class'].map({'ham': 0, 'spam': 1}) X = df['message'] y = df['label'] # Extract Feature With CountVectorizer cv = CountVectorizer() X = cv.fit_transform(X) # Fit the Data from sklearn.model_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) #Naive Bayes Classifier from sklearn.naive_bayes import MultinomialNB 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) if request.method == '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)
一、咱们将应用程序做为单个模块运行,所以咱们使用参数初始化了一个新的Flask实例,__name__是为了让Flask知道它能够在templates所在的同一目录中找到HTML模板文件夹()。
二、接下来,咱们使用route decorator(@app.route('/'))来指定能够触发home 函数执行的URL 。咱们的home 函数只是呈现home.htmlHTML文件,该文件位于templates文件夹中。
三、在predict函数内部,咱们访问垃圾邮件数据集、预处理文本、进行预测,而后存储模型。咱们访问用户输入的新消息,并使用咱们的模型对其标签进行预测。
四、咱们使用该POST方法将表单数据传输到邮件正文中的服务器。最后,经过debug=True在app.run方法中设置参数,进一步激活Flask的调试器。
五、最后,咱们使用run函数执行在服务器上的脚本文件,咱们须要确保使用if语句 __name__ == '__main__'。
如下是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> view raw
在home.html的head部分,咱们将加载styles.css文件,CSS文件是用于肯定HTML文档的外观和风格的。styles.css必须保存在一个名为的子目录中static,这是Flask查找静态文件(如CSS)的默认目录。
body{ font:15px/1.5 Arial, Helvetica,sans-serif; padding: 0px; background-color:#f4f3f3; } .container{ width:100%; margin: auto; overflow: hidden; } header{ background:#03A9F4;#35434a; border-bottom:#448AFF 3px solid; height:120px; width:100%; padding-top:30px; } .main-header{ text-align:center; background-color: blue; height:100px; width:100%; margin:0px; } #brandname{ float:left; font-size:30px; color: #fff; margin: 10px; } header h2{ text-align:center; color:#fff; } .btn-info {background-color: #2196F3; height:40px; width:100px;} /* Blue */ .btn-info:hover {background: #0b7dda;} .resultss{ border-radius: 15px 50px; background: #345fe4; padding: 20px; width: 200px; height: 150px; }
咱们建立一个result.html文件,该文件将经过函数render_template('result.html', prediction=my_prediction)返回呈现predict,咱们在app.py脚本中定义该文件以显示用户经过文本字段提交的文本。result.html文件包含如下内容:
<!DOCTYPE html> <html> <head> <title></title> <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body> <header> <div class="container"> <div id="brandname"> ML App </div> <h2>Spam Detector For SMS Messages</h2> </div> </header> <p style="color:blue;font-size:20;text-align: center;"><b>Results for Comment</b></p> <div class="results"> {% if prediction == 1%} <h2 style="color:red;">Spam</h2> {% elif prediction == 0%} <h2 style="color:blue;">Not a Spam (It is a Ham)</h2> {% endif %} </div> </body> </html>
从result.htm文件咱们能够看到一些代码使用一般在HTML文件中找不到的语法例如,{% if prediction ==1%},{% elif prediction == 0%},{% endif %}这是jinja语法,它用于访问从HTML文件中请求返回的预测。
咱们就要大功告成了!
完成上述全部操做后,你能够经过双击appy.py 或从终端执行命令来开始运行API :
cd SMS-Message-Spam-Detector python app.py
你应该获得如下输出:
如今你能够打开Web浏览器并导航到http://127.0.0.1:5000/,你应该看到一个简单的网站,内容以下:
恭喜!咱们如今以零成本的代价建立了端到端机器学习(NLP)应用程序。若是你回顾一下,其实整个过程根本不复杂。有点耐心和渴望学习的动力,任何人均可以作到。全部开源工具都使每件事都成为可能。
更重要的是,咱们可以将咱们对机器学习理论的知识扩展到有用和实用的Web应用程序!
完整的工做源代码可在此存储库中找到,祝你度过愉快的一周!
本文为云栖社区原创内容,未经容许不得转载。