在人工智能部署中实现防御性设计
来自医疗器械设计领域的一系列见解和战斗创伤
Picture from Pixabay on Pexels.com
随着我们的人工智能产品之一即将推出,客户一直在问一个重复的问题。这个问题偶尔也会出现在我们的咨询项目中,只是程度较轻,但仍然需要一个答案。这个问题的简单版本是这样的:
我怎么知道人工智能做得好不好?
现在很容易向客户抛出混淆矩阵和神经活动图,但他们有一个更深层次的问题——和一个非常有效的关注。他们不是在问系统的性能,而是在问系统是否与他们自己的问题一致。如果这个模型现在负责他们的一个或多个业务流程,如果他们看不到它如何执行任务的标准,他们如何管理它?
这涉及到管理基础、商业逻辑和机器学习领域的持续发展的结合。定制人工智能解决方案的目标是加速关键流程,以减轻其余员工的工作量,或实时做出决策。因此,如果一个系统不能在可信任的容差范围内可靠地执行流程,那么这个系统可能根本就无法实现。
以下是我们在过去几个月中遇到的一些真实案例:
- 如果系统需要审查、组织和突出法律报告中的关键句子,该怎么办?每一个遗漏或贴错标签的关键句子都有相关的成本吗?
- 如果它在进行医学诊断呢?如果病人被要求接受几个月的痛苦治疗,有人能证明或质疑结果吗?
- 如果恶意代理成功穿透服务器的防火墙会怎样?对于攻击是如何进行的,而不是简单地对其进行分类,有什么教训可以吸取吗?
询问模型可靠性的主要原因是质量保证。主管可能会接受员工在做出某些决定时缺乏理由,但会想要一份记录或历史证明,证明员工的判断是可靠的、有弹性的和可重复的。(这也是为什么我建议我所有的工程师和数据科学家同事在寻找新工作或项目时建立一个投资组合和一份简历。)
什么是防御性设计?
防御性设计是一种设计方法,它假设一个系统会失败,因此,应该在不损害系统的其余部分、患者或任何其他相关事物的情况下失败。它的目的是在东西“什么时候”会坏,而不是“如果”坏了,来减轻损害。防御性设计的前提是包含多个缓解层,这样部署的系统就不会陷入非常非常小的困境。
新的机器学习专家和数据科学家没有 devops 和安全工程师那样的血统和战斗伤痕,这可能会很快成为一个问题——特别是当越来越多的机器学习解决方案被播种到一个组织的业务逻辑中时。
救援医疗器械设计
让我们来看一个有大量需求工程活动的行业,它可以激发最佳实践:医疗器械设计。至少可以说,可能出错的地方很多,最糟糕的情况也可能是多姿多彩的。事实上,很多事情都可能出错,我们只为一种新的神经病学设备所需的安全系统申请了专利。
就从头设计新医疗器械而言,有一种推荐的方法可以确保一定程度的验证和可追溯性,称为 V 型。这仅仅是画可怕的瀑布模型的一种奇特方式吗?也许吧!但有一些有用的主题和想法,我们可以应用于大多数人工智能部署。
The V-Model of software development. I also call it “The Waterfall Model’s bastard child”. Although it’s not as cyclical and responsive as Continuous Deployment, it does ensure that there is traceability back to the original design. From Wikimedia.
v 型外卖
以下主题可以从 V-Model 中提取出来:
- 做事情是有刻意的原因的。无论是客户需求、技术限制,还是性能期望,每一个行动都有一个可以追溯到项目起源的原因。
- 每一个设计都有验证和实现。不管是子子模块还是整个系统,都有一种方法可以对照预期性能来验证系统的真实性能。
- 验证和确认是有区别的。“我造的东西对吗?”和“我做对了吗?”不是同一个问题和客户打交道时,后者通常是最重要的。
实施防御性设计
有 3 个主要阶段,设计者希望确保他们遵循一个可靠的防御设计框架:在客户讨论/需求阶段,在编码期间,以及在部署期间和之后。
需求阶段的防御性设计
需求,需求,以及更多的需求——这就是我们如何在设计阶段确保良好、干净的乐趣。“但是编程很好玩!”是的,凯伦,是的,但是浪费时间和金钱不是。
**向客户展示一个工具,而不是一个有知觉的存在。**提醒客户,机器学习很枯燥,旨在非常好地完成一个明确定义的流程的一个或多个步骤。
验证数据。客户是否拥有他们认为自己拥有的数据?原始数据本身干净吗?API 会偶尔改变格式吗?
**然后再验证一遍。**您能够重复访问工作数据集吗?它是否与您执行的第一次审计相符?
**从小处着手,积累动力。**限定最初承诺的范围。如果你能先解决一个简单的问题,你现在就能处理越来越多的业务流程。这也迫使客户端确保它们呈现给系统的数据是干净的。
(我们已经在各种项目中看到了很多成功,在项目开始时给整个项目泼了一盆冷水,这让每个人都清醒过来,并让一个清晰的业务案例浮出水面。在功能方面,除了厨房水槽,你的客户现场支持者很容易承诺所有东西。)
Agnes Skinner making her requirements known. From Tenor.
如果你想阅读更多关于需求工程的内容,我推荐的同名书籍,作者是伊丽莎白·赫尔和杰里米·迪克。
创世纪阶段的防御设计
现在,您开始在正确的用户界面或交互级别上编码并与客户一起工作,确保有明确定义的需求,可以测量、评估、测试和解释。
以用户为中心的设计。我们总是说让用户问正确的问题,而不是给用户一个准备好的答案。设计用户界面,让用户始终负责关键决策,系统应该作为助手部署——人在回路中有最后的发言权。
A screenshot of our AuditMap.ai tool. The Value
**输入端的预处理/数据验证。**这方面的一个例子是一个简单的分类器:在对所有语句进行排序之前,您可以预先放置一个“英语/非英语”过滤器,以确保您获得干净的数据,或者放置一个“看起来好/看起来不好”的过滤器,以确保过滤机制保护系统的其余部分。
**多型号设计。**它可以是一个紧密的整体,也可以只是不同的 API 调用,但是允许对每个模型的性能进行审查,就可以一直追溯到业务逻辑。
部署阶段的防御设计
恭喜你。你的人工智能部署好了,你的客户/老板高兴了,你去读了一会儿黑客新闻,现在你已经精力充沛地开始下一个项目了。然而,根据我们的经验,这是您需要投入最多精力的地方,至少在现场部署的前 6 个月。
**跟踪修正。**系统部署后会犯哪些错误?如果你没有考虑纠正措施跟踪机制,那么你就不知道对数据集的长期修复是什么。(好处:这允许你的数据集有一个很好的增长,帮助它随着时间的推移而增长。丹的一篇文章中有一个更长的解释。)
**正在进行的客户对话。**现在有了在设计工具时无法预见的用例。为确保您的客户拥有最佳体验,在移交后继续对话,以确保工具仍能按预期运行。(他们是不是因为一个诡异的内存泄露,在 50 次请求后就要重置服务器?如果是这样的话,不管你的准确率有多高,他们可能都不会给你打电话进行后续的约定。)
用户缓解。您的系统对错误的用户输入、文件类型和损坏的文件有弹性吗?多个用户一次上传多个文件怎么办?
中间文档。确保模块开发人员和集成商都理解设计决策背后的基本原理。你可以写自己的文档,或者让像 Swagger 这样的工具从(正确的)注释代码中管理文档。
负载均衡。您的系统对负载波动有弹性吗?在你的客户发布后(会议谈话和电视采访对此尤其不利。)我们喜欢很多数字海洋选项。
永远不要忘记,用户会发明从未有人梦想过的用例。
We’re always impressed by unforeseen client use cases. From Imgur.
你的系统中最薄弱的部分很可能是人类。它们也是成功部署的最重要部分。
什么是防御设计,什么不是
防御型设计很无聊。这是系统化的,而且通常情况下,人们会问为什么有些结构和可交付物的构建超出了他们的基本需求。在几次险些出事之后,你的团队应该开始意识到做最坏打算的重要性。
然而,防御性设计不是一种保证或保险政策。仅仅因为你遵循了每一个可能的步骤,并不意味着你的系统是面向未来的,可以经受住技术飓风。
只要准备好“当”你的系统崩溃时,不要只考虑理论上的“如果”。通过这种方式,你可以确保人工智能做得很好,当它做不好时,将损害降到最低。
如果您在开始新的客户项目时,对本文或我们的设计方法有其他问题,请随时通过 LinkedIn 联系我们。
你可能喜欢的其他文章
我的首席技术官丹尼尔·夏皮罗(Daniel Shapiro)的其他文章您可能会喜欢:
高效实施脸书先知
如果你曾经做过时间序列预测,我敢肯定你很清楚随之而来的压力和痛苦。一会儿你认为你已经破解了股市,一会儿你躺在浴缸里哭着诅咒你不准确的模型(我真的不建议你尝试和预测股市,你很可能不会收获你认为你会获得的收益)。我想说的是,时间序列预测是困难的,总是需要非常专业的数据科学家来实现。
Facebook Prophet’s logo
然而,我们的蓝色霸主,即脸书发布了一个惊人的模型称为脸书先知。Prophet 使几乎任何人都有可能预测时间序列值,即使你在这个领域没有什么经验。在大多数情况下,它开箱即可正常工作,您的数据分析师将能够通过输出讲述相当准确的故事。但是,当您想要开始在生产中使用该模型时,您必须开始更深入地理解正在发生的事情,并且知道哪些参数需要调整以及为什么。
为了向您展示如何调整参数以及为什么应该调整参数,我们将使用一个简单的 y 和 ds 数据框架(Prophet 使用的格式)进行实验。数据超过 2 年,每小时一次,这已经需要一些额外的调整。
Our time series we want to predict
Zooming in on our time series
在我们开始之前,假设你对脸书先知有一个相对较好的了解。如果你不知道,我强烈建议你点击下面的链接进入先知快速入门。如果你不这样做,一些代码将没有意义,因为我不会解释如何导入或适合先知的数据,只对如何优化它。
在我们开始有趣的部分之前,博客的目标是我只想展示哪些超参数值得关注,并给出一些我学到的技巧。无论我说什么都不是法律,我邀请你分享对我工作的意见和建议。
我们如何衡量模型的性能?
许多隐藏的秘密中有一个在第一次使用 Prophet 时并不那么明显,那就是它内置了交叉验证功能。此函数将获取您的数据,并在您指定的时间段内训练模型。然后,它将预测您指定的时间段。Prophet 将在更长的时间内训练你的数据,然后再次预测,这将重复进行,直到到达终点。
作为一个例子,让我们以上面显示的数据为例,用现成的 Prophet 模型来拟合它。在示例中,我编写了自己的平均绝对百分比误差(MAPE)函数,并将其应用于测试结果,以获得用一个数字表示的模型性能。
从上面的代码中可以看出,我们从 Prophet 导入了交叉验证函数,并将其应用于我们的数据。这将返回所有预测点的预测值和真实值的数据帧,然后可以用它来计算误差。
所以在运行上面的代码后,我们得到了 15.32%的 MAPE。这表明在所有预测的点上,我们与真实值平均相差 15.32%。
在博客的其余部分,我将讨论每个超参数,以及在决定它们的值时应该注意什么。
优化模型
不要盲目地做任何事情
优化模型的第一个技巧是不要疯狂地改变值,创建巨大的 for 循环,或者将模型放入 gridsearch 来优化 hyper 参数。当观察时间序列模型时尤其如此,因为超参数对预测有很大影响,但是这些参数的值不必是完美的。相反,让他们进入正确的区域会带来最大的回报。您可以通过查看数据并了解当您更改每个参数时模型将如何处理这些数据来实现这一点。
增长
这个参数是最容易理解和实现的,因为你只需要绘制你的数据就知道它应该是什么。如果您绘制您的数据,并且您看到一个趋势继续增长,而*(或者如果您的领域专家告诉您不需要担心饱和)没有真正的饱和洞察力,您将把这个参数设置为“ 线性 ”。*
如果您绘制它并看到一条显示饱和前景的曲线(或者如果您正在处理您知道必须饱和的值,例如 CPU 使用率),那么您将把它设置为“”。**
当您选择逻辑增长时,此参数的难点就来了,因为您必须提供预测的上限(数据将达到的最大值)和下限(数据将达到的最小值)以及历史数据。这些上限和下限值可以随着时间的推移而改变,也可以是您永久输入的设定值。
在这种情况下,与领域专家交流对您帮助最大。他们对下一年的预期和一段时间内的不可能值有很好的了解。与他们交谈后,你可以提供更准确的上限和下限。然而,如果你附近没有领域专家,我发现你的第一个值的 65%对于底价很有效。然后你可以设定一个相对较高的限额,但要在常识范围内。因此,如果你预测一个网站的访问量,而目前它的访问量是 100,00 0,那么不要把你的访问量限制在 200,00 0,00 0,因为你很可能在你预测的时间内达不到这个上限。更好的办法是让它变得更合理,比如 50 万英镑,让上限随着时间慢慢增长。
假日
假期是一段时间,在这段时间里,每一天都有同样的效果。例如,如果您想要对一个人们在节日期间迁移的城市中的订户数量进行建模,您可以使用 holidays 参数在您的模型中输入节日期间的日期。
当你对非日常数据建模时,棘手的部分就来了。我犯的一个错误是,当我试图对每小时的数据建模时,把我的假期作为每天的数据。这导致我的模型性能更差,因为它很难将假期数据调整为正确的形式。确保假期数据与目标数据具有相同的形式是很重要的。您还应该能够提供您预测的假期日期。这意味着假期只能是你事先知道的时间/日期/日子。
另一个处理节假日的参数是holidays _ prior _ scale***。此参数决定了假期对预测的影响程度。例如,当你在处理人口预测时,你知道假期会有很大的影响,尝试大的值。通常值在 20 到 40 之间就可以了,否则默认值 10 通常就很好了。作为最后手段,你可以降低它来看看效果,但我从来没有发现,以增加我的 MAPE。***
变革点
变点是数据中趋势发生突然变化的点。一个例子是,如果你有一个活动,突然你的网站有了 50 000 多个固定访问者。变化点将是发生这种巨大变化的时间段。
变点有四个超参数:变点、n _ 变点、变点 _ 范围和变点 _ 先验 _ 标度。
当您提供变点日期而不是让 Prophet 确定日期时,将使用 变点 参数。一旦您提供了自己的变点,Prophet 将不会估计更多的变点。因此,重要的是你知道你在做什么。从我的经验来看,我发现让 Prophet 自己发现它们和我改变改变点的数量(用 n_changepoints )会得到最好的结果。就应该选择多少个变点而言,我建议如果你有每小时的数据,那么一个月至少一个变点会产生好的结果。然而,它会根据每个用例而变化,但这可能是一个好的开始。
change point _ range通常对性能没有太大影响。我通过保持默认值得到了最好的结果,但是如果有人发现从 0,8 改变它时有不同的情况,我会很乐意在评论中听到。另一个参数,change point _ prior _ scale, 用于指示允许的可变点的灵活程度。换句话说,变点能在多大程度上符合数据。如果你把它做得很高,它会更灵活,但是你可能会适得其反。我发现 10 到 30 之间的值对我有用,这取决于数据的波动性。
季节性
这些参数是 Prophet 的亮点,因为您只需更改几个值就可以做出重大改进并获得深刻见解。
第一个大参数是 季节性 _ 模式 。此参数指示季节性因素应如何与预测相结合。这里的默认值是 加法 ,另一个选项是 乘法 。起初我对这个参数很纠结,但是在使用了一段时间后,它开始对我有意义了。当你的季节性趋势在整个期间应该是“恒定”的时候,你将使用添加剂。例如,当您希望您的年度趋势增长影响与 2010 年和 2018 年相同时。这适用于趋势变化似乎保持不变的数据,例如居住在小城镇的人数。这是因为我们不期望增长突然以百万计,因为没有基础设施。
另一方面,当我们想要预测居住在一个发展中城市的人口数量时,年度趋势数字在最后几年可能更重要,因为基础设施已经存在。那时人口增长率可能会比早些年快得多。在这种情况下,您将使用乘来增加季节性随时间变化的重要性。
和各地的情况一样,还有一个 季节性 _ 先验 _ 规模 参数。这个参数将再次允许你的季节性更加灵活。我发现 10 到 25 之间的值在这里工作得很好,这取决于你在组件图中注意到的季节性程度。
我发现最适合我的一个技巧(我愿意讨论这个问题)是将yearly _ 季节性、**weekly _ 季节性、和daily _ 季节性、都设置为 false ,然后添加我自己的季节性,如下面的代码片段所示。
Adding your own seasonalities
通过这样做,你可以获得更多的权力和对季节性的控制。您可以指定每个季节的确切时间,这意味着您可以创建“新的”季节。例如,通过将周期设为 93.3125,您可以将季度季节性添加到模型中。您还可以为每个季节性添加先前的比例,而不是共享一个比例。现在,我希望我能告诉你应该添加什么季节,应该是什么时间段,但是每个用例完全不同,应该联系领域专家以获得建议和见解。
为了清楚起见,如果周期被设置为 35,那么你告诉模型在某一点发生的事情很可能在 35 天内再次发生。
使用这种技术可以调整的另一个参数是组成每个季节性的傅立叶分量的数量(Fourier _ order)。对于那些懂一点数学的人来说,任何信号都可以用正弦波和余弦波之和来表示。这是 Prophet 生成季节性信号的固有方式。这样,您可以更改开始表示曲线的精确度,或者曲线中可以出现多少条曲线。下面显示的是一些数据的每日季节性,分别使用傅立叶级数 5 和 20。
Fourier_order = 5
Fourier_order = 20
正如你所看到的,曲线轮廓在两个趋势中保持不变,但是在有 20 个分量的趋势中有更多的起伏。这些颠簸可能是拾取噪声,也可能是更精确的值。这应该归结为你自己的解释和领域专家的意见。我发现较高的值确实会给出更好的结果,我强烈建议调查使用较高值的效果。您可以尝试范围从 10 到 25 的值。
MCMC 样本
这是一个棘手的问题。此参数确定模型是使用最大后验概率(MAP)估计,还是使用指定数量的马尔可夫链蒙特卡罗 (MCMC)样本进行训练和预测的完全贝叶斯推断。
因此,如果您使 MCMC 为零,它将进行 MAP 估计,否则您需要指定 MCMC 使用的样本数。我将诚实地说,我从来没有发现贝叶斯推理更好地工作,我总是使用地图估计。贝叶斯推理也需要非常长的时间来运行,因为你需要使用至少 1000 个样本来获得令人满意的结果。这是我总是留给基线值的一个参数。
作为保持 mcmc_samples 0 的结果,我还没有机会探究interval _ width**,因为它是在使用 MAP 估计时自动生成的。**
不确定样本
这是另一个对结果没有太大影响的参数,应该针对每个用例进行探究。
从一开始就改进我们的原始模型
那么,如果我们更多地考虑我们的参数并专注于上述参数,MAPE 会增加多少呢?下面显示的是最终模型。
Final Prophet model
如果我们看看我的最终模型,我们看到我选择了线性。这是因为我和与我一起工作的领域专家谈过,她提到我们在这里预测的没有限制。你也可以看到它增长很快,但也不是指数增长。出于这个原因,我不必担心我的预测会拾取一些导致值呈指数增长的东西。
我的季节性变成了倍增性,因为我发现模型很难预测时间序列后半部分的更高值。这表明这一趋势在后期可能更为重要。
您还可以看到,我添加了月度和季度趋势,因为我在对我的数据进行 ed a 时注意到了这些趋势(在构建模型之前始终进行 EDA 非常重要)。
通过所有这些改变,我设法把我的 MAPE 降到了 6.35%,基准模型的 MAPE 为 15.32%。
Predicted (blue) vs real values (black dots)
这只是表明 Prophet 开箱即用的效果令人惊讶,如果您对您的模型稍加注意,您可以大幅提高性能!
感谢您的阅读,我期待着关于您如何实施和优化 Prophet 的讨论。
在数据科学中实现 Git
本文原载于【blog.zakjost.com】
介绍
我希望第 1 部分让您明白了版本控制是管理数据科学实验的重要工具。但是魔鬼在细节中,所以我们来谈谈如何在一个数据科学项目中实现版本控制。
有几种使用 git 的范例,但是为了数据科学实验的目的,我基本上采用了“特性分支”。简而言之,特性分支意味着有一个“主”分支,您可以将其用作基线,通过从“主”分支,进行实现该特性所需的所有更改,然后在成功后将新分支合并回主分支,可以将新特性添加到代码库中。
实施策略
*在我的例子中,我为一个新的实验或者一个我想尝试的新的建模想法创建一个新的分支。在这一点上,你需要有意识地做出决定:*你是修改代码,使它只在这个实验中有效,还是希望以一种既能在这个实验中又能在之前的实验中有效的方式来修改它?*这个问题的另一种表述方式是:*你是想替换你已经做的,还是想增加?答案将决定你能否将新分支合并回 master,或者它是否会永远保持自己的东西。
***我的建议是额外努力将关键组件提取到一个库中,然后在多个实验中重复使用。*这比拥有相同(或者更糟,稍微不同)代码的多个副本要好得多,这些副本需要单独维护。这种代码差异很可能是错误的来源。俗话说:最好的代码就是没有代码。通过将关键组件提取到共享库中,您可以进行增量改进,并最终得到一个内聚的代码库,该代码库可以重复运行一系列实验。如果您继续引入向后不兼容的变更,您会发现自己经常在分支之间跳跃,复制/粘贴有用的代码部分,但是随后需要进行修改,因为组件不是为协同工作而设计的。对于大型实验,这可能会变得难以处理。
特性分支方法的优点是,您可以将您的实验分支合并回 master,然后运行任何实验。这样做的代价是,当您对核心库进行更改时,您可能还需要更改其他实验的实现。所以,像所有事情一样,这是一个权衡的决定。以我的经验来看,它是有机发展的,每当我想复制和粘贴时,我就会想到提取公共代码。
示例实现
我发现一个有用的目录结构示例如下:
*|-- core/
|-- tests/
|-- test_pull_data.py
|-- test_prepare_data.py
|-- test_model.py
|-- test_deploy.py
|-- test_utils.py
|-- pull_data.py
|-- prepare_data.py
|-- model.py
|-- deploy.py
|-- utils.py
|-- experiment_1/
|-- data/
|-- training.csv
|-- validation.csv
|-- test.csv
|-- output/
|-- results.json
|-- models/
|-- model1
|-- model2
|-- job_config.py
|-- build_data.py
|-- train.py
|-- evaluate.py
|-- prod.py
|-- experiment_2/
|-- data/
|-- training.csv
|-- validation.csv
|-- test.csv
|-- output/
|-- results.json
|-- models/
|-- model1
|-- model2
|-- job_config.py
|-- build_data.py
|-- train.py
|-- evaluate.py
|-- prod.py*
在这种情况下,主逻辑在core/
目录中。然后,实验被组织在目录中,目录包含执行实验的核心逻辑的代码和运行它所产生的输入/输出资产。实现代码应该非常简单,并且只做特定于这个特定实验的事情。例如,如果它比较方法 A 和 B,那么它将导入 A 和 B 的配置,从核心实例化相关代码,并为每个调用“run”。
请注意,这种结构为实现单元/功能/集成测试提供了一个自然的位置。此外,将通用组件提取到一个多用户库中的行为有助于提高代码的可测试性。因为这段代码可能是参数化的,而不是依赖于硬编码的实验细节,所以为测试创建玩具示例变得更加容易。未来的一篇文章将更深入地探讨为数据科学项目编写测试。
技巧
这里有一些我发现很有帮助的简单做法。
1..gitignore
这告诉 git 要忽略哪些文件。在一个新项目中,这应该是首要任务,因为一旦你犯了愚蠢的错误,除非你采取特别的行动,否则它将永远存在。
最重要的是排除敏感信息,如密码和 API 密钥。如果您很早就提交了包含敏感信息的文件,这很快就会变成一场噩梦。从当前快照中删除它是不够的——您需要从所有以前的提交中删除它。帮你自己一个忙,不要去学怎么做。
下一步是忽略非常大的数据文件和不需要跟踪的不重要的文件(即 ipython 笔记本检查点、来自 IDE 的设置文件、pycache,)。pyc 等)。在上面的例子中,所有的输入/输出工件也应该被忽略,因为它们完全由代码本身决定,并且如果需要的话可以重新生成。
2.频繁提交
如果你完成了一大块合理的工作,提交一份。没有必要吝啬,这可能会让你摆脱困境。
3.清除提交消息
如果你提交得足够频繁,那么你的大块工作可能会非常集中。这应该能够清除提交消息。没有什么比试图追溯一个不期望的变更并因为一个适当注释的提交历史而快速找到它更令人满意的了。如果对你所做的事情的描述是这样的:“实现了 3 个新特性,添加了 dropout,构建了一个交叉验证组件,重构了训练逻辑”,那么你没有足够频繁地提交。
你呢?
当我尝试不同的策略时,这些想法正在进行中。如果你已经开发了一种你认为有用的不同方法,我很乐意听听它!
您可以在【blog.zakjost.com】找到我所有的内容并订阅
在 scikit-learn 中实现 K 近邻
scikit-learn 的 KNeighbors 分类器演练
我们将使用 iris 数据集,这里的来自 UCI 机器学习。这是一个很小的数据集,具有容易区分的聚类,对于像这样的演示非常有用。它包含了对鸢尾属植物三个物种的 150 次观察:刚毛鸢尾、杂色鸢尾和海滨鸢尾。任务是根据最近的邻居来识别每种植物的种类。
k-最近邻法是一种简单地查看与它试图预测的观测值最接近的观测值,并根据周围大多数的观测值对感兴趣点进行分类的方法。
我使用以下代码将数据加载到 pandas 数据帧中:
## load the iris data into a DataFrame
import pandas as pd
url = '[http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'](http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
## Specifying column names.
col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
iris = pd.read_csv(url, header=None, names=col_names)
下面是一些数据:
下面,我画出了花瓣的长度和宽度被类分开,这样你就可以看到类是如何分开的。
Nice colors!
现在,为了对数据建模,我运行了几个预处理步骤。首先,我将物种名称映射到一个数字上,这样我就可以用我的分类器对它进行分类。其代码如下:
## map each iris species to a number with a dictionary and list comprehension.
iris_class = {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
iris['species_num'] = [iris_class[i] for i in iris.species]
将数据分成我们的建模和目标变量,我们的 X 和 y:
## Create an 'X' matrix by dropping the irrelevant columns.
X = iris.drop(['species', 'species_num'], axis=1)
y = iris.species_num
列车测试分离:
from sklearn.model_selection import train_test_split
## Split data into training and testing sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
我们已经准备好模型了。在下面的代码中,我们将导入分类器,实例化模型,使其适合训练数据,并根据测试数据对其进行评分。请注意,您可以更改用于对每个点进行分类的最近邻的数量。
## Import the Classifier.
from sklearn.neighbors import KNeighborsClassifier
## Instantiate the model with 5 neighbors.
knn = KNeighborsClassifier(n_neighbors=5)
## Fit the model on the training data.
knn.fit(X_train, y_train)
## See how the model performs on the test data.
knn.score(X_test, y_test)
该模型实际上具有 100%的准确率,因为这是一个非常简单的数据集,具有明显可分离的类。但是现在你有了。这就是如何用 scikit-learn 实现 K 近邻。加载你最喜欢的数据集,试试吧!
使用交互代码实现 NVIDIA 用于自动驾驶汽车的神经网络[手动倒车 TF]
Gif from here
所以最近碰到这个 Quora 的问题,“用于自动驾驶汽车的神经网络有几层?”,很快我就发现,(通过 Prasoon Goyal 的回答)NVIDA 从 2016 年开始用的车型并没有那么复杂。
不相信我?请参见下面的网络架构。此外,这里是原始论文的链接,“自动驾驶汽车的端到端学习”。
最后,请注意两件事。
1。这种模型在 2016 年使用,当前的模型将更加复杂。
2。让我们在这个模型上使用扩张反向传播,看看我们能达到什么样的结果。
网络架构(图形形式)
就是这个,LOL 我也不敢相信。这是如此简单,但它似乎在学习如何真正驾驶汽车方面做了一项惊人的工作。让我们看看 NVIDIA 自己的模型视频。
实验设置/奇怪的观察结果
Image from this webpage
由于我没有可以训练 LOL 的汽车,所以我将使用著名的 CIFAR 10 数据集进行分类。
最奇怪的观察是在层中没有激活功能的事实!我甚至找不到任何提到 Relu()或 sigmoid()激活函数的痕迹。甚至在这个开发者博客里。但是,我决定包含卷积层的 Relu()激活和全连接层的 logistic_sigmoid()激活。这个决定是在进行了多次实验后做出的。
网络架构(OOP 形式)
红框 →网络架构
黄框 →原纸区别
我唯一需要改变的是第二层和第三层卷积运算的步距。由于输入图像大小,我不能对所有三个卷积层执行步长为 2 的卷积。
修改后的网络架构(OOP 形式)
红框 →神经元和通道数量大小增加
黄框 →卷积运算差异。
我现在可以告诉你,CIFAR 10 数据集上的性能在原始模型上很差。因此,我增加了卷积层的通道数和全连接层的神经元数,看看我能得到多少改善。也因为我想使用扩张反向传播。
训练结果(原始模型)
左图 →随时间变化的列车图像精度
右图 →随时间变化的列车图像成本
左图 →随时间测试图像精度
右图 →随时间测试图像成本
如上所述,训练图像和测试图像的准确率都只有 19%左右。这是可怕的结果。
透明度
为了增加这个实验的透明度,我已经将培训过程中 cmd 上的所有输出上传到我的 git hub,请点击这里访问它们。
训练结果(修改模型)
左图 →随时间变化的列车图像精度
右图 →随时间变化的列车图像成本
左图 →随时间测试图像精度
右图 →随时间测试图像成本
如上所述,即使使用修改的体系结构,训练图像和测试图像的准确度也分别约为 60/30%。这一点都不好……
透明度
为了增加这个实验的透明度,我已经将培训过程中 cmd 上的所有输出上传到我的 git hub,请点击这里访问它们。
交互代码(谷歌 Colab、微软 Azure、Repl it)
对于谷歌 Colab,你需要一个谷歌帐户来查看代码,而且你不能在谷歌 Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问原始模型的代码,请点击您希望查看代码的平台, Google Colab , Microsoft Azure , Replt
要访问原始模型的代码,请单击您希望查看代码的平台, Google Colab , Microsoft Azure , Replt
注意需要 wget 权限的平台不会在您的浏览器上运行。你可以在 Google Colab 上运行它。
遗言
从这个实验中,我了解到一些模型可能在某项任务上做得非常好,而在其他几项任务上表现不佳。此外,我还了解到扩张反向传播也是一个正则化因素。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- [1]2018.【在线】。可用:https://www . quora . com/How-many-layers-do-neural-networks-used-for-driving-cars-have。【访问日期:2018 年 3 月 19 日】。
- Bojarski,m .、Del Testa,d .、Dworakowski,d .、Firner,b .、Flepp,b .、Goyal,p .、…、张,X. (2016)。自动驾驶汽车的端到端学习。 arXiv 预印本 arXiv:1604.07316 。
- 超越 Tensorflow 的默认自动微分优化器,具有交互式代码[手动…(2018).走向数据科学。检索于 2018 年 3 月 19 日,来自https://towards data science . com/outpering-tensor flows-default-auto-difference-optimizer-with-interactive-code-manual-e 587 a82d 340 ea
- Python?,H. (2018)。如何在 Python 中以列表形式返回字典键?。Stackoverflow.com。检索于 2018 年 3 月 19 日,来自https://stack overflow . com/questions/16819222/how-to-return-dictionary-keys-as-a-list-in-python
- Python,A. (2018)。在 Python 中访问字典中的任意元素。Stackoverflow.com。检索于 2018 年 3 月 19 日,来自https://stack overflow . com/questions/3097866/access-an-arbitrary-element-in-a-dictionary-in-python
- Python 中的 DICOM:用 PyDICOM 和 VTK 将医学图像数据导入 NumPy。(2014).PyScience。检索于 2018 年 3 月 19 日,来自https://py science . WordPress . com/2014/09/08/DICOM-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-VTK/
- 博雅尔斯基,m .,菲尔纳,b .,弗莱普,b .,杰克尔,l .,穆勒,美国和齐巴,K. (2016)。自动驾驶汽车的端到端深度学习。NVIDIA 开发者博客。检索于 2018 年 3 月 19 日,来自https://dev blogs . NVIDIA . com/deep-learning-self-driving-cars/
- CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 3 月 19 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
- j . brown lee(2017 年)。如何在 Python 中对序列数据进行热编码-机器学习掌握?机器学习精通。检索于 2018 年 3 月 19 日,来自https://machine learning mastery . com/how-to-one-hot-encode-sequence-data-in-python/
- SciPy . sparse . CSR _ matrix—SciPy v 1 . 0 . 0 参考指南。(2018).Docs.scipy.org。检索于 2018 年 3 月 19 日,来自https://docs . scipy . org/doc/scipy/reference/generated/scipy . sparse . CSR _ matrix . html
- 超越 Tensorflow 的默认自动微分优化器,具有交互式代码[手动…(2018).走向数据科学。检索于 2018 年 3 月 20 日,来自https://towards data science . com/outpering-tensor flows-default-auto-difference-optimizer-with-interactive-code-manual-e587 a82d 340 e
- Google Colab 免费 GPU 教程—深度学习火鸡—中等。(2018).中等。检索于 2018 年 3 月 20 日,来自https://medium . com/deep-learning-turkey/Google-colab-free-GPU-tutorial-e 113627 b9f5d
- 文件?,W. (2018)。解压一个. tar.gz 文件需要什么命令?。Askubuntu.com。检索于 2018 年 3 月 20 日,来自https://askubuntu . com/questions/25347/what-command-do-I-need-to-unzip-extract-a-tar-gz-file
- 线?,H. (2018)。如何通过命令行重命名目录?。Askubuntu.com。检索于 2018 年 3 月 20 日,来自https://askubuntu . com/questions/56326/how-do-I-rename-a-directory-via-the-command-line
用 CNN 和 self attentions 实现问答网
在本帖中,我们将解决自然语言处理中最具挑战性也最有趣的问题之一,也就是问答。我们将在 Tensorflow 中实现 Google 的 QANet 。就像它的机器翻译对手 Transformer network 一样,QANet 根本不使用 RNNs,这使得训练/测试更快。(这个实验的源代码可以在这里找到)
我假设您已经对 python 和 Tensorflow 有了一些了解。
问答是计算机科学中的一个领域,在过去的几年中取得了一些快速的进展。回答问题的一个经典例子是 IBM 的沃森参加著名的智力竞赛节目 Jeopardy!2011 年,击败传奇冠军布拉德·鲁特和肯·詹宁斯,获得冠军。
在本帖中,我们将关注开放式阅读理解,问题可以来自任何领域,从美国流行明星到抽象概念。阅读理解是一种回答问题的方式,给我们一段文字,然后从这段文字中选择一些问题来回答。
IBM Watson competing against Ken Jennings (left) and Brad Rutter (right) at Jeopardy! in 2011. Source: https://blog.ted.com/how-did-supercomputer-watson-beat-jeopardy-champion-ken-jennings-experts-discuss/
数据集(小队)
我们将在这篇文章中使用的数据集叫做斯坦福问答数据集(SQuAD) 。SQuAD 有一些问题,我们将回头讨论,它可能不是机器阅读理解的最佳数据集,但却是研究最广泛的数据集。如果你对用于阅读理解的不同数据集感到好奇,也可以看看这个令人敬畏的 NLP 数据集列表。
《小队》的一个与众不同的因素是,问题的答案就在段落本身。这里是一个班格式的例子。
An example of Stanford Question Answering Dataset. Source: https://rajpurkar.github.io/SQuAD-explorer/
从上面的例子我们可以看出,不管问题有多简单或多难,问题的答案总是在段落本身。
但是首先,让我们看看我们期望解决的问题和答案的种类。通常情况下,问题本身已经是段落片段的转述版本。举个例子,
p:“计算复杂性理论是理论计算机科学中计算理论的一个分支,它专注于根据计算问题的内在难度对其进行分类,并将这些类别相互联系起来。一个计算问题被理解为一个原则上服从于由计算机解决的任务,这相当于声明该问题可以通过数学步骤的机械应用来解决,例如算法
问:“通常由计算机来解决的任务的术语是什么?
答:“计算问题”
从黑体字中可以看出,这个问题是从这一段中引申出来的。这一特性使得团队问题本质上比开放域问答问题更容易。因为我们现在要做的就是从段落中找出一个与问题语义匹配的句子,从上下文中提取出共同的语义或句法因素。虽然我们还是要求解决语义和句法抽取,但这比从可能有上万个单词的字典中推导出答案要容易得多。
队伍的劣势
上面提到的属性让我们使用一些技巧来轻松预测给定段落的答案。但是,这也给用 SQuAD 训练的模型引入了一些问题。因为模型严重依赖于从段落中找到正确的句子,所以它们容易受到插入到段落中的敌对句子的影响,这些句子类似于问题,但旨在欺骗网络。这里有一个例子,
Adversarial example of SQuAD. Source: https://arxiv.org/pdf/1707.07328.pdf
用蓝色突出显示的句子是为了愚弄网络而插入的对抗性示例。对于人类读者来说,这不会改变“在第三十三届超级碗中 38 岁的四分卫叫什么名字?”因为反诘句说的是冠军碗三十四。然而,对网络来说,对抗性句子比基本事实句子更符合问题。
模型网络(QANet)
我们选择 QANet 模型的原因很简单。由于其简单的体系结构,它易于实现,并且比完成相同任务的大多数网络训练更快。QANet 架构从下图可以看出:
The network architecture overview. Source: https://openreview.net/pdf?id=B14TlG-RW
模型网络可以大致分为 3 个部分。
- 把…嵌入
- 编码器
- 注意力
嵌入是将文本输入(段落和问题)转换成密集低维向量形式的表示。这是通过类似于本文中的方法完成的。
Character aware language modelling. Source: https://arxiv.org/pdf/1508.06615.pdf
我们的方法非常相似。唯一的区别是我们对卷积滤波器使用固定的核大小 5。我们还将单词表示与最大合并字符表示连接起来,然后将它们放入高速公路网络。
编码器是模型的基本构件。从上图的右侧可以看到编码器模块的细节。编码器由位置编码、层归一化、深度方向可分离的一维卷积、自关注和前馈层组成。
最后,注意层是网络的核心构件,问题和段落在这里融合。QANet 使用了 BiDAF 论文中使用的三线性注意函数。
我们开始吧!
履行
为简单起见,我们跳过数据处理步骤,直接进入神经网络。
把…嵌入
首先,我们定义输入占位符。一旦我们定义了占位符,我们就用单词嵌入来嵌入单词输入,用字符嵌入来嵌入字符输入。
然后,我们让它们通过 1 层 1 维卷积神经网络、最大池、连接单词+字符表示,最后让它们通过 2 层高速公路网络。我们将“重用”参数放在“conv”和“公路”函数中的原因是,我们希望段落和问题使用同一个网络。“conv”和“高速公路”功能是我们对卷积网络和高速公路网络的 Tensorflow 实现。(源代码可以在这里找到【https://github.com/NLPLearn/QANet )
我们将嵌入层的输出放入编码器层,以生成相应的上下文和问题表示。“residual_block”实现位置编码-> layer _ normalization-> depth wise 可分离卷积-> self attention ->前馈网络。
现在我们有了上下文和问题的表示,我们使用一个叫做三线性注意力的注意力函数将它们融合在一起。融合的输出现在具有关于问题的上下文的丰富信息。同样,我们将上下文到问题和问题到上下文的信息与上下文连接起来,并作为下一个输入传递给编码器层。
最后,我们有输出层,它接收注意力输出,并将它们编码成一个密集向量。这就是班的属性派上用场的地方。因为我们知道答案就在段落中的某个地方,对于段落中的每个单词,我们只需要计算这个单词是否是答案的概率。实际上,我们计算两种概率。对应单词属于答案开始的概率和对应单词属于答案区间结束的概率。这样,我们就不需要从一大堆字典里找出答案可能是什么,高效地计算概率。
就是这样!
培训和演示
与其他基于 RNN 的模型相比,QANet 训练相对较快。与流行的 BiDAF 网络相比,QANet 训练速度快 5~6 倍,性能更好。我们在 GTX1080 GPU 中为 60,000 个全局步骤训练网络,大约需要 6 个小时。
Visualizing results in Tensorboard. The top plots are the devset results and the bottom are the training results. “em” is exact match, “f1” is F1 score.
这是非常简单的方法,但我希望它能帮助你理解用神经网络回答问题!如果你有关于它们的问题,请留下评论,我会尽力回答你的问题。
感谢阅读,并请在评论中留下问题或反馈!
使用深度学习创建 Snapchat 过滤器系统
如果你们都不喜欢阅读
欢迎,所有可能在看到‘Snapchat’和‘深度学习’这两个词后打开这篇文章的千禧一代程序员。我向上帝发誓,这两个字像飞蛾扑火一样吸引着你们。我在骗谁,我也是它的受害者,这就是为什么我花了几个小时做这个项目。
在这篇文章中,如果你愿意这样称呼它,我将回顾标题中的过程和项目背后的一点理论。坦白地说,即使我在标题中使用术语“Snapchat”也可能有点 clickbaity,因为尽管这个项目的工作原理相同(使用面部关键点将对象映射到面部),但就复杂性和准确性而言,它甚至没有接近 Snapchat 的实现。说完这些,让我从介绍我使用的数据集开始。
数据集
我使用的数据集如下:https://www.kaggle.com/c/facial-keypoints-detection由蒙特娄大学的 Yoshua Bengio 博士提供。
每个预测的关键点由像素索引空间中的(x,y)实值对指定。共有 15 个关键点,代表了面部的不同元素。输入图像在数据文件的最后一个字段中给出,由像素列表(按行排序)组成,整数为(0,255)。这些图像是 96x96 像素。
既然我们对正在处理的数据类型有了很好的了解,我们需要对它进行预处理,以便我们可以将它用作模型的输入。
步骤 1:数据预处理和其他诡计
上面的数据集有两个我们需要关注的文件——training . CSV和 test.csv. 训练文件有 31 列:30 列为关键点坐标,最后一列包含字符串格式的图像数据。它包含 7049 个样本,然而,这些例子中的许多在一些关键点上有“NaN”值,这让我们很难处理。因此我们将只考虑没有任何 NaN 值的样本。下面的代码就是这样做的:(下面的代码也对图像和关键点数据进行规范化,这是一个非常常见的数据预处理步骤)
一切都好吗?不完全是,没有。似乎只有 2140 个样本不包含任何 NaN 值。训练一个通用和精确的模型,这些样本要少得多。因此,为了创建更多的数据,我们需要扩充我们当前的数据。
数据扩充是一种通过使用缩放、平移、旋转等技术从现有数据中生成更多数据的技术。在这种情况下,我镜像了每张图像及其对应的关键点,因为像缩放和旋转这样的技术可能会扭曲面部图像,从而破坏模型。最后,我将原始数据与新的扩充数据结合起来,得到总共 4280 个样本。
步骤 2:模型架构和培训
现在让我们进入项目的深度学习部分。我们的目标是预测一张看不见的脸的每个关键点的坐标值,,因此这是一个回归问题。由于我们正在处理图像,卷积神经网络是特征提取的一个非常明显的选择。这些提取的特征然后被传递到一个完全连接的神经网络,该网络输出坐标。最终的密集层需要 30 个神经元,因为我们需要 30 个值(15 对(x,y)坐标)。
- “ReLu”激活在每个卷积和密集层之后使用,除了最后一个密集层,因为这些是我们需要作为输出的坐标值
- 剔除调整用于防止过度拟合
- 添加最大池是为了降维
模型能够达到最小损耗 ~0.0113 ,精度 ~80% ,我觉得已经足够体面了。以下是测试集上模型性能的一些结果:
Model performance on the Test set
我还需要检查模型在来自我的网络摄像头的图像上的表现,因为这是模型在过滤器实施期间将接收到的,下面是模型在我美丽的脸的图像上的表现:
Don’t be intimidated by this scary face. I don’t bite.
第三步:将模型付诸实施
我们已经让我们的模型工作了,所以我们现在要做的就是使用 OpenCV 来做以下事情:
- 从网络摄像头获取图像帧
- 检测每个图像帧中的面部区域,因为图像的其他部分对模型没有用(我使用了正面面部哈尔级联来裁剪面部区域)
- 通过转换为灰度、规格化和整形来预处理该裁剪区域
- 将预处理后的图像作为输入传递给模型
- 获得对关键点的预测,并使用它们在面部定位不同的过滤器
当我开始测试的时候,我脑子里没有任何特定的过滤器。我在 2018 年 12 月 22 日左右产生了这个项目的想法,作为一个像其他普通人一样的超级圣诞粉丝,我决定采用以下过滤器:
Filters
我使用了特定的关键点来缩放和定位上述每个过滤器:
- **眼镜滤镜:**左眼左关键点和右眼右关键点之间的距离用于缩放。眉毛关键点和左眼左关键点用于眼镜的定位
- **胡须过滤器:**左嘴唇关键点和右嘴唇关键点之间的距离用于缩放。上唇关键点和左唇关键点用于胡须的定位
- **帽子滤镜:**脸部的宽度用于缩放。眉毛关键点和左眼左关键点用于帽子的定位
执行上述所有操作的代码如下:
结果
上面,你可以看到项目的最终输出,其中包含一个在我脸上使用滤镜的实时视频和另一个标绘了关键点的实时视频。
项目的局限性
虽然这个项目运行得很好,但我确实发现了一些不足之处,使它有点不完美:
- 不是最准确的模型。虽然在我看来 80%已经相当不错了,但还是有很大的提升空间。
- 这个当前的实现只适用于选定的一组过滤器,因为我不得不做一些手动调整,以获得更精确的定位和缩放。
- 将滤镜应用到图像的过程在计算上是相当低效的,因为要覆盖。png 过滤器图像到基于 alpha 通道的网络摄像头图像上,我必须在 alpha 不等于 0 的地方逐个像素地应用过滤器。这有时会导致程序在检测到图像中不止一张人脸时崩溃。
该项目的完整代码在我的 Github 上:https://Github . com/agr awal-rohit/Santa-filter-face-key point-regression
如果你想改进这个项目,或者你对我解决上述问题有任何建议,请务必在下面留下回复,并在 Github repo 上生成一个 pull 请求。谢谢你的来访,希望你喜欢这本书。
再见。
在 Tensorflow 中实现空间批量/实例/图层归一化[TF 中的手动反推]
Photo by Daniel van den Berg on Unsplash
这篇文章是对实现不同规范化层的简单回顾。
请注意,这篇帖子是给未来的自己看的,回顾这篇帖子里呈现的材料。
简介
Image from this website
今天我想写一篇关于实现不同类型的标准化层的短文。如上所述,批次/层/实例甚至组规范化方法都是相互关联的。唯一的区别是他们取均值和方差(一阶和二阶矩)的维度。
算出导数
计算每个归一化方案的导数也很容易。唯一的区别是,1)我们求导的维数,2)求导时需要除以的数。
上面的 DIM 变量显示了每个归一化方案之间的差异。假设我们有代表(B,H,W,C)的 4D 张量,它代表图像的批次、高度、宽度和通道。
批次定额 →对通道(1,1,1,c)取均值和方差
层定额 →对批次(b,1,1,1)
实例定额 →对批次/通道(b,1,1,c)取均值和方差
更新我重新阅读了最初的批量定额论文,作者没有包括 sigma 项。我也更新了代码。
批量归一化
使用我们能够从顶部驱动的派生,实现批量规范化层是非常容易的。
此外,我们可以确认,在该层之后,平均值为零(非常接近零),并且对于我们已经归一化的维度,标准偏差被设置为 1。
图层归一化
类似的故事层标准化,这一次我们将执行标准化方面的批量维度。
实例规范化
最后对于实例标准化,我们需要对批量维度和渠道维度进行标准化。
这篇短文的代码
要获取这篇博文的代码,请点击这里。
最后的话
实现这种标准化层总是好的做法,对于想要更多数学细节的人,请看这篇博文。
参考
- (2018).Arxiv.org。检索于 2018 年 11 月 18 日,来自https://arxiv.org/pdf/1803.08494.pdf
- 空间 Batchnorm Backprop 实施说明 Sam Kirkiles 博客 Medium。(2018).中等。2018 年 11 月 18 日检索,来自https://medium . com/samkirkiles/spatial-batch norm-back prop-implementation-notes-8 ccde 1 AC 62 a 2
- 推导批次标准化的后向传递的梯度。(2018).kevinzakka . github . io . 2018 年 11 月 18 日检索,来自https://kevinzakka . github . io/2016/09/14/batch _ normalization/
- thorey,C. (2016 年)。流过批量归一化的渐变是什么样子的?。Cthorey.github.io…检索于 2018 年 11 月 18 日,来自http://cthorey . github . io ./back propagation/
用 sk learn——线性回归实现监督学习算法
在这篇博客中,我们将看到如何使用 Python 中的 SkLearn 库实现监督学习算法—线性回归。SkLearn 或 scikit-learn 是最广泛使用的机器学习和数据分析工具之一。它完成所有的计算,让您专注于提高效率,而不是算法的计算部分。
关于 scikit-learn 的更多细节,你可以从给定的链接中参考官方文档
[## sci kit-learn:Python 中的机器学习
编辑描述
scikit-learn.org](http://scikit-learn.org/stable/)
什么是监督学习算法?
机器学习大致包括两种方法,一种是有监督的,另一种是无监督的。在监督学习中,我们事先知道测试数据集的输出,而在无监督学习中,没有这样的数据集提供给我们。
要深入了解这个主题,请参考给定的链接。
什么是监督机器学习,它与无监督机器学习有什么关系?在这篇文章中,你将…
machinelearningmastery.com](http://machinelearningmastery.com/supervised-and-unsupervised-machine-learning-algorithms/)
现在到了有趣的部分——编码
我们将用 Python 编码,确保你已经在你的系统上安装了它。我将指导您安装所需的外部库。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn import linear_model
让我快速地引导你到我们正在使用的库,如果你还没有它们,你可以使用 pip 安装它们。
- Matplotlib**😗*是一个用于绘制 2D 图形和图表的 python 库。我们将使用它来表示我们的模型。
- Numpy :是 python 中用来进行科学计算的包。我们将使用它为我们的数据集制作数组和矩阵,并对它们进行基本计算。
- Skle arn—Linear _ model:我们将使用 sklearn 的线性模型对给定的数据集进行线性回归。
出于教学目的,我们将使用小型硬编码数据集,否则您可以使用任何数据集。有像 熊猫 这样的库允许从外部源加载数据集。
比方说,现在我们想根据房子的大小来预测房子的价格。我们的测试数据集将是这样的。
DataSet Table
我们现在将使用 python 中的字典放置数据集(用于教程目的),并将使用 matplot 库绘制它们。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasets, linear_modelhouse_price = [245, 312, 279, 308, 199, 219, 405, 324, 319, 255]size = [1400, 1600, 1700, 1875, 1100, 1550, 2350, 2450, 1425, 1700]plt.scatter (size,house_price, color=’black’)plt.ylabel(‘house price’)plt.xlabel(‘size of house’)plt.show()
上面将给出以下输出。
现在,我们使用 scikit 的线性模型以如下方式训练我们的数据集。
import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasets, linear_modelhouse_price = [245, 312, 279, 308, 199, 219, 405, 324, 319, 255]size = [1400, 1600, 1700, 1875, 1100, 1550, 2350, 2450, 1425, 1700]size2 = np.array(size).reshape((-1, 1))#fitting into the modelregr = linear_model.LinearRegression()regr.fit(size2, house_price)print('Coefficients: \n', regr.coef_)print('intercept: \n', regr.intercept_)##############################formula obtained for the trained modeldef graph(formula, x_range): x = np.array(x_range) y = eval(formula) plt.plot(x, y)#plotting the prediction line graph('regr.coef_*x + regr.intercept_', range(1000, 2700))print regr.score(size2, house_price)#############################plt.scatter (size,house_price, color=’black’)plt.ylabel(‘house price’)plt.xlabel(‘size of house’)plt.show()
编译完上面的代码后,你会看到带有预测行的数据模型。
(‘Coefficients: \n’, array([ 0.10976774]))(‘intercept: \n’, 98.248329621380833)
这里,预测线的方程是“y = mx + c”的形式,上面计算了“m”和“c”的值。
给定房子的大小,要预测任何新的价格,我们可以通过以下方式使用线性模型提供的预测函数。
print regr.predict([2000])
预测产量为 317.78380528 千美元。
这就结束了线性压缩的教程。对于任何开始学习机器的人来说,我建议不要使用 scikit 库,先进行一次线性回归,只是为了更好地理解概念。尽量使用 梯度下降 等算法,使平方误差函数最小化。如果你不想用 python 编码,你可以使用 GNU-Octave 或 Matlab 等工具,它们非常适合原型和分析。此外,对矩阵和计算有很好的了解会对你有很大帮助。
快乐编码:)
感谢阅读这篇文章。如果你觉得这篇文章有帮助,一定要点击下面的❤来推荐它。这对我意义重大。
如果你想了解更多关于编程的知识,你可以关注我,这样我写新帖的时候你会收到通知。
还有,让我们在 Twitter , Linkedin , Github 和 脸书 上成为朋友吧。
在 Tensorflow 中实现 T-SNE[TF 中的手动回柱]
GIF from this website
今天,我只是想研究一下 t 分布随机邻居嵌入(t-SNE),并想在 tensorflow 中实现它,同时创建一些可视化。下面是我们要比较的案例。
案例 A)纯 T-SNE 降维到 2D
案例 B)全连接网络作为 T-SNE 降维到 2D
案例 C)卷积神经网络作为 T-SNE 降维到 2D
案例 D)全连接网络作为 T-SNE 降维到 3D
案例 E)卷积神经网络作为 T-SNE 降维到 3D
请注意这篇帖子是为了我未来的自己,回顾如何在 tensorflow 中实现 T-SNE。
Original SNE paper from this website
TSNE paper from this website
如果有人感兴趣,T-SNE 最初是基于辛顿教授发明的随机邻居嵌入(SNE)。我链接了原始的 SNE 论文和 T-SNE 论文。
T-SNE 比 PCA 做得更好的案例
Image from this website and this website
已经有不同的方法来执行降维,但是传统方法存在局限性。例如,主成分分析(PCA)以线性方式降低维度,并且在一些情况下,更高维度的几何形状是以非线性方式。它没有捕捉到关键信息。更多更好更深入的解释请阅读这篇博文或观看下面的视频。
Video from GoogleTechTalks
一些有用的知识(我不得不学)
Image from this website
对我来说,在深入研究 T-SNE 之前,了解一些额外的东西是个好主意,比如指数归一化技巧,(或者稳定的 softmax 函数)或者对二分搜索法的回顾。
video from
Udacity
此外,它有助于审查二分搜索法,一般来说,它的运行时间为 O(登录),这是很好的。对于 T-SNE,它用于搜索最佳西格玛值,以匹配我们想要的困惑。
Image from this website
最后,来自 Distill 的一份出版物是一个令人惊奇的在线资源,可以让你更深入地了解 T-SNE 及其成功的原因。
张量流中的纯 T-SNE
遵循这里完成的 Numpy 实现,并将其转换成 tensorflow 并不难。(liam schoneveld 也出色地解释了每个函数背后的数学原理。).此外,我们可以使纯 SNE 霸王龙成为 SNE 霸王龙层,如上图所示。并分配前馈操作以及反向传播。剩下要做的唯一的事情是连接到完全连接的层以及卷积层到这个 T-SNE 层。
这一点也不难,我们已经实现了全连接层/卷积层,我们可以做类似上面的事情来建立连接。
结果:案例 A)纯 T-SNE 退化为 2D
上面的 gif 显示了每个星团是如何通过历元数形成的。最终的聚类如下图所示。
如上所述,我们注意到算法很好地将数字分成不同的簇,但是,我们仍然可以注意到一些随机点属于不正确的点。
在红色区域,我们可以观察到一些 0/5 位于错误的位置。正如在天蓝色区域看到的一样,四和九之间没有明显的区别。
结果:情况 B)全连通网络为 T-SNE 简化为 2D
由于我们在最后一层使用 ELU()激活函数,我们可以注意到轴点是正数。此外,似乎大部分聚类都是在培训的开始阶段完成的。(具体来说,5000)。剩下的用于重新定位每个数据点。
首先,我们可以注意到,大多数的零都很好地聚集在一起。(与纯 SNE 霸王龙的情况相比,要好得多。).然而,四和九之间的区别仍然不是很清楚…
结果:情况 C)卷积神经网络为 T-SNE 简化为 2D
对于全连接网络的卷积神经网络,我们可以看到部分数据点粘在 Y 轴上。但我个人认为四九分开比其他任何情况都好。
以上是最终结果,在最右边的点,我们可以看到 4 和 9 之间的分离比其他的更好,因为 4 聚集在最右边。(但是需要分开得多。)
使用 Sklearn T-SNE 进行比较
我想将我的结果与 sklearn 的 TSNE 进行比较,如果我使用相同的学习速率和相同的超参数,我会得到上面的结果。
然而,通过一些超参数调整,我能够得到上述结果。四个和九个之间仍然存在着不清楚的分离,但是每个星团之间的距离却更远了。
结果:案例 D)全连通网络为 T-SNE 简化为 3D
上面的 gif 展示了 MNIST 数据集降维为 2 的聚类过程,总体来说做得不错。
上面的 gif 显示了最终的聚类。然而,与其他数字相比,4 和 9 之间的区别并不明显。
结果:情况 E)卷积神经网络为 T-SNE 简化为 3D
上面的 gif 显示了我在连接到 T-SNE 层之前使用 CNN 时的聚类进度。下面是最终得到的 gif。
我个人认为 CNN 在数据聚类方面做得更好,因为在处理图像时,空间信息更有用。
互动码
对于 Google Colab,您需要一个 Google 帐户来查看代码,而且您不能在 Google Colab 中运行只读脚本,所以请在您的操场上创建一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问案例 A)的代码,请点击此处。
要访问案例 B)的代码,请点击此处。
要访问案例 C)的代码,请点击此处。
要访问案例 D)的代码,请点击此处。
要访问案例 E)的代码,请点击此处。
要获取案例 Z 的代码,请点击此处。
奇怪的结果
最后,我只是觉得这是一个很酷的结果。显然聚类做得很糟糕,但还是有点酷,哈哈。
最后的话
由于 t-SNE 的操作方式,对新数据点进行降维非常困难,为了克服这个问题,原始论文的作者引入了参数 T-SNE。而论文可以在下面看到。
Paper from this website
接下来的事情是实施上述文件,这将是我的下一个任务。(以及均匀流形近似和投影(UMAP))
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。
同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。
参考
- Tensorflow?,C. (2018)。在 Tensorflow 中不复制张量的情况下批量计算成对距离?。堆栈溢出。检索于 2018 年 7 月 21 日,来自https://stack overflow . com/questions/37009647/compute-pairwise-distance-in-a-batch-without-replication-tensor-in-tensor flow
- NumPy . set _ print options—NumPy v 1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 7 月 21 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . set _ print options . html
- tf.reduce_max | TensorFlow。(2018).张量流。检索于 2018 年 7 月 21 日,来自https://www.tensorflow.org/api_docs/python/tf/reduce_max
- tf.matrix_set_diag | TensorFlow(2018).张量流。检索于 2018 年 7 月 21 日,来自https://www . tensor flow . org/API _ docs/python/TF/matrix _ set _ diag
- tf.matrix_diag |张量流。(2018).张量流。检索于 2018 年 7 月 21 日,来自https://www.tensorflow.org/api_docs/python/tf/matrix_diag
- tf.matrix_set_diag | TensorFlow(2018).张量流。检索于 2018 年 7 月 21 日,来自https://www . tensor flow . org/API _ docs/python/TF/matrix _ set _ diag
- 学习?,H. (2018)。logit 最大值的减法如何提高学习?。交叉验证。检索于 2018 年 7 月 21 日,来自https://stats . stack exchange . com/questions/338285/how-the-subtraction-of-the-logit-maximum-improve-learning
- 使用 t-SNE 可视化数据。(2018).YouTube。检索于 2018 年 7 月 21 日,来自 https://www.youtube.com/watch?v=RJVL80Gg3lA
- Quora.com(2018)。t-SNE 算法相比 PCA 有什么优势?— Quora 。[在线]可从以下网址获取:https://www . quora . com/What-advantages-the-t-SNE 算法优于 PCA【2018 年 7 月 21 日获取】。
- Python 中的 lambda、map 和 filter—RUP esh mis HRA—Medium。(2017).中等。检索于 2018 年 7 月 21 日,来自https://medium . com/@ happymishra 66/lambda-map-and-filter-in-python-4935 f 248593
- 德斯莫斯图表。(2018).德斯莫斯图形计算器。检索于 2018 年 7 月 21 日,来自https://www.desmos.com/calculator
- 类,P. (2018)。Python 调用类中的函数。堆栈溢出。检索于 2018 年 7 月 23 日,来自https://stack overflow . com/questions/5615648/python-call-function-within-class
- 二分搜索法。(2018).YouTube。检索于 2018 年 7 月 23 日,来自https://www.youtube.com/watch?v=0VN5iwEyq4c
- (2018).Cs.nyu.edu。检索于 2018 年 7 月 23 日,来自https://cs.nyu.edu/~roweis/papers/sne_final.pdf
- (2018).Cs.toronto.edu。检索于 2018 年 7 月 23 日,来自http://www.cs.toronto.edu/~hinton/absps/tsne.pdf
- 用于视觉识别的 CS231n 卷积神经网络。(2018).cs 231n . github . io . 2018 年 7 月 23 日检索,来自http://cs231n.github.io/linear-classify/#softmax
- [副本],D. (2018)。双竖线。数学栈交换。检索于 2018 年 7 月 23 日,来自https://math . stack exchange . com/questions/1918 317/double-vertical-bars
- 只有 Numpy:(为什么我做手动反向传播)实现多通道/层卷积神经…(2018).中等。2018 年 7 月 23 日检索,来自https://medium . com/swlh/only-numpy-why-I-do-manual-back-propagation-implementing-multi-channel-layer-convolution-neural-7d 83242 FCC 24
- Schoneveld,L. (2017 年)。原始数字:t-SNE。nlml。检索于 2018 年 7 月 23 日,来自 https://nlml.github.io/in-raw-numpy/in-raw-numpy-t-sne/#eq1
- 奥雷利媒体/t-SNE-教程。(2018).GitHub。检索于 2018 年 7 月 23 日,来自https://github.com/oreillymedia/t-SNE-tutorial
- tf.clip_by_value |张量流。(2018).张量流。检索于 2018 年 7 月 23 日,来自https://www.tensorflow.org/api_docs/python/tf/clip_by_value
- tf.random_gamma |张量流。(2018).张量流。检索于 2018 年 7 月 23 日,来自https://www.tensorflow.org/api_docs/python/tf/random_gamma
- Matplotlib . py plot . text-Matplotlib 2 . 2 . 2 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 23 日,来自https://matplotlib . org/API/_ as _ gen/matplotlib . py plot . text . html
- 变,m. (2018)。matplotlib 艺术家动画:标题或文本不变。堆栈溢出。检索于 2018 年 7 月 23 日,来自https://stack overflow . com/questions/47421486/matplotlib-artist-animation-title-or-text-not-changing
- matplotlib,3。(2018).使用 matplotlib 的 3D 动画。堆栈溢出。检索于 2018 年 7 月 23 日,来自https://stack overflow . com/questions/38118598/3d-animation-using-matplotlib
- Wattenberg,m .,Viégas,f .,& Johnson,I. (2016 年)。如何有效地使用 t-SNE?蒸馏,1(10)。doi:10.23915
- sk learn . manifold . tsne—sci kit-learn 0 . 19 . 2 文档。(2018).Scikit-learn.org。检索于 2018 年 7 月 23 日,来自http://sci kit-learn . org/stable/modules/generated/sk learn . manifold . tsne . html
- 动画示例代码:simple _ 3d anim . py—Matplotlib 2 . 0 . 2 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 23 日,来自https://matplotlib . org/examples/animation/simple _ 3d anim . html
- 何时使用 cla(),c. (2018)。什么时候使用 cla()、clf()或 close()来清除 matplotlib 中的绘图?。堆栈溢出。2018 年 7 月 23 日检索,来自https://stack overflow . com/questions/8213522/when-to-use-cla-clf-or-close-for-clearing-a-plot-in-matplotlib
- 何时使用 cla(),c. (2018)。什么时候使用 cla()、clf()或 close()来清除 matplotlib 中的绘图?。堆栈溢出。检索于 2018 年 7 月 23 日,来自https://stack overflow . com/questions/8213522/when-to-use-cla-clf-or-close-for-clearing-a-plot-in-matplotlib
在 PyTorch 中实现 word2vec(跳格模型)
你可能听说过 word2vec 嵌入。但是你真的了解它是如何工作的吗?我想我知道。但我没有,直到实现它。
这就是为什么我创建这个指南。
2021 年更新:更详细的文章见:https://neptune.ai/blog/word-embeddings-guide
先决条件
我假设你知道更多-更少 word2vec 是什么。
文集
为了能够跟踪每一步,我使用了以下 nano 语料库:
创造词汇
第一步是用 word2vec 创建词汇表。它必须从头开始构建,因为不支持扩展它。
词汇表基本上是一个带有指定索引的独特单词列表。
语料库非常简单和简短。在实际实现中,我们必须执行大小写规范化,删除一些标点符号等,但为了简单起见,让我们使用这些漂亮而干净的数据。无论如何,我们必须把它符号化:
这将为我们提供一个令牌列表:
[['he', 'is', 'a', 'king'],
['she', 'is', 'a', 'queen'],
['he', 'is', 'a', 'man'],
['she', 'is', 'a', 'woman'],
['warsaw', 'is', 'poland', 'capital'],
['berlin', 'is', 'germany', 'capital'],
['paris', 'is', 'france', 'capital']]
我们迭代语料库中的标记,并生成唯一单词(标记)的列表。接下来,我们创建两个字典,用于单词和索引之间的映射。
这给了我们:
0: 'he',
1: 'is',
2: 'a',
3: 'king',
4: 'she',
5: 'queen',
6: 'man',
7: 'woman',
8: 'warsaw',
9: 'poland',
10: 'capital',
11: 'berlin',
12: 'germany',
13: 'paris',
14: 'france'
我们现在可以生成对center word
,context word
。让我们假设上下文窗口是对称的并且等于 2。
它为我们提供了一组center
、context
指数:
array([[ 0, 1],
[ 0, 2],
...
这很容易翻译成文字:
he is
he a
is he
is a
is king
a he
a is
a king
这很有道理。
定义目标
现在,我们正在讨论从第一个等式到工作实现的细节。
对于跳格,我们感兴趣的是预测上下文,给定中心词和一些参数化。这是我们单对的概率分布。
E.g.: P(king | is)
现在,我们想通过所有单词/上下文对来最大化它。
等等,为什么?
由于我们对预测给定中心词的上下文感兴趣,所以我们希望最大化每个context
、center
对的 P(上下文|中心)。由于概率总和为 1——对于所有不存在的context
、center
对,我们隐式地使 *P(上下文|中心)*接近于 0。通过将这些概率相乘,如果我们的模型是好的,我们使这个函数接近 1,如果是坏的,这个函数接近 0。当然我们追求的是一个好的——所以一开始就有 max 算子。
这个表达式不太适合计算。这就是为什么我们要执行一些非常常见的转换。
步骤 1——用负对数似然替换概率。
回想一下,神经网络是关于最小化损失函数的。我们可以简单地将 P 乘以-1,但是应用 log 可以给我们更好的计算特性。这不会改变函数极值的位置(因为 log 是一个严格单调的函数)。所以表达式改为:
步骤 2——用总和替换乘积
下一步是用总和代替乘积。我们能做到是因为:
步骤 3——转换成合适的损失函数
除以 par 数(T)后,我们得到最终的损失项:
定义 P
很好,但是我们如何定义 P(context|center) ?现在,让我们假设到达词实际上有两个向量。一个 if 作为中心词出现( v ),第二个 if 上下文( u )。假设 P 的定义如下:
太吓人了!
让我把它分解成更小的部分。请参见以下结构:
Softmax!
这只是一个 softmax 函数。现在仔细看看提名者
u 和 v 都是矢量。这个表达式就是给定的center
,context
对的标量积。更大,因为它们彼此更相似。
现在,分母:
我们正在遍历词汇表中的所有单词。
以及计算给定中心词和词汇中被视为上下文词的每个词的“相似度”。
总结一下:
对于语料库中每个现有的中心、上下文对,我们正在计算它们的“相似性得分”。然后除以每一个理论上可能的情境的总和——知道分数是相对高还是相对低。因为 softmax 保证取 0 和 1 之间的值,所以它定义了有效的概率分布。
太好了,现在我们来编码吧!
实现这一概念的神经网络包括三层:输入、隐藏和输出。
输入层
输入层只是以一键编码方式编码的中心字。它的尺寸是[1, vocabulary_size]
隐蔽层
隐藏层使我们的 v 向量。因此它必须有embedding_dims
神经元。为了计算它的价值,我们必须定义W1
权重矩阵。当然它必须是[embedding_dims, vocabulary_size].
没有激活函数——只有简单的矩阵乘法。
重要的是——W1
的每一列存储单个单词的 v 向量。为什么?因为 x 是一个热点,如果您将一个热点向量乘以矩阵,结果与从其中选择选择单列相同。用一张纸自己试试;)
输出层
最后一层必须有vocabulary_size
神经元——因为它为每个单词生成概率。因此,就形状而言,W2
就是[vocabulary_size, embedding_dims]
。
在此之上,我们必须使用 softmax 层。PyTorch 提供了这个的优化版本,结合了log
——因为常规的 softmax 在数值上并不真正稳定:
log_softmax = F.log_softmax(a2, dim=0)
这相当于计算 softmax,然后应用 log。
现在我们可以计算损失。像往常一样,PyTorch 提供了我们需要的一切:
loss = F.nll_loss(log_softmax.view(1,-1), y_true)
nll_loss
在 logsoftmax 上计算负对数似然。y_true
是上下文单词——我们想让它尽可能高——因为对x, y_true
来自训练数据——所以它们确实是上下文的中心。
反向投影
当我们钓到向前传球时,现在是时候表演向后传球了。简单来说:
loss.backward()
为了优化,使用了 SDG。它如此简单,以至于用手工编写比创建优化器对象更快:
W1.data -= 0.01 * W1.grad.data
W2.data -= 0.01 * W2.grad.data
最后一步是将梯度归零,以使下一步清晰:
W1.grad.data.zero_()
W2.grad.data.zero_()
训练循环
是时候把它编译成训练循环了。它可能看起来像:
一个潜在的棘手问题是y_true
定义。我们并不显式地创建一个 hot,而是由nll_loss
自己创建。
Loss at epo 0: 4.241989389487675
Loss at epo 10: 3.8398486052240646
Loss at epo 20: 3.5548086541039603
Loss at epo 30: 3.343840673991612
Loss at epo 40: 3.183084646293095
Loss at epo 50: 3.05673006943294
Loss at epo 60: 2.953996729850769
Loss at epo 70: 2.867735825266157
Loss at epo 80: 2.79331214427948
Loss at epo 90: 2.727727291413716
Loss at epo 100: 2.6690095041479385
提取向量
好了,我们已经训练好了网络。第一,最后一件事是提取单词的向量。有三种可能:
- 使用 W1 中的矢量 v
- 使用 W2 中的向量 u
- 使用平均 v 和 u
试着自己思考什么时候用哪个;)
待续
我正在做这个的在线互动演示。应该很快就有了。敬请期待;)
你可以从这里下载代码。
Working on this!
使用自定义文本分类的隐式搜索功能
文本分类是将任何文本语料库智能地分类到各种预定义的类别中,并且是结构化非结构化数据以对其进行分析的最常见方法之一。在我们之前的博客中,我们讨论了不同的机器学习技术来分类文本,包括我们最新的产品——定制分类器。在另一篇文章中,我们讨论了如何在没有任何训练数据的情况下,使用自定义分类器在自定义类别上构建自己的文本分类模型。在本文中,我们将看到自定义分类器如何用于显式和隐式文本分类。
显式文本分类
为了更好地理解我们所说的明确的文本分类是什么意思,考虑一个文本输入来为其分配一种情绪,“教练对球队的表现感到厌恶”,用以下类别将输入的文本分类为:厌恶、高兴、害怕、悲伤。你的大胆猜测是什么?没错,就是恶心。
这是一个显式文本分类的精确示例,其中输入文本要么携带分类,要么本身直接指向您必须分配给它的分类。让我们通过下面的例子来看看我们的自定义分类器在这种场景下的表现。
隐式文本分类
隐式文本分类可以被认为是将文本分类成类别,而不提及文本和所定义的类别之间的任何直接关系。例如,如果你想到莱昂内尔·梅西,我们脑海中会立即浮现什么?足球?。但是,当我们谈论一个没有梅西背景的自动文本分类模型时,它能够以类似的方式识别同一个例子吗?如果你说的是我们的定制分类器,那么答案是非常肯定的!
不相信我们?试试我们的演示!!
自定义分类器能够分类,莱昂内尔梅西不只是另一个名字,但也与足球有关。这是隐式文本分类的一个例子,其中输入文本没有直接指示它需要被分配到的类别。
还不信服?让我们看看最近关于阿莱克西斯·桑切斯转会曼联的新闻报道中的另一个很酷的例子。
这不是很好吗?我们的分类器甚至没有提到这项运动就选择了联盟!!
正如我们所见,这是迈向通用人工智能的第一步。我们没有提到任何与英超联赛或足球相关的东西,但我们的自定义分类器可以识别这种关系。在显式文本分类的基础上进行隐式文本分类的能力使得自定义分类器成为一个令人惊叹的有用工具。
直到最近,这还是一个牵强的概念。正如我们所知,使用机器学习和文本分类项目到目前为止面临的最大障碍是训练算法的注释数据集的可用性。但是随着 ParallelDots 的内部研究团队最近在定制分类器背后的零触发学习启发算法,我们真正实现了我们的愿景,即提供触手可及的人工智能。
这是什么意思?
这清楚地表明,在行动中,我们的自定义分类器脱颖而出!想象一下,现在你不需要数据科学家或者 ML 专家来为你做文本分类器。此外,正如您可以看到的,我们在执行分析时会给出由我们定义的类别,因此,执行文本分类不需要预先训练,因此您不需要为您的分类定制训练数据集。
这使您能够进行文本分类,而不必担心输入的种类或领域。所以你实际上可以用同一个工具对法律新闻和体育新闻进行分类。
为什么只是这样,这意味着不管任何类型的数据,无论是推文,facebook 评论,新闻或评论,你都可以执行你的文本分类任务,而不必担心任何其他事情。此外,能够进行显式和隐式分类,您可以为您的内容构建一个更智能的搜索引擎,或者使您的对话机器人更加智能。
现在想试试吗?注册一个免费的 ParallelDots AI APIs 账号开始使用。
结论
定制分类器是人工智能将如何塑造我们未来自然语言处理需求的主要例子。它不仅让您在自己的输入数据上定义自己的类别,从而使您比任何其他文本分类工具都有优势,而且还使您的文本分类考虑到与您定义的类别的任何隐含或间接关系。
同时执行显式和隐式文本分类的能力给了你在执行任何文本分类时无与伦比的优势。自定义分类器因此成为帮助您摆脱任何束缚的先锋,这些束缚使您无法使用文本分类的真正力量。
parallel dots AI API,是由 ParallelDots Inc 提供的深度学习支持的 web 服务,可以理解大量的非结构化文本和视觉内容,为您的产品提供支持。你可以查看我们的一些文本分析API并通过填写此处的表格联系我们或者给我们 apis@paralleldots.com 写信。
理解分析、分析和报告之间差异的重要性
这听起来可能是一个老生常谈的话题,但不幸的是,这仍然是一个没有任何好转的大问题。我们需要了解我们与数据的关系,包括分析、分析和报告,以确保我们处于正确的轨道上。但是为了知道你的确切位置,你需要一张真实的地图。如果你认为你是在做分析,而你实际上是在报告阶段,你可能会认为你已经在隧道的尽头,没有其他机会让你看它。这篇文章旨在为您提供一张地图,以便您可以充分利用现有的数据。
数字时代为我们了解我们的客户、粉丝、订户和利益相关者如何与我们互动提供了新的可能性。例如,在数字时代之前,不可能知道一篇特定文章的浏览量或独特观众的数量。现在,如果你为一家在线报纸或内容网站工作,你就知道哪些内容和许多其他信息一起被消费得最多。这是我们可以通过谷歌分析等网络分析工具获得的最基本的信息。
由于 Google Analytics 从一开始就是免费的,所有的数字企业都开始只用一段代码来观察他们网站的表现。这种可能性使每个人都开始使用网络分析工具,但在此过程中术语被混淆和误用。
谷歌分析为你提供了基本的报告,让你了解你的数字资产的一些关键数字。
根据谷歌的说法,这就是它的分析工具所做的:“获取你需要的数据,以做出智能营销和商业决策”
没错。获取数据。那叫举报。
根据一本英语词典,“报告是对某人所观察、听到、做的或调查的事情的口头或书面描述”。这里真的没有太多的思考或分析,你只需点击你正在使用的工具,你找到数据的来源,并传递所观察到的,没有意见,评论或假设。
我遇到过自称为“分析顾问”的人或顾问,因为他们可以从谷歌或 Adobe Analytics 获取数据。
让我们通过一些例子来看看不同之处:
当您有以下演示时,您正在做报告:
- 2016 年 7 月网站订单同比增长 20%。
- 在过去的 7 天里,我们有 15000 次来自谷歌分析的访问
- 我们今天访问量最大的页面是主页
- 我们标志性的红色秋装这个月被浏览了 20,000 次。
- 昨天有 155 人下载了我们的 IOS 应用
你看这里真的没有假设或评论。这些是简单的事实。报告为分析创造了基础。在报告阶段没有决策。
当我们到达分析阶段时,我们将对现有数据进行详细检查。我们可以尝试得出一些结论,或者我们可以尝试证明我们的假设,或者我们可以尝试理解数据。另一方面,分析是一个多学科领域,它与统计、数学和计算机科学等不同领域合作。
分析通常对当前数据感兴趣,而分析使用过去的数据来预测未来的数据。分析并不总是关于行动,但分析总是关于行动。分析可以为分析提供基础,而分析可以使用自己的科学工具做出决策。分析可以由人来完成,但分析通常需要不同种类的技术、方法和模型,这些只能由机器来执行。
如果你有以下陈述,你就是在做分析:
- 2016 年 7 月销量增长的可能原因之一是新的电视宣传活动。
- 在新订单中,50%可以归功于谷歌 AdWords,10%可以归功于重定向,其余可以归功于直接和自然搜索。
以上陈述对我们收到的报告做了一些评论。分析实际上是试图在数据中找到一个意义。当我们的订单增加时,我们试图了解增加的原因,但很多时候我们从来没有 100%的把握。是设计的改变吗?是因为新广告吗?这是经济复苏的反映吗?是因为我们的竞争吗?因此,在许多情况下,我们并不知道 100%,但我们可能有一些强有力的结论。
如果我们谈论的是分析,我们会将我们在报告和分析中看到的内容付诸行动。如果我们证明或否定了我们在分析阶段创建的一些假设,我们可以用这些事实来应用于其他情况。
例如:谁看了 X 品牌的衣服和 Y 品牌的鞋子,这之间真的有科学的关系吗?我们可以做统计和优化测试。基于这些测试,我们可以启动或优化我们的推荐引擎。我们开始从统计学上寻找关系和意义,我们可以在任何重要的地方使用结果:当我们瞄准一个广告时,当我们个性化网站时,或者当我们用电子邮件发送一些优惠时。
丢失了你在数据相关工作中的位置是很正常的。因为分析从来就不是一个如此流行的术语或领域。它一直被科学家使用,但现在每个营销人员也需要处理数据。使用地图并知道你在哪里会帮助你避免许多困惑。每一步都非常重要,不是每个人都适合每一步。对于一些人来说,报告可能听起来很无聊,但它是至关重要的,一些喜欢组织的人可能会非常喜欢它。分析是为喜欢哲学和喜欢将定性数据与定量数据联系起来的好奇者准备的。分析介于报告和分析之间,它不一定要用数字来完成,也可能包括灵感或“直觉”。所以这个领域更适合那些不想和技术打交道,但又有足够创造力去开发不同假设的人。最后,分析是为那些喜欢用科学技术解决问题的人准备的。
最初发布于:
重要的资源,如果你正在与神经风格转移或深层照片风格转移
The Starry Night by Vincent van Gogh
神经风格迁移和深度照片风格迁移是深度学习的有趣领域。他们的受欢迎程度已经上升到另一个水平。像 Prisma 和 Deepart.io 这样的应用加速了流行。如果你正在进行神经风格转换或深度照片风格转换,这些是非常重要的资源(论文、实现和教程)来帮助你。
研究论文
- 艺术风格的神经算法
[## [1508.06576]艺术风格的神经算法
摘要:在美术中,尤其是绘画,人类已经掌握了通过绘画创造独特视觉体验的技巧
arxiv.org](https://arxiv.org/abs/1508.06576)
- 神经类型转移——综述
[## [1705.04058]神经类型转移:综述
摘要:Gatys 等人最近的工作证明了卷积神经网络(CNN)在创建神经网络方面的能力
arxiv.org](https://arxiv.org/abs/1705.04058)
- 深度照片风格转移
[## [1703.07511]深层照片风格转移
摘要:本文介绍了一种深度学习的摄影风格转换方法
arxiv.org](https://arxiv.org/abs/1703.07511)
- 控制神经风格转移中的知觉因素
[## [1611.07865]控制神经类型转移中的感知因素
摘要:神经类型转移显示了非常令人兴奋的结果,使新形式的图像处理成为可能。在这里我们…
arxiv.org](https://arxiv.org/abs/1611.07865)
- 实例规范化:快速风格化缺少的要素
[## [1607.08022]实例规范化:快速风格化缺少的要素
摘要:本文回顾了 Ulyanov 等人提出的快速风格化方法。艾尔。(2016).我们展示了如何…
arxiv.org](https://arxiv.org/abs/1607.08022)
实现
- Torch 实现的神经风格转移
神经式算法的神经式 Torch 实现
github.com](https://github.com/jcjohnson/neural-style)
- 神经类型转换的 Tensorflow 实现
TensorFlow 中的神经式-神经式!:艺术:
github.com](https://github.com/anishathalye/neural-style) [## 一个人工智能可以模仿任何艺术家猫/变量/日志/生活
看看下面两张图。一幅是当代艺术家李奥尼德·阿夫列莫夫画的,另一幅是…
www.anishathalye.com](http://www.anishathalye.com/2015/12/19/an-ai-that-can-mimic-any-artist/) [## cy Smith/神经风格-tf
神经风格的实现
github.com](https://github.com/cysmith/neural-style-tf) [## log0/神经风格绘画
“艺术风格的神经算法”的实现
github.com](https://github.com/log0/neural-style-painting) [## 灯心草/神经艺术-tf
tensorflow 中的“艺术风格的神经算法”
github.com](https://github.com/woodrush/neural-art-tf)
- 深度照片风格转移的火炬实现
深照片风格转移.纸张“深照片风格转移”的代码和数据:https://arxiv.org/abs/1703.07511
github.com](https://github.com/luanfujun/deep-photo-styletransfer)
- 深度照片风格转移的 Tensorflow 实现
[## Louie yang/deep-photo-style transfer-TF
深度照片风格转换的 tf - Tensorflow (Python API)实现
github.com](https://github.com/LouieYang/deep-photo-styletransfer-tf)
- Tensorflow 实现快速风格转换
快速风格转移- TensorFlow CNN 快速风格转移!⚡🖥🎨🖼
github.com](https://github.com/lengstrom/fast-style-transfer)
- Torch7(Lua)实现神经风格转移
neuralart -论文《艺术风格的神经算法》的实现。
github.com](https://github.com/kaishengtai/neuralart)
- Keras 实现的神经风格转移
用于 Python 的深度学习库。在 TensorFlow、Theano 或 CNTK 上运行。
github.com](https://github.com/fchollet/keras/blob/master/examples/neural_style_transfer.py) [## titu 1994/神经类型转移
神经风格转换——Keras 实现了“艺术设计的神经算法”。
github.com](https://github.com/titu1994/Neural-Style-Transfer) [## kevinzakka/style_transfer
“艺术风格的神经算法”的 style_transfer - Keras 实现
github.com](https://github.com/kevinzakka/style_transfer)
- 样式转换算法的 ano+Keras 实现
风格转换算法的实现。
github.com](https://github.com/jayanthkoushik/neural-style)
- 神经艺术风格的深度实现
[## Anders bll/neural _ artistic _ style
Python 中的神经艺术风格
github.com](https://github.com/andersbll/neural_artistic_style)
- pyCaffe 实现的神经艺术风格
风格转移 L. Gatys,A. Ecker 和 M. Bethge 的“艺术风格的神经算法”的实现。http…
github.com](https://github.com/fzliu/style-transfer)
- Caffe 实现的神经风格转移
caffe-neural-style - Caffe 实现了 Leon A. Gatys 的论文“艺术风格的神经算法”。
github.com](https://github.com/ftokarev/caffe-neural-style)
- 神经类型转移的 MXNet 实现
孵化器-mxnet -轻量级,可移植,灵活的分布式/移动深度学习,具有动态,突变感知…
github.com](https://github.com/apache/incubator-mxnet/tree/master/example/neural-style)
- 链器实现神经风格的传递
使用链接器实现神经样式
github.com](https://github.com/dsanno/chainer-neural-style)
- 用于神经风格转移的 MXNet 预训练模型
https://github . com/dmlc/we B- data/raw/master/mxnet/art/model . zip
教程
现在有一个很棒的应用程序叫做 Prisma,它可以把你的照片转换成艺术作品,使用…
harishnarayanan.org](https://harishnarayanan.org/writing/artistic-style-transfer/) [## 这些“神经网络风格转移”工具是如何工作的?
你好!上周我发表了一篇关于神奇的机器学习艺术工具的文章。这让我开始思考——其他人会怎么做……
jvns.ca](https://jvns.ca/blog/2017/02/12/neural-style/) [## PyTorch 神经传递- PyTorch 教程 0.2.0_2 文档
嗯,更进一步需要一些数学知识。设(C_{nn})是一个预先训练好的深度卷积神经网络,并且…
pytorch.org](http://pytorch.org/tutorials/advanced/neural_style_tutorial.html) [## 用卷积神经网络画梵高
为了从图像中提取内容,Gatys 等人使用卷积层 5_2。将图像输入到……
www.subsubroutine.com](http://www.subsubroutine.com/sub-subroutine/2016/11/12/painting-like-van-gogh-with-convolutional-neural-networks) [## 带有生成模型的端到端神经艺术
在这篇博客中,我们将描述我们如何设计一个端到端的神经星夜风格发生器:与传统的…
dmlc.ml](http://dmlc.ml/mxnet/2016/06/20/end-to-end-neural-style.html) [## “艺术风格的神经算法”的 TensorFlow 实现
Github 上有这个笔记本和代码。本笔记本演示了论文“A…
www.chioka.in](http://www.chioka.in/tensorflow-implementation-neural-algorithm-of-artistic-style) [## 在 Mac 上安装 Neural-Style
想让你的电脑为你制作艺术品吗?看看神经类型的。它可以做一些非常不可思议的事情,但是天哪…
medium.com](https://medium.com/@eterps/installing-neural-style-on-a-mac-baf695d7256b) [## Gruff 的技术提示
我在绘画方面很垃圾,但是当你可以自己创造人工智能的时候,谁还需要艺术手指呢…
blog.gruffdavies.com](https://blog.gruffdavies.com/tag/neural-style/)
视频教程
文章
[## 深度神经网络现在可以将一张照片的风格转移到另一张照片上
你可能听说过一种被称为“风格转移”的人工智能技术——或者,如果你没听说过,你见过它…
www.theverge.com](https://www.theverge.com/2017/3/30/15124466/ai-photo-style-transfer-deep-neural-nets-adobe) [## 深度神经网络现在可以将一张照片的风格转移到另一张照片上
你可能听说过一种被称为“风格转移”的人工智能技术——或者,如果你没听说过,你见过它…
www.theverge.com](https://www.theverge.com/2017/3/30/15124466/ai-photo-style-transfer-deep-neural-nets-adobe) [## 使用 DeepStyle & Ubuntu 创建自己的“神经绘画”
神经网络可以做很多事情。它们可以解读图像,理解我们的声音,翻译对话…
www.makeuseof.com](http://www.makeuseof.com/tag/create-neural-paintings-deepstyle-ubuntu/) [## 风格转移实验
风格转换是以其他图像的风格重新组合图像的技术。这些大多是使用…
genekogan.com](http://genekogan.com/works/style-transfer/) [## 神经类型解释
本文提出了一种艺术风格的神经算法,详细介绍了如何从给定的图像中提取两组特征
kvfrans.com](http://kvfrans.com/neural-style-explained/) [## 神经风格转移-新媒体新技术 2017
莱顿媒体技术硕士 2017 春季学期新媒体新技术课程学生的网站…
sites.google.com](https://sites.google.com/site/newmedianewtechnology2017/portfolios/anna/neural-style-transfer) [## 极端风格机器:使用随机神经网络生成纹理
等等,什么!基于完全随机神经网络生成高质量图像?这就是不合理的…
nucl.ai](https://nucl.ai/blog/extreme-style-machines/) [## 使用神经算法添加或删除画家的风格
伦敦的新媒体艺术家凯尔·麦克唐纳告诉创造者项目,他是如何劫持“深度梦”式的网络来…
creators.vice.com](https://creators.vice.com/en_us/article/nz44gm/add-or-delete-a-painters-style-using-neural-algorithms)
使用神经风格转移/深度照片风格转移的公司
人工智能把你的照片变成艺术
deepart.io](https://deepart.io/) [## 神经风格|艺术风格的神经算法
用艺术风格的神经算法生成艺术品
neuralstyle.com](http://neuralstyle.com/) [## 皮卡佐——创造艺术
创造源源不断的生产质量的艺术。把照片变成画,或创造全新类型的图像…
www.pikazoapp.com](http://www.pikazoapp.com/) [## Instapainting
免费使用在线神经网络照片绘画生成器。
www.instapainting.com](https://www.instapainting.com/ai-painter) [## 神经泰勒
将您的视频/照片/GIF 变成艺术
neuralstyler.com](http://neuralstyler.com/)
JC Johnson 神经式代码的 Docker 实现
https://hub.docker.com/r/ffedoroff/neural-style/
音频纹理合成和风格转换
通过 Dmitry Ulyanov 和 Vadim Lebedev,我们提出了一种扩展的纹理合成和风格转换方法。
dmitryulyanov.github.io](https://dmitryulyanov.github.io/audio-texture-synthesis-and-style-transfer/) [## DmitryUlyanov/神经风格音频 tf
用于音频神经类型的神经类型音频 tf 张量流实现。
github.com](https://github.com/DmitryUlyanov/neural-style-audio-tf) [## DmitryUlyanov/神经风格音频火炬
神经风格音频火炬火炬实现音频神经风格。
github.com](https://github.com/DmitryUlyanov/neural-style-audio-torch) [## vadim-v-lebe dev/audio _ style _ transfer
在 GitHub 上创建一个帐户,为 audio _ style _ tranfer 开发做出贡献。
github.com](https://github.com/vadim-v-lebedev/audio_style_tranfer)
Reddit 线程
Mathematica(堆栈交换)
在《艺术风格的神经算法》一文中。描述提取内容的过程…
mathematica.stackexchange.com](https://mathematica.stackexchange.com/questions/136704/how-to-implement-neural-style-transfer)
感谢您的阅读。
如果你想取得联系,你可以通过ahikailash1@gmail.com联系我
关于我:
我是 MateLabs 的联合创始人,我们在那里建立了 Mateverse ,这是一个 ML 平台,使每个人都可以轻松地建立和训练机器学习模型,而无需编写一行代码。
注:最近,我出版了一本关于 GAN 的书,名为《生成性对抗网络项目》,书中涵盖了大部分广泛流行的 GAN 架构及其实现。DCGAN、StackGAN、CycleGAN、Pix2pix、Age-cGAN 和 3D-GAN 已在实施层面详细介绍。每种架构都有专门的一章。我已经使用 Keras 框架和 Tensorflow 后端用非常简单的描述性语言解释了这些网络。如果你正在开发 GANs 或者打算使用 GANs,请阅读一下,并在ahikailash1@gmail.com与我分享你的宝贵反馈
[## 生成对抗网络项目:使用 TensorFlow 构建下一代生成模型…
探索使用 Python 生态系统的各种生成性对抗网络架构关键特性使用不同的…
www.amazon.com](https://www.amazon.com/Generative-Adversarial-Networks-Projects-next-generation/dp/1789136679)
你可以从http://www . Amazon . com/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679https://www . Amazon . in/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679?FB clid = iwar 0 x2 pdk 4 ctxn 5 gqwmbbkigib 38 wmfx-sqcpbni 8k 9z 8 I-kcq 7 vwrpjxm 7 Ihttps://www . packtpub . com/big-data-and-business-intelligence/generative-adversarial-networks-projects?FB clid = iwar 2 otu 21 fam fpm 4 suh _ HJmy _ drqxovwjzb0k z3 zis bfb _ MW 7 inycqqv7 u 0 c
在 Python 备忘单中导入数据
有了这个 Python 备忘单,您将有一个方便的参考指南来导入您的数据,从平面文件到其他软件和关系数据库的本地文件。
在进行任何数据清理、争论、可视化之前,……您需要知道如何将数据放入 Python。如您所知,有许多方法可以将数据导入 Python,这也取决于您正在处理的文件。
然而,您将最经常使用 pandas 和 NumPy 库:pandas 库是数据科学家进行数据操作和分析的最受欢迎的工具之一,仅次于用于数据可视化的 matplotlib 和 NumPy,后者是构建 Pandas 的 Python 中科学计算的基础库。
在这份用 Python 导入数据的备忘单中,您会发现一些 NumPy 和 pandas 函数,以及用 Python 编程语言构建的函数,它们将帮助您快速获取 Python 中的数据!
本快速指南帮助您学习在 Python 中导入数据的基础知识,您将需要开始清理和整理您的数据!
找到小抄 这里 。
Python 备忘单中的导入数据将指导您完成在工作空间中获取数据的基本步骤:您不仅将学习如何导入文本文件等平面文件,还将了解如何从 Excel 电子表格、Stata、SAS 和 MATLAB 文件以及关系数据库等其他软件的本地文件中获取数据。除此之外,您将获得更多关于如何寻求帮助、如何导航文件系统以及如何开始探索数据的信息。
简而言之,用 Python 启动数据科学学习所需的一切!
你想了解更多吗?现在就开始免费学习 Python 课程中的导入数据,或者尝试我们的 Python Excel 教程!
此外,不要错过我们针对数据科学的 Python 备忘单,或者我们社区中的许多其他内容!
最初发表于【www.datacamp.com】。
在 Python 中导入数据
关于导入不同数据的不同方法的总结很少
最近,我在 DataCamp 完成了两门关于 Python 中数据导入的课程,我对可以用来获取数据的资源数量感到非常惊讶。在这里,我想总结所有这些方法,同时敏锐我的知识。我也认为对其他人来说这也是有用的。那么,我们开始吧。
有各种各样的文件可以用作数据源:
- 平面文件— csv、txt、tsv 等。
- 腌制的文件
- excel 电子表格
- SAS 和 Stata 文件
- HDF5
- 矩阵实验室
- SQL 数据库
- 网页
- 蜜蜂
平面文件
平面文件——txt、CSV——很容易,使用 numpy 或 pandas 导入它们的方法很少。
numpy.recfromcsv —加载存储在逗号分隔文件中的 ASCII 数据。返回的数组是记录数组(如果 usemask=False,请参见 recarray)或被屏蔽的记录数组(如果 usemask=True,请参见 ma.mrecords.MaskedRecords)。
data = np.recfromcsv(file)
numpy.loadtxt —该函数旨在成为简单格式文件的快速阅读器。 genfromtxt 函数提供了更复杂的处理,例如,具有缺失值的行。
data = np.loadtxt('file.csv', delimiter=',', skiprows=1, usecols=[0,2])
numpy.genfromtxt —从文本文件中加载数据,缺失值按指定处理。更复杂的函数,有许多参数来控制您的导入。
data = np.genfromtxt('titanic.csv', delimiter=',', names=True, dtype=None)
有了 pandas,这就更容易了——一行代码就可以把你的文件放在一个数据帧中。还支持可选的迭代或者将文件分成块。
data = pd.read_csv(file, nrows=5, header=None, sep='\t', comment='#', na_values='Nothing')
泡菜
泡菜是什么鬼东西?它用于序列化和反序列化 Python 对象结构。python 中的任何对象都可以被腌制,以便保存在磁盘上。pickle 所做的是在将对象写入文件之前先“序列化”对象。Pickling 是一种转换 python 对象(list、dict 等)的方法。)转换成字符流。这个想法是,这个字符流包含在另一个 python 脚本中重建对象所需的所有信息。下面的代码将打印一个在某处创建并存储在文件中的字典——很酷,不是吗?
import pickle
with open('data.pkl', 'rb') as file:
d = pickle.load(file)print(d)
擅长
pandas.read_excel 将 excel 表格读入 pandas 数据框架,并有许多自定义数据导入功能,这是前所未有的愉悦(听起来像电视广告:D)。但这是真的——这个函数的文档非常清楚,您实际上可以对这个 Excel 文件做任何您想做的事情。
df = pd.read_excel('file.xlsx', sheet_name='sheet1')
SAS 和 Stata
SAS 代表统计分析软件。SAS 数据集包含组织为观察值(行)和变量(列)表的数据值。要打开这种类型的文件并从中导入数据,下面的代码示例会有所帮助:
from sas7bdat import SAS7BDAT
with SAS7BDAT('some_data.sas7bdat') as file:
df_sas = file.to_data_frame()
Stata 是一个强大的统计软件,使用户能够分析、管理和生成数据的图形可视化。它主要由经济学、生物医学和政治学领域的研究人员用来检查数据模式。数据存储在。dta 文件,最好的导入方式是 pandas.read_stata
df = pd.read_stata('file.dta')
HDF5
分层数据格式(HDF)是一组文件格式(HDF4、HDF5),旨在存储和组织大量数据。HDF5 是一种独特的技术套件,能够管理极其庞大和复杂的数据集合。HDF5 简化了文件结构,仅包含两种主要类型的对象:
- 数据集,是同质类型的多维数组
- 组,是可以容纳数据集和其他组的容器结构
这就产生了真正的分层的、类似文件系统的数据格式。事实上,甚至可以使用类似 POSIX 的语法 /path/to/resource 来访问 HDF5 文件中的资源。元数据以用户定义的命名属性的形式存储在组和数据集上。然后可以使用数据集、组和属性构建更复杂的表示图像和表格的存储 API。
为了导入 HDF5 文件,我们需要 h5py 库。下面的代码样本让一切变得更简单,对我来说完全可以理解。
import h5py # Load file:
data = h5py.File('file.hdf5', 'r') # Print the keys of the file
for key in data.keys():
print(key)# Now when we know the keys we can get the HDF5 group
group = data['group_name'] # Going one level deeper, check out keys of group
for key in group.keys():
print(key)# And so on and so on
矩阵实验室
很多人用 MATLAB 工作并将数据存储在。mat 文件。那些文件是什么?这些文件包含 MATLAB 工作空间中分配给它们的变量和对象的列表。不足为奇的是,它在 Python 中作为字典导入,其中的键是 MATLAB 变量和值——分配给这些变量的对象。为了读写 MATLAB 文件使用了 scipy.io 包。
import scipy.io
mat = scipy.io.loadmat('some_project.mat')
print(mat.keys())
关系数据库
使用驱动程序连接到数据库,我们可以直接从那里获取数据。通常它意味着:创建连接、连接、运行查询、获取数据、关闭连接。一步一步来做是可能的,但是在熊猫身上,我们有一个很棒的功能来为我们做这件事,所以为什么要自寻烦恼呢?它只需要一个可以用 sqlalchemy 包创建的连接。下面是连接到 sqlite 数据库引擎并从中获取数据的示例:
from sqlalchemy import create_engine
import pandas as pd
# Create engine
engine = create_engine('sqlite:///localdb.sqlite')# Execute query and store records in DataFrame
df = pd.read_sql_query("select * from table", engine)
来自网络的数据
应该就此写一篇单独的文章,但我将强调几件事,至少知道从哪里开始。首先,如果我们有一个文件的直接 url,我们可以使用标准的pandas . read _ CSV/pandas . read _ excel函数在参数“file=”中指定它
df = pd.read_csv('https://www.example.com/data.csv', sep=';')
除此之外,要从 web 获取数据,我们需要使用 HTTP 协议,尤其是 get 方法(有很多这样的方法,但是对于导入,我们不需要更多)。包请求在这方面做得非常出色。要从 requests.get 收到的响应中访问文本,我们只需使用 method .text。
import requests
r = requests.get('http://www.example.com/some_html_page') print(r.text)
r.text 会给我们一个包含所有 html 标签的网页——不是很有用,不是吗?但是有趣的事情开始了。我们有一个 BeautifulSoup 包,它可以解析 HTML 并提取我们需要的信息,在本例中是所有超链接(继续前面的例子):
from bs4 import BeautifulSoup
html_doc = r.text # Create a BeautifulSoup object from the HTML
soup = BeautifulSoup(html_doc)# Find all 'a' tags (which define hyperlinks)
a_tags = soup.find_all('a') # Print the URLs to the shell
for link in a_tags:
print(link.get('href'))
应用程序接口
在计算机编程中,应用编程接口(API)是一组子例程定义、通信协议和用于构建软件的工具。一般来说,它是各种组件之间的一组明确定义的通信方法。有许多不同的 API,首先要做的是检查文档,但事实是几乎所有的 API 都以 JSON 格式返回数据。我们必须能够捕捉到结果。并且再次打包的请求会帮我们处理。(我们必须发送 HTTP GET 请求来从 API 获取数据)。
import requests
r = requests.get('https://www.example.com/some_endpoint') # Decode the JSON data into a dictionary:
json_data = r.json()# Print each key-value pair in json_data
for k in json_data.keys():
print(k + ': ', json_data[k])
正如我们所见,数据无处不在,我们必须知道获取数据的所有方法。至此,我的简短总结到此结束。希望它不仅对我有用。
将数据导入 R:数据科学项目的第一步
本文的目的是为您迈向数据科学项目的第一步提供快速查阅指南。
在导入数据之前,数据科学家需要确定手头问题所需的相关数据源。数据收集和数据管理是任何数据相关项目成功的基石。每个企业都有一个专门的数据管理团队,他们不断努力识别不同的数据源,并提取、转换和加载数据(也称为 ETL)到一个名为数据仓库的中央存储库。
这个主题非常庞大,因此超出了本文的范围,但在我看来,这是一个非常重要的概念,任何有抱负的数据科学家都应该理解。
一旦确定了数据源,就可以将它导入到 R 中进行进一步的分析。R 中有多个函数专门针对您的数据文件类型(例如 CSV、TXT、HTML、XLSX 等)。)
将 TXT/CSV 文件导入到 R
使用基本函数
下表根据文件格式总结了将数据导入 R 的基本功能(即不需要额外安装软件包)。
上表中的每个函数都有一组默认参数,这使得它们与其他函数不同。这些论点是:
- **表头:**逻辑值。如果为 TRUE,该函数假定您的文件有一个标题行。如果不是这样,您可以添加参数 header = FALSE。
- **填充:**逻辑值。如果为 TRUE,长度不等的行将隐式添加空白字段。
- sep: 字段分隔符。例如,“\t”用于制表符分隔的文件。
- dec: 文件中用于小数点的字符。
- stringsAsFactor 是另一个重要的参数,如果您不希望您的文本数据被转换为因子,应该将其设置为 FALSE。
小心!如果不显式设置上述参数,函数将采用默认的参数值。
在上述每个函数中,您还需要指定文件名(如果它在您的本地机器上)或 URL (如果文件位于 web 上)。
读取本地文件
要在您的计算机上查找文件,您可以遵循以下方法之一:
- 使用命令**setwd(" "**将您的工作目录设置为指向包含您的文件的文件夹,然后在函数中提供文件名。
- 使用导入功能内的 file.choose() 。这使您可以从您的机器上交互式地选择文件。
提示: read.table() 是一个通用函数,可以用来读取任何表格格式的文件,只要你按照自己的要求设置参数。数据将作为数据框导入。例如,如果您有一个包含由“|”分隔的数据字段的文本文件,您可以使用下面的命令:
使用 readr 软件包
这个包中的函数的使用方式与基本函数类似。 readr 包比基本函数快得多(超过 10 倍),因此,对于大型 TXT 或 CSV 文件非常有用。
- delim :数据文件中分隔数值的字符。
- col_names :可以是 TRUE(默认值)、FALSE 或指定列名的字符向量。如果为 TRUE,输入的第一行将用作列名。
与基本函数类似,在上述每个函数中,您还需要指定文件名(如果它在您的本地机器上,或者使用 file.choose()) 或 URL (如果文件位于 web 上)。
摘要
在本文中,我们了解了根据数据量、文件位置和数据分隔符将 TXT/CSV 文件导入 R 的不同方法。对于基本函数,不需要安装额外的包,而对于高级函数,您首先需要安装包(例如,在我们的例子中是 readr ),然后调用库来使用这些函数。
(首发@www.datacritics.com)
2018 年奥莱利 AI Conf 的印象和教训
AI superstar and the author’s personal hero, Peter Norvig, giving his keynote a the AI Conf 2018
我最近参加了奥莱利人工智能大会 2018 。我写这篇文章是为了分享我的经历,以及我从朋友和同事那里学到的一些东西。我评论了我认为是会议的主要主题:人工智能用于客户支持,人类在循环中以及人工智能在劳动力中的影响,深度学习(DL)和强化学习(RL),部署人工智能和自动机器学习(Auto-ML)的云。最后,我从演讲者那里收集了一些发人深省的话。
还有,这里是许多演示的幻灯片。
会议的主题
人工智能客户支持
很大一部分实际上使用人工智能或人工智能将数据投入工作的公司都是在客户支持和定制或用户体验领域这样做的。这方面值得注意的例子有:
- 优步,他利用深度学习开发了自然语言处理模型来分类和建议对客户门票的回应,这体现在他们的客户痴迷门票助手( COTA-v2 )中。
- 美国电话电报公司,他开发了一个 LSTM 网络(一种递归神经网络)来产生一个模型,该模型描述了客户在与公司互动时将遵循的接触点(渠道)序列,以及这些互动的结果(他们是否购买了产品或服务,以及通过什么渠道购买的)。
- 加州蓝盾公司,他们将他们部署的聊天机器人视为其全渠道客户服务战略不可或缺的一部分。然而,他们强调,最成功的聊天机器人不会自己工作。它们总是建立在良好的数据基础设施之上,包括开发良好的 API 和微服务。
人在回路中以及人工智能对劳动力的影响
有很多人说人工智能不应该(完全)取代人类,而是让他们的工作更高效、更强大、更令人满意。此外,至少目前,人类仍然有助于开发人工智能解决方案,这是因为一个简单的事实,即大多数专家知识包含在人类专家的大脑中,他们是唯一能够准确地对训练 ML 算法所需的数千个数据点进行昂贵的标记的人。
The main two axes of human vs. AI replacement / collaboration / augmentation.
还有中间的方法,比如主动学习,基于半监督方式的人与机器协作的思想。也就是说,让机器处理简单的例行案件,而将困难/边缘案件交给人类专家。当然,这在一些应用中是可行的,在这些应用中,不服从于自动决策的困难情况很容易识别,并且在所有情况中占少数。
深度学习和强化学习风靡一时
对于大多数读者来说,深度学习将自己定位为 ML 模型的事实上的架构可能不是什么新闻。也许是因为会议在加州举行,而且谷歌是会议赞助商之一,所以有大量关于 TensorFlow 的演示。顺便说一下,会后我和我的一些好朋友聊过,他们实际上是 DL 研究者,他们非常肯定 PyTorch 是运行 DL 实验的一个更好的框架。
Peter Norvig 做了一个精彩的主题演讲,讲述了近年来非数字逻辑专家在科学问题上的惊人应用。从天文学应用(引力透镜、系外行星探测),到医学应用(用 CV 、评估心血管风险因素、高中生识别癌症、用基于 DL 的应用、追踪奶牛、),一直到农业应用(识别生病的木薯植物)。
两位年轻的微软研究人员(Danielle Dean 和 Wee Hyong Tok)就深度学习中的“最佳秘密”进行了一次非常精彩的演讲。简而言之,迁移学习是一种利用深度网络中编码的知识来解决不同问题的技术,这些知识是由专家在大型数据集上精心训练的。举例来说,被训练来解决对象分类任务的深度网络可以用相对较少的工作来翻新,以解决另一个计算机视觉任务,例如纹理分类。这是通过将网络用作特征并仅在可能很小的数据集上重新训练最后一层来实现的。
The texture classification problem trained on a rather small dataset, but solvable via transfer learning!
云(几乎)是部署 AI/ML 解决方案的唯一地方
考虑到最先进的 ML 和 AI 解决方案所需的复杂硬件和软件配置,基于云的基础设施占优势就不足为奇了。在这方面最好的贡献之一是来自谷歌的 Levent Besik 的主题演讲,他在演讲中概述了该公司“使人工智能民主化,并使其对所有开发人员&用户变得容易和有用”的努力,无论他们在人工智能的技术或科学方面的专业知识程度如何。谷歌的产品包括三个抽象层次。在最底层,人们可以找到平台( ml-engine 、数据流和 dataproc 云服务)和库(TensorFlow、Keras、Spark)层,供想要“从零开始”创建解决方案的开发人员使用接下来是 AI 构建模块,它们本质上是成熟的 API,用于解决定义明确的问题,如语言翻译、语音转录或图像识别。在最高级别,我们可以找到模板解决方案,如产品推荐引擎或客户联络中心。
Amazon Web Services (AWS) 提供了一套服务和平台,用于开发和部署 ML,遵循相同的一般原则。然而,我感觉 AWS 产品的一些组件,比如亚马逊 Sagemaker 比谷歌的同类产品更成熟、更完整、总体设计更好。
The AWS ML Stack. Image reproduced with permission from AWS.
自动毫升
如果你是一名数据科学家或人工智能解决方案开发人员,在不久的将来,你也有可能被一台机器取代。Auto-ML 技术承诺从数据预处理到超参数调整、模型选择和部署,对 ML 模型构建的最复杂方面进行端到端的抽象和自动化。简而言之,Auto-ML 服务将数据集(可能是脏的,甚至不需要包含标签)作为输入,并输出已经部署的 ML 模型,包括 REST-API 和一切!
Google Cloud’s AutoML solution to generate image classification.
H2O 是另一家展示了这方面有趣发展的公司。
考虑到我认为自己是一个 ML 实践者(我讨厌数据科学家这个术语),我仍然对 Auto-ML 技术持怀疑态度就不足为奇了。很难想象一个完全自动化的过程能够成功地执行 ML 模型创建中所有困难的基于经验和直觉的决策。例如,巧妙的特征工程是一件特别难自动化的事情。然而,最近在 Auto-ML 方面的进展,如谷歌所展示的,他们已经成功地开发了设计其他神经网络的神经网络,这让我怀疑自己。
行情
最后,我会给你留下一些我觉得有趣、有启发性或发人深省的引言:
“我们做的许多人工智能的东西除了营销之外没有商业价值。”——本·泰勒。
“80%的 ML 工作负载运行在 AWS 上”——Hagay lupes go,AWS。
“[在]2000 万开发人员中,100 万是数据科学家,1000 名是深度学习研究人员”——Levent Besik,谷歌云。
“一些公司有许多‘好想法’(供 AI/ML 使用),但无法量化价值。如果这个想法是从“这不是很酷吗……”开始的,这可能是个坏主意。”——本·泰勒。
“82%的组织正处于考虑采用人工智能的某个阶段。进行试点非常容易,但部署起来却非常困难……高管们正专注于客户保持率和满意度,以及客户获取成本的降低。”— 马尼什·戈亚尔,IBM
“实施人工智能的障碍:缺乏熟练的资源或技术专长,监管限制。关于数据和信息使用的法律、安全、隐私问题。”— 马尼什·戈亚尔,IBM
“在未来,你将会看到负担得起的、智能的、云驱动的、个性化的假肢设备”——约瑟夫·西罗什,微软
“我们正在进入一个机器和软件可以分析的世界(看到以前总是隐藏的模式);优化(告诉飞机每英里飞行的高度,以获得最佳的燃油效率);预言(告诉你你的电梯什么时候会坏,在它坏之前修好它);定制(为您量身定制任何产品或服务)并数字化和自动化任何工作。这正在改变每一个行业。”《地球是平的》的作者汤姆·弗里德曼,纽约时报
“ML 所做的只是提供推论。科学的商业方法。业务人员很容易联想到推理…数据科学不太适合敏捷方法”——AWS 的 Carlos Escapa
The fourth waves of AI — Image taken from Sinovation ventures presentation.
用元学习和无可能性推理改进你的科学模型
CMS Particle Detector in the LHC accelerator at CERN. Comparison between reality and simulation (with Geant4)
无似然推理的介绍和论文无似然推理的递归机器的提炼,发表于 NeurIPS 2018 元学习研讨会。
亚瑟·佩萨与 安托万·魏汉高 共同撰写的文章
动机
提出新的科学理论通常有两种方式:
- 从基本原理出发,推导出相应的定律,并提出实验预测以验证理论
- 从实验出发,推断出解释你的数据的最简单的规律。
统计学和机器学习在科学中的作用通常与第二种推断有关,也叫归纳。
例如,想象一下,你想在一个环境中模拟两个种群(比如狐狸和兔子)的进化。一个简单的模型是 Lotka-Volterra 微分方程:你考虑一个事件发生的概率,比如“一只狐狸吃了一只兔子”、“一只兔子出生了”、“一只狐狸出生了”等等。在很短的时间间隔内发生,根据这些概率推导出一组微分方程,通过求解这些方程来预测两个动物种群的进化。通过将您的预测与真实群体的进化进行比较,您可以推断出该环境中的最佳模型参数(概率)。
现代理论需要模拟才能与观测联系起来。它可以是一个简单的微分方程解算器,如洛特卡-沃尔泰拉模型,也可以是一个复杂的蒙特卡罗模拟器,如他们在粒子物理学中使用的那样。
通过将模拟的结果(即模型的预测)与真实数据进行比较,就有可能知道模型的正确性并相应地进行调整。如果这种在模型和实验数据之间来回转换的过程通常是手动完成的,那么任何机器学习从业者都会问的问题是:我们可以自动完成吗?我们能否建造一台机器,将可调整的模拟器和真实数据作为输入,并返回最符合真实数据的模拟器版本?
这是我们最近工作的目标[1],我们训练了一个神经网络来提出模拟器调整的最佳序列,以便逼近实验数据,利用了无似然推理和元学习领域的最新进展。
无似然推断
让我们用更正式的方式重新表述我们的问题。我们可以通过一个随机函数来建模一个模拟器(也叫生成模型),这个随机函数取一些参数 θ ,返回从某个分布中抽取的样本 x (所谓的模型)。
这种形式主义适用于任何包含随机性的科学理论,因为这在现代科学中非常常见(粒子碰撞受本质上随机的量子物理定律支配,生物过程或化学反应经常发生在嘈杂的环境中,等等)。).
实验数据存在于与模拟器输出相同的空间中的一组点中。推理的目标是找到参数 θ ,使得模拟器生成尽可能接近真实数据的点。
使用这种模拟器的科学领域包括:
- 群体遗传学。型号: 聚结理论。**观察:**一个当前种群的 DNA。**参数:**共同祖先的 DNA。
- 高能粒子物理学。模型:粒子物理的标准模型。**观察:**碰撞时探测器的输出。**参数:**标准模型的耦合常数(像粒子的质量或者不同力的强度)。
- 计算神经科学。**模型:**霍奇金-赫胥黎模型。**观察:**一个神经元激活后电压的演变。参数:神经元的生物物理参数。
那么,在给定一些真实观测值的情况下,我们如何预测模拟器的参数呢?让我们考虑一个简单的高斯模拟器的例子,它采用一个向量 θ= (μ , σ)作为参数,并返回来自高斯分布𝓝(μ , σ)的样本。
推断这种模拟器参数的经典方法被称为最大似然估计。在由 θ 参数化的概率分布 P 下,真实数据点 X 的可能性(模拟器)定义为 P(X| θ )。这意味着,如果大多数数据点位于高密度区域,则可能性很高。因此,模型的最佳参数通常是最大化真实数据可能性的参数。如果您不熟悉基于可能性的推理,您可以阅读这一对主题的精彩介绍。
如果您可以明确访问模拟器的基本概率分布以及该分布的梯度,例如,您可以在参数空间中执行梯度下降,以最大化可能性并推断模型的最佳参数。
然而,许多现实生活模拟器有一个难以处理的可能性,这意味着显式概率分布太难计算(无论是分析还是数值)。因此,我们必须找到新的方法来推断最佳参数,而不使用似然函数或其梯度。
总之,我们有一个黑盒随机模拟器,它可以获取参数并从未知的概率分布中生成样本,以及我们能够与生成的数据进行比较的真实数据。我们的目标是找到引导模拟器生成尽可能接近真实数据的参数。该设置称为无可能性推理。
我们如何进行无可能性推断?
让我们试着逐步想出一个解决问题的方法。我们可以做的第一件事是从一个随机参数开始,并模拟相应的数据:
Representation of the two spaces of interest. The true parameter (that we wish to infer) is the red point on the left. The real data correspond to the red cloud of points on the right. We start by choosing a random parameter θ (in gray on the left) and simulating the corresponding data points (in gray on the right)
通过这样做,我们可以看到我们生成的数据离真实数据有多远,但是我们无法知道在参数空间中该往哪里走。相反,让我们模拟几个参数:
为此,我们考虑参数空间中的一种分布,称为建议分布,并注明 q(θ|ψ)。如果我们选择 q 为高斯分布,我们将得到ψ=(μ , σ)。第一步是随机初始化ψ。在上图中,为了简单起见,我们考虑了ψ=μ。然后,我们可以执行以下步骤,直到收敛:
- 从方案分布中抽取几个参数:图中ψ周围有 4 个参数。
- 从它们生成数据:右边的 4 个点云。
- 选择一个好的前进方向。
第三步是艰难的。直观地说,您希望将ψ移向橙色和绿色参数,因为相应的预测(点的橙色和绿色云)与实际数据最接近。一组称为自然进化策略【3】的方法允许您将每个θ的表现(就其预测和实际数据之间的相似性而言)与参数空间中的一个方向联系起来。最近的一篇论文[4]例如利用生成敌对网络(GAN)给出的相似性度量来寻找最佳方向。尽管这些算法在一般情况下表现良好,但人们可能想知道,对于给定的模拟器,是否不可能找到更好的算法来利用该模拟器的特定特性。这就是元学习发挥作用的地方!
优化的元学习
元学习背后的理念是学习如何学习,在我们的案例中是学习优化过程。本文介绍的通过梯度下降学习通过梯度下降学习【2】的主要思想是在每次迭代中使用递归神经网络(RNN)来寻找最佳下降方向。下面是由随机初始化的 RNN 产生的点序列的例子:
每个下降方向都是随机的,产生的最后一点离最小值很远。在训练过程中,它应该学会利用每个点上的梯度信息,以便向最小值移动,给出如下结果:
那么如何训练它呢?生成许多你知道其最小值的函数,并要求 RNN 函数最小化序列最后一点与实际最小值之间的距离。
学习学习科学模型
在无似然推理的情况下,给定实际观测值和每一步生成的点云,RNN 应返回一系列建议参数ψ。
现在,和学习通过梯度下降学习一样,我们如何训练 RNN?这里,技巧是生成许多随机参数θ,并假设每个参数都是“真实参数”。然后,我们可以模拟生成的每个θ,并获得一组“真实观察”。然后,可以通过向 RNN 传递这些真实的观察结果,查看其最终的方案分布,并将其与真实参数(我们知道是因为我们生成了它)进行比较,从而对其进行训练。
让我们通过一个例子来澄清这一切。在下图中,提案分布以颜色表示(红色=高密度)。开始时,RNN 是随机初始化的,我们用第一个生成的真实参数θ(红色)对其进行评估。
然后我们可以把损失转嫁到 RNN 身上。对 200 个不同的“真实参数”重复这个过程后,应该是这样的:
我们可以看到,它已经学会了利用观测空间的信息向好的参数移动。
结果
我们在不同的玩具模拟器上评估了我们的模型,有些我们知道可能性,有些不知道。
非似然问题:泊松模拟器
Example of Poisson distributions for various parameters. Source: Wikipedia
第一个模拟器采用参数λ,并从泊松分布 P(λ)中抽取样本。这个例子的目的是看我们是否获得与最大似然估计相当的性能。结果如下:
Comparison of ALFI (Automatic Likelihood-Free Inference, the name of our model), to a maximum likelihood estimator (MLE). Those box-plots represent the distribution of the mean-squared errors between the true parameters and the expected value of the final proposal distributions.
我们可以看到,性能是可比的,即使我们没有给我们的模型访问的可能性。
无可能性问题:粒子物理模拟器
为了评估我们的模型在一个真正的无可能性的设置,我们考虑了一个简化的粒子物理模型,模拟了一个电子和一个正电子碰撞变成一个μ子和一个反μ子。
Feynman diagram of the simulated process
模拟器的参数是入射粒子的能量和费米常数,输出是两个μ子之间的角度。
为了评估我们的方法,我们比较了真实的观察值和由最后一个发现的参数生成的观察值。结果如下:
Results of our method on a simple particle physics model. Comparison of the real observations (angles of the produced particles) with the ones generated by our predicted parameter.
讨论
我们看到了什么是无可能性推理,以及元学习如何通过学习模拟器调整的最佳序列来解决这个问题,以使模型符合现实。
与大多数元学习模型一样,它的一个局限是难以训练。我们很难将我们的方法扩展到更复杂的模拟器,因为元训练需要大量的模拟器调用,这在现实世界中可能非常慢。然而,随着元学习领域的进步,我们希望出现新的方法来缓解这个问题,并使其更具可扩展性。
参考
[1] A. Pesah,A. Wehenkel 和 G. Louppe,无似然推理的递归机器 (2018),NeurIPS 2018 元学习研讨会
[2] M. Andrychowicz,M. Denil,S. Gomez,M. W. Hoffman,d .普法乌,T. Schaul,B. Shillingford,N. de Freitas,通过梯度下降学习梯度下降 (2016),NIPS 2016
[3] D. Wierstra,T. Schaul,T. Glasmachers,Y. Sun,J. Peter,J. Schmidhuber,自然进化策略 (2014),机器学习研究杂志(JMLR)。
[4] G. Louppe,J. Hermans,K. Cranmer,不可微模拟器的对抗性变分优化 (2017),arXiv 电子版 1707.07113
图像来源
利用文本挖掘改进 Airbnb 收益预测
Stunning views from an Airbnb I stayed at in Tasmania. Because no one wants to start reading an article with a graph.
介绍
Airbnb 是一个受欢迎的家庭共享平台,让世界各地的人们分享他们独特的住宿。对于潜在的主人来说,这可能是一个有利可图的选择,因为他们有空的度假屋、多余的房间甚至是多余的床。然而,新主人很难知道他们能挣多少钱,特别是,与宜家的普通公寓相比,他们心爱的配有设计师家具的顶层公寓的真正价值是什么?
我在 Udacity 完成机器学习 Nanodegree 的同时,抓住机会解决了这个问题,并为 Airbnb 房源的潜在收益建立了一个预测模型。该模型考虑了文本描述,以捕捉单个列表的丰富的定性模型。我也住在伦敦,自然决定在这里为 Airbnb 房源建模,以利用我的领域知识。
完成这个项目带来了一些有趣的见解,并激励我与其他数据科学爱好者分享这些成果。在这篇文章中,我简要介绍了项目工作流程,并以一种更方便读者的方式讨论了其中的见解。对于技术头脑,整个项目和支持代码可以在我的公共 GitHub 上找到。
这篇文章的其余部分分为四个主题:
- **数据探索和操作:**对数据集和描述性见解的讨论。
- **文本挖掘列表描述:**用于分析语料库和执行主题建模的管道。
- **训练机器学习模型:**特征工程,模型选择和调优。
- **结果和可视化:**可视化文本数据和见解。
数据探索和操作
获取数据
为了建立这个模型,我使用了 Airbnb 内部的提供的数据集,在那里,关于一个城市的 Airbnb 房源的公开信息已经被搜集并发布,供独立的非商业用途使用。这包括详细的列表信息,如房间数量、位置、文本描述、价格和评论数量。
Sample of the dataset.
具体来说,我使用了 2016 年 10 月 3 日至 2017 年 3 月 4 日期间伦敦房源的详细信息。主动列表被定义为在此期间至少被审核过一次的资产。兼职列表、不完整列表和新列表也将被删除。数据清理后,数据集有 9722 行和 16 列。
我们如何衡量潜在收益?
为了建立这个模型,收益率的概念被用作潜在未来收益的代理。收益的定义是一项资产一年的收入。Airbnb“三藩市模式”中基于价格、平均停留时间和审核率的收益计算使用:
平均停留时间价格评论数/月评论率***
在伦敦,假设平均停留时间为 3 晚。相对保守的 50%的点评率用于将点评数量转换为预计预订量。这种占用模式是预算和立法分析师办公室与 Airbnb 自己的估计之间的中间地带。
Distribution of Price (£), Reviews/Month, and Annual Yield (£)
分析价格、评论和最终收益的分布,伦敦的大部分房源价格低于 100 英镑/晚,每月收到 1-4 个预订。这表明入住率为 10-50%(取决于所选的点评率),AirBnb 主机平均每年为每份房源赚取 15,739 英镑。对于上四分位数的上市公司,这一数字高达 21,480 英镑。从这些数字来看,伦敦市长办公室报告的伦敦市中心住宅租金中位数为 7800 英镑,这表明积极管理的房源有着健康的溢价。
文本挖掘列表描述
现在,我们已经有了一个经过处理的数据集,并了解了我们试图预测的内容,我专注于将描述文本转换为对机器学习模型有用的特征。
Sample of listings description field.
在自然语言处理(NLP)行话中,描述文本的集合(左边的摘录)被称为语料库。这被转换成文档术语矩阵,其中每个列表是包含术语矩阵的文档。NLTK 和 gensim 包被用来完成这个任务。
为了减少术语的数量并关注每个文档中最重要的术语,删除了非英语和停用词。单词也是词汇化的,正则表达式标记器用于忽略非字母数字字符串。剩余的单词然后被转换成文档术语矩阵的单词包表示(单词 id、单词频率二元组的列表)。
这样,我们可以使用潜在狄利克雷分配(LDA) 来发现语料库中固有的主题,根据学习到的主题对语料库进行分类,并将它们用作回归模型的特征。
LDA 是一种生成贝叶斯推理模型,它将每个文档与主题的概率分布相关联,其中主题是单词的概率分布。这是一种分析大量文本的有效方法,也是一种更加人性化的主题建模方法。
主题模型在下面的主题间距离图中可视化,使用了出色的 pyLDAvis 包。在这种可视化中,圆圈的面积代表每个主题的流行程度,而右边条的长度代表某个术语在特定主题中的成员资格。例如,下面的主题 1 是最普遍的,在主题 1 中,与整个语料库中术语的总术语频率(蓝色和红色区域)相比,术语“步行”具有最高的估计术语频率(红色区域)。
Visit https://cdn.rawgit.com/joaeechew/udacity_capstone/481e85b0/lda.html for an interactive version
我选择将文档术语分成 3 个主题,因为它允许非常不同的主题没有重叠,这使得对每个列表进行分类是一个明智的选择。根据每个主题中的热门术语,列表的主题可以描述为:
- **话题 1 —位置:**这主要是关于“位置”、“步行”、“车站”和“中心”等词语的位置。这可能会吸引那些看重便利和交通便利的游客,比如第一次来伦敦的游客,他们希望最大限度地利用时间,游览伦敦市中心的所有景点。
- **话题 2——奢华:**这似乎是针对现代公寓,突出了“厨房”、“现代”、“私人”和“空间”等词。这可能会吸引预算较高的旅行者,他们希望住在一个舒适、有空间和隐私的地方(这在伦敦很贵!).
- **主题 3——预算:**这主要是关于更基本设施的词汇,如“床”、“房间”、“淋浴”和“清洁”。这可能会吸引那些不想花太多钱、正在寻找能保证基本便利设施的房源的预算旅行者。
然后,每个列表被分类到不同主题中的一个,该主题被用作训练模型的下一阶段的附加特征。
训练机器学习模型
在本节中,我们通过拟合处理过的数据集来训练机器学习算法。这是建立预测产量的最终模型的地方。
误差度量
在训练模型之前,我们首先要定义目标。这是将指导算法的内部权重的误差度量,允许模型通过寻找可能的最低误差来学习最佳预测函数。
在该模型中,均方误差(MSE)被用作精确度的度量。这测量实际产量和预测产量之间的误差平方的平均值。这个的数学公式是:
MSE 是回归模型的常用误差分数,允许直观地测量误差,即 10000 的 MSE 表示产量模型偏离 100(10000 的平方根)。它总是非负的,值越接近零越好。
型号选择
有了明确定义的误差度量,我们可以训练几个模型并选择性能最好的一个。在每个模型被训练和测试之后,结果被比较以检查更复杂的模型产生更好的分数。
这些模型遵循复杂的顺序:
- 线性回归:这是一种简单的线性方法,用于对数据集中的特征(如房间数量、入住客人数量)和目标“收益”变量之间的关系进行建模。
- 决策树:这是一个更复杂的基于树的模型,可以捕捉数据集中的非线性关系。这使用树表示,其中树的每个内部节点对应于数据集中的一个特征(例如房间数量),并且每个叶节点是一个类别标签(例如多于 2 个房间)。
- 随机 **森林:**这是从决策树集合中构建的最复杂的模型。这背后的原理是,一组弱学习者,即个体决策树,可以集合起来创建一个强学习者——随机森林。案例和要素的随机样本用于构建每棵单独的树,然后对组合预测进行平均,以返回森林的最终结果。
正如所料,随机森林模型产生了最好的分数。这表明数据集具有许多非线性关系,只能通过更复杂的模型来捕捉。
基于 LDA 主题模型的特征工程
虽然使用结构化数据构建预测模型是很好的第一步,但该项目的目标是确定文本挖掘是否可以用于提高产量预测。我处理这个问题的方法是通过比较不同模型在有和没有列出主题作为特征的情况下的得分。
在没有列出主题的情况下,报告的最佳结果是均方根误差为 14,579。在包含描述主题后,根 MSE 进一步降低到 14,560,从而提高了性能。在确认准确性增加后,使用 scikit-learn 的 GridSearchCV 调整最终参数,这进一步将均方根误差降低到 14,520。
虽然精度的提高看起来很小,但值得注意的是,随着精度的提高,挤出额外的几个点变得更加困难。
更重要的是,这验证了文本挖掘中存在有价值信息的假设,并证明了探索更多 NLP 技术来捕获这些信息的合理性。
使用基于树的模型的另一个优点是能够看到数据集中每个要素的重要性。这也揭示了使用列表主题的价值:
importance % feature
7 24.932740 latitude
0 21.772927 accommodates
8 19.621701 longitude
6 7.702141 minimum_nights
5 6.356207 extra_people
1 4.105430 bathrooms
4 3.769556 guests_included
2 2.893417 bedrooms
13 2.039581 room_type_Entire home/apt
3 1.844825 beds
**20 0.956488 topics_description_Luxury
19 0.914949 topics_description_Location
18 0.900623 topics_description_Budget**
12 0.477287 property_type_Other
11 0.442333 property_type_House
9 0.430975 property_type_Apartment
14 0.396504 room_type_Private room
10 0.152781 property_type_Bed & Breakfast
17 0.107925 bed_type_Real Bed
15 0.098952 room_type_Shared room
根据列表描述建模的主题具有 2.5%的综合重要性,这高于资产类型(1.3%)、床位数量(1.8%)或床位类型(0.11%)的重要性。这意味着非结构化描述文本包含比已经在关于 Airbnb 列表的结构化字段中捕获的更多的信息,并且这些信息可以用 NLP 技术来挖掘。
观想洞见
除了提高预测力度之外,还有从文本挖掘 Airbnb 房源描述中产生的进一步见解。通过绘制 3 个主题(位置、奢华、预算)的气泡图,可以将伦敦的 Airbnb 市场划分为不同类型的房源——每种房源都有不同的平均价格和预订率。
Each topic is plotted at the average of that segment while the size represents the number of listings.
就规模而言,“经济型”市场的房源数量最多,其次是“位置型”,而“豪华型”市场的房源数量最少。这是有道理的,人们会自然地期待有更多的“预算”类型的上市。
从平均价格来看,“地理位置”明显领先,排在第 162 位,其次是“豪华”,第 140 位,第 128 位。这表明位置仍然是房地产的王道,验证了古老的谚语“位置,位置,位置!”。
令人惊讶的是,尽管位置价格最高,但评论数量最多的却是“豪华”住宿。这是预订频率的一个代表,表明拥有一个“豪华”类型的列表甚至可能导致高于平均水平的收益。
Airbnb 用户通常是千禧一代,与其他年龄组相比,他们更愿意在旅行上花费,他们被住在别处没有的精品酒店的独特机会所吸引。这可以解释 Airbnb 上“奢华”住宿的流行。其他细分市场,如通常更关心“位置”的商务旅客,可能更喜欢住在酒店,而其他细分市场,如“经济型”旅客,则更喜欢有保证的设施和较低的价格的旅馆。
反思和下一步措施
这是一个具有挑战性和有趣的问题,在完成这个项目的过程中,我学到了很多东西。
**NLP 很难,没有正确答案。**处理文本数据带来了独特的挑战,这些挑战源于数据的定性性质。与结构化数据相比,它的形式更加自由,很少有“正确的答案”可供选择。例如,我决定选择相对较少的主题进行建模,这样可以保持主题的可管理性和独特性,足以形成不同的部分。然而,几乎每一个其他选择的背后都有一个合理的理由,这个理由会导致截然不同的结论。
可解释性很重要。在没有正确答案的情况下,能够以人性化的方式解释您的模型有助于建立对结果的信心。我选择使用 LDA 而不是其他主题建模算法(例如,非负矩阵分解)的原因之一是它提供了单词分布的可解释性。这有助于建立信心,我已经选择了合理数量的主题进行建模,并且最终的主题可以被赋予有洞察力的标签,提供有用的信息。
**NLP 可以解锁非结构化文本中的信息。**尽管无论哪种方式都会有有价值的学习,但证明文本挖掘可以用来提取有价值的信息尤其令人满意。由此产生的话题不仅改进了预测模型,还提供了对 Airbnb 市场不同细分市场的宝贵见解。
**更多的非结构化数据?**任何数据从业者可能都会同意,正确的数据很少以您想要的形式出现。能够从非结构化来源中提取信息为执行有用的分析打开了大门——即使数据可用性较低或者不是为您的预期目的收集的。展望未来,探索 Airbnb 中图像的使用以及深度学习算法是否可以从中提取有意义的信息将是一件有趣的事情。
Airbnb 团队已经分享了大量关于 Airbnb 数据的优秀作品,任何有兴趣阅读更多的人都应该阅读他们的一些帖子。希望通过分享我的作品,我能以我自己的一点点方式为之添砖加瓦。如前所述,没有正确的答案,我欢迎并鼓励下面评论中的任何反馈或想法!
我很幸运,在我感兴趣的领域找到了一个很棒的数据集。这个数据集是由 Airbnb 内部收集的,旨在回答 Airbnb 如何被用于并影响你所在的社区的问题。不管你的观点如何,这是一个重要的讨论,尤其是随着共享经济的兴起,我鼓励你通过访问他们的 网站 来加入这场对话。
报告全文及全部代码可在我的公众号GitHub上获得。