如何像数据科学家一样思考?
你被困在一个问题上了吗?
来自 Pexels 的 Andrea Piacquadio 的照片
我们都是问题解决者。我们开始减少做任何事情的努力。我们厌倦了一次又一次地做同样的重复性工作。所以,我们想为什么不让机器来做呢。你瞧,今天你有聊天机器人,自动驾驶汽车,还有很多。
但是,所有这些努力都始于一件事。问题。
你想解决什么?
这是起点。就像在的真实对话中,第一印象为整个对话的成功开创了先例,当提出一个机器学习问题时,人们必须让对问题产生良好的印象。
问题的要素
任何深度学习问题都有三件事需要明确定义,才能在其中取得成功。
工作
简单吧?没有。
假设,我们从一个计算机视觉问题开始。我想创建一个解决计算机视觉问题的 DL 算法。但是,如果你只是打开那扇门,就会有近千个子问题。想要证据,这就是:
来源:www.paperswithcode.com·SOTA(作者截图)
所有这些子问题今天都存在,因为人们选择解决一个特定的问题,而不是一次做所有的事情(psst,这是一个坏主意)。
为此,使用自上而下的方法。
我们再次重复这个任务发现。假设您必须创建一个系统来自动将图书放在图书馆的书架上。
问题 1 :任务是什么?
答:在图书馆自动上架图书。
问题 2 :这个任务包括什么?
回答:先看书名然后,归类到一个主题。
问题 3 :我如何利用深度学习解决这个问题?
回答:我会用文字识别(计算机视觉)和主题分类(自然语言处理)。
Tada!你终于完成了你的任务。
经验
“有些东西是教不来的;他们必须有经验。只有经历过自己的旅程,你才能学到人生中最有价值的课程。”
― 罗伊·t·贝内特
对于机器来说,这并没有什么不同。为了解决问题,他们需要经历问题。
这里的问题是:
我的 DL 系统需要什么样的体验才能实现最佳性能?
继续上面的例子,我们现在有两个任务:文本识别和主题分类。
问题:我的系统需要什么样的经验才能轻松识别书本上的文本?
答:从很多书的封面上看。
通常,对于 DL 系统,我们并不总是得到我们想要的。所以,我们问另一个问题。
**问题:**如果我无法获得上述数据,什么样的体验可以帮助我的系统获得最佳性能?
回答:如果我找不到这个特定的数据,那么我应该找到包含不同背景颜色、角度和光线条件下的文本的数据。
关键是要找到一些涵盖你的具体问题的一般数据。在这里,你采取的是通才方法。
然后,到了你继续搜索数据的时候了。如果你幸运的话,你会找到它。如果不是,那么,你需要问自己这个问题:
问题:在找不到任何数据的情况下,什么样的体验可以帮助我的系统?
回答:如果我得不到,那我就得自己做。我需要从各种角度生成印有文字的图像,背景必须从简单单调的颜色到生动的背景。
这是你去没人去过的地方时最常求助的方法。旅程还没有结束。
最后一个问题:
问题:我可以使用任何现有数据为自己的系统创造体验吗?
答案:答案基本上是肯定的,这将使你的生活变得更容易。获得一些真实的数据,并在此基础上构建你的数据,这是你能为自己做的最大的一件好事。
你必须为你的系统设计最佳的工作体验。
为你的系统选择合适的体验将决定它的成败。
工作指标
每个人都是天才。但是如果你根据一条鱼爬树的能力来判断它,它会一辈子相信自己是愚蠢的。
——阿尔伯特·爱因斯坦
如果您最终错误地度量了系统的性能,您最终会认为这是一个失败而不是成功。
继续上面的例子,我们如何衡量我们的系统是否在最佳状态下运行。
你问自己的问题是:
什么指标可以帮助我正确判断系统的性能?
在我们的例子中,答案是正确上架的书的数量。
但是,这能让我们全面了解系统的性能吗?
由于你有两个任务,它们的性能决定了整个系统的性能。所以,你也要为他们决定绩效指标。
所有现实生活中的任务都是多方面的。
对于文本识别,您可以选择字符级的识别精度。
对于主题分类,您可以选择主题被正确分配的次数。
所有现实生活中的任务都是多方面的,因此,需要在多个维度上进行评估。在我们的例子中,有子系统的性能和系统的整体性能。
摘要
在这篇文章中,我们了解了如何深入研究机器学习问题以及如何思考它。我们知道将深度学习问题分解成这些准系统(任务、经验和绩效衡量)是多么重要。然后,我们明白了如何探索这些准系统,以获得可能令我们惊讶的解决方案。正确的思考导致正确的解决方案。
出版,还是不出版
医疗公司是否应该定期在科学出版物和会议上发表和分享他们的研究成果
TL;速度三角形定位法(dead reckoning)
是的。你应该出版。
在这篇文章中,我将讨论医疗创业公司的 ML 团队是否应该定期发表论文。我将尝试展示其优点和缺点,以帮助确定出版物是否应该优先于其他项目。
首先,免责声明。一切都是从我的角度写的,这是基于我的个人经历,在医疗保健初创公司的 ML 研究团队中工作。我认为它适用于各种领域,但是谁知道呢。
一个名为*“秘密研究:缺乏来自医疗保健独角兽的同行评审证据”*的有趣观点最近发表在欧洲临床研究杂志上。作者讨论了 隐身研究 的问题,并声明:
“医疗保健初创企业是生物医学创新的主要力量,有能力做出革命性的发现。”
但表现出的担忧是:
“大多数价值最高的医疗保健初创企业在公开的科学文献中的参与度和影响力都很有限,或者根本不存在。”
这是一本非常有趣的读物,我完全同意。在当今的研究环境中,当最先进的成果频繁实现,并且代码在开源存储库中共享时,医疗公司不能落后。他们必须考虑并找到一种方式在科学界分享他们的知识和经验。我知道;总有泄露自己秘密的恐惧,尤其是在公司初期。尽管如此,如果你发现你公司的存在很大程度上依赖于一两个“秘方”算法,而这些算法在某种程度上是不能共享的,那么你的公司就有麻烦了。有很多聪明的人在努力推动这个领域向前发展,有人能够或者将会解决这个问题。你只能从出版中长期获利,在几个考虑下你应该让它成为一种习惯和常规,我在这里会描述。
让我们非常宽泛地将发布可能性分为四个选项:
- 顶级期刊[ 《自然》,《科学》,《柳叶刀》,…]
- 临床期刊或临床会议[ 期刊排名
- 面向技术的医学会议[ MICCAI , MIDL , MLHC ,…]
- 顶级技术会议[ CVPR , ECCV , ICLR , NeurIPS ,…]
所有这些选择都有利于公司、团队和文化,但影响程度不同。
让我们逐一探讨这些可能性,并尝试理解在这些地方从事出版工作的利弊。
顶级日记帐
医药公司的圣杯出版物。这是大多数公司和研究人员想要实现的目标。一份你可以自豪地带回家让父母骄傲的论文。
这种出版物验证了你的研究,并有助于你的上市[人工智能]战略。这表明你的工作已经在公司内部圈子之外得到了审查和验证,并得到了认可。这一事实将有助于接触新客户和投资者。
在处理竞争公司和改善公司护城河方面,它也是有益的——提高进入该领域的门槛。
在顶级期刊上发表文章也将公司置于记者的聚光灯下,并吸引了优秀的公共关系。公关机器会替你完成工作,在各大杂志、社交网络上描述论文的主要关键点,采访作者等。最终,这为公司制造了宣传,并吸引了新的用户群。
现在糟糕的部分来了。
这种出版需要大量的努力和时间。它通常发生在一个大型项目的漫长旅程结束后,该项目取得了一些突破或创新的成果,现在不是释放一些蒸汽,放松并转向下一个项目,这将阻止许多团队成员继续进行其他任务。写论文会阻碍公司的一个主要垂直行业向前发展。这一事实并不适用于所有的公司,它高度依赖于公司所处的阶段。在开始这次冒险之前,你应该想清楚。
它还假设你的团队拥有技能,能够处理相关的任务:写一篇科学论文,复制结果,设计图表,审查材料,等等。
此外,你应该考虑这将如何影响团队士气,无论是作为一个团队还是个人。第一,担心被拒绝,这打击了士气,动摇了已经投入巨大努力的信心。第二,审查过程可能会很长,可能需要几个星期才能得到裁判的审查结果。与此同时,团队成员已经忙于其他任务,现在需要联系切换回旧的实验,以便添加丢失的统计值。当然,这将在一些古老的提交中完成,现在不起作用了[顺便说一句,您应该使用 docker 容器并在接近提交时包装您的系统,以便为这种情况做好准备]。
你应该注意的最后一件事是作者在论文中出现的顺序,这可能会成为一个问题。如果涉及到自我,这可能会变成一个痛点——很难让每个人都开心,通常有人最终会不满意。提前想好这个。
临床杂志或临床会议
在这种类型的出版物中,我指的是医疗保健领域某个特定主题的知名期刊,或者发表会议记录或类似内容的高价值会议。
我认为最好的方法是与强有力的合作者一起进行,他们领导这项工作并提出研究问题。在这种情况下,团队支持并帮助推进合作。这样,重担就在外部团队和你的团队之间分配了。双方都喜欢分享和看到他们工作领域的另一个视角。此外,你所在领域的知名研究人员和意见领袖的出版物将有助于公司在行业和学术界的可信度和参与度。
您应该注意不要同时进行太多的协作,因为它们往往会与当前的工作流重叠,并降低团队的速度。协作者通常在不同的时间和不同的节奏下工作,如果管理不当,会导致团队受挫。很难指出同时合作的神奇数量,这也取决于团队的规模以及从长远来看谁处理这些项目。此外,很难拒绝一位重要专家的合作,即使你已经忙于其他人,但尽量限制自己的最佳想法,这将导致有意义的出版物。
这些合作中的一些需要团队成员的工作,但是把他们放在非前排座位上。对于某些合作来说,这是不可避免的,因为研究人员可能想要处理研究,并在需要时使用您的“服务”。然而,让团队成员从事这项工作并且只发送报告会非常令人沮丧。我建议团队成员全程参与研究。并让他们成为与合作者交谈的联系人,这将带来更多的个人关系。此外,信用和认可很重要。如果你的队友“在黑暗中”为别人工作,你最终会士气低落,感到沮丧。
面向技术的医学会议
这种类型的出版物是一个伟大的中间地带。它通常比其他替代方案需要更少的工作,并且适合团队已经在进行的许多项目。
向这些会议提交论文给团队带来了很多快乐,一旦被接受会增加团队士气。这将激励其他团队成员将他们的项目推向高质量,以便与这种类型的出版物相关。
这有助于向社区展示公司,也有助于为团队招募新人才,并吸引对出版物感兴趣的研究人员。
从更模糊的角度来看,它创造了一种卓越的感觉,这种感觉来自于团队所做的工作不仅与公司领域相关,而且与相邻领域的其他人相关。
我认为这种类型的出版对公司和团队都有好处。由于投资回报高,而且比其他选择需要的工作量少,我认为团队应该至少每年进行一次这样的发布。
顶级技术会议
如果顶级期刊是公司的圣杯,这些会议是每个 ML 研究者的愿望清单。我们都在列车对列车的基础上阅读和使用这些出版物。
并非偶然,在这些会议上提交和发表论文的都是来自学术界的研究人员、该领域的顶尖人才或大公司的团队。它可能需要探索与公司范围没有直接联系的问题,并且通常需要使用公共数据集。创业公司通常没有特权和能力为这类项目分配资源。
这些会议的优势之一,也是面向技术的医学会议的优势之一,是预先知道最后期限。截止日期是好的,尤其是对研究团队来说。截止日期公布在会议网站上,您可以调整团队项目,并为此类发布工作设定固定时间。
另一个优势是,与期刊相比,这些会议的回顾过程较短。这基本上是一个拒绝或接受的回应[有一个很短的时间来反驳和更新论文]。
这些会议中的出版物将该团队定位在“大联盟”中,并将该团队标榜为享有盛誉的团队。然而,这种类型的发布需要大量的计算能力,这需要很多钱,尤其是如果您使用云计算的话。它可能会堆积成千上万美元,并“吃掉”团队计算预算。此外,它需要大量时间和专注于研究过程中有时会被忽略的小细节,如专注于提高公开可用的已知数据集的 1-2%的准确性。
最后,我想强调三个要点。
(1)志存高远,做好充分准备,开始时将工作提交给一个比你认为自己价值更高的目标。
(2)我认为,通过对数据集和模型建立更深入的理解,你在撰写论文时总能学到一些新东西。写文章时会有一种奇妙的感觉,这种感觉会推动你的工作质量进一步提高,对你自己和公司都有好处。
(3)如果出版是你的团队的一个目标,你可以做许多提示和不同的行动。我可能会写另一篇文章,但最重要的提示是让合适的专家在你身边。你需要一群支持你的顾问来帮助你将这艘船推向正确的港口。不要小看这个。过去发表过无数次的人的一句正确的话是非常重要的。我很荣幸和几位超级聪明的顾问一起工作,并在今天的每次讨论中不断向他们学习。
那么你下一步打算在哪里出版呢?在下面的回复中分享你的想法,或者给我发私信。
超越平凡——数据科学阅读清单
每天一小时的阅读冲刺,以保持你的知识面广泛和最新
作为发展最快的行业之一,作为一名没有研究团队的数据科学家可能会令人无能为力。去年年底,我意识到我经常错过行业的新发展,不知不觉地重新发明轮子,在与专家的对话中失败。作为一名数据科学顾问,我的压力水平爆炸了,因为我总是觉得自己没有准备好去见客户。
金伯利农民在 Unsplash 上拍摄的照片。作者通过 AdobeSpark 添加的引文。
因此,作为我 2020 年的目标,我决定让自己摆脱这种压力。
“T o 知道你不知道是最好的。当你不知道的时候,认为你知道是一种疾病。把这个病认作是病,就是解脱。”——老子
从这句话中,我得出了一个相当简单的策略:通过阅读更多的书籍,我应该更了解与人工智能相关的新闻。这反过来又增加了我参与不同的人工智能相关讨论的信心。
从一月份开始,我开始定期使用博客和播客来保持自己的相关性。每个工作日,在瑜伽和冥想之后,在我上午 10 点站立之前,我会花一个小时阅读,同时喝第一杯咖啡。
我的收件箱里没有强迫症,所以我减少了订阅量,以确保我能得到我需要的信息,而不会淹没在信息中。作为一家专注于 ML 部署的公司的首席数据科学顾问,我确保我的阅读列表可以在三个方面提升我:
- 人工智能领导者(我的客户)会关心的事情:人工智能行业的状态,客户端行业的状态,Gartner 和麦肯锡发布的这类东西。
- 让我工作更有效率的事情:新的图书馆,新的建筑,温习一些数学/编程技能。
- 成为良好话题引子的东西:有趣的人工智能故事、初创企业新闻、客户的竞争对手在做什么。
我做的大部分阅读来自我订阅的邮件列表和播客。让别人获得你的阅读清单的权衡是花在寻找阅读内容上的时间和 100%符合你兴趣的高质量阅读材料。
这是我想出来的订阅,但它们会根据我的需求不断变化。随着世界的关闭和在家工作成为一种规范,我希望这个列表可以帮助你开始你的阅读计划。在没有经理不断潜伏在你身后盯着你屏幕的时候,抓住机会。
📩邮件列表:
我正在根据目标受众、阅读时间和我喜欢它的地方来组织列表。当然,目标读者仅仅是一个推荐,阅读时间很大程度上取决于你点击了多少链接,以及你进入兔子洞有多远。我可以用我整个阅读时间来研究一篇文章。
总之。(宣称即将开始令人兴奋或危险的活动)看我的👇
1.deeplearning.ai 的批处理
[## The Batch:来自 deeplearning.ai 的新每周简讯!
欢迎来到 The Batch,这是 deeplearning.ai 的一份新的每周简讯!这一批提出了最重要的人工智能事件和…
www.deeplearning.ai](https://www.deeplearning.ai/thebatch/)
这是吴恩达的另一个创意,它让我想起有一个随时可用的研究小组。该小组每周提交 6 篇关于深度学习最新发展的精彩文章。
**👥目标受众:**学者、研究人员、深度学习爱好者。
⏱阅读时间: ~30 分钟(每周)
⭐我喜欢它的地方:它组织得非常好。这些文章来自各种来源,对它是什么、它如何工作、它为什么重要、新闻背后有什么以及编辑们对它的看法进行了很好的总结。
2.哈佛数据科学评论
作为哈佛数据科学倡议的开放访问平台,哈佛数据科学评论(HDSR)的特点是…
hdsr.mitpress.mit.edu](https://hdsr.mitpress.mit.edu/)
我无法比网站上的开篇段落解释得更好,上面写着:
作为哈佛数据科学倡议的开放访问平台,哈佛数据科学评论 (HDSR)以**基础思维、研究里程碑、教育创新和主要应用为特色。**它旨在发布内容,帮助将数据科学定义和塑造为一个基于有原则和有目的的数据生产、处理、解析和分析的科学严谨且具有全球影响力的多学科领域。
**👥目标受众:**每个人都有一个专栏
⏱阅读时间: 60+分钟(每月)
**⭐我喜欢它的地方:**有一个不错的网站,里面的信息是按照它吸引的观众类型排序的。有一个愿景和辩论的全景视图,一个致力于数据科学教育的支柱和关于历史、行业领导者、理论等的各种专栏。
3.中型每日文摘
Medium 不同于互联网上的任何其他平台。我们的唯一目的是帮助您找到令人信服的想法…
medium.com](https://medium.com/)
**👥目标受众:**有抱负的高级数据科学家和工程师
⏱阅读时间: ~20 分钟(每日)
⭐我喜欢它的地方:你可以很容易地定制你所阅读的内容,而且它的内容种类繁多。此外,许多流行的库和工具在 Medium 上也有自己的配置文件。我通过 Jupyter 博客获得关于 Jupyter 项目的更新,并且我第一次在 Medium 上发现了 Streamlit 。我也很喜欢阅读文章的评论,Medium 是我发现评论最多的一个,这个社区总体来说也不错。
因为我还订阅了与数据科学无关的出版物,所以通过阅读一些其他材料,它帮助我让我的大脑休息一下。不过,我确实发现推荐倾向于付费墙后面的文章。
4.奥莱利数据和人工智能简讯
在 1,969 个评级中,平均每五颗星中有四颗保持消息灵通。从业内人士那里获得每周见解,此外…
www.oreilly.com](https://www.oreilly.com/data/newsletter.html)
O’Reilly newsletter 是一份很好的行业见解每周综述。从纯技术到如何领导数据科学团队和其他商业信息,主题范围广泛。
👥**目标受众:**技术领导者&行业专业人士
⏱阅读时间: ~20 分钟(每周)
**⭐我喜欢它的什么:**与我关注的其他邮件列表相比,奥赖利的时事通讯有更多的“x 状态”文章。这些文章都是经过精心研究的,有很酷的图表和有趣的统计数据可供引用。我还发现这份时事通讯包含了更多的数据工程和 ML 部署类型的文章。对了,Data 和 AI 是两个独立的时事通讯。
5.KDNuggets 新闻
[## 订阅 KDnuggets 新闻— KDnuggets
订阅 kdnugges 新闻邮件:Email: Name:(可选)kdnugges 是机器学习、数据…
www.kdnuggets.com](https://www.kdnuggets.com/news/subscribe.html)
该时事通讯分为特色文章、活动/网络研讨会、新闻、教程和观点文章。我发现对于刚刚开始职业生涯的数据科学家或希望进入数据科学的人来说,KDNuggets 是一个很好的起点。
**👥目标受众:**更多初级/中级数据科学家
⏱阅读时间: < 10 分钟(每日)
**⭐我喜欢它的什么:**偶尔,我不明白它是如何关联的,但我通过 KDNuggets 在我的收件箱中收到了 DataRobot、Gartner 和 Figure8 之类的报告。我喜欢这些类型的报告,因为它们的分析相当全面,并有良好的统计数据和可视化来支持他们的主张。
🎧播客:
我早上准备的时候或者晚上做晚饭的时候会听播客。我不擅长同时处理多项任务,所以我选择了那些有挑战性内容但又容易理解的播客。
1.线性离题
搜索我
lineardigressions.com](http://lineardigressions.com/)
凯蒂和本是线性题外话的主持人。该节目涵盖了一切:数据科学、机器学习、模型可解释性、职业轨迹等。Katie 是一名数据科学顾问,所以我发现她的例子和思维框架对我与客户沟通很有帮助。
**👥目标受众:**有抱负的高级数据科学家和工程师。对这里的工程师来说,这是一个很大的呼喊,因为 Ben 帮助在数据科学和软件工程世界之间画出了很好的相似之处。
**⏱听力时间:**20-30 分钟(每周)
**⭐我喜欢它的地方:**主持人之间的对话风格使它成为一次轻松有趣的聆听。举个例子,听你的朋友谈论伯特比听你的教授谈论伯特有趣得多。本问了一些很有见地的问题,凯蒂用我能理解的简单易懂的语言解释了这些问题——通常是在切胡萝卜和煎牛排之间周旋的时候。
2.数据怀疑论者
您值得信赖的播客,以数据科学、机器学习和人工智能为中心。请每周收听…
dataskeptic.com](https://dataskeptic.com/)
数据怀疑论播客有一系列与数据科学、统计学、机器学习等相关的主题。这个节目选择了一个主题,并对其进行了几个月的深入报道——我广泛关注的一个主题是假新闻和 NLP。主持人凯尔特别热衷于科学方法和运用批判性思维解决问题。
**👥目标受众:**有抱负的高级数据科学家和工程师
**⏱听力时间:**20-50 分钟(每周)
**⭐我喜欢它的地方:**通常会有一个贯穿多集的主题,主题涉及面很广。开头几集适合入门者和初学者,随着主题的进展,内容变得有挑战性但有趣。
3.奥赖利数据显示
O’Reilly 数据秀播客:Evan Chan 谈 Spark+Cassandra、FiloDB 和云计算的早期。的…
www.oreilly.com](https://www.oreilly.com/radar/topics/oreilly-data-show-podcast/)
该节目探讨了推动大数据、数据科学和人工智能的机会和技术。每一集,主持人本·洛里卡采访领先的行业专业人士,谈论他们在现实世界中的经历。
**我也刚刚意识到这个节目似乎要停播了,但主持人有一个新的播客,叫做数据交换。我仍然认为奥赖利数据秀的插曲值得一听!
**👥目标受众:**行业专业人士,更倾向于机器学习工程师,因为很多剧集都与模型部署有关。
**⏱听力时间:**20-50 分钟(每周)
⭐:我喜欢它的地方:这个节目的嘉宾在他们各自的领域都非常精通并且受人尊敬。听到公司面临的各种问题非常有趣,从他们的经历中学习更有见地。
这就是我的数据科学阅读清单
希望这篇文章能给你的邮箱增加一些内容,或者启发你自己建立一个阅读清单。
我总是在寻找好的时事通讯和播客,请给我留下好材料的评论。
感谢阅读 ⭐在媒体、 LinkedIn 上关注我,或者访问我的网站。此外,如果您想要对您的机器学习部署框架进行评估,请在 Melio Consulting 发送电子邮件给我们。
为人类服务
使用 Seldon Core 在 Kubernetes 上部署模型
来源:Pixabay
介绍
讽刺的是,有史以来关于机器学习的最好的论文之一与实际的机器学习几乎没有关系!
在论文机器学习系统中隐藏的技术债务中,一群来自谷歌的机器学习研究人员敏锐地指出,“任何现实世界的 ML 系统中只有一小部分是由 ML 代码组成的”,并且通常“[模型]所需的周围基础设施是巨大而复杂的。”
换句话说,能够将一个模型从 Jupyter 笔记本中的单个单元转换为一个实际的生产软件并不容易。
服务基础设施
正如本文的图表所示,任何生产 ML 系统的一个较大部分是它的服务基础设施,它通常是利益相关者与 ML 代码实际交互的地方。
对于许多企业来说,该基础架构是某种容器编排引擎,如 Kubernetes。
但是在深入研究如何使用像 Seldon Core 这样的框架为 Kubernetes 下的模型提供服务的技术细节之前,为什么首先要经历所有这些麻烦呢?
作为一等公民的模范
当一个复杂的系统在其主要的功能领域中定义和执行真正的关注点分离时,维护和管理它就容易得多。
简而言之,您希望所有的机器学习代码都是自包含的,并且不依赖于它所在的更广泛的应用程序的运行时。
这就是为什么,例如,将模型作为自包含的 Docker 图像,或将它们隐藏在定制的烧瓶或闪亮的应用程序中,在生产中通常会受到反对——它将机器学习位隐藏在许多层之下,使其更难管理。
理想情况下,您希望能够利用与 CPU、存储等其他计算资源相同的部署和管理习惯。但是你的模特。
这样,数据科学家和/或机器学习工程师可以专注于模型设计和性能,而您的 MLop 人员则可以专注于模型部署和相关基础设施。
在 Kubernetes 的世界中,这意味着模型应该被定义为真正的 Kubernetes 对象( YAML / CRDs ),并使用 kubectl 进行管理。
进入谢顿核心
资料来源:谢顿核心文件
Seldon Core 是一个开源项目,为您的 Kubernetes 集群提供通用模型服务框架。它解决了三个主要挑战:
- 支持大量不同语言的机器学习框架。
- 将模型作为 REST 或 gRPC web 服务自动公开。
- 支持模型部署的全生命周期管理,包括健康、遥测、安全和扩展。
在本文中,我们将在 Seldon Core 下部署一个简单的 REST 风格的模型服务,它接收一个图像,然后不加修改地返回它。
在这个过程中,您将看到注入 ML 代码来执行推理以创建一个成熟的模型微服务是多么容易。
到本文结束时,您应该对如何在 Kubernetes 上的 Seldon Core 下部署模型有了很好的理解。
推理图
资料来源:谢顿核心文件
谢顿核心的预测 API 让你将你的模型定义为一个推理图。
请求流过图的每个节点,最终到达一个模型叶节点,该节点在您最喜欢的 ML 框架(例如 Tensorflow、scikit-learn)中运行某种预测功能,并返回结果。
Seldon Core 支持许多不同种类的节点,允许您创建更复杂的推理图工作流程,如上图所示。
最简单的推理图只有一个根模型节点,这是我们的示例服务将要实现的。
先决条件
在阅读下面的教程时,会做出以下假设:
- 您可以访问已经安装了 Seldon Core 的 Kubernetes 集群(≥1.12),或者拥有管理权限来安装该集群。
谢顿核心很容易安装:只需遵循几个简单的指令来部署它。
- 您已经安装了 Docker,并且可以轻松地编写 Docker 文件以及构建映像并将其推送到本地集群注册表。
选择一种语言,任何语言…
目前, Seldon Core 支持多种语言包括 Python、R、Java、NodeJS,现在还有 Go (alpha)。
但是如何?
任何 k8s 集群中的基本执行单元是一个 Pod,它总是由一个或多个 Docker 容器支持。
Seldon Core 让您首先在他们的预测 API 下实现您的模型代码,然后将其包装在 Docker 容器中。
您创建的图像既可以通过 Dockerfile 直接构建,也可以使用 OpenShift 的 s2i 工具以 Seldon Core 的包装图像为基础构建。
对于我们简单的基于 Python 的服务示例,我们将使用几个简单的 Dockerfile 指令直接创建它。
听候吩咐
好了,让我们编写一个简单的 Python 服务,我们可以使用它的预测 API 部署在 Seldon Core 下。
我们的服务只是将图像作为张量读入,然后返回。
创建一个名为 MyModel.py 的文件,如下 :
#!/usr/bin/env python3import io
import logging
import numpy as npfrom PIL import Imagelogger = logging.getLogger('__mymodel__')**class MyModel(object):** def __init__(self): logger.info("initializing...")
logger.info("load model here...")
self._model = None
logger.info("model has been loaded and initialized...") **def predict(self, X, features_names):** """ Seldon Core Prediction API """
logger.info("predict called...") # Use Pillow to convert to an RGB image then reverse channels.
logger.info('converting tensor to image')
**img = Image.open(io.BytesIO(X)).convert('RGB')
img = np.array(img)
img = img[:,:,::-1]** logger.info("image size = {}".format(img.shape)) if self._model:
logger.info("perform inference here...") # This will serialize the image into a JSON tensor
logger.info("returning prediction...") # Return the original image sent in RGB
**return img[:,:,::-1]**
让我们来分解一下:
- 我们的模型服务类是一个简单的 Python 对象,它实现了一个 predict() 方法。请注意,在您的实际模型代码中不需要 Seldon 核心 API。您所需要做的就是用 predict()方法创建一个类对象,这样就完成了!
- predict()方法将一个张量 X 和一列特征名作为输入。这些类型由谢顿核心 protobuf 规范定义,在此处找到。在我们的示例服务中,我们将只使用张量对象,因为我们的模型吸收图像。
- 我们需要将 Seldon Core 传入的 object X 这样的字节数组转换成 RGB 图像。
- 然后我们反转图像的通道来创建我们最终的 BGR 图像进行处理(适合一些 OpenCV 处理)。
- 注意,我们可以在类实例化时注入加载模型,然后在 predict()函数中非常容易地运行推理。
包起来!
既然我们已经整理好了模型类,让我们使用这段代码来构建一个使用 Seldon 核心包装 API 的 Docker 容器。
创建一个 Dockerfile ,看起来像:
FROM python:3.7-busterRUN apt-get update && DEBIAN_FRONTEND=noninteractive && apt-get install -y \
curl \
python3-setuptools && \
apt-get clean && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*COPY requirements.txt .
RUN curl -s [https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py) -o get-pip.py && python3 get-pip.py && rm -f get-pip.pyRUN pip3 install --no-cache numpy Pillow **seldon-core****# Seldon Core specific**
**COPY . /microservice
WORKDIR /microservice****ENV MODEL_NAME MyModel
ENV API_TYPE REST
ENV SERVICE_TYPE MODEL
ENV PERSISTENCE 0****CMD exec seldon-core-microservice $MODEL_NAME $API_TYPE --service-type $SERVICE_TYPE --persistence $PERSISTENCE****EXPOSE 5000**
让我们来分解一下:
- docker 文件的大部分是相当标准的内容,因为我们创建了一个小的 Python 3.7 buster 映像,有一些运行时需求。
- 注意,我们安装了谢顿核心 Python 模块,作为模型运行时的一部分。
- 我们将应用程序安装在容器的**/微服务**目录中。
- 您的模型类对象实际上是由seldon-core-microservice应用程序加载的,并在内部将其公开为一个 Flask webapp(我们将在实际部署模型时意识到这一点)。
- Seldon Core 同时支持 REST 和 gRPC web 服务 API。这里我们指定 REST,因为我们将使用一个简单的 http POST 操作来测试我们的服务。
构建映像并将其推送到集群的存储库:
$ docker build --no-cache -t my-model:0.1 .
Sending build context to Docker daemon 6.144kB
Step 1/14 : FROM python:3.7-buster
---> 879165535a54
...
Step 14/14 : EXPOSE 5000
---> Running in 8e9f588abe89
---> 83b0a4682783
Successfully built 83b0a4682783$ docker tag my-model:latest <your repo>/my-model:0.1
$ docker push <your repo>/my-model:0.1
为当地服务
现在我们已经构建了一个映像,让我们通过运行我们的 seldon-core-microservice 作为一个独立的 docker 容器来测试它:
$ docker run -d --rm --name my-model -p 5000:5000 my-model:0.1
5aa997b0b093612f88499e13260cf96ee6d9931749f2dfa23ee3d61d303c2cc5
$ docker logs -f my-model
2020-02-21 01:49:38,651 - seldon_core.microservice:main:190 - INFO: Starting microservice.py:main
...
**2020-02-21 01:49:38,659 - __mymodel__:__init__:15 - INFO: initializing...
2020-02-21 01:49:38,659 - __mymodel__:__init__:16 - INFO: load model here...
2020-02-21 01:49:38,659 - __mymodel__:__init__:18 - INFO: model has been loaded and initialized...**
2020-02-21 01:49:38,659 - seldon_core.microservice:main:325 - INFO: REST microservice running on **port 5000**
2020-02-21 01:49:38,659 - seldon_core.microservice:main:369 - INFO: Starting servers
* Serving Flask app "seldon_core.wrapper" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
2020-02-21 01:49:38,673 - werkzeug:_log:113 - INFO: * Running on [http://0.0.0.0:5000/](http://0.0.0.0:5000/) (Press CTRL+C to quit)
请注意,您上面编写的 MyModel 类已被加载,并作为 Flask 应用程序在端口 5000 上提供。模型的预测终点在**‘/预测’或’/API/v 0.1/预测’**。
当地商店
让我们通过编写一个简单的客户端脚本来测试我们的 MyModel 服务,该脚本将向我们的模型的预测端点发送一个图像文件。我们将使用相同的脚本来测试我们在 Kubernetes 上的部署,只需更改 URL。
这是我们的客户,my-model-client.py :
#!/usr/bin/env python3import base64
import json
import logging
import os
import numpy as np
import requests
import sysfrom PIL import Imagelogger = logging.getLogger('__mymodelclient__')
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler())if __name__ == '__main__':
url = sys.argv[1]
path = sys.argv[2] **# base64 encode image for HTTP POST
data = {}
with open(path, 'rb') as f:
data['binData'] = base64.b64encode(f.read()).decode('utf-8')** logger.info("sending image {} to {}".format(path, url))
** response = requests.post(url, json = data, timeout = None)**
logger.info("caught response {}".format(response))
status_code = response.status_code
js = response.json() if response.status_code == requests.codes['ok']:
logger.info('converting tensor to image')
data = js.get('data')
tensor = data.get('tensor')
shape = tensor.get('shape')
values = tensor.get('values')
logger.info("output image shape = {}".format(shape)) # Convert Seldon tensor to image
** img_bytes = np.asarray(values)
img = img_bytes.reshape(shape)
Image.fromarray(img.astype(np.uint8)).save('result.jpg')**
logger.info('wrote result image to result.jpg')
elif response.status_code == requests.codes['service_unavailable']:
logger.error('Model service is not available.')
elif response.status_code == requests.codes['internal_server_error']:
logger.error('Internal model error.')
让我们来分解一下:
- 我们传递想要张贴图像的 URL 和图像本身的路径。
- 我们需要对图像进行 base64 编码,为发布到本地作为容器运行的 Seldon Core 微服务做准备。
- 我们发送一个包含 JSON 字符串的 POST,该字符串包含 binData 键和 base64 编码图像作为其值。
- 如果 POST 成功(HTTP STATUS OK 200 ),我们从 JSON 响应中读取数据键,并提取张量,这实际上是我们的结果图像。
- 张量有一个形状和值键——值键是图像本身作为像素强度的数组。
- 我们使用 Pillow 将张量值写成一个名为“result.jpg”的 JPEG 文件。
现在让我们使用这个脚本来测试我们的服务:
$ file test_image.jpg
test_image.jpg: JPEG image data, JFIF standard 1.00, resolution (DPI), density 0x0, segment length 16, comment: "LEAD Technologies Inc. V1.01", baseline, precision 8, **1280x960, components 3**$ python3 my-model-client.py [http://localhost:5000/api/v0.1/predictions](http://localhost:5000/api/v0.1/predictions) test_image.jpg
sending image test_image.jpg to [http://localhost:5000/api/v0.1/predictions](http://localhost:5000/api/v0.1/predictions)
caught response <Response [200]>
converting tensor to image
result image shape = [960, 1280, 3]
wrote result image to result.jpg$ file result.jpg
result.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, **1280x960, components 3**
让我们看看处理图像的 docker 容器的日志消息:
$ docker logs my-model
2020-02-21 15:32:33,363 - __mymodel__:predict:22 - **INFO: predict called...**
2020-02-21 15:32:33,391 - __mymodel__:predict:27 - **INFO: image size = (960, 1280, 3)**
2020-02-21 15:32:33,391 - __mymodel__:predict:33 - **INFO: returning prediction...**
2020-02-21 15:32:33,977 - seldon_core.user_model:client_class_names:166 - INFO: class_names is not implemented
2020-02-21 15:32:33,977 - seldon_core.user_model:client_custom_tags:134 - INFO: custom_tags is not implemented
2020-02-21 15:32:33,977 - seldon_core.user_model:client_custom_tags:134 - INFO: custom_tags is not implemented
2020-02-21 15:32:33,977 - seldon_core.user_model:client_custom_metrics:307 - INFO: custom_metrics is not implemented
2020-02-21 15:32:34,271 - werkzeug:_log:113 - INFO: 172.17.0.1 - - [21/Feb/2020 15:32:34] **"POST /api/v0.1/predictions HTTP/1.1" 200 -**
部署它!
像所有 Kubernetes 的东西一样,Seldon Core 通过一个自定义资源定义(CRD) 文件定义了自己的部署对象,称为 SeldonDeployment 。
让我们通过一个 seldon-deploy.yaml 文件来定义我们的模型的 seld deploy:
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: my-model
spec:
name: my-deployment
**predictors:**
- componentSpecs:
- spec:
containers:
- name: my-model-graph
image: <your cluster's registry>/my-model:0.1
**graph:**
**children: []**
**endpoint:
type: REST
name: classifier**
**type: MODEL
annotations:
predictor_version: "0.1"
seldon.io/svc-name: my-model-svc **
**name: my-graph**
** replicas: 1**
让我们来分解一下:
- 一个很少部署由一个或多个预测器组成,这些预测器定义了这个部署中包含哪些模型。注意:您可能想要为金丝雀或多臂强盗类型场景定义多个预测器。
- 每个预测器都由一个 Pod spec 组成,它定义了我们上面构建的模型代码的 Docker 映像。
- 由于 SeldonDeployment 是一种部署类型,每个预测器都由一个或多个复制集支持,复制集定义了应该创建多少个 pod 来支持您的模型(推理图)。这是允许您扩展部署以满足计算需求的方法之一。
- 我们还设置了一个自定义的服务名,因为一个很少部署会将我们的微服务自动公开为 Kubernetes Service 对象。
让我们创建 SeldonDeployment,并查看部署以及创建的背后的对象:
$ kubectl get seldondeployments
NAME AGE
my-model 6s$ kubectl create -f seldon-deploy.yaml
seldondeployment.machinelearning.seldon.io/my-model created$ kubectl get all
NAME READY STATUS RESTARTS AGE
**pod/my-deployment-my-graph-20302ae-5cfc6c47f4-m78ll** 2/2 Running 0 80sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
**service/my-model-svc** ClusterIP 172.26.126.119 <none> 8000/TCP,5001/TCP 55s
service/seldon-9d8927429acc983eba0168e21059f589 ClusterIP 172.28.210.215 <none> 9000/TCP 80sNAME READY UP-TO-DATE AVAILABLE AGE
**deployment.apps/my-deployment-my-graph-20302ae** 1/1 1 1 80sNAME DESIRED CURRENT READY AGE
replicaset.apps/my-deployment-my-graph-20302ae-5cfc6c47f4 1 1 1 80s
注意一些事情:
- 创建的运行您的模型代码的 Pod 实际上有两个容器——您的模型代码以及在部署时注入的“sidecar”seldon-container-engine。
- 谢顿容器引擎将把所有请求和响应整理成谢顿核心信息格式,并监控你的模型容器的健康和遥测。
- ClusterIP 服务在端口 8000 上公开,以便我们与微服务进行通信。
现在我们的模型微服务已经启动并运行,让我们使用上面的同一个客户端来测试它。我们需要设置一个公共可访问的入口或者使用端口转发来创建到我们的服务对象的直接连接。
在我们的简单示例中,我们只使用一个简单的端口转发:
$ kubectl port-forward svc/my-model-svc 8000:8000
Forwarding from 127.0.0.1:8000 -> 8000
Forwarding from [::1]:8000 -> 8000
Handling connection for 8000$ python3 my-model-client.py [http://localhost:8000/api/v0.1/predictions](http://localhost:8000/api/v0.1/predictions) test_image.jpg
sending image test_image.jpg to [http://localhost:8000/api/v0.1/predictions](http://localhost:8000/api/v0.1/predictions)
caught response <Response [200]>
converting tensor to image
result image shape = [960, 1280, 3]
wrote result image to result.jpg
成功!
我们刚刚发送了一个图像进行推断,并从运行在我们集群上的微服务得到了一个响应。
你现在可以打开你的原始图像和我们的微服务返回的结果图像,看起来应该是一样的。
为了验证我们甚至可以在 Pod 内部转储日志:
$ kubectl logs deployment.apps/my-deployment-my-graph-20302ae -c my-model-graph
...
2020-02-22 01:44:49,163 - __mymodel__:predict:22 - INFO: predict called...
2020-02-22 01:44:49,223 - __mymodel__:predict:27 - INFO: image size = (960, 1280, 3)
2020-02-22 01:44:49,223 - __mymodel__:predict:33 - INFO: returning prediction...
2020-02-22 01:44:49,948 - seldon_core.user_model:client_class_names:166 - INFO: class_names is not implemented
2020-02-22 01:44:49,949 - seldon_core.user_model:client_custom_tags:134 - INFO: custom_tags is not implemented
2020-02-22 01:44:49,949 - seldon_core.user_model:client_custom_tags:134 - INFO: custom_tags is not implemented
2020-02-22 01:44:49,949 - seldon_core.user_model:client_custom_metrics:307 - INFO: custom_metrics is not implemented
2020-02-22 01:44:50,355 - werkzeug:_log:113 - INFO: 127.0.0.1 - - [22/Feb/2020 01:44:50] "POST /predict HTTP/1.1" 200 -
打扫
$ kubectl delete -f seldon-deploy.yaml
seldondeployment.machinelearning.seldon.io "my-model" deleted
我们很少部署和相关的物体现在都被终止了。
结论
我希望通过这篇简短的教程,你能更深入地了解如何使用 Seldon Core 将你的模型部署为 Kubernetes 下的微服务。
一般来说,谢顿核心开发工作流程如下:
- 按照 Seldon 核心预测 API,将您的推理图编码为一组简单的 Python 对象。
- 将模型代码和运行时包装成 Docker 容器。
- 首先在本地测试您的容器,以验证您的模型代码是否按预期工作。
- 将您的模型部署为一个微服务,作为一个取消部署对象。
- 通过创建入口或使用端口转发将请求推送给它,来测试您的 SeldonDeployment 微服务。
Seldon Core 支持许多我在本文中没有提到的高级特性,因此我鼓励您仔细阅读该项目的大量文档,以更好地理解其整体设计和丰富的特性集。
但是,希望这篇文章能让您体会到为什么像 Seldon Core 这样的专用服务基础设施值得您花费时间和精力。
搅拌还是旋转:更好的浓缩咖啡体验
跨空间和时间分析咖啡浓度
我第一次听说搅拌和漩涡是在詹姆斯·霍夫曼的视频中,他认为你不应该搅拌你的浓缩咖啡。他给出了不少似乎有科学依据的理由,但没有容易理解的数字来说明什么都不做、旋转或搅拌浓缩咖啡之间的区别。白马也有一篇令人信服的文章关于为什么应该搅拌而不是漩涡。我开始激动,从品尝经验来看,我不得不同意他的观点,但我想知道我们是否可以在这个问题上获得更多数据。
还有另一个类似的对话,关于等多久才能喝一杯浓缩咖啡。 Clive Coffee 很好地引入了这个话题,有些人认为应该马上来一杯浓缩咖啡。我通常会等它冷却一点,但不小心,我注意到当它冷却很多时,它有一种更糖浆的味道。然后我开始测量酒的温度,现在,我喝 47 度的酒。
然而,在所有这些讨论中,除了单镜头比较,我还没有看到数据,所以我收集了一些数据。我想用数据来回答这个问题,对于浓缩咖啡来说,最有用和最著名的指标是总溶解固体(TDS)。在过去的几个月里,我一直在使用这个指标来帮助理解我的过程中的各种变量,与其他测试不同,我可以对我拍摄的每个镜头进行漩涡/搅拌测试。
- 搅拌和旋转哪个更好?
- 多大的漩涡能让你更接近搅拌?
- 关于 TDS,随着时间的推移,击球会发生什么变化?
单次分析
我测量了几张照片,从照片的顶部、中部和底部开始。除了试图在我的设置中处于中间位置,很难获得合适的深度,而拍摄的顶部和底部更容易一致地测量。
下面这两张照片表明,如果你留下一张照片,它会随着时间的推移在 TDS 方面自我均匀化。我认为随着镜头的稳定,TDS 在镜头的顶部会减少,在底部会增加。然而,弹丸根据扩散原理运行,这意味着较高的浓度扩散到较低的浓度区域。
漩涡次数
看漩涡的次数,似乎漩涡越长,越接近搅动,这是一个直观的结果。在你愿意搅拌多久和搅拌多久之间有一个权衡。该数据还显示,就 TDS 均匀性而言,涡旋仍然没有接近搅拌。
侧面对中间
那你测量射击的位置呢?我通常从照片的中心开始测量,但是我想我也应该从侧面收集测量数据。我惊讶地发现,两边和中间有很大的不同。我曾怀疑从上到下的 TDS 会与两侧不同,我很惊讶地发现不同侧的 TDS 差异有多大。这可能是由于测量误差或测量过程中干扰液体,我还没有分离出这些变量。
多次拍摄的大量数据收集
为了更好地理解,我收集了一些照片的数据。对于每个镜头,我收集每个镜头的样本如下:
- 每个位置的顶部、中部和底部
- 在中心和侧面收集
- 未接触时收集,旋转(5 秒),搅拌(仅中心)
- 每次射击的温度
然后,我将这些样品放在盖子上,直到它们达到室温,在测量过程中,我一直将样品盖着,以确保没有水分蒸发。
根据这些数据,我使用散点图对 TDS 进行了一些比较,以了解 TDS 的不同之处。首先,让我们来看看漩涡 vs 未触及以及侧 vs 中心的比较:
漩涡肯定会改变击球的落点。它导致顶部具有较高的 TDS,底部具有较低的 TDS,而中间部分基本不受影响。结果应该是更均匀的拍摄。与侧面相比,中间有一些变化,但不太明显。侧面顶部似乎有更高的 TDS,中心底部似乎有更高的 TDS。
现在让我们比较一下漩涡和搅拌:
搅拌的均匀性增加,搅拌似乎比侧边的漩涡好一点。让我们更仔细地看看中心和侧面的数据。与未搅动相比,漩涡移动了周围的浓度,但与搅动相比,它并没有好到哪里去。
做决定
这些图表很有趣,但数据似乎令人困惑。有大量的数据,希望答案是显而易见的。如果我们使用这样的标准,即浓度越分散,搅拌或涡旋就越好。因此,我们可以查看顶部、中部和底部这些镜头的标准偏差(STD)。
从这些图表来看,旋转或搅拌肯定比不动镜头要好。这是假设你在一两分钟内喝完你的饮料,因为接近 4 或 5 分钟是东西自然扩散的时候。
当比较搅拌与涡旋时,数据倾向于搅拌比涡旋具有更低的 STD,表明搅拌在使注射均匀方面更好。
就均质浓缩咖啡而言,搅拌比涡旋要好,但由于扩散,这与让一杯咖啡静置几分钟是一样的。当然,也许这只是冰山一角。也许我们并不像自己认为的那样理解浓缩咖啡。
最后,我希望这能帮助你在每次搅拌咖啡时做出一个小而重要的决定。无论你做什么,一定要选一杯,因为这比不碰就喝要好。未接触的镜头是在液体开始于高浓度,结束于较低浓度的过程中制作的,因此有理由认为它不会是均匀的。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
被盗咖啡机的故事
克鲁夫筛:一项分析
翻译还是不翻译,非英语情感分析的最佳实践
在本文中,在具有正/负标签的多样化的 50,000 个荷兰评论数据集上建立和训练递归神经网络。将性能与测试集被翻译成英语并通过预先训练的英语情感模型分类的情况进行比较。接下来,在去除停用词和不嵌入使用词的情况下测试该模型。ConceptNet Numberbatch 受到更密切的关注,因为这种多语言单词嵌入优于其他单词嵌入。
总结
翻译对于情感分析来说不是一个好的选择,它会导致 16%的准确率下降。对于情感分析,停用词和词嵌入是有用的。事实证明,对于荷兰语自然语言处理,Conceptnet Numberbatch 单词嵌入优于 Word2vec/Glove。
翻译与递归神经网络 在本文中,递归神经网络在独立测试集上的准确性与 Textblob 在该测试集的英语 google 翻译上的性能进行了比较。荷兰训练模型是在一个数据集上训练的,该数据集包括近 50,000 条对酒店、购物产品、食品和服务的各种评论,标签为正面或负面。训练后,该模型用于预测独立测试集的标签。翻译后的模型是从 Textblob 预训练的。Textblob 是 Python 中广泛使用的预训练文本分析库。翻译后的模型首先翻译测试集,然后使用预训练的情感分析模型。独立测试集的结果如下:
如您所见,性能降低了 16%。根据斯坦福大学的研究,Textblob 在母语英语测试集上的准确率约为 87.5%。因此,如果翻译是完美的,Textblob 模型的性能已经降低了 4%左右。另外 12%是因为翻译不完美。因此,在这种情况下,建议收集大量的母语数据集。
但有时在小语种中,获取大数据集可能会很困难。除了英语和中文,没有很多大的标准数据集可以使用,网络内容也不太容易获得。如果你能设法得到几百个数据点(但不是 10.000 以上),那么迁移学习可能是一种选择。为了在这种情况下应用迁移学习,一个带有正负标签的(大)英语数据集被翻译成荷兰语,然后被训练。然后,该模型的权重用于在荷兰数据集的一小部分(1000 条评论)上进一步训练。这给出了比翻译的 Textblob 模型更好的结果:
培训和测试中的三种方法概述:
无停用词 如果停用词被过滤,数据集中最常见的词是好、好吃、酒店、预订、快捷和送货。这些词有些是中性的,有些则带有感情色彩。但是,结果表明准确率下降了 7%以上:
如果检查未过滤数据集中最常见的单词,可以看到前 20 个单词全部是停用词(这是有道理的)。性能下降变得明显。“不是”和“但是”这两个词颠倒了句子的意思。单词“too”和“also”也会改变句子的意思。如果模型不能考虑到这些词,它就不能预测一个句子/评论的反转情绪。
所以在这种情况下,最好将停用词保留在数据集中。
没有单词嵌入 为了新鲜起见,单词嵌入是用数字(或张量)来表示单词。例如,“遛狗的人”可以表示为这样的二维单词嵌入:[1.3,-0.2] [0.4,1.1] [-0.3,0.1] [1.3,-0.2] [1.2,0.7]。因此,当像上面那样使用二维嵌入时,每个(唯一的)单词都被转换成两个数字的组合。单词嵌入工作得如此之好是因为单词的语义被捕获了。意义相同的词具有相似的张量值,与其他词群的差异也相似。如下图所示,单词嵌入的性能要高得多。
concept net number batch concept net 是一个多语言的单词嵌入集。ConceptNet 优于其他众所周知的单词嵌入,如 Word2Vec 和 GloVe,如下图所示:
word embeddings 文件可以在下载部分下载。该文件的结构如下:/c/language _ code/word0.4…0.1。例如,dog 的结构如下:/c/en/dog 0.2 … 0.9。使用 Numberbatch 时,请确保只上传所需的语言,以减少冗余。Numberbatch 的词汇量令人印象深刻,请看下面的 15 种顶级语言:
那么嵌入如何寻找荷兰人呢?这些单词是用 300 个维度来表示的。为了将这个数字压缩到 2,可以使用 T-SNE 算法。共测试了三大类 18 个单词,分别是服装类的夹克、围巾、裤子、鞋子、袜子、毛衣的荷兰语翻译(下图黄色),动物类的虎、鹰、蜘蛛、鹰、狮子、鬣狗的荷兰语翻译(下图灰色),君主制类的皇冠、国王、女王、王子、宫殿、加冕(下图浅蓝色)。如您所见,单词根据相似性进行聚类,这意味着单词嵌入有助于需要处理荷兰语的模型:
最后,下面是一些关于如何实现 Numberbatch 的代码。下一节中的代码打开了 Numberbatch 单词嵌入(确保文件只包含您的语言部分,所以对于荷兰语是 c/nl/)。它创建了一个包含所有荷兰语单词及其 Numberbatch 单词嵌入表示的 300 维字典。例如,单词 dog 将保存为{ ‘dog’: [0.2,0.1,0.5 … 0.3]}:
这部分将数据集标记化。代码为每个唯一的单词分配一个数字,所有唯一的单词都被计算在内。接下来,将构建包含在训练集中出现的单词的字典,并且脚本向其添加 300 维嵌入:
最后,让 Keras 网络的第一层成为嵌入层。这确保了输入数据句子被转换为 Numberbatch 张量:
结论 如果你能够收集一个母语的大数据集,那么在这个数据集上训练的模型可能会给出最好的分类精度。如果你不能得到一个大的数据集,但只能得到几百个数据点,那么迁移学习仍然可以给出很好的结果。翻译数据,然后使用英语训练的模型是不推荐的,除了坏的准确性,这也将恶化您的应用程序的性能,因为数据首先需要被翻译。关于停用词和词嵌入,在这种情况下它们是有用的。Conceptnet Numberbatch 是一个非常好的单词嵌入工具,用于非英语的自然语言处理任务。
Next up 2021 我要写一篇关于神经风格转移的文章。要查看文章的最终应用,请查看以下页面(荷兰语):
到时候见!
令牌输出及其他
主题建模:超越令牌输出
由劳里·威廉姆斯 — 9 分钟阅读
我最近面临一项任务,其最终目标是将大量非结构化的句子和短文段自动聚合到相关主题的组中。
在这个任务中,我意识到在主题建模方法方面还没有太多的报道,特别是当试图给主题起一个有意义的名字的时候。
斯特凡·格雷奇在 Unsplash 上拍摄的照片
机器学习对儿童电视剧角色的痴迷
由凯瑟琳·杨 — 7 分钟读完
埃尔默、伯特和玛吉(辛普森饰)不仅仅是你在成长过程中最喜欢的电视角色——他们也是机器学习和自然语言处理模型
用滚动跨期分析揭示动量效应
由 Yulia Malitskaia—9 分钟阅读
文章展示了跨期方法,扩展和概括了滚动时间序列技术的范围,用于导出过渡过程和经验策略的模型。该方法是在解释动量溢价的背景下说明的,动量溢价是一个长期的持续挑战。
照片由 Valery Rabchenyuk 在 Unsplash 上拍摄
我如何使用 Python 代码提高我的韩语水平
由尼娅姆·金斯利 — 4 分钟读完
2020 年初,我决定要自学韩语。我对这种文化很感兴趣,并被学习一门非欧洲语言的挑战所吸引。我不想成为这种感觉像家务杂事的常见陷阱的受害者,所以我开始使用各种资源,包括 Duolingo、LingoDeer、Talktomeinkorean.com、闪存卡、韩剧,显然还有几千小时的 BTS 专辑。
背景图片由艾哈迈德·迪里尼
基于能量的模型和生成算法的未来
与杰瑞米·哈里斯和威尔·格拉斯沃尔——50 分钟🎧
研究生院中的机器学习和工业中的机器学习是非常不同的东西。在行业中,部署和数据收集变得很关键,唯一重要的是你是否能以足够快的速度交付真正客户想要的产品,以满足内部期限。
自然语言处理的标记化
自然语言处理是编程中由软件处理自然语言的领域之一。这有许多应用,如情感分析、语言翻译、假新闻检测、语法错误检测等。
自然语言处理中的输入是文本。本文的数据收集来自许多来源。在数据可以用于分析之前,这需要大量的清理和处理。
以下是 NLP 中处理数据的一些方法:
- 标记化
- 停止单词删除
- 堵塞物
- 正常化
- 词汇化
- 词性标注
标记化
标记化是将原始文本分成小块。记号化将原始文本分解成单词和句子,称为记号。这些标记有助于理解上下文或开发 NLP 的模型。标记化有助于通过分析单词的顺序来解释文本的意思。
例如,文本“It is raining”可以标记为“It”、“is”、“raining”
有不同的方法和库可用于执行标记化。NLTK、Gensim、Keras 是可以用来完成这项任务的一些库。
可以对单独的单词或句子进行标记化。如果使用某种分离技术将文本分成单词,这被称为单词标记化,对句子进行的相同分离被称为句子标记化。
停用词是文本中对句子没有添加任何意义的那些词,它们的移除不会影响用于定义目的的文本处理。它们被从词汇表中删除,以减少噪声并降低特征集的维数。
基于建模的语言和目的,有各种可用的标记化技术。下面是 NLP 中使用的一些标记化技术。
空白标记化
这是最简单的记号化技术。给定一个句子或段落,每当遇到空白时,它通过分割输入来标记成单词。这是最快的标记化技术,但对于用空格将句子分割成有意义的单词的语言来说,这种技术也是有效的。比如:英语。
基于词典的标记化
在这种方法中,基于字典中已经存在的标记来找到标记。如果找不到令牌,则使用特殊规则对其进行令牌化。与空白标记器相比,这是一种先进的技术。
基于规则的标记化
在这种技术中,为特定的问题创建了一组规则。标记化是基于规则完成的。例如,为特定语言创建基于语法的规则。
正则表达式标记器
这种技术使用正则表达式来控制文本到标记的标记化。正则表达式可能从简单到复杂,有时很难理解。当上述方法不能达到要求的目的时,这种技术是首选。这是一个基于规则的记号赋予器。
宾夕法尼亚树库标记化
树库是一个语料库,它给出语言的语义和句法注释。Penn Treebank 是已出版的最大的树库之一。这种标记化技术将标点符号、连字符号(与其他单词一起出现的单词,如 I’m,don’t)和连字符单词分开。
空间标记器
这是一种更快、更容易定制的现代标记化技术。它提供了指定不需要分段或需要使用特殊规则分段的特殊令牌的灵活性。假设您希望将$作为一个单独的标记,它优先于其他标记化操作。
摩西记号赋予者
这是一个高级的记号赋予器,在 Spacy 引入之前就有了。它基本上是一个复杂的规范化和分段逻辑的集合,对于像英语这样的结构化语言非常有效。
子词标记化
这种标记化对于子词有意义特定应用非常有用。在这种技术中,最频繁使用的单词被赋予唯一的 id,而不太频繁使用的单词被分成子单词,它们最好独立地表示意思。例如,如果单词“很少”在文本中频繁出现,它将被分配一个唯一的 id,其中越来越少的罕见单词和在文本中不太频繁的单词将被分成子单词,如“很少”、“er”和“est”。这有助于语言模型不学习越来越少的两个独立的单词。这允许在训练期间识别数据集中的未知单词。下面给出了不同类型的子词标记化,并且将简要讨论字节对编码和单词块。
- 字节对编码(BPE)
- 文字片
- 单语法语言模型
- 句子片断
字节对编码(BPE)
该技术基于信息论和压缩中的概念。BPE 使用霍夫曼编码进行符号化,这意味着它使用更多的嵌入或符号来表示不太频繁的单词,使用较少的符号或嵌入来表示更频繁使用的单词。
BPE 分词是自底向上的分词技术。BPE 算法涉及的步骤如下。
- 首先将输入单词分割成单个 unicode 字符,每个字符对应最终词汇表中的一个符号。
- 从当前词汇表中找出最频繁出现的符号对。
- 把这个加到词汇量里,词汇量就会增加一。
- 重复步骤 ii 和 iii,直到构建了定义数量的符号,或者没有新的符号组合以所需的频率存在。
文字块
除了将新的令牌添加到词汇表的方式之外,WordPiece 类似于 BPE 技术。BPE 考虑将出现频率最高的符号对合并到词汇表中。而单词块也考虑单个符号的频率,并基于下面的计数将其合并到词汇表中。
计数(x,y) =频率(x,y) /频率(x) *频率(y)
具有最大计数的符号对将被视为合并到词汇中。因此,与 BPE 相比,它允许将罕见的标记纳入词汇。
用 NLTK 进行标记化
NLTK(自然语言工具包)是微软开发的一个 python 库,用于辅助 NLP。
Word_tokenize 和 sent_tokenize 是 NLTK 中非常简单的标记化器
它基本上从字符串中返回单个作品。
Sent_tokenize 将字符串拆分成多个句子。sent_tokenizer 是从 PunktSentenceTokenizer 类派生的。sent_tokenize 使用来自 token izers/punkt/English . pickle 的预训练模型。有针对不同语言的预训练模型可供选择。PunktSentenceTokenizer 可以根据我们自己的数据进行训练,以制作一个定制的句子标记器。
custom _ sent _ tokenizer = punksentencetokenizer(train _ data)
还有一些其他特殊的标记器,如多词表达式标记器(MWETokenizer),Tweet 标记器。
MWETokenizer 通过使用 MWEs 的词典,获取已经被分成记号的字符串,并对其进行重组,将多词表达式合并成单个记号。
想想“尽管面临重重障碍,他还是完成了任务”这句话
这被标记为[‘他’,‘完成’,‘任务’,‘在’,‘怨恨’,‘的’,‘所有’,‘障碍’,‘面临’]
如果我们在 MWETokenizer 的词典中添加“尽管”,那么当上述标记传递给 MWETokenizer 时,它将被标记为[‘他’,‘完成’,‘任务’,‘尽管’,‘所有’,‘障碍’,‘面临’]
TweetTokenizer 解决了 tweets 的具体问题,比如处理表情符号。
RegexpTokenizer
这个分词器根据正则表达式将句子拆分成单词。例如,在下面的例子中,记号赋予器从货币表达式和任何其他非空白序列中形成记号。
用文本块进行标记
Textblob 用于处理文本数据,是 Python 中的一个库。与其他包类似,它提供了用于情感分析、词性标注、分类、翻译等的 API。下面是要标记成句子和单词的代码片段,你可以注意到在输出中表情符号被从标点符号中删除了。
用 Gensim 进行符号化
Gensim 是主要用于主题建模的库之一。Gensim 为标记化提供了实用函数。
Gensim 也有一个句子标记器。来自文本清理器的 Split_sentences 对这个句子进行标记化。
用 Keras 进行标记化
标记化也可以用 Keras 库来完成。我们可以使用 Keras 中的 text_to_word_sequence。预处理. text 来标记文本。Keras 使用 fit_on_words 开发文本中单词的语料库,并使用该语料库创建具有 text_to_word 序列的单词序列。
标记化的挑战
在标记化方面有很多挑战,但是我们讨论了一些单词切分的困难。
标记化的最大挑战之一是获取单词的边界。在英语中,单词的边界通常由空格和标点符号来定义句子的边界,但这在所有语言中并不相同。在诸如中文、朝鲜语、日语的语言中,符号代表单词,并且很难得到单词的边界。
甚至在英语中也有很多符号,比如,$,€,后面跟着数字来代表钱,还有很多科学符号,比如,α等等。这给标记化带来了挑战。
英语中也有很多缩写形式,如 I’m(我是),dot(没有)等。这些问题需要解决,否则会在 NLP 的下一步中引起很多问题。
在自然语言处理领域仍有许多研究在进行,我们需要为手头的自然语言处理任务选择合适的语料库。
参考文献:
Gensim 文档:https://pypi.org/project/gensim/
NLTK 文档:https://www.nltk.org/
Keras 文件:https://keras.io/
作者
斯里尼瓦斯·查克拉瓦蒂——srinivas.yeeda@gmail.com
钱德拉塞卡·纳加拉吉——chandru4ni@gmail.com
Tokenizers: NLP 的构建模块
探索经常被忽视的变压器构件
学分:Unsplash
事实是,令牌化者并不那么有趣。当我第一次阅读 BERT 论文时,我跳过了单词片段标记部分,因为它不像论文的其他部分那样令人兴奋。但是标记化已经从单词发展到子单词标记化,不同的转换器使用不同的标记化器,这些标记化器很难理解。
已经有一些讨论和解释记号赋予者的好文章——我最喜欢的是 FloydHub 的详细博客文章和拥抱脸的简短教程。
相反,我想把重点放在应用上——特别是不同模型的标记化器如何开箱即用,以及这如何影响我们的模型的理解能力。如果你从一个预先训练好的 Transformer 模型开始你的 NLP 任务(这通常比从头开始训练更有意义),你会被这个模型的预先训练好的记号化器和它的词汇所困扰——知道它的行为和怪癖可以让你更容易地选择最好的模型和调试问题。
但首先,我们需要一些基础知识,这样这篇文章才能独立阅读。如果您已经了解了标记化的基础知识,可以跳过这一部分。
基本原则
**子词标记化:**在具有无限内存和计算能力的理想世界中,我们将保存我们的词汇表中的每个词,并在我们的词汇表中为每个词保留一个位置。遗憾的是,事实并非如此,所以我们需要有一个固定的词汇表,通常在 30-50k 左右。限制词汇大小的需要意味着几乎肯定会有不够“重要”而不被包括在内的单词,即“词汇表之外”或 OOV。这导致了可怕的< UNK >记号,即未知记号——这被归入每个未知单词,因此,模型将很难理解其语义。但是通过子词标记化,我们能够用更频繁的子词来标记不常用的词,从而两全其美,拥有更小的词汇量,同时仍然能够标记罕见的或拼写错误的词。
**词汇构建:**前面我提到过,只有重要的单词才会被收录到词汇中。那么“重要性”是如何确定的呢?我们从基本字符开始,然后通过将字符合并到子字中来构建词汇表,直到达到最大词汇量。主要的记号化方法在首先考虑什么子词(即,要合并的子词的顺序)以及合并决定方面有所不同。下面的图片来自 Floydhub 的博客,展示了 3 种主要子词分词方法的区别。
来源:https://blog.floydhub.com/tokenization-nlp/
**嵌入:**输入记号由一个嵌入层表示,它是每个记号的多维投影。通过将嵌入传递通过变换器块,获得了对输入的上下文理解,即,标记的嵌入依赖于序列中的其他单词。层次越多,表示就越具体。
符号化者如何看待表情符号
为了分析任何现代文本,特别是用户生成的内容,如推文或消息,我们的模型应该理解表情符号的意思。理想情况下,该模型应该能够直接读取表情符号,尽可能少地进行预处理,以保留句子的原始上下文。
凭借我们对符号化器如何工作的初步理解,我们知道模型阅读表情符号的能力简单地取决于字符是否被添加到模型的词汇中。
装货🤗的预训练模型包含预训练模型及其标记器的全部范围,我们只看到罗伯塔的词汇包含表情符号——其字节级 BPE 的秘密酱允许它标记所有字符,并避免可怕的标记。
来源:https://gist . github . com/neoyipeng 2018/CB 6b 5 BC 10624 AE 6 fcb 9 b 0 e 3c 76 CB 01 f 0
这样做的后果是巨大的——即使你给预训练的 BERT 输入更多的训练数据,它也永远不会知道😀和🤬,因为表情符号不在词汇表里。
为了看到这一点,我们来看看不同的模型如何看待包含不同表情符号的极性句子。只有 Roberta 的 BPEtokenizer 能够区分只有表情符号不同的两个句子,如两个不同的点所示,而 BERT 或 ALBERT 具有相同的极性句子嵌入投影。
这个例子是人为设计的,因为通常有其他不同的单词帮助模型理解句子,但关键是,如果我们希望我们的模型真正辨别我们的表情符号加载推文的含义,我们需要预处理并用相应的含义替换表情符号,或者如果我们不使用 GPT-2 的罗伯塔,从头重新训练标记化器/模型。
记号赋予者如何看待数字
当将 NLP 应用于金融时,一个关键的考虑因素是我们的模型如何看待数字——这也受到表征器/模型本身的影响。
如果我们可视化一些样本句子的隐藏状态,我们会看到,与 XLNet 的句子相比,BERT 的单词块和 ROBERTA 的 BPE 对数字的敏感度要低得多——这表明带有句子标记器的模型更适合有大量数字的文档。
来源:https://gist . github . com/neoyipeng 2018/f 5 cbbbf 4d 39404464122 CD 41 ef 2e 4 e 6d
来源:https://gist . github . com/neoyipeng 2018/f 5 cbbbf 4d 39404464122 CD 41 ef 2e 4 e 6d
对于我做的更多实验,你可以在这里查看我的要点。
结论
最好的 transformer tokenizer 是什么?至于所有乱七八糟的事情,看情况。这取决于您的数据,当您进行 EDA 并可视化一些样本文本时,检查模型的最大错误并检查是否有任何重要的单词将帮助您了解预先训练的模型理解什么,并让您做出更好的选择。
来源
[1] 语境嵌入有多语境化?作者 Kawin Ethayarajh
未来的数据市场将取决于今天的隐私保护
意见、数据隐私和安全性
对所有希望参与新兴的全球数据经济的企业发出温和的战斗号令
格尔德·奥尔特曼/弗赖堡/德国
它可能看起来不像,但与我们当前的社会、政治和现在的社会生物学时代精神相反,这种精神似乎倾向于封闭的边界和受约束的市场,全球经济正在积极寻求通过开放的商业实践来保持竞争力——至少对信息和数据驱动的资产来说是这样。但不是每个人都会玩。无论是受监管的、公共的还是私有的,任何希望参与“数据经济”的企业都需要解决一些关于数据安全和隐私的非常基本的首要原则。
2020 年 2 月,欧盟委员会发布了优先公报(2020 年欧洲数据战略)[ i 。在这份报告中,欧盟(EU)呼吁居民国创建一个对企业、研究人员和公共行政部门都有利的单一数据市场,允许这些实体和公民自己利用非个人数据的洞察力。基本上,欧盟希望促进创建充满可销售数据集和人工智能(AI)资产的欧洲数据池,这些数据池将为欧盟集体经济提供动力,同时符合其自身的数据保护立法。
欧盟指出了一个非常重要的机会,让企业共同努力,利用他们各自的数据和面向人工智能的资产。到目前为止,物联网(IoT)智能城市用例构成了早期数据市场机会的主要部分,支持智能自行车共享、车辆拥堵和停车管理以及空气质量报告和响应。类似的互惠互利的数据生成和消费交换在零售、医疗、金融和其他数据密集型市场中占据一席之地似乎只是时间问题。
毫不奇怪,这种机会主义推理要求对消费者愿意分享的数据负责的人具备很高的数据能力。这就是为什么欧盟如此关心数据的自由交换,尽管它自己的立法对数据共享有一些重大限制。欧盟认为这两种观点不仅相互兼容,而且相互包容,是对其长期经济成功至关重要的一把连体锁和钥匙。
显然,对于已经沉浸在数据隐私和治理措施中的大型商业实体来说,参与更广泛的数据经济所需的许多基础工作已经就绪。对于大型企业对消费者(B2C)公司来说尤其如此,这些公司已经重构了他们的后端系统,以适应当前在全球范围内推出的越来越多的数据隐私和治理法规。
苹果、谷歌、网飞和脸书等大公司(以及联邦机构)如果不能保护用户的隐私和安全,肯定会损失惨重。政府强制实施的法规,如欧盟的一般数据保护法规(GDPR)、加州消费者隐私法(CCPA)、巴西的一般数据保护法(LGPD)以及许多其他法规,正在进入市场。许多国家已经针对一些非常基本的 IT 或业务相关问题征收了高额罚款。
回到 2019 年 12 月,全球域名托管提供商 1&1 Ionos 收到了德国联邦数据保护和信息自由专员(BfDI)高达 955 万€的罚款,原因是
“个人数据保护不足,未能采取‘充分的技术和组织措施’来保护呼叫中心的客户数据。违反了 GDPR 第 32 条。”[ ii
简而言之,1&1 Ionos 允许坏人打电话到公司的联络中心,通过提供用户的姓名和出生日期来获取任何其他用户的信息。对于用户认证中一个非常基本的失误来说,这是一笔很大的罚款,特别是考虑到该公司在 2019 年仅赚了 1.18 亿多€。
这给小企业带来了什么?
像这样的警示故事应该会让企业主和 IT 专业人士感到恐惧,特别是在那些试图远离客户数据管理麻烦的小公司。对于这些较小的参与者来说,甚至不值得考虑有目的地使用这些数据来参与外部数据市场。
但是他们的参与是至关重要的。正如欧盟最近就此事发表的公报中所述,欧洲机构认为,它必须削弱(甚至打破)亚马逊和苹果等大型科技巨头对消费者数据的貌似铁定的控制。就此而言,欧盟和许多其他国家担心,如果没有某种手段从这些精通技术的巨头手中夺取消费者数据的控制权,小企业最终将被遗忘。
小型企业的关键是建立一个坚实的基础,然后随着时间的推移在此基础上添加特定用例的细微差别,以响应不断变化的市场(和监管)需求。对不同投资领域的任何详细观察都不仅仅是这样一个简短的专栏。然而,一般来说,小型企业在保护他们最宝贵的资产时,确实应该考虑两个主要的体系结构领域。
首先,保护数据本身,因为它位于数据存储中。其次,在数据移动以响应数据请求时控制数据,尤其是外部请求和那些涉及机器学习(ML)操作的请求。将有足够的时间来考虑令人兴奋的话题,如建立数据文化,以及如何在新兴的数据交易所(如欧盟设想的交易所)中营销客户数据。
关于高贵但未被充分重视的企业数据库本身,好消息是几乎所有的企业级数据库、数据湖、数据仓库——甚至是个人数据存储,如 Microsoft Office 365——都通过强大的访问控制方法和对静态和动态数据的加密来优先考虑安全性。这些供应商越来越多地增加了针对数据隐私问题的功能(例如,数据屏蔽和子集)。唯一真正的问题是是自托管还是订阅托管数据库。这两者之间的许多权衡取决于内部能力、区域数据主权要求以及值得在其他地方进一步讨论的大量变量。
在处理第二个目标时,投资于能够处理特定隐私和合规性问题的技术,这里也有许多选择。事实上,解决方案涵盖了整个数据安全和隐私领域:数据屏蔽、令牌化、归档、销毁、发现等。像 Delphix、DATPROF、Informatica 和众多竞争对手这样的供应商非常擅长提供数据保护,支持不同的使用案例,如地区监管合规标准(希腊最近发布的关于如何处理 web 浏览器 cookies 的指南)。[ iii
这些解决方案通常在体系结构上位于数据库和消费者(用户或应用程序)之间,提供必要的控制来确保个人身份信息(PII)等敏感数据不会突破安全的企业边界。由于云优先的规模经济,小公司现在可以获得一些非常具体的保护,这些保护在财务上是根据他们对云内和本地数据库部署的具体要求量身定制的。
他们说水涨船高。但是,除非较小的船只(即小企业)通过建立一个坚实的基础来将注意力转向他们的数据——从数据库开始,然后向上移动业务堆栈——否则他们就有可能在停泊的地方沉入较大的船只中。
附录:值得考虑的主要参与者的简要列表
了解数据隐私的数据库供应商
- SAP (HANA +各种)
- AWS(红移、S3 和各种)
- 微软(Azure SQL 数据库+ Azure 数据湖)
- 谷歌(云 Bigtable,云扳手)
- Oracle 数据仓库
- IBM/Cloudera 数据湖
- 弹性企业搜索
- OpenText(各种)
- Teradata(各种)
- 雪花
数据隐私和安全厂商
- 数据伪装
- PKWARE
- 信息(各种)
- Guardium
- 德尔菲克斯
- IBM Optim 数据隐私
- 索利斯
- 金雅拓
- 六层
- HPE 安全数据
- 门蒂斯
- TokenEx
脚注
[i]欧洲委员会,(2020 年),欧洲数据战略
[ii]安东尼·斯帕达佛拉(2019), 1 & 1 命中百万欧元 GDPR 罚款,科技雷达
[iii] OneTrust 数据指南,(2020 年),希腊:HDPA 发布 cookies 指南
太多的术语会破坏回归
多项式回归过度拟合及其避免方法
通过增加现有要素的功能,多项式回归可帮助您充分利用数据集。它允许我们用简单的模型来模拟非线性关系,比如线性回归。这可以提高模型的准确性,但是如果使用不当,可能会出现过度拟合。我们希望避免这种情况,因为这会给你留下一个在未来表现不佳的模型。
来源:作者
在本文中,我们将解释多项式回归的概念,并展示它如何导致过度拟合。我们还将讨论一些可以用来避免过度拟合的技巧。这些方法包括使用 k-fold 交叉验证或坚持集,但最重要的是,我们将讨论如何应用领域知识来帮助您避免过度拟合。我们不会讨论任何代码,你可以在 GitHub 上找到完整的项目。
什么是多项式回归?
让我们通过将一些线性回归模型拟合到一个数据集来直接进入这个概念。我们将使用一个房地产估价数据集,其中包含 414 所售出房屋的信息。为了简单起见,我们只考虑两个变量——单位面积的房价和房龄。我们可以在下面的图 1 中看到这两个变量之间的关系。这个想法是利用房子的年龄来预测价格。
图 1:房价与年龄的散点图
查看图 1,这两个变量之间似乎没有线性关系。这意味着这种关系不能用直线来表示。在我们的案例中,房价最初会随着年龄的增长而下降。然而,大约 25 年后,它开始随着年龄的增长而增加。这表明这种关系可能是二次的。在我们进入建模之前,让我们讨论一下为什么会这样。我们将在后面看到,当涉及到多项式回归时,为数据中的关系提供充分的理由是很重要的。
来源: flaticon
最初的行为是有意义的。随着房屋的老化,它们会越来越破旧,失去价值。房地产专家会有更好的理解,但也许,经过一段较长的时间,房子会变得古色古香。随着人们开始重视他们悠久的历史,他们的年龄会增加价值。也可能有一些选择偏差来解释这种上升趋势。也就是说,昂贵的房子往往不会被拆除,因此出售的唯一老房子就是这些昂贵的房子。
标准线性回归
不管是什么原因,因为这种关系不是线性的,我们不会期望一个标准的线性模型做得很好。让我们通过尝试使用线性回归来展示仅使用年龄的房价模型。我们通过以下方式做到这一点:
- 将数据集随机分成训练集(70%)和测试集(30%)。
- 使用训练集训练模型。
- 通过对测试集进行预测并计算 MSE 来评估模型。
按照这个过程,我们将最终得到一个由以下等式表示的模型:
房价= β₁(age) + β₀
其中β₁和β₀是由模型估计的参数。这个方程也可以称为模型的预测线。它给出了给定年龄的预测房价。
在图 2 中,我们可以看到在数据集上使用该模型的结果。这里,红线给出了预测线。看这条线,我们看到模型在捕捉潜在的二次趋势方面做得不好。我们可以使用测试集 MSE(145.91)来总结该模型的准确性。
图 2:标准线性回归
多项式回归
现在让我们尝试使用多项式回归来改进我们的模型。最终,由于关系似乎是二次的,我们期望下面的等式能做得更好:
房价= β₂(age ) + β₁(age) + β₀
问题是,如果我们对当前数据集使用线性回归,就不可能得到这样的方程。为了解决这个问题,我们可以简单地添加一个新的变量到我们的数据集,年龄。为了避免混淆,让我们把它重新标记为年龄平方。增加这个特性,允许我们把非线性方程改写成线性方程:
房价= β₂(age_squared) + β₁(age) + β₀
我们现在有一个两个变量的线性函数(即年龄的平方&年龄),它实际上是一个变量(即年龄)的非线性函数。这允许我们像以前一样使用线性回归来估计β参数。我们可以在图 3 中看到最终的预测线。在这种情况下,测试 MSE 为 127.42,比我们之前的模型低 13%。所以这个新模型在预测房价方面做得更好。
图 3:随年龄的多项式线性回归
通过使用这个新特性,年龄,我们正在做多项式回归。概括地说,每当使用 n 次多项式来模拟目标和特征之间的关系时,就要进行多项式回归。比如:
房价= βn(ageⁿ)+…+ β₂(age)+β₂(age)+β₁(age)+β₀
通过添加这些功能,我们可以在数据集中模拟更复杂的关系。在我们上面的模型中,我们有 n =2,但是我们可能通过使用更高次的多项式得到更好的结果。也就是说,通过添加更多的功能,我们也可能会过度适应我们的数据。
多项式回归过度拟合
当模型与训练数据集过于接近时,我们称之为过度拟合。该模型捕捉数据中的噪声,而不仅仅是潜在的趋势。其结果是,该模型可能在训练数据集上表现良好,但在测试数据集上表现不佳。事实上,我们不会期望该模型在任何未经训练的数据集上表现良好。
过度拟合通常是因为模型太复杂或特征太多。随着你添加更多的特性,你就越有可能过度适应。随着多项式回归次数的增加,也会发生同样的情况。在图 3 中,您可以看到这意味着什么。我们遵循相同的建模过程,但是每一步,我们增加多项式的次数。我们从 n=1 开始,到 n=25 结束。请注意,随着度数的增加,预测线变得更加扭曲。
图 3:增加 x 次方对回归的影响
现在的情况是,随着你增加度数,你允许模型有更多的转折点。二次多项式有 1 个转折点,三次多项式有 2 个转折点,依此类推…对于每个额外的转折点,我们给予模型更大的自由度以更接近训练数据集。对于更高的度数,模型可能只是捕捉噪声。真实的潜在趋势不太可能如此复杂。
另一种可视化的方法是查看训练集和测试集的 MSE。如图 4 所示,随着度数的增加,训练 MSE 趋于减小。这意味着模型在训练集上变得越来越准确。测试 MSE 讲述了一个不同的故事。当 n=2 时,测试 MSE 最小,之后趋于增加。这意味着模型在测试集上的表现越来越差。换句话说,随着我们增加程度,模型变得更加过度拟合。
图 4:训练和测试的 MSE
如何避免过度拟合
我们已经看到了多项式回归是如何出错的。现在的问题是,我们如何选择正确的程度,避免过度拟合。像任何机器学习模型一样,我们希望训练一个具有在测试集和训练集上都表现良好的特征组合的模型。这样,为多项式回归选择最佳特征的过程与任何其他机器学习问题没有什么不同。
坚持组
一种常见的方法是使用拒绝集。对于这种方法,数据集被分成训练集和保留/测试集。对于不同的特征集,模型在训练集上被训练,并在测试集上被评估。在这里,我们使用 MSE 等指标来评估性能。我们通常会选择在测试集上表现最好的特性集。
看着上面所做的工作,我们可以将这个方法应用到我们的房价例子中。在这种情况下,n=2 的模型具有最小的测试 MSE。这意味着我们将只在最终模型中使用年龄和年龄。这似乎是一个合理的结果,因为真正的潜在趋势似乎是二次的。我们也想出了一些逻辑上的理由来支持这个结果。
k 倍交叉验证
类似的方法是使用 k-fold 交叉验证。这里,我们将数据集划分为 k 个大小相等的子集\折叠。然后,我们在 k-1 个折叠上进行训练,并计算剩余折叠的 MSE。我们重复这个步骤 k 次,这样每一次折叠都作为测试集。模型的最终得分将是所有测试折叠的均方误差的平均值。具有最低平均 MSE 的模型将被选为最终模型。图 5 显示了如何使用 5 重交叉验证来划分数据集的示例。在这种情况下,我们将计算 5 次测试折叠的平均 MSE。
图 5:五重交叉验证示例
领域知识和常识
使用拒绝集和 k-fold 交叉验证通常可以给你一个好的模型。但是数据是杂乱的,统计异常可能发生。仅仅盲目地使用这些方法而不考虑你的问题,你仍然会偶然地得到一个坏的模型。到目前为止,我们已经使用一个特定的训练测试分割执行了上述分析。在这种情况下,我们得出结论,年龄模型是最好的。但是,如果我们使用不同的随机列车测试分裂呢?
您可以在图 6 中看到我们的意思。这里,我们遵循与之前完全相同的过程,除了这一次,我们使用不同的随机训练测试分割。在这种情况下,测试 MSE 最低,n = 8。通过使用拒绝方法,我们将使用它作为我们的最终模型。
图 6:具有替代训练测试分割的 MSE
此时,你应该问问自己,使用 8 次多项式是否有逻辑意义。我们的预测线将采用以下形式:
房价=β₈(age⁸)+β₇(age⁷)+…+β₂(age)+β₁(age)+β₀
价格和年龄的关系真的有那么复杂还是以上结果只是统计上的异常?答案可能是后者,这强调了为什么我们不应该仅仅依赖于像 k 倍交叉验证这样的方法。
在选择特性时,考虑您的问题并应用任何领域知识是很重要的。在我们的房价例子中,n = 2 的模型似乎捕捉到了潜在的趋势。我们也为这种关系提出了一些很好的潜在原因。考虑到这一点,这种模式可能更好。一般来说,如果你包含的特征有一个逻辑上的原因来解释为什么它们是可预测的,那么你就不太可能捕捉噪音和过度拟合。
图像来源
图片是我自己的或从www.flaticon.com获得。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。
参考
[1] J. Frost,过度拟合回归模型:问题、检测和避免(2020),https://statisticsbyjim . com/Regression/over fitting-Regression-Models/
[2]机器学习中的过度拟合:什么是过度拟合以及如何防止过度拟合(2020 年),https://elitedata science . com/overfit-in-Machine-Learning
数据太多,时间太少
你不需要用 1000 个特征来处理这 200 万个数据点就能得到好的结果
我们都知道为什么数据越多越好。你的结果可以更可靠,你可以(有希望)决定性地证明或否定一个给定的假设。然而,有这样一种东西,即拥有太多的数据,或者至少拥有如此多的数据,以至于很难有效地运行某些模型。根据您的具体问题,有几种不同的方法可以解决这个问题。
我有太多的数据点
仅仅因为您从数百万个数据点开始,并不意味着您必须通过您选择的任何模型实际运行所有这些点。事实上,不这样做是个好主意!当你处理数据时,你需要做的第一件事是编辑你的数据,这样每个点实际上都是有用的,因为越大并不总是越好。
第一步:检查异常值
说你的项目和人口身高有关。你想做的一件大事是制作某种直方图,显示人们的身高分布。如果你看到一堆 0 以上的人,很可能你面对的不是微观的一部分人(除非这些数据来自《格列佛游记》中的某个岛屿)。出于同样的原因,如果有很多测量值明显偏高,那么您也会发现更多可以从数据框中剔除的异常值。基本上,除非有可解释的原因(比如从人口异常多或异常少的岛屿收集数据),否则这些异常值可以而且应该从数据集中剔除。
为什么领域知识很重要:有时候有一个离群值是有原因的(来源:维基共享资源)
第二步:明确你的问题并采取相应的行动
这比第一个问题不太容易理解,但在清理数据时仍然非常重要。假设您有一个数据集,记录了客户的每次购买。如果您想要查看最近的购买趋势,您可能想要只包括客户最近的购买,或者只包括在特定时间范围内记录的数据点。如果你想知道顾客买了什么,把每个顾客的购买量加起来,每个顾客一行可能更有用。
相关地,使用你的领域知识。如果你没有大量的领域知识,问问周围的人或者查查资料。有了领域知识,不仅你的假设会更清晰,而且你会更好地知道你需要拒绝或确认你的假设。举一个非常基本的例子,如果你的假设是购买高于平均水平的美容产品的人也购买更健康的食物,你可以使用美容产品或非美容产品的领域知识来过滤你的数据集。当然,这是一个高度简化的例子,但是你明白了。
本质上,明确你的实验和你的假设,明确你需要什么信息来证明或反驳你的假设。没有一个明确的解决方案,就像检查异常值一样。这是数据科学的一部分,需要更多的创造力和批判性思维,但在创建高质量的数据集方面非常有价值。
我有太多的特征了
如果我们正在处理一个数据帧或表,最后一节解决了行太多的问题。本节处理列太多的问题。就像你不需要每一个数据点来运行一个好的模型一样,你也不(一定)需要每一个特性。事实上,如果你有太多的功能,你可以为手头的问题编辑它们。
第一步:检查给定列的信息量
并非所有特征都是同等创建的。有些列几乎肯定会包含每个数据点的数据(那些在该行中没有数据的列可能会被丢弃)。但是,一些更专业的功能可能没有每行的信息。它们也可能只有少数数据点的值。例如,回到有一个顾客购物行为的数据框架的例子,如果有一个关于有多少人购买了限量版培根风味酸奶的列,而只有 5 个人购买了它,那么完全删除该列可能会容易得多。也就是说,如果仅仅抛弃一整列的想法让你感到厌恶,你也可以尝试将多个特性合并到一个特性中。回到我们的培根风味酸奶的例子,您可以将所有酸奶风味的购买合并到一个列中,该列只显示消费者购买了多少酸奶。您还可以将列合并成某个品牌的产品被购买的数量。同样,这是一个很好的例子,说明领域知识和批判性思维是数据科学家的重要工具。通过确切地知道你需要什么来证明或否定一个假设,你可以将特征压缩成一个仍然能提供你需要的信息的特征。
第二步:检查共线性
什么是共线性?就是共线的性质。共线是什么意思?如果我们看一下维基百科页面,共线意味着以下内容:
如果两个变量之间存在精确的线性关系,则这两个变量完全共线。
本质上,当一个自变量增加时,另一个自变量以相同的速度增加或减少。检测和纠正这个问题可能会非常复杂,可能会有自己的博客文章。事实上,有人就此写了一篇博文!因此,这里不再讨论共线性,这里是 TDS 的帖子,它更详细地讨论了什么是共线性以及如何解决它。
第三步:套索回归
照片由普里西拉·杜·普里兹在 Unsplash 拍摄
人们使用两大正则化技术,套索和岭回归。两者都通过惩罚某些数据特征来降低模型复杂性和防止过度拟合,你可以在这里和这里阅读更多关于它们如何工作的信息。我在这种情况下指定套索回归的原因是,与岭回归不同,套索回归会将一些系数减少到 0(基本上消除了该特征),而岭回归只会使它们变得非常非常小。因此,如果你的主要目标之一是减少维度(或者数据框架中的列数),那么 lasso 回归将是一个不错的选择。
第四步:PCA
在上述所有步骤中,尽管您可能会删除一些功能或将多个功能浓缩为一个,但您仍然知道每个功能是什么以及它表示什么。我特意把主成分分析(PCA)放在最后的原因是,你将不再知道你所有的特征是什么。然而,PCA 的明确目的是减少数据维数,所以它是一个有用的工具,尽管我个人认为它是最后的手段。
有两种方法可以实现 PCA,您可以指定想要保持多少方差(例如,您可以说您想要保持 85%的方差)。你也可以说你希望最终的数据帧有多少个变量(例如,你可以说你只需要两个或三个变量,这样它们就可以被绘制在图上)。在第一个示例中,您不知道将返回多少个变量,在另一个示例中,您不知道保留了多少方差。因此,您采取的方法取决于您想要实现的目标。例如,您想要易于可视化的数据吗?如果是这样,您需要指定两个或三个变量。你想仅仅简化你的数据框架,仅仅减少变量的数量吗?在这种情况下,请指定要保留的差异百分比。
结论
虽然除了我在这里介绍的方法之外,可能还有其他编辑和简化数据集的方法,但是当您需要编辑和简化数据时,这是一个很好的起点。虽然有很多技术步骤可以实现(如 PCA 和岭回归),但数据编辑的一个重要组成部分是利用您的领域知识和批判性思维。虽然数据科学家当然需要了解统计和算法,但这也是数据科学家需要创造力和跳出框框思考的能力的原因。
拿了一个机器学习的硕士学位,我(非常)没有准备
我从全职到人工智能硕士生过渡的探索。
在 Unsplash 上由 Gery Wibowo 拍摄的照片
我其实在题目里撒了谎——喘气,我没有考机器学习硕士。那是在计算机视觉、机器学习和太空机器人学。
陈述确切的过程可能会增加对学位难度的理解…也可能不会。外面的天才可能会想,“ meh 听起来像在公园里散步”,但我向你保证不是。
背景
去年 12 月,我写了一篇文章,强调了我申请的一个数据科学职位遭到拒绝的情况。我将在本文末尾为感兴趣的人放置一个链接。
我关于我被拒的文章传开了(在 Medium 上),有几个人通过 LinkedIn 联系我,询问我读机器学习硕士的经历如何,更重要的是,这是否值得?
我将为您节省一些时间和麻烦,并通知您,在机器学习等有前途和发展中的领域拥有高级资格或学位是绝对值得的。
从我目前的经验来看,我注意到雇主不仅需要某个领域的专业知识;他们还要求资格证明。
拥有神经网络的实践和理论知识,或者详细了解反向传播的工作原理,会让你在竞争中脱颖而出。
但是我偏离了这篇文章的主要观点,将回到我是如何对机器学习硕士学位毫无准备的。
自负
对于那些熟悉过于自信的人,我们知道它有各种各样的形式。
对我来说,它有两种形式。
首先,我对自己在软件工程本科学位(BSc)的优异表现过于自信。那时,关于软件开发生命周期的一切似乎都一拍即合。随着我一次又一次地经历这个过程,设计、实现和测试软件应用程序成了我的第二天性。
这种软件开发的便捷性随后投射到了我四年的 Web 开发生涯中。我知道如何开发一个网站的用户界面,由一个具有 API 的完善的后端系统和一个连接的数据库系统支持,该系统托管在一个托管平台上,如亚马逊。简单对吗?
我错误地认为机器学习对我来说会像网络开发一样容易。
伙计,我错了。对我来说一点都不容易。
我的第二种过度自信来自于低估了机器学习领域整体的复杂程度。
我对机器学习可能有多难的天真,部分是因为那些华而不实的新闻文章,这些文章提到“一名 10 年的执业律师如何在 3 个月内成为一名数据科学家”。
你无法逃避围绕人工智能的大肆宣传。
三个月。
我的近期目标是在三个月内学会机器学习。所以,我买了这本书。
对于那些不熟悉这本书的人来说,这就像你给一个小学教育的孩子一本关于微积分的书;或者就像通过阅读一本关于火箭船的书来学习如何修理自行车一样——我在这里有些夸张,但你已经明白了。
这本书里的术语和方程式对我来说就像一种完全不同的语言。直到今天,有些仍然如此。
老实说,这本书的内容吓坏了我,结果我把研究机器学习与这个星球上最具挑战性的事情之一联系起来。
快进到现在,我不得不承认,这本书对于任何渴望认真对待机器学习的人来说都是必不可少的。这本书是为那些希望超越框架、API 和库的人准备的。
我原以为机器学习会轻而易举,结果却更像是一场龙卷风。
提示:如果你正着手研究机器学习,从小处着手。这里有一个自我激励的资源:
如果你已经选择认真研究机器学习,那么恭喜你!你有一个有趣且有意义的旅程…
elitedatascience.com](https://elitedatascience.com/learn-machine-learning?utm_source=mybridge&utm_medium=web&utm_campaign=read_more)
毫无准备
我的过度自信导致我在攻读学位时缺乏准备。
首先是数学,然后是论文,最后是紧张的学习——起床后睡在图书馆学习。
不幸的是,在我的学术生涯中,数学和我从来都不是最好的朋友。获得硕士学位也没有什么不同。尽管如果你在高中或大学时数学或统计学很强,那么与机器学习相关的数学可能一点也不令人生畏。
对我来说,恰恰相反;我喜欢学习反向传播,但是寻找函数的偏导数并不有趣。但这是必须的。
在工作了三年之后,我已经习惯了为了赶上发布日期而一坐就是几个小时。
但是硕士学位要求更多。
我不得不将我的注意力和集中力提高四倍。这很有挑战性,我为这个学位的前半部分而奋斗。
一旦我让自己沉浸在学习小组中,在图书馆安静的房间里,使用生产力应用程序,对我来说专注变得更加舒适
提示:如果你发现很难放下手机,远离社交媒体平台,那么使用森林:
Forest 是一款帮助你远离智能手机,专注工作的应用。
www.forestapp.cc](https://www.forestapp.cc/)
从教科书中学习和在 StackOverflow 上寻找解决方案是非常不同的。
只有在几门硕士课程中表现不佳后,我才意识到,在大学里,你周围有一个资源库。
所以我和一些我见过的最聪明的人进行了一对一的谈话。我上网找到了一个很多机器学习工程师和数据科学家都很熟悉的 YouTube 频道,3Blue1Brown。
格兰特·桑德森的《3blue1brown》是数学和娱乐的结合,这取决于你的喜好。目标是…
www.youtube.com](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw)
最后,写论文。论文写作本身就是一种技能,而我严重缺乏这种技能。当然,我可以花几个小时在笔记本电脑上打字,但那是在调试或实现代码的时候。写作文就不一样了。
文章写作是我必须通过经常练习来学习的东西。我在网上没有找到任何资源可以帮助你获得机器学习方面的论文写作技能。
**提示:*练习在媒体上撰写和发表解释机器学习主题和概念的文章。从某种意义上来说,这和写论文很相似,你必须进行研究,并能言善辩地写作(有时是)*。下面是这类文章的一个例子:
简要了解机器学习模型中的学习过程是如何得到优化支持的…
towardsdatascience.com](/understanding-gradient-descent-and-its-variants-cf0df5c45478)
经验教训
不要低估机器学习(或任何专业学位)
简单的说,机器学习不是闹着玩的。个人已经将他们的生命奉献给了开发机器学习内部的主题和角落,所以当我告诉你你不可能在三个月内掌握或学习机器学习时,请相信我。在最好的情况下,你可能知道一些在很短的时间内很容易理解的常见概念。
不要低估你的能力
在整篇文章中,我提到了我的缺点。然而,我必须给自己一些荣誉,因为我克服了所有的困难,设法完成并通过了我的硕士学位。如果你曾经克服了你认为不可能的事情,你也应该给自己一些信任。
不要高估你的能力
既然我们都拍了拍自己的背,是时候谦虚一下了。如果我只是做了充分的准备,我就不会经历硕士期间的所有混乱。我在软件开发方面的能力蒙蔽了我,我错误地将学习机器学习比作学习新的 web 开发框架或库。
你在一个领域的成功并不能保证你在另一个领域的成功,即使它们可能是相关的。我知道,这似乎是显而易见的,但不得不说。
永远让自己完全沉浸其中
诚实地说,长时间保持全神贯注的能力应该被认为是一种超能力。在当前的数字时代,时间和注意力是新的黄金,您设备上的移动应用程序经过优化,每次都能吸引您的注意力。
你需要重新获得自制力,能够断开互联网。从长远来看,断开一个小时左右的联系,利用这段时间专注于一项特定的任务可能会有所收获。
能够集中注意力是一项需要培养的技能,所以要有耐心,从小处着手。
结论
如果你已经做到了这一步,我告诉你学位的结果是公平的。我通过了硕士考试,获得了与人工智能相关的各种主题的有用知识。
我确实发现,在我的硕士课程中(所以这可能不是标准),你不会学到实际的技能,比如部署你的 ML 模型,建立数据库。我没有听说过像 Sci-Kit Learn、Numpy 和 Pandas 这样的标准数据科学库。但是你可以自己独立地学习所有这些。
攻读硕士学位可能不是获得机器学习或其相关领域工作的必要条件,但它确实有助于你入门。
如果你有一个 ML 硕士学位和一些很酷的项目/投资组合,你将拥有别人可能没有的竞争优势。
这是我拒绝文章的链接,如下面所承诺的,如果你喜欢这篇文章并想看更多,给我一个关注。
拒绝是获得数据科学工作的整个过程的一部分。但它并不经常被提起。这是我的账户…
towardsdatascience.com](/rejected-from-my-first-data-science-interview-c9784dd65296)
这里有一篇来自David Chong的有趣文章,他在文章中探索了机器学习/数据科学研究后的现实。
更多的时候,人们开始了硕士课程,以进一步他们在某一领域的专业知识或获得一些…
towardsdatascience.com](/i-have-a-masters-in-artificial-intelligence-now-what-a71a92b4c51)
在线共享 Jupyter 笔记本的工具
马文·迈耶在 Unsplash 上的照片
与非程序员共享 python 笔记本的三个工具
我最近开始帮助一个新的数据项目,这个项目是由我的一个朋友建立的。项目的数据部分是一个分析部分,将一些自然语言处理应用于调查中基于文本的回答。我为这个项目创建了一个 Github 库,并在一个 Jupyter 笔记本中完成了分析。
作为这个项目的一部分,我希望能够与非程序员分享这些笔记本,他们不一定熟悉 Github。这是大多数数据科学家面临的共同问题。
Jupyter 笔记本是探索性数据分析的伟大工具,但在项目中需要与非程序员利益相关者分享这种分析是很常见的。幸运的是,有很多工具可以让非 Github 用户在线托管笔记本。
在下面的文章中,我将介绍如何使用其中的三种工具,并讨论每种工具的优缺点。
安装
为了测试这些工具,我创建了一个 Github 库和一个样本笔记本。
如果您还没有 Github 帐户,您可以免费创建一个。如果你对创建、克隆和推送 Github 库不熟悉,我之前在这里写了一个指南。
我创建了一个 Github 存储库,用于测试,结构如下。
笔记本文件夹包含一个笔记本,该笔记本由 Kaggle 数据集的机器学习工作流组成,该数据集包含标记为灾难或非灾难的推文。关于这个数据集和数据的信息可以在这个链接中找到。
可以在下面查看笔记本的快照。
现在让我们来看一些与非程序员共享这个笔记本的方法。
Jupyter nbviewer
Jupyter nbviewer 是 Jupyer 社区创建的一个工具,用于呈现 Github online 上托管的笔记本。
使用起来极其简单。只需将笔记本的 URL 粘贴到这个网页中。
笔记本现在通过一个独特的链接呈现,您可以与他人共享。
优点
- 使用起来极其简单。
- 只要笔记本在 Github 存储库中的位置不变,Link 就会保持活动状态。
劣势
- Nbviewer 只渲染笔记本的输入和输出。链接中的代码不可执行。
- 为了减少渲染时间,nbviewer 缓存输出大约 10 分钟。因此,在查看您在链接中所做的任何更改时会有延迟。
粘合剂
Binder 是另一个共享笔记本的开源项目。Binder 不仅在笔记本中呈现输入和输出,还构建存储库的 Docker 映像,使托管笔记本具有交互性。
要共享笔记本,请导航到此链接。与 nbviewer 不同,您需要添加存储库 URL,而不是笔记本的路径,如下所示。您可以选择将路径添加到笔记本,但是如果留空,Binder 将通过链接提供整个存储库。
Binder 将需要几分钟来构建 docker 映像。
该笔记本现已在网上出售。链接的接收者可以查看代码和输出并与之交互。
优点
- 笔记本可以作为可执行代码使用,因此意味着接收者可以复制您的项目并与之交互。
- 简单易用,不需要注册账户什么的。
- 当对存储库进行新的提交时,docker 映像会自动重建。
缺点
- Github 存储库需要包含 Docker 映像的配置文件。可接受的格式包括 environment.yml、Pipfile、requirements.txt、setup.py。这并不是一个缺点,但如果您还没有使用过这些文件,这可能会增加您的复杂性。
木星的
Jovian 是一个跟踪和协作数据科学项目的平台。该平台的一部分是一个在线托管 Jupyter 笔记本的工具,与上面提到的其他工具略有不同。Jovian 是开源的,但在定价上也有一些企业元素。免费层给你无限的公共项目和访问 5 个私人项目。这足以快速共享偶尔的笔记本。
要上传笔记本,您首先需要创建一个帐户。一旦注册,你需要在你的项目虚拟环境的机器上安装 jovian。这可以通过带有pip install jovian
的 pip 安装。
要上传笔记本,请添加import jovian
。准备好共享笔记本后,请键入以下内容。
jovian.commit()
这将要求提供 API 密钥,您可以在 jovian.ml 网站上的帐户中找到该密钥。
一旦你输入了密钥,几秒钟后你会得到一个**“提交成功!”**消息。
如果您现在转到您的个人资料页面,您将看到您的笔记本。Jovian.ml 捕获并上传 python 虚拟环境和笔记本,以便合作者可以与代码进行交互。
如果您导航到笔记本,您可以添加协作者或使用链接与其他人共享。
优势
- 共享选项适合程序员和非程序员,因为您可以选择简单地查看静态输入和输出,或者克隆并运行您自己的版本。
- Jovian 允许细胞水平的评论和讨论,这是一个非常好的功能。
劣势
- 你需要有一个 Jovian.ml 帐户,并且需要在本地安装 Jovian 来共享你的笔记本,因此这个工具比其他两个选项需要更多的设置。
- 笔记本需要单独上传到 Jovian.ml,所以如果你使用 Github 进行版本控制,你需要提交两次,你的项目可能会在两个不同的地方。
本文概述了在线共享 Jupyter 笔记本的三种工具。每种工具本身都非常有用,我肯定会使用这三种工具。然而,对于我在文章开头提出的目的,即与非程序员共享笔记本,nbviewer 绝对是我会选择的选项。这是最简单的选择,并且为我提供了我所需要的,一种仅查看的共享形式。
感谢阅读!
我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!
Python 中每个数据科学项目都应该使用的工具
保持组织有序和高质量的软件开发工具
数据科学中使用的软件和软件包有许多在线列表。熊猫、Numpy 和 Matplotlib 始终是特色,还有机器学习库 Scikit-learn 和 Tensorflow。
然而,同样重要的是一些不太特定于 DS 的软件开发工具,它们应该成为每个项目工作流程的一部分。
托德·夸肯布什在 Unsplash 上的照片
饭桶
版本控制对于任何编码项目都是必要的,数据科学也不例外。在任何规模的项目中,跟踪谁在什么时候做了什么,并拥有一个工作的、经过测试的代码的全面历史是无价的,尤其是在与他人合作时。
Git 跟踪对您的代码库所做的更改,维护代码版本的注释审计跟踪。可以从主存储库中克隆代码用于开发,然后提交带有注释的更改,并在充分测试后推回。您可以在任何时候在版本之间切换,并创建分支来分离主要特性的开发,然后将它们合并回主分支。
这允许多人同时处理同一个代码库的不同特性,而没有覆盖其他人的工作的风险。根据您团队的结构和项目的规模,您可能希望在合并之前围绕测试和代码审查制定一些策略。
GitHub(归微软所有)可能是最受欢迎的 Git 存储库托管服务,但也存在其他替代服务,如 GitLab、BitBucket 和 Launchpad。这些工具都提供了各种各样的管理工具来帮助进一步组织您的项目,例如路线图和问题跟踪。
一个很棒的教程可以在这里找到,但是没有什么比实践更好,所以确保你的下一个项目充分利用了版本控制和它的所有特性。
康达
管理您的环境对于代码的可复制性至关重要。没有人希望在克隆一个 git 存储库后,花费数小时修复兼容性错误,安装和重新安装模块。Conda 通过虚拟环境来处理这个问题,你可以在虚拟环境中安装你需要的软件,然后在它们之间轻松切换。这允许您保持您的环境简约和干净,只包括您当前项目需要的包。
Anaconda Navigator 是一个可移植的 GUI,它使得管理 VEs 变得非常容易。只需创建一个新的环境,搜索您想要使用的包并点击“应用”来添加它们。从那里,您可以在终端、直接 Python 或 Jupyter 笔记本中访问该环境。
我经常不得不在多台机器和操作系统上工作,因此快速轻松地安装我需要的工具的能力非常有用,使我可以避免移动数据。
如果你使用的是终端,Conda 以学习一些命令为代价提供了更多的灵活性。这包括将环境导出为。yml 文件,可以导入到其他地方。将这些环境文件保存在您的 Git 存储库中意味着其他人在尝试运行您的代码之前很容易复制您的环境。
Tim Hopper 在这里详细介绍了使用 Git 和 Conda 的工作流程。
统一测试
布莱恩·克尼根曾经写道:
每个人都知道调试比一开始写程序要难两倍。所以,如果你在编写它的时候尽可能的聪明,你将如何调试它呢?
每个人都知道,当一个项目进行到一半时,事情比你预想的要复杂得多,这种沮丧的感觉。80/20 法则经常适用,你花 20%的时间完成 80%的工作,然后是最后的 20%导致所有的头痛。数据科学项目的复杂性可能会迅速上升,让你的脑袋适应所有的活动部分可能会很棘手。
因此,将您的项目分割成更小、更简单的组件对于协作和创建健壮的代码而不迷失在复杂性中是至关重要的。当处理一小段独立的代码时,单元测试会让您确信它正在按预期工作。这让你可以忘记它是如何工作的,而只关心它做了什么——一个名为“黑盒抽象的概念。
Python 附带安装了 Unittest 框架。使用这个框架,您可以使用各种 assert 语句指定任意多的测试来检查函数的输出。这些可以作为脚本运行,使测试变得容易,并在编辑时继续测试代码的正确性。
例如,假设您正在著名的泰坦尼克号数据集的“Cabin”字段上进行一些特征工程。您可能希望编写一个函数,从船舱值“C38”中提取甲板字母“C”。在编写完函数之后,您可以指定一些测试用例以及预期的输出。如果这些单元测试都像预期的那样运行,那么您可以确信您已经正确地编写了函数。
进一步设想,以后,您希望添加提取客舱号码“38”的功能。在编辑功能时,你不想破坏原有的功能。将这些单元测试放在手边,以确保没有任何东西被破坏(如果有,使用 Git 来恢复您的更改),这使您能够编辑代码,而没有损坏您以前构建的东西的风险。
数据科学中的测试有其自身的一系列挑战。您的代码所依赖的底层数据可能会在不同的测试之间发生变化,这使得难以重现意外的行为,并且数据的大小可能会使常规测试非常耗时。解决这个问题的一个好办法是使用静态的数据子集进行测试。这允许您在几秒钟内明确调试任何奇怪的行为并运行您的代码。您还可以添加虚拟的数据点来测试您的代码如何响应边缘情况。
关于如何使用 Unittest 的更多细节可以在这里找到。
还有其他的吗?
你能在上面的列表中添加更多的例子吗?
2020 年及以后的十大人工智能趋势
图片由皮克斯拜的 Gerd Altmann 提供
人工智能在工作场所的兴起支持和维持数字劳动力是 2020 年的明显趋势。
人工智能、机器学习、神经网络或任何其他行业正在出现的花哨术语,被定义为复杂的计算机技术,正被广泛用于理解和改善业务和客户体验。我假设你以前听说过它,但是今天它的定义是计算机科学的一个领域,强调创造像人类一样工作和反应的智能机器。
以下是今年值得关注的十大人工智能趋势:
对数字智能的需求。
随着越来越多的企业意识到他们必须了解自己的运营,数字智能将在每个数字化转型战略中发挥越来越重要的作用,它是衡量组织从各种关键角度了解其业务流程以及其中的内容和数据的能力的标准。
数字智能解决方案将通过优化自动化计划和补充 RPA 和 BPM 等平台,帮助组织提高这种业务关键型能力。2020 年,随着企业意识到这些解决方案照亮了改善客户体验、降低运营成本和增强竞争优势的道路,更多的组织将在其总体数字化转型计划中采用数字智能技术。(如之前发布的此处。)
图片由 www_slon_pics 来自 Pixabay
数字工作者将改变办公室。
正如我最近谈到的,全球范围内数字工作者的使用越来越多。根据新的 IDC 研究报告,到 2022 年,数字工作者——如软件机器人和人工智能——的贡献将增长 50%以上。(如前所述此处。)
每个人类工作者都有一个数字工作者。预计许多数字机器人将在办公室承担极简任务。数字工作者将接受培训,像任何员工一样执行业务任务,只是速度更快,没有错误。未来,整个企业的所有员工都将有数字工作者与他们并肩工作。这在工作场所将变得非常正常,你肯定会在你的工作场所看到更多这样的技术(继续阅读了解原因)。
图片来自 Pixabay 的 Gerd Altmann
过程智能的扩散。
如果你以前没听过,今年你一定会看到。流程智能允许企业使用其系统中包含的信息来创建其流程的可视化模型,实时分析它们以识别异常值和瓶颈,并预测未来结果以促进技术投资决策。
随着更复杂的数字化转型技术的部署,监控组织各个方面的运营变得越来越重要。管理非常具体的功能(CRM、ERP、CMS、EHR 等)的单独技术系统。)只提供对其平台控制的流程的可见性。这些独立的系统都无法提供全面而深入的洞察力。
随着供应链变得更加全球化和复杂,监控和管理流程变得越来越困难
medium.com](https://medium.com/@ryraiker/7-ways-process-intelligence-enhances-the-supply-chain-6d83b444ba5e)
为了获得这种可见性,组织需要利用流程智能技术,提供所有流程的全面、准确和实时的视图—跨部门、职能、人员,甚至不同的位置。在未来的几年中,更多的企业将会认识到,流程智能使组织能够更好地理解和更有效地管理他们的端到端流程,这些技术将会成为企业的标准。(如之前发布的此处。)
图片由 Gerd Altmann 从 Pixabay 拍摄
人工智能不仅适用于消费者,也适用于企业。
作为消费者,我们每天都在体验人工智能,但往往不知道它正在被使用。在企业中,预计到 2020 年,流程负责人和那些领导客户体验改善计划的人将会看到他们对人工智能工具的参与和访问大幅增加。
许多企业在数字化转型项目上花费了数百万美元,但这些项目从未与企业需求保持一致。当然,他们仍然想知道为什么他们失败了。只有解决业务问题,并确保 it 解决正确的问题,才能确保在 2020 年及以后的企业中取得数字成功。不要只是为了拥有 AI 或 RPA 而拥有它们,要让技术与业务保持一致。
正如 Nathan Furr 和 Andrew Shipilov 在他们的文章中解释的那样,打破了《哈佛商业评论》中关于数字颠覆的观点,“管理者通常认为数字转型主要是关于技术变革。当然,这涉及到技术变革,但聪明的公司认识到,转型最终是为了更好地服务于客户需求,无论是通过更有效的运营、大规模定制还是新的产品。”
人工智能将变得更容易在工作场所使用。商业用户将很快进入机器人和其他易于使用的自动化工具的内部市场,所有技术熟练的人都可以使用这些工具。这些新平台将在改善员工完成工作的方式方面发挥作用,从而改善客户体验,使流程优于竞争对手。
人工智能将监测和改善业务流程。
但是你不能改善你不理解和衡量的东西。
虽然简单的任务自动化已经成为工作场所的常见做法,但高度自动化(如【2020 年十大技术趋势中所述)和智能、认知自动化项目取决于集成人工智能工具的能力,以重塑和重新定义业务流程的实时执行方式。RPA 本身并不智能;这是简单的基于规则的任务自动化。
Derek Miers 是 Gartner RPA 软件魔力象限的高级总监兼分析主管。Miers 参加了今年的 Gartner Symposium/ITxpo,他在会上发表了一篇讲话,对当今存在的 RPA 提出了令人惊讶的批评。
“你所做的是用创可贴覆盖组织,希望能有一个健康计划,”迈尔斯解释道。"你必须修正流程。所以,你真正要做的是在你的旧应用程序前搭建一个小门面,你可以重复使用。”
实现认知自动化将需要为这项任务构建新的工具。人工智能支持的流程和内容智能技术将为数字工作者提供处理自然语言、推理和判断所必需的技能和理解,建立上下文,提供数据驱动的见解。
RPA 工具本身不是用人工智能构建的智能机器人,因此它们需要人工智能驱动的解决方案来实现智能。监控整个企业的流程并触发 RPA、capture 或其他工具的能力将由理解流程(参见上面的流程智能部分)和作为流程有效负载的内容的工具来处理。
简而言之,RPA 的作用是自动化以前由人类处理的重复性任务。该软件被编程为跨应用程序和系统执行重复性任务。该软件被教导具有多个步骤和应用的工作流程。”–安东尼·爱德华兹,首席运营官在茄子。
混合劳动力的常态-人类和人工智能的合作。
许多人认为企业内部的人工智能和自动化是工作杀手。新兴的混合劳动力——人类和机器人——还活着,并且在成长。组织正在迅速实施认知 AI 和 RPA,这些技术可以大规模处理大量重复任务。随着越来越多的用例出现,混合劳动力也在增长。
获得认同可能很难,但企业领导人应该对员工开放和诚实,让他们透明地了解人工智能将如何使用,以及对当前人类工人及其日常工作生活的持久影响
总的来说,无论你的组织是否努力获得认同,信息都很明确:习惯它。在不远的将来,你可能会在日常工作中与人工智能工具、数字工人和机器人一起工作。希望这些数字工作者与业务保持一致,并帮助解决问题,从而加快您的价值实现。
更多人类与 AI 的互动。
人工智能在工作场所的常态也将是我们看到更多人类与人工智能互动的原因。我们将被期待与人工智能一起生活和工作,就像我们已经与 Alexa、Siri 和其他数字助理一起生活一样。你的智能数字工作者会叫什么名字?
随着技术能力的提高,监管允许和社会接受度的增长,更多的人工智能将被部署在不受控制的公共空间。我想象我们中的更多人将与人工智能互动,也许甚至不知道它。虽然我们已经明白,客户体验往往是基于我们的个人资料和兴趣而改进和定制的,但我期待与人工智能的许多其他形式的交互,即使在我们看不到它发生的地方。
数据是人工智能火上浇油。
正如比利·周所说:我们没有放火;它总是在燃烧;因为世界一直在转动;我们没有放火;不,我们没有点燃它;但我们试图与之抗争:不久前,企业将数据视为许多业务流程和交易结束时产生的多余废气。这里发生了巨大的转变,大大小小的组织现在都在系统和方法上进行投资,以收集和记录他们能够收集和记录的所有数据——当然是为了改进!
在过去的 25 年中,数据的快速增长、存储成本的降低以及访问数据的便利性都取得了令人难以置信的增长。数据正在推动客户体验的改善,提升分析能力(特别是在流程数据和流程智能的新领域),实现机器学习和人工智能,并允许企业利用由数据驱动的智能自动化的真正价值。
迈克·科诺诺夫在 Unsplash 上拍摄的照片
人工智能促进网络安全。
在改善网络安全的持续努力中,人工智能将为首席信息安全官带来令人印象深刻的新优势。
虽然人工智能可以增强安全性,但它不是万能的。“人工智能不会解决你所有的安全问题,”安全公司迈克菲前副总裁兼企业产品总经理拉贾·帕特尔说,他现在是阿卡迈科技安全产品副总裁。“把它看作是提高安全态势的一种方法,而不是银弹.”
正如我在2020 年前 20 大技术趋势文章中指出的,未来的人工智能安全将有 3 个关键视角。
更多的人工智能做人工智能的事情——自动化人工智能开发。
“2020 年,预计将在 IBM 所谓的‘人工智能的人工智能’领域看到重大的新创新:使用人工智能来帮助自动化创建、部署、管理和操作人工智能模型的生命周期中涉及的步骤和过程,以帮助将人工智能更广泛地扩展到企业中,”IBM 研究人工智能副总裁 Sriram Raghavan 说。来源:下网。
2019 年,IBM 推出了 AutoAI ,这是一个自动化数据准备、模型开发、特征工程和超参数优化的平台。
寻找包括分布式深度学习的开发技术,使开发人员能够更快更有效地构建人工智能引擎。自动化机器学习将使人工智能开发可用于更多样化的开发人员群体。
在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
总的来说,人工智能有能力重塑和重新定义我们的生活和工作方式。我们都应该期待的增长趋势是在工作场所看到越来越多的人工智能解决方案。这些工具将有助于创造新的用户体验和更好的结果,并确保我们及时高效地实现我们的目标。当考虑混合劳动力的需求时,领导者需要决定简单的基于任务的自动化工具是否是他们问题的答案,或者他们是否需要人工智能和其他变革性技术的组合来实现真正的智能和认知自动化。
选择仍然存在——你的组织将成为由人工智能驱动的成功和可持续数字化的领导者,还是因为害怕变化而保持静止和停滞不前。
RYAN M. RAIKER,MBA // Ryan Raiker 是 ABBYY 的高级产品营销经理,ABBYY 是一家业务流程和数字智商解决方案的全球供应商。作为常驻的“流程智商人员”,Ryan 在流程发现、分析、监控和预测/说明性分析、业务战略管理、业务发展方面拥有专业知识,专注于帮助公司了解其业务流程并从中获得价值。他获得了威得恩大学的工商管理硕士学位、商业分析/信息学学士学位和运营管理辅修学位,并继续在该大学担任兼职教授。
机器学习初学者的 9 大算法
有大脑的机器是未来。
在过去的几年里,机器学习的使用和它的威力已经成倍增长。我们的祖父母认为只有有智力的人才能做的事情现在正在由机器在没有人类干预的情况下完成。这就是机器学习的力量。
1952 年,当 IBM 的亚瑟·塞缪尔(Arthur Samuel)在他的跳棋游戏中首次提出“机器学习”这个词时,他从未想到机器学习会开辟一个全新的领域,从帮助残疾人到祝贺企业决策和动态定价。
机器学习是一种自动建立分析模型的数据分析方法。它是一个技术分支,允许系统从数据中学习,识别模式并在最少的人工干预下做出决策。
机器学习使构建能够理解图像、声音和语言的软件成为可能,并使我们每天都能够了解更多的技术。
当我在 2013 年第一次从 Verge 的一篇文章中知道机器学习的时候,我永远无法理解机器是如何被训练出来的!??直到 2015 年开始本科,开始学习机器学习。训练数据,测试数据,监督-非监督数据,决策树,深度学习和神经网络的随机森林,这是一个沉重的知识云。
一个接一个,我学习了不同的机器学习算法,并做了相关的项目。我读得越多,和他们一起工作得越多,我明白有些算法是从你开始的,这让你对整个人工智能和人工智能生态系统更加熟悉。
在我们进入这个故事之前,非常重要的是要把基础正确地建立在监督和非监督学习上。
监督学习
监督学习是当你有一些输入变量,比如说 x 和一个输出变量 y ,你用一个算法学习从输入到输出的映射函数为 y = f (x)
监督学习的目标是逼近映射函数*,当您有新的输入数据(x)时,您可以以相同的精度预测该数据的输出变量(Y)* 。
它被称为监督学习,因为算法的学习过程是通过从训练数据集进行学习,这可以被视为类似于教师监督一些学生的学习过程。
无监督学习
无监督学习是当你只有输入数据 x,没有对应的输出变量。
无监督学习的目标是构建数据中的底层结构或分布,以便了解更多关于数据的信息。
这些被称为非监督学习,因为与监督学习不同,没有解决问题的正确方法,也没有老师来监督。算法学习数据本身,设计以最佳方式发现和呈现数据中有趣的结构。
因此,有了我的这个故事,让我们进入9 大机器学习算法吧,我们已经听过上百次了,但这次要清楚地阅读它的应用和能力,没有特定的重要性顺序。
1.线性回归
线性回归线
线性回归是一种基于监督学习的机器学习算法。线性回归对因变量和一个或多个自变量之间的关系进行建模。线性回归主要用于处理标量和探索性变量。
线性回归应用于确定因变量(标量)和一个或多个自变量(探索性的)之间存在线性关系的程度。单个自变量用于预测因变量的值。
线性回归的实际应用
- 金融服务或保险领域的风险管理
- 预测分析
- 计量经济学的
- 流行病学
- 天气数据分析
- 客户调查结果分析
2.逻辑回归
当因变量为二元时,使用逻辑回归。这是统计学中二元分类问题的常用方法。首先,理解什么时候使用线性回归,什么时候使用逻辑回归是很重要的。
线性回归和 Logistic 回归有什么区别?
当因变量连续且回归线为线性时,使用线性回归。
当因变量本质上是二元时,使用逻辑回归。
何时使用逻辑回归?
这是线性回归的一个特例,其中目标变量本质上是明确的。它使用概率的对数作为因变量。
sigmoid 函数也称为逻辑函数,它给出了一条“S”形曲线,可以将任何实数值映射为 0 到 1 之间的值。
- 如果曲线趋向正无穷大,y 预测值将变为 1
- 如果曲线走向负无穷大,预测的 y 将变成 0
- 如果 sigmoid 函数的输出大于 0.5,我们可以将结果分类为 1 或是,如果小于 0.5,我们可以将其分类为 0 或否
- 如果输出是 0.75,我们可以按照概率说:病人有 75%的机会患癌症。
因此,逻辑回归利用 sigmoid 函数预测二元事件的发生概率。
逻辑回归的实际应用
- 癌症检测
- 创伤和损伤严重程度评分
- 图像分割和分类
- 地理图像处理
- 手写识别
- 基于语料库中的单词包预测一个人是否抑郁
3.支持向量机
机器学习很大程度上涉及预测和分类数据。为此,需要根据数据集实现一组机器学习算法。这些最大似然算法之一是 SVM。想法很简单:创建一条线或一个超平面,将数据分成多个类。
SVM 超平面及其类
支持向量机(SVM)是一种监督的机器学习算法,可用于分类或回归挑战。但多用于分类问题。SVM 在此基础上转换你的数据库,在可能的输出之间找到一个最佳的边界。
支持向量机通过寻找最大化两个类之间的间隔的超平面来执行分类。
定义超平面的向量被称为支持向量。
SVM 算法
- 定义一个具有最大余量的最优超平面
- 将数据映射到更易于使用线性决策表面进行分类的高维空间
- 重新表述问题,使数据隐式映射到这个空间
SVM 的现实生活应用
- 人脸检测—对图像上的人脸和非人脸区域进行分类
- 文本和超文本分类
- 图像分类
- 生物信息学——蛋白质、基因、生物学或癌症分类。
- 手写识别
- 用于治疗的药物发现
近年来,SVM 通过其在分类中的应用在癌症检测和治疗中发挥了非常重要的作用。
4.决策树
来源:维基百科
决策树是一种决策支持工具,它使用决策过程和可能结果的树状模型。它涵盖了事件结果、资源成本和决策的效用。决策树类似于只包含条件控制语句的算法或流程图。
倒过来画决策树,根节点在上面。每个决策树有 3 个关键部分:根节点、叶节点、分支。
在决策树中,每个内部节点代表一个测试或一个*事件。*比如说,掷硬币是正面还是反面。每个分支代表测试的结果,每个叶节点代表一个类标签——这是在计算所有属性后做出的决定。从根到叶节点的路径代表分类规则。
决策树可以是用于分类和回归的强大的机器学习算法。分类树对目标进行分类,判断它是正面还是反面。回归树以类似的方式表示,但它们预测连续值,如附近的房价。
关于决策树最好的部分:
- 处理数字和分类数据
- 处理多输出问题
- 决策树需要相对较少的数据准备工作
- 参数之间的非线性关系不会影响采油树的性能
决策树的实际应用
- 选择要旅行的航班
- 预测酒店入住高峰期
- 附近药店的数量对客户 X 特别有效
- 癌细胞与非癌细胞分类,其中癌细胞很少,例如 1%
- 建议顾客买什么车
5.随机森林
机器学习中的随机森林是一种关于分类、回归和其他操作的集成学习技术,这些操作在训练时依赖于大量决策树。它们快速、灵活,代表了挖掘高维数据的健壮方法,并且是我们上面讨论的分类和回归决策树的扩展。
总体而言,集成学习可以定义为通过组合单个模型来进行预测的模型。集合模型倾向于更灵活,偏差和方差更小。集成学习有两种流行的方法:
- 装袋 : 从数据集中随机抽取每棵树,并通过 s 个随机数据子集进行训练,从而产生不同的树
- 助推 : 每一个单独的树/模型都从先前模型所犯的错误中学习并改进
随机森林运行时间相当快。他们在处理缺失和不正确的数据时非常有效。从负面来看,它们无法预测超出训练数据定义范围的数据,并且可能会过度拟合噪声特别大的数据集。
随机森林应该有 64-128 棵树。
随机森林和决策树的区别
随机森林本质上是决策树的集合。决策树是在整个数据集上构建的,使用所有感兴趣的特征/变量,而随机森林随机选择观察值/行和特定的特征/变量来构建多个决策树,然后对结果进行平均。
随机森林的实际应用
- 银行账户、信用卡欺诈检测
- 检测和预测药物的药物敏感性
- 通过分析病人的医疗记录来确定他们的疾病
- 预测购买特定股票时的估计损失或利润
6.k-最近邻
K-最近邻(kNN)是一种简单的监督机器学习算法,可用于解决分类和回归问题。
kNN 存储可用的输入,并基于类似的度量(即距离函数)对新输入进行分类。KNN 主要应用于统计估计和模式识别。
kNN 是做什么的?
KNN 的工作原理是找出查询和数据中所有输入之间的距离。接下来,它选择最接近查询的指定数量的输入,比如 K。然后它投票给最频繁的标签(在分类的情况下)或平均标签(在回归的情况下)。
kNN 算法:
- 加载数据
- 将 k 初始化为数据中选定数量的邻居
- 对于数据中的每个示例,计算查询示例和数据的当前输入之间的距离
- 将该距离添加到输入的索引中,以形成有序集合
- 按距离分组的升序对距离和索引的有序集合进行排序
- 从排序的集合中挑选前 K 个条目
- 获取所选 K 个条目的标签
- 如果是回归,返回 K 个标签的平均值;如果分类,返回 K 标签的模式
kNN 的真实世界应用
- 指纹检测
- 预测股票市场
- 货币汇率
- 银行破产
- 信用评级
- 贷款管理
- 洗钱分析
- 根据糖尿病患者血液的红外吸收光谱估计该患者血液中的葡萄糖含量。
- 根据临床和人口统计学变量确定癌症的风险因素。
6.k 均值聚类
K-means 聚类是最简单也是最流行的无监督机器学习算法之一。
我们上面不是讲过这么类似的东西吗?
k-最近邻和 k-均值聚类的区别
K-means 算法识别 k 个质心,然后将每个数据点分配到最近的聚类,同时保持质心尽可能小。K-means 中的表示是指数据的平均;也就是求质心。
K-means 算法从第一组随机选择的质心开始,这些质心被用作每个聚类的起始点,然后执行迭代(重复)计算以优化质心的位置。当质心稳定或达到定义的迭代次数时,它会停止创建和优化簇。
K-means 聚类算法:
- 指定集群的数量 K 。
- 通过首先改组数据集,然后为质心随机选择 K 个数据点来初始化质心,而无需替换
- 不断迭代,直到质心稳定
- 计算数据点和所有质心之间距离的平方和
- 将每个数据点分配给最近的聚类(质心)
- 通过取属于每个聚类的数据点的平均值来计算聚类的质心。
K-均值聚类的实际应用
- 识别假新闻
- 垃圾邮件检测和过滤
- 将书籍或电影按流派分类
- 城市规划中的热门交通路线
8.朴素贝叶斯
朴素贝叶斯是我最喜欢的,超级有效的,常用的机器学习分类器。朴素贝叶斯本身是一个算法家族,包括用于监督和非监督学习的算法。
朴素贝叶斯分类器是一组基于贝叶斯定理的分类算法。它不是一个单一的算法,而是一个算法家族,所有算法都有一个共同的原则,即每一对被分类的特征都是相互独立的。
为了理解朴素贝叶斯,让我们回忆一下贝叶斯法则:
什么是如此“天真:在朴素贝叶斯?
朴素贝叶斯(NB)是朴素的,因为它假设测量的属性是相互独立的。我们可以简单地将一个属性作为独立的量,并确定属于该类的先前测量的比例,该类仅具有该属性的相同值。
朴素贝叶斯主要用于基于多个属性预测不同类的概率。它主要用于挖掘数据时的文本分类。如果你看看朴素贝叶斯的应用,你一直想做的项目可以由这个算法家族最好地完成。
朴素贝叶斯的现实应用
- 对一篇关于技术、政治或体育的新闻文章进行分类
- 社交媒体上的情感分析
- 面部识别软件
- 网飞和亚马逊的推荐系统
- 垃圾邮件过滤
9.主成分分析
现在,这一个,主成分分析可能不是算法类别中的最佳候选,但它绝对是一种超级有用的机器学习技术。
主成分分析(PCA)是一种无监督的统计技术,主要用于通过机器学习中的特征提取进行降维。
当我们谈论高维度时,它意味着数据集具有大量的特征。这需要大量的内存和计算能力。
PCA 使用正交变换,将一组相关变量转换成一组不相关变量。它用于通过线性组合来解释一组变量的方差-协方差结构。它也是探索性数据分析和预测建模中最广泛使用的工具。
PCA 背后的思想是简单地找到一组概括数据的低维轴。比方说,我们有一个由一组汽车属性组成的数据集;尺寸、颜色、座位数量、车门数量、行李箱尺寸、圆形度、紧凑度、半径……然而,这些特征中的许多将指示相同的结果,因此可能是多余的。作为聪明的技术专家,我们应该努力消除这些冗余,用更少的属性描述每辆车,使计算变得简单。这正是 PCA 的目标。
主成分分析不考虑属性信息。它与每个属性的方差有关,因为高方差的存在表明类别之间的良好划分,这就是我们如何降低维度。PCA 从来不会只考虑一些而抛弃另一些。它从统计上考虑了这些属性。
PCA 的实际应用
- 优化多个通信信道中的功率分配
- 图像处理
- 电影推荐系统
感谢您的阅读!我希望你喜欢这篇文章。请务必让我知道,在你的机器学习之旅中,你期待学习或探索什么技能?
数据帐篷快乐!
免责声明:本文表达的观点仅代表我个人,不代表严格的观点。
了解你的作者
拉什是芝加哥伊利诺伊大学的研究生。她喜欢将数据可视化,并创造有见地的故事。她是用户体验分析师和顾问、技术演讲者和博客作者。
十大二元分类算法[初学者指南]
如何用几行 Python 代码实现 10 个最重要的二进制分类算法
Javier Allegue Barros 在 Unsplash 上拍摄的照片
介绍
B 一元分类问题可以通过从朴素贝叶斯到深度学习网络的各种机器学习算法来解决。哪种解决方案在运行时间和准确性方面表现最佳取决于数据量(样本和要素的数量)和数据质量(异常值、不平衡数据)。
本文提供了一个概述和代码示例,您可以很容易地自己尝试。目标是快速获得 Python 的第一个工作结果。在这里,我将保持事情简短,并将详细解释每个算法。我已经添加了对每个算法的参考,以防你想了解更多关于算法,它的基本理论和如何调整它的参数。
在本文中,我们将重点介绍 10 种最常见的二进制分类算法:
为了让事情尽可能简单,我们在本教程中将只使用三个 Python 库: Numpy 、 Sklearn 和 Keras 。
在代码示例中,我总是在代码片段的顶部导入必要的 Python 模块,以明确接下来会用到它。你可以在你的脚本开始的时候加载它们。
我创建了一个 Jupyter 笔记本,里面有你能在我的 Github 资源库中找到的所有代码:https://Github . com/alexortner/teaching/tree/master/binary _ classification
资料组
在本文中,我们将对电影评论进行二元情感分析,这是自然语言处理中的一个常见问题。
我们使用高度极性电影评论的 IMDB 数据集,以对不同电影的文本评论和正面或负面评分的形式。
目标是通过分析评论文本中的情感来训练可以预测评论的模型。
数据导入
我们直接从 Keras 加载数据集。这样做的好处是,我们不需要下载文件,也几乎不需要在代码中准备数据。Keras 网站的描述称:
这是来自 IMDB 的 25,000 个电影评论的数据集,由情绪(正面/负面)标记。评论已经过预处理,每个评论都被编码成一个单词索引(整数)列表。为方便起见,单词按数据集中的总频率进行索引,例如,整数“3”编码数据中第三个最频繁出现的单词。这允许快速过滤操作,例如:“仅考虑前 10,000 个最常用的单词,但排除前 20 个最常用的单词”。
按照惯例,“0”不代表特定的单词,而是用于编码任何未知的单词。
import keras.datasets as keras_data(imdb_train_data,imdb_train_labels),(imdb_test_data,imdb_test_labels) = keras_data.imdb.load_data(num_words=10000)
num_words 将文本导入限制为 10,000 个最常用的单词。
数据的快速概览
训练和测试数据各包含 25000 个样本。来自 Keras 源的文本已经被标记化,这意味着它被编码成一个整数序列,其中每个数字对应一个单词。
print(imdb_train_data.shape)
print(imdb_test_data.shape)print(imdb_train_data[5])**# output** (25000,)
(25000,)
[1, 778, 128, 74, 12, 630, 163, 15, 4, 1766, 7982, 1051, 2, 32, 85, 156, 45, 40, 148, 139, 121, 664, 665, 10, 10, 1361, 173, 4, 749, 2, 16, 3804, 8, 4, 226, 65, 12, 43, 127, 24, 2, 10, 10]
如果您想以明文形式查看评论,可以使用数据集中的 get_word_index 函数将索引映射回原始单词。请记住,标点和空格已经从数据集中移除,因此无法恢复。
word_index = keras_data.imdb.get_word_index()**# map index to word mapping into a Python dict**
reverse_word_index = dict([(value,key) for (key,value) in word_index.items()])**# map the word index to one of the tokenized comments**
decoded_word_index = ''.join([reverse_word_index.get(i-3,'?') for i in imdb_train_data[5]])
打印单词索引列表中最常用的 10 个单词:
for key in sorted(reverse_word_index.keys()):
if(key<=10):
print("%s: %s" % (key, reverse_word_index[key]))**# output**
1: the
2: and
3: a
4: of
5: to
6: is
7: br
8: in
9: it
10: i
打印解码的注释:
print(decoded_word_index)**# output**
beginsbetterthanitendsfunnythattherussiansubmarinecrewoutperformsallotheractorsit'slikethosesceneswheredocumentaryshotsbrbrspoilerpartthemessagedechiferedwascontrarytothewholestoryitjustdoesnotmeshbrbr
数据矢量化和一键编码
目前,每个样本都是一个整数数组,长度取决于注释的文本长度。所使用的算法需要一个张量,其中每个样本具有相同数量的特征。为此,我们通过将每个数字替换为长度为 10,000 的向量来对整数列表进行一次性编码,该向量在索引位置的值为 1,在所有其他位置的值为 0。所以我们基本上是把整数序列编码成二进制矩阵。
文本的符号化和矢量化示意图(图片由作者提供)
对于向量化,我们写一个简单的函数
import numpy as npdef vectorize_sequence(sequences,dimensions):
results=np.zeros((len(sequences),dimensions))
for i, sequence in enumerate(sequences):
results[i,sequence] = 1.
return results
并用它将我们的测试和训练数据转换成张量
x_train=vectorize_sequence(imdb_train_data,10000)
x_test=vectorize_sequence(imdb_test_data,10000)
标签数据已经是一个二进制整数,我们只需将它转换成一个 Numpy 数组和浮点类型,因为 Keras 只接受这种数据类型
y_train=np.asarray(imdb_train_labels).astype('float32')
y_test=np.asarray(imdb_test_labels).astype('float32')
对张量形状的检查表明,对于训练和测试数据集,我们现在有 25000 个样本和 10000 个特征
print(x_train.shape)
print(x_test.shape)**#output**
(25000, 10000)
(25000, 10000)
1.朴素贝叶斯
朴素贝叶斯方法是一种监督学习算法,它基于应用贝叶斯定理和给定类变量值的每对要素之间条件独立性的“朴素”假设。
from sklearn.naive_bayes import MultinomialNBmnb = MultinomialNB().fit(x_train, y_train)print("score on test: " + str(mnb.score(x_test, y_test)))
print("score on train: "+ str(mnb.score(x_train, y_train)))
**总结:**朴素贝叶斯算法对于这个特征丰富的数据集非常快(记住我们有一个具有 10,000 个特征向量的张量),并且已经提供了 80%以上的好结果。训练和测试数据上的得分彼此接近,这表明我们没有过度拟合。
**Results Naive Bayes**
+-------------+------+
| **run time** | 2s |
+-------------+------+
| **train score** | 0.87 |
+-------------+------+
| **test score ** | 0.84 |
+-------------+------+
2.逻辑回归
逻辑回归是解决分类问题的最古老、最基本的算法之一:
from sklearn.linear_model import LogisticRegressionlr=LogisticRegression(max_iter=1000)
lr.fit(x_train, y_train)print("score on test: " + str(lr.score(x_test, y_test)))
print("score on train: "+ str(lr.score(x_train, y_train)))
**总结:**逻辑回归需要相当长的训练时间,而且会过拟合。从训练数据得分(98%)与测试数据得分(86%)的偏差中可以看出算法过拟合。
**Results Logistic Regression** +-------------+------+
| **run time** | 60s |
+-------------+------+
| **train score** | 0.98 |
+-------------+------+
| **test score ** | 0.86 |
+-------------+------+
3.k-最近邻
k-最近邻(KNN) 算法是一种监督机器学习算法,可用于解决分类和回归问题。对于 KNN,众所周知,它不太适用于大型数据集(高样本量),尤其是许多特征(高维)。我们具有 25000 个样本和 10000 个特征的数据集对于该算法来说已经不是最优的了。我必须设置两个参数, algorithm = "brute "和 n_jobs=-1 来让分类器在最近运行。
from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(algorithm = 'brute', n_jobs=-1)knn.fit(x_train, y_train)print("train shape: " + str(x_train.shape))
print("score on test: " + str(knn.score(x_test, y_test)))
print("score on train: "+ str(knn.score(x_train, y_train)))
**总结:**不出所料,这个算法不太适合这类预测问题。它需要 12 分钟,预测非常差,只有 62%,并显示出过度拟合的趋势。
**Results K-Nearest Neighbours** +-------------+------+
| **run time** | 12m |
+-------------+------+
| **train score** | 0.79 |
+-------------+------+
| **test score ** | 0.62 |
+-------------+------+
4.支持向量机
支持向量机是用于分类和回归任务的简单算法。它能以较小的计算能力非常快地提供高精度。由于大量的特性,我们使用 *LinearSVC。*结果表明,设置正则化参数 C=0.0001 提高了预测质量,减少了过拟合。
from sklearn.svm import LinearSVCsvm=LinearSVC(C=0.0001)
svm.fit(x_train, y_train)print("score on test: " + str(svm.score(x_test, y_test)))
print("score on train: "+ str(svm.score(x_train, y_train)))
**总结:**支持向量机速度非常快,预测得分高,没有过拟合问题。
**Results Support Vector Machine** +-------------+------+
| **run time** | 2s |
+-------------+------+
| **train score** | 0.86 |
+-------------+------+
| **test score ** | 0.85 |
+-------------+------+
5.决策图表
决策树是一种用于分类和回归的非参数监督学习方法。目标是通过学习从数据特征推断的简单决策规则(if-else)来创建预测目标变量的值的模型。
from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier()
clf.fit(x_train, y_train)print("score on test: " + str(clf.score(x_test, y_test)))
print("score on train: " + str(clf.score(x_train, y_train)))
**总结:**对这个特征丰富的数据集应用单个决策树会导致大量的过度拟合。事实上,100%的准确率意味着它准确地记住了训练数据集,因此对测试数据的概括很差。我们在这里看到的是单一决策树的缺点之一,它不能处理太多特征的数据。
**Results Decision Tree** +-------------+------+
| **run time** | 4m |
+-------------+------+
| **train score** | 1.0 |
+-------------+------+
| **test score ** | 0.70 |
+-------------+------+
然而,这个问题可以通过调整算法的一些参数或引入集成学习技术来解决。在这里可以找到关于决策树分类器参数调优的深度文章:https://medium . com/@ mohtedibf/indepth-parameter-tuning-for-decision-tree-6753118 a03c 3。接下来,我们将关注一些常见的集成学习方法。
6.Bagging 决策树(集成学习 I)
当决策树过度拟合时,应用像 bagging 这样的集成学习算法可能会提高预测模型的质量。在打包中,通过从训练数据中提取引导来增加训练数据。这意味着从训练数据中获取多个样本(替换),并在这些子数据集上训练模型。最终预测是每个引导样本所有预测的平均值。
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier**# max_samples:** maximum size 0.5=50% of each sample taken from the full dataset**# max_features:** maximum of features 1=100% taken here all 10K
**# n_estimators:** number of decision trees bg=BaggingClassifier(DecisionTreeClassifier(),max_samples=0.5,max_features=1.0,n_estimators=10)
bg.fit(x_train, y_train)print("score on test: " + str(bg.score(x_test, y_test)))
print("score on train: "+ str(bg.score(x_train, y_train)))
**总结:**Bagging 分类器要慢得多,因为它基本上运行 10 个决策树,但人们可以看到我们在单个决策树上看到的过度拟合的减少和测试分数的增加。调整参数以进一步改善这个结果。
**Results Bagging Decision Tree** +-------------+------+
| **run time** | 10m |
+-------------+------+
| **train score** | 0.93 |
+-------------+------+
| **test score ** | 0.77 |
+-------------+------+
7.推进决策树(集成学习 II)
一般来说,我们不能用提升来改善一个分值= 1 的完全过拟合的模型。要应用 Boosting,我们首先必须稍微调整一下决策树分类器。我花了一些试验和错误,直到我得到了决策树和 AdaBoost 分类器的最佳参数。我确信你可以通过更多的比赛进一步提高。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifieradb = AdaBoostClassifier(DecisionTreeClassifier(min_samples_split=10,max_depth=4),n_estimators=10,learning_rate=0.6)
adb.fit(x_train, y_train)print("score on test: " + str(adb.score(x_test, y_test)))
print("score on train: "+ str(adb.score(x_train, y_train)))
**总结:**通过 Boosting 和改进的底层决策树,我们摆脱了过拟合问题。尽管我们只能以大约 80%的把握进行预测,但我们可以对所有的测试数据进行可靠的预测。
**Results Boosting Decision Tree** +-------------+------+
| **run time** | 5m |
+-------------+------+
| **train score** | 0.80 |
+-------------+------+
| **test score ** | 0.78 |
+-------------+------+
8.随机森林(集成学习 III)
随机森林算法是另一种常用的集成学习分类器,它使用多个决策树。随机森林分类器基本上是决策树的改进的 bagging 算法,它不同地选择子集。我发现 max_depth=9 对于这个特性丰富的数据集来说是一个很好的值。
from sklearn.ensemble import RandomForestClassifier**# n_estimators = number of decision trees** rf = RandomForestClassifier(n_estimators=30, max_depth=9)
rf.fit(x_train, y_train)print("score on test: " + str(rf.score(x_test, y_test)))
print("score on train: "+ str(rf.score(x_train, y_train)))
**总结:**随机森林不会过拟合,其预测分数与增强决策树的预测分数相当,但它的性能要好得多,因为它比增强决策树快一个数量级以上(快 15 倍)。
**Results Random Forest** +-------------+------+
| **run time** | 20s |
+-------------+------+
| **train score** | 0.83 |
+-------------+------+
| **test score ** | 0.80 |
+-------------+------+
9.投票分类器(集成学习 IV)
这个来自集成学习工具箱的分类器评估不同的分类器并从中选择最好的
[**VotingClassifier**](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html#sklearn.ensemble.VotingClassifier)
背后的想法是结合概念上不同的机器学习分类器,并使用多数投票或平均预测概率来预测类别标签。这种分类器可以用于一组同样表现良好的模型,以平衡它们各自的弱点。(引用自:https://sci kit-learn . org/stable/modules/generated/sk learn . ensemble . voting classifier . html)
因此,让我们使用这个分类器来组合我们到目前为止的一些模型,并应用投票分类器
- 朴素贝叶斯(84%,2 秒)
- 逻辑回归(86%,60 秒,过度拟合)
- 随机森林(80%,20 秒)
- 支持向量机(85%,10s)
请注意,对于这个代码片段,所有使用的模型定义都必须加载到 Python 内核中。
from sklearn.ensemble import VotingClassifier**# 1)** naive bias = mnb
**# 2)** logistic regression =lr
**# 3)** random forest =rf
**# 4)** support vector machine = svmevc=VotingClassifier(estimators=[('mnb',mnb),('lr',lr),('rf',rf),('svm',svm)],voting='hard')
evc.fit(x_train, y_train)print("score on test: " + str(evc.score(x_test, y_test)))
print("score on train: "+ str(evc.score(x_train, y_train)))
- **总结:**即使有点过拟合,但它在测试数据上得到了迄今为止最好的预测分数。
**Results Voting Classifier** +-------------+------+
| **run time** | 2s |
+-------------+------+
| **train score** | 0.91 |
+-------------+------+
| **test score ** | 0.86 |
+-------------+------+
10.神经网络(深度学习)
深度学习使用人工神经网络,该网络使用多层从训练数据中逐步提取更高级别的特征。我们使用一个简单的三层网络,没有任何优化,除了使用一个小的验证数据集。这里我们用的是 Keras 而不是 Sklearn。
from keras import layers
from keras import models
from keras import optimizers
from keras import losses
from keras import metrics**# split an additional validation dataset**
x_validation=x_train[:1000]
x_partial_train=x_train[1000:]
y_validation=y_train[:1000]
y_partial_train=y_train[1000:]model=models.Sequential()
model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])model.fit(x_partial_train,y_partial_train,epochs=4,batch_size=512,validation_data=(x_validation,y_validation))print("score on test: " + str(model.evaluate(x_test,y_test)[1]))
print("score on train: "+ str(model.evaluate(x_train,y_train)[1]))
**总结:**使用神经网络得到了迄今为止我们所达到的最好的测试分数,大约为 88%。然而,标准设置导致训练数据的过度拟合。
这个问题可以通过添加一些较小的调整参数来轻松解决,这些参数会将训练分数降低到 0.90。
在下文中,我应用了在神经网络中处理过拟合的 3 个最佳实践:
- 缩小网络的规模
- 增加一些重量调整
- 添加辍学
from keras import layers
from keras import models
from keras import optimizers
from keras import losses
from keras import regularizers
from keras import metrics# add validation dataset
validation_split=1000
x_validation=x_train[:validation_split]
x_partial_train=x_train[validation_split:]
y_validation=y_train[:validation_split]
y_partial_train=y_train[validation_split:]model=models.Sequential()
model.add(layers.Dense(**8**,**kernel_regularizer=regularizers.l2(0.003)**,activation='relu',input_shape=(10000,)))
**model.add(layers.Dropout(0.5))** model.add(layers.Dense(**8**,**kernel_regularizer=regularizers.l2(0.003)**,activation='relu'))
**model.add(layers.Dropout(0.6))** model.add(layers.Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])model.fit(x_partial_train,y_partial_train,epochs=4,batch_size=512,validation_data=(x_validation,y_validation))print("score on test: " + str(model.evaluate(x_test,y_test)[1]))
print("score on train: "+ str(model.evaluate(x_train,y_train)[1]))**Results Deep Learning with Neural Network standard** +-------------+------+
| **run time** | 8s |
+-------------+------+
| **train score** | 0.95 |
+-------------+------+
| **test score ** | 0.88 |
+-------------+------+**Results Deep Learning with Neural Network optimised** +-------------+------+
| **run time** | 8s |
+-------------+------+
| **train score** | 0.90 |
+-------------+------+
| **test score ** | 0.88 |
+-------------+------+
摘要
我们现在在同一数据集上训练了 10 种不同的机器学习算法来解决同一任务,根据对文本段落的情感分析预测正面或负面的评论。让我们看看谁在预测质量和运行时间方面胜出。参数过拟合(OF)就是训练分数与测试分数之间的差异。如果它很大,这意味着我们有很高的过度拟合。
+----+-------------------+----------+-------+------+---------+
**| No | Algorithm | Time [s] | Train | Test | OF |**
+----+-------------------+----------+-------+------+---------+
| 1 | Naive Bayes | **2 ** | 0.87 | 0.84 | 0.03 |
+----+-------------------+----------+-------+------+---------+
| 2 | Logistic Reg. | 60 | 0.98 | **0.86** | **0.12 !!** |
+----+-------------------+----------+-------+------+---------+
| 3 | KNN | 720 | 0.79 | 0.62 | **0.17** !! |
+----+-------------------+----------+-------+------+---------+
| 4 | SVM | **2** | 0.86 | 0.85 | 0.01 |
+----+-------------------+----------+-------+------+---------+
| 5 | Decision Tree | 240 | 1.0 | 0.70 | **0.3 !! ** |
+----+-------------------+----------+-------+------+---------+
| 6 | Bagging DT | 600 | 0.93 | 0.77 | **0.16 !!** |
+----+-------------------+----------+-------+------+---------+
| 7 | Boosting DT | 300 | 0.80 | 0.78 | 0.02 |
+----+-------------------+----------+-------+------+---------+
| 8 | Random Forest | 20 | 0.83 | 0.80 | 0.03 |
+----+-------------------+----------+-------+------+---------+
| 9 | Voting Classifier | **2 ** | 0.91 | **0.86** | 0.04 |
+----+-------------------+----------+-------+------+---------+
| 10 | **Neuronal Network** | **8** | 0.90 | **0.88** | 0.02 |
+----+-------------------+----------+-------+------+---------+
最佳运行时间:
在运行时间方面,最快的算法是朴素贝叶斯、支持向量机、投票分类器和神经网络。
最佳预测得分:
就测试数据集的最佳预测而言,最佳算法是逻辑回归、投票分类器和神经网络。
最差过拟合:
过拟合最多的算法是逻辑回归、K 近邻、决策树和 Bagging 决策树。
最佳算法:
解决该文本情感分析任务的总体最佳方法是神经网络、,其速度快、精度高且低过拟合。速度稍快但预测质量稍差的是投票分类器。
Jupyter 笔记本
你可以在我的 Github 资源库中找到所有作为 Jupyter 笔记本的代码:https://Github . com/alexortner/teaching/tree/master/binary _ classification
在这里,您会发现应用于不同机器学习问题和数据集的相同的前 10 个二进制分类算法。
- IMDB 数据集— 自然语言处理 —二元情感分析
- FashionMNIST 数据集— 计算机视觉 —二值图像分类
- 威斯康星州乳腺癌数据集-简单二元分类法
感谢阅读!
我希望你喜欢这篇文章。如果您看到任何需要纠正的地方,请发表评论,以便我尽快修复。