TowardsDataScience 博客中文翻译 2020(七百九十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用深度学习的手语识别

原文:https://towardsdatascience.com/sign-language-recognition-using-deep-learning-6549268c60bd?source=collection_archive---------5-----------------------

双摄像头第一人称视觉翻译系统

TL;提出了一种使用卷积神经网络的双 cam 第一视觉翻译系统。开发了一个原型来识别 24 种手势。视觉系统由头戴式摄像机和胸戴式摄像机组成,机器学习模型由两个卷积神经网络组成,每个摄像机一个。

介绍

手语识别是一个多年来一直在研究中解决的问题。然而,在我们的社会中,我们仍然远远没有找到一个完整的解决方案。

在为解决这个问题而开发的工作中,大部分是基于两种基本方法:基于接触的系统,如传感器手套;或者基于视觉的系统,只使用摄像机。后者便宜得多,深度学习的蓬勃发展使其更具吸引力。

这篇文章介绍了一个使用卷积神经网络的双摄像头第一人称视觉手语翻译系统的原型。这篇文章分为三个主要部分:系统设计,数据集,深度学习模型训练和评估。

视觉系统

视觉是手语中的一个关键因素,每种手语都旨在被位于另一个人前面的一个人理解,从这个角度来看,一个手势是完全可以观察到的。从另一个角度看一个手势很难或者几乎不可能被理解,因为不是每个手指的位置和动作都能被观察到。

试图从第一视觉的角度理解手语也有同样的局限性,一些手势最终看起来也是一样的。但是,这种模糊性可以通过在不同的位置放置更多的摄像机来解决。这样,一台摄像机看不到的东西,可以被另一台摄像机完美地观察到。

视觉系统由两个摄像头组成:一个头戴式摄像头和一个胸戴式摄像头。有了这两个摄像头,我们可以获得标志的两个不同视图,俯视图和仰视图,它们一起工作来识别标志。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从俯视图和仰视图的角度看,与巴拿马手语中的字母 Q 相对应的标志(图片由作者提供)

这种设计的另一个好处是用户将获得自主权。这在传统方法中是无法实现的,在传统方法中,用户不是残障人士,而是需要在签名人进行签名时拿出带有摄像头的系统并对签名人进行对焦的第三人。

资料组

为了开发该系统的第一个原型,使用了来自巴拿马手动字母表的 24 个静态标志的数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

巴拿马手语字母(来源: SENADIS,Lengua de seas paname as)

为了将该问题建模为图像识别问题,诸如字母 J、Z、RR 和等动态手势被丢弃,因为它们增加了解决方案的额外复杂性。

数据收集和预处理

为了收集数据集,要求四个用户佩戴视觉系统,并在 10 秒钟内执行每个手势,同时两台摄像机以 640x480 像素的分辨率进行记录。

要求用户在三种不同的场景中执行该过程:室内、室外和绿色背景场景。对于室内和室外场景,用户被要求在执行手势时四处移动,以便获得具有不同背景、光源和位置的图像。绿色背景场景是为数据扩充过程设计的,我们将在后面描述。

获得视频后,提取帧并将其缩小到 125x125 像素的分辨率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从左至右:绿色背景场景,室内和室外(图片由作者提供)

数据扩充

由于进入卷积神经网络之前的预处理被简化为仅仅是重新缩放,背景将总是被传递给模型。在这种情况下,模型需要能够识别标志,尽管它可能有不同的背景。

为了提高模型的泛化能力,人为地添加了更多的不同背景的图像来代替绿色背景。这样可以获得更多的数据,而不需要投入太多的时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有新背景的图像(作者提供的图像)

在训练过程中,还添加了另一个数据扩充过程,包括执行一些转换,如一些旋转、光强变化和重新缩放。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

旋转、光强度和缩放的变化(图片由作者提供)

选择这两个数据扩充过程是为了帮助提高模型的泛化能力。

顶视图和底视图数据集

该问题被建模为具有 24 个类别的多类别分类问题,并且该问题本身被分成两个更小的多类别分类问题。

决定哪些手势将被用顶视图模型分类以及哪些手势将被用底视图模型分类的方法是选择从底视图角度看太相似的所有手势作为将被从顶视图模型分类的手势,并且剩余的手势将被由底视图模型分类。所以基本上,俯视图模型是用来解决歧义的。

因此,数据集分为两部分,每个模型一部分,如下表所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深度学习模型

作为最先进的技术,卷积神经网络是面对这一问题的选择。它被训练成两个模型:一个模型用于俯视图,一个模型用于仰视图。

体系结构

相同的卷积神经网络架构用于俯视图和仰视图模型,唯一的区别是输出单元的数量。

下图显示了卷积神经网络的体系结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积神经网络体系结构

为了提高模型的泛化能力,在全连接层中使用层间丢弃技术来提高模型性能。

估价

这些模型在一个测试集中进行了评估,测试数据对应于系统在室内的正常使用,换句话说,在背景中出现了一个充当观察者的人,类似于上图中的输入图像(卷积神经网络架构)。结果如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然模型学会了对一些标志进行分类,比如 Q,R,H;总的来说,结果有点令人沮丧。这些模型的泛化能力似乎不太好。然而,该模型也用显示系统潜力的实时数据进行了测试。

底部视图模型用具有绿色均匀背景的实时视频进行测试。我戴着胸前安装的摄像机以每秒 5 帧的速度捕捉视频,同时在我的笔记本电脑上运行底部视图模型,并尝试用手指拼写单词 fútbol(我最喜欢的西班牙语运动)。每个字母的条目都是通过点击来模拟的。结果如下面的视频所示。

与实时视频一起运行的底视图模型的演示视频

注意:由于模型的性能,我不得不重复几次,直到我有了一个好的演示视频。

结论

如果我们考虑这种系统需要理解和翻译的所有可能的手势组合,手语识别是一个困难的问题。也就是说,解决这个问题的最好方法可能是将它分成更简单的问题,这里介绍的系统将对应于其中一个问题的可能解决方案。

该系统表现不太好,但它被证明可以仅使用相机和卷积神经网络构建第一人称手语翻译系统。

据观察,该模型往往会将几个符号相互混淆,如 U 和 w。但仔细想想,也许它不需要有完美的性能,因为使用正字法校正器或单词预测器会提高翻译准确性。

下一步是分析解决方案,研究改进系统的方法。通过收集更高质量的数据,尝试更多的卷积神经网络架构,或重新设计视觉系统,可以实现一些改进。

结束词

我开发这个项目作为我大学论文工作的一部分,我的动力来自于在新事物中工作的感觉。虽然结果不太好,但我认为这是一个很好的起点,可以让系统变得更好、更大。

如果你对这项工作感兴趣,这里有我的论文的链接

感谢阅读!

Linux 中的信号

原文:https://towardsdatascience.com/signals-in-linux-b34cea8c5791?source=collection_archive---------16-----------------------

我写这篇文章是为了做笔记的参考。我希望分享这篇文章对那些有兴趣了解 Linux 的人有所帮助。如果你发现任何错误或错别字,评论他们,我会尽快纠正。谢谢,继续学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由亚伦·伯顿Unsplash 上拍摄

一旦你开始熟悉 Linux 系统,信号是你经常会遇到的基本事物之一。了解它们是如何工作的很重要,因为信号在过程中起着很大的作用。

像往常一样,我们将从一些基础开始,然后转移到一些高级主题。

信号是对流程的通知,表示事件已经发生。信号有时被称为软件中断,因为在大多数情况下,它们会中断程序的正常执行流程,并且它们的到来是不可预测的。

信号可以由内核或进程发送。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接收信号的不同方式

在本文的其余部分,我们将关注内核发送的信号,而不是进程。

在下列情况下,内核可以向进程发送信号:

  1. 当出现硬件异常并且需要将该异常通知给进程时。例如,试图除以零,或引用不可访问的内存部分。
  2. 一些软件事件发生在过程的控制之外,但是影响了过程。例如,输入在文件描述符上变得可用,终端窗口被调整大小,进程的 CPU 时间限制被超过,等等。
  3. 用户键入了一些终端特殊字符,如中断(Ctrl+C)或暂停字符(Ctrl+Z)。

内核发送的通知进程事件的信号称为传统信号。

什么是待定信号?

由于某些事件而生成信号后,它不会直接传递给进程,而是保持在一个称为挂起状态的中间状态。这在以下情况下是必需的:

  • 进程现在没有安排 CPU。在这种情况下,一旦该进程下一次计划运行,就发送一个挂起信号。
  • 从流程的角度来看,为了确保某个信号不会在某个关键部分执行期间到达,流程可以将信号添加到其流程的信号掩码中,信号掩码是一组当前被阻止传递的信号。进程的信号掩码是每个进程的属性。如果信号在被阻塞时生成,它将保持挂起状态,直到后来被解除阻塞。有各种系统调用允许一个进程从它的信号掩码中添加和删除信号。

当信号到达时会发生什么?

当一个信号即将被发送时,根据该信号发生以下默认动作之一:

  1. 信号被忽略,也就是说,它被内核丢弃,对进程没有影响。(该过程仍然不知道该事件已经发生。)
  2. 进程被终止,也称为异常进程终止,与程序使用 exit()终止时发生的正常进程终止相反。
  3. 生成一个核心转储文件,并终止该过程。
  4. 暂停或恢复进程的执行。

一个进程可以不接受特定信号的默认动作,而是通过改变信号传递时发生的动作来设置信号的处理。程序可以设置以下配置之一:

  1. 默认动作应该发生。这有助于撤销之前对信号配置的更改,而不是将其更改为默认值。
  2. 该信号被忽略,而不是终止该过程的默认动作。
  3. 执行已建立的信号处理器。信号处理器是一个定制的功能,它执行适当的任务以响应信号的传递。当信号到达时通知内核应该调用一个处理函数,这被称为建立安装一个信号处理程序。不可能将信号的配置设置为终止或转储核心,除非其中之一是信号的默认配置。

信号 SIGKILL 和 SIGSTOP 不能被捕捉、阻止或忽略。

怎么发信号?

可以使用 kill 系统调用或 kill 命令发送信号,并指定所需的进程 pid。

我们使用术语‘kill’是因为大多数信号终止一个进程的默认动作。

传递给 kill 的过程 pid 根据以下情况进行解释:

  1. 如果 pid > 0,则信号被发送到具有指定 pid 的特定进程。
  2. 如果 pid = 0,则信号被发送到同一进程组中的每个进程。
  3. 如果 pid < -1, then the signal is sent to every process in the process group whose process group id is modulus of |pid| specified.
  4. If pid = -1, then the signal is sent to all the processes for which the calling process has permission to send a signal, except init 和调用过程本身。以这种方式发送的信号被称为广播信号

还存在另一个函数 raise() ,它向调用进程本身发送信号。这样发送信号,使得该信号甚至在 raise 函数返回之前就被进程接收到。请将此视为 IP 网络的本地回环类比。

对于单线程实现,int raise(int sig)被实现为kill(getpid(), sig)

对于多线程实现,int raise(int sig)被实现为pthread_kill(pthread_self(), sig)

零信号

发送信号的一个有趣的用例是检查进程的存在。如果调用 kill() 系统调用时,信号参数为‘0’,也称为空信号,则不会发送任何信号,它只是执行错误检查,以查看是否可以向进程发送信号。

这意味着我们可以使用这种机制来检查进程的存在。当试图发送空信号时,可能会出现以下响应之一:

  1. 如果出现错误 ESRCH,则意味着目标进程不存在。
  2. 如果出现错误 EPERM,那么这意味着目标进程存在,但是您(调用方进程)没有足够的权限向该进程发送信号。
  3. 如果调用成功,那么这意味着目标进程存在,并且调用者有权向它发送信号。

各种可用信号

通过对应一个特定的信号编号,我们可以使用 strsignal 函数来获得信号描述。此外,您可以查看信号的手册页

下面列出了原始 POSIX . 1–1990 标准中描述的信号。

 Signal     Value     Action   Comment
   ────────────────────────────────────────────────────────────────────
   SIGHUP        1       Term    Hangup detected on controlling
                                 terminal
                                 or death of controlling process
   SIGINT        2       Term    Interrupt from keyboard
   SIGQUIT       3       Core    Quit from keyboard
   SIGILL        4       Core    Illegal Instruction
   SIGABRT       6       Core    Abort signal from abort(3)
   SIGFPE        8       Core    Floating point exception
   SIGKILL       9       Term    Kill signal
   SIGSEGV      11       Core    Invalid memory reference
   SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                 readers
   SIGALRM      14       Term    Timer signal from alarm(2)
   SIGTERM      15       Term    Termination signal
   SIGUSR1   30,10,16    Term    User-defined signal 1
   SIGUSR2   31,12,17    Term    User-defined signal 2
   SIGCHLD   20,17,18    Ign     Child stopped or terminated
   SIGCONT   19,18,25    Cont    Continue if stopped
   SIGSTOP   17,19,23    Stop    Stop process
   SIGTSTP   18,20,24    Stop    Stop typed at terminal
   SIGTTIN   21,21,26    Stop    Terminal input for background 
                                 process
   SIGTTOU   22,22,27    Stop    Terminal output for background 
                                 process

使用信号集来表示一组信号。像 sigaction()sigprocmask() 这样的 API 可以使用信号集,它们允许程序指定一组信号。

每个进程的挂起信号集

如果一个进程接收到一个当前正在阻塞的信号,那么它将被添加到该进程的挂起信号集中。为了确定哪些信号对于一个进程是挂起的,一个进程可以使用int sigpending(sigset_t* set);系统调用,它通过修改set 结构返回调用进程挂起的信号集。

标准信号没有排队,因此当一个信号多次到达时,它被添加到待定信号集合(当然,它只有一个副本),并且当信号被解除阻塞时,它稍后仅被传送一次。

信号 API 概述

信号是对一个进程的事件已经发生的通知,可以由内核、另一个进程或它自己发送。信号的传递是异步的。您可以使用kill系统调用向进程发送信号。当信号到达时,可以通过使用signal()sigaction()建立信号处理器来修改进程的行为。

标准信号不排队,也就是说,发送到一个进程的多个信号将只作为一个被检索。

信号集用于同时处理多个信号。许多系统调用接受信号集。

当一个信号到达时,一个进程可以选择阻塞它,并且在稍后的时间,可以使用sigpending()系统调用获取一组未决信号,这将给出一组处于未决状态的信号。使用pause()系统调用,进程可以暂停执行,直到信号到达。

签名欺诈检测-一种高级分析方法

原文:https://towardsdatascience.com/signature-fraud-detection-an-advanced-analytics-approach-a795b0e588b2?source=collection_archive---------36-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

签名欺诈检测

在我的上一篇文章中,我以一种通用的方式讨论了高级分析在欺诈领域的应用。在这篇文章中,我将深入研究欺诈的一个具体领域——签名伪造。难怪机构和企业认为签名是认证交易的主要方式。人们签署支票,批准文件和合同,验证信用卡交易,并通过签名验证活动。随着签名文档的数量(及其可用性)大幅增加,签名欺诈也在增加。

根据最近的研究,仅支票欺诈每年就给银行造成约 9 亿美元的损失,其中 22%的欺诈支票归因于签名欺诈。显然,美国每年签发的支票超过 275 亿张(根据 2010 年美联储支付研究),对每天处理的数亿张支票进行人工签名的可视化比较是不切实际的。

大数据、基于分布式 Hadoop 的平台(如 MapR)的出现,使得经济高效地存储和处理大量签名图像成为可能。这使企业能够使用全面的历史交易数据,通过开发算法来发现欺诈签名的模式,从而实现传统视觉比较的自动化。

签名的艺术和科学:

在介绍自动签名验证的类型和详细方法之前,让我们了解一些与签名过程相关的概念和一些流行的神话,签名伪造的类型,以及静态签名图像的传统视觉比较的漏洞。

误解:同一个人的真实签名在所有交易中都完全相似

现实:签名的身体动作需要协调大脑、眼睛、手臂、手指、肌肉和神经。考虑到游戏中的所有因素,难怪人们每次都不会签完全相同的名字:一些元素可能会被省略或更改。个性、情绪状态、健康状况、年龄、个人签名的条件、签名可用的空间以及许多其他因素都会影响签名到签名的偏差。

签名伪造的类型:

在现实生活中,签名伪造是一个伪造者主要关注准确性而不是流畅性的事件。

签名伪造分为以下三类:

1.随机/盲目伪造—通常与真实签名很少或没有相似性。这种类型的伪造是在伪造者无法获得真实签名的情况下产生的。

2.不熟练的(描摹)伪造:签名被描摹在上,看起来像下面纸上的一个淡淡的凹痕。这个缩进可以作为签名的参考。

3.熟练伪造——由能够接触到一个或多个真实签名样本并能在大量练习后模仿它的犯罪者制造。熟练伪造是所有伪造中最难鉴别的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有效的签名验证系统必须能够通过可靠的定制算法来检测所有这些类型的伪造。

人工验证难题:

由于主观决定和因专业知识、疲劳、情绪、工作条件等人为因素而变化很大,人工验证更容易出错且不一致,在熟练伪造的情况下(离线方法)会导致以下情况:

错误拒绝:错误地拒绝标记欺诈性交易(当它们不是欺诈性交易时),对客户满意度产生负面影响,通常称为 I 型错误。

虚假接受:真实签名和熟练的伪造,操作者将其作为真实签名接受,导致财务和声誉损失,通常称为第二类错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

精确验证系统目标是最小化两种类型的误差。

标志性特征:

让我们来了解一下人类文档检查人员区分欺诈和真实的签名特征。以下是用于签名验证的静态和动态特征的非详尽列表:

摇晃的笔迹(静态)

提笔(动态)

修饰的迹象(静态和动态)

字母比例(静态)

签名形状/尺寸(静态)

倾斜/成角度(静态)

两个或多个签名非常相似(静态)

速度(动态)

笔压(动态)

压力变化模式(动态)

加速模式(动态)

曲线的平滑度(静态)

根据验证环境和样本收集条件,并非所有特性都可供分析

自动签名验证系统的类型:

如所讨论的,根据可行的(可用的)签名特征提取和商业/功能需求,市场上存在两种类型的签名验证系统。

a)离线签名验证:部署在无法监控个人实时签名活动的地方。在仔细检查签名的纸质文档的应用中,只有静态的二维图像可用于验证。由于明显原因,在这种类型的验证引擎中,动态特性。为了解决这些重要信息的丢失并产生高度准确的签名比较结果,离线签名验证系统必须模仿人类法医文档检查员使用的方法和途径。这种方法严重依赖于繁琐的图像预处理(图像缩放、大小调整、裁剪、旋转、滤波、梯度方向直方图阈值、哈希标记等)。)和娴熟的机器学习技能。这里主要使用的特征本质上是静态的——图像纹理(小波描述符)、几何和拓扑(形状、大小纵横比等)。)、笔画位置、手写相似性等。

