pull/318/head
Flex Zhong 4 years ago
parent 3e7ad5beb3
commit 2a735e1e4e

@ -1,7 +1,7 @@
# 机器学习中的公平性 # 机器学习中的公平性
![机器学习中的公平性概述](../../../sketchnotes/ml-fairness.png) ![机器学习中的公平性概述](../../../sketchnotes/ml-fairness.png)
> 作者[Tomomi Imura](https://www.twitter.com/girlie_mac) > 作者 [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [课前测验](https://white-water-09ec41f0f.azurestaticapps.net/quiz/5/) ## [课前测验](https://white-water-09ec41f0f.azurestaticapps.net/quiz/5/)
@ -76,14 +76,14 @@
一种图像标记技术,臭名昭著地将深色皮肤的人的图像错误地标记为大猩猩。错误的标签是有害的,不仅仅是因为这个系统犯了一个错误,而且它还特别使用了一个长期以来被故意用来诋毁黑人的标签。 一种图像标记技术,臭名昭著地将深色皮肤的人的图像错误地标记为大猩猩。错误的标签是有害的,不仅仅是因为这个系统犯了一个错误,而且它还特别使用了一个长期以来被故意用来诋毁黑人的标签。
[![AI: 我不是女人吗?](https://img.youtube.com/vi/QxuyfWoVV98/0.jpg)](https://www.youtube.com/watch?v=QxuyfWoVV98 "AI, 我不是女人吗?") [![AI: 我不是女人吗?](https://img.youtube.com/vi/QxuyfWoVV98/0.jpg)](https://www.youtube.com/watch?v=QxuyfWoVV98 "AI, 我不是女人吗?")
> 🎥 点击上图观看视频AI我不是女人吗 - 一场展示AI种族主义诋毁造成的伤害的表演 > 🎥 点击上图观看视频AI我不是女人吗 - 一场展示 AI 种族主义诋毁造成的伤害的表演
### 代表性过高或过低 ### 代表性过高或过低
有倾向性的图像搜索结果就是一个很好的例子。在搜索男性比例等于或高于女性的职业的图片时,比如工程或首席执行官,要注意那些更倾向于特定性别的结果。 有倾向性的图像搜索结果就是一个很好的例子。在搜索男性比例等于或高于女性的职业的图片时,比如工程或首席执行官,要注意那些更倾向于特定性别的结果。
![必应CEO搜索](../images/ceos.png) ![必应CEO搜索](../images/ceos.png)
> 在Bing上搜索“CEO”会得到非常全面的结果 > 在 Bing 上搜索“CEO”会得到非常全面的结果
这五种主要类型的危害不是相互排斥的,一个单一的系统可以表现出一种以上的危害。此外,每个案例的严重程度各不相同。例如,不公平地给某人贴上罪犯的标签比给形象贴上错误的标签要严重得多。然而,重要的是要记住,即使是相对不严重的伤害也会让人感到疏远或被孤立,累积的影响可能会非常压抑。 这五种主要类型的危害不是相互排斥的,一个单一的系统可以表现出一种以上的危害。此外,每个案例的严重程度各不相同。例如,不公平地给某人贴上罪犯的标签比给形象贴上错误的标签要严重得多。然而,重要的是要记住,即使是相对不严重的伤害也会让人感到疏远或被孤立,累积的影响可能会非常压抑。
@ -98,7 +98,7 @@
## 检测不公平 ## 检测不公平
给定系统行为不公平的原因有很多。例如社会偏见可能会反映在用于训练它们的数据集中。例如过度依赖历史数据可能会加剧招聘不公平。通过使用过去10年提交给公司的简历中的模式该模型确定男性更合格因为大多数简历来自男性这反映了过去男性在整个科技行业的主导地位。 给定系统行为不公平的原因有很多。例如,社会偏见可能会反映在用于训练它们的数据集中。例如,过度依赖历史数据可能会加剧招聘不公平。通过使用过去 10 年提交给公司的简历中的模式,该模型确定男性更合格,因为大多数简历来自男性,这反映了过去男性在整个科技行业的主导地位。
关于特定人群的数据不足可能是不公平的原因。例如,图像分类器对于深肤色人的图像具有较高的错误率,因为数据中没有充分代表较深的肤色。 关于特定人群的数据不足可能是不公平的原因。例如,图像分类器对于深肤色人的图像具有较高的错误率,因为数据中没有充分代表较深的肤色。
@ -124,9 +124,9 @@
与贷款相关的危害和好处是什么?想想假阴性和假阳性的情况: 与贷款相关的危害和好处是什么?想想假阴性和假阳性的情况:
**假阴性**拒绝但Y=1-在这种情况下,将拒绝有能力偿还贷款的申请人。这是一个不利的事件,因为贷款的资源是从合格的申请人扣留。 **假阴性**(拒绝,但 Y=1-在这种情况下,将拒绝有能力偿还贷款的申请人。这是一个不利的事件,因为贷款的资源是从合格的申请人扣留。
**假阳性**接受但Y=0-在这种情况下,申请人确实获得了贷款,但最终违约。因此,申请人的案件将被送往一个债务催收机构,这可能会影响他们未来的贷款申请。 **假阳性**(接受,但 Y=0-在这种情况下,申请人确实获得了贷款,但最终违约。因此,申请人的案件将被送往一个债务催收机构,这可能会影响他们未来的贷款申请。
### 确定受影响的群体 ### 确定受影响的群体
@ -147,7 +147,7 @@
这个表格告诉我们几件事。首先,我们注意到数据中的未列出性别的人相对较少。数据是有偏差的,所以你需要小心解释这些数字。 这个表格告诉我们几件事。首先,我们注意到数据中的未列出性别的人相对较少。数据是有偏差的,所以你需要小心解释这些数字。
在本例中我们有3个组和2个度量。当我们考虑我们的系统如何影响贷款申请人的客户群时这可能就足够了但是当你想要定义更多的组时你可能需要将其提取到更小的摘要集。为此你可以添加更多的度量例如每个假阴性和假阳性的最大差异或最小比率。 在本例中,我们有 3 个组和 2 个度量。当我们考虑我们的系统如何影响贷款申请人的客户群时,这可能就足够了,但是当你想要定义更多的组时,你可能需要将其提取到更小的摘要集。为此,你可以添加更多的度量,例如每个假阴性和假阳性的最大差异或最小比率。
✅ 停下来想一想:还有哪些群体可能会受到贷款申请的影响? ✅ 停下来想一想:还有哪些群体可能会受到贷款申请的影响?
@ -159,19 +159,19 @@
### Fairlearn ### Fairlearn
[Fairlearn](https://fairlearn.github.io/) 是一个开源Python包可让你评估系统的公平性并减轻不公平性。 [Fairlearn](https://fairlearn.github.io/) 是一个开源 Python 包,可让你评估系统的公平性并减轻不公平性。
该工具可帮助你评估模型的预测如何影响不同的组,使你能够通过使用公平性和性能指标来比较多个模型,并提供一组算法来减轻二元分类和回归中的不公平性。 该工具可帮助你评估模型的预测如何影响不同的组,使你能够通过使用公平性和性能指标来比较多个模型,并提供一组算法来减轻二元分类和回归中的不公平性。
- 通过查看Fairlearn的[GitHub](https://github.com/fairlearn/fairlearn/)了解如何使用不同的组件 - 通过查看 Fairlearn [GitHub](https://github.com/fairlearn/fairlearn/) 了解如何使用不同的组件
- 浏览[用户指南](https://fairlearn.github.io/main/user_guide/index.html), [示例](https://fairlearn.github.io/main/auto_examples/index.html) - 浏览[用户指南](https://fairlearn.github.io/main/user_guide/index.html), [示例](https://fairlearn.github.io/main/auto_examples/index.html)
- 尝试一些 [示例Notebook](https://github.com/fairlearn/fairlearn/tree/master/notebooks). - 尝试一些 [示例 Notebook](https://github.com/fairlearn/fairlearn/tree/master/notebooks).
- 了解Azure机器学习中机器学习模型[如何启用公平性评估](https://docs.microsoft.com/azure/machine-learning/how-to-machine-learning-fairness-aml?WT.mc_id=academic-15963-cxa)。 - 了解Azure机器学习中机器学习模型[如何启用公平性评估](https://docs.microsoft.com/azure/machine-learning/how-to-machine-learning-fairness-aml?WT.mc_id=academic-15963-cxa)。
- 看看这些[示例Notebook](https://github.com/Azure/MachineLearningNotebooks/tree/master/contrib/fairness)了解Azure机器学习中的更多公平性评估场景。 - 看看这些[示例 Notebook](https://github.com/Azure/MachineLearningNotebooks/tree/master/contrib/fairness)了解 Azure 机器学习中的更多公平性评估场景。
--- ---
## 🚀 挑战 ## 🚀 挑战
@ -193,22 +193,22 @@
观看本次研讨会,深入探讨以下主题: 观看本次研讨会,深入探讨以下主题:
- YouTube:人工智能系统中与公平相关的危害示例、评估和缓解Hanna Wallach和Miro Dudik[人工智能系统中与公平相关的危害:示例、评估和缓解-YouTube](https://www.youtube.com/watch?v=1RptHwfkx_k) - YouTube:人工智能系统中与公平相关的危害:示例、评估和缓解 Hanna Wallach Miro Dudik[人工智能系统中与公平相关的危害:示例、评估和缓解-YouTube](https://www.youtube.com/watch?v=1RptHwfkx_k)
另外,请阅读: 另外,请阅读:
- 微软RAI资源中心[负责人工智能资源-微软人工智能](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) - 微软RAI资源中心[负责人工智能资源-微软人工智能](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- 微软FATE研究小组[FATEAI 中的公平、问责、透明和道德-微软研究院](https://www.microsoft.com/research/theme/fate/) - 微软 FATE 研究小组:[FATEAI 中的公平、问责、透明和道德-微软研究院](https://www.microsoft.com/research/theme/fate/)
探索Fairlearn工具箱 探索 Fairlearn 工具箱
[Fairlearn](https://fairlearn.org/) [Fairlearn](https://fairlearn.org/)
了解Azure机器学习的工具以确保公平性 了解 Azure 机器学习的工具以确保公平性
- [Azure机器学习](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-15963-cxa) - [Azure 机器学习](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-15963-cxa)
## 任务 ## 任务
[探索Fairlearn](assignment.zh-cn.md) [探索 Fairlearn](assignment.zh-cn.md)

@ -83,7 +83,7 @@
🎓 **欠拟合**和**过拟合**是降低模型质量的常见问题,因为模型拟合得不够好或太好。这会导致模型做出与其训练数据过于紧密对齐或过于松散对齐的预测。 过拟合模型对训练数据的预测太好,因为它已经很好地了解了数据的细节和噪声。欠拟合模型并不准确,因为它既不能准确分析其训练数据,也不能准确分析尚未“看到”的数据。 🎓 **欠拟合**和**过拟合**是降低模型质量的常见问题,因为模型拟合得不够好或太好。这会导致模型做出与其训练数据过于紧密对齐或过于松散对齐的预测。 过拟合模型对训练数据的预测太好,因为它已经很好地了解了数据的细节和噪声。欠拟合模型并不准确,因为它既不能准确分析其训练数据,也不能准确分析尚未“看到”的数据。
![过拟合模型 ](../images/overfitting.png) ![过拟合模型 ](../images/overfitting.png)
> 作者[Jen Looper](https://twitter.com/jenlooper) > 作者 [Jen Looper](https://twitter.com/jenlooper)
## 参数调优 ## 参数调优

@ -1,8 +1,8 @@
# 开始使用Python和Scikit学习回归模型 # 开始使用 Python Scikit 学习回归模型
![回归](../../../sketchnotes/ml-regression.png) ![回归](../../../sketchnotes/ml-regression.png)
> 作者[Tomomi Imura](https://www.twitter.com/girlie_mac) > 作者 [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/9/) ## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/9/)
## 介绍 ## 介绍
@ -12,45 +12,45 @@
在本课中,你将学习如何: 在本课中,你将学习如何:
- 为本地机器学习任务配置你的计算机。 - 为本地机器学习任务配置你的计算机。
- 使用Jupyter notebooks。 - 使用 Jupyter notebooks。
- 使用Scikit-learn包括安装。 - 使用 Scikit-learn包括安装。
- 通过动手练习探索线性回归。 - 通过动手练习探索线性回归。
## 安装和配置 ## 安装和配置
[![在 Visual Studio Code中使用 Python](https://img.youtube.com/vi/7EXd4_ttIuw/0.jpg)](https://youtu.be/7EXd4_ttIuw "在 Visual Studio Code中使用 Python") [![在 Visual Studio Code 中使用 Python](https://img.youtube.com/vi/7EXd4_ttIuw/0.jpg)](https://youtu.be/7EXd4_ttIuw "在 Visual Studio Code 中使用 Python")
> 🎥 单击上图观看视频在VS Code中使用Python。 > 🎥 单击上图观看视频:在 VS Code 中使用 Python。
1. **安装 Python**。确保你的计算机上安装了[Python](https://www.python.org/downloads/)。你将在许多数据科学和机器学习任务中使用 Python。大多数计算机系统已经安装了Python。也有一些有用的[Python编码包](https://code.visualstudio.com/learn/educations/installers?WT.mc_id=academic-15963-cxa)可用于简化某些用户的设置。 1. **安装 Python**。确保你的计算机上安装了 [Python](https://www.python.org/downloads/)。你将在许多数据科学和机器学习任务中使用 Python。大多数计算机系统已经安装了 Python。也有一些有用的 [Python 编码包](https://code.visualstudio.com/learn/educations/installers?WT.mc_id=academic-15963-cxa) 可用于简化某些用户的设置。
然而Python的某些用法需要一个版本的软件而其他用法则需要另一个不同的版本。 因此,在[虚拟环境](https://docs.python.org/3/library/venv.html)中工作很有用。 然而Python 的某些用法需要一个版本的软件,而其他用法则需要另一个不同的版本。 因此,在 [虚拟环境](https://docs.python.org/3/library/venv.html) 中工作很有用。
2. **安装 Visual Studio Code**。确保你的计算机上安装了Visual Studio Code。按照这些说明[安装 Visual Studio Code](https://code.visualstudio.com/)进行基本安装。在本课程中你将在Visual Studio Code中使用Python因此你可能想复习如何[配置 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-15963-cxa)用于Python开发。 2. **安装 Visual Studio Code**。确保你的计算机上安装了 Visual Studio Code。按照这些说明 [安装 Visual Studio Code](https://code.visualstudio.com/) 进行基本安装。在本课程中,你将在 Visual Studio Code 中使用 Python因此你可能想复习如何 [配置 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-15963-cxa) 用于 Python 开发。
> 通过学习这一系列的 [学习模块](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-15963-cxa)熟悉Python > 通过学习这一系列的 [学习模块](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-15963-cxa) 熟悉 Python
3. **按照[这些说明]安装Scikit learn**(https://scikit-learn.org/stable/install.html )。由于你需要确保使用Python3因此建议你使用虚拟环境。注意如果你是在M1 Mac上安装这个库在上面链接的页面上有特别的说明。 3. **按照 [这些说明] 安装 Scikit learn**(https://scikit-learn.org/stable/install.html)。由于你需要确保使用 Python3因此建议你使用虚拟环境。注意如果你是在 M1 Mac 上安装这个库,在上面链接的页面上有特别的说明。
4. **安装Jupyter Notebook**。你需要[安装Jupyter包](https://pypi.org/project/jupyter/)。 4. **安装 Jupyter Notebook**。你需要 [安装 Jupyter ](https://pypi.org/project/jupyter/)。
## 你的ML工作环境 ## 你的 ML 工作环境
你将使用**notebooks**开发Python代码并创建机器学习模型。这种类型的文件是数据科学家的常用工具可以通过后缀或扩展名`.ipynb`来识别它们。 你将使用 **notebooks** 开发 Python 代码并创建机器学习模型。这种类型的文件是数据科学家的常用工具,可以通过后缀或扩展名 `.ipynb` 来识别它们。
Notebooks是一个交互式环境允许开发人员编写代码并添加注释并围绕代码编写文档这对于实验或面向研究的项目非常有帮助。 Notebooks 是一个交互式环境,允许开发人员编写代码并添加注释并围绕代码编写文档,这对于实验或面向研究的项目非常有帮助。
### 练习 - 使用notebook ### 练习 - 使用 notebook
1. 在Visual Studio Code中打开_notebook.ipynb_。 1. 在 Visual Studio Code 中打开 _notebook.ipynb_
Jupyter服务器将以python3+启动。你会发现notebook可以“运行”的区域、代码块。你可以通过选择看起来像播放按钮的图标来运行代码块。 Jupyter 服务器将以 python3+启动。你会发现 notebook 可以“运行”的区域、代码块。你可以通过选择看起来像播放按钮的图标来运行代码块。
2. 选择`md`图标并添加一点markdown输入文字 **# Welcome to your notebook**。 2. 选择 `md` 图标并添加一点 markdown输入文字 **# Welcome to your notebook**。
接下来添加一些Python代码。 接下来,添加一些 Python 代码。
1. 在代码块中输入**print("hello notebook")**。 1. 在代码块中输入 **print("hello notebook")**
2. 选择箭头运行代码。 2. 选择箭头运行代码。
@ -60,29 +60,29 @@ Notebooks是一个交互式环境允许开发人员编写代码并添加注
hello notebook hello notebook
``` ```
![打开notebook的VS Code](../images/notebook.png) ![打开 notebook VS Code](../images/notebook.png)
你可以为你的代码添加注释以便notebook可以自描述。 你可以为你的代码添加注释,以便 notebook 可以自描述。
✅ 想一想web开发人员的工作环境与数据科学家的工作环境有多大的不同。 ✅ 想一想 web 开发人员的工作环境与数据科学家的工作环境有多大的不同。
## 启动并运行Scikit-learn ## 启动并运行 Scikit-learn
现在Python已在你的本地环境中设置好并且你对Jupyter notebook感到满意让我们同样熟悉Scikit-learn在“science”中发音为“sci”。 Scikit-learn提供了[大量的API](https://scikit-learn.org/stable/modules/classes.html#api-ref)来帮助你执行ML任务。 现在 Python 已在你的本地环境中设置好,并且你对 Jupyter notebook 感到满意,让我们同样熟悉 Scikit-learn在“science”中发音为“sci”。 Scikit-learn 提供了 [大量的 API](https://scikit-learn.org/stable/modules/classes.html#api-ref) 来帮助你执行 ML 任务。
根据他们的[网站](https://scikit-learn.org/stable/getting_started.html)“Scikit-learn是一个开源机器学习库支持有监督和无监督学习。它还提供了各种模型拟合工具、数据预处理、模型选择和评估以及许多其他实用程序。” 根据他们的 [网站](https://scikit-learn.org/stable/getting_started.html)“Scikit-learn 是一个开源机器学习库,支持有监督和无监督学习。它还提供了各种模型拟合工具、数据预处理、模型选择和评估以及许多其他实用程序。”
在本课程中你将使用Scikit-learn和其他工具来构建机器学习模型以执行我们所谓的“传统机器学习”任务。我们特意避免了神经网络和深度学习因为它们在我们即将推出的“面向初学者的人工智能”课程中得到了更好的介绍。 在本课程中,你将使用 Scikit-learn 和其他工具来构建机器学习模型,以执行我们所谓的“传统机器学习”任务。我们特意避免了神经网络和深度学习,因为它们在我们即将推出的“面向初学者的人工智能”课程中得到了更好的介绍。
Scikit-learn使构建模型和评估它们的使用变得简单。它主要侧重于使用数字数据并包含几个现成的数据集用作学习工具。它还包括供学生尝试的预建模型。让我们探索加载预先打包的数据和使用内置的estimator first ML模型和Scikit-learn以及一些基本数据的过程。 Scikit-learn 使构建模型和评估它们的使用变得简单。它主要侧重于使用数字数据,并包含几个现成的数据集用作学习工具。它还包括供学生尝试的预建模型。让我们探索加载预先打包的数据和使用内置的 estimator first ML 模型和 Scikit-learn 以及一些基本数据的过程。
## 练习 - 你的第一个Scikit-learn notebook ## 练习 - 你的第一个 Scikit-learn notebook
> 本教程的灵感来自Scikit-learn网站上的[线性回归示例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 > 本教程的灵感来自 Scikit-learn 网站上的 [线性回归示例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。
在与本课程相关的 _notebook.ipynb_ 文件中,通过点击“垃圾桶”图标清除所有单元格。 在与本课程相关的 _notebook.ipynb_ 文件中,通过点击“垃圾桶”图标清除所有单元格。
在本节中你将使用一个关于糖尿病的小数据集该数据集内置于Scikit-learn中以用于学习目的。想象一下你想为糖尿病患者测试一种治疗方法。机器学习模型可能会帮助你根据变量组合确定哪些患者对治疗反应更好。即使是非常基本的回归模型在可视化时也可能会显示有助于组织理论临床试验的变量信息。 在本节中,你将使用一个关于糖尿病的小数据集,该数据集内置于 Scikit-learn 中以用于学习目的。想象一下,你想为糖尿病患者测试一种治疗方法。机器学习模型可能会帮助你根据变量组合确定哪些患者对治疗反应更好。即使是非常基本的回归模型,在可视化时,也可能会显示有助于组织理论临床试验的变量信息。
✅ 回归方法有很多种,你选择哪一种取决于你正在寻找的答案。如果你想预测给定年龄的人的可能身高,你可以使用线性回归,因为你正在寻找**数值**。如果你有兴趣了解某种菜肴是否应被视为素食主义者,那么你正在寻找**类别分配**,以便使用逻辑回归。稍后你将了解有关逻辑回归的更多信息。想一想你可以对数据提出的一些问题,以及这些方法中的哪一个更合适。 ✅ 回归方法有很多种,你选择哪一种取决于你正在寻找的答案。如果你想预测给定年龄的人的可能身高,你可以使用线性回归,因为你正在寻找**数值**。如果你有兴趣了解某种菜肴是否应被视为素食主义者,那么你正在寻找**类别分配**,以便使用逻辑回归。稍后你将了解有关逻辑回归的更多信息。想一想你可以对数据提出的一些问题,以及这些方法中的哪一个更合适。
@ -92,9 +92,9 @@ Scikit-learn使构建模型和评估它们的使用变得简单。它主要侧
对于此任务,我们将导入一些库: 对于此任务,我们将导入一些库:
- **matplotlib**。这是一个有用的[绘图工具](https://matplotlib.org/),我们将使用它来创建线图。 - **matplotlib**。这是一个有用的 [绘图工具](https://matplotlib.org/),我们将使用它来创建线图。
- **numpy**。 [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html)是一个有用的库用于在Python中处理数字数据。 - **numpy**。 [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) 是一个有用的库,用于在 Python 中处理数字数据。
- **sklearn**。这是Scikit-learn库。 - **sklearn**。这是 Scikit-learn 库。
导入一些库来帮助你完成任务。 导入一些库来帮助你完成任务。
@ -106,24 +106,24 @@ Scikit-learn使构建模型和评估它们的使用变得简单。它主要侧
from sklearn import datasets, linear_model, model_selection from sklearn import datasets, linear_model, model_selection
``` ```
在上面的代码中,你正在导入`matplottlib`、`numpy`,你正在从`sklearn`导入`datasets`、`linear_model`和`model_selection`。 `model_selection`用于将数据拆分为训练集和测试集。 在上面的代码中,你正在导入 `matplottlib`、`numpy`,你正在从 `sklearn` 导入 `datasets`、`linear_model` `model_selection``model_selection` 用于将数据拆分为训练集和测试集。
### 糖尿病数据集 ### 糖尿病数据集
内置的[糖尿病数据集](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)包含442个围绕糖尿病的数据样本具有10个特征变量其中包括 内置的 [糖尿病数据集](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) 包含 442 个围绕糖尿病的数据样本,具有 10 个特征变量,其中包括:
age岁数 age岁数
bmi体重指数 bmi体重指数
bp平均血压 bp平均血压
s1 tcT细胞一种白细胞 s1 tcT 细胞(一种白细胞)
✅ 该数据集包括“性别”的概念,作为对糖尿病研究很重要的特征变量。许多医学数据集包括这种类型的二元分类。想一想诸如此类的分类如何将人群的某些部分排除在治疗之外。 ✅ 该数据集包括“性别”的概念,作为对糖尿病研究很重要的特征变量。许多医学数据集包括这种类型的二元分类。想一想诸如此类的分类如何将人群的某些部分排除在治疗之外。
现在加载X和y数据。 现在,加载 X y 数据。
> 🎓 请记住这是监督学习我们需要一个命名为“y”的目标。 > 🎓 请记住这是监督学习我们需要一个命名为“y”的目标。
在新的代码单元中,通过调用`load_diabetes()`加载糖尿病数据集。输入`return_X_y=True`表示`X`将是一个数据矩阵,而`y`将是回归目标。 在新的代码单元中,通过调用 `load_diabetes()` 加载糖尿病数据集。输入 `return_X_y=True` 表示 `X` 将是一个数据矩阵,而`y`将是回归目标。
1. 添加一些打印命令来显示数据矩阵的形状及其第一个元素: 1. 添加一些打印命令来显示数据矩阵的形状及其第一个元素:
@ -133,9 +133,9 @@ s1 tcT细胞一种白细胞
print(X[0]) print(X[0])
``` ```
作为响应返回的是一个元组。你正在做的是将元组的前两个值分别分配给`X`和`y`。了解更多 [关于元组](https://wikipedia.org/wiki/Tuple)。 作为响应返回的是一个元组。你正在做的是将元组的前两个值分别分配给 `X` `y`。了解更多 [关于元组](https://wikipedia.org/wiki/Tuple)。
你可以看到这个数据有442个项目组成了10个元素的数组 你可以看到这个数据有 442 个项目,组成了 10 个元素的数组:
```text ```text
(442, 10) (442, 10)
@ -143,9 +143,9 @@ s1 tcT细胞一种白细胞
-0.04340085 -0.00259226 0.01990842 -0.01764613] -0.04340085 -0.00259226 0.01990842 -0.01764613]
``` ```
✅ 稍微思考一下数据和回归目标之间的关系。线性回归预测特征X和目标变量y之间的关系。你能在文档中找到糖尿病数据集的[目标](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)吗?鉴于该目标,该数据集展示了什么? ✅ 稍微思考一下数据和回归目标之间的关系。线性回归预测特征 X 和目标变量 y 之间的关系。你能在文档中找到糖尿病数据集的 [目标](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) 吗?鉴于该目标,该数据集展示了什么?
2. 接下来通过使用numpy的`newaxis`函数将其排列到一个新数组中来选择要绘制的该数据集的一部分。我们将使用线性回归根据它确定的模式在此数据中的值之间生成一条线。 2. 接下来,通过使用 numpy `newaxis` 函数将其排列到一个新数组中来选择要绘制的该数据集的一部分。我们将使用线性回归根据它确定的模式在此数据中的值之间生成一条线。
```python ```python
X = X[:, np.newaxis, 2] X = X[:, np.newaxis, 2]
@ -153,28 +153,28 @@ s1 tcT细胞一种白细胞
✅ 随时打印数据以检查其形状。 ✅ 随时打印数据以检查其形状。
3. 现在你已准备好绘制数据,你可以查看机器是否可以帮助确定此数据集中数字之间的逻辑分割。为此你需要将数据(X)和目标(y)拆分为测试集和训练集。Scikit-learn有一个简单的方法来做到这一点你可以在给定点拆分测试数据。 3. 现在你已准备好绘制数据,你可以查看机器是否可以帮助确定此数据集中数字之间的逻辑分割。为此你需要将数据 (X) 和目标 (y) 拆分为测试集和训练集。Scikit-learn 有一个简单的方法来做到这一点;你可以在给定点拆分测试数据。
```python ```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
``` ```
4. 现在你已准备好训练你的模型!加载线性回归模型并使用`model.fit()`使用X和y训练集对其进行训练 4. 现在你已准备好训练你的模型!加载线性回归模型并使用 `model.fit()` 使用 X y 训练集对其进行训练:
```python ```python
model = linear_model.LinearRegression() model = linear_model.LinearRegression()
model.fit(X_train, y_train) model.fit(X_train, y_train)
``` ```
`model.fit()`是一个你会在许多机器学习库(例如 TensorFlow中看到的函数 `model.fit()` 是一个你会在许多机器学习库(例如 TensorFlow中看到的函数
5. 然后,使用函数`predict()`,使用测试数据创建预测。这将用于绘制数据组之间的线 5. 然后,使用函数 `predict()`,使用测试数据创建预测。这将用于绘制数据组之间的线
```python ```python
y_pred = model.predict(X_test) y_pred = model.predict(X_test)
``` ```
6. 现在是时候在图中显示数据了。Matplotlib是完成此任务的非常有用的工具。创建所有X和y测试数据的散点图并使用预测在模型的数据分组之间最合适的位置画一条线。 6. 现在是时候在图中显示数据了。Matplotlib 是完成此任务的非常有用的工具。创建所有 X y 测试数据的散点图,并使用预测在模型的数据分组之间最合适的位置画一条线。
```python ```python
plt.scatter(X_test, y_test, color='black') plt.scatter(X_test, y_test, color='black')
@ -184,21 +184,23 @@ s1 tcT细胞一种白细胞
![显示糖尿病周围数据点的散点图](../images/scatterplot.png) ![显示糖尿病周围数据点的散点图](../images/scatterplot.png)
✅ 想一想这里发生了什么。一条直线穿过许多小数据点但它到底在做什么你能看到你应该如何使用这条线来预测一个新的、未见过的数据点对应的y轴值吗尝试用语言描述该模型的实际用途。 ✅ 想一想这里发生了什么。一条直线穿过许多小数据点,但它到底在做什么?你能看到你应该如何使用这条线来预测一个新的、未见过的数据点对应的 y 轴值吗?尝试用语言描述该模型的实际用途。
恭喜,你构建了第一个线性回归模型,使用它创建了预测,并将其显示在绘图中! 恭喜,你构建了第一个线性回归模型,使用它创建了预测,并将其显示在绘图中!
--- ---
## 🚀挑战 ## 🚀挑战
从这个数据集中绘制一个不同的变量。提示:编辑这一行:`X = X[:, np.newaxis, 2]`。鉴于此数据集的目标,你能够发现糖尿病作为一种疾病的进展情况吗? 从这个数据集中绘制一个不同的变量。提示:编辑这一行:`X = X[:, np.newaxis, 2]`。鉴于此数据集的目标,你能够发现糖尿病作为一种疾病的进展情况吗?
## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/10/) ## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/10/)
## 复习与自学 ## 复习与自学
在本教程中,你使用了简单线性回归,而不是单变量或多元线性回归。阅读一些关于这些方法之间差异的信息,或查看[此视频](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) 在本教程中,你使用了简单线性回归,而不是单变量或多元线性回归。阅读一些关于这些方法之间差异的信息,或查看 [此视频](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)
阅读有关回归概念的更多信息,并思考这种技术可以回答哪些类型的问题。用这个[教程](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-15963-cxa)加深你的理解。 阅读有关回归概念的更多信息,并思考这种技术可以回答哪些类型的问题。用这个 [教程](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-15963-cxa) 加深你的理解。
## 任务 ## 任务

@ -1,30 +1,30 @@
# 使用Scikit-learn构建回归模型准备和可视化数据 # 使用 Scikit-learn 构建回归模型:准备和可视化数据
> ![数据可视化信息图](../images/data-visualization.png) > ![数据可视化信息图](../images/data-visualization.png)
> 作者[Dasani Madipalli](https://twitter.com/dasani_decoded) > 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/11/) ## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/11/)
## 介绍 ## 介绍
既然你已经设置了开始使用Scikit-learn处理机器学习模型构建所需的工具你就可以开始对数据提出问题了。当你处理数据并应用ML解决方案时了解如何提出正确的问题以正确释放数据集的潜力非常重要。 既然你已经设置了开始使用 Scikit-learn 处理机器学习模型构建所需的工具你就可以开始对数据提出问题了。当你处理数据并应用ML解决方案时了解如何提出正确的问题以正确释放数据集的潜力非常重要。
在本课中,你将学习: 在本课中,你将学习:
- 如何为模型构建准备数据。 - 如何为模型构建准备数据。
- 如何使用Matplotlib进行数据可视化。 - 如何使用 Matplotlib 进行数据可视化。
## 对你的数据提出正确的问题 ## 对你的数据提出正确的问题
你需要回答的问题将决定你将使用哪种类型的ML算法。你得到的答案的质量将在很大程度上取决于你的数据的性质。 你需要回答的问题将决定你将使用哪种类型的 ML 算法。你得到的答案的质量将在很大程度上取决于你的数据的性质。
查看为本课程提供的[数据](../data/US-pumpkins.csv)。你可以在VS Code中打开这个.csv文件。快速浏览一下就会发现有空格还有字符串和数字数据的混合。还有一个奇怪的列叫做“Package”其中的数据是“sacks”、“bins”和其他值的混合。事实上数据有点乱。 查看为本课程提供的[数据](../data/US-pumpkins.csv)。你可以在 VS Code 中打开这个 .csv 文件。快速浏览一下就会发现有空格还有字符串和数字数据的混合。还有一个奇怪的列叫做“Package”其中的数据是“sacks”、“bins”和其他值的混合。事实上数据有点乱。
事实上获得一个完全准备好用于创建开箱即用的ML模型的数据集并不是很常见。在本课中你将学习如何使用标准Python库准备原始数据集。你还将学习各种技术来可视化数据。 事实上获得一个完全准备好用于创建开箱即用的ML模型的数据集并不是很常见。在本课中你将学习如何使用标准 Python 库准备原始数据集。你还将学习各种技术来可视化数据。
## 案例研究:“南瓜市场” ## 案例研究:“南瓜市场”
你将在`data`文件夹中找到一个名为[US-pumpkins.csv](../data/US-pumpkins.csv)的.csv 文件其中包含有关南瓜市场的1757行数据 按城市排序分组。这是从美国农业部分发的[特种作物终端市场标准报告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始数据。 你将在 `data` 文件夹中找到一个名为 [US-pumpkins.csv](../data/US-pumpkins.csv) .csv 文件,其中包含有关南瓜市场的 1757 行数据,已按城市排序分组。这是从美国农业部分发的[特种作物终端市场标准报告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始数据。
### 准备数据 ### 准备数据
@ -35,21 +35,22 @@
你对这些数据有什么看法?你已经看到了无法理解的字符串、数字、空格和奇怪值的混合体。 你对这些数据有什么看法?你已经看到了无法理解的字符串、数字、空格和奇怪值的混合体。
你可以使用回归技术对这些数据提出什么问题?“预测给定月份内待售南瓜的价格”怎么样?再次查看数据,你需要进行一些更改才能创建任务所需的数据结构。 你可以使用回归技术对这些数据提出什么问题?“预测给定月份内待售南瓜的价格”怎么样?再次查看数据,你需要进行一些更改才能创建任务所需的数据结构。
## 练习 - 分析南瓜数据 ## 练习 - 分析南瓜数据
让我们使用[Pandas](https://pandas.pydata.org/)“Python 数据分析”的意思)一个非常有用的工具,用于分析和准备南瓜数据。 让我们使用 [Pandas](https://pandas.pydata.org/)“Python 数据分析”的意思)一个非常有用的工具,用于分析和准备南瓜数据。
### 首先,检查遗漏的日期 ### 首先,检查遗漏的日期
你首先需要采取以下步骤来检查缺少的日期: 你首先需要采取以下步骤来检查缺少的日期:
1. 将日期转换为月份格式(这些是美国日期,因此格式为`MM/DD/YYYY`)。 1. 将日期转换为月份格式(这些是美国日期,因此格式为 `MM/DD/YYYY`)。
2. 将月份提取到新列。 2. 将月份提取到新列。
在 Visual Studio Code 中打开notebook.ipynb文件并将电子表格导入到新的Pandas dataframe中。 在 Visual Studio Code 中打开 notebook.ipynb 文件,并将电子表格导入到新的 Pandas dataframe 中。
1. 使用 `head()`函数查看前五行。 1. 使用 `head()` 函数查看前五行。
```python ```python
import pandas as pd import pandas as pd
@ -59,7 +60,7 @@
✅ 使用什么函数来查看最后五行? ✅ 使用什么函数来查看最后五行?
2. 检查当前dataframe中是否缺少数据 2. 检查当前 dataframe 中是否缺少数据:
```python ```python
pumpkins.isnull().sum() pumpkins.isnull().sum()
@ -67,7 +68,7 @@
有数据丢失,但可能对手头的任务来说无关紧要。 有数据丢失,但可能对手头的任务来说无关紧要。
3. 为了让你的dataframe更容易使用使用`drop()`删除它的几个列,只保留你需要的列: 3. 为了让你的 dataframe 更容易使用,使用 `drop()` 删除它的几个列,只保留你需要的列:
```python ```python
new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date'] new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date']
@ -76,9 +77,9 @@
### 然后,确定南瓜的平均价格 ### 然后,确定南瓜的平均价格
考虑如何确定给定月份南瓜的平均价格。你会为此任务选择哪些列提示你需要3列。 考虑如何确定给定月份南瓜的平均价格。你会为此任务选择哪些列?提示:你需要 3 列。
解决方案:取`Low Price`和`High Price`列的平均值来填充新的Price列将Date列转换成只显示月份。幸运的是根据上面的检查没有丢失日期或价格的数据。 解决方案:取 `Low Price` `High Price` 列的平均值来填充新的 Price 列,将 Date 列转换成只显示月份。幸运的是,根据上面的检查,没有丢失日期或价格的数据。
1. 要计算平均值,请添加以下代码: 1. 要计算平均值,请添加以下代码:
@ -89,25 +90,25 @@
``` ```
✅ 请随意使用`print(month)`打印你想检查的任何数据。 ✅ 请随意使用 `print(month)` 打印你想检查的任何数据。
2. 现在将转换后的数据复制到新的Pandas dataframe中 2. 现在,将转换后的数据复制到新的 Pandas dataframe 中:
```python ```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
``` ```
打印出的dataframe将向你展示一个干净整洁的数据集你可以在此数据集上构建新的回归模型。 打印出的 dataframe 将向你展示一个干净整洁的数据集,你可以在此数据集上构建新的回归模型。
### 但是等等!这里有点奇怪 ### 但是等等!这里有点奇怪
如果你看看`Package`(包装)一栏南瓜有很多不同的配置。有的以1 1/9蒲式耳的尺寸出售有的以1/2蒲式耳的尺寸出售有的以每只南瓜出售有的以每磅出售有的以不同宽度的大盒子出售。 如果你看看 `Package`(包装)一栏,南瓜有很多不同的配置。有的以 1 1/9 蒲式耳的尺寸出售,有的以 1/2 蒲式耳的尺寸出售,有的以每只南瓜出售,有的以每磅出售,有的以不同宽度的大盒子出售。
> 南瓜似乎很难统一称重方式 > 南瓜似乎很难统一称重方式
深入研究原始数据,有趣的是,任何`Unit of Sale`等于“EACH”或“PER BIN”的东西也具有每英寸、每箱或“每个”的`Package`类型。南瓜似乎很难采用统一称重方式,因此让我们通过仅选择`Package`列中带有字符串“蒲式耳”的南瓜来过滤它们。 深入研究原始数据,有趣的是,任何 `Unit of Sale` 等于“EACH”或“PER BIN”的东西也具有每英寸、每箱或“每个”的 `Package` 类型。南瓜似乎很难采用统一称重方式,因此让我们通过仅选择 `Package` 列中带有字符串“蒲式耳”的南瓜来过滤它们。
1. 在初始.csv导入下添加过滤器 1. 在初始 .csv 导入下添加过滤器:
```python ```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
@ -119,7 +120,7 @@
你是否注意到每行的蒲式耳数量不同?你需要对定价进行标准化,以便显示每蒲式耳的定价,因此请进行一些数学计算以对其进行标准化。 你是否注意到每行的蒲式耳数量不同?你需要对定价进行标准化,以便显示每蒲式耳的定价,因此请进行一些数学计算以对其进行标准化。
1. 在创建 new_pumpkins dataframe的代码块之后添加这些行 1. 在创建 new_pumpkins dataframe 的代码块之后添加这些行:
```python ```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
@ -139,23 +140,23 @@
可视化还可以帮助确定最适合数据的机器学习技术。例如,似乎沿着一条线的散点图表明该数据是线性回归练习的良好候选者。 可视化还可以帮助确定最适合数据的机器学习技术。例如,似乎沿着一条线的散点图表明该数据是线性回归练习的良好候选者。
一个在Jupyter notebooks中运行良好的数据可视化库是[Matplotlib](https://matplotlib.org/)(你在上一课中也看到过)。 一个在 Jupyter notebooks 中运行良好的数据可视化库是 [Matplotlib](https://matplotlib.org/)(你在上一课中也看到过)。
> 在[这些教程](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa)中获得更多数据可视化经验。 > 在[这些教程](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa)中获得更多数据可视化经验。
## 练习 - 使用 Matplotlib 进行实验 ## 练习 - 使用 Matplotlib 进行实验
尝试创建一些基本图形来显示你刚刚创建的新dataframe。基本线图会显示什么 尝试创建一些基本图形来显示你刚刚创建的新 dataframe。基本线图会显示什么
1. 在文件顶部导入Matplotlib 1. 在文件顶部导入 Matplotlib
```python ```python
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
``` ```
2. 重新刷新以运行整个notebook。 2. 重新刷新以运行整个 notebook。
3. 在notebook底部添加一个单元格以绘制数据 3. 在 notebook 底部,添加一个单元格以绘制数据:
```python ```python
price = new_pumpkins.Price price = new_pumpkins.Price
@ -172,7 +173,7 @@
### 让它有用 ### 让它有用
为了让图表显示有用的数据你通常需要以某种方式对数据进行分组。让我们尝试创建一个图其中y轴显示月份数据显示数据的分布。 为了让图表显示有用的数据,你通常需要以某种方式对数据进行分组。让我们尝试创建一个图,其中 y 轴显示月份,数据显示数据的分布。
1. 添加单元格以创建分组柱状图: 1. 添加单元格以创建分组柱状图:
@ -183,19 +184,19 @@
![显示价格与月份关系的柱状图](../images/barchart.png) ![显示价格与月份关系的柱状图](../images/barchart.png)
这是一个更有用的数据可视化似乎表明南瓜的最高价格出现在9月和10月。这符合你的期望吗为什么为什么不 这是一个更有用的数据可视化!似乎表明南瓜的最高价格出现在 9 月和 10 月。这符合你的期望吗?为什么?为什么不?
--- ---
## 🚀挑战 ## 🚀挑战
探索Matplotlib提供的不同类型的可视化。哪种类型最适合回归问题 探索 Matplotlib 提供的不同类型的可视化。哪种类型最适合回归问题?
## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/12/) ## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/12/)
## 复习与自学 ## 复习与自学
请看一下可视化数据的多种方法。列出各种可用的库并注意哪些库最适合给定类型的任务例如2D可视化与3D可视化。你发现了什么 请看一下可视化数据的多种方法。列出各种可用的库,并注意哪些库最适合给定类型的任务,例如 2D 可视化与 3D 可视化。你发现了什么?
## 任务 ## 任务

@ -1,19 +1,21 @@
# 使用Scikit-learn构建回归模型两种方式的回归 # 使用 Scikit-learn 构建回归模型:两种方式的回归
![线性与多项式回归信息图](../images/linear-polynomial.png) ![线性与多项式回归信息图](../images/linear-polynomial.png)
> 作者[Dasani Madipalli](https://twitter.com/dasani_decoded) > 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/13/) ## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/13/)
### 介绍 ### 介绍
到目前为止你已经通过从我们将在本课程中使用的南瓜定价数据集收集的样本数据探索了什么是回归。你还使用Matplotlib对其进行了可视化。 到目前为止,你已经通过从我们将在本课程中使用的南瓜定价数据集收集的样本数据探索了什么是回归。你还使用 Matplotlib 对其进行了可视化。
现在你已准备好深入研究ML的回归。 在本课中你将详细了解两种类型的回归_基本线性回归_和_多项式回归_以及这些技术背后的一些数学知识。 现在你已准备好深入研究 ML 的回归。 在本课中你将详细了解两种类型的回归_基本线性回归_和_多项式回归_以及这些技术背后的一些数学知识。
> 在整个课程中,我们假设数学知识最少,并试图让来自其他领域的学生也能接触到它,因此请使用笔记、🧮标注、图表和其他学习工具以帮助理解。 > 在整个课程中,我们假设数学知识最少,并试图让来自其他领域的学生也能接触到它,因此请使用笔记、🧮标注、图表和其他学习工具以帮助理解。
### 前提 ### 前提
你现在应该熟悉我们正在检查的南瓜数据的结构。你可以在本课的_notebook.ipynb_文件中找到它。 在这个文件中南瓜的价格显示在一个新的dataframe 中。确保可以在Visual Studio Code代码的内核中运行这些notebooks。 你现在应该熟悉我们正在检查的南瓜数据的结构。你可以在本课的 _notebook.ipynb_ 文件中找到它。 在这个文件中,南瓜的价格显示在一个新的 dataframe 中。确保可以在 Visual Studio Code 代码的内核中运行这些 notebooks。
### 准备 ### 准备
@ -21,16 +23,16 @@
- 什么时候买南瓜最好? - 什么时候买南瓜最好?
- 一箱微型南瓜的价格是多少? - 一箱微型南瓜的价格是多少?
- 我应该买半蒲式耳还是1 1/9蒲式耳 - 我应该买半蒲式耳还是 1 1/9 蒲式耳?
让我们继续深入研究这些数据。 让我们继续深入研究这些数据。
在上一课中你创建了一个Pandas dataframe并用原始数据集的一部分填充它按蒲式耳标准化定价。但是通过这样做你只能收集大约400个数据点而且只能收集秋季月份的数据。 在上一课中,你创建了一个 Pandas dataframe 并用原始数据集的一部分填充它,按蒲式耳标准化定价。但是,通过这样做,你只能收集大约 400 个数据点,而且只能收集秋季月份的数据。
看看我们在本课随附的notebook中预加载的数据。数据已预加载并绘制了初始散点图以显示月份数据。也许我们可以通过更多地清理数据来获得更多关于数据性质的细节。 看看我们在本课随附的 notebook 中预加载的数据。数据已预加载,并绘制了初始散点图以显示月份数据。也许我们可以通过更多地清理数据来获得更多关于数据性质的细节。
## 线性回归线 ## 线性回归线
正如你在第1课中学到的线性回归练习的目标是能够绘制一条线以便 正如你在第 1 课中学到的,线性回归练习的目标是能够绘制一条线以便:
- **显示变量关系**。 显示变量之间的关系 - **显示变量关系**。 显示变量之间的关系
- **作出预测**。 准确预测新数据点与该线的关系。 - **作出预测**。 准确预测新数据点与该线的关系。
@ -47,7 +49,7 @@
> Y = a + bX > Y = a + bX
> ``` > ```
> >
> `X`是“解释变量”。`Y`是“因变量”。直线的斜率是`b``a`是y轴截距指的是`X = 0`时`Y`的值。 > `X` 是“解释变量”。`Y` 是“因变量”。直线的斜率是`b``a`是y轴截距指的是`X = 0`时`Y`的值。
> >
>![计算斜率](../images/slope.png) >![计算斜率](../images/slope.png)
> >
@ -139,13 +141,14 @@ lin_pumpkins
415 rows × 2 columns 415 rows × 2 columns
``` ```
1. 现在你可以分配X和y坐标数据 1. 现在你可以分配 X y 坐标数据:
```python ```python
X = lin_pumpkins.values[:, :1] X = lin_pumpkins.values[:, :1]
y = lin_pumpkins.values[:, 1:2] y = lin_pumpkins.values[:, 1:2]
``` ```
✅ 这里发生了什么?你正在使用[Python slice notation](https://stackoverflow.com/questions/509211/understanding-slice-notation/509295#509295)来创建数组来填充`X`和`y`。
✅ 这里发生了什么?你正在使用 [Python slice notation](https://stackoverflow.com/questions/509211/understanding-slice-notation/509295#509295) 来创建数组来填充`X`和`y`。
2. 接下来,开始回归模型构建例程: 2. 接下来,开始回归模型构建例程:
@ -181,6 +184,7 @@ lin_pumpkins
plt.show() plt.show()
``` ```
![散点图显示包装与价格的关系](../images/linear.png) ![散点图显示包装与价格的关系](../images/linear.png)
4. 针对假设的品种测试模型: 4. 针对假设的品种测试模型:
@ -212,6 +216,7 @@ lin_pumpkins
多项式回归创建一条曲线以更好地拟合非线性数据。 多项式回归创建一条曲线以更好地拟合非线性数据。
1. 让我们重新创建一个填充了原始南瓜数据片段的dataframe 1. 让我们重新创建一个填充了原始南瓜数据片段的dataframe
```python ```python
new_columns = ['Variety', 'Package', 'City', 'Month', 'Price'] new_columns = ['Variety', 'Package', 'City', 'Month', 'Price']
poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns') poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
@ -221,29 +226,30 @@ lin_pumpkins
可视化dataframe中数据之间相关性的一种好方法是将其显示在“coolwarm”图表中 可视化dataframe中数据之间相关性的一种好方法是将其显示在“coolwarm”图表中
2. 使用`Background_gradient()`方法和`coolwarm`作为其参数值: 2. 使用 `Background_gradient()` 方法和 `coolwarm` 作为其参数值:
```python ```python
corr = poly_pumpkins.corr() corr = poly_pumpkins.corr()
corr.style.background_gradient(cmap='coolwarm') corr.style.background_gradient(cmap='coolwarm')
``` ```
这段代码创建了一个热图: 这段代码创建了一个热图:
![显示数据相关性的热图](../images/heatmap.png) ![显示数据相关性的热图](../images/heatmap.png)
查看此图表你可以直观地看到Package和Price之间的良好相关性。所以你应该能够创建一个比上一个更好的模型。 查看此图表,你可以直观地看到 Package Price 之间的良好相关性。所以你应该能够创建一个比上一个更好的模型。
### 创建管道 ### 创建管道
Scikit-learn包含一个用于构建多项式回归模型的有用API - `make_pipeline` [API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)。 创建了一个“管道”,它是一个估计器链。 在这种情况下,管道包括多项式特征或形成非线性路径的预测。 Scikit-learn 包含一个用于构建多项式回归模型的有用 API - `make_pipeline` [API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)。 创建了一个“管道”,它是一个估计器链。 在这种情况下,管道包括多项式特征或形成非线性路径的预测。
1. 构建X和y列 1. 构建 X y 列:
```python ```python
X=poly_pumpkins.iloc[:,3:4].values X=poly_pumpkins.iloc[:,3:4].values
y=poly_pumpkins.iloc[:,4:5].values y=poly_pumpkins.iloc[:,4:5].values
``` ```
2. 通过调用`make_pipeline()`方法创建管道: 2. 通过调用 `make_pipeline()` 方法创建管道:
```python ```python
from sklearn.preprocessing import PolynomialFeatures from sklearn.preprocessing import PolynomialFeatures
@ -260,7 +266,7 @@ Scikit-learn包含一个用于构建多项式回归模型的有用API - `make_pi
### 创建序列 ### 创建序列
此时你需要使用_排序好的_数据创建一个新的dataframe ,以便管道可以创建序列。 此时你需要使用_排序好的_数据创建一个新的 dataframe ,以便管道可以创建序列。
添加以下代码: 添加以下代码:
@ -276,7 +282,7 @@ Scikit-learn包含一个用于构建多项式回归模型的有用API - `make_pi
plt.show() plt.show()
``` ```
你通过调用`pd.DataFrame`创建了一个新的dataframe。然后通过调用`sort_values()`对值进行排序。最后你创建了一个多项式图: 你通过调用 `pd.DataFrame` 创建了一个新的 dataframe。然后通过调用 `sort_values()` 对值进行排序。最后你创建了一个多项式图:
![显示包装与价格关系的多项式图](../images/polynomial.png) ![显示包装与价格关系的多项式图](../images/polynomial.png)
@ -301,11 +307,12 @@ Scikit-learn包含一个用于构建多项式回归模型的有用API - `make_pi
我们可以输入一个新值并得到一个预测吗? 我们可以输入一个新值并得到一个预测吗?
调用`predict()`进行预测: 调用 `predict()` 进行预测:
```python ```python
pipeline.predict( np.array([ [2.75] ]) ) pipeline.predict( np.array([ [2.75] ]) )
``` ```
你会得到这样的预测: 你会得到这样的预测:
```output ```output
@ -317,15 +324,16 @@ Scikit-learn包含一个用于构建多项式回归模型的有用API - `make_pi
🏆 干得不错!你在一节课中创建了两个回归模型。在回归的最后一节中,你将了解逻辑回归以确定类别。 🏆 干得不错!你在一节课中创建了两个回归模型。在回归的最后一节中,你将了解逻辑回归以确定类别。
--- ---
## 🚀挑战 ## 🚀挑战
在此notebook中测试几个不同的变量以查看相关性与模型准确性的对应关系。 在此 notebook 中测试几个不同的变量,以查看相关性与模型准确性的对应关系。
## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/14/) ## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/14/)
## 复习与自学 ## 复习与自学
在本课中我们学习了线性回归。还有其他重要的回归类型。了解Stepwise、Ridge、Lasso和Elasticnet技术。学习更多信息的好课程是[斯坦福统计学习课程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) 在本课中,我们学习了线性回归。还有其他重要的回归类型。了解 Stepwise、Ridge、Lasso Elasticnet 技术。学习更多信息的好课程是 [斯坦福统计学习课程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## 任务 ## 任务

@ -1,7 +1,8 @@
# 逻辑回归预测分类 # 逻辑回归预测分类
![逻辑与线性回归信息图](../images/logistic-linear.png) ![逻辑与线性回归信息图](../images/logistic-linear.png)
> 作者[Dasani Madipalli](https://twitter.com/dasani_decoded) > 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/15/) ## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/15/)
## 介绍 ## 介绍
@ -38,7 +39,8 @@
逻辑回归不提供与线性回归相同的功能。前者提供关于二元类别“橙色或非橙色”的预测而后者能够预测连续值例如给定南瓜的起源和收获时间_其价格将上涨多少_。 逻辑回归不提供与线性回归相同的功能。前者提供关于二元类别“橙色或非橙色”的预测而后者能够预测连续值例如给定南瓜的起源和收获时间_其价格将上涨多少_。
![南瓜分类模型](../images/pumpkin-classifier.png) ![南瓜分类模型](../images/pumpkin-classifier.png)
> 作者[Dasani Madipalli](https://twitter.com/dasani_decoded) > 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
### 其他分类 ### 其他分类
还有其他类型的逻辑回归,包括多项和有序: 还有其他类型的逻辑回归,包括多项和有序:
@ -47,7 +49,7 @@
- **有序**涉及有序类别如果我们想对我们的结果进行逻辑排序非常有用例如我们的南瓜按有限数量的大小mini、sm、med、lg、xl、xxl排序。 - **有序**涉及有序类别如果我们想对我们的结果进行逻辑排序非常有用例如我们的南瓜按有限数量的大小mini、sm、med、lg、xl、xxl排序。
![多项式与有序回归](../images/multinomial-ordinal.png) ![多项式与有序回归](../images/multinomial-ordinal.png)
> 作者[Dasani Madipalli](https://twitter.com/dasani_decoded) > 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
### 仍然是线性的 ### 仍然是线性的
@ -89,11 +91,11 @@
### 可视化 - 并列网格 ### 可视化 - 并列网格
到现在为止,你已经再次使用南瓜数据加载了[starter notebook](./notebook.ipynb)并对其进行了清理,以保留包含一些变量(包括`Color`的数据集。让我们使用不同的库来可视化notebook中的数据帧[Seaborn](https://seaborn.pydata.org/index.html)它是基于我们之前使用的Matplotlib构建的。 到现在为止,你已经再次使用南瓜数据加载了 [starter notebook](./notebook.ipynb) 并对其进行了清理,以保留包含一些变量(包括 `Color`)的数据集。让我们使用不同的库来可视化 notebook 中的数据帧:[Seaborn](https://seaborn.pydata.org/index.html),它是基于我们之前使用的 Matplotlib 构建的。
Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可以比较并列网格中每个点的数据分布。 Seaborn 提供了一些巧妙的方法来可视化你的数据。例如,你可以比较并列网格中每个点的数据分布。
1. 通过实例化一个`PairGrid`,使用我们的南瓜数据`new_pumpkins`,然后调用`map()`来创建这样一个网格: 1. 通过实例化一个 `PairGrid`,使用我们的南瓜数据 `new_pumpkins`,然后调用 `map()` 来创建这样一个网格:
```python ```python
import seaborn as sns import seaborn as sns
@ -112,7 +114,7 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
由于颜色是一个二元类别(橙色或非橙色),它被称为“分类数据”,需要一种更[专业的方法](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)来可视化。还有其他方法可以可视化此类别与其他变量的关系。 由于颜色是一个二元类别(橙色或非橙色),它被称为“分类数据”,需要一种更[专业的方法](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)来可视化。还有其他方法可以可视化此类别与其他变量的关系。
你可以使用Seaborn图并列可视化变量。 你可以使用 Seaborn 图并列可视化变量。
1. 尝试使用“分类散点”图来显示值的分布: 1. 尝试使用“分类散点”图来显示值的分布:
@ -126,7 +128,7 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
“小提琴”类型的图很有用,因为你可以轻松地可视化两个类别中数据的分布方式。小提琴图不适用于较小的数据集,因为分布显示得更“平滑”。 “小提琴”类型的图很有用,因为你可以轻松地可视化两个类别中数据的分布方式。小提琴图不适用于较小的数据集,因为分布显示得更“平滑”。
1. 作为参数`x=Color`、`kind="violin"`并调用`catplot()` 1. 作为参数 `x=Color`、`kind="violin"` 并调用 `catplot()`
```python ```python
sns.catplot(x="Color", y="Item Size", sns.catplot(x="Color", y="Item Size",
@ -135,7 +137,7 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
![小提琴图](../images/violin.png) ![小提琴图](../images/violin.png)
✅ 尝试使用其他变量创建此图和其他Seaborn图。 ✅ 尝试使用其他变量创建此图和其他 Seaborn 图。
现在我们已经了解了颜色的二元类别与更大的尺寸组之间的关系,让我们探索逻辑回归来确定给定南瓜的可能颜色。 现在我们已经了解了颜色的二元类别与更大的尺寸组之间的关系,让我们探索逻辑回归来确定给定南瓜的可能颜色。
@ -145,13 +147,13 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
> >
> ![逻辑函数](../images/sigmoid.png) > ![逻辑函数](../images/sigmoid.png)
> >
> 其中sigmoid的中点位于x的0点L是曲线的最大值k是曲线的陡度。如果函数的结果大于0.5则所讨论的标签将被赋予二进制选择的类“1”。否则它将被分类为“0”。 > 其中 sigmoid 的中点位于 x 0 L 是曲线的最大值k 是曲线的陡度。如果函数的结果大于 0.5则所讨论的标签将被赋予二进制选择的类“1”。否则它将被分类为“0”。
## 建立你的模型 ## 建立你的模型
在Scikit-learn中构建模型来查找这些二元分类非常简单。 Scikit-learn 中构建模型来查找这些二元分类非常简单。
1. 选择要在分类模型中使用的变量,并调用`train_test_split()`拆分训练集和测试集: 1. 选择要在分类模型中使用的变量,并调用 `train_test_split()` 拆分训练集和测试集:
```python ```python
from sklearn.model_selection import train_test_split from sklearn.model_selection import train_test_split
@ -165,7 +167,7 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
``` ```
2. 现在你可以训练你的模型,用你的训练数据调用`fit()`,并打印出它的结果: 2. 现在你可以训练你的模型,用你的训练数据调用 `fit()`,并打印出它的结果:
```python ```python
from sklearn.model_selection import train_test_split from sklearn.model_selection import train_test_split
@ -181,7 +183,7 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
print('Accuracy: ', accuracy_score(y_test, predictions)) print('Accuracy: ', accuracy_score(y_test, predictions))
``` ```
看看你的模型的记分板。考虑到你只有大约1000行数据这还不错 看看你的模型的记分板。考虑到你只有大约 1000 行数据,这还不错:
```output ```output
precision recall f1-score support precision recall f1-score support
@ -249,9 +251,10 @@ Seaborn提供了一些巧妙的方法来可视化你的数据。例如你可
🎓 加权平均值:计算每个标签的平均指标,通过按支持度(每个标签的真实实例数)加权来考虑标签不平衡。 🎓 加权平均值:计算每个标签的平均指标,通过按支持度(每个标签的真实实例数)加权来考虑标签不平衡。
✅ 如果你想让你的模型减少假阴性的数量,你能想出应该关注哪个指标吗? ✅ 如果你想让你的模型减少假阴性的数量,你能想出应该关注哪个指标吗?
## 可视化该模型的ROC曲线
这不是一个糟糕的模型它的准确率在80%范围内,因此理想情况下,你可以使用它来预测给定一组变量的南瓜颜色。 ## 可视化该模型的 ROC 曲线
这不是一个糟糕的模型;它的准确率在 80% 范围内,因此理想情况下,你可以使用它来预测给定一组变量的南瓜颜色。
让我们再做一个可视化来查看所谓的“ROC”分数 让我们再做一个可视化来查看所谓的“ROC”分数
@ -264,23 +267,27 @@ fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
sns.lineplot([0, 1], [0, 1]) sns.lineplot([0, 1], [0, 1])
sns.lineplot(fpr, tpr) sns.lineplot(fpr, tpr)
``` ```
再次使用Seaborn绘制模型的[接收操作特性](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc)或ROC。 ROC曲线通常用于根据分类器的真假阳性来了解分类器的输出。“ROC曲线通常具有Y轴上的真阳性率和X轴上的假阳性率。” 因此,曲线的陡度以及中点线与曲线之间的空间很重要:你需要一条快速向上并越过直线的曲线。在我们的例子中,一开始就有误报,然后这条线正确地向上和重复:
再次使用 Seaborn绘制模型的[接收操作特性](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc)或 ROC。 ROC 曲线通常用于根据分类器的真假阳性来了解分类器的输出。“ROC 曲线通常具有 Y 轴上的真阳性率和 X 轴上的假阳性率。” 因此,曲线的陡度以及中点线与曲线之间的空间很重要:你需要一条快速向上并越过直线的曲线。在我们的例子中,一开始就有误报,然后这条线正确地向上和重复:
![ROC](../images/ROC.png) ![ROC](../images/ROC.png)
最后使用Scikit-learn的[`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score)来计算实际“曲线下面积”AUC 最后,使用 Scikit-learn 的[`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) 来计算实际“曲线下面积”AUC
```python ```python
auc = roc_auc_score(y_test,y_scores[:,1]) auc = roc_auc_score(y_test,y_scores[:,1])
print(auc) print(auc)
``` ```
结果是`0.6976998904709748`。 鉴于AUC的范围从0到1你需要一个高分因为预测100%正确的模型的AUC为1在这种情况下模型_相当不错_。
结果是 `0.6976998904709748`。 鉴于 AUC 的范围从 0 到 1你需要一个高分因为预测 100% 正确的模型的 AUC 为 1在这种情况下模型_相当不错_。
在以后的分类课程中,你将学习如何迭代以提高模型的分数。但是现在,恭喜!你已经完成了这些回归课程! 在以后的分类课程中,你将学习如何迭代以提高模型的分数。但是现在,恭喜!你已经完成了这些回归课程!
--- ---
## 🚀挑战 ## 🚀挑战
关于逻辑回归,还有很多东西需要解开!但最好的学习方法是实验。找到适合此类分析的数据集并用它构建模型。你学到了什么?小贴士:尝试[Kaggle](https://kaggle.com)获取有趣的数据集。 关于逻辑回归,还有很多东西需要解开!但最好的学习方法是实验。找到适合此类分析的数据集并用它构建模型。你学到了什么?小贴士:尝试 [Kaggle](https://kaggle.com) 获取有趣的数据集。
## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/16/) ## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/16/)

@ -1,58 +1,58 @@
# 构建使用ML模型的Web应用程序 # 构建使用 ML 模型的 Web 应用程序
在本课中你将在一个数据集上训练一个ML模型这个数据集来自世界各地过去一个世纪的UFO目击事件来源于[NUFORC的数据库](https://www.nuforc.org)。 在本课中,你将在一个数据集上训练一个 ML 模型,这个数据集来自世界各地:过去一个世纪的 UFO 目击事件,来源于 [NUFORC 的数据库](https://www.nuforc.org)。
你将学会: 你将学会:
- 如何“pickle”一个训练有素的模型 - 如何“pickle”一个训练有素的模型
- 如何在Flask应用程序中使用该模型 - 如何在 Flask 应用程序中使用该模型
我们将继续使用notebook来清理数据和训练我们的模型但你可以进一步探索在web应用程序中使用模型。 我们将继续使用 notebook 来清理数据和训练我们的模型,但你可以进一步探索在 web 应用程序中使用模型。
为此你需要使用Flask构建一个web应用程序。 为此,你需要使用 Flask 构建一个 web 应用程序。
## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/17/) ## [课前测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/17/)
## 构建应用程序 ## 构建应用程序
有多种方法可以构建Web应用程序以使用机器学习模型。你的web架构可能会影响你的模型训练方式。想象一下你在一家企业工作其中数据科学小组已经训练了他们希望你在应用程序中使用的模型。 有多种方法可以构建 Web 应用程序以使用机器学习模型。你的 web 架构可能会影响你的模型训练方式。想象一下,你在一家企业工作,其中数据科学小组已经训练了他们希望你在应用程序中使用的模型。
### 注意事项 ### 注意事项
你需要问很多问题: 你需要问很多问题:
- **它是web应用程序还是移动应用程序**如果你正在构建移动应用程序或需要在物联网环境中使用模型,你可以使用[TensorFlow Lite](https://www.tensorflow.org/lite/)并在Android或iOS应用程序中使用该模型。 - **它是 web 应用程序还是移动应用程序?** 如果你正在构建移动应用程序或需要在物联网环境中使用模型,你可以使用 [TensorFlow Lite](https://www.tensorflow.org/lite/) 并在 Android iOS 应用程序中使用该模型。
- **模型放在哪里?**在云端还是本地? - **模型放在哪里?** 在云端还是本地?
- **离线支持**。该应用程序是否必须离线工作? - **离线支持**。该应用程序是否必须离线工作?
- **使用什么技术来训练模型?**所选的技术可能会影响你需要使用的工具。 - **使用什么技术来训练模型?** 所选的技术可能会影响你需要使用的工具。
- **使用Tensor flow**。例如如果你正在使用TensorFlow训练模型则该生态系统提供了使用[TensorFlow.js](https://www.tensorflow.org/js/)转换TensorFlow模型以便在Web应用程序中使用的能力。 - **使用 TensorFlow**。例如,如果你正在使用 TensorFlow 训练模型,则该生态系统提供了使用 [TensorFlow.js](https://www.tensorflow.org/js/) 转换 TensorFlow 模型以便在Web应用程序中使用的能力。
- **使用 PyTorch**。如果你使用[PyTorch](https://pytorch.org/)等库构建模型,则可以选择将其导出到[ONNX](https://onnx.ai/)(开放神经网络交换)格式,用于可以使用 [Onnx Runtime](https://www.onnxruntime.ai/)的JavaScript Web 应用程序。此选项将在Scikit-learn-trained模型的未来课程中进行探讨。 - **使用 PyTorch**。如果你使用 [PyTorch](https://pytorch.org/) 等库构建模型,则可以选择将其导出到 [ONNX](https://onnx.ai/)(开放神经网络交换)格式,用于可以使用 [Onnx Runtime](https://www.onnxruntime.ai/)的JavaScript Web 应用程序。此选项将在 Scikit-learn-trained 模型的未来课程中进行探讨。
- **使用Lobe.ai或Azure自定义视觉**。如果你使用ML SaaS软件即服务系统例如[Lobe.ai](https://lobe.ai/)或[Azure Custom Vision](https://azure.microsoft.com/services/ cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa)来训练模型这种类型的软件提供了为许多平台导出模型的方法包括构建一个定制API供在线应用程序在云中查询。 - **使用 Lobe.ai Azure 自定义视觉**。如果你使用 ML SaaS软件即服务系统例如 [Lobe.ai](https://lobe.ai/) [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-15963-cxa) 来训练模型这种类型的软件提供了为许多平台导出模型的方法包括构建一个定制A PI供在线应用程序在云中查询。
你还有机会构建一个完整的Flask Web应用程序该应用程序能够在 Web浏览器中训练模型本身。这也可以在JavaScript上下文中使用 TensorFlow.js来完成。 你还有机会构建一个完整的 Flask Web 应用程序,该应用程序能够在 Web浏览器中训练模型本身。这也可以在 JavaScript 上下文中使用 TensorFlow.js 来完成。
出于我们的目的既然我们一直在使用基于Python的notebook那么就让我们探讨一下将经过训练的模型从notebook导出为Python构建的web应用程序可读的格式所需要采取的步骤。 出于我们的目的,既然我们一直在使用基于 Python notebook那么就让我们探讨一下将经过训练的模型从 notebook 导出为 Python 构建的 web 应用程序可读的格式所需要采取的步骤。
## 工具 ## 工具
对于此任务你需要两个工具Flask和Pickle它们都在Python上运行。 对于此任务你需要两个工具Flask Pickle它们都在 Python 上运行。
✅ 什么是 [Flask](https://palletsprojects.com/p/flask/) Flask被其创建者定义为“微框架”它提供了使用Python和模板引擎构建网页的Web框架的基本功能。看看[本学习单元](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-15963-cxa)练习使用Flask构建应用程序。 ✅ 什么是 [Flask](https://palletsprojects.com/p/flask/) Flask 被其创建者定义为“微框架”,它提供了使用 Python 和模板引擎构建网页的 Web 框架的基本功能。看看[本学习单元](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-15963-cxa)练习使用 Flask 构建应用程序。
✅ 什么是[Pickle](https://docs.python.org/3/library/pickle.html) Pickle🥒是一 Python模块用于序列化和反序列化 Python对象结构。当你“pickle”一个模型时你将其结构序列化或展平以在 Web上使用。小心pickle本质上不是安全的所以如果提示“un-pickle”文件请小心。生产的文件具有后缀`.pkl`。 ✅ 什么是 [Pickle](https://docs.python.org/3/library/pickle.html) Pickle🥒是一 Python 模块,用于序列化和反序列化 Python 对象结构。当你“pickle”一个模型时你将其结构序列化或展平以在 Web 上使用。小心pickle 本质上不是安全的所以如果提示“un-pickle”文件请小心。生产的文件具有后缀 `.pkl`
## 练习 - 清理你的数据 ## 练习 - 清理你的数据
在本课中,你将使用由 [NUFORC](https://nuforc.org)(国家 UFO 报告中心收集的80,000次UFO目击数据。这些数据对UFO目击事件有一些有趣的描述例如 在本课中,你将使用由 [NUFORC](https://nuforc.org)(国家 UFO 报告中心)收集的 80,000 UFO 目击数据。这些数据对 UFO 目击事件有一些有趣的描述,例如:
- **详细描述**。"一名男子从夜间照射在草地上的光束中出现,他朝德克萨斯仪器公司的停车场跑去"。 - **详细描述**。"一名男子从夜间照射在草地上的光束中出现,他朝德克萨斯仪器公司的停车场跑去"。
- **简短描述**。 “灯光追着我们”。 - **简短描述**。 “灯光追着我们”。
[ufos.csv](./data/ufos.csv)电子表格包括有关目击事件发生的`city`、`state`和`country`、对象的`shape`及其`latitude`和`longitude`的列。 [ufos.csv](./data/ufos.csv) 电子表格包括有关目击事件发生的 `city`、`state` `country`、对象的 `shape` 及其 `latitude` `longitude` 的列。
在包含在本课中的空白[notebook](notebook.ipynb)中: 在包含在本课中的空白 [notebook](notebook.ipynb) 中:
1. 像在之前的课程中一样导入`pandas`、`matplotlib`和`numpy`然后导入ufos电子表格。你可以查看一个示例数据集 1. 像在之前的课程中一样导入 `pandas`、`matplotlib` `numpy`,然后导入 ufos 电子表格。你可以查看一个示例数据集:
```python ```python
import pandas as pd import pandas as pd
@ -62,7 +62,7 @@
ufos.head() ufos.head()
``` ```
2. 将ufos数据转换为带有新标题的小dataframe。检查`country`字段中的唯一值。 2. 将 ufos 数据转换为带有新标题的小 dataframe。检查 `country` 字段中的唯一值。
```python ```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
@ -70,7 +70,7 @@
ufos.Country.unique() ufos.Country.unique()
``` ```
3. 现在你可以通过删除任何空值并仅导入1-60秒之间的目击数据来减少我们需要处理的数据量 3. 现在,你可以通过删除任何空值并仅导入 1-60 秒之间的目击数据来减少我们需要处理的数据量:
```python ```python
ufos.dropna(inplace=True) ufos.dropna(inplace=True)
@ -80,9 +80,9 @@
ufos.info() ufos.info()
``` ```
4. 导入Scikit-learn的`LabelEncoder`库,将国家的文本值转换为数字: 4. 导入 Scikit-learn `LabelEncoder` 库,将国家的文本值转换为数字:
✅ LabelEncoder按字母顺序编码数据 ✅ LabelEncoder 按字母顺序编码数据
```python ```python
from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import LabelEncoder
@ -107,7 +107,7 @@
现在,你可以通过将数据划分为训练和测试组来准备训练模型。 现在,你可以通过将数据划分为训练和测试组来准备训练模型。
1. 选择要训练的三个特征作为X向量y向量将是`Country` 你希望能够输入`Seconds`、`Latitude`和`Longitude`并获得要返回的国家/地区ID。 1. 选择要训练的三个特征作为 X 向量y 向量将是 `Country` 你希望能够输入 `Seconds`、`Latitude` `Longitude` 并获得要返回的国家/地区 ID。
```python ```python
from sklearn.model_selection import train_test_split from sklearn.model_selection import train_test_split
@ -134,13 +134,13 @@
print('Accuracy: ', accuracy_score(y_test, predictions)) print('Accuracy: ', accuracy_score(y_test, predictions))
``` ```
准确率还不错**(大约 95%**,不出所料,因为`Country`和`Latitude/Longitude`相关。 准确率还不错 **(大约 95%**,不出所料,因为 `Country` `Latitude/Longitude` 相关。
你创建的模型并不是非常具有革命性,因为你应该能够从其`Latitude`和`Longitude`推断出`Country`但是尝试从清理、导出的原始数据进行训练然后在web应用程序中使用此模型是一个很好的练习。 你创建的模型并不是非常具有革命性,因为你应该能够从其 `Latitude` `Longitude` 推断出 `Country`,但是,尝试从清理、导出的原始数据进行训练,然后在 web 应用程序中使用此模型是一个很好的练习。
## 练习 - “pickle”你的模型 ## 练习 - “pickle”你的模型
现在是时候_pickle_你的模型了你可以在几行代码中做到这一点。一旦它是 _pickled_加载你的pickled模型并针对包含秒、纬度和经度值的示例数据数组对其进行测试 现在,是时候 _pickle_ 你的模型了!你可以在几行代码中做到这一点。一旦它是 _pickled_,加载你的 pickled 模型并针对包含秒、纬度和经度值的示例数据数组对其进行测试,
```python ```python
import pickle import pickle
@ -151,15 +151,15 @@ model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]])) print(model.predict([[50,44,-12]]))
``` ```
该模型返回**'3'**,这是英国的国家代码。👽 该模型返回 **'3'**,这是英国的国家代码。👽
## 练习 - 构建Flask应用程序 ## 练习 - 构建Flask应用程序
现在你可以构建一个Flask应用程序来调用你的模型并返回类似的结果但以一种更美观的方式。 现在你可以构建一个Flask应用程序来调用你的模型并返回类似的结果但以一种更美观的方式。
1. 首先在你的 _ufo-model.pkl_ 文件所在的_notebook.ipynb_文件旁边创建一个名为**web-app**的文件夹。 1. 首先在你的 _ufo-model.pkl_ 文件所在的 _notebook.ipynb_ 文件旁边创建一个名为 **web-app** 的文件夹。
2. 在该文件夹中创建另外三个文件夹:**static**,其中有文件夹**css**和**templates`**。 你现在应该拥有以下文件和目录 2. 在该文件夹中创建另外三个文件夹:**static**,其中有文件夹 **css** **templates**。 你现在应该拥有以下文件和目录
```output ```output
web-app/ web-app/
@ -172,7 +172,7 @@ print(model.predict([[50,44,-12]]))
✅ 请参阅解决方案文件夹以查看已完成的应用程序 ✅ 请参阅解决方案文件夹以查看已完成的应用程序
3. 在_web-app_文件夹中创建的第一个文件是**requirements.txt**文件。与JavaScript应用程序中的_package.json_一样此文件列出了应用程序所需的依赖项。在**requirements.txt**中添加以下几行: 3. 在 _web-app_ 文件夹中创建的第一个文件是 **requirements.txt** 文件。与 JavaScript 应用程序中的 _package.json_ 一样,此文件列出了应用程序所需的依赖项。在 **requirements.txt** 中添加以下几行:
```text ```text
scikit-learn scikit-learn
@ -181,13 +181,13 @@ print(model.predict([[50,44,-12]]))
flask flask
``` ```
4. 现在进入web-app文件夹 4. 现在,进入 web-app 文件夹:
```bash ```bash
cd web-app cd web-app
``` ```
5. 在你的终端中输入`pip install`以安装_reuirements.txt_中列出的库 5. 在你的终端中输入 `pip install`,以安装 _reuirements.txt_ 中列出的库:
```bash ```bash
pip install -r requirements.txt pip install -r requirements.txt
@ -195,11 +195,11 @@ print(model.predict([[50,44,-12]]))
6. 现在,你已准备好创建另外三个文件来完成应用程序: 6. 现在,你已准备好创建另外三个文件来完成应用程序:
1. 在根目录中创建**app.py** 1. 在根目录中创建 **app.py**
2. 在_templates_目录中创建**index.html**。 2. 在 _templates_ 目录中创建**index.html**。
3. 在_static/css_目录中创建**styles.css**。 3. 在 _static/css_ 目录中创建**styles.css**。
7. 使用一些样式构建_styles.css_文件 7. 使用一些样式构建 _styles.css_ 文件:
```css ```css
body { body {
@ -233,7 +233,7 @@ print(model.predict([[50,44,-12]]))
} }
``` ```
8. 接下来构建_index.html_文件 8. 接下来,构建 _index.html_ 文件:
```html ```html
<!DOCTYPE html> <!DOCTYPE html>
@ -268,9 +268,9 @@ print(model.predict([[50,44,-12]]))
</html> </html>
``` ```
看看这个文件中的模板。请注意应用程序将提供的变量周围的“mustache”语法例如预测文本`{{}}`。还有一个表单可以将预测发布到`/predict`路由。 看看这个文件中的模板。请注意应用程序将提供的变量周围的“mustache”语法例如预测文本`{{}}`。还有一个表单可以将预测发布到 `/predict` 路由。
最后你已准备好构建使用模型和显示预测的python 文件: 最后,你已准备好构建使用模型和显示预测的 python 文件:
9. 在`app.py`中添加: 9. 在`app.py`中添加:
@ -309,30 +309,30 @@ print(model.predict([[50,44,-12]]))
app.run(debug=True) app.run(debug=True)
``` ```
> 💡 提示当你在使用Flask运行Web应用程序时添加 [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode)时你对应用程序所做的任何更改将立即反映,无需重新启动服务器。注意!不要在生产应用程序中启用此模式 > 💡 提示:当你在使用 Flask 运行 Web 应用程序时添加 [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode)时你对应用程序所做的任何更改将立即反映,无需重新启动服务器。注意!不要在生产应用程序中启用此模式
如果你运行`python app.py`或`python3 app.py` - 你的网络服务器在本地启动你可以填写一个简短的表格来回答你关于在哪里看到UFO的问题 如果你运行 `python app.py` `python3 app.py` - 你的网络服务器在本地启动,你可以填写一个简短的表格来回答你关于在哪里看到 UFO 的问题!
在此之前,先看一下`app.py`的实现: 在此之前,先看一下 `app.py` 的实现:
1. 首先,加载依赖项并启动应用程序。 1. 首先,加载依赖项并启动应用程序。
2. 然后,导入模型。 2. 然后,导入模型。
3. 然后在home路由上渲染index.html。 3. 然后,在 home 路由上渲染 index.html。
在`/predict`路由上,当表单被发布时会发生几件事情: `/predict` 路由上,当表单被发布时会发生几件事情:
1. 收集表单变量并转换为numpy数组。然后将它们发送到模型并返回预测。 1. 收集表单变量并转换为 numpy 数组。然后将它们发送到模型并返回预测。
2. 我们希望显示的国家/地区根据其预测的国家/地区代码重新呈现为可读文本并将该值发送回index.html以在模板中呈现。 2. 我们希望显示的国家/地区根据其预测的国家/地区代码重新呈现为可读文本,并将该值发送回 index.html 以在模板中呈现。
以这种方式使用模型包括Flask和pickled模型是相对简单的。最困难的是要理解数据是什么形状的这些数据必须发送到模型中才能得到预测。这完全取决于模型是如何训练的。有三个数据要输入以便得到一个预测。 以这种方式使用模型,包括 Flask pickled 模型,是相对简单的。最困难的是要理解数据是什么形状的,这些数据必须发送到模型中才能得到预测。这完全取决于模型是如何训练的。有三个数据要输入,以便得到一个预测。
在一个专业的环境中你可以看到训练模型的人和在Web或移动应用程序中使用模型的人之间的良好沟通是多么的必要。在我们的情况下只有一个人 在一个专业的环境中,你可以看到训练模型的人和在 Web 或移动应用程序中使用模型的人之间的良好沟通是多么的必要。在我们的情况下,只有一个人,你!
--- ---
## 🚀 挑战: ## 🚀 挑战
你可以在Flask应用程序中训练模型而不是在notebook上工作并将模型导入Flask应用程序尝试在notebook中转换Python代码可能是在清除数据之后从应用程序中的一个名为`train`的路径训练模型。采用这种方法的利弊是什么? 你可以在 Flask 应用程序中训练模型,而不是在 notebook 上工作并将模型导入 Flask 应用程序!尝试在 notebook 中转换 Python 代码,可能是在清除数据之后,从应用程序中的一个名为 `train` 的路径训练模型。采用这种方法的利弊是什么?
## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/18/) ## [课后测](https://white-water-09ec41f0f.azurestaticapps.net/quiz/18/)

Loading…
Cancel
Save