微软面向初学者的机器学习课程:3.1-构建使用ML模型的Web应用程序

写在前面:最近在参与microsoft/ML-For-Beginners的翻译活动,欢迎有兴趣的朋友加入(https://github.com/microsoft/ML-For-Beginners/issues/71)

构建使用ML模型的Web应用程序

在本课中,你将在一个数据集上训练一个ML模型,这个数据集来自世界各地:过去一个世纪的UFO目击事件,来源于NUFORC的数据库。

你将学会:

  • 如何“pickle”一个训练有素的模型

  • 如何在Flask应用程序中使用该模型

我们将继续使用notebook来清理数据和训练我们的模型,但你可以进一步探索在web应用程序中使用模型。

为此,你需要使用Flask构建一个web应用程序。

课前测

构建应用程序

有多种方法可以构建Web应用程序以使用机器学习模型。你的web架构可能会影响你的模型训练方式。想象一下,你在一家企业工作,其中数据科学小组已经训练了他们希望你在应用程序中使用的模型。

注意事项

你需要问很多问题:

  • **它是web应用程序还是移动应用程序?**如果你正在构建移动应用程序或需要在物联网环境中使用模型,你可以使用TensorFlow Lite并在Android或iOS应用程序中使用该模型。

  • **模型放在哪里?**在云端还是本地?

  • 离线支持。该应用程序是否必须离线工作?

  • **使用什么技术来训练模型?**所选的技术可能会影响你需要使用的工具。

    • 使用Tensor flow。例如,如果你正在使用TensorFlow训练模型,则该生态系统提供了使用TensorFlow.js转换TensorFlow模型以便在Web应用程序中使用的能力。

    • 使用 PyTorch。如果你使用PyTorch等库构建模型,则可以选择将其导出到ONNX(开放神经网络交换)格式,用于可以使用 Onnx Runtime的JavaScript Web 应用程序。此选项将在Scikit-learn-trained模型的未来课程中进行探讨。

    • 使用Lobe.ai或Azure自定义视觉。如果你使用ML SaaS(软件即服务)系统,例如Lobe.ai或[Azure Custom Vision](https://azure.microsoft.com/services/ cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa)来训练模型,这种类型的软件提供了为许多平台导出模型的方法,包括构建一个定制API,供在线应用程序在云中查询。

你还有机会构建一个完整的Flask Web应用程序,该应用程序能够在 Web浏览器中训练模型本身。这也可以在JavaScript上下文中使用 TensorFlow.js来完成。

出于我们的目的,既然我们一直在使用基于Python的notebook,那么就让我们探讨一下将经过训练的模型从notebook导出为Python构建的web应用程序可读的格式所需要采取的步骤。

工具

对于此任务,你需要两个工具:Flask和Pickle,它们都在Python上运行。

✅ 什么是 Flask?Flask被其创建者定义为“微框架”,它提供了使用Python和模板引擎构建网页的Web框架的基本功能。看看本学习单元练习使用Flask构建应用程序。

✅ 什么是Pickle?Pickle????是一 Python模块,用于序列化和反序列化 Python对象结构。当你“pickle”一个模型时,你将其结构序列化或展平以在 Web上使用。小心:pickle本质上不是安全的,所以如果提示“un-pickle”文件,请小心。生产的文件具有后缀.pkl

练习 - 清理你的数据

在本课中,你将使用由 NUFORC(国家 UFO 报告中心)收集的80,000次UFO目击数据。这些数据对UFO目击事件有一些有趣的描述,例如:

  • 详细描述。"一名男子从夜间照射在草地上的光束中出现,他朝德克萨斯仪器公司的停车场跑去"。

  • 简短描述。“灯光追着我们”。

ufos.csv电子表格包括有关目击事件发生的citystatecountry、对象的shape及其latitudelongitude的列。

在包含在本课中的空白notebook中:

  1. 像在之前的课程中一样导入pandasmatplotlibnumpy,然后导入ufos电子表格。你可以查看一个示例数据集:

    import pandas as pd
    import numpy as npufos = pd.read_csv('../data/ufos.csv')
    ufos.head()
    
  2. 将ufos数据转换为带有新标题的小dataframe。检查country字段中的唯一值。

    ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})ufos.Country.unique()
    
  3. 现在,你可以通过删除任何空值并仅导入1-60秒之间的目击数据来减少我们需要处理的数据量:

    ufos.dropna(inplace=True)ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]ufos.info()
    
  4. 导入Scikit-learn的LabelEncoder库,将国家的文本值转换为数字:

    ✅ LabelEncoder按字母顺序编码数据

    from sklearn.preprocessing import LabelEncoderufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])ufos.head()
    

    你的数据应如下所示:

    	Seconds	Country	Latitude	Longitude
    2	20.0	3	    53.200000	-2.916667
    3	20.0	4	    28.978333	-96.645833
    14	30.0	4	    35.823889	-80.253611
    23	60.0	4	    45.582778	-122.352222
    24	3.0	    3	    51.783333	-0.783333
    