尽管存在许多限制,但在大多数现实生活中,支票交易和数字文档验证签名是预先执行的,并且没有实时签名监控的范围来捕捉动态特征。

对于离线签名验证,机器学习任务可以进一步分类为 1)一般学习(与人无关)-通过以 1∶1 的基础将被质疑的签名与每个已知签名进行比较来执行验证任务,以及 2)特殊学习(与人相关)-验证被质疑的签名是否落入同一个人的多个真实签名的变化范围内。

b)在线签名验证:签名是基于重复动作的反射动作,而不是故意控制肌肉,即使精确的伪造也比真正的签名需要更长的时间才能产生。顾名思义,这种类型的验证系统捕捉关键的动态特征,如速度、加速度和压力等。,是可行的。这种类型的系统更准确,因为即使对于复印机或专家来说,模仿原始签名者的独特行为模式和特征实际上也是不可能的。

实验简介:

让我们讨论一个在模拟环境中的简单的离线验证解决方案。对于该研究,从 40 个人中准备数据,每个人贡献 25 个签名,因此具有 1000 个真实签名。然后随机选择受试者伪造另一个人的签名,15 个/个人,这样就有 600 个(相当于欺诈的过度抽样)伪造。现在有 25 个真实签名/人和 12 个伪造签名/人,数据被随机分成训练(75%)和验证(25%)数据,确保在训练数据中至少有 15 个真实签名/人。目标是建立一个离线算法签名验证系统,该系统采用独立于个人的学习方法,是一个引擎,用于确定验证中的被质疑签名是否属于某个特定的个人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:真实签名样本图:个人样本(真实和伪造)

解决方案框架:

独立于个人的监督学习:学习问题被转换成两类分类问题,其中输入由一对签名之间的差异(相异度)组成,并且真实签名出现的几率根据从良好(真实的)和不良(伪造的)群体的距离(配对签名的相异度分数)的适当参数分布中引用的似然比(LR)来计算。然后,将一个人的来自其真实签名的被质疑签名拟合到该分布,以计算 LR 分数,并且基于 LR 和预先指定的阈值(基于最大准确度),对于特定的人,将采取被质疑签名(来自测试数据)是否是真实的分类决定。

模型方程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在哪里

P(Dg(i)|d)是距离 d 处 Dg(真实)分布的概率密度函数值

P(Db(i)|d)是距离 d 处 Db(伪造)分布的概率密度函数值

  • n 是用于 1:1 比较的来自一个人的已知样本的数量

ψ是预先指定的大于 1 的阈值

尽管建模任务是直接的,但是需要大量的图像预处理来基于提取的静态特征计算签名对之间的距离/距离向量(d)。也适合参数模型的选择和最佳截止值的调整。

涉及的步骤:

a)特征提取:这是一个高度技术性的领域,涉及复杂的图像处理,以提取特定人的区别要素和要素组合。

1)图像预处理和网格形成:每个签名经过灰度变换后,进行椒盐噪声去除和倾斜归一化处理。然后,在适当的大小调整、裁剪和其他扩充过程之后,每幅图像都用 4x7 网格重新构建

2)二进制特征向量提取:从像素图像网格和相应的局部直方图单元中提取 GSC(梯度、结构和凹度)特征图,该特征图被量化为 1024 比特的二进制特征向量(G、S 和 C 特征的求和比特)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:图像网格和 1024 位二进制特征向量

b)相似性(距离)度量:开发用于成对图像的点对点匹配的高斯界标(exp(ri J2/2σ2))集,并且使用总体相似性或距离度量来计算表示两个签名之间匹配强度的分数。相似性度量将成对数据从特征空间转换到距离空间。几个。这里使用的是汉明距离法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(很抱歉由于篇幅限制,没有在这里详细说明这些主题,我们将在另一篇文章中讨论。)

c)模型训练(分布拟合):训练数据的这些成对距离(d)被分类成两个向量,所有真实签名对之间的距离的 Dg 向量(样本真正来自相同的人)和所有伪造签名对之间的距离的 Db 向量(样本来自不同的人)。这两个距离向量可以使用已知的分布如高斯或伽马来建模。在这个例子中,伽马分布与数据吻合得很好。

d)似然比(LR)和分类决策:在上述预处理和距离得分(成对相异)点被投影到拟合的密度曲线上以获得 LR 值-P(Dg|d)/ P(Db|d)之后,来自未标记数据(这里来自验证)的特定人的可疑签名与该人的真实签名 1∶1 匹配。如果似然比大于 1,则分类决定是两个样本确实属于同一个人,如果比值小于 1,则它们属于不同的人。如果一个人总共有 N 个已知样本,那么对于一个有问题的样本,可以执行 N 个 1∶1 的验证,并且将似然比相乘。为方便起见,采用对数似然比(LLR)而不是似然比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:分布拟合和分类决策

性能评估:尽管有明显的重叠区域,上述分布在区分两个区域(真实和欺诈)方面做得相当好。显然,判决边界由 LLR 的符号给出,并且可以使用阈值α来构造修改后的判决边界,使得 log P(Dg | d)log P(Db | d)>α。定义为[1-((错误接受+错误拒绝)/2)]的模型精度在特定的α值时最大。这涉及模型调整,对于指定数量的已知样本,α的最佳设置表示为工作点。在由不同数量的已知样本(12-15 个)生成的 ROC 曲线中,工作点显示为’ * '。整体准确率在 77%左右。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图:模型调优和性能

改进和前进的道路:

通过这个实验和简单的解决方案,达到了适度的准确性。然而,精度可以通过更大的训练数据、与其他模型的拟合和集成来提高,包括非参数方法(深度学习、CNN 等)。).此外,将图像对之间的其他距离度量(例如,Levenshtein 距离、切角距离)合并为附加特征和/或对这些相异特征进行简单/加权平均,将使相异度量更加稳健和可靠,从而为模型增加更多的辨别能力。

最后,尖端的签名验证系统需要具有适应性、灵活性和准确性。这需要对不断增长的数据集进行深入分析,并对生产模型进行持续更新,以便效率随着时间的推移保持稳定,这与人工操作员在高容量情况下获得的结果不同。

使用 Python 测试测量数据的重要性

原文:https://towardsdatascience.com/significance-testing-survey-data-with-python-1e83149257d6?source=collection_archive---------46-----------------------

如果驾驶员是盲目的,数据驱动的结果是无用的,但是显著性测试可以为您指明方向

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对婚姻状况是否会影响人们投票方式的视觉探索。投票率明显高于平均投票率的群体(最左边一列)显示为绿色,较低的群体显示为红色,不显著的结果显示为白色。

世界上大多数人会通过猜测或凭直觉来做决定。他们要么是幸运的,要么是错误的。— 混合面板

Mixpanel 的6500 万美元投资者推介的开场白引人注目。要么你在用数据,要么你就是个傻子。我想补充一句口头禅。

世界上大多数人不去想 统计意义 。它们将是数据驱动的,但方向是错误的。— 盖尔

好吧,Mixpanel 的更好,但你明白了。

投票意向和婚姻状况

比方说,我们在政治民意调查中发现了一个趋势,可以帮助我们决定谁是我们竞选活动的目标。比如已婚人士。他们投票的方式与单身人士不同吗?我们应该在单身酒吧竞选吗?

开源库 Quantipy 可以读取所有主要的调查平台数据类型,包括 SPSS 的.sav文件。这张来自英国 2019 年大选。

import quantipy as qp
dataset = qp.DataSet('Elections 2019')
dataset.read_spss('election survey.sav')

让我们看看从原始数据中选择的几个列是什么样子的:

dataset[['Gender', 
         'VoteIntention', 
         'MaritalStatus', 
         'weight']].head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了加快计算速度,SPSS 将不同的答案存储为数字,然后使用元数据将这些数字映射到答案。(稍后,我们将讨论如何计算一个weight列来改进我们的结果)。现在让我们坚持投票意向:

dataset.meta('VoteIntention')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比较对元数据的回应,我们看到第一个回应都来自保守派选民,而这些相同回应的婚姻状况各不相同。它会影响人们投票的方式吗?让我们来计算一下:

dataset.crosstab('VoteIntention', 
                 'MaritalStatus', 
                 pct=True,        #percentages, not frequencies
                 w='weight')      #weigh the results

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

啊哈!所以,已婚人士投 CON,单身人士投 LAB。也许这是年龄的问题。但是民事伴侣关系中的人是怎么回事呢?他们更有可能投票给保守党而不是工党,在整个人口中,保守党的比例为 54%,工党为 16%,而保守党为 40%,工党为 33%。

在我们开始写新闻稿之前,我们必须问自己:这是真的吗,还是只是数据中的噪音?

使用 Python 测试测量数据的重要性

测试调查结果的重要性(sig 测试)可能是一项艰巨的任务。数据本身可能是复杂的,当它被加权以更好地代表被调查的人口时,它变得更加棘手。有时所谓的有效基数应该用于测试,有时不用于测试。市场研究行业还依赖于使用专有程序,如 UNICOM Intelligence(又名 Dimensions)和 Askia,能够复制这些应用程序的结果非常重要。

Quantipy 有助于应对所有这些挑战。让我们运行一个复制维度设置的基本 sig-test,它使用一个汇集的方差并控制由加权和重叠样本引入的偏差。

batch = dataset.add_batch(name='vote_intention')
batch.add_downbreak('VoteIntention')
batch.add_crossbreak('MaritalStatus')
batch.weights.append('weight')
batch.set_sigtests([0.05])
stack = dataset.populate(['vote_intention'])
stack.aggregate(['counts', 'cbase'], 
                batches=['vote_intention'], verbose=False)
stack.add_tests(['vote_intention'])

在上面的代码中,我们使用 Quantipy 的batch机制,以防我们想要计算大量变量来填充我们的表格或 PowerPoint 图表。当我们运行代码时,我们得到一个所谓的stack来存储我们所有的结果;计算出的百分比、基数和显著性矩阵。矩阵看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NaN 表示无显著差异,星号标记的结果有效基数太低(答卷人太少,不显著),一组数字表示显著差异。在上面的例子中,已婚的反对者拥有数组[1,4],因此明显高于单身投票者和同居伴侣。单身选民在工党一栏中有结果[2,4],因此比已婚选民和同居选民更有可能投票给工党,但重要的是,民事伴侣一栏没有足够多的回应,因此不重要。

我们现在可以利用任何 python 网络应用环境(Django、Flask 等)。)来显示一个交互式的显著性表。下面是一个 Django 应用程序,它使用下拉菜单进行过滤,并将相关的响应子集发送到 sig-test 中。当重要的测试被应用和可视化时,探索数据子组的不同投票意图呈现出一个全新的维度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

民意测验结果意义的交互探索。绿色表示 a 结果明显高于“整体”组,红色表示较低,白色表示没有显著差异(通常是因为回答的数量太低)。

所以,不要发出关于民事伴侣关系中的人们将如何投票的新闻稿,因为需要更多的数据来获得有意义的见解,以了解结果是否重要,或者它是否只是数据中试图将我们引入歧途的噪音。

盖尔·弗雷松是 Datasmoothie 的联合创始人,这是一个专门从事调查数据分析和可视化自动化的平台。如果你对使用开源软件进行调查数据分析感兴趣,注册我们的时事通讯,名为自发认知

