TowardsDataScience 博客中文翻译 2020(九百八十七)
云计算既带来了好处,也带来了挑战。虽然云中的网络安全是云服务提供商和用户的共同责任,但许多组织没有正确履行自己的责任,牺牲了客户的利益。无论是由于疏忽还是缺乏知识,误用您的云环境都会带来严重的后果。确保实施严格的云计算安全策略,以确保云中的数据是安全的。运行云基础设施不是一件容易的事情,我们明白这一点。我们的安全团队由 AWS、Azure、Google Cloud 方面的顶级安全和主题专家以及知识
你是哪种类型的数据科学家?
了解最常见的数据科学家角色
数据科学是一个相对较新的领域,它融合了几个学科的特征和个性。但是,在数据科学出现之前,有哪些不同类型的数据科学家,这些人在做什么工作?
大多数人都见过这个三部曲图表的某种形式,我在下面重新改编了它。
来源:Gianluca Gindro
成功的数据科学确实是三个核心要素的混合体:统计、商业敏锐度和编程技能,但很少有人在所有这些领域都很强。
那么,你是哪个角色?或者说,如果你要招聘一名数据科学家,你需要哪一位?
三条背景路径通向三个不同的角色:
- 恢复的管理顾问
- 这位研究员逃离了学术界
- 开发人员变成了数据科学家
恢复的管理顾问
这个类别包括初级商业分析师和前麦肯锡顾问。他们有一个共同点,那就是对 Excel 的热情,以及炫耀 v-lookup 和花哨的公式的能力,甚至是计划搬家的能力。
他们也是对业务问题更有热情的人:他们首先考虑业务,然后才是数据。
他们不得不学习 Python 或 R,这不是因为他们喜欢编程。他们仍然尽可能地避免编码,他们的代码通常像一次性餐巾一样可重复使用。
他们对统计学的基础知识有很好的直觉,但他们不得不艰难地学习像 p 值或 t 检验这样的概念。
他们擅长的:支持决策的数据科学项目、面向业务的流程、一次性项目。
这位研究员逃离了学术界
他们通常拥有博士学位,并有研究背景。他们研究核心的数学和统计学,他们可以花几个小时谈论贝叶斯和频率主义方法之间的哲学差异。
他们通常擅长编码,只要他们不必过多地将自己推入数据工程师的界限。测试驱动的编程方法对他们来说可能是一种挑战。
但他们可能擅长较低级别的程序,如 C++,这对于大规模或深度学习的应用程序来说很方便。
他们往往缺乏的是商业思维。开发产品可能是他们的最终目标,因为他们认为这相当于在学术界发表一篇论文。
擅长领域:创新前沿的复杂机器学习项目。他们可以突破界限,阅读大量的研究论文来挑选和实施最好的想法。一家高科技公司可能需要一些这样的资料。
开发人员变成了数据科学家
由于数据科学需要大量的编码,这些可能会成为你最好的朋友。
你可以相信他们能够构建良好的可重用代码,不必向他们解释测试的概念,他们可能会比你希望的更多地自动化管道。
他们可能可以使用现成的机器学习工具,但如果他们需要冒险进入更深层次的统计思维,这可能会成为一个雷区。
他们中的一些人可能相当擅长理解事情的业务方面,特别是如果他们以前参与过收集需求和处理业务关系。但是不要期望他们对新颖的商业想法过于主动。
他们真正擅长的是需要技术挑战的场景,例如需要大规模工作的大数据项目或复杂的数据管道。同时,他们在需要更高级的建模和预测准确性需要成为竞争优势的项目中不太适应。它们也最适合于那些必须专注于构建产品而不是支持决策的项目。
结论
如果你是一名数据科学家或者正在考虑成为一名数据科学家,试着找出你适合的角色和你的差距,但也不要羞于承认你的优势。
作为一名数据科学家,你将需要所有这些技能的混合,但期望成为一名纯粹的多面手是一个神话:总有你更喜欢的一面!
如果你需要雇用一名数据科学家,试着确定候选人更适合哪一类:雇用一个人来建立一个大规模的推荐引擎,肯定需要一个不同于在销售预测中支持你的首席执行官的人。
关于数据治理,我们错在哪里
以及我们如何纠正它
图片由 亚历山大提供
数据治理是我的许多客户最关心的问题 ,尤其是考虑到 GDPR、CCPA、新冠肺炎和其他许多首字母缩写词,它们表明在保护用户数据方面,数据管理越来越重要。
在过去的几年里,数据目录已经成为数据治理的强大工具,我非常高兴。随着公司的数字化和数据操作的民主化,数据堆栈的所有元素(从仓库到商业智能平台,现在还有目录)都必须参与合规性最佳实践,这一点非常重要。
但是,数据目录是我们构建健壮的数据治理计划所需要的全部吗?
数据治理的数据目录?
类似于物理图书馆目录,数据目录作为元数据的目录,为投资者提供评估数据可访问性、健康状况和位置所需的信息。像 Alation、Collibra 和 Informatica 这样的公司推出的解决方案不仅可以跟踪你的数据,还可以与机器学习和自动化集成,使数据更容易发现、更具协作性,并且现在符合组织、行业甚至政府法规。
由于数据目录提供了关于公司数据源的单一真实来源,因此利用数据目录来管理管道中的数据非常容易。数据目录可用于存储元数据,使涉众更好地了解特定来源的血统,从而对数据本身产生更大的信任。此外,通过数据目录,可以轻松跟踪个人身份信息(PII)的存放位置和向下游扩散的位置,以及组织中谁有权跨管道访问这些信息。
什么对我的组织是正确的?
那么,什么类型的数据目录对您的组织最有意义呢?为了让您的生活稍微轻松一点,我与该领域的数据团队进行了交谈,以了解他们的数据目录解决方案,并将它们分为三个不同的类别:内部、第三方和开源。
内部
一些 B2C 公司——我说的是世界上的Airbnb、Netflix和Ubers——建立自己的数据目录,以确保数据符合州、国家甚至经济联盟(我指的是你 GDPR)级别的法规。内部解决方案的最大好处是能够快速旋转可定制的仪表板,拉出您的团队最需要的字段。
优步的 Databook 让数据科学家可以轻松地搜索表格。 图片由 优步工程 提供。
虽然内部工具有助于快速定制,但随着时间的推移,这种黑客行为会导致缺乏可见性和协作,特别是在理解数据谱系时。事实上,我在一家食品配送初创公司采访的一位数据主管指出,她的内部数据目录中明显缺少的是“单一窗口”如果她有一个真实的来源,可以提供对她团队的表如何被业务的其他部分利用的洞察力,那么确保合规性将是容易的。
除了这些战术考虑之外,花费工程时间和资源构建一个数百万美元的数据目录对绝大多数公司来说没有意义。
第三方
自 2012 年成立以来, Alation 在很大程度上为自动化数据目录的兴起铺平了道路。现在,市场上有一大堆 ML 驱动的数据目录,包括 Collibra 、 Informatica 和其他目录,许多都具有付费工作流和面向存储库的合规管理集成。一些云提供商,如 Google、AWS 和 Azure,也以额外的费用提供数据治理工具集成。
在我与数据领导者的交谈中,这些解决方案的一个缺点被反复提及:可用性。虽然几乎所有这些工具都具有强大的协作功能,但我采访的一位数据工程副总裁特别提到了他的第三方目录的不直观的用户界面。
如果数据工具不容易使用,我们怎么能期望用户理解甚至关心它们是否符合标准呢?
开放源码
2017 年,Lyft 通过开源其数据发现和元数据引擎 Amundsen 成为行业领导者,该引擎以著名的南极探险家命名。其他开源工具,如 Apache Atlas 、 Magda 和 CKAN ,都提供了类似的功能,这三个工具都使精通开发的团队能够轻松地获得软件实例并开始工作。
Amundsen 是一个开源数据目录,它让用户能够洞察模式的使用。 图片由 米哈伊尔·伊万诺夫 提供。
虽然其中一些工具允许团队在其中标记元数据来控制用户访问,但这是一个密集的、通常是手动的过程,大多数团队没有时间去处理。事实上,一家领先运输公司的产品经理分享说,他的团队特意选择不使用开源数据目录,因为他们没有现成的对其堆栈中所有数据源和数据管理工具的支持,这使得数据治理变得格外具有挑战性。简而言之,开源解决方案不够全面。
尽管如此,对于法规遵从性来说,还有一些即使是最先进的目录也无法解释的关键因素:数据宕机。
缺失的环节:数据宕机
最近,我为一个客户开发了一个简单的指标,帮助测量数据停机时间,换句话说,就是数据不完整、错误、丢失或不准确的时间。当应用于数据治理时,数据停机时间可以让您全面了解组织的数据可靠性。没有数据可靠性来支持全面发现,就不可能知道您的数据是否完全合规和可用。
数据目录解决了部分(但不是全部)数据治理问题。首先,缩小治理差距是一项艰巨的任务,如果不完全了解您的公司实际上正在访问哪些数据资产,就不可能对其进行优先排序。数据可靠性填补了这一空白,让您能够释放数据生态系统的全部潜力。
此外,如果没有实时沿袭,就不可能知道 PII 或其他监管数据是如何蔓延的。请想一想:即使您使用的是市场上最精美的数据目录,您的治理也只能与您对数据去向的了解一样好。如果您的管道不可靠,您的数据目录也不可靠。
由于功能互补,数据目录和数据可靠性解决方案携手合作,提供数据治理的工程方法,无论您需要满足的首字母缩写。
就个人而言,我对下一波数据目录的到来感到兴奋。相信我:这不仅仅是数据。
想了解更多,伸手 巴尔摩西 。
使用 WhatsApp 数据的自然语言处理
潜入表情符号、音频、附件和深夜对话的世界。
几天前是我最好的朋友的生日,我决定利用我的编程技能给她一份独特的礼物。准备好深入分析单词、表情符号、数字、单词、链接、图像、视频、音频和附件
在这篇文章中,你会发现
- 格式化 Whatsapp 对话指南的分步指南
- **折线图:**3 年内发送消息的频率
- Spyder graph :每年**、**每周和每小时消息
- **条形图:**表情符号分析
- WordCloud: 最常发送的消息
数据,数据和数据
在我们深入分析 WhatsApp 对话之前,先做一点概述…
- 从 2017 年 3 月 3 日发送的第一条消息到 2020 年 5 月 22 日的最后一条消息,相隔 932 天。
- 对话中的参与者:我和我的朋友
- 总共发送了 2150 条消息
- 11821字被调换
导入并重新格式化文本文件
第一步是从 WhatsApp 下载对话。这可以通过应用程序本身或 web 服务器扩展非常容易地完成。
为了隐私,姓名被部分隐藏
在我们开始可视化之前,有几件关于清洁过程的事情需要注意。
导入的文本文件的格式如下:
【日-月-年时:分:秒】名称:消息\换行符
第一步的主要目标是从最初下载的文本文件创建一个“csv”文件。我用逗号替换了右方括号[]和左方括号[],也用逗号替换了冒号。
我还删除了发件人名字中的表情符号,没有什么特别的原因,我更喜欢干净的名字。清理后文件的结果格式如下:
日-月-年时:分:秒,姓名,消息
这是我想要实现的格式,以便创建 csv 文件,这将允许我分析消息。
为了隐私,姓名被部分隐藏
现在我们有了一个漂亮的“csv”文件,其中包含所有日期、发件人姓名和信息,我们可以创建一个熊猫数据帧来存储所有信息。
df=pd.read_csv('conversation.csv')
数据帧的结构如下:|日期|发件人姓名|消息|
日期时间格式
分析中的一个重要步骤是能够理解消息何时被发送。这需要通过轻松处理日期、时间、分钟等来完成。
Python 有一个非常有用的库,就是为此而创建的。从一个 字符串 类型到 日期时间 类型的一个非常简单的转换可以通过下面的代码行实现:
from datetime import datetimedf['date'] = pd.to_datetime(df['Date']**,** format = '%d-%m-%y %H:%M:%S')
现在,我的“日期”熊猫栏的格式被指定了,这非常有用,因为它允许在使用不同的日期格式时有很大的灵活性。
年度和月度分析
一旦我们将“date”列更改为 datetime 类型,我们就可以非常容易地提取任何想要的指标,例如小时、月或年。我决定创建新的列来包含邮件发送的具体月份和年份。
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
我用 Plotly Express 和 Seaborn 绘制了下面两张图。他们传达的意思是,虽然我和我的朋友很亲密,但我们在 Whatsapp 上不是特别经常说话。有很多间隔,几个星期都没有一条消息被发送,然后有几天我们交换了 80 多条消息。似乎我们有一种要么全有要么全无的交流方式。
沟通最多的一年是 2018 年,尤其是最后一个季度。这很有意义,因为我们正在组织一次欧洲旅行。在每年的年末和年初,交流减少了,因为我们都有考试和家庭假期要照顾。
下面的热图和上面的折线图传达的信息是一致的。
热图是一种数据可视化技术,以二维颜色显示现象的大小。
我选择对相同的时间变量使用两种可视化,以确保我不会错过隐藏在一个图表中但在另一个图表中很明显的东西。我建议在大多数情况下这样做,因为它提供了一个快速的“理智检查”。
这些观想很容易实现,一步一步的教程可以在这里找到。
每小时和每周消息
鉴于之前的图表没有显示我们的消息传递方式的趋势,我决定通过查看每小时和每周发送的和条消息来进一步细分。
我创建了一个雷达图来可视化信息的频率,因为它们是循环的,我相当有信心会有一个强大的趋势。
雷达图是一种以二维图表的形式显示多元数据的图形方法,该二维图表是从同一点开始在轴上表示三个或更多的定量变量。
我为发送的每条消息创建了包含工作日和时间的列。
df['weekday'] = df['date'].dt.weekday
df['hour'] = df['date'].dt.hour
这些图表包含了更丰富的信息,显示出我们在一周的某几天和一天的某几个小时更有规律地交谈。
对于小时图,95%的阴影区域在早上 5 点到下午 6 点之间,这相当代表了我们的生活方式,因为我们是非常活跃的人。我们通常在周末聊天,因为我们是异地恋,或者是为了叙旧或者组织旅行。
表情符号,不仅仅是文字?
表情符号是一种非常受欢迎的交流形式,通常用于描绘情感或喜剧效果,而无需键入文字。
我惊讶地发现,除了哭笑表情符号,我们使用的表情符号几乎没有重叠。
在看这个图的时候,我注意到了一些有趣的事情。很明显,我用的表情符号种类更多,而她用的表情符号从不出错。我很惊讶地看到她有更多庆祝表情,比如香槟和 T2 圣诞树,而我的表情更多地依赖于反应。
此外,我使用表情符号的次数比她多得多。事实上,我用了两倍多的量。这很有意义,因为我们说话和交流信息的语言不是我的第一语言。我更依赖表情符号来传达我的想法或情绪,而她更自信地使用文字。
你可以在这里找到如何创建这些支线剧情的分步说明。
最常见的消息
我们俩发送的最常见的信息非常相似。我加了一个法语的翻译(以防万一)。下面一行代码让我可以非常轻松地浏览我的“消息”栏,找到重复次数最多的消息。我总是对一行代码所能实现的东西感到敬畏。
df.message.value_counts().head(**20**)
我非常惊讶地发现,重复次数最多的信息表达了我们对某件事的一致意见。
- 同意
- Pas de soucis! —没问题
- 是 —是
- 没问题
- 凉爽的
- 行
- 非常好
- 好吧好吧
- T’es ou?你在哪里?
- 好的,没问题
- ️:是的,是的
- Ok
- 超级!
- 没问题
结论:我们在大多数事情上意见一致,很多时候。
单词单词单词
我决定更进一步,调查一下我们俩重复使用最多的词。
让我想起了俄罗斯方块
这是通过将所有单词设置为小写并使用’ Counter '函数实现的(不幸的是有多行代码)。该函数跟踪每一个单词,并且每当特定单词出现在消息中时,增加唯一的+1 计数。
for i in df.message.values:
words += '{} '.format(i.lower()) # make all words lowercase
wd = pd.DataFrame(Counter(words.split()).most_common(**200**)**,** columns=['word'**,** 'frequency'])
这个计数器函数的结果保存在一个新的 pandas dataframe ’ wd '中,我用它来绘制单词 Cloud(在我看来,这是最漂亮的可视化效果:)
WordCloud 函数使用字典,所以我必须在开始绘图之前进行快速转换。
data = dict(zip(wd['word'].tolist()**,** wd['frequency'].tolist()))wc = WordCloud(background_color='white'**,** width=**800,** height=**400,** max_words=**200**).generate_from_frequencies(data)
结束语
通过这个小项目,我学到了很多。这是我第一次处理非数字数据。在编写代码时,有很多错误和事情需要记住,比如法国口音,或者表情库比我想象的更难使用。
我很高兴地看到,这个探索性的数据分析过程传达了关于我的友谊的非常积极的信息。所有使用的表情符号都描绘了积极或充满活力的情绪。最常用的信息是用来表达同意。
最常用的一个词是“谢谢”。
生日快乐,甜心!
Github 知识库
所有代码都可以在 Github 这里的 analysis.py 文件中找到。
非常感谢你的阅读!
如果你喜欢我的作品,我会非常感谢你跟随我的媒介到这里。
如果您有任何关于如何改进的问题**、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。**
SNE 霸王龙是什么,为什么和怎样
t-SNE 简介(图片来自 Pixabay
想象一下我们一天创造的数据;产生的新闻、帖子、视频、社交媒体平台上的图片、沟通渠道上的消息、有助于商业发展的网站等等……巨大无比!对吗?
巨大!对吗?图片来自 Pixabay
现在,想象一下分析这些海量数据并获得有用的见解以做出数据驱动的决策的任务。复杂!对吗?
复杂!对吗?图片来自 Pixabay
对于这个问题,我们可以做的是删除冗余信息,只分析影响大的信息。
降维 在任何数据分析或数据可视化的最初阶段都会出现。
降维 是将数据投影到一个更低维度的空间,这样更便于数据的分析和可视化。然而,维度的减少需要在准确性(高维)和可解释性(低维)之间进行权衡。
但这里的关键是保留最大方差特征,消除冗余特征。
在本文中,我们将重点讨论 t-SNE 降维的原因、内容、方式以及非内容。
下面是讨论的流程:
- 为什么不是 PCA?为什么是 t-SNE?
- 什么是 t-SNE?
- SNE 霸王龙是如何工作的?
- 如何实现 t-SNE?
- 如何有效使用 tSNE?
为什么不是 PCA?为什么是 t-SNE?
说到降维,PCA 出名是因为它简单、快速、易用,并且保留了数据集的总体方差。关于 PCA 的更多信息,请查看和。
虽然 PCA 很棒,但它也有一些缺点。PCA 的一个主要缺点是它没有保留非线性方差。这意味着 PCA 将无法得到这样的结果。
三叶形结。
简单来说,PCA 只保留全局方差,因此保留局部方差是 t-SNE 背后的动机。
什么是 t-SNE?
t-SNE 是一种非线性降维技术,非常适合将高维数据嵌入到低维数据(2D 或 3D)中进行数据可视化。
t-SNE 代表 t 分布随机邻居嵌入,它讲述了以下内容:
随机→不确定但随机概率
邻居→只关心保留邻居点的方差
嵌入→将数据绘制到更低的维度
简而言之,t-SNE 是一种机器学习算法,每次在相同的数据集上生成略有不同的结果,专注于保留邻居点的结构。
超参数调谐
2 能高度影响结果的参数有
a) n_iter: 算法运行的迭代次数
b) *困惑度:*这可以认为是 t-SNE 必须考虑的邻点数
t-SNE 是如何工作的?
步骤 1: t-SNE 在更高维度中构建成对的概率分布,使得相似的对象被分配较高的概率,而不相似的对象被分配较低的概率。
步骤 2: 然后,t-SNE 在较低维度上迭代复制相同的概率分布,直到库尔巴克-莱布勒散度最小化。
Kullback-Leibler 散度是衡量第一步和第二步的概率分布之间的差异。KL 散度在数学上被给出为这些概率分布的差的对数的期望值。
如何实现 t-SNE
在本节中,让我们使用来自 Kaggle 的数字识别器数据集,使用 t-SNE 进行维数约简。
用著名的 MNIST 数据学习计算机视觉基础
www.kaggle.com](https://www.kaggle.com/c/digit-recognizer)
数据描述:
- 数据文件包含手绘数字的灰度图像,从 0 到 9。
- 每幅图像高 28 像素,宽 28 像素,总共 784 像素。每个像素都有一个与之关联的像素值,表示该像素的亮度或暗度,数字越大表示越暗。该像素值是 0 到 255 之间的整数,包括 0 和 255。
- 训练数据集(train.csv)有 785 列。第一列称为“标签”,是用户绘制的数字。其余的列包含相关图像的像素值。
数据集中的每个像素列都有一个类似 pixelx 的名称,其中 x 是 0 到 783 之间的整数,包括 0 和 783。为了在图像上定位这个像素,假设我们将 x 分解为 x = i * 28 + j,其中 I 和 j 是 0 到 27 之间的整数,包括 0 和 27。那么 pixelx 位于 28×28 矩阵的第 I 行和第 j 列(由零索引)。
加载数据:
import pandas as pd
mnist_data = pd.read_csv("mnist.csv")
使用 Pandas 将 CSV 格式(逗号分隔值)的数据文件加载到数据框中。
mnist_data.shape
输出:(42000,785)
查看数据,我们发现有 42,000 个数据点和 785 个特征。
mnist_data.head()
输出:
mnist_data 中的前 5 个数据点
第一列标签是目标变量。剩下的 784 列是特征。
target_variable = mnist_data["label"]
features_variable=mnist_data.drop("label",axis=1)
将标签列分配给目标变量,将剩余列分配给特征变量。
print(target_variable.shape)
print(features_variable.shape)
输出:(42000,)
(42000,784)
现在,让我们看看这个特征变量是如何使用 t-SNE 减少 42000 个数据点和 784 个特征的。
利用 t-SNE 实现降维:
**第一步:**数据标准化
from sklearn.preprocessing import StandardScaler
standarized_data = StandardScaler().fit_transform(features_variable)
使用标准定标器()。fit_transform( ) ,数据可以一步标准化。
步骤 2: 对标准化数据应用 t-SNE
from sklearn.manifold import TSNE
model = TSNE(n_components=2, random_state=0,perplexity=50, n_iter=5000)
tsne_data = model.fit_transform(standarized_data)
在这里,我们创建一个 TSNE 的对象,并设置困惑和 n_iter 值。我们对标准化数据使用了 fit_transform( ) 方法,通过 t-SNE 得到降维数据。
为了验证这一点,让我们打印 tsne_data 的形状
print(standarized_data.shape)
print(tsne_data.shape)
输出:(42000,784)
(42000,2)
我们现在可以一起玩各种困惑和 n_iter 来观察结果。
如何有效利用 t-SNE?
- t-SNE 图受参数的影响很大。因此,在分析结果之前,有必要使用不同的参数值执行 t-SNE。
- 由于 t-SNE 是随机的,每次运行可能会导致略有不同的输出。这可以通过固定所有运行的 random_state 参数值来解决。
- SNE 霸王龙没有保留原始数据中聚类之间的距离。t-SNE 降维后,聚类之间的距离可能会发生变化。建议不要仅从集群之间的距离获得任何结论。
- t-SNE 压缩广泛传播的数据,扩展密集包装的数据。因此,建议不要基于输出来决定聚类的大小和密度/分布/方差。
- 更低的困惑度值可能导致更少的聚类。因此,建议尝试不同的困惑值,范围从 2 到数据点数,以获得更好的结果。
资源:
这篇博客文章由 distill.pub 在谷歌大脑的支持下完成。
一定要看看这个博客,了解更多关于 t-SNE 如何有效地帮助减少可视化的各种数据模式的见解。
谢谢你的阅读。以后我会写更多初学者友好的帖子。请在媒体上关注我,以便了解他们。我欢迎反馈,可以通过 Twitter ramya_vidiyala 和 LinkedIn RamyaVidiyala 联系我。快乐学习!
2020 年选举会怎样?
提示:将会非常接近
随着 2019 年太阳落山,没有什么比即将到来的总统选举更重要的了。预计参加人数将打破现代记录,许多人认为这将是美国历史上最大的政治事件之一。
在接下来的 12 个月里,在全国各地的起居室里,我们会问同样的问题。谁会赢?它们将承载哪些州?他们为什么会赢?
为了帮助得到一些早期的答案——以及受到其他方法的启发——我建立了一个回归模型,预测美国每个州将会发生什么
方法学
在开始之前,下面简单介绍一下我是如何构建这个模型的。如果您对技术细节不太感兴趣,可以直接跳到“关键见解”部分。
我设置了一个回归问题,预测民主党候选人在大选中获得的选票占投给民主党或共和党的总票数的百分比。
数据很少,所以我只分析了 1976 年至 2019 年这段时间。我选择了基于时间序列交叉验证方案的模型和特性。每一个选举年都是仅用以前的年份来预测的。例如,为预测 1980 年选举而训练的模型只看到 1976 年的数据,而为预测 2016 年选举而训练的模型看到 1976-2015 年的数据。
这种方法的一个后果是,在我们得到稳定的结果之前,需要若干年的时间。因此,使用过去 4 到 6 次选举的平均表现来估计最终表现(R 平方)。
下面是这种方法的示意图,其中每个“测试”时间段是对一次大选内所有州的预测。
关键见解
各州倾向于一致投票
我首先关注的是之前的大选对下一次大选的预测有多准确。或许并不令人意外的是,投票份额每年变化不大,中位数绝对波动仅为 3.7%。
事实上,在过去的四十年里,只有三个州的波动幅度超过了 15%:
其中两个是被提名人的出生地(奥巴马 2008;克林顿 1992 年出生于夏威夷;出生于阿肯色州)。第三次——里根在 1984 年翻转佐治亚——是罗斯福第一次竞选以来最大的大选压倒性胜利的一部分。
除非有特殊情况,我们通常可以通过简单地查看上一次大选来很好地了解下一次大选将接近的州。
这是经济问题,笨蛋
根据詹姆斯·卡维尔 1992 年的建议——“是经济愚蠢”——我关注的下一个因素是经济增长。对于每个选举年,我都会查看前一年的实际 GDP 增长,这是衡量经济健康状况的一个常用指标。将这一变量与平均民主党投票份额相对照,会得出一个负面关系:
一般来说,经济表现不佳对民主党候选人更有利。当经济受到伤害时,中产阶级在挣扎。当中产阶级举步维艰时,进步政策往往更能引起共鸣。
这一总体模式的最大例外是 1996 年和 2000 年——这两年尽管经济强劲,但民主党的投票份额相当高。
中期选举是一个信号
我还查看了民主党在上次国会选举中赢得的选票百分比。这里的理论是,中期选举为这个国家对执政党的感觉提供了一个脉冲检查。
为了创建这个变量,我合并了众议院和参议院选举中的总票数,并删除了不包括民主党和共和党的任何选举。
这两个变量之间似乎确实存在某种轻微的关系。政党在国会竞选中的表现与在大选中的表现相关联。
当添加到模型中时,该特征在预测能力方面提供了适度但明显的增益。
支持率
显示前景的最后一个变量是大选前现任总统的支持率。在民主党不执政的年份,我从 1 减去共和党的支持率。例如,乔治·h·布什的支持率在 1992 年是 39%,所以我把它转换成 61%来支持民主党。
我再次将变量与平均民主党投票份额进行了对比:
正如所料,我们发现更高的“民主党支持率”与民主党在大选中的更好表现相关。
评估绩效
利用上面的见解,我开发了两个模型。第一个只包括三个变量:“前民主党投票份额”、“前一年 GDP 增长”和“中期民主党投票份额”。第二个使用这三个变量,但也包括“民主党人的批准。”
我建立两个模型有两个原因:
- 四因素模型比三因素模型表现更好,但只是在我们评估最近 4 次选举(2004 年至 2016 年)时。当我们查看之前的 6 次选举(1996 年至 2016 年)时,3 因素模型做得更好。我怀疑这可能是由于缺乏交叉验证的训练数据,但很难确定。拥有这两个估计值给了我们更多的解释灵活性。
- 四因素模型包括 10 月份的支持率数据——就在选举之前——我们目前没有 2020 年的数据。因此,我们被迫将特朗普在 10 月份的支持率估计为他今天的支持率。这使得 4 因素模型是动态的。随着我们全年对支持率估计值的更新,我们将调整我们的预测。
以下是每个型号的性能汇总,由 R 衡量:
凭借相当强劲且持续的表现,让我们对 2020 年进行预测。
预测 2020 年
以下是对 2020 年大选的预测。为了得出这个结果,我对两个模型的得分进行了平均,并根据预测的民主党投票份额将各州分为 5 类。
- 强势共和党: < 40%民主党
‘怀俄明州(25%)’,‘西弗吉尼亚州(30%)’,‘俄克拉荷马州(31%)’,‘爱达荷州(32%)’,‘北达科他州(32%)’,‘南达科他州(34%)’,‘肯塔基州(35%)’,阿拉巴马州(35%)‘,阿肯色州(36%)’,田纳西州(37%)‘,犹他州(37%)’,内布拉斯加州(37%)‘,路易斯安那州(39%)’,堪萨斯州(40%)’
2.精简的共和党人:40-45%的民主党人
“蒙大拿州(40%)”、“印第安纳州(41%)”、“密西西比州(41%)”、“密苏里州(41%)”、“阿拉斯加州(42%)”、“南卡罗来纳州(43%)”
3.掷硬币:45-55%的民主党人
‘得克萨斯州(46%)’,‘爱荷华州(46%)’,‘俄亥俄州(46%)’,‘佐治亚州(47%)’,‘亚利桑那州(48%)’,‘北卡罗来纳州(49%)’, ‘佛罗里达州(49.37%)’,'威斯康星州(50.02%),‘密歇根州(50.39%)’,‘宾夕法尼亚州(50.41%)’,'明尼苏达州(50.89%),
4.精简的民主党人:55-60%的民主党人
“特拉华州(56%)”、“俄勒冈州(56%)”、“新墨西哥州(56%)”、“新泽西州(57%)”、“康涅狄格州(57%)”、“华盛顿(59%)”、“罗德岛(59%)”、“伊利诺伊州(60%)”
5.强大的民主党人:60%以上的民主党人
“马里兰州(63%)”、“纽约州(64%)”、“马萨诸塞州(65%)”、“加利福尼亚州(66%)”、“佛蒙特州(67%)”、“夏威夷(69%)”、“哥伦比亚特区(91%)”
最终结果和后续步骤
如果这种建模方法在 2020 年达到完美的精确度,下面是选举的结果:
民主党选举人票: 279 张
共和党选举人票: 259
然而,值得注意的是,有 16 个州属于“抛硬币”类别,每个州都在 5%的范围内。还有 5 个州的差距在 1%以内——佛罗里达州(49.37%)、威斯康星州(50.02%)、密歇根州(50.39%)、宾夕法尼亚州(50.41%)和明尼苏达州(50.89%)。
有了如此严密的预测,我的主要观点是选举将会非常接近。事实上,如果模型错过了威斯康星州,只有威斯康星州,我们会看到 269-269 平局。
不言而喻,该模型无法捕捉所有重要因素。最值得注意的是,它没有说明非现任提名者是谁,以及他们对国内关键摇摆州的吸引力如何。
尽管如此,该模型为理解和讨论各方的各种胜利之路提供了坚实的基础。在我的下一篇文章中,我将更深入地探究这些策略和潜在的结果。
会发生什么?—使用无代码人工智能模型和微软的人工智能构建器预测未来业务。
微软 POWER 平台解决方案
微软 Power 平台中的 AI Builder 的第一个外观和一个关于预测的激励性逐步指南
伊利亚·赫特在 Unsplash 上拍摄的照片
人工智能和机器学习是很大的词汇,通常隐藏在大量技术堆栈和各种背景的人获得的一系列复杂技能的背后。
最近,我们看到许多市场运动将这些技术大众化,从而使每个人都可以使用,不管他们的编码或数据科学技能如何。
当然,微软也在这场游戏中。
AI Builder——作为微软 Power 平台的一部分——可能还不是最知名的功能,但它肯定是最激动人心的功能之一。
它允许商业用户创建应用程序,在没有任何编码技能或其他数据科学相关知识的情况下,从功能上丰富了人工智能。
该解决方案跨越了微软的 Power 平台和 Dynamic 365 的更大范围。它进一步本机集成到通用数据服务 ( 什么是 CDS?这给了它一个非常强大的生态系统。
到目前为止,AI Builder 的当前版本支持广泛的预构建 AI 模型:
- 名片阅读器
- 关键短语提取
- 语言检测
- 文本识别
- 情感分析
此外,AI Builder 为您提供了使用以下 AI 模型类型训练您自己的 AI 定制模型的选项:
- 预言;预测;预告
- 目标检测
- 表单处理
- 文本分类
使用 AI Builder 构建 AI 模型的高级过程非常简单明了。
你用现有数据配置你的模型并训练它。之后,你验证型号性能并做一些快速测试。一旦模型准备好了,你就发布它。从那时起,你可以在不同的地方以不同的方式消费这个模型。您可以在您的业务工作流程或移动应用程序中使用它,仅举几例。
让我们更详细地看一下其中一个 AI 定制模型:预测。
预测模型
预测模型允许我们通过使用具有历史结果的历史数据来预测业务结果。
*换句话说:*它允许训练和测试机器学习模型,完全没有代码,也没有数学、统计或任何其他数据科学相关领域的背景。
这是我们自己的人工智能模型所需的一切:
- 微软动力平台试用
- 每个历史结果有 50 多条记录,存储在公共数据服务中
- 每个结果值有 10 多条记录(是、否、数字等。)
一个激励人心的场景—预测未来的自行车租赁
让我们假设我们为一家自行车共享/租赁服务公司工作,我们有一堆历史数据告诉我们许多关于过去的租赁数字和那天的确切天气情况。此外,我们的数据包含关于工作日、假日和其他有趣事实的信息。
预测目标
我们的目标是建立一个人工智能模型,在给定一组输入变量的情况下,该模型可以预测一天的潜在租金数量,这些变量由天气预报、整个季节以及即将到来的假期或周末表示。
抽样资料
我们将使用从 UCI 机器学习网站获取并存储在我的 GitHub 存储库中的数据集的稍微修改的版本。
[## sebastianzolg/ai-builder-intro
bike-sharing.csv 数据集是来自 UCI 机器学习知识库的数据集的修改版本。引用…
github.com](https://github.com/sebastianzolg/ai-builder-intro)
人工智能构建器—一步一步
让我们一步一步地了解我们的人工智能模型的创建过程。
首先,进入https://make.powerapps.com,选择实体,点击获取数据。
从来源列表中,点击文本/CSV。
接下来,在我的 GitHub 存储库中输入 bike-sharing.csv 的 URL,直接从那里抓取数据。
https://raw . githubusercontent . com/sebastianzolg/ai-builder-intro/master/bike-sharing . CSV
点击下一个的**。**
数据加载后,注意cnt #(count)
列是很重要的,它代表当天自行车租赁的数量。这就是我们想要预测的所谓特征。
注意,前十个条目有一个null
的cnt
。我们稍后将使用这些条目来测试我们的训练模型。
在我们继续之前,我们必须将instant
列的类型更改为 text,这样我们以后就可以将它用作主名称字段。当我们想要覆盖/替换条目时,这变得很重要。
出现提示时点击添加新步骤,然后点击下一步。
在地图实体表单上,我们最终对*自行车共享记录建模。*根据截图配置好一切,点击下一步。
选择手动刷新并点击创建。
回到数据,点击浏览器的刷新按钮,新创建的自行车共享记录实体出现。确保您已经从右上角的视图选项中选择了自定义。这样,你可以更快地找到你的客户实体。
在自行车共享记录的数据选项卡上,确保您已经从选择视图下拉列表中选择了自定义字段视图。您将立即看到我们的数据,并再次发现前十个条目,其中我们对cnt
特性没有价值。
我们现在已经导入了一个实体和一堆数据来训练 AI 模型。我们开始吧。
训练人工智能预测模型
现在我们已经准备好了数据,我们转到 AI 构建器>构建并选择预测模型。
给新模型起一个合适的名字,比如自行车共享预测,点击创建。
让我们从实体下拉列表中查找我们的自行车共享记录实体,并从字段下拉列表中选择cnt
功能。这就是我们如何告诉 AI 构建器我们想要预测哪个特征。点击下一个。
在下一个屏幕上,我们选择我们想要用来构建模型的所有特性。
请注意,有些字段已经被排除。这是因为由 CDS 创建的系统字段,如在上创建的会扭曲预测结果,所以它们默认被排除。
此外,没有显示所有的数据类型。我们的模型可以研究数字、货币、日期、两个选项、选项集和文本数据类型。
剩下的选择取决于你和你的业务领域知识的一部分。对于我们的数据集,我们依赖于原始数据集的文档,并选择以下字段。
- **season**:
season (1:winter, 2:spring, 3:summer, 4:fall)- **holiday**:
weather day is holiday or not (extracted from [[Web Link]](http://dchr.dc.gov/page/holiday-schedule))- **workingday**:
if day is neither weekend nor holiday is 1, otherwise is 0.- **weathersit**:
- 1: Clear, Few clouds, Partly cloudy, Partly cloudy
- 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
- 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
- 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog- **temp**:
Normalized temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-8, t_max=+39 (only in hourly scale)- **atemp**:
Normalized feeling temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-16, t_max=+50 (only in hourly scale)- **hum**:
Normalized humidity. The values are divided to 100 (max)- **windspeed**:
Normalized wind speed. The values are divided to 67 (max)
当然,你可以选择不同的组合,看看你是否能得到更好的结果。我们将在后面看到哪个变量对预测影响最大。准备好后点击下一个。
我们跳过过滤步骤,点击下一步的**。**
现在是时候做最后的回顾了。完成后点击训练,等待模型被训练。
点击转到型号。
仔细观察状态栏中的进度和。当模型状态变为已训练时,点击模型。
给你。🚀你的第一个人工智能模型用人工智能构建器构建。
您可以看到您的模型的性能,以及哪个变量对它的驱动最大。这个模型很好,但并不完美。它给我们留下了改进的空间,但这是另一个故事的一部分。
在你检查完所有东西后,你只需要点击发布。该流程将模型发布到生产环境中,并立即开始对cnt
列中值为空的所有条目(前十个)进行预测。
要查看模型预测的内容,请返回到数据>实体并点击自行车共享记录**。**
在数据选项卡上,确保选择自定义字段视图,并查找前十个条目。cnt
字段仍然为空,这是故意的。预测值是而不是存储在原始字段中。相反,创建了三个额外的列。找一个叫xxx_cnt-predicted
的,注意那里的数字。
预测是在这样的一天里我们可以预计的自行车租赁数量。
这不是很好吗?🤓
恭喜你!👏你已经用 AI Builder 创建了你的第一个模型,并根据几个条件预测了潜在的自行车租赁数量。
从这里,我们可以执行以下操作:
- 通过处理输入数据来改进预测。
- 在 Power App 或 Power Automate 中使用 AI 模型。
- 附加到天气服务,预测未来的租金,并调整轮班计划。
但是我们把这一切留到下一个故事。
就这样吧👉,
塞巴斯蒂安
数据科学的伦理会是什么样的?
卢克·迈克尔在 Unsplash 上的照片
自从 2016 年通用数据保护条例 (GDPR)首次公开制定以来,我们见证了对机器学习道德相关主题的兴趣和工作的激增。现在世界各地都有公平、负责、透明的机器学习(FATML) 会议。最近,杰出的机器学习者、统计学家、、社会学家、律师和哲学家多次呼吁,根据数据科学对个人和社会的伦理影响,重新评估数据科学实践。除此之外,梭伦·巴罗卡斯、安德鲁·塞尔伯斯特、鲁宾·宾斯、雅各布·梅特卡夫、凯特·克劳福德、丹娜·博伊德等人正在进行重要的跨学科研究。
然而,尽管做了这么多伟大的工作,我仍然没有看到任何人为数据科学制定一个全面而一致的道德框架,将数据科学实践的深刻知识与严格的道德论证相结合。我看过的许多论文都提出了基本的、一般的关于伦理的哲学观点,为了吸引普通读者而“简化”了。也许是因为害怕看起来“太主观”,这些作者从来没有真正为数据科学提出过独到的观点。这种方法很难激励人们。通过试图取悦每个人,他们实际上取悦不了任何人。讽刺的是,相对主义者没有列出各种伦理“选项”(这里有一份伦理系统的“自助餐”,你可以选择!各有同等效力!我希望看到有人对一种观点或系统采取强硬立场,不管是好是坏。然后我们可以讨论什么可行,什么不可行。
做有益于社会的数据科学而不与来自不同社区和文化的参与者就什么是好的进行实质性讨论,就好比在没有测量两岸距离的情况下在河上建一座桥。在我看来,数据科学伦理目前缺少一个苏格拉底式的牛虻,一个愿意质疑公认的智慧并支持新思想的人,即使被当权者视为“不虔诚”。话说回来,我们都知道苏格拉底发生了什么…
也许我是错的,但我认为(至少一些)数据科学家希望并且应该对数据科学的艺术和实践进行严格而复杂的伦理审查。他们已经准备好坐在“成人桌”前进行讨论。
全面的数据科学伦理需要涵盖哪些内容?
当然,像这样的中等职位并不是制定这种道德规范的合适地方。相反,我想提出三个简单的问题来指导数据科学的未来伦理。换句话说,数据科学伦理需要解决哪些关键的问题、问题和概念?这些问题是受牛津信息哲学家卢西亚诺·弗洛里迪的启发。
1)我应该成为什么样的数据科学家?
这与古希腊“自我生成”的概念有关,或者说,在我们的一生中,我们如何成为善良和有道德的人。为了正确回答这个问题,我们需要一些关于目的论的概念,或者数据科学家的功能以及她在一个公共或私人组织中的角色。思考这个问题的一种方式是问自己,“在数据科学漫长而成功的职业生涯结束时,对我的成功贡献最大的是什么?作为一名数据科学家,为了过上充实的生活,我发展的关键技能是什么,我参与的最重要的实践是什么?”
或者,正如阿利斯泰尔·麦金太尔或查尔斯·泰勒可能会问的,“数据科学界的价值观、传统和实践是什么?”这个问题是复杂的,因为该领域的混合谱系。数据科学家来自不同的领域,如物理、工程、计算机科学、统计和社会科学。一方面,数据科学家是数据管理员,受托管理关于个人及其行为的私人信息。他们有相当明确的业务目标要实现。另一方面,他们是科学家和研究人员,必须在科学知识的积累与公认的联邦政府规定的人体研究伦理之间取得平衡。雅各布·梅特卡夫(Jacob Metcalf)和凯特·克劳福德(Kate Crawford)在他们的文章 中捕捉到了这一困境:大数据研究中的人类主体在哪里?
反过来,研究数据科学家的角色要求我们问自己这样一个问题,以数据为中心的公司的社会角色是什么,它服务于什么目标或目的?例如,从脸书的大规模在线实验(例如,关于社会传染)中收集的社会科学见解应该与更大的社会科学界共享吗?无形知识产权止于何处,科学知识始于何处?
关于公司的目标和更普遍的商业道德,法律学者如 Lynn Stout 已经著书推翻了股东价值神话。在她看来,除了股东价值最大化这一狭隘目标之外,现代美国公司确实有很大的余地去追求其他目标。托马斯·唐纳森和托马斯·邓菲共同开发了综合社会契约理论,作为在现代企业环境中整合社群主义和契约主义伦理的一种方式。利益相关者理论加上新的有趣的“业务目标函数”可能成为数据科学伦理领域肥沃的知识土壤。
2)我该怎么办?
什么样的动作好?什么决定了行为的对错?它与行为本身的性质或其(可能的)后果有关,还是两者都有?我的动机和意图重要吗?这是一个实用数据科学知识非常重要的领域。数据科学家共有的特定惯例和行为将使数据科学的伦理与社会科学的伦理不同。
汉娜·阿伦特在她的书《艾希曼在耶路撒冷》中揭露了平庸的邪恶。她记录了这个完全平凡而通情达理的人,阿道夫·艾希曼,一个第三帝国的后勤经理,是如何明知故犯地参与了对数百万犹太人的种族灭绝。现在这是一个极端的例子,但尽管如此,当个体行为者未能反思他们正在做什么以及他们的工作如何融入一个更大、更复杂的系统时,必须让数据科学家意识到系统性的邪恶潜力。玛德琳·埃利什写了她所谓的“道德崩溃区”,在那里,人类行为者对复杂的自动化系统的行为控制非常有限。当这种系统失败时,数据科学家应该在多大程度上承担道德和法律责任?谁定义失败?
3)我为什么要做?
对于为什么关心这个问题,有一个简单的答案。 GDPR 。如果没有强有力的论据来证明某种行为的对错,那么至少有实际的、合法的理由来解释为什么我们应该关心我们作为数据科学家所做的事情。更多细节可以查看我们的文章 适应 GDPR:对数据科学家和行为研究者的影响 。简而言之,现在我只想说,GDPR 基于欧洲人对确保人类繁荣所需的最低人权的理解,展示了人工智能/人工智能的道德愿景。
但是除此之外,如果你不在欧盟的土地上,你很可能仍然反对没有好的理由成为一个好的数据科学家或者避免可能伤害算法决策系统的最终用户的行为。他们可能会说,作为一门科学,数据科学是没有价值和客观的。“我只是一名工程师。我解决问题。应用这些解决方案是其他人的工作;这不在我的工作范围内。”
我在另一篇关于数据科学家和权力伦理的博客文章中探讨了这种想法的某些方面。简而言之,我们应该培养我称之为的激进数据科学家。我们必须努力不让新的数据科学家倒向相对主义、虚无主义或伦理利己主义。
缩小伦理利己主义
在我看来,客观主义可以比作一种意识形态,这种意识形态很可能来自唐纳德·川普、史蒂夫·乔布斯、弗里德里希·尼采和亚里斯多德之间的一次醉酒对话。现在,对兰德的客观主义的适当回应将是另一个帖子本身。但是我会列出一些应对的方法,这样你就可以知道如何去做了。
客观主义的基本观点:做一个自私的天才
首先,支撑兰德客观主义的伦理利己主义的主要教义是什么?我们可以把它的主要原则总结为“每个人都应该只追求他或她自己的利益”在她 1961 年写的《自私的美德》中,安·兰德写道,“获得自己的幸福是人类最高的道德目标。”根据亚里士多德对人类是理性动物的描述,兰德直言不讳地宣称利他主义违背了人性的本质。对她来说,我们的理性能力意味着我们应该将我们的能量导向伟大思想和目标的产生,这让人想起尼采的übermensch**。我们不能被社会规则的限制和披着“利他主义”外衣的软弱表现所束缚。**
在她有影响力的书《阿特拉斯耸耸肩》中,她记录了如果社会的“有头脑的人”——社会的“主要推动者”、哲学家、科学家和商业巨头——突然罢工会发生什么。兰德对理性计算的推崇,以及她对体现英雄理想的工业(即硅谷)巨头的描述,如今已经转化为超人类主义运动,作者梅雷迪思·布鲁萨德 (2018)称之为“技术至上主义”:坚定不移地认为人类所有问题的解决方案是更多新技术的应用。
第二次世界大战后,也许许多技术专家并不知道,霍克海默、阿多诺、马尔库塞和维纳阐明了当我们目光短浅地追求 工具理性 的冷酷逻辑时,等待人类的可能后果。技术没有像启蒙思想家梦想的那样打开人类解放的闸门,而是被法西斯分子所控制。我们必须提醒自己,这是一种永恒的可能性,否则就有被自己的乐观蒙蔽的风险。
翻译成机器学习的语言和对象,我们可以说
具有讽刺意味的是,盲目技术进步的“贪婪”算法将我们带到了一个局部静止点,在这个点上,我们有能力播下毁灭人类的种子。如果没有一点随机因素——由对我们目标的道德反思带来的——我们就有永远追逐局部最优的风险。
库尔特·拜尔对伦理利己主义的回应
我将留给你们一个对伦理利己主义者或客观主义者的回应。道德哲学家库尔特·拜尔认为,道德利己主义至少在两个方面存在问题。首先,作为一种伦理理论,它是失败的,因为它没有提供更高的原则——它的最高原则是“做对你最有利的事情!”—我们可能用它来裁决党派之间的冲突。第二,也许更重要的是,伦理利己主义实际上并不构成伦理理论。伦理利己主义所支持的道德并不满足任何道德体系的一个基本条件:它为裁决由追求自身利益的人引起的争端提供了理由。换句话说,伦理利己主义并没有满足道德存在的一个关键原因:作为个人和社区的行动指南,根据理性的要求,以公正的方式解决争端。
大多数哲学家,至少在西方分析传统中,会同意任何系统被认为是道德系统,它必须建立一个所有理性人都会同意的行为准则。这种道德观是由康德开创的,最近出现在一些著作中,如约翰·罗尔斯的 正义理论、 大卫·高蒂耶的 契约道德和 T.M .斯坎伦的 我们欠对方的。为了更清楚地理解理性一致的重要性,我们可以看看威廉·弗兰克纳在他 1969 年的论文《道德的概念》中对道德的描述:
“AG(行动指南)是一种道德(道德 AG 相对于非道德 AG),当且仅当它满足如下形式标准时,不管其内容如何:
(A) X 认为它是规定性的。
(B) X 将其普遍化。© X 认为它是决定性的,最终的,凌驾于一切之上的,或至高无上的权威。
我们现在可以开始解析拜尔早先的观点了。如果我们假设命题 A、B 和 C(假设道德利己主义是指导我们行动的规定的、普遍的和最高的原则),那么利己主义不可能被说成是构成道德体系或行动指南。想象一下,从普遍的观点来看(即,从不同于你自己的各种人类角色、地位和职位来看),一个每个道德主体都遵循道德利己主义的世界。同时,从普遍的观点来看,想象一个世界,其中每个道德主体都不遵循道德利己主义。哪个世界会更好?道德理性战胜利己理性的世界,还是利己理性战胜道德理性的世界?
拜尔的论点是,如果我们生活在一个以追求私利为终极行动原则的世界,那么我们的境况不会比霍布斯笔下的自然状态好到哪里去。除了我们当中最幸运的人之外,生活对所有人来说都是肮脏的、野蛮的和短暂的。然而,普遍性标准要求我们寻找每个人都能接受的原则,不管他们在社会中的实际地位如何。即使我们可能在这个基因彩票的特别抽奖中幸运地如愿以偿,我们也会意识到,在一个反事实的世界里,事情可能会朝着另一个方向发展。****
伦理利己主义把自己钉在自己逻辑的利剑上,因为它没有也不可能为我们提供权威性的最终理由——作为一种决策程序——来裁决人们之间遵循自身利益的争端。当然,当道德利己主义符合你的利益时,当你缺乏身体力量来执行你的意志时,你会支持道德利己主义,但想象一下所有情况都是相反的,你会让最大和最强的人行使他的私利来反对你自己的私利。强权即公理是一个伟大的原则,以防你碰巧是房间里最强壮的人。但是当你不在的时候呢?拜尔对伦理利己主义的反驳有一个明显的长期频繁主义逻辑。
对于那些熟悉道德哲学的人来说,我们可能会说伦理利己主义失败了,因为它不能以康德的形式表达为绝对命令。这最终会弄巧成拙,在 最少作为一种伦理理论或作为一种道德。但是,伦理利己主义的支持者可能会说,这一事实并不妨碍它作为非道德的行动指南而存在。也许这样的行动原则没有达到道德的地位,但它可能仍然有价值的其他原因。事实上,伦理利己主义,被米尔顿·弗里德曼和其他人重新表述为“公司的社会责任是增加其利润”的观点,似乎仍然驱动着现代商业和经济中的许多决策。
那么,如果伦理利己主义作为一种行动指南和道德体系最终会弄巧成拙,我们该用什么来取代它呢?这就是我认为未来数据科学伦理学的主要任务。不过,有一件事是肯定的。如果我们不能坚持某些东西,我们就有陷入一切的风险——无论是虚无主义、相对主义还是安·兰德的客观主义。
如果神经网络状态是复数会发生什么?
作者创建的图像。
将 i 并入网络
这是一个目前处于神经网络研究边缘的问题:如果神经网络状态是复数会发生什么?由于权重、偏差和其他网络分量都有一个实部和一个虚部,一个曾经的一维测量将可以在两个维度中自由移动。
这是一个值得思考的有趣想法。从理论上讲,如果一个人能够在一个空间中传达两个值,神经网络可能能够找到某个结果的更高维度、更快的解决方案,就像你能够在三维空间中跳过一块岩石,但一只蚂蚁看到前方似乎永远延伸的墙,需要绕过它。
作者创建的图表。
也许通过利用虚数,神经网络将能够探索比目前更远的潜力。
幸运的是,这个问题并没有完全被忽略,并且已经有大量关于复值神经网络(CVNNs)的研究。几乎所有这些论文中提到的第一个问题是激活函数——为了使反向传播有效,促进网络非线性的激活函数必须是解析的,或者在所有点上都是可微分的。然而,刘维尔定理表明,在完全复平面上的每个有界(闭)函数必定是常数,因此是线性的。
因此,为了实现激活函数的目的,像 sigmoid 和双曲正切这样的有界函数在 CVNNs 中没有位置。当应用于复平面时,这些有界函数具有奇点——在空间中周期性出现的不可微的点。在这些奇点,函数向无穷大爆炸,导致神经网络计算失控。
在 CVNNs 的研究中,解决这个问题的一个常见方法是使用复杂的 sigmoid 函数,该函数不可避免地在无穷远处具有某些奇点,但是限制了权重和偏差参数的搜索空间,使得它们总是保持在“安全”区域内,并且永远不会接近计算爆炸。
尽管涉及大量的数学工作,简单地说,用于复值神经网络的反向传播算法不仅需要考虑权重的实部误差,还需要考虑虚部误差。因为它分别处理这些组件,所以它将搜索空间维度扩展了两个数量级。
由于这种稀疏性,在训练的前几百个时期使用随机搜索算法(RSA)来在空间中跳跃,找到复值反向传播算法(故意设置为具有非常慢的学习速率)要去的局部最小值。从这个意义上说,随机搜索算法是一种重型初始化技术。考虑使用这种方法的训练误差,对前 100 个历元执行 RSA,对剩余的历元执行复值反向传播:
来源:“用梯度下降和随机搜索算法训练的复值和实值神经网络的比较”。图片免费分享。
很明显,RSA 已经从大约第 75 个历元找到了合适的开始位置,这使得梯度下降算法很容易跟随误差的巨大减小和随后的长的、逐渐减小的序列。
通常,在实值神经网络(RVNN)上测试 CVNN 性能的论文要么看到相似的性能,要么看到更好的性能。通过增加虚数的额外维度,出现了一大堆新问题,但已构建的少数解决方案似乎足以将 CVNNs 与 RVNNs 相提并论。最近的研究甚至涉及复杂卷积、LSTMs 和批量归一化的构建,以进一步帮助 CVNNs。
总的来说,复杂的神经网络可以用一个词来概括:有前途。虽然目前,它们与普通标准神经网络的同等性能,但更高的计算成本和对各种问题的鲁棒性下降令人沮丧,但最近的研究表明,随着足够的发展,CVNNs 在音频相关任务(使用 MusicNet 数据集的音乐转录和语音频谱预测)上大大优于它们的实值兄弟。
虽然在不久的将来,CVNNs 在机器学习领域掀起风暴的希望很小,但在解决许多复杂的问题方面的持续发展可能会大大增加其解决特定任务的能力,例如在模拟信号(音频、电子等)方面。),就像其他为处理图像和顺序数据而设计的架构一样。将虚数整合到神经网络中的想法绝对值得关注。
延伸阅读
- 一篇介绍性论文介绍复杂神经网络中的问题和解决方案。
- 一篇深入的论文专门讨论复平面中的奇点和激活函数问题。良好的可视化,但数学密集型。
- 最近的一篇论文介绍了复杂神经网络的许多数学密集型发展,显示了在音频相关任务上的卓越性能。
关于异常值检测,你一直想知道但又不敢问的是什么
保证结果的 pythonic 离群点检测独家指南
山下孝文在 Unsplash 上的照片
离群点检测是探索性数据分析中的一个自然的初步步骤,目的是在大多数数据科学项目中获得最具影响力的结果。该过程包括消除异常超限值,以获得最佳预测。易于使用的离群点检测方法一般包括:最小最大分析、Z 得分极值分析、四分位数间距、扩展隔离森林、局部离群点方法。要成为独角兽数据科学家,掌握最有效的异常值检测方法是一项必备技能。在本文中,我们将回顾 Kaggle winners 的异常值检测方法,这些方法可以用简短的 python 代码实现。
我们将分析我们的甜巧克力棒评分数据集,您可以在这里找到。
照片由 Massimo Adami 在 Unsplash 上拍摄
一个具有挑战性的数据集,在分类编码后包含超过 2800 个特征。
- 最小-最大值分析
面临的挑战是找到最有效地提取异常值的最佳方法,最终创建一个适合数据点的模型,减少模型预测的总体误差。这是一个对巧克力评分数据集(一个复杂的多维数据集)进行最小-最大分析的示例。
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy .stats import norm df = pd.read_csv('../input/preprocess-choc/dfn.csv')#so my upper limit will be my mean value plus 3 sigmaupper_limit=df.rating.mean()+3*df.rating.std()#my lowar limit will be my mean - 3 sigmalowar_limit=df.rating.mean()-3*df.rating.std()
现在让我们检查我们的异常值:
df[(df.rating>upper_limit)|(df.rating<lowar_limit)]#now we will visualise the data without outliersnew_data=df[(df.rating<upper_limit)& (df.rating>lowar_limit)]#shape of our outlier’sdf.shape[0]-new_data.shape[0]
输出
使用最小-最大方法检测异常值**(作者提供**图片)
该方法实现了 6 个异常值的检测。让我们画出来:
数据异常值处理前后的数据分布 ( 图片由作者提供)
在 Unsplash 上由 Maciej Gerszewski 拍摄的照片
2.使用 Z 分数的极值分析
Z 得分表示一个数据点距离标准偏差有多少,在我们的例子中,平均值为 3.198,标准偏差为 0.434,因此数据点 4.5 的 Z 得分为:
4.5–3.198(平均值)/0.434(标准值)= 1.847
现在,我们将计算数据点的 z 分数,并显示它们:
df['zscore']=(df.rating-df.rating.mean())/df.rating.std()df#displaying the outlier’s with respect to the zscoresdf[(df.zscore<-3)|(df.zscore>3)]
( 图片作者)
该方法实现了 7 个异常值的检测。
3.四分位数间距(IQR)
四分位数间距 IQR(或 50%中点)是一种衡量上四分位数(Q1:第 25 位)和下四分位数(Q3:第 75 位)之间差异的方法 IQR =Q3Q1。使用超出范围的数据点(最小-最大)可以定义边界,并且可以确定异常值。
我们来编码一下:
Q1=df.rating.quantile(0.25)Q3=df.rating.quantile(0.75)Q1,Q3
输出
3.0 , 3.5
#Now we will calculate the IQR :IQR=Q3-Q1IQR
输出
0.5
Q1 对应于巧克力等级分布的 25%低于 3.0,而 Q3 对应于巧克力等级分布的 75%低于 3.5。
现在,我们将定义巧克力评分分布的上限和下限:
LOWAR_LIMIT=Q1-1.5*IQRUPPER_LIMIT=Q3+1.5*IQRLOWAR_LIMIT,UPPER_LIMIT
输出
2.25, 4.25
现在,我们将在数据框中显示异常值评级:
df[(df.rating<LOWAR_LIMIT)|(df.rating>UPPER_LIMIT)]
( 图片作者)
该算法发现了 36 个异常值。让我们画出结果:
数据异常值处理前后的数据分布 ( 图片由作者提供)
4.扩展隔离林方法
扩展隔离森林这是一种垂直或水平决策边界线性回归算法,从训练数据中选择随机斜率和偏差。唯一的方法缺点是不能正确检测分支切割数据点。
我们来编码一下:
**# Import the libraries** from scipy import statsfrom sklearn.ensemble import IsolationForestfrom sklearn.neighbors import LocalOutlierFactorimport matplotlib.dates as mdfrom scipy.stats import norm%matplotlib inlineimport seaborn as snsfrom sklearn.model_selection import train_test_splitsns.set_style("whitegrid") #possible choices: white, dark, whitegrid, darkgrid, ticksimport eif as isoimport matplotlib.pyplot as pltimport plotly.express as pximport plotly.graph_objs as goimport plotly.figure_factory as fffrom plotly import toolsfrom plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplotpd.set_option('float_format', '{:f}'.format)pd.set_option('max_columns',250)pd.set_option('max_rows',150)**#Define X_train, y_train**a = df_enc.loc[:,~df_enc.columns.duplicated()]b = a.drop('rating', axis = 1)X = b.iloc[:,0:11]y = a.iloc[:,2]X_train,y_train, X_test,y_test = train_test_split(X, y, test_size=0.3)**#Define Extend isolation forest** clf = IsolationForest(max_samples='auto', random_state = 1, contamination= 0.02)**# Transform data** preds = clf.fit_predict(X)**# Define outliers bondaries structure** df['isoletionForest_outlier’s'] = predsdf['isoletionForest_outlier’s'] = df['isoletionForest_outlier’s'].astype(str)df['isoletionForest_scores'] = clf.decision_function(X)**# Counts the chocolate rating outliers :**print(df['isoletionForest_outlier’s'].value_counts())
输出
**1 2179****-1 45****Name: isoletionForest_outlier’s, dtype: int64**
该算法发现了 45 个异常值。让我们画出结果:
fig, ax = plt.subplots(figsize=(30, 7))ax.set_title('Extended Outlier Factor Scores Outlier Detection', fontsize = 15, loc='center')plt.scatter(X.iloc[:, 0], X.iloc[:, 1], color='g', s=3., label='Data points')radius = (df['isoletionForest_scores'].max() - df['isoletionForest_scores']) / (df['isoletionForest_scores'].max() - df['isoletionForest_scores'].min())plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s=2000 * radius, edgecolors='r', facecolors='none', label='Outlier scores')plt.axis('tight')legend = plt.legend(loc='upper left')legend.legendHandles[0]._sizes = [10]legend.legendHandles[1]._sizes = [20]plt.show()
使用扩展离群因子分数的参数圆离群点检测
该图通过使用圆的大小来描述异常值,较大的圆被检测为异常值。
5.局部异常值方法
局部异常值因子是比较数据点密度的唯一方法。如果密度点小于其他邻近密度点,异常值因子将为负(- 1),因此,该点可视为异常值。
**# Import the libraries**from scipy import statsfrom sklearn.neighbors import LocalOutlierFactorimport matplotlib.dates as mdfrom scipy.stats import norm%matplotlib inlineimport seaborn as snsfrom sklearn.model_selection import train_test_splitsns.set_style("whitegrid") #possible choices: white, dark, whitegrid, darkgrid, ticksimport eif as isoimport matplotlib.pyplot as pltimport plotly.express as pximport plotly.graph_objs as goimport plotly.figure_factory as fffrom plotly import toolsfrom plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplotpd.set_option('float_format', '{:f}'.format)pd.set_option('max_columns',250)pd.set_option('max_rows',150) **#Define X_train, y_train**a = df_enc.loc[:,~df_enc.columns.duplicated()]b = a.drop('rating', axis = 1)X = b.iloc[:,0:11]y = a.iloc[:,2]X_train,y_train, X_test,y_test = train_test_split(X, y, test_size=0.3)**#Define Extend isolation forest** clf = LocalOutlierFactor(n_neighbors=11)**# Transform data :**y_pred = clf.fit_predict(X)**# Define outliers bondaries structure** df['localOutlierFactor_outlier’s'] = y_pred.astype(str)
df['localOutlierFactor_scores'] = clf.negative_outlier_factor_**# Counts the chocolate rating outliers** print(df['localOutlierFactor_outlier’s'].value_counts())
输出
**1 2161****-1 63****Name: localOutlierFactor_outlier’s, dtype: int64**
该算法发现了 63 个异常值。让我们画出结果:
fig, ax = plt.subplots(figsize=(30, 7))ax.set_title('Local Outlier Factor Scores Outlier Detection', fontsize = 15, loc='center')plt.scatter(X.iloc[:, 0], X.iloc[:, 1], color='g', s=3., label='Data points')radius = (df['localOutlierFactor_scores'].max() - df['localOutlierFactor_scores']) / (df['localOutlierFactor_scores'].max() - df['localOutlierFactor_scores'].min())plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s=2000 * radius, edgecolors='r', facecolors='none', label='Outlier scores')plt.axis('tight')legend = plt.legend(loc='upper left')legend.legendHandles[0]._sizes = [10]legend.legendHandles[1]._sizes = [20]plt.show()
使用局部离群因子分数的参数圆离群点检测(作者的图片)
该图通过使用圆的大小来描述异常值,较大的圆被检测为异常值。
安东尼奥·卡斯特利亚诺在 Unsplash 上的照片
如果你有空闲时间,我建议你看看这个:
总结一下
请参考此链接:
https://jovian . ml/yeonathan/5-best-outliers-detection-methods-2020
使用这些方法完成巧克力棒数据集的离群点检测。
使用几种异常值检测方法在数据科学中是至关重要的,这一简要概述提醒了使用多重异常值消除方法的重要性。因此,提取最佳数据值,以及共享有用的文档。
希望你喜欢,继续探索!
阿瑟尼·波苏邦科在 Unsplash 上的照片
关于云中的网络安全,你需要知道什么
云计算中的网络安全越来越受到许多组织的关注,尤其是那些使用云来存储客户敏感数据的组织。
杰佛森·桑多斯在 Unsplash 上拍摄的照片
组织越来越多地使用云计算技术来构建、部署和迁移到基于云的环境。
虽然谷歌云平台(GCP)、微软 Azure 和亚马逊网络服务(AWS)等云服务提供商继续扩展云安全服务来保护他们的云基础设施,但在云中实施适当的网络安全并保护存储在其中的数据最终是客户的责任。
尽管有一系列好处,但在公开托管的云环境中保护组织的数据很容易使组织暴露于许多威胁媒介。
一项调查显示,云中最大的网络安全挑战是数据丢失(64%)、数据隐私(62%),其次是凭证意外泄露(39%)和合规性问题(39%)。
随着数据继续向云迁移,许多网络安全专业人员正在努力维护其云环境的安全性。
云计算带来了新的挑战。
当使用云服务时,无论是软件即服务(SaaS)还是基础设施即服务(IaaS),客户总是有某种程度的责任来保护他们的数据免受攻击者的攻击。
对于 SaaS 服务,他们的控制主要是限制访问和加密数据,如果 SaaS 允许的话。借助平台即服务(PaaS)和 IaaS,组织在保护数据方面承担了更多责任。
克服网络安全中的云安全挑战
云中的安全问题是许多考虑云计算服务的组织的主要关注点。云的快速发展不仅凸显了云的优势,也关注了其环境中存在的云安全挑战。
是真的吗?云计算真的不安全吗?
答案很复杂。
通过实施最新的安全措施,单个云计算服务可以显著提高安全性。事实上,许多云服务提供商在将安全性集成到云基础架构方面做得很好,并且比许多其他组织做得更安全。
然而,并不是每个云服务提供商都是这样,因此在审查云提供商的安全状况时必须小心谨慎。
云计算的安全性也依赖于用户。未能正确遵守安全标准并及时解决安全风险可能会导致本可预防的网络攻击或数据泄露。这要求公司了解并以有效的方式降低云安全风险。
云中的大多数安全问题都围绕着数据和访问,因为云计算服务中的大多数共享责任模型将这两个方面完全留给了客户。
因此,攻击者一直将注意力集中在这个潜在的安全漏洞上。有几个与云安全相关的挑战。云计算安全最常见的问题包括:
- 识别和维护必要的安全控制
- 平衡云服务提供商和用户之间维护安全的共同责任
- 符合法规要求以保护云环境中的数据。
简而言之,云安全是相当动态的,主要取决于最终用户理解和解决云计算安全风险和漏洞的程度。
幸运的是,遵循云安全最佳实践可以在很大程度上降低云安全风险。下面,我们列出了云中的顶级网络安全最佳实践,可以帮助您构建和维护安全的云环境。
网络安全:云中的最佳实践
想要以安全的方式利用云计算吗?以下是云中的一些最佳网络安全实践:
实施强用户访问控制/最低权限
与传统的软件安全流程类似,管理员应该实施强大的用户访问控制,以定义谁可以访问数据以及用户可以访问数据的程度。这将有助于确保只有授权用户才能访问云基础架构中的数据。
使用最低特权模型,还可以确保用户只能访问他们完成任务所需的数据。当现有用户和新用户访问新服务器时,实现用户访问控制和最低权限的过程可以很容易地自动化,以提高准确性并节省时间。
使用 SSH 密钥并安全地存储密钥
安全套接字外壳(SSH)密钥有助于使用私有和公共密钥对建立安全的服务器连接。因为它们用于访问敏感数据和执行关键的特权活动,所以正确管理 SSH 密钥并安全地存储它们非常重要。
公司应创建特殊的云计算和密钥管理策略,以监控这些密钥在到期时是如何创建、管理和删除的。例如,应监控和分析通过 SSH 密钥进行的任何特权会话,以满足监管和网络安全需求。
在云中实施加密
云计算中的数据加密对组织来说至关重要,因为它有助于确保进出云的数据是加密和安全的。
在选择云服务提供商时,您需要对云部署和将存储在云中的数据的安全需求保持警惕。很多云服务提供商提供云加密服务;很多时候,您可能希望管理自己的加密密钥,而不是完全依赖提供商。只是根据你的风险承受能力来管理。
加密与其他安全协议(如最低特权原则(PoLP ))相结合,使组织能够满足严格的法规政策,如 PCI DSS、HIPAA 和 GDPR。
执行常规渗透测试
云渗透测试有助于识别云基础设施中的安全漏洞。
对于云计算,pen 测试通常是一项共同的责任,这意味着您的组织和您的云服务提供商都可以执行渗透测试来检测云中的安全漏洞。
云中的笔测试和其他笔测试有区别吗?
通常,云计算环境中的笔测试与其他笔测试没有太大区别。虽然云应用程序和基础设施的设置方式存在重大差异,但 pen 测试的原则是相同的,即识别和减少安全漏洞。
硬化和受控的图像
强化的虚拟服务器映像基本上是一个没有任何手边特定任务不必要的内容的映像,并且其配置受到严格保护。这些映像是根据适当的云安全标准构建的,具有最低的访问权限和管理权限,并且只有所需的端口和服务。
强化和控制映像是限制云安全漏洞和保护您的组织的深度防御策略的关键组成部分。
实施多因素身份认证
多因素身份认证(MFA)使用一系列身份认证方法来保护您的公司数据和用户帐户,如一次性密码、生物识别、安全问题等。
MFA 将如何帮助确保更好的云计算安全性?
通过在您的云计算环境中实施 MFA,您可以将对云中数据的访问权限仅限于授权用户,并防止凭据丢失、被盗或受损的风险。
扫描漏洞和未经批准的强化流程
云计算环境中的错误配置会产生可被利用的安全漏洞。
根据一份报告,在任何给定时间,公司平均至少有 14 个错误配置的 IaaS 事件在运行,导致平均每月约 2,300 起云错误配置事件。
为了避免这样的网络安全漏洞,您需要审核您的 IaaS 配置,以进行访问管理、加密和网络配置。
此外,考虑自动扫描加固的映像、docker 容器和所有新部署的服务器,以识别在部署或管理时云计算环境中可能引入的安全漏洞。
不要只寻找现有的网络安全漏洞,要不断扫描您的环境,寻找任何没有经过适当强化配置的项目。如果某些内容偏离了硬化配置,请用批准的硬化映像替换它。记住,牛不是宠物!
总结和展望
云计算既带来了好处,也带来了挑战。虽然云中的网络安全是云服务提供商和用户的共同责任,但许多组织没有正确履行自己的责任,牺牲了客户的利益。
无论是由于疏忽还是缺乏知识,误用您的云环境都会带来严重的后果。确保实施严格的云计算安全策略,以确保云中的数据是安全的。
运行云基础设施不是一件容易的事情,我们明白这一点。
我们的安全团队由 AWS、Azure、Google Cloud 方面的顶级安全和主题专家以及知识渊博的安全培训师组成,他们可以帮助您解决在购买云服务之前应该向云服务提供商提出的问题。
我们还提供安全审计来检测和缓解云基础架构中的安全漏洞,使您能够轻松保护您的云环境。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。
关于深度强化学习,你需要知道什么
人工智能算法正越来越多地为我们的现代社会提供动力,并在从金融到医疗保健再到交通运输的各个领域留下印记。如果说 20 世纪下半叶是计算和连接(互联网基础设施)的全面进步,那么 21 世纪将被智能计算和智能机器竞赛所主导。
然而,大多数关于这些新颖计算范例的讨论和认识都围绕着所谓的“监督学习”,其中DeepLearning(DL)占据了中心位置。最近的进步和惊人的成功——从疾病分类到图像分割到语音识别——使得 DNNs 在高科技系统的各个方面都得到了极大的发展和应用。
然而,DNN 系统需要大量的训练数据(已经知道答案的标记样本)才能正常工作,它们并不完全模仿人类学习和应用智能的方式。几乎所有的人工智能专家都同意,简单地扩大基于 DNN 的系统的规模和速度,永远不会产生真正的“类人”人工智能系统,甚至不会产生任何与之接近的东西。
因此,有很多研究和兴趣探索超越监督学习领域的 ML/AI 范例和算法,并试图遵循人类学习过程的曲线。收入是其中研究最广泛、最令人兴奋的。
在这篇文章中,我们简要地讨论了现代的 DL 和 RL 如何在一个叫做DeepRe enforcementLearning(DRL)的领域中融合在一起,从而产生强大的人工智能系统。
什么是深度强化学习?
人类擅长解决各种各样的挑战性问题,从低级别的运动控制(如走路、跑步、打网球)到高级别的认知任务(如做数学、写诗、交谈)。
强化学习旨在使软件/硬件代理能够通过定义明确、设计良好的计算算法来模仿人类行为。这种学习范例的目标不是以简单的输入/输出功能方式(像一个独立的 DL 系统)映射标记的例子,而是建立一个策略,帮助智能代理按顺序采取行动,以实现某个最终目标。
图来源:“机器学习的类型有哪些”
更正式地说,RL 指的是面向目标的算法,它学习如何实现一个复杂的目标或如何在许多步骤中沿着一个特定的维度最大化。以下示例说明了它们的用法:
- 一种最大限度提高获胜概率的棋类游戏
- 使交易收益最大化的金融模拟
- 在复杂环境中移动的机器人,使其运动中的误差最小化
其思想是,代理通过传感器数据接收来自环境的输入,使用 RL 算法对其进行处理,然后采取行动以满足预定目标。这与我们人类在日常生活中的行为非常相似。
深度强化学习中的一些基本定义
对于接下来的讨论,更好地理解 RL 中使用的一些关键术语是有用的。
Agent :一种软件/硬件机制,根据其与周围环境的交互而采取一定的动作;例如,无人机送货,或超级马里奥导航视频游戏。算法就是代理。
动作 :动作是代理可以做出的所有可能动作中的一个。一个动作几乎是不言自明的,但是应该注意,代理通常从一系列离散的、可能的动作中进行选择。
环境 :智能体活动的世界,对智能体做出反应的世界。环境将代理的当前状态和动作作为输入,并将代理的奖励及其下一个状态作为输出返回。
状态 :状态是代理人发现自己的一种具体的、即时的情况;即一个特定的地点和时刻,一个将主体与其他重要事物联系起来的瞬时配置。一个例子是棋盘的特殊结构。
奖励 :奖励是我们在给定状态下衡量一个代理人行动成败的反馈。比如在一局棋中,消灭对手的主教等重要动作可以带来一定的奖励,而赢下一局可能会带来很大的奖励。负面奖励也有类似的定义,例如游戏中的失败。
折扣系数 :折扣系数是一个乘数。代理人发现的未来奖励会乘以这个系数,以抑制这些奖励对代理人当前行动选择的累积效应。这是 RL 的核心,即逐渐降低未来奖励的价值,以便给予最近的行动更多的权重。这对于基于“延迟行动”原则的范例来说是至关重要的。
策略 :策略是 agent 根据当前状态决定下一步动作所采用的策略。它将状态映射到行动,即承诺最高回报的行动。
价值 :折现后的预期长期回报,与短期回报相对。该值被定义为特定政策下当前状态的预期长期回报。
Q-value 或 action-value : Q-value 类似于 value,只是多了一个参数,即当前动作。它是指在特定策略下采取特定行动的行动从当前状态的长期回报。
常见的数学和算法框架
解决 RL 问题的一些常见数学框架如下:
马尔可夫决策过程(MDP) :几乎所有的 RL 问题都可以被框定为 MDP。MDP 的所有州都具有“马尔可夫”特性,指的是未来只取决于当前的州,而不是各州的历史。
贝尔曼方程 :贝尔曼方程是指将价值函数分解为眼前报酬加上未来贴现值的一组方程。
动态规划 :当系统(agent + environment)的模型完全已知时,遵循贝尔曼方程,我们可以使用动态规划(DP)迭代地评估价值函数并改进策略。
值迭代 :是通过迭代改进值的估计来计算最优状态值函数的算法。该算法将值函数初始化为任意随机值,然后重复更新 Q 值和值函数值,直到它们收敛。
策略迭代 :由于智能体只关心寻找最优策略,有时最优策略会先于价值函数收敛。因此,策略迭代,而不是反复改进价值函数估计,在每一步重新定义策略,并根据这个新策略计算价值,直到策略收敛。
Q-learning :这是一个无模型学习算法的例子。它不假设代理人知道任何关于状态转换和奖励模型的事情。然而,代理会通过试错来发现什么是好的和坏的行为。Q-Learning 的基本思想是从我们在主体与环境的交互过程中观察到的 Q 值函数样本中逼近状态-动作对 Q 函数。这种方法被称为时差学习。
图:Q-learning(试错观察法)解决的一个示例 RL 问题。环境的动力学和模型,即运动的整个物理学是未知的。
无模型强化学习的挑战
Q-learning 是一种简单而强大的解决 RL 问题的方法,并且在理论上,可以在不引入额外数学复杂性的情况下扩大到大型问题。基本的 Q 学习可以在递归方程的帮助下完成,
这里,
Q(s,a) : Q 值函数,
s :状态
s ',s ’ ':未来状态
答:动作
γ :折扣系数
对于小问题,可以从任意假设所有 Q 值开始。通过试错法,Q 表得到更新,政策朝着收敛的方向发展。更新和选择操作是随机进行的,因此,最优策略可能不代表全局最优,但它适用于所有实际目的。
然而,随着问题规模的增长,为一个大问题构建和存储一组 Q 表很快成为一个计算挑战。例如,在像国际象棋或围棋这样的游戏中,可能状态的数量(移动的顺序)随着你想要提前计算的步数呈指数增长。因此,
- 保存和更新该表所需的内存量将随着状态数量的增加而增加
- 探索每个状态以创建所需的 Q 表所需的时间是不现实的
深度 Q 学习等技术试图使用 ML 来应对这一挑战。
深度 Q 学习
顾名思义,深度 Q-learning 不是维护一个很大的 Q 值表,而是利用一个神经网络从给定的动作和状态输入中逼近 Q 值函数。在一些公式中,状态作为输入给出,所有可能动作的 Q 值作为输出产生。神经网络叫做Deep-Q–Nnetwork(DQN)。基本思想如下所示,
图来源: 一个用 Python 语言 使用 OpenAI Gym 进行深度 Q 学习的动手介绍
但是和 DQN 一起工作是很有挑战性的。在传统的 DL 算法中,我们对输入样本进行随机化,因此输入类在各种训练批次中相当平衡和稳定。在 RL 中,随着探索阶段的进展,搜索变得更好。这不断地改变输入和动作空间。另外,随着关于环境的知识变得更好,Q 的目标值自动更新。简而言之,对于一个简单的 DQN 系统来说,输入和输出都是频繁变化的。
为了解决这个问题,DQN 引入了经验回放和目标网络的概念来减缓变化,以便能够以受控/稳定的方式逐渐学习 Q 表。
体验重放在专门的缓冲器中存储一定量的状态-动作-奖励值(例如最后一百万)。使用来自该缓冲区的小批量随机样本来完成 Q 函数的训练。因此,训练样本是随机化的,并且表现得更接近于传统 DL 中监督学习的典型情况。这类似于拥有高效的短期记忆,在探索未知环境时可以依靠这种记忆。
此外,DQN 通常采用两个网络来存储 q 值。一个网络不断更新,而第二个网络,即目标网络,以规则的间隔与第一个网络同步。目标网络用于检索 Q 值,使得目标值的变化不太易变。
深度强化学习的例子(DRL)
玩雅达利游戏(DeepMind)
DeepMind ,一家总部位于伦敦的初创公司(成立于 2010 年),于 2014 年被谷歌/Alphabet 收购,为 DRL 领域做出了开创性的贡献,当时成功地使用卷积神经网络(CNN)和 Q-learning 的组合,训练一个代理人仅从原始像素输入(作为感官信号)玩雅达利游戏。详情可以在这里找到。
图来源: DeepMind 关于 arXiV 的雅达利论文(2013) 。
阿尔法围棋和阿尔法围棋零(DeepMind)
围棋起源于 3000 多年前的中国,由于其复杂性,它被称为对人工智能最具挑战性的经典游戏。标准的人工智能方法使用搜索树测试所有可能的移动和位置,无法处理可能的围棋移动的绝对数量或评估每个可能的棋盘位置的强度。
利用 DRL 技术和一种新颖的搜索算法,DeepMind 开发了 AlphaGo,这是第一个击败职业人类围棋选手的计算机程序,第一个击败围棋世界冠军,可以说是历史上最强的围棋选手。
图来源:https://medium . com/point-nine-news/what-does-alpha go-vs-8 dadec 65 AAF
这种 Alpha Go 的一个更好的版本叫做 Alpha Go Zero。在这里,该系统由一个神经网络启动,该网络对围棋游戏或规则一无所知。然后,它通过将这种神经网络与强大的搜索算法相结合,与自己进行博弈。在重复的游戏过程中,神经网络被调整和更新,以预测移动,以及游戏的最终赢家。这个更新的神经网络然后与搜索算法重新组合,创建一个新的、更强的 AlphaGo Zero 版本,这个过程再次开始。在每一次迭代中,系统的性能都有少量的提高,并且自玩游戏的质量也提高了。
图来源: AlphaGo Zero:从零开始
在石油和天然气行业的应用
荷兰皇家壳牌公司一直在勘探和钻井工作中部署强化学习,以降低天然气开采的高成本,并改善整个供应链中的多个步骤。根据历史钻井数据训练的 DL 算法,以及基于物理学的高级模拟,用于在气体钻井穿过地下时对其进行导向。DRL 技术还利用来自钻头的机械数据——压力和钻头温度——以及地下相关的地震勘测数据。点击此处阅读更多内容:
令人难以置信的方式壳牌利用人工智能帮助石油天然气巨头 转型。
自动驾驶
虽然还不是主流,但 DRL 在应用于自动驾驶汽车的各种具有挑战性的问题领域方面存在巨大的潜力。
- 车辆控制
- 匝道合并
- 个人驾驶风格感知
- 安全超车的多目标 RL
本文将概念解释清楚: 探索深度强化学习在现实世界自动驾驶系统中的应用。
关于深度强化学习,您需要了解的主要内容
强化学习是真正可扩展的、人类兼容的人工智能系统的最有希望的候选者,也是朝着人工智能(AGI)的最终进步的最有希望的候选者。然而,对于几乎所有的实际问题,由于爆炸式的计算复杂性,传统的 RL 算法极难扩展和应用。
深度学习近年来改变了人工智能领域,可以以系统有效的方式应用于 RL 领域,以部分解决这一挑战。这种方法产生了像 AlphaGo 这样的智能代理,它们可以完全从零开始学习游戏规则(因此,通过推广,学习关于外部世界的规则),而无需明确的训练和基于规则的编程。
因此,DRL 的未来和希望是光明的。在这篇文章中,我们谈到了 RL 和 DRL 的基础知识,让读者对这个强大的人工智能子领域有所了解。
关于 dplyr 1.0.0,您需要了解的七件重要事情
这次更新有很多你应该知道的非常强大的新特性
用 R 编码的都知道dplyr
。它实际上是 R 的定义包,旨在让那些相信“整洁数据”原则的人(我怀疑是大多数数据科学家)对数据帧的操作更加直观。事实上,很多人用dplyr
编码比用 R base 编码更好。这就是为什么dplyr
在 R 生态系统中变得如此重要,连同其他目前组成tidyverse
的包。
所以新版本的发布对于大多数 R 用户来说是令人兴奋的。事实上,它的版本 1.0.0 意味着它是一个真实的事件。Hadley Wickham 和 T4 背后的开源开发者团队不会轻易给出这个版本号。通过使其更强大,通过将许多以前不同的功能统一在一个更抽象的保护伞下,最重要的是试图为用户提供更多日常解决他们最常见的数据框架争论问题的解决方案,大量的努力被投入到超能力dplyr
的功能中。
dplyr 1.0.0
现在可以使用install.packages("dplyr")
进行安装。您可能需要更新您的 R 版本,以确保安装此更新。我无论如何都推荐升级到 R 4.0.0。
在这篇文章中,我将按照我所认为的复杂性递增的顺序来介绍主要的新特性。我将使用内置的数据集——主要是mtcars
——来演示我的意思。
1.内置于 tidyselect
您现在可以在某些dplyr
动词中使用tidyselect
辅助函数。例如:
library(dplyr)mtcars %>%
select(starts_with("c")) %>%
head(3)
mtcars %>%
select(any_of(c("mpg", "cyl", "trash"))) %>%
head(3)
tidyselect
像这样的帮助函数可以在任何选择函数中工作,包括一些我们稍后会看到的新函数。你可以在这里找到tidyselect
功能的全部内容。
2.简单但非常有用 relocate()函数
人们通常希望数据帧中的列有一个特定的顺序,而以前唯一的方法是在一个select()
动词中对列进行排序,如果涉及到很多列,这就很繁琐了。
默认情况下,relocate 会将您的一列或多列移动到数据框的左侧。如果你想把它们移动到一个特定的地方,你可以使用.before
或者.after
参数。例如:
mtcars %>%
dplyr::relocate(disp) %>%
head(3)
mtcars %>%
relocate(starts_with("c"), .after = disp) %>%
head(3)
3.summarise()函数极其强大的扩展
总结——dplyr
的原始工具——在这个新版本中变得更加灵活。首先,它现在可以返回向量以在输出中形成多行。其次,它可以返回数据帧以在输出中形成多行和多列。对于一些人来说,这可能有点令人费解,所以我将在这里花一点时间来说明这是如何工作的。
如果你想总结出一个能产生矢量输出的函数,这很容易。例如,你可以简单概括一个系列:
mtcars %>%
group_by(cyl) %>%
summarise(range = range(mpg))
如果您愿意,您可以与tidyr::pivot_wider()
结合:
library(tidyr)mtcars %>%
group_by(cyl) %>%
summarise(range = range(mpg)) %>%
mutate(name = rep(c("min", "max"), length(unique(cyl)))) %>%
pivot_wider(names_from = name, values_from = range)
这相当于:
mtcars %>%
group_by(cyl) %>%
summarise(min = min(mpg), max = max(mpg))
在这种情况下,第二个选项要简单得多,但是这在输出较长的情况下会很有用。这里有一个计算十分位数的简单方法:
decile <- seq(0, 1, 0.1)mtcars %>%
group_by(cyl) %>%
summarise(deciles = quantile(mpg, decile)) %>%
mutate(name = rep(paste0("dec_", decile), length(unique(cyl)))) %>%
pivot_wider(names_from = name, values_from = deciles)
现在你总结输出可以是一个数据框架。让我们看一个简单的例子。最近我写了一个函数,可以识别一个向量中所有唯一的无序元素对。现在我想应用它来绘制出朋友的角色之间的联系网络,基于出现在同一个场景中。
这是我可能正在使用的数据框架的一个简单版本:
friends_episode <- data.frame(
scene = c(1, 1, 1, 2, 2, 2),
character = c("Joey", "Phoebe", "Chandler", "Joey", "Chandler", "Janice")
)friends_episode
现在,我将编写我的函数,该函数接受一个矢量并产生一个两列数据帧,并按场景应用它:
unique_pairs <- function(char_vector = NULL) { vector <- as.character(unique(char_vector)) df <- data.frame(from = character(), to = character(), stringsAsFactors = FALSE) if (length(vector) > 1) {
for (i in 1:(length(vector) - 1)) {
from <- rep(vector[i], length(vector) - i)
to <- vector[(i + 1): length(vector)] df <- df %>%
dplyr::bind_rows(
data.frame(from = from, to = to, stringsAsFactors = FALSE)
)
}
} df} friends_episode %>%
group_by(scene) %>%
summarise(unique_pairs(character))
正如您可能看到的,dataframe 是我的summarise()
函数的输出,它已经被解包并在最终输出中形成了两列。如果我们命名我们的summarise()
函数的输出会发生什么?
friends_pairs <- friends_episode %>%
group_by(scene) %>%
summarise(pairs = unique_pairs(character))friends_pairs
所以这是一个重要的警戒。如果您希望您的summarise()
输出解包,不要命名它。
4.与 cross 的更强大的 colwise 争论()
有了这些更强大的汇总功能,再加上内置的tidyselect
工具包,我们就有了更强大、更抽象的功能来处理我们的数据列,并形成更广泛的任务。新副词across()
的引入实现了这一点。
简而言之,新函数across()
在现有的dplyr
动词(如summarise()
或mutate()
)中跨多个列和多个函数进行操作。这使得极其强大且省时。现在不再需要作用域变量,如summarise_at()
、mutate_if()
等。
首先,您可以通过手动定义一组列来复制summarise_at()
,使用列名的字符向量进行总结,或者使用列号:
library(dplyr)mtcars %>%
group_by(cyl) %>%
summarise(across(c("mpg", "hp"), mean))
across()
是一个选择函数,因此您可以在其中使用tidyselect
语法。您可以通过使用一个函数选择您的列来复制mutate_if()
。这里我们将dplyr::storms
数据集中的name
和status
列从字符转换为因子。
storms %>%
dplyr::mutate(across(is.character, as.factor)) %>%
dplyr::select(name, status)
还可以通过使用列表将多个命名函数应用于多个列。默认情况下,across()
函数会用下划线将函数名和列名粘在一起:
mtcars %>%
group_by(cyl) %>%
summarise(across(c("mpg", "hp"), list(mean = mean, median = median, sd = sd)))
如果您想使用不同的粘合公式,可以使用粘合语法:
mtcars %>%
group_by(cyl) %>%
summarise(across(starts_with("d"),
list(mean = mean, sd = sd),
.names = "{col}_{fn}_summ"))
如果需要在函数中添加可选参数,可以使用公式:
mtcars %>%
group_by(cyl) %>%
summarise(across(c("mpg", "hp"),
list(mean = ~mean(.x, na.rm = T),
median = ~median(.x, na.rm = T),
sd = ~sd(.x, na.rm = T)),
.names = "{col}_{fn}_summ"))
同样,您可以使用公式来组合函数,以避免不必要的额外变异:
mtcars %>%
group_by(cyl) %>%
summarise(across(mpg,
list(minus_sd = ~(mean(.x) - sd(.x)),
mean = mean,
plus_sd = ~(mean(.x) + sd(.x)))
))
5.rowwise()在新的 dplyr 中变得生动起来
dplyr
以前对跨行工作的友好程度有限。以前,当您想要对同一行中的值求和或求平均值时,它的行为有些违背直觉。这里有一个例子,你们中的一些人可能会认为这是以前头痛的根源:
WorldPhones_df <- WorldPhones %>%
as.data.frame() # mutate an average columnWorldPhones_df %>%
dplyr::mutate(avg = mean(N.Amer:Mid.Amer))
这返回了数据帧中每一列的平均值,这当然不是我们想要的。
以前,解决这个问题的唯一方法是使用手动计算,并避免以这种方式使用函数,所以你会写(N.Amer + Europe + Asia + S.Amer + Oceania + Africa + Mid.Amer)/7
,这是相当乏味的。
rowwise()
创建了一个名为rowwise_df
的不同结构,它准备你的数据来执行跨行操作——它基本上按行对你的数据进行分组。
新的c_across()
副词赋予了rowwise()
强大的功能,允许您以类似于使用across()
副词的方式工作。现在你可以写:
WorldPhones_df %>%
rowwise() %>%
dplyr::mutate(avg = mean(c_across(N.Amer:Mid.Amer)))
6.在数据框架中运行不同的模型
新的rowwise_df
对象设计用于列表列,它允许在数据帧的列中存储任何类型的数据。我发现这个特别有价值的地方是,你想根据某些变量的值对你的数据子集运行不同的模型。这里有一个例子,说明如何将不同的mtcars
子集存储在一个行方式的数据帧中,然后在它们上面运行一个模型。
model_coefs <- function(formula, data) {
coefs <- lm(formula, data)$coefficients
data.frame(coef = names(coefs), value = coefs)
}mtcars %>%
dplyr::group_by(cyl) %>%
tidyr::nest() %>%
dplyr::rowwise() %>%
dplyr::summarise(model_coefs(mpg ~ wt + disp + hp, data = data)) %>%
tidyr::pivot_wider(names_from = coef, values_from = value)
7.nest_by()
功能
当然,dplyr 1.0.0
背后的开发人员注意到了这种行方式建模能力的强大,因此创建了nest_by()
函数作为上面代码的快捷方式。nest_by(x)
相当于:
dplyr::group_by(x) %>%
tidyr::nest() %>%
dplyr::rowwise()
因此,现在您可以使用以下方法进行上述建模:
mtcars %>%
nest_by(cyl) %>%
dplyr::summarise(model_coefs(mpg ~ wt + disp + hp, data = data)) %>%
tidyr::pivot_wider(names_from = coef, values_from = value)
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或Twitter上找我。也可以看看我在drkeithmcnulty.com的博客。
所见即所得!
图一,来源
在计算语言学和自然语言处理中,将代词解析到给定句子中的特定主语/宾语一直是一个开放式的研究课题。它需要从各种信息源和上下文知识中进行复杂的推理。
为了解决这个问题,本文——“所见即所得:对话中的视觉代词指代消解**“**定义了对话中视觉感知代词指代消解(PCR)的任务。它描绘了’ VisCoref ‘和’ VisPro '(分别是模型和数据集),以研究如何利用视觉信息使用深度学习来解析代词。
本文解决了代词指代的问题,特别是在对话中。先前的工作已经在正式的书面文本上取得了相当高的准确率,但是在对话上却没有。原因是,与正式的文本相比,对话中需要更多关于环境和语境的信息。例如,如果两个人正在交谈,他们可能会简单地用代词“它”来指代他们眼前的一个物体,或者简单地指向这个物体。因此,本文提出了这种类型的第一个模型,以及一个数据集,使用图像和文本对话来共同引用代词。
VisPro 数据集
VisPro 数据集可以被认为是 VisDial 数据集的升级版,其中每张图片都附有一段讨论该图片的对话记录。然而, VisPro 通过为每张图片增加一个“标题”来改进这个数据集,标题可以被认为是一个图片元数据。
图 2:句子“一个带着狗的人在草地上行走”的语法解析来源:https://arxiv.org/pdf/1909.00421.pdf
该数据集还经过预处理,以避免候选名词短语的重叠。它只选择解析树中高度为两个 T21 的名词短语。举个例子,考虑下面这句话“一个打着伞的女孩走在路上。”数据集将选择“一个女孩”、“一把伞”和“道路”作为候选;而不是“打伞的女孩”和“马路”。因此,在语法(解析)树中有一个有限的高度 2 有助于减少选项的混乱。
执行的另一个重要的预处理任务是只保留那些具有 4 到 10 个代词的对话。这有助于解决代词爆炸的问题(导致代词重复)和代词太少的问题(这对任务没有什么用处)。
VisCoref 模型
图 3:模型流程图,来源:https://arxiv.org/pdf/1909.00421.pdf
模型评分函数 F(n,p)分为两部分,如下所示:
在上面的等式中,Fc和Fp分别是上下文评分函数和视觉评分函数,控制视觉信息的重要性。为了在视觉和上下文信息之间取得良好的平衡,λvis被设置为 0.4 。**
现在,让我们试着理解什么是情境评分和视觉评分,以及它是如何执行的。
上下文评分
该模型首先通过“提及表示模块”将所有上下文信息编码到所有候选代词和目标代词中,该模块在图 3 中由虚线框表示。双向 LSTM 用于执行这种编码并创建加权嵌入。
图 3 所示的嵌入’ en ‘和’ ep '通过双向 LSTM 和区间内注意机制来计算。一旦这些单独的单词嵌入被连接,然后计算上下文评分函数’Fc’。**
视觉评分
对象检测模块用于从图像中识别对象标签,例如“人”、“猫”或“窗户”使用在上下文嵌入模块中执行的相同编码过程,将这些识别的标签转换成矢量表示。
对照候选文本短语检查这些对象标签,无论文本短语是否引用它们。这是通过计算对应于图像中每个检测到的对象的短语的可能性来完成的。通过将分数传递给 softmax 函数,这种可能性被转换为概率。然后,具有最高 softmax 分数的标签被分配给相应的文本短语。****
现在,让我们说两个短语 p1 和 p2 指的是同一个被检测对象。那么, p1 和 p2 对应的 softmax 分值应该是一样大的。
因此,所有相应的标签被分配一个单独的分数,该分数然后被组合以创建整体视觉评分函数’'。**
然后通过计算’ Fc ’ 和’Fv’的加权平均值来计算总分。
实施细节
对于初始单词表示,作者使用了 300 维手套嵌入(Pennington 等人,2014 年)和 ELMo (Peters 等人,2018 年)嵌入的串联。用零向量初始化词汇表外的单词。来自 TensorFlow 的“SSD RESNET 50 fpn coco”模型已经用于对象检测。用于上下文评分和视觉评分的前馈网络分别具有两个 150 维的隐藏层和一个 100 维的隐藏层。对于模型训练,交叉熵损失函数和亚当**(金玛和巴,2015)优化器已用于实现更快的收敛。**
在进行训练时,作者将数据集分为两类——讨论过的和未讨论过的**。它们之间的区别在于,前一种情况下,代词的正确先行词出现在对话文本中;而在后者,他们没有。**
模型评估:
本文将 VisCoref 的性能与其他五种基准模型进行了比较:
1.确定性模型(Raghunathan 等人,2010 年)
2.统计模型(克拉克和曼宁,2015 年)
3.Deep-RL 模型(克拉克和曼宁,2016 年)
4.端到端模型(Lee 等人,2018 年)
5.端到端+可视化(何等,2016)
VisCoref 以显著优势胜过所有这些模型,表明视觉信息确实非常有利。
图 4:模型评估度量以及与其他基线模型的比较。来源:https://arxiv.org/pdf/1909.00421.pdf
从结果表中可以明显看出,VisCoref 模型的 F1 得分高于所有之前发布的基线模型。
案例研究
图 5:来自 VisPro 数据集的随机示例。来源:https://arxiv.org/pdf/1909.00421.pdf
这是一项在 VisPro 数据集的样本上,与端到端模型(Lee 等人,2018 年)相比,VisCoref 模型表现如何的研究。
问:“在和上有任何文字或数字吗?”
给定代词’ it ',端到端模型(Lee et al .,2018)从对话中挑选’任何文字’,而 VisCoref 模型从候选短语中选择’一辆蓝、白、红相间的火车’。没有图像,即使是人也无法区分这两个候选短语。然而,当考虑图像时,我们立即观察图像中的火车,并因此报告“蓝色、白色和红色火车”为正确的候选短语。
因此,这项研究重申了视觉信息在对话中对人类和机器的重要性!
相关著作
用于共指消解的多遍筛选(Raghunathan 等人,2010)
许多现有的共指消解模型使用对一组特征的单个函数来确定两个提及是否是共指的,这导致了不正确的决策,因为较低精度的特征支配了较少数量的高精度特征。本文提出了一个基于筛子的简单共指架构,该架构从最高精度到最低精度一次应用一层确定性共指模型,即一个基于规则的系统,该系统聚合了多个函数,用于基于手工特征确定两个提及是否是共指的。然而,这种技术并未应用于调查报告中,因为较低的相互参照精度已被视觉信息(即图像)所抵消。
【以实体为中心的共指消解与模型堆叠(Clark and Manning,2015)
本文使用实体级信息来训练一个以实体为中心的共指系统,用于学习建立共指链的策略。它使用凝聚聚类,即每个提及对从它自己的聚类开始,然后这些聚类可能会被合并。因此,该模型在提及聚类之间学习人类设计的实体级特征,以产生准确的共指链。同样,本文不使用图像来指代代词,它仅依赖于书面正式文本。
提及排序共指模型的深度强化学习(Clark and Manning,2016)
在这篇论文中,作者应用强化学习来优化一个用于相互参照的神经提及排序模型。这个提及排名模型为给定的对产生一个指示兼容性的分数。对于每一次提及,该模型提取各种单词,如前一个单词,或其句子中的所有单词,并创建嵌入;其然后被馈送到具有几个隐藏层的 ReLU 单元的前馈神经网络,这些隐藏层与前面的层完全连接。本文尝试的共指方法是通过超参数调整这个神经网络。为了调整超参数,它使用强化学习来确定输入到模型的最佳参数选择。与基于图像的相互参照相比,这是一种完全不同风格的相互参照方法。
由粗到精推理的高阶共指消解(Lee et al .,2018)
本文介绍了一种用于共指消解的高阶推理的完全可微近似。它使用来自跨度等级架构的先行分布作为注意机制来迭代地改进跨度表示。先前的论文对共指链接做出独立的决定,因此,容易预测局部一致但全局不一致的聚类。这是一种最先进的共指解决方法。它通过一个端到端的神经网络预测共指聚类,该网络利用预先训练的单词嵌入和上下文信息。在调查论文模型的上下文评分部分创建嵌入时,使用了类似的概念。
使用神经模块网络的视觉对话中的视觉共指消解(Kottur et al .,2018)
本文主要研究视觉共指消解,包括确定哪些词,通常是名词短语和代词,共指图像中的同一个实体/对象实例。作者通过引入两个新的模块——引用和排除——提出了一种用于视觉对话的神经模块网络架构,这两个模块在更精细的单词级别上执行显式的共指消解。“参考”有助于从图像中检索对象标签,“排除”可删除那些不参考图像中任何对象的候选标签。这是唯一一篇将图像数据和文本结合在一起的论文。因此,该模型与调查文件中的模型非常相似。除了创建编码和单词嵌入之外,本文中的内部模型体系结构与本文中的不同。
感谢您的阅读!我希望听到您的反馈!
****注:这是对以下出版物的论文综述——《所见即所得:对话中的视觉代词指代消解 》,作者为、、宋、严松、张长水,在 EMNLP 2019 上发表了一篇长论文。本博客改编自论文,所有研究工作的所有权属于上述作者。
你所看到的是你所猜测的
第一次接触微软 Azure 计算机视觉
Alessandro Vallainc 在 Unsplash 上拍摄的照片
浏览微软云服务平台提供的服务菜单时,我遇到了计算机视觉(CV)。我决定玩一会儿,感受一下这项服务能提供什么。
所以我用我的 github 证书创建了一个免费账户,并在常规验证步骤后成功登陆(链接【美国 )。然后,我按照说明创建了一个 CV 实例,并获得了我的 API 键。
该服务分析用户提供的或互联网上公开的图像和视频内容。该服务在前 12 个月是免费的,上限为每月 5000 笔交易,最大速率为每分钟 20 笔,这足以进行一些测试。
从技术上讲,该服务是通过 REST web 服务交付的,这使我认为我可以很快开始测试它,我也确实这样做了。
它提供了什么
在 CV 的各种服务中,我将重点介绍图像分析。在这种情况下,CV 为您提供了以下信息:
- 标签:从数千个标签的宇宙中,CV 列出了你图像中已识别的物体类型,比如狗、树或车。
- 对象:只要有可能,CV 还会提供一个由图片中的矩形所包围的对象列表。因此,如果有三辆已识别的自行车,它将给出这三辆自行车的边界框的坐标。
- 品牌:它可以从一组数以千计的知名品牌中检测标志。
- 类别:从预先定义的 86 个类别的固定列表中,CV 会给你的照片分配最合适的类别(例如:美食 _ 烧烤或户外 _ 街道)
- 描述:以您选择的语言对整个图像进行描述。实际上这是我感兴趣的特性,所以我将在这里停止列举。完整列表见本。
足够的文献,让我们写一些 python 代码,并把一些 Unsplash 图像扔给 CV 来开始乐趣
第一次尝试:托比亚斯·亚当在 Unsplash 拍摄的照片
简化的计算机视觉客户端
REST web 服务基本上可以在任何通用编程语言中使用。我们将在这里使用 Python 处理这条线上方的图像。看看吧,看看评论:
import requests
import json
# connection details
# Replace this silly pun with your API
azure_cv_api_key = "MyAPI Heat"
# same here
azure_cv_endpoint = "somesubdomain.cognitiveservices.azure.com"
azure_cv_resource = "vision/v3.1/analyze"
language = "en"
# We just ask for some features
visual_features = "Objects,Categories,Description"
image_path = "c:/work/images/tobias-adam-Twm64rH8wdc-unsplash.jpg"
azure_cv_url = "https://{}/{}".format(azure_cv_endpoint,
azure_cv_resource)
headers = {'Ocp-Apim-Subscription-Key': azure_cv_api_key,
'Content-Type': 'application/octet-stream'}
params = {"visualFeatures": visual_features, "language": language}
# We need to read the image as a byte stream
image_data = open(image_path, "rb").read()
response = requests.post(azure_cv_url, params=params, data=image_data, headers=headers)
# assume you get a 200 status (ok)
content = json.loads(response.content.decode(response.encoding))
# This is where the picture description can be found
print("Description\n{}".format(content["description"]["captions"][0]["text"]))# Which objects have you found?
for o in content["objects"]:
print("Object {} Parent {} Grandparent {}".format(o["object"], o["parent"]["object"]), o["parent"]["parent"]["object"])
我们运行它并得到:
描述
一只小象走在它妈妈的旁边
对象非洲象母象祖父母哺乳动物
对象非洲象母象祖父母哺乳动物
哇——我知道,更大的大象可能是父亲或阿姨,但听起来真的很好。
改变语言
在语言分配中,我们用“es”代替“en”。我期待的是将英语原文直接翻译成西班牙语,但这是我们得到的结果(省略了对象):
描述
火车上的一个小孩
哪个不是的直译——如果你不相信我,谷歌翻译一下。这是为什么呢?我不知道,我的猜测是模型在不同的语言中被不同地训练,否则我不知道为什么会发生这种情况。
顺便说一句,Unsplash 中由人类创作的标题是这样的:
两只灰色的大象走在灰色的天空下
又一次尝试
第二次尝试:照片由 Quino Al 在 Unsplash 上拍摄
我替换image_path
如下
image_path = "c:/work/images/quino-al-iRt9yOWzfOk-unsplash.jpg"
得到这个结果
描述
穿衣服的人
对象人
对象人
对象人
该人未被识别为跑步者或运动员。为什么?也许她的腿不在画面上并没有帮助。用西班牙语说:
描述
一个人的馅饼
有趣的是,CV 已经认出了照片中的第三个人,即使照片很模糊,而且只有不到三分之一的身体是可见的。
光学字符识别
CV 中提供的另一个服务是从提供的图像中提取文本。要调用服务,请替换资源:
azure_cv_resource = "vision/v3.1/ocr"
参数是:
params = {'language': 'unk', 'detectOrientation': 'true'}
在生成的字典(content)
中,您会发现一个名为regions
的列表,其中包含 CV 找到的所有填充文本框。我已经用几张图片试过了,结果好坏参半。不要用超 bif 图片尝试,有大小限制。
结论
计算机视觉和图像识别的进步是惊人的。虽然图像分析还没有达到完美,但 CV 等服务的潜在应用是巨大的。
CV 提供了更多的可能性,例如使用定制模型(称为定制视觉的独立服务)或分析视频。
该服务主要是将这一功能集成到第三方开发应用程序中。写这篇文章是为了鼓励你使用这个服务,并想象这个额外的功能可能带来的新的应用。
你应该在数据科学家简历上写些什么(尤其是在疫情时代)
在申请数据科学家职位之前,先了解自己的简历
求职压力已经够大了。申请一份数据科学家的工作更加痛苦,因为与通常的工作申请相比,有更多的事情要准备。在我的时间里,我看过许多数据科学家的简历,知道我想在有抱负的数据科学家身上寻找什么。此外,疫情带来了特殊需求。
至少,当你在疫情寻找数据科学家的工作时,我知道你的简历中应该有什么,因为我在疫情期间设法找到了新的工作(尽管我已经有一些经验)。
尽管如此,我还是想分享一下你应该在简历中哪些东西来申请数据科学家的职位。请注意,根据你申请数据科学家职位的地点,你应该定制简历以满足工作申请。
标题和描述
页面顶部是你简历中最重要的部分。不仅仅是数据科学家,任何简历都是如此。
我认识的许多人力资源部门的人都说,在面试过程中选择候选人时,他们只需看一眼候选人的简历,并在瞬间决定哪份简历值得花时间深入查看。
那么,什么样的标题和描述才是吸引眼球的呢?我会给你一个我自己的简历的例子,以及我在简历中寻找的那种。
作者创建的图像
以上是我在数据科学工作申请中使用的标题和描述示例。让我们一个一个的分解。
标题配置文件
作者创造的形象
页面的顶部应该是你的简短简介,并最大限度地利用空间给出简洁的信息。我们这里需要的信息是您的姓名和联系电话/电子邮件(如果您愿意,包括 LinkedIn)。这里不要添加太多不必要的信息。您毕竟需要空间,并且可以在描述页面上放置附加信息。
专业描述
作者创造的形象
这是你简历中最重要的部分,你的简短描述决定了你的简历是否值得再看一眼。
那么我应该在我的简短描述中写些什么呢?对于一个有经验的数据科学家来说,写下他们是数据科学家以及他们成为具有专业知识的数据科学家有多长时间是很容易的。
对于大一新生/非数据科学家专业人士来说呢?在这种情况下,我们需要写出能够吸引雇主的描述。那么是什么吸引员工呢?对于数据科学家职位,这将是我们的数据科学相关技能。
希望能写出这样的东西,
"{你的专业} 对{你申请的业务} 和数据科学有热情的应届毕业生。我在分析数据和实现机器学习方面经验丰富用**{编程语言}** 在**{你以前的项目/实习/论文/课程作业/在线课程/依赖项目}** 用**{一些你觉得有见地的结果}** ”****
在上面的例子中,我们在描述中需要关注的是:
- 你对他们生意的兴趣
- 必要的数据科学技能(机器学习、编程、统计等。
- 您与数据科学相关的最重要的经历
应届毕业生和无经验人士的描述至少需要展示你作为数据科学家的兴趣和潜力。尽管如此,在这段疫情时间里,你还需要增加一点额外的内容
4.你的适应能力和快速工作能力,表现出沟通技巧
为什么这是加分项?数据科学家是一个团队,许多项目需要展示并与其他人很好地沟通。
在疫情时间,随着社会距离和在家工作的情况下,你需要依靠你的沟通技巧和快速思考,每当问题出现。这就是为什么在你的描述中展示你的适应能力、沟通能力和快速反应能力很重要。
出于你的考虑,保持描述适合公司业务。不要给每一家公司都投相同的简历。人力资源知道哪份简历是专门制作的,哪份简历会发送给很多人。
职业技能描述
作者创建的图像
我们中的许多人经常把我们的技术专业技能放在简历的底部,并列出要点。在我看来,这是错误的做法。
我们希望人力资源部门能立即知道候选人拥有哪些技能。如果你把它放在页面的底部,人力资源可能会错过它,因为他们只阅读页面的顶部。在这种情况下,我们希望将我们的技能放在简历中描述部分之后最显眼的部分。
在“技能”部分,您可以概述您在每项技能方面的能力,并展示您的数据科学组合示例。对我来说,我经常把我的项目的链接放在这个部分。
我从不建议任何人用百分比或柱状图来展示你在每项技能上的能力,因为这看起来不专业。最好说你是熟练的、有能力的、专家的,或者任何其他解释你技能的词。
经验
这一部分经常被 HR 忽略,但是当 HR 已经注意到你的简历时,他们肯定会更深入地阅读这一部分。让我们来看看应该在数据科学简历中放入什么样的经历。
工作经历
我将向您展示我举的一个有经验的数据科学家工作经历的例子。我们首先显示我们的雇佣历史,最新的雇佣记录在顶部。
你也可以为没有任何工作经历的人提供实习机会。如果你只有志愿者或组织经验,你需要把你的教育部分放在第一位。
作者创造的形象
以上是一位经验丰富的数据科学家的就业部分示例。在这一部分,我概述了对数据科学家职位非常重要的四个要点,尤其是在疫情时间。要点是:
a.我之前提到过沟通和适应性在疫情时间很重要。a 点是一个如何在工作中展示你的沟通和适应能力的例子。
b.用必要的工具和技术展示你的项目,以及你的项目如何影响公司(使用数字,有数字总是好的)。
c.数据分析和决策对于数据科学家来说也是一项重要技能。证明你在你的工作经历中有。
d.展示您可以快速调整和以适应当前的数据科学形势,因为该领域一直在发展。
如果你有数据科学家的经验,这就是上面的例子,但是如果你没有呢?你需要解释你在以前的工作/实习中做了什么,尽可能地接近为什么你在你申请的公司是一名很有潜力的数据科学家。
再来看看我之前的非数据科学职位。
正如我之前解释的那样,我的工作经历包含了作为一名数据科学家的重要信息。它们是:
a.团队合作是每个数据科学家都需要的非技术技能,统计分析是一个数据科学家的加分项。
b.数据分析和通信在此显示。
c.这里显示了通信和决策。
d.这里展示了适应性和编程技能以及对公司的影响
如果您没有任何数据科学家经验,这就是一个例子。尽量夸大你的工作经历,因为这是你写简历的目的,但是不要在简历中撒谎。在简历中赞美你所做的事情是好的,因为你可以解释你做了什么,但是在简历中撒谎最终只会适得其反。
教育
在你的工作经历之后的下一部分应该是你的教育背景。这一部分通常简短明了,但是根据你的工作经历,你可以更多地解释你在学习期间做了什么。
作者创建的图像
以上是我教育史的一个例子。如果你把最近接受的教育放在最上面,然后从那里往回走,那是最好的。事实上,我不是计算机科学或数学/统计背景,但仍然可以获得一个数据科学家的职位。这意味着数据科学家的职位不仅仅是为计算机科学和/或数学/统计专业的人保留的。
在我的例子中,我只展示了我以前的专业和我在学习中所做的重点。请注意,我只展示了数据科学家职位的重要内容(数据分析、统计、编程)。
试着把你认为对数据科学家职位重要的事情放在你受教育的时间里。如果你认为你没有技术技能,试着把非技术技能,但仍然与该职位相关的技能。
如果你没有丰富的经验,你也可以在这里解释你的论文/项目。试着把它和数据科学家的职位联系起来。
附加信息
在你简历的底部是对数据科学家职位重要的一切。您可以在这里填写许多变量,但这是我一直在数据科学简历中寻找的变量,尤其是如果您之前没有任何工作经历。
相关经验
在这一部分,您可以将任何相关经验应用于数据科学家职位,但这不是永久/实习。可以是组织经历、活动经历、兼职工作,以及任何你认为对这个职位重要的事情。
作者创建的图像
例如,在我的相关经历部分,我将我作为一名作家的经历放在《走向数据科学》中。
永远不要轻视你以前的相关经验;我见过一些人设法找到工作,不是因为他们的工作经验或教育,而是因为他们放在简历中的与众不同的经验。
课程和认证
你可以把它放在另一部分,给那些参加在线课程或训练营的人。
作者创建的图像
您可以列出任何与数据科学家职位相关的非正式课程和认证,也可以在这里解释一下您在课程中学到了什么。
非技术技能
虽然你已经在简历的顶部展示了必要的技术技能,你也可以在这一部分包括任何非技术技能。让我们看看下面的例子。
作者创建的图像
对于数据科学家职位来说,技术技能可能已经不言自明了,但对于非技术技能来说就不同了。当你说你有非技术技能的时候更好;你解释为什么你有那种技能。
很多方法来解释它;你可以把它和你的工作经历、教育甚至证书联系起来。在疫情时间里展示这种非技术性技能很重要,因为这是一个巨大的加分点。
结论
许多公司都在寻找有经验的数据科学家,但如果你是新人,不要害怕申请这个职位。有时候,公司本身需要一个他们可以塑造的应届毕业生。
重要的是,你要定制自己的数据科学家简历,以满足工作申请,但在疫情时间里,你需要付出额外的努力来展示你的潜力。
除了必要的技术技能(机器学习、编程语言、数据分析、统计),尽量展示非技术技能(沟通、团队合作、适应性、快速思考)。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
关于集成学习你应该知道什么
大众对机器的智慧
马库斯·斯皮斯克在 Unsplash 上的照片
简介:
你想和你的朋友组织一个电影之夜,你正在寻找一部完美的电影,你在网飞上搜索,你偶然发现了一部引起你注意的电影。要决定这部电影是否值得看,你有多种选择。
方案一:去问已经看过电影的哥哥。
选项 B:去 IMDB 检查评级和阅读多个希望剧透免费评论。
很明显你会选择 B,因为如果你从你哥哥那里得到多种观点而不是单一观点,那么得到有偏见的观点的风险会更小。这是集合方法背后的想法和动机。这是群众的智慧!现在让我们深入到集成学习的一个更技术性的定义。
什么是集成学习:
根据 scholarpedia:
集成学习是一个过程,通过该过程,多个模型(如分类器或专家)被战略性地生成和组合,以解决特定的计算智能问题。
这意味着采取生成多个模型和聪明地采纳它们的意见的方式,以获得可能的最佳预测。理论上,集合模型总是比单一模型更好。为了有效地工作,构建集合的个体模型应该是不同的,如果所有的个体观点都相同,那么接受集体观点是没有意义的。我们可以通过使用不同的算法,改变超参数,或在数据集的不同部分训练它们来区分我们的模型。
我们如何合奏学习(技巧):
装袋:
代表“ bootstrap aggregating”,这是理解起来最简单、最直观的技术之一。在 bagging 中,我们将在数据的不同子集上训练时使用相同的算法。为了得到这些子集,我们使用了一种叫做 的技术:引导:
基本自举插图,作者图片
如你所见,苹果重复了两次。在实践中,我们通常为自举数据集选择较小的大小。在创建一些自举数据集后,我们将在每个数据集上建立一个模型,然后将它们组合成一个集合模型,这被称为聚合。对于分类问题,投票最多的类别是预测,对于回归问题,我们对模型的输出进行平均。
增压:
虽然 bagging 可以并行完成(只需同时训练所有模型),但 boosting 是一个迭代过程。像 bagging 一样,我们将使用相同的算法,但我们不会同时引导数据和训练所有模型。提升是连续的,这意味着一个接一个地训练模型,前一个模型的性能将影响我们如何为下一个模型选择训练数据集,更准确地说,每个新模型将尝试纠正其前任犯下的错误
boosting 的基本工作原理,按作者排序的图像
实现 boosting 的流行算法有 AdaBoost 和梯度 Boosting。
堆叠:
这个很简单,我们将使用不同的算法,只是结合他们的预测。
堆叠的基本工作原理,按作者排列的图像
你为什么要合奏学习?
由于直觉和实践证实,集合方法产生更准确的结果,并且当明智地使用时,对过度拟合更有弹性,因此,它们被广泛用于 Kaggle 比赛。一个缺点是他们需要更多的时间来训练。
摘要
集成学习正在将多个弱模型转变为一个强模型“在一起我们更强”。已经开发了多种技术来实现这一点,例如装袋、助推和堆叠。一个集合模型总是比一个单一的模型更准确,并且能更好地概括。
我希望你已经对集合模型有了一个基本的概念。现在是时候将它应用到你的项目中了!
感谢阅读!❤
关注我,了解更多信息丰富的数据科学内容。
作为一名数据科学家,一年后你会学到什么
蒂姆·范德奎普在 Unsplash 上拍摄的照片
区分经验丰富的数据科学家和数据科学爱好者的因素
大约一年前,经过几个学术研究项目和许多数据科学课程的工作,我终于在一家快速发展的电子商务公司获得了一个应用数据科学的职位。我将尝试分享我在工作中学到的、在家的数据科学爱好者事先不太了解的东西。
1.在远程服务器上工作
大多数人在他们的计算机上开始他们的数据科学之旅。然而,在实际的数据科学项目中,所需的计算能力和内存远远超过笔记本电脑所能提供的。因此,数据科学家使用他们的计算机访问远程服务器,通常使用 SSH(安全外壳)连接。ssh 允许用户使用私钥(SSH 密钥)安全地访问另一台计算机。一旦建立了连接,就可以像使用计算机外壳一样使用远程服务器。说到 shell,知道基本的 shell 命令有助于过渡到在远程服务器上工作。
照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
2.SQL 是王道
数据科学和机器学习是在 Python,Julia 和 R 上完成的吧?错了,是在 SQL 上做的!每个数据科学项目都是从数据开始的,大多数情况下,用于解决问题的数据并不容易获得,应该使用数据库的几个表中的部分数据来创建数据。
SQL 是事实上的标准数据库语言,用于快速连接、聚集和选择所需数据的部分。每个与数据相关的职位都需要熟练使用 SQL,因为它每天都被大量使用。大多数人忽视提高他们的 SQL 知识,如果不是完全忽视学习它的话。很自然,大多数爱好者没有数据库服务器,他们的数据集已经被别人建立了。实际上,数据科学家 90%的时间都花在准备和清理训练数据上。我知道这有点令人失望,但是如果没有数据,就没有数据科学。
应该注意的是,SQL 有许多方言,但是它们彼此相似,不同之处可以很容易地适应。只需选择一种方言并开始学习它!
3.功能比模型更重要
线性模型通常被视为简单,不适用于机器学习问题。我的意思是,你能在多大程度上线性增加你的功能并得到正确的结果?其实可以大有作为。
更复杂的模型,如随机森林、xgboost、SVM、DNNs 等。在特征空间(解释变量所在的空间)中寻找非线性边界。他们通过将特征空间划分为更小的部分或将特征映射到更高维的特征空间,然后在这个新空间中绘制线性线来实现这一点。最后(经过极大的简化),它们都可以被认为是通过新生成的数据点拟合一条直线。由于模型不知道特征的内在含义,它们试图基于某种核或通过优化伪似然函数来创建这种新特征。
http://songcy.net/posts/story-of-basis-and-kernel-part-2 使用核技巧进行高维映射,来源:
这看起来很复杂,对吗?这就是为什么它们被称为灰/黑盒模型。另一方面,知道特征真正含义的人可以从数据中生成新的有意义的特征。这个特征生成、转换、预处理和选择步骤被称为特征工程。基本的特征工程方法包括采用特征的均值-标准差、将连续变量离散化到箱中、添加滞后/差异特征等。
经过适当的特征工程,任何模型都可以获得很好的结果。线性模型因其可解释性而更受青睐。您可以查看所生成要素的显著性和系数,并对模型的有效性做出评论。如果一个系数在逻辑上应该是正的,结果却是负的,那么模型、数据或假设可能有问题。为什么这么重要?因为有一个基本规则,垃圾进垃圾出。
4.实验和生产的区别
大部分数据科学都是在 Jupyter 笔记本上完成的,因为它易于实验和可视化。很容易快速尝试新的东西,训练新的模型或在笔记本上看到一些表达的结果,只需打开一个新的单元格,就可以随心所欲了。
然而,当模型准备好投入生产时,jupyter 笔记本时代结束,python 文件时代开始。生产(简称 prod)是你的算法在现实生活中运行的地方。最终用户(内部或外部)受生产代码的影响,因此生产级代码应该快速、干净、详细、容错且易于调试。我说的这些是什么意思?
如果您只是在尝试,并且将运行代码一次或两次,那么代码的速度就不那么重要了。然而,在生产中,您的代码可能每天运行多次,其结果将影响生产生态系统的其他移动部分。因此,执行的持续时间变得很重要。
让我们面对现实吧,你的一些(如果不是全部的话)笔记本是无序的,混乱的,有未使用的导入,有实际上不再需要的电池,对吗?没关系,你只是在试验你的想法。现在是时候清理你的代码了,这样除了你自己之外的其他人就可以真正地遵循你的代码的步骤了。如果团队中的任何人都能轻松地查看您的代码并理解每一行的目的,那么您的代码就会变得足够干净。这就是为什么你应该给你的变量和函数起一个有意义的名字,不要用忍者编码。
您应该将代码执行的重要步骤记录到 shell 屏幕以及一个日志文件中。控制台日志记录有助于直观地看到在 shell 上运行代码时所采取的步骤,让您随时了解执行情况。另一方面,日志文件有助于识别运行代码时可能遇到的问题。一个好的日志文件应该包括开始和结束时间、结果摘要、遇到的异常和每次执行的问题。
当产品代码由于任何原因开始失败,用户开始看到奇怪的结果时,这是一个令人紧张的事件。好的产品代码应该能够处理可能的异常,并事先做好必要的断言,如果出现意外/无法解决的问题,应该提醒团队。根据具体情况,失败的代码可以被编程为给出前一次运行的结果,不给出任何输出或提供预定义的结果。在出现问题时,花时间舒适地编写容错代码通常比压力编码要好。
即使代码是容错的,代码内部也可能存在一个 bug,从而产生意想不到的结果。在这种情况下,应该调试代码,通常使用调试工具,找到原因。干净的编码使调试更容易,但是这还不够。程序员应该使用函数而不是重复代码,给每个函数一个单一的目的,避免使用不纯的函数。这种做法使得在代码中定位 bug 的来源变得容易。
对于编写产品级代码,我建议使用文本编辑器,如 VS Code ,而不是使用 jupyter notebook。软件开发工具使开发更加容易和快速。如果你仍然想使用 jupyter notebook,有一个名为 nbconvert 的工具可以从 jupyter notebook 创建 python 文件。
5.最有价值球员
技术世界竞争激烈,瞬息万变。很多时候,没有时间去等待一个达到最先进性能的完美产品。科技公司不是以完美的产品为目标,而是从一个项目开始,快速构建一个 MVP (最小可行产品)并迭代。MVP 需要满足项目最基本的需求,不需要任何花哨的东西,仅此而已。
对于完美主义者或注重细节的人(即大多数数据科学爱好者)来说,通常很难进行 MVP。大多数数据科学家努力仔细分析数据,尝试许多不同的功能和模型,并提出最佳模型。数据科学,作为一个领域,本质上是面向研究的,然而,我没有指定应用数据科学。
当我第一次开始的时候,这种哲学困扰着我,但是不要担心,这样实际上更好。最重要的资产是时间。一个项目将走的道路无法预先知道,因此投资在项目上的时间不能保证是有价值的。根据用户反馈和 A/B 测试,您正在进行的项目可以暂停或完全取消。通过构建一个 MVP 而不是一个成熟的项目,风险被最小化。即使项目被保证留下,大多数时候足够的数据是不可用的,或者未来可能的复杂情况是未知的。构建一个简单的模型,并用新生成的数据和获得的专业知识对其进行迭代,可以得到更快、更可靠的结果。
6.敏捷开发
在团队工作中,科技界的另一个概念是敏捷开发。敏捷是一种开发哲学,在这种哲学中,项目被划分为小任务,团队成员从积压的任务中获取新任务。在 sprint 规划期间,团队会给每项任务一个估计分数,然后团队会计算 sprint 任务的总分数。其实说起来容易做起来难。敏捷是为软件工程开发的,在软件工程中,任务持续时间更容易估计,路径和实践定义得更好。另一方面,数据科学任务需要反复试验,并且由于高方差,任务持续时间更难估计。具有讽刺意味的是,数据科学家对其他业务问题做出了准确的预测,却不能对他们的任务做出同样的预测。
7.A/B 测试
你已经训练和调整了一个新模型,调整了它的超参数,它在每个测试指标上都给出了非常好的结果,远远超过了之前的模型。您需要立即将其部署到生产环境中,对吗?可惜没有。
敏捷和数据科学的核心是 A/B 测试。你的模型可能会在测试和模拟中击败之前的模型,但在现实生活中可能会失败。这就是为什么它被称为模拟,而不是真实的现实。训练数据只是在模型制作中高度处理的过去现实的子集。时代会变,错误会犯,模型无法解释所有的数据变化。只有在 A/B 测试期间,一个模型可以产生显著的提升时,该模型才会被以前的模型所取代。
8.与不同学科的人交流
成为一名数据科学家实际上与成为一名软件开发人员或科学家有很大的不同。通常,数据科学家与业务和技术人员密切合作,因此他们需要了解业务和技术两方面。
业务人员通常是数据科学家的内部客户,业务人员不关心模型的复杂程度或代码的优美程度,他们关心的是因果关系。这就是线性和基于树的模型发挥巨大作用的地方。白盒模型易于解释、直观且易于理解。商业人士,尤其是在开始的时候,会想知道为什么 ML 模型会做出一个决定,直到他们相信它是可行的。因为模型是为业务需求而构建的,所以它们应该为业务人员的需求而定制。
在模型的开发和生产过程中,数据科学家与开发人员密切合作。开发人员通常会收集和提供数据管道,并在生产中使用您的算法结果。技术—数据科学集成有多种方式。开发人员可能会将数据科学家的代码转化为生产级代码(使第 4 点变得过时),为数据科学家提供一个 API 来提供他们的结果,或者调用数据科学家创建的模型的 API。每种方式都有其优点和缺点,并且可能会在生命周期中反复出现。
数据科学家需要能够理解业务需求和开发人员的局限性。他们应该向开发人员传达与业务和数据科学相关的需求,并向业务人员传达技术方面的能力和限制。
结论
TLDR:在数据科学部门工作与在《孤独》中为 Kaggle 项目建立机器学习模型截然不同。我已经试图列出那些事先不太为人所知的关键区别。我希望读者会发现它很有用,因为我知道我喜欢写它。
你的员工在网上对你有什么看法?—使用 Python 进行文本挖掘
数据科学、商业智能、网络搜集
Web 抓取 Glassdoor,从员工评论中获取见解
在当今世界,几乎每个人都在使用互联网,如消费者、企业、政策制定者、政治家和各种组织,以便相互交流,它使我们有空间分享、表达和接收意见,并让企业在网上发布他们的更新,并与他们的利益相关者互动。它还允许员工在线查看和匿名反馈他们的组织,以便于他人检索信息。
因此,由于大多数来自个人的反馈都是以评论的形式发布在 Indeed 和 Glassdoor 等平台上,因此每个组织都应利用这一机会,通过文本挖掘&自然语言处理(NLP)技术关注在线讨论,这一点非常重要。虽然收集调查数据也是更好地了解员工工作生活需求的一种好方法,但并不是所有的评估都能产生有用且不带偏见的信息,在某些情况下,问卷本身也可能是公司问题的原因。
收集在线评论可以为企业提供一个好主意,了解他们的员工是否快乐,他们为什么快乐,什么可以变得更好,以及他们关心的问题。通过了解这一点,我们不仅可以评估当前公司内部政策的效率,而且组织还可以在未来制定更好的数据驱动决策。
在这个项目中,我们将调查 Glassdoor Italy 上公司员工评论的趋势,我们将取消以下组织在线发布的最后(110 - 120)条评论。
(普华永道—德勤—埃森哲)
Glassdoor 是一个现任和前任员工匿名评论公司的网站。Glassdoor 还允许用户匿名提交和查看薪水,以及在其平台上搜索和申请工作。
你说得够多了,让我们开始谈正事吧。
值得注意的是,大多数评论都是用意大利语收集的,然后被翻译成英语*。每个公司将有一个优点(优点)和缺点*(缺点)**栏,此外,每个公司将根据员工匿名条目对以下措施进行评分 (0 至 5) :
(工作/生活平衡——文化&价值观——职业机会——薪资&福利——高管)
1-普华永道
首先,我们知道普华永道的总体平均评级为 3.8/5 颗星。
在接下来的两张图中,我们展示了评分和每次评价的长度之间的关系,从中我们可以注意到,当人们给 4 星时,他们倾向于写更长的正面和负面评价。
在下面的 5 张图中,我们展示了前面提到的措施的评分。普华永道在工作/生活平衡方面的平均得分为 2.3/5,在文化和价值观方面的平均得分为 3.8/5,在职业机会方面的平均得分为 4.1/5,而在薪酬和福利方面的平均得分为 2.8/5,在高管方面的平均得分为 3.2/5。
在接下来的部分中,我们将运用自然语言处理技术来可视化员工在谈论积极的时使用的前 35 个重复和频繁的词语。
列表的顶部如下:
(环境—机遇—学习—伟大—事业)
在单词云中可视化之前的结果
然而,在这一部分,我们将探究员工在谈论负面信息时最常重复使用的 35 个词。
列表的顶部如下:
(工作—寿命—小时—余额—长)
再次用文字云表示结果。
普华永道的正面评价样本:
"A good working environment. Good opportunities to grow and learn, depending on the specific role Great name to be displayed on the curriculum" "The company was clearly focused on learning and development of employees was a young and ambitious environment and colleagues very qualified for their jobs""Ability to work for major clients"
普华永道负面评论样本:
"No recognition for activities, repetitive activities, High hierarchy of roles and tasks, Poor coaching, Excessive bureaucracy and unnecessary paperwork that make waste a lot of time. Total lack of concern for others""Poor work-life balance, salaries relatively low"'Salaries should be aligned with the rest of the network, In addition, employees who work in large cities and a high cost of living should earn more just like it happens in other countries'
2-德勤
德勤获得了 3.8/5 星的总体平均评级。
此外,我们可以注意到趋势和以前一样,当人们给 4 星时,他们倾向于写更长的正面和负面评论。
德勤在工作/生活平衡方面的平均得分为 2.3/5,在文化和价值观方面为 3.7/5,在职业机会方面为 4.1/5,而在薪酬和福利方面为 3.6/5,在高管方面为 3.4/5。
接下来,我们将会看到员工在谈论积极方面时经常重复使用的前 35 个词。
列表的顶部如下:
(成长—环境—字—好—经验—年轻)
最后但同样重要的是,我们将可视化前 35 个重复和频繁使用的单词负面。
列表的顶部如下:
(工作—时间—平衡—生活—时间)
正面评论的示例:
"Good career opportunities if you want to climb the corporate ladder""multicultural learning environment rapidly competitiveness precision""Interesting, an inspiring place to start your career and learn as much as possible"
负面评论的例子:
"Too much unpaid overtime work" "Too many partners to manage, too many events. Conflicts with the marketing division" "unpaid overtime, little interest in resources, little attention to talent, excessive working hours, revaluation of the person depending on the amount of hours worked and not according to the results and capabilities"
3-埃森哲
埃森哲的总体平均评分为 3.7/5 颗星。
从接下来的数字中,我们可以注意到,当人们给 4 星时,他们倾向于写更长的正面评价,而当他们给 3 星和 4 星时,他们倾向于写更长的负面评价。
在下图中,我们像之前一样展示评级。埃森哲在工作/生活平衡方面的平均得分为 2.6/5,在文化/价值观和职业机会方面的平均得分为 3.6/5,而在薪酬/福利和高管方面的平均得分为 3.3/5
此外,我们可以看到员工在谈论积极方面时使用的前 35 个重复和频繁的词。
列表的顶部如下:
(成长—环境—机会—薪酬—福利)
然而,在这一部分,我们将探究员工在谈论负面时使用的前 35 个重复和频繁的词。
列表的顶部如下:
(工作时间——小平衡——压力)
正面评论的示例:
"dynamism and growth opportunities, wonderful environment"
"young and dynamic Environment, motivating"
"very rapid growth and learning"
"Great opportunities for growth - Competitive Salary - Core Value"
负面评论的例子:
"Spaces a bit 'tight compared to the number of employees""General Incompetence - Body rental - No respect for workers' rights - crazy hours - Extraordinary imposed and unpaid - It rewards those who make the soldier 'yes man' who works 10 hours a day rather than who is responsible - You receive orders from above - You must give orders down - They tell a lot of stupid things to customers - professional Growth nothing - Inconsistency between the presentation of the company and the reality"
结论
我们可以得出这样的结论:职业机会和工作/生活平衡是我们样本中讨论最多的正面和负面话题。数据显示,普华永道的员工认为他们的薪酬不够高,但他们对高管和职业机会的满意度更高。
此外,德勤收集的正面和负面词汇数量最多,而埃森哲收集的正面和负面词汇数量最少。
简而言之,我们设法从在线平台获得了文本数据样本,这些样本可以明确地告诉我们,并捕捉员工的需求、偏好、要求和担忧。因此,文本挖掘和自然语言处理可以成为公司内部整合的竞争优势工具,以从员工在线获得有意义的反馈和见解。与企业绩效问卷和调查一起,可以防止让组织处于最有利位置的有偏见的结果。这意味着帮助所有员工在工作中感受到价值感和满足感。当员工感到受到重视时,他们更有可能对组织保持忠诚,从而获得更好的绩效、生产率和收入。
更多推荐
所有评论(0)