当前位置:首页 >新闻 >篮球新闻 / 阿森纳VS巴黎圣日耳曼直播_阿森纳VS巴黎圣日耳曼免费直播在线直播

篮球新闻

阿森纳VS巴黎圣日耳曼直播_阿森纳VS巴黎圣日耳曼免费直播在线直播

24直播网 2026-05-26 07:00:41 篮球新闻
原文:TowardsDa

阿森纳VS巴黎圣日耳曼直播_阿森纳VS巴黎圣日耳曼免费直播在线直播

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

原文:https://towardsdatascience.com/simple-fun-python-project-for-halloween-ff93bbd072ad?source=collection_archive---------22-----------------------

由 Unsplash 上ukasz niecioruk拍摄的照片

在今天的文章中,我们将通过一个简单而有趣的项目来了解 python 编程的一些基础知识。本文的后续部分也提供了完整的代码。

由于 10 月 31 日是许多国家庆祝的万圣节,我认为用我编的有趣的“不给糖就捣蛋”游戏来学习一些 python 编程是个好主意。

在我们进一步讨论问题陈述和我们今天将构建的简单有趣的游戏之前,让我们了解一下我们将在本文中试图实现的一些基本目标以及您可以期待的内容。

下面的 gif 代表了我们的项目的一部分,这将是我们在这个项目中建立的两只乌龟之间的小比赛

作者截图

本文旨在更好地理解函数,并在享受构建简单项目的过程中学习编程。我们将使用一些很酷的库,如 turtle 模块和 Google 文本到语音模块来构建这个项目,并获得更多关于这些库的知识。

不要担心,如果你不知道这些,因为我将触及所有的基本要求,在一个简单详细的方式,对这个项目的完整理解。

你给用户一个选择的机会——不给糖就捣蛋。如果选择请客,那么你只需展示一只海龟到达终点,获胜的话你会得到一块饼干。图像,以及语音记录,需要建议胜利的奖励。如果选择的是一个诡计,那么用户可以在两个可用的海龟上下注。因此,用户有 50%的机会赢得蛋糕奖励,否则他得不到任何奖励。

如果你想让问题陈述更复杂一点,那么你也可以增加这一行。

如果用户失去了第一个 50%的机会,还可以添加石头、纸、剪刀游戏的附加 else 情况,以向用户提供赢得游戏的更高机会。

解决这个问题的方法很简单。我们将使用两个函数,即 trick()和 treat()。我们将为用户提供一个输入选项,要么选择安全对待()并赢得一个 cookie,要么选择通过选择 trick()来赢得更大的蛋糕奖励。

选择 treat()选项后,我们将有一只乌龟在乌龟图形窗口上运行,并为用户检索奖励。该选项将是一个无风险的选择,用户可以做出并获得一个 cookie 作为奖励。然而,如果用户想要更大的回报,并想冒一些风险,那么我们有 trick()选择可用。

trick()选项将允许用户在两只乌龟之间进行选择,即红色或蓝色。无论你赌哪个海龟,都是你的选择。如果你选择的乌龟赢了比赛,你会得到一个蛋糕作为奖励。但是如果你选择的海龟没有赢,你就没有奖励。(另一个选择是石头、布、剪刀游戏,我之前建议给用户另一个机会。)

每当你赢了,无论是一块饼干还是一块蛋糕,图像都会相应地显示出来,而且你还会从计算机那里得到一个声音响应,表明你已经成功地赢得了游戏。对于失败的情况,您也可以有一个备选的响应。

turtle 模块是一个有趣的图形模块,主要用于初级程序员向他们介绍 Python 编程的世界。python 中的 turtle 模块允许用户在图形窗口上绘图,还可以添加一些乌龟来构建一个令人愉快的项目。

在这篇文章中,我将简要介绍海龟模块。我还将详细介绍其他模块。gTTS 模块已经在另一篇文章中广泛讨论过了,如果您刚刚开始使用它,我强烈推荐您阅读这篇文章。首先,我将简要介绍一下简单的模块。

枕头(PIL)图书馆进口的图像功能,将用于显示图像的胜利。这些是将作为奖励展示的饼干和蛋糕的图像。如果您愿意,也可以使用 open-cv 模块来实现这一目的。

playsound 模块用于播放将由 gTTS 模块保存的录音。您也可以使用 python 中的 OS 模块来完成相同的任务,如果您在安装 playsound 模块时遇到困难,这是首选。然而,当我尝试播放声音时,我不喜欢额外的 VLC 或默认媒体播放器打开,这就是我使用 playsound 模块的原因。

随机模块用于随机生成给定范围内的数字。对于这个项目来说,只有关于随机模块的那么多信息就足够了。然而,我强烈建议您查看比例抽样指南,以了解关于该模块的更多细节。

[## 分步指南:使用 Python 进行数据科学的比例采样!

了解使用 python 进行数据科学所需的比例采样的概念和实现…

towardsdatascience.com](/step-by-step-guide-proportional-sampling-for-data-science-with-python-8b2871159ae6)

因为我还没有在其他地方介绍过海龟模块,所以这正是我在这篇文章中要做的事情。别担心,这只是你需要知道的一些事情。我将只检查这个项目所需的要点。你可以从官方文档中了解更多信息。

()—沿着乌龟前进的方向,将乌龟向前移动指定的距离。向后() —将乌龟向后移动距离,与乌龟前进的方向相反。不要改变海龟的方向。右() —将乌龟向右旋转角度单位。(默认情况下,单位为度)。left() —将乌龟向左旋转角度单位。