基于神经网络的有效波预测

原文:https://towardsdatascience.com/significant-wave-prediction-using-neural-network-7e5ee1b7f674?source=collection_archive---------35-----------------------

使用 Pytorch 进行试驾并比较车型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由塞拉斯·拜施Unsplash 上拍摄

序言

所以,现在我想用 PyTorch 测试一下我的技能。我是 PyTorch 的新手,以前我使用 Tensorflow 建立一个 ML 模型。我已经阅读了所有的基础教程,并准备使用真实的数据建立一个真实的模型。你最喜欢在哪个网站找到真实数据来测试你的模型?对我来说是 kaggle.com。在滚动所有可用的数据集后,我选择这个 wave 数据集。下载下来准备玩玩。

数据集的第一瞥

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这里我们有数据捕获的日期和时间,有效波高(Hs),最大波高(Hmax),过零波周期(Tz)(呃,我不知道这是什么),峰值能量波周期(Tp)(能量?在什么?我不知道),峰值方向(我想这是波从哪里来的一个方向?),最后是海面温度(SST)。我们有一个 30 分钟时间分辨率的数据集。-99.9是一个我认为没有数据的标志。我对海洋学数据不熟悉,但我会尽力而为。

在所有可用的列中,我所理解的只是 Hs、Hmax 和 SST(当然还有日期和时间)。我会试着预测他的。

Hs 预测

我只会玩我理解的数据(Hs,Hmax,SST)。让我们看看 Hs 和另外两个变量之间的相关性。在这个过程中,我们必须除掉-99.9。因此,在我们选择的 3 个变量中的任何一个变量中包含该数字的数据都将被忽略。这是代码

这是 Hs 和 Hmax 的散点图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

看起来非常好。他们的相关系数是 0.97,近乎完美。但是等等,Hmax是观测到的最高浪高,Hs是最高浪高的平均值。所以如果我们把这个变量作为 Hs 的一个预测因子包括进来,那只是多余的 Hs 。对于SST

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

相关系数为 0.26。看起来很糟糕。所以最后的选择只是用Hs来预测Hs。我们将尝试使用Hs的历史时间序列来预测未来Hs

对于第一次尝试,我们使用 3 小时的 Hs 数据来预测接下来的 30 分钟。在此之前,我们将首先尝试构建一个参数和标签数据集。如果我们每次尝试对模型进行实验时,都试图合并构建参数、标签部分和模型部分,这将会非常耗时。

现在使用已经构建的参数和标签数据,我们将尝试使用所有数据预测Hs。让我们使用一个多层感知器模型。

这里我们用最后的 10000 个数据作为测试数据,剩下的是训练数据。现在,我们如何对该模型进行基准测试?让我们用数据的标准差为什么?如果你仔细看看标准差的公式,实际上和只输出数据平均值的模型的 RMSE是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们对数据一无所知,这是最简单的预测方法。Hs 数据的标准偏差为 0.5。所以,模型的误差必须低于这个值才能做出好的预测。

我们 MLP 模型的 RMSE 是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

0.077(图片作者)

Hs数据标准差的 0.15。让我们看看这个 MLP 模型的训练和测试误差的图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在早期阶段,它收敛得非常快,后来它慢下来。无论如何,在我在这里发布这个结果和图表之前,我尝试了 MLP 超参数的许多组合,对于每个超参数的组合,你都会得到稍微不同的结果和图表(是的,即使你不做任何改变,只是重新运行模型,你也会得到稍微不同的结果,因为这是神经网络的本质)。我觉得这是目前为止最好的组合。

我们能改善这一点吗?也许,让我们试着使用长短期记忆(LSTM)模型。

RMSE 是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

0.76(图片由作者提供)

误差正在改善,但只是一点点。这是 LSTM 的训练和测试图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它收敛的方式和 MLP 一样(图片由作者提供)

该模型在早期收敛非常快,之后像 MLP 一样以指数速度减慢。

下一次尝试,让我们只使用一部分数据。让我们只使用第 3400 个数据,然后倒数第 96 个将是测试数据。只需在代码中编辑testing_data_numall_paramall_label即可。

这是 MLP 的结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

对于 LSTM 来说

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

耶,越来越好了,但这一次,MLP 比 LSTM 好。正如您在训练和测试图中看到的,尽管训练数据中存在波动,但测试数据的误差在稳步下降。这个故事的寓意是,当你的训练误差增加或波动时不要害怕,这并不意味着同样的事情会发生在你的测试数据中。这只是算法概括你的模型的一种方式。

收场白

这就是使用 PyTorch 的试驾。你还可以改进这个模型,比如尝试预测Hs但在未来多时间步,或者只是调整超参数以获得更好的结果。你可以在这里得到完整的代码。另一篇文章再见。

参考

https://www . ka ggle . com/jolasa/waves-measuring-buoys-data-mooloolaba(波浪数据集)

https://en.wikipedia.org/wiki/Standard_deviation

意义重大?你真的是说可辨别的

原文:https://towardsdatascience.com/significant-you-really-mean-detectable-b3e8819e3491?source=collection_archive---------39-----------------------

关于统计显著性的两个常见错误短语

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伊恩·帕内洛在的照片 https://www . pexels . com/photo/放大镜教科书-4494644/

(注:2020 年 10 月 13 日,我将“检测”改为“辨别”,以避免与信号检测或异常检测等领域相关的分析混淆。)

统计学意义从来都不意味着科学上的重要性。…总之,“统计显著性”——不要说也不要用。( Wasserstein 等人,2019 年,在美国统计协会的出版物《美国统计学家》)

每当我听到一位讲师、主持人或研究人员说“显著的”,而他们的意思显然是“统计上显著的”,你可能会看到我抽搐(“T8”),这实际上与“临床上显著”或“科学上显著”没有任何关系。参见瓦瑟斯坦等人,2019 ,以及瓦瑟斯坦和耶戈,2016 。这些认知上的打嗝把我从他们原本谨慎的科学叙述中拉了出来——让我担心他们可能从根本上误解了他们的分析结果。

这肯定不是你想从你的统计同事那里听到的!因此,这里是我的简短尝试,以帮助纠正关于研究结果的两个常见短语。它们是错误的,因为它们通常被误解。

我将分享每个错误的短语,它的解释,和一个更好的短语。如果你感兴趣,我在最后提供了错误短语 1 的详细推理。(作为练习,你应该试着对错误的短语 2 应用类似的推理。)

(如果你想通过一个带有代码和一些数学的 R 中的工作示例来深入了解细节,请参见我之前的帖子: 混淆 P 值与临床影响:显著性谬误 )

错误短语 1:减少/增加

结果显示 D 显著降低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Anthony拍摄 https://www . pexels . com/photo/animals-avian-beaks-birds-133615/

解释

  • **常见误解:**结果中出现了具有科学或临床意义的、重要的、有意义的或有用的 D 减少。
  • 正确的解释:* 有显著的统计证据表明,平均结果存在真实的未知变化(即减少/增加),且不为零(例如非零)。如果这项研究设计和执行得当,那么这一证据表明,我们从样本中计算出的 D 的减少是对真实的未知的 c 变化的一个很好的估计。

相关的统计测试结果说绝对没有关于 C 在科学上或临床上是否显著、重要、有意义或有用的内容 ( Wasserstein et al,2019瓦瑟斯坦和耶戈,2016 。它只是告诉我们,有足够的统计证据(随着样本量的增加而增加)来辨别C 可能不为空,因为我们的估计值 D(我们假设它是 C 的一个很好的估计值)表明 C 减少了。

一个更好的短语

结果中 D 的减少*。*

具体来说,在结果样本平均值中有一个统计学上可辨别的 D(我们假设是 C 的一个很好的估计)的减少。

错误短语 2:联想

变量 X 和 y 之间没有显著的联系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Nextvoyagehttps://www . pexels . com/photo/white-boat-sailing-near-islands-during-golden-hour-1481096/

解释

  • **常见误解:**变量 X 和 y 之间没有科学或临床上显著、重要、有意义或有用的关系。
  • **正确解释:**没有显著的统计证据表明变量 X 和 Y 之间真实的、未知的统计关联不是空的(例如,零相关,线性关联)。如果这项研究设计和执行得当,那么这个证据表明我们从样本中计算出的关联 Z(基本上是零关联),是对真实的未知关联 a 的一个很好的估计。

相关的统计测试结果说绝对没有关于 A 在科学上或临床上是否显著、重要、有意义或有用的内容 ( Wasserstein et al,2019沃瑟斯坦和耶戈,2016 年。它只是告诉我们,没有足够的统计证据(随着样本量的增加而增加)来辨别A 可能不为空,因为我们的估计值 Z,我们假设它是 A 的一个很好的估计值,表明基本上是零关联。

一个更好的短语

变量 X 和 Y 之间没有可识别的 关联。

具体来说,变量 X 和 y 之间没有统计上可辨别的联系,用 Z 来衡量(我们假设这是对 A 的一个很好的估计)

详细推理:错误短语 1

最初的短语调用了三个关键量:

  1. 平均结果中 C 的真实变化是未知的。如果我们有目标人群的所有相关数据,这就是我们简单计算的结果。
  2. 相反,我们必须从目标人群中抽取样本来估算这个数量。我们的特殊估计 D 可能接近也可能不接近 c。
  3. 非零(例如非零)C 的统计证据量定义为“矛盾证明”,如下所示。如果 C 真的为零(即,如果平均结果真的没有任何变化),观察到我们的估计值 D 或更极端值的概率是多少?这个概率被称为一个 p 值,通常是使用你的样本近似得到的*。*

对于像 D 这样的给定估计,这个 p 值随着样本量的增加而减小;即零假设的“矛盾”越来越大。“统计显著性”被宽泛地定义为这个 p 值的一些倒数:p 值越低,统计显著性越高。也就是说,如果我们从一个更大的样本中计算出相同的精确值 D,D 将会更有统计学意义。如果我们从一个更小的样本中计算出同样精确的 D 值,D 的统计意义会更小。

相关统计假设检验:

  • 确实回答:“我们有多少证据证明非空 C 的存在呢?”换句话说,“我们有足够的证据来辨别一个非空的 C 吗?”
  • 没有回答:“我们有多少证据证明 C 在科学或临床上是重要的、重要的、有意义的或有用的?”再次提醒,请记住的统计显著性与的科学/临床显著性完全不同。特别是, C 不可能永远具有统计显著性,因为真实数量是固定值,通常与用于估计它们的样本大小无关。
  • 不回答:“D 近似 C 吗?”这是估计量(如样本平均值、MLE 估计量)和研究设计的一个属性。

这是对最后一点的一些粗略的直觉。

  1. 将你的评估者应用于你的整个目标人群(没有任何变化)。这只是计算某个固定的(即非随机的)量 t。
  2. 好的估计量对于 T 是统计一致的(即,对于样本量较大的 T 越来越无偏)。
  3. 但是你的估算者总会估算出一些东西!在统计机器学习中,如果你告诉它一个模式存在,你的聚类或预测算法总是会找到一个模式——即使没有模式。(感谢Daniela Witten教授在最近的一次演讲中清晰地展示了这一点,以及一些精彩的解决方案。)
  4. 确保 T=C 取决于你如何设计和执行你的研究:你如何制定你的科学假设,收集数据,并进行所有的分析。

所以通常的解释是错误的,原因有二:

  1. 它混淆了 D(已知样本量)和 C(未知总体量)。
  2. 它错误地声称你的样本提供了证据,证明 C 在科学或临床上是重要的、重要的、有意义的或有用的。

*注:错误短语 1

解释

  • 另一个正确的解释:“有重要的统计证据表明,结果中存在真实的、未知的非空(例如,非零)均值变化(即,减少/增加)。”

这是一个微妙但重要的区别,从早期的解释,并可以暗示不同的估计方差。例如,在前后或成对设计中,如果结果对相互关联,则先取平均值然后取差值的估计量比先相减然后取平均值的估计量更易变。

实际正确的解释将取决于研究设计和统计假设。

关于作者

Daza 博士是一名生物统计学家和健康数据科学家,他为个人(n-of-1)数字健康开发因果推断方法。| ericjdaza.com🇺🇸🇵🇭@ ericjdazalinkedin.com/in/ericjdaza|statsof1.org@ stat sof 1@ fsbiostats

轮廓系数

原文:https://towardsdatascience.com/silhouette-coefficient-validating-clustering-techniques-e976bb81d10c?source=collection_archive---------0-----------------------

验证聚类技术

在学习和应用了一些有监督的最大似然算法后,如最小二乘回归、逻辑回归、SVM、决策树等。我们大多数人都试图通过实现一些聚类技术,如 K-Means、DBSCAN 或 HDBSCAN,来进行一些实际操作的无监督学习。

我们通常从 K-Means 聚类开始。经过几个教程和中等故事,你将能够轻松实现 k-means 聚类。但是当你实现它的时候,一个问题开始困扰你:我们如何测量它的适合度?监督算法有许多指标来检查它们的拟合优度,如准确性、r 平方值、灵敏度、特异性等。但是,我们可以计算什么来衡量我们的聚类技术的准确性或良好性呢?这个问题的答案是剪影系数或者剪影分数。

轮廓系数:

轮廓系数或轮廓分数是用于计算聚类技术的良好性的度量。它的值范围从-1 到 1。

1:表示聚类彼此相距很远,并且可以清楚地区分。

0:表示聚类无关紧要,或者我们可以说聚类之间的距离不显著。

-1:表示以错误的方式分配簇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

剪影得分= (b-a)/max(a,b)

在哪里

a=平均类内距离,即类内各点之间的平均距离。

b=平均聚类间距离,即所有聚类之间的平均距离。

计算轮廓分数

导入库:

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
%matplotlib inline

生成一些随机数据:

为了运行聚类算法,我们生成 100 个随机点。

X= np.random.rand(50,2)
Y= 2 + np.random.rand(50,2)
Z= np.concatenate((X,Y))
Z=pd.DataFrame(Z) #converting into data frame for ease

绘制数据:

sns.scatterplot(Z[0],Z[1])

输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

对两个聚类应用 KMeans 聚类:

KMean= KMeans(n_clusters=2)
KMean.fit(Z)
label=KMean.predict(Z)

计算剪影分数:

print(f'Silhouette Score(n=2): {silhouette_score(Z, label)}')

输出:剪影分数(n = 2):0.8062615881652

我们可以说,当轮廓分数接近 1 时,聚类彼此相距很远。

为了检查我们的轮廓分数是否提供了正确的信息,让我们创建另一个散点图,显示带标签的数据点。

sns.scatterplot(Z[0],Z[1],hue=label)

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

从上图中可以清楚地看到,每个集群彼此相距很远。

让我们尝试 3 个集群:

KMean= KMeans(n_clusters=3)
KMean.fit(Z)
label=KMean.predict(Z)
print(f’Silhouette Score(n=3): {silhouette_score(Z, label)}’)
sns.scatterplot(Z[0],Z[1],hue=label,palette=’inferno_r’) 

输出:

侧影分数(n = 3):0.5468638636786

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

正如你在上面的图中看到的,集群没有很好的分开。簇 1 和簇 2 之间的簇间距离几乎可以忽略。这就是为什么 n= 3 的剪影分数(0.596)小于 n=2 的剪影分数(0.806)。

当处理更高维度时,轮廓分数对于验证聚类算法的工作非常有用,因为当维度大于 3 时,我们不能使用任何类型的可视化来验证聚类。

我们还可以使用轮廓分数来检查最佳聚类数。在上面的例子中,我们可以说最佳聚类数是 2,因为它的轮廓得分大于 3 个聚类的得分。

轮廓法——比肘法更好的寻找最优聚类的方法

原文:https://towardsdatascience.com/silhouette-method-better-than-elbow-method-to-find-optimal-clusters-378d62ff6891?source=collection_archive---------0-----------------------

k-Means 聚类中寻找最优聚类的剪影法深度分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Mediamodifier 来自 Pixabay

H 超参数是定义模型的模型配置属性,在模型训练期间保持不变。可以通过调整超参数来改变模型的设计。对于 K 均值聚类,有 3 个主要的超参数需要设置,以定义模型的最佳配置:

  • 聚类的初始值
  • 距离测量
  • 聚类数

聚类的初始值对聚类模型有很大的影响,有各种算法来初始化这些值。距离度量用于寻找到聚类中心的聚类中的点,不同的距离度量产生不同的聚类。

聚类数( k )是 K-Means 聚类中最重要的超参数。如果我们事先已经知道要将数据分组到的聚类数,那么就没有必要调整 k 的值。例如,对于 MNIST 数字分类数据集,k=10。

如果不知道 k 的最佳值,那么有各种方法可以找到 k 的最佳值。在本文中,我们将介绍两种这样的方法:

  • 肘法
  • 剪影法

弯头方法:

肘方法是一种为数据集寻找最佳聚类数的经验方法。在此方法中,我们选取一系列 K 的候选值,然后使用每个 K 值应用 K 均值聚类。找出聚类中每个点到其质心的平均距离,并在图中表示出来。选择 k 的值,此时平均距离突然下降

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),肘法求最优 k

随着聚类数(k)的增加,平均距离减小。要找到最佳聚类数(k ),请观察该图并找到距离急剧下降时的 k 值。这将是 k 的一个最佳点,在这里出现一个弯头。

在上图中,平均距离在 k=2、3 和 4 处急剧下降。这里出现了选择 k 的最佳值的困惑。在下图中,观察对于 k=2、3 和 4 形成的集群及其平均距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),k=2、3 和 4 时形成的簇的散点图

