从零开始学机器学习——网络应用

news/2024/12/31 1:30:46/文章来源:https://www.cnblogs.com/guoxiaoyu/p/18438177

首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns

今天,我们的主要任务是按照既定的流程再次运行模型,并将其成功加载到 Web 应用程序中,以便通过 Web 界面进行调用。最终生成的模型将能够基于 UFO 目击事件的数据和经纬度信息,推断出事件发生的城市地址。尽管经纬度信息似乎已经足够,但我们还是需要模型进行预测,这只是一个练习目的。希望通过这个过程,你能进一步理解机器学习模型在 Web 应用中的应用与整合。

知识回顾

工具

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

Flask 是一个轻量级的 web 应用框架,适用于构建简单的 web 应用和 RESTful API。它遵循 WSGI(Web Server Gateway Interface)标准,支持多种扩展,具有以下特点:

  • 简单易用:Flask 的核心非常简单,易于上手,适合初学者。
  • 灵活性:开发者可以根据需要选择和添加扩展,使其具有更强的功能。
  • 路由系统:Flask 提供了灵活的 URL 路由机制,方便管理不同的页面和请求。
  • 模板引擎:集成了 Jinja2 模板引擎,可以轻松生成动态 HTML 页面。
  • 支持 RESTful API:非常适合构建 RESTful 服务。

Pickle 是 Python 的一个内置模块,用于对象序列化和反序列化。序列化是将 Python 对象转换为字节流的过程,而反序列化则是将字节流还原为 Python 对象。它的特点包括:

  • 简单方便:使用简单,可以轻松地保存和加载 Python 对象。
  • 支持多种对象:可以序列化大多数 Python 数据类型,包括自定义类。
  • 持久化数据:适合将数据存储到文件中,以便后续使用。

注意:Pickle 对安全性有一定的隐患,因为反序列化不可信的数据可能导致代码执行漏洞。

清洗数据

首先,让我们来深入了解一下我们的数据集,看看它的具体结构和内容。这一步非常重要,因为数据的质量和特征将直接影响到模型的性能和预测结果。

import pandas as pd
import numpy as npufos = pd.read_csv('./data/ufos.csv')
ufos.head()

image

因此,根据我们要解决的问题,我们需要提取与之相关的向量字段数据。这些字段包括:城市名称、经纬度坐标以及目击时长。这些信息将为我们后续的分析和建模提供重要的输入特征,帮助我们准确地推断 UFO 目击事件发生的城市。

ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})ufos.Country.unique()
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()

在完成这一系列的数据清洗和筛选后,我们的数据集将仅包含我们所需的相关字段,确保其精简而高效。此外,我们还对目击时长进行了特别的过滤,以确保该特征的有效性和一致性。

因为我们了解到,模型对数据的敏感性会影响其预测结果。接下来,我们需要将文本字段转换为适合模型处理的数值数据格式。这一转换过程将使得模型能够理解和利用这些文本信息,从而提升预测能力。

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

目前为止,我们已经成功完成了数据的清理和预处理,确保我们的数据集具备良好的质量和一致性。接下来,我们将进入模型训练的阶段。考虑到我们的任务是预测城市,而城市名称是一个有限且固定的类别,逻辑回归模型将是一个理想的选择。

建立模型

现在,我们将开始准备训练模型的关键步骤,即将数据集划分为训练组和测试组。

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report 
from sklearn.linear_model import LogisticRegressionSelected_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)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))

返回如下:

              precision    recall  f1-score   support0       1.00      1.00      1.00        411       0.83      0.23      0.36       2502       1.00      1.00      1.00         83       1.00      1.00      1.00       1314       0.96      1.00      0.98      4743accuracy                           0.96      5173macro avg       0.96      0.85      0.87      5173
weighted avg       0.96      0.96      0.95      5173Predicted labels:  [4 4 4 ... 3 4 4]
Accuracy:  0.9605644693601392

模型的准确率相当不错,约为95%。这一结果并不令人意外,因为我们的特征——国家(Country)以及经纬度(Latitude/Longitude)信息之间确实存在显著的相关性。

接下来,我们需要将这一训练好的模型进行打包,以便将其集成到我们的Web应用程序中。这样,用户就能够通过网页轻松调用模型进行城市预测,享受流畅的交互体验。

打包模型

我们可以直接利用pickle库这一便捷的依赖,将训练好的模型序列化并写入文件。

import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))model = pickle.load(open('ufo-model.pkl','rb'))

构建WEB

现在,我们的目标是通过Flask应用程序来调用已训练好的模型,并将预测结果以更加美观和用户友好的方式展示在Web页面上。Flask作为一个轻量级的Web框架,能够帮助我们快速构建Web应用,让用户通过直观的界面与模型进行交互。

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

这是我们需要新建的目录结构,请务必严格遵循这一布局,因为不按此结构组织文件和文件夹可能会导致程序在运行时出现错误。

requirements.txt中添加以下几行:

scikit-learn
pandas
numpy
flask

然后安装相关依赖

pip install -r requirements.txt

其余的CSS和HTML代码请前往学习中心自行复制和参考,这里不再一一列举。

在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)

这段代码实现了一个简单的 web 应用,允许用户输入特征数据并根据加载的机器学习模型进行预测。预测结果会被渲染到同一个页面上显示给用户。通过 Flask 的路由系统,可以方便地处理用户请求和响应。

例如,当我们输入特征数据“50, 44, -12”时,应用将调用训练好的模型进行计算,并在页面上展示预测结果,如图所示。