练习 - 建立你的模型

现在,你可以通过将数据划分为训练和测试组来准备训练模型。

  1. 选择要训练的三个特征作为X向量,y向量将是Country 你希望能够输入SecondsLatitudeLongitude并获得要返回的国家/地区ID。

    from sklearn.model_selection import train_test_splitSelected_features = ['Seconds','Latitude','Longitude']X = ufos[Selected_features]
    y = ufos['Country']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    
  2. 使用逻辑回归训练模型:

    from sklearn.metrics import accuracy_score, classification_report 
    from sklearn.linear_model import LogisticRegression
    model = LogisticRegression()
    model.fit(X_train, y_train)
    predictions = model.predict(X_test)print(classification_report(y_test, predictions))
    print('Predicted labels: ', predictions)
    print('Accuracy: ', accuracy_score(y_test, predictions))
    

准确率还不错**(大约 95%)**,不出所料,因为CountryLatitude/Longitude相关。

你创建的模型并不是非常具有革命性,因为你应该能够从其LatitudeLongitude推断出Country,但是,尝试从清理、导出的原始数据进行训练,然后在web应用程序中使用此模型是一个很好的练习。

练习 - “pickle”你的模型

现在,是时候_pickle_你的模型了!你可以在几行代码中做到这一点。一旦它是 pickled,加载你的pickled模型并针对包含秒、纬度和经度值的示例数据数组对其进行测试,

import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))

该模型返回**'3'**,这是英国的国家代码。????

练习 - 构建Flask应用程序

现在你可以构建一个Flask应用程序来调用你的模型并返回类似的结果,但以一种更美观的方式。

  1. 首先在你的 ufo-model.pkl 文件所在的_notebook.ipynb_文件旁边创建一个名为web-app的文件夹。

  2. 在该文件夹中创建另外三个文件夹:static,其中有文件夹csstemplates`。你现在应该拥有以下文件和目录

    web-app/static/css/templates/
    notebook.ipynb
    ufo-model.pkl
    

    ✅ 请参阅解决方案文件夹以查看已完成的应用程序

  3. 在_web-app_文件夹中创建的第一个文件是requirements.txt文件。与JavaScript应用程序中的_package.json_一样,此文件列出了应用程序所需的依赖项。在requirements.txt中添加以下几行:

    scikit-learn
    pandas
    numpy
    flask
    
  4. 现在,进入web-app文件夹:

    cd web-app
    
  5. 在你的终端中输入pip install,以安装_reuirements.txt_中列出的库:

    pip install -r requirements.txt
    
  6. 现在,你已准备好创建另外三个文件来完成应用程序:

    1. 在根目录中创建app.py

    2. 在_templates_目录中创建index.html

    3. 在_static/css_目录中创建styles.css

  7. 使用一些样式构建_styles.css_文件:

    body {width: 100%;height: 100%;font-family: 'Helvetica';background: black;color: #fff;text-align: center;letter-spacing: 1.4px;font-size: 30px;
    }input {min-width: 150px;
    }.grid {width: 300px;border: 1px solid #2d2d2d;display: grid;justify-content: center;margin: 20px auto;
    }.box {color: #fff;background: #2d2d2d;padding: 12px;display: inline-block;
    }
    
  8. 接下来,构建_index.html_文件:

    <!DOCTYPE html>
    <html>
    <head><meta charset="UTF-8"><title>???? UFO Appearance Prediction! ????</title><link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> 
    </head><body><div class="grid"><div class="box"><p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p><form action="{{ url_for('predict')}}" method="post"><input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" /><input type="text" name="latitude" placeholder="Latitude" required="required" /><input type="text" name="longitude" placeholder="Longitude" required="required" /><button type="submit" class="btn">Predict country where the UFO is seen</button></form><p>{{ prediction_text }}</p></div>
    </div></body>
    </html>
    

    看看这个文件中的模板。请注意应用程序将提供的变量周围的“mustache”语法,例如预测文本:{{}}。还有一个表单可以将预测发布到/predict路由。

    最后,你已准备好构建使用模型和显示预测的python 文件:

  9. app.py中添加:

    import numpy as np
    from flask import Flask, request, render_template
    import pickleapp = Flask(__name__)model = pickle.load(open("../ufo-model.pkl", "rb"))@app.route("/")
    def home():return render_template("index.html")@app.route("/predict", methods=["POST"])
    def predict():int_features = [int(x) for x in request.form.values()]final_features = [np.array(int_features)]prediction = model.predict(final_features)output = prediction[0]countries = ["Australia", "Canada", "Germany", "UK", "US"]return render_template("index.html", prediction_text="Likely country: {}".format(countries[output]))if __name__ == "__main__":app.run(debug=True)
    

    ???? 提示:当你在使用Flask运行Web应用程序时添加 debug=True时你对应用程序所做的任何更改将立即反映,无需重新启动服务器。注意!不要在生产应用程序中启用此模式

如果你运行python app.pypython3 app.py - 你的网络服务器在本地启动,你可以填写一个简短的表格来回答你关于在哪里看到UFO的问题!

在此之前,先看一下app.py的实现:

  1. 首先,加载依赖项并启动应用程序。

  2. 然后,导入模型。

  3. 然后,在home路由上渲染index.html。

/predict路由上,当表单被发布时会发生几件事情:

  1. 收集表单变量并转换为numpy数组。然后将它们发送到模型并返回预测。

  2. 我们希望显示的国家/地区根据其预测的国家/地区代码重新呈现为可读文本,并将该值发送回index.html以在模板中呈现。

以这种方式使用模型,包括Flask和pickled模型,是相对简单的。最困难的是要理解数据是什么形状的,这些数据必须发送到模型中才能得到预测。这完全取决于模型是如何训练的。有三个数据要输入,以便得到一个预测。

在一个专业的环境中,你可以看到训练模型的人和在Web或移动应用程序中使用模型的人之间的良好沟通是多么的必要。在我们的情况下,只有一个人,你!


???? 挑战:

你可以在Flask应用程序中训练模型,而不是在notebook上工作并将模型导入Flask应用程序!尝试在notebook中转换Python代码,可能是在清除数据之后,从应用程序中的一个名为train的路径训练模型。采用这种方法的利弊是什么?

课后测

复习与自学

有很多方法可以构建一个Web应用程序来使用ML模型。列出可以使用JavaScript或Python构建Web应用程序以利用机器学习的方法。考虑架构:模型应该留在应用程序中还是存在于云中?如果是后者,你将如何访问它?为应用的ML Web解决方案绘制架构模型。

任务

尝试不同的模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们单位里新来的应届毕业生(转贴)

我在一个BBS上看到的贴,觉得很好玩,就转过来了....大家一起分享吧....1.公司新配给我一个助理.今天,我,助理以及我们老总,去局里开会.会毕,领导要写个注意事项给我们.我和老总当时拿笔都不太方便.我随口问助理..你带笔了吗?他马上回答:带了然后,几双眼睛看着他..接下来的十秒钟…

boost pool内存池库使用简要介绍

2019独角兽企业重金招聘Python工程师标准>>> 我厂内存次神马的一般都自己实现。我曾经也自己写过一个demo(mempool)。后来发现boost库里面有一个内存池库boost pool&#xff0c;貌似很好用&#xff0c;使用挺好&#xff0c;例子可以贴出来。 boost一共有4种内存池&…

嫁给我好吗?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

c语言得到txt文件的长度,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼并把得到的密文写入另一个txt文件张该怎么改代码啊&#xff1f;#include #include extern char* StrSHA256(const char* str, long long length, char* sha256);int main(void){char text[] "123";char sha256[65];StrS…

惠普前总裁孙振耀指点职业规划

HP大中华区总裁孙振耀退休感言&#xff1a;如果这篇文章没有分享给你&#xff0c;那是我的错。 如果这篇文章分享给你了&#xff0c;你却没有读&#xff0c;继续走弯路的你不要怪我。 如果你看了这篇文章&#xff0c;只读了一半你就说没时间了&#xff0c;说明你已经是个“茫”…

.NET Core etcd 配置源

etcd 是一个高可用的 Key/Value 存储系统&#xff0c;主要用于共享配置和服务发现&#xff0c;和目前比较主流的配置中心&#xff08;如&#xff1a;Spring Cloud Config、Apollo、Consul、Nacos&#xff09;、注册中心&#xff08;如&#xff1a;Zookeeper、Eureka、Consul、N…

继相对论、量子论之后,它的出现,给牛顿又来了致命一刀

全世界只有3.14 % 的人关注了青少年数学之旅前两天&#xff0c;有模友留言。今天&#xff0c;它来了。“微小的变化能带动整个系统的长期的巨大的连锁反应。”——节选自其实“混沌”一词&#xff0c;最早指的是宇宙未形成之前的混乱状态。/此混沌非彼馄饨/在希腊神话中&#x…

django基础1--django安装与helloworld测试

第一步测试服务器是否安装python直接输入python命令即可&#xff0c;ctrld退出第二步上传django安装包&#xff0c;解压进入后python setup.py install 安装第三步Python导入django看看是否生效先python进入python环境&#xff0c;然后import django命令查看是否正常执行第四步…

C#打造自己的文件浏览器

C#的功能十分强大&#xff0c;用它可以轻松地做出属于自己的文件浏览器。下面简单地介绍一下文件浏览器的大致实现过程。其中涉及的有关这些控件的具体用法可参见C#的联机帮助。你需要用到几个控件&#xff1a;TreeView(用于显示显示目录树)&#xff1b;ListView(用于显示文件和…

c语言函数调用二次方程求根,[编程入门]自定义函数求一元二次方程 (C语言代码)...

解题思路:别慌&#xff0c;慢慢看。注意事项:参考代码:#include #include double dt(double a, double b, double c);int main (void){double x1,x2,a,b,c,p,q;//p,q先别管待会说scanf("%lf %lf %lf",&a,&b,&c);//double类型lfif(dt(a,b,c)>0){x1(-bs…

Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想

在 WPF 中&#xff0c;我们可以方便的在全局范围定义一个样式&#xff0c;就可以应用到所有这种类型的对象&#xff0c;这就是所谓的隐式样式&#xff08;implicit Style)&#xff0c;比如&#xff1a; <Window x:Class"WpfImplicitStyle.Window1"xmlns"http…

如何排查 .NET 内存泄漏

内存泄漏通常表示&#xff1a;一个应用程序的某些对象在完成它的的生命周期后&#xff0c;由于它被其他对象意外引用&#xff0c;导致后续gc无法对它进行回收&#xff0c;长此以往就会导致程序性能的下降以及潜在的 OutOfMemoryException。这篇我们通过一个内存泄漏工具对 .NET…

这就是你在妈妈肚子里尿尿的样子 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅其实“站着说话不腰疼”是有科学依据的不同姿势下腰椎承受的压力是这样的三思逍遥这是你在妈妈肚子里尿尿的样子不少人觉得葡萄上白色的这一层粉是“脏”的表现其实它是葡萄的“果粉”不仅对人体无害还可以代表这个葡萄很新鲜现实告诉…

C#:装箱和拆箱相关知识整理

1、装箱和拆箱是一个抽象的概念 2、 装箱是将值类型转换为引用类型 &#xff1b; 拆箱是将引用类型转换为值类型 利用装箱和拆箱功能&#xff0c;可通过允许值类型的任何值与Object 类型的值相互转换&#xff0c;将值类型与引用类型链接起来 例如&#xff1a; int val 100;…

Android 封装handler,android封装工作线程跟Handler工具类

直接上代码&#xff0c;不解说 - -基于MVP封装P的基类AbsHandlerThreadHelper.javaimport java.lang.ref.WeakReference;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android.content.Context;import android.os.Handler;impor…

c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法

usingSystem;usingSystem.IO;usingSystem.Data;usingSystem.Text;usingSystem.Diagnostics;usingSystem.Security;usingSystem.Security.Cryptography;/**//* * .Net框架由于拥有CLR提供的丰富库支持&#xff0c;只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法…

WPF中TreeView.BringIntoView方法的替代方案

WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoView&#xff08;&#xff09;方法并不是那么地好用&#xff0c;不少时候会没有效果&#xff0c;这里有一个替代方案&#xff0c;调用SelectItem&#xff08;&#xff09;方法可以展开并呈现TreeView…

C# WPF MVVM项目实战(进阶①)

这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发&#xff0c;今天主要是增加了一个用户窗体TestFormView&#xff0c;然后通过TabControl&#xff0c;将新增的窗体加载到主界面上进行分页显示&#xff0c;新增的页面引用了WPF UI&#xff1a;WPF Datagrid合并表…

双十一变身大型奥数竞赛现场?数学不好的你请转场

当微信又被淘宝“助力”刷屏&#xff0c;我们开始意识到它来了&#xff0c;它真的来了它今天真的来了&#xff01;令人闻风丧胆的双十一又双叒叕要到了&#xff01;从最开始的光棍节变成现在的购物节每年双十一的优惠难度堪比南孚电池一节更比一节强小木&#xff1a;阿里&#…

android菜单和对话栏,Android回顾--(十一) 菜单和对话框

选择菜单(OptionsMenu)第一种使用方式&#xff1a;在res目录下面建立一个名称是menu的文件夹在menu下面建立一个xml文件(默认就是menu的类型)在建立的这个xml文件夹中添加菜单的选项&#xff0c;xml文件中有很多属性android:orderInCategory "2" //表示当前的item在…