这个数据是 2-D 的,所以很容易可视化并挑选 k 的最佳值,即 k=4。对于更高维的数据,我们可以使用剪影法来寻找最佳 k,这是一种比肘法更好的替代方法。

剪影方法:

剪影法也是一种寻找最佳聚类数以及解释和验证数据聚类一致性的方法。剪影方法计算每个点的剪影系数,该系数测量一个点与其自己的聚类相比与其他聚类相似的程度。通过提供一个简洁的图形表示来显示每个对象的分类情况。

计算每个点的轮廓系数,对所有样本进行平均,得到轮廓分数

剪影值是一个对象与其自己的聚类(内聚)相比与其他聚类(分离)相似程度的度量。轮廓值的范围在[1,-1]之间,其中高值表示对象与其自己的簇匹配良好,而与相邻簇匹配较差。如果大多数对象都有较高的值,那么集群配置是合适的。如果许多点具有低值或负值,则聚类配置可能具有太多或太少的聚类。

计算轮廓系数:

求第 I 个点的轮廓系数的步骤:

  1. 计算 a(i):该点与同一聚类中所有其他点的平均距离。
  2. Compute b(i):该点与离其聚类最近的聚类中所有点的平均距离。
  3. 使用下述公式计算 s(I)-轮廓系数或第 I 点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),a(i)和 b(i)的图解表示,根据上述公式计算轮廓系数— s(i)

计算出每个点的轮廓系数后,将其平均以获得轮廓分数。

轮廓分析:

轮廓是对聚类算法执行情况的一种度量。在计算了数据集中每个点的轮廓系数之后,绘制它以获得数据集被聚类到 k 个聚类中的程度的可视化表示。轮廓图显示了一个聚类中的每个点与相邻聚类中的点的接近程度,从而提供了一种视觉评估聚类数量等参数的方法。这个度量的范围是[-1,1]。

**Important Points:
The Silhouette coefficient of +1** indicates that the sample is far away from the neighboring clusters.
**The Silhouette** coefficient **of 0** indicates that the sample is on or very close to the decision boundary between two neighboring clusters.
**Silhouette** coefficient **<0** indicates that those samples might have been assigned to the wrong cluster or are outliers.

使用轮廓分析找到“k”的最佳值:

与之前的 Elbow 方法类似,我们选取 K(聚类数)的一系列候选值,然后为每个 K 值训练 K 均值聚类。对于每个 K 均值聚类模型,在图中表示轮廓系数,并观察每个聚类的波动和异常值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),Silhoutte 得分与聚类数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),KMeans 中每个聚类的轮廓分析和散点图,使用 n_cluster=[2,3,4,5,6]对整个数据进行聚类

从上面的轮廓图观察:

  • 轮廓图显示了 3 的 n_cluster 值是一个糟糕的选择,因为 cluster_label=0 的聚类中的所有点都低于平均轮廓分数。
  • 轮廓图显示 5 的 n_cluster 值是一个糟糕的选择,因为 cluster_label=2 和 4 的聚类中的所有点都是低于平均的轮廓分数。
  • 剪影图显示了 6 的 n_cluster 值是一个不好的选择,因为 cluster_label=1、2、4 和 5 的群集中的所有点都是低于平均的剪影分数,并且还由于异常值的存在。
  • 剪影分析在决定 2 和 4 之间更加矛盾。
  • 当 n_clusters=2 时,cluster_label=1 的聚类的轮廓图的厚度在尺寸上更大,这是由于将 3 个子聚类分组为一个大聚类。
  • 对于 n_clusters=4,所有曲线或多或少具有相似的厚度,因此具有相似的大小,这可以被认为是最佳“k”。

实施:

代码来源,作者编辑

结论:

肘和剪影方法用于寻找最佳数量的集群。对于选取 k 值的肘方法,会出现不确定性。侧影分析可用于研究所得聚类之间的分离距离,并且与肘方法相比,被认为是更好的方法。

剪影分析还增加了优势以发现异常值(如果存在于聚类)。

参考资料:

[1]维基百科:剪影(聚类),(2020 年 9 月 14 日)

[2] Scikit 学习文档:选择对 KMeans 聚类进行轮廓分析的聚类数

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。

[## 加入我的推荐链接-萨蒂扬库马尔媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

satyam-kumar.medium.com](https://satyam-kumar.medium.com/membership)

感谢您的阅读

剪影还是手肘?这是个问题。

原文:https://towardsdatascience.com/silhouette-or-elbow-that-is-the-question-a1dda4fb974?source=collection_archive---------45-----------------------

人工智能笔记

深入探讨集群中最常见的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Vladimir MokryUnsplash 上拍摄的照片

当您想要对没有标注的数据集进行聚类时,您遇到的最常见的问题之一是“正确的聚类数是多少?”。例如,当您使用要求您固定聚类数的 k-means 算法时,这个问题经常出现。这个问题我遇到过很多次,我相信你也一样。

当您处理高维数据时,这个问题会变得更有争议。真实世界的数据通常是高维的,您需要降低它的维度来可视化和分析它。与降维空间相比,原始空间中的聚类结果可能不同。您使用了相同的算法,但您看到了差异。这意味着聚类结果对空间维度敏感,这主要是由于这些空间中的距离度量的性能,也称为维数灾难。

与降维空间相比,原始空间中的聚类结果可能不同。换句话说,聚类结果对空间维度很敏感。不要惊慌!

在这篇文章中,我不想解释剪影和肘方法背后的数学。你可能很容易在别处找到它。然而,我想分享我使用这些方法的经验,以及一些可能对你有帮助的见解。

—没有正确的集群数量,但有一个最佳数量。

让我直说吧。没有正确的集群数量,但有一个最佳的。例如,我假设你选择了 k-means 算法来解决这个问题。你必须连续运行几个 k 的算法,即聚类数。然后,您必须计算每个 k 的聚类性能。现在,您能够确定 k,以便它能够很好地解决您的问题。

首先,您必须选择一个可以根据需要评估集群质量的性能指标。然后,您必须使用几种配置运行聚类分析算法,并评估每次运行的性能。现在,您已经准备好确定适合您的问题的集群数量。

您必须回答的下一个问题是“评估集群性能的好指标是什么?”。答案是“当然要看情况”。

-可以使用惯性进行聚类,并使用轮廓进行评估。

聚类分析算法中的评分度量或目标函数可能与您要用于评估的性能度量不同。例如,k-means 算法旨在通过最小化类内方差之和(也称为惯性)来对数据进行聚类。但是,您可能希望使用轮廓系数来评估聚类性能。

由于优化的挑战,您不能轻易改变 k-means 算法中的目标函数。但是,您肯定可以使用不同的性能指标来评估 k-means 算法的结果。现在,你可能会问为什么我们不在两个阶段使用相似的度量标准?答案是,我也希望我们可以很容易地做到这一点,但 k-means 算法是一个 NP-hard 问题。在标准配置下,该算法在合理的时间内收敛到良好的局部最优。然而,如果你改变目标函数,并不能保证收敛到任何好的结果。注意,有一些工作修改了 k-means 算法中的目标函数,但是类似的问题仍然存在。

通常,当诸如聚类算法的优化问题中的目标函数变得更复杂时,搜索空间变得更粗糙。在这种情况下,搜索算法很可能不会按照需要收敛。

—那又怎样?

剪影和肘方法是两种简单但重要的方法,用于找到最佳的聚类数。剪影法用的是剪影系数,肘法用的是 k-means 算法中的原始评分函数惯性。

肘方法仅使用簇内距离,而剪影方法使用簇间和簇内距离的组合。所以,你可以预期他们最终会有不同的结果。

根据文献记载,肘法经常与惯性一起使用。然而,肘方法,一般来说,只使用一个启发式来确定曲线的肘作为一个特殊点。在聚类分析中,特殊点表示聚类的个数。所以,你可能想使用肘方法与不同的评分功能,而不是惯性,虽然它不是那么常见。

最后一句话

我建议使用剪影,因为它在评分函数中使用了簇间和簇内距离,而肘方法只使用了簇内距离。然而,这并不意味着剪影法更好。剪影法和肘形法是确定数据集中聚类数的多种方法中的两种。如果想了解更多,还可以阅读一下阿凯克信息准则、贝叶斯信息准则等信息准则方法。正如我上面所说的,它们没有更好也没有更差。它们都能捕捉到数据的不同特征。

感谢阅读!

如果你喜欢这个帖子,想支持我…

[## 通过我的推荐链接加入 Medium—Pedram Ataee 博士

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pedram-ataee.medium.com](https://pedram-ataee.medium.com/membership)

简单的抽象文本摘要,带有预训练的 T5-文本到文本转换转换器

原文:https://towardsdatascience.com/simple-abstractive-text-summarization-with-pretrained-t5-text-to-text-transfer-transformer-10f6d602c426?source=collection_archive---------4-----------------------

使用 T5 文本到文本转换器的文本摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Pixabay 并由艺术 Chrome 插件风格化

T5 是 Google 的一个新的 transformer 模型,它以端到端的方式进行训练,以文本作为输入,以修改后的文本作为输出。你可以在这里了解更多关于的信息。

它使用在大型文本语料库上训练的文本到文本转换器,在多个自然语言处理任务上实现了最先进的结果,如摘要、问题回答、机器翻译等。

今天我们将看到如何使用 huggingface 的变形金刚库来总结任何给定的文本。T5 是一种抽象的总结算法。这意味着它将在必要时重写句子,而不仅仅是直接从原文中提取句子。

开始之前,请在您的 jupyter 笔记本电脑或 conda 环境中安装这些库:

!pip install transformers==2.8.0
!pip install torch==1.4.0

文本输入:

The US has "passed the peak" on new coronavirus cases, President Donald Trump said and predicted that **some states would reopen** this month.**The US has over 637,000 confirmed Covid-19 cases and over 30,826 deaths, the highest for any country in the world.**At the daily White House coronavirus briefing on Wednesday, Trump said new guidelines to reopen the country would be announced on Thursday after he speaks to governors.**"We'll be the comeback kids, all of us," he said.** "We want to get our country back."The Trump administration has previously fixed May 1 as a possible date to reopen the world's largest economy, but the president said some states may be able to return to normalcy earlier than that.

T5 汇总:

The us has over 637,000 confirmed Covid-19 cases and over 30,826 deaths. President Donald Trump predicts some states will reopen the country in **april**, he said. "we'll be the comeback kids, all of us," **the president** says.

分析输出:

如果你看到算法已经智能地总结了提及四月虽然它在最初的故事中从未被提及。还把换成了**总裁。**缩短并删除句子“超过 30,826 人死亡……”中逗号后的额外信息

代码:

与一些用户报告的 Github Gist 无法加载的代码相同:

import torch
import json 
from transformers import T5Tokenizer, T5ForConditionalGeneration, T5Config

model = T5ForConditionalGeneration.from_pretrained('t5-small')
tokenizer = T5Tokenizer.from_pretrained('t5-small')
device = torch.device('cpu')

text ="""
The US has "passed the peak" on new coronavirus cases, President Donald Trump said and predicted that some states would reopen this month.

The US has over 637,000 confirmed Covid-19 cases and over 30,826 deaths, the highest for any country in the world.

At the daily White House coronavirus briefing on Wednesday, Trump said new guidelines to reopen the country would be announced on Thursday after he speaks to governors.

"We'll be the comeback kids, all of us," he said. "We want to get our country back."

The Trump administration has previously fixed May 1 as a possible date to reopen the world's largest economy, but the president said some states may be able to return to normalcy earlier than that.
"""

preprocess_text = text.strip().replace("\n","")
t5_prepared_Text = "summarize: "+preprocess_text
print ("original text preprocessed: \n", preprocess_text)

tokenized_text = tokenizer.encode(t5_prepared_Text, return_tensors="pt").to(device)

# summmarize 
summary_ids = model.generate(tokenized_text,
                                    num_beams=4,
                                    no_repeat_ngram_size=2,
                                    min_length=30,
                                    max_length=100,
                                    early_stopping=True)

output = tokenizer.decode(summary_ids[0], skip_special_tokens=True)

print ("\n\nSummarized text: \n",output)

# Summarized output from above ::::::::::
# the us has over 637,000 confirmed Covid-19 cases and over 30,826 deaths. 
# president Donald Trump predicts some states will reopen the country in april, he said. 
# "we'll be the comeback kids, all of us," the president says.

上面提到的汇总输出是-

The us has over 637,000 confirmed Covid-19 cases and over 30,826 deaths. President Donald Trump predicts some states will reopen the country in **april**, he said. "we'll be the comeback kids, all of us," **the president** says.

在上面的代码中需要注意的关键点是,在将文本传递给 T5 摘要生成器之前,我们在文本前面加上了**" summary:"**。

如果你看一下论文,对于其他任务,我们需要做的就是在我们的文本前面加上相应的字符串,例如:**“将英语翻译成德语:”**用于翻译任务。

祝 NLP 探索愉快,如果你喜欢它的内容,请随时在 Twitter 上找到我。

如果你想学习使用变形金刚的现代自然语言处理,看看我的课程使用自然语言处理生成问题

使用 HuggingFace DistilBERT 的简单快速的问题回答系统——提供了单个和批量推理的例子。

原文:https://towardsdatascience.com/simple-and-fast-question-answering-system-using-huggingface-distilbert-single-batch-inference-bcf5a5749571?source=collection_archive---------22-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Pixabay 并由 AiArtist Chrome 插件风格化(由我构建)

问题回答系统有很多用例,比如通过通读公司文件并找到完美答案来自动回复客户的查询

在这篇博文中,我们将看到如何使用hugging face transformers库中的 DistilBERT 实现一个最先进的、超快的、轻量级的问答系统。

投入

输入将是一小段我们称之为上下文、和一个问题-

**Context :** The US has passed the peak on new coronavirus cases, President Donald Trump said and predicted that some states would reopen this month.The US has over 637,000 confirmed Covid-19 cases and over 30,826 deaths, the highest for any country in the world.**Question:** What was President Donald Trump's prediction?

输出

我们的问答系统的输出将是来自上下文段落的答案,如下所示—

**Answer:** some states would reopen this month.

让我们开始吧:

首先,我们来看看如何回答一个单题如上图。然后,我们将看到如何利用批处理从上下文中一次回答多个问题

安装最新版本的变形金刚库-

pip install transformers==2.8.0
pip install torch==1.4.0

单项推断:

下面是用 DistilBERT 进行单一推理的代码:

输出将是:

**Question** What was President Donald Trump's prediction?**Answer Tokens:**
['some', 'states', 'would', 're', '##open', 'this', 'month']**Answer** :  some states would reopen this month

批量推断:

现在让我们试着用批量推理做同样的事情,我们试着传递三个问题,并以批量的形式得到它们的答案

三个问题是-

**1.** What was President Donald Trump's prediction?
**2\.** How many deaths have been reported from the virus?
**3\.** How many cases have been reported in the United States?

下面是用 DistilBERT 进行批量推理的代码:

输出将会是—

**Context** :  The US has passed the peak on new coronavirus cases, President Donald Trump said and predicted that some states would reopen this month.The US has over 637,000 confirmed Covid-19 cases and over 30,826 deaths, the highest for any country in the world.**Question**:  What was President Donald Trump's prediction?
**Answer**:  some states would reopen this month**Question**:  How many deaths have been reported from the virus?
**Answer**:  30 , 826**Question**:  How many cases have been reported in the United States?
**Answer**:  over 637 , 000

如果你对从上下文自动生成问题感兴趣,而不是对问题回答感兴趣,你可以在下面的链接中查看我的各种算法和开源代码-

  1. 是非题生成
  2. 选择题生成
  3. 为英语语言学习生成代词疑问句
  4. 语法 MCQ 一代

编码快乐!

使用自然语言处理的问题生成——教程

我推出了一个非常有趣的 Udemy 课程,名为“使用 NLP 生成问题”,扩展了这篇博文中讨论的一些技术。如果你想看一看,这里是链接

祝 NLP 探索愉快,如果你喜欢它的内容,请随时在 Twitter 上找到我。

Python 中简单的数据可视化,你会发现很有用

原文:https://towardsdatascience.com/simple-data-visualisations-in-python-that-you-will-find-useful-5e42c92df51e?source=collection_archive---------26-----------------------

将这些图用于您的数据科学项目

能够有效地使用数据可视化是数据科学家的一项重要技能。可视化数据有助于我们轻松地消化信息,并提取出难以提取的见解。在本帖中,我们将看看 5 种类型的图,分别是 SeabornMatplotlib ,以及它们在数据科学项目中的应用示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplashpaweczerwiński拍摄的照片

2020 年 9 月,Seaborn 发布了一个主要版本:v0.11.0。在这篇文章中,我们将使用这个版本的一些新特性和增强功能。特别是,如果您使用的是早期版本,您会发现第 3 节和第 4 节中示例数据集的列名和分布图的功能是不同的。因此,请确保您的 Seaborn 版本已更新。你可以在这里找到发布的详细信息。

0.资料组📦

让我们导入包并更新图表的默认设置,以节省调整单个图的时间,并为图表添加一点个人风格:

# Import packages
import seaborn as sns
import matplotlib.pyplot as plt# Update default settings
sns.set(style='whitegrid', context='talk', 
        palette=['#62C370', '#FFD166', '#EF476F'])

如果你想了解更多关于调整图表默认设置的信息,你可能会发现这篇文章很有用。我们将使用 Seaborn 内置的企鹅数据集:

# Import dataset
df = sns.load_dataset('penguins').rename(columns={'sex': 'gender'})
df

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

📍 1.热图:sns.heatmap():

让我们从我最喜欢的一个有很多应用的情节开始。简单地说,热图是一个颜色编码的表格。热图可用于检查缺失值。它有助于了解缺失数据的数量和模式。

plt.figure(figsize=(10, 6))
sns.heatmap(df.isnull(), yticklabels=False, cbar=False)
plt.title("Missing values");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

缺失值在该图中显示为白色条带。我们可以立即看到性别有更多的缺失值。跨列的连接水平白线(在图的顶部和底部)向我们展示了一种模式,即在一个数字列中有缺失值的记录在其他数字列和性别中也有缺失值。

在检查变量之间的关系时,热图也很有用。例如,检查数值变量之间线性关系的相关矩阵可以如下所示:

plt.figure(figsize=(8, 3))
sns.heatmap(df.corr(), annot=True, cmap='seismic_r')
plt.title("Correlation matrix");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这个图我们可以看出 flipper_length_mmbody_mass_g 有很强的正相关关系(r=0.87)。

预测能力得分矩阵是检查任何类型关系强度的另一种技术。让我们想象一下预测能力得分矩阵:

# Import package
import ppscore as pps# Calculate pps
pps_matrix = pps.matrix(df)# Prepare data to pivot table
pps_pivot = pps_matrix.pivot('x', 'y', 'ppscore')
pps_pivot.index.name, pps_pivot.columns.name = None, None# Plot
plt.figure(figsize=(10, 4))
sns.heatmap(pps_pivot, annot=True, cmap='YlGn')
plt.title("Predictive Power Score Matrix");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以从这里了解更多关于预测力评分的信息。

使用监督分类模型时,查看混淆矩阵有助于评估模型性能。为了使它更容易理解,花点额外的精力来标记和格式化它是值得的。现在,让我们建立一个简单的模型来预测物种。我们将把物种作为这篇文章剩余部分的目标,除了下一部分关于柱状图的后半部分。这里有一个例子:

# Import packages
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix# Create list of numerical column names
numerical = list(df.select_dtypes('number').columns)# Partition data keeping only numerical non-missing columns
X = df.dropna()[numerical]
y = df.dropna()['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=.3, 
                                                    random_state=1)# Fit simple model to the data
model = RandomForestClassifier(random_state=123)
model.fit(X_train, y_train)# Predict
y_test_pred = model.predict(X_test)# Prepare confusion matrix
cm = confusion_matrix(y_test, y_test_pred)
fig, ax = plt.subplots(figsize=(6, 3.5))
sns.heatmap(cm, annot=True, cbar=False, cmap='BuGn', ax=ax)
ax.set_title('Confusion matrix')
ax.set_xlabel('Predicted')
ax.set_xticklabels(model.classes_)
ax.set_ylabel('Actual')
ax.set_yticklabels(model.classes_, 
                   fontdict={'verticalalignment': 'center'});

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如您从示例中看到的,热图非常有用和实用。这些是我在探索性分析或建模阶段使用热图的一些最喜欢的方式。如果你需要可视化表格(如数据透视表或交叉制表)并使其更容易阅读,热图是你的好朋友。

📍 2.条形图:sns.barplot()和 sns.countplot()

大多数人都熟悉条形图。在条形图中,一个轴告诉我们类别,而另一个轴告诉我们与该类别相关的数值。因此,这对于可视化分类变量很有用。当使用某些类型的机器学习算法时,查看模型的特征重要性可以让我们了解模型认为哪些特征更重要。让我们用它来看看我们在上一节中构建的简单随机森林模型的特性重要性:

# Map feature importance to variable names
importances = pd.DataFrame(model.feature_importances_, 
                           index=X_train.columns, 
                           columns=['importance'])
importances.sort_values('importance', ascending=False, inplace=True)# Plot feature importance
plt.figure(figsize=(10, 4))
sns.barplot(data=importances, x=importances.index, y='importance')
plt.title('Feature importance');

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果有许多特征和/或特征的名称很长,使用这种格式会导致 x 轴上的特征名称重叠,使绘图难以阅读。一个简单的解决方案是交换 x 轴和 y 轴的映射:

plt.figure(figsize=(8, 4))
sns.barplot(data=importances, x='importance', y=importances.index)
plt.title('Feature importance');

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的下一个例子中,我们将使用两个条形图来获得每个分类变量的不同见解。第一个条形图将显示类别出现的频率。这有助于看到变量的总体分布,包括是否有任何主导或罕见的类别。为此,我们将使用sns.countplot(),它是直方图的分类等价物。第二个条形图将显示变量中每个类别的目标平均值。这有助于检查某些类别是否更有可能或更不可能与目标变量中的特定类相关联。为了说明,我们将添加一个随机的二元目标,将物种视为一个特征,并使用循环的为每个分类变量绘制两个条形图:

# Import package
import numpy as np# Create random target
np.random.seed(123)
df['target'] = np.random.randint(0, 2, df.shape[0])# Create list of categorical column names
categorical = list(df.select_dtypes(exclude='number').columns)# Plot counts for non-numerical variables
for var in categorical:
    fig, ax = plt.subplots(1, 2, figsize=(14, 3.5))    
    sns.countplot(x=var, data=df, ax=ax[0])
    ax[0].set_title(f"Counts of each category in {var}")

    sns.barplot(x=var, y='target', data=df, ax=ax[1])
    ax[1].set_title(f"Mean target by each category in {var}");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当在探索性分析期间第一次查看数据并试图判断哪些变量对模型可能更有用时,以这种方式可视化分类列非常有用。如果你有一个数字目标,右边的图表也可以。

📍 3.直方图:sns.histplot()和密度图:sns.kdeplot()

直方图和核密度图是检查数字列分布的好方法。直方图将数字数据划分为仓,并显示每个仓的频率计数。直方图可以被认为是一种特殊类型的条形图。另一方面,密度图使用核密度估计来显示密度。我们将再次使用循环的来绘制每个数值变量的直方图和密度图:

for var in numerical:
    fig, ax = plt.subplots(1, 2, figsize=(15, 4))
    sns.histplot(df, x=var, hue='species', bins=30, ax=ax[0])
    ax[0].set_title(f"Histogram for {var}")
    sns.kdeplot(data=df, x=var, hue='species', shade=True, 
                common_norm=False, ax=ax[1])  
    ax[1].set_title(f"Density plot for {var}")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们使用hue参数来绘制物种的类别,以观察变量的分布在企鹅物种之间是否不同。因为每个物种的记录数量不同,这已经可以从直方图中看出,我们通过在sns.kdeplot()中指定common_norm=False来确保每个物种都有自己的标准化内核密度。这里有一个例子来说明我的意思:

fig, ax = plt.subplots(1, 2, figsize=(15, 4))
sns.kdeplot(data=df, x=numerical[0], hue='species', shade=True,
            ax=ax[0])
ax[0].set_title(f"common_norm=True")
sns.kdeplot(data=df, x=numerical[0], hue='species', shade=True, 
            common_norm=False, ax=ax[1])  
ax[1].set_title(f"common_norm=False");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

曲线下的面积与第一个图中的物种频率成比例,因为common_norm=True将每个人的密度标准化。另一方面,右边的图在物种内是归一化的,所以曲线下的面积在物种间是相等的(注意 y 轴极限的差异)。

📍 4.散点图:sns .散点图和二元直方图:sns.histplot()

另一个简单的图是散点图,它对于查看两个数值变量之间的关系很有用。

一般来说,直方图指的是单变量直方图,其中单变量只是*one(uni)variate(变量)的一种花哨说法。*在本节中,我们将查看双变量直方图,以检查两个数值变量之间的关系。

让我们为数字列对的所有组合绘制它们。值得注意的是,这些图中的图例被故意排除在外,因为物种的颜色编码与之前相同,会阻挡一些数据点:

previous = []
for i, var in enumerate(numerical):    
    if i > 0:
        for p_var in previous:
            fig, ax = plt.subplots(1, 2, figsize=(15,4))
            sns.histplot(df, x=p_var, y=var, hue='species', 
                         alpha=0.6, ax=ax[0])
            ax[0].get_legend().remove()
            sns.scatterplot(data=df, x=p_var, y=var, hue='species',
                            size='gender', alpha=0.6, ax=ax[1])
            ax[1].get_legend().remove();
    previous.append(var)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在左边,我们正在看由物种进行颜色编码的二元直方图。在右边,我们正在看由物种编码的散点图。我们还将性别映射到散点图中点的大小。

与上一节不同,这两个图显示了非常相似的见解。这意味着你可以选择你最喜欢的一个,而不是两个都用。

📍 5.配对图:sns.pairplot()

在 Seaborn 中有一个很好的功能,可以用一行代码做出我们在第 3 节和第 4 节中看到的类似的图形:

sns.pairplot(df.drop(columns='target'), hue='species');

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用sns.pairplot()很棒,然而,我确实发现当变量数量增加时,每个图开始变得很小,这使得很难检查。因此,最好将其用于列数较少的数据集。

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果您使用 我的推荐链接成为会员,您的一部分会费将直接用于支持我。

谢谢你看我的帖子。我希望你能在你的数据科学项目中使用这些可视化。

如果你感兴趣,这里有我的一些帖子的链接:

◼️ 在 Seaborn (Python)
◼️ 在 Python 中进行探索性文本分析
◼️️ 给 pandas 用户的 5 个提示
◼️️ 在 pandas 中进行数据聚合的 5 个提示
◼️️ 在 pandas 中编写 5 个常见的 SQL 查询
◼️️ 在 pandas 中编写高级 SQL 查询

再见🏃💨

图形数据库的简单部署:JanusGraph

原文:https://towardsdatascience.com/simple-deployment-of-a-graph-database-janusgraph-5c8c751d30bf?source=collection_archive---------37-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考:https://unsplash.com/photos/ZiQkhI7417A

我最近一直在寻找一个开源的分布式图形数据库,因为我需要在某个地方持久地存储大量的图形数据。我的主要要求是,我想尽可能多地控制上述数据库背后的底层存储和索引系统。

我偶然发现了 JanusGraph ,这是 Linux 基金会下的一个图形数据库项目,它建立在 Apache TinkerPop 之上,包括 Gremlin 查询语言。Tinkerpop 还支持其他许多图形数据库,如 neo4j、Amazon Neptune、DataStax、Azure Cosmos DB 等。我选择 JanusGraph 是因为它的即插即用方法,例如,我可以替换后端存储(如 Cassandra、HBase、BerkeleyDB、ScyllaDB 或 Google Cloud Bigtable)和索引软件(如 Elasticsearch、Solr 或 Lucene)。我还没有评估所有现有的图形数据库,所以我不能说太多关于 JanusGraph 与其他解决方案相比如何。我的意图是首先了解底层技术是如何工作的,然后我才会冒险尝试其他数据库。

尽管如此,由于它的可定制性,探索 JanusGraph 在开始时可能会感到有点令人生畏,至少对于像我这样的第一次尝试者来说是这样。这也是我写这篇文章的原因。我想尽可能简洁地总结我的学习之旅,并指导您完成在远程服务器中部署 JanusGraph、执行查询和可视化数据集所需的步骤。

服务器端设置

在服务器中部署 JanusGraph 包括以下步骤。

设置一个服务器。在我的情况下,我选择了一个云提供商的廉价虚拟机(25 GB SSD + 1024 MB RAM,Ubuntu 18.04)。因为 JanusGraph 默认运行在端口 8182 上,所以我将这个端口开放给公众访问。为了简单起见(不是最安全的方式),我简单地通过 iptables 来实现。

iptables -A INPUT -p tcp -m tcp — dport 8182 -j ACCEPT

记下您服务器的 IP 地址为$ {服务器 IP 地址}。您可以通过运行以下命令来做到这一点。

ifconfig

拉下并运行骏图 docker。骏利已经提供了其系统的文档化实现。默认的是 BerkeleyDB 作为存储,Lucene 作为索引。下面的代码将从 docker 存储库中提取最新的 janusgraph 图像。

docker run -it -p 8182:8182 janusgraph/janusgraph

将图形数据集复制到 docker。 JanusGraph 支持几种数据格式,其中一种叫做 graphml。在引擎盖下,这些基本上都是邻接矩阵或列表。在我们的实验中,我们将使用 kelvinlawrence.net 的《T2》教程中的机场航线数据集。 air-routes.graphml 数据集可以从这里下载。我们需要将 graphml 数据复制到 janusgraph 容器( /opt/janusgraph/data/ ),以便稍后可以通过客户端发出的命令将它加载到 janusgraph。您可以通过运行 docker ps 来获取*$ { Janus graph _ DOCKER _ ID }*。

docker cp ${YOUR_CUSTOM_LOCATION}/air-routes.graphml ${JANUSGRAPH_DOCKER_ID}:/opt/janusgraph/data/.

客户端设置

我们将使用三种方法连接服务器:gremlin 控制台、gremlin python 和 graphexp。

Gremlin 控制台

我们将使用来自 Tinkerpop 的 janusgraph 分叉版本的专用 gremlin 控制台将数据集加载到 janusgraph。

**下载并解压最新发布的骏图。**你可以从这里得到文件。

为 gremlin 远程连接设置创建一个 remote.yaml 文件。我们将这个文件称为*$ { REMOTE _ YAML _ LOC }/REMOTE . YAML*

hosts: [${SERVER_IP_ADDRESS}]
port: 8182
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}

运行小妖精控制台。我们将在控制台中做一些事情。

${janusgraph_latest_release}/bin/gremlin.sh

首先,我们将连接到远程 janusgraph 服务器。这是因为数据存在于服务器中,而这个客户端 gremlin 控制台将仅用于将任何查询转发给前者。

:remote connect tinkerpop.server *${REMOTE_YAML_LOC}/remote.yaml* session:remote console

接下来,我们将把 air-routes.graphml 数据加载到 janusgraph 中。我们将使用 janusgraph 的一个名为 graph.io 的 API。

graph.io(graphml()).readGraph(‘/opt/janusgraph/data/air-routes.graphml’)

小精灵蟒蛇

我们现在想使用 python 查询图表。这个想法是,我们可以获得一些子图,并在本地客户端内存中使用现有的 python 库(如 networkx)进一步分析它们。如果您想要处理整个原始图形(例如,运行 PageRank),将整个图形加载到您的本地客户端内存可能并不明智。选择 TinkerPop 的 GraphComputer API,您可以通过 VertexProgram 运行 OLAP 算法。更多详情见此处

用 pip 安装 gremlin-python。

pip install gremlinpython

与远程服务器的 janusgraph 建立连接。加载图形遍历对象为 g 。在 python 控制台中完成这项工作。

from gremlin_python.process.anonymous_traversal import traversalfrom gremlin_python.driver.driver_remote_connection import DriverRemoteConnectiong = traversal().withRemote(
DriverRemoteConnection(‘ws://${SERVER_IP_ADDRESS}:8182/gremlin’,’g’))

**运行查询。**例如,如果我们想要获得机场列表,我们可以运行以下 gremlin 查询。要获得更多关于可以执行哪些查询的指导,请参考 Gremlin API 。这是因为 JanusGraph 是建立在 Gremlin 之上的,因此你也可以参考后者的文档来获得更多信息。

g.V().hasLabel(‘airport’).valueMap().toList()

Graphexp

有一些第三方库是为与 JanusGraph 接口而构建的。我发现 graphexp 是最容易使用的软件之一。可以从这个 github repo 下载。

git clone [https://github.com/bricaud/graphexp](https://github.com/bricaud/graphexp)

运行 graphexp。只需从浏览器中打开 graphexp.html。

输入您的远程服务器地址和端口,执行查询。在这个例子中,我正在查询新加坡樟宜机场的 ego 网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瞧啊。现在,您在远程服务器上有了一个正在运行的图形数据库,您可以从任何客户端计算机上进行查询。

参考文献

  1. https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html
  2. https://docs.janusgraph.org/

附加说明

在某些情况下,您可能希望在数据库中存储多个独立的图形。为此,您必须在部署之前修改您的 janusgraph yaml 配置文件。步骤几乎与 gremlin server 的设置相似(因为 JanusGraph 是建立在 gremlin server 之上的)。粗略地说,您需要做一些事情(这个例子是为 gremlin 服务器中的 TinkerGraph 做的)。

**首先,**编辑 gremlin-server yaml 文件。在这种情况下,我想要创建两个图形,因此我在 yaml 文件的 graphs 设置中添加了 graphA 和 graphB 。每个图形都在 conf/下的属性文件中定义。

graphs: {
  graphA: conf/tinkergraph-empty.properties,
  graphB: conf/tinkergraph-empty.properties
}

**其次,**更新初始 groovy 脚本。我们基本上想同时加载 graphAgraphB 。我们还想为它们创建遍历对象。

...
org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory.generateModern(graphA)
org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory.generateModern(graphB)...globals << [
  gA : graphA.traversal().
withStrategies(ReferenceElementStrategy.instance()), gB : graphB.traversal().
withStrategies(ReferenceElementStrategy.instance())
]...

JanusGraph 的另一个有用特性是模式管理(就像任何典型的数据库一样)。然而,这超出了本文的范围。有关如何使用 JanusGraph 的 openManagement API 管理图表的更多信息,请查看这个全面的教程

使用 Python 的简单边缘检测模型

原文:https://towardsdatascience.com/simple-edge-detection-model-using-python-91bf6cf00864?source=collection_archive---------9-----------------------

机器使用边缘检测来更好地理解现实世界

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自佩克斯阿纳斯塔西娅·舒拉耶娃的照片

在这篇文章中,我将向你展示如何检测图像的边缘。写一个边缘检测程序会让你对计算机视觉和自动驾驶汽车有所了解。边缘检测通常用于理解图像中的对象。这也有助于机器做出更好的预测。编写边缘检测程序是理解机器如何看待外部世界的一个很好的方式。这将使我们在计算机视觉方面有更好的视角。

我在以前的文章中介绍了一些计算机视觉概念:人脸检测、人脸识别和文本识别。今天,我们将使用 python 进行边缘检测。

目录

  • 入门
  • 导入库
  • 边缘检测功能
  • 选择一幅图像
  • 运行程序

入门指南

我们将为这个项目使用两个主要模块:Numpy、Matplotlib 和 OpenCV。Matplotlib 是一个完整的库,用于在 Python 中生成静态、动画和交互式可视化。OpenCV 是一个高度优化的库,专注于实时应用。

OpenCV

OpenCV(开源计算机视觉库)是一个开源的计算机视觉和机器学习软件库。OpenCV 旨在为计算机视觉应用提供一个通用的基础设施,并加速商业产品中的机器感知。作为一个 BSD 许可的产品,OpenCV 使得企业利用和修改代码变得很容易。

参考:https://opencv.org

让我们从安装库开始。

图书馆

我们必须安装这些库,这样我们的程序才能正常工作。如前所述,我们只需要两个库。

我们可以使用 PIP 库管理器在一行中安装它们:

pip install numpy matplotlib opencv-python

安装过程完成后,我们可以将它们导入到代码中。您可以在 Jupiter 笔记本或 Atom 等常规文本编辑器上工作。我将使用这个项目的原子文本编辑器。

import cv2 
import numpy as np 
import matplotlib.pyplot as plt

边缘检测功能

现在,我们可以转到有趣的部分,在这里我们将编写边缘检测函数。你会惊讶于使用 OpenCV 包是多么简单。这个 OpenCV 检测模型也被称为 Canny 边缘检测模型。我们的功能由三部分组成:边缘检测,可视化,最后,保存结果。

边缘检测

def simple_edge_detection(image): 
   edges_detected = cv2.Canny(image , 100, 200) 
   images = [image , edges_detected]

理解代码:

  • Canny 是我们调用的使用 OpenCV 进行边缘检测的方法。
  • Image 是函数的一个参数,这意味着我们在调用函数时会传递图像。这样,你可以很容易地用不同的图像测试你的程序。
  • 100 和 200 是滞后阈值的最小值和最大值。
  • 如果想了解更多关于 Canny 边缘检测的知识:(官方文档)。

形象化

location = [121, 122] 
for loc, edge_image in zip(location, images): 
   plt.subplot(loc) 
   plt.imshow(edge_image, cmap='gray')

理解代码:

  • 绘图部分需要位置数组。
  • 然后,我们可视化原始图像和边缘检测图像。
  • cmap 参数用于改变图像的颜色。在我们的例子中,我们将它们转换成灰色。

保存结果

该功能的最后一部分将保存边缘检测图像和比较图。感谢 OpenCv 和 Matplotlib 包; imwritesavefig 函数为我们做了保存。在最后一行中, show 函数将向我们展示创建的图表。

cv2.imwrite('edge_detected.png', edges_detected) plt.savefig('edge_plot.png') plt.show()

选择图像

这将是一个简单的图像。我们将找到一个图像,我们想测试我们的 canny 边缘检测程序。我将使用免费的库存摄影页面来找到一些好的图片。这里是他们网站的链接。

下载图像后,确保将它们放在与项目相同的文件夹中。这将有助于轻松地将它们导入程序。让我们定义一个图像变量并导入图像。以下是如何使用 OpenCV 读取图像:

img = cv2.imread('test_image.jpg', 0)

这是我将测试模型的示例图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Pexels 的 joo vítor Heinrichs 的照片

运行程序

最好也是最后一步,是时候运行程序了。到目前为止,没有任何东西触发该功能。我们必须调用函数,这样奇迹才会发生。哦,别忘了把你的图片作为参数传递。让我们调用这个函数:

simple_edge_detection(img)

以下是一些结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

干得好!您已经使用 Python 创建了一个边缘检测模型。Python 是一种非常引人注目的语言,使用 python 可以创造无限的东西。现在,你也知道如何在实际项目中使用计算机视觉。从事像这样的动手编程项目是提高编码技能的最好方式。

我很高兴你今天学到了新东西。如果您在执行代码时有任何问题,请随时联系我。😊

关注我的 博客 YouTube频道留下灵感。谢谢,

更多计算机视觉项目

[## 使用 Python 渲染视频文本

使用 moviePy 库的动手机器学习项目

towardsdatascience.com](/rendering-text-on-video-using-python-1c006519c0aa) [## 使用 Python 构建条形码/QR 码阅读器

使用 Pyzbar 库的简单且可实际操作的机器学习项目

towardsdatascience.com](/building-a-barcode-qr-code-reader-using-python-360e22dfb6e5)

使用置信估计进行预测的简单示例

原文:https://towardsdatascience.com/simple-example-of-predicting-with-confidence-estimates-cfc9e8a35c9b?source=collection_archive---------29-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

西蒙·艾布拉姆斯在 Unsplash 上拍摄的照片

在数据科学中,制作一个输出数值的模型——也称为回归——是一个古老的故事。但有时我们不仅对预测值感兴趣,还对该值周围的不确定性感兴趣,这被称为概率预测。本文将带您浏览一个示意性示例,在该示例中,我们让神经网络预测一个值以及一个置信度估计值。我们将使用 Python 和 tf.keras,以及像正态分布这样的基本概率结果。此处提供有代码的笔记本

评估模型的标准方法及其缺点

经典方法是评估所有测试输入的模型输出,并根据自己喜欢的度量计算平均错误率。举个例子:假设你正在预测明天的温度,你的模型平均误差率为 5%,如果你的模型预测明天的温度为 30 度,你只需在这个数字上加上± 5%就可以得到一个置信区间。

这并不完美,原因有很多。这里的主要问题是我们使用一个不依赖于数据点的平均误差估计。如果模型有时对某些输入非常确定会怎样?例如,如果你正处于雨季,模型可能 99%确定明天会下雨,5%的误差率太大了。另一方面,可能有些日子模型比平均值更不确定,这 5%可能会给你带来麻烦。总之,计算平均错误率是一个平均值。它没有考虑到你所预测的实际点的特殊性。

让我们改进这一点。如果模型本身不仅能输出单一的预测值,还能输出其可信度会怎样?通过这种方式,您将获得一个根据您预测的实际数据点量身定制的置信度评估,从而获得上下文感知。在现实生活中,了解估计的不确定性和实际预测一样重要。

这里我们将制作一个非常简单的神经网络,它使用不确定性估计进行回归。为了尽可能简单明了,我将使用一个虚拟的一维数据,一个单层网络,没有测试集。

我在试图理解这篇论文时举了这个例子: DeepAR:用自回归递归网络进行概率预测来自 D. Salinas 等人在那里他们建立了一个用于多时间序列预测的概率预测网络。

我们将把工作分成三部分:

  1. 产生具有变化的不确定性的伪数据
  2. 用简单的置信区间制作一个非常简单的经典回归模型
  3. 改进模型,使其输出置信度估计值

制作虚拟数据

我们生成两个变量:x是我们的自变量,它取 0 到 1 之间的值,y是我们想要预测的值。

我们根据以下公式生成 y:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据生成方程

我们来分析一下。这意味着 y 相当于 x 加上一些噪声,噪声的大小取决于 x,所以,这是一个非常非常简单的预测!然而,y 上的不确定性与 x 成线性增长,因此,如果 x 较小,则很确定 y=x,但对于较大的 x 值,y 开始围绕其期望值扩散。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的数据图中,我们可以看到 y 值随着 x 向 1 扩展。

经典回归模型

让我们制作一个基于x预测y的神经网络。我们只用一个单层神经网络。为此,我们将使用 tf.keras:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单层架构,没有比这更简单的了。

在用均方误差(MSE)损失和 Adam 优化器训练该模型 200 个时期后,我们得到以下预测:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

朴素模型的预测。

好了,这差不多是我们预期的预测。我们的模型正确预测 y=x,MSE 为 0.011。

假设模型误差是高斯的,我们可以用这个 MSE 误差来计算置信区间。这些细节使用了高斯分布的一些属性,我们现在并不真正需要这些属性,所以让我们使用下面的公式,它给出了 95%的置信区间(CI):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95%置信区间的公式

在我们的简单模型上使用这个公式,并以图形方式显示结果,给出了下图。如您所见,CI 是正确的,因为我们有大约 95%的数据点在预测区间内。但是它完全忽略了数据噪音的可变性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有 95%置信区间的简单模型

向模型输出添加置信度信息

正如所承诺的,我们将修改我们的模型,使其输出不仅仅是一个预测,而是一个预测及其置信度。

这是获取技术的时候了。为了在预测中引入信心,我们需要讨论我们的预测值的分布,我们写为 P(y|x)。根据手头的数据,您期望的分布可能会有所不同。在我们的例子中,我们显然有一个正态分布,因为这是我们如何生成我们的数据,但这不是强制性的。

您如何知道哪个发行版与您的项目相关?绘制数据并查看模式的数量,围绕平均值和数据范围的对称性是一个良好的开端。根据这些参数,你应该找到一个符合这些特征的理论分布。

现在,正态分布是默认使用的分布,如果您正在处理实值数据,它应该是一个很好的起点。让我们继续这个例子。

正态分布由两个参数定义:平均值 𝜇 和标准差 𝜎 。从这两个值,我们已经完全确定了分布,我们可以计算我们可能需要的所有置信区间。所以,让我们的网络输出这两个值。这很简单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有概率输出的网络结构。

“左分支”计算标准偏差 𝜎 ,而“右分支”计算平均值 𝜇 。我对标准偏差输出使用了“relu”激活,因为标准偏差必须为正。在最后一层,两个输出被连接。

现在我们需要为模型选择一个损失函数。之前,我们使用了一个均方误差来惩罚预测误差。但是在这里,我们需要一种方法来惩罚预测和不确定性。

为此,我们将把问题写成概率的形式。我们的模型以 x 为输入,返回一个正态概率分布 N( 𝜇 ( 𝑥 ), 𝜎 ( 𝑥 ))。

如果这个分布与实际的数据分布相匹配,那么我们的训练就是成功的。我们如何对此进行量化?我们会说,如果获得我们的精确训练数据的概率很高,如果我们从我们的分布中提取数据,这是一个很好的匹配。

对于数据点(x,y),y 从 N( 𝜇 ( 𝑥 )、 𝜎 ( 𝑥 ))被采样的概率由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们的数据是从输出分布中抽样的,那么看到它的概率。

这只是高斯定律的概率密度函数。现在我们要使这个概率尽可能的高,也就是我们要找到使*(|(【𝑥)【𝑥*)最大化的函数*【𝑃】(|𝜇(𝑥)()***

现在前面有几个有趣的计算,我打算跳过,因为它们非常简单:

  • 我们应用对数,因为最大化 p 与最大化 ln( 𝑃 )是相同的。
  • 我们删除常量,因为它们在优化中不起作用。
  • 我们将否定整个表达式。这只是因为 Keras 喜欢最小化事情,如果我们最小化负面就像最大化原始。

最后,我们得到了一个 Keras 可以理解的损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概率损失

这是有效的损失吗?我们可以直观地检查它是否有意义。它将我们的目标值 y 与网络输出 𝜎𝜇.结合在一起此外,我们可以单独理解每个术语:

  • ln( 𝜎 ):这对于小 𝜎 来说会比较低,从而推动网络自信
  • 𝜇 接近 y 时,第二项将为低。这将推动网络减少预测误差。对于高 𝜎 值,该项也将为低。所以,当网络说它不自信时,这种损失对错误的惩罚较少(高 𝜎 )。

让我们将此实现为一个 Keras 自定义损失。

训练这个模型比前一个稍微复杂一点。这里有一个效果很好的迭代方法:

  1. 使用学习率范围测试选择学习率。
  2. 以此学习率训练 100 个纪元。
  3. 检查损失,如果低于-1.9 止损,否则返回步骤 1。

通常,这种方法在几百个纪元内有效。请注意,大约有一半的时间,它收敛到一个坏的局部最小值。在这种情况下,只需重新初始化模型并重新启动。

下面我们有一个样本训练曲线,我只需要重复上面的过程两次。正如你所看到的,我开始时的学习率是 0.01,然后根据范围测试结果移动到 0.1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概率模型的训练曲线。

好了,现在我们的模型已经训练好了,是时候检查预测了。我们将绘制我们的模型结果。为此:

  • 我们使用第一个输出 𝜇 作为预测。
  • 我们使用第二个输出 𝜎 根据公式𝐶𝐼=𝜇1.96×𝜎.建立 95% CI

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概率预测结果。预测的不确定性与数据中的不确定性相匹配。

就是这样。如你所见,我们的模型对小 x 值更有信心。

结论

在本文中,我们已经看到了如何进行预测以及不确定性估计。我们已经研究了 Keras 中的理论和实现。

从实践的角度来看,我们可以升级现有的网络,分两步返回置信度估计值:

  1. 添加分支以生成标准差输出
  2. 切换到概率损失

但是,理解理论是有好处的,这样我们就可以选择正确的分布和适当的损失。

最后,用真实数据呢?看看 DeepAR:用自回归递归网络进行概率预测,他们应用了一种更复杂的技术来获得销售预测的不确定性估计。

我用这个简单的例子来总结这篇文章,希望它也能对你有用。我还没有在真实数据集上尝试过。一定要让我知道你的想法!

Boruta 特征选择(Python 中的一个例子)

原文:https://towardsdatascience.com/simple-example-using-boruta-feature-selection-in-python-8b96925d5d7a?source=collection_archive---------8-----------------------

Python 中强大的 Boruta 特征选择库的快速示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

威廉·费尔克在 Unsplash 上的照片

如果您没有使用 Boruta 进行特性选择,那么您应该尝试一下。它可以用于任何分类模型。Boruta 是一种基于随机森林的方法,因此它适用于像随机森林或 XGBoost 这样的树模型,但也适用于像逻辑回归或 SVM 这样的其他分类模型。

Boruta 迭代地去除统计上不如随机探针相关的特征(由 Boruta 算法引入的人工噪声变量)。在每次迭代中,被拒绝的变量在下一次迭代中不被考虑。它通常以一个良好的特征选择全局优化而告终,这也是我喜欢它的原因。

我们将看一个简单的随机森林示例来进行特性选择。这个故事的唯一目的是向您展示一个简单的工作示例,这样您也可以使用 Boruta。

导入数据集

这个例子将使用 sklearn 附带的 breast_cancer 数据集。您可以使用可选的 return_X_y 让它直接输出数组,如图所示。

创建您的分类器或回归对象

只需将数据与您选择的模型相匹配,现在就可以为 Boruta 做准备了。

注意:在进行特征选择时,我会拟合整个数据集。消除特征后,您可以进行训练/测试分割。

创建你的 Boruta 对象

现在创建一个 BorutaPy 特征选择对象,并使您的整个数据适合它。在拟合过程中,Boruta 将根据数据集的大小进行多次迭代的特性测试。Boruta 创建你的特征(噪波)的随机阴影副本,并根据这些副本测试该特征,以确定它是否比噪波更好,因此值得保留。它会自动检查可能会损害模型的交互。对于每次迭代,Boruta 将输出确认的暂定的拒绝的变量。

拟合后,Boruta 对象具有有用的属性和方法:

  • 。support_ attribute 是一个布尔数组,用于回答-是否应该保留特征?
  • 。ranking_ attribute 是等级的 int 数组(1 是最佳特征)
  • 。transform(X)方法应用建议并返回调整后的数据数组。通过这种方式,你可以让博鲁塔管理整个考验。

注意:如果你得到一个错误(TypeError: invalid key),在将 X 和 y 装配到选择器之前,尝试将它们转换成 numpy 数组。如果你遇到这个错误,需要帮助,请告诉我。

查看功能

下面是我写的一些快速代码,用来查看 Boruta 的输出结果。看起来我的 30 个特性中有 5 个被建议删除。代码的输出如下所示。

Feature: mean radius               Rank: 1,  Keep: True
Feature: mean texture              Rank: 1,  Keep: True
Feature: mean perimeter            Rank: 1,  Keep: True
Feature: mean area                 Rank: 1,  Keep: True
Feature: mean smoothness           Rank: 1,  Keep: True
Feature: mean compactness          Rank: 1,  Keep: True
Feature: mean concavity            Rank: 1,  Keep: True
Feature: mean concave points       Rank: 1,  Keep: True
Feature: mean symmetry             Rank: 1,  Keep: True
Feature: mean fractal dimension    Rank: 2,  Keep: False
Feature: radius error              Rank: 1,  Keep: True
Feature: texture error             Rank: 2,  Keep: False
Feature: perimeter error           Rank: 1,  Keep: True
Feature: area error                Rank: 1,  Keep: True
Feature: smoothness error          Rank: 3,  Keep: False
Feature: compactness error         Rank: 1,  Keep: True
Feature: concavity error           Rank: 1,  Keep: True
Feature: concave points error      Rank: 1,  Keep: True
Feature: symmetry error            Rank: 2,  Keep: False
Feature: fractal dimension error   Rank: 2,  Keep: False
Feature: worst radius              Rank: 1,  Keep: True
Feature: worst texture             Rank: 1,  Keep: True
Feature: worst perimeter           Rank: 1,  Keep: True
Feature: worst area                Rank: 1,  Keep: True
Feature: worst smoothness          Rank: 1,  Keep: True
Feature: worst compactness         Rank: 1,  Keep: True
Feature: worst concavity           Rank: 1,  Keep: True
Feature: worst concave points      Rank: 1,  Keep: True
Feature: worst symmetry            Rank: 1,  Keep: True
Feature: worst fractal dimension   Rank: 1,  Keep: True

后续步骤

既然我们已经确定了要删除的特性,我们就可以放心地删除它们,继续我们的正常程序。您甚至可以使用.transform()方法来自动删除它们。你可能想尝试其他的特性选择方法来满足你的需求,但是 Boruta 使用了一种最强大的算法,并且快速易用。

祝你好运!

如果你遇到困难,请随时回复,我会尽我所能帮助你。

像我五岁一样解释:线性回归

原文:https://towardsdatascience.com/simple-explanation-of-linear-regression-95b702d2bfde?source=collection_archive---------49-----------------------

让基本想法变得简单

我的小妹妹在我 10 岁时出生。我们很快成了好朋友,我会花很多个下午和她一起玩。当我们长大一点的时候,我们会一起尝试烹饪。后来我们会有各种建筑和游戏项目。总而言之,我们已经是一个团队 18 年了。我有机会和她分享我的知识。

几天前,我向她建议,我们应该测试一下一张动画预览图片会如何影响一篇中等帖子的点击量。她同意了——她会制作一个动画,我会测试它是否对点击量有积极的影响。但是,然后她问我:我们如何测试呢?

我感到剧痛。我忽略了作为一个哥哥的责任。我当然应该教我妹妹如何做实验。这种技能让我们在做任何事情时都有优势。为了弥补自己,我给她写了一篇关于如何使用线性回归分析实验结果的基本说明。

这是我对小姐姐的解释。以我们的动画实验为例。

1.我们在衡量什么

不久前,我写了我的第一篇文章,并在媒体上发表。让我的文章出现在媒体读者面前比我想象的要难一些。现在我有了更多的时间,我想用一部分时间来了解如何让媒体文章发挥作用。

和我妹妹一起,我们正专注于一个帖子的预览图片——也称为
缩略图。一个好的缩略图应该是相关的,真实的帖子,并鼓励人们点击帖子。一个改进的缩略图应该会增加点击帖子的人数。到目前为止,这似乎很符合逻辑。

下面是我写的一篇文章的原预览。这个女孩的照片是一个相当普通的,非动画的缩略图。

[## 尽情享受生活;高效远程

现在改善你的远程工作习惯,可以开启全新的机会

medium.com](https://medium.com/@manezki/enjoy-life-to-the-fullest-remote-efficiently-78af5e48f865)

帖子的点击数对作者是可用的,但它的名称不同。它们显示为浏览量的数量,也就是有多少人浏览了这个帖子。这是作者在帖子中看到的他们的观点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个作者在文章中看到的一些统计数据。如你所见,我们才刚刚开始。图片由作者提供。

对于我们的小测试,只查看看到动画缩略图的视图是有意义的。在我们的例子中,这些将是内部视图。他们是来自媒体的读者,他们肯定能看到动画缩略图。由于读者来自其他网站,如脸书,不清楚他们是否也看到了动画缩略图。因为我们对它们不确定,所以排除它们是个好主意。幸运的是,Medium 已经将它们算作外部视图,并且它们很容易被计算出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内部视图可以看到动画缩略图。然而,外部视图可能看不到
动画缩略图。图片由作者提供。

2.我们多快能获得浏览量

所以一个更好的缩略图会更快地获得浏览。我们怎么知道哪个更好?

原始缩略图和动画缩略图之间的差异很容易测试。我们可以在相同的时间内尝试两个缩略图,并比较最终哪个获得了更多的视图。但是原来的缩略图已经放在那里 99 天了。再过 99 天,我们可能会忘记整个实验。所以让我们试试别的。

相反,我们可以看看不同的缩略图获得视图的速度。

要知道这些,我们需要知道这篇文章每天有多少总浏览量。幸运的是,Medium 告诉我们每天有多少新的浏览量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 月 11 日 0 次查看。图片由作者提供。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3 4 月 12 日观点。图片由作者提供。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 月 13 日观点。图片由作者提供。

按日期排列的总浏览量是所有前几天的总和。更重要的是,这些观点和自发布以来的天数的总和可以被绘制成一个图。像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每天内部浏览的总和,使用原始缩略图。图片由作者提供。

这就是我们目前的情况。我们知道一段时间内的浏览量,但仅此而已。没什么有趣的信息。

3.比较缩略图

我们原来的问题是:一个动画缩略图会增加帖子的点击量吗?

目前,我们不知道。这是有道理的,但我们不知道,直到我们尝试一下。在我们尝试之后,我们将获得动画缩略图的浏览次数。**现在,我为动画缩略图编了一些数字——这样我就可以展示测试的其余部分了。**这里的数字是并排画的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动画缩略图的一些虚构值。图片由作者提供。

从上面的图片中,我们可以看到动画缩略图已经生成了几乎与原始缩略图一样多的视图。但是,动画缩略图仅出现了 21 天。

我们完事了吗?动画缩略图似乎更好,对不对?

我们可以停在这里。但是我们仍然可以算出动画缩略图比好多少!这将是一件令人振奋的事情。这也有助于决定我们是否应该在这上面花时间。

为了感受不同之处,我们稍微改变了一下情节。我们添加一条直线,试图整齐地穿过两点之间。这条线是帖子获得浏览量的速度。线越陡越好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于这两个结果,我在两点之间添加了一条直线。图片由作者提供。

我们甚至可以通过一些简单的计算得到陡度的值。陡度等于天数除以**这些天增加的观看次数。**我把数值加到了下一张图片上。但是,请检查我们在点之间添加的线。为了使它更适合,它不会从第 0 天的 0 次查看开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

右边的图计算了陡度。红色的文字告诉我们这条线有多陡——相当于
“我们每天有多少浏览量”。图片由作者提供。

为了获得改进值,我们将动画缩略图线的陡度除以原始缩略图的陡度。有了这个虚构的数据,动画缩略图会好 0.32/0.08 = 4 倍。所以有一个动画缩略图会很有用: )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些是我们最后做的步骤。添加数据,添加直线,并计算直线的陡度。图片由作者提供。

我的小妹妹(和其他读者),这就是我们如何分析实验结果。

这不是唯一的方法,也不总是最好的方法。但是,这很简单,步骤也很容易与现实生活联系起来。许多事情正在幕后发生,但是当你开始时,理解它们是不必要的。更重要的是,我总是乐于助人。

NLP 中变压器的简单说明

原文:https://towardsdatascience.com/simple-explanation-of-transformers-in-nlp-da1adfc5d64f?source=collection_archive---------12-----------------------

NLP 中变压器的简单易懂的解释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯·劳顿在 Unsplash 上的照片

先决条件:

S 序列-2-序列-模型-关注机制

Seq2Seq-神经机器翻译

在本帖中,我们将解决以下与 Transformer 相关的问题

  • 我们为什么需要变压器,Sequence2Sequence 模型有哪些挑战?
  • 变压器及其详细架构
  • 深入探讨变形金刚中使用的术语,如位置编码、自我关注、多头自我关注、掩蔽多头自我关注
  • 可以使用变压器的 NLP 任务

序列 2 序列(Seq2Seq)的挑战

  • 顺序计算:在 Seq2Seq 中,我们以顺序方式在每一步向编码器输入一个单词,以便在解码器中一次生成一个单词的输出。我们可以通过并行化操作来实现计算效率,这在 Seq2Seq 建模中是不可能的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 长期依赖:长期依赖是 Seq2Seq 的一个问题,因为需要对一个长句子执行大量操作,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“它”这个词指的是“冠状病毒”或“国家”。

让我们深入变压器的架构和变压器的关键概念,了解变压器如何应对这些挑战

变压器架构

与 Seq2Seq 不同,Transformer 具有 6 个编码器和 6 个解码器的堆栈;编码器包含两个子层:多头自关注层和全连接前馈网络

解码器包含三个子层,一个多头自关注层,一个对编码器输出执行多头自关注的附加层,以及一个完全连接的前馈网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高级变压器架构

编码器和解码器中的每个子层都有一个残差连接,然后是层归一化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编码器和解码器的单一实例

编码器和解码器的输入

使用学习嵌入将编码器/解码器的所有输入和输出令牌转换成向量。这些输入嵌入然后被传递到位置编码。

位置编码

转换器的架构不包含任何递归或卷积,因此没有词序的概念。输入序列的所有字都被馈送到网络,没有特殊的顺序或位置,因为它们都同时流经编码器和解码器堆栈。

要理解一个句子的意思,理解单词的位置和顺序是必不可少的。

位置编码被添加到模型中,以帮助注入关于句子中单词的相对或绝对位置的信息

位置编码与输入嵌入具有相同的维数,因此两者可以相加。

自我关注

简单地说,注意力是为了更好地理解句子中单词的含义和上下文。

自我注意,有时被称为内部注意,是一种与单个序列的不同位置相关的注意机制,以便计算该序列的表示

自我关注层将所有位置与恒定数量的顺序执行操作连接起来,因此比递归层更快

转换器中的注意功能被描述为将查询和一组键和值对映射到输出。查询、键和值都是向量。使用句子中每个单词的标度点积注意力来计算注意力权重。最终得分是这些值的加权和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://papers . nips . cc/paper/7181-attention-is-all-you-need . pdf

我们用一句话来理解这个吧, “我享受自然。”

输入是查询、键和值。向量的维数是 64,因为这导致稳定的梯度。

第一步:点积

为句子中的每个单词取查询和关键字的点积。点积决定了谁更关注输入句子中的其他单词。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一步:点积

第二步:缩放

通过除以关键向量维数的平方根来缩放点积。维度为 64;因此我们将点积除以 8。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2:缩放点积

第三步:应用软最大值

Softmax 将缩放值规格化。应用 Softmax 后,所有值都是正的,加起来等于 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3:应用 Softmax 来归一化缩放值

第四步:计算值的加权和

我们应用标准化分数和值向量之间的点积,然后计算总和

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 4:值的加权和

自我关注的完整方程式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对句子中的每个单词重复这些步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

句子中所有单词的注意力权重

多头注意力

变形金刚使用多个注意力头,而不是使用单一的注意力功能,在单一的注意力功能中,注意力可以由实际的单词本身支配。

每个注意力头部具有应用于相同输入表示的不同线性变换。变压器使用 8 个不同的注意头,并行独立计算。使用八个不同的注意头,我们有八组不同的查询、键和值,还有八组编码器和解码器,每组都是随机初始化的

“多头注意力允许模型在不同的位置共同注意来自不同表征子空间的信息.”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多头关注;来源:https://papers . nips . cc/paper/7181-attention-is-all-you-need . pdf

利用多头注意力头,输入表征的每个部分与输入表征的其他部分相互作用,以获得更好的含义和上下文。由于多头注意力在不同位置观察不同的表征子空间,这也有助于学习长期依赖性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“它”这个词指的是“冠状病毒”或“国家”。

使用多头注意力,我们得到上面句子中的单词“它”指的是“冠状病毒”。

掩蔽的多头注意力

解码器屏蔽了多头注意力,它屏蔽或阻止解码器输入进入后续步骤。在训练期间,解码器的多头注意力隐藏了未来的解码器输入。

对于使用转换器将句子“我享受自然”从英语翻译成印地语的机器翻译任务,解码器将考虑所有输入单词“我享受自然”来预测第一个单词。

下表显示了解码器如何阻止后续步骤的输入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练期间掩蔽的多头注意力解码器输入和预测

编码器和解码器中的每个子层都有一个残差连接,然后是层归一化。

残差连接和图层归一化有什么帮助?

剩余连接是“跳过连接”,允许梯度流过网络,而不通过非线性激活函数。残留连接有助于避免消失或爆炸梯度问题。为了使剩余连接工作,模型中每个子层的输出应该是相同的。变压器中的所有子层产生维度 512 的输出。

**图层标准化:**标准化每个特征的输入,独立于其他示例,如下所示。层标准化减少了前馈神经网络的训练时间。在层标准化中,我们在单个训练案例上计算层中神经元的所有总输入的均值和方差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图层规范化

全连接层

变换器中的编码器和解码器都有一个完全连接的前馈网络,它有两个线性变换,中间包含一个 ReLU 激活。

解码器的线性和软最大层

解码器的最后一层应用线性变换和 softmax 函数来转换解码器输出,以预测输出概率

变压器的特点

seq2seq 模型的缺点由 Transformer 解决

  • 并行计算 : Transformer 的架构去除了 Seq2Seq 模型中使用的自回归模型,完全依靠自我关注来理解输入和输出之间的全局依赖关系。自我关注对并行计算有很大帮助
  • 操作次数减少:变形金刚的操作次数不变,因为注意力权重在多头注意力中是平均的
  • 长程相关性:影响长程相关性学习的因素基于信号在网络中必须经过的前向和后向路径的长度。输入和输出序列中任何位置组合之间的路径越短,就越容易了解长程相关性。自我注意层将所有位置与学习长程依赖的恒定数量的顺序执行的操作连接起来。

变压器处理的 NLP 任务

  • 抽象文本摘要
  • 神经机器翻译

结论:

变压器具有基于自关注机制的简单网络架构,并且不完全依赖于递归和卷积。计算是并行执行的,这使得变压器效率更高,并且需要更少的训练时间

参考资料:

吉米·巴雷、杰米·瑞安·基罗斯和杰弗里·e·辛顿的图层规范化

注意力是你所需要的一切

[## 图示的变压器

讨论:黑客新闻(65 分,4 条评论),Reddit r/MachineLearning (29 分,3 条评论)翻译…

jalammar.github.io](http://jalammar.github.io/illustrated-transformer/)

https://nlp.seas.harvard.edu/2018/04/03/attention.html

Python 中的简单人脸检测

原文:https://towardsdatascience.com/simple-face-detection-in-python-1fcda0ea648e?source=collection_archive---------5-----------------------

如何使用 OpenCV 库检测图像中的人脸

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Pexelscottonbro 摄影

在这篇文章中,我将向你展示如何使用 Python 构建一个简单的人脸检测器。构建一个检测人脸的程序是一个非常好的计算机视觉入门项目。在以前的帖子中,我展示了如何识别图像中的文本,这是在计算机视觉中练习 python 的一个很好的方法。今天我们来做一件更好玩更有趣的事情:人脸检测。

[## 用 Python 构建一个简单的文本识别器

如何使用文本识别器改进笔记记录过程

towardsdatascience.com](/building-a-simple-text-recognizer-in-python-93e453ddb759)

顾名思义,我们将编写一个程序来检测图像中的人脸。当我说“程序”时,你可以理解为教一台机器做什么。我喜欢用教学而不是编程,因为这实际上是我们正在做的事情。最好的学习方式是教学,所以在教机器如何识别人脸的同时,我们也在学习。在我们进入项目之前,我想分享一下人脸检测和人脸识别器的区别。

人脸检测与人脸识别

这两件事听起来可能非常相似,但实际上,它们并不相同。让我们明白其中的区别,这样才不会漏掉重点。人脸检测是从一幅图像或一段视频中检测人脸的过程。这个程序除了寻找人脸之外什么也不做。但是另一方面,人脸识别,程序找到了人脸,也能分辨出哪张脸是谁的。所以它比仅仅检测它们更能提供信息。有更多的编程,换句话说,更多的教学🙂

假设你在看街,有车经过。人脸检测就像告诉路过的物体是一辆车。而人脸识别器就像是能够分辨出路过的汽车的型号。这里有一个很好的图像显示了实践中的差异。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Pexelscottonbro 摄影

我们开始吧!

我们将为这个项目使用一个模块库,它被称为 OpenCV。OpenCV 是一个高度优化的库,专注于实时应用。

OpenCV(开源计算机视觉库)是一个开源的计算机视觉和机器学习软件库。OpenCV 旨在为计算机视觉应用提供一个公共基础设施,并加速机器感知在商业产品中的应用。作为一个 BSD 许可的产品,OpenCV 使得企业利用和修改代码变得很容易。

T3【https://opencv.org】T5

[## 用 Python 构建人脸识别器

使用 OpenCv 库进行实时人脸识别的分步指南

towardsdatascience.com](/building-a-face-recognizer-in-python-7fd6630c6340)

图书馆

首先,让我们安装软件包。

pip install opencv-python

安装完成后,我们可以将其导入到我们的程序中。

import cv2

OpenCV 已经包含了许多预先训练好的人脸、眼睛、微笑等分类器。这些 XML 文件存储在一个文件夹中。我们将使用人脸检测模型。

下面是人脸检测的链接:https://raw . githubusercontent . com/opencv/opencv/master/data/haarcascades/haarcascade _ frontal face _ default . XML

如果您有帐户,可以从 Github 下载 XML 文件。如果没有,可以从下面的链接中复制代码,粘贴到一个文本文档中,保存为“face_detector.xml”。

将文件保存到当前文件夹后,让我们将它加载到我们的程序中。

# Load the cascadeface_cascade = cv2.CascadeClassifier('face_detector.xml')

导入图像

在这一步中,您将选择一个要测试代码的图像。确保图像中至少有一张脸,以便我们的程序可以找到一张。这是一个人的图像示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Pexelscottonbro 拍摄

选择图像后,让我们在程序中定义它。确保图像文件位于您正在处理的同一文件夹中。

# Read the input imageimg = cv2.imread('test.jpg')

人脸检测

你会惊讶于人脸检测代码有多短。感谢为 OpenCV 做出贡献的人们。下面是检测图像中人脸的代码:

# Detect faces
faces = face_cascade.detectMultiScale(img, 1.1, 4)

我们在前面的代码中定义了 face_cascade。在检测到人脸后,我们将在它们周围绘制矩形,这样我们就知道机器看到了什么。机器可能会出错,但我们的目标应该是教授最佳和最优化的方法,以便预测更加准确。

使用以下代码可以在检测到的人脸周围绘制矩形:

# Draw rectangle around the faces
for (x, y, w, h) in faces: 
  cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
  • (255,0,0)是我们要绘制的矩形的颜色。你玩它,改变颜色。
  • (2)是线条的粗细。您可以更改该值并查看其外观。

结果呢

这是最后一步,现在我们将我们的结果导出为图像文件。此图像将显示人脸检测的结果。为了保存一个新的图像文件,我们将使用 cv2 库中名为“imwrite”的方法。保存完成后,您将在终端上看到“成功保存”。

# Export the resultcv2.imwrite("face_detected.png", img) print('Successfully saved')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Pexelscottonbro 摄影

另一个例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自像素摄于

恭喜你。!您已经创建了一个检测图像中人脸的程序。现在,你有了一个如何教机器为你做一些很酷的事情的想法。希望你喜欢这篇教程,并在今天学到一些新东西。在我的下一篇文章中,我将分享如何使用 python 构建人脸识别器。

跟随我的 博客 走向数据科学 留下灵感。

谢谢你,

[## 每当贝希克居文出版时收到电子邮件。

每当贝希克居文出版时收到电子邮件。通过注册,您将创建一个中型帐户,如果您还没有…

lifexplorer.medium.com](https://lifexplorer.medium.com/subscribe)

适合您的机器学习项目:

[## 用 Python 构建语音识别器

使用谷歌云语音 API 将您的音频文件转换为文本

towardsdatascience.com](/building-a-speech-recognizer-in-python-2dad733949b4) [## 使用 Python 构建条形码/QR 码阅读器

使用 Pyzbar 库的简单且可实际操作的机器学习项目

towardsdatascience.com](/building-a-barcode-qr-code-reader-using-python-360e22dfb6e5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值