image

总结

在这个项目中,我们通过使用 Flask 和 Pickle 将一个机器学习模型成功集成到 Web 应用中,使用户能够通过友好的界面进行预测。这一过程不仅让我们体验到了模型训练与数据预处理的细节,也深刻理解了如何在实际应用中实现机器学习的功能。

通过这一系列的实践操作,我们不仅巩固了对工具和技术的理解,也提升了将理论知识转化为实际应用的能力。这一过程的重要性在于,它不仅是对我们技术能力的挑战,更是对解决实际问题能力的培养。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

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

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

相关文章

Cisco Firepower 4100 Series FTD Software 7.6.0 ASA Software 9.22.1

Cisco Firepower 4100 Series FTD Software 7.6.0 & ASA Software 9.22.1Cisco Firepower 4100 Series FTD Software 7.6.0 & ASA Software 9.22.1 Firepower Threat Defense (FTD) Software - 思科防火墙系统软件 请访问原文链接:https://sysin.org/blog/cisco-firep…

Cisco Firepower 9300 Series FTD Software 7.6.0 ASA Software 9.22.1

Cisco Firepower 9300 Series FTD Software 7.6.0 & ASA Software 9.22.1Cisco Firepower 9300 Series FTD Software 7.6.0 & ASA Software 9.22.1 Firepower Threat Defense (FTD) Software - 思科防火墙系统软件 请访问原文链接:https://sysin.org/blog/cisco-firep…

读数据湖仓08数据架构的演化

读数据湖仓08数据架构的演化1. 数据目录 1.1. 需要将分析基础设施放置在数据目录(Data Catalogue)的结构中1.1.1. 元数据1.1.2. 数据模型1.1.3. 本体1.1.4. 分类标准1.2. 数据目录类似于图书馆的图书检索目录1.2.1. 先通过图书馆的图书检索目录进行查找,以便快速找到所需的图书…

VUE2常见问题以及解决方案汇总,vue+element ui 问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 @row-click 事件与行内点击事件冲突,点击事件不生效(表格行点击事件和行内元素点击事件冲突)需要阻止事件冒泡 问题描述 1.点击列的编辑按钮,会触发按钮本身事件,同时会触发行点击事件 2.点击列的元素,会触发本身事件,同时会触发行点击事件 需…

1分钟了解什么是docker和docker-compose?前后端必知必会技能GET啦

@目录前情提要Docker定义:主要功能:命令示例:其他Docker Compose定义:我为什么使用它?主要功能:命令示例:主要区别配置文件:命令行操作:依赖关系管理:实际应用场景单个服务:多服务应用:总结结语欢迎路过的小哥哥小姐姐们提出更好的意见哇~~ 前情提要 本文非常简短,如果需要详…

VUE2常见问题以及解决方案汇总(不断更新中)

vue子组件传递数据给父组件 子组件可以使用 $emit 向父组件传递数据。父组件监听这个事件,并在事件触发时接收数据。 上代码 子组件 (Child.vue) <template><button @click="sendDataToParent">Send Data to Parent</button> </template>&l…

1分钟搞懂K8S中的NodeSelector

@目录NodeSelector是什么?为什么使用NodeSelector?怎么用NodeSelector?POD配置示例yaml配置示例如何知道K8S上面有哪些节点,每个节点都有什么信息呢?1. 使用kubectl命令行工具查看所有节点及其标签2. 使用kubectl命令行工具查看特定节点的标签代码举例常见的NodeSelector节…

谷歌浏览器调试技巧

谷歌浏览器断点调试# “资源(Sources)”面板# 进入浏览器,点击F12,进入调试面板,点击source 切换按钮 会打开文件列表的选项卡。资源(Sources)面板包含三个部分:文件导航(File Navigator) 区域列出了 HTML、JavaScript、CSS 和包括图片在内的其他依附于此页面的文件。…

两种方案手把手教你多种服务器使用tinyproxy搭建http代理

@目录Tinyproxy是什么?特点功能安装方案一:Docker安装安装tinyproxy镜像,启动容器将内部8888端口至外部,ANY代表允许所有ip访问代理获得代理地址安装方案二:系统包管理器Tinyproxy 可以通过包管理器安装。以下是一些常见的 Linux 和 mac发行版的安装命令:MAC电脑Linux配置…

Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)

@目录Docker的数据持久化是什么?1.数据卷(Data Volumes)使用Docker 创建数据卷创建数据卷创建一个容器,将数据卷挂载到容器中的 /data 目录。进入容器,查看数据卷内容停止并重新启动容器,数据卷中的数据仍然存在再次进入容器,检查文件是否存在使用 Docker Compose 创建数…

基于simulink的风轮机发电系统建模与仿真

1.课题概述使用simulink实现风轮机发电系统建模与仿真,包括风速模型(基本风+阵风+阶跃风+随机风组成),风力机模型,飞轮储能模块等。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a风速模块:风力机模块 整体模型4.系统原理简介 4.1 风速模型风速模型在风力发电和其他…

2024-10-06 闲话

2024-10-06 闲话坐在电脑前 1 小时也什么都写不出来。 比如我现在住的地方(在一个房子里面)旁边有一个大冰块,因为这个大冰块在吸热所以我在家里感受到了无尽的寒冷。 于是我读了几本古圣先贤的书,合成了能烧来取暖的蜂窝煤。我又拿了根钻头把蜂窝煤点着了,尾气全部排到房…