penup() —向上拉笔,即移动时不绘图。pendown() —向下拉笔,即边移动边画。write() —根据 align ("left “、” center "或 right ")和给定的字体,在当前海龟位置按照’ arg '的字符串表示形式书写文本。exitonclick() —将 bye()方法绑定到屏幕上的鼠标点击。

颜色() —给你的乌龟一个特定的颜色。pencolor() —为绘图的笔赋予特定的颜色。

最后,我们将转移到这个项目所需的最终谷歌文本到语音模块。

文本到语音(TTS)是将单词转换成音频形式的过程。程序、工具或软件从用户处获取输入文本,使用自然语言处理方法,理解所用语言的语言学,并对数据进行逻辑推理。

该处理后的文本进入下一个块,在那里对处理后的文本数据进行数字信号处理。通过使用许多算法和转换,这个处理过的文本最终被转换成语音格式。这整个过程包括语音合成。下面是解释相同内容的文章的链接。

[## 如何使用 Python 开始使用 Google 文本到语音转换

从零开始的文本到语音转换简介

towardsdatascience.com](/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544)

Python 提供了广泛的库模块和框架,使其成为构建机器学习模型和从事数据科学项目最兼容的语言之一。除了所使用的标准库之外,本文旨在提供一些很酷的模块,供您的机器学习和数据科学项目使用。如果你们有兴趣了解更多关于其他模块的内容,我强烈推荐你们去看看。

[## 5+独特的 Python 模块,用于创建脱颖而出的机器学习和数据科学项目!

超过 5 个酷 Python 库模块的指南,用于创建令人敬畏的机器学习和数据科学项目。

towardsdatascience.com](/5-unique-python-modules-for-creating-machine-learning-and-data-science-projects-that-stand-out-a890519de3ae)

我的代码有两个功能。我将利用第一个函数对与 treat()选项相关的所有想法进行编码。第二个函数将针对与技巧选择相关的所有想法进行完整编码。

创建 treat 函数相当简单。我们将只画一条简单的跑道,一只红色的乌龟将参加比赛,并为主人拿到巧克力作为奖励。这可以通过下面的代码块来完成:

观察上面的代码块,并尝试解释这里到底发生了什么。我们正在为我们的海龟画一条跑道,并定义设置参数,这样跑道就建在图形窗口屏幕的中心。红海龟的位置在赛道的中心。

一旦海龟完成比赛,系统会提示你点击屏幕来结束图形窗口界面的运行。只要您点击屏幕,您就会收到祝贺您获得奖励的音频响应,并显示您赢得的 cookie 的图像。

下面是将为此项目显示的 cookie 的图像。我在代码块中将它重命名为“Cookies.jpg”。如果您想运行相同的程序,那么您也应该考虑这样做。

照片由梅姆在 Unsplash 上拍摄

让我们以类似的方式编写下一个 trick()函数。

trick()函数将有一个参数,即用户选择的选项。默认颜色为红色,但是用户可以根据自己的喜好自由选择红色或蓝色的乌龟。

下面是实现特技功能的完整代码块。

trick()函数类似于 treat()函数。主要的区别是使用两只乌龟而不是一只。我们正在为我们的海龟画一条跑道,并定义好参数,这样跑道就在图形窗口的中心了。红海龟和蓝海龟的位置被放置在赛道中心附近。

当一只海龟越过终点线时,比赛就停止了。获胜的海龟将第一个冲过终点线。我们将计算每只海龟走过的总距离,谁走的距离更长,谁就赢得比赛。

我现在将对上面的代码执行一次测试。我选的乌龟是“红色”

让比赛开始吧!

作者截图

计算表明,红色显然赢得了比赛,因此,由于我选择的选项也是红色,那么蛋糕的奖励也将呈现给我!

下面的图像和一个祝贺的音频响应消息被提供给这个胜利案例的用户。

大卫·霍利菲尔德在 Unsplash 上拍摄的照片

这个项目植入的最终代码块是要给用户的选择选项。

第一个选择是不给糖就捣蛋。如果选择了特技选项,那么用户有两个选择。他们可以相应地选择红色或蓝色的海龟。

下面是这个实现的代码块以及一个示例输出。

上面显示的示例输出是用户选择选项 1 的运行之一。第一个选项是 trick()函数,它会提示你选择一只海龟。如前所述,获胜的海龟会显示各自的输出。

让我们了解一些可以对这个简单项目进行的进一步改进。

本文中展示的项目是一个非常基础的入门项目。这个“不给糖就捣蛋”的项目可以做很多改进。下面是一些有助于使项目更酷、更创新的改进:

如前所述,您可以自由地试验 else 的情况。你可以像选择另一个游戏一样添加各种选项,或者只是添加一个额外的命令,表明拒绝。我强烈建议用 pygame 或 Tkinter 等其他模块来尝试项目的变体,以使它在图形和视觉上更吸引观众。另一个更高级方法的建议是致力于构建深度学习或强化学习模型,以实现更好的结果。改造项目,并加入你自己的想法,使其更加复杂和有趣。项目的部署,以确保它达到更广泛的受众。

由 Riccardo Chiarini 在 Unsplash 拍摄的照片

学习编程的最好方法是享受和欣赏它的美丽。我们开发了一个简单的“不给糖就捣蛋”的游戏,理解了这项任务所需的一些模块,并对功能有了更多的了解。

我在这个项目中使用的方法和分析非常简单明了。它是以一种直观的方式来理解建立这个简单的游戏的基础。

提高编程语言效率的最好方法之一是改编和构建更多的游戏。你在娱乐的同时学习新的概念。所以这是一个双赢的局面!

查看其他一些可能对您的编程之旅有用的文章!

[## 用代码和例子理解 Python 中的高级函数!

详细了解 python 中的匿名函数和高级函数及其实际应用…

towardsdatascience.com](/understanding-advanced-functions-in-python-with-codes-and-examples-2e68bbb04094) [## 机器学习和数据科学项目的 10 步终极指南!

详细讨论构建您的机器学习和数据科学项目的最佳方法…

towardsdatascience.com](/10-step-ultimate-guide-for-machine-learning-and-data-science-projects-ed61ae9aa301) [## 2020 年及以后最受欢迎的 10 种编程语言

讨论当今 10 种最流行的编程语言的范围、优缺点

towardsdatascience.com](/10-most-popular-programming-languages-for-2020-and-beyond-67c512eeea73)

谢谢你们坚持到最后。我希望你们喜欢阅读这篇文章。我希望你们都有美好的一天!

原文:https://towardsdatascience.com/simple-guide-to-choropleth-maps-bcddd45d74ed?source=collection_archive---------62-----------------------

Ashkan Forouzani 在 Unsplash 上的照片

这里有一个使用 Python 中的 Plotly 图形库绘制 Choropleth 地图的简单教程。

我从 世卫组织仪表盘 得到灵感,想自己实现一个。

事实证明这很容易做到,虽然这篇文章不是我通常的随机数据集系列的一部分,但像这样学习数据可视化技能,对于数据科学家交流见解非常重要。

让我们直接进入教程。

你可以从 世卫组织站点 下载数据集,但是要注意有很多特殊字符要删除。

此外,一些国家,如库拉索岛、圣巴泰勒米岛、留尼汪岛等。,格式不正确。因此,在将 CSV 文件导入熊猫数据框架之前,有大量的清理工作要做。

你可以跳过上面的麻烦,下载我已经清理过的数据集 的 ,但是这可能意味着在将来你决定为自己实现本教程的任何时候,数据都不是最新的。

既然您已经自己清理了数据集,或者已经下载了预处理过的数据集,下一步就是导入这个数据集。

我们将删除一些不需要绘图的列。

使用 Plotly 图形库绘制 Choropleth 地图非常容易。

我们必须创建一个数据对象,其中包含每个国家及其感染/死亡人数的实际信息,并创建一个布局对象来查看图表。

有 2 个 choropleth 图;一个追踪全世界的感染人数,另一个显示 COVID 死亡人数。

COVID 19 感染计数。作者 GIF

在中型文章中直接嵌入交互式 Plotly 可视化不再有效,所以我捕捉了一张我在不同国家上空盘旋的 gif 图,向你展示地图的样子。您可以通过点击下面的链接来查看交互式可视化。

[## COVID 19:全球感染计数| choropleth 由 Shrad09 | plotly 制作

编辑描述

plotly.com](https://plotly.com/~shrad09/1/)

这是你绘制这张地图的方法。

用同样的方法绘制世界各地的死亡率。

COVID 19 伤亡人数。作者 GIF。

再一次,点击下面的链接,你可以随意地玩这个交互式可视化游戏。

[## COVID 19:全球死亡人数| choropleth 由 Shrad09 | plotly 制作

编辑描述

plotly.com](https://plotly.com/~shrad09/3/)

这就对了。以下是如何用一种简单的方式绘制 Choropleths 地图。要记住的重要一点是以易于绘制的方式设置数据集。

如果你自己已经实现了一个,并且想弄清楚如何在媒体上嵌入你的交互式可视化,你可以看看这篇文章。

希望你觉得这个教程有用和有趣。可以看看我的其他 文章 有趣的机器学习教程和 我的 GitHub repo。

非常感谢您的阅读,我们很快会再见的!

原文:https://towardsdatascience.com/simple-guide-to-solving-bayes-theorem-problems-a594edc3e245?source=collection_archive---------39-----------------------

照片由 Unsplash 上的尼克·费因斯拍摄

先说贝叶斯定理。贝叶斯定理是一个简单的概率公式,既通用又强大。它一直被誉为机器学习和数据科学中的热门新事物,直到神经网络出现并扮演了金·卡戴珊和贝叶斯的帕丽斯·希尔顿。与其他机器学习技术相比,贝叶斯定理特别有趣的是,公式本身已经有近 200 年的历史,而其他形式的机器学习通常有一个,比如说更年轻的年份。

概率可能是一个令人困惑的领域,你必须有足够的心智能力,能够在头脑中摆弄一些数字,以便能够解决一些更基本的问题。今天,我们将深入一个简单的方法来解决基本的贝叶斯定理问题。

让我们来谈谈我们将要谈论的话题,嗯?贝叶斯定理是由英国长老会牧师托马斯·贝叶斯在 1763 年创立的。你们中的许多人可能会惊讶地听到神职人员负责,但在 20 世纪之前的几个世纪里,神职人员在很大程度上负责数学和科学的进步。遗传学的创始人格雷戈尔·孟德尔本人就是奥古斯丁修会的修士和修道院院长。

现在,贝叶斯定理作为一种方法被提出,通过这种方法,先前事件的知识将增加人们描述该事件或相关事件再次发生的概率的能力。例如,教科书中常见的一个例子是,如果健康问题的风险通常随着年龄的增长而增加,那么贝叶斯定理的应用允许我们更准确地评估已知年龄的个体的健康风险。如果你读了我之前关于朴素贝叶斯的文章,你就会知道这是怎么回事了。让我们看看公式,好吗?

好了,这似乎很容易。我们需要做的就是找到 P(B|A),P(A)和 P(B)的概率,把它们代入,瞧,我们就有了计算结果!现在,如果有更简单的方法来做这件事呢?如果你对概率的走向感到困惑怎么办?如果应用题是你的敌人怎么办?该死的,这是数学,不是阅读理解!

为什么在不需要的时候做数学?— Yi Shuen Lim

让我们来看看解决贝叶斯定理的潜在替代方法,当你看到它时,将允许你理解问题的所有方面。我们将使用我在熨斗中遇到的一个问题,因为我不是数学老师,也没有人付钱让我做数学题。

托马斯想要一只新的小狗。

他可以选择从宠物店或动物收容所得到他的新小狗。他去宠物店的概率是 0.2。

他可以选择得到一只大、中或小的小狗。

如果他去宠物店,他得到一只小狗的概率是 0.6。他得到一只中型小狗的概率是 0.3,他得到一只大型小狗的概率是 0.1。

如果他去动物收容所,他得到一只小狗的概率是 0.1。他得到一只中型小狗的概率是 0.35,他得到一只大型小狗的概率是 0.55。

1。托马斯得到一只小狗的概率有多大?

2。鉴于他得到了一只大型小狗,托马斯去宠物店的概率是多少?

3。假设托马斯有一只小狗,他去宠物店还是去动物收容所的可能性更大?

所以对于这个问题,我们将使用另一种方法来计算公式。我们打算种树。树是伟大的,它们帮助我们分解问题,并把它重铸成一个清晰和容易理解的格式。所以我们开始画吧!我们要做的第一件事是画出我们树的基本分支。

嘣。我们已经有效地将这个单词问题分解成它的结构组件,并以一种易于理解的格式展示出来。我们从托马斯和他去宠物店或收容所的决定开始,然后一旦在宠物店或收容所,我们将进一步的决定细分为小型,中型或大型狗。下一步是输入我们的概率。

看到我做了什么吗?现在我们已经得到了这个问题中给我们的概率,并把它们放在我们的树上。我们知道托马斯有 20%的概率去宠物店,到了那里有 60%的概率得到一只小狗,30%的概率得到一只中号狗,10%的概率得到一只大型犬。同样的情况也适用于 80%的概率,他去收容所和相关的概率为小型,中型和大型狗。还要注意,每个交叉点上的这些概率的总和是 100%,因为我们不能有超过 100%的概率,而小于 100%的总概率意味着还有另一种选择。如果你得到了一个单词问题的不完整信息,知道这一点是很有用的。

现在,我们来看第一个问题。

托马斯得到一只小狗的概率有多大?

为了解决这个问题,我们需要确定托马斯在宠物店或收容所得到一只小狗的所有概率。我们只需要将概率相乘,然后将它们相加,如下所示:

沿着红色箭头的路线,我们追踪了托马斯的路线,他先是去了宠物店或收容所,然后在那里得到了一只小狗。为了找到所有可能购买小狗的概率,我们采用收容所或宠物店的概率,然后乘以相应的购买小狗的概率。然后我们把那些加在一起,求出托马斯买小狗的概率的答案!通过简单地跟踪树中的分支,我们能够跟踪必要的概率,并将它们组合起来以找到所有小狗的情况。

现在让我们超越自我,完成所有概率的计算:

太好了!现在我们有了一个现成答案的适当框架,准备回答关于托马斯选择的任何问题。如果我们想知道托马斯得到一只大狗的概率会怎样?好吧,让我们回头看看我们的树。宠物店大型犬有 0.02 的概率,收容所大型犬有 0.44 的概率。我们把这些加在一起,大狗的概率是. 46!

现在进入第二个问题。

假设托马斯得到了一只大狗,他去宠物店的概率是多少?

嗯,这确实是一个贝叶斯问题。如果我们把这个公式写出来,它会是这样的:

多亏了我们的树,我们不必绞尽脑汁去计算 P(大)需要构造什么样的概率。让我们回头参考我们的树来找到所需的组件。

因此,我们的公式看起来像这样:

这给了我们 .04347!

现在,进入最后一个问题!

假设托马斯得到了一只小狗,他去宠物店还是去动物收容所的可能性更大?

这个有点棘手。给定小型犬,P(宠物店|小型犬)和 P(收容所|小型犬)哪个更高?在这种情况下,我们将不得不重复公式,但两次,并确定哪个更高。

为了简化事情,我给你你需要的变量:

对于 P(宠物店|小狗):

P(小狗|宠物店)= .60

P(宠物店)= .20

P(小狗)= .20

对于 P(收容所|小型犬):

P(小型犬|收容所)= .10

P(收容所)= .80

P(小型犬)= .20

现在把这些代入贝叶斯定理,看看我们会得到什么数字?

以下是答案:

P(宠物店|小狗)= .60

P(收容所|小狗)= .40

由于 P(宠物店|小狗)比 P(收容所|小狗)大,鉴于托马斯给自己弄了一只小狗,托马斯去宠物店领狗的可能性更大!

我希望你今天离开的时候,对贝叶斯定理的工作原理有了更好的理解,并且在面对这样的概率问题时,有了更多的安慰。视觉上分解事物几乎总是能帮助一个人理解他们所面临的情况,我认为这里的树对我们的理解有很大的帮助。这种方法的伟大之处在于,它几乎可以无限扩展,让你可以找到解决每个问题所需的概率。我将留给你们一个我在维基百科上找到的问题。自己建树,看自己能不能答出来!

假设我们有一个测试大麻使用的药物测试。现在,这种测试有 90%的真实阳性率,也就是说,90%的时候,它会检测到一个大麻使用者。它也有 80%的真实阴性率,即 80%的时间它将确认一个人没有使用大麻。不幸的是,它也会产生 20%的误报。考虑到所有接受测试的人中有 5%是大麻使用者,那么使用这种测试的大麻测试呈阳性的人是真正的大麻使用者的概率是多少?我给你一个开始的提示,你的树的第一个分支应该是大麻使用者。

玩得开心!

原文:https://towardsdatascience.com/simple-image-classification-with-cnn-using-tensorflow-for-beginners-b96a24be4f87?source=collection_archive---------50-----------------------

资料来源:Unsplash 作者 Tran Mau Tri Tam

图像分类不再是一个困难的话题。Tensorflow 拥有所有内置的功能,为我们处理复杂的数学问题。在不知道神经网络细节的情况下,我们现在可以使用神经网络。在今天的项目中,我使用了卷积神经网络(CNN ),它是神经网络的高级版本。它把一幅画浓缩成一些重要的特征。如果您使用包含衬衫、鞋子和手袋等的 FashionMNIST 数据集。美国有线电视新闻网将找出图像的重要部分。例如,如果你看到一个鞋带,它可能是一只鞋,如果有一个衣领和纽扣,那可能是一件衬衫,如果有一个把手,那可能是一个手提包。

我们今天将构建的简单 CNN 将对一组图像进行分类,它将由卷积和池组成。输入在卷积层中进行修改。您可以根据需要放置一个或多个卷积。输入经过几个过滤器,这些过滤器对输入进行切片,以学习输入的一些部分,例如衬衫的纽扣、手提包的把手或鞋子的鞋带。我今天不打算在这方面深入探讨。因为这篇文章是写给初学者的。

联营是 CNN 的另一个非常重要的部分。池像卷积一样在每个局部区域上工作,但是它们没有过滤器,并且是向量到标量的转换。简单地计算该区域的平均值,识别具有最高强度的像素,并消除其余的像素。2 x 2 池会将要素地图的大小减少一半。即使你不知道其中的数学部分,你仍然可以解决一个深度学习问题。我会解释每一行代码。如今,我们有如此丰富的库来执行所有这些惊人的工作,甚至不需要了解太多的数学或编码。让我们开始吧。

我用的是谷歌 Colab 笔记本。如果你没有安装 anaconda 和 Jupiter 笔记本,你仍然可以在上面工作。每个人都可以使用谷歌的 collaboratory 笔记本。youtube 上有很多学习如何使用 Google Colab 的视频。如果你不知道 Google Colab,请随时查看。我们将使用包含猫和狗的图像的数据集。我们的目标是开发一个卷积神经网络,它将成功地从一张图片中对猫和狗进行分类。我们用的是 Kaggle 的数据集。

首先导入所有需要的包和库。

是时候获取我们的数据集了。我们将使用名为“wget”的函数将数据集放入笔记本中。只是提醒一下,一旦你的 Google Collab 笔记本的会话结束,你必须再次导入数据集。让我们下载完整的 Cats-v-Dogs 数据集,将其存储为 cats-and-dogs.zip,并保存在名为“tmp”的目录中。

现在从 zip 文件夹中提取数据,这将生成一个名为“temp/PetImages”的目录,其中有两个子目录,分别名为 Cat 和 Dog。这就是数据最初的结构。

让我们检查猫和狗的文件夹。

由于数据可用,现在我们需要创建一个名为 cats-v-dogs 的目录和子目录 training and testing。

现在,为训练和测试拆分数据,用函数 split_data 将数据放在正确的目录中。Split_data 采用包含文件的源目录、数据切片将被复制到的训练目录、剩余数据将被复制到的测试目录以及分割数据的 split_size。

下面的代码块检查剩余文件的长度,并将它们放在测试目录中。

功能就绪。使用 split_data 函数拆分源目录的数据,并将它们复制到培训和测试目录。

检查培训和测试目录的长度。 清水鼓动预测

数据预处理完成。有趣的部分来了。我们将开发一个 Keras 模型来对猫和狗进行分类。在这个模型中,我们将使用三个卷积层和一个池层。你可以用更少或更多的卷积层来尝试。我们将使用一个激活函数和 input_shape 150 x 150。这个 input_shape 会将所有的图像重新塑造成这个相同的正方形。否则,现实世界中的图像将会有不同的大小和形状。在第一层中,我们的过滤器尺寸是 3×3,过滤器的数量是 16。最大池化 2 x 2 将像素浓缩 2 倍。我们还有两层不同数量的过滤器。您可以添加额外的“Conv2D”和“MaxPooling2D”层来观察结果。

在编译函数中,我们至少应该传递优化器和损失参数。这里学习率是 0.001。选择合理的学习速度很重要。学习率太小和太大都会使网络效率低下。下一步是标准化数据。

ImageDataGenerator 有助于规范化像素值,使其介于 0 和 1 之间。您可能已经知道,最初的值可以是 0 到 255。然后我们批量传递我们的数据进行训练。在这里,我们提供的批量大小为 20。我们需要以同样的方式将测试数据标准化:

现在训练模型。让我们用 15 个纪元来训练它。请随意测试更多或更少的纪元。你应该跟踪 4 个参数。损失、准确性、验证损失和验证准确性。随着每个时代的到来,损耗应该下降,精度应该上升。

我在训练集上获得了 89.51%的准确率,在验证数据上获得了 91.76%的准确率。这里不得不提一件事。也就是说,如果训练集的精度非常高,而测试集或验证集的精度不是很好,这就是过拟合问题。这意味着模型很好地学习了训练数据集,它只知道训练数据很好,它对其他看不见的数据不好。但这不是我们的目标。我们的目标是开发一个对大部分数据集都有好处的模型。当您看到过度拟合时,您需要修改训练参数。大概是纪元数少,学习率不同。我们将在后面的文章中讨论如何处理过度拟合。

原文:https://towardsdatascience.com/simple-introduction-to-data-science-636413c2c60d?source=collection_archive---------66-----------------------

照片由艾丽在 Unsplash 上拍摄

我们正在见证数据科学在我们周围的蓬勃发展。这已经成为新的技术行话,现在就像一个时髦词一样流传开来。在这篇文章中,我们将通过讲述以下内容来了解数据科学实际需要什么:

数据科学项目生命周期的步骤是什么?

因为从实用的角度来看,这是理解数据科学所有方面的最佳方式。

数据科学项目可以分为 7 个步骤:

照片由达里娅·内布里亚希娜在 Unsplash 拍摄

这是任何数据科学项目开始的第一步,也是最重要的一步。理解你构建项目所基于的业务问题是非常重要的。这一步的任何模糊/混乱都可能让你在后期付出很大代价。这是任何想在数据科学领域取得成功的人最重要的特质之一。如果你正在为一个客户工作,一定要在这个初始阶段问尽可能多的问题。在你开始查看数据之前,你的头脑中应该对业务框架有一个绝对清晰的认识。

例如:如果您正在研究一个业务问题,该问题要求您建立一个预测模型来预测信用卡发行银行的哪些客户最容易流失。您可能想问的问题如下:

你如何定义自然减员?—这将有助于您了解业务利益相关者的前景。总括损耗术语涵盖不同类型的行为。例如,在一种情况下,客户自愿关闭账户,而在另一种情况下,账户会休眠很长时间。—当您开始处理数据时,必须澄清每一个问题,以便能够成功地捕捉损耗。模型的准确性更重要,是以牺牲模型的可读性为代价,还是必须优先考虑模型的可读性?—这将有助于回答模型方法——统计模型或 ML 模型。谁将是这一模式的最终用户?这个模型是其他模型的支线模型还是独立模型?—这将有助于设计模型的输入输出结构。

你在这里得到了这个想法。还有问题吗?去问他们吧。这些信息构成了建模的基础。

弗兰基·查马基在 Unsplash 上拍摄的照片

理解业务问题后的下一步是寻找数据源,从那里可以收集所有行为、性能、地理和各种描述业务问题的数据。最好你应该从稳定可靠的来源获取数据。

例如:如果您想将银行信用卡余额转账服务的客户群作为目标,您将需要大量的属性来确定客户的特征。你可以使用信用局的数据(交易,查询,拖欠等)。)、内部历史数据(过去报价接受率、月末未清余额、内部信用评分等。).简而言之,在统计上被确定为在区分特定类型的报价的好和坏账户时具有预测性的一组特征。

一旦收集了数据,就进入数据准备阶段。数据准备通常也称为“预处理”。这是为数据科学项目的后续阶段清理和组织原始数据的阶段。在准备过程中,会认真检查原始数据是否有错误。此步骤的目的是消除不良数据(冗余、不完整或不正确的数据),并开始创建高质量的数据以获得最佳商业智能。

例如:您从第 2 阶段中讨论的各种来源获取数据,但是在我们准备数据的预处理阶段,现在我们意识到某个特定的数据源没有在级别(比如说帐户 ID 级别)上正确连接,并导致错误的属性列。我们可以在这个阶段删除数据源。同样,冗余、不完整或不正确在这个阶段都以同样的方式处理。

探索性数据分析(EDA)是一种分析数据集以总结其主要特征的方法,通常采用可视化方法。EDA 用于在建模任务之前可视化数据可以向我们展示的内容。查看一列数字或整个电子表格并确定数据的重要特征并不容易。通过查看表格形式的数据,似乎很难获得任何深刻的见解。探索性数据分析技术包括单变量分析 {(箱线图、直方图等。)查看数据中单个变量的基本趋势、最大值、最小值、四分位间距、异常值等。} 和双变量分析 {(散点图、条形图、折线图等。)来看看因变量-自变量的关系和趋势}

EDA 是在进入机器学习或统计建模阶段之前要执行的关键步骤。它为理解提供了一个重要的基础框架,并提供了为手头的问题开发合适的模型并正确解释其结果所需的背景。EDA 对于确保产生的结果是有效的、正确解释的,并且适用于期望的业务环境是有价值的。

预测建模是预测未来行为的常用统计技术。预测建模解决方案是一种数据挖掘技术,通过分析历史和当前数据并生成模型来帮助预测未来结果。

有各种各样的预测建模技术,如回归、分类、聚类等。

这一步是最关键的一步。在开发预测模型时,确保在构建模型后对其进行评估,并开发 3-4 个挑战者模型,以便从中选择最佳模型。如果它是一个 ML 模型,你完全基于准确性来判断,因为大多数 ML 模型起着黑箱的作用。另一方面,如果它是一个统计模型,好好看看你在模型中使用的最终变量,并检查它们的业务相关性以及模型评估指标的结果。

由卢卡斯·布拉塞克在 Unsplash 上拍摄

一旦模型准备好了,有效地传达它的结果是非常重要的。确保准备适当的文件,描述开发、验证和过时样本的模型结果,这些结果可以清楚地显示基尼系数/知识系数或其他评估指标。此外,传达结果还应包括清楚地描述构建模型时使用的假设。此外,敏感性分析是一种重要的可视化工具,可以描述模型的稳健性。你在这里得到的想法。明智地选择如何有效地沟通和展示你所开发的模型的准确性和作用。

现在,一旦模型被开发人员和业务涉众批准。它必须投入生产。一旦模型进入生产阶段,工作就不会结束。必须以适当的频率间隔连续监控模型。PSI(人口稳定性指数)和 CSI(特征稳定性指数)是一个很好的衡量人口分布如何符合开发样本的方法。如果差异显著,那么模型的结果可能变得不可靠,或者需要进一步深入研究。此外,应该监控模型预测的所有重要 KPI,如果在模型运行的两个月/两个时间段之间百分比变化变高,则可能需要重新校准或重新开发模型。

这些是数据科学项目的不同阶段。有几个数据科学团队专门从事我们上面讨论的某些阶段,而在 Kaggle 竞赛或许多公司中,您可能负责数据科学项目的端到端开发。无论哪种方式,所有阶段对于开发一个健壮可靠的模型都很重要,它可以帮助我们解决手头的业务问题。

每个阶段都包括许多进一步的技术子步骤,这些子步骤组合在一起构成一个阶段。但这篇文章是我试图解释一个没有任何技术术语描述的数据科学项目的整体观点。

观看此空间,了解更多关于数据科学、机器学习和统计的信息!

快乐学习:)

原文:https://towardsdatascience.com/simple-intuitions-for-setting-learning-rates-for-neural-networks-47df77cb7bd6?source=collection_archive---------57-----------------------

为训练神经网络的不同阶段设置良好的学习速率对于收敛以及减少训练时间是至关重要的。(图片来源)

学习率可能是训练神经网络要调整的最重要的超参数。

本文的目的是直观地了解调整学习率(LR)的各种最佳实践。

首先,我假设对 LR 和人工神经网络(NN)有一个大致的了解。详情请参考此处。简而言之,LR 是网络响应丢失而更新其参数的速率。在元水平上,LR 代表当面对失败时信念被修正的程度。

为了简单起见,我会考虑尝试学习两个简单的函数 f(x) -> x 和 f(x)-> 2x+5。因此,在第一种情况下,给定像 1,2,3 这样的数字,神经网络需要学会将这些数字返回。对于第二种情况,它需要学习一个线性函数。

对于第一种情况,忽略使用具有一个节点(输入)的网络的明显解决方案,我们考虑具有两个节点的 NN:一个输入和一个输出。因为我们知道它必须学习的函数,即 f(x) = 1*x + 0。我们不设置偏差参数。因此,只有一个参数需要调整,即权重,在本例中是一个标量。

现在,让我们看看 keras 设置的随机权重。默认情况下,它使用 Xavier 初始化,但出于这个目的,我们可以认为这是一个小的随机浮点。

太好了,NN 需要做的就是学会把 1.38…改成 1 就搞定了。大约 80 个训练例子应该足以学习这个参数。我们去看看。

我们首先使用 LR 为 0.1 的随机梯度下降优化器。

经过大约 100 个时期的训练后,平均误差似乎降低了,但幅度不大。发生了什么事?

MAE 在整个时代都在波动,没有学到任何有用的东西。

我们期望权重 W 收敛到 1。它好像在做随机漫步。

W 图的尖峰告诉我,当神经网络预测的值过高时,它会过多地调整权重,从而导致它在另一个方向上调整过多。它从未能以“恰到好处”的方式调整它。现在,我将尝试通过将 LR 设置为 0.001 来重复这个实验。

好多了!MAE 下降非常快,但随后开始波动。

相反,权重开始收敛到 1,但永远不会完全达到 1。

似乎 LR 越低越好。让我再试一次。LR= 0.0001

设置较低的 LR 意味着学习非常慢。请注意比例的差异,W 接近 1,但需要近 200 个历元。但一旦开始,它会保持很紧。

因此,在开始时有较大的学习速率似乎有助于快速接近一个好的解决方案,而有较小的学习速率似乎有助于接近理想的解决方案。

学习率衰减的想法很简单,在每次迭代结束时,假设我们正在缓慢收敛,我们希望将学习率修改为更小的值。大多数优化器定义允许在每次迭代(小批量)后更新 LR 的单个衰减参数。优化器中指定的 LR 是 initial_lrate。

好多了。然而,它似乎从来没有完全稳定下来,需要很长时间。

为了增加灵活性,我们可以指定回调,而不是使用优化器的衰减参数。在 Keras 中,回调是一个可定制的函数,在每个时期结束时调用。

在这里,我定义了一个函数来处理简单依赖于纪元编号的衰减。函数 lr_schedule 当然是可定制的。

在这种情况下,我们看到我们在开始时有一点波动,但在纪元 40 之前已经收敛了很多。我发现这也有助于开始小 LR 上升到最大,然后开始按比例缩小,直到它达到最小。这叫 LR 循环。对迁移学习特别有帮助。

在上面这个非常简单的例子中,我从一个可怕的 LR 值开始,然后慢慢地调整这个过程。为 LR 设置的时间表取决于任务的复杂性、训练数据的大小、小批量大小、训练数据的质量等等。

像 RMSProp 、 Adagrad 和 Adam 这样的常用优化器使用像动量和前瞻这样的梯度特征来自动调整 LR。

对于这个简单的问题,Adam 似乎在没有任何超参数调整的情况下在 100 个时期内稳定。Adam 可以理解为有动量的 RMSprop 和 SGD 的组合。已经有了更新的提议,像那达慕,是对亚当的增强。

使用 Adam 这样的自适应优化器通常是一个不错的选择。然而,已经表明,有时 Adam 并不总是收敛到与带动量的 SGD 一样的最优解。因此,在最终确定解决方案之前,针对几个不同的超参数尝试 SGD 是一个很好的实践。增加了一点复杂性

当我通过要求神经网络学习 f(x) -> 2*x+5 并允许使用一个偏差变量来增加原始问题的复杂性时。

Adam 的默认设置没有在 200 个时期内收敛到一个解决方案。然而,它正在稳步取得进展。

给定更多的训练示例(1000),它似乎进展得更好,学习 a W = 2.004 和 b=1.94。它收敛到正确的权重,但未能收敛到好的偏移值。

在这种情况下,使用带有动量的 SGD 似乎做得更好。它在 200 个时代结束时学习的参数是 W=2.071 和 b= 0.23。

SGD 解决方案看起来并没有因为更多的例子而变得更好。它学习了 W=2.05 和 b=0.34。

W 稳定得相当快,但是偏置更新得很慢。(亚当)

在这篇简短的文章中,我们看到设置好的 LR 对于确保神经网络收敛以及优化收敛速度非常重要。我们还看到使用替代优化器,如 Adam、RMSProp、Nadam 等。帮助调整学习速度。最后,我们还看到了如何使用自定义函数来设置学习率衰减的时间表,以及 LR 循环如何有所帮助。

但是,为什么一个神经网络需要 1000 个样本和 100 次数据传递来学习一个简单的恒等函数,而这个函数对于只有几个样本的人来说是显而易见的?现在,这是另一个职位!

原文:https://towardsdatascience.com/simple-iterative-programming-and-error-handling-in-r-a68ebccdf9b9?source=collection_archive---------47-----------------------

作为一名程序员,你会发现自己处于一些常见的情况。其中一种情况是,您需要在一个或多个循环的多次迭代中运行代码,并且您知道您的代码可能会在至少一次迭代中失败。您不希望您的代码完全停止,但是您确实希望知道它失败了,并记录它发生的位置。我将在这里展示一个简单的例子来说明如何做到这一点。

这是我为电视节目*老友记构建互动角色网络可视化旅程的第二部分。*第一步的教程——从网上抓取单集剧本——可以在这里找到。整个项目的最终产品可以在这里看到,所有代码在这里。

在我们停下来的地方,我们已经写了一个脚本,可以抓取 Friends 的每个在线集,找到并计算不同的场景,并列出每个场景中的角色。我们的抓取脚本输出了这样一个表:

我们现在要做的是创建一个网络边缘列表,以便我们可以分析和可视化该剧的角色网络。网络边列表是带有“从”和“到”列的简单的字符配对,其中如果字符在至少一个场景中一起出现,则它们是配对的。我们还将增加一个“权重”栏,统计这对情侣一起出现的场景数量——这是一种衡量联系“强度”的方法。我们希望每一季都这样做,我们不在乎我们网络中的方向——所以对我们来说,这对组合{“钱德勒”、“莫妮卡”}就是对组合{“莫妮卡”、“钱德勒”}。因此,总结我们的目标,我们希望:

让我们的抓取功能贯穿每一季每一集将输出转换为每个场景的字符“对”统计每一季剧中的角色对,形成一个“权重”。

《老友记》一共播出了十季,每一季都有不同的集数,但从未超过 25 集——也有双集,这意味着一些集数在剧本名称中被跳过了。我不想编写精确定义多年来所有季节和剧集组合的条件代码。我更愿意做的是让我的抓取脚本抛出一个错误,返回一个空数据框,在我的控制台中将错误记录为一条消息,然后继续下一次迭代。然后,我可以查看记录的消息,并检查错误是否在意料之中,因为剧集并不存在。

因此,我将在这里做一些错误处理——我将使用函数来做这件事。接受一个命令,如果可以就执行它,然后接受特定的指令作为出错时的回调函数。在我的例子中,我将像这样使用:

使用此代码,如果特定的季节和剧集组合不存在,代码将不会停止,而是会在控制台中显示特定的消息并返回一个空数据帧。这使得我们可以迭代每一季和每一集,而不用担心我们的代码会因为一个错误而停止。

因此,由于我们出色的解决方案,我们现在可以创建一个循环的开始,该循环将迭代 10 季,每季 25 集,如下所示。请注意我在这里的评论,并特别注意我们接下来需要处理的 CAPS 部分:

这就把我们带到了如何将一集的输出转换成每个场景的一组独特的字符对的问题上。回想一下,我们的抓取脚本的输出包含一组场景编号和每个场景的角色列表。

在一个场景中,我们需要将这个字符列表转换成一组唯一的无序对。让我们编写一个简单的函数,将一个字符向量转换成一组唯一的无序元素对。为此,我们需要遍历每个元素,直到倒数第二个元素,并与它后面的每个元素配对——例如,为了对向量进行这样的操作,我们会将与、和配对,将与和配对,最后将与配对。

让我们测试一下我们的函数,看看它是否有效:

看起来不错!现在我们只需要将它应用到这一集的每一个场景,所以这是我们可以替换到循环中的最终代码,而不是上面的 CAPS 注释。它遍历每个场景,将我们新的函数应用于角色列表,然后将结果附加到一个数据帧中,该数据帧捕获该集的所有配对。

现在我们可以在所有的季节和剧集中运行整个循环。你可以在这里找到这个循环的完整代码。如果我们运行它,我们将看到被捕获的错误—例如,我们将看到:

这是有道理的,因为第十季最后一集是第十七集(双集大结局)。

现在我们差不多到家了。我们需要计算每一季中一对角色一起出现在一个场景中的次数,以创建我们的“权重”栏。我们需要克服的唯一问题是字符的顺序在我们的数据帧中可能不一样。我们的迭代可能在一个场景中捕捉到了、,但在另一个场景中则相反。

对此的最佳解决方案是使用以下命令按字母顺序对每行中的对进行排序:

现在我们准备按季节生成我们的“体重”列,这现在相当简单:

我们可以快速浏览一下我们的数据框架的样本。正如您所料,它有成千上万行,但我们预计六个主要字符之间的权重相当高:

这将返回:

好了,我们已经有了边缘列表,现在我们准备继续这个项目的网络分析部分,在这里我们将查看六个主要角色的社区,并想象它们如何随着季节的变化而变化。在接下来的文章中,请留意这一点。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedIn或Twitter上找我。也可以看看我在 drkeithmcnulty.com 的上的博客。

来自《老友记》,由 NBC 提供

原文:https://towardsdatascience.com/simple-linear-regression-35b3d940950e?source=collection_archive---------17-----------------------

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

当我们着手理解机器学习模型时,我们通常首先遇到的事情之一是简单的线性回归。这是进入机器学习的第一步,这篇文章将帮助你了解你需要知道的一切。让我们从了解什么是回归开始。

回归一词最早出现在 19 世纪,用来描述一种现象,即高个子祖先的后代的身高倾向于向正常平均身高回归。换句话说,回归就是回归中庸(中庸)的趋势。有趣吧?

在统计学中,该术语被定义为输出变量和输入变量之间关系的量度。因此,线性回归假设前者和后者之间存在线性关系。根据输入变量的数量,线性回归可以分为两类:

简单线性回归(单一输入变量)多元线性回归(多输入变量)

这篇文章致力于解释简单线性回归的概念,这也将为你理解多元线性回归打下基础。除此之外,我们将在 Python 中实现线性回归,以了解它在机器学习中的应用。与此同时,我们还将了解一些重要的事实。说到这里,让我们开始吧。

我们将输入变量表示为 X,输出变量表示为 Y,这是通常的做法。然后我们可以把 X 和 Y 之间的关系写成:

这里,两个常数项(β)是截距和斜率。你可能在你的学校代数中见过这个表达式,直线的一般表达式是,

y = c + mx

其中 c 是截距,m 是斜率。这就是我们在线性回归中要做的。我们试图拟合一条直线来观察输入和输出变量之间的关系,然后进一步用它来预测看不见的输入的输出。

让我们引入数据来理解这是如何工作的。

我们将使用南加州大学马歇尔商学院网站上的广告数据。你可以在这里下载。

这些数据被用在一本很受欢迎的书“统计学习入门”中,顺便说一下,如果你想了解机器学习的基本统计,这是必读的。

广告数据集包括一种产品在 200 个不同市场的销售额,以及三种不同媒体的广告预算:电视、广播和报纸。它看起来是这样的:

销售额(*1000 台)与广告预算(*1000 美元)

数据的第一行表示电视、广播和报纸的广告预算分别为 230.1k 美元、37.8k 美元和 69.2k 美元,相应的售出数量为 22.1k(或 22,100)。

现在,我们将尝试使用简单的线性回归来了解这三种媒体中的每一种是如何与销售相关联的。因此,我们的输入变量(X)将是广告代理商之一,输出变量将是销售额(Y)。

在下结论之前理解你的数据是很重要的。一个人必须注意测量单位和变量的规模,以讲述正确的故事。

现在让我们观察一下我们的销售额与每个广告代理商的对比情况。

加载 csv 文件后,运行以下代码来绘制变量。

上述代码将产生以下散点图。

销售额(*1000 台)与广告预算(*1000 美元)

通过观察第一幅图(左),人们可以推断出随着电视广告的增加,销售额有急剧上升的趋势。在描述广播广告的第二个图表(中间)中也可以观察到类似的趋势。然而,在最后一张图(右)中,趋势并不明显。这是什么意思?

当观察到输入变量 X 的增加与输出变量 Y 的同时增加或减少时,这两者之间就有了关联。这是对 X 和 Y 之间关系的一种度量。通过可视化的数据,我们可以直观地看到电视和销售是强相关(高度相关)的。另一方面,报纸预算和销售之间的相关性似乎较弱。

相关性经常会误导人,因为它看起来像因果关系。仅仅因为两个变量相关,并不意味着一个变量会引起另一个变量的变化。我们需要深入挖掘,决定这是否只是一个相关的例子,或者是否也是因果关系。

线性回归将帮助我们确定这种关系的强度,即在给定特定广告媒体的情况下,我们预测销售额的准确度有多高。

现在我们已经了解了数据,让我们建立一个简单的模型来了解销售和广告代理之间的趋势。在这篇文章中,我将使用电视作为代理来构建以下回归模型。我鼓励你为另外两个代理(广播和报纸)做这件事。

→ ᵄ;ᵄ;ᵅ;ᵅ;ᵆ; = ᵯ;0 + ᵯ;1 * ᵄ;ᵄ;

这个回归模型将通过调整ᵯ;0 和ᵯ;1.这两个常数,找到能够代表数据的最佳直线最佳拟合是在给定输入值的情况下预测输出时显示最小量的误差的拟合。

稍后,我们将了解更多关于误差函数和模型评估的内容。在此之前,让我们编码并构建上述模型。

回归模型通过调整ᵯ;0 和ᵯ;1 这两个常数来寻找能够代表数据的最佳直线,从而以最佳方式代表数据。

请注意,我们已经将数据分成了两个子集:训练数据集和测试数据集。这是机器学习中的常见做法。这使我们能够在可见和不可见的数据上检查模型的性能。

你可以在这里找到完整的代码。现在,让我们在训练和测试数据集上绘制和可视化我们的模型。

太好了!通过调整常数,我们的回归方程拟合出了最佳模型。正如我们所看到的,它在训练和测试数据中做了很好的直线处理。让我们检查截距和 x 系数(斜率)的值。

您应该会得到这些输出,其中可能有非常细微的变化:

截距是输入为 0 时输出的值。在这种情况下,它是在没有电视广告预算的情况下的估计销售额。这里截距的值是 7.033,也就是说在没有电视广告的情况下,售出的单位数是 7033(销售额*1000 单位)。

需要注意的是,截距并不总是与问题相关,可能只是作为调整回归线所需的常数。

系数或斜率是每单位输入变量变化时输出变量变化的量度。在这里,模型的系数是 0.048,这意味着如果我们增加 1 个单位(1000 美元)的电视广告预算,产品的销量将增加约 48 个单位(0.048*1000)。

试着找出广播和报纸的这些值。你认为哪种广告媒体对销售影响最大?

注意,这里的系数值是正的。然而,系数的负值意味着负相关,这意味着输出随着输入值的增加而减少。在我们的数据中,我们只在所有情况下观察到了一个正相关,即无论何时任何媒体的广告预算增加,销售额都会增加(这对任何企业都有意义)。

厉害!我们刚刚建立了简单的线性回归模型。但是我们如何知道在给定电视广告预算的情况下,它是否足以预测销售额呢?我们应该依靠模型做出正确的商业决策吗?如果是,那么涉及哪些损失?在真实的商业问题中回答这些问题很重要。为此,我们需要评估我们的模型,并测量在预测输出时产生了多少 误差 。

误差函数可以被认为是当前状态和理想状态之间的距离。

例如,如果你必须从一个山峰下降,那么误差函数就是山峰的高度,并且你在减小误差(高度)的同时保持小幅度下降,直到你到达底部,即零误差状态。

类似地,模型从初始状态开始,在该初始状态下,它假设所涉及的参数的某个值,从而调整这些参数以减少误差函数。

在这种情况下,截距和广告系数是要调整的参数,而误差函数是实际销售额和预测销售额之间的总体差异。

垂直线表示模型预测中的单个误差

位于直线上或非常接近直线的点是模型能够正确预测的点。然而,有许多点远离回归线。每个这样的点离直线的距离就是误差的原因。

因此,第 i 个值的误差函数 e 可定义如下:

该误差项也被称为残差,根据模型是否高估或低估结果,该误差项可以是负数或正数。因此,为了计算净误差,将所有残差直接相加会导致项的消除和净效应的减小。为了避免这种情况,我们取这些误差项的平方和,称为 残差平方和(RSS)。

残差平方和

截距和斜率在线性回归中通过使用微积分最小化 RSS(残差平方和)来计算。令人欣慰的是,算法会处理这部分,我们不必担心它背后的数学问题。

RSS 可能是一个太大的数字,无法表示误差函数。因此,我们考虑以下措施来评估线性回归中的误差。

均方误差(MSE): 它是残差平方的平均值( e ),通过将 RSS 除以数据值的个数来计算。MSE = RSS/n

均方误差

2.均方根误差(RMSE): 顾名思义,就是均方误差的平方根,更适用于误差特别大的情况。

均方根误差

3。平均绝对误差(MAE): 我们取残差的绝对值并计算它们的平均值,而不是取平方。

绝对平均误差

我们不必担心计算这些值,因为它可以使用 Python 中预定义的函数来完成。让我们用测试数据集来检查我们的模型的这些值。

您应该会看到下面的输出,如果有细微的变化的话:

您可以将这些结果与您的训练集错误进行比较。你得到了相似的误差值还是与测试误差不同?

既然您有了测量误差的方法,您就可以决定接受该模型时允许的误差有多大。这取决于你正在解决的问题和你因错误预测而面临的损失惩罚。

如您所见,线性回归是一种非常简单的建模方法,如果数据过于分散,它会产生很高的误差。这是一个不灵活的模型,只假设变量之间的线性或直线关系。因此,它不适合大多数数据点,这使得它容易受到高 偏差 。这导致了过度泛化和 欠拟合 。当模型主要由于其不灵活而没有恰当地捕捉训练数据的本质时,就会发生这种情况。

尽管线性回归是一个非常简单的模型,但它确实有助于理解其他高级模型的工作方式。我们看到了当只有一个预测因子时简单的线性回归是如何工作的。你可以在这里找到这篇文章的完整代码。

您还可以阅读多元线性回归,它是简单线性回归的扩展,用于有多个输入变量的情况。感谢阅读,敬请关注。

[## 多元线性回归

一个完整的研究—模型解释→假设检验→特征选择

towardsdatascience.com](/multiple-linear-regression-8cf3bee21d8b)

如果你是数据科学和机器学习的新手,不知道从哪里开始你的旅程,请查看下面的链接,在那里我提到了学习数据科学的一步一步的方法,有很多资源可供你选择。

[## 从零开始的数据科学

作为一个完全的初学者如何步入数据科学

towardsdatascience.com](/data-science-from-scratch-4343d63c1c66)

等不及了?如果你想一头扎进一门课程,请点击下面的链接查看适合你的数据科学职业轨迹。

[## 在线学习 R、Python 和数据科学

使用 DataCamp 的视频教程&编码,按照您自己的步调,在您的浏览器中舒适地学习数据科学

www.datacamp.com](https://www.datacamp.com?tap_a=5644-dce66f&tap_s=910084-843f05&utm_medium=affiliate&utm_source=sangeetaggarwal)

原文:https://towardsdatascience.com/simple-linear-regression-and-ols-introduction-to-the-theory-1b48f7c69867?source=collection_archive---------11-----------------------

回归分析是分析数据的重要统计方法。通过应用回归分析,我们能够检查因变量和一个或多个自变量之间的关系。在本文中,我将介绍最常见的回归分析形式,即线性回归。顾名思义,这种类型的回归是一种线性方法,用于建模感兴趣的变量之间的关系。

线性回归用于研究一个因变量 (y)与一个或多个自变量 ( X )之间的线性关系。因变量和自变量之间的线性关系是模型的一个假设。该关系通过随机干扰项(或误差变量)ε建模。扰动是最重要的,因为我们无法捕捉到模型因变量的每一个可能的影响因素。为了捕捉影响因变量的所有其他因素(未作为自变量包括在内),将扰动项添加到线性回归模型中。

这样,线性回归模型采用以下形式:

在哪里

是模型的回归系数(我们要估计的!),K 是包含的自变量个数。该方程被称为回归方程。

现在让我们后退一步。我们开始考虑只包含一个自变量的简单线性回归,而不是包含多个自变量。这里,我们开始用一个自变量 xi 对因变量 yi 建模:

其中下标 I 指的是特定的观察值(总共有 n 个数据点)。这里,β0 和β1 是需要从数据中估计的系数(或参数)。β0 是截距(常数项),β1 是梯度。

在简单线性回归中,我们实际上是使用自变量 xi 的得分来预测因变量 yi 的值,以观察 I

为了能够获得可靠的系数估计值,并能够解释随机数据样本的结果,我们需要做出模型假设。有五个与线性回归模型相关的假设(这些被称为高斯-马尔可夫假设):

线性:因变量、自变量和扰动之间的关系是线性的。随机样本:我们有一个大小为 n {(xi,易):i=1 的随机样本,…,n)},其中观察值彼此独立。没有完美的共线性:没有一个自变量是常数,自变量之间没有精确的线性关系。外生性:给定自变量的任意值,扰动项的期望值为零。换句话说,E(ε|xi)=0。同方差:给定独立变量的任意值,扰动项具有相同的方差。换句话说,Var(ε|xi)= σ。

高斯-马尔可夫假设保证了普通最小二乘法(OLS)估计回归系数的有效性。

如前所述,我们希望获得可靠的系数估计值,以便能够研究感兴趣的变量之间的关系。列出的模型假设使我们能够做到这一点。基于模型假设,我们能够推导出最小化残差平方和(SSR) 的截距和斜率估计值。最小化 SSR 是期望的结果,因为我们希望回归函数和样本数据之间的误差尽可能小。最小化 SSR 的系数估计称为**普通最小平方****【OLS】**估计。

在这篇文章中,我们不会为 OLS 估计是如何得出的而烦恼(尽管理解 OLS 估计的推导确实会增强你对我们之前所做的模型假设的含义的理解)。

简单线性回归的 OLS 系数估计值如下:

其中系数上方的“帽子”表示它与系数估计值有关,x 和 y 变量上方的和“条”表示它们是样本平均值,计算如下

现在,我们已经定义了简单的线性回归模型,我们知道如何计算系数的 OLS 估计。我们如何解释系数估计值?这里,我们将考虑一个小例子。

假设我们对工作经验对工资的影响感兴趣,其中工资以年收入衡量,经验以经验年限衡量。为了研究工资(因变量)和工作经验(自变量)之间的关系,我们使用以下线性回归模型:

系数β1 衡量的是工作年限增加一个单位时年薪的变化。因为经验多(通常)对工资有正向作用,所以我们认为β1 > 0。

在这个例子中,我们使用了 30 个数据点,其中年薪从 39343 美元到 121872 美元不等,工作年限从 1.1 年到 10.5 年不等。正如您所想象的,仅包含 30 个数据点的数据集通常太小,无法提供准确的估计,但这对于说明来说是一个不错的大小。让我们制作一个散点图,以便更深入地了解这个小数据集:

图 1:工资数据集的散点图

看着这个散点图,我们可以想象线性模型在这里可能实际上工作得很好,因为看起来这个样本中的关系非常接近线性。

接下来,让我们使用前面导出的公式来获得这个特定应用的简单线性回归模型的 OLS 估计。通过使用这些公式,我们获得了以下系数估计值:

因此,将工资与经验联系起来的 OLS 回归线是

等式中工资顶部的“宽帽”表示这是一个估计等式。

现在,我们如何解释这个等式?我们可以用这个等式来预测不同工作年限的工资。当我们假设经验=5 时,模型预测工资为 73,042 美元。对于一个完全没有经验的人(即经验=0),该模型预测工资为 25,792 美元。

除了预测,我们还可以用这个等式来研究工作年限与年薪的关系。一个人多一年的工作经验,预计他的年薪会增加 9449 美元。这意味着(如我们所料),多年的工作经验对年薪有的正面影响。

为了完成这个示例,让我们在前面看到的散点图中添加回归线,以查看它与数据点的关系:

图 2:添加到散点图的回归线

我希望这篇文章能帮助你开始了解(简单)线性回归模型是如何工作的,或者如果你已经熟悉这个概念的话,为你澄清一些问题。

原文:https://towardsdatascience.com/simple-linear-regression-explanation-and-implementation-from-scratch-with-python-26325ca5de1a?source=collection_archive---------12-----------------------

来源免费照片,通过 pinterest (CC0)

当我们开始研究机器学习时,大多数时候我们并不真正理解那些算法在引擎盖下是如何工作的,它们通常对我们来说就像是黑盒。今天,我想介绍一下回归任务中最基本也是最著名的算法之一——线性回归。在本文中,我将从头开始构建并解释 Python 中的线性回归模型,我们还将看到它在从sk learn . datasets . make _ Regression方法生成的回归数据集上的性能,与 Sklearns 的从sk learn . Linear _ Regression 生成的线性回归相比。线性回归 类。那么,我们可以开始了吗?

用于线性模型创建的数据集

在一个简单的例子中,假设我们只有一个变量— X. 基于对 X 的了解,我想预测未知变量 Y. 我还将定义训练集,它包含所有已知的( X_train,Y_train )变量对和验证集,我仅从中取 X_val 然后,我们可以在知道 Y_pred 和 Y_val 变量的情况下测量模型的性能。让我们在 Python 代码中定义训练和测试集:

在这里,我导入了 make_regression 方法,并创建了包含 1 个特征(即 X 和目标(即 Y. )的数据集。现在,让我们将数据集拆分为训练和验证部分。如上所述,这可以通过sk learn . model _ selection . train _ test _ split方法来完成。如上所述,我将在训练零件上训练线性回归模型,并在验证零件上评估模型。

如图所示,我将 70%的数据作为训练数据,另外 30%用于验证。现在,为了更好地理解我们的数据,我将绘制图片,显示我们的 X_train 和 Y_train 变量之间的关系。

因此,总而言之,我们的目标是建立一个模型,该模型将 X 作为输入,并预测相应的 Y 变量。让我们把它重写为函数:模型( X ) = Y. 考虑一个输入 X = -2,,那么模型 (-2) 将返回接近 -200 的值,如果输入 X =2 ,那么模型(2) 将返回接近 100 的值。总而言之,我将在 1 个特性案例中实现的模型如下所示:

型号(X) = W1X + W0*

W1 和 W0 为参数,将由模型在训练中学习。你可以看到,上面的函数只是直线的方程,因此,我们的线性模型的预测将形成直线,看起来像这样:

出现在图表上的线是最适合系列组的线。现在,当我准备好数据集后,让我们了解线性回归模型背后的直觉。

线性回归理论和直觉

正如我在上面解释的,主要思想是拟合一条线(在 1 个特征的情况下)或一个超平面(在 K 个特征的情况下),因此在 1 个特征的情况下,模型看起来像这样:

型号(X1) = W1X1 + W0*

在 K 特性的情况下,看起来是这样的:

型号(X1…Xk)= Wk * Xk+Wk-1 * Xk-1+…+W1 * X1+W0

注意,在这两种情况下,我们都有 W0 项,称为偏差。为了有效地训练模型,我们也可以将其重写为:

模型(X0,X1…Xk)= Wk * Xk+Wn-1 * Xn-1+…+W1 * X1+W0 * X0,其中 X0 = 1

简而言之,在 1 个特征的情况下,如果 W0 = 0 ,那么 W1 变量的任何选择将仅导致线围绕(0,0)点旋转。W0 项有助于移动直线或超平面,这通常导致更好的模型性能。

现在,接下来要了解的是如何选择这个 W0…Wk 术语。为此,你需要理解什么是损失函数以及梯度下降背后的想法。

https://www.youtube.com/watch?v=sDv4f4s2SB8

一般来说,损失函数显示模型的当前预测值(模型(X) )与真实的 Y 值有多接近。使用梯度下降,我们以这样的方式进行小步骤,即我们的损失函数减少(即,在训练模型 W1…Wk 的每一步,参数以这样的方式变化,即在一些步骤之后,我们的损失函数稳定在局部最小值。我的意思是:

https://stack overflow . com/questions/56794716/periodic-oscillating-loss-function-for-py torch-ccnn

在第一步,损失是高的(即预测和 Y 变量彼此远离)。每走一步,损失就会减少,预测值会变得更接近真实值。

让我们为我们的任务定义损失函数,我们将使用 MSE 作为损失函数:

同样,让我们计算损失对 Wj 的导数,

总而言之,以下是您在训练线性回归模型时要做的事情:

你随机初始化模型的 W0…Wk 变量。

对于一定数量的迭代(步骤数),您需要执行以下操作:

2.根据以下规则更新 W0…Wk :

这里 dL/dWj 是损失函数相对于 Wj 的导数。(上面我们已经定义了梯度的公式),这里的 learning_rate 只是模型的超参数,你要在训练前自己选择(我一般是从 learning_rate 0.001 开始)

嗯,基本上这就是你实现所需要的所有理论,我建议你重读几遍这部分,如果你没有得到什么,这完全没问题!现在我将用 Python 实现一个简单的线性回归模型类。

用 Python 实现线性回归模型

首先,让我们定义我们类的主要功能:

这里我用两种方法创建了 SimpleLinearRegression 类: fit 和 predict *。*我们的模型将学习拟合方法中最佳拟合线的参数,我们将使用预测方法来预测未知的 X 变量。您还可以看到,类的构造函数( init )有两个变量(我们将在创建类实例时定义它们),它们是: learning_rate 和 n_steps 。我已经在直觉部分解释了这两个变量。

现在让我们实施拟合方法,如插入部分所述。我们还需要一种方法来计算每个 W 的损失梯度:

该函数是梯度计算函数的矢量化实现,但同时适用于所有权重:

其中 K—参数总数,W0 是偏置项。

现在有了梯度函数,让我们实现拟合方法,以如下方式迭代更新 W0…Wk 参数:

fit 函数现在应该是这样的:

理解该功能的每个部分至关重要。首先,我们添加如上所述的偏差项,np.c_ 在这里的作用如下:

这里的每一行代表一个单独的点,每一列是一个单独的特征。因此,对于每一行(点),我添加一个新的偏差特征。之后,我随机初始化权重并运行一个循环,在每一步我都更新所有的权重。这就是 fit 函数的全部功能!我们流程的最后一步是实现预测功能,如下所示:

正如您在这里看到的,我还添加了偏差项,并转移到该函数的矢量化实现 x^T * w。

实现如下:

这就是我们简单线性回归模型的全部实现!现在让我们在之前准备好的数据集上测试它。

简单线性回归模型测试和评估

作为第一步,我在本文第一部分定义的训练数据集上拟合模型。

到目前为止,我们的模型已经学习了 W1,W0 参数的最佳值(在我们的例子中是 1 个参数和偏置项)。现在我们可以调用 predict 方法,来获得对 X_val 点的预测。

现在让我们用 MSE 函数(我们用作损失函数的那个)来衡量预测质量。

让我们也做一个对(X_val,Y_val)和(X_val,Y_pred)的散点图

正如你所看到的,我们的模型已经学习了最佳拟合线(橙色的那条),它很好地描述了给定的一组点。

现在,我将对 sklearn.linear_model 执行相同的步骤。LinearRegression 模型类,做个比较。

如你所见,sklearns 实现的 MSE 误差要低一些,这是因为他们的模型比我们的要复杂一些。

结论

总而言之,今天我们已经完成了一项非常出色的工作——用 Python 从头开始实现了一个简单而有效的线性回归算法。我希望您能够轻松理解本文的每一点,如果需要的话,您可以自己实现相同的功能。我已经将这篇文章中的 Jupyter 笔记本完整加载到 github 中,所以请不要犹豫使用它并从中学习。

你可以在我的 网站 上查看其他帖子

原文:https://towardsdatascience.com/simple-linear-regression-model-using-python-machine-learning-eab7924d18b4?source=collection_archive---------1-----------------------

凯文·Ku 在 Unsplash 上的照片

在上一篇文章中, 线性回归模型, 我们已经看到了线性回归模型在理论上是如何使用 Microsoft Excel 工作的。本文将介绍如何在 Jupyter 笔记本中使用 Python 构建线性回归模型。

为了预测两个变量之间的关系,我们将使用一个简单的线性回归模型。

在简单的线性回归模型中,我们将只使用一个自变量来预测一个称为因变量的变量的结果。

在本文中,我们将直接开始构建模型。更多关于线性回归模型和我们必须考虑的因素在这里详细解释。

为了在 python 中构建线性回归模型,我们将遵循五个步骤:

阅读和理解数据可视化数据执行简单的线性回归残差分析测试集上的预测

在这一步中,首先,我们将导入必要的库来导入数据。之后,我们将执行一些基本命令来理解数据的结构。

我们可以从这里下载我们将在本文中使用的样本数据集。

让我们假设我们有一个公司的数据,其中有花费在不同类型广告上的金额及其随后的销售额。

导入库 我们将导入 Jupyter 笔记本中的和库,并使用读取数据。

数据集看起来像这样。这里我们的目标变量是销售列。

公司的广告数据

理解数据 让我们执行一些任务来理解数据,比如、和。

我们数据集的是,

使用,我们可以看到数据中是否有空值。如果是,那么我们必须做一些数据操作。

数据集的信息

正如我们所观察到的,数据中没有空值。

使用,我们将看到数据值是否有任何突然的跳跃。

描述数据集

列中显示的值在整个数据中相当一致。

现在让我们使用和库来可视化数据。我们将绘制所有列的配对图,并查看哪些列与最相关。

在两个数值变量之间使用散点图总是更好。上面代码的 pairplot 看起来像,

每个列的 pair plot w . r . t . Sales 列

如果我们不能使用散点图来确定相关性,我们可以使用 seaborn 热图来可视化数据。

热图看起来像这样,

数据中所有列的热图

从上面的图表中我们可以看出,电视栏目似乎与销售最相关。

让我们使用电视作为特征变量来执行简单的线性回归模型。

一元线性回归方程

在我们的例子中:

m 值称为模型系数或模型参数。

我们将分四步执行简单的线性回归。

创建 X 和 y创建训练和测试集训练你的模型评估模型

创建 X 和 y 首先,我们将特征变量/列指定为,目标变量指定为。

概括地说,

自变量代表,代表简单线性回归模型中的目标变量。

创建训练集和测试集我们需要将变量分成训练集和测试集。使用训练集,我们将构建模型并在测试集上执行模型。我们将把训练集和测试集分别分成 7:3 的比例。

我们将通过从库中导入来分割数据。

让我们来看看训练数据集,

X_train 数据拆分后是这样的。

分割后的 X_train 数据

y_train 数据拆分后是这样的。

拆分后的 y_train 数据

建立和训练模型 使用下面的两个包,我们可以建立一个简单的线性回归模型。

首先,我们将使用包来构建模型。为此,我们需要导入库来执行线性回归。

默认情况下,库适合一条穿过原点的线。但是如果我们观察简单的线性回归方程,它的截距值为。因此,要进行截取,我们需要手动添加属性。

一旦我们添加了常数,我们就可以使用(普通最小二乘法)来拟合回归线。之后,我们将看到直线的参数,即和。

输出是,

直线的截距和斜率

让我们看看回归线拟合的所有不同参数的汇总,如、和的概率。

上述回归线的统计数据是,

上述最佳拟合线的所有统计数据

因此,我们主要关心的决定模型是否可行的统计数据是:

及其(意义)值及其意义

我们需要看的统计数据

1.电视的为 0.054,其对应的很低,几乎为 0。这意味着在统计上是显著的。

我们必须确保 p 值总是小于这个系数才是有效的

2.值为 0.816,这意味着方差的 81.6%可以通过使用此行的列来解释。

3.Prob 的非常低,几乎为零,这让我们知道模型拟合在统计上是显著的。

由于拟合度很高,让我们继续观察直线与和列之间的散点图的拟合度。

从这些参数中,我们得到了直线的和的值。这条线的方程式是,

图表看起来像这样,

最佳回归直线

这就是我们如何使用训练数据建立一个简单的线性回归模型。现在,在根据测试数据评估模型之前,我们必须执行残差分析。

线性回归模型的主要假设之一是误差项是正态分布的。

现在,从数据集中,

我们必须使用属性从 X 的训练数据集中预测 y 值。之后,我们将从预测数据中创建误差项(残差)。

现在,让我们画出残差的直方图,看看它是否像正态分布。

残差的直方图看起来像,

残差分布

正如我们所见,残差服从均值为 0 的正态分布图。

现在,确保残差不遵循任何特定的模式。

散点图看起来像,

残值散点图

由于残差遵循正态分布,不遵循任何特定的模式,我们可以使用我们建立的线性回归模型来评估测试数据。

现在,我们已经在训练数据集上拟合了回归线,我们可以对测试数据进行一些预测。类似于训练数据集,我们必须测试数据,并使用中的属性预测 y 值。

测试数据的预测 y 值为:

预测 y 值

现在,让我们计算上面预测的 y 值的值。我们可以通过从包中导入库来实现。

使用上述代码得到的 R 值= 0.792

如果我们能从训练数据中记住,R 值= 0.815

由于测试数据的 R 值在训练数据的 R 值的 5%以内,我们可以得出结论,该模型相当稳定。这意味着,模型在训练集上学习的内容可以在看不见的测试集上推广。

让我们想象一下测试数据上的线。

具有最佳拟合线的散点图看起来像,

测试数据的最佳拟合线

这就是我们如何使用包构建线性回归模型。

除了,我们可以使用建立一个线性回归模型。使用来自的库,我们可以制作模型。

与类似,我们将数据分成和。

对于简单的线性回归,我们需要添加一列来正确地执行回归拟合。

X_train 加列前的形状是。

训练和测试数据的 X 形状为。

现在,让我们将这条线与从导入库的图相匹配。

现在,让我们找出模型的系数。

截距和斜率的值是,

系数值

我们得到的上述值的直线方程是,

如果我们观察,这里得到的方程和中得到的方程是一样的。

之后,我们将对数据进行预测,并通过比较 R 值来评估模型。

训练和测试数据的 R 值为

R train _ data = 0.816

R test _ data = 0.792

与相同,测试数据的 R 值在训练数据的 R 值的 5%以内。我们可以在未来将该模型应用于未知的测试集。

正如我们所见,我们可以使用或构建一个线性回归模型。

我们必须确保遵循这五个步骤来构建简单的线性回归模型:

阅读和理解数据可视化数据执行简单的线性回归残差分析测试集上的预测

在下一篇文章中,我们将看到多元线性回归模型是如何工作的。

感谢您阅读和快乐编码!!!

线性回归模型:机器学习探索性数据分析(EDA): Python(CLT)中心极限定理:数据科学推断统计:数据分析Seaborn: Python熊猫:蟒蛇Matplotlib:PythonNumPy: Python

机器学习—线性回归:https://www . w3schools . com/python/python _ ml _ Linear _ Regression . ASPPython 中的线性回归:https://realpython.com/linear-regression-in-python/线性回归(Python 实现):https://www . geeks forgeeks . org/Linear-Regression-Python-Implementation/用 Scikit 学习 Python 线性回归的初学者指南:https://www . kdnugges . com/2019/03/初学者指南-线性回归-python-scikit-learn.html

原文:https://towardsdatascience.com/simple-linear-regression-whats-inside-702475055ad5?source=collection_archive---------35-----------------------

第 0 步:开始

回归是一种统计方法,建议在其他自变量(数据)的帮助下预测因变量(目标特征)。回归是最广为人知和理解的统计方法之一。

线性回归是一种假设因变量和自变量之间存在线性关系的模型。线性回归进一步分为简单线性回归(SLR)和多元线性回归(MLR)。我们将探讨一元线性回归,即一个因变量和一个自变量的回归,因为它简单。SLR 的数学是许多其他机器学习模型的基础。

在这里,我将详细阐述简单的线性回归,以获得关于它如何工作的直觉。我将使用一个 NBA 比赛得分数据集(下面的链接)来演示单反,并最终将其与 Scikit-learn 的线性回归模型进行比较。

要理解单反,我们来分解一下必须要经历的概念

SLR 线及其系数损失函数梯度下降导出系数(可选)

直线的斜率截距形式为 Y= MX+B。

y 是因变量(目标),X 是自变量(数据),M 和 B 是直线的特征。斜率(M)给出了相关变量 X 和 Y 的关系,截距(B)给出了当变化率被消除时因变量的值的信息。

来源: onlinemath4all

在单反中,等式写成 y = b0 + x b1。 b0 和 b1 分别是截距和斜率。它们由下面给出的公式确定,以找到最佳拟合线。

但是,在回归中情况并不总是如此。让我们在梯度下降部分了解一下为什么。如果你对我们如何偶然发现这些感到好奇,请查看可选部分。

损失函数是表明预测值与实际值偏离程度的一种度量。有很多损失函数可用,我们将着眼于均方差(MSE)。

MSE,顾名思义,对每条记录的实际值和预测值之差求平方,求和,然后除以记录数。我们的目标是找到一个损失最小的模型。

梯度下降是一种优化算法,它迭代地更新参数,以找到损失最小的模型。具有一个或两个参数的模型的损失函数可以被部分微分以找到最小值。但是随着维度的增加,很难将参数可视化,更不用说每个解的特征值了。由于局部最小值的多次出现,我们将不得不遍历特征值的所有组合,以确保我们找到了全局最小值。尽管全局最小值问题没有完全解决,梯度下降有助于找到高阶模型的最小值。

但是我们还没有探索问题的基础:损失函数。MSE(作为二次函数)保证曲线上总有一个点的梯度为零,但有些损失函数不能保证梯度为零的点,或者梯度为零的点可能不总是全局最小值。为了克服这个问题,采用了梯度下降法。

具体到我们的情况,我们可以选择通过上面给出的公式来找到系数,或者我们可以从随机非零值开始,让它以最佳方式工作。梯度下降算法的数学意义本身就值得写一篇文章。现在,我将通过直觉来实现这个算法。数学方法类似于系数,我认为把它包括进来是多余的(如果你好奇,我会在最后把它联系起来)。

现在,让我们看看梯度下降是怎么回事。想象一个人在没有视觉的情况下徒步下山;这个人的目标是到达谷底。凭直觉,他向前迈了一步,如果坡度是向下的,他将继续前进,直到遇到坡度的变化。一旦这个人在移动中感觉不到提升,他/她就会停下来。

来源: kdnuggets

但是如上所述,采取确定长度的步骤然后评估路线修正是没有意义的,因为这个人可能已经通过了最小值,却意识到他/她向错误的方向移动。这就是学习率发挥作用的地方。它惩罚大步,以确保该人不采取一步超过最低限度。

人如何选择学习速度?

不幸的是,学习率没有“万能”的标准。我们可以粗略估计这个值的一种方法是通过反复试验。我们必须注意的问题是学习率的高低。这两种方法的计算量都很大,所以在开始时总是要运行几次模型来检查损失的变化。浪费的计算能力和时间。

一个适合高学习率的类比是金属球轴承和碗。当一个球从碗的边缘被释放出来时,它的速度会随着力的方向趋向最小值而不断增加。当它经过最小值时,球的方向会远离最小值,但作用在球上的力的方向会相反。这样,通过一些有损耗的振荡,它最终在碗的底部达到稳定的平衡。有损耗的振荡是计算能力和时间的浪费。

来源:深度学习向导

现在,我们把这个和单反合并一下。我们所指的人是 b0 和 b1 系数。我们看到的谷是 MSE 相对于 b0 和 b1 参数绘制的曲线。学习率(alpha)为我们提供了修改参数的步长,而不必在每次通过时跳过最小值。

推导系数(可选)

虽然不是关键,但探索模型的机制很有趣。让我们首先建立基本方程和推导方程的术语。在我们开始之前,确保你熟悉微积分的基础知识。

既然我们都有了方程,让我们开始研究 b0 和 b1。现在,如果我们绘制任何一个系数(保持另一个不变)对 E 的曲线,它看起来会像这样

函数的最小值可以通过对函数相对于系数进行部分微分并使梯度等于零来找到。现在我们的目标是

为了找到两个系数的梯度为零(近似)的点找出一个仅是给定数据的函数的方程。

找到 b0

现在求最小值,将梯度等于零。

虽然我们确实找到了 b0 的值,但是它依赖于 b1。

找到 b1

代入 b0 的值并部分微分

类似于 b0,将梯度等于零

这检验了我们的目标;我们找到了 b1 的方程式,它只依赖于我们现有的数据。我们能够利用曲线的基本性质找到这些值。

实现

首先,让我们处理数据,然后使用

系数梯度下降Scikit-learn 线性回归

数据

使用标准 python 库,让我们导入数据并可视化分布。

使用系数实现模型

使用系数的最佳拟合线

使用梯度下降实现模型

现在根据获得的参数绘制直线。

使用梯度下降的最佳拟合线

我以很小的学习率存储了几百次迭代的每个值,以可视化模型如何成熟。使用 pyplot,我保存了所有的图来制作一个 gif。

现在让我们绘制模型的损失历史。

使用 scikit-learn 实现模型

使用 scikit-learn 的最佳拟合线

对比

在上面的比较图中,我们可以看到线性回归线和系数线重叠。但是另一方面,梯度下降线稍微偏向线性回归线。这是什么意思?我们来调查一下。

尽管线的损失有所不同,但所有模型的预测值和实际值之间的损失是非常相似的。我们可以有把握地推断梯度下降线——尽管它没有相同的参数——已经以近似等于理想状态的方式定位了自己。

步骤 steps_count[-1]:结束

最后,这是简单线性回归的内容。谢谢你。

参考

[## 如何用 Python-Machine Learning mastering 实现简单的线性回归

线性回归是一种已有 200 多年历史的预测方法。简单的线性回归是一个很好的开端…

machinelearningmastery.com](https://machinelearningmastery.com/implement-simple-linear-regression-scratch-python/) [## 使用梯度下降的线性回归

在本教程中,你可以学习梯度下降算法的工作原理,并从头开始用 python 实现它。首先…

towardsdatascience.com](/linear-regression-using-gradient-descent-97a6c8700931) [## 2014 年至 2018 年 NBA 球队比赛统计

2014 - 2018 nba 期间每场比赛的统计数据

www.kaggle.com](https://www.kaggle.com/ionaskel/nba-games-stats-from-2014-to-2018)

除引用图片外,所有图片均由作者制作

原文:https://towardsdatascience.com/simple-little-tables-with-matplotlib-9780ef5d0bc4?source=collection_archive---------1-----------------------

有时,我需要为包含几行和几列数据的文档创建一个图像。像大多数人一样,我将只使用屏幕截图来创建图像,但这种方法不太适合自动化任务,需要手工调整才能呈现。荒谬的是,我正在用熊猫和 Matplotlib 在我的 Jupyter 笔记本上工作,我正在截图以捕捉幻灯片和书面报告的表格。Matplotlib 呈现漂亮的图形。为什么不是漂亮的小桌子?

一种替代方法是使用 LaTeX 生成报告,LaTeX 具有强大的表格功能。采用 LaTeX 进行报告,只是为了渲染一个小表格,这种做法有些矫枉过正,而且常常是徒劳的。我真的很想用 Matplotlib 生成我的小网格,标题居中;没有无关文字;漂亮、干净的边框;可能还有一个小小的日期页脚。

由于 Jupyter 的输出单元渲染,熊猫可以在 Jupyter 笔记本上输出看起来不错的数据帧。它甚至可以使用库来设计这些熊猫数据帧的样式。使用这些工具构建样式化表格的挑战在于它们以 HTML 呈现输出。将文件转换成图像格式需要调用其他外部工具的工作流,比如,将 HTML 转换成图像。

Matplotlib 可以将图表保存为图像。如果你搜索 Matplotlib 文档,你会发现它有一个包,看起来很有希望。它是有用的。事实上,我在这篇文章中使用了它。挑战在于创建的表格通常挂在堆叠的条形图下面,以向读者提供对上面数据的洞察。您希望只显示图表,并且希望图表看起来很漂亮。

当试图使用时,你可能会注意到的第一件事是,表格相当难看,并且不能很好地管理垂直单元格填充。第二,如果您试图隐藏图形,只显示表格网格,对齐问题就会暴露出来,使您永远无法得到您想要的漂亮的小表格。让桌子看起来漂亮需要一些工作,我将与你分享我自己做这项工作的心得。

Matplotlib 示例代码创建了一个表,但是没有展示如何用一个简单的表来显示数据。它生成一个表格,用作堆叠条形图的扩展。如果你跟随你的直觉,只隐藏图表,你会得到一个格式很差的图像,不适合你的文章或幻灯片演示。

在本文中,我将带您一步一步地将 Matplotlib 示例编写器提供的示例转换为您项目的一些简单表格代码。我解释了我在这一过程中所做的更改,这应该有助于您进行改进。我在文章的最后提供了完整的代码。

从示例中,您可以看到表格功能用于显示与相关堆积条形图相关的数据。

Matplotlib 表格演示示例(图片由作者提供)

示例的源代码(来自 Matplotlib 表格演示):

现在,让我们开始工作吧。首先,我将打破表的图表。我根据自己的喜好重新格式化了图表数据,并删除了特定于堆积条形图的数据。这一步对你来说是可选的。当我从代码中的 Python 列表加载少量数据时,我更喜欢在数据数组中包含标签,并在适当的时候弹出它们。当我几个月后回来时,我可以更容易地阅读它。您可能会从外部 CSV 文件或数据库导入数据,并在 Pandas 数据框架中对其进行操作。将数据放在一个二维列表中使这个例子变得简单。

我还删除了指令,并添加了将图像写入 png 文件的代码。如果在调用之前调用,图像将会是空白的,因为重置了 pyplot 图形对象引用。记住可以通过检测你提供的文件扩展名来输出其他图像类型(jpeg,svg,eps 等。).

**注意:**在我的实验中,我还对一些数据和标签做了微小的改动。为了与原始代码保持一致,我忘记在发布之前回滚它们。例如,“100 年”变成了“40 年”

让我们开始隔离和整理桌子。这需要几个步骤。我会带你穿过它们。

首先,让我们隐藏 x 和 y 轴,以及它们所有的刻度和标签。

x 轴和 y 轴已移除(图片由作者提供)

坐标轴消失了,但我们留下了一个围绕条形图的边界。我们可以很容易地关掉它。

条形图边框已禁用(图片由作者提供)

它越来越清晰,但是我们看到标题和表格之间有大量的空白。我们所要做的就是将现有的校准改为。这将使表格在隐藏轴区域居中。我们也应该从例子中去掉支线剧情的位置调整。

删除此行:

并将线改为居中:

将表格居中(图片由作者提供)

这一改变很好地把桌子向上拉。现在,让我们解决单元格内过于紧凑的垂直空间。不允许指定单元格的填充,但是我们可以用函数的参数将高度缩放 1.5 倍。这给了我们的细胞数据一点喘息的空间。您可以根据自己的喜好使用和值。

缩放表格(图片由作者提供)

让我们设置列颜色,并将行标题水平对齐设置为。我们将填充两个颜色列表,一个用于每个行标题单元格,另一个用于每个列标题单元格。我们将只使用示例中使用的颜色图,尽管对于装饰颜色来说,有比线性颜色图更好的选择。我们将在创建表格时设置行和列标签的颜色和对齐方式。

样式行和列标题(按作者排列的图像)

我们可以显式声明图形,以便轻松控制其边框和背景颜色。我将在这里使用一些标记的颜色作为这种方法的例子,与上面使用的颜色图形成对比。我通常只使用白色作为背景,但是天蓝色很适合演示如何设置它的颜色。

样式边框和背景(图片由作者提供)

漂亮。像夏天一样。您可能注意到标题集中在轴数据上,不包括行标题。我们需要把它放在图的中心,修改三个代码。这些变化也提高了图中表格的居中一致性。

使用.`在图形上设置标题,而不是轴在图形声明中为设置一个小的填充值。既然我们现在在这里声明一个紧凑的布局,我们应该从中移除。把它留在里面似乎会破坏桌子在图中的居中。如果您在图像生成过程中对中有困难,可以尝试此设置。(实验人员:注意在中设置与图形声明中调用的效果不一样。总有一天,我会找出原因。)可选地,在保存图形之前调用。这可以解决图像渲染过程中图形边界裁剪和标题居中的问题。有时候没什么效果。

将标题居中(图片由作者提供)

我们将使用图形文本来创建一个页脚,并调整位置值,直到它看起来合适为止。

添加页脚(作者图片)

表格图像看起来很好,但是自动布局并不总是产生我喜欢的空白。玩一个明确的数字大小往往可以拨入这个。猜测数字大小需要实验,并且可以改善或降低您的表格图像。

您可能还需要在中添加回来重新计算边界框。否则,图像可能没有正确的左右填充。您可能会发现图像在 Jupyter 笔记本输出单元格中看起来很好,但在您保存的图像中没有对齐。让所有渲染者满意是一种平衡行为。您应该经常检查最终的输出图像,即使它们在 IDE 的预览中看起来很棒。

带有明确 figsize 的更紧凑的空白(图片由作者提供)

这个最终源代码不包括明确的图形大小声明。我喜欢更宽敞的外观。

简单的小桌子(图片作者)

我分享了 Matplotlib 示例到一个简单、整洁的小表格的一步一步的转换,没有附带图表。表格排列整齐,适合您的出版物或演示文稿。这些步骤包括隐藏图表、使表格居中、设置颜色、插入页脚的代码更改,以及改进最终图像文件的对齐和间距的提示。也许有一天这些步骤会节省你的时间。

原文:https://towardsdatascience.com/simple-machine-learning-pipeline-770eb3f08a2d?source=collection_archive---------41-----------------------

Alexei_other 在 Pixabay 上的照片

在这篇文章中,我将涵盖多个主题,并解释如何建立机器学习管道。什么是 ML 管道?这是一个帮助自动重新训练 ML 模型并通过 API 使其可用的解决方案。重新训练间隔可以通过调度程序配置,模型可以每天或以任何其他选定的间隔更新。

解决方案的简要架构:

简单的 ML 管道(作者:Andrej Baranovskij)

我正在使用 Keras 构建一个模型,它可以计算企业报表生成的等待时间。时间是根据报告 ID、报告参数和日部分计算的。有一个常见的规则,即模型在培训期间获得的规则,即报表运行速度较慢,参数较少,并且在一天的第二部分。

训练 Keras 模型的 Python 函数是获取数据,处理数据,然后调用 Keras API 来拟合模型。模型训练分十次进行,以选出最佳结果。最佳结果是根据模型评估结果和测试数据选择的,稍后会详细介绍。新模型是使用时间戳保存的,这使得如果有任何活动的调用同时发生,当前模型仍然可以得到服务(或者可能一些用户仍然喜欢调用以前的模型,这增加了额外的灵活性)。

从日程安排器执行模型再训练。我使用后台调度程序选项,这允许我们将它与 REST API 进程一起运行(我使用 PM2 来运行 Python 进程)。这使得控制更加简单,并且当重新训练任务运行时,REST API 调用不会被阻塞。

REST API 使用 Flask 库运行。模型预测函数是通过用 tf.keras.models.load_model API 加载最新的可用模型,并在其上调用预测函数来执行的。

型号

模型逻辑在report _ exec _ time _ model . py中实现。

函数 fetch_data 从 CSV 中读取数据。在本例中,它总是读取相同的数据(出于简单的原因),但是在实际实现中,对于每次重新训练,您很可能会读取新的数据。获取训练和测试数据集。对于报告参数特性,训练数据包含 0–10 个值,测试数据包含 11–20 个值。这是故意的,我们正在用训练中不知道的数据进行测试。这将允许我们检查模型是否能够获得正确的趋势——执行时间应该随着更多的报告参数而减少。特征报告参数通过计算 log 进行归一化,使值更小,从而帮助模型更好地学习它。这同样适用于训练和测试数据集。20%的训练数据用于验证。数据结构:

截图作者:Andrej Baranovskij

报告参数的测试数据来自不同的集合,并且在规模上不同于训练集合,但是使用 log 可以通过相同的规则标准化不同集合中的数据:

函数build _ feature _ layer定义张量流特征层。这是一个元数据层,有助于将数据自动转换为可用于训练算法的格式。特征报告 ID 和日部分是分类的。这两个特征都使用 TensorFlow 分类特征支持编码为指示器列。报表参数特性被定义为数值列。所有三列都定义为 TensorFlow 要素图层-这允许转换数据而无需额外的自定义处理:

函数build _ dataset将熊猫数据转换为 TensorFlow 数据集。这种数据集可以直接发送到 Keras 模型训练:

我用的是批量= 16。根据我的测试,这是在给定数据的模型训练期间找到最佳拟合的最佳批次。我们不需要打乱训练数据,在分成训练集和验证集的过程中已经打乱了。

函数 build_model 构建顺序 Keras 模型。该模型接受第一层——要素层(要素列表及其表示方式)。不需要指定输入维度。有三层,第三层是输出层(一个单位/神经元)。前两层分别设置 16 和 8 个单元/神经元和 relu 激活。通过试验不同的设置来选择层和单元的数量。

该模型是在 train_model 功能中训练的。从零开始反复训练十次。结果保存了最佳模型。模型以 TensorFlow 格式保存。训练循环完成后,最佳模型被复制到 API 端点可访问的部署文件夹中。每个新模型都存储有时间戳,这允许实现模型版本控制。训练配置为提前停止回调,当 10 个周期没有改善时,训练停止。使用 TensorFlow 数据集的模型训练:

保存最佳模型。基于测试集评估模型。我将报表参数大于 10 的数据包含在测试集中,以便能够测试回归如何作用于看不见的数据。模型应该在训练过程中选择一个规则—报表参数越多,执行时间应该越短。我很高兴看到那个模特实际上正确地学习了这条规则:

将最佳模型复制到 API 可访问的目录中,以及用于版本控制的时间戳值:

这是 RMSE = 8.02 秒的模型训练结果(这意味着在计算测试集数据的报告执行时间时出现约 8 秒的误差)。我们可以看到,在提前停止回调终止训练之前,大约需要 100 个时期:

截图作者:Andrej Baranovskij

函数 run_predict 接受输入数据进行推理,加载最新的可用模型,执行预测调用。

终点

端点逻辑在report _ exec _ time _ endpoint . py中实现

在这个脚本中,我实现了重新训练调度器和 REST API。重新训练在后台线程中运行,这允许保持 REST API 运行而不会阻塞。

计划程序被配置为每天运行一次,但是重新训练的时间间隔由您决定。当新数据可用时,重新训练是有意义的:

REST API 通过 Flask 实现。请求参数被发送用于推理到模型中(自动从调度器中挑选出最佳的最新模型,或者你可以基于模型版本化实现其他逻辑)预测方法,结果被返回给客户端:

我们来验证一下模型。以来自模型训练集的数据为例(报告 ID、报告参数、日部分=时间):

用 15 个报表参数做推断。正如所料,执行时间更短= 429,这意味着模型训练正确:

截图作者:Andrej Baranovskij

如果有 11 个报告参数,执行时间会稍微长一点,这是应该的:

截图作者:Andrej Baranovskij

您可以尝试不同的报告 ID 和日部分值,看看执行时间计算是如何变化的墨尔本城分析预测。

部署

Python 端点进程正在使用 PM2 管理器运行。用 PM2 命令启动进程:

截图作者:Andrej Baranovskij

结论

希望本文描述的信息能够帮助您在生产中运行可扩展的机器学习管道。我认为核心部分是一个自动化的重新训练选项,这有助于在新数据可用时保持模型更新。在单独的线程中运行预定的再训练的能力允许我们在与 API 端点相同的过程中管理它。这使得管道更简单,更易于维护。

源代码 : GitHub repo。