TowardsDataScience-博客中文翻译-2020-十七-
TowardsDataScience 博客中文翻译 2020(十七)
苹果数据科学家面试问答!
一些苹果面试问题的演练!
介绍
苹果是世界上最大的科技公司之一,已经建立了当今时代最具标志性的品牌之一。iPods 和智能手机的先驱处于创新技术、卓越营销,当然还有大数据的最前沿。
苹果公司的数据科学家似乎也戴着软件工程师的帽子,所以我只能找到这么多专注于数据科学的面试问题。话虽如此,我还是为你提供了五个面试问题以及相应的答案。
数据科学面试问题
问:描述 L1 和 L2 正则化之间的区别,特别是关于它们对模型训练过程的影响的区别。
L1 和 L2 正则化都是用于减少训练数据过拟合的方法。最小二乘法使残差*方和最小,这可能导致低偏差但高方差。
L2 正则化,也称为岭回归,最小化残差*方和加上λ乘以斜率*方。这个附加项被称为岭回归损失。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。
如果采用岭回归罚分并用斜率的绝对值替换,则得到套索回归或 L1 正则化。
L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。
问:ACF 和 PACF 的含义是什么?
要理解 ACF 和 PACF,首先需要知道什么是自相关或序列相关。自相关着眼于给定时间序列与其自身滞后版本之间的相似程度。
因此,自相关函数(ACF) 是一种工具,用于发现数据中的模式,具体来说,是指由各种时间滞后分隔的点之间的相关性。例如,ACF(0)=1 意味着所有数据点都与自身完美相关,ACF(1)=0.9 意味着一个点与下一个点之间的相关性为 0.9。
PACF 是偏自相关函数的简称。引用 StackExchange 中的一段文字,“它可以被认为是由若干个周期 n 分隔的两个点之间的相关性,但中间相关性的影响已被消除。”比如说。如果 T1 与 T2 直接相关,而 T2 与 T3 直接相关,则似乎 T1 与 T3 相关。PACF 将消除与 T2 之间的关联。
这里对 ACF 和 PACF 这里 有很大的解释。
问:什么是偏差-方差权衡?
估计值的偏差是期望值和真实值之间的差值。具有高偏差的模型往往过于简单,导致拟合不足。方差表示模型对数据和噪声的敏感度。具有高方差的模型导致过度拟合。
因此,偏差-方差权衡是机器学习模型的一个属性,其中较低的方差导致较高的偏差,反之亦然。一般来说,可以找到两者的最佳*衡,使误差最小化。
作者创建的图像
问:XGBoost 如何处理偏差-方差权衡?
作者创建的图像
XGBoost 是一种利用梯度推进算法的集成机器学习算法。本质上,XGBoost 就像是类固醇上的装袋和助推技术。因此,可以说 XGBoost 处理偏差和方差的方式类似于任何 boosting 技术。Boosting 是一种集成元算法,通过对许多弱模型进行加权*均来减少偏差和方差。通过关注弱预测和迭代模型,误差(从而偏差)减少了。类似地,因为它对许多弱模型进行了加权*均,所以最终模型比每个弱模型本身具有更低的方差。
问:什么是随机森林?为什么朴素贝叶斯更好?
随机森林是一种建立在决策树基础上的集成学习技术。随机森林包括使用原始数据的自举数据集创建多个决策树,并在决策树的每一步随机选择一个变量子集。然后,该模型选择每个决策树的所有预测的模式。依靠“多数获胜”模型,它降低了单个树出错的风险。
作者创建的图像
例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是随机森林的力量。
随机森林提供了其他几个好处,包括强大的性能,可以模拟非线性边界,不需要交叉验证,并赋予功能重要性。
从过程和结果易于训练和理解的意义上来说,朴素贝叶斯更好。一个随机的森林看起来就像一个黑盒。因此,在实现和理解方面,朴素贝叶斯算法可能更好。但是,就性能而言,随机森林通常更强,因为它是一种集合技术。
编程面试问题
这里有六个关于编程的额外面试问题,如果你想自己回答的话!
- 假设您有 100,000 个文件分布在多台服务器上,您想处理所有这些文件?在 Hadoop 中你会怎么做呢?
- 给定一个整数列表,找出数组左半部分之和等于右半部分的索引。
- 写一个函数来检测一棵二叉树是否是左右子树的镜像。
- 给定一个字符串列表,用 Python 写一个函数,返回所有是变位词的字符串。
- Python 和 Scala 有什么区别?
- 解释 LRU 缓存。
- 如果客户端每分钟都发送位置数据,您会如何设计客户端-服务器模型?
感谢阅读!
如果你喜欢我的工作并想支持我,我会非常感谢你在我的社交媒体频道上关注我:
- 支持我的最好方式就是在媒体T20【这里】T21【关注我。
- 在推特这里关注我。
- 点击这里订阅我的新 YouTube 频道 。
- 在 LinkedIn 这里关注我。
- 在我的邮箱列表 这里注册。
- 查看我的网站terenceshin.com。
相关文章
作为谷歌数据科学面试的一部分,他们喜欢问一些他们称为“解决问题”的问题…
towardsdatascience.com](/googles-data-science-interview-brain-teasers-7f3c1dc4ea7f) [## 亚马逊的数据科学家面试实践问题
一些亚马逊面试问题的演练!
towardsdatascience.com](/amazon-data-scientist-interview-practice-problems-15b9b86e86c6) [## 脸书的数据科学面试实践问题
一些脸书面试问题的预演!
towardsdatascience.com](/facebooks-data-science-interview-practice-problems-46c7263709bf)
apple Music activity analyser——软件包使用入门
丹尼尔·科尔派在 Unsplash 上拍摄的照片
在另一篇文章中(见此),我们看了看我对自己的数据所做的分析。现在是我向您展示如何使用 apple_music_analyser 软件包的时候了,这样您就可以对自己的数据进行类似的数据分析了!
注意:您应该向 Apple 请求您的数据,请参见 Apple 的数据和隐私页面。
另一个注意事项(编辑自 2020 年 10 月 12 日):一个 web 界面 现在可供您浏览您的数据!而且你可以在这里 阅读一下 。
安装软件包
首先,安装软件包
pip install apple-music-analyser
所有依赖项都是自动安装的。有一个文件夹文档和一个文件夹示例,可以包含对你有用的内容!可以从 GitHub 库看一下。
导入和数据输入
当然可以用自己的数据!但是如果您愿意,您可以使用软件包附带的测试数据(用于测试)。拿过来这里。
第一步,我们导入所有我们需要的模块。
# import to parse an archive, save and load a pickle file
from apple_music_analyser.Utility import Utility
# import to actually parse and process the data
from apple_music_analyser.VisualizationDataframe import VisualizationDataframe
# import to filter the df
from apple_music_analyser.Query import QueryFactory
# import to build visualizations
from apple_music_analyser.DataVisualization import SunburstVisualization, RankingListVisualization, HeatMapVisualization, PieChartVisualization, BarChartVisualization
第二步,我们只提取我们想要构建可视化的文件。假设苹果提供给你的档案在一个名为 data 的文件夹里。
path_to_archive = 'data/Apple_Media_Services.zip'
input_df = Utility.get_df_from_archive(path_to_archive)
现在,如果您使用 test_df.zip,请注意归档文件的结构与 Apple 归档文件的结构略有不同。正因为如此,我们需要向 get_df_from_archive 方法传递一个额外的参数,其中包含归档的结构。像这样:
path_to_archive = 'data/test_df.zip'target_files = {
'identifier_infos_path' : 'test_df/Apple Music Activity/Identifier Information.json.zip',
'library_tracks_path' : 'test_df/Apple Music Activity/Apple Music Library Tracks.json.zip',
'library_activity_path': 'test_df/Apple Music Activity/Apple Music Library Activity.json.zip',
'likes_dislikes_path' : 'test_df/Apple Music Activity/Apple Music Likes and Dislikes.csv',
'play_activity_path': 'test_df/Apple Music Activity/Apple Music Play Activity.csv'
}input_df = Utility.get_df_from_archive(path_to_archive, target_files)
就是这样! input_df 是一个如下结构的字典:
{
"identifier_infos_df" : identifier_infos_df,
"library_tracks_df" : library_tracks_df,
"library_activity_df" : library_activity_df,
"likes_dislikes_df" : likes_dislikes_df,
"play_activity_df" : play_activity_df
}
可视化数据帧结构
这个包定义了一个名为 VisualizationDataframe 的类来构建我们稍后将用于分析和可视化的所有对象。因此,让我们使用之前得到的 input_df 对象实例化这个类。
viz_df_instance = VisualizationDataframe(input_df)
好了,基本上这个库就这样了:)现在你有了一个干净的、经过解析和处理的数据结构,还有一些你想用于分析的对象(见下面的更多细节)。
现在让我们暂停一下。实例化 VisualizationDataframe 类的这一步可能需要几秒钟的时间,这取决于数据的大小(对于我的数万行数据来说,只需要不到 30 秒的时间)。您可能不希望每次查看数据时都进行清理、解析和处理,除非归档中的文件发生了变化!所以这里来了两个方便的函数:保存和加载泡菜。
您可以将 VisualizationDataframe 类的实例保存为 pickle 文件,并在以后需要再次分析/可视化数据时加载它。
# we want to save viz_df_instance, but we could decide to save only the visualization dataframe, or any other object really....
Utility.save_to_pickle(viz_df_instance, 'visualization_structure.pkl')
# we want to load the file that was saved
saved_visualization_structure = Utility.load_from_pickle('visualization_structure.pkl')
好的,假设我们在内存中有 viz_df_instance,要么是因为我们刚刚实例化了它,要么是因为我们从 pickle 文件中加载了它。让我们访问它的一些属性!
首先,我认为最有用的是我称之为可视化数据框架。这个 pandas 数据帧包含每个播放活动的一行,尽可能多的关于每个曲目的信息,例如它的等级、所有与之相关的流派、它是否在库中、它是否被部分播放等等。
# this returns the df_visualization property of the instance
df_viz = viz_df_instance.get_df_viz()
这是一个熊猫数据帧,所以你可以像操作任何熊猫数据帧一样操作它(获得它的形状,过滤一些值等等)!
您可能想要访问其他对象,这些对象位于实例的 track_summary_objects 中:
# the list of genres
genres_list = viz_df_instance.track_summary_objects.genres_list
# the list of titles for each artist
artist_titles = viz_df_instance.track_summary_objects.artist_tracks_titles
和计数字典(每年和流派,或年份和艺术家的歌曲计数):
# build a dictionary of counts per genre for each year
genre_counts_dict = viz_df_instance.track_summary_objects.build_ranking_dict_per_year(df_viz, 'Genres')
# or the same dictionary but with a count per artist
artist_counts_dict = viz_df_instance.track_summary_objects.build_ranking_dict_per_year(df_viz, 'Artist')
使用查询模块
现在,假设您不想查看整个数据帧。而且假设你和熊猫在一起不是超级舒服。别担心!查询模块就是来帮你的!
基本上,您用您的查询参数构建一个字典,并创建查询模块的一个实例,这将为您提供一个经过过滤的数据框架。让我们看一个例子:
# we define the conditions of the filter
# so we want only songs played in 2017, 2018, 2019, that have a rating of 'LOVE' and were listened to completely
query_params = {
'year':[2017, 2018, 2019],
'rating':['LOVE'],
'skippe':False
}# we get the visualization dataframe
df_viz = viz_df_instance.get_df_viz()# define the query
query_instance = QueryFactory().create_query(df_viz, query_params)# get the filtered df
filtered_df = query_instance.get_filtered_df()
query_parameters 字典接受以下结构:
params_dict = {
'year':list of int,
'genre':list of str,
'artist':list of str,
'title':list of str,
'rating':list of str,
'origin':list of str,
'offline':bool,
'library':bool,
'skipped':bool
}
这个过滤后的数据帧又是一个熊猫数据帧,你可以像往常一样操作熊猫。
玩可视化
现在有趣的来了!我不会在这里一一列举所有可能的例子,我邀请您执行来自 GitHub 库的示例脚本,您将立即看到可视化效果。
在这里,我将向你们展示我最喜欢的两个可视化效果,因为我认为它们最有意义:旭日和热图。
重要提示:我们这里要使用的包中的模块是使用 Plotly 构建的,实际上只是一个包装器来快速获得简单的可视化效果,而不是 Plotly 的替代品。这个模块的每个类都有一个属性 figure ,你会想和它交互,就像你想用 Plotly 来获得更好的可视化效果一样!
旭日
这是表示排名的一种很好的方式。
流派的旭日可视化
有四种类型的数据,你将能够使用这种可视化排名:流派,艺术家,标题和曲目来源。
因为 sunburst 实际上提供了排名信息,我们要传递给这个类的不是数据帧,而是一个使用这个数据帧构建的排名字典:
# we get the ranking dictionary
ranking_dict = viz_df_instance.track_summary_objects.build_ranking_dict_per_year(df_viz, 'Genres')
您可以将“流派”替换为“标题”、“艺术家”或“曲目来源”。
# we create an instance of the SunburstVisualization class
# the second argument is the title we want to use for the plot, you can set it to whatever you want!
sunburst = SunburstVisualization(ranking_dict, 'Genre')# we render the plot - note that the graph will appear in your browser automatically
sunburst.render_sunburst_plot()
热图
热图是我非常喜欢的可视化工具,因为它有助于突出活跃的日子。基本上,有两种类型的热图:
- x 轴是月份,y 轴是日期,
一年中每月的热图
- 另一个在 x 轴上画出星期几,在 y 轴上画出一天中的小时。
一年中一周内每天的热图
在第一种情况下,我们将能够计算出哪一天我们听音乐更多。第二种是白天的时候。
注意:如果组合 month/DOM 或 DOW/HOD 在输入数据帧中出现多次,将在每个单元格中累加收听时间。
您可以绘制多个支线剧情,这意味着您可以比较年份(通过绘制第一种类型的热图每年的一个支线剧情),或比较月份。
在本例中,我们绘制两张热图:
- 案例 1-在两个不同的支线图上,在 x 轴上绘制 2018 年和 2019 年的月份,在 y 轴上绘制月份的日期
- 案例 2-在 x 轴上绘制 2019 年 2 月的星期几,在 y 轴上绘制一天中的小时
案例 1
我们使用一个查询字典定义我们想要绘制热图的年份(我们实际上需要每年的 filtered_df)。
然后我们创建一个 HeatMapVisualization 的实例,其中 visualization dataframe 没有被过滤(后面你会明白为什么),还有两个子图,一个对应一年(2018,2019)。
query_params = {
'year':[2018, 2019]
}
heat_map = HeatMapVisualization(df_viz, 2)
对于我们想要绘制的每一年,我们将得到一个只包含该年元素的 filtered_df(这就是为什么我们传递整个数据帧来实例化 HeatMapVisualization)
for year in query_params['year']:
# we create a query parameters dictionary with a single year, and all the other parameters that we had in the query_params dict defined above
year_query_params = query_params
year_query_params['year'] = [year]
# we get a filtered df
query_instance = QueryFactory().create_query(df_viz, year_query_params) # get the filtered df
filtered_df = query_instance.get_filtered_df()
# we replace the dataframe initially passed by the year filtered df
heat_map.df = filtered_df
# we render a single trace, in this case for month on x-axis, and day of the month (DOM) on y-axis
heat_map.render_heat_map('DOM', str(year))
最后我们渲染情节
# we render the whole figure that will contain 2 subplots, one per year, and on each the data just for that yearheat_map.figure.show()
情节会是这样的:
2018 年和 2019 年每月每天的热图
案例二
我们将使用 2019 年 2 月筛选的数据帧创建一个热图实例。快速说明我们为什么这样执行过滤,仅仅是因为目前没有办法使用查询模块来查询月份…但是如果有足够多的人评论说拥有它会很棒,我可能会添加它!
# first we get a filtered dataframe on February 2019
df_viz_feb_2019 = df_viz[(df_viz['Play_Year']==2019)&(df_viz['Play_Month']==2)]# we create the HeatMap instance
heat_map = HeatMapVisualization(df_viz_feb_2019)
然后,我们构建并呈现“DOW”(星期几)类型的绘图,图例为 2020。
# generate the plot, the second argument is used as a legend
heat_map.render_heat_map('DOW', 'Feb 2019')# display the plot rendered
heat_map.figure.show()
情节会是这样的:
2019 年 2 月一周每天的热图
最后一件事
我希望这个介绍给了你一个使用这个包的好的起点!它的目的实际上是尽可能地抽象,以便您将大部分时间花在数据分析上。
我构建了一个全面的文档,其中包含了关于这个包的结构的更多细节,还有几个包含很多例子的文件。请随意在 GitHub 库上查看它们!
此外,我很乐意协助,如果你有任何问题,并知道你对这个项目的想法,请联系!
差分隐私在欧洲隐私法(GDPR)和机器学习中的应用
差异隐私如何保护您的数据,并帮助您遵守政府法规
什么是差分隐私?
差分隐私是一种数据匿名技术,被苹果和谷歌等主要技术公司使用。差异隐私的目标很简单:允许数据分析师建立准确的模型,而不牺牲个人数据点的隐私。
但是“牺牲数据点的隐私”是什么意思呢?嗯,假设我有一个包含信息(年龄、性别、治疗、婚姻状况、其他医疗状况等)的数据集。)关于在医院 x 接受乳腺癌治疗的每一个人。在这种情况下,数据点是电子表格(或数据框架,或数据库等)的一行。)包含关于接受乳腺癌治疗的人的信息。
我想建立一个机器学习模型,预测 x 医院乳腺癌的存活几率。如果我想保留患者的隐私,我应该怎么做?
这就是差别隐私的由来。差分隐私通过在数据检索过程中引入随机性,帮助分析师建立准确的模型,而不会牺牲单个数据点的隐私。
在差分隐私的框架中,有两个行动者:一个 策展人 和一个 数据分析师 。馆长拥有所有的数据,以及所有的原始(真实)值,而数据分析师想要解释这些数据。数据分析师可以“查询”数据库;也就是说,数据分析师可以向馆长索要数据的子集。差分隐私不会直接泄露任何信息;相反,对于数据分析师感兴趣的每个变量,如年龄、诊断、治疗等。,他们可能得到真实值,也可能得不到。分析师实际收到真实值的可能性因引入的噪声量而异。
查询数据库的次数越多,数据的私密性就越低。差分隐私比我刚才介绍的要复杂得多,但是您可以获得基本的方法。
关于差分隐私的更多资源
- 如果你想了解更多关于差分隐私的信息,我鼓励你阅读这篇文章。它解释了五岁,中级和专业水*的理解。
- 要获得深入的技术解释,请阅读这篇文章。
但是现在,让我们继续快速解释欧洲隐私立法。
欧洲数据隐私立法背景,即 GDPR
通用数据隐私条例,简称为 GDPR,是一项数据隐私立法,适用于所有总部设在欧盟或在欧盟运营的公司。GDPR 概述了公司如何被允许使用、存储和处理关于人的数据。这项立法的目的是让人们更多地控制公司对他们的了解,并在整个欧洲标准化这些做法。
关键术语
为了连贯地谈论 GDPR,我们需要快速定义三个术语:*****数据主体*处理器 。虽然我们都知道这些术语的通俗定义,但 GDPR 对它们下了精确的定义,所以我们想熟悉它们的定义。
- ****个人数据是任何可能与个人直接或间接相关的数据。它可能是你手机的一个标识符,你的文字指纹,或者一个汽油付款记录。这个定义很重要,因为它涵盖了大部分收集的数据。不管是好是坏,人类有点自恋。
- ****数据主体是一个人,特别是居住在欧盟的人。收集关于数据主体的个人数据。
- 最后,处理器是任何人(个人、公司、算法)对个人数据做任何事情。他们可以储存、分析、改变它,用它来快速自拍,以及几乎所有其他事情——他们是一个处理器。
就像他们说的,伟大的进程伴随着伟大的责任。
公司(加工者)的责任
GDPR 说得很清楚,处理器完全负责确保和维护它处理的个人数据的隐私。不仅如此,处理器实际上还需要关心这些数据的隐私。该法规要求公司在设计产品和流程时考虑隐私,对处理器可以保存数据的时间进行限制,并赋予数据主体许多关于如何使用、存储和披露数据的权利。
个人和公司的隐私目标
一般来说,我们可以假设数据主体希望他们的个人数据最大程度地保密,而处理者希望数据最大程度地公开。
一般来说,我们可以假设数据主体希望他们的个人数据最大程度地保密,而处理者希望数据最大程度地公开。
处理器希望数据尽可能公开,因为对数据的限制越少,处理器就越容易使用。然而,需要注意的是,数据主体和处理者的利益并不完全对立——毕竟,数据主体希望他们使用的产品和服务尽可能好地工作,许多人愿意为此放弃一些隐私。
此外,大多数公司本质上并不邪恶,他们关心(至少有一点)维护他们提供服务的人的隐私,不管法律如何。
差分隐私与 GDPR 有什么关系?
你可能已经注意到 GDPR 和差分隐私都有一个共同的词:隐私。隐私是那些你可以有一百万个矛盾定义的词之一,但是现在:
****隐私——个人有选择地向外界披露自己信息的权利。
结合我们刚刚介绍的所有术语:
差分隐私是处理数据的算法的属性,由一个或多个处理器使用,以保护数据主体的个人数据。换句话说:
差分隐私可以被认为是一种算法用来维护个人的 GDPR 强制隐私的技术。
重要的是要明白差分隐私世界的策展人和数据分析师根据定义都是 GDPR 世界的 处理者,他们可以是同一个实体,也可以是不同的实体。例如,如果我的 Android 手机收集了关于我的位置数据,然后一名谷歌工程师对其进行分析,则馆长和数据分析师都是谷歌。但如果谷歌决定让 Tinder 这样的第三方公司访问我的数据,那么谷歌就是馆长,Tinder 就是数据分析师。Google 和 Tinder 都是处理器。
就 GDPR 而言,使用差异隐私的优势和劣势
在这一节中,我将讨论对不同的利益相关者,特别是公司和用户使用差别隐私的利弊。
公司的利益(加工者)
- 差分隐私可以通过将个人数据转换为聚合数据,给处理器更多的自由。管理聚合数据的法律远没有管理个人数据的法律严格。
- 差异隐私为公司提供了一种直接量化数据隐私的方法,提高了公司证明其遵守 GDPR 的能力。
****对用户的好处(数据主体)
- 差分隐私确保在给定足够的噪音和足够少的查询次数的情况下,很难重新创建单个数据主体的个人数据。
- 如果馆长和数据分析师是不同的处理者,那么馆长可以设置最大查询次数,以增加其拥有的个人数据的隐私。
对公司和用户都有利
- 差分隐私可以让公司通过提高已有数据的可推广性来制作更好的模型。这是可行的,因为差分隐私迫使模型依赖于数据集中值的分布,而不是真实值。这意味着他们可以两全其美—数据主体的个人数据受到的损害较小,数据分析师/处理者最终得到的模型比使用原始数据得到的模型更好。
- 公司可以在不侵犯隐私的情况下访问大量敏感数据进行研究。
- 差分隐私提供了一种数学上可证明的隐私保护保证,可以抵御各种各样的隐私攻击。这意味着数据不容易受到隐私攻击,这对处理者和数据主体都有利。
然而,使用与安全性和分析质量相关的差分隐私也有明显的缺点。
使用差分隐私的缺点
差分隐私的安全挑战
- 差分隐私易受许多滥用问题的影响,包括:a)公司以不安全的方式存储原始数据,尽管在分析数据时使用了差分隐私,这向不同类别的隐私攻击敞开了大门,
b)数据分析师过于频繁地查询数据以获得差分隐私,从而不能有效地保护数据主体的隐私,
c)数据分析师使用太少的噪声来充分保护数据主体的隐私, - 差分隐私也容易受到非预期推断问题的影响,即只需要非常少量的准确信息就可以精确识别个人的问题。由于统计上许多个人数据是准确的,这就带来了严重的安全问题。
- 此外,差分隐私的成功使用可能会无意中阻止公司收集更少的人的数据,因为有一个安全的过程可用于分析数据。收集的数据越少,数据主体的个人数据就越安全。GDPR 努力鼓励公司收集更少的个人总体数据,在分析中使用差分隐私产生的(计算机)安全错觉可能会违背这一目标。
使用差分隐私时的额外挑战
- ****差分隐私可能导致危险的不准确模型:模型可能很容易产生,非常隐私,但危险的不准确,因为在差分隐私的隐私和准确性之间有一个直接的权衡。
- **对于数据分析师来说,处理以差分隐私**为中介的数据 可能会很有挑战性。正如 Dwork 和 Roth 指出的,许多数据分析师经常“用基本上非算法的术语来描述他们与数据的交互,例如,‘首先,我看数据’”。然而,作者补充说,“一般来说,在高维和互联网规模的数据集上,非算法交互将是例外,这似乎是合理的。”
结论
总的来说,我认为在公司内部,特别是与他人共享数据的公司,使用差异隐私是一个既增加隐私又符合 GDPR 的优秀工具,只要使用得当。
如果您对我讨论的任何内容有任何问题、意见或想要更多资源,请联系我们。
参考
[1] GDPR,第四篇 (2016),GDPR 信息网
[2] A. Nguyen,[理解差分隐私](http://Understanding Differential Privacy) (2019),走向数据科学
[3] C. Dwork 和 A. Roth,差分隐私的算法基础 (2014),第 254 页
了解更多有关差分隐私的资源
- 关于不同隐私的权威书籍,写得出奇的好(也参考文献 3)
- 如果你想了解更多关于差分隐私的信息,我鼓励你阅读这篇文章。它解释了五岁,中级和专业水*的理解。
- 要获得深入的技术解释,请阅读这篇博客。
- 大数据时代的差异化隐私(博客)
- 差分隐私的更简单解释(博客)
在量化交易中应用深度强化学习(动量交易和市场中性交易)
人工智能资本管理研究系列文章
克里斯·利维拉尼在 Unsplash 上的照片
摘要:机器学习和人工智能在量化交易中变得无处不在。在基金或交易公司的日常运营中利用深度学习模型不再只是一个概念。与更著名和历史悠久的监督和非监督学习算法相比,强化学习(RL)似乎是一个新的领域,但有着惊人的记录,在游戏空间(AlphaGo,OpenAI Five 等)中解决了一个又一个问题。),逐渐走向贸易世界,越来越多的人工智能专家认为它是 AGI 的未来(人工通用智能)。本文是众多文章中的一篇,讲述了如何开发和部署强化学习交易算法,以及深度强化学习在交易环境中的优势和挑战。
作者: Marshall Chang 是 A.I. Capital Management 的创始人兼首席信息官,这是一家定量交易公司,建立在深度强化学习对动量和市场中性交易策略的端到端应用之上。该公司主要以中高频交易外汇市场。
强化学习与无监督学习有什么不同?
这篇开篇文章将讨论强化学习与无监督学习相比是如何工作的。目标是用理论的方式解释 RL,在交易中使用外行的术语和例子。目标受众将是具有良好机器学习知识的从业者和量化研究人员,以及没有计算机科学背景但非常了解市场、风险/回报和交易业务的交易者。对于想要系统学习 RL 的从业者,我推荐 youtube 上大卫·西尔弗的 UCL 课程,以及萨顿&巴尔托的书:《强化学习》。
从根本上说,机器学习的任务是使用函数/模型来映射 2 个数据集之间的相关关系,这可以像 1 个变量的线性回归一样简单,也可以像具有数百万个参数的深度神经网络一样复杂。在交易的世界中,我们自然希望找到 X 数据集和 Y 目标之间的任何可概括的关系,Y 目标是未来的价格运动,无论距离未来多*或多远。
对于监督和非监督学习方法,这两个数据集是在我们训练模型之前准备的,或者换句话说,它们是静态的。因此,无论模型发现的关系有多复杂,它都是一个静态关系,因为它表示一个预设的数据集。尽管我们在训练和验证无监督的深度模型方面拥有丰富的知识和经验,但这种静态关系在金融界很少出现。更不用说像神经网络这样的训练模型是一个全局优化过程,这意味着 10 年前和昨天的数据对于时间序列中的“人工智能”模型来说同样重要,尽管真正重要的是下个月的表现。
首先,RL 不同于无监督/监督学习,因为它的模型是在动态数据集上训练的,以找到动态策略,而不是在静态数据集上找到关系。为了理解这是如何工作的,我们需要理解 RL 是如何被设计成环境中基于代理的问题的。该模型由一个代理表示,该代理根据设计观察环境状态,通过动作与环境交互,并接收奖励和状态转换形式的反馈(如果我们现在做这个动作,我们将结束)。
来自 AICM 演示幻灯片
RL 模型的训练数据 X 是代理人遇到的经验,以[观察/状态,行动]的形式,而目标数据 Y 是在这种情况下这种行动的结果奖励/惩罚,以[奖励,下一次观察/状态]的形式。在更高的层次上,代理人根据其经验接受训练,以学习与环境互动的最佳行动集,从而获得最大的回报。
这个训练过程是动态的,在 RL 中被称为策略学习,因为随着代理训练,它继续与环境交互并积累新的经验,迭代地加强好的行为并减少坏的行为,并最终解决环境问题。因此,经过训练和验证的 RL 模型是针对特定环境通过反复试验学习的动态策略规则书。这意味着在目前广泛使用的已经复杂的神经网络模型的基础上增加了一层额外的非线性,但如果做得正确,结果是 AlphaGo 能够解决*均 150 步的棋盘游戏围棋,游戏的总可能变化超过了宇宙中的原子数量(10 ⁶⁰).
无监督学习中的静态关系映射在认知任务中取得了重大进展。图像识别(Imagenet 竞赛,iPhone 面部识别等。)和语音/文字(siri、alexa 等。)认知是我们*年来突破的两个主要认知领域。RL 正在突破的是顺序决策领域,以战略性地计划、执行和学习,这也是以前智慧生物所独有的。
来自 AICM 演示幻灯片
对于围棋来说,简单地识别和记住无限数量的棋盘排列并不重要,除非玩家知道在哪里放置下一个筹码,以及之后的数百个筹码,以最终赢得比赛。这对于交易来说也是一样的,知道过去并不重要,除非交易者能够安排他/她的交易,并依次分配适当的风险,最终实现正的 NAV。这,其实就是 RL 算法完美设计的目的,用无/监督学习实现超人认知能力后的下一步。
在这篇文章中,我们已经提到了强化学习在交易中的潜在优势:
首先,环境和基于代理的设计输出动态策略,而不是静态关系。在接下来的文章中,我们将讨论相对于无监督/监督学习而言固有的鲁棒性,这将有助于克服深度学习的头号敌人,过度拟合。
第二,****顺序任务设计,使受训代理成为环境中的单个端到端参与者。对于交易,我们可以设计这样的环境,它不仅可以按顺序安排和管理交易,还可以根据投资组合 NAV 通过资本分配来权衡*期和未来的风险/回报。我们将在以后的文章中具体讨论我们在 RL 环境、代理行为和奖励设计中有哪些工具。
第三个也可能是最重要的,强化设计和政策学习,使代理能够不断学习并适应不断变化的环境。交易中最难的任务不是找到一个有效的策略,而是当策略失效时该怎么办,因为没有什么是永远有效的。通过深度神经网络,我们可以找到历史数据中的任何关系,并通过传统的机器学习方式进行验证。然而,一旦部署,事情开始改变,我们就剩下一个无法解释的黑盒,它仍然是一门艺术而不是科学来训练。这也是深度学习还不是主流的部分原因。RL 通过设计解决了其中一些缺点,但它远不是一个简单的解决方案,需要大量的艰苦工作和反复试验才能实现。
在以后的文章中,我们将深入讨论这些优势的细节,以及各自的挑战。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
应用探索性数据分析,自行车共享。可视化的力量,Python。
1.介绍
这项研究分析了一个修改后的自行车共享数据集。与原始数据集不同,这个“修改”版本包括空值、零和异常值,这为详细的探索性数据分析 EDA 打开了大门。许多关于自行车共享的公共研究包括基础 EDA,然后直接进入建模。该分析的总体目标是执行广泛的 EDA,该 EDA 考虑了现象的物理性质,并为自行车共享租赁建模提供了见解。读完这篇文章后,你会知道:
- 利用人类大脑的视觉能力可以了解拥挤地块的模式或趋势..
- 使包含空值和非空值单元格的行在绘图中可见的技巧。
- 可疑模式的识别和解决它们的建议步骤。
- 在 EDA 过程中揭开数据背后故事的连续步骤。
- 在进行插补之前,考虑解释现象的物理学的重要性。
- 影响自行车租赁数量的变量的初步评估。
- Python 代码以直观对比的方式在绘图上呈现数据,这有助于揭示模式并理解数据背后的“谜题”。
请注意,数据探索是使用 Python(版本 3.7.4)和数据科学库执行的,例如NumPy
、Pandas
、SciKit-Learn
、Seaborn
、category_encoders
、scipy
和date time
等等。
目录
1…..简介
2…..属性信息
3…..空值、零和异常值
4…..相关结构
5…..响应变量的单变量行为
6…..带有时间变量的响应变量的行为
7…..结论
8…..参考
2.属性信息
数据集包含六个与时间相关的变量,四个连续变量,以及自行车的响应变量计数' cnt' 。
2.1.特征工程和编码
为了 a)促进数据过滤,b)从数据中提取隐藏信息,c)分析图中的趋势,以及 d)对自行车共享租赁进行建模,可以方便地推导和编码如下一些特征:
请注意‘季节’变量携带排序(即,夏季之后是秋季)。Sci-Kit-learn 的*LabelEncoder()*
等编码算法不会考虑季节的顺序,因为它是按字母顺序编码的。相反,*category_encoders*
库允许使用字典映射来建立定制的顺序。
3.空值、零和异常值
数据表包含标识特征或变量的列,以及包含每个特征数据的单元格的行。如果某一行恰好有一个包含空值的单元格,即使该行中的其余单元格都是非空值,整行也会导致一些算法出错。另一方面,如果零点和异常值代表误差源,它们将对模型产生负面影响。因此,首要任务是识别、分析并解决空值、零和异常值。标签的使用促进了这一过程;本节分析描述了这一过程。
3.1.从标记空值开始。
*df.isna().sum()*
的执行识别数据集中具有空值的特征。 temp' 和' hum' 是仅有的两个具有空值的特征。名为' outlr_miss' 的列将存储具有以下值的标记:(注意 Python 中的 NaN 表示非数字,这就是后缀' _nan' )的原因
一旦包含空值的行被标记,应该正好有 23 行显示‘temp _ nan或‘hum _ nan’标记。观察下面的熊猫数据帧输出。
3.2.标记零
旁边的图显示的是*df.isin([0]).sum()*
的输出。诸如“小时”小时“之类的序数特征或诸如“假日”或“工作日”之类的布尔特征应该有零。但连续特征中的零如' atemp' 有 2 个零值' hum' 有 22 个零值' windspeed' 有 2180 个零值就可疑了。请注意,标签带有后缀“_zero ”,表示该行有零。下面是编码空值和零的 Python 代码片段。
3.3.散点图或配对图显示了零值、零和异常值
散点图对于评估要素间的共线性以及识别空值、零和异常值非常有用。乍一看,矩阵图看起来像一堆小的单色图,有时非常小,以至于让我们怀疑它们的用途。但是,当这些图以正确的颜色对比显示数据时,它们会触发人类的大脑。记住,人类的大脑天生是视觉的,它通过图像和颜色更好地处理信息。这就是标签有用的地方,它们变成了一个给空值、零和离群值着色的类别。
在分析的这一点上,自行车共享数据表包括具有包含空值的单元格的行。这是一个隐含的问题,因为大多数绘图和机器学习 ML 算法在出现空值时会咳嗽。默认情况下,这些算法通过排除具有空值的行来解决这个问题。默认设置的结果是,具有空值和非空值的行在绘图中完全不可见。下一节解释了一个零-零替换技巧,该技巧使用标签使具有空值和非空值的行在绘图中可见。
3.3.1.绘图的代码
Python 库 seaborn 方便了各种情节的构建;然而,当出现空值时,*pairplot(..)*
等算法会咳嗽。这个分析提出了两个技巧来克服这个问题。
- 归零替换绝招。Plots 以类似表格的格式接收数据;它们有代表特性或变量的列和代表实际数据的行。当表中的行为空时,绘图算法会产生错误。为了解决这个问题,用户和统计应用程序会自动排除具有空值的行。因此,位于相同行中的非空值在图上变得“不可见”。
这个分析提出了一个零-零替换技巧,使用零来替换零。这种转换发生在运行时,同时数据被提供给 Python 绘图算法;因此,空值在原始数据集中保持不变。 - 标签的自定义调色板。Python 绘图算法遵循预定义的调色板,许多时候颜色之间的对比度会对人眼产生阴影数据模式。自定义调色板的定义解决了这个问题,观察下一个 Python 代码。
3.3.2.空值、零点和异常值的分析
本节重点介绍帮助识别和分析图中的空值、零和异常值的技巧。
(1)揭示具有空值和非空值的行。 零-零替换技巧 允许在散点图中呈现具有空值和非空值的行。观察对应于‘temp _ nan’标签的橙色圆点;每个橙色点代表数据表中某一行的单元格值。请记住,这些橙色点代表空值或非空值,具体取决于图。一方面,橙色点代表温度‘temp’为变量之一的那些图中的空值;在散点图中,这些图被橙色矩形包围。注意,在这些图中,零表示空值;这就是为什么橙色圆点在' temp=0' 处遵循线性模式。另一方面,橙色点表示温度' temp' 不是变量之一的那些图上的非零值。
橙色和蓝色圆点遵循相同的解释。请注意,这些点的标签带有相同的后缀 '_nan '。该工作流的下一步将在建模之前处理这些空值。
注意:对 零-零替换技巧 的一个改进是对那些代表空值的点使用透明颜色。这需要额外的编码来在运行时操作数据和分配颜色。
(2) 显示真零值的异常值。观察对应于' hum_zero' 标签的黑点;它们用零值表示湿度'哼'。这些零值确实存在于数据表中。这些黑点形成了一个突出的线性图案。带有‘atemp-zero’和‘wind speed _ zero’标签的点的解释与黑点类似。这些零值代表异常值,需要在执行进一步分析之前解决。
(3)离群值。以温度'、温度''和'感觉样'温度' atemp '为变量的散点图显示了一系列形成线性模式的灰点。这些点应被标记为异常值,因为:1)它们从形成 45 度趋势的大多数点中脱颖而出,2)它们显示' atemp' 的常量值,这是可疑的,3)它们都发生在 2012 年 8 月 17 日的某一天,这也是可疑的。同样,这是一个被修改的数据集,可能是手工修改的,这些异常值需要在建模前处理。以下是将这些异常值标记为' atemp_outlr '的 Python 代码片段:
3.4.处理空值、零和异常值
使用均值、中值或众数等指标进行插补的策略似乎适用于单变量分析。自行车共享数据集是一个多元数据集,解决空值、零和异常值的第一次尝试应该包括探索数据集中各要素之间的相关性或相似性。
3.4.1.处理温度的零值、零和异常值
我们都经历过这一点,在高温‘temp’下,‘感觉上’的温度高于实际温度;相反,在低温下,“感觉”温度低于实际温度。这些变量之间的线性关系有助于解决和校正温度的零值、零点和异常值。
下图显示了温度、【temp】、和、【atemp】、之间的线性关系。一个变量告诉另一个变量。因此,在建模期间,可以从分析中删除这些变量中的一个。然而,我们将使用这种关系来强调这样一个事实,即在处理空值、零值或异常值时,寻找变量之间的关系或相似性应该是列表中的第一个选项。
左边的散点图显示了所有的原始数据。代表标签的颜色揭示了三种可疑的模式(观察每个标签的后缀):异常值(浅蓝色点)、零(洋红色点)和空值(橙色点)。记住,橙色的点代表被零代替的空值;调零技巧使零点在图上显示为零,我们可以直观地评估它们的数量以及对这些零值的修正是否有意义。这就是标签变得方便的地方;它们允许在数据从 Sci-Kit-learn 输入线性回归模型之前过滤可疑趋势。一旦模型被训练,它就被用来校正温度中的可疑模式。
3.4.2.湿度的零位和零点寻址
湿度或空气中的水蒸气量通常在天气报告中被称为相对湿度。相对湿度与露点和温度有关;因此,试图解决湿度零值和零值的第一次尝试应该包括识别与温度和露点的相关性或相似性。
自行车共享数据集提供了湿度和温度值,但该数据集中缺少露点值。下图调查了湿度与数据集中可用变量的可能关系或相关性。请记住,在这些图中,蓝点表示以零表示的空值(这些点在数据表中不存在)。
这些图显示了湿度缺乏一个确定的模式;然而,模式是存在的。人类的大脑是一个视觉学习者,数据需要以块和颜色的形式呈现,以揭示可能的模式。更详细地研究数据应该有助于确定湿度的可能关系。想想看,早上的温度很低,然后在下午逐渐升高,最后在一天结束时降低。由于温度与湿度相关,这表明白天可能存在湿度关系。下一张图显示了每天的温度和湿度。
前面的图显示了湿度、温度和风速的每日值缺乏定义的模式。然而,下一张图展示了一幅不同的画面;它显示了湿度和温度在一天的几个小时中相互作用的模式。第三个图,从左到右,显示湿度值为零;这些值存在于数据集中,它们不是的结果零零替换技巧。
请注意,用颜色和块(按天)表示的数据允许大脑了解温度和湿度之间的相反模式;用*均值代替湿度中的零是没有意义的。
下图证实了这一点,黑点有一个‘哼 _ 零’标签。后缀 '_zero' 表示实际上那些在原始数据集中是零。
观察湿度和温度遵循相反的趋势,这与天气报告描述的行为一致。湿度不仅与温度有关,还与露点有关;因此,要计算一个值,需要另外两个值。自行车共享数据集中没有露点;因此,不能从自行车共享数据集推导出直接的关系来计算湿度的空值和零值。
任何处理零湿度值的关系都需要考虑湿度、温度和露点的日常关系。随机森林是解决湿度零值和零值的一个很好的起点,因为:
1)湿度、温度和露点之间的关系不是线性的
2)随机森林在预测其训练值范围内的值方面做得很好。
3)缺乏与露点相关的信息使得直接得出湿度值变得困难。
用于训练随机森林回归的数据集具有非空的湿度值。一旦训练了随机森林回归量,就可以用它来预测湿度的空值。下面是 Python 代码的一个片段。
下图显示了随机森林回归的结果。观察 2011/3/10 周四的情节;在应用随机森林之前,该地块在‘hum = 0’处具有水*趋势。在应用随机森林树回归器后,该图显示了一个湿度趋势:a)与天气预报中报告的每日湿度趋势相匹配,b)正好在星期三结束时开始,并与星期五的开始趋势相匹配。
因此,在这种情况下,Random Forest Regressor 不仅很好地处理了空值和零值,而且还考虑了湿度、温度和露点的物理特性。
3.4.3.风速中的零地址
下图显示了不同特征的风速行为。观察绿点;它们代表湿度的零值。这些点不仅在散点图中形成分离的模式,而且在分布图中形成双峰行为。随机森林回归器是解决这种可疑湿度模式的良好起点。
下图显示了随机森林回归的结果。分布图显示了单峰行为,绿点在风速= 0’不再形成水*趋势。
4.相关结构
识别特征间共线性的一种方法是使用相关矩阵,它提供了皮尔逊相关系数。直观地说,自行车数量不仅取决于与天气条件有关的变量,还取决于时间。因此,相关矩阵包括天气和时间变量。
温度' temp' 和类感觉温度' atemp' 之间的共线性是明显的。因此,从' temp '获得的类似感觉的温度将在建模过程中被排除。总的来说,自行车数量与温度呈正相关,与湿度呈负相关。散点图矩阵的底行显示了这些趋势。另外,请注意,一些时间变量与自行车数量有很高的相关性;小时更是如此。接下来的部分将以图表的方式探索自行车数量与时间变量之间的关系。
5.响应变量的单变量行为
自行车数量的分布【CNT】是右偏的,需要进行对数变换来修正该行为。即使对数变换不能完全校正偏斜度,结果也接*正态分布。这种转变将对一些机器学习算法产生积极影响。
6.具有时间变量的响应变量的行为
观察下图中箱线图的中值(高于数据的 50%);它显示了自行车租赁数量的四个一般特征。1)租金逐年增加,2)趋势最初随着时间的推移而增加,然后减少,3)趋势随着时间的推移而循环,以及 4)异常值的存在。更详细地说,可以得出以下陈述:
- 前两个方框图表明,从一月份开始,租金逐渐增加,并在整个春季持续增长,在夏季达到峰值。然后,租金在秋季和冬季下降,以适应第二年 1 月和春季的趋势,这是周期性行为的一个迹象。自行车租赁发生在夏季。
- 左中框图示出工作日期间自行车租赁需求较高。这一现象更加明显,连续第二年增长了* 50%。这一行为标志着自行车租赁的流行程度正在增加,至少在该数据集的城市来源中是这样。
- 右中框图示出了人们在假日出行减少的情况。然而,这个情节也揭示了这些年来自行车租赁的普及程度的增加。
- 底部方框图也类似于流行度的增加和周期性行为。这一次在一天的短时间内进行两次循环。对自行车的需求出现在上午 7-9 点和下午 5-6 点之间。这些模式匹配上班和下班的工人;工人们实际上使用自行车作为工作的交通工具。请注意,需求在采摘时间之间保持相对稳定,这可以用“普通人”、游客和使用自行车的学生来解释。
我们来考察下一组地块。观察大脑如何轻松消化多种趋势,得益于图上不同的排序和颜色。连续趋势线的拐点描绘了一天中每小时租赁自行车的*均数量。这些趋势线与我们刚才解释的模式和特征相似。这些图给了我们额外的信息。虚线表示一天中几个小时*均温度的变化。这种趋势有助于我们确定,至少是部分确定(记住这是多变量分析,湿度、风速和露点不在这些图中),一天中几个小时内温度对租赁自行车数量的影响。
上面的图揭示了有趣的趋势。秋季显示全天最高的*均温度;相比之下,春天全天*均温度最低。春天最低的*均温度似乎与最低的*均自行车数量相关,这也发生在春天。我们可以说人们在春天不怎么骑自行车;也许人们想远离花粉、灰尘等。在这些时期,人们不想染上过敏症。
趋势的重叠告诉我们夏天、秋天和冬天的*均自行车数量。人们可能认为这可能与温度有关;然而,告诉我们同一季节*均温度的趋势并不重叠。换句话说,*均温度趋势的分离与夏季、秋季和冬季的*均计数趋势的分离不匹配。
(*) 因此,夏季、秋季和冬季的*均温度不会改变自行车的*均需求趋势。然而,由于温度不是控制天气状况的唯一因素,似乎在夏天、秋天和冬天有一个相对恒定的自行车需求的可变因素的混合。
(*) 此外,与春季相比,夏季、秋季和冬季的*均自行车需求更高。
最后的情节也揭示了一个有趣的趋势。*均温度在一周的几天里保持不变。你可能会问:当前面的图显示*均温度在一天的同一时间变化时,这怎么可能呢?这个图显示了所有周一和所有季节的*均温度,比如说在 23 点整。这个*均温度碰巧在星期二、星期三等相对相同。您可以手动运行计算,比如在 23 小时后进行确认。注意温度趋势的曲折性;尽管这是一个*均趋势,但它遵循天气报告中报告的趋势。
在这最后一个情节中还有另一个有趣的趋势。想象一下,*均自行车数的选择不在最后一个图中。然后,在周末,尤其是上午晚些时候和下午早些时候,对自行车的*均需求更高。
1.1.结论
总的来说:
- 显示所有变量的所有数据的单色图欺骗了人脑。人类是视觉学习者,图中的颜色影响很大。当图用引用不同类别、标签或短时间范围的颜色显示数据时,它们揭示了探索性数据分析过程中有价值的模式和见解。
- 解决空值、零点和异常值的第一步是识别可用变量之间的相关性或相似性。使用均值或中值等指标估算值的策略适用于单变量分析,应该是最后的行动。
- 随机森林回归器是解决空值、零和异常值的良好起点;它提供的结果尊重这个数据集中的物理现象。
- 描述周末*均自行车数量的趋势不同于周一至周五(工作日)的趋势。在工作日,高峰时间上午 6:30-8:530,下午 5:00-7:00 的自行车需求。
- 描述春季*均自行车数量的趋势不同于夏季、秋季和冬季的趋势。夏季、秋季和冬季的*均自行车需求保持相对稳定(观察这些趋势重叠)。
- 还不能 100%确定温度是否是自行车需求不同趋势的唯一原因。记住温度不是天气状况的唯一因素。
- 自行车数量的趋势是日复一日、年复一年循环往复的。
8.参考
- 在天气预报中,空气中的湿度或水蒸气含量通常被称为相对湿度。
- 天气报告描述了相对湿度、温度和露点之间的相互作用。
- 相对湿度、温度、露点计算器。
- 修改后的自行车共享数据集和本出版物的 Python 代码源位于我的 GitHub 账户中。
👉联系我: LinkedIn
应用机器学习模型提高初创企业估值
由于历史数据有限、现有收入很少甚至没有、市场不确定性等等,在大多数情况下,确定早期创业公司的估值非常具有挑战性。因此,传统的估值技术,如贴现现金流(DCF)或倍数(CCA),往往会导致不适当的结果。另一方面,替代估价方法仍然受制于个人的主观评估,对其他人来说是一个黑箱。
因此,基础研究利用机器学习算法来预测公*、数据驱动和可理解的初创公司估值。三个不同的数据源被合并并应用于三个回归模型。回归模型的性能根据定义的度量进行比较,最终结果是一个连续的数值——预测的启动估值。
应用机器学习进行初创企业估值(图片由作者提供)
最重要的是:获得正确的数据
为了建立机器学习模型并获得显著的结果,拥有坚实的数据库是必不可少的。在这种情况下,最终的分析数据集是公共和私有、匿名数据源的组合。这项研究是通过与 investory.io 合作来获得匿名的关键绩效指标,以及初创公司的统计表数据。结合 Crunchbase,可以将这些数据映射到融资阶段、融资轮次、地点和团队规模。最后但并非最不重要的是,我们使用了社交媒体数据,因为之前的一项研究(“社交是新金融”,金等人 2017 年)发现了完成投资轮的可能性与 Twitter 活动之间的关系。在这一点上,大声喊出来 Storyclash 访问他们惊人的社交媒体分析*台。
数据源概述(图片由作者提供)
数据预处理
大部分工作都必须花在将不同的数据源合并在一起并清理它们上。虽然 investory.io 数据已经是一种干净的数字格式,但是 Crunchbase 数据并没有通过他们的 API,因此格式非常不干净。
数据处理概述(图片由作者提供)
一开始,不同表和信息的概述是由一个简单的数据库客户机 DBEAVER 生成的。之后,主要在 Python 编程的帮助下提取、转换和加载相关信息。
由于这产生了无数行代码,我们不会深入每个细节,但选择一些例子作为下面的数据规范化。但让你简单了解一下:有来自 50 多个国家的公司,有各种不同的货币和地方特色。人们常说,数据准备、清理和转换消耗了一个数据科学家 80%的时间。在这种情况下,这种说法也证明了自己是正确的。
标准化&缩放
为我们的机器学习算法准备数据集的一个重要步骤是归一化。这个想法是把数字值放在一个共同的范围内。这是必要的,因为我们有人数和收入两个特征。虽然收入可能是一个 6 位数的数值,但人数不太可能超过 100。这些功能具有非常不同的范围,收入只会因其更高的价值而对我们的模型产生更大的影响。
#Data Normalization
from sklearn.preprocessing import MinMaxScaler#Select numerical columns which needs to be normalized
train_norm = x_train
test_norm = x_test# Normalize Training Data
scaler = MinMaxScaler(feature_range=(0, 1))
x_train_norm = scaler.fit_transform(train_norm)#Converting numpy array to dataframe
training_norm_col = pd.DataFrame(x_train_norm, index=train_norm.index, columns=train_norm.columns)
x_train.update(training_norm_col)
print (x_train.head())# Normalize Testing Data by using mean and SD of training set
x_test_norm = scaler.transform(test_norm)
testing_norm_col = pd.DataFrame(x_test_norm, index=test_norm.index, columns=test_norm.columns)
x_test.update(testing_norm_col)
print (x_train.head())
最小最大值缩放器对异常值非常敏感。如果您的数据有一些严重的异常值,请事先处理好。规范化数据的范围通常在 0 到 1 之间,如上面的代码所示。
应用回归模型
在该项目中,有三个回归模型应用于数据集。它们是根据它们的特性和通常的应用目的来选择的。每个回归模型都借助三个指标进行评估:*均绝对误差、均方根误差和 R *方。
评估指标(图片由作者提供)
线性回归
线性回归描述了寻找尽可能接*给定数据点的直线的过程。该模型然后试图最小化*方误差。由于假设公司估值随着业绩逐渐改善而增加,因此对给定数据集应用线性回归。此外,由于本项目的数据集中给出了多个特征,因此这不是简单的多元线性回归。由于该项目是使用 Python 建立的,因此 statsmodels 模块用于执行回归和评估预测结果。虽然有几个类可用,但选择了普通最小二乘法,因为它主要用于训练数据中的线性关系。
# Linear Regression
import pandas as pd
from sklearn import linear_model
import statsmodels.api as sm# with sklearn
regr = linear_model.LinearRegression()
regr.fit(x_train, y_train)print('Intercept: \n', regr.intercept_)
print('Coefficients: \n', regr.coef_)# with statsmodels
x_train = sm.add_constant(x_train) # adding a constant
model_OLS = sm.OLS(y_train, x_train).fit()
#predictions = model.predict(x_test)
print_model = model_OLS.summary()
print(print_model)
第一行中的常数(const)表示所有其他变量为零时的估计值。这个常数被计算为 986.000 €。此外,该模型的收益系数的 p 值为 0.003,具有统计学意义。在移除一个又一个系数(总是具有最不重要值的一个)后,就有了明显驱动模型的系数:p 值为 0.000 和 0.004 的收入和员工人数。
多元回归 多项式回归分两步进行。首先,数据必须转换成多项式。1 度将产生简单的线性回归。要创建多项式回归,次数必须大于 1,并且要小心选择,因为如果值选得太高,模型可能会过度拟合。
(图片由作者提供)
多项式回归的最终代码如下所示:
# Poly Regression
import operator
import pandas as pd
import matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.preprocessing import PolynomialFeatures# with sklearn
polynomial_features= PolynomialFeatures(degree=2)
x_poly = polynomial_features.fit_transform(x_train)model = LinearRegression()
model.fit(x_poly, y_train)
y_poly_pred = model.predict(x_poly)MAE = mean_absolute_error(y_train,y_poly_pred)
rmse = np.sqrt(mean_squared_error(y_train,y_poly_pred))
r2 = r2_score(y_train,y_poly_pred)
print(MAE)
print(rmse)
print(r2)
神经网络回归
众所周知,神经网络优于传统的学习算法,尤其是在图像识别或分类问题上。将神经网络应用于回归问题在现有文献中并不常见。这可能是由于用于回归的神经网络可能被认为对于回归来说过于工程化,这在许多情况下更简单并且不需要那么多计算能力。但另一方面,也有人认为,深度神经网络模仿人脑,因此在复杂任务中表现更好。鉴于当前数据集非常复杂且具有许多特征的事实,其思想是应用神经网络来提高性能,与之前应用的传统模型竞争。
## Neural Networkmodel = Sequential()
model.add(Dense(256, input_dim=10, kernel_initializer='normal', activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(1, activation='relu'))
model.summary()model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
在这种特定情况下,模型具有一个输入层、两个具有 512 个节点的隐藏层和一个输出层。选择的激活函数是校正线性单位函数(ReLU)。该函数被广泛使用,由于其在低计算能力下的良好性能及其不同时激活所有神经元的能力,该函数通常是良好的首选。最后一层是输出层,只有一个节点负责最终输出。在这种情况下,私人公司估值。在这种情况下,使用均方误差作为损失测量和优化器 adam 获得了最佳结果。与随机梯度下降优化相反,adam 优化器管理网络中每个参数(权重)的学习速率,并单独调整它们。最终的神经网络模型如下所示:
评估车型性能 R2、梅和 RMSE 用于确定各车型的整体性能并进行比较。解释系数有助于找到模型的驱动因素。在解释结果之前,可以看出多项式回归优于神经网络回归和线性回归。
此外,该模型的收益系数的 p 值为 0.003,具有统计学意义。在移除一个又一个系数(总是具有最不重要的值)后,有两个系数明显地驱动了该模型:p 值为 0.000 和 0.004 的收入和员工人数
预测初创企业估值的结果
表现最好的机器学习模型是多项式回归模型。它有一个 28%的解释偏差,这是模仿人类行为可以接受的。此外,*均误差为 830,000 欧元,KPI 特征“收入”和“人数”对模型有显著的统计影响。
底层的应用机器学习模型只考虑结构化的性能数据。通常会极大推动初创公司估值的重要因素,如管理团队经验、技术优势、运营市场增长等,尚未得到考虑。这也解释了适度的 r *方值。需要说明的是,当涉及到 r *方时,特别是当模型模拟人类行为时,没有定义接受水*的标准指南。
研究表明,利用少量结构化的私营和上市公司数据,一个简单的回归模型就能得出有用的估值。为了进一步开发机器学习模型并提高其性能,强烈建议下一步考虑更多的功能。来自上述领域的非结构化数据与其他增长指标相结合,很可能会显著提升模型性能。
特别感谢 investory.io 的 Guillermo Falco 和 SRH 海德堡的 Barbara Sprick 教授博士支持这项研究。
您可能也喜欢阅读的文章:
使用 Docker 设置您的数据环境
应用多元回归
机器学习系列的第 4 篇
在本文中,我们将了解多元回归的概念。我们还将讨论与算法相关的一个常见问题,即虚拟变量陷阱。
首先,我们将熟悉多元回归的概念,然后我们将建立自己的多元回归模型。然而,在开始之前,我建议你看一下我关于简单线性回归的文章,以便更好地理解这些概念。
什么是多元回归?
多元回归是简单线性回归的扩展。当我们希望根据两个或更多不同变量的值来预测一个变量的值时,就会用到它。我们要预测的变量叫做因变量,而那些用来计算因变量的叫做自变量。
多元回归的数学函数/假设具有以下形式:
其中,n 代表自变量的个数,β0~ βn 代表系数,x1~xn 为自变量
使用多元模型有助于我们比较不同结果的系数。使多元或多元线性回归成为更好模型的是一个小的成本函数。
成本函数
简而言之,它是一个为模型偏离观测数据的情况分配成本的函数。在这种情况下,我们的成本是误差*方和。多元线性回归的成本函数由下式给出:
我们可以把这个方程理解为我们的预测值和实际值之差的*方和除以数据集长度的两倍。较小的均方误差意味着更好的性能。通常,成本函数与梯度下降算法一起使用,以找到最佳参数。
图片来自PixabayNattanan Kanchanaprat
现在,我们将通过构建多元线性回归来实际应用我们所学的知识。
你可以在我的 GitHub 手柄上访问这个回归模型的完整代码和其他资源。
在这个例子中,我们将预测一所房子的价值,给定的特征有中等收入、*均房龄、房间数、家庭数、*均面积、卧室数和地区人口。
步骤 1:导入库并加载数据
我们的第一步是导入构建模型所需的库。没有必要在一个地方导入所有的库。Python 允许我们在任何地方导入任何库。首先,我们将导入 Pandas、Numpy、Matplotlib 和 Seaborn 库。
#Importing the libraries and and reading the data into a Pandas DataFrameimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snstest=pd.read_csv("california_housing_test.csv")
train=pd.read_csv("california_housing_train.csv")
一旦导入了这些库,我们的下一步将是获取数据集并将数据加载到我们的笔记本中。对于这个例子,我采用了加州住房数据集。
第二步:可视化数据
成功加载数据后,我们的下一步是可视化这些数据。Matplotlib 和search是优秀的库,可以用来可视化我们在各种不同地块上的数据。
#Visuaising our data using Seaborn Libraryplt.figure()
sns.heatmap(data.corr(), cmap='coolwarm')
plt.show()sns.lmplot(x='median_income', y='median_house_value', data=train)
sns.lmplot(x='housing_median_age', y='median_house_value', data=train)
步骤 3:特征工程
特征工程是利用领域知识通过数据挖掘技术从原始数据中提取特征的过程。我只选择了几列来处理这个模型的连续数值。
data = data[[‘total_rooms’, ‘total_bedrooms’, ‘housing_median_age’, ‘median_income’, ‘population’, ‘households’]]
data.info()data['total_rooms'] = data['total_rooms'].fillna(data['total_rooms'].mean())
data['total_bedrooms'] = data['total_bedrooms'].fillna(data['total_bedrooms'].mean())
当特征数量非常大时,特征工程变得更加重要。特征工程最重要的用途之一是减少过度拟合,提高模型的准确性。
第四步:拟合模型
选择所需参数后,下一步是从 sklearn 库中导入 train_test_split,该库用于将数据集拆分为训练和测试数据。
#Splitting training and testing datafrom sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train, y, test_size = 0.2, random_state = 0)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)
在此之后,从sk learn . model _ selection导入线性回归,并且模型适合训练数据集。我们模型的截距和系数可以计算如下:
#Fitting the model on training datafrom sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)#Calculating the Intercept and Coefficientprint(regressor.intercept_)
print(regressor.coef_)
可以通过找到模型的均方根误差来评估模型的性能。
predictions = regressor.predict(X_test)
predictions = predictions.reshape(-1,1)#Calculate RMSE of the modelfrom sklearn.metrics import mean_squared_error
print(‘MSE:’, mean_squared_error(y_test,predictions))
print(‘RMSE:’, np.sqrt(mean_squared_error(y_test,predictions)))
我们模型的 RMSE 是 0.6628934048044981。计算值与预测值的曲线图如下所示:
虚拟变量陷阱
使用多元模型时,处理定量或数值数据很容易。然而,这对于分类数据来说是不一样的。它们不能直接使用,需要改造。
虚拟变量是用来代替分类数据的“代理”变量,分类数据有时出现在我们用来建立回归模型的数据集中。将所有哑变量用于回归模型导致哑变量陷阱。
作者图片
虚拟变量陷阱是独立变量多重共线的情况,即两个或更多变量高度相关。为了避免这种情况,建议在设计回归模型时排除一个虚拟变量。
这里有一个例子来理解这是如何工作的:
让我们考虑性别的情况,它可以有两个值男性(0)或女性(1)。在使用标签编码程序将这些分类特征转换为数字属性后,如果我们包含两个虚拟变量,则会导致冗余,从而导致虚拟变量陷阱。
这样的问题是可以避免的,如果我们在回归模型中不使用这两个变量,就好像一个人不是男性,那么预计这个人是女性。这样可以避免虚拟变量陷阱
资源
这里有一些资源,您可以使用它们来更深入地理解多元回归的概念。
现在我们已经到了这篇文章的结尾,我希望你会发现这篇文章真的很有启发性。我希望你发现它内容丰富!如果你有任何问题或者我做错了什么,请联系我!你可以通过邮箱或 LinkedIn 与我联系
使用 Python 的应用图形网络分析
让我们试着理解如何使用图形数据结构来分析使用 NetworkX 库的网络。
使用 Canva 设计。
网络无处不在。网络或图形是一组彼此有某种关系(称为边)的对象(称为节点)。但是图表如何用于我们的日常分析呢?我将使用两个示例来解释网络分析的实时用法。不要错过最后的案例研究!我向你保证,这是一个有趣的!
首先,考虑一下我们的世界目前面临的挑战。是新冠肺炎·疫情。让我们假设我们有一个由全球各机场组成的网络,如下图所示。我们可以找到连接数量更多的机场,并将它们识别为热点。
其次,让我们考虑一个 twitter 网络。我们可以通过使用网络分析识别重要节点来找出最有影响力的人。如今,这是大多数营销机构处理可达性和传播问题的方式。
我们可以清楚地注意到,网络分析在社会网络、金融网络、生物网络、交通网络等各个领域都有很多应用。在这一系列文章中,我们将使用 NetworkX 库来创建图表。在这一部分,让我们试着理解网络分析的基础知识。
NetworkX API 的基础
正如我已经提到的,网络(数学上称为“图”)由节点和边组成。这些节点和边也可以有元数据。让我们考虑两个朋友 A 和 B 在 2020 年 5 月 31 日相遇的例子。让我们现在创建一个网络。
查询数据
图形的类型
无向网络 边没有方向。例如——脸书社交图。(A 向 B 发送好友请求,两人成为好友)
有向网络 边有方向。例如,一个 Twitter 社交图。(A 跟随 B,但 B 不一定跟随 A)
加权网络 不是所有的关系(边)都是相等的。有些更有分量。
示例—让我们考虑一个组织中的员工网络,边上的权重表示发送给彼此的电子邮件数量。上图中,A 给 B 发了 6 封邮件,以此类推。
签名网络 一些网络携带关于友谊和敌意的信息,这些信息作为属性被描绘在关系上。例如——在一个名为“Epinions”的网站上,人们可以声明一个关系是朋友还是敌人。
多网络 在一些网络中,节点之间可能存在不止一条边。示例—考虑图像中显示的关系网络。
重要节点
考虑以下网络?你觉得哪个节点重要?
你可能会回答,中心节点很重要。你是如何得出这个答案的?您会看到中心节点比任何其他节点都有更多的邻居。
度中心性
它是用于评估节点重要性的众多指标之一,简单定义为—
具有高度中心性的节点的例子是
1。Twitter 广播公司—(有许多追随者)2。疾病超级传播者
3。机场枢纽(阿布扎比、纽约和伦敦)
正如所料,我们可以注意到,节点 1 的度中心性是最大的。neighbors()
方法返回该特定节点的邻居。
中间中心性
所有最短路径是给定网络中所有节点对之间的一组最短路径。节点的介数中心性被定义为—
该指标从不同的角度反映了节点的重要性。它不是寻找具有更多邻居的节点,而是寻找网络中的瓶颈节点。我们可以使用nx.betweenness_centrlality(G)
方法找到图 G 的节点的介数中心性。考虑下图所示的海得拉巴市地铁地图。具有较高介数中心性的节点被圈起来。
我猜你理解中间中心性背后的直觉。它假设以最短的可能方式连接大多数其他节点的节点是最重要的。
个案研究
阅读这篇文章时,你的脑海中可能会突然冒出一个问题。数据集将如何帮助我们建立一个网络?到目前为止,我们已经明确地创建了节点,并在它们之间添加了边。但现实生活中并非如此。让我们拿一个边缘文件,尝试建立一个网络。
马克·萨格曼研究了汉堡分部(911 袭击的幕后黑手)的一些恐怖分子的生活。他发现驱动它们的最常见因素是它们细胞内的社会联系。他创造了一种分析,其中包括恐怖分子之间的社会联系。数据不是 100%完整和准确的。
前两列表示有联系的人,后面两个数字表示联系的强度(5 =强联系,1 =弱联系);最后一列表示政府官员已经验证的连接级别(1 =确认,3 =可能和未确认的连接)。最后两列将不会在我们的分析中使用。
我们可以使用下面的代码将上面的 edge 文件转换成图形。
现在让我们找出具有最高程度中心性和中间中心性的前三个节点。
类似地,我们也可以找到前 3 个中间中心节点。我们可以在下面显示的陷阱中看到中间性中心值最高的三个节点。很明显,如果没有这些节点,网络将会断开。
你可能会想,如果没有两个红色的圈起来的节点(紫色的),这个图也是非常连通的。即。名为 Imad Eddin 巴拉卡特亚尔卡斯的节点仍然连接着该图。但是如果没有用红色圈出的节点,从中心部分到每个节点的消息传输时间会更长。具有高介数中心性的节点充当以最短可能路径传递消息的连接。因此,与所有其他节点相比,用红色圈出的节点具有最高的介数中心性。
结论
在本文中,我们试图了解网络分析在各个领域的重要性以及networkx
API 的基础知识。我们还了解了许多应用网络分析的实际情况。接下来,我们将讨论网络的连通性和健壮性。敬请期待!
感谢阅读。请随时分享反馈。
参考
应用时间序列预测:美国住宅市场
现实世界的时间序列预测与解释
1.介绍
在这 19 个月中,房地产行业在经历了年初以来的停工期后,正在迅速反弹。4 月份,新住宅建筑数量下降至约 100 万套。截至 7 月,有 150 万套新房正在建设中(相比之下,2019 年 7 月为 130 万套)。8 月 18 日发布的人口普查局报告显示了房地产市场的一些非常好的指标。
新房建设在经济中起着重要的作用。除了创造就业机会,它还同时影响木材、家具和家电市场。这也是经济整体健康状况的一个重要指标。
因此,有人可能会问,在 COVID19 冲击之后,这一至关重要的经济指标在未来几个月和几年将如何表现?
回答这些问题需要一些预测。
本文的目的是利用流行的时间序列预测模型 ARIMA 对住宅建设进行中短期预测。
即使您对房地产市场不太感兴趣,但对数据科学感兴趣,这也是一个实用的预测示例,可能会帮助您理解预测如何工作以及如何在现实世界的应用案例中实现模型。
2。方法总结
目标是利用从census.gov数据库中获得的历史数据,预测短期和中期住宅单元的建设。请注意,在人口普查局的数据库中,您会看到有几个关于住房指标的数据集,包括“住房单元开始”和“住房单元完成”;本文中我使用的是后者。
人口普查局是大量社会、经济和商业指标的各种时间序列数据的重要来源。因此,如果你对时间序列分析和建模感兴趣,并希望避免玩具数据集,人口普查局是一个很好的去处。
我在 R 编程环境中做建模。Python 有很棒的库用于数据科学和机器学习建模,但在我看来,R 有最好的包,叫做fpp2
,由 Rob J Hyndman 开发,用于时间序列预测。
时间序列预测的方法有很多种,我之前也在几篇文章中写过(你可以查看这个和这个),但是这次分析我打算用 ARIMA。在选择 ARIMA 之前,我运行了其他几个模型——Holt-Winter 和 ETS——但发现 ARIMA 在这个特定的数据集上有更好的表现。
3.数据准备
我唯一使用的库是fpp2
。如果您安装此库,所有必需的依赖项将随之而来。
在 R 编程环境(RStudio)中导入数据后,我调用 head()函数。
# import library
library(fpp2)# import data
df = read.csv("../housecons.csv", skip=6)# check out first few rows
head(df)
我注意到前几行是空的,所以我在 R 之外打开 CSV 文件,手动检查丢失的值,发现第一个数据直到 1968 年 1 月才出现。所以我用一个简单的函数na.omit()
去掉了丢失的值。
# remove missing values
df = na.omit(df)# check out the rows again
head(df)
正如您在上面的数据帧中注意到的,它有两列——时间戳和相应的值。您可能认为这已经是一个时间序列数据,所以让我们继续建立模型。没有这么快,数据帧可能看起来像一个时间序列,但它的格式与建模包不兼容。
所以我们需要做一些数据处理。
顺便提一下,不仅仅是这个数据集,任何任何包中用于这种分析的任何数据集,都需要进行预处理。这是额外的一步,但也是必要的一步。毕竟,这不是一个干净的,你通常在互联网上找到的玩具数据集!
# keep only `Value` column
df = df[, c(2)]# convert values into a time series object
series = ts(df, start = 1968, frequency = 12)# now check out the series
print(series)
上面的代码不言自明。因为我们去掉了“Period”列,所以我必须告诉程序这些值从 1968 年开始,这是一个以 12 个月为频率的年度时间序列。
原始数据是长格式的,现在经过处理后被转换成宽格式,所以你现在可以在一个小窗口中看到大量数据。
我们现在完成了数据处理。与其他机器学习算法相比,处理时间序列的数据容易吗?我打赌是的。
现在我们已经有了我们需要的数据,我们可以继续建立模型吗?
没那么快!
4.探索性分析
探索性数据分析(EDA)可能看起来不像是一个先决条件,但在我看来它是!这有两个原因。首先,没有 EDA,你就完全被蒙住了,你不知道模型中会有什么。你需要知道最终产品的原材料是什么,不是吗?
第二个原因很重要。正如您将在后面看到的,我必须在两个不同的输入数据序列上测试模型的性能。我只在发现时间序列不*滑后做了这个额外的步骤,它有一个结构突变,影响了模型性能(查看下图,你看到结构突变了吗?).
可视化系列
关于fpp2
包的好处是你不必单独安装可视化库,它已经是内置的了。
# plot the series
autoplot(series) +
xlab(" ") +
ylab("New residential construction '000") +
ggtitle(" New residential construction") +
theme(plot.title = element_text(size=8))
1968 年至 2020 年间每月完成的住宅建设
这只是上面的一个单独的情节,但有这么多正在发生的事情。如果你是一名数据科学家,你可以停下来仔细看看,看看你能从这个图中提取多少信息。
以下是我的解释:
- 数据具有很强的季节性;
- 它也显示了一些循环行为,直到 1990 年左右,然后消失了;
- 该系列自 1992 年以来一直保持相对稳定,直到住房危机;
- 2008 年前后,市场震荡导致的结构性断裂清晰可见;
- 自 2011 年以来,市场正在复苏并稳步增长;
- 2020 年来自 COVID19 的又一次冲击。在这张图上看不清楚,但如果你放大就能发现。
你可以从一个简单的图形中提取如此多的信息,这些都是在建立模型之前建立直觉的有用信息。这就是 EDA 在数据科学中如此重要的原因。
趋势
在第一张图中已经可以看到该系列的总体趋势,但是如果您想要更好地了解趋势,可以通过去除季节性来实现。
# remove seasonality (monthly variation) to see yearly changesseries_ma = ma(series, 12)
autoplot(series_ma) +
xlab("Time") + ylab("New residential construction '000")+
ggtitle("Series after removing seasonality" )+
theme(plot.title = element_text(size=8))
去除季节性后的系列
季节性
在看到一般的年度趋势后,如果你想只关注季节性,你也可以用季节性子系列图来做。
# Seasonal sub-series plot
series_season = window(series, start=c(1968,1), end=c(2020,7))
ggsubseriesplot(series_season) +
ylab(" ") +
ggtitle("Seasonal subseries plot") +
theme(plot.title = element_text(size=10))
季节性子系列图
时间序列分解
有一种很好的方法可以在一个图中显示所有的东西——它被称为分解图。基本上,它是四种信息的组合:
- 原始系列(即数据)
- 趋势
- 季节性
- 随机分量
# time series decomposition
autoplot(decompose(predictor_series)) +
ggtitle("Decomposition of the predictor series")+
theme(plot.title = element_text(size=8))
这个分解图中的随机数据部分是我最感兴趣的,因为这个部分实际上决定了预测的不确定性。这个随机成分越小越好。
时间序列分解
放大
我们还可以放大数据系列的特定部分。例如,下面我放大了房地产市场的好时光(1995-2005)和坏时光(2006-2016)。
# zooming in on high time
series_downtime = window(series, start=c(1993,1), end=c(2005,12))
autoplot(series_downtime) +
xlab("Time") + ylab("New residential construction '000")+
ggtitle(" New residential construction high time")+
theme(plot.title = element_text(size=8))# zooming in on down time
series_downtime = window(series, start=c(2005,1), end=c(2015,12))
autoplot(series_downtime) +
xlab("Time") + ylab("New residential construction '000")+
ggtitle(" New residential construction down time")+
theme(plot.title = element_text(size=8))
房地产市场时好时坏
探索性分析到此为止,现在让我们进入模型构建的有趣部分,好吗?
5.用 ARIMA 预测
我已经提到了选择 ARIMA 进行预测的理由,这是因为我用另外两个模型测试了数据,但 ARIMA 的表现更好。
一旦您对数据进行了预处理并准备好使用,构建实际的模型就非常容易了。顺便说一句,这也是大多数建模练习中的情况;编写代码和执行模型是您需要经历的整个过程的一小部分——从数据收集和清理,到建立直觉,再到找到正确的模型。
我遵循 5 个简单的步骤来实现 ARIMA:
1)确定预测值系列
2)模型参数化
3)绘制预测值
4)对特定年份进行点预测
5)模型评估/准确性测试
下面是模型实现所需的所有代码。
# determine the predictor series (in case you choose a subset of the series)
predictor_series = window(series, start=c(2011,1), end=c(2020,7))
autoplot(predictor_series) + labs(caption = " ")+ xlab("Time") + ylab("New residential construction '000")+
ggtitle(" Predictor series")+
theme(plot.title = element_text(size=8))# decomposition
options(repr.plot.width = 6, repr.plot.height = 3)
autoplot(decompose(predictor_series)) + ggtitle("Decomposition of the predictor series")+
theme(plot.title = element_text(size=8))# model
forecast_arima = auto.arima(predictor_series, seasonal=TRUE, stepwise = FALSE, approximation = FALSE)
forecast_arima = forecast(forecast_arima, h=60)# plot
autoplot(series, series=" Whole series") +
autolayer(predictor_series, series=" Predictor series") +
autolayer(forecast_arima, series=" ARIMA Forecast") +
ggtitle(" ARIMA forecasting") +
theme(plot.title = element_text(size=8))# point forecast
point_forecast_arima=tail(forecast_arima$mean, n=12)
point_forecast_arima = sum(point_forecast_arima)
cat("Forecast value ('000): ", round(point_forecast_arima))print('')
cat(" Current value ('000): ", sum(tail(predictor_series, n=12))) # current value# model description
forecast_arima['model']# accuracy
accuracy(forecast_arima)
就像我之前说的,我用两个不同的数据序列来分析 ARIMA,第一个是从 1968 年到 2020 年的整个数据序列。如下图所示,预测值有些*缓(红色系列),并带有许多不确定性。
鉴于过去 10 年的趋势,这个预测在我看来有点不现实。你可能会认为这是由于 COVID19 的影响?我不这么认为,因为这个模型还不应该接收到这个信号,因为 COVID impact 只是整个系列的一小部分。
然后我意识到,这种不确定性是因为该系列中的历史特征,包括不均匀的周期和趋势以及结构性断裂。所以我决定使用过去 10 年的数据作为预测。
全时间序列预测
下图是我们使用序列的子集作为预测值时的样子。您可以直观地比较两个数字之间的预测区域和相关的不确定性(红色)。
用序列的最*数据进行预测
下面是基于两个输入序列比较两个模型性能的定量方法。正如你所看到的,AIC 和 RMSE 都戏剧性地拒绝给第二个模型一个稳定的性能。
预测值
关于模型构建过程已经说得够多了,但是本文是关于使用真实世界的数据集进行实际预测的。以下是美国新住宅建设的预测值。
- 当前值(' 000 单位):1248
- 1 年预测(' 000 单位):1310
- 5 年预测(' 000 台):1558
6.结论
如果住宅建设继续保持这一趋势,预计在未来 5 年内将建成 30 万套新住宅。但这需要密切关注,因为 COVID19 冲击的影响可能在未来几个月更加明显。
通过调整参数或找到另一个模型,我可能会得到一个更好的模型,但我想保持简单。事实上,正如谚语所说,所有的模型都是错误的,但有些是有用的。希望这个 AIMA 模型有助于理解一些市场动态。
熊猫数据框中每行应用函数的 12 种方法
来自 Pexels 的 Victor Freitas
编程技巧
如何有效地遍历 Pandas 数据帧中的行,并对每一行应用一个函数。
在数据争论期间,对 Pandas 和数据帧中的所有行应用函数是最常见的操作之一。熊猫 DataFrame [apply](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html)
函数是做这件事最明显的选择。它将一个函数作为参数,并沿着数据帧的轴应用它。然而,它并不总是最好的选择。
在本文中,您将测量 12 个备选方案的性能。有了配套的代码实验室,你可以在你的浏览器中全部尝试。不需要在你的机器上安装任何东西。
问题
最*,我在为一个电子商务应用程序分析用户行为数据。根据用户进行文本和语音搜索的次数,我将每个用户分为四组:
- 没有搜索:根本没有搜索的用户
- 仅文本:仅进行文本搜索的用户
- 仅语音:仅进行语音搜索的用户
- Both: 同时进行文本和语音搜索的用户
这是一个巨大的数据集,根据选择的时间片,有 10 万到 100 万用户。用 Pandas apply
函数计算它非常慢,所以我评估了其他选择。这篇文章是从中提炼出来的经验教训。
我不能分享那个数据集。所以我挑选了另一个类似的问题来展示解决方案:艾森豪威尔方法。
艾森豪威尔方法:根据重要性和紧急程度将任务分成 4 个部分。
根据任务的重要性和紧迫性,艾森豪威尔方法将其分配到 4 个箱中的一个。每个框都有一个关联的操作:
- 重要而紧急的事情:马上做
- 重要但不紧急:安排留待以后
- 不重要但紧急:委派给别人
- 既不重要也不紧急:删除浪费时间。
我们将使用下图所示的布尔矩阵。重要性和紧急性布尔值为每个动作生成二进制整数值:DO(3),SCHEDULE(2),DELEGATE(1),DELETE(0)。
我们将分析将任务映射到某个操作的性能。我们将测量 12 个选项中哪一个花费的时间最少。我们将为多达一百万个任务绘制性能图。
在 Google Colab 或 Kaggle 打开伴侣笔记本正是时候。如果您想查看运行中的代码,可以在阅读时执行代码实验室中的单元格。继续执行设置部分中的所有单元格。
测试数据
Faker 是一个方便的生成数据的库。在代码实验室中,它用于生成包含一百万个任务的数据帧。每个任务都是数据帧中的一行。它由任务名称(str
)、截止日期(datetime.date
)和优先级(str
)组成。优先级可以是以下三个值之一:低、中、高。
生成的数据帧中的前 5 个任务
优化数据帧存储
我们将最小化存储大小,以消除其对任何替代方案的影响。大约 200 万行的数据帧占用 48MB:
**>>>** test_data_set.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2097153 entries, 0 to 2097152
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 task_name object
1 due_date object
2 priority object
dtypes: object(3)
memory usage: 48.0+ MB
代替str
,优先级可以存储为熊猫categorical
类型:
priority_dtype = pd.api.types.CategoricalDtype(
categories=['LOW', 'MEDIUM', 'HIGH'],
ordered=True
)test_data_set['priority'] = test_data_set['priority'].astype(priority_dtype)
现在让我们来看看数据帧的大小:
**>>>** test_data_set.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2097153 entries, 0 to 2097152
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 task_name object
1 due_date object
2 priority category
dtypes: category(1), object(2)
memory usage: 34.0+MB
大小减少到 34MB。
艾森豪威尔行动函数
给定重要性和紧急程度,eisenhower_action
计算 0 到 3 之间的整数值。
def eisenhower_action(is_important: bool, is_urgent: bool) -> int:
return 2 * is_important + is_urgent
在本练习中,我们将假设优先级高的任务是重要的任务。如果截止日期在接下来的两天内,那么任务就是紧急。
通过使用due_date
和priority
列计算任务(即数据帧中的一行)的艾森豪威尔行动:
**>>>** cutoff_date = datetime.date.today() + datetime.timedelta(days=2)**>>>** eisenhower_action(
test_data_set.loc[0].priority == 'HIGH',
test_data_set.loc[0].due_date <= cutoff_date
)2
整数 2 表示需要的动作是调度。
在本文的其余部分,我们将评估将eisenhower_action
函数应用于数据帧行的 12 种备选方案。首先,我们将测量 100k 行样本的时间。然后,我们将测量和绘制多达一百万行的时间。
Pandas DataFrame:对每一行应用一个函数来计算一个新列
方法一。循环遍历数据帧的所有行
在传统的 Python 循环中处理每一行的最简单方法。这显然是最糟糕的方法,任何头脑正常的人都不会这么做。
def loop_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2) result = []
for i in range(len(df)):
row = df.iloc[i]
result.append(
eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date)
) return pd.Series(result)
不出所料,这花费了惊人的时间:56.6 秒。
%timeit data_sample['action_loop'] = loop_impl(data_sample)1 loop, best of 5: 56.6 s per loop
它建立了最坏情况下的性能上限。由于其成本是线性的,即 O(n ),因此它为比较其他替代方案提供了一个很好的基线。
线级剖析
让我们使用 line_profiler 来看看是什么花费了这么长时间,但是对于一个 100 行的小样本:
%lprun -f loop_impl loop_impl(test_data_sample(100))
其输出如下图所示:
用于在 Python 循环中处理 100 行数据帧的行级探查器的输出。
从数据帧中提取一行(第 6 行)需要 90%的时间。这是可以理解的,因为 Pandas DataFrame 的存储是【column-major】:一列中的连续元素按顺序存储在内存中。因此,将一行中的元素放在一起是非常昂贵的。
即使我们从 100k 行的 56.6 秒中去掉 90%的成本,也需要 5.66 秒。这仍然很多。
行为主和列为主的数据存储布局。Pandas Dataframe 使用以列为主的存储,因此获取一行是一项开销很大的操作。图片由作者根据Creative Commons BY-NC-ND 4.0 International许可发布。
方法二。用iterrows
函数遍历行
让我们试试 Pandas [iterrows](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html)
函数,而不是在 Python 循环中处理每一行。
def iterrows_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2) return pd.Series(
eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date)
for index, row in df.iterrows()
)
大约需要 9.04 秒。循环所用时间的四分之一:
%timeit data_sample['action_iterrow'] = iterrows_impl(data_sample)1 loop, best of 5: 9.04 s per loop
方法三。用itertuples
函数遍历行
Pandas 有另一种方法,[itertuples](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html)
,它将行作为元组来处理。
def itertuples_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2) return pd.Series(
eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date)
for row in df.itertuples()
)
它的表现令人惊讶,只用了 211 毫秒。
%timeit data_sample['action_itertuples'] = itertuples_impl(data_sample)1 loops, best of 5: 211 ms per loop
方法四。熊猫apply
作用于每一排
Pandas DataFrame [apply](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html)
功能相当多才多艺,是热门选择。要让它处理这些行,您必须传递axis=1
参数。
def apply_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return df.apply(
lambda row:
eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date),
axis=1
)
这也给了我一个惊喜。用了 1.85 秒。比itertuples
差 10 倍!
%timeit data_sample['action_impl'] = apply_impl(data_sample)1 loop, best of 5: 1.85 s per loop
方法五。Python 列表理解
DataFrame 中的列是一个系列,可用作列表理解表达式中的列表:
[ foo(x) for x in df['x'] ]
如果需要多个列,那么可以用zip
来做一个元组列表。
def list_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return pd.Series([
eisenhower_action(priority == 'HIGH', due_date <= cutoff_date)
for (priority, due_date) in zip(df['priority'], df['due_date'])
])
这也抛出了一个惊喜。只用了 78.4 毫秒,甚至比itertuples
还要好!
%timeit data_sample['action_list'] = list_impl(data_sample)10 loops, best of 5: 78.4 ms per loop
方法六。Python 地图函数
Python 的[map](https://docs.python.org/3/library/functions.html#map)
函数接受函数和可迭代的参数,并产生结果。
**def** map_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
**return** pd.Series(
map(eisenhower_action,
df['priority'] == 'HIGH',
df['due_date'] <= cutoff_date)
)
这比列表理解稍微好一点。
%timeit data_sample['action_map'] = map_impl(data_sample)10 loops, best of 5: 71.5 ms per loop
方法七。…向量化…
熊猫的真正力量体现在矢量化上。但是它需要将函数解包为向量表达式。
def vec_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return (
2*(df['priority'] == 'HIGH') + (df['due_date'] <= cutoff_date))
它提供了最好的性能:只有 20 毫秒。
%timeit data_sample['action_vec'] = vec_impl(data_sample)10 loops, best of 5: 20 ms per loop
根据函数的复杂程度,向量化可能需要很大的努力。有时候,甚至可能不可行。
方法八。NumPy vectorize
功能
Numpy 为通过向量化从 Python 迁移到 NumPy 提供了替代方案。例如,它有一个vectorize()
函数,可以向量化任何标量函数来接受和返回 NumPy 数组。
def np_vec_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return np.vectorize(eisenhower_action)(
df['priority'] == 'HIGH',
df['due_date'] <= cutoff_date
)
毫不奇怪,它的性能仅次于熊猫矢量化:35.7 毫秒。
%timeit data_sample['action_np_vec'] = np_vec_impl(data_sample)10 loops, best of 5: 35.7 ms per loop
方法九。Numba 装饰公司
到目前为止,只使用了熊猫和 NumPy 包。但是如果你愿意接受额外的包依赖,还有更多选择。
Numba 常用于加速应用数学函数。它有各种用于 JIT 编译和矢量化的装饰器。
import numba[@numba](http://twitter.com/numba).vectorize
def eisenhower_action(is_important: bool, is_urgent: bool) -> int:
return 2 * is_important + is_urgentdef numba_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return eisenhower_action(
(df['priority'] == 'HIGH').to_numpy(),
(df['due_date'] <= cutoff_date).to_numpy()
)
它的vectorize
装饰器类似于 NumPy vectorize
函数,但是提供了更好的性能:18.9 毫秒(类似于熊猫矢量化)。但是它也会给出缓存警告。
%timeit data_sample['action_numba'] = numba_impl(data_sample)The slowest run took 11.66 times longer than the fastest. This could mean that an intermediate result is being cached.
1 loop, best of 5: 18.9 ms per loop
方法 10。使用pandarallel
进行多重处理
pandarallel
包使用多个 CPU,并将工作分成多个线程。
from pandarallel import pandarallelpandarallel.initialize()def pandarallel_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return df.parallel_apply(
lambda row: eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date),
axis=1
)
在 2 个 CPU 的机器上,用了 2.27 秒。对于 100k 条记录和 2 个 CPU,拆分和簿记开销似乎没有回报。
%timeit data_sample['action_pandarallel'] = pandarallel_impl(data_sample)1 loop, best of 5: 2.27 s per loop
方法 11。使用 Dask 并行化
Dask 是一个并行计算库,支持扩展 NumPy、Pandas、Scikit-learn 和许多其他 Python 库。它为在多节点集群上处理大量数据提供了高效的基础设施。
import dask.dataframe as dddef dask_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return dd.from_pandas(df, npartitions=CPU_COUNT).apply(
lambda row: eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date),
axis=1,
meta=(int)
).compute()
在 2 个 CPU 的机器上,用了 2.13 秒。像pandarallel
一样,只有在许多机器上处理大量数据时,收益才有意义。
%timeit data_sample['action_dask'] = dask_impl(data_sample)1 loop, best of 5: 2.13 s per loop
方法 12。利用 Swifter 实现机会并行化
Swifter 自动决定哪个更快:使用 Dask 并行处理还是简单的 Pandas 应用。使用起来非常简单:只需一个词就能说明熊猫的功能:df.**swifter**.apply
。
import swifterdef swifter_impl(df):
cutoff_date = datetime.date.today() + datetime.timedelta(days=2)
return df.**swifter**.apply(
lambda row: eisenhower_action(
row.priority == 'HIGH', row.due_date <= cutoff_date),
axis=1
)
它在这个用例中的性能预计非常接*熊猫矢量化。
%timeit data_sample['action_swifter'] = swifter_impl(data_sample)10 loops, best of 5: 22.9 ms per loop+
Pandas 数据帧行的迭代性能比较
绘图有助于理解备选方案相对于输入大小的相对性能。Perfplot 是一个方便的工具。它需要一个设置来生成给定大小的输入和一个要比较的实现列表。
kernels = [
loop_impl,
iterrows_impl,
itertuples_impl,
apply_impl,
list_impl,
vec_impl,
np_vec_impl,
numba_impl,
pandarallel_impl,
dask_impl,
swifter_impl
]labels = [str(k.__name__)[:-5] for k in kernels]perfplot.show(
setup=lambda n: test_data_sample(n),
kernels=kernels,
labels=labels,
n_range=[2**k for k in range(K_MAX)],
xlabel='N',
logx=True,
logy=True,
#equality_check=None
)
它生成如下所示的图。
熊猫数据框应用功能的替代方案。左图:对熊猫数据帧的 100,000 行应用函数所用的时间。右图:在 Pandas 数据框架中,以对数比例绘制多达一百万行。图片由作者根据Creative Commons BY-NC-ND 4.0 International许可发布。
以下是对该地块的一些观察:
- 对于这个用例,渐*性能顺序稳定在数据帧中大约 10k 行。
- 由于图中的所有线条都变得*行,性能差异在双对数标度图中可能不明显。
itertuples
和apply
一样简单易用,但性能却提升了 10 倍。- 列表理解比
itertuples
好 2.5 倍,尽管对于一个复杂的函数来说写起来有些冗长。 - NumPy
vectorize
比 List 理解力强 2 倍,使用起来和itertuples
和apply
函数一样简单。 - Pandas 矢量化比 NumPy
vectorize
要好大约 2 倍。 - 只有在许多机器上处理大量数据时,并行处理的开销才有回报。
高效迭代 Pandas 数据帧行的建议
对所有熊猫行独立执行操作是一种常见的需求。以下是我的建议:
- ****向量化数据帧表达式:尽可能这样做。
- NumPy
**vectorize**
: 它的 API 不是很复杂。它不需要额外的软件包。它提供了几乎最好的性能。如果矢量化数据框架并非不可行,请选择此项。 - ****列表理解:当只需要 2-3 个数据帧列,并且数据帧向量化和 NumPy 向量化由于某种原因不可行时,选择此选项。
- 熊猫
**itertuples**
功能:其 API 类似apply
功能,但性能比apply
高 10 倍。这是最简单、可读性最强的选择。它提供了合理的性能。如果前面三个都不行,就这么做。 - Numba 或 Swift: 使用它来开发并行化而不增加代码复杂性。
了解各种替代方案的成本对于做出明智的选择至关重要。使用timeit
、line_profiler
和perfplot
来测量这些备选方案的性能。*衡性能和易用性,为您的使用案例确定最佳替代方案。
如果你喜欢这个,请:
与此信息图分享:
熊猫 DataFrame apply()函数的 5 个简单快速的替代方法。不需要脂肪库。图片由作者提供,并在Creative Commons BY-NC-ND 4.0 International许可下发布。
原载于ML4Devs.com。**
一个简单的强化学习问题
入门
通过将一次罚球赌注建模为马尔可夫链并使用值迭代,开始强化学习
与麦克斯·奇西克合著
本文假设读者熟悉基本的强化学习(RL)概念。这篇 文章 提供了一个很好的高层次概述。这里的目的是解决一个简单的问题,以便说明 RL 问题是如何设置的,这样您就能够开始编写自己的项目了。
你需要在 100 次罚球中投进 90 次才能赢得赌注。您可以在一年内无限制尝试,并且您需要指定每次尝试的开始时间。你应该如何决定是继续目前的尝试还是重新开始?在成功完成赌注之前,您预计要打多少杆?你的重置策略对这个数字有什么影响?强化学习可以回答这些问题。
根据二项式分布,78%的射手一次尝试成功的概率为 0.14%,这相当于 365 次尝试成功的概率为 40%。让我们假设 78%是你的命中率,因为这给出了赢得或输掉赌注的合理概率(高于 80%几乎保证成功,低于 70%几乎保证失败)。
方法 1:强化学习—马尔可夫链
如果从一个状态转移到下一个状态的概率完全基于当前状态(即先前的状态不影响概率),则随机过程是一个马尔可夫链。这个赌注可以被建模为一个马尔可夫链,以投篮次数和失误次数作为状态。
有 1001 种不同的可能状态(0 到 10 次未命中,0 到 90 次成功)⟹11 * 91 = 1001。因此,赌注可以由 1,001×1,001 矩阵来表示,其中行表示当前状态,列表示未来状态,元素𝑋𝑖𝑗 {∀ 𝑖,𝑗∈[0,1000]}表示从𝑖状态转移到𝑗.状态的概率
首先,让我们假设你一直投篮直到失败或成功(投中 90 篮或错过 11 篮)。然后将矩阵 P 的状态 0 到 1000 定义为[篮子已做,篮子未做]。先列出所有不完整的状态,然后在最后列出代表赢得赌注的状态:
0,1,…,89 = [0,0],[0,1],…,[0,89];
90,91,…,179 = [1,0],[1,1],…,[1,89];
⋮
900,901,…,989 = [10,0],[10,1],…,[10,89];
990,991,…,1000 =[0,90],[1,90],…,[10,90];
概率矩阵 P 的图解(图片由作者提供)
吸收态是一旦进入就不会离开的状态。然后,让矩阵𝑇是矩阵𝑃的子集,只包括跃迁(非吸收)状态。𝑇 = 𝑃₀:₉₉₀,₀:₉₉₀,因为最后十个状态代表成功,所以一旦进入其中一个状态就不会再尝试(这就是我们将最后十个状态设置为成功状态的原因,这样可以很容易地删除它们)。
定义矩阵𝐶,使得每个元素𝑋𝑖𝑗都是在进入一个吸收态之前,在任何时间点从𝑖态到𝑗态的预期跃迁数(即使中间进入了其它态)。可以看出,矩阵𝐶计算如下:
那么第 0 行的总和就是成功所需的预期总发射数。当拍摄到失败或成功时,预期拍摄到成功的次数为 35,418 。当基于二项式分布重置时(如果当前状态比新尝试成功的可能性低,则重置),总拍摄次数减少到 13,262:
使用二项式重置策略射击失败/成功时的预期射击次数
方法 2a:强化学习—值迭代:确定最佳策略 我们能够直接计算重置策略和预期投篮次数,因为我们知道投篮次数是一个二项分布的随机变量。然而,许多强化学习问题的底层分布是未知的,例如预测库存管理问题的客户订单或预测扑克游戏中对手的行动。因此,我们将使用值迭代来计算最优重置策略,以说明如何处理未知分布。
首先,我们定义给定环境中代理可用的状态、动作和奖励:
- 定义每个状态对(投篮命中,投篮未中)的奖励为 0,除了设置状态中的赌注是赢,[90,0],[90,1],…,[90,10]。将获胜州的值设置为 100(任意选择)。
- 每种状态下可能的 2 个动作:继续射击或重置赌注。
然后将每个状态/动作对的初始值设置为 0,并重复迭代每个对,以使用贝尔曼方程求解更新的值估计,直到连续迭代之间的最大差异变得任意小。
V(s)=R(s,a)+γ÷V(s′),其中:
- V(s)是当前状态的值
- R(s,a)是状态 s(射击或重置)下动作 a 的回报
- γ是贴现因子
- v(s′)是下一个状态的值
每个状态都有两个值,一个是继续出手,等于出手后的预期奖励值加上下一个状态的值,每个状态都有一个重置下注的值,这个值简单来说就是等于起始状态的值(因为重置时永远不会有奖励)。国家的价值是这两个价值中最高的。例如,89 时的值 makes,10 次未中(下一次出手的结果不是赢得赌注就是重置赌注)等于:
v[89,10] = max(动作[出手]: 78% * 100 + 22% * 0.98 * v[0,0],动作[重置]: v[0,0]);
= max(动作[拍摄]:78.0047,动作[复位]:0.0217);
=动作【拍】:78.0047。
不出所料,这种状态下的最佳政策是继续当前的尝试。这也证明了状态是如何相互依赖的:v[0,0]依赖于 v[89,10],但是 v[89,10]也依赖于 v[0,0],因此,为什么需要继续迭代计算,直到从一次迭代到下一次迭代的值变化几乎为 0。
值迭代代码:
作者提供的图像:使用值迭代的最佳重置策略(例如,如果第 5 次失误发生在第 30 次拍摄时或之前,则尝试重置)
从马尔可夫链代码来看,这种重置策略总共有 13,026 个预期镜头,与二项式方法相比提高了 1.7%。
方法 2b:模拟——计算预期射击次数
由于分布并不总是已知的,我们还将使用数值迭代确定的最佳策略,通过模拟来计算预期的射击次数。
我们模拟大量尝试,取成功前的*均出手次数来估计期望值。为此,我们生成一个足够大的 0 到 1 之间的均匀随机数列表,低于投篮命中率的值表示投篮命中,高于投篮命中率的值表示投篮不中。然后,我们确定是否达到了代表失败的任何重置阈值。如果没有达到重置阈值,那么至少进行了 90 次罚球,结果是成功的。然后计算每次尝试成功所需的击球次数,并取这些值的*均值。
模拟代码:
上述代码 10 次迭代的*均结果是 13,145 个预期镜头,比上面直接计算的值高 0.9%。
运行模拟还有一个额外的好处,那就是我们可以估计直到成功的射击次数的分布:
1217 次模拟成功尝试的模拟镜头分布(图片由作者提供)
结论
我们能够找到我们问题的封闭形式的解决方案,因为它是一个马尔可夫链。然而,许多强化学习问题更加复杂,需要迭代方法。我们展示了这样一种方法,值迭代,也可以解决这个问题。策略迭代是本文没有涉及的另一种有用的方法。
感谢您的阅读,并祝您好运解决自己的强化学习问题!
补充阅读
- https://www . Dartmouth . edu/~ chance/teaching _ AIDS/books _ articles/probability _ book/chapter 11 . pdf
- https://www . cis . upenn . edu/~ cis 519/fall 2015/lections/14 _ reinforcement learning . pdf
应用向量误差修正模型看商品价格的变化如何推动工业生产
不同商品的影响程度和方向不同!
安特·罗泽茨基在 Unsplash 上的照片
新冠肺炎的爆发给各行各业带来了前所未有的负面影响,制造业首当其冲。2020 年第二季度,美国工业生产指数同比下降 14.4%。工业生产的萎缩可能会对投入资源造成负面需求冲击,进而压低大宗商品价格,尤其是能源和金属价格。
同时,商品价格的变化也会影响供应、生产成本,从而影响生产决策。例如,石油输出国组织(石油输出国组织)、俄国和其他国家在 2020 年 4 月达成的延长石油减产的临时协议旨在在冠状病毒封锁导致需求暴跌后支撑油价。
然而,能源和金属价格之间的关系可能更加复杂,这不仅是因为它们之间的多向联系,还因为存在时滞效应、短期和长期均衡。在本文中,我将尝试应用向量误差修正模型(VECM)(1)调查美国商品价格与工业生产之间的关系(2)预测*期工业生产和商品价格的变动。以下所有代码,请参考我的 Github 链接这里。
数据
时间范围
这项工作将侧重于 1990 年 1 月至 2020 年 7 月期间。
商品价格数据
从世界银行的商品市场网站上,我们可以下载不同商品的月度价格数据。其中,以下是能源、工业金属和贵金属的代表。
能源 —原油(布伦特)、煤炭(南非)、天然气(美国)
工业金属 —铝、铁矿石、铜
贵金属 —铂金、白银
顺便提一下,2019 年,石油和天然气这两种传统能源仍然占美国工业部门总能源使用量的 74.0%,这是自 1950 年有数据以来的最高纪录。相比之下,总共只有 9.5%是由可再生能源贡献的,比 2011 年 10.1%的峰值略有下降。多么可悲的情况!!!
工业生产指数数据
美国工业生产指数的数据可以从美联储银行的网站下载。
根据定义,工业生产指数是一项经济指标,衡量位于美国制造、采矿、电力和天然气公用事业(不包括美国境内的公用事业)的所有设施的实际产出。
向量误差修正模型
介绍
E 经济理论认为,经济变量之间在其水*上存在长期均衡,这可以使这些变量保持*稳而不取差异,这就是所谓的协整。
向量误差修正模型(VECM) 是一种在短期关系(差异)之上捕捉此类长期均衡关系(水*)的方法。关于 VECM 及其与向量自回归(VAR)模型的差异的更详细的解释可以在这里找到。
在应用 VECM 之前,让我们研究一下原始时间序列数据是否是*稳的,这意味着时间序列的方差不依赖于时间。如果时间序列是稳定的,那么绘制的图形看起来就像白噪声。
从下面的非差分时间序列和相关矩阵的线图来看,它们很可能是非*稳的,并且它们之间存在协整关系。
(左)所有选定时间序列的折线图;(右)由于规模差异,不包括铝、铜和铂
所选时间序列之间的相关矩阵
非差异变量的自相关函数(ACF)分析
在继续之前,让我们看一下 9 个非差分时间序列的自相关函数图,它表明它们肯定是非*稳的。
差异变量的自相关函数分析
如果我们在第一次差分后对变量作图,差分变量的 ACF 看起来可能是稳定的。这表明每个时间序列都是综合 I(1)的。增强的 Dickey-Fuller (ADF)测试可以进一步证实这一点。
差分变量的增广 Dickey-Fuller 检验—*稳性检验
无效假设是数据是非*稳的。因此,如果 p 值较低,则数据是*稳的,具有较高的统计显著性。
差异变量的 ADF 检验结果有力地支持了时间序列是 I(1)整体的假设。在建模之前,需要对这些时间序列进行一次差分。
格兰杰因果检验——因果关系的检验
N ext,我们想通过格兰杰因果检验来看看时间序列之间是否存在因果关系。潜在的故事是,如果 X 的先前值可以预测 Y 的未来值,那么 X Granger 导致 Y。通过估计 X 对 Y 的滞后值的回归来执行 f 检验。如果 p 值很小,我们可以拒绝 X 的滞后值的所有系数都是 0 的零假设,即滞后的 X 对未来 Y 具有预测能力
为简单起见,下面只显示美国工业生产指数的测试结果。结果显示,除天然气价格外,所有商品价格都对美国工业生产有预测力。因此,我们在剔除天然气价格后进行 VEC 建模是合适的。
Johansen 协整检验——协整检验
在下一步,我们将通过 Johansen 协整检验来检验时间序列之间是否存在协整(长期)关系。
该检验的结果表明,在滞后 1 和滞后 2 的序列之间分别存在 3 和 2 个协整关系。此外,在 95%的显著性水*上,样本期内第 3、4、5 和 6 个滞后时间序列之间存在 1 个协整关系。因此,我们可以说 VEC 建模适合对这些时间序列数据进行建模。
VECM 评估和分析
负荷系数(alphas)代表时间序列收敛到长期均衡关系的速度。
石油、煤炭、铝和银价格的 alphass 值在 0.05 显著性水*上具有统计显著性,而铜和铂价格的 alpha 值在 0.10 显著性水*上具有显著性。然而,铁矿石价格的 alpha 值在统计上并不显著。
从结果来看,我们知道铁矿石价格对美国工业生产指数的外生作用很弱。弱外生性意味着偏离长期不直接影响弱外生变量。这种效应来自于那些非弱外生变量的后续滞后。换句话说,其他商品价格的滞后是弱外生变量(铁矿石价格)回归长期均衡的驱动力。
贝塔系数是实际的长期关系系数。美国工业生产指数的贝塔系数标准化为 1,以便于解释其他贝塔系数。
其中,白银价格的贝塔系数为-6.0521,这意味着从长期来看,白银价格上涨 1 美元将导致美国工业生产指数下降 6.0521。同样,石油、煤炭和铝的贝塔系数分别为-3.5384、-0.4791 和-0.0793。
相比之下,铁矿石价格的贝塔系数为 1.2618,这意味着从长期来看,铁矿石价格上涨 1 美元将导致美国工业生产指数上涨 1.2618。类似地,铂和铜的贝塔系数分别为 0.1313 和 0.0334。
脉冲响应函数
脉冲响应函数(IRF)显示了一个变量在另一个或同一个变量在前期(月)增加 1 个单位时的响应。蓝色曲线表示单位冲击随时间推移的影响,虚线表示 IRF 的 95%置信区间。在这里,我们试图观察为期 24 个月的脉冲响应。
让我们关注美国工业生产指数的 IRF。
首先,从上图的第一列可以有趣地看到,如果工业生产指数在前一个月经历了 1 个单位增长的冲击,所有商品的价格都会上涨。这一观察结果可以得到需求冲击逻辑的支持。
第二,从上图的第一行我们可以看到石油、铝、铁、铜和银的价格受到一个单位的正冲击会导致工业生产上升,尽管幅度和持续时间不同。背后的基本原理可能是在大宗商品价格上涨的情况下,矿业、电力和天然气公用事业行业提高产量的动力增强。
第三,当煤炭和铂金价格经历一个单位的正向冲击时,会给工业生产指数带来负面影响。这些商品价格的上涨可能会导致制造业的投入成本上升,从而阻碍工业生产。
你可能会注意到,在工业生产指数中可能有两个主导但相互矛盾的因素——制造业和采矿业。大宗商品价格的上涨可能会鼓励采矿和公用事业活动,但会放缓制造业。
如果我们看看其他商品的 IRF,会发现许多有趣的现象。例如,油价每波动一个单位就会对煤炭价格产生负面影响,反之亦然。可以说明替代效应。因此,对每种商品的工业用途以及它们之间的关系进行深入调查可能是值得的。
动态预测
最后但同样重要的是,下面是美国工业生产指数和商品价格未来一年的动态预测图。
事实上,预测与我们的预期惊人地一致。
(一)工业生产短期内难以回升,甚至可能进一步小幅下降。美国经济尚未发出强劲的复苏信号。相对疲软的趋势可能会持续更长时间。
(二)除白银外,所有商品价格将维持在类似水*。需求、供应和地缘政治仍然是影响大宗商品价格的基本面。没有一些具体事件,如 3 月份俄罗斯—沙特阿拉伯石油价格战,大宗商品价格趋于稳定。
(三)目前银价的上涨趋势可能会持续。除了工业用途,在宽松的货币政策下,白银还可以作为价值储存手段。
结论
本文使用了一个流行的计量经济学模型— 向量误差修正模型(VECM) 来帮助我们理解工业生产和不同商品价格之间的短期和长期关系。该模型成功地在数据和现实之间建立了联系。
脉冲响应函数或动态预测显示的结果符合我们的预期和经济原理。我希望这能提高你通过经济计量模型分析和预测经济的兴趣。
谢谢您们。下次见。
参考
- 弗朗兹·x·莫尔。(2019).向量误差修正模型(VECMs)简介。
- 约翰·克莱门茨。(2019).方股票之间的长期关系。
- 纱丽玛依特拉。(2019).使用 VAR & VECM 的时间序列分析:统计方法。
- 塞尔瓦·普拉巴卡兰。(2019).向量自回归(VAR)——Python 中的综合指南及示例。
- 美国能源信息管理局。(2020).月度能源回顾。
- 世界银行集团。(2020).【2020 年 4 月商品市场展望。
如果你对我写的东西感兴趣,不要错过成为 Medium 会员的机会。您将可以完全访问所有…
medium.com](https://medium.com/@hudsonko/membership)
如果你有兴趣了解如何应用因子和聚类分析进行国家分类,你可以看看我下面的另一篇文章。谢了。
让我们更多维度地了解这个世界!!!
towardsdatascience.com](/factor-analysis-cluster-analysis-on-countries-classification-1bdb3d8aa096)
为 OpenAI 的赛车游戏应用深度 Q 网络
摘要。使用 OpenAI 的经典环境 carr acing-v 0(2D 自动驾驶汽车环境)以及基于定制的环境修改,创建了 Deep Q-Network (DQN)来解决经典和定制环境。通过使用 Resnet18 预训练架构和定制的卷积神经网络结构,这些模型用于解决经典和修改的环境。包罗万象,自定义环境不允许自由移动,最终造成灾难性的遗忘,使经典环境更适合训练。此外,预先训练的模型产生了更随机的结果,而定制的 CNN 架构导致了剧集和奖励之间更明确的相关性。因此,通过应用这种定制设计的架构,该模型能够定期超过 350 的奖励计数。
背景
OpenAI 推出的 Gym 是一个人工智能项目的开源银行。这个数据库已经放在一起,供开发人员使用各种人工智能技术,如强化学习和计算机视觉来解决这些环境[5]。针对这些任务的许多用户生成的解决方案都是公开可用的,从而为未来的开发提供了一个基准。这项研究中探索的环境是 CarRacing-v0,这是一个 2D 自动驾驶汽车环境。使用机器学习,一个依赖于大型数据集的人工智能子集[6],一个代理被训练来学习这个轨迹。
这项研究中使用的特定机器学习算法是深度 Q 网络——一种强化学习技术。这项技术建立在 Q-Learning 的基础上,这是一种简单的无模型强化学习算法[8],通过添加神经网络来实现。简单的 Q 学习算法基于先前的状态执行动作,如果先前没有探索过该状态,则该模型将随机动作[8]。神经网络是一种基于先前数据进行估计的工具[7]。因此,通过使用神经网络来估计 Q 值,而不是基于以前的状态和纯粹的随机动作,可以产生更有效的动作[3]。
如前所述,深度 Q 学习算法是 Q 学习的修改变体。这个独特的公式如下所示。
情商。1 深度 Q 网[13]。
使用深度卷积神经网络作为最佳行动的*似工具,可以通过最大奖励总和来描述,在产生各种观察结果并采取适当行动后,根据行为策略,在每个时间间隔对其进行折扣[13]。
情商。2 深 Q-网络的损失函数[13]。
该等式基于状态 s 和正在执行的动作 a 产生 Q 值。因此,这将产生 r(s,a)处的奖励以及来自未来状态 s '的 Q 值最高点。执行经验中继,代理的经验被存储在一个数据集中。在训练时,Q-Learning 应用于已经存储的经验的随机样本(显示在等式 2 中)。在这个等式中,gamma 是调节未来回报的贴现因子。
基本原理和理由
这项研究的目的是探索机器学习在现实世界中的应用。自 20 世纪 80 年代以来,自动驾驶汽车领域的发展得到了广泛的宣传和认可[15]。然而,这些进步并没有真正满足商业和社会需求。通过应用人工智能各个领域的进步,如机器学习、计算机视觉、强化学习和神经网络,可以生产出自动驾驶汽车来改善人类社会[15]。本文使用这些方法,将有助于讨论这一领域的发展。使用正向强化来激励车辆保持在期望的路径上,类似于为自动驾驶汽车开发的内容。
同样,这篇研究论文也有助于进一步探索不同学科和用途的机器学习发展。例如,这项研究的方法和结果可以应用于其他领域,如自然语言处理[18]和计算机游戏的强化学习[19]。
建筑
1.Pytorch 框架
使用动态计算图和渴望执行深度学习(由短语“定义-运行”而不是经典的“定义-运行”定义),在训练模型时增加了显著的价值。然而,实现这种方法的框架是以牺牲性能为代价的(Chainer[16]),而其他框架则导致使用表达性较差的语言,如 Dynet[17],从而限制了它们的应用。然而,通过 Pytorch 库中提供的实现选项和设计选择,可以使用动态执行,而不会牺牲大量的功率或性能[9]。
此外,Pytorch 通过结合使用自动微分和 GPU 加速来执行动态张量的即时执行。此外,Pytorch 在这样做的同时保持了与用于深度学习的领先库相当的性能水*[9]。这是因为这些张量类似于 NumPy 的“ndarrays ”,同时具有通过 GPU 应用的优势。因此,这加快了训练的速度[14]。
2.预训练模型
预训练模型是过去为解决其他类似问题而创建的模型。这些模型的架构是在模型中免费提供的,不需要太多额外的培训。这些包,尤其是 Pytorch 的包,包含了处理不同任务的模型定义。这些包括图像分类、逐像素语义分割、实例分割、对象检测、人物关键点检测和视频分类[12]。
根据定义,使用预先训练的模型被认为是迁移学习。虽然大多数层已经被训练,但是最终的层必须被操纵和整形,以具有与预训练模型的输出相同的输入。此外,在训练时,用户必须通过选择哪些层不被重新训练来优化预训练模型,因为如果所有层都被重新训练,这使得迁移学习的使用有些无用[10]。因此,典型的是整个预训练模型被冻结。
环境
1。经典环境
经典的 CarRacing-v0 环境既简单又直观。在没有任何外部修改的情况下,状态由 96x96 像素组成,从经典的 RGB 环境开始。对于每个帧,奖励等于-0.1,对于访问的每个轨道区块,奖励等于+1000/N,其中 N 由整个轨道中的区块总数表示。要被认为是成功的运行,代理必须始终达到 900 的奖励,这意味着代理在赛道上的最大时间是 1000 帧。此外,赛道外有一个障碍,如果越过,将导致-100 的处罚,并立即结束该集。在外面,赛道由草地组成,草地不会给你带来回报,但由于环境的摩擦,会导致车辆在赛道上的挣扎。总的来说,这个环境是一个经典的 2D 环境,明显比 3D 环境简单,使得 OpenAI 的 CarRacing-v0 简单得多。
图 1:经典 CarRacing-v0 环境的屏幕截图。
2。自定义环境
经典环境的边界迫使代理处于边界的限制之内。因此,一种理论产生了,用延伸的边界代替草地将迫使车辆在赛道上行驶,从而允许更快的学习时间。移除草只留下两个可能的位置,轨道或边界,然而在边界上会立即结束插曲,这意味着所有的州必须在轨道上。相反,在经典环境中,车辆必须花费大量时间学习草地的力学和施加在其上的摩擦力。越过更显著的障碍仍然给代理一个-100 的奖励,并且仍然导致代理在那一集被认为“完成”。
图 2:自定义 CarRacing-v0 环境的屏幕截图。图片作者。
CNN 模型和修改
虽然使用定制架构和预训练模型之间存在差异,但两者都有一些相似之处。两者的学习率为,贴现值等于
1.定制建筑
神经网络中的卷积层非常适合图像识别。由于该环境的图像识别方法,conv2d 层似乎是最合适的。使用 PyTorch 的 Conv2d 设计了一个网络。
- Conv2d(1,6)(内核大小为 4,步长为 4)
- ReLU 激活(真)
- Conv2d(6,24)(内核大小为 4,步长为 1)
- ReLU 激活(真)
- MaxPool2d(内核大小为 2)
- 展*图层
虽然图像最初是在 RGB 状态下识别的,但是每一帧都是使用灰度过滤器直接转换的。因此,输入通道必须从 1 开始。在 Conv2d 层之后,还必须实现线性层。
- 线性(((9 x 9)x 24),1000)
- ReLU 激活(真)
- 线性(1000,256)
- ReLU 激活(真)
- 线性(256,4)
由于线性图层的输入图层的性质,计算必须反映 Conv2d 图层。通过线性激活层发送的图像将是 84 x 84 的裁剪后图像。第一个 conv2d 层的卷积为 4 x 4,没有任何填充,步长为 4,大小降至 21 x 21。第二层的输入将为 21 x 21,并将再次应用 4 x 4 卷积,这次步长为 1,大小降至 18 x 18。最后,还有一个 MaxPool2d 层,内核大小为 2,因此总大小等于 9 x 9。这个数字乘以 24,即 conv2d 层的输出,产生线性激活的输入。
2.Resnet18 预训练模型
自发布以来,Resnet 已经成为迁移学习领域中最常见的预训练模型之一,因为它具有准确的结果和表示,特别是对于基于计算机视觉的任务。Resnet18 来自 Resnet 预训练模型系列,是具有 18 层的变体,输出 512 个通道。使用未经训练的 CNN,通常会大大减慢训练过程。该模型可简化如下:
- Resnet18 (18 层)(冻结)
- 线性(512,256)
- ReLU(真)
- 线性(256,4)
下图显示了解释的模型。512 的输入层是从 Resnet18 预训练模型接收的,添加的隐藏层的大小为 256,最终输出层的长度为 4。
3.用户化
许多 dqn 的方法是相同的,尤其是对于网络。然而,对待代理人和国家的方式各不相同。采用的许多策略有效地改进了训练时间,但是影响因方法而异。有些方法之前已经解释过了,有些没有。
- 裁剪:84 x 84 框架形状
需要图像的许多部分。但是,不需要底部。事实上,它会扰乱图像识别过程,因为黑色尤其可能被识别为地图的边界。因此,裁剪底部是优化模型所必需的。此外,固定图像的大小也有助于稳定模型。因此,边缘也从 PIL 图像中被裁剪掉,从左边 6 个像素到右边 6 个像素。
- 灰度:3 个通道到 1 个通道
将颜色(RGB)用于计算机视觉任务通常会使模型变得复杂,并引入更多通道。与普通 RGB 图像相比,使用一个通道而不是三个通道可以使模型的灰度级提高大约三倍。很多时候,使用颜色并没有增加任何好处,尤其是对于像 CarRacing-v0 这样简单的模型,其中图像识别部分没有实际学习侧那么重,尤其是因为环境不是 3D 的,而是保持了 2D 方法。
- 图像均衡:均衡图像
对于 PIL 图像,有一个函数将非线性映射应用于输入图像,以便在输出图像中创建灰度值的均匀分布。用于均衡“图像直方图”这种方法用于增加图像的对比度,由于使用了灰度图像,这是一个重要的步骤。
- ε波动:调整ε
培训需要 Epsilon,因为它允许模型进行必要的探索。然而,很多时候,应用的ε是不够的。因此,更多的ε和随机化是必要的。为了纠正这一点,自动调节ε而不是手动调节似乎是最好的办法。这个过程很简单;如果最后的 50 集比之前的 50 集有更好的改善,那么模型应该将ε减小 0.025。如果没有,模型应该改为添加 0.05,因为似乎需要更多的训练来完善模型。ε在其最大值时被设置为 1.0;在这一点上,所有的行动都是随机的。渐渐地,基于ε衰变,它会减少。
- 奖励修改:调整奖励
很明显,由于各种原因,在这种环境下分配的奖励不恰当。对通过边界的惩罚给出了比需要的更大的惩罚,导致代理由于大的奖励惩罚而限制其移动,阻止探索和尝试追踪。因此,奖励不得不从-100 修改为 0,以允许更好的训练,同时惩罚代理人在草地上停留每一步-0.05。奖励修改已针对自定义环境进行了测试。然而,由于灾难性遗忘的重要性,这对训练没有影响。
结果和评估
1.理论:灾难性遗忘
灾难性遗忘是模型可能经历的可怕循环之一,尤其是在使用神经网络时。灾难性遗忘,或有时被称为灾难性干扰,发生在训练一个新的任务或任务类别时,神经网络可能会忘记过去的信息来代替现在的信息[2]。对于定制环境,死亡率高得令人难以置信,这意味着代理在接受培训时几乎会立即死亡。然而,对于其他环境,如 CartPole,这不是什么大问题,但对于有些复杂的环境,如 CarRacing,这就产生了更大的问题。虽然对于大多数传统的 CarRacing-v0 环境来说,这个问题并不突出,但灾难性遗忘似乎正在整个定制的 CarRacing-v0 环境中大规模发生。
汽车,代理人,似乎死得太快,学习新的信息,并逐渐忘记它学习的一切,而是学习保持静止,试图防止超越边界,因为这种行动的反响产生了沉重的奖励惩罚,这是模型试图防止的。
转到经典模型,最初出现了相同的结果。代理人将了解到屏障将产生一个“死亡”状态,使代理人“学会”在一个圆圈中旋转,以试图防止任何死亡和巨额罚款。代理也将忘记它过去在赛道上的经历来做这个序列。这似乎是其他人试图解决环境的常见问题,但允许更多的剧集进行训练和探索,同时调整奖励惩罚,允许模型意识到赛道是目标路线。
然而,改变定制环境的奖励并没有增加变化,更多的训练和探索也没有。对于定制环境,代理人无论如何都会遭受灾难性遗忘的悲剧。
2.比较模型
在显示所示图表之前,前两个图表在最大ε为 1 的情况下被训练,而没有衰减 500 集。然后,根据显示的结果生成这些图表。
当使用预先训练的模型时,它似乎不如完全定制的架构训练得快。为了解决这个问题,冷冻层被解冻以重新训练,这在某种程度上消除了预先训练模型的目的。下面显示了在许多集的课程中使用迁移学习的结果,标题是“迁移学习探索”看起来在图表和它的学习曲线中有大量的波动。每集的奖励似乎是下降,然后上升,再上升。然而,如果不考虑异常值,仍然有轻微的上升趋势。
图表 1:使用来自 Resnet18 的预训练模型。
另一种方法使用定制的架构,产生了类似的结果,但结果的变化更加*缓,如下图所示,标题为“CNN- Stable Exploration”,再次将情节与奖励进行了比较。每集的奖励会逐渐增加,但并没有预期的那么快。该模型的奖励计数在 112 的值达到峰值。
图表 2:具有稳定ε的定制 CNN。
通过为初始训练过程分配更多的剧集,训练过程被加速。不是 500 集训练,而是 1000 集。ε衰减也增加了 15%,以允许更随机的初始探索。结果显示在下图中,带有经典的标题“CNN”看到的变化比其他图表更直接,表明学习的速度更快。此外,该模型在高于 125 的奖励计数处达到峰值,这比图 2 中的略低。然而,图 3 的峰值出现的时间比图 2 的峰值快大约 400 次。
图表 3:ε衰减较少的自定义 CNN。
最后一个图表,图表 4:CNN——更多的ε,有最好的结果。初始训练集比只有 500 个训练集的初始图表大五倍。不仅有 2500 个训练集,而且初始 epsilon 分配从 1.0 增加到 1.5。因此,允许更多的培训和学习,这可以从下图中看出。根据图表 4,奖励计数多次超过 350 的值。
图 4:更多训练和更多 epsilon 的定制 CNN。图片作者。
正如演示的那样,预训练模型似乎每集都有更随机的奖励流,同时似乎在开始时比定制模型训练得更快。然而,可以看出,与使用预训练模型的模型相比,应用定制 CNN 的模型逐渐增加每集的奖励,并导致更高的奖励峰值。
这些假设在许多测试中保持一致,上面给出的图表似乎不是这个假设的异常值。然而,无论使用哪种模式,它们都没有获得足够的奖励来被认为是成功的,因为没有一集汽车的总奖励是 900,更不用说连续 100 集了。
讨论研究和未来展望
1.双 dqn(双学习)
虽然 dqn 对许多环境都很有用,但一种称为双 dqn 的 dqn 变体——在双学习下——通常更好、更有效。与双 dqn 相比,dqn 往往更乐观,双 dqn 往往对选择的行动更怀疑,计算采取该行动的目标 Q 值[11]。总的来说,双 dqn 有助于减少对 Q 值的高估,使训练更快,学习更稳定[11]。由于该信息,可以理解,与所应用的经典 DQN 相比,使用双重学习对于该环境将会更加有效和有益。
2.Google Colab GPU(训练时间)
训练时间是深度学习的一个重要部分,因为学习需要大量时间来学习模型所应用的任何过程。在许多情况下,GPU 是必不可少的,因为它们可以成倍地提高训练速度,从而更快地训练模型,分配额外的训练时间来完善模型,并调整额外的变化。
将 Google Colab 用于可访问的云 GPU 允许更快的训练,然而,云程序对于需要渲染的环境来说不是很好。对于 CarRacing-v0 环境,在一集之后使用经典的“env.render()”是不可能的。在花了相当长的时间尝试在 Google Colab 上配置环境后,最好的结果是在运行代码后通过创建一个允许“show_video()”的函数来渲染最后一集。然而,这并不实际,因为它不允许我检查每一次迭代和每一集,并能够仔细分析发生了什么。
3.环境缺陷
虽然 OpenAI 有很多公众可以轻松访问的开源环境,如 CarRacing-v0,但在环境开发中并不完全出色。底部信息的相当不合标准的放置会妨碍代理的性能。应用在赛道上的糟糕的物理学迫使车辆原地打转。奖励分数和其他缺陷一起破坏了环境的整体结构,使代理的训练变得很有挑战性。
4.更多探索(艾司隆)
对于 Q 学习算法的任何变体,探索是学习如何发生的。允许更多的ε允许模型了解更多关于环境的信息以及如何解决环境问题。真的,理论上,更多的训练和更多的探索应该能够推动任何模型学习一个足以解决它的环境。
5.参考他人的作品
这个项目适用于“开放的健身房环境”社区的一个利基部分。如前所述,在这样的项目中使用 DQN 从任何角度来看都不是最佳的做法。然而,其他论文已经尝试使用这种方法,取得了不同程度的成功。例如,两名斯坦福大学研究人员在 2018 年 12 月发表的一篇论文试图将 dqn 用于相同的环境。这篇论文名为“简单赛车游戏的强化学习”,由 Pablo Aldape 和 Samuel Sowell 撰写。
Aldape 和 Sowell 在他们的项目中没有裁剪图像,而是将其留在经典的 96 x 96,节点大小为 9216。然而,他们随后提到,他们没有灰度化,甚至没有保留 RGB 颜色,而是每个节点都接受其各自像素的绿色通道[1]。这似乎是一种复杂的颜色操作方式,而正常的重新缩放可能更容易也更有效。此外,应该更好地利用作物,因为仪表栏上的颜色污染了环境的绿色屏幕,84 x 84 的作物可以消除它。
然而,他们的项目和这个项目也有一些相似之处。例如,分享了使用预培训模型作为一种培训形式。此外,两个模型都没有超过 900 的奖励阈值,因为两者都没有计算能力或时间来完全解决环境问题。
没有使用 DQN 解决 CarRacing-v0 环境的好例子。因此,下一篇与这种环境最接*的论文是一位法国博士生写的。在论文中,作者 Dancette 使用了卷积神经网络,并在结论中详细描述了该模型是如何训练的。Dancette 声称,该网络可以识别形状,以使汽车保持在所需的路径上[4],这比尝试 DQN 对这种环境更有用,因为这种环境最重要的部分是识别轨道并保持在其边界内。
这三个模型都收敛到不同的最大奖励计数,并能够在一个数字表中表示。可以看出,虽然这个 DQN 优于 Sowell 和 Aldape,但 Dancette 的神经网络模型明显更有效和实用。
这款 DQN 型号:300–350
索维尔和阿尔达普的 DQN 模型[1]:150–200
丹塞特的神经网络模型[4]:450–500
6.未来展望
对于这种环境,使用其他技术可能是有益的,例如,双 dqn 或*似策略优化(PPO)。如果 DQNs 再次用于这种环境,将需要更多的 epsilon、情节和训练,然而,这将比使用其他更可靠的技术更不实际。如果要再次使用 dqn,它们应该更好地应用于更短、更可预测的不同自动驾驶汽车环境。此外,这些不同的强化学习技术应该在更高级的 3D 环境中使用。与其他模拟的自动驾驶汽车环境相比,CarRacing-v0 相当简单。通过在几个 3D 车辆环境中训练使用深度学习算法(如神经网络和策略梯度)的各种模型,可以在自动驾驶汽车方面取得进展。
参考文献
[1]阿尔达佩,p .,&索维尔,S. (2018 年 12 月 18 日)。一个简单赛车游戏的强化学习。2020 年 9 月 14 日检索,来自https://web . Stanford . edu/class/aa 228/reports/2018/final 150 . pdf/
[2]《终身机器学习,第二版》终身机器学习,第二版|人工智能与机器学习综合讲座,www . morganclaypool . com/doi/10.2200/s 00832 ed 1 v01y 201802 aim 037。
[3] Mnih,v .、Kavukcuoglu,k .、Silver,d .、Graves,a .、Antonoglou,I .、Wierstra,d .、& Riedmiller,M. (2013 年 12 月 19 日)。用深度强化学习玩雅达利。ArXiv.Org。https://arxiv.org/abs/1312.5602
[4]丹塞特,C. (2018 年 04 月 09 日)。[Tutoriel]2020 年 9 月 10 日从https://cdancette.fr/2018/04/09/self-driving-CNN/检索到的
[5] Gym:开发和比较强化学习算法的工具包。(未注明)。OpenAI。检索于 2021 年 1 月 20 日,来自https://gym.openai.com/
[6]西蒙·奥(2018)。简单介绍机器学习及其在通信系统中的应用。IEEE 认知通信和网络汇刊,4(4),648–664。https://doi.org/10.1109/tccn.2018.2881442
[7] Krose,b .,Krose,B. J. A .,Smagt,P. V .,> Smagt,P. (1993 年)。神经网络导论。计算机科学杂志,1–135 页。https://www . researchgate . net/publication/272832321 _ An _ introduction _ to _ neural _ networks
[8]Fran ois-Lavet,v .,Henderson,p .,Islam,r .,Bellemare,M. G .,& Pineau,J. (2018 年)。深度强化学习导论。机器学习的基础和趋势,11(3–4),219–354。https://doi.org/10.1561/2200000071
[9] Paszke,a .,Gross,s .,Massa,f .,Lerer,a .,Bradbury,j .,Chanan,g .,Killeen,t .,Lin,z .,Gimelshein,n .,Antiga,l .,Desmaison,a .,KPF,a .,Yang,e .,DeVito,z .,Raison,m .,Tejani,a .,Chilamkurthy,s .,Steiner,b .,Fang,l .,l .,Chintala,S. (2019 年 12 月 3 日)。PyTorch:命令式的高性能深度学习库。ArXiv.Org。【https://arxiv.org/abs/1912.01703
[10]微调火炬视觉模型。(未注明)。检索于 2020 年 9 月 14 日,来自https://py torch . org/tutorials/beginner/fine tuning _ torch vision _ models _ tutorial . html
[11] Hasselt,V. H .,Guez,a .,& Silver,D. (2015 年 9 月 22 日)。双 Q 学习的深度强化学习。ArXiv.Org。https://arxiv.org/abs/1509.06461
[12]火炬视觉模型。(未注明)。检索于 2020 年 9 月 14 日,来自https://pytorch.org/docs/stable/torchvision/models.html
[13] Mnih,v .、Kavukcuoglu,k .、Silver,d .、Veness,j .、Bellemare,M. G .、Graves,a .、Riedmiller,m .、Fidjeland,A. K .、Ostrovski,g .、Petersen,s .、Beattie,c .、Sadik,a .、Antonoglou,I .、King,h .、Kumaran,d .、Wierstra,d .、Legg,s .、& Hassabis,D. (2015 年)。通过深度强化学习实现人类水*的控制。自然,518(7540),529–533。https://doi.org/10.1038/nature14236
【14】py torch 是什么?。(未注明)。检索于 2020 年 9 月 14 日,来自https://py torch . org/tutorials/beginner/blitz/tensor _ tutorial . html
[15] Janai,j .,Güney,f .,Behl,a .,& Geiger,A. (2017 年 4 月 18 日)。自动驾驶汽车的计算机视觉:问题、数据集和技术状态,ArXiv.Org。https://arxiv.org/abs/1704.05519
[16]星矢·托奎、肯塔·乌诺、绍黑·希多和贾斯汀·克莱顿。Chainer:深度学习的下一代开源框架。《2015 年第二十九届神经信息处理系统(NIPS)年会机器学习系统(LearningSys)研讨会论文集》。
[17]纽比格、戴尔、戈德堡、马修斯、阿马尔、阿纳斯塔西索普洛斯、巴列斯特罗斯、蒋、克洛索、科恩、杜、法鲁基、甘、加莱特、纪、孔、昆科罗、库马尔、马拉维亚、米歇尔、小田滋、理查森、萨福拉、斯瓦亚姆 DyNet:动态神经网络工具包。ArXiv 电子版,2017 年 1 月。
[18]k . Narasimhan、t . Kulkarni 和 r . Barzilay(2015 年 6 月 30 日)。使用深度强化学习的文本游戏语言理解。ArXiv.Org。https://arxiv.org/abs/1506.08941
[19]林,张,李,林,杨振宁.(2019).使用基于强化 Q 学习的深度神经网络玩视频游戏。电子学,8(10),1128。【https://doi.org/10.3390/electronics8101128
将人工智能应用于商业,去神秘化
如何将你的人工智能项目分解成容易理解的、有经济意义的部分
图片来源:pexels.com
人工智能和数据科学领域一直在经历一个极端的炒作周期。这项技术有着巨大的前景,但所有嘈杂的宣传都使筛选出价值实际在哪里,以及如何利用已经容易获得和访问的现有人工智能组件变得令人生畏或令人生畏。
虽然每个人都在谈论人工智能是商业和人们生活的下一次飞跃,但对于大多数各级商业领袖来说,自然的情感问题如下:
- 我的组织如何确保我们不会错过一些持续加速的重要事情?
- 我如何才能拥抱这些新技术,让它们给我的公司带来高价值的影响,同时又不会在这个过程中冒太多金钱或其他宝贵资源和精力的风险?
在这篇文章中,我试图通过分离炒作的情绪来勾勒出一个在人工智能和数据科学中取得成功的真正战略。我将尝试用一个简单易懂的方法来展示一个成功的人工智能或数据科学项目的研发过程。它将基于从许多项目中吸取的艰难教训。
1.澄清大术语:人工智能、数据科学、机器学习、大数据……还是什么?
在开始商业案例驱动的研发过程之前,我将试着澄清一下“大术语”,这样我们就都在同一页上了。围绕着他们每个人都有很多议论,但是不要让你自己被这些所吓倒或冲昏头脑。尤其是因为这些对不同的人来说意味着不同的东西,因为大肆宣传和过度使用。
人工智能
你可能已经注意到我在上面交替使用了术语 AI(人工智能)和数据科学。我故意这样做的。当谈到数据科学应用时,人工智能作为一个术语似乎出现在许多炒作中,它是一个注意力抓取器,它有一种冷静,让我们感觉我们生活在科幻世界的边缘。但从技术上来说,“AI”是一个相当模糊的术语,没有明确的界限,是一种让机器看起来和行为(有点)智能的每个学科的总称。
数据科学
这个名词是家里最小的。它指的是任何涉及数据分析和算法的东西,尤其是它们背后的科学:大数据分析/数据挖掘、机器学习、统计学、数学、信息和计算机科学。
那是 AI 还是 DS?
从现在开始,在这篇文章中,我将更多地使用“数据科学”这个术语,以达到“综合”的目的。
某个智者(我不记得具体是谁了)曾经说过,只要有东西被称为 AI,我们就在和“科幻小说”打交道。但一旦它在现实生活中实现,它就变成了一门“计算机科学”,而不再是人工智能了。这可能解释了为什么人工智能似乎总是关于未来,而不是过去或现在,尽管我们在日常生活中已经使用的许多东西在十年前肯定会被认为是科幻小说中的东西。
可能出于同样的原因,我个人在和朋友开玩笑、谈论人工智能奇点或处于“推销员模式”时会使用人工智能这个术语😉试图引起注意。当我在家做黑客、做实验、学习、参加 Kaggle 比赛,或者与团队讨论项目和策略时,我会谈论并查找数据科学。
这也适用于命名团队——最有可能的是,你会有一个数据科学团队为你的任何人工智能或数据科学商业机会工作。这样的团队将由数据科学家(能够处理数据探索、研究和商业机会验证的科学方面的数据科学博士)和数据工程师组成,他们知道如何处理大数据框架,如何将研究成果实施到运营环境中,等等。
机器学习
机器学习听起来几乎像人工智能,但在数据科学社区中,它是一个更具体的技术术语,指的是人工智能中专注于机器智能的学习部分的特定组件或过程。有许多机器学习算法,如(深度)神经网络、决策树、贝叶斯等,以及这些算法可以应用的应用领域或数据。数据可以是任何东西,从交易数据到图像、视频、音频和振动模式分析,甚至是音乐、自然语言处理(NLP)、用于预测性维护用例的感官诊断数据等。本质上,这些算法都是基于某种统计程序。
大数据
该术语实质上是指任何存在的数据量太大,以至于无法通过单台计算机中的“传统”数据处理工具进行处理或分析,这反过来需要特定的方法来解决与处理大量数据相关的问题。例如,重负载问题可能来自所需数据存储的大小(要求分布式存储和检索系统),或者来自*乎实时地处理信息的需要(要求机器学习方法),等等。
其他条款
显然,在研究这个主题时,您可能会遇到很多更密切相关的术语,包括数据挖掘、大数据分析、商业智能(BI)等,但为了简洁起见,我将把自己限制在今天装饰炒作场景的几个最大胆的术语上。
2。制定数据科学战略——先决条件理解
建立数据科学战略始于理解其基本前景、适用性和局限性。
2.1 商业数据科学的基本前景
就商业而言,数据科学的用处有两个主要原因。它帮助您寻找新的收入来源,并帮助您避免因效率低下、欺诈或人为错误而损失金钱,它通过查看您的数据并对其应用数据分析和机器学习技巧来实现这一点。
举个例子。早在 2005 年,我就曾在 Skype 早期担任后端开发人员。当 Skype 推出其第一项高级功能 SkypeOut calls 并大幅提升其收入时,它也开始因信用卡欺诈退款请求和罚款而损失约 10%的收入,并受到支付提供商的威胁,如果我们不找到减少欺诈的方法,就将被关闭。最初,我们开发了不同种类的硬编码欺诈检查,以阻止最明显的欺诈模式,但这是一场与风车的斗争——欺诈者擅长调整他们的行为,以至于在程序部署后几天,人工分析和硬编码的欺诈模式检查就变得无关紧要了。在某个时候,我开始开发一个基于朴素贝叶斯的机器学习管道,并最终成功地实时检测到 90%的欺诈交易,假阳性率保持在 0.1%以下。此外,它能够*乎实时地学习新的欺诈模式,即使欺诈形式不断演变,也能保持效率。
2.2 AI 在商业中的适用性
数据科学的好处在于,它的主要实现策略形式与您应用它们的领域无关。无论哪里有数据堆积或流动,都很有可能隐藏着巨大的积极影响的未开发机会。
顶尖的数据科学团队通常能够以相同的方式处理任何类型的数据,无论是处理交易、图像、视频、音频、振动、自然语言文本处理等。基于这些数据的具有重大商业价值的应用可以包括信用评分、欺诈检测、客户终身价值预测、图像识别、预测性维护、自然语言处理(NLP)聊天机器人、入侵检测(网络安全)、转换和流失预测等等。
2.3 AI 在商业中的局限性
到目前为止,它看起来就像一个普通的软件项目,对吗?只是加入了一些人工智能带来的酷感,就这样?错了!
这就是数据科学项目与普通软件项目的显著区别,如果你不注意它的局限性,它会变得非常混乱,几乎肯定是你浪费时间和金钱的项目;另一方面,如果你充分考虑到这种差异,它会对你的业务战略做出非常可控的成功贡献。
数据科学项目和普通软件项目之间的显著区别在于它的主要局限性:
1。概率的本质。在商业用例的背景下,机器学习算法通过概率而不是确定来工作。当考虑到它的答案时,你总是会有准确性的问题。请记住上面的欺诈检测示例 —总会有一定数量的“假阴性”和“假阳性”结果,但是检测到 90%的欺诈(这意味着避免了 9%的收入损失)仍然会使公司处于一个明显更好的境地,消除了支付提供商停止服务的风险,避免了重大损失,并且为了更大的利益,使欺诈者的日子更难过—即使代价是损失不到 0.1%的合法交易。
如果你的商业案例对“错误”答案零容忍,你就不能应用这些方法。然而,如果您的业务案例能够“足够好”地准确工作,那么它就变成了实现“足够好”结果的问题。
例如,在自动驾驶汽车的一个非常极端的情况下,当你有级联的人工智能组件在发挥作用时,人们可能会问,在那里出现错误是怎么回事!?答案是,在系统的传感实时数据分析中可能会有“错误”(用机器学习的术语来说),但结合某些鲁棒性原则的应用,这些错误可以缩小到单个组件,这些原则要求永远不要依赖单个数据源或传感器,这样这些错误就不会对任何人的财产或健康造成危险。
2。做能力的问题。数据科学的概率性质引出了另一个重要的问题:即使你的业务案例能够在行动过程中接受一些“错误”的答案,那么“足够好”的准确性水*到底能不能达到?你可以开发完整的框架软件,将你的机器学习算法无缝集成到你的操作环境中,它可以扩展等,但如果 ML 算法真的无法准确地做出对你的商业案例有意义的决策,那么围绕它的所有产品开发都将是浪费,甚至是适得其反。
这是数据科学项目的一个不变的现实——必要的准确性并不总是可以达到的(至少第一次尝试是不行的)。
3.该过程
列出了上面的注意事项后,接下来的事情实际上非常简单明了。
图片来源:【mooncascade.com
第一步:提出“问题”
任何数据科学项目的核心都是你希望你的系统回答的既定问题。当你考虑你的第一个(或下一个)人工智能应用时,确保你确切地知道你将回答什么问题,并确定它与你的业务影响有明确的联系。
问题示例:
- 问题:我们能否预测保险申请中的欺诈行为?我们能否实时适应欺诈模式的变化?影响:避免因诈骗而亏钱。
- 问题:能否检测危险品(放射性物质、武器部件等。)根据对相关文件、物流信息以及海港和机场货物的 x 光扫描结果的分析而被走私?影响:更安全的居住社区。
- 问题:我们能否在系统实际崩溃之前预测机械故障?(这被称为预测性维护问题,例如,可以通过收听连接到机器主体的音频传感器并分析振动模式的变化来回答。)影响:避免机械故障和收入损失,甚至可能由此产生的损坏成本。
第二步:确定“足够好”的准确度对你来说意味着什么
一旦你确定了项目的问题,但在开始投入资金、时间和其他资源进行繁重的开发工作之前,重要的是要确定你必须如何回答这个问题,才能让你的商业案例有意义。换句话说,您需要为您的系统量化某种在业务案例中有意义的关键性能指标(KPI)目标。
举个例子。在欺诈检测的情况下,当触发欺诈检测时,您希望在实施自动交易阻止的同时确保可接受的误报率。KPI 目标可以是,例如,对于每 10%的检测到的实际欺诈,0.01%的误报是可以接受的,这样自动交易阻止才有意义。这在实践中为数据科学家提供了强有力的指导,他们可能会很容易地隔离相当大一部分欺诈,然后,对于确定性不再那么好的另一部分,可以应用一些其他措施(而不是简单的自动阻止)。
第三步:数据探索、研究和影响验证
直到流程的这一步,除了识别问题和建立有意义的 KPI 目标的一些基本工作之外,您几乎没有花费任何资源。
现在关键的问题是:这真的能做到吗?您的问题能否以超过最低 KPI 阈值的质量水*得到回答?这是业务影响验证步骤。它的目的是识别所有相关的数据源,探索、操作、重组和整理数据,建立机器学习模型等。这将会产生影响。这一步的结果包括培训、测试和验证数据集,允许您在实际的软件产品开发开始之前,就可以明确地确认产品的可行性。
通过使用术语“可论证地”,我指的是根据科学标准和质量的过程的可重复性——记住,我们正在与工作中的数据科学家(通常是博士级)打交道,重点是“科学家”这个词。科学方法的关键品质之一是可重复性。这意味着,从技术上来说,您的研究和数据探索的结果包括所有确切的步骤、脚本和数据字典,这些数据字典准确地显示了数据是如何获得、转换并划分为训练、测试和验证数据集、机器学习模型和演示说明的。
可以想象,这是需要投入一些初始资源的第一步,因为研究和数据探索是需要由有专门技能的人来完成的工作。尽管如此,与接下来的产品开发项目相比,这通常是相当精简和吝啬的。这里的想法是,只要项目的可行性仍然悬而未决,就要避免投资于产品开发。只有在研究证实了影响后,投资产品开发才有意义。你需要愿意冒险投资这些验证周期,对你的基金应用合理的资金管理方法和每个项目的止损决策策略。但是,除非你喜欢混乱的公司过山车,否则你不应该在数据推测中验证你的业务影响之前,冒险投资于产品开发。
当研究未能验证最初冲刺阶段的推测影响时,可能有几个原因:
- 你正在处理的数据可能太肤浅,或者缺乏容易发现和有意义的应用信号。在这种情况下,你还没有开始在产品开发上花费资源,这很好,你可以开始寻找其他想法来产生影响。
- 也可能是相关信号在您的数据中很明显,但它拒绝越过允许您验证业务案例的预期 KPI 目标阈值。在这种情况下,您可以与您的数据科学团队讨论构建更多您尚不具备的数据功能的可能性。这可能意味着需要几个月的时间让您现有的产品,即生成相关数据的产品,收集和存储额外需要的数据,之后您可以再次尝试您的研究,看看有问题的 KPI 目标是否可以实现。
第四步:产品开发
一旦您在步骤 3 中的研究成功,围绕结果开发适当的数据产品,使其无缝集成到您的运营环境中,扩展并使您能够创造真正的影响。
这个阶段看起来更像是常规的软件产品开发。在这里,你可以应用同样的原则,从构思和设计冲刺(如果涉及 UI 交互)开始,来验证目标用户是否会抓住新产品并接受这个想法。然后,您将开发您的第一个 MVP (最小可行产品)来进一步验证您是否在正确的轨道上,但这一次有来自现场的确凿证据,并迭代地继续开发您的产品并增加对您的业务案例的影响。
只要产品保持相关性,你通常总会有需要改进的地方。除了产品的常规软件开发部分之外,您还将继续监控产品的数据科学部分的性能,偶尔会重新审视研究周期,以排查数据源中的变化或加强/优化结果的影响。
4.大局
希望上面的流程布局能给你一些启发,告诉你如何开始将数据科学引入你的公司。在现实生活中,正如成功的产品一样,将会有更多连续的嵌套开发周期一个接一个地进行,并且您将应用于实现它们的原则将会随着您对该主题的学习和熟悉而发展。然而,一个蓬勃发展的数据科学项目的本质仍然是一样的:成功的数据科学产品是研究优先项目的产品,成功的数据科学产品管道战略是基于这样的项目。
成功的主要驱动力基本上是在整个过程中保持这两个原则,在任何步骤中都不要忘记:
- 确保你总是知道你想要的影响会是什么。确保你所做的事情确实意义重大,具有积极的影响。这是任何事物在商业环境中生存的基本规则——不仅仅是数据科学。
- 尽早并尽可能经常地验证关键假设。在处理数据科学项目时,验证回答既定问题所需的准确性在经济意义上的影响级别上是可以实现的。
5.从这里去哪里?
如果你是一个成功的企业家,你可能已经知道,大多数大事都是从无数的实验中开始的。在数据科学领域也是如此。以下是识别数据科学机会的一些提示。
无论你在哪个领域工作,保持头脑风暴的习惯来寻找新的、令人兴奋的想法通常是一个好主意。因此,定期花一些时间思考你的业务以及你投入的工作,记住好的产品创意可以从最痛苦的问题中产生。
顾名思义,最适合用数据科学方法解决的问题是那些可以用科学严谨性分析数据的问题。如上所述,所讨论的数据可以是任何东西:交易、图像、音频信号、自然语言文本、视频剪辑、温度波动、其他环境传感数据等等。
当遇到一个潜在有趣(有影响力)的想法时,开始考虑量化它的影响(记住 KPI 目标),你有哪些类型的数据可以分析,以及你可以验证你的推测的方法。
将自动编码器异常检测应用于欺诈检测
信用卡欺诈可以归类为异常,使用 Keras 中实现的自动编码器可以检测欺诈
https://unsplash.com/photos/TFqKR4Ynjm8
我最*读了一篇名为用自动编码器进行异常检测的文章。这篇文章是基于生成的数据,因此将这个想法应用到现实世界的欺诈检测任务并验证它听起来是个好主意。
我决定使用来自 Kaggle *的信用卡欺诈数据集:
该数据集包含欧洲持卡人在 2013 年 9 月的信用卡交易。
该数据集显示了两天内发生的交易,其中 284,807 笔交易中有 492 笔欺诈。数据集高度不*衡,正类(欺诈)占所有交易的 0.172%。
这是一个非常不*衡的数据集,是通过异常识别欺诈的良好候选对象。
让我们从数据发现开始:
在使用主成分分析将维度从 30 减少到 3 后,我们将绘制一个更小的图。该数据有 32 列,其中第一列是时间索引、29 个未知特征、1 个交易量和 1 个类别。我将忽略时间索引,因为它不是静止的。
您的第一反应可能是有两个集群,这将是一个简单的任务,但欺诈数据是黄色点!在大星团中有三个可见的黄色点。因此,让我们对正常数据进行二次抽样,同时保留欺诈数据的数量。
现在可以看到,正常交易聚集在一个磁盘中,而欺诈交易则更加分散。
我们将构建一个具有 3 层编码器和 2 层解码器的自动编码器:
https://medium . com/swlh/anomaly-detection-with-auto encoders-2bd 23 edbd 9 e
自动编码器会将我们的数据编码到一个子空间中,并在标准化数据的同时将特征解码回来。我们的期望是,autoencoder 将学习正常交易的特征,并且在应用时输入将类似于输出。对于异常,输入和输出会有很大的不同,因为它是意外的数据。
这种方法的好处是它允许我们使用无监督学习,并且我们通常有大量正常的交易数据。数据标注通常昂贵、困难,并且在某些情况下不可用。手动数据标记还包括人工交互,这导致了带有人工偏见的实现。可以看出,在模型训练中,我们只使用正常的交易特征,而不使用标签。
让我们加载数据并训练我们的自动编码器:
我的模型解决了 8.5641e-04 的验证损失。(可以低至 5.4856e-04。)
使用该模型,我们将计算正常交易的均方误差(mse ),并计算所有 mse 值的 95%的阈值。
我们发现我们的阈值(截止值)为 0.002。如果均方差高于 0.002,我们会将交易视为异常。让我们选择 100 个欺诈样本和 100 个正常样本,并根据阈值绘制:
可以看出,与正常交易相比,大多数欺诈性交易具有较高的均方误差。看起来很有希望。
我们放弃了 5%的正常交易。仍有低于阈值的欺诈交易。这可以通过使用更好的特征提取来改善,因为一些欺诈数据似乎具有与正常交易非常相似的特征。信用卡欺诈的一些有价值的特征是前一小时/天/周的交易次数,如果交易是在发行国以外的国家发起的。
未来任务:
- 通过使用超参数优化来使用更好的模型。
- 分析数据以了解特征。
- 将这些结果与 SVM 或 K-均值聚类等常用方法进行比较。
这篇文章的完整代码可以在 Github 上找到:
异常检测与自动编码器-信用卡欺诈案件博客帖子为这个回购:https://blog.berkgokden.com 代码…
github.com](https://github.com/bgokden/anomaly-detection-with-autoencoders)
在 Github 和 Linkedin 上关注我:
[## 伯克·格登-高级软件工程师-卡斯帕。人工智能| LinkedIn
请在联系之前阅读摘要:我是一名电气工程师,但我目前正在从事…
www.linkedin.com](https://www.linkedin.com/in/berkgokden/)
*信用欺诈数据集的确认
该数据集是在 Worldline 和 ulb(布鲁塞尔自由大学)机器学习小组( http://mlg.ulb.ac.be )关于大数据挖掘和欺诈检测的研究合作期间收集和分析的。在https://www.researchgate.net/project/Fraud-detection-5和 DefeatFraud 项目的页面上可以获得关于相关主题的当前和过去项目的更多细节
引用作品:
安德烈亚·达尔·波佐洛、奥利维尔·卡伦、里德·约翰逊和吉安卢卡·邦坦皮。非*衡分类的欠采样概率校准。2015 年 IEEE 计算智能和数据挖掘研讨会(CIDM)
安德烈亚·达尔·波佐洛;奥利维耶·卡兰;勒·博尔涅,扬·艾尔;沃特肖特,哔叽;邦坦皮,吉安卢卡。从从业者的角度吸取信用卡欺诈检测的经验教训,应用专家系统,41,10,4915–4928,2014 年,Pergamon
安德烈亚·达尔·波佐洛;贾科莫博拉奇;奥利维耶·卡兰;阿里皮、塞萨尔;邦坦皮,吉安卢卡。信用卡欺诈检测:现实建模和新型学习策略, IEEE 神经网络和学习系统汇刊,29,8,3784–3797,2018,IEEE
达尔·波佐洛,安德里亚用于信用卡欺诈检测的自适应机器学习ULB·MLG 博士论文(g .邦坦皮指导)
法布里齐奥·卡希洛;安德烈亚·达尔·波佐洛;扬·阿勒·勒博尔涅;奥利维耶·卡兰;马泽尔、扬尼斯;邦坦皮,吉安卢卡。 Scarff:使用 Spark 进行流式信用卡欺诈检测的可扩展框架,信息融合,41,182–194,2018,Elsevier
法布里齐奥·卡希洛;扬·阿勒·勒博尔涅;奥利维耶·卡兰;邦坦皮,吉安卢卡。现实生活中信用卡欺诈检测的流式主动学习策略:评估和可视化,国际数据科学与分析杂志,5,4,285–300,2018,施普林格国际出版公司
Bertrand Lebichot,Yann-al Le Borgne,何丽云,Frederic Oblé,Gianluca Bontempi 用于信用卡欺诈检测的深度学习领域适应技术,INNSBDDL 2019:大数据和深度学习的最新进展,第 78-88 页,2019 年
Fabrizio Carcillo,Yann-al Le Borgne,Olivier Caelen,Frederic Oblé,Gianluca Bontempi 在信用卡欺诈检测中结合非监督和监督学习信息科学,2019 年
将人工智能技术应用于在 X 射线图像中检测新冠肺炎的网络应用程序的开发
放弃
此处开发的自动检测 X 射线图像中新冠肺炎的研究严格用于教育目的。最终应用并不旨在成为用于诊断人类新冠肺炎的可靠和准确的诊断系统,因为它还没有经过专业或学术评估。
介绍
新冠肺炎是一种由病毒(新型冠状病毒冠状病毒)引起的疫情病,这种病毒已经感染了数百万人,在几个月内导致数十万人死亡。
根据世界卫生组织(世卫组织),大多数新冠肺炎患者(约 80%)可能无症状,约 20%的病例可能需要医院护理,因为他们呼吸困难。在这些病例中,大约 5%可能需要呼吸衰竭治疗的支持(通气支持),这种情况可能会使重症监护设施崩溃。快速检测病毒携带者的方法是抗击疫情的关键。
什么是冠状病毒?
冠状病毒是导致呼吸道感染的病毒家族。这种新型冠状病毒制剂是 1919 年底在中国发现病例后发现的。它会导致一种叫做冠状病毒(新冠肺炎)的疾病。
1937 年首次分离出人类冠状病毒。然而,直到 1965 年,这种病毒才被描述为冠状病毒,因为它在显微镜下看起来像一个皇冠。在下面的视频中,您可以看到新型冠状病毒病毒的原子级 3D 模型:
点击图片查看 YouTube 视频
为什么是 x 光?
最*,在应用机器学习来辅助基于计算机断层扫描(CT)的新冠肺炎诊断方面已经观察到了一些有前途的努力。尽管这些方法取得了成功,但事实仍然是,新冠肺炎是一种正在各种规模的社区中大力传播的传染病,尤其是最需要帮助的人。
x 光机更便宜、更简单、操作速度更快,因此对于在更贫困或更偏远地区工作的医疗专业人员来说,比 CT 更容易获得。
目标
抗击新冠肺炎的重大挑战之一是检测病毒在人群中的存在。因此,该项目的目标是使用扫描的胸部 X 射线图像,自动检测肺炎患者(甚至无症状或未患病的人)中导致新冠肺炎的病毒。这些图像经过预处理,用于训练卷积神经网络(CNN)模型。
CNN 类型的网络通常需要大量数据集才能运行。尽管如此,在这个项目中,应用了一种称为“迁移学习”的技术,这在数据集很小的情况下非常有用(确诊的新冠肺炎患者的图像)。
开发了两种分类模型:
- 检测新冠肺炎与诊断具有正常胸部 X 线结果的患者
- 新冠肺炎与肺炎患者的检测
正如论文新冠肺炎图像数据收集中所定义的,所有类型的肺炎(除了由新冠肺炎病毒引起的)都被认为是“肺炎”(并以肺炎标签分类)。
对于模型的训练,使用了 的工具、库、资源,TensorFlow 2.0 (带 Keras),这是一个开源的*台,用于机器学习,或者更准确的说,深度学习。最终的模型是在 Flask 中开发的 web 应用程序(web-app)的基础,用于在接*现实的情况下进行测试。
下图为我们提供了最终应用程序如何工作的基本概念:
从存储在 web-app 用户计算机上的胸部 x 光扫描图像(User_A.png)中,该应用程序决定该图像是否属于被病毒污染的人(模型预测:[阳性]或[阴性])。在这两种情况下,应用程序都会告知预测的准确性(模型准确性:X%)。为了避免两者的错误,原始文件的名称和它的图像被显示给用户。图像的新副本存储在本地,其名称被添加到预测标签加上准确度值。
这项工作分为 4 个部分:
- 环境设置、数据采集、清洁和准备
- 模型 1 培训(Covid/正常)
- 模式 2 培训(Covid/Pneumo)
- 用于在 X 射线图像中检测新冠肺炎的 Web 应用程序的开发和测试
灵感
该项目的灵感来自于 UFRRJ(巴西里约热内卢联邦农村大学)开发的 XRayCovid-19 项目的概念验证。UFRRJ XRayCovid-19 是一个正在进行的项目,该项目将人工智能用于新冠肺炎医疗系统的诊断过程。该工具的特点是易于使用,响应时间效率高,结果有效,我希望将这些特点扩展到本教程第 4 部分中开发的 Web 应用程序。下面是一个诊断结果的打印屏幕(使用了新冠肺炎数据集 1 的一幅图像):
该大学所开展工作的科学基础可以在 Chowdhury 等人的论文中看到 2020,AI 能否帮助筛查病毒性和新冠肺炎肺炎?
除了用于比较模型的结果之外,另一项激动人心的工作也启发了这个项目,这就是 Chester 应用程序 Chester:由蒙特利尔大学的研究人员开发的一个 Web 交付的本地计算胸部 X 射线疾病预测系统。Chester 是一个免费的简单原型,可以由医疗专业人员用来了解深度学习工具的现实,以帮助诊断胸部的 X 射线。该系统被设计为第二意见,其中用户可以处理图像以确认或帮助诊断。
当前版本的 Chester (2.0)使用 DenseNet-121 型卷积网络对超过 106,000 幅图像进行了训练。这款网络应用没有检测到新冠肺炎,这是研究人员未来版本应用的目标之一。下面是一个诊断结果的打印屏幕(使用了新冠肺炎数据集 1 的一幅图像)
人工智能放射学助理切斯特
在下面的链接中,你可以访问 切斯特 甚至下载 app 离线使用。
谢谢
这部作品最初是基于 Adrian Rosebrock 博士发表的优秀教程开发的,我强烈推荐深入阅读。此外,我要感谢 Nell Trevor,他在 Rosebrock 博士工作的基础上,进一步提供了如何测试最终模型的想法。在下面的链接中,Nell 通过 PythonAnyware.com 网站提供了一个在 X 射线图像中对新冠肺炎进行真实测试的网络应用:新冠肺炎预测 API 。
第 1 部分—环境设置和数据准备
数据集
训练模型以从图像中检测任何类型的信息的第一个挑战是要使用的数据(或图像)的数量。原则上,图像的数量越多,最终的模型就越好,这与新冠肺炎探测项目的情况不同,一旦公开的图像不多(记住,这个疫情只有几个月大)。然而,像 Hall 等人 使用小数据集 ,上的深度学习从胸部 X 射线中发现新冠肺炎的研究证明,使用迁移学习技术仅用几百张图像就可以获得有希望的结果。
如介绍中所解释的,训练两个模型;因此,需要 3 组数据:
- 新冠肺炎确认了一组 x 光图像
- 常规(“正常”)患者(无疾病)的一组 X 射线图像
- 一组 x 光图像显示肺炎,但不是由新冠肺炎引起的
为此,下载了两个数据集:
数据集 1:新冠肺炎
约瑟夫·保罗·寇恩和保罗·莫里森与蓝岛·新冠肺炎影像数据集,arXiv: 2003.11597,2020
新冠肺炎或其他病毒性和细菌性肺炎(MERS、SARS 和 ARDS)阳性或疑似患者的 X 射线和计算机断层扫描图像的公开数据集。).数据从公共来源收集,以及通过医院和医生间接收集(蒙特利尔大学伦理委员会批准的项目# CERSES-20–058-D)。所有的图像和数据都可以在下面的 GitHub 库中找到。
数据集 2:肺炎和正常人的胸部 x 光图像
Kermany,Daniel 张、康;Goldbaum,Michael (2018),“用于分类的标记光学相干断层扫描(OCT)和胸部 X 射线图像”,Mendeley Data,v2。
通过深度学习过程,一组经过验证的图像(OCT 和胸部放射摄影)被分类为正常和某种类型的肺炎。图像被分成训练集和独立的患者测试集。数据可在网站上获得:https://data.mendeley.com/datasets/rscbjbr9sj/2
胸部 x 光的种类
从数据集中,可以找到三种类型的图像,PA、AP 和侧位(L)。左侧图像(L)很明显,但是 X 线 AP 和 PA 视图之间有什么区别?简单地说,在拍摄 X 射线的过程中,当 X 射线从身体的后部穿过到前部时,它被称为 PA(后部——前部)视图。而在 AP 视图中,方向是相反的。
通常,X 射线是在身体任何部位的 AP 视图中拍摄的。这里一个重要的例外恰恰是胸部 x 光。在这种情况下,最好通过 AP 查看 PA。但是如果病人病得很重,不能保持他的姿势,可以对胸部进行 AP 型 x 光检查。
由于绝大多数胸部 X 射线是 PA 型视图,这是用于训练模型的视图选择类型。
定义培训 DL 模型的环境
理想的情况是从新的 Python 环境开始。为此,使用终端,定义一个工作目录(例如:X-Ray_Covid_development ),然后在那里用 Python 创建一个环境(例如:TF_2_Py_3_7 ):
*mkdir X-Ray_Covid_development
cd X-Ray_Covid_development
conda create — name TF_2_Py_3_7 python=3.7 -y
conda activate TF_2_Py_3_7*
进入环境后,安装 TensorFlow 2.0:
*pip install — upgrade pip
pip install tensorflow*
从现在开始,安装训练模型所需的其他库。例如:
*conda install -c anaconda numpy
conda install -c anaconda pandas
conda install -c anaconda scikit-learn
conda install -c conda-forge matplotlib
conda install -c anaconda pillow
conda install -c conda-forge opencv
conda install -c conda-forge imutils*
创建必要的子目录:
*notebooks
10_dataset —
|_ covid [here goes the dataset for training model 1]
|_ normal [here goes the dataset for training model 1]
20_dataset —
|_ covid [here goes the dataset for training model 2]
|_ pneumo [here goes the dataset for training model 2]
input -
|_ 10_Covid_Imagens _
| |_ [*metadata.csv goes here*]
| |_ images [*Covid-19 images go here*]
|_ 20_Chest_Xray -
|_ test _
|_ NORMAL [*images go here*]
|_ PNEUMONIA [*images go here*]
|_ train _
|_ NORMAL [*images go here*]
|_ PNEUMONIA [*images go here*]
model
dataset_validation _
|_ covid_validation [*images go here*]
|_ non_covidcovid_validation [*images go here*]
|_ normal_validation [*images go here*]*
数据下载
下载数据集 1(新冠肺炎),并将文件 metadata.csv 保存在:/input /10_Covid_Images/下,并将图像保存在/input/10_Covid_Images/images/下。
下载数据集 2(pneumono 和 Normal),将图像保存在/input/20_Chest_Xray/(保持原来的测试和训练结构)下。
第 2 部分—模型 1—Covid/正常
数据准备
- 从我的 GitHub 下载笔记本:10 _ Xray _ Normal _ covid 19 _ Model _ 1 _ Training _ tests . ipynb保存在子目录/notebooks 中。
- 进入笔记本后,导入库并运行支持功能。
构建 Covid 标签数据集
从输入数据集(/input/10_Covid_Images/)中,创建将用于训练模型 1 的数据集,该数据集将用于要用 Covid 和 normal 标签定义的图像的分类。
*input_dataset_path = ‘../input/10_Covid_images’*
metadata.csv 文件将提供有关/images/文件中图像的信息
*csvPath = os.path.sep.join([input_dataset_path, “metadata.csv”])
df = pd.read_csv(csvPath)
df.shape*
metadat.csv 文件有 354 行和 28 列,这意味着在子目录/images/中有 354 个 X 射线图像。让我们分析它的一些列,以了解这些图像的更多细节。
通过 df.modality,有 310 个 X 射线图像和 44 个 CT(断层摄影)图像。CT 图像被丢弃,并且 df.findings 列显示 310 个 X 射线图像被细分为:
*COVID-19 235
Streptococcus 17
SARS 16
Pneumocystis 15
COVID-19, ARDS 12
E.Coli 4
ARDS 4
No Finding 2
Chlamydophila 2
Legionella 2
Klebsiella 1*
从可视化的角度来看 235 张确认的新冠肺炎图像,我们有:
*PA 142
AP 39
AP Supine 33
L 20
AP semi erect 1*
如引言中所述,只有 142 个 PA 型图像(后-前)用于模型训练,因为它们是胸片中最常见的图像(最终数据帧:xray_cv)。
xray _ cv.patiendid 列显示,这 142 幅图像属于 96 名不同的患者,这意味着在某些情况下,同一患者拍摄了不止一张 x 光照片。由于所有图像都用于训练(我们对图像的内容感兴趣),因此不考虑这些信息。
到 x 射线 cv.date,观察到有 8 张最*的图像拍摄于 2020 年 3 月。这些图像在要从模型训练中移除的列表中被分离。从而在以后用作最终模型的验证。
*imgs_march = [
‘2966893D-5DDF-4B68–9E2B-4979D5956C8E.jpeg’,
‘6C94A287-C059–46A0–8600-AFB95F4727B7.jpeg’,
‘F2DE909F-E19C-4900–92F5–8F435B031AC6.jpeg’,
‘F4341CE7–73C9–45C6–99C8–8567A5484B63.jpeg’,
‘E63574A7–4188–4C8D-8D17–9D67A18A1AFA.jpeg’,
‘31BA3780–2323–493F-8AED-62081B9C383B.jpeg’,
‘7C69C012–7479–493F-8722-ABC29C60A2DD.jpeg’,
‘B2D20576–00B7–4519-A415–72DE29C90C34.jpeg’
]*
下一步将构建指向训练数据集(xray_cv_train)的数据帧,该数据帧应引用 134 幅图像(所有输入图像均来自 Covid,除了用于稍后验证的单独图像):
*xray_cv_train = xray_cv[~xray_cv.filename.isin(imgs_march)]
xray_cv_train.reset_index(drop=True, inplace=True)*
而最终验证(x 射线 _cv_val)有 8 幅图像:
*xray_cv_val = xray_cv[xray_cv.filename.isin(imgs_march)]
xray_cv_val.reset_index(drop=True, inplace=True)*
为 COVID 训练图像和后续验证创建文件
请务必记住,在前面的项目中,仅使用从原始文件 metada.csv 中获取的信息创建了数据帧。我们知道要将哪些图像存储在最终文件中用于训练,现在我们需要将实际图像(以数字化格式)“物理”分离到正确的子目录(文件夹)中。
为此,我们将使用 load_image_folder support()函数,该函数从一个元数据文件中将其中引用的图像从一个文件复制到另一个文件:
*def load_image_folder(df_metadata,
col_img_name,
input_dataset_path,
output_dataset_path):
img_number = 0
# loop over the rows of the COVID-19 data frame
for (i, row) in df_metadata.iterrows():
imagePath = os.path.sep.join([input_dataset_path, row[col_img_name]]) if not os.path.exists(imagePath):
print('image not found')
continue filename = row[col_img_name].split(os.path.sep)[-1]
outputPath = os.path.sep.join([f"{output_dataset_path}", filename])
shutil.copy2(imagePath, outputPath)
img_number += 1
print('{} selected Images on folder {}:'.format(img_number, output_dataset_path))*
按照下面的说明,134 幅选定的图像将被复制到文件夹中../10_dataset/covid/。
*input_dataset_path = '../input/10_Covid_images/images'
output_dataset_path = '../dataset/covid'
dataset = xray_cv_train
col_img_name = 'filename'load_image_folder(dataset, col_img_name,
input_dataset_path, output_dataset_path)*
为普通图像创建文件夹(验证和培训)
在数据集 2(正常和肺炎图像)的情况下,不提供具有元数据的文件。因此,您只需将图像从输入文件复制到末尾。为此,我们将使用 load_image_folder_direct()支持函数,该函数将大量图像(随机选择)从一个文件夹复制到另一个文件夹:
*def load_image_folder_direct(input_dataset_path,
output_dataset_path,
img_num_select):
img_number = 0
pathlist = Path(input_dataset_path).glob('**/*.*')
nof_samples = img_num_select
rc = []
for k, path in enumerate(pathlist):
if k < nof_samples:
rc.append(str(path)) # because path is not string
shutil.copy2(path, output_dataset_path)
img_number += 1
else:
i = random.randint(0, k)
if i < nof_samples:
rc[i] = str(path) print('{} selected Images on folder {}:'.format(img_number, output_dataset_path))*
对文件夹中的图像重复相同的过程../input/20 _ Chest _ Xray/train/NORMAL,我们将为训练随机复制与之前用于 Covid 图像相同数量的图像(len (xray_cv_train))或 134 幅图像。这样,用于训练模型的数据集就*衡了。
*input_dataset_path = '../input/20_Chest_Xray/train/NORMAL'
output_dataset_path = '../dataset/normal'
img_num_select = len(xray_cv_train)load_image_folder_direct(input_dataset_path, output_dataset_path,
img_num_select)*
以同样的方式,我们分离 20 个随机图像,供以后在模型验证中使用。
*input_dataset_path = '../input/20_Chest_Xray/train/NORMAL'
output_dataset_path = '../dataset_validation/normal_validation'img_num_select = 20
load_image_folder_direct(input_dataset_path, output_dataset_path,
img_num_select)*
虽然我们不是用显示肺炎症状的图像来训练模型(新冠肺炎除外),但看看最终的模型对它们的反应是很有趣的。因此,我们还分离了其中的 20 幅图像,以供以后验证。
*input_dataset_path = '../input/20_Chest_Xray/train/PNEUMONIA'
output_dataset_path = '../dataset_validation/non_covid_pneumonia_validation'img_num_select = 20
load_image_folder_direct(input_dataset_path, output_dataset_path,
img_num_select)*
下面的图片显示了在这一步结束时应该如何配置文件夹(反正是在我的 Mac 上)。此外,标有红色的数字表示文件夹中包含的 x 射线图像的数量。
包含模型 1 培训和验证数据集的文件夹
绘制数据集以进行快速视觉验证
由于文件夹中的图像数量不多,因此可以对它们进行目视检查。为此,使用支持函数 plots_from_files():
*def plots_from_files(imspaths,
figsize=(10, 5),
rows=1,
titles=None,
maintitle=None):
"""Plot the images in a grid"""
f = plt.figure(figsize=figsize)
if maintitle is not None:
plt.suptitle(maintitle, fontsize=10)
for i in range(len(imspaths)):
sp = f.add_subplot(rows, ceildiv(len(imspaths), rows), i + 1)
sp.axis('Off')
if titles is not None:
sp.set_title(titles[i], fontsize=16)
img = plt.imread(imspaths[i])
plt.imshow(img)def ceildiv(a, b):
return -(-a // b)*
然后,定义将在训练中使用的数据集的路径(dataset_path)以及具有要查看的图像名称的列表:
*dataset_path = '../10_dataset'normal_images = list(paths.list_images(f"{dataset_path}/normal"))
covid_images = list(paths.list_images(f"{dataset_path}/covid"))*
这样,调用可视化的支持函数,图像显示如下:
*plots_from_files(covid_images, rows=10, maintitle="Covid-19 X-ray images")*
Covid 图像可视化
*plots_from_files(normal_images, rows=10, maintitle="Normal X-ray images")*
正常图像可视化
总的来说,图像看起来不错。
预训练卷积神经网络模型的选择
使用先前定义的图像来执行模型的训练,但是在已经从 TF / Keras 库中预先训练的模型上,应用被称为“迁移学习”的技术。
迁移学习是一种机器学习方法,其中为一个任务开发的模型被重新用作第二个任务中模型的起点。有关更多信息,请参见 Jason Brownlee 的优秀文章深度学习迁移学习的温和介绍
Keras 应用程序是 Keras 的深度学习库模块,它为 VGG16、ResNet50v2、ResNet101v2、Xception、MobileNet 等几种流行的架构提供模型定义和预训练的权重。以下链接显示了这些选项: Keras 应用。
要使用的预训练模型是 VGG16,由牛津大学的视觉图形组(VGG)开发,并在论文“用于大规模图像识别的非常深的卷积网络”中描述。除了在开发公开可用权重的图像分类模型时非常流行之外,这也是 Adrian 博士在他的教程中建议的模型。
理想的情况是使用几个模型(例如,ResNet50v2、ResNet101v2)进行测试(基准测试),或者甚至创建一个特定的模型(如 Zhang 等人的论文中建议的模型,【使用基于深度学习的异常检测对胸部 X 射线图像进行筛查】)。但由于这项工作的最终目标只是概念验证,我们只是在探索 VGG16 。
VGG16 是一种卷积神经网络(CNN)架构,尽管它是在 2014 年开发的,但今天仍被认为是处理图像分类的最佳架构之一。
VGG16 架构的一个特点是,它们没有大量的超参数,而是专注于一次通过一个 3×3 滤波器(内核)的卷积层,然后是一个 2×2 最大池层。在整个架构中,此过程之后是一组一致的卷积层和最大池层。最终,该架构具有 2 个 FC(全连接层),随后是针对输出的 softmax 类型激活。
VGG16 中的 16 是指架构有 16 层,权重为(w)。这个网络是广泛的,在使用所有原始的 16 层的情况下,具有几乎 1 . 4 亿个训练参数。在我们的例子中,最后两层(FC1 和 2)是本地训练的,参数总数刚好超过 1500 万,其中大约 590,000 个参数是本地训练的(而其余的是“冻结的”)。
要注意的第一点是,VNN16 架构的第一层处理 224x224x3 像素的图像,因此我们必须确保要训练的 X 射线图像也具有这些维度,因为它们是卷积网络“第一层”的一部分。因此,当使用原始权重加载模型时(weights = "imagenet "),我们还应该忽略模型的顶层(include_top = False),它由我们的层(headModel)替换。
*baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))*
接下来,我们必须定义用于训练的超参数(在下面的评论中,将测试一些可能的值以提高模型的“准确性”):
*INIT_LR = 1e-3 # [0.0001]
EPOCHS = 10 # [20]
BS = 8 # [16, 32]
NODES_DENSE0 = 64 # [128]
DROPOUT = 0.5 # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5]
MAXPOOL_SIZE = (4, 4) # [(2,2) , (3,3)]
ROTATION_DEG = 15 # [10]
SPLIT = 0.2 # [0.1]*
然后构建我们的模型,它被添加到基本模型中:
*headModel = baseModel.output
headModel = AveragePooling2D(pool_size=MAXPOOL_SIZE)(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(NODES_DENSE0, activation="relu")(headModel)
headModel = Dropout(DROPOUT)(headModel)
headModel = Dense(2, activation="softmax")(headModel)*
头模型模型放置在基础模型之上,成为实际训练的模型的一部分(确定最佳权重)。
*model = Model(inputs=baseModel.input, outputs=headModel)*
重要的是要记住,预先训练的 CNN 模型,如 VGG16,是用成千上万的图像训练的,以对普通图像进行分类(如狗、猫、汽车和人)。我们现在要做的是根据我们的需求对其进行定制(对 x 光图像进行分类)。理论上,模型的第一层简化了图像的部分,识别出其中的形状。这些初始标签非常通用(比如直线、圆、正方形),所以我们不想再训练它们了。我们只想训练网络的最后几层,以及新加入的几层。
对基础模型中的所有层执行的以下循环“冻结”它们,使得它们在第一次训练过程中不被更新。
*for layer in baseModel.layers:
layer.trainable = False*
而此时,模型已经可以接受训练了,但首先,我们必须为模型的训练准备好数据(图像)。
数据预处理
让我们首先创建一个包含存储图像的名称(和路径)的列表:
*imagePaths = list(paths.list_images(dataset_path))*
然后,对于列表中的每个图像,我们必须:
- 提取图像标签(在本例中,是 covid 或 normal)
- 将图像通道从 BGR (CV2 默认)设置为 RGB
- 将图像大小调整为 224 x 224(默认为 VGG16)
*data = []
labels = []for imagePath in imagePaths:
label = imagePath.split(os.path.sep)[-2]
image = cv2.imread(imagePath)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (224, 224)) data.append(image)
labels.append(label)*
数据和标签被转换为数组,即每个像素的强度值,范围从 0 到 255,从 0 到 1 缩放,便于训练。
*data = np.array(data) / 255.0
labels = np.array(labels)*
标签将使用一键编码技术进行数字编码。
*lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)*
此时,训练数据集分为训练和测试(80%用于训练,20%用于测试):
*(trainX, testX, trainY, testY) = train_test_split(data,
labels,
test_size=SPLIT,
stratify=labels,
random_state=42)*
最后但同样重要的是,我们应该应用“上升”数据或“增强”技术。
增大
正如 Chowdhury 等人在他们的论文中所建议的,三种增强策略(旋转、调度和*移)可用于为新冠肺炎生成额外的训练图像,有助于防止“过拟合”。
原始胸部 x 光图像(A),逆时针旋转 45 度后的图像(B),顺时针旋转 45 度后的图像,水*和垂直*移 20%后的图像(D),以及缩放 10%后的图像(E)。
使用 TS/Keras 图像预处理库(ImageDataGenerator),可以更改几个图像参数,例如:
*trainAug = ImageDataGenerator(
rotation_range=15,
width_shift_range=0.2,
height_shift_range=0.2,
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')*
最初,仅应用 15 度的图像最大旋转来评估结果。
据观察,X 射线图像通常在旋转变化很小的情况下对齐。
*trainAug = ImageDataGenerator(rotation_range=ROTATION_DEG, fill_mode="nearest")*
此时,我们已经定义了模型和数据,并准备好进行编译和训练。
模型构建和培训
编译允许实际构建我们之前实现的模型,但是增加了一些额外的特性,比如损失率函数、优化器和指标。
对于网络训练,我们使用损失函数来计算网络预测值和训练数据实际值之间的差异。伴随着优化算法(例如 Adam)的损失值促进了对网络内的权重进行的改变的数量。这些超参数有助于网络训练的收敛,获得尽可能接*零的损失值。
我们还指定了优化器的学习率(lr)。在这种情况下,lr 被定义为 1e-3(大约。0.05).如果在训练期间,注意到“跳动”的增加,这意味着模型不能收敛,我们应该降低学习速率,以便我们可以达到全局最小值。
*opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])*
让我们训练模型:
*H = model.fit(
trainAug.flow(trainX, trainY, batch_size=BS),
steps_per_epoch=len(trainX) // BS,
validation_data=(testX, testY),
validation_steps=len(testX) // BS,
epochs=EPOCHS)*
结果看起来已经很有趣了,在验证数据中达到了 92%的精确度!让我们绘制精确图表:
评估已训练的模型:
看看混淆矩阵:
*[[27 0]
[ 4 23]]
acc: 0.9259
sensitivity: 1.0000
specificity: 0.8519*
根据用最初选择的超参数训练的模型,我们获得:
- 100%的灵敏度,这意味着对于患有新冠肺炎(即真阳性)的患者,我们可以在 100%的时间内准确地将他们识别为“新冠肺炎阳性”。
- 85%的特异性意味着,对于没有新冠肺炎(即真正阴性)的患者,我们只能在 85%的时间内准确地将他们识别为“新冠肺炎阴性”。
结果并不令人满意,因为 15%没有 Covid 的患者会被误诊。让我们首先尝试微调模型,更改一些超参数:
*INIT_LR = 0.0001 # was 1e-3
EPOCHS = 20 # was 10
BS = 16 # was 8
NODES_DENSE0 = 128 # was 64
DROPOUT = 0.5
MAXPOOL_SIZE = (2, 2) # was (4, 4)
ROTATION_DEG = 15
SPLIT = 0.2*
因此,我们有:
*precision recall f1-score support covid 0.93 1.00 0.96 27
normal 1.00 0.93 0.96 27 accuracy 0.96 54
macro avg 0.97 0.96 0.96 54
weighted avg 0.97 0.96 0.96 54*
和混淆矩阵:
*[[27 0]
[ 2 25]]acc: 0.9630
sensitivity: 1.0000
specificity: 0.9259*
好得多的结果!现在有了 93%的特异性,这意味着在没有新冠肺炎(即真阴性)的患者中,我们可以在 93%的时间内准确地将他们识别为“新冠肺炎阴性”,而在识别真阳性时为 100%。
目前,结果看起来很有希望。让我们保存该模式,对那些在验证训练中遗漏的图像进行测试(2020 年 3 月新冠肺炎的 8 幅图像和从输入数据集中随机选择的 20 幅图像)。
*model.save("../model/covid_normal_model.h5")*
在真实图像中测试模型(验证)
首先,让我们检索模型并展示最终的架构,以检查一切是否正常:
*new_model = load_model('../model/covid_normal_model.h5')# Show the model architecture
new_model.summary()*
模型看起来不错,是 VGG16 的 16 层结构。注意可训练参数为 590,210,是最后两层(dense_2 和 dense_3)的和,加入到预训练模型中,参数为 14.7M。
让我们验证测试数据集中加载的模型:
*[INFO] evaluating network...
precision recall f1-score support covid 0.93 1.00 0.96 27
normal 1.00 0.93 0.96 27 accuracy 0.96 54
macro avg 0.97 0.96 0.96 54
weighted avg 0.97 0.96 0.96 54*
完美,我们得到了和以前一样的结果,这意味着训练好的模型被正确地保存和加载。现在让我们用之前保存的 8 幅 Covid 图像来验证模型。为此,我们使用另一个为单独图像测试开发的支持函数 test_rx_image_for_Covid19():
*def test_rx_image_for_Covid19(imagePath):
img = cv2.imread(imagePath)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = np.expand_dims(img, axis=0) img = np.array(img) / 255.0 pred = new_model.predict(img)
pred_neg = round(pred[0][1]*100)
pred_pos = round(pred[0][0]*100) print('\n X-Ray Covid-19 Detection using AI - MJRovai')
print(' [WARNING] - Only for didactic purposes')
if np.argmax(pred, axis=1)[0] == 1:
plt.title('\nPrediction: [NEGATIVE] with prob: {}% \nNo Covid-19\n'.format(
pred_neg), fontsize=12)
else:
plt.title('\nPrediction: [POSITIVE] with prob: {}% \nPneumonia by Covid-19 Detected\n'.format(
pred_pos), fontsize=12) img_out = plt.imread(imagePath)
plt.imshow(img_out)
plt.savefig('../Image_Prediction/Image_Prediction.png')
return pred_pos*
在笔记本电脑上,该功能将显示以下结果:
通过更改剩余 7 个图像的 imagePath 值,我们获得了以下结果:
所有图像都呈阳性,证实了 100%的灵敏度。
现在让我们测试标记为正常的 20 个单独的验证图像。笔记本上的第一个应该是这样的:
逐个测试,有可能证实预测,但由于我们有更多的图像,让我们使用另一个函数来测试一组图像,一次完成:test _ rx _ image _ for _ covid 19 _ batch(img _ lst)。
批量测试图像
让我们创建包含在验证文件夹中的图像列表:
*validation_path = '../dataset_validation'normal_val_images = list(paths.list_images(
f"{validation_path}/normal_validation"))
non_covid_pneumonia_validation_images = list(paths.list_images(
f"{validation_path}/non_covid_pneumonia_validation"))
covid_val_images = list(paths.list_images(
f"{validation_path}/covid_validation"))*
test _ rx _ image _ for _ covid 19 _ batch(img _ lst)函数如下所示:
*def test_rx_image_for_Covid19_batch(img_lst):
neg_cnt = 0
pos_cnt = 0
predictions_score = []
for img in img_lst:
pred, neg_cnt, pos_cnt = test_rx_image_for_Covid19_2(img, neg_cnt, pos_cnt)
predictions_score.append(pred)
print ('{} positive detected in a total of {} images'.format(pos_cnt, (pos_cnt+neg_cnt)))
return predictions_score, neg_cnt, pos_cnt*
将该函数应用于我们之前分离的 20 幅图像:
*img_lst = normal_val_images
normal_predictions_score, normal_neg_cnt, normal_pos_cnt = test_rx_image_for_Covid19_batch(img_lst)
normal_predictions_score*
我们观察到,所有 20 人都被诊断为阴性,得分如下(记住,模型将返回接*“1”的“阳性”):
*0.25851375,
0.025379542,
0.005824779,
0.0047603976,
0.042225637,
0.025087152,
0.035508618,
0.009078974,
0.014746706,
0.06489486,
0.003134642,
0.004970203,
0.15801577,
0.006775451,
0.0032735346,
0.007105667,
0.001369465,
0.005155371,
0.029973848,
0.014993184*
仅在 2 个案例中,图像的 a 值(1-精度)低于 90% (0.26 和 0.16)。
由于我们有一个函数来批量应用模型,请记住输入数据集/input /20_Chest_Xray/有两个组/train 和/test。只有包含在/train 中的图像组的一部分用于训练,并且所有/test 图像从未被模型看到:
*input -
|_ 10_Covid_Imagens _
| |_ *metadata.csv*
| |_ images [used train model 1]
|_ 20_Chest_Xray -
|_ test _
|_ NORMAL
|_ PNEUMONIA
|_ train _
|_ NORMAL [used train model 1]
|_ PNEUMONIA*
然后,我们可以利用并测试该文件夹中的所有新图像。首先,我们创建了图像列表:
*validation_path = '../input/20_Chest_Xray/test'normal_test_val_images = list(paths.list_images(f"{validation_path}/NORMAL"))
print("Normal Xray Images: ", len(normal_test_val_images))pneumo_test_val_images = list(paths.list_images(f"{validation_path}/PNEUMONIA"))
print("Pneumo Xray Images: ", len(pneumo_test_val_images))*
我们观察了 234 张被诊断为正常的“未发表的”图像(还有 390 多张被诊断为非新冠肺炎引起的肺炎)。应用批量测试的功能,我们观察到在总共 234 个图像中有 24 个图像呈现假阳性(大约 10%)。让我们看看模型输出值是如何分布的,记住函数返回的值是这样计算的:
*pred = new_model.predict(image)
pred_pos = round(pred[0][0] * 100)*
我们观察到预测的精确谷值的*均值为 0.15,并且非常集中在接*于零的值中(中值仅为 0.043)。有趣的是,大多数假阳性接* 0.5,少数异常值在 0.6 以上。
除了改进模型之外,研究产生假阳性的图像也是值得的,因为这可能是获取数据的方式的技术特征。
肺炎的图像检测
因为输入数据集也有肺炎患者的 X 射线图像,但不是由 Covid 引起的,所以让我们应用模型 1 (Covid / Normal)来看看结果是什么:
结果非常糟糕,因为在 390 张图像中,有 185 张是假阳性。而观察结果的分布,观察到有一个接* 80%的峰值,就是错得很离谱!
回想一下,这个结果在技术上并不令人惊讶,因为该模型没有用肺炎患者的图像进行训练。
无论如何,这是一个大问题,因为我想象一个专家可以用肉眼区分一个病人是否患有肺炎。尽管如此,要区分这场肺炎是由新冠肺炎病毒(新型冠状病毒)、任何其他病毒,甚至是细菌引起的,可能会更加困难。
该模型应该更有用,能够区分由新冠肺炎病毒引起的肺炎患者和其他类型的病毒或细菌。为此,训练了另一个模型,现在有了感染新冠肺炎病毒的病人和感染肺炎但不是由新冠肺炎病毒引起的病人的图像。
第 3 部分—模型 2 — Covid/Pneumo
数据准备
- 从我的 GitHub 下载笔记本:20 _ Xray _ pno _ covid 19 _ Model _ 2 _ Training _ tests . ipynb保存在子目录/notebooks 中。
- 导入使用的库并运行支持函数。
模型 2 中使用的 Covid 图像数据集与模型 1 中使用的相同,只是现在它存储在不同的文件夹中。
*dataset_path = '../20_dataset'*
肺炎图像将从文件夹/input/20 _ Chest _ x ray/train/Pneumonia/下载,并存储在/20 _ dataset/pneumono/中。要使用的功能与之前相同:
*input_dataset_path = '../input/20_Chest_Xray/train/PNEUMONIA'
output_dataset_path = '../20_dataset/pneumo'img_num_select = len(xray_cv_train) # Same number of samples as Covid data*
这样,我们调用可视化的支持函数,检查获得的结果:
*pneumo_images = list(paths.list_images(f"{dataset_path}/pneumo"))
covid_images = list(paths.list_images(f"{dataset_path}/covid"))plots_from_files(covid_images, rows=10, maintitle="Covid-19 X-ray images")*
Covid 图像可视化
*plots_from_files(pneumo_images, rows=10, maintitle="Pneumony X-ray images"*
总的来说,图像看起来不错。
预训练 CNN 模型及其超参数的选择
要使用的预训练模型是 VGG16,与用于模型 1 训练的模型相同
*baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))*
接下来,我们必须定义用于训练的超参数。我们从模型 1 的最终训练调整后使用的相同参数开始:
*INIT_LR = 0.0001
EPOCHS = 20
BS = 16
NODES_DENSE0 = 128
DROPOUT = 0.5
MAXPOOL_SIZE = (2, 2)
ROTATION_DEG = 15
SPLIT = 0.2*
然后,构建我们的模型,该模型将被添加到基本模型中:
*headModel = baseModel.output
headModel = AveragePooling2D(pool_size=MAXPOOL_SIZE)(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(NODES_DENSE0, activation="relu")(headModel)
headModel = Dropout(DROPOUT)(headModel)
headModel = Dense(2, activation="softmax")(headModel)*
headModel 模型被放置在基本模型之上,成为用于训练的真实模型。
*model = Model(inputs=baseModel.input, outputs=headModel)*
对基础模型中的所有层执行的以下循环将“冻结”它们,使得它们在第一次训练过程中不被更新。
*for layer in baseModel.layers:
layer.trainable = False*
此时,模型已经可以进行训练了,但是我们首先要准备好模型的数据(图像)。
数据预处理
让我们首先创建一个包含存储图像的名称(和路径)的列表,并执行与模型 1 相同的预处理:
*imagePaths = list(paths.list_images(dataset_path))data = []
labels = []for imagePath in imagePaths:
label = imagePath.split(os.path.sep)[-2]
image = cv2.imread(imagePath)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (224, 224)) data.append(image)
labels.append(label)data = np.array(data) / 255.0
labels = np.array(labels)*
标签使用一键编码技术进行数字编码。
*lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)*
此时,我们将把训练数据集分为训练数据集和测试数据集(80%用于训练,20%用于测试):
*(trainX, testX, trainY, testY) = train_test_split(data,
labels,
test_size=SPLIT,
stratify=labels,
random_state=42)*
最后但同样重要的是,我们将应用数据扩充技术。
*trainAug = ImageDataGenerator(rotation_range=ROTATION_DEG, fill_mode="nearest")*
此时,我们已经定义了模型和数据,并准备好进行编译和训练。
模型 2 的编译和训练
编译:
*opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])*
培训:
*H = model.fit(
trainAug.flow(trainX, trainY, batch_size=BS),
steps_per_epoch=len(trainX) // BS,
validation_data=(testX, testY),
validation_steps=len(testX) // BS,
epochs=EPOCHS)*
通过 20 个时期和初始参数,结果看起来非常有趣,在验证数据中达到 100%的精度!让我们绘制精度图表,评估训练好的模型,并查看混淆矩阵:
*precision recall f1-score support covid 0.96 1.00 0.98 27
pneumo 1.00 0.96 0.98 27 accuracy 0.98 54
macro avg 0.98 0.98 0.98 54
weighted avg 0.98 0.98 0.98 54*
混淆矩阵:
*[[27 0]
[ 1 26]]
acc: 0.9815
sensitivity: 1.0000
specificity: 0.9630*
利用训练的模型(利用最初选择的超参数),我们获得:
- 100%的灵敏度,这意味着对于患有新冠肺炎(即,真阳性)的患者,我们可以在 100%的时间内准确地将他们识别为“新冠肺炎阳性”。
- 96%的特异性,这意味着对于没有新冠肺炎(即,真阴性)的患者,我们可以在 96%的时间内准确地将他们识别为“新冠肺炎阴性”。
结果完全令人满意,因为只有 4%没有 Covid 的患者会被误诊。但在这种情况下,肺炎患者和新冠肺炎患者之间的正确分类是最有益的;我们至少应该对超参数进行一些调整,重新进行训练。
首先,我试图降低初始 lr 一点,这是一场灾难。我回到了原来的值。
我还减少了数据的分割,增加了一点 Covid 图像,并将最大旋转角度更改为 10 度,这是与原始数据集相关的论文中建议的:
*INIT_LR = 0.0001
EPOCHS = 20
BS = 16
NODES_DENSE0 = 128
DROPOUT = 0.5
MAXPOOL_SIZE = (2, 2)
ROTATION_DEG = 10
SPLIT = 0.1*
因此,我们有:
*precision recall f1-score support covid 1.00 1.00 1.00 13
pneumo 1.00 1.00 1.00 14 accuracy 1.00 27
macro avg 1.00 1.00 1.00 27
weighted avg 1.00 1.00 1.00 27*
和混淆矩阵:
*[[13 0]
[ 0 14]]acc: 1.0000
sensitivity: 1.0000
specificity: 1.0000*
结果看起来比他们以前更好,但我们使用的测试数据很少!让我们保存这个模型,像以前一样用大量的图片进行测试。
*model.save("../model/covid_pneumo_model.h5")*
我们观察到有 390 张图片被标记为非新冠肺炎病毒引起的肺炎。应用批量测试功能,我们观察到在总共 390 个图像中只有 3 个图像呈现假阳性(大约 0.8%)。此外,预测精度值的*均值为 0.04,并且非常集中在接*于零的值中(中值仅为 0.02)。
总体结果甚至比以前的模型观察到的更好。有趣的是,几乎所有结果都在前 3 个四分位数内,只有极少数异常值的误差超过 20%。
在这种情况下,也值得研究产生假阳性(只有 3 个)的图像,因为它们也可能是捕获数据的方式的技术特征。
使用被认为正常(健康)的患者图像进行测试
由于输入数据集也有正常患者(未训练)的 X 射线图像,让我们应用模型 2 (Covid/Pneumo)来看看结果是什么
在这种情况下,结果并不像在模型 1 测试中看到的那样糟糕,因为在 234 幅图像中,有 45 幅呈现假阳性(19%)。
理想的情况是对每种情况使用正确的模型,但是如果只使用一种,模型 2 是正确的选择。
注意:在最后一次测试备选方案的尝试中,做了一次基准测试,我试图改变增强参数,正如 Chowdhury 等人所建议的那样,但令我惊讶的是,结果并没有更好(结果在笔记本的末尾)。
第 4 部分—用于 X 射线图像中新冠肺炎检测的 Web 应用程序
测试 Python 独立脚本
对于 web-app 的开发,我们使用 Flask,这是一个用 Python 编写的 web 微框架。它被归类为微结构,因为它不需要特定的工具或库来运行。
此外,我们只需要几个库和与单独测试图像相关的函数。因此,让我们首先在一个“干净”的笔记本上工作,在那里使用已经训练和保存的模型 2 进行测试。
- 从我的 GitHub 加载,笔记本:30 _ AI _ Xray _ covid 19 _ pno _ Detection _ application . ipynb
- 现在只导入测试在前一个笔记本中创建的模型所需的库。
*import numpy as np
import cv2
from tensorflow.keras.models import load_model*
- 然后执行加载和测试映像的支持功能:
*def test_rx_image_for_Covid19_2(model, imagePath):
img = cv2.imread(imagePath)
img_out = img
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = np.expand_dims(img, axis=0) img = np.array(img) / 255.0 pred = model.predict(img)
pred_neg = round(pred[0][1]*100)
pred_pos = round(pred[0][0]*100)
if np.argmax(pred, axis=1)[0] == 1:
prediction = 'NEGATIVE'
prob = pred_neg
else:
prediction = 'POSITIVE'
prob = pred_pos cv2.imwrite('../Image_Prediction/Image_Prediction.png', img_out)
return prediction, prob*
- 下载训练好的模型
*covid_pneumo_model = load_model('../model/covid_pneumo_model.h5')*
- 然后,从验证子目录上传一些图像,并确认一切正常:
*imagePath = '../dataset_validation/covid_validation/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg'
test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)*
结果应该是:('阳性',96.0)
*imagePath = ‘../dataset_validation/normal_validation/IM-0177–0001.jpeg’
test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)*
结果应该是:('负',99.0)
*imagePath = '../dataset_validation/non_covid_pneumonia_validation/person63_bacteria_306.jpeg'
test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)*
结果应该是:('负',98.0)
到目前为止,所有的开发都是在 Jupyter 笔记本上完成的,我们应该做一个最终测试,让代码作为 python 脚本运行在最初创建的开发目录中,例如,使用名称:covidXrayApp_test.py。
*# Import Libraries and Setupimport numpy as np
import cv2
from tensorflow.keras.models import load_model# Turn-off Info and warnings
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'# Support Functionsdef test_rx_image_for_Covid19_2(model, imagePath):
img = cv2.imread(imagePath)
img_out = img
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = np.expand_dims(img, axis=0) img = np.array(img) / 255.0 pred = model.predict(img)
pred_neg = round(pred[0][1]*100)
pred_pos = round(pred[0][0]*100)
if np.argmax(pred, axis=1)[0] == 1:
prediction = 'NEGATIVE'
prob = pred_neg
else:
prediction = 'POSITIVE'
prob = pred_pos cv2.imwrite('./Image_Prediction/Image_Prediction.png', img_out)
return prediction, prob# load model
covid_pneumo_model = load_model('./model/covid_pneumo_model.h5')# ---------------------------------------------------------------
# Execute testimagePath = './dataset_validation/covid_validation/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg'prediction, prob = test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)print (prediction, prob)*
让我们直接在终端上测试这个脚本:
完美一切工作完美和“独立”,在笔记本之外。
在 Flask 中创建运行应用程序的环境
第一步是从新的 Python 环境开始。为此,使用终端定义一个工作目录(例如 covid19XrayWebApp ),然后在那里用 Python 创建一个环境(例如:
*mkdir covid19XrayWebApp
cd covid19XrayWebApp
conda create --name covid19xraywebapp python=3.7.6 -y
conda activate covid19xraywebapp*
进入环境后,安装 Flask 和运行应用程序所需的所有库:
*conda install -c anaconda flask
conda install -c anaconda requests
conda install -c anaconda numpy
conda install -c conda-forge matplotlib
conda install -c anaconda pillow
conda install -c conda-forge opencv
pip install --upgrade pip
pip install tensorflow
pip install gunicorn*
创建必要的子目录:
*[here the app.py]
model [here the trained and saved model]
templates [here the .html file]
static _ [here the .css file and static images]
|_ xray_analysis [here the output image after analysis]
|_ xray_img [here the input x-ray image]*
从我的 GitHub 中复制文件,并存储在新创建的目录中,如下所示:
- 服务器上负责“后端”执行的 python 应用程序称为 app.py,必须位于主目录的根目录下
- 在/template 中,应该存储 index.html 文件,它将是应用程序的“面孔”,或者说是“前端”
- 在/static 中将是 style.css 文件,负责格式化前端(template.html)以及静态图片如 logo,icon 等。
- 在/static 下还有子目录,这些子目录将接收要分析的图像以及分析结果(实际上,相同的图像以新名称保存,其中包含:其原始名称加上诊断和准确率)。
一旦所有文件都安装到了正确的位置,工作目录看起来就像这样:
在本地网络上启动 Web 应用程序
一旦你将文件安装到你的文件夹中,运行 app.py,它是我们 web 应用程序的“引擎”,负责接收存储在用户计算机某处的图像(无论在哪里)。
*python app.py*
在终端,我们可以观察到:
在您的浏览器上,输入方向:
该应用将在您的本地网络中运行:
用真实图像测试网络应用
我们可以选择开始显示 Covid 的 X 射线图像之一,它已经在开发过程中用于验证。
- 按下应用程序中的[浏览]按钮,打开您电脑的文件管理器
- 选择图像,然后选择[打开](在我的 Mac 的 Finder 窗口中)
- 文件名显示为在应用程序中选择的文件名。
- 在 app 中按【提交查询】。
- 图像显示在应用程序的底部,同时显示图像诊断及其准确度值。
- 图像存储在文件夹:/static/Xray _ Analysys 中,结构如下:[Result]_ Prob [XX] Name _[FILENAME]。png
以下是一系列步骤:
对有肺炎但没有新冠肺炎的图像之一重复测试:
后续步骤
正如导言中所讨论的,该项目是一个概念验证,以证明在 X 射线图像中检测导致新冠肺炎的病毒的可行性。对于要在实际案例中使用的项目,还必须完成几个步骤。以下是一些建议:
- 与卫生领域的专业人员一起验证整个项目
- 开发一个基准来寻找最佳的预训练模型
- 使用从患者处获得的图像来训练该模型,最好是来自将使用该应用的相同区域。
- 使用新冠肺炎获得更广泛的患者图像
- 改变模型的模型超参数
- 测试用 3 个类别(正常、Covid 和肺炎)训练模型的可行性
- 对应用程序要测试的图像应用与训练图像相同的捕获和数字化程序
- 更改应用程序,允许选择更适合使用的型号(型号 1 或 2)
- 在 Heroku.com 或 pythonanywhere.com 等*台上将网络应用投入生产
结论
一如既往,我希望这篇文章能够帮助其他人在数据科学的美好世界中找到自己的路!我比以往任何时候都更希望这篇文章能够激励深度学习和健康领域的专业人士共同努力,投入生产模型,帮助抗击疫情。
本文使用的所有代码都可以在我的 GitHub 上下载: covid19Xray 。
来自世界南方的问候!
我的下一篇文章再见!
谢谢你
马塞洛
用 Kydavra 遗传算法选择器将达尔文进化应用于特征选择
在与功能选择相关的问题上,aths 几乎总能给出很好的答案。然而,有时古老的暴力算法可以给游戏带来更好更实用的答案。
遗传算法是一系列受生物进化启发的算法,基本上使用循环——交叉、变异、尝试,根据评分标准开发最佳状态组合。所以,让我们来看看代码。
使用 Kydavra 库中的 GeneticAlgorithmSelector。
要安装 kydavra,只需在终端中写入以下命令:
pip install kydavra
现在,您可以导入选择器并将其应用于数据集,如下所示:
from kydavra import GeneticAlgorithmSelectorselector = GeneticAlgorithmSelector()new_columns = selector.select(model, df, ‘target’)
就像所有的 Kydavra 选择器一样。现在让我们在心脏病数据集上尝试一下。
import pandas as pddf = pd.read_csv(‘cleaned.csv’)
我强烈建议您在应用选择器之前对数据集进行洗牌,因为它使用了度量标准(目前 cross_val_score 还没有在这个选择器中实现)。
df = df.sample(frac=1).reset_index(drop=True)
现在我们可以应用我们的选择器。提到它有一些参数:
- nb_children (int,default = 4)算法将为下一代选择的最佳子代的数量。
- nb_generation (int,default = 200)将要创建的代数,技术上讲就是迭代次数。
- scoring _ metric(sk learn scoring metric,default = accuracy_score)用于选择最佳特征组合的度量分数。
- max (boolean,default=True)如果设置为 True,算法将选择得分最高的组合,如果设置为 False,将选择得分最低的组合。
但是现在,我们将使用除 scoring_metric 之外的基本设置,因为我们有一个疾病诊断的问题,所以最好使用 Precision 而不是 accuracy。
from kydavra import GeneticAlgorithmSelectorfrom sklearn.metrics import precision_scorefrom sklearn.ensemble import RandomForestClassifierselector = GeneticAlgorithmSelector(scoring_metric=precision_score)model = RandomForestClassifier()
所以现在让我们找到最好的特性。GAS(genetical gorithm selector 的简称)在选择特征、数据框本身以及目标列的名称的过程中需要一个 sklearn 模型进行训练:
selected_cols = selector.select(model, df, 'target')
现在我们来评估结果。在特征选择之前,随机森林的精度分数是-0.805。气体选择以下特性:
['age', 'sex', 'cp', 'fbs', 'restecg', 'exang', 'slope', 'thal']
这给出了下面的精度分数——0.823。这是一个好结果,要知道在大多数情况下,很难提高评分标准。
如果你想了解更多关于遗传算法的知识,在文章的底部有一些有用的链接。如果您尝试了 Kydavra,并有一些问题或反馈,请通过媒体与我联系,或者请填写此表格。
由西格蒙德用❤制成
有用的链接:
应用数据科学
弗兰基·查马基在 Unsplash 上拍摄的照片
地点、时间、原因和内容
你已经阅读了关于在大规模数据集上使用前沿人工智能改变世界的博客帖子。您已经看到了揭示 TensorFlow、Spark 和高级模型组合的复杂技术细节的文章。
但是一个通常不被关注的问题是如何将这些新奇的工具应用到日常生活中?或者仅仅是如何应用更普通的数据科学工具和概念?这篇博文试图展示一些可能的想法。
基础数据科学
在头条新闻和摇滚明星出现之前,有统计学家和数据分析师。数据已经在各行各业使用了几十年,但在最*五年左右,数据的数量和可用于利用数据的工具的数量都呈爆炸式增长。这有时会模糊如何以及在哪里应用数据科学。
在线课程和比赛通常不会遇到这个问题。通常会给你一个数据集和一个明确定义的问题来解决。但是,当你完成了一系列课程,学习了一长串概念和想法,却没有人告诉你该怎么做时,你该怎么办呢?答案很简单;四处看看,把你的鼻子伸进去,为你自己找到应用程序。
当你发现这些应用程序时,它们并不是你在新闻中读到的那些被大肆宣传的超级酷的东西。事实上,有时最*凡和简单的概念可以将现有的系统或过程变得更好。
因此,如果你发现自己在一家目前缺乏任何现代数据驱动专业知识的公司或学术部门工作,或者与缺乏一定程度数据素养的人一起工作,那么把像数据科学通才一样思考并在任何可能的地方应用你的技能视为你的工作。
这是我几年前发现自己处于的情况,下面是我利用数据科学为公司带来好处的 10 个例子。
示例 1 —实验室质量控制程序
工具/概念: 一介 t-test
有一天,我决定调查我们一个科学实验室的内部运作,看看他们是如何分析数据的。我发现了一个 Excel 文件,它被用来比较化学药品更换前后的批次测试结果。该方法是基本的,关注的是样本之间的个体百分比变化,以及一些关于什么构成通过/失败的任意规则。我写了一个简单的 R 脚本,用 t-test 代替,并在这个过程中注入了一些严谨性。这个脚本然后被版本控制并集成到正式的过程中。
示例 2——领导销售团队
工具/概念:&k-means 聚类
一个销售团队使用直觉和有限的、过时的、手工构建的数据来规划他们的日记。有一个基本的 CRM(客户关系管理)系统,但它没有连接到公司的会计软件。
我使用 R、Shiny 和 SQL 创建了一个仪表板,每天早上自动从会计软件中提取数据,对其进行预处理,并执行 RFM(最*、频率、货币价值)分析,然后进行聚类分析,以细分我们的客户群。然后,销售被绘制出来,每个客户都由 RFM 聚类进行颜色编码。该应用程序还允许生成报告。这为销售团队提供了最新的分析数据,他们可以用这些数据来协调他们的销售工作。该分析还被市场营销部门用来针对不同的客户群进行定制沟通。
示例 3 —异常值检测
工具/概念: 标准回归误差
一组科学家正在 GraphPad Prism 中执行 4PL 曲线拟合,并以主观方式手动移除异常值。在研究了评估这种拟合的最佳统计方法后,我发现了“回归的标准误差”。我在一个脚本中使用它来创建一些检测异常值的规则,使过程更加客观和可重复。
示例 4——数据清理
工具/概念: gsub (R)
一天,一位同事似乎完全厌倦了。我问他们出了什么问题,发现他们正在手动进行数据清理练习。他们拿到了一个很大的 Excel 电子表格,正在整理姓名、地址、邮政编码等。他们花了两天时间完成这项任务,但只完成了三分之一。不仅如此,预计未来几周还会有更多的数据。我花了大约一个小时写了一个 R 脚本来为他们做这件事,运行时间大约 10 秒。不用说,他们非常高兴!
例 5——实验设计
工具/概念: 统计力量
照片由this engineering RAEng在 Unsplash 上拍摄
实验正在进行,决策是基于非常不充分的样本数量。没有人听说过“权力”或其含义。为了避免浪费宝贵的时间和金钱,我编写了项目文档,要求在任何重要工作之前进行功耗计算。
我还召开了一次“午餐学习”会议,解释了新流程背后的概念和原因。
示例 6 —数据审计
工具/概念: 数据质量
该公司拥有大量面向数据的系统和流程,这些系统和流程已经发展了多年。人们来了又走,特别的规则产生了,指南写好了又丢掉了,事情变得杂乱无章,支离破碎,令人困惑。
我进行了一次数据审计,重点是数据质量,这导致了许多改进项目被确定和实施。
示例 7 —数据训练
工具/概念: 数据素养
我发现自己与大量非常聪明的人一起工作,他们都在生物化学和金融等领域受过良好的训练,经验丰富,但似乎都缺乏现代数据技能。我创建了一个工作室,遵循数据木工、系统,并以小组形式在线教授材料(在新冠肺炎封锁期间)。主题包括数据管理、电子表格最佳实践和 r 的介绍。
示例 8 —图像分类
工具/概念: keras
一位来访的合作者提到,他们认识一个拥有大量医学图像的人,他们正在从人工智能的角度研究他们可以做些什么。我要了这些文件(首先要有一个数据共享协议),并使用 keras 用 Python 建立了一个原型深度学习模型。我们设法得到了一些合理的结果,但不幸的是,数据质量不是很好。我们希望以后继续这项工作。
示例 9——可重复研究
工具/概念: R 笔记本
Excel 独占鳌头,因为它被用于大量的数据处理、分析、存储和通信。在几次数据混淆或丢失后,我开始在 R 笔记本上分析人们最关键的项目工作(特别是涉及第三方的项目),然后对外共享。这些为合作者提供了一个可重复且透明的工具,增强了他们对我们工作的信心。
例 10—常规监测
工具/概念: SQL 和闪亮
业务的多个领域要么没有受到监控,要么受到手动监控。例如,实验室日常工作的某些方面每个月都会被计算和查看。我开发了一系列闪亮的应用程序,自动整理、分析和可视化关键领域,为人们节省了大量时间和精力。有些甚至内置了规则,以突出相关工作人员可以进一步探讨的关切领域。
结束语
希望这些例子能让你思考如何将数据科学应用到你工作的公司或部门的某些领域。这不一定是什么大的,花哨的大型项目。它可以是一个简单的脚本,放在正确的地方,最终可能会节省一年数百个小时的工作时间,或者防止由于文件丢失或使用错误数据而导致的数据灾难。
你越是这样想,你就会发现越多的机会。很快,不仅你周围的组织的整体数据成熟度开始提高,而且你还会发现自己需要解决更多的问题。这是一个好问题!
将数据科学技能应用于您当前的角色—流程自动化
如何在提供实际价值的同时获得真实世界的体验
卡尔·海尔达尔在 Unsplash 上拍摄的照片
对于有抱负的数据科学家和数据分析师来说,在没有“真实世界”经验的情况下闯入这个领域可能会令人沮丧。在之前的文章中(这里和这里,我谈到了创造你的机会。你可能想看看你目前的工作,看看如何应用你的数据科学兴趣和技能。我想介绍一些项目,如流程自动化和文本分析,它们可能会帮助你在当前的职位上获得经验。在本文中,我将回顾过程自动化以及为什么您应该这样做。
业务流程自动化(BPA)
业务流程自动化( BPA )是任何简化工作场所流程并可能降低成本的流程。机器人过程自动化是 BPA 的一种,使用机器和人工智能技术。我们将从 BPA 开始。
自动化如何帮助您的团队
如果你的团队发现自己陷入了重复性的手工任务,BPA 就有机会了。如果你能减少非增值工作的数量,员工将会被解放出来从事其他有价值的项目。这种情况的一些例子包括:
- 每周,项目经理必须清理三个电子表格中的格式,计算 KPI,并将它们合并成一份报告。日期通常很乱,为什么会计总是大写每个单词?
- 每个月,一位经理都会创建一个包含部门 KPI 的电子表格,并将其加载到 Tableau 中,供其老板召开员工会议时使用。
- 每周三,数据分析师手动从不同的报告中提取数据,并将其加载到另一个数据库,如 Access 或 AWS。
- 每天早上,一名员工会提前到达,汇总前一天的客户来电数量。经理喜欢早上第一件事就是拿到它,所以如果需要保险,如果员工请假。
这些听起来熟悉吗?毫无疑问。机会就在你身边。
实施自动化如何帮助您
这和数据科学有什么关系?能够传输和格式化大量数据是工作的一部分。你花在重复性任务上的手工越少,你花在分析上的时间就越多。虽然这项技能本身不会让你在任何面试名单中名列前茅,但它是一项坚实的技能,可以让你的工作生活变得更好。它通常易于实现,并具有良好的投资回报(ROI)。
你能做什么
让我们回顾一下第一个示例任务。尽管有人工智能的浮华,大多数部门仍然有 excel 电子表格和重要数据。您可以编写脚本来系统地清理部门电子表格并将其合并。您可以安排在员工会议前每周运行一次,并通过电子邮件发送给经理进行审核。更好的一步可能是建立一个自动更新的 Tableau 报告。哪个经理会拒绝让他们最讨厌的任务自动化的提议?
新手级别的 python 脚本可以处理整个过程,直到 Tableau。你可以在一个下午就完成它,让你的努力冒着几个小时的风险。
网上有很多关于如何编写代码的教程。我的建议是保持代码简单并添加注释。
确保您测试了您的脚本,并让您的经理对其进行了验证!我希望我不必说,但最好把它放在那里。
提供价值证据(美元美元美元)
一旦你完成了自动化,计算投资回报率。根据每个全职员工的价值(FTE),每个公司的做法略有不同,所以你可能需要咨询你的经理或财务部门。你可以开始将你的技能转化为收入和储蓄。
有许多理由来计算您的工作所带来的节约。如果你能证明你正在解放你的团队去做更高优先级的任务,那么请求可能会变成更复杂的任务,挑战你的技能。你也可以在你的绩效评估和简历中使用这些计算出来的节省。
这是我创建的一个 ROI 示例。该定义来源于 Big Sky Associates 的博客。
ROI 计算示例—作者提供的图片
结论
自动化业务流程的机会无处不在。寻找一个低风险的过程开始。保持简单。测试一下。计算投资回报率。把这些放在一起,在你的公司建立你的自信和你的个人品牌。做数据科学不用等官衔。
申请 ML 职位?先看看这个
出现在 ML 面试中的候选人的基本期望
在对机器学习工程师的职位进行了大约 50 多次面试,并被许多人问及对该职位的期望后,我决定就此主题写一篇帖子。这不是我们要问的问题清单,也不是要准备的所有主题的综合清单。相反,根据我的经验,一篇关于通常导致 ML 候选人被选择/拒绝的主要因素的文章。直接进入主题。
你在简历中提到的事情:对你在简历中提到的项目/主题要彻底。我见过很多人在简历中提到他们从未做过的项目,让自己听起来印象深刻——事实是,这只会降低你被选中的几率。在项目下提到 ML/ DL 术语而不了解它们对你的机会没有帮助。
你可以提到像 PCA 或 KNN 这样非常基本的东西:但关键是要深入了解这些方法是如何工作的。使用了图书馆提供的工具/功能,却不知道它们有什么用途,这是一个明显的危险信号。
那么,如果申请 ML 角色,有几个必须知道的概念:
- 梯度下降
- 过度拟合/欠拟合
- 损失函数,优化器的基础(它们在梯度下降中的作用)
- 交叉验证,正规化
- 混淆矩阵
- 基础概率/统计和一些线性代数
- 特征清理/规范化/选择
- 一种或多种基本的机器学习或深度学习方法(无论你从事哪一种)
如果你在 NLP 工作过:
- 常见的 NLP 管道:词干分析器、词汇分析器、记号分析器、常见的单词矢量化方法。
如果你的工作很繁重:
- 分批加工
- 反向传播
- 损失函数,优化器
- 超参数,调整什么
- NN/ CNN/ RNN 的组件(无论你用哪个)
仅仅知道这些是不够的。但是如果你连这些基本的想法都不知道,很有可能你会在前几轮被拒绝。
不要虚张声势:没有人知道所有的概念,这完全没问题。你不需要知道所有的事情。大多数情况下,问题旨在引导你对主题了解的最大程度。面试官很快就知道你有多了解它。冗长的解释不会带来任何结果,只会损害你被选中的机会。
DL 工具包:真实地交流你用过的工具以及你对它们的熟悉程度。这为面试官设定了正确的期望水*,他们知道该问什么水*的问题。大多数 ML 角色都应该对这些有基本的了解。
Pandas/NumPy :如果你从事过 ML/ DL 项目,你不可能不接触这些基础库。不知道如何执行这些基本操作反映出你没有从事过涉及任何实际数据的项目。因此,了解它们的基本功能总是明智的。
此外,候选人应该对数据结构和算法有一些基本的了解,因为它们在项目中无处不在。
超出你分配任务的探索:了解该主题的最新趋势和更多背景知识(甚至是你没有在项目中直接使用的方法)表明你对该主题充满热情,并且已经超出了严格要求的基础知识。(例如:我本可以在我的项目中使用更快的 RCNN,但仍然对 Yolo 和 SSD 等方法有所了解)
了解一些关于你使用的数据集的逻辑:随着 DL 的出现,许多人只是使用现成的 ML 方法,而没有探索数据集。这导致候选人对数据集中的比例/要素一无所知。
奖励积分,如果:
- 你了解你所从事领域的最先进的方法,并探索了最*的趋势
- GitHub/Kaggle 上一些好的(甚至是小规模的)项目
- 你简洁地回答(是的!很少有人有这个技能)
- 了解线性代数概念
一些主要的危险信号(给感兴趣的读者)
- 使用 CNN 完成多项任务:不确定为什么它有一个脱落层/它有什么作用
- 我的论文是关于甘斯的吗:不确定他们用的损失函数是什么
- 虚张声势在 CNN 的 Conv 层卷积运算做什么
- 有 3 年的工作经验,但多年来只使用现成的工具,不知道它们是如何工作的。
- 改变参数 C 增加了精度,不知道 C 做什么
最后,你被拒绝也可能是因为公司在寻找有更多实践经验或一些研究背景的人。所以,如果你没有通过这一轮,没有必要气馁。
再来一个关于好资源的帖子,为后面的事情做准备。如果评论中有任何建议/问题,请告诉我,我会尽力回答。
祝你旅途一切顺利!
页(page 的缩写)不要在网上面试的时候用谷歌搜索。
应用机器学习预测 BYU 足球比赛的成功
使用详细的比赛数据帮助教练确定即将到来的最佳比赛叫牌——以获得的潜在码数衡量。
Claire Gentry 在 BYU 体育画廊拍摄的照片
你知道 BYU 上一次赢得对犹他的比赛是在 2009 年 11 月 28 日,那场比赛以 BYU 在 26-23 的加时赛中获胜而告终吗?BYU 已经有将* 11 年没有尝到战胜对手犹他爵士的滋味了!是什么让犹他的足球队比 BYU 好?是他们试图跑动或传球的次数吗?他们的进攻好还是防守好?为了提供关于为什么 BYU 输给犹他的洞察力,我们建立了一个机器学习模型来预测 BYU 在某些比赛时间场景中奔跑或传球获得的码数。我们相信,BYU 足球可以利用这种模式做出更好的比赛决策,从而提高进攻效率,赢得更多比赛。
大纲: -数据分析
-方法
-结果
- Web 应用
-下一步
-投稿
-总结
数据分析
数据源 我们的数据源是由 BYU 足球分析部门提供给我们的——它由 2015 年至 2019 年所有比赛的所有抢攻/传球比赛的结果组成。
该数据记录了关于每个重头戏的几个指标,如下所示:
- 码数增加——比赛增加/减少了多少码
- 距离-到下一个第一个向下的距离
- 离触地还有多少码
- PlayTextString —谁参与了该剧
- 向下,一半,得分差异…
数据清理 我们的项目特别关注 BYU 的进攻,所以我们过滤掉了记录 BYU 足球队防守打法的所有行,这样我们就剩下了大约一半的数据集。从那以后,我们删除了所有涉及踢门、射门、拦截等的战术。我们想特别关注传球和抢攻。
BYU 足球分析团队也有几个可供他们使用的计算功能,如 EPA(预期*均得分)和 WP,但由于我们的应用程序的预计动态使用,我们将它们从我们的数据集中删除。
我们还设计了其他特征,看看它们是否是码数增加的良好预测器(结果见下文):
- 比赛/比赛传球/冲刺次数——BYU 在比赛/比赛中传球/冲刺的次数(在模型中影响不大——不包括在内)。
- 自上次传球/冲刺以来的打法-为了考虑不同打法的惊喜因素,我们想看看在不同类型的几次连续打法之后切换打法是否与 yards _ gained 相关(模型中的影响很小-不包括)。
- 跑动*均传球/跑动码数——这是每个跑动/传球球员获得的跑动*均码数(包括模型中的大效应)。
理想情况下,这些指标将实时提供给 BYU,从而使 BYU 能够使用网络应用程序工具来帮助打电话。
调查结果 我们的探索性数据分析过程包括计算数据的原始相关性,并跨地区和年度进行比较。
BYU 足球按打法和区域获得的*均码数(2015 — 2019)
在左边,我们看到在每种情况下,通过传球获得的*均码数大于通过冲刺获得的*均码数。这是有道理的,因为传球比抢跑风险更高,回报更高。
然而,两者之间的差异在红区没有那么剧烈。这是有道理的,因为有更少的码来获得。此外,防守往往会把他们的努力踢到另一个水*,以防止进攻得分的机会。
作为这一发现的结果,我们决定建造两个独立的模型——一个用于狂奔,一个用于超车。传球和抢攻数据有很大的不同,因此我们想要分割数据,一次只预测一种打法。
BYU 足球的*均码数逐年下降(2015 — 2019)
这里我们看到第四下获得的码数是最低的(2015 年除外)。这是有道理的,因为大多数球队会在第四回合采取低风险、低回报的打法。
然而,所有下降之间存在显著差异,尤其是第三次下降。第三次进攻的*均码数比其他任何一次进攻都要高。这种发现表明我们需要将它包含在我们的模型中。点击这里查看我们其余的清洁/分析。
从我们的发现中,我们能够理解我们想要为我们的模型使用哪些度量,例如向下数、区域、到目标的码数等。
方法
我们首先将数据集中的每个特征和标签(增加的码数)之间的关系可视化。这有助于我们了解哪些特征在预测基于相关效应获得的码数时会产生很大影响。点击查看我们的初始模型。
获得的码数与目标码数之间的关系
通过我们对数据集的分析确认了这些初始关系,我们选择了与详细播放数据最相关的前 30 个特征,并开始在 python 中运行多元线性回归模型。这将有助于我们看到各种特征相互之间的综合影响,以及总的关系,或预测的强度,以及增加的码数。
我们开发了一个函数,该函数将遍历模型,并剔除标签上 t 值最低的特征。这允许我们不断选择具有最佳系数权重的最重要的特征,同时还调解我们的 R *方得分和调整后的 R *方得分之间的差异。这个迭代,可视化,通过剩余特征的数量绘制 R *方和调整的 R *方。
自动功能代码逐个功能迭代:
自动 MLR 迭代的功能
绘制 R *方和调整后的 R *方的变化
随着对模型分数影响很小或没有影响的特征被移除,R *方和经调整的 R *方彼此接*,并产生更好、更准确的模型。我们决定在我们的模型中使用大约 11-12 个特征,并审查它们以确保它们在考虑下一场比赛的数据时具有实际意义,以帮助教练进行决策。
这些特征是:
-防守等级
-当前击球的次数
-月份
-半场还剩 2 分钟不到
-倒球次数
-第一次倒球的距离
-当前在场上的区域位置
-目前在击球中获得的*均码数
-到球门的码数
-先前击球的区域
-先前获得的码数
有了这些指标,我们觉得我们可以预测下一场比赛的潜在码数。然而,为了创建一个更好、更准确的模型,我们想更进一步,分离出我们的数据集。
冲球和传球有明显不同的防守/进攻阵型,获得的码数不同(冲球通常比传球获得的码数少),以及各种其他不同的影响,这导致我们将数据分为传球数据集和冲球数据集。有了两个不同的模型,我们觉得我们可以用相同类型的数据对抢攻和传球进行分组,从而获得更好的预测。
结果
一旦数据被分离出来,我们就设计了与比赛类型更相关的特定特征:传球或抢攻。对于传球,我们增加了当前驱动中传球所获得的移动*均码数。我们还在游戏中添加了一个运行成功率。如果一个四分卫或某个接球手很抢手,那么这些指标会在数据中显示出来。
对于加急打法,我们增加了一个类似的功能,可以帮助计算当前驱动中加急打法的*均码数。准备好这些特性后,我们运行了两个特定于游戏类型的模型。
泰勒·理查森在 BYU 体育画廊拍摄的照片
传递模型结果
r *方:0.685
*均月收入:3.789
RMSE: 5.818
快速模型结果
r *方:0.615
*均误差:2.411
RMSE: 4.358
如上所示,由于*均超车码数和成功率的计算,超车模型的 R *方得分略高,而冲刺模型只有*均冲刺码数,以及其他特征,如距离、下降数等。
网络应用
有了模型,我们下一步开发了一个原型应用 ( BYU 分析),教练可能会在比赛中使用。本质上,该应用程序是一个简单的计算器,可以输入 down,distance,passing completion rate 等。这些输入被发送到一个实时的 Azure 机器学习 web 服务,该服务计算预测的码增益并将其发送回应用程序。点击访问我们的 Azure 通过和冲实验。
Azure 机器学习实验
这个应用程序是用 ReactJS 前端和 Django-Python 后端构建的,后者连接到 Azure cloud 中的 SQL Server 上托管的动态数据库。我们在 Azure 中制作我们的模型是为了方便访问,也是为了我们实现原型应用的速度。随着时间的推移,我们希望用 Python 创建我们的机器学习模型。
Python 方法获取用户输入,发送到 Azure,然后返回给用户
本质上,这个 app 是一个全栈的机器学习*台。输入从用户发送到后端,后端调用机器学习 web 服务。web 服务从我们托管的数据库导入数据,并向后端返回一个预测。然后,我们将输入和预测的总码数一起保存到数据库中,这样模型可以使用这些预测来重新训练和“学习”并随着时间的推移提高准确性和结果。然后将预测发送回用户,用户可以根据预测的码数值做出更好的决策。
冲击模型特征权重和重要性
在这款应用上,抢球预测和传球预测都有单独的输入表单。我们这样设计是为了让教练可以在视图之间来回切换,看看哪种打法效果更好。在我们的 GitHub repo 查看我们的其余代码。
后续步骤
如前所述,我们的应用程序目前是一个原型。但是,我们将概述我们希望采取的下一步措施,以使我们的应用程序成为一个更可行的游戏时间产品,教练可以使用它来帮助决策过程。
获取进攻/防守阵型的额外数据
目前,我们的数据只能通过衡量比赛对球场影响的比赛时间统计来帮助我们的模型准确性。我们需要更多的数据来解释球场上所有移动的棋子。我们相信,利用进攻和防守阵型数据,我们可以更好地解释防守失误和进攻成功,反之亦然。这将使我们预测码数增加的模型更上一层楼。
Web 应用程序用户界面
导入特定玩家的数据和统计
我们模型的另一个缺失部分是缺少球员在球场上的季节性统计和进步。了解特定跑锋在一个赛季中的总冲刺码数以及相同跑锋在一场比赛中获得的*均码数将有助于预测过程。特定球员的数据以及阵型数据将有助于提高我们模型的预测能力。
贡献
这个项目处于一个我们在体育分析领域还没有遇到过的独特空间。虽然许多球队目前正在分析 NFL 级别的数据,但我们认为大学足球的利基市场是一个开放的分析机会。
这个特定项目对大学足球分析领域知识的贡献是:
- 球场上每个区域获得的码数分析。与其他区域相比,“红区”(距离球门线 20 码或更少)每次比赛获得的码数最少。我们认为这是由于防守为了防止进攻得分机会而表现出的额外努力和强度。
- 开发基于逐场比赛数据的模型来预测获得的码数。虽然目前存在局限性,但教练可以使用这些模型在比赛发生前分析比赛的成功。这些模型也可以作为球迷参与的工具,让那些“看台上的教练”看到他们会做什么,并将他们的预测结果与进攻教练的实际行为进行比较。
- 预测码增益应用原型的开发。我们制作了一个现场应用程序来展示我们对一个工具的愿景,该工具可以在比赛时间供球迷和教练使用。点击查看这个工具。
- 在一次击球中获得的*均码数的高效效果是一个特点。在快速和快速模型中,该特征对模型的 R *方贡献最大。这表明,有更多的因素需要考虑,为什么*均码数在驾驶模型中增加得如此显著。如前所述,我们认为这种巨大的影响和系数权重可能掩盖了潜在的因素,如防守/进攻阵型以及预期的接收目标、四分卫和其他进攻球员。有了额外的数据,这种巨大的影响可以得到更好的解释,从而产生更准确的模型。
摘要
足球是一项极其复杂的运动,有大量的人为因素。通过使用机器学习和数据分析,我们已经表明,我们能够在合理的确定性水*内预测一场比赛的结果。这种学习也可以实时集成到一个易于使用的*台中。随着进一步的发展和更多的数据,模型的可信度可能会进一步提高。
我们希望基于我们的研究可以得出一个未来的模型,该模型可以推荐理想的下一场比赛,以最大化获得的码数。这种工具可以在比赛中实时使用,或者由教练在过去的比赛回顾中使用,以更好地改进他们的团队策略。游戏分析师和爱好者也可以使用这样的工具来分析球队和球员的表现,以做出投资或幻想体育决策。
最终,我们对我们能够取得的研究和成果感到满意。通过对 BYU 比赛的分析,我们能够最大限度地减少足球比赛中的人为因素和复杂性。有些领域需要改进和进一步发展,我们希望看到以后由我们自己或其他数据科学家来进行。
组
喜欢你看到的吗?联系我们获取更多信息!请在下面评论您的反馈和建议。
我们的团队:BYU 信息系统项目的在校学生
将主成分分析应用于收益率曲线——困难重重
了解如何使用 python 中的当前金融数据应用主成分分析的最流行的应用程序之一。
资料来源:Diaa Noureldin,研究之门。
收益率曲线是一条线,它描绘了信用质量相同、期限不同的债券的各种利率。据说政府债券的违约风险可以忽略不计,因为政府可以简单地借更多的钱来偿还债务。根据利率预期理论,收益率曲线由两个方面组成:
1.对未来短期利率的*均市场预期。
2.期限溢价——投资者因持有长期债券而获得的额外补偿。这本质上是因为金钱的时间价值——100 英镑今天的价值大于明天的价值,因为它有潜在的盈利能力。因此,为了让固定收益投资物有所值,投资者必须拿出他们的现金,债券发行人必须向投资者支付一些额外的金额。
我们可以使用主成分分解来模拟收益率曲线的这些方面。数据有两个主要属性:噪声和信号。主成分分析旨在提取信号并降低数据集的维数;通过找到最少数量的变量来解释最大比例的数据。它通过将数据从相关性/协方差矩阵转换到一个维度更少的子空间来实现这一点,其中所有解释变量都是相互正交的,即不存在多重共线性(注意:这些是统计属性,不一定有经济解释)。
在本次分析中,我将使用从 0.5 年到 10 年到期的各种英国政府债券即期利率(由英格兰银行提供),看看我们是否可以模拟收益率曲线及其斜率。在寻找收益率曲线的主要成分时,计量经济学家持有的主要理论是:
PC1 =常数≈长期利率≈ R*
PC2 =斜率≈期限溢价
PC3 :曲率
scikit 中有一个函数——学习执行 PCA,但是,为了更好地理解它,让我们手动执行(实际上并没有那么难)!
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np# Import Bank of England spot curve data from excel
df = pd.read_excel("GLC Nominal month end data_1970 to 2015.xlsx",
index_col=0, header=3, dtypes = "float64", sheet_name="4\. spot curve", skiprows=[4])# Select all of the data up to 10 years
df = df.iloc[:,0:20]df.head()
在导入所需的相关模块后,从英格兰银行导入现货曲线数据,我们可以在数据框中看到,由于数据缺失,有一些 nan 值。我们可以放弃这些,因为它们不会对分析产生很大影响。
英格兰银行现货曲线数据。来源:英格兰银行。
下一步是将数据标准化为 z 分数,假设*均值为 0,方差为 1。我们可以通过使用以下公式来做到这一点:
然后,我们使用 numpy 从标准化数据中形成一个协方差矩阵。虽然相关矩阵在金融中更常用,但由于我们的数据是标准化的,相关矩阵和协方差矩阵实际上会产生相同的结果。这是因为相关矩阵只是一个标准化的协方差矩阵。
然后,我们可以使用 numpy 的 linalg.eig 包从矩阵中创建特征值和特征向量。这在我们的标准化数据上执行特征分解。特征值是在 np.linalg.eig 中应用的线性变换的标量。我们可以使用特征值来找到总方差的比例,每个主分量使用以下公式解释:
# Perform eigendecompositioneigenvalues, eigenvectors = np.linalg.eig(corr_matrix_array)# Put data into a DataFrame
df_eigval = pd.DataFrame({"Eigenvalues":eigenvalues}, index=range(1,21))
# Work out explained proportion
df_eigval["Explained proportion"] = df_eigval["Eigenvalues"] / np.sum(df_eigval["Eigenvalues"])#Format as percentage
df_eigval.style.format({"Explained proportion": "{:.2%}"})
特征值的数据帧。每个主成分一个特征值。
特征向量是这些线性变换的系数,保持方向不变。这个图表和等式应该有助于直观地解释这个概念:
对象被变换,但是向量的方向保持不变。来源:视觉假人
为了形成主成分的时间序列,我们只需要计算特征向量和标准化数据之间的点积。
principal_components = df_std.dot(eigenvectors)
principal_components.head()
主成分时间序列的提取
当我们绘制第一个主成分时,我们可以看到它与实际的 10 年期收益率曲线非常相似。这是有意义的,因为根据我们的特征值,第一主成分解释了 98%的数据。
第二个主成分代表斜率——这应该与实际收益率曲线的斜率相关。计算斜率的一种方法是 10 年期现货利率减去 2 年期现货利率。
df_s = pd.DataFrame(data = df)
df_s = df_s[[2,10]]
df_s["slope"] = df_s[10] - df_s[2]
df_s.head()
即期利率,其中斜率= 10 年期减去 2 年期即期利率。
简单地从视觉上看,我们可以看到斜率看起来几乎与我们的第二主成分相同。让我们用一个相关性来验证:
np.corrcoef(principal_components[1], df_s[“slope”])array([[1\. , 0.95856134],
[0.95856134, 1\. ]])
当运行第二主成分和收益率曲线的 10Y-2M 斜率之间的相关性时,0.96 的高相关性向我们表明,第二主成分实际上代表了斜率!
感谢阅读! 如果你有什么见解,请不吝赐教。包含我用来做这个项目的源代码的完整 Jupyter 笔记本可以在我的 Github 资源库 中找到。
参考资料:
[1]亚历山大·卡罗尔(2008)。市场风险分析二、实用金融计量经济学。
[2]阿多戈,费利克斯·阿坦加等人,2018 年。宏观经济指标的主成分和因子分析。可在:https://pdfs . semantic scholar . org/8736/5855217 edbb 53 e 5e 29 c 5872 db 7 efb 907 cc . pdf
免责声明:本文表达的所有观点均为本人观点, 与 和先锋或任何其他金融实体没有任何关联。我不是一个交易者,也没有用本文中的方法赚钱。这不是财务建议。
将时间序列分析应用于医疗保健
奥莱利的见解
使用最先进的模型来研究流感数据
编者按: 时间序列预测有很多应用,但今年,健康可能是最重要的应用领域之一。在这篇文章中,Aileen Nielsen 研究了政府机构和学者如何使用最先进的流感建模技术。
比尔·牛津在 Unsplash 上的照片
疾病预防控制中心积极鼓励研究人员致力于预测流感,甚至赞助一个 R 包,使其数据随时可用。五年多来,CDC 还赞助了流感预测比赛,尽管只是在 2017-2018 流感季节,它才真正将流感预测纳入其官方通信和公告中。迄今为止,卡内基梅隆大学的德尔福研究小组赢得了大多数比赛,该小组用他们描述的三种不同的努力来预测流感:
一种经验贝叶斯方法,该方法通过一系列操作应用过去流感季节的数据,根据过去流感季节时间序列的整体“形状”形成当前季节数据的先验
欢迎任何人提交流感发病率预测的众包*台
一种临*预报方法,使用传感器融合,从许多来源(如维基百科访问计数和相关的 Twitter 查询)聚合数据,以产生地理上本地化的流感预测
这是仅在一个学术研究小组中使用的一套不同的方法!如果我们把目光投向更远的学术界,我们会看到更多的多样性:
使用深度卷积网络(CNN)对 Instagram 图片进行分类,并使用这些 CNN 的输出以及来自 Twitter 的文本相关特征作为各种机器学习模型的输入,包括 XGBoost 树。其中一份论文的优势在于关注一个小的语言群体(芬兰语使用者),这使得主流社交媒体*台的使用方式仍然可以针对特定区域。
在大型社交媒体集群中识别可靠用户。一篇论文专注于通过在社交媒体*台上找到最合适和最值得信赖的用户来提高流感预测。
访问电子健康记录,以获得除公开可用数据之外的更完整和补充性的数据源。一篇论文显示,通过将电子健康记录整合到预测输入流中,可以在多个时间尺度上获得极大的预测准确性收益。不幸的是,这很难安排,这表明准确的流感预测能力将属于富裕的数据持有者,而不是最具创造力的研究人员(当然,有时这些人可能是同一个人)。
正如我们从解决这个问题的方法的多样性中所看到的,有许多途径可以进行流感预测,但没有一个是最终的赢家。这仍然是一个积极研究和发展的领域,尽管一些更好的战略已经应用于政府使用和公共信息。
我们这里的讨论只是冰山一角。有很多生物学、社会学、医学和经济政策参与决定流感季节的进程,并且有各种各样的模型较少面向时间序列分析,而更多地面向流感行为的其他方面。时间序列为一个非常复杂的主题带来了丰富的视角。
学得更快。深入挖掘。看得更远。
加入奥莱利在线学习*台。立即获得免费试用,随时找到答案,或者掌握一些新的有用的东西。
O'Reilly Media on Medium 是一个由 O'Reilly 编辑策划的空间,提供关于技术的建议、见解、观点和经验。
艾琳·尼尔森(Aileen Nielsen)曾在公司法、物理研究实验室工作过,最*还在纽约的多家科技初创公司工作过。她的兴趣范围从防御性软件工程到减少认知负荷的 UX 设计,再到法律和技术之间的相互作用。Aileen 目前在纽约市的一家早期创业公司工作,该公司与时间序列数据和神经网络有关。她还担任纽约市律师协会科学和法律委员会的主席,该委员会专注于如何监管科学和计算的最新发展,以及这些发展如何为现有的法律实践提供信息。不久前,Aileen 在移动医疗*台 One Drop 工作,并参与了希拉里·克林顿的总统竞选。她经常在技术和社会学主题的机器学习会议上发言。她拥有普林斯顿大学的学士学位,并且是哥伦比亚大学应用物理学的学士学位。
学习 Python 的方法
https://unsplash.com/@sinileunen
今天如何最大限度地学习 python
从书籍、教程、视频中学习 python 的方法数不胜数。我想分享你应该如何看待 python,以及如何从它身上实现你想要的东西。
首先,我们从 python 是什么不是什么,为什么 python 值得学习开始。
Python 是什么?
Python 是一种面向对象的脚本语言。这听起来有点拗口,但这意味着 python 是基于对象的思想工作的。一个对象仅仅是一些带有值的内存片段,这些值有与之相关的操作。
python 的主要优势在于它是一种简洁的语言,与其他语言相比更容易阅读。Python 的学习曲线很短,这意味着对于初学者来说,这是一门非常棒的语言。你所做的编码比其他语言要短得多,这是因为有很多内置的对象使你更容易编程。
Python 如此吸引人的地方在于这种语言的通用性,这都归功于它对大量第三方包的支持。它在数据处理和机器学习方面很重要,用于金融和生物学。不同领域的公司都将使用 python。
python 的另一个优势是它与 Java 和 c 不同,它是编程范式不可知的。这意味着你可以用任何你喜欢的方式编程,尽管它是面向目标的编程。Python 与 Java 和 C 集成得很好,因此它被称为一种胶合语言。
Python 在创业社区中广受欢迎,因为开发一个最小的可行产品需要几天到几周的时间,而不是几周到几个月。既然我们已经谈了优点,我们也应该了解一些缺点。
【https://unsplash.com/@zbauman22 号
python 的局限性
如果你被迫说出一个限制的话,那就是当程序变得更复杂时,python 开始运行缓慢。我不会去探究为什么有一些关于这方面的很棒的资源,请在这里看,在这里看这个最*的 PyCon 视频。
python 的另一个缺点是它没有很好的移动应用程序开发,所以对于那些对移动应用程序开发感兴趣的人来说,可以看看 Javascript 之类的东西。
python 中内置的另一件事是它是动态类型的,这意味着 python 只在你运行脚本时解释 Python 脚本。这意味着只有当您运行脚本时才会出现错误,因为 python 是在您的代码行中运行的。所以在得到一个工作脚本之前,你可以运行脚本很多次。野兽的本性,但你应该知道走进去。
有效编程的技巧
- 如果可能的话,每天编码。如果不行的话,一周至少 3 次。你需要在编程时保持一致。这种东西对你的大脑来说是陌生的,直到它不再需要重复,一遍又一遍。如果你不投入,就无法成长。这可能是一颗难以下咽的药丸。是给我的。你通常甚至可以抽出 5 分钟来编写代码或思考 python 问题。
- 现在就开始考虑项目。想想让你烦恼的事情,这是开始一个小项目的好方法。所以现在就开始思考吧。
- 警惕资源太多。编程的另一个重要方面是有多少种类型的资源。挑几个坚持下去,尽量不要太动心,坚持读下去,读下去。
- 要特别注意视频课程。这是最简单的让编程变被动的方法。编程不是被动的。你必须积极地对待它,否则,你学不会。让视频中的人替你理解太有吸引力了。你在看完一段视频后试图这么做,但你不能…这是被动信息。当你学习的时候,尽量少用这些资源。
- 尽快离开训练轮。太多人执着于教程、视频和书籍。不要把它们当拐杖用。它们仅仅是工具,就这样看待它们吧。这又回到了关于项目的问题上。项目让你开始需要得到这些资源不能给你的答案。它也让你在编程中扮演积极的角色。
- 如果你在项目中使用书籍、教程、视频。你需要能够说服自己理解代码行。你应该认真考虑一旦完成一个项目,就一行一行地记住它。重复,直到你能凭记忆做到。这就是你应该如何使用教程/书籍。但请记住,这只是旅程的开始。记忆不是目标。你需要理解它,然后你需要能够把它应用到其他地方。这需要时间,但如果你不理解代码,你永远不会应用它。反复阅读代码,以便能够通过回忆将它打出来,这也将有助于了解你是否理解代码。如果你不明白,停下来,开始寻找答案。
- 谷歌是你的朋友,尽早开始使用它。在寻求帮助之前,你需要坚韧不拔地自己找出答案。每个开发者都要奋斗,奋斗就是你如何成长。一开始你会用谷歌搜索一些无聊的东西,然后你开始不得不用谷歌搜索一些书籍/教程无法给你的东西。这对于开发人员来说是必不可少的。
- 使用 Stackoverflow,习惯你的问题答案会在这个网站上的事实。你还会发现一个问题有多种解决方案。有些人比其他人更聪明。光是读这些,你就会收获良多。一些你以前从未考虑过的事情,但是你也会看到其他开发人员批评其他人的代码。你会开始看到编程的灰色。正如他们所说,剥猫皮的方法不止一种。
- 做 python 题。Python Morsels 是一个很好的网站。你需要开动脑筋。每周的问题都很深刻,资源可以帮助你解决问题。您将了解到以前从未考虑过的代码重构和技术。把这一点运用到你的日常实践中,你会得到回报。
- 重复已经做过的事情是有价值的。编程中的过程也很重要,不仅仅是新事物。
- 考虑看看别人的代码,你会学到你不会考虑到的东西。Github 有大量的程序可供选择。
- 一旦你开始应用 python 中的概念,你就会开始思考更高层次的问题。那是正确的数据结构吗,有更好的方法吗?为什么这么慢?我怎样才能让它更快呢?当你第一次开始使用 python 时,这些问题并不是必须的,但是一旦你开始掌握 python,这些问题是值得探究的。
https://unsplash.com/@kencheungphoto
Python 资源
有大量的 python 资源,在这里我将列出一些我认为值得你花时间的网站、书籍和时事通讯。
书
有很多,太多了。对于初学者来说,我推荐两个,因为它们侧重于应用。
初学者 :
Python 速成班 —基于项目的学习 Python 的方式。这是你想用的书的风格。
自动化枯燥的东西——另一本伟大的书。它一开始给你一些基础知识,然后这本书的其余部分是编写程序来自动化你的生活。处理 pdf,excel 电子表格等。唯一的问题是,如果这不能吸引你,那么你不会从中学习。快速浏览内容,看看是否有。如果是这样的话,还有很多东西要学。
中级 :
在这个营地里有两种类型的书。关于语言掌握和应用的书。当你掌握 python 的基础知识时,有大量的东西需要探索。关于语言掌握的书籍将开始让你接触到可以让你从初学者过渡到中级的想法。
我不会对应用程序说话,因为这很大程度上取决于个人,但要知道这些书确实存在。如果您确实需要特定于应用程序的资源,请与我联系。
语言掌握
这些书都是比较蘸书的。一页一页地读这些书很难,但会对你有好处。
Python 窍门 —这是一本简明的书,内容与下面两本书非常相似。更容易打通,更适用。
有效的 Python——一本关于利用你所知道的并加以改进的好书。这本书将向你展示初级书不会展示的 python 幕后。
流畅的 Python——类似于徒劳的有效的 Python,它教你在初学者的书里找不到的东西。会提升你正在做的任何编程。
自学的程序员——这是为了成为一名真正的开发者,将数据结构和算法视为解决问题的方式,而不是编码。这也是开始思考编程的方式。计算机科学学位在数据结构/算法方面很重要,这将会介绍。
Python Pro的实践——当你开始考虑如何扩展 Python 脚本时,就从带有导入模块的脚本开始吧。你将需要上面的一些技术来创建包含许多部分的完整的程序。这本书将带你从中级/初级开始思考程序的扩展。
网站
- www.realpython.com——从基础到高级,非常清晰的解释,写得很好的教程。定期更新。免费的书面和视频,但也为内容付费。
- www.fullstack.com——如果你想从事网络开发,这将帮助你绘制出一张通往那里的地图。塞满资源会让人不知所措。
- www.medium.com——许多关于 python 的教程可能会让人不知所措,但是一旦你习惯了这种语言,一点点有用的见解也是可以的。
时事通讯
- Awesome Python 提供了新的和现有教程的另一个可靠选择,以及广泛的问题存档和以前的资源链接。
- HackerNews 最新技术的每周综述,不是专门针对 python 的,而是各种各样的主题和链接,值得一读!
- Python Weekly 是一个免费的每周综述,包含最新的 Python 文章、视频、项目和即将举办的活动。
- PyCoders Weeky 是另一个类似于 Python Weekly 的免费电子邮件时事通讯。最好的资源通常都包含在两个时事通讯中,但它们通常包含来自网络的不同文章和项目。
正如我之前说过的,我们很容易被外面的世界所淹没。首先,保持一致,专注于一些资源。一旦你开始抓住它,你就可以开始拓展。
你可能喜欢的其他文章
Python 是一种直观的语言,有很多资源可以帮助你掌握这门语言的基础知识。一旦…
medium.com](https://medium.com/analytics-vidhya/using-the-zip-function-in-python-part-1-c658219df52d) [## 如何使用 Python 下载文件
了解如何使用 Python 下载 web 抓取项目中的文件
towardsdatascience.com](/how-to-download-files-using-python-ffbca63beb5c)
请看这里关于我在我的博客和其他帖子上关于项目的更多细节。更多技术/编码相关内容,请点击这里订阅我的简讯。
我将非常感谢任何评论,或者如果你想与 python 合作或需要帮助,请联系我。如果你想和我联系,请在这里联系。
用不到 50 行代码解决 AIcrowd 的第一个问题!
在这篇文章中,我将说明如何解决一个核心的计算机视觉问题,即所谓的语义分割。简单地说,语义分割的目标是根据图像中显示的内容,简单地将给定图像中的每个像素分类到特定的类别。
LNDST 是语义分割的经典例子,可以使用[CNN](/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53#:~:text=A%20Convolutional%20Neural%20Network%20(ConvNet,differentiate%20one%20from%20the%20other.)解决。Landsat 数据集由 400x400 RGB 卫星图像组成,这些图像取自 Landsat 8 号卫星。在每个图像中,可以有水和背景。我们的分类器应该将每个像素预测为0 - background
或1 - water
。排名的标准是F1/骰子得分。
我们将使用 FastAI v1 来解决这个问题。FastAI 是一个流行的包装器,它与 PyTorch 框架协同工作。我选择 FastAI 来解决这个问题,因为它提供了几个特性,比如学习率查找器、可以用几行代码创建的数据加载器,以及其他几个好东西。确保您已经下载了数据集,并将其提取到名为 data 的文件夹中。我们开始吧!
from fastai.vision import *
上面一行导入了 FastAI 的视觉模块。
path = Path('data')
path_img = path/'train_images'
path_lbl = path/'train_gt'img_names = get_image_files(path_img)
lbl_names = get_image_files(path_lbl)
img_names 和 lbl_names 是包含训练图像及其各自遮罩的列表。
# Batch Size
bs = 8# Labels
labels = ['background', 'water']# Mapping fuction mapping x names and y names
def get_y_fn(x):
dest = x.name.split('.')[0] + '.png'\
return path_lbl/destsrc = (SegmentationItemList.from_folder(path_img)
# Load in x data from folder
.split_by_rand_pct()
# Split data into training and validation set
.label_from_func(get_y_fn, classes=labels)
# Label data using the get_y_fn function
)# Define our image augmentations
tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)data = (src.transform(tfms, size=400, tfm_y=True)
# Augments the images and the mask
.databunch(bs=bs)
# Create a databunch
.normalize(imagenet_stats)
# Normalize for imagenet mean and std
)
上面的代码创建了一个 ImageDataBunch 对象,它处理数据处理的所有方面,比如预处理、扩充、分割成训练集和验证集等等。现在让我们来看一看我们的一小批数据。
data.show_batch(8, figsize=(10,10))
这是在应用旋转、翻转等随机变换后的随机小批量。
现在我们的数据已经准备好了,让我们创建一个模型并训练它。有几种架构可用于解决细分任务,如 U-Net、FPN、DeepLabV3 和 PSPNet。我们将在本文中使用 U-Net。
# Pretrained Encoder
encoder = models.resnet34learn = unet_learner(data, encoder, metrics=dice)
FastAI 的 unet_learner 方法创建了一个 Learner 类的实例。学员班处理完整的培训循环并打印指定的指标。该方法特别使用给定的编码器构建了一个类似 U-Net 的架构,并只为编码器部分加载 imagenet 预训练权重。如果你不确定 U 网是如何工作的,看看这篇文章。请注意,我们将骰子作为一个度量来传递,这将让我们了解我们的模型在测试集上的表现。
learn.lr_find()
learn.recorder.plot()
这个图表给了我们一个最佳学习率的概念。根据 FastAI 的说法,最佳学习率应该是图中最陡的向下斜率,在该斜率处,损失快速下滑至最小值。在这种情况下,它可以是 1e-5 左右的任何值。
# Fit the model
learn.fit_one_cycle(10, 1e-5)
现在,我们以 1e-5 的最大学习速率运行 10 个纪元。FastAI 使用一个周期策略进行学习率调度,这在本文中提到过。该初始训练仅更新解码器的参数,保留预训练编码器的权重。一旦我们的模型训练得足够好,我们也可以解冻编码器,并训练更多的编码器。
# Unfreeze and train some more
learn.unfreeze()
learn.fit_one_cycle(10, slice(1e-6, 1e-5))
现在,我们用有区别的学习速率训练更多的时期,其中较早的层用较低的最大学习速率训练,并且学习速率对于随后的层组增加。现在我们的模型已经训练好了,我们将直观地检查模型是否工作正常。
learn.show_results(rows=3, figsize=(10,10))
现在一切都设置好了,我们可以在测试集上运行推理并提交了!
from glob import glob
lst = sorted(glob('.data/test_images/*') , key=lambda x: int(x.split('_')[-1].split('.')[0]))main_array = []for i in lst:
# Open image
img = open_image(i)
mask = learn.predict(img)[0] # Convert torch tensor to numpy array
mask = mask.data.numpy() # Flatten the array
mask = mask.flatten()
main_array.append(mask)main_array = np.asarray(main_array)
main_array_flat = np.reshape(main_array,(-1)).astype(np.uint8)with open('submission.npy', 'wb') as f:
np.save(f,main_array_flat)
上面的代码在测试集上运行推理,并创建一个可以提交到 AIcrowd 网站的提交文件。
结论
这绝对不是可能让你在排行榜上获得最佳成绩的完整解决方案。但这绝对是一个很好的起点,人们可以在此基础上开发他们的解决方案。对上述解决方案的一些改进可以是进行交叉验证、集成、测试时间增加、检查除交叉熵损失之外的不同损失函数,等等。最后,我想祝贺 AIcrowd 的团队创造了这个精彩的*台,举办了这场令人敬畏的短时间闪电战比赛,这无疑鼓励了初学者步入机器学习的世界。
用基于树的模型处理时间序列
预测未来—通用数据转换和特征工程基础
在这篇文章中,我将展示如何用机器学习模型处理时间序列预测问题的一般方法。我在这里使用基于树的模型 LightGBM 作为例子,但实际上它可以是几乎任何经典的机器学习模型,包括线性回归或其他一些模型。我将介绍所需的数据转换、基本的特性工程和建模本身。
时间序列问题介绍
时间序列基本上是已知时间点的值的列表。一些例子:商店的每日购买量、网站访问者的每日数量、每小时的温度测量等。数据点之间的间隔通常是固定的,但这不是强制性要求。而我们要解决的一个时间序列的问题,就是预测未来各点的值。
有许多专门的方法来解决这个问题。指数*滑,特殊模型如 ARIMA,先知,当然还有神经网络(RNN,LSTM),等等。但是在本文中,我将重点介绍使用通用的基于树的模型进行时间序列预测。
现成的树模型不支持对原始数据进行时间序列预测。因此,必须首先以特殊方式对数据进行预处理,并生成相应的特征。
典型的原始时间序列数据如下所示。
每个时间序列步长都有一个值。在这个特定的例子中,这个步骤是一天,但是它可以是一个小时、一个月或者任何其他时间间隔。我们有一些过去的已知训练数据(上图中的蓝色)。我们有未知的未来数据要预测(例子中的黄色)。
数据转换
对于基于树的模型,我们需要许多带有目标值的训练样本,但这里只有一条带有时间序列数据的长线。为了使其可用,让我们对其进行转换,遍历所有值,将每个值作为一个样本的目标,将之前的数据点作为训练数据,如下图所示。
数据转换可视化(由作者创建)
不要将未来的数据点作为训练数据,这一点非常重要,否则将会出现数据泄漏,模型在未来数据上的表现将会很差。参考示例 Python 代码:
SIZE = 60 #we take 2 past months here for each time-series point
COLUMNS = ['t{}'.format(x) for x in range(SIZE)] + ['target']df_train = []
for i in range(SIZE, df.shape[0]):
df_train.append(df.loc[i-SIZE:i, 'value'].tolist())
df_train = pd.DataFrame(df_train, columns=COLUMNS)
这样,我们将长度为 N 的时间序列数据线转换成一个具有( N-M) 行和 M 列的数据帧(表)。其中 M 是我们为每个训练样本选择的过去数据点的长度(在上面的例子中,60 个点= 2 个月)。数据表现在看起来如下:
基本上,现在它已经是一种格式,任何经典模型都可以将其作为输入,并为目标变量(时间序列的下一个数据点)生成预测。然而,在像这样的原始数据上,基于树的模型将不能获得好的结果。有必要做出特殊的特征,允许树模型捕捉时间序列的不同组成部分,如趋势和季节性。
时间序列组件
为了更好地理解我们需要什么特性,让我们记住时间序列数据的主要组成部分:
- 基准水*:这是时间序列数据的*均值
- 趋势:这是基准面随时间的变化
- 季节性:这些是在一段时间内(周、月、年)重复的周期性变化
- 剩余部分:这是其他 3 个组件没有涵盖的所有内容。其余部分可能由可预测部分(当变化由一些外部不规则事件触发时,我们可以在我们的模型中观察和使用)和不可预测部分(基本上只是噪音或由我们无法访问的事件触发的变化)组成。
让我们进一步尝试捕获可用于我们基于树的模型的特征中的前三个时间序列成分。
特征工程
我们将以基于窗口的方法创建特征,一次查看 N 个连续的数据点。第一个最简单的情况是窗口大小为 1。这仅仅意味着我们取每个样本的最后一个值或可用的训练数据,它是正好在目标值之前的数据点。仅仅用一个值我们做不了什么,所以让我们按原样把它作为一个特性添加进来。这是一个很好的特性,因为这是最*已知的数据点。缺点是这个功能会很吵。
df_feats['prev_1'] = df_train.iloc[:,-2] #Here -2 as -1 is a target
接下来,我们取窗口大小 2,在目标之前有 2 个最*的数据点。然后窗口大小为 3,以此类推。示例代码片段:
for win in [2, 3, 5, 7, 10, 14, 21, 28, 56]:
tmp = df_train.iloc[:,-1-win:-1] #General statistics for base level
df_feats['mean_prev_{}'.format(win)] = tmp.mean(axis=1)
df_feats['median_prev_{}'.format(win)] = tmp.median(axis=1)
df_feats['min_prev_{}'.format(win)] = tmp.min(axis=1)
df_feats['max_prev_{}'.format(win)] = tmp.max(axis=1)
df_feats['std_prev_{}'.format(win)] = tmp.std(axis=1) #Capturing trend
df_feats['mean_ewm_prev_{}'.format(win)] =
tmp.T.ewm(com=9.5).mean().T.mean(axis=1)
df_feats['last_ewm_prev_{}'.format(win)] =
tmp.T.ewm(com=9.5).mean().T.iloc[:,-1]
df_feats['avg_diff_{}'.format(win)] =
(tmp - tmp.shift(1, axis=1)).mean(axis=1)
df_feats['avg_div_{}'.format(win)] =
(tmp / tmp.shift(1, axis=1)).mean(axis=1)
让我们看一下代码。第一行定义使用的窗口大小。接下来,对于每个窗口大小,我们用当前窗口中选定的数据点创建临时变量tmp
。该变量稍后用于创建所有特征。
基层综合统计
前 5 个特征是一般统计数据-*均值、中值、最小值、最大值和标准差。这种特征将有助于确定不同窗口大小的时间序列的基准水*。根据时间序列的特征,一些窗口大小可能更重要。例如:
- 对于有噪声的数据,间隔越大越好,因为它们不会受到噪声太大的影响;
- 对于具有尖锐趋势的数据,较小的间隔可能更好,因为它们将更好地捕捉最新趋势。
使用什么样的窗口大小并不总是显而易见的,所以包含几个窗口大小并让模型自己选择是明智的。
捕捉趋势
接下来的两行定义了指数加权*均(EWM)* 特征。加权*均值不同于简单*均值,它对最*的数据点赋予更大的权重,以便更好地捕捉趋势。*
最后两个特征也有助于捕捉趋势,它们计算两个后续数据点的*均差异。这允许评估数据变化的速度和方向。
与之前的要素组一样,窗口大小对于趋势要素也很重要。小窗口将能够捕捉快速变化的短期趋势。然而,存在捕获噪声的风险。
还有许多其他特征有助于预测趋势。一些想法值得一提:
- 计算数据点之间差异的加权*均值(对更*的数据点的趋势给予更大的影响);
- 获取点之间差异的最小值、最大值、标准值和其他统计数据。
- 计算每两个后续数据点的斜率,并对其进行*均或其他统计;
- 更多。
季节性特征
到目前为止,我们只为时间序列的前两个部分——基值和趋势——生成特征。季节性呢?这个组件也有一些特殊的功能。请考虑下面的代码示例:
*for win in [2, 3, 4, 8]:
tmp = df_train.iloc[:,-1-win*7:-1:7] #7 for week #Features for weekly seasonality
df_feats[‘week_mean_prev_{}’.format(win)] = tmp.mean(axis=1)
df_feats[‘week_median_prev_{}’.format(win)] = tmp.median(axis=1)
df_feats[‘week_min_prev_{}’.format(win)] = tmp.min(axis=1)
df_feats[‘week_max_prev_{}’.format(win)] = tmp.max(axis=1)
df_feats[‘week_std_prev_{}’.format(win)] = tmp.std(axis=1)*
请注意,本例中的tmp
变量只取第 7 个值,因此它只包含与目标变量相同工作日的数据。通过这种方式,我们计算特定于给定工作日的统计特征。如果给定的时间序列有很强的周季节性成分,这种特征将非常重要。
建模
我们现在已经准备了基本特征,准备用于基于树的机器学习模型。下面以 LightGBM 模型为例,提供建模代码供参考:
*import lightgbm as lgb
params = {
'objective': 'regression',
'metric': 'mae',
'boosting': 'gbdt',
'learning_rate': 0.06,
'num_leaves': 64,
'bagging_fraction': 0.9,
'feature_fraction': 0.9
}
x_train = lgb.Dataset(df_feats, df_train['target'])
model = lgb.train(params, x_train, num_boost_round=500)
preds = model.predict(df_feats_validation)*
首先,我们导入 LightGBM 模型并准备它的几个最重要的参数。然后,根据先前从df_feats
变量准备的特征训练模型。类似地,在df_feats_validation
变量中准备了验证期的特征,用于在preds
变量中获得预测。我们现在可以绘制获得的预测,看看它是否有效。
预测远非完美,因为我们只使用了非常基本的特征,但我们仍然可以注意到预测遵循真实数据的趋势。随着更多相似特征和模型参数的调整,结果可以进一步改善。
总结和结论
在本文中,我展示了如何转换时间序列数据的一般方法,并给出了为主要时间序列组件计算的示例特性。基于树的模型不是在时间序列数据上实现最先进的准确性的首选,但是,它们具有许多其他良好的特性,如可解释性、简单性,这通常要求选择这些模型来进行实时时间序列预测。
感谢阅读,敬请关注更多关于数据科学和机器学习的文章。
逼*随机函数
实践教程
训练概率机器学习模型的通用方法
你可以通过克隆 github.com/narroyo1/sffnn来复制本文中的实验
介绍
神经网络是通用函数逼*器。这意味着有足够多的隐藏神经元,神经网络可以用来逼*任何连续函数。然而,真实世界的数据通常具有噪声,这在某些情况下使得产生单个确定性值预测是不够的。以图 1a 中的数据集为例,它显示了一年内 JFK 国际机场航班的出发延误和到达延误之间的关系(2015 年航班延误和取消的子集)。
图 1a 从 JFK 出发到抵达的延误— 作者图片
图 1a 还示出了完全训练的神经网络的预测,该神经网络在*似*均值方面做得很好,并且提供了关于数据集趋势的信息。然而,它无助于回答诸如给定出发延迟,X%的航班的最大预期到达时间是多少?或给定一个出发延误,到达延误比 Y 长的概率是多少?或者更有趣的是,编写一个模型,对给定出发延误的到达延误值进行采样,其分布与真实情况相同。
有一些方法可以解决这个问题,例如,假设图 1a 中的模型估计了*均值,就可以计算出整个数据集的标准偏差,利用这些参数就可以得出预期的正态分布。如果方差不恒定,也就是说,如果方差在整个输入空间内发生变化,您可以使用带最大似然估计的逻辑回归,它简单地训练一个模型来预测给定输入的特定分布函数的参数(例如,正态或高斯分布的*均值和标准偏差)。问题是它依赖于数据集分布的先验知识,这在某些情况下可能很困难,或者太不规则而无法匹配已知的分布。
在出发至到达延迟数据集的情况下,我们可以从图中观察到分布似乎类似于正态分布,因此建立最大似然估计模型来计算正态分布的参数是有意义的。图 1b 示出了完全训练的模型的图,示出了*均值、*均值加/减标准偏差以及*均值加/减两倍标准偏差。该模型的误差为 2.48%,相当不错。然而,数据集的分布并不是完全正态的,你可以看到除了其他不完善之处,上尾比下尾略长,这就是精度并不更好的原因。
图 1b 从 JFK 出发到抵达的延误和概率模型— 作者图片
本文介绍了一种训练概率机器学习模型的通用方法,该模型将产生适应真实数据的任何分布,甚至分支分布或在输入空间中改变形式的分布。
该方法
假设产生数据的函数在输入 x ∈ X 处具有特定的分布 Y 我们可以将目标函数,或者我们实际上想要*似的函数定义为y∾yₓ。我们想要创建一个算法,能够从任意给定的 x ∈ X 的 Yₓ 中采样任意数量的数据点。
为此,我们引入一个二次输入 z ,它可以通过算法从一个均匀分布的空间 Z 中采样,并馈送给一个确定性函数 f ,使得 P(Z ≤ z) = P(Yₓ ≤f(x,z)。
或者换句话说,我们想要一个确定性函数,对于任何给定的输入 x ,将一个随机(但均匀)变量映射到一个因变量【yₓ】。
模型
所提出的*似【yₓ】的模型是一个普通的前馈神经网络,除了一个输入 x 之外,还接受一个输入z。**
作者图片
概观
在每一点 x ∈ X 我们希望我们的模型 f(x,z∾z)以任意精度逼* Yₓ 分布。让我们把 f(x,z∾z)和 Yₓ 想象成二维的(在 X 和 Z 都是一维的情况下)织物,它们可以在不同的区域以不同的尺度拉伸和收缩,分别降低或增加它们的密度。我们想要一种机制,它以与【yₓ】中的收缩和伸展相匹配的方式来伸展和收缩 f(x,z∞z)。
图 2 配合 x 添加均匀噪声的训练动画。— 作者图片
在图 2** 中,我们可以看到经过训练的模型输出如何在每个时期一点一点地拉伸和收缩,直到它与目标函数匹配。**
继续进行织物的拉伸和收缩模拟,我们希望将“针”放入覆盖织物(我们的模型)中,以便我们可以将它叠加在我们试图匹配的底层织物(目标数据集)上。我们将把这些大头针放入覆盖织物中的固定点,但在训练模型时,我们会将它们移动到底层织物的不同位置。首先,我们将它们固定在底层织物上的随机位置。当我们观察下层织物上的销相对于上层织物的位置时,我们将略微向上或向下移动销,以改善上层织物与下层织物的匹配。每一个针都会影响它在织物中的周围,与针的距离成比例。
我们将首先在覆盖织物的任意给定经度的固定位置和织物高度的中点纬度放置 1 个大头针。然后,我们将在同一经度的基础结构中进行多次观察,也就是说,我们将在穿过所选引脚位置的垂直线处随机选取几个位置。
对于每个观察点,如果观察点低于其当前位置,我们会将底层结构上的固定位置(在覆盖结构上保持相同的固定位置)向下移动一小段预定义的距离,如果观察点高于当前位置,我们会将其向上移动。这意味着,如果在底层织物中针的位置上方有更多的观察点,总运动将向上,反之亦然,如果在其下方有更多的观察点。如果我们重复这一过程足够多次,针在底层织物中的位置将停留在将观察点减半的位置,也就是说,在其上的观察点的数量与在其下的观察点的数量相同。
为什么我们要将大头针向上或向下移动预定义的距离,而不是与观察点成比例的距离? 原因是我们对匹配观察点不感兴趣。由于目标数据集是随机的,匹配随机观察值是没有意义的。我们从观察点得到的有趣信息是针是否将它们除以二(或另一个特定的比率)
图 3 向观察点移动 1 个针,直到它停止。— 作者图片
图 3 显示了针如何到达一个稳定的位置,将所有数据点分成两半,因为对于上面的数据点和下面的数据点,每次观察的移动量是相等的。如果上面观察的预定移动距离不同于下面观察的预定移动距离,则针将停留在以不同比率(不同于一半)划分数据点的位置。例如,让我们尝试使用 2 个销而不是 1 个销,第一个销将为上面的观察移动 1 个距离,为下面的观察移动 0.5 个距离,第二个销将做相反的事情。经过足够的迭代后,第一个引脚应该停留在将数据点除以上面的和下面的 2/3 的位置,而第二个引脚将除以上面的 2/3 和下面的 1/3 。这意味着我们将使的 1/3 位于第一个销上方, 的 1/3 位于两个销之间,而 的 1/3 位于第二个销下方,如图 4 中的所示。****
图 4 向观察点移动 2 个销,直到它们停止。— 作者图片
如果针将观察到的数据点分成大小为和 b 的两组,并且在训练之后,其固定位置位于从顶部开始的【a/(a+b)纬度中的底层织物中,我们在两个织物之间具有单点映射,即在该经度处,针上方和下方的密度在两片织物中相等。我们可以推断出这个概念,并使用尽可能多的引脚,以便在两片织物之间创建更精细的映射。
定义
我们首先在尺寸为的 Z 中选择一组固定的点,我们称之为 z 样本 。我们可以将这个集合定义为:
预测模型将被定义为:
这里的 x 将是来自输入域的任意输入元组, z 将是来自均匀随机变量 Z 和 θ 是模型的内部状态,或者说是权重矩阵。
然后我们将任意输入 x 对于特定的 z ∈ Z 的预测误差定义为:
即真实数据累积概率分布和预测累积概率分布之间的差异。
现在,我们可以将我们的培训目标定义为:
目标 1
换句话说,我们希望对于中的每一个z’以及整个 X 输入空间的绝对误差| e(z’)|最小化。这个第一个目标给了我们一个在 z 样本 集合和 Yₓ 之间的*似离散有限映射。即使没有说任何关于z中所有不在【zₛₐₘₚₗₑₛ中的点。**
目标 2
这个第二个目标给了我们,对于任意给定的 x 在 X , f 在 Z 中是单调递增函数。
这两个目标都将在训练算法的测试步骤中根据经验进行测试。
模型精度
对于任意点Z∾Z,并且Z’和Z”分别是立即变小和变大的 z 样本 ,并且假设目标 2 被满足,则我们有:
取代我们的预测误差:
如果我们从每一项中减去 P(Z ≤ z) :
这意味着对于任意一点Z∾Z预测误差 error E(z) 下界为P(Z≤Z’)—P(Z≤Z)+E(Z’),上界为P(Z≤Z’)—P(Z≤Z)+E(Z’)。
假设目标 1 被满足,我们知道【Z’)和【E(Z’)是小数字,这使得P(Z≤Z’)—P(Z≤Z)和P(Z≤Z’)—P(Z≤Z)成为主导因素。任何 z 与其相邻 z 样本之间的距离可以通过增加 z 样本 或 S 的数量来最小化。换句话说, f 的最大误差可以通过足够大的 S 任意最小化。
计算运动标量
定义了我们的目标以及他们会给我们买什么之后,我们开始展示我们将如何实现目标 1。为简单起见,我们将使用一个均匀分布在中的Z-样本集,即: {z[0],z[1],…,z[S-1]} ∈ Z s.t. z[0] < z[1],…,< z[S] ∧ P(z[0] < Z <******
对于**中任意给定的 x 和中任意给定的z’我们要 f 满足 P(Yₓ ≤ f(x,z’)= p(z≤z’。为此,我们假设我们在或yₜᵣₐᵢₙ∾yₓ用一组足够有代表性的样本进行计数。****
对于给定的 x ∈ X 并且具有作为 Z (即Z’∈Z s . t . Pr(Z’≤Z)= 0.5,我们可以简单地训练 f 来改变的值 z))一个恒定的移动数 M 大于每个训练示例 y ∈ yₜᵣₐᵢₙ 它大于 f(x,z’)本身并且相同的恒定数小于每个较小的训练示例(记住 2 块织物和销的类比)。 这将导致在足够的迭代之后,当总移动等于 0 时, f(x,z’)的值停留在将所有训练样本分成两半的位置。****
如果不是 Z 的中点P(Z≤Z’)≠0.5那么更大和更小样本的移动常数必须不同。**
假设 a 是与 Z 或 Zₘᵢₙ 和 b 之间的距离与之间的距离****
由于 a 表示我们希望找到的训练样本的数量小于和 b 训练样本的数量大于【z’我们需要 2 个标量 α 和******
这些运动标量将作为乘数,分别与小于和大于【z’的每个观察点上的恒定运动 M 一起使用。这个第一个等式保证了当z’位于 Zₘᵢₙ + a 或 Zₘₐₓ — b 时的总运动将为 0。******
第二个等式对标量进行归一化,使得中所有 z 的总运动具有相同的总运动。**
这给了我们:
然而,这个逻辑在边缘处中断,即当一个 z 样本等于 Zₘᵢₙ 或 Zₘₐₓ 时。在这些值处,a或 b 为 0,如果其中一个为 0,则 α 或 β 中的一个未定义。**
当 a 或 b 接* 0 α 或 β 趋向于无穷大时,人们可能会试图用一个大的数字来代替它,但这并不实际,因为大的距离乘数将支配训练并最小化其他 zₛₐₘₚₗₑₛ
同样随着 α 或 β 中的一个趋于无穷大,另一个变成了一个同样不切实际但原因不同的小数字。边缘处的 zₛₐₘₚₗₑₛ 应该映射到yₓ的边缘,任何向相反方向的移动量都将导致或【zₘₐₓ分别映射到中更大或更小的点。因此,边缘处的【zₛₐₘₚₗₑₛ】【即【z[0]和 z[S] 】的 α 和 β 将被指定为向内推的值 0 和预定义的值********
训练模型
为了训练神经网络,z 样本,集合大小 S 根据期望的精度和可用的计算来选择。决定之后,必须定义 Z 。也就是说,必须选择维数及其范围。给定 Z 和训练级别,我们可以创建 z 样本 集合。**
例如,如果 Z 是一维的,范围定义为【10.0,20.0】s = 9,则 z 样本集合为 {z₀ (10.0)、z₁ (11.25)、z₂ (12.5)、z₃ (13.75)、z₄(13.75)******
首先我们从大小为 n 的训练数据中选择一批数据,对于该批中的每个数据点,我们在每个 z 样本上评估当前模型。这给了我们预测矩阵:
对于批量中的每一个数据点【xᵢ,yᵢ】,我们取输出值【yᵢ,并与预测矩阵中其对应行的每一个值(即【f(xᵢ,z₀】,【f(xᵢ,z₁】,…,f(xᵢ,z≠))进行比较。在确定 yᵢ 大于还是小于每个预测值之后,我们为矩阵中的每个元素产生 2 个值:******
运动标量
如果【z-sample】比预测的【z-sample】*【yᵢ】小,如果 比预测的【z-sample】大。*******
目标值
如果比预测值小,则目标值为预测值本身加上预选的移动常数 M 乘以-1,如果 比预测值大,则为 1。您可以将目标值视为“我们希望预测的位置”值。**
在计算了这两个值之后,我们就可以准备组装在反向传播过程中使用的矩阵了。
我们将预测矩阵结果添加到这个矩阵中,并传递给加权均方误差损失函数(WMSE)。损失函数看起来像这样:
测试模型
均方误差(MSE)损失函数使用反向传播和目标值来训练模型,但是测试模型需要不同的方法。由于 f(x,Z) 和 Yₓ 都是随机变量,测量它们样本之间的差异是没有意义的。因此,模型的成功将通过两种方式来衡量:
推土机距离(EMD)
在统计学中, 推土机的距离(EMD)是一个区域内两个概率分布之间距离的度量**。在数学中,这被称为瓦瑟斯坦度规。非正式地,如果分布被解释为在区域 D 上堆积一定数量的灰尘的两种不同方式,EMD 是将一堆灰尘变成另一堆灰尘的最小成本;其中成本假定为移动的灰尘量乘以移动的距离。wikipedia.org****
使用 EMD 我们可以获得 Yₓ 和 f(x,Z) 有多相似的指标。可以通过比较测试数据和预测数据集中的每个 x,y 数据点,并找到将一个数据点转换成另一个数据点所需的最小总移动量来计算。EMD 数字告诉我们的是将预测数据集中的每一点转换为测试数据集中的*均距离。
在下面的例子中,你可以看到,在一个厚度约为 100 的数据集上,*均 EMD 约为 3.9。由于数据集的随机性质,EMD 不能用作字面上的错误指标,但它可以用作进度指标,即告知模型是否随着训练而改进。
图 5 EMD 测试。— 作者图片
测试培训目标
培训目标 1
理想情况下,为了测试目标 1 (即∀x∈x∧∀z’∈zₛₐₘₚₗₑₛ: arg min | e(z’)|)我们将对给定的 x 和每个 z 样本 评估 f ,然后将其与具有相同的任意数量的测试数据点进行比较然后,我们将继续为每个 z 样本 计算比它小的测试数据点的数量。利用比计数(即 P(Yₓ ≤ f(x,z’))小的矢量,我们可以将它与每个【z 样本】*** (即p(z≤z’))的规范计数进行比较,并测量误差。然而,在现实生活中,这是不可能的。现实生活中的数据集不太可能有任意数量的数据点具有相同的 x (它们甚至不太可能有两个数据点具有相同的 x ),这意味着我们需要使用接*于 x (值 X 的 x )来测试目标*********
我们首先创建一个排序(一个索引数组) O = {o₀,o₁,…,o[m]} ,对【xₜₑₛₜ【测试数据集中的 x 输入中的所有元素进行排序。然后我们选择数组 O' = {oᵢ,oᵢ₊₁,…,oⱼ} 的一个子串。
现在我们可以对每个x【o’】∣o’∈o’在每个 z-sample 上求值 f ,这就给出了矩阵:
然后,我们将每一行与输出y[o '】∣o '∈o '进行比较
并创建比计数小的(即 P(Yₓ ≤ f(x,z)) ),然后我们可以将它与每个 z 样本 (即 P(Z ≤ z) )的规范计数进行比较,以测量所选子串中的误差。**
我们将创建许多这样的子串,并将每个错误称为位于子串中心元素的本地邻*错误。
在下面的示例中,您可以看到目标 1 的*均误差约为 1.6%,这可以用作模型的误差指标。
图 6 训练目标 1 测试。— 作者图片
培训目标 2
为了测试目标 2 ∀ x ∈ X ∧ ∀ z₀,z₁ ∈ Z s.t. z₀ < z₁: f(x,z₀) < f(x,z₁) 我们在中选择一些随机点,并在中选择一组随机点,我们在我们的模型中运行它们并得到结果矩阵:****
从这里开始,检查每一行是否单调递增是很容易的。为了提高检查的质量,我们可以增加在 X 中设置的测试点和在 Z 中设置的测试点的大小。
回到延迟
现在我们可以回到出发延误到到达延误数据集,下面你可以看到 MLE 方法(图 7a )和本文介绍的方法(图 7b )并列。正如我们之前看到的,最大似然估计方法未能捕捉到小的缺陷,获得 2.48%的目标 1 误差,而一般方法做得好得多,目标 1 误差为 0.018%。
图 7a 概率模型 MLE 方法。图 7b 通用方法。— 作者图片****
实验
以下是在不同数据集上进行的各种实验。
x 加高斯噪声
让我们从一个简单的例子开始。添加了高斯噪声的函数 x 。在左侧面板中,您可以看到训练在 180 个时期内不断发展。在此面板的左上角,您可以看到目标 1 的误差局限在 X 上,在训练结束时,您可以看到最高局部误差约为 2%,全局误差约为 0.5%。在同一面板的右上角,您可以看到本地推土机的距离(EMD)。在左下角,您可以看到原始测试数据集(蓝色)和 z-samples (橙色)的图,您可以看到它们是如何逐渐符合测试数据的。在右下方,您可以看到原始测试数据集(蓝色)和随机预测(带有Z∾Z)的图表,您可以看到预测结果逐渐代表了测试数据。**
在右侧面板中,您可以看到全局目标 1 误差(上图)和全局 EMD 值(下图)在培训过程中的变化图。
********
图 8 训练模型匹配 x 加高斯。— 作者图片
一个 x + bx + cx + d 加截断高斯噪声
这个有点复杂。添加了截断高斯噪声的 3 阶多项式(即在特定点截断的正态分布)。
********
图 9 训练模型匹配 x + bx + cx + d 加截断高斯。— 作者图片
双 sin(x)加高斯噪声乘以 sin(x)
这个更有趣。2 镜像 sin(x) 函数带有由 sin(x) 本身缩放的高斯噪声。
请注意,该模型如何成功地表示了密度较低的中间区域。
********
图 10 训练模型匹配双加高斯倍【sin(x)。— 作者图片**
分支函数加高斯噪声
这个实验用分支路径。它从围绕 0 的简单高斯噪声开始,然后开始在各个段的过程中以相等的概率分割它。
尽管分布不是连续的,但该模型在逼*分布方面做得相当不错。
**********
图 11 匹配分支函数加高斯的训练模型。— 作者图片
(x₀) + (x₁)加绝对高斯噪声
下一个例子有二维输入。 X₀ (第一维)是xx₁(第二维)是 x 加了绝对高斯噪声。显示略有不同,为了节省空间,省略了 z-samples 图。如您所见,每个维度都有一个面板,另外还有一个面板用于显示目标 1 错误和 EMD 错误历史。****
图 12 训练模型匹配(x₀)+加绝对高斯。— 作者图片****
加州住房数据集
该实验使用真实数据代替生成数据,证明了该模型对真实数据的有效性。这是经典的加州住房数据集。它有来自 1990 年加州人口普查的信息,有 8 个输入维度(收入中值、房龄等)。下面你可以看到每个维度的图。
图 13 匹配加州住房数据集的训练模型。— 作者图片
结论
提出的方法允许以任意精度*似随机数据集的分布。该模型简单,训练速度快,可以用普通的前馈神经网络实现。它能够*似输入空间中的任何分布,这使它成为任何需要预测的任务的重要工具。
四月版:艺术、创造力和数据科学
人们对数据科学如此感兴趣的一个主要原因是它的各种应用。人工智能(AI)驱动的解决方案每天都在使用的一些领域的例子包括医学、金融和技术行业。不过,研究人员目前正在努力创造能够在更多领域运作的人工智能服务。
为了创作艺术品,可以使用人工智能吗?
当然可以!
由于多年的研究,谷歌和英伟达等公司成功创建了不同的深度学习模型架构,能够满足这一目的。一些例子包括谷歌 DeepDream(用于从真实图像中创建梦幻般的迷幻图像)和英伟达 GauGAN(能够将涂鸦变成现实图像)。
图 1: 谷歌 DeepDream 示例
如果你有兴趣了解更多关于如何使用数据科学创作艺术作品的信息,本月的时事通讯提供了一些关于数据科学的最佳文章。
Pier Paolo Ippolito —编辑助理
艺术育种家。给我画一只电动羊。
由弗拉德·亚历克斯 — 10 分钟阅读
如何以用户友好的方式应用生成式对抗网络?
超级创造力
通过 Serafim Batzoglou — 12 分钟读取
人工智能可能很快就会超越人类的艺术创造力
CycleGANs 创造电脑生成艺术
扎克·蒙赫博士——9 分钟阅读
对 CycleGANs 的解释和计算机生成艺术的演示
下一级艺术以及工作和休闲的未来
由 Max Frenzel — 30 分钟阅读
用人工智能变得更有创造力(和人性)
我训练一个人工智能来模仿我自己的艺术风格。事情是这样的。
由迈克尔·卡默勒 — 6 分钟读完
今天人工智能无处不在,如果你认为我们不需要另一篇人工智能文章,你可能是对的。但是在你关闭这个标签之前,请听我说完。这个不一样。
机器学习时代的艺术鉴赏
由凯瑟琳黄 — 5 分钟读完
如果我很难通过 Buzzfeed 关于赝品的测试,那么计算机如何能更好地识别赝品呢?
新视频
- 克里斯托弗·威金斯— 数据科学@纽约时报
- 刘畅— 使用 TensorFlow Privacy 构建不同的私有机器学习模型
- 凯尔·加拉丁——英伟达给了我一台价值 15000 美元的数据科学工作站——以下是我用它做的事情
新播客
我们也感谢最*加入我们的所有伟大的新作家凯尔文·李、路易斯·丽塔、乔伊·罗斯、哈德尔·哈马德、奥雷莉·吉罗、伊戈尔·里布卡斯·塞尔帕、于峰、迪帕克·迪利普库马尔、安吉拉·库南巴瓦、 丹尼尔·威奇维、尼古拉·佐丹奴、兰斯·邓、马修·R·芬奇、阿拉丁、尼古拉斯·贝尔塔尼奥利、杰克叶等等很多人。 我们邀请你看看他们的简介,看看他们的工作。
Apriori 算法教程
关系数据库上的数据挖掘和关联规则
来源:https://unsplash.com/photos/stpjHJGqZyw
关联规则的主要目标是识别数据集中产品或变量之间的关系。这个想法是为了确定哪些产品经常在一起。例如,它被广泛应用于市场购物篮分析,分析师从一个包含所有交易的数据库开始,试图确定哪些产品以何种频率组合在一起,等等。
这些信息有助于优化商店中各种产品的位置,或者在某种产品打折时制定销售计划。
Apriori 算法是最流行的关联规则挖掘算法。它在数据库中查找最频繁的组合,并根据 3 个重要因素确定项目之间的关联规则:
- 支持度:X 和 Y 走到一起的概率
- 置信度:Y 知道 X 的条件概率,换句话说,X 先发生的时候,Y 发生的频率。
- 提升:支持度和信心度之比。提升 2 意味着同时购买 X 和 Y 的可能性是只购买 Y 的可能性的 2 倍。
在实践中,至少 1 的提升对于被认为相关的规则是必要的。
下面是使用 mlxtend 库实现的 apriori 算法。首先,让我们导入库并查看数据,这些数据来自一家餐馆的交易。
from mlxtend.frequent_patterns import apriori, association_rulesdf.head(15)
数据帧的快照
该数据集包含 30,000 多行和大约 9,000 个事务。对于每笔交易(可以跨越多行),对我们来说重要的是交易中包含的产品。
我们要做的第一件事是改变数据的结构,这样每个事务都变成一行。我们将对产品名称使用 unstack 函数,这样数据库中所有可能的产品都成为一列。
tl = df.unstack(level='productName').fillna(0)
然后,对于每一笔交易,我们想知道一个产品是在(1)还是不在(0)。我们不关心产品的数量,只关心它是否出现在交易中。
#**Function**
def presence(x):
if(x<= 0):
return 0
if(x>= 1):
return 1**#Apply function** tl_encoded = tl.applymap(presence)
然后,我们可以使用 apriori 函数构建模型,并使用 association_rules 函数收集所有满足最小支持度 0.01 的推断规则。
**# Building the model** frq_items = apriori(tl_encoded, min_support = 0.01, use_colnames = True)
**# Collecting the inferred rules in a dataframe** rules = association_rules(frq_items, metric ="lift", min_threshold = 1)
这段代码将返回如下 frozensets:
[frozenset({'crpes sucre', 'Jus d'orange,'})]
我个人觉得使用列表要方便得多。下面是进行转换并创建一个包含 apriori 算法创建的所有关联规则的数据帧的代码。
**#Sort the rules** rules = rules.sort_values(['lift'], ascending =[False])**#From Frozenset to string** rules["antecedents"] = rules["antecedents"].apply(lambda x: list(x)[0]).astype("unicode")
rules["consequents"] = rules["consequents"].apply(lambda x: list(x)[0]).astype("unicode")**#Table with most relevant rules** print(rules.sort_values('lift', ascending=False).nlargest(10, 'lift'))
让我们解释一下第一条规则。它说,当加糖的薄饼在交易时,橙汁也经常来。3.22 的升力意味着一起购买薄饼和橙汁的可能性是只购买橙汁的可能性的 3.22 倍。0.01 的支持意味着它们一起出现在所有交易的 1%左右的交易中。
这些信息可能有助于为客户创造新的优惠。例如,我们可以买一个可丽饼,买一杯半价的橙汁。
非常感谢你的阅读!
apriori——关联规则挖掘的深层解释及 Python 实现
简明扼要地介绍入门级数据挖掘。
弗兰基·查马基在 Unsplash 上拍摄的照片
介绍
关于关联规则挖掘最著名的故事是《啤酒和尿布》。研究人员发现,购买尿布的顾客也倾向于购买啤酒。这个经典的例子表明,在我们的日常数据中可能隐藏着许多有趣的关联规则。
关联规则挖掘是一种识别不同项目之间潜在关系的技术。有许多方法可以执行关联规则挖掘。我们将在本文中介绍的 Apriori 算法是最简单明了的方法。然而,因为它是基本方法,所以有许多不同的改进可以应用于它。
我们不会深入研究这些改进。相反,我将在这个故事中展示先验的主要缺点。并且在即将到来的帖子中,会介绍一个更高效的 FP 增长算法。我们还会在下一篇文章中比较 FP 增长和 Apriori 的利弊。
[## FP 增长:用 Python 实现数据挖掘中的频繁模式生成
在本文中,我们将展示一种叫做 FP 增长算法的高级方法。我们将走过整个…
towardsdatascience.com](/fp-growth-frequent-pattern-generation-in-data-mining-with-python-implementation-244e561ab1c3)
先验概念
支持
包含项集的事务的一部分。
例如,第 I 项的支持度定义为包含 I 的事务数除以事务总数。
图片由 Chonyy 提供
信心
测量 Y 中的项目在包含 X 的事务中出现的频率
置信度是如果购买了物品 X,也购买了物品 Y 的可能性。它的计算方法是包含 X 和 Y 的事务数除以包含 X 的事务数。
图片由 Chonyy 提供
频繁项目集
支持度大于或等于最小支持度阈值的项目集
频繁项集也称为频繁模式,简单地说就是支持度满足最小支持度阈值的所有项集。
Apriori 算法
请随意查看评论良好的源代码。这真的有助于理解整个算法。
pip 安装 apriori_python,然后像使用 git clone git clone 一样使用它来获得此 repo 的副本…
github.com](https://github.com/chonyy/apriori_python)
先验的主要思想是
频繁项集的所有非空子集也必须是频繁的。
图片由 Chonyy 提供
这是一种自下而上的方法。我们从项目集列表中的每一个项目开始。然后,通过自连接产生候选。我们一次扩展一个项目集的长度。子集测试在每个阶段执行,包含不频繁子集的项目集被删除。我们重复这个过程,直到不能从数据中获得更多成功的项目集。
算法概述
这是 Apriori 的官方伪代码
- Lk: 频繁 k 项集,满足最小支持度
- Ck: 候选 k 项集,可能的频繁 k 项集
图片由 Chonyy 提供
请注意,修剪步骤已经包含在先验生成函数中。我个人觉得这个伪代码挺混乱的。所以,我整理成了自己的版本。这应该更容易理解。
L[1] = {frequent 1-itemsets};
for (k=2; L[k-1] != 0; k ++) do begin
// perform self-joining
C[k] = getUnion(L[k-1])
// remove pruned supersets
C[k] = pruning(C[k])
// get itemsets that satisfy minSup
L[k] = getAboveMinSup(C[k], minSup)
end
Answer = Lk (union)
综上所述,Apriori 的基本组成部分可以写成
- 使用 k-1 个项目集生成 k 个项目集
- 通过连接 L[k-1]和 L[k-1]得到 C[k]
- 用子集测试剪枝 C[k]
- 通过提取 C[k]中满足 minSup 的项集生成 L[k]
在头脑中模拟算法,并用下面的例子验证它。现在概念应该真的很清楚了。
图片由 Chonyy 提供
Python 实现
先验函数
这是这个 Apriori Python 实现的主要功能。这个功能最重要的部分是从第 16 行~第 21 行。它基本上遵循我上面写的修改后的伪代码。
- 通过连接前一阶段的频繁项集来生成候选集。
- 执行子集测试,如果包含不频繁的项目集,则修剪候选集。
- 通过获取满足最小支持度的频繁项集来计算最终的频繁项集。
候选生成
对于自连接,我们简单地通过蛮力得到所有的联合,并且只返回那些特定长度的联合。
修剪
为了执行子集测试,我们遍历项目集中所有可能的子集。如果该子集不在先前的频繁项集中,我们就对其进行剪枝。
从候选项中获取频繁项集
在最后一步,我们将候选集变成频繁项集。因为我们没有应用任何改进技术。我们可以采用的唯一方法是无脑地一遍又一遍地遍历项目和项目集来获得计数。最后,我们只保留支持度等于或高于最小支持度的项集。
结果
print(rules)
# [[{'beer'}, {'rice'}, 0.666], [{'rice'}, {'beer'}, 1.000]]
# (rules[0] --> rules[1]), confidence = rules[2]
更多用法和示例请查看GitHub repo或 PyPi 包 。
缺点
Apriori 算法有两个主要缺点
- 候选生成项集的大小可能非常大
- 因为我们必须一遍又一遍地扫描项目集数据库,所以在计算支持度上浪费了大量时间
我们将在 repo 中使用 data4.csv(从 IBM generator 生成)来展示这些缺点,看看是否能得到一些有趣的观察结果。
每个阶段的候选项集大小
图片由 Chonyy 提供
通过对 data4.csv 运行 Apriori,我们可以绘制出如上图所示的流程。我们上面提到的缺点可以在观察图表时发现。
在右边,我们可以看到算法的三个主要过程之后的项集大小。从图表中可以发现两个关键点
- 项目集的大小在开始时迅速增加,随着迭代的进行逐渐减小
- 修剪过程可能像阶段 1 和阶段 2 一样没有用。然而,在某些情况下,比如第三阶段,它会有很大的帮助。修剪了一半的项目集,这意味着计数时间可以减少一半!
每个阶段经过的时间
图片由 Chonyy 提供
从剧情可以看出,跑步大部分时间都花在了数支持上。与一遍又一遍地扫描原始项目集数据库相比,花在候选项生成和剪枝上的时间算不了什么。
另一个值得注意的观察是,我们在阶段 2 得到一个成本峰值。有趣的是,这其实不是意外!当使用 Apriori 时,数据科学家经常在阶段 2 遇到瓶颈。由于在阶段 1 几乎没有候选项被删除,所以在阶段 2 生成的候选项基本上是所有 1-频繁项集的所有可能组合。而计算如此庞大的项集的支持度导致了极高的成本。
尝试不同的数据集(在 repo 中)
kaggle.csv
图片由 Chonyy 提供
正如我们上面提到的,我们知道先验的瓶颈通常在阶段 2。然而,正如在 Kaggle 数据集图上显示的那样,这种观察可能并不总是成立的。准确地说,这取决于数据集本身和我们想要的最小支持度。
data7.csv
图片由 Chonyy 提供
正如我们所看到的,我们需要一分多钟来计算数据 7 与 Apriori 的关联规则。显然,这个运行时间是难以接受的。记得我说过先验只是一个根本方法吗?它的效率是它在数据科学领域没有得到广泛应用的原因。我们将把这个结果与 FP 增长的结果进行比较。
[## FP 增长:用 Python 实现数据挖掘中的频繁模式生成
在本文中,我们将展示一种叫做 FP 增长算法的高级方法。我们将走过整个…
towardsdatascience.com](/fp-growth-frequent-pattern-generation-in-data-mining-with-python-implementation-244e561ab1c3)
丰富
有许多额外的技术可以应用于 Apriori 来提高效率。下面列出了其中的一些。
- 散列:减少数据库扫描
- 事务减少:不再考虑不频繁的事务
- 分区:可能频繁一定是频繁中的一个分区
- 动态项目集计数:减少对数据的遍历次数
- 抽样:随机抽取样本
源代码
pip 安装 apriori_python,然后像使用 git clone git clone 一样使用它来获得此 repo 的副本…
github.com](https://github.com/chonyy/apriori_python)
PyPi 包
pip 安装 apriori_python,然后像运行程序一样使用提供的数据集和 minSupport 的默认值…
pypi.org](https://pypi.org/project/apriori-python/)
阿拉伯情感分析
关于如何对阿拉伯文本进行情感分析的说明性指南
在 Unsplash 上由 Mutia Rahmah 拍摄的照片
识别和分类一段文本中表达的观点(也称为情感分析)是 NLP 中执行最多的任务之一。尽管阿拉伯语是世界上使用最多的语言之一,但在情感分析方面却很少受到关注。因此,本文致力于使用 Python 实现阿拉伯情感分析(ASA)。
概述
- 数据集
- 图书馆导入和数据探索
- 文本预处理
- 基于不同 ML 算法的情感分析。
- 结论
- 参考
数据
本文中使用的数据集由 1800 条标注为正面和负面的推文组成。这里可以找到这里
库导入和数据浏览
图 1
图 2
我们这里有一个非常*衡的班级。
文本预处理
作为一个习惯于处理英语文本的人,我发现首先很难将通常用于英语文本的预处理步骤翻译成阿拉伯语。幸运的是,我后来发现了一个 G ithub repo sitory,里面有清除阿拉伯文本的代码。这些步骤基本上包括删除标点符号、阿拉伯语音调符号(短元音和其他 harakahs)、延长和停用词(在 NLTK 语料库中可以找到)。
预处理数据
使用不同技术的情感分析
本文的目的是演示不同的信息提取技术如何用于 SA。但是为了简单起见,我在这里只演示单词向量化(即 tf-idf)。与任何监督学习任务一样,数据首先被分为特征(提要)和标签(情感)。接下来,将数据分为训练集和测试集,并从逻辑回归开始实施不同的分类器。
逻辑回归
逻辑回归是一种非常常见的分类算法。它实现简单,可以作为分类任务的基准算法。为了使代码更短,Scilkit-Learn 中的管道类结合了向量化、转换、网格搜索和分类。你可以在官方文档中阅读更多关于 gridsearch 的内容
准确率达到了 84%
随机森林分类器
朴素贝叶斯分类器(多项式)
支持向量机
结论
本文演示了阿拉伯情感分析的步骤。阿拉伯语和英语 NLP 的主要区别在于预处理步骤。所有适合的分类器给出了范围从 84%到 85%的令人印象深刻的准确度分数。朴素贝叶斯、逻辑回归和随机森林给出了 84%的准确率,而线性支持向量机实现了 1%的提高。通过应用单词嵌入和递归神经网络等技术,可以进一步改进模型,我将在后续文章中尝试实现这些技术。
参考文献
自然语言处理,word2vec,支持向量机,词袋,深度学习
towardsdatascience.com](/multi-class-text-classification-model-comparison-and-selection-5eb066197568)
https://github . com/motazsaad/process-Arabic-text/blob/master/clean _ Arabic _ text . py
Hespress 新闻数据集上的阿拉伯语主题分类
如何正确分类阿拉伯文本
马库斯·温克勒在 Unsplash 上的照片
本文是一个系列的第一篇,在这个系列中,我将介绍对 Hespress 数据集的分析。
根据“alexa.com”的统计,Hespress 在摩洛哥排名第四,是该国最大的新闻网站,*均每个摩洛哥人每天在该网站上花费大约 6 分钟。
Hespress 数据集是 11 万篇新闻文章和 30 万条评论的集合,每篇文章都有相关用户的评分,可以把这些评分想象成脸书邮报上的赞。这个数据集可以用于新闻文章分类,这将是我们在本文中的重点,也可以用于对摩洛哥舆论的情感分析。您可以使用以下链接下载数据集:
Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源来帮助您实现您的数据…
www.kaggle.com](https://www.kaggle.com/tariqmassaoudi/hespress)
这篇文章的目标读者是对机器学习有一点了解的人,例如分类和回归之间有什么区别,什么是交叉验证。然而,我将对这个项目的步骤做一个简单的解释。
问题介绍:
幸运的是,我们的数据集包含文章及其标签,因此我们正在处理一个有监督的学习问题,这将使我们的生活更加容易,因为如果不是这样,我们将不得不手动标记每篇文章或采用无监督的方法。
简而言之,我们的目标是在给定文本的情况下预测文章的主题。我们总共有 11 个主题:
- 塔马塞特语(一种摩洛哥语言)
- 运动(运动)
- 社会团体
- 区域(地区)
- 政治
- 轨道(世界新闻)
- 媒体(当地报纸的新闻)
- 世界摩洛哥人
- Faits Divers(杂项)
- 经济学家
- 艺术与文化(艺术与文化)
探索性数据分析:
我们将使用 seaborn 进行数据可视化,使用 pandas 进行数据操作。
让我们从加载数据开始:
因为数据存储在不同的文件中,每个文件包含特定主题的数据,所以我们必须循环遍历主题并连接结果。
import pandas as pd
stories=pd.DataFrame()
topics["tamazight","sport","societe","regions","politique","orbites","medias","marocains-du-monde","faits-divers","economie","art-et-culture"]for topic in topics:
stories=pd.concat([stories,pd.read_csv("stories_"+topic+".csv")])stories.drop(columns=["Unnamed: 0"],axis=1,inplace=True)
接下来让我们从数据中获取一个样本:
stories.sample(5)
stories 数据集中的示例列
我们可以看到我们有 5 个专栏,对于这篇文章,我们只对故事和主题特性感兴趣。
现在,让我们检查一下每个主题中有多少故事,这对于分类极其重要,因为如果我们有一个不*衡的数据集,即(我们在一个主题中有比其他主题多得多的数据点),我们的模型将会有偏差,也不会工作。如果我们有这个问题,一个常见的解决方案是应用一个欠采样或过采样方法,我们不会去查看细节,因为这不在我们的文章范围内。
import seaborn as sns
storiesByTopic=stories.groupby(by="topic").count()["story"]
sns.barplot(x=storiesByTopic.index,y=storiesByTopic)
按主题的故事计数
我们可以看到,每个主题几乎有 1000 个故事,我们的数据集非常*衡。
资料来源:memegenerator.net
数据清理:
我们正在处理阿拉伯文本数据。我们的数据清理流程将包括 2 个步骤:
删除停用词:一些词,如“و”、“كيف”,在所有阿拉伯文本中出现频率极高,并且不提供我们的模型可以用来预测的含义。移除它们将减少噪音,并让我们的模型只关注相关的单词。为此,我们将使用一个列表,循环遍历所有文章,删除列表中出现的所有单词。
我使用的停用词表可以在 Github 上找到
from nltk.tokenize import word_tokenizefile1 = open('stopwordsarabic.txt', 'r', encoding='utf-8')
stopwords_arabic = file1.read().splitlines()+["المغرب","المغربية","المغربي"]def removeStopWords(text,stopwords):
text_tokens = word_tokenize(text)
return " ".join([word for word in text_tokens if not word in stopwords])
删除标点符号:出于同样的原因,我们将删除标点符号,为此我使用了一个正则表达式。
from nltk.tokenize import RegexpTokenizer
def removePunctuation(text):
tokenizer = RegexpTokenizer(r'\w+')
return " ".join(tokenizer.tokenize(text))
绘制文字云:
让我们找点乐子,我们将使用 python " WordCloud "库从我们的数据集中的所有故事中画出一个单词云
在这样做之前,有一些额外的步骤需要特别为阿拉伯语,要了解更多关于他们访问这个链接。
import arabic_reshaper
from bidi.algorithm import get_display
import matplotlib.pyplot as plt
%matplotlib inlinedef preprocessText(text,stopwords,wordcloud=False):
noStop=removeStopWords(text,stopwords)
noPunctuation=removePunctuation(noStop)
if wordcloud:
text=arabic_reshaper.reshape(noPunctuation)
text=get_display(text)
return text
return noPunctuationdrawWordcloud(stories.story,stopwords_arabic)
西方新闻报道的文字云
由于这个数据集包含最*的新闻文章,我们认为“كورونا”(冠状病毒)是一个反复出现的词。还有“الامازيغية”是摩洛哥的主要语言,“محمد”是摩洛哥最流行的名字,也是摩洛哥国王的名字,“الحكومة”是政府的意思。
特色工程:
机器学习模型本质上是数学方程,无法理解文本,所以在运行我们的模型之前,我们需要将文本转换为数字,有多种方法可以做到这一点,让我们来发现两种最流行的方法。
- 字数:
这个非常简单,每一列代表整个故事语料库中的一个单词,每一行代表一个故事,单元格的值就是一个单词在故事中出现的频率!
- TF–IDF:
TF-IDF 代表“词频逆文档频率”,它使用一种稍微复杂一点的方法来惩罚在多个文档中出现的常见单词。
我们将使用 TF-IDF,因为它在大多数情况下会产生更好的性能!
from sklearn.feature_extraction.text import TfidfVectorizer#Clean the stories
stories["storyClean"]=stories["story"].apply(lambda s: preprocessText(s,stopwords_arabic))#Vectorize the storiesvectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(stories["storyClean"])
y=stories.topic
造型:
我们将尝试以下型号:
- 随机森林
- 逻辑回归
- SGD 分类器
- 多项式朴素贝叶斯
我们将通过每个模型运行数据,并使用准确性作为我们的衡量标准,它是正确预测和总数据点的比率,为了获得更准确的结果,我们使用了 5 倍交叉验证进行评分,然后我们将绘制结果。
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn.metrics import classification_report
def testModel(model,X,y):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model.fit(X_train,y_train)
modelName = type(model).__name__
pred=model.predict(X_test)
print(modelName)
print(classification_report(y_test,model.predict(X_test)))
score=np.mean(cross_val_score(model, X, y, cv=5))
return model,{"model":modelName,"score":score}
模型准确性
我们最好的模型是精确度为 87 %的 SDG 分类器
模型解释:
现在我们有了一个工作模型,让我们试着了解更多的情况,因为我们将回答两个问题:
- 我们的模型纠结于哪些话题?
- 哪些词对预测不同话题最有影响力?
对于第一个问题,我们可以查看最佳模型的分类报告:
分类报告 SGD 分类器
我们预测“体育”、“艺术”、“媒体”、“塔马塞特”的准确度极高。我们最纠结的是“orbits”(世界新闻)、 societe ”(社会)这可能是因为这两个话题更为宽泛。
为了回答第二个问题,我们将使用逻辑回归的一个有用属性,我们可以使用权重作为每个模型中单词重要性的度量。"Eli 5" python 库让这一切变得简单:
我们可以看到,大多数单词都是有意义的,并且与主题的主题相对应,例如对于“艺术”,顶部的单词是:“艺术家”、“电影”、“文化”、“书籍”。
结论:
在本文中,我们已经经历了为阿拉伯语设计文本分类系统所需的所有步骤,从数据探索到模型解释。然而,我们仍然可以通过调整超参数来提高精度。
在下一篇文章中,我们将尝试使用情感分析来理解每篇文章的评论。
如果你设法来到这里,恭喜你。感谢阅读,我希望你喜欢这篇文章。如需个人联系或讨论,请随时通过 LinkedIn 联系我。
阿基米德和积分学
伟大的希腊数学家如何计算抛物线内的面积
图片由皮克斯拜的 Gerd Altmann 提供
锡拉丘兹的阿基米德是古代最伟大的科学家和数学家。他是一个博学的人,在很多领域都有贡献,包括数学、物理、天文学和工程学。阿基米德也是一位杰出的发明家和武器设计师。
他的许多成就包括:
图 1:根据阿基米德原理,浸没在流体中的物体所受到的向上浮力等于该物体所排开的流体重量(来源)。
- 他证明了球体和其他几何物体的体积和表面积的公式(详见此链接)。
图 2:来自阿基米德的《关于球体和圆柱体的书》中的一页,其中他展示了如何找到球体的表面积,以及球体的体积是包含它的圆柱体体积的 2/3(来源)。
- 他是应用物理学解决数学问题的先驱(而不仅仅是反过来)。下面的文章包含了这样一个应用程序的例子。
他是如何利用基础物理学推导出球体的体积的
towardsdatascience.com](/the-genius-of-archimedes-421cfb51f7d8)
- 他预见到了两千年后才完全发展起来的积分学技术。
用数学家史蒂文·斯特罗加兹的话来说,“说[阿基米德]走在他的时代的前面是一种委婉的说法”。
图 3:一幅 18 世纪中期的阿基米德的画作(作者朱塞佩·诺加里)(来源)。
- 他发明了几种战争机器。他甚至将镜子作为抛物面反射器的特性应用于焚烧攻击锡拉丘兹的船只(尽管这个故事的真实性已经被争论了很长时间)。
图 4:阿基米德(可能)应用镜子焚烧罗马船只(作者朱利奥·帕里吉 ) ( 来源)。
在这篇文章中,我将基于西蒙斯解释他是如何计算抛物线段内的面积的(见下图 6)。阿基米德的证明包含在他写于公元前 3 世纪的论文《抛物线的求积》(比现代微积分发展早了两千年)中,这些数学家包括巴罗、笛卡尔、费马、帕斯卡、沃利斯、卡瓦列里、格里高利、牛顿和莱布尼茨
图 5:托马斯·德乔治笔下的阿基米德之死。根据神话(没有可靠证据),他在罗马士兵用他的剑杀死他之前告诉罗马士兵“不要打扰我的圈子”(来源)。
阿基米德结构
在图 6 和 7 中,阿基米德用于计算由弦 AB 限定的面积 S 的结构如图所示。他构建了三个三角形,即 ABC、ADC 和δCEB,方法如下:
- 他首先找到切线*行于边界弦 AB 的点 C 。
- 类似地,选择 D 作为切线*行于 AC 的点。
- 点 E 和弦 BC 的选择遵循相同的规则。
- 然后,他对还不包含内接三角形的区域采取同样的步骤。然后他无限重复这个过程(这被称为用尽方法)。关于这一点的更多细节将在文章的最后一节提供。
图 6:阿基米德要计算其面积的抛物线段(受弦 AB 限制)。
阿基米德的目标是证明抛物线段内的面积 S 等于三角形面积 ABC 的 4/3:
等式 1:阿基米德在其论文中证明的等式抛物线的求积。证明将在本文中描述。
正如我们将在最后一节看到的,这可以通过首先显示
等式 2:如果这个关系被遵守,证明等式 2 给出的最终结果是一个简单的任务。1.
然后将上面提到的穷举法应用于 ACD 和 BCE 下面的三角形等等。
证明等式 2
在这一节,我将展示如何证明情商。2(证明跟随西蒙斯)。在下一篇文章中,我将简单应用穷举法证明抛物线段的面积等于三角形 ABC 面积的 4/3。
代表抛物线的方程可以写成(方便地选择轴):
方程 3:代表抛物线的方程。
图 7:在图 1 的抛物线段中定义了三个点 A、B 和 C。
然后,我们定义三个点 A 、 B 和 C ,并进行图 7 所示的构造,其中:
等式 4:三个点 A、B 和 C 的定义,如图 7 所示
从图 7 中,我们发现以下关系:
等式 5:根据 y 在点 x₁的导数,我们发现穿过 C 的垂直线是弦 AB 的*分线。
根据等式。5、穿过 C 的垂直线是弦 AB 的*分线。它们相交的点用 p 表示。这足以证明
等式 6:如果证明了这个等式,等式。2 是服从。
我们自动证明情商。2(更多详情见此链接)。从图 7 中我们看到,垂线穿过 E *分点 G 处的线段 BC 和点h处的线段 BP ,如果我们现在证明:
我们将拥有:
等式 7:这些等式是上面等式的结果。
现在,因为:
我们直接得到 Eq。6.现在证明情商的最后一步。二是检查:
或者等效地,根据图 7:
为了证明这一点,我们将解析几何应用于图 7。很自然,阿基米德的证明仅仅基于几何学,因为解析几何仅仅是在 17 世纪发展起来的(由法国哲学家、数学家和科学家勒内·笛卡尔提出)。
经过一些简单的代数运算后,我们得到:
情商。8:使用图 3 中的结构证明 FE=(1/4)QB。
最后一步:运用穷举法
现在使用穷举法 和对较小的三角形(低于 ACD 和 BCE)重新应用与弦 ABC 相同的程序,我们得到一个几何级数,其和给出了我们想要的结果:
感谢您的阅读,再见!一如既往,我们随时欢迎建设性的批评和反馈!
我的 Github 和个人网站 www.marcotavora.me 有一些其他有趣的材料,既有关于数学的,也有关于物理、数据科学和金融等其他主题的。看看他们!
在 AWS 上为企业数据交付构建无服务器数据集成中心(2020 年)
更新后的 2022 版本现已发布于—https://medium . com/@ gvaidyanatha/architecting-server less-data-integration-hubs-on-AWS-for-enterprise-data-delivery-2022-6 EBA 5 EDF 93 a 0!
简介
新年快乐如果数据是新的石油,为什么我们的系统会经历如此多的反作用?在之前名为 无服务器数据集成 的两部分文章系列中,详细讨论了数据集成的重要性,尤其是在无服务器领域。我们得出的结论是,数据集成是一项关键的业务需求,每个 IT 组织都必须积极主动地集中解决这一问题。再次重申,数据集成真正专注于为企业提供价值,通过实现真正的分析、机器学习和人工智能计划,并提供干净和标准化的数据。如果没有高质量的数据,通过各种分析、机器学习和人工智能计划产生的商业见解充其量也是值得怀疑的。如果你错过了,这里有以前文章系列的链接:
在这篇文章中,我想澄清一些与我们讨论的主题相关的附加要点。我还想分享一个在 Amazon Web Services (AWS)上实现的数据集成中心(以下称为中心)的示例参考架构。
净化空气
数据集成中心不是数据湖 数据湖以接*原生格式存储数据。对于某些定制分析计划来说,这可能已经足够了,但是一个能够清理、标准化数据并使数据符合所有主流法规要求的集中式数据服务能够为企业带来更高的价值。集线器的价值主张很简单——一写多读(蠕虫),确保数据质量、标准化和合规性。保持与时俱进,不要让数据过时!
为了实现这一点,Hub 采用了 ELTn (提取负载转换( n ))的概念,而不是经典的 ETL (提取转换负载)。 ELTn 意味着在加载数据之前,转换并不是一个单一事件。这是一个持续的过程,在支持特定业务功能的数据的生命周期中会发生多次。目标是最终达到高水*的数据卫生,这样所有数据都是干净的。Hub 支持不断维护最新“业务对象”的范例,与业务经历的转变相匹配。
一旦来自给定摄取过程的数据被标记为干净的,所有下游应用程序都可以使用来自中心的数据。这最大限度地减少了后端记录系统的数据提取负载,更不用说重复和浪费的数据清理工作了。此外,数据质量和合规性合规性可以在一个集中的位置一次性完成。这使得高质量和相关的企业数据交付成为可能。让我们把数据干净合规一次。这就是集线器的作用。
该中心解决了多年来糟糕的数据管理导致的猖獗的数据孤岛问题。与数据湖相比,集线器是一个活生生的、不断发展的企业集中式授权数据分发器。如前所述,数据湖将不同的数据源集合在一起,并以几乎完全相同的原始格式存储。通过为企业内的所有数据计划提供所需的质量、标准化和合规性,Hub 可以做得更多。
我们能在试着跑之前先走一走吗?
问当今任何一位 C 级高管,他最关心的是什么,答案几乎总是“需要用人工智能(AI)做点什么”。在一些回答中,你可以用“机器学习(ML) 来代替人工智能,但这已经足够接*了,因为 ML 是人工智能的先决条件。每个人都想做人工智能,但在我们开始这个旅程之前,我们需要建立一个坚如磐石的数据管道,来创建/提供/维护一个枢纽。问问任何一位数据科学家,仅仅为了他们的特定项目,他在清理和争论数据上花了多少时间。这个问题的答案将显示出一个集中的枢纽的明显价值。此外,该中心使数据科学团队能够获得更多产出,因为他们可以专注于自己的技能——数据科学,而不是数据清理或数据争论。记住 WORM 好,WORO 不好:)
因此,数据工程是所有数据驱动业务的基本要求。数据是业务积极变化的基本驱动力之一。许多 IT 组织已经改变了他们的思维模式,将数据工程作为一项核心能力来支持,由于这一新业务需求的重要性,这一点正在迅速显现。
Monica Rogati 于 2017 年 6 月发表的关于 Hackernoon ( AI 需求层次 )的优秀文章,仍然与我们讨论的话题非常相关。从那篇文章中引用的下图是对核心思想的阐述,即在生活中,我们需要在触及深奥的方面之前首先完成基础。我对罗加蒂女士的图形做了两处定制,一是使用了 ELTn 而不是 ETL ,二是在金字塔中概述了中枢的功能。我们感谢亚伯拉罕·马斯洛先生在许多个月前用金字塔展示和说明他的工作。图一图胜千言。谢谢你,罗加蒂女士!
图 1:我们能不能在试着跑之前先走一走?
数据从业者眼中的结构!正如情人眼里出西施一样,数据的内在结构也是如此——在数据从业者的眼中也是如此。人们希望在关系表中存储什么与 NoSQL 数据存储或 BLOB 存储之间的界限是一个需要参与的相关讨论。然而,将数据划分为结构化、半结构化和非结构化的价值有待讨论。请允许我在 图 2 & 3 中解释这一点,我们来看看一个样本网络日志和一条推文,它们通常都被归类为非结构化数据。
图 2:一个样本 Web 日志的数据结构
图 2 展示了 NASA 公开的网络日志的内容。人们很快就会想知道为什么 web 日志被归类为非结构化的,因为上面的内容可以很容易地存储在关系表中。现在,由于各种其他原因(例如数据量和检索的轮流性能),我们可能不想将它存储在关系表中,但这是一个完全不同的讨论。这仍然不能改变上面的 web 日志样本是结构良好的数据这一事实。
现在让我们来看看一条样本推文的结构:
图 3:一条推文的数据结构
图 3 展示了 tweet 的结构。是的,它是 JSON 格式的,数据存储在 NoSQL 的数据库中,但是为什么这一定会使它成为非结构化的呢?在数据从业者看来,这是一个漂亮的灵活的结构化业务对象。
对于数据从业者来说,所有的数据都有结构。结构甚至存在于音频和视频文件中。现在,视频文件可能不具备将其存储在“表格”中的“所需结构”。但是话又说回来,我们似乎无意中(依我拙见是不正确的)将结构的存在等同于表格的存在。出于上述原因和本文的目的,数据应该分为关系型和非关系型。如果将它存储在表中有意义,那么它就是关系型的。如果没有,它就是非关系的。根据数据的特征,有许多非关系数据存储是适用的。让我们用能把工作做好的那个。
安静时间的相关性&工作负载成本 在之前文章系列的第二部分中,我介绍了安静时间的概念,作为我们在决定给定工作负载是否符合无服务器条件时使用的一个相关标准。值得注意的是,并非所有工作负载都真正适合无服务器计算。由于处理的性质,集线器是无服务器计算实现的典型代表。就某一天需要处理的数据量而言,集线器通常是不可预测的。此外,摄取和其他相关任务的时间安排需要动态扩展,以实现最佳性能。通常情况下,一个集线器在 24 小时内也有空闲时间。所有这些都使它成为无服务器的理想选择。
下面是一个简单的公式来计算一个工作负载的安静时间( qt ),这有助于确定无服务器计算的可行性:
qt = round (((x/86400) * 100),2) %
其中,x= '工作负载空闲时间 ',在 24 小时内以秒为单位测量
在上面的公式中,安静时间( qt )是以工作负载的空闲时间( x )占一天所用时间的百分比来计算的— 24 小时= 86400 秒。 qt 对于确定给定上下文中无服务器计算的相关性很重要。例如,如果给定的工作负载在任何给定的一天*均空闲 25300 秒,这意味着 x=25300 ,允许我们推导:
Qt = round((25300/86400) 100),2) = 28.28%* 。
在上面的例子中,我们得出结论,应用程序在任何给定的一天中有 28.28% 的时间是安静的,因此它是无服务器计算的潜在候选对象。一旦我们完成成本计算工作,我们就会确切知道。重点是,如果您的应用程序没有空闲/安静时间,并且 24x7x365 不间断地处理,那么无服务器可能不是正确的选择。
我们现在计算相关的无服务器和基于服务器的服务的成本,以确定哪种服务更好。两个成本计算工作中较低的一个将引导我们选择首选方案:
a. scc —无服务器计算成本
这是使用无服务器计算服务的成本。无服务器计算成本通常包括函数执行请求的数量、 AWS Step Functions/Lambda 中请求的 CPU & RAM、 API Gateway 对此类函数执行请求的请求以及支持给定工作负载所需的任何其他服务(包括数据库成本,如 Amazon DynamoDB 或 Amazon Aurora 无服务器)。在无服务器计算中,没有与空闲时间/安静时间相关的计算成本。
b. tcc —传统计算成本(基于服务器)
这是使用基于服务器的计算服务的成本。这些计算成本通常包括应用程序和数据库服务器的计算引擎、编程语言软件许可、数据库软件许可、与所述基于服务器的服务的软件维护相关的人员成本(安装、修补、操作系统升级、编程语言软件和其他第三方软件)以及软件维护费用的实际成本(支付给供应商)。在此模型中,所有计算*台都有与空闲时间/安静时间相关的计算和其他成本。
如果 scc < tcc ,很明显,即使从成本角度来看,工作负载也符合无服务器的条件。如果 scc > tcc 的话,显然无服务器会比基于服务器的模式花费更多。但是,可能还有其他原因促使无服务器模式成为首选。这可能包括(除其他外)组织内缺乏深厚的技术人才来支持相关计算*台中工作负载的软件和数据库堆栈的升级和维护。
注释: 1。有人可能会说,AWS 支持费用也应计入 scc 中,如果有一种方法可以确定按比例分配的 AWS 支持费用(仅针对无服务器服务计算),则可以做到这一点。这说起来容易做起来难,但是为了简单起见,这应该被认为是两种模型之间的共同成本,因此被排除在外。 2。S3、网络、数据传输(入口和出口)等服务的存储成本也可视为SCC和TCC的共同成本。因此,这些组成部分也可以从成本计算中去除。将这些成本添加到SCC中,前提是它们与 it 相关,而不是与TCC相关。
AWS 上无服务器数据集成中心的体系结构
4 层 轮毂中有 4 层/支柱,在 AWS 上显示如下:
图 AWS 上的数据集成中心— 4 层/支柱
数据流经集线器的 4 层。每一层都支持数据集成架构的独立功能。这 4 层/支柱是:
1.摄入
2。持久性
3。变换
4。分析/ML/AI
该架构是利用独立服务专门构建的。这使得能够独立扩展每一层,支持抽象以管理复杂性,解耦服务以避免序列化,自动供应资源(在可行的情况下)并促进异步执行模型。在许多方面,这些都是云计算的基本原则。
深入到 4 层/支柱 图 5 说明了每层/支柱中的相关服务和详细信息:
AWS 上的无服务器数据集成中心—详细架构(所有层)
现在让我们更深入地研究一下每一层/每一个支柱。
接收是来自多个来源的数据进入中枢的第一层(层#1)。对于批量提取,数据的着陆区是一个无服务器的亚马逊 S3 桶,在这里,数据经过预处理,通过亚马逊雅典娜进行某些基本检查。在数据成功到达 S3 的事件时,微服务( AWS 阶跃函数/λ)处理数据。同等的亚马逊 Kinesis 实时数据流处理服务负责处理以零星突发形式到达中心的数据流。
持久性,架构的第二层(第 2 层),在 Hub 中存储数据起着至关重要的作用。 Amazon DynamoDB 在这里发挥了巨大的作用,因为它是数据集成的核心。第 2 层存储、管理和维护业务对象。当数据在第 1 层被接收时,它被传输到第 2 层,并以一种的*似原始格式存储在 RAWDB(原始数据的一组表)中。更复杂的数据验证例程在转换层执行。如果某个业务功能的数据消费模型是基于表的数据,而不是基于 JSON 的业务对象,那么第 4 层中业务洞察的持久性是使用 Amazon Aurora 无服务器来完成的。
转换是第三层(第三层),它处理创建干净的业务对象的复杂性。转换层的复杂性和繁重工作与确保数据符合数据质量规则、业务规则和合规性规则/策略有关。层#2 的 RAWDB 中的数据到达是下一个事件的,该事件触发主转换微服务及其相关的子微服务。这些基于事件的微服务在 AWS 步骤功能/Lambda 中实现。完全符合所有预定义转换规则的数据保存在 CLEANDB(另一个包含一组干净数据相关表的逻辑容器)中,错误/不符合规则的数据存储在 ERRORDB(错误数据的第三个逻辑容器)中。
分析/机器学习(ML)/人工智能(AI) 是产生商业洞察(BI)的第四层。该层由层#2 内 CLEANDB 中的数据到达触发(**下一个事件)。该层支持业务关键绩效指标(KPI)的计算和存储,以及分析/ML/AI 工作的管理。所有作业(BI)的结果都存储在 INSIGHTSDB 中(视情况而定,亚马逊 DynamoDB* 和亚马逊 Aurora 无服务器中洞察的第四个逻辑容器)。这里使用了多个无服务器服务来生成业务洞察(亚马逊 S3、亚马逊雅典娜、亚马逊法盖特、亚马逊 SageMaker) )。请注意亚马逊 SageMaker 不是无服务器的,这里列出是为了机器学习项目的完整性。列出 Amazon Fargate 是为了促进无服务器容器的概念,这些容器运行分析和机器学习算法来生成 BI 并存储在 INSIGHTSDB 中。*
当数据通过所有 4 层时,就完成了一个数据集成周期。当新的/修改过的数据从后端系统流入中心时,或者当数据被扩充、校正和重新处理以从 ERRORDB 移动到 CLEANDB 时,该循环被重复。
注意: 从长远来看,历史数据的持久性和管理(RAWDB & CLEANDB)需要通过标准的信息生命周期管理(ILM)措施来解决,这些措施利用了各种基于层的数据持久性服务。AWS 通过亚马逊 S3 冰川和亚马逊 S3 冰川深度归档的多层存储供应模型来支持这一点。这确保了数据持久性成本保持在最佳水*,同时符合所有法规要求。
可视化在企业内部的信息传递中也扮演着重要的角色。这就是 BI 仪表板发挥作用并为业务带来价值的地方。在维护无服务器范式的过程中, Amazon QuickSight 是未来的一个选择,届时将支持通过 API 网关中的 RESTful 端点直接访问数据。**
消费模式 在生成 BI 时,需要支持应用实时消费 INSIGHTSDB & CLEANDB 中的数据。这种消耗是通过数据访问层(DAL)完成的,如图图 5* 所示。利用 RESTful 端点( API 网关),支持各种业务对象的 BI 和底层数据的消费。从关系数据存储(如亚马逊极光无服务器)中检索数据是通过利用亚马逊极光无服务器的数据 API 实现的。需要注意的是 API 网关是数据消费的唯一入口。该服务几乎消除了所有不必要的外部数据违规和数据泄漏,因为它仅在数据请求附有所需凭据时才提供数据。这些必需的凭证(安全凭证和数据权利*)是从企业的联合认证系统( AD、LDAP 等)接收的。)与 AWS 身份和访问管理 ( Amazon IAM )和 Amazon Cognito 协同工作。**
使用 API 网关创建的定义良好的 RESTful 端点,不仅消除了对到 Hub 的持久数据库连接管理的需求,还减轻了数据结构变化的影响。例如,从 RESTful 端点接收和处理 JSON 文档(业务对象)的应用程序可以继续这样做,而不管所有数据结构的变化(添加或删除数据元素)。这确保了在不断变化的业务环境中,应用程序和数据中心的运行时灵活性。
注: 虽然没有明确说明,但应该假设所有标准的网络和隔离安全最佳实践。这符合 AWS 良好架构的框架。
集线器真正提供了什么?
Hub 的目标是交付最新的业务对象,提供业务任何方面的 360 度视图。图 6 展示了一个集成的客户业务对象,它构建在一个“中心辐射模型”中。
图 6:样本集成业务对象—客户
结论
AWS 提供了一套丰富的服务来设计和构建无服务器数据集成中心。交付给企业的高质量和标准化数据的价值是一项关键功能,需要通过数据工程主动解决。显而易见,好的数据会产生有意义的商业见解。这才是真正的业务附加值。我祝愿您在 2020 年及以后的所有数据集成工作中一切顺利。好好照顾自己,保持联系!
参考
- 我们能在跑之前先走一走吗?—https://hacker noon . com/the-ai-hierarchy-of-needs-18f 111 FCC 007
- 网络日志的数据结构—http://opensource.indeedeng.io/imhotep/docs/sample-data/
- Tweet 的数据结构—https://developer . Twitter . com/en/docs/tweets/data-dictionary/overview/intro-to-Tweet-JSON
- AWS 架构图标—https://aws.amazon.com/architecture/icons/
- 无服务器数据集成—第一部分(2019),Gaja Vaidyanatha—https://medium . com/@ gvaidyanatha/server less-Data-Integration-Part-I-2019-B3 B3 B3 BC 332 a
- 无服务器数据集成—第二部分(2019),Gaja Vaidyanatha—https://medium . com/@ gvaidyanatha/server less-Data-Integration-Part-II-2019-fb55d 180 feb
最初发布于 LinkedIn—https://www . LinkedIn . com/pulse/architecting-server less-data-integration-hubs-AWS-2020-vaidyanatha
作为图表的建筑
计算方法
杰弗里·兰德斯 ,数据科学家@ Spacemaker AI
hkon Dissen、软件工程师@ Spacemaker AI
贺康 Fure ,数据科学家@ Spacemaker AI
Chaillou,建筑师&数据科学家@ Spacemaker AI
在本文中,我们公布了 Spacemaker AI 在过去一个季度中实施的一些最新成果和方法。这个项目旨在支持 Spacemaker 的长期愿景,作为我们正在进行的许多研究计划之一。
*面布置图的设计可以利用机器的直觉来生成和验证潜在的设计选项。在这篇文章中,我们提出了一个特定的空间抽象:邻接。任何*面布置图都有自己的嵌入式逻辑;显然,房间的相对位置和它们之间的联系是由某种相互依赖的逻辑所驱动的,并在空间中产生不同的质量。例如,一个房间的存在将决定其他房间的存在,以及它们之间的开口位置。首先,我们试图在这里鉴定现有*面布置图的邻接关系,以评估房间间邻接关系的相关性。我们稍后转向贝叶斯建模来生成邻接图,自由地或者在设定的约束下。通过限定和生成,我们希望研究同一个问题的两个方面:理解相邻空间之间的关系。
一.资格
房间之间的相邻关系定义了任何给定*面图的质量。鉴于它们连接的房间,这些关系或多或少是相关的。在不同的背景下,它们的重要性也各不相同。适合工作室的东西不一定适合两居室。在重要性和相关性的交叉点上,我们提供了一种既容易解释又可调的质量评估方法。
我们的框架交叉引用了两个矩阵:
- 连接矩阵 ( 图 1,左),其中我们定义了在给定的*面布置图中,某些连接应该(直接)还是不应该(间接)存在。
- 重要性矩阵 ( 图 1,右),其中我们指定了连通性矩阵中定义的规则实际上有多重要。
图 1: 邻接规则&框架 |来源:作者
然后,我们通过提取它们的邻接矩阵并基于上述框架对其分级来对*面布置图评分。在 clear 中,邻接图中存在的每条边都将通过查询其“连通性 x 重要性”得分来分级。*面图的总体等级是所有边的综合得分。我们在图 2 中展示了这个过程。
图 2: 邻*评分法 |来源:作者
因为这些规则是依赖于上下文的,所以确保设计者可以改变它们是至关重要的。这种方法允许设计者根据他/她对给定*面布置图的期望,通过简单地编辑两个矩阵中的权重来调整评分方法。我们在图 3 中显示了我们数据库的一个子集,其中每个连接都被分配了一个分数,使用了上面的框架&权重。
图 3: 邻接评估图 |来源:作者
二。产生
图 4: 贝叶斯因果图为(左 ) 工作室,【中】一居室公寓&(右)两居室公寓|来源:作者
我们现在转向邻接图的生成。我们更喜欢使用贝叶斯方法,而不是使用任何形式的程序或基于规则的技术。这个统计领域通常被描述为:
“基于数据以及关于事件或与事件相关的条件的先验信息或信念,对事件的条件概率的研究”。
对我们来说,贝叶斯方法提供了一个机会来研究和建模一组潜在的关系(原因),这些关系决定了*面图中房间的存在,以及它们之间潜在的现有联系。例如,给定房间的存在可以导致另一个房间的存在,并决定房间之间连接的存在。这一事实可以通过我们 500 多个*面图的数据库使用贝叶斯统计来捕捉。
我们将房间和连接建模为节点,并希望我们的贝叶斯模型将帮助我们推断它们之间因果关系的存在,以及这些相互依赖的相对权重。
A.工作室
图 5: 贝叶斯因果图 工作室类型学 |来源:作者
我们首先在工作室计划的子集上运行模型。这些*面图只展示一个卧室,没有客厅,最多 6 个房间。该模型能够相当快地绘制出房间和连接之间的所有现有因果关系(图 5 中的边和图 5 中的节点)。总之,给定节点的传入边形成了条件概率表。这种形成意味着房间或相邻空间存在的概率取决于其父值。这样,我们从数量上和拓扑上揭示了房间和连接之间相互依赖的存在。
你也可以在这个地址 浏览这个贝叶斯因果图 的交互版。
为了生成新的工作室式邻接图,我们现在可以从上面的图中取样。由于抽样本质上是一个随机过程,所以每次都会产生不同的结果。因此,我们可以生成大量不同的图形结构,所有这些都是从我们的数据库中找到的工作室公寓的观察结构中得到的启发。
我们在图 6 中展示了这些图的子集。我们可以注意到,大多数相邻音都是声音,反映了工作室公寓中常见的典型节目组合和连接。
图 6: 抽样邻接图 |来源:作者
现在可以使用上面定义的评分方法对这些图表进行分级。为了限制我们的贝叶斯方法可以产生的图的数量,我们使用分数来过滤掉不相关的选项。
图 7: 抽样的&得分邻接图 |来源:作者
B.一居室公寓
图 8: 一居室 Apt 的贝叶斯因果图 。类型学 |来源:作者
我们在这一部分应用相同的过程,这次是一居室公寓的子集。这些*面图有一个客厅、一个卧室和最多 10 个房间。
由此产生的因果图如图 8 所示。
你也可以在这个地址 浏览这个贝叶斯因果图 的交互版。
我们在图 9 中显示了一个子集的采样图 ,以及图 10 中相同的图,使用之前定义的评分方法 进行评估。
图 9: 抽样邻接图 |来源:作者
图 10: 抽样的&得分邻接图 |来源:作者
C.两居室公寓及更多
图 11: 两居室 Apt 的贝叶斯因果图 。类型学|资料来源:作者
我们在这一部分应用相同的过程,这次是两居室公寓的子集。这些*面图有一个客厅、两个卧室和最多 13 个房间。
产生的因果图如图 11 所示。
你也可以在这个地址 浏览这个贝叶斯因果图 的交互版。
我们在图 12 中显示了采样图 的子集,在图 13 中显示了使用之前定义的评分方法 评估的相同图形。
图 12: 抽样邻接图 |来源:作者
图 13: 抽样的&得分邻接图 |来源:作者
三。结论
本文使用的贝叶斯方法证明了设计过程的随机性的相关性。一方面,统计推断允许我们模拟和复制复杂的现象,这里,在*面图中发现的复杂性。另一方面,它允许我们产生各种各样的选择,这将激发创造性的过程。
同时,我们为将设计分解成嵌套的步骤和抽象层次的重要性提供了证据。我们已经在这里通过处理它们的相邻关系解决了*面图的底层结构。通过限定和生成这样的邻接,我们展示了*面布置图的高级表示的重要性,以及这种抽象对于理解空间规划是多么重要。
事实上,解决房间之间的层次和联系是我们走向更全面的*面图生成定义的第一步。从空间中房间的一组相邻关系到实际几何形状,我们计划扩展这项研究,将我们当前的模型与另一个生成模型相结合,生成最终的*面布置图。
最后,我们希望我们的框架将有助于解决*面图设计的无尽复杂性。像我们这样使用贝叶斯方法处理他们的结构,是我们相信的一大组选项中的一种可能的方法。要概括空间规划的必要步骤,关键更多的是原则而不是方法。随着建筑数据可用性的增加,我们鼓励进一步的工作和开放的实验。
参考
- 石榴:Python 中快速灵活的概率建模,机器学习研究杂志 2018 年第 18 期,Jacob Schreiber & al。[ 链接 ]
- 贝叶斯统计:导论,第四版,彼得·m·李,威利[ 链接 ]
- 计算机生成的住宅建筑布局图。,斯坦福大学,2010 [ 链接 ]
AlexNet、VGGNet、ResNet、Inception、DenseNet 的架构比较
内部人工智能
ILSVRC 挑战结果中具有超参数和准确性的图层描述
你好,读者,如果你正在寻找一个完美的指南来获得关于 AlexNet,VGGNet,ResNet,Inception 和 DenseNet 的所有信息,那么你在正确的地方。仔细阅读博客,你会得到关于所有架构的详细信息。尽情享受吧!!!
来源:https://www . tech leer . com/articles/259-concepts-of-advanced-deep-learning-architectures/
AlexNet
AlexNet 架构[1]
AlexNet 图层详细信息[2]
AlexNet 是第一个大规模卷积神经网络架构,在图像网络分类上表现良好。AlexNet 参加了比赛,并能够以显著的优势超越所有之前的非深度学习模型。
AlexNet 架构是一个 conv 层,然后是池层、标准化、conv 池规范,然后是几个 conv 层、一个池层,然后是几个完全连接的层。实际上看起来很像 LeNet 网络。总共只是多了几层而已。共有五个 conv 层,在最终的全连接层到达输出类之前,还有两个全连接层。
AlexNet 在 ImageNet 上接受训练,输入大小为 227 x 227 x 3 的图像。如果我们看看第一层,这是 AlexNet 的 conv 层,它是 11 x 11 个过滤器,其中 96 个应用于 stride 4。我在输出中有 55 x 55 x 96,在第一层中有 35K 参数。第二层是池层,在这种情况下,我们在步长 2 处应用了 3 个 3 x 3 的过滤器。汇集层的输出体积为 27 x 27 x 96,要学习的参数为 0。池层不学习任何东西,因为参数是试图学习的权重。卷积层具有我们学习的权重,但汇集我们所做的只是有一个规则,我们查看汇集区域,并取最大值。因此没有学习到的参数。
开始有 11×11 个过滤器,然后是 5×5 和一些 3×3 个过滤器。最后,我们有两个大小为 4096 的完全连接的层,最后一层是 FC8,它连接到 softmax,soft max 连接到 1000 个 ImageNet 类。这种结构是 ReLu 非线性的首次应用。
超参数:
这种结构是 ReLU 非线性的首次应用。AlexNet 也使用了一层标准化。在数据扩充中,ALexNet 使用了翻转、抖动、裁剪、颜色标准化等等。其他参数是 0.5 的辍学、0.9 的 SGD +动量、1e-2 的初始学习率,并且当验证准确度变得*坦时再次减少 10。该网络中使用的正则化是权重衰减为 5e-4 的 L2。它是在包含 3GB 内存的 GTX580 GPU 上训练的。
它在 ImageNet 大规模视觉识别挑战(ILSVRC)中的错误率为 16.4。
AlexNet 是 2012 年 ImageNet 大规模视觉识别挑战(ILSVRC)基准分类的获胜者。
VGGNet
VGG16 架构[3]
VGG 16 层和 VGG 19 层细节[2]
在 2014 年,有几个架构有了显著的不同,在性能上又有了一次飞跃,这些网络与更深层网络的主要区别是。
VGG 16 是 16 层体系结构,具有一对卷积层、池化层和最后的全连接层。VGG 网络是更深层次的网络和更小的过滤器。VGGNet 从 AlexNet 的八层增加了层数。现在它有 16 到 19 层的 VGGNet 版本。一个关键的事情是,这些模型始终保持非常小的 3 x 3 conv 过滤器,这基本上是最小的 conv 过滤器大小,查看一点点相邻像素。他们只是保持了这种非常简单的 3 x 3 convs 结构,并通过网络定期进行池化。
VGG 使用小过滤器,因为参数更少,并堆叠更多的过滤器,而不是更大的过滤器。VGG 有更小更深的过滤器,而不是大过滤器。它最终具有相同的有效感受野,就好像只有一个 7 x 7 卷积层一样。
VGGNet 有 conv 层和一个池层,还有几个 conv 层,池层,几个 conv 层等等。VGG 架构总共有 16 个卷积和全连接层。在这种情况下,VGG 16 有 16 层,VGG 19 有 19 层,这只是一个非常相似的架构,但其中多了几个 conv 层。
VGG16 参数[2]
因此,这是相当昂贵的计算,总共有 138M 参数,每个图像有 96MB 的内存,这比常规图像大得多。它在 ILSVRC 挑战中只有 7.3 的错误率。
VGGNet 是 2014 年 ImageNet 大规模视觉识别挑战(ILSVRC)分类基准的亚军。
雷斯内特
ResNet 架构和层细节[2]
ResNet 的主要基本元素是剩余块。随着我们深入到具有大量层的网络中,计算变得更加复杂。这些层放在彼此之上,每一层都试图学习所需函数的一些底层映射,而不是拥有这些块,我们试图拟合一个残差映射。
普通层与残余块[2]
在右边,这些模块的输入只是进来的输入,而在另一边,我们将使用我们的层来尝试拟合 H(X) - X 的一些残差,而不是直接拟合所需的函数 H(X)。基本上,在这个模块的末尾,它会跳过这里的连接,在这里,它只接受输入,并将其作为一个身份传递,因此,如果中间没有权重层,它就只是一个身份。这和输出是一样的,但是现在我们使用额外的权重层来学习一些 delta,一些来自 x 的残差。
简而言之,随着我们深入网络,学习 H(X)是如此困难,因为我们有大量的层。所以这里我们用了跳过连接和学习 F(x)直接输入 x 作为最终输出。所以 F(x)被称为残差。
在 ResNet 中,将所有这些块非常深入地堆叠在一起。这种非常深的架构的另一个特点是,它支持高达 150 层的深度,然后我们定期堆叠所有这些层。我们还将滤波器数量增加一倍,并使用步长 2 进行空间下采样。最后,只有完全连接的第 1000 层才能输出类。
超参数:
在 ResNet 中,它在每个 conv 图层后使用批量归一化。它还使用 SGD + Momentum 的 Xavier 初始化。学习率为 0.1,当验证误差变为常数时,学习率除以 10。此外,批量大小为 256,重量衰减为 1e-5。重要的是,在 ResNet 中没有使用辍学。
ResNet 以 3.6%的错误率在 ILSVRC 和 COCO 2015 比赛中获得第一名。(比人类的表现还要好!!!)
开始
Inception v3 是一种广泛使用的图像识别模型,已被证明在 ImageNet 数据集上获得了超过 78.1%的准确率。该模型是多年来由多名研究人员开发的许多想法的结合。
模型本身由对称和非对称构建块组成,包括卷积、*均池、最大池、漏失和完全连接层。Batchnorm 在整个模型中广泛使用,并应用于激活输入。损耗通过 Softmax 计算。
初始阶段的工作是分解卷积。分解卷积用于减少要学习的连接和参数的数量。这将提高速度并提供良好的性能。
GoogleNet 使用 5x5 卷积层,而在 inception 中使用两个 3x3 层来减少学习参数的数量。在 5×5 中共有 25 个参数,3×3+3×3 中共有 18 个参数要学习。因此,无学习参数显著减少了 28%。
分解成非对称卷积也用于初始阶段,这也有助于减少学习参数。
一个 3×1 卷积后跟一个 1×3 卷积代替一个 3×3 卷积。在一个 3×3 中总共有 9 个参数,而 3×1+1×3 总共有 6 个参数,所以它将减少 33%。这种方法不太可能在您深入训练时过度拟合模型。[4]
在 42 层深度的情况下,计算成本仅比 GoogleNet 高 2.5 倍左右,比 VGGNet 效率高得多。
Inception-v3 用 144 个作物和 4 个模型集合,得到 3.58% 的前 5 名错误率,最终在 ILSVRC 2015 获得亚军(影像分类)。
DenseNet
DenseNet 由如下所示的密集块组成。在这些块中,图层紧密地连接在一起:每一层都从以前的图层获得输入输出要素地图。残差的这种极端重用创建了深度监督,因为每一层都从前一层接收更多的监督,因此损失函数将做出相应的反应,并且由于这种方法,它使其成为更强大的网络。
DenseNet 框图
DenseNet 由两个模块组成:
- 致密块体:单个块体由这些层组成:
- 批量标准化
- ReLU 激活
- 3x3 卷积
2.过渡层:在 ResNet 中将执行残差求和,而不是将残差求和 Densenet 连接所有的特征映射。这一层是由
- 批量标准化
- 1x1 卷积
- *均池
基本上,Densenet 的卷积生成较少数量的特征图。DenseNet 对宽层的需求较低,因为层是紧密连接的,所以在学习的特征中几乎没有冗余。多层密集的块共享一块集体知识。层的输出特征地图的数量被定义为增长率。最终,增长率控制着每一层向全球贡献多少新信息。
DenseNet 建筑
简而言之,DenseNet 架构最大限度地利用剩余机制,使每一层都与其后续层紧密相连。模型的紧凑性使得学习到的特征不冗余,因为它们都通过集体知识共享。以训练由于隐式深度监督而紧密连接的深度网络,其中梯度由于短连接而更容易回流。
参考资料:
[1]https://mc.ai/alexnet-review-and-implementation/
[2]http://cs 231n . Stanford . edu/slides/2019/cs 231n _ 2019 _ lecture 09 . pdf
[3]https://www . pyimagesearch . com/2017/03/20/imagenet-vggnet-resnet-inception-xception-keras/
[4]https://medium . com/@ sh . tsang/review-inception-v3-第一名-亚军-图片-分类-in-ils vrc-2015-17915421 f77c
架构—第 1 部分
FAU 讲座笔记关于深度学习
从 LeNet 到 GoogLeNet
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是讲座视频&配套幻灯片的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
欢迎回到深度学习,你可以在视频中看到,我有几个升级。我们现在有了更好的录音质量,我希望你也能看到我最终解决了声音问题。你现在应该能听得更清楚了。我们回来参加新的会议,我们想谈谈几个令人兴奋的话题。让我们看看我为你准备了什么。所以今天我想开始讨论不同的架构。特别是,在前几个视频中,我想谈谈早期的架构。我们在深度学习的早期看到的东西。接下来,我们将在后面的视频中探讨更深入的模型,最后我们想谈谈学习架构。
为了更快地测试架构,可以使用更小的数据集。 CC 下的图片来自深度学习讲座的 4.0 。
我们将在接下来的几张幻灯片和视频中看到的许多内容当然是为图像识别和物体检测任务开发的。特别是两个数据集对这类任务非常重要。这是你在[11]中找到的 ImageNet 数据集。它有大约 1000 个类和超过 1400 万张图片。子集已用于 ImageNet 大规模视觉识别挑战。它包含不同大小的自然图像。所以,很多这样的图片实际上是从网上下载的。如果你不想马上用几百万张图片进行训练,也有更小的数据集。所以,它们也很重要。CIFAR 10 和 CIFAR 100 分别有 10 个和 100 个类。在这两种情况下,我们只有 50k 训练和 10k 测试映像。为了能够快速探索不同的架构,图像缩小到 32 x 32。如果你有这些更小的数据集,那么训练也不需要这么长时间。所以如果你想评估你的架构,这也是一个很常见的数据集。
Yann LeCun 的 LeNet 是深度学习短暂历史中的一个里程碑式的架构。来自深度学习讲座的 CC BY 4.0 下的图片。
基于这些不同的数据集,我们接下来想继续研究早期的架构。我认为其中最重要的是 LeNet,它于 1998 年在[9]中发表。你可以看到这本质上是我们迄今为止一直在讨论的卷积神经网络(CNN)。例如,它已经被用于字母识别。我们有具有可训练内核和池化的卷积层、另一组卷积层和另一个池化操作,最后,我们将进入完全连接的层。因此,我们逐渐减少维度,最后,我们有对应于类的数量的输出层。这是一个非常典型的 CNN 类型的架构,这种方法已经在许多论文中使用。这激发了很多工作。我们为这里的每个体系结构都提供了关键功能,您可以看到,这里的大部分项目符号都是灰色的。这意味着这些特征中的大部分没有保留下来。当然,这里保留下来的是空间特征的卷积。这是仍然流行的主要观点。所有其他的事情,比如使用*均池的二次抽样,都没有经过时间的考验。它仍然用双曲正切作为非线性。这是一个不太深入的模型,对吗?然后,它在 S2 层和 C3 层之间有稀疏的连接,如图所示。因此,多层感知器作为最终分类器也不再常见。我们不再看到这种情况,因为它已经被完全卷积网络所取代。这是一种更加灵活的方法,卷积池和非线性的顺序也是固定的。今天,我们将以一种更好的方式做到这一点,当然,这种架构是许多进一步发展的基础。所以,我认为把它列在这里真的很重要。
AlexNet 引发了深度学习的大趋势。 CC 下的图片来自深度学习讲座的 4.0 。
我想在这个视频中谈论的下一个里程碑是 AlexNet。你可以在这里找到典型的图像。顺便说一句,您会在原始出版物中找到完全相同的图像。因此,Alex net 由这两个分支组成,你可以看到,即使在最初的出版物中,顶部的分支也被切成了两半。所以,当提到这个图形时,你会在 AlexNet 的许多表示中发现一种人工制品。所以,这个图形被分割成几部分,但并没有那么严重,因为这两部分本质上是相同的。你可以说,它被分成两个子网络的原因之一是因为 AlexNet 已经在图形处理单元(GPU)上实现。这是在 GPU 上实现的,实际上已经是多 GPU 了。所以,你在顶部看到的两个分支,已经在两个不同的图形处理单元上实现,它们也可以被训练,然后使用软件同步。所以,GPU 当然是一个仍然非常普遍的功能。你知道今天深度学习的每个人都非常依赖图形处理单元。正如我们在这节课中多次看到的,它基本上有八层。所以不是那么深的关系网。它有重叠的最大池,步幅为 2,大小为 3。它引入了 ReLU 非线性,这也是当今非常常用的方法。所以这也是一个很重要的特点。当然,它是 2012 年 ImageNet 挑战赛的获胜者,该挑战赛将错误率降低了一半。所以这真的是 CNN 突破的里程碑之一。我们还有什么?为了对抗这种架构中的过拟合,已经在前两个完全连接的层中使用了概率为 0.5 的丢失。此外,还包括数据扩充。所以有随机的变换和随机的强度变化。另一个关键特征是,它一直采用动量为 0.9 的小批量随机梯度下降和 L2 重量衰减,参数设置为 5 倍 10⁻⁵.它使用了一个相当简单的权重初始化。只是用一个正态分布和一个小的标准差。在之前的讲座中,我们已经看到了更好的方法。还有什么重要的?好吧,我们已经看到 GPU 分离是有历史原因的。当时的 GPU 太小,无法托管整个网络,所以它被分成两个 GPU。
网络中的网络论文介绍了 1x1 卷积。来自深度学习讲座的 CC BY 4.0 下的图片。
另一篇重要论文是“网络中的网络”论文,其中介绍了 1x1 滤波器。这最初被描述为网络中的网络,但实际上我们今天称之为 1x1 卷积,因为它们实际上在通道上引入了完全连接的层。如果你想压缩通道,我们现在经常使用这个方法,因为我们在通道维度上完全连接。这非常好,因为我们已经看到这相当于一个完全连接的层。我们现在可以根据 1x1 卷积来集成完全连接的层,这使我们能够实现完全卷积网络的这一非常好的概念。因此,在所有激活中共享的参数非常少。使用全局空间*均池作为最后一层,这实质上是完全卷积神经网络的诞生。
VGG 是一个受欢迎的建筑,因为它可以预先训练。 CC 下的图片来自深度学习讲座的 4.0 。
另一个非常重要的架构是牛津大学视觉几何小组(VGG)的 VGG 网络。他们在每个卷积中引入了小的内核大小。这个网络也很常见,因为它可以下载。因此,有一些预先训练好的模型可供使用,您可以看到,它们在这个网络中的关键特征是,它们在逐步增加通道维度的同时,基本上减少了空间维度。这是一个从空间域到分类器重要解释域的逐步转换。因此,我们可以看到空间维度下降,同时通道维度上升。这让我们逐渐从彩色图像向意义转化。所以,我认为小内核是仍然被使用的关键特性。它通常用于 16 层和 19 层,在某些层之间有最大池。学习过程与 AlexNet 非常相似,但结果证明很难训练。在实践中,你需要用较浅的网络进行预训练来构建这个。因此,该网络在性能方面不是很好,并且有很多参数,但它是预先训练好的,并且是可用的。因此这也导致了社区相当广泛地采用它。所以,你也可以看到,当你使用开源和可访问的软件时,这也是一个关键的特性,对其他人来说很重要,以便开发进一步的概念。参数可以共享。训练好的模型可以共享。源代码可以共享。这就是为什么我认为这是深度学习领域中一个非常重要的实例。
GoogLeNet 引入了几个新概念。 CC 下的图片来自深度学习讲座的 4.0 。
另一个重要的网络,我们已经在这个讲座的很多场合看到过,是 GoogleNet。这里,我们有你在[14]中找到的盗梦空间 V1 版本。我想我想在这里强调的要点是,他们有非常好的想法,通过使用一些技巧来节省计算。因此,他们开发这些网络时考虑到了嵌入式硬件,并且它还在推理时间内进行了 15 亿次乘加运算(MAD)。这很酷,但我发现更酷的是这些初始块。因此,总共有 22 层,全球*均池作为最后一层。这些初始模块真的很好,我们将在下一张幻灯片中更详细地讨论它们,因为它们本质上允许您让网络决定它是想要共享还是想要卷积。这太酷了。另一个非常好的技巧是使用这些辅助分类器,它们应用于早期的层,以稳定梯度。所以,这个想法是你把你的损失插入到一些更早期的层中,在那里你已经试图找出一个初步的分类。这有助于建立更深层次的模型,因为你可以在相当早的阶段引入损失。你知道,你进入网络越深,你越是去更早的层,你越有可能得到一个消失的梯度。有了这些辅助分类器,可以在一定程度上预防。例如,如果你想弄清楚你真正需要多少个 inceptions 模块,这也是非常有用的。然后,您可以使用那些腋窝分类器。这真是一个非常有趣的概念。
初始模块概述。来自深度学习讲座的 CC BY 4.0 下的图片。
因此,让我们谈一谈那些初始模块。顺便说一下,inception 模块当然是已经存在了相当长一段时间的东西,它仍然在许多最先进的深度学习模型中使用。所以通过这些网络有不同的分支。就像只有一个 1x1 卷积,一个 1x1 卷积后一个 3x3 卷积,或 1x1 卷积后一个 5x5 卷积,或最大池后一个 1x1 卷积。因此,所有这些分支并行进行,然后将分支的输出连接起来,提供给下一层。因此,本质上这允许网络决定在下一层信任哪个分支。这样,它可以以某种方式确定它是否想要池或是否想要卷积。所以,你可以把它看作是在训练过程中确定的自动路径。
1x1 卷积能够压缩信道并节省计算时间。 CC 下的图片来自深度学习讲座的 4.0 。
同样有趣的是,1x1 滤波器充当了一种瓶颈层。因此,您可以使用它来压缩先前层的通道。然后,你可以压缩,然后卷积。尽管如此,如果你完全按照这种方式实现,还是有很多计算。因此,他们的想法是使用这个瓶颈层来压缩不同特征图之间的相关性。想法是你有这些 1x1 滤波器。你所做的是省略额外的计算。假设您通过一个 3×3 卷积路由 256 个输入特征地图和 256 个输出特征地图,这将意味着您已经有大约 600,000 个乘加操作。所以相反,你用这些瓶颈想法。通过 1x1 卷积将通道从 256 压缩到 64。然后对 64 个通道进行 3×3 卷积。接下来,您基本上再次从 64 通道解压缩到 256 通道。这节省了大量计算。总的来说,你需要大约 70.000 次乘加运算。如果你看看最初的 600,000 次乘加运算,那么你可以看到我们已经节省了大量的计算运算。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。来自深度学习讲座的 CC BY 4.0 下的图片。
好的,这些本质上是经典的深度学习架构。我们想在第二部分讨论更复杂的问题,在那里我想向你展示如何更深入,以及你如何有效地做到这一点,例如用其他版本的 inception 模块。非常感谢大家的收听,希望在下一段视频中再见!
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] Klaus Greff、Rupesh K. Srivastava 和 Jürgen Schmidhuber。“高速公路和残差网络学习展开的迭代估计”。年:学习代表国际会议(ICLR)。土伦,2017 年 4 月。arXiv: 1612.07771。
[2]何,,,任,等.“深度残差学习用于图像识别”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。拉斯维加斯,2016 年 6 月,第 770–778 页。arXiv: 1512.03385。
[3]何,,,,任等.“深剩余网络中的身份映射”。载于:计算机视觉— ECCV 2016:第 14 届欧洲会议,荷兰阿姆斯特丹,2016 年,第 630–645 页。arXiv: 1603.05027。
[4]胡经昌、沈立群、孙广昌。“挤压和激励网络”。载于:ArXiv 电子版(2017 年 9 月)。arXiv: 1709.01507 [cs。简历】。
[5]黄高,孙玉,刘庄等,“具有随机深度的深度网络”。载于:计算机视觉-ECCV 2016,会议录,第四部分。湛:施普林格国际出版公司,2016 年,第 646–661 页。
[6]黄高、刘庄和基利安·q·温伯格。“密集连接的卷积网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1608.06993。亚历克斯·克里热夫斯基、伊利亚·苏茨基弗和杰弗里·E·辛顿。“使用深度卷积神经网络的 ImageNet 分类”。神经信息处理系统进展 25。柯伦咨询公司,2012 年,第 1097-1105 页。arXiv: 1102.0183。
[8] Yann A LeCun,Léon Bottou,Genevieve B Orr 等著《有效反向推进》。神经网络:交易技巧:第二版。第 75 卷。柏林,海德堡:施普林格柏林海德堡,2012 年,第 9-48 页。
【9】Y le Cun,L Bottou,Y Bengio 等,“基于梯度的学习应用于文档识别”。摘自:IEEE 86.11 会议录(1998 年 11 月),第 2278-2324 页。arXiv: 1102.0183。
【10】、,与水城颜。“网络中的网络”。国际学习代表会议。加拿大班夫,2014 年 4 月。arXiv: 1102.0183。
[11] Olga Russakovsky,贾登,苏浩等,“ImageNet 大规模视觉识别挑战赛”。摘自:《国际计算机视觉杂志》115.3(2015 年 12 月),第 211–252 页。
[12]卡伦·西蒙扬和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络”。年:学习代表国际会议(ICLR)。2015 年 5 月,圣地亚哥。arXiv: 1409.1556。
[13]鲁佩什·库马尔·斯里瓦斯塔瓦,克劳斯·格雷夫,乌尔根·施密德胡伯等,《训练非常深的网络》。神经信息处理系统进展 28。柯伦咨询公司,2015 年,第 2377-2385 页。arXiv: 1507.06228。
[14]塞格迪、、、贾等著《用回旋深化》。In: 2015 年 IEEE 计算机视觉与模式识别会议(CVPR)。2015 年 6 月,第 1–9 页。
[15] C. Szegedy,V. Vanhoucke,S. Ioffe 等,“重新思考计算机视觉的初始架构”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。2016 年 6 月,第 2818–2826 页。
[16]克里斯蒂安·塞格迪、谢尔盖·约菲和文森特·万霍克。“Inception-v4,Inception-ResNet 和剩余连接对学习的影响”。In:第三十一届 AAAI 人工智能会议(AAAI-17) Inception-v4,三藩市,2017 年 2 月。arXiv: 1602.07261。
[17]安德烈亚斯·韦特、迈克尔·J·威尔伯和塞尔日·贝隆吉。“残差网络的行为类似于相对较浅的网络的集合”。神经信息处理系统进展 29。柯伦联合公司,2016 年,第 550–558 页。
【18】谢地、蒋雄、石梁浦。“你所需要的只是一个好的 Init:探索更好的解决方案来训练具有正交性和调制的极深度卷积神经网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1703.01827。
[19]谢灵犀与。遗传 CNN。技术。众议员 2017。arXiv: 1703.01513。
[20]谢尔盖·扎戈鲁伊科和尼科斯·科莫达基斯。“广残网”。英国机器视觉会议(BMVC)会议录。BMVA 出版社,2016 年 9 月,第 87.1–87.12 页。
【21】K .张,M .孙,X .韩等《残差网络的残差网络:多级残差网络》。载于:IEEE 视频技术电路与系统汇刊第 99 页(2017),第 1 页。
[22]巴雷特·佐夫,维贾伊·瓦苏德万,黄邦贤·施伦斯等人,《学习可扩展的可转移架构》
架构—第 2 部分
FAU 讲座笔记关于深度学习
更深层的架构
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
更深的结构产生更好的性能。 CC 下的图片来自深度学习讲座的 4.0 。
欢迎回到深度学习!今天我想谈谈架构的第二部分。现在,我们想在第二部分更深入一点:更深入的模型。因此,我们看到更深入的研究确实对错误率非常有益。所以,你可以在 ImageNet 上看到结果。在 2011 年,使用浅层支持向量机,您可以看到错误率非常高,达到 25%。AlexNet 在 2012 年已经几乎将它削减了一半。2013 年,泽勒再次以八层赢得冠军。2014 年 VGG:19 层。2014 年的 Google net:22 层,性能也差不多。因此,你可以看到,我们增加的深度越多,性能似乎就越好。我们可以看到只剩下一点点的差距来击败人类的表现。
深度网络允许指数级特征重用。 CC 下的图片来自深度学习讲座的 4.0 。
深度似乎在构建良好的网络中扮演着关键角色。为什么会这样呢?这些更深层次的网络可能非常有效的一个原因是我们称之为指数特征重用的东西。这里你可以看到我们是否只有两个特征。如果我们把神经元堆在上面,你可以看到可能的路径数量呈指数增长。有了两个神经元,我就有了两条路。有了另一层神经元,我就有了路径。有三层路径,⁴路径等等。因此,更深层次的网络似乎能够重用以前各层的信息。我们也可以看到,如果我们看看他们在做什么。如果我们生成 get 这些可视化,我们会看到它们越来越多地构建更抽象的表示。所以,我们不知何故看到了某种模块化的发生。我们认为深度学习之所以有效,是因为我们能够在不同的位置拥有不同的功能部分。因此,我们正在以某种方式将处理过程分解为更简单的步骤,然后我们本质上训练一个具有多个步骤的程序,它能够描述越来越多的抽象表示。这里我们看到了第一层,它们可能有边缘和斑点。比方说,第三层检测到这些纹理。第五层感知对象部分,第八层已经是对象类。这些图片是从 AlexNet 的可视化中创建的。所以你可以看到,这似乎真的在网络中发生了。这大概也是深度学习奏效的一个关键原因。当我们试图在不同的位置计算不同的东西时,我们能够解开这个函数。
堆积回旋允许接*更大的内核。 CC 下的图片来自深度学习讲座的 4.0 。
嗯,我们想更深入一些,这里已经实现的一项技术是初始模块。改进的初始模块现在基本上用 5x5 卷积和 3x3 卷积取代了我们看到的那些过滤器,变成了这些结论的倍数。不是做 5x5 的卷积,而是连续做两个 3x3 的卷积。这已经节省了一些计算,然后您可以通过在顶部堆叠过滤器来替换 5x5 过滤器。我们可以看到,这实际上适用于各种各样的内核,您实际上可以将它们分成几个步骤。所以,你可以把它们串联起来。这种滤波器级联也是典型的计算机视觉课程中会讨论的内容。
可分离卷积允许从一维滤波器创建二维卷积。来自深度学习讲座的 CC BY 4.0 下的图片。
所以《盗梦空间 V2》已经有 42 层了。他们从本质上的 3x3 卷积和三个修改的初始模块开始,就像我们刚刚看到的。然后在下一层中,引入了一种有效的网格尺寸缩减方法,即使用步长卷积。因此,通道压缩有 1x1 卷积,步长为 1 的 3x3 卷积,后跟步长为 2 的 3x3 卷积。这实际上有效地取代了不同的池操作。下一个想法是引入五次*坦卷积模块。这里的想法是不再用二维卷积来表示卷积,而是把它们分成 x 和 y 方向的卷积。你交替产生这两个卷积。这里可以看到,我们从左侧分支的 1x1 卷积开始。然后我们进行 1x n 卷积,接着进行 n x1 卷积,接着进行 1x n 卷积,依此类推。这允许我们将内核分解成两个方向。所以,你知道,因为你交替地改变卷积的方向,你实际上是通过强制可分计算来分解二维卷积。我们还可以看到,卷积滤波器的分离适用于多种滤波器。当然,这是一个限制,因为它不允许所有可能的计算。但是请记住,我们在前面的层中有完整的 3x3 卷积。所以他们已经可以学习如何为后面的层采用。结果,它们可以被可分离卷积处理。
Inception V3 的特性。来自深度学习讲座的 4.0CC 下的图片。
这就导致了 Inception V3。对于 Inception 的第三个版本,他们基本上使用了 Inception V2,并为训练过程引入了 RMSprop,还在辅助分类器的完全连接层中引入了批量归一化,以及标签*滑正则化。
标注*滑有助于消除标注噪点。 CC 下的图片来自深度学习讲座的 4.0 。
标签*滑正则化是一个非常酷的技巧。所以让我们再花几分钟来研究一下这个想法。现在,如果你想想我们的标签向量通常是什么样子,我们有一个热编码向量。这意味着我们的标签本质上是狄拉克分布。这实质上是说,一个元素是正确的,所有其他元素都是错误的。我们通常使用 softmax。所以这意味着我们的激活趋向于无穷大。这并不太好,因为我们继续学习越来越大的权重,使它们变得越来越极端。所以,我们可以通过重量衰减来防止这种情况。这将防止我们的体重急剧增加。此外,我们还可以使用标签*滑。标签*滑的想法是,我们不是只使用狄拉克脉冲,而是将概率质量涂抹到其他类上。这是非常有用的,特别是在像 ImageNet 这样的地方,你有相当嘈杂的标签。你还记得那些不完全清楚的案例。在这些嘈杂的标签情况下,您可以看到这种标签*滑真的很有帮助。这个想法是,你把你的狄拉克分布乘以 1 减去一些小的ϵ.然后,将从正确类中扣除的ϵ*均分配给所有其他类。你可以看到这就是 1/K,其中 K 是类的数量。这种标签*滑的好处在于,你基本上不鼓励做出非常艰难的决定。这在有噪声标签的情况下非常有用。所以这是一个非常好的技巧,可以帮助你建立更深层次的模型。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
下一次,我们想看看如何构建那些真正深度的模型。就我们目前所见,我们会问:为什么不在顶部堆叠更多层呢?如果你尝试这样做,会出现一些问题,我们将在下一个视频中探究原因。我们也将提出一些真正深入的解决方案。非常感谢大家的收听,下期视频再见。
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] Klaus Greff、Rupesh K. Srivastava 和 Jürgen Schmidhuber。“高速公路和残差网络学习展开的迭代估计”。年:学习代表国际会议(ICLR)。土伦,2017 年 4 月。arXiv: 1612.07771。
[2]何,,,任,等.“深度残差学习用于图像识别”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。拉斯维加斯,2016 年 6 月,第 770–778 页。arXiv: 1512.03385。
[3]何,,,,任等.“深剩余网络中的身份映射”。载于:计算机视觉— ECCV 2016:第 14 届欧洲会议,荷兰阿姆斯特丹,2016 年,第 630–645 页。arXiv: 1603.05027。
[4]胡经昌、沈立群、孙广昌。“挤压和激励网络”。载于:ArXiv 电子版(2017 年 9 月)。arXiv: 1709.01507 [cs。简历】。
[5]黄高,孙玉,刘庄等,“具有随机深度的深度网络”。载于:计算机视觉-ECCV 2016,会议录,第四部分。湛:施普林格国际出版公司,2016 年,第 646–661 页。
[6]黄高、刘庄和基利安·q·温伯格。“密集连接的卷积网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1608.06993。亚历克斯·克里热夫斯基、伊利亚·苏茨基弗和杰弗里·E·辛顿。“使用深度卷积神经网络的 ImageNet 分类”。神经信息处理系统进展 25。柯伦咨询公司,2012 年,第 1097-1105 页。arXiv: 1102.0183。
[8] Yann A LeCun,Léon Bottou,Genevieve B Orr 等著《有效反向推进》。神经网络:交易技巧:第二版。第 75 卷。柏林,海德堡:施普林格柏林海德堡,2012 年,第 9-48 页。
【9】Y le Cun,L Bottou,Y Bengio 等,“基于梯度的学习应用于文档识别”。摘自:IEEE 86.11 会议录(1998 年 11 月),第 2278-2324 页。arXiv: 1102.0183。
【10】、,与水城颜。“网络中的网络”。国际学习代表会议。加拿大班夫,2014 年 4 月。arXiv: 1102.0183。
[11] Olga Russakovsky,贾登,苏浩等,“ImageNet 大规模视觉识别挑战赛”。摘自:《国际计算机视觉杂志》115.3(2015 年 12 月),第 211–252 页。
[12]卡伦·西蒙扬和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络”。年:学习代表国际会议(ICLR)。2015 年 5 月,圣地亚哥。arXiv: 1409.1556。
[13]鲁佩什·库马尔·斯里瓦斯塔瓦,克劳斯·格雷夫,乌尔根·施密德胡伯等,《训练非常深的网络》。神经信息处理系统进展 28。柯伦咨询公司,2015 年,第 2377-2385 页。arXiv: 1507.06228。
[14]塞格迪、、、贾等著《用回旋深化》。In: 2015 年 IEEE 计算机视觉与模式识别会议(CVPR)。2015 年 6 月,第 1–9 页。
[15] C. Szegedy,V. Vanhoucke,S. Ioffe 等,“重新思考计算机视觉的初始架构”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。2016 年 6 月,第 2818–2826 页。
[16]克里斯蒂安·塞格迪、谢尔盖·约菲和文森特·万霍克。“Inception-v4,Inception-ResNet 和剩余连接对学习的影响”。In:第三十一届 AAAI 人工智能会议(AAAI-17) Inception-v4,三藩市,2017 年 2 月。arXiv: 1602.07261。
[17]安德烈亚斯·韦特、迈克尔·J·威尔伯和塞尔日·贝隆吉。“残差网络的行为类似于相对较浅的网络的集合”。神经信息处理系统进展 29。柯伦联合公司,2016 年,第 550–558 页。
【18】谢地、蒋雄、石梁浦。“你所需要的只是一个好的 Init:探索更好的解决方案来训练具有正交性和调制的极深度卷积神经网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1703.01827。
[19]谢灵犀与。遗传 CNN。技术。众议员 2017。arXiv: 1703.01513。
[20]谢尔盖·扎戈鲁伊科和尼科斯·科莫达基斯。“广残网”。英国机器视觉会议(BMVC)会议录。BMVA 出版社,2016 年 9 月,第 87.1–87.12 页。
【21】K .张,M .孙,X .韩等《残差网络的残差网络:多级残差网络》。载于:IEEE 视频技术电路与系统汇刊第 99 页(2017),第 1 页。
[22]巴雷特·佐夫,维贾伊·瓦苏德万,黄邦贤·施伦斯等人,《学习可扩展的可转移架构》
架构—第 3 部分
FAU 讲座笔记关于深度学习
剩余网络
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
更深的模型在某个点饱和,甚至可能产生更差的结果。 CC 下的图片来自深度学习讲座的 4.0 。
欢迎回到深度学习!今天我们想讨论更多的架构,尤其是真正深层的架构。所以,我们真的在走向深度学习。如果你想用我们到目前为止看到的所有东西来训练更深入的模型,你会看到我们进入了某种饱和状态。如果你想更深入,那么你只需在顶部添加层,你会希望训练误差会下降。但是如果你仔细观察,你会发现一个 20 层的网络比一个 56 层的模型有更低的训练误差和测试集误差。因此,我们不能只是增加一层又一层,然后希望事情会变得更好。这种影响不仅仅是过度拟合造成的。我们在顶部构建层。所以,肯定有其他原因,这些原因很可能与消失梯度问题有关。其他原因可能是 ReLU、初始化或内部协变量移位的问题,我们尝试了批量标准化、eLU 和 SELU,但我们仍然有激活和梯度传播不良的问题。我们看到,如果你试图建立那些非常深的模型,我们会遇到渐变消失的问题,我们无法训练早期的层,这甚至会导致训练集的更严重的损失。
剩余网络将学习部分移动到侧支。 CC 下的图片来自深度学习讲座的 4.0 。
所以,我有一个解决方案,这些是剩余单位。这是一个非常酷的想法。所以,他们建议做的不是学习直接映射 F(x ),而是学习剩余映射。所以,我们想知道 H(x)和 H(x)是 F(x)和 x 的差,所以,我们也可以用不同的方式来表达,这实际上是如何实现的。你把你的网络 F(x)计算成某个层 H(x) + x,所以,可训练部分现在基本上在一个侧支中,侧支是 H(x),这是可训练的。在主分支上,我们只有一些 x 加上侧分支,它们将给出我们估计的 y。
残差块的第一版本在主路径上仍然具有非线性。来自深度学习讲座的 CC BY 4.0 下的图片。
在残差块的原始实现中,仍然存在差异。这与我们在上一张幻灯片中看到的并不完全一样。我们有一个侧分支,其中有一个加权层、批次归一化、ReLU、加权、另一个批次归一化,然后是加法和另一个非线性,即一个残差块的 ReLU。后来,这被改变为使用批次标准、ReLU、重量、批次标准、ReLU 和剩余块的重量。原来这种配置更稳定。我们基本上有了在正分支上反向传播的恒等式。这非常好,因为我们可以将梯度传播回早期层,这样我们可以获得更稳定的反向传播。
VGG、18 层网络和 18 层剩余网络的比较。 CC 下的图片来自深度学习讲座的 4.0 。
这就给我们带来了一个完整的剩余网络。所以,我们在底部切开它,在右手边显示底部。这是 VGG、43 层*面网络和 43 层剩余网络之间的比较。你可以看到本质上有这些被引入的跳跃连接。它们允许我们跳过这一步,然后在相应的早期层中反向传播。还涉及到缩减采样,当然,跳过连接也必须缩减采样。这就是为什么我们在这些位置有虚线连接。我们可以看到,VGG 有大约 196 亿次浮点运算,而我们的普通和剩余网络只有 36 亿次浮点运算。所以,它也更有效率。
有了剩余连接,我们现在可以更深入。来自深度学习讲座的 CC BY 4.0 下的图片。
现在让我们来测试一下。我们现在可以看到,在 34 层的情况下,我们没有得到错误率,因为我们希望有非常深的网络。因此,与仅使用 18 层网络相比,误差更高。但是如果您引入剩余连接,我们可以看到我们得到了好处,并且降低了错误率。因此,剩余连接帮助我们获得更稳定的梯度,并且我们现在可以随着深入而降低训练和验证误差。
剩余块还允许瓶颈结构的集成。 CC 下的图片来自深度学习讲座的 4.0 。
残差块网络有不同的变体。这是标准构建模块,在右侧,您可以看到我们也可以利用瓶颈思想,对通道进行下采样,然后进行卷积,再进行上采样。这就是那种瓶颈版的残块。
ResNets 再次将 ImageNet 的错误率减半。来自深度学习讲座的 CC BY 4.0 下的图片。
所以,我们可以把这个和我们到目前为止学过的其他食谱结合起来。如果我们这样做,我们可以看到我们甚至可以训练 152 层的网络。这在 2015 年产生了第一个真正击败人类表现的网络之一。记住我们说过的关于人类行为的所有事情,特别是如果你只有一个标签的话。所以,实际上你必须有更多的标签来理解问题的不确定性。无论如何,我们可以看到,我们真的进入了人类表现的范围,这是一个非常好的结果。
结果网可以被解释为分类器的集合。 CC 下的图片来自深度学习讲座的 4.0 。
人们一直在问“为什么这些残余网络表现得这么好?”。一个非常有趣的解释是这种所谓的 ResNets 系综观点。在这里,你可以看到,如果我们在彼此之上构建残差层或残差块,我们会看到我们可以将其分解为一种递归。所以,如果我们有 x₃等于 x₂加 H₃(x₂),我们可以代入,看到这等于 x₁加 H₂(x₁)加 H₃(x₁ + H₂(x₁)).我们可以再次代入,看到我们实际计算的是 x₀ + H₁(x₀)加上 H₂(x₀ + H₁(x₀))加上 H₃(x₀ + H₁(x₀) + H₂(x₀ + H₁(x₀))).哇,很酷的把戏。如果有人出于任何未知的原因要测试你的深度学习知识,你可能要记住这一点。所以,我真的建议仔细看看这条线。因此,我们在解释中看到,我们本质上是在构建我们更浅的残差分类器的集合。因此,我们可以说,我们从 ResNets 训练的分类器本质上是在构建一个非常强大的集成。
ResNets 与前馈网络。 CC 下的图片来自深度学习讲座的 4.0 。
这很好,我们看到,在经典前馈网络中,我们可以改变每个单层区域的表示,因为这里有矩阵乘法。矩阵乘法具有可以转换到完全不同的域的特性。因此,本质上在经典的前馈网络中,我们有一个单一的路径,在神经元水*上我们有许多不同的路径。在剩余网络中,我们得到 2ⁿ路径。在神经元水*,我们得到许多不同长度的路径,通过不同的层子集,这是一个非常强的集合,以这种方式构建。
表示视图将结果解释为表示的逐渐变化。来自深度学习讲座的 CC BY 4.0 下的图片。
我们也可以改变我们的观点,想想我们之前看到的剩余网络和全连接网络。在完全连接的层中,您基本上可以更改完整的表示。因此,我们试图在 a)、b)和 c)中展示这一点。所以 a)只是从一个域到另一个域的转换。如果我们现在展开它,我们可以看到残差网络在不同层上的表现基本上是逐渐变化的。因此,我们看到我们有一个轻微的变化,然后颜色逐渐向蓝色变化,我们必须在最后决定表示。如果我们将其与 c)中的完全连接的层进行比较,我们可以在第一层中有一个完全不同的表示,然后在第二层中有一个完全不同的表示,最后,我们最终映射到最后一层中所需的表示。所以在经典的全连通网络中,我们可以在每一层产生一个全新的表示。这意味着它们也变得非常依赖,因为为了做进一步的处理,表示需要匹配。
如果删除层,ResNets 只会逐渐失去性能。 CC 下的图片来自深度学习讲座的 4.0 。
所以,我们可以做一个非常有趣的实验,比如损伤研究,就像你在生物神经网络中做的一样。以下是随机深度的一些结果。所以,现在的想法是我们关闭整个层。我们可以关闭完整的层,它不会破坏由 ResNet 完成的分类,这很酷。因此,如果您只关闭大约 10%的层,那么您可以看到我们的性能有所下降,但不会崩溃。我减少的层数越多,性能就越差,但是因为我们在表示上有了细微的变化,我们可以去掉一些单独的步骤,而不会完全破坏这个网络。所以,这当然是我们对合奏的期望。好了,有了这些简单的表示和这种逐渐的变化,我们将在这堂课的后面展示,ResNets 也可以被解释为一种梯度下降过程。这当然是因为与观察有关,如果你遵循梯度下降,那么我们从每个位置都有相同的渐变。因此,我们正在用 ResNet 构建本质上类似的东西。我们实际上可以证明,如果你试图优化一个未知的损失函数,ResNet 配置也可以达到。你想训练这个梯度,你会准确地提出一个 ResNet 作为解决方案。但是这需要一点时间,我们会在这节课快结束的时候讨论这个问题。到目前为止,这些网络已经建得非常非常深了。甚至在 CIFAR-10 上也可能有 1200 层。这是一个非常有趣的结果。我们看到我们真的在向非常深的网络发展。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
那么我们还能谈些什么呢?好吧,下一次在深度学习中,我们想谈谈剩余连接的兴起,以及一些帮助你建立真正有效的深度网络的技巧。所以,我希望你喜欢这个视频,并期待下一个!
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] Klaus Greff、Rupesh K. Srivastava 和 Jürgen Schmidhuber。“高速公路和残差网络学习展开的迭代估计”。年:学习代表国际会议(ICLR)。土伦,2017 年 4 月。arXiv: 1612.07771。
[2]何,,,任,等.“深度残差学习用于图像识别”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。拉斯维加斯,2016 年 6 月,第 770–778 页。arXiv: 1512.03385。
[3]何,,,,任等.“深剩余网络中的身份映射”。载于:计算机视觉— ECCV 2016:第 14 届欧洲会议,荷兰阿姆斯特丹,2016 年,第 630–645 页。arXiv: 1603.05027。
[4]胡经昌、沈立群、孙广昌。“挤压和激励网络”。载于:ArXiv 电子版(2017 年 9 月)。arXiv: 1709.01507 [cs。简历】。
[5]黄高,孙玉,刘庄等,“具有随机深度的深度网络”。载于:计算机视觉-ECCV 2016,会议录,第四部分。湛:施普林格国际出版公司,2016 年,第 646–661 页。
[6]黄高、刘庄和基利安·q·温伯格。“密集连接的卷积网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1608.06993。亚历克斯·克里热夫斯基、伊利亚·苏茨基弗和杰弗里·E·辛顿。“使用深度卷积神经网络的 ImageNet 分类”。神经信息处理系统进展 25。柯伦咨询公司,2012 年,第 1097-1105 页。arXiv: 1102.0183。
[8] Yann A LeCun,Léon Bottou,Genevieve B Orr 等著《有效反向推进》。神经网络:交易技巧:第二版。第 75 卷。柏林,海德堡:施普林格柏林海德堡,2012 年,第 9-48 页。
【9】Y le Cun,L Bottou,Y Bengio 等,“基于梯度的学习应用于文档识别”。摘自:IEEE 86.11 会议录(1998 年 11 月),第 2278-2324 页。arXiv: 1102.0183。
【10】、,与水城颜。“网络中的网络”。国际学习代表会议。加拿大班夫,2014 年 4 月。arXiv: 1102.0183。
[11] Olga Russakovsky,贾登,苏浩等,“ImageNet 大规模视觉识别挑战赛”。摘自:《国际计算机视觉杂志》115.3(2015 年 12 月),第 211–252 页。
[12]卡伦·西蒙扬和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络”。年:学习代表国际会议(ICLR)。2015 年 5 月,圣地亚哥。arXiv: 1409.1556。
[13]鲁佩什·库马尔·斯里瓦斯塔瓦,克劳斯·格雷夫,乌尔根·施密德胡伯等,《训练非常深的网络》。神经信息处理系统进展 28。柯伦咨询公司,2015 年,第 2377-2385 页。arXiv: 1507.06228。
[14]塞格迪、、、贾等著《用回旋深化》。In: 2015 年 IEEE 计算机视觉与模式识别会议(CVPR)。2015 年 6 月,第 1–9 页。
[15] C. Szegedy,V. Vanhoucke,S. Ioffe 等,“重新思考计算机视觉的初始架构”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。2016 年 6 月,第 2818–2826 页。
[16]克里斯蒂安·塞格迪、谢尔盖·约菲和文森特·万霍克。“Inception-v4,Inception-ResNet 和剩余连接对学习的影响”。In:第三十一届 AAAI 人工智能会议(AAAI-17) Inception-v4,三藩市,2017 年 2 月。arXiv: 1602.07261。
[17]安德烈亚斯·韦特、迈克尔·J·威尔伯和塞尔日·贝隆吉。“残差网络的行为类似于相对较浅的网络的集合”。神经信息处理系统进展 29。柯伦联合公司,2016 年,第 550–558 页。
【18】谢地、蒋雄、石梁浦。“你所需要的只是一个好的 Init:探索更好的解决方案来训练具有正交性和调制的极深度卷积神经网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1703.01827。
[19]谢灵犀与。遗传 CNN。技术。众议员 2017。arXiv: 1703.01513。
[20]谢尔盖·扎戈鲁伊科和尼科斯·科莫达基斯。“广残网”。英国机器视觉会议(BMVC)会议录。BMVA 出版社,2016 年 9 月,第 87.1–87.12 页。
【21】K .张,M .孙,X .韩等《残差网络的残差网络:多级残差网络》。载于:IEEE 视频技术电路与系统汇刊第 99 页(2017),第 1 页。
[22]巴雷特·佐夫,维贾伊·瓦苏德万,黄邦贤·施伦斯等人,《学习可扩展的可转移架构》
架构—第 4 部分
FAU 讲座笔记关于深度学习
剩余连接的兴起
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
剩余连接与 inception 块的组合导致了 Inception-ResNet。 CC 下的图片来自深度学习讲座的 4.0 。
欢迎回到深度学习!正如上一个视频中所承诺的,我们想继续讨论比之前视频中看到的残余网络更复杂的架构。好吧,我有什么给你?当然,我们也可以将这个剩余连接的配方用于我们的盗梦空间网络,然后这导致了盗梦空间网络。您可以看到,剩余连接的概念非常简单,您可以很容易地将其合并到许多其他体系结构中。这也是我们在这里展示这两种架构的原因。它们是构建真正深度网络的重要基石。
不同架构在精度、参数和触发器方面的比较。 CC 下的图片来自深度学习讲座的 4.0 。
您可以在这里看到,inception 和 ResNet 架构确实也有助于您构建非常强大的网络。我很喜欢这个情节,因为你可以从中学到很多东西。y 轴表示最高精度的性能。你可以在 x 轴上看到手术次数。这是以千兆次浮点运算为单位的。此外,您还可以看到由圆的直径表示的模型参数的数量。在这里,你可以看到 VGG-16 和 VGG-19,它们在最右边。因此,它们的计算量很大,性能也不错,但不如我们在课堂上看到的其他模型。你也看到 AlexNet 在左下方。所以它没有太多的计算。此外,就参数而言,它相当大,但性能并不太好。现在,你看,如果你做批量标准化和网络中的网络,你会变得更好。此外,GoogleNet 和 ResNet-18 的顶级精确度也有所提高。我们看到,我们现在可以继续构建更深入的模型,但不会获得太多的新参数。这有助于我们建立更有效、更高效的网络。当然,一段时间后,我们也开始增加参数空间,您可以看到,最佳性能是通过 inception V3 或 inception V4 网络或 Resnet-100 获得的。
宽残余块与窄残余块。来自深度学习讲座的 CC BY 4.0 下的图片。
那么,还有哪些方法可以帮助你建立更好的模型呢?我们已经成功看到的一件事是增加剩余网络的宽度。因此,存在广泛的剩余网络。它们减少了深度,但是增加了剩余块的宽度。然后,您还可以在这些残差块中使用 dropout,您可以表明,具有类似参数数量的 16 层深度网络可以优于一千层深度网络。所以在这里,力量不是来自深度,而是来自剩余连接和引入的宽度。
ResNeXt 结合了我们到目前为止看到的许多方法。 CC 下的图片来自深度学习讲座的 4.0 。
还有像 ResNeXt 这样的东西,所有以前的配方都是在这里一起构建的。它允许聚合残差变换。所以,你可以看到这实际上相当于早期的串联。所以,我们可以用早期的级联来代替它,然后一般的想法是你做群卷积。因此,您将输入和输出链分成组,然后在每个组中分别执行卷积。现在,这与 ResNet 瓶颈模块具有相似的 flops 和参数数量,但它更宽,是一个稀疏连接的模块。所以这个挺受欢迎的。
ResNet 中的 ResNet。来自深度学习讲座的 CC BY 4.0 下的图片。
然后,当然你可以把这个和其他想法结合起来。在 ResNet-of-ResNet 中,您甚至可以在网络中建立更多的剩余连接。
DenseNet。 CC 下的图片来自深度学习讲座的 4.0 。
有了 DenseNets,你可以尝试将几乎所有的东西与所有的东西连接起来。你有密集连接的卷积神经网络。它具有特征传播和特征重用。它还极大地缓解了消失梯度问题,由于过渡层使用 1x1 卷积,因此在多达 264 层的情况下,与 ResNet 相比,实际上需要的参数减少了三分之一。
挤压和激励网络。来自深度学习讲座的 4.0CC 下的图片。
此外,我想向大家展示的一个非常有趣的想法是挤压和激励网络,这是 2017 年 ImageNet 挑战赛的获胜者,它有 2.3%的前 5 名错误。这个想法是显式地建模渠道的相互依赖性,这基本上意味着你有一些更相关的渠道取决于内容。如果你有狗的特征,当你试图观察汽车时,它们不会很有趣。
挤压和激励网络的关键思想是:将上下文信息压缩到一个通道,并使用它来缩放不同的特征图。 CC 下的图片来自深度学习讲座的 4.0 。
那么,这是如何实现的呢?嗯,我们添加了一个可训练的模块,允许根据输入重新调整通道。所以,我们有这里显示的特征地图。然后,我们有一个仅向下映射到一个维度的分支。然后将该一维乘以不同的特征图,允许根据输入抑制一些特征图,并根据输入放大其他特征图。我们本质上是挤压,即通过全局*均池将每个通道压缩为一个值。这就是我们如何构建特征重要性,然后在需要的地方激发。我们在 sigmoid 函数中使用完全连接的层,以便只激发重要的层。顺便说一下,这与我们在长短期记忆细胞中所做的事情非常相似,我们可能会在下周的视频中谈到。然后我们缩放,因此我们用输出来缩放输入映射。
我们在这里讨论了大部分关键概念,现在不得不停止列举更多的架构。来自深度学习讲座的 4.0CC 下的图片。
当然,我们可以将它与大多数其他架构相结合:与初始模块、与 ResNet、与 ResNeXt 等等。所以,我们有很多不同的选择。说实话,我不想在这里展示另一种架构。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。
下一次我们将讨论学习网络架构。所以,有一些方法可以自动确定。那不是效率更高吗?好了,请继续关注,我将在下一个视频中告诉你!
如果你喜欢这篇文章,你可以在这里找到更多的文章,在这里找到更多关于机器学习的教育材料,或者看看我们的深度 学习 讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube、Twitter、脸书、LinkedIn 或 T21。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] Klaus Greff、Rupesh K. Srivastava 和 Jürgen Schmidhuber。“高速公路和残差网络学习展开的迭代估计”。年:学习代表国际会议(ICLR)。土伦,2017 年 4 月。arXiv: 1612.07771。
[2]何,,,任,等.“深度残差学习用于图像识别”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。拉斯维加斯,2016 年 6 月,第 770–778 页。arXiv: 1512.03385。
[3]何,,,,任等.“深剩余网络中的身份映射”。载于:计算机视觉— ECCV 2016:第 14 届欧洲会议,荷兰阿姆斯特丹,2016 年,第 630–645 页。arXiv: 1603.05027。
[4]胡经昌、沈立群、孙广昌。“挤压和激励网络”。载于:ArXiv 电子版(2017 年 9 月)。arXiv: 1709.01507 [cs。简历】。
[5]黄高,孙玉,刘庄等,“具有随机深度的深度网络”。载于:计算机视觉-ECCV 2016,会议录,第四部分。湛:施普林格国际出版公司,2016 年,第 646–661 页。
[6]黄高、刘庄和基利安·q·温伯格。“密集连接的卷积网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1608.06993。亚历克斯·克里热夫斯基、伊利亚·苏茨基弗和杰弗里·E·辛顿。“使用深度卷积神经网络的 ImageNet 分类”。神经信息处理系统进展 25。柯伦咨询公司,2012 年,第 1097-1105 页。arXiv: 1102.0183。
[8] Yann A LeCun,Léon Bottou,Genevieve B Orr 等著《有效反向推进》。神经网络:交易技巧:第二版。第 75 卷。柏林,海德堡:施普林格柏林海德堡,2012 年,第 9-48 页。
【9】Y le Cun,L Bottou,Y Bengio 等,“基于梯度的学习应用于文档识别”。摘自:IEEE 86.11 会议录(1998 年 11 月),第 2278-2324 页。arXiv: 1102.0183。
【10】、,与水城颜。“网络中的网络”。国际学习代表会议。加拿大班夫,2014 年 4 月。arXiv: 1102.0183。
[11] Olga Russakovsky,贾登,苏浩等,“ImageNet 大规模视觉识别挑战赛”。摘自:《国际计算机视觉杂志》115.3(2015 年 12 月),第 211–252 页。
[12]卡伦·西蒙扬和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络”。年:学习代表国际会议(ICLR)。2015 年 5 月,圣地亚哥。arXiv: 1409.1556。
[13]鲁佩什·库马尔·斯里瓦斯塔瓦,克劳斯·格雷夫,乌尔根·施密德胡伯等,《训练非常深的网络》。神经信息处理系统进展 28。柯伦咨询公司,2015 年,第 2377-2385 页。arXiv: 1507.06228。
[14]塞格迪、、、贾等著《用回旋深化》。In: 2015 年 IEEE 计算机视觉与模式识别会议(CVPR)。2015 年 6 月,第 1–9 页。
[15] C. Szegedy,V. Vanhoucke,S. Ioffe 等,“重新思考计算机视觉的初始架构”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。2016 年 6 月,第 2818–2826 页。
[16]克里斯蒂安·塞格迪、谢尔盖·约菲和文森特·万霍克。“Inception-v4,Inception-ResNet 和剩余连接对学习的影响”。In:第三十一届 AAAI 人工智能会议(AAAI-17) Inception-v4,三藩市,2017 年 2 月。arXiv: 1602.07261。
[17]安德烈亚斯·韦特、迈克尔·J·威尔伯和塞尔日·贝隆吉。“残差网络的行为类似于相对较浅的网络的集合”。神经信息处理系统进展 29。柯伦联合公司,2016 年,第 550–558 页。
【18】谢地、蒋雄、石梁浦。“你所需要的只是一个好的 Init:探索更好的解决方案来训练具有正交性和调制的极深度卷积神经网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1703.01827。
[19]谢灵犀与。遗传 CNN。技术。众议员 2017。arXiv: 1703.01513。
[20]谢尔盖·扎戈鲁伊科和尼科斯·科莫达基斯。“广残网”。英国机器视觉会议(BMVC)会议录。BMVA 出版社,2016 年 9 月,第 87.1–87.12 页。
【21】K .张,M .孙,X .韩等《残差网络的残差网络:多级残差网络》。载于:IEEE 视频技术电路与系统汇刊第 99 页(2017),第 1 页。
[22]巴雷特·佐夫,维贾伊·瓦苏德万,黄邦贤·施伦斯等人,《学习可扩展的可转移架构》
架构—第 5 部分
FAU 讲座笔记关于深度学习
学习架构
FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座
这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。如果你发现了错误,请告诉我们!
航行
优化架构的可能标准。 CC 下的图片来自深度学习讲座的 4.0 。
欢迎回到深度学习,今天我们想谈谈架构的最后一部分。特别是,我们想要研究学习架构。第 5 部分:学习架构。这里的想法是,我们希望拥有自我开发的网络结构,它们可以在精度或浮点运算方面进行优化。当然,你可以简单地用网格搜索来做。但是这通常太费时间了。
学习建筑的不同策略。 CC 下的图片来自深度学习讲座的 4.0 。
因此,有几种方法可以做到这一点。[22]中的一个想法是使用强化学习。因此,你训练一个递归神经网络(RNN)来生成网络的模型描述,你用强化学习来训练这个 RNN,以最大化预期的准确性。当然,也有很多其他的选择。你可以对小积木进行强化学习,转移到大的细胞神经网络和遗传算法,基于能量的,实际上有很多想法你可以遵循。就培训时间而言,它们都非常昂贵,如果您想要研究这些方法,您真的必须拥有一个大型集群。否则,你就不能真正进行实验。所以,实际上现在世界上没有太多的团体能够做这样的研究。
两个建筑学习中出现的积木的例子。来自深度学习讲座的 CC BY 4.0 下的图片。
因此,您可以看到,这里也出现了许多我们之前看到的元素。左手边有可分离的卷积和许多其他的方块。你可以看到这个正常的细胞看起来有点像启始块。如果你看右边,它看起来有点像早期版本的模块,在那里你有这些分离。它们以某种方式连接在一起,并使用剩余连接。这是由建筑搜索决定的。ImageNet 的性能与计算成本较低的挤压和激励网络相当。当然,也有可能针对不同的尺寸进行优化,例如针对移动*台。
ImageNet 似乎已经达到了极限。 CC 下的图片来自深度学习讲座的 4.0 。
ImageNet —我们在哪里?嗯,我们看到,在大多数提交的内容中,ImageNet 分类现在已经下降到 5%以下。实质性的重大改进越来越难以在这个数据集上显示出来。上一次官方挑战是在 2017 年的 CVPR。它现在继续在卡格尔。有新的数据集正在产生和需要。例如,3d 场景、人类水*的理解以及那些数据集目前正在生成。例如,MS COCO 数据集或视觉基因组数据集已经取代 ImageNet 成为最先进的数据集。当然,也有不同的研究方向,如移动应用的速度和网络规模。在这些情况下,ImageNet 可能仍然是一个合适的挑战。
建筑讲座综述。 CC 下的图片来自深度学习讲座的 4.0 。
所以,我们来得出一些结论。我们看到 1x1 滤波器减少了参数并增加了正则化。这是一种非常常见的技术。初始模块真的很好,因为它们允许你在卷积和池化之间找到正确的*衡。剩余连接是一种被反复使用的方法。我们还看到,一些新的架构实际上是可以学习的。因此,我们看到更深层次的模型从五层增加到一千层以上。然而,通常较小的网就足够了。当然,这取决于训练数据量。如果你有足够的数据,你只能训练那些真正大的网络。我们已经看到,有时构建更宽的层而不是更深的层也是有意义的。你记得,我们已经在普遍逼*定理中看到过。如果我们有无限宽的层,那么也许我们可以把所有的东西放进一层。
在这个深度学习讲座中,更多令人兴奋的事情即将到来。来自深度学习讲座的 CC BY 4.0 下的图片。
好了,这让我们对接下来的几个视频有了展望。我们要讨论的是递归神经网络。我们将研究长短期记忆细胞,通过时间进行截短的反向传播,这是一个关键因素,以便能够训练这些循环网络,最后我们来看看长短期记忆细胞。Schmidthuber 和 Hochreiter 提出的一个重要观点是。Cho 提出的另一个想法是门控循环单位,它可以在某种程度上成为传统循环细胞和长短期记忆细胞之间的桥梁。
综合题可以帮助备考。 CC 下的图片来自深度学习讲座的 4.0 。
好吧,我们来看一些综合问题:那么深度模型相比浅层网络有什么优势?为什么可以说残差网络学习的是浅层网络的系综?你记得,我在那张幻灯片上暗示过,如果你想准备考试,这是一个非常重要的概念。当然,你应该能够描述瓶颈层,或者标准的 inception 模块是什么,如何改进?我有很多进一步的阅读双路径网络。所以你也可以看看关于压缩和激发网络的论文。还有更多有趣的作品可以在这里找到在介质上当然还有移动网和其他无残留连接的深网。这已经把我们带到了这节课的结尾,我希望你们玩得开心。期待在下一个视频中见到你,我们将在视频中讨论递归神经网络。我听说它们可以用五行代码写下来。所以下次见!
如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube 、 Twitter 、脸书或 LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
参考
[1] Klaus Greff、Rupesh K. Srivastava 和 Jürgen Schmidhuber。“高速公路和残差网络学习展开的迭代估计”。年:学习代表国际会议(ICLR)。土伦,2017 年 4 月。arXiv: 1612.07771。
[2]何,,,任,等.“深度残差学习用于图像识别”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。拉斯维加斯,2016 年 6 月,第 770–778 页。arXiv: 1512.03385。
[3]何,,,,任等.“深剩余网络中的身份映射”。载于:计算机视觉— ECCV 2016:第 14 届欧洲会议,荷兰阿姆斯特丹,2016 年,第 630–645 页。arXiv: 1603.05027。
[4]胡经昌、沈立群、孙广昌。“挤压和激励网络”。载于:ArXiv 电子版(2017 年 9 月)。arXiv: 1709.01507 [cs。简历】。
[5]黄高,孙玉,刘庄等,“具有随机深度的深度网络”。载于:计算机视觉-ECCV 2016,会议录,第四部分。湛:施普林格国际出版公司,2016 年,第 646–661 页。
[6]黄高、刘庄和基利安·q·温伯格。“密集连接的卷积网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1608.06993。亚历克斯·克里热夫斯基、伊利亚·苏茨基弗和杰弗里·E·辛顿。“使用深度卷积神经网络的 ImageNet 分类”。神经信息处理系统进展 25。柯伦咨询公司,2012 年,第 1097-1105 页。arXiv: 1102.0183。
[8] Yann A LeCun,Léon Bottou,Genevieve B Orr 等著《有效反向推进》。神经网络:交易技巧:第二版。第 75 卷。柏林,海德堡:施普林格柏林海德堡,2012 年,第 9-48 页。
【9】Y le Cun,L Bottou,Y Bengio 等,“基于梯度的学习应用于文档识别”。摘自:IEEE 86.11 会议录(1998 年 11 月),第 2278-2324 页。arXiv: 1102.0183。
【10】、,与水城颜。“网络中的网络”。国际学习代表会议。加拿大班夫,2014 年 4 月。arXiv: 1102.0183。
[11] Olga Russakovsky,贾登,苏浩等,“ImageNet 大规模视觉识别挑战赛”。摘自:《国际计算机视觉杂志》115.3(2015 年 12 月),第 211–252 页。
[12]卡伦·西蒙扬和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络”。年:学习代表国际会议(ICLR)。2015 年 5 月,圣地亚哥。arXiv: 1409.1556。
[13]鲁佩什·库马尔·斯里瓦斯塔瓦,克劳斯·格雷夫,乌尔根·施密德胡伯等,《训练非常深的网络》。神经信息处理系统进展 28。柯伦咨询公司,2015 年,第 2377-2385 页。arXiv: 1507.06228。
[14]塞格迪、、、贾等著《用回旋深化》。In: 2015 年 IEEE 计算机视觉与模式识别会议(CVPR)。2015 年 6 月,第 1–9 页。
[15] C. Szegedy,V. Vanhoucke,S. Ioffe 等,“重新思考计算机视觉的初始架构”。In: 2016 年 IEEE 计算机视觉与模式识别大会(CVPR)。2016 年 6 月,第 2818–2826 页。
[16]克里斯蒂安·塞格迪、谢尔盖·约菲和文森特·万霍克。“Inception-v4,Inception-ResNet 和剩余连接对学习的影响”。In:第三十一届 AAAI 人工智能会议(AAAI-17) Inception-v4,三藩市,2017 年 2 月。arXiv: 1602.07261。
[17]安德烈亚斯·韦特、迈克尔·J·威尔伯和塞尔日·贝隆吉。“残差网络的行为类似于相对较浅的网络的集合”。神经信息处理系统进展 29。柯伦联合公司,2016 年,第 550–558 页。
【18】谢地、蒋雄、石梁浦。“你所需要的只是一个好的 Init:探索更好的解决方案来训练具有正交性和调制的极深度卷积神经网络”。In: 2017 年 IEEE 计算机视觉与模式识别大会(CVPR)。檀香山,2017 年 7 月。arXiv: 1703.01827。
[19]谢灵犀与。遗传 CNN。技术。众议员 2017。arXiv: 1703.01513。
[20]谢尔盖·扎戈鲁伊科和尼科斯·科莫达基斯。“广残网”。英国机器视觉会议(BMVC)会议录。BMVA 出版社,2016 年 9 月,第 87.1–87.12 页。
【21】K .张,M .孙,X .韩等《残差网络的残差网络:多级残差网络》。载于:IEEE 视频技术电路与系统汇刊第 99 页(2017),第 1 页。
[22]巴雷特·佐夫,维贾伊·瓦苏德万,黄邦贤·施伦斯等人,《学习可扩展的可转移架构》
归档和记录您对公共数据的使用
处理公共数据集的不确定性
信用:乌拉 Kuźma
当我从网上下载数据集时,我总是担心它们的不稳定性。链接死了,数据变了,灰归灰,尘归尘。
这就是为什么我将返程机引入我的工作流程。但即使这样,也很难确定我是从一个存档网站还是从一个实时网站下载数据,也很难理解我过去做了什么。
我在消费者金融调查 (SCF)的工作中所做的是实现一个同时归档和记录我使用的数据的系统。下面是我所做工作的总结,但是如果你只是想看代码,请滚动到这篇文章的底部,查看我在 SCF 方面实现的功能的要点。
WaybackPy 的建筑
我想在这个项目中完成的最重要的事情是确保我在下载数据时尽可能多地使用最*的 Wayback 档案。另外,对于没有存档的任何数据,我希望确保它在 Wayback 上存档以供将来使用。
我找到的最好的包是 WaybackPy ,尽管我需要做一些修改来让它为我的目的工作。
首先,我需要实现允许我查看最新归档的年龄的属性。通过这种方式,我可以查看给定的archive_age_limit
是否需要新的归档。
举例来说,如果你得到一个通过[www.google.com](http://www.google.com)
的 WaybackPy Url 对象的len()
,你会得到 0,或者是自上次存档以来的天数。
import waybackpyurl = “https://www.google.com/"waybackpy_url_obj = waybackpy.Url(url)print(len(waybackpy_url_obj))
考虑到几乎每天都会生成一个新的归档,这是有意义的。
Google.com 档案馆(作者截图)
归档和记录数据集
有了 WaybackPy,归档就变得简单了。只要确保为超过一定年龄的档案调用save()
方法,存储一些关键数据,就可以开始了。
更难的部分是将关键数据添加到 CSV 中以供进一步检查。对于不能从 Wayback 机器上直接访问的新档案,尤其如此。
下面是一个实现的函数,它将您想要的数据所在的 URL 和数据本地保存的目标目录作为参数。它返回的是一个字典,包含最新存档的 URL 和时间戳。为了检查它的行为,让我们看看它是如何与 SCF 一起使用的。
使用 SCF 实现
在这篇文章的底部是一个完整的要点,展示了如何存档,记录和下载 SCF 数据。这个过程相对简单:
- 提供您想要的 SCF 数据的年份、您想要的变量以及您想要存储数据的目标目录。
- 使用最新的归档文件,或者如果最新的归档文件比您的限制旧,则创建新的归档文件。同时,记录正在使用的最新归档或新归档。
- 尝试使用存档 URL 来检索您的数据,否则使用实时 URL。
- 将您的数据转换为熊猫数据框。
日志本身的行为方式如下:
- 如果最新存档在您的年龄限制内,它将记录其详细信息,如果您在年龄限制内再次尝试重新下载该数据,日志将不会重复记录。
- 如果最新的存档超过了年龄限制,它将记录您保存的详细信息,如果您重新下载它。因为 Wayback 可能不会立即显示您的记录,所以您可能会在日志中有多个保存和记录,这比在 Wayback 不起作用时丢失保存的数据要好。
因此,如果您今天要下载 2019 年、2016 年和 2013 年的 SCF 数据,最后一个被下载两次,您会期望日志显示 4 个带有archive_age_limit = 30
的记录,因为 2019 年的数据集是唯一一个在过去 30 天内存档的数据集。下面是一个例子,你会看到什么。
示例日志(作者截图)
最后的想法
我实现的日志对我的目的肯定是有用的,但是我还没有完全探索这段代码是如何被破坏的。很难找出如何最好地处理最*存档但没有立即更新的网站,但上面描述的“过度记录”行为总比没有好。
其他潜在的问题可能是不同的文件类型,但基本的归档行为应该保持不变。如果你想看的话,至少这段代码可以用于 SCF 的 zip 文件。
北极猴子歌词生成器|重访
我的模特认为我有一种虚构的幽默感
我必须给大家讲一个我一年前做的项目当时我在大三,为实习做准备,并且必须遵循这个面试前的日程表。在那之前,我是自然语言处理(NLP)的新手,至少对日历的结尾有所了解。当时有一个我认为极其令人畏惧的任务,“就你喜欢学习的任何话题写一篇博客?”
这让人望而生畏,因为这完全取决于我,当你真正拥有自主权时,它就没那么有趣了。我最后糊了两样我喜欢的东西,北极猴子和文本生成。它接受一个艺术家的名字,收集所有的歌词,输入到一个语言模型中,这个语言模型善于预测序列中的下一个单词,并按照你的艺术家的风格创作歌词。我用 lyricsgenius 刮歌词。 nlpaug 通过扩充来增加数据集。GPT-2 作为使用 gpt2-simple 包训练的语言模型。
你可以在这里看到演讲,如果你想看幻灯片/笔记本,你可以在这里看到。鉴于 NLP 中的所有东西都有几个月的有效期,并且我所有的代码都已经过时了,所以我不得不对笔记本做了很多修改。
以下是已经改变的事情,或者我应该说,是相同的事情,但我在一年后了解/发现
— -
- GPT-2 代表生成式预训练变压器;是的,我以前不知道。
- 很多 Python 包都不擅长向后兼容。
- 不管你有多困,都不要忘记检查你的模特。
- GPT-2 Simple 现在提供四种型号,小型(124 米),中型(355 米),大型(774 米),超大型(774 米)。
- Transformer 基于自我关注的概念(关注句子的不同部分以创建一个表示),这使得并行估计成为可能,因为您不是一次一个单词地处理句子。
- 检查你的模型。
- nlpaug 从 BERT aug 迁移到 ContextualWordEmbs,以合并所有更新的 BERT。
- 不要忘记检查你的模型。
想自己试试吗?
我最喜欢的一些生成的歌词是:
最初发表于https://meghana.substack.com。
在 NBA,三分球比两分球更重要吗?
TJ·德拉戈塔在 Unsplash 上的照片
如果你是 NBA 的粉丝(或者稍微熟悉联盟),你可能知道三分球正在上升。三分线在 1979-80 赛季首次引入 NBA,除了从 1994 年开始三分线缩短了 3 个赛季之外,它的使用逐年稳步增长。这种情况一直持续到 2000 年代末的几年,然后在 2011-12 赛季开始时急剧转向比以往任何时候都更陡峭的斜坡,并迅速增加到今天的水*。
虽然三分球的崛起是明确而明显的,但对我来说,它回避了一个问题:这种趋势是正确的吗?三分球比两分球更能代表成功吗?
幸运的是,篮球和大多数其他运动一样,有丰富的数据收集,所以这些问题可以得到理想的答案!为了用 Python 完成这项任务,我设定了一个目标,即使用线性回归模型来预测球队在一个赛季中的胜利,使用逻辑回归分类模型来预测球队是否能进入季后赛。有了这些模型,我就能确定是 2 分投篮还是 3 分投篮对成功更重要,是线性模型赢的更多还是逻辑模型更有可能进入季后赛。
数据采集
使用三种不同的方法收集数据:
- 球员统计数据——图书馆
basketball_reference_web_scraper
被用来从网站https://www.basketball-reference.com/收集数据,该网站收藏了自 20 世纪 40 年代以来的 NBA 统计数据。 - 球员工资 —库
selenium
用于从https://hoopshype.com/salaries/players/中按年份抓取球员姓名和工资数据。(我有一篇关于如何使用selenium
的分步文章,在这里使用这个确切的例子:https://medium . com/@ Bryan . pfalzgraf/how-to-use-selenium-to-web-scrape-with-example-80 F9 b 23 a 843 a) - 球队统计 —库
nba_api
用于从 NBA 官方网站https://stats.nba.com/中抓取数据。
我最终决定使用 1983-84 赛季以来的数据,因为那是第一个有 16 支球队进入季后赛的赛季。关于收集的数据,注意一些事情也很重要。
- 我积累的所有数据都是赛季总数。我需要在每场比赛的基础上得到所有的东西,以使所有的东西都一样。一些球员因为受伤或休息等原因打了更少的比赛。至于球队总数,我的数据集中有两个赛季因为劳资纠纷导致停摆而缩短了。1998 赛季有 50 场常规赛,2011 赛季有 66 场常规赛。
- 考虑到通货膨胀和 NBA 工资帽随时间的变化,我不得不通过使每个球员的工资占当年联盟总工资的百分比来标准化。这使得每个球员的正常工资可以逐年比较。
建模
Wins 预测的线性回归
1-第一次尝试是尝试看看仅仅使用进攻投篮统计数据是否能让一切都有条理。我建模使用:FG2_PCT
、FG3_PCT
、FT_PCT
、FG2A_PER_GP
、FG3A_PER_GP
、FG3A/FG2A
。
- 列车 R : 0.4028
- 测试 R : 0.2947
- 这些值似乎不够高,模型过度适合训练数据,所以我不想从中得出任何结论,因为我可以添加其他非拍摄统计数据的更多特征。
2 —第二次尝试包括:FG2_PCT
,FG3_PCT
,FT_PCT
,FG2M_PER_GP
,FG2A_PER_GP
,FG3M_PER_GP
,FG3A_PER_GP
,FTM_PER_GP
,FTA_PER_GP
,OREB_PER_GP
,DREB_PER_GP
,AST_PER_GP
,PF_PER_GP
,STL_PER_GP
,TOV_PER_GP
,BLK_PER_GP
。
- 列车 R : 0.8049
- 测试 R : 0.8293
- 这些值要高得多,代表一个强模型。
- 下图显示了此模型中每个要素的缩放系数,其 P 值也低于 0.05,表示要素的重要性。
3 — 第三次尝试包括:FG2A_PER_GP
、FG3A_PER_GP
、FTA_PER_GP
、OREB_PER_GP
、DREB_PER_GP
、AST_PER_GP
、PF_PER_GP
、STL_PER_GP
、TOV_PER_GP
、BLK_PER_GP
。
- 列车 R : 0.6248
- 测试 R : 0.6649
- 这些值低于之前的尝试,但更容易区分一个团队的 3 分投篮和 2 分投篮,并使特征重要性更容易解释,同时仍然是一个相对较强的模型。
- 下图显示了此模型中每个要素的缩放系数,其 P 值也低于 0.05,表示要素的重要性。
季后赛分类的逻辑回归
1 —第一次尝试是尝试对球队是否进入季后赛进行分类。特征包括:FG2_PCT
、FG3_PCT
、FT_PCT
、FG2M_PER_GP
、FG2A_PER_GP
、FG3M_PER_GP
、FG3A_PER_GP
、FTM_PER_GP
、FTA_PER_GP
、OREB_PER_GP
、DREB_PER_GP
、AST_PER_GP
、PF_PER_GP
、STL_PER_GP
、TOV_PER_GP
、BLK_PER_GP
。
- 训练精度:0.8459
- 测试精度:0.8307
- 良好的准确性,而且由于季后赛类别相对均匀(每个赛季 30 支球队中有 16 支进入季后赛),准确性是一个很好的衡量标准。
- 下图显示了此模型中每个特征的缩放系数,其 P 值也低于 0.05,以表示特征选择。
2 —第二次尝试试图对球队是否赢得了 NBA 总决赛进行分类,是否获得了当年最佳球队的桂冠。使用了与第一次尝试相同的功能。训练精度为 0.9657,这看起来不错,但在这种情况下不是一个成功模型的良好衡量标准,因为没有进入 NBA 总决赛的球队和进入总决赛的球队之间存在显著差异。
- 训练敏感度:0.0741
- 测试灵敏度:0.1111
- 灵敏度低,因此不是用于任何澄清的好模型。
3 —第三次尝试试图对球队是否进入 NBA 总决赛进行分类,这意味着他们赢得了各自的分区,并必须与其他分区的获胜者比赛才能赢得 NBA 总冠军。使用了与第一次尝试相同的功能。训练精度为 0.9315,这看起来不错,但在这种情况下不是一个成功模型的良好衡量标准,因为没有进入 NBA 总决赛的球队和进入总决赛的球队之间存在显著差异。
- 训练敏感度:0.0741
- 测试灵敏度:0.1111
- 不是一个用于任何澄清的好模型
4 —第四次尝试包括:FG2A_PER_GP
、FG3A_PER_GP
、FTA_PER_GP
、OREB_PER_GP
、DREB_PER_GP
、AST_PER_GP
、PF_PER_GP
、STL_PER_GP
、TOV_PER_GP
、BLK_PER_GP
。
- 训练精度:0.8142
- 测试精度:0.7717
- 这比第一次尝试的准确性低,但仍然准确,同时更容易解释,因为只有一个 3 点投篮变量和一个 2 点投篮变量。
- 下图显示了该模型中每个要素的缩放系数,其 P 值也低于 0.05
数据趋势
三分球与两分球的比例逐年稳步上升。NBA 球队正在以 2 分投篮为代价,寻找更多 3 分投篮的价值。注意季后赛球队几乎总是投更多的 3 分球,而不是 2 分球。
休斯顿火箭队的加速比联盟中的其他球队要快得多。他们是第一支在一个赛季中三分球比 2 分球更多的球队,他们在 2017-18 和 2018-19 赛季都完成了 2 分球。使用这种三点策略,他们获得了成功。
这显示了在那个赛季排名前十的球队是如何比联盟其他球队取得更多成功的。自 2010 年以来,随着联盟转向更多的 3 分投篮,这一点表现得更加明显。
结论和进一步的观点
解释每个成功模型的特征重要性是决定 3 点射击是否比 2 点射击更能代表成功的主要因素。查看包含线性回归和逻辑回归的大多数特征的最强模型,两个模型的两个最强的正面影响是FG2M_PER_GP
和FG3M_PER_GP
,而两个模型也共享两个最强的负面影响FG2A_PER_GP
和FG3A_PER_GP
,所有这些都是相同的顺序。仅从逻辑模型来看,FG2M_PER_GP
似乎具有显著的优势。虽然这可能被解释为代表 2 分投篮更重要,但我相信这被FG2A_PER_GP
的负面影响抵消了。这使得人们很难从观看它们中获得任何东西。
具有最好的准确性和可解释性组合的模型是逻辑回归尝试 4,尽管其结果也反映在其具有相同特征的线性回归对应物中。这些模型表明FG2A_PER_GP
比FG3A_PER_GP
对每个模型的负面影响更强。这让我相信三分球对成功更重要,因为更多的尝试不会像更多的 2 分尝试那样产生负面影响。我可以同意 NBA 实施更注重 3 分投篮的举措。从概念上讲,我会建议团队进一步推动他们的FG3A/FG2A
,因为增加每个镜头之间的关系应该会有所帮助。这与上面数据趋势部分的图表是一致的。
在这种情况下,如果擅长三分球的人会更频繁地出现在 NBA,这将是有意义的,如下图所示。
但是除了他们更频繁地出现,如果 NBA 球队更重视这些球员并给他们更高的薪水也是有意义的。下面的图表显示了两种不同的方式来划分 NBA 三分球射手,那些超过 35%的命中率和那些三分球前 20 的命中率。这两个人的工资似乎都没有大幅增长。随着时间的推移,我想这些球员的价值会更高。
如果你想查看整个项目的代码,可以在我的 GitHub 上找到这个链接:https://github.com/bgp09002/NBA
所有的 CNN 都是*等的吗?
不考虑建筑,CNN 用相似的策略识别物体:但是人类使用一种非常不同的策略。
我们对卷积神经网络(CNN)知之甚多,却知之甚少。我们可以访问每一个模型参数,我们可以检查他们训练数据的每一个像素,并准确地知道架构是如何形成的——然而,理解他们识别物体的策略被证明是令人惊讶的挑战。
理解策略是至关重要的:如果我们理解 CNN 如何决策——也就是说,他们使用哪种策略,我们只能相信 CNN 从 X 射线扫描中识别癌症或驾驶自动驾驶汽车。
我们在这里引入误差一致性,一个简单的分析来衡量两个系统——例如两个 CNN,或者一个 CNN 和一个人——是否执行不同的策略。通过这种分析,我们研究了以下问题:
- 所有的 CNN 都是“*等的”(实施相似的策略)吗?
- 循环 CNN 的策略不同于前馈 CNN 吗?
- 人类使用和 CNN 一样的策略吗?
动机:犯错就是告诉别人
所以你想训练一个神经网络来区分小狗和人。也许你想训练一个系统,当你的小狗到来时打开门,但不让陌生人进入,或者你是一个动物农场的主人,你想确保只有人可以进入房子。
在任何情况下,你都可以用你最喜欢的 CNN(比如,ResNet-152 代表性能,AlexNet 代表美好的旧时光),用从网上搜集的小狗与人的数据集来训练它们。看到它们每个都达到了大约 96-98%的准确率,你就放心了。很可爱。但是相似的准确性是否意味着相似的策略呢?
嗯,不一定:即使非常不同的策略也可能导致非常相似的准确性。然而,网络出错的那 2 %- 4%携带了关于它们各自策略的大量信息。假设 AlexNet 和 ResNet 都在下面的图像上犯了一个错误,预测了“人”而不是“小狗”:
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
现在犯这个错误就像这只狗看起来一样令人难过,特别是因为许多其他小狗都被很好地认出来了,就像这里的这些:
你大概知道小狗长什么样,但是它们不可爱吗?!照片由巴拉蒂·坎南在 Unsplash 上拍摄。
再看一些网络无法识别的图像,你开始产生怀疑:有没有可能两个网络都实施了分类策略“穿衣服的就是人”?你一直怀疑 AlexNet 有点像骗子——但你呢,ResNet?对一个有 152 层的人要求更多一点的人物深度是不是太多了?
更仔细的观察证实:相反,网络也错误地将一些人分类为“小狗”——如果模特的决策策略依赖于衣服的程度,我们让读者想象这些图像可能会是什么样子。
出错很说明问题,我们可以利用这一特性:如果两个系统(例如,两个不同的 CNN)实施相似的策略,它们应该在相同的单个输入图像上出错——不仅是相似数量的错误(通过准确度来衡量),而且是相同输入上的错误:相似的策略会产生相似的错误。这正是我们可以使用误差一致性来衡量的。
在我们最*的论文中介绍的,逐个试验的错误一致性评估两个系统是否在相同的输入(或试验,在心理学实验中称为试验)上系统地出错。如果你愿意,可以称之为基于试错的分析。
抛开假设的玩具数据集(小狗对人),在一个大数据集(ImageNet)上训练的不同 CNN 的策略有多相似?它们与相同数据上的人为错误相似吗?我们只是去了动物,原谅,模型农场并评估了所有 ImageNet 训练的 PyTorch 模型,以获得它们在数据集上的分类决策(正确答案与错误),我们也有人类决策进行比较。这是我们的发现。
所有 CNN 都是*等的
当我们看下面的图时,可以看到 16 种不同的 CNN 具有大范围的 ImageNet 精度,范围从大约 78% (AlexNet,棕色,在左边)到大约 94% (ResNet-152,深蓝色,在右边)。如果两个系统犯的相同错误和我们偶然预料的一样多,我们会看到误差一致性为 0.0;较高的误差一致性表明策略相似(相同策略高达 1.0)。
CNN 与其他 CNN 相似,但不像人类:更高的误差一致性(高达 k=1.0)是对相似策略的指导。图片作者。
有趣的是,CNN 和人类之间的误差一致性(黑色虚线)非常接*于零:人类和 CNN 很可能实施不同的策略,并且这种差距不会随着更高的模型性能而缩小。另一方面,人类对人类(红色)是相当一致的:大多数人类会犯和其他人类相似的错误。然而,也许最令人惊讶的是,CNN 与其他 CNN(金色)的对比显示出异常高的一致性:CNN 与其他 CNN 犯了非常相似的错误。
所有的 CNN 都是*等的吗?自从 AlexNet 在 2012 年推出以来,我们已经看到了非常先进的神经网络架构。我们现在有了跳过连接、数百层、批量标准化等等:但是错误一致性分析表明我们所取得的是准确性的提高,而不是策略的改变。
在我们的分析中,记录的最高误差一致性甚至出现在两个非常不同的网络中:ResNet-18 与 DenseNet-121,这两个模型来自不同的模型系列,具有不同的深度(18 层与 121 层)和不同的连接性。在很大程度上不考虑架构,被调查的 CNN 似乎都执行非常相似的策略——不同于人类的策略。
…但是有些 CNN 比其他的更*等吗?
你可能会指出,我们只测试了前馈网络,这似乎是不正确的,因为众所周知,人脑有丰富的循环计算。当然,我们不能将这些发现推广到所有 CNN,包括复发的 CNN。
这当然是真的,我们只能对我们测试的 CNN 做出明确的声明。为了找出一个循环网络是否不同(“比其他网络更*等”),我们也分析了一个循环 CNN。而且不只是任何一个循环网络:CORnet-S,根据大脑评分网站的说法,这是世界上最像大脑的神经网络模型,CORnet-S 在 NeurIPS 2019 上发表了口头贡献,CORnet-S,“目前灵长类腹侧视觉流的最佳模型”,根据其作者的说法,执行“类脑物体识别”。
CORnet-S 有四层,分别以大脑区域 V1、V2、V4 和 IT 命名。图鸣谢:https://papers . nips . cc/paper/9441-brain-like-object-recognition-with-high-performance-shallow-recurrent-ANNs . pdf(裁剪自https://github . com/dicarlolab/neur IPS 2019/blob/master/figures/fig 1 . pdf
CORnet-S 有四层,分别称为“V1”、“V2”、“V4”和“它”,分别对应于灵长类动物(包括人类)中负责物体识别的腹侧流脑区。当将 CORnet-S 与基线模型前馈 ResNet-50 进行比较时,我们发现:
递归 CORnet-S(橙色)会产生与前馈 ResNet-50(蓝色)类似的错误,但不会产生类似人类的错误(红色)。许多橙色和蓝色数据点甚至完全重叠。选择 x 轴是为了让我们可以看到灰色区域,如果模型只是因为偶然而表现出一致性,那么我们会期望模型出现在这个灰色区域。
这很奇怪。人类会犯与人类类似的错误(红色),但递归 CORnet-S(橙色)会犯与前馈 ResNet-50(蓝色)几乎完全相同的错误:这两个网络似乎实施了非常相似的策略,但根据错误一致性分析,肯定不是“类似人类”的策略。(然而,请注意,它实际上取决于数据集和指标:例如,CORnet-S 在捕捉生物物体识别的循环动态方面显示了有希望的结果。)似乎循环计算——在 挑战 任务中显得尤为重要的——并不是什么灵丹妙药。虽然递归是通常 认为 到 是 之一 的 关键为了更好地解释生物视觉,递归网络不一定导致与纯前馈 CNN 不同的行为策略。
摘要
- 所有的 CNN 都是生来*等的:不管架构如何,所有 16 个被调查的 CNN 都会犯非常相似的错误。
- 没有 CNN 比其他 CNN 更*等:根据误差一致性分析,即使是被称为“灵长类腹侧视觉流的当前最佳模型”的递归 CORnet-S,其行为也像标准的前馈 ResNet-50(但两个网络都未能犯类似人类的错误)。
- 人类是不同的。人类和机器视觉使用的策略还是很不一样的。
量化行为差异可能最终会成为缩小人类和机器策略之间差距的有用指南,这样,在某个时间,某天我们可能会到达这样一个点,用乔治·奥威尔的话来说,以下内容已经成为现实:
他们从模型看向人,从人看向模型,再从模型看向人;但是很难说哪个是哪个…
参考
上述分析可在以下文件中找到:
R.Geirhos、K. Meding和 Felix A. Wichmann,超越准确性:通过测量误差一致性量化 CNN 和人类的逐个试验行为 (2020),arXiv:2006.16736
密码
误差一致性是衡量两个决策系统是否系统地做出决策的定量分析
github.com](https://github.com/wichmann-lab/error-consistency)
所有的翻牌都是一样的吗?
FLOPs 与运行时间的比较
最初发布于https://deci . ai/are-all-flops-created-equal-a-comparison-of-flops-vs-run-time/
在深度学习时代的初期,我们的主要目标是达到新的准确性水*。事实上,深度学习的早期工作在各种任务和数据集上显示了显著的结果。然而,*年来,重点已经转移到最大限度地提高效率。如今,深度学习社区正在寻求推理效率提高的更准确的模型。深度学习推理中的效率概念取决于上下文。它可能指的是能耗、内存效率或运行时效率——这是本文的重点。
对*年来开始出现的高效模型的分析通常假设浮点运算(FLOPs)可以作为任何类型的效率(包括运行时间)的准确代理。在串行与并行计算的环境中,这种假设显然是错误的;当 N 个工人可用时,挖壕沟(一个完全并行的任务)比挖井(一个固有的串行任务)快 1/N。类似地,由于 GPU 的高并行化能力,可并行化的操作将比不可并行化的操作运行得更快。但是并行化考虑并不是一切,在这篇文章中,我们来看一个重要的例子,它表明 FLOPS 不足以衡量 GPU 计算环境中的运行时间。
在我们的数值示例中,我们使用标准的 CuPy 和 PyTorch 库在 GPU 和 CPU 上执行矩阵乘法。我们证明了相同数量的 FLOPs 会导致不同的运行时间。我们的示例模拟了网络一层中的操作,其中我们研究了两个矩阵乘法。第一个乘积是一个 NxN 矩阵乘以一个 Nx1 向量。第二个是两个向量的外积,即一个 Nx1 矩阵与一个 1xN 矩阵的积,结果得到一个 NxN 矩阵。然后,为了在两种情况下获得相同数量的触发器,在执行外积之后,我们对每列使用 N-1 次加法来对矩阵的每列求和。图 1 中的图表示意性地描述了这两个操作。
图 1:两个矩阵/矢量产品消耗相同的 FLOPs。左:矩阵矢量积。右图:向量向量外积,在外积之后,我们对每一列求和。
这些操作中的每一个都消耗 2 NxN-N 个触发器,这些触发器被分解成 NxN 个浮点(FP)乘法和 NxN-N 个 FP 加法。
我们现在考虑使用 GPU 加速这些计算(参见下面的 Python 代码)。图 2 中的图表描述了两种操作的运行时间与测得的触发器的关系。这些图是通过应用每种 N 值递增的产品,并在多次运行中求*均值而生成的。
图 2:运行时间(单位为秒)与矩阵乘法的 N(FLOPS = 2 nxn-N)和向量乘法及求和的函数关系。蓝色:矩阵矢量;橙色:向量向量(外积)。X 轴(N)是矢量/矩阵的大小。从左到右:GPU 上的 CuPy,GPU 上的 PyTorch,CPU 上的 PyTorch。
尽管每个场景中的 FLOPs 数量是相同的,但是它们的运行时间却有很大的不同。此外,随着 N(矩阵中条目的数量)的增加,差异变得更大。例如,在 CuPy 曲线中很明显,当向量/矩阵大小为 N=20,000 时,外积大约比矩阵乘法长 1.5 倍。使用 PyTorch,当 N=20,000 时,差异变得超过 2 倍长。
对于观察到的操作运行时间的巨大差异,以下是一些常见的解释。
GPU 计算的底层视图
为了理解什么可以区分 FLOPs 和运行时,我们需要首先理解 GPU 如何执行计算。在幕后,当计算深度神经网络中的层的值时,有两种操作:
乘法和累加(MAC) —此操作需要三个输入:内核(或关于内核的信息)、输入数据和从上一次迭代计算的部分和。这三个输入通过算术逻辑单元(ALU)传输,该单元执行乘法和加法的逐位运算。运算的输出是存储在单独的存储器单元中的部分和。
内存访问—此操作获取为每个 MAC 操作计算的部分和,并根据其大小将其存储在指定的内存单元中。粗略地说,有四种(有时更多)类型的存储单元:寄存器文件(RF)存储器,存储少量数据(最多 1Kb);处理引擎(PE ),存储更多的数据;缓冲单元;还有那杯酒。随着存储单元大小的增加,该单元的时间消耗也增加。在最糟糕的情况下,读取和写入 DRAM 的成本非常高,运行时间是存储在 RF 上的 200 多倍。
当我们计算失败次数时,我们实际上并不区分 MAC 和内存访问操作。然而,这些可能与运行时间有很大不同。一系列需要大量 DRAM 存储的 MAC 比同样数量的完全不使用 DRAM 的 MAC 花费的时间要多得多。
并行操作的能力是影响最终运行时间的另一个因素。与由几个为顺序串行处理而优化的内核组成的 CPU 相比,GPU 由包含数千个较小内核的大规模并行架构组成。这为可以并行运行的网络结构提供了优势。例如,GPU 的结构要求在一定的规模下,较宽较浅的网络在 GPU 上的运行速度要快于较深较细的网络。这是因为如果更广泛的网络的操作占用更多的 GPU 核心,则可以以并行方式进行计算,而更深入的网络的计算需要以更顺序的方式进行。操作的并行化取决于所使用的特定硬件和算法操作。
回到我们的数字示例,可以将运行时间的差异归因于两个因素:并行性和内存访问。也就是说,自定义实现可以减少运行时间的差异;因此,这种差异很大程度上取决于所用框架的具体实现。我们能够使用名为 Nsight system 的 NVIDIA 工具来识别特定的内存访问和并行性瓶颈。我们将在以后的文章中讨论这个话题。
注重记忆的编程可以加快计算速度
尽管我们在图 2 中观察到明显的差距,我们还是想举例说明该框架对结果的影响。使用高级框架时(例如 CuPy、PyTorch、TensorFlow 等。),我们实际上是在使用一个预定义的算法。在不同的用例中,不同的算法表现出不同的性能。例如,2D 数组的 CuPy 实现是通过重新索引 1D 数组的条目来实现的。这意味着当试图从 2D 数组中弹出元素时,一行中的相邻元素将比一列中的相邻元素更快地被检索到。由于这个原因,我们可以期待一个通用算法在行上比在列上更快地执行求和。回想一下,在图 2 的结果中,我们用 CuPy 对列进行了求和。我们现在表明,通过改变求和的维数,我们可以(几乎)使两个操作的运行时间相等。这可以从图 3 中看出:
图 3:矩阵乘法与向量乘法和求和的运行时间(秒)与触发器。蓝色:矩阵矢量;橙色:向量向量(外积)。X 轴对应于矩阵中条目的数量。这个实现使用了 CuPy,其中对行执行外积后的求和。
尽管在这个具体的例子中,我们能够通过改变一行代码来改善结果,但是当使用更高级别的框架时,这并不总是可能的。例如,如果我们用 PyTorch 尝试同样的技巧,结果不会有明显的改善。此外,当涉及到真正的深度网络时,减少运行时间需要非常高的专业知识。
结论
通过一个矩阵/向量乘积的具体例子,我们证明了在运行时,FLOPs 不能作为效率的通用代理。这一事实经常被忽视,甚至在某些学术论文中也是如此。我们使用 CuPy 和 PyTorch 演示了两个矩阵/向量乘法,它们消耗完全相同的触发器数量,却可以有完全不同的运行时间。我们还简要讨论了这些差异的原因。
CuPy 代码
import cupy as cp
import time
import os
import numpy as np
import matplotlib.pyplot as plt
from cupy import cuda
import pickle
def cp_Matmul(x, y, iterations):
for i in range(iterations):
q = cp.matmul(x, y, out=None)
return q
def cp_Vecmul(x,y,iterations):
for i in range(iterations):
q = cp.matmul(x,y,out=None)
q = cp.sum(q,axis=1)
return q
xmin = 1000
xmax = 20000
jump = 500
lim = range(xmin,xmax,jump)
Matrix_result = []
Vector_result = []
iterations = 1000
for k in lim:
N = k
vec_outer_1 = cp.random.rand(N,1)
vec_outer_2 = cp.random.rand(1,N)
matrix = cp.random.rand(N,N)
vec_matrix = cp.random.rand(N,1)
start_event = cp.cuda.stream.Event()
stop_event = cp.cuda.stream.Event()
start_event.record()
q = cp_Vecmul(vec_outer_1,vec_outer_2,iterations)
stop_event.record()
stop_event.synchronize()
Vector_time = cp.cuda.get_elapsed_time(start_event, stop_event)/1000
Matrix_result.append(Matrix_time)
print('Total run time matrices', Matrix_time)
PyTorch 代码
import os
import numpy as np
import matplotlib.pyplot as plt
import torch
import pickle
def tr_Matmul(a, b, iterations):
for i in range(iterations):
q = torch.mm(a, b, out=None).to(device=cuda0)
return q
def tr_Vecmul(a,b,iterations):
for i in range(iterations):
q = torch.mm(a,b,out=None).to(device=cuda0)
q = torch.sum(q,dim=0).to(device=cuda0)
return q
xmin = 1000
xmax = 20000
jump = 500
lim = range(xmin,xmax,jump)
Matrix_result = []
Vector_result = []
iterations = 1000
for k in lim:
N = k
cuda0 = torch.device(device='cuda')
vec_outer_1 = torch.rand(N,1).to(device=cuda0)
vec_outer_2 = torch.rand(1,N).to(device=cuda0)
matrix = torch.rand(N,N).to(device=cuda0)
vec_matrix = torch.rand(N,1).to(device=cuda0)
start_event = torch.cuda.Event(enable_timing=True)
stop_event = torch.cuda.Event(enable_timing=True)
start_event.record()
q = tr_Vecmul(vec_outer_1,vec_outer_2,iterations)
stop_event.record()
torch.cuda.synchronize()
Vector_time = start_event.elapsed_time( stop_event)/1000
Vector_result.append(Vector_time)
print('Total run time vectors',Vector_time)
start_event = torch.cuda.Event(enable_timing=True)
stop_event = torch.cuda.Event(enable_timing=True)
start_event.record()
q = tr_Matmul(matrix, vec_matrix, iterations)
stop_event.record()
torch.cuda.synchronize()
Matrix_time = start_event.elapsed_time( stop_event)/1000
Matrix_result.append(Matrix_time)
print('Total run time matrices', Matrix_time)
计算生物学家失业了吗?
人工智能
研究人员一直专注于开发人工智能(AI)驱动的生物医学数据分析*台。DrBioRight 做了一个很好的初步尝试。
R 最*,为生物医学研究开发了一个人工智能驱动的分析*台, DrBioRight ,发表在顶级科学期刊之一的 癌细胞 上。
该工具的主要功能是利用自然语言处理( NLP )技术,使没有 生物信息学或编程专业知识的 生物医学研究人员能够对大型 组学 数据集进行计算分析。
具体来说,DrBioRight 允许用户用自然语言而不是编程脚本对其进行【对话】。然后,它将 【翻译】 通过应用预先训练好的神经网络,将自然语言翻译成特定的生物信息任务。在与用户确认预测的请求分析后,DrBioRight 将在云上执行分析并报告最终结果。
人们可以在他们的官方网站上查看下面的一些具体例子:
*[## 演示和教程
简介数据汇总生存分析相关分析差异分析突变棒棒糖可视化…
drbioright.org](https://drbioright.org/landing/demo/)*
这个想法太酷了,因为整个过程是自动化的,只需要用户在一个简单的问题中提供几个关键词,例如“在 基因 X 和 存活率 之间的 关系 在 乳腺癌 中是什么?”
传统上,组学数据集的分析非常复杂,需要生物信息学和生物统计学专家参与该项目。然而,DrBioRight 似乎打破了这一规则,给纯生物学家配备了大量的自动化分析管道。
像 DrBioRight 这样的工具正在试图定义生物医学科学中的新一代分析方法,这必将使研究进展更加直观和高效。
那么,计算生物学家会失业吗?
不,*期不会。
我列出了一些主要的挑战,这些挑战使得这些*台无法自动完成项目中所有必要的计算工作。
对完全“自动化”的挑战
1.生物信息学中没有“黄金标准”
随着*几十年来组学技术的爆炸式发展,分析工具和管道的开发速度呈指数级增长。太常见了,针对 同一个任务 设计的几十种不同的分析方法突然一起出来了。
从可用的方法中选择一种作为特定任务的“标准”方法几乎是不可能的,尤其是当大多数工具在相同的测试数据集上执行类似的操作时。
例如,任何审稿人都不能仅仅因为作者在 差异表达基因分析 中使用 DESeq 而不是 EdgeR 就拒绝提交的稿件。
所以,下面这幅漫画中的情况一直在发生。
图片网址:https://imgs.xkcd.com/comics/standards.png
如果你是一个生物信息学初学者,你必须明白当你需要从ENSEMBLref seqgen code中选择一个注释源时的痛苦。* 无论你选哪一个,老板总会说你错了。*
还要记住,像 DrBioRight 这样的自动化*台通过将用户的反馈作为额外的训练数据点来保持学习。假设对于 DrBioRight 的同一个预测(基于输入自然语言的预测任务),不同的用户由于自己心目中想要的“标准”分析而给出不同的反馈。这会成为训练过程的灾难。
2.没有办法概括特定的生物学驱动的分析
可以在流水线中推广和实现的分析通常作为项目中计算工作的第一步。然后,生物学家需要检查计算结果,根据结果生成生物学假设,并要求生物信息学家进一步执行一些特定的分析。诸如此类…**
根据我自己的经验,我 80%以上的计算工作都是基于生物学家的请求来解决特定的生物学相关问题,这是如此具体,如此依赖于上下文,以至于人工智能*台很难通过自然语言准确地学习它。
3.生物信息学家自己仍然在努力与纯粹的生物学家沟通
生物信息学家和生物学家接受的训练如此不同,以至于他们很难相互理解。
生物信息学家希望 从生物学家那里复制更多的 。
生物学家想从生物信息学家那里得到 p 值 。
我不相信任何一个 AI *台能回答这样的问题,“你能给我一个这些免疫细胞的 p 值吗?”因为,没有语境,这个问题可以有千百种解读。
双方之间的硬通信充当了系统随机标记的训练数据点,这将使人们在未来更难有效地使用它。
利用这些人工智能驱动的生物信息工具的最佳方式
尽管人工智能驱动的*台在为生物学家执行完整的自动化分析方面存在局限性,但让研究社区能够访问它们仍然很重要。以下是一些原因。
快速初步分析
如前所述,计算分析的第一步,或预处理,总是可以通过广义流水线来实现。
在这一步,*台的性能和研究人员的期望比在下游分析中更容易保持一致。因此,来自用户的反馈可以促进人工智能*台的训练。
在输入大量训练点后,该*台可以比传统方式更有效、更透明、更可重复地执行初始分析,传统方式涉及生物学家和生物信息学家之间的大量通信。
已发布数据中的证据检查
生物学研究中最耗时的部分之一是从公共数据集中找到某种机制的证据。与搜索文献并重新分析他们的数据相比,直接向人工智能*台提问以进行自动分析似乎更有效。
人工智能迅速改变了我们的生活,也改变了我们进行研究的方式。
它会取代我们人类研究者吗?
也许会,但肯定不会在不久的将来。
所以,放轻松。
您可以返回去调试您的管道。生物学家在等你。
免责声明:
作者与开发 DrBioRight 的研究团队没有任何个人或专业关系。整篇帖子仅代表作者本人对相关研究领域的观点,不应视为确凿的科学陈述。
参考资料:
李等,下一代组学数据分析,肿瘤细胞(2020),【https://doi.org/10.1016/j.ccell.2020.09.002】
非正式地称为组学的科学分支是生物学中名称以后缀…
en.wikipedia.org](https://en.wikipedia.org/wiki/Omics)
【https://drbioright.org/landing *
仪表板是给我的吗?
了解您的 Jupyter 笔记本作为交互式仪表盘是否更有用
作为一名数据科学家或分析师,您经常在 Jupyter 笔记本上为自己创建数据可视化,将图表复制到电子邮件和演示文稿中。你的朋友谈论他们为同事制作的最新“交互式仪表板”,但这听起来工作量很大,可能会让你的客户感到困惑。
本文不是一个深入教授您如何构建仪表板的教程。它将带您构建和部署基于 Jupyter 笔记本的最简单的仪表板,但只是向您展示这个概念。到本文结束时,您将知道您的仪表板朋友在谈论什么,并且您将处于一个更好的位置来决定交互式仪表板是否是您想要进一步追求的东西。
我将讨论托管仪表板的选择,并概述流行的仪表板框架。
卢克·切瑟在 Unsplash 上的照片
开源可视化的兴起
长期以来,商业智能工具一直用于根据公司内部数据创建图表。想想谷歌分析报告,也许被营销部门用来了解他们活动的有效性和指导他们未来的努力。
这些仪表板被植入到整体的 BI 软件套件中,通常使用拖放界面组装在一起。
作为一名数据科学家或定量开发人员,您在 Jupyter 中分析一组不同的数据,并且您没有任何类似的工具来围绕您的数据构建仪表板。听起来你需要构建一个完整的 web 应用程序,包括前端 Javascript 来引入类似的东西。
在过去的几年中,出现了一些优秀的开源框架。它们允许您轻松地将 Python(或 R etc)分析转换成交互式 web 应用程序,而完全不必考虑前端。你所选择的语言就是你所需要的,来指导框架为你处理用户界面。
这些框架将为最终用户引入小部件(滑块、复选框、下拉框等)来输入参数,它们还可能提供交互式图形或表格功能——能够放大图表,或者选择数据范围来更新相关图表组件中的图形。
稍后我将更多地讨论可用的框架,但是首先我将描述已经让您想到一定有更好的方法的那种 dataviz 场景。
你就是那个小部件
当你在 Jupyter 笔记本上工作时,在你尝试的时候自己更新参数是有意义的。
这是你对图表的第一次尝试:
t = 1.0 的图形
在第二个单元格中,您已经手动输入了 t=1.0。你把图表复制到电子邮件中,然后你的客户回来问如果你把 t 改成 2.0 会发生什么。
所以你换了牢房又跑了一次。
很多时候这没什么大不了的,如果客户和你在一起,这就很容易了。但是在某些时候,后退一步,看看是否可以自动化这个过程可能是有意义的。我们假设您不会要求您的非技术客户自己在笔记本上按 shift+enter 键。
在朱庇特的家里
我保证这不会是一个可视化框架的深入教程,所以我将选择最简单的方法来把我们的笔记本变成交互式的东西。
在第一个实例中,我们将向笔记本本身添加一个小部件,这样您就可以在 Jupyter 中滑动滑块(而不是更新代码单元格中的 t 参数)。
尽管对于我们的非技术客户来说,这仍然不够用户友好,他们不想看到代码单元。因此,下一步将是在所谓的“瞧”服务器上运行笔记本电脑,而不是在 Jupyter 服务器上。它非常类似于 Jupyter 服务器,但是它没有让用户在代码单元格中按 shift+enter 键,而是隐藏代码单元格,从上到下运行所有内容——只显示输出组件,包括我们的 slider 小部件。
互动
Jupyter 有一个重要的扩展包叫做 ipywidgets 。您可能需要先安装它(在 Jupyter 单元中运行!pip install ipywidgets
,然后重启并重新加载笔记本)。
然后,我们需要做的就是将我们的图形绘制代码单元重构为一个函数,并应用“interact”装饰器:
使用 ipywidgets 中的 interact
“interact”函数自动检测到我们的函数有一个浮点参数(t ),并自动提供一个滑块。您可以滑动滑块,立即看到基于新输入 t 的不同图表。
太好了!接下来,我们将使它完全用户友好。
在 Voilà中查看
使用与 Conda 类似的pip install voila
或安装 Voila python 包。你需要重启你的 Jupyter 服务器来处理这个问题。当您重新加载笔记本页面时,您现在会在工具栏中看到一个按钮:
Jupyter 工具栏中的 Voila 预览按钮
点击它,你将跳转到一个新的页面,显示 Voila 预览:
瞧,笔记本的预览
正如承诺的那样,代码单元是隐藏的,所以我们只剩下交互组件了。添加一些 markdown 单元格作为介绍——也许改变默认的模板——然后你就有了一个功能完整的 web 应用程序!
到目前为止,我们看到的 Voila 预览是一个有用的扩展,可以直接进入我们的新仪表板,但它是在 Jupyter 服务器上附带的,任何可以访问 Voila 预览的人都可以更改 URL 并返回到笔记本视图。
因此,为了安全运行我们的笔记本电脑,我们可以直接使用 voila 服务器,而以前我们使用 Jupyter 服务器。
之前运行jupyter notebook
来运行 Jupyter 的地方,用 Ctrl+C 停止,改为运行voila ./Dashboard.ipynb
(或者提供笔记本文件的正确路径)。
这一次,您可以看到我们的仪表板位于该 voila-only 服务器的根(也是唯一的)URL:
瞧,仪表板
共享您的仪表板
激动人心!你已经可以想象你的客户和同事相信你一夜之间变成了一个全栈的 web 开发人员。那么,你如何与你的非技术观众分享你的 web 应用呢?
不幸的是,这可能是你面临的一个障碍。明确地说,托管 Voila(或类似的)仪表板在技术上没有什么特别复杂的。但是不管怎样,你(或者你亲*的人)将不得不维持或者购买某种形式的托管服务。
在一些服务中,有一些免费选项,用于可以是公共的仪表板,或者用于低使用率层。
如果您的组织已经在运行一个 JupyterHub(或者想要运行),那么我自己的 ContainDS Dashboards 项目将允许您在您的 JupyterHub 中自动托管您的仪表板,安全地供经过身份验证的用户使用。
一般来说,有两个重要方面需要考虑:
- 托管将在哪里存在
- 如何认证用户
让我们假设我们仍然使用 Voila 来运行我们的仪表板——但是大多数关于托管的建议适用于任何开源框架。
自己做
当然,您可以在任何虚拟机或物理服务器上运行 voila 服务器。
这可能是在云服务上,如 AWS、Google Cloud、Heroku 或 Azure。通常,大型云提供商会要求您配置自己的服务器,当然,当您添加了 HTTPS 证书时,您将需要在 nginx 或 apache 等标准 web 服务器后面运行您的 dashboard 服务器,即 web 流量到达 nginx,然后反向代理到 voila 服务器。
Heroku 和 Google App Engine 让事情变得简单一些,因为一切都是基于配置的,HTTPS 通常是默认的。
然而,认证是一个巨大的问题。您如何确保只有您的目标用户可以访问仪表板?您的 web 服务器可以配置一个密码,甚至可能是一个允许的用户名/密码列表,但是更新起来很麻烦。
同样,这在技术上并不困难,但是它需要您可能希望 it 部门长期管理的细节,尤其是对于任何敏感的东西。
同样,在“自己动手”类别中,只是在你自己的计算机上运行 voila 服务器,就像你在自己的试验中所做的那样,为你的用户打开一个“隧道”。同样,没有身份验证,您需要打开笔记本电脑!对于非敏感数据的快速共享,这仍然很有用——参见 Voila 文档的 ngrok 部分。
JupyterHub 和 Binder
在你的仪表板可以公开的地方,有一个名为 MyBinder.org的免费服务,它将基于 Git 回购的内容推出一个 Jupyter 笔记本(加上通过其自己的 URL 访问 Voila)。当然,这需要您更新 Git repo,并且在新的提交后第一次启动时,需要一段时间来构建环境。你可以给你的客户发送一个直接链接,启动程序,然后直接跳转到 Voila URL——但是 Jupyter 服务器也会运行在一个不同的 URL 上,如果他们知道如何输入的话,就像我们之前尝试 Voila 预览一样。MyBinder 本质上是开源的 JupyterHub 项目(一个为多个用户提供 Jupyter 笔记本环境的网站)的一个公共开放部署。
尤其是如果你的组织已经在运行自己的 JupyterHub,我自己的包含仪表板扩展非常适合。因为 JupyterHub 已经在运行了(对于常规的 Jupyter 笔记本服务器),所以根本不需要额外的基础设施。JupyterHub 具有高度可配置的认证模块,因此,例如,您可以要求通过您的公司电子邮件单点登录来登录。
ContainDS Dashboards 为 JupyterHub 增加了一个额外的“Dashboards”菜单。您只需指定笔记本或脚本的路径,并选择您正在使用的框架(如“瞧”、“streamlit”等,稍后将讨论)。任何通过 JupyterHub 认证的用户都可以直接访问您的仪表板。
包含仪表板
如果您的组织目前没有运行 JupyterHub,那么创建一个就足够容易了,而且它非常受欢迎,可以为一系列不同的安装场景提供帮助。
托管服务
部署仪表板的最简单方法是通过托管服务,而不需要您自己的任何基础架构。这些通常与特定的框架相关联。
如果你的仪表盘使用 R Shiny 框架(稍后描述),那么对于一次性部署来说, shinyapps.io 云服务是一个简单的选择。一旦你在 R 环境中配置了一个访问令牌,你只需要运行deployApp()
来自动上传你的应用。
在免费和基本计划中,仪表板是公开的。对于标准计划及以上(每月 99 美元或更高),包括认证。在 shinyapps.io 网站上,您可以输入电子邮件地址以邀请加入您的应用程序。他们可以使用 GitHub 或 Google 单点登录登录,或者只需基于该电子邮件地址设置一个 shinyapps 帐户。
shinyapps.io
类似的服务存在于 Plotly Dash 框架(R 或 Python)中。Dash Enterprise 允许您连接一个 Git repo,这样提交就会自动部署到这个云服务。他们有更广泛的认证方法,同样包括基本的电子邮件登录。
Streamlit(一个 Python 框架)也在开发一个团队产品。
这些托管服务中的大多数都是“部落式”的——只适合于它们所围绕的框架。但是他们肯定会负责托管和认证!
一个名为 Datapane 的新服务试图与框架无关,尽管需要你直接在脚本中添加一些额外的部署 Python 代码。发布的报告出现在 Datapane 自己风格的 web 界面中,通常最终用户需要理解他们必须运行报告。他们看起来不像对 Voila 那样直接进入它。团队内部的定期分享值得一看。
离线部署
我自己的 ContainDS 套件的另一个组件是桌面产品。这是一个桌面应用程序,您和您的客户端都可以在本地安装。然后,您可以将您的整个 Jupyter 环境导出为一个单一的*面文件,发送到您的客户端,客户端可以导入该文件并看到它按照预期运行。
这对于非常敏感的情况,或者您根本不想涉及服务器的情况非常有用。但是,双方都需要运行 Docker 或 VirtualBox,所以入门会有一些开销…
原则是,这比试图让您的客户机安装 Conda 和 Python 环境要可靠得多!
框架概述
你可能已经注意到,“分享你的仪表板”部分并不完全是结论性的。部署仍然是一个棘手的问题——再说一次,在技术上并非不可克服,但它总是需要基础设施到位。
如果这破坏了您最初对构建自己的仪表板的兴趣,我深表歉意!但是我认为告诉你真相是很重要的…
如果您仍然相信仪表板可以改变您的数据讲述能力,这里有一些流行的开源仪表板框架的简要概述。
我认为它们可以大致分为:支持的语言;可视化特征;和易用性与 UI 控制。
细流
Streamlit 是一个有趣的新框架,基于简单的 Python 声明式脚本。使用 Python 脚本中的窗口小部件(例如滑块和下拉菜单)很容易创建漂亮的 web 应用程序,这对于开发人员来说有直观的意义,而不必担心“事件”——当某个东西被点击时代码应该如何反应。
其他框架可能要求您自己考虑用户流并连接事件,而 Streamlit 默认会为您处理这个逻辑。只要您已经声明了 UI 组件,当用户与它交互时,Streamlit 将负责重新运行脚本的适当部分。
当然,这种简单的范式会使一些事情变得更加复杂——例如,如果太多的代码过于频繁地运行,就必须添加缓存装饰器。
Streamlit 脚本必须通过streamlit run
命令运行。
由克里斯蒂安·沃纳开发的 Streamlit 中的数据浏览器
阴谋破折号
Plotly Dash 是一个“全栈”框架,通过它,你不仅可以使用 Python、R 或 Julia 来控制后端数据处理,还可以控制前端 UI。与 Streamlit 相比,您更经常需要考虑用户界面流的工作方式,连接事件。这并不一定是一件坏事,最终会让你在早期获得更多的控制权。
同样,对于如何将 Plotly Dash 应用程序作为子应用程序集成到更大的应用程序中,您有更多的选择。底层服务器机制更加清晰地暴露出来。
散景和面板
Bokeh 由 Anaconda Inc(虚拟环境公司)发展而来,并由 NumFOCUS 非营利组织支持,该组织还支持 Jupyter 和许多其他科学计算包,如 NumPy。
这是一个 Python 框架,它的优势在于对交互式图形的详细控制。
作为直接比较,大多数人说他们发现 Plotly Dash 更容易上手,并最终提供了类似的控制水*。但是散景可以更深入地进行更复杂的可视化。
在 Bokeh 上有非常广泛的开源组件。
Panel 有时被视为一个独立的可视化框架,但至少最初它扩展了散景。它提供了一个更加灵活的窗口小部件系统,而不仅仅是关注图形。它的设计目标是能够在 Jupyter 笔记本上运行,就像作为一个独立的应用程序一样。
Panel 允许您轻松地将其他开源可视化组件集成到您的应用程序中。它本身是简化 Python 中数据可视化的更广泛的 HoloViz 努力的一部分。
将 Panel 和 HoloViz 区分开来的是将多个图形连接在一起的能力,以便与其中一个图形交互(例如选择一系列点)以相应的方式更新其他图形。
有些学术领域围绕全息视图建立了专门的生态系统,例如地理;以及用于处理大型数据集可视化的工具集。
我的感觉是,如果你有一个不寻常的或详细的可视化类型,使用 Bokeh / HoloViz 堆栈比其他框架更有可能实现。
r 闪亮服务器
如果你是一个 R 语言的爱好者,你应该已经知道用于交互式应用的闪亮框架…如果你是一个坚定的 python 主义者,你现在不会改变!
闪亮的用户界面可以完全使用 R 语言构建,也可以直接用 HTML、CSS 和 JavaScript 编写,以获得更大的灵活性。
如果你只是构建一个仪表板,而 R 非常适合你的分析,那么 Shiny 也应该非常适合你的 UI。但值得记住的是,如果您的代码将来要开发成一个更大的 web 应用程序,您可能最终会错过像 Python 这样更通用的语言所带来的数据库和通用软件工程能力。
Shiny 是 RStudio 为您带来的强大的数据科学家工具套件的一部分。
注意,Voila 当然支持 R 笔记本。如果你有一个用 R 写的简单的 Jupyter 笔记本,那么瞧,这可能是使它具有交互性的最快方法。
瞧
我们之前已经演示过了。它的优势在于“Jupyter native”。Jupyter 支持的任何语言也可以使用 Voilà。本机提供的交互式小部件是基本的,但这是一种从笔记本到 web 应用程序的简单方法。
你也不需要局限于 Jupyter 的小部件。使用面板组件来构建笔记本是完全可能的,并且这可以通过 Voilà(以及直接使用 Bokeh/Panel)来部署。
要了解 ipywidgets 是如何工作的,这里有一个优秀教程。
摘要
也许你的客户只想要 PDF。把你的分析变成一个交互式的仪表板并不总是有意义的,但是希望我已经给了你一些想法来帮助你认识到什么时候与你的客户来回的电子邮件交流可以上升一个层次。
对于数据科学家或分析师来说,有趣的部分无疑是使用框架来构建令人满意的用户界面。我希望对开源框架的概述能帮助你找到一个合适的框架来尝试。
然而,托管和认证通常是一个症结。我已经向您概述了那里的挑战,以节省您在学习仪表板框架方面的投资时间,但却意识到您没有资源或授权将您的仪表板送到您的客户或同事手中。
数据科学家更像猫…还是狗?
数据科学家更像猫…还是狗?这里有一个假设。
还是我们找错了对象?
昂普拉什:艾姆拉·阿特坎
我们的世界可能正处于全球疫情之中,但他们说笑是最好的良药。如果你可以在适当的地方躲避和在家工作时使用一点轻浮,请继续阅读,找出为什么我认为狗会比猫成为更好的数据科学家。
嗯,秘密已经泄露了。
数据出来了,现在比以往任何时候都清楚:如果动物可以成为数据科学家,那么狗会比猫更适合做数据科学家。
好吧,也许我的假设更多的是主观的而不是客观的,数据更多的是观察的而不是科学的,然而,当你探索科学家需要超越的四个基本技能数据时,你会看到我们的狗伙伴在黑桃中体现了这些品质。
好奇害死猫
数据科学家就像我们的犬类朋友一样,非常好奇,有时甚至是无止境的好奇。我们在不断修补和探索以找到更好的问题解决方案的数据科学家身上看到了这一点,他们总是问“为什么”、“如果”和“如何”,也在嗅着眼前一切的狗身上看到了这一点。狗有超过 3 亿个嗅觉感受器,相比之下,人类只有 600 万个,狗利用气味来感知周围的世界并获取信息。狗就像数据科学家一样,是不停的探索者,这就是为什么一个简单的街区散步可能需要 10 分钟以上。狗和数据科学家都非常好奇,这导致它们以各自的方式寻找(或嗅出)信息。
虽然我们不能否认猫科动物是好奇的动物,尤其是像“好奇害死猫”这样朗朗上口的短语,但这里有一个事实值得咀嚼——狗的大脑皮层神经元数量(5 亿)是猫的两倍(2.5 亿),这表明它们可能几乎是猫的两倍聪明。补充一些观点,数据科学家(或一般人类)大约有 10 亿个神经元。
你能教老狗新把戏吗?
无论是数据科学家知道的编程语言的数量,还是他们已经建立的专业知识的广泛领域,最好的可以学习新的东西。像最伟大的数据科学家一样,狗有能力获得广泛的技能。狗可以被训练成搜寻和营救、狩猎、放羊、保护财产、探测爆炸物、拯救溺水的人,信不信由你,甚至跳伞。无论是数据科学家还是狗,学习新事物的能力和意愿是区分优秀和优秀的关键。
猫可以被训练,但似乎更难做到这一点。这可能是由于他们的血统。猫是独居猎人的后代,而狗是成群狩猎的狼的后代。通过完成任务成为群体中的一员是狗的天性,而猫则更加独立。
不是狗咬狗的世界
比起同类相残,狗更喜欢和群体一起奔跑。数据科学是一项社会运动,最优秀的数据科学家可以将想法和人联系起来。这是一个令人难以置信的协作领域,多个团队需要共同努力找到解决方案。就像数据科学家一样,狗也受益于网络。数据科学家与领域专家、营销和销售团队以及其他数据科学家一起工作,以取得最佳成果。同样,狗总是为了安全和生存与它们的族群合作。
另一方面,猫与群体的联系并不紧密,极其自立。事实上,它们的祖先,野猫,视其他猫科动物为对手。猫似乎缺乏形成大型友好团体或联盟的合作技能,这种技能可以帮助数据科学家取得成功。
像一只叼着骨头的狗
数据科学家研究的问题极具挑战性。他们需要坚韧和耐力来寻找解决方案,这一壮举可能涉及到非常*凡的任务,如查找、清理和转换数据。像数据科学家一样,狗已经证明了它们能够忍受艰难困苦。想想领头的雪橇犬多哥和巴尔托,它们在 1925 年冬天帮助拯救了阿拉斯加小镇诺姆免于白喉。
多哥和巴尔托是 100 多只狗中的两只,它们在漫长、危险和艰苦的跋涉中接力,穿越 600 多英里的艾迪塔罗德小道,运送拯救了数千人生命的药物。船只和飞机无法穿越寒冷的冬天,但是狗拉雪橇队可以。数据科学家就像狗一样,需要精神和坚韧来保持前进,即使面对最艰难的挑战。
找错人了?
现在不要误解我,我喜欢猫,但我的假设是狗比猫更像数据科学家。
那么,你的最终结论是什么?谁最像数据科学家——狗、猫,甚至是另一种动物?
ALAN JACOBSON,ALTERYX 首席数据和分析官
此处原创发布:https://www.alteryx.com/input/dogs-cats-data-scientists
决策者是否被现代数据堆栈削弱了权力?
凯文·霍尔瓦特在 Unsplash 上的照片
不断变化的技术环境如何将权力从决策者手中转移
未来数据 2020
本周早些时候,我(虚拟地)参加了未来数据 2020,这是一个关于下一代数据系统的会议。在会议期间,我观看了 Fishtown Analytics 的创始人兼首席执行官 Tristan Handy 的有趣演讲,名为《现代数据堆栈:过去、现在和未来》。在演讲中,特里斯坦讨论了 2012 年至 2016 年间建立在数据仓库基础上的所谓寒武纪数据产品爆炸,如亚马逊红移,以及他认为我们正处于类似范式转变的边缘,他称之为“第二次寒武纪爆炸”。
Tristan 对现代数据堆栈的观点提供了许多思考的素材;然而,我想在这里探讨的主题源于一个关于数据驱动决策中自助服务未来的简短评论:那些不一定处于数据科学前沿的人如何最好地利用他们的数据做出明智的决策。
办公空间
为了开始这一探索,我将首先给出一个过去的简化版本,在此期间我不在工作年龄,因此我没有直接的经验:在前面提到的(第一次)寒武纪大爆发之前,数据分析主要是使用电子表格进行的,例如(当然)Microsoft Excel。在 20 世纪 90 年代和 21 世纪初的许多理论办公室里,无数无名无姓的理论分析师/决策者从周一到周五在成千上万的 Excel 电子表格中跳来跳去,在两个字母的列中添加计算字段,并引入没有记录的错误;这是一场笑声骚乱,分析师/决策者为他们所花的时间赚取了体面的理论工资,每个人都在晚上观看《老友记》,而没有义务讨论它有多成问题。
最*,随着现代数据仓库的出现,数据存储能够更好地从数据分析中分离出来,许多 SaaS 公司在人类不易理解的规模上从这种分离中获利。因此,许多新的商业智能*台开始进入办公室,给每个人的游行浇上雨水,而不是无忧无虑的朋友的时代范式,用一个漂亮的小细胞将数据制成表格,并能够由分析师/决策者在同一个程序中进行分析,只是因为这个新人参加了“得梅因”关于“未来”的“会议”
现代数据诈骗
让我后退一步:在他的讲话中或讲话前后(来源,特里斯坦做了如下评论:
“如何让自助服务民主化?有争议,但我认为现代数据堆栈削弱了许多决策者的权力。那些舒适的 w/ Excel 感觉切断了真理的来源。如果电子表格界面实际上是正确的方式呢?”
特里斯坦在他声称现代数据堆栈削弱了决策者的权力之前警告说,他的观点可能会有争议,但我认为他的说法毫无争议,主要是因为它是无可争议的事实。随着数据存储和分析从灵活易用的电子表格转向数据湖、数据河、数据深渊和数据沙盘等生态系统,最终用户(即过去的分析师/决策者)很可能已经迷失了方向,他们中的许多人主要将数据工具作为达到目的的手段。
简而言之,浏览现代数据堆栈不像浏览大量电子表格那么简单。尽管电子表格有很多缺点,但几乎没有学习曲线:如果你能打开电脑并打开文件,你就能浏览电子表格。此外,从一开始,您只需几次点击、击键和神经连接,就能掌握公式、数据透视表和可视化。我讨厌电子表格!—但它们是可用性和灵活性的*乎完美的*衡。
相比之下,虽然现代商业智能工具可能是为具有不同技术专业知识水*的最终用户构建的,但它们往往具有更陡峭的学习曲线。例如,虽然今天的决策者,现在被剥夺了他或她的“分析师”身份,可能会浏览仪表板并根据提供的信息做出决定,但他或她已经失去了亲手筛选数据的几乎触觉体验。
第二定律
我知道你在想什么——字面上的大量决策是根据一个长达一小时的演示中的饼状图做出的,而这个饼状图不是由在决策过程中拥有最终发言权的人整理出来的——但请允许我使用上述概括来支持我的下一个观点:每一项新的数据技术都使决策者远离数据源。
如今,决策者所需的数据可能位于设计简洁的仪表板上、物理服务器上、云中的某个地方和/或餐巾纸的背面,它们可能经历了各种转换,并以不同准确性和透明度的几种略有不同的形式存在,最有可能的是,决策者不知道这些来源中的哪一个包含他或她做出最佳决策所需的数据,也不知道这些数据经历了哪些处理;这完全是一片混乱,不是那种欢乐喜庆的巴奇亚式的混乱(我甚至没有提到数据固有的模糊性)。
一家公司在其数据堆栈中实施的技术越多,潜在的误解就越多,个人决策者就必须接受越多的培训,才能熟练掌握他们所依赖的数据堆栈。换句话说,决策者正被日益复杂的现代数据堆栈所削弱。
那么…现在怎么办?
我认为有三种可能的方法来解决权力丧失的问题:
- 不要试图重新发明轮子,长期保存电子表格;
- 雇用准备使用并跟上现代数据堆栈的决策者;或者
- 促进数据专家和决策者之间的密切合作,以支持决策。
这三种选择各有利弊,但我个人更喜欢第三种。在过去十年左右的时间里,我们存储和处理数据的能力有了快速的增长,仅仅依靠电子表格是不能满足所有现代数据需求的。同样,在许多行业,不能指望决策者独自站在数据科学的前沿。因此,在现代办公室中,数据专家和决策者之间的密切合作变得越来越必要。
或者,也许随着时间的推移,一个易于使用的工具将会出现,它可以用来存储和分析数据…哦…等等…那是电子表格。
网络越深越好吗?案例研究
约书亚·牛顿在 Unsplash 上拍摄的照片
介绍
你有没有想过建立更深层次的关系网会有什么影响,会带来什么变化?
我知道我有。
我说的是在你的模型中增加额外的层,并仔细检查下游发生了什么变化。
其他条件不变:
- 额外的层对你的训练/验证损失曲线有什么影响(如果有的话)?
- 一个额外的层在多大程度上影响你的下游预测结果?
- 输入要素的数量与模型的复杂性之间有什么关系?
- 这里面有什么取舍吗?
在这篇文章中,我将分享一系列实验和它们各自的结果来回答这些问题。
我们言归正传吧!
实验设置
在我们开始之前,我需要解释一下所涉及的实验装置。
该设置由 3 部分组成:
- 使用的训练数据集
- 为实验构建的模型架构
- 实验方法
训练数据
实验所用的数据集来自一场卡格尔竞赛;推文情感提取。
目标?
提取出支持特定观点的短语。
以下是训练数据的一瞥:
推特情感提取训练数据(来源)
我不会深入研究数据准备方法,因为我将在另一篇文章中讲述 Kaggle 的经历。
本质上,我们按照高音手套方法清理了文本,并为下游命名实体识别(NER)任务创建了自己的标签。
一旦我们有了建模就绪的数据集,我就开始构建一个基线 seq2seq 模型。
模型架构
模型架构由 3 个主要部分组成:
- 预先注意双 LSTM
- 多头自关注编码器堆栈
- 关注 LSTM
该模型从前置注意双 LSTM 开始,其输出被馈入编码器堆栈。
来自这些编码器堆栈的输出然后被馈送到后注意 LSTM,以生成手头的 NER 任务的顺序预测。
为什么选择编码器堆栈?
使用编码器堆栈的灵感来自 Vaswani 等人的论文“注意力是你所需要的全部”。艾尔。
本文详细介绍了变压器模型的外观。
简而言之,变压器模型由 6 个编码器堆栈和 6 个解码器堆栈组成。我不会深入这篇论文的细节,但如果你想知道《变形金刚》 (BERT)中著名的双向编码器表示背后的架构。我推荐阅读。
总之,编码器堆栈是这样的:
Vaswani 等人的编码器堆栈示例。艾尔(来源
如您所见,每个编码器堆栈由两个子层组成。
第一个是多头自关注机制,第二个是完全连接的前馈网络。
在每个子层周围,使用残差连接,然后进行层归一化。这是有意义的,因为剩余连接将预先注意双 LSTM 输出与多头自我注意层学习的上下文相加。
那么我们得到的模型架构看起来是什么样的呢?
如果我把它画出来,它会是这样的:
用于实验的模型架构
作为一个基线,该架构仅从一个单编码器堆栈开始。
以下是实验中使用的保持不变的层参数:
**Pre-attention Bi-LSTM:** preatn_forward={type="recurrent", n=64, act='tanh', init='xavier', rnnType='LSTM',outputType='samelength', reversed=False, dropout=0.3}preatn_backward={type="recurrent", n=64, act='tanh', init='xavier', rnnType='LSTM',outputType='samelength', reversed=True, dropout=0.3}concatenation_layer={type="concat"}
**Encoder Stack:**
attention_layer={type="mhattention", n=128, act='gelu', init='xavier', nAttnHeads=16}residual_layer1={type="residual"}
norm_layer1=layer={type="layernorm"}fully_connected_layer={type="fc", n=128, act='relu', init='xavier', dropout=0.3}residual_layer2={type="residual"}
norm_layer2=layer={type="layernorm"}
**Post-attention LSTM:**
postatn_forward={type="recurrent", n=128, act='tanh', init='xavier', rnnType='LSTM',reversed=False, dropout=0.3};
实验方法
使用的方法如下。在实验案例中,我需要一种方法来:
- 模拟深层网络的模型复杂性
- 模拟不同的输入要素
- 使用标准评估指标来衡量预测结果
模拟模型复杂度
为了系统地增加模型的复杂性,我在模型架构中添加了一个编码器堆栈,同时保持每个实验的所有其他超参数不变。
例如,高音扬声器手套 25d 的单个实验组将具有 4 种不同的架构。
实验中使用的不同布局配置
请注意每次实验中编码器堆栈的数量是如何系统地增加的。
使用的超参数也始终保持不变:
**Optimizer hyper-parameters:**
miniBatchSize=32
stagnation = 10
algorithm = {method = ‘adam’, gamma = 0.9, beta1 = 0.9, beta2 = 0.999, learningRate = 0.001, clipGradMax = 100, clipGradMin = -100, lrPolicy = ‘step’, stepSize=10}
regL2 = 0.0007
maxEpochs = 10
dropout=0.3
模拟输入特性
为了测试功能丰富的输入数据是否对结果有任何影响,我通过高音手套 25d、50d、100d 和 200d 运行了该模型。
这意味着对于每个手套尺寸,我将运行 4 组实验并分别记录它们的结果。
- 基线模型
- 实验 1:基线+ 1 个附加编码器堆栈
- 实验 2:基线+ 2 个附加编码器堆栈
- 实验 3:基线+ 3 个附加编码器堆栈
因此,总共运行了 16 种(4 种架构* 4 种不同的手套尺寸组)不同的模型配置。
标准化评估指标
最后,我决定使用 F1 分数作为比较的标准,因为它是精确度和召回率之间的调和*均值。
如果你需要复习精确度,回忆一下 F1 分数。我在上面找到了一个很好的视频。
解释精度、召回和 F1 的 Youtube 视频
实验结果
对于这一部分,我将首先分享在每个高音手套尺寸范围内的实验结果。然后,我将分享每个实验在高音手套尺寸上的结果。
维度内和跨维度的结果示例
从现在开始,我将以图像的形式显示一系列结果输出,并添加我认为合适的注释。
对于每个结果输出,记下精确度、召回率、F1 分数以及损失曲线的样子。
记住,实验中唯一的变化是增加了一个编码器堆栈。
在你进行的过程中,一定要花些时间自己解释这些结果。😃
高音扬声器手套 25D 的结果(在范围内)
对于这个结果集,在实验中很难看到更深层次网络的影响。
我确实对正在发生的事情有一个想法和感觉,但在模式变得更清晰之前,我不会发表评论。
注意:在下一个结果集中会变得更清楚:)
话虽如此,在正标签(P)的 F1-分数中有一个有趣的模式。
随着模型变得越来越复杂,阳性标记(P)的 F1 分数似乎在每次实验中都在缓慢增加。
我怀疑这与更深层次的网络学习和更复杂的关系有关。
例如共同引用、长期依赖等。
现在让我们将特征的数量从 25D 增加到 50D,以便更好地了解随着模型的深入会发生什么。
使用高音手套 50D 的结果(在范围内)
与上一个结果集相比,这无疑是一个更好的结果集。
首先,注意随着模型的深入,验证损失是如何开始偏离训练损失曲线的?
你觉得为什么会这样?
和前面的结果集类似(虽然很微妙),但是这和机器学习中的 偏差-方差权衡 有关系。
总之,随着模型复杂性的增加,模型开始更好地学习训练数据,导致偏差减少。
这从实验中训练损失(蓝线)略微下降的结果中可以明显看出。
注意:训练更大的网络是降低偏差的标准缓解措施。这个结果清楚地显示了更大的网络是如何减少偏差的。
然而…
随着模型开始过度拟合训练数据,它变得不可概括,导致方差增加。
注意验证损失曲线在不同实验中的变化。
为了得到一个更具体的例子,只需看看实验 2 和实验 3。
请注意,当验证误差开始出现峰值时,训练损失如何从 0.1618 下降到 0.1595。即偏差减少,方差增加
现在开始下一个发现!
下一个发现来自于所有实验的 F1 分数。
与之前的结果集相比,F1 的所有分数都有所提高。
f1-阳性标记(P)的*均分数约为 32%,而阴性标记(N)的*均分数约为 27%。
与之前的结果相比,阳性标签(P)的最大 F1 分数约为 28%,而阴性标签(N)仅为 18%。
记住,这里唯一的变化是使用了更丰富的输入集。即高音手套 25D 换成了 50D。
其他一切都保持不变。
这说明了输入特征的数量与预测结果之间的关系。
在这种情况下,使用更丰富的功能集提高了模型的整体性能。
那么,将功能从 50D 增加到 100D,我们会看到什么呢?
使用高音手套 100D 的结果(在范围内)
该结果集实际上验证了我们之前关于输入要素和预测结果之间关系的观点。
但是..不是你想的那样。
在这种情况下,该模型在预测阳性标记(P) 方面略胜一筹;f1-实验得分比之前的结果高。
然而,看起来这个模型在预测负标签(N)** 方面做得不是很好;与之前的结果相比,f1-实验得分下降。**
可能的是,添加的特征 50D 至 100D 可能允许模型更好地学习正面标签(P ),但是在学习负面标签(N)时却添加了噪声。
这可能是我认为与之前的结果相比,我们在实验中看到 F1 分数下降的原因之一。
另一个原因(可能更有道理)是,由于模型失去了普遍性,F1 分数在波动。
注意验证损失曲线是多么不稳定。
为了获得更好的结果,我们可能需要在再次查看 F1 分数之前调整其他超参数。
然而,这个实验的目的只是通过增加更多的层来改变模型架构,并注意下游的变化,因此我不会在这里做任何超参数调整。
下一个发现很明显。
提示:这与验证损失曲线有关。
请注意,验证损失通常低于实验中的训练损失。
这是一种不常见的模式,但确实会发生。
关于这个点,下一个逻辑问题是……
为什么?
为什么验证损失低于培训损失?
几个原因:
- 这可能与培训过程中如何计算验证损失有关。对于每个时期,在训练损失之后计算验证损失。即,在模型更新了权重之后,计算验证损失。****
- 我在训练集中使用了辍学层。缺失图层具有正则化效果。这意味着它对权重进行了惩罚,以使预测更具普遍性。在验证计算期间,禁用辍学。
现在我们完成了 100D,让我们看看 200D 会发生什么!
精神食粮。
功能太多会是个问题吗?
让我们找出答案,好吗?
使用高音手套 200D 的结果(在范围内)
****
显然可以!
看起来 200D 导致模型在实验中过度拟合。
让我们退一步想一想。
这里发生了什么?
唯一的变化是使用了功能更加丰富的输入集。即 100D 到 200D 的特征。
拥有更多功能不应该给我们带来更好的结果吗?
不完全是。
拥有一组扩展的特性可能会不可避免地给模型带来更多的噪声。
这从我们看到的过度拟合中可以明显看出。
这是我认为正在发生的事情。
单词嵌入示例
每个输入特征都可以映射到其他概念,如“男人”、“女人”、“皇冠”、“皇家”等。
每个特征(那些数字)的学习嵌入反映了输入术语是否满足那些特征的标准。这通常在[-1,1]的范围内。
例如,对于输入术语“国王”。
国王是男人吗?
是的。因此,所学习的嵌入对于特征“人”具有 0.98 的分数。
国王是女人吗?
没有。因此,对于特征“女人”,学习嵌入的得分为 0.01。
如此等等。
我认为在 200D,有太多的功能导致太多的噪音。
例如,像“红色”或“绿色”这样的特征可能只是模型的噪声。
那么我们能从中学到什么呢?
添加更多输入要素并不能保证更好的模型或更好的结果。有时,拥有更多功能意味着你的模型开始学习噪音。
我还注意到,在所有 16 个实验中,该模型在负标签(N)上总是表现不佳。
看看 25D、50D、100D 和 200D 的 F1 分数。
负标签(N)的 F1 值总是低于正标签(P)的 F1 值。
为什么会这样呢?
我认为正标签(P)训练示例可能比负标签(N)训练示例更容易学习。
也许学习否定或某些否定短语对这个模型来说很难。这就解释了为什么(N)看起来没有得到太多的性能提升。
好吧!我们已经到达每个输入维度内的结果的末尾。****
在这篇文章的最后一部分,我想让你看一看个实验的结果。
这会让你对结果有不同的看法。
只要注意曲线是如何随着输入特征的增加而变化的。
记住,其他一切都是不变的。这里唯一的变化是输入特性。
我会让你自己查看结果,没有任何评论。
跨输入要素的基线结果
不同输入维度的基线结果
实验 1 跨输入特征的结果
实验 1 不同输入维度的结果
实验 2 跨输入特征的结果
实验 2 不同输入维度的结果
实验 3 跨输入特征的结果
实验 3 不同输入维度的结果
摘要
在我结束这篇文章之前,我想我应该总结一下这个实验的一些收获。
- 深度学习中仍然存在偏差-方差权衡。如果你积极地通过应用链接帖子中提到的缓解措施来减少偏差和差异,它是可以被缓解的。
- 一般来说,更深的网络会减少偏差,但如果其他因素保持不变,差异就会增加。随着网络构建得越深入,最好是迭代并应用正则化/添加更多的训练数据。
- 有时,验证损失可能低于培训损失。不要被这个结果吓到。
- 添加更多输入要素并不能保证模型或结果会更好。与 100D 的结果相比,200D 在训练集中引入了更多的噪声,导致了更差的结果。
所以在回顾了这个实验的结果之后…
网络越深越好吗?
看情况。
似乎有一个最佳深度,它与你必须开始的训练数据量相关联。
在这个具有 27,481 行的 tweeter 数据集的情况下,看起来具有 100D 输入特征的实验 1 的模型架构是最佳的。****
为了便于参考,实验 1 的架构看起来像这样,有 2 个编码器堆栈。
实验 1 模型架构
结尾注释
嗯,那就这样吧!
写这篇文章确实花了一些时间来运行所有的实验。
希望你觉得这篇文章很有见地!
如果是的话,让我知道,这样我就知道该继续写什么类型的文章了。😃
直到下一个帖子…
再见了。
LinkedIn 简介:蒂莫西·谭
开发者是商品还是摇滚明星?
意见
关于开发商市场的真实故事
听到很多商人跟我说:“软件?只是工具。开发商?只是一种商品”。与此同时,大多数公司像摇滚明星一样支付开发人员。真相是什么?在本文中,我将用数据解释和评论开发人员就业市场的演变。在 IT 领域有 15 年的经验,最初是作为一名开发人员,后来是作为一名经理,我将尝试讲述这个故事的两个方面。我们将学习如何用 5 个简单的要点来理解这一演变。
商品是什么意思?
在我过去接*客户的过程中,我听到了太多类似“我不介意你怎么做,只管去做”或“我不是技术人员,我不想理解”的句子。我不确定商界人士何时会对如何花钱失去兴趣。这就像你在建一栋房子,去找建筑师并告诉他,“我不介意你在里面放多少个房间,只管建就是了。”我知道对于一个非技术人员来说,与技术人员交流是不容易的(尤其是如果技术人员是开发人员),但是每个人都应该知道最基本的知识水*才能使事情正常进行。
相信工程师,我们可以忽略哪种水泥混合物将用于我们的房屋支柱,但我们需要知道我们的房子将有多少个房间或楼层。
这个故事告诉我们有商品和商品,那么,商品的意义是什么?很可能,很好地理解开发者做什么,我们可以回答。汽车和牙膏是不同的商品。当我可以毫不费力地改变某样东西或供应商时,我认为它是一种商品。
试着在一个项目运行中改变开发者,你会发现这是认为人只是商品的代价。
为什么市场需要更多的开发商?
生产软件的公司需要开发人员,因为他们是完成产品的主要资源。在其他行业,他们需要对企业进行创新,因此他们运行 IT 项目,而开发人员在这些项目中起着核心作用。根据 Chuck Alexander 的研究,一个 IT 项目可以持续 30 到 60 个月。这意味着大约 2.5-5.0 年。每个公司每年都会启动许多项目。所以,这是一个很大的需求。然后大多数公司都同意生产软件不是他们的核心业务,所以他们在外包中委托部分项目,从咨询公司或自由职业者那里雇人。嗯,很容易理解为什么在有限的工资供应下需求如此之大,而且找到合适的专家比过去更难了。
美国劳工统计局对网络开发者的调查
加薪
根据这项研究,初级开发人员预计 2017 年他们的工资将增长 4.3%,熟练开发人员将增长 4.5%。如果我们每年都有这样的增长,大约 15 年后,我们的工资会翻倍。
这就引出了一些大问题:
- 对于已经录用的人来说是什么? 他们不傻,所以会要求加薪,也可能跳槽去别的公司。这将转化为更多的人员流动成本(人们将会流动)或更高的公司成本。
- 开发人员的生产力是和工资相应增长的? 如果不是这样,工资的上涨会对公司的利润产生影响。雇主生产的比他们从公司得到的少的商业模式是不可持续的。
- 开发人员是否能够在新技术退役之前保持更新?换句话说,他们会领工资吗?他们工作的价值将低于我们*衡结果所需的价值。
关于开发人员薪酬的关键因素
开发人员是最具挑战性的工作之一,需要高技能、不断的学习和经验。这解释了为什么在大多数国家它的报酬很高。在 2020 年的调查中,GitHub 采访的 74%的专业人士透露他们有学位。与其他技术工作相比,这是一个很大的比例。根据美国劳工统计局的数据,2019 年 5 月,美国的*均工资为 7.3 万美元。从这个优点出发,我们还有一些额外的关键因素,可以为这些专业人员定义一些额外的收入:
- 地理。根据 Indeed 的报告,不同国家的薪酬差异很大,但仅关注美国市场,我们就有 5 万美元的差距(旧金山薪酬最高,每年 15 万美元)。
- 体验。你知道的越多,你在市场上的价值就越大。
- 技术。并非 dev 采用的所有技术都具有相同的价值。在这个领域中,供求关系决定一切,所以我们有古老的、非生产性的技术(比如 COBOL)或者新的、未知的框架,在这种情况下,我们几乎没有可用的程序员,而价格却在上涨。在过去的几年里,我们已经看到了招聘专家前端和 DevOps 专业人员的热潮。
stack overflow 开发者调查 2020 年的开发者教育https://insights.stackoverflow.com/survey/2020#education(仅限专业开发者)
涨薪潮的风险
在 IT 市场增长之前,我们仍然会认为专业开发人员在我们的创新计划中很重要。在市场上寻找最佳开发人员的热潮创造了新的就业机会和高薪。我们喜欢这个成长阶段,但是需要考虑一些隐藏的风险(作为一个商人和一个开发者):
- 薪水不可能永远增长。到那时,我们将会有比我们需要的更多的开发人员,而失业的开发人员将会接受更低的薪水。在得到这一点之前,先想想开发者作品的最终价格。他们的成本反映了产品的最终价格,在某些情况下,比如销售一个网站,这可能是一个很大的百分比。总有一天,商人将不得不停止提高价格(或减少利润以保持价格不变),这将迫使开发商停止支付工资。
- 你不可能永远学习。技术将永远改变;一个人永远需要学习。这说起来容易,但在现实世界中很难做到。对于一个 8/5 的员工来说,可能每天有 1 或 2 个小时的换股时间,很难找到时间进行培训。
- 技术是不稳定的。你投入大量时间和大部分工作时间的一些技术可能会寿终正寝,或者被全新的技术所取代。例如,当 web 开发消灭了桌面开发时,就发生了这种情况。
- 创新可以是颠覆性的。在过去的几年里,我们已经看到了人工智能的进步。嗯,我们将会看到类似于上个世纪在机械方面发生的事情。机器做工人的工作;新技术将加速软件构建市场,使它们更少的人密集。我不是在谈论明天或明年。但是技术正在无情地发展,所以总有一天会出现这种情况。到那时,只有非常熟练的开发人员才能坚持下去。
带什么回家
IT 项目的增长正在刺激开发人员市场,以一种长期不可持续的趋势增加工资。我们需要找到一种方法,通过增加产出的价值来保持工资增长的可能性。这可以通过优先考虑产品开发,甚至是可以重复使用的半成品,技术创新和改善组织以避免时间浪费来实现。
开发人员不能停止学习,需要从一种技术跳到下一种技术,直到退休或晋升到另一个角色。每个做生意的人都需要给他们留足够的时间进行培训和学习。
否则,在不久的将来,我们将会有很多无利可图的专家员工。
资源
- https://www . computer weekly . com/news/450412131/Junior-developers-to-see-43-pay-rise-in-2017
- https://www . bls . gov/ooh/computer-and-information-technology/we B- developers . htm
- https://venturebeat . com/2017/08/15/随着对更多技术技能的需求,网络开发人员的需求正在蓬勃发展/
- https://insights.stackoverflow.com/survey/2020
- https://www.indeed.com/career/software-engineer/salaries
多元线性回归分析资本主义与环境
分析哪些经济变量最有帮助
照片由 Nextvoyage 发自 Pexels
关于大多数资本主义国家的所作所为以及他们如何保护环境,有很多批评和争议。其中一些想法是被误导的,或者带有固有的偏见。其他一些人则专注于特定问题,如二氧化碳排放或以中央为基础的政策如何有助于实现更大的成功因素,而忽略了大局。
但是,要考虑到财产权。每个污染空气的人都有权利生活在更清洁的环境中,在某些情况下,这是我们的共同财产。应该注意的是,总是有一些利益相关者保护他们居住的地方,从他们的私人空间和他们的财产开始。即使已经简要评论过,“公地的悲剧”也超出了本文的范围。
另一方面,对于我们人类来说,寻求每天过得更好的方式,提高我们的标准和发展因素是很自然的。这个简单的事实表明了与环境的交换,发展总是与生态保护相冲突。只有富裕的国家(和个人)倾向于消费对自然影响较小的商品,因为根据这个标准,他们可以很容易地多花一些钱……或者他们试图节省每一分钱?让我们找出它。
将环境与自由市场经济联系起来
耶鲁大学每年都会发布环境绩效指数 (EPI),它提供了一份基于数据的全球可持续发展状况总结。EPI 使用 11 个问题类别的 32 个绩效指标,对 180 个国家的环境健康和生态系统活力进行了排名。这些指标在国家范围内提供了一个衡量标准,用以衡量各国与既定环境政策目标的接*程度。
与此同时,传统基金会提供了一份经济自由度排名,基于 186 个国家的 12 项自由——从财产权到财务自由。推动人类进步的经济自由原则在经济自由指数中得到衡量,旨在提供有益的见解,以促进发展进程并在全球范围内保持这一进程。
让我们来看看这两个指数是如何相互关联的。
自由市场与环境绩效正相关|作者图片
经济自由对环境的积极影响是显而易见的。在散射分布中可以观察到 J 或(复选标记)形状。通常情况下,极低的开发速度会带来相对较高的环境性能。然而,一旦这种强度加大,表现就会下降:优先考虑的是经济增长率,而不是环境。最后,当国家(和个人)达到一定的发展水*时,他们试图寻求更好的环境质量,为更健康的生活环境付出更多。在这些条件下,环境表现为一种奢侈品,结果是随着个人收入的增加,环境受益超过比例。
下表描述了先前关联的技术因素。即使曲线的斜率为正,相关性也不够强。
相关性能因素|作者图片
这个结果可能是反直觉的,但为了有更深入的理解,我们应该讨论一些特定的因素,并深入了解哪些方面在经济自由指数(EFI)中的权重更大。
哪些 EFI 因素最相关?
为了有一个更清晰的图像,最好是找到构成 EFI 的变量,它与环境性能指数最相关。不幸的是,这是一幅相当大的画面,它涉及到许多因素,不可能一目了然。深蓝色代表较高的正相关性,而黄色代表负相关性。较浅的蓝色代表中间没有相关性的所有值。你可以在这里看到全分辨率图片。
每个经济自由度指标和 EPI |图像的相关矩阵(按作者)
从所有这些,我们感兴趣的是它们如何与 EPI 相关联。总体电喷性能将被用作一个阈值,一些因素,这是在附*也选择了。因此,影响更大的变量是:
- 财产权
- 政府诚信
- 贸易自由
- 财务自由
- 税负占国内生产总值的百分比
- 人均国内生产总值
所有这些变量都与 EPI 正相关,因此,它们增加得越多,环境指数就越高。下一个大问题是:如果我们考虑一个只包含这些变量的模型,那么每个变量的权重是多少才能达到最佳拟合?
包含最相关因素的模型
为了首先比较变量,我们必须将它们标准化。通过这种方式,我们可以并排对比人均国内生产总值和贸易自由度,它们的范围在显著不同的区间内,例如,标准化过程均衡样本偏差并消除偏差,将值集中到*均值。变量之间的相互依赖超出了本文的范围。
每个重要预测因子的权重|按作者分类的图像
应用多变量线性回归来收集每个系数的权重。具有较高系数的变量或预测值是对 EPI 增加更多的变量或预测值。左侧的条形图描述了系数结果。
下表比较了仅使用整体 EFI 性能的第一个模型的结果和仅考虑与 EPI 最相关的因素的结果。我们的新模型与选定的变量,显示了显着的性能提高,在环境指数预测。
一元线性回归与多元线性回归|作者图片
讨论
单位国内生产总值的相对税收负担似乎是最重要的因素。这让我们认为,更高的政府存在有助于我们实现一个更健康的环境。然而,如果我们分析用于构建税收负担 EFI 指标的方法,我们将看到与 EPI 呈-0.4 的轻微负相关。完整的税负指标考虑了以下同等权重的预测因素:
- 个人收入的最高边际税率。
- 公司收入的最高边际税率。
- 总税收负担占 GDP 的百分比。
考虑不同政府如何征税和花费这些资源来帮助保护环境将是有益的。这就是,哪些政策对拯救地球帮助最大,比如那些与二氧化碳排放相关的政策。
如前所述,人均国内生产总值给了我们一个很好的估计,每个人都愿意多花一些钱来帮助保护环境。通过这种方式,他们的偏好转向了那些拥有更环保政策、减少其活动影响的公司,代价是付出更多。
[## 10 家环保公司采取了惊人的环保举措
世界各地的公司比以往任何时候都更加重视可持续发展。从试图减少垃圾填埋垃圾…
blueandgreentomorrow.com](https://blueandgreentomorrow.com/magazines/10-green-companies-with-amazing-environmental-initiatives/)
腐败通过在产权中引入不安全和胁迫来侵蚀环境指标。最令人担忧的是政府机构和决策的系统性腐败,如贿赂、勒索、裙带关系、任人唯亲、赞助、贪污和受贿。这种做法造成的政府诚信缺失降低了公众信任和环境活力。政府诚信得分同等重视以下因素:
- 违规支付和贿赂。
- 政府决策的透明度。
- 没有腐败。
- 对腐败的看法。
- 政府和公务员的透明度。
另一个重要因素是贸易和金融自由。一个实施许多贸易壁垒并阻止其居民以有竞争力的价格获得环境友好型商品的政府,不仅在经济上伤害了其公民,同时也侵蚀了他们的栖息地。另一方面,如果金融部门受到政府干预,这可能导致效率低下或高度集中的部门,这可能会对绿色倡议产生负面影响,我们可以从结果中观察到这一点。
尽管产权在等式中不占太大比重,但它们的定义至关重要:它们必须是可衡量的,以便日后进行交易。法治应该由一个与腐败高度隔离的政府来实施。它还应建立法律框架来限制或允许上述权利。它还必须惩罚对环境的破坏,保证合同得到遵守和实施。这样,对栖息地的照顾将被认为是一种可交易的资产,而不是被动的。
结论
自由市场可以更好地保护环境,事实证明,发达国家并没有破坏环境。事实上,他们拥有更多的资源:他们的公民、公司和政府考虑在更环保的解决方案上投入更多的资金。有几个因素是非常重要的,如税收负担、政府诚信和产权,这些因素促进了一个国家的环境绩效。除了税收负担之外,检查税收是如何用于居家护理也很重要。这是另一篇文章的良好开端。
如果你对帖子中的图片和更多细节感兴趣,请访问 github 库。
编程中的函数真的是函数吗?
…以及它们为什么应该如此
如果你正在读这篇文章,那么很可能你已经非常了解编程中的函数。函数是一种非常常见和广泛的编程结构,几乎出现在所有的编程语言中。
通常,函数是一段代码,它从外部获取一些参数,执行一些可能会用到这些参数的操作,然后返回一个输出值。实际上,在许多编程语言中,函数可以不返回某个值,或者返回多个值,而不仅仅是一个值。但是为了一般性,这些情况也可以表示为只有一个值。对于“不返回”的情况,我们可以使用一个特殊值来表示(在 Python 中,这个特殊值是 None 每当你没有从一个函数中返回一些东西,它就返回 None)。对于更多值的情况,我们可以使用多个值的向量作为单个对象。
例如,在 Python 中,函数定义如下:
def **func_name**(param1, param2, ...): *# do some stuff with input parameters* return output_value
现在,我想问的问题是:这些来自编程的函数是真正的数学函数吗?
嗯……,我们先回忆一下什么是数学函数。
在数学中,函数只是从集合 A 到集合 B 的映射,其中来自 A 的任何元素在 B 中只有一个关联元素。
以下是 math 中的一个函数示例,它有 2 个整数作为输入,并输出一个有理数:
数学函数的一个关键属性是,每个给定的输入值对只产生一个特定的输出,或者换句话说,不可能用相同的参数对同一个函数求值两次并得到两个不同的输出。
如果我们考虑这个属性,就不难意识到这对于编程中的函数并不成立。
在编程中,我们可以有这样的函数,即使输入参数是相同的,它也会为不同的函数调用返回不同的结果。
例如,考虑以下 Python 代码:
i = 0def **f**(x): global i i += 1 return x+i
如果我们调用 f(10)我们将得到 11 作为输出值;我是说第一次我们称之为。如果我们第二次调用 f(10),我们将得到 12,然后是 13,以此类推。变量 I 在每次函数调用时递增。
所以,我们上面写的不是一个数学意义上的函数(或者一个纯函数,就像他们经常被称为的那样)。
这里的问题是,我们的函数 f 不仅仅依赖于它的输入值;它也依赖于一个全局变量并改变它。这种行为是该“函数”在其输出值中不一致的原因。
到目前为止,我们确定了“功能”行为不一致的原因:依赖于外部世界。
这是唯一的问题吗?
让我们稍微想象一下,我们定义了另一个 Python 函数,这次它只依赖于它的输入参数,没有全局变量。在继续阅读之前想一想这个问题。这次是不是数学函数?
图片由 Carlos Alvarenga 在 Pixabay 上拍摄
答案是否定的。那么,还有什么可能出错呢?
另一个问题是会导致副作用。也就是说,除了从输入获得输出的过程之外,仍然有可能做影响程序其他部分的事情,因此可以确定函数具有不一致的输出。
例如,假设我们有两个函数 f 和 g,它们都接受一个整数列表作为输入。函数 f 给列表中的第一个整数加 1 并返回,g 给第一个整数加 2 也返回。但是在许多编程语言(包括 Python)中,列表是通过引用传递给函数的。这意味着如果我们在一个函数中改变列表,这个改变会自动在其他地方生效。在我们的例子中,如果我们用输入列表[1,2,3]同时调用 f 和 g,f 中的加法可能会在 g 中的加法之前执行,它们可能会分别返回 2 和 4,而不是我们预期的 2 和 3。所以,f 中发生的事情可能会改变 g 的输出或者相反。因此,f 和 g 不仅仅依赖于它们的输入,它们也不是一个纯函数。
好吧。所以,我们看到了编程中的函数不一定是纯函数,我们也看到了这一事实的原因是什么:依赖于变量而不是输入参数,并导致副作用。但是,这有什么问题呢?我们为什么要担心这些编程结构不是纯函数呢?
原来非纯函数,由于它们的副作用,会产生很多问题。引起大量副作用会使程序的流程变得更加难以预测。它们会产生一些意想不到的结果。
不出所料,数学函数在数学中得到了广泛的研究,与具有副作用的函数相比,我们对它们以及它们的性质了解得更多,而具有副作用的函数更难用数学建模和预测它们的行为。
这就是一种新的编程范式诞生的一些主要原因:函数式编程。
图片来自 Flickr 上的 juicy salif
这种函数式编程的范例旨在使用最纯粹的函数,并使那些函数成为它的主要特征。通过只使用纯函数,程序应该有更少的错误,更容易调试、测试和证明它们的正确性。
许多现代编程语言提供了程序员能够编写功能代码所需的东西。举几个例子:Python,C++,Java,JavaScript。这些语言被称为不纯函数语言。它们不纯,因为它们不“强迫”程序员写功能代码,它们只是提供所需的工具;由程序员决定是只使用纯函数,还是使用副作用。
也有所谓的纯函数式语言,如 Haskell、Lean 或 PureScript。与不纯的语言相反,这些语言确实迫使程序员只使用纯函数来编写整个程序。纯函数式语言不是很受欢迎,可能是因为许多人不喜欢数学,并且由于这样一个事实,即尽管理论上有好处,但只使用纯函数创建复杂的程序在实践中可能很麻烦。
纯函数在效率方面也有一些缺点。假设我们有一个很大的数字列表(比如 100 万),我们想把它作为一个参数传递给一个纯函数,这个函数只需要对一个特定的项做一点点改变,然后返回结果列表。这样的功能不允许直接在现有的数字列表中进行更改,因为这将是一个副作用。因此,这个函数应该首先将原始数据(这 100 万个数字)复制到另一个内存位置,在该副本中进行所需的更改,然后返回这个新列表作为结果,并保持原始列表不变。与非纯函数相比,这是非常低效的。
因此,在我看来,如果一个人想要利用函数式编程范式及其好处,最好的方法是使用不纯的函数式语言,这允许程序员可以采用更自由的风格,并且只要合理就尽量使用纯函数。如果在某种程度上,你认为为了更有效或更容易实现而牺牲一个纯粹的函数是值得的,我认为这没问题。
我希望这些信息对您有用,感谢您的阅读!
这篇文章也贴在我自己的网站这里。随便看看吧!
游戏玩家在隔离期间会断网吗?
视频游戏使用的带宽比你想象的要多
安德烈·谭在 Unsplash 上的照片
这是我今天看到的:
…许多游戏玩家对此感到愤怒。我同意他们中的大多数人。这种说法的问题是建议“在合理的时间玩”。
在不同的时间玩不会有什么帮助,为了证明这一点,我们要看看为什么在线玩只是游戏所需带宽的一小部分。
该推文的大多数回复都引用了这张图表来为游戏辩护:
来源:https://www . ABC . net . au/news/2018-06-06/online-gamers-nbn-bandwidth/9836186
这个问题是这个图表比较了苹果和橘子。流视频时,您使用的唯一带宽是加载网页和流视频内容。不像视频游戏,你可以下载:
- 游戏客户端(如 Steam、Origin 或独立的启动器)
- 游戏客户端的更新
- 游戏
- 游戏的更新
然后,为了玩游戏,你有时会完全离线(完全不使用带宽),或者在其他时候你可能会:
- 流式传输你的游戏(这比在网飞上流式传输使用更多的带宽)
- 在游戏中或通过其他应用程序使用语音和文本聊天
- 使用带宽与服务器或其他在线玩家同步进行在线游戏
上图显示了视频游戏在互联网消费中可能是最小的部分。
堡垒之夜 vs 网飞,估算消费
我们将使用堡垒之夜作为我们的游戏示例,因为数据很容易在其周围找到,但由于其受欢迎程度,它的消耗比大多数游戏大得多。
我们必须考虑的另一件事是,这些因素中的大多数不会每小时发生一次,因此我将把指标累计到每月一次,使它们与网飞更具可比性。
这两种写法都会降低数据的准确性,所以请记住,我的观点纯粹是粗略的概括。
新用户消费
在撰写本文时(2020 年 3 月 22 日),史诗游戏客户端下载量为 41.8MB,全新安装的堡垒之夜下载量为 35.3GB。这些只供新玩家下载,现有玩家只需不断下载最新更新。
那么有多少新玩家呢?根据 Statista 的数据,仅 2019 年 3 月就有约 5000 万新堡垒之夜玩家加入。
一旦开始玩,上面贴的原始图表说堡垒之夜在线玩的时候每小时消耗 70MB,玩家*均每周 6-10 小时。为了简单起见,我们将把它四舍五入到每月 30 小时。
为了比较:
在 2019 年的最后一个季度,网飞在全球范围内拥有超过 1.67 亿付费流媒体用户,以及超过 460 万免费试用客户。— 统计局
因此,堡垒之夜在 2019 年 3 月获得的月度新用户数量是网飞在 2019 年第四季度获得的* 11 倍(460 万对 5000 万)。
网飞用户*均每月 47 小时或每天 2 小时。许多消息来源不同意这一指标,但我们知道,它在 2019 年底下降,现在很可能飙升(由于新冠肺炎检疫)。
在网飞上,每小时的视频流消耗大约 3GB 的高清数据,或者 7GB 的 4K 数据。
以下是我们对新用户每月互联网消费的估计:
- 网飞每月新增用户:47 小时 x3gb = 141 GB/月 x460 万新增用户=6.486 亿 GB
- 堡垒之夜每月新增用户:(30 小时 x 70MB/小时)+ 35GB 下载量=每用户 37GB x 5000 万新增用户=18.5 亿 GB
现有用户消费
最*一次堡垒之夜更新大约是 3GB ,根据游戏百科,这些更新通常发生在每周二。所以大约每周更新 3GB。
这些估计与上面的非常相似,用户基数在变化,堡垒之夜的初始下载被删除。
- 网飞月刊:47 小时 x 3GB = 141 GB/月 x 167M 亿现有用户=235 亿 GB
- 堡垒之夜月刊:30 小时 x 70MB/小时=每个用户 2GB x 2 亿现有用户= 4 亿 GB
谁赢了?
尽管在游戏的其他领域也发现了大量的数据消耗,但网飞仍然以 10 倍于堡垒之夜的数据消耗量独占鳌头。
网飞 : 648.6M + 23.5B = 每月 241 亿 GB
堡垒之夜 : 1.85B + 400M = 每月 22.5 亿 GB
免责声明:这些都是难以置信的粗略计算,几乎所有的数据都是从可靠或不可靠的新闻来源收集的。请半信半疑地接受这一切!
如果你包括游戏流(在观看和广播方面),语音/文本聊天,和多种其他视频游戏,那么你可能会看到一个更激烈的竞争。大多数游戏玩家拥有并玩多种游戏。
我倾向于认为堡垒之夜的巨大规模弥补了很多这些无法计算的因素。大多数其他游戏的月用户数只有堡垒之夜的一小部分,而且修补的频率也更低。
我想说的是,游戏占用的带宽比我们意识到的要多得多,网飞也是如此。
这对您的互联网有何影响
如果网飞是这里的罪魁祸首,是他们在损害你的网速吗?
不尽然,以下是本尼迪克特·埃文斯本周最新新闻简报的一段话:
欧盟要求网飞降低流质量以避免网络过载:它照办了,但大多数实际的电信公司表示,虽然流量上升了,但这并不是一个真正的问题,因为实际发生的是晚上的高峰现在延伸到了白天,而不是高峰更高。
他引用了这个来源说了下面的话,我自己强调了一下。
自本周二以来,随着人们开始更广泛地在家工作,我们已经看到工作日白天的流量与固定网络上类似的日子相比增加了 35–60%,峰值为 7.5Tb/s。
这仍然只是*均晚高峰的一半左右,远未达到我们已经证明网络可以处理的 17.5 Tb/s。
总而言之,白天交通流量的增加也减少了夜间交通高峰。我们仍然在这些网络的建设范围之内。
这不仅仅是在英国,如果你感兴趣,这里有更多的网络报道: Cloudflare ,诺基亚,威瑞森,西班牙
如果你真的在家里看到了较慢的速度,很可能是你家里的路由器无法处理新增加的使用量。你可能要考虑升级。
国际体育运动会导致全球不快乐吗?
深入探究体育对一个国家幸福的影响。
在 Unsplash 上由 Fachry Zella Devandra 拍摄的照片
介绍
对于世界上被隔离的观众来说,体育从未如此重要。毕竟,这只是新闻频道报道疫情统计数据的单调乏味中的一个喘息。
即使是联赛中最好的运动队赢的也不到输的两倍。例如,2018-2019 赛季休斯顿火箭队赢了 53 场比赛,输了 29 场。这是一个惊人的记录,但是如果失败带来的不快乐是胜利带来的快乐的两倍,那么这意味着火箭球迷在赛季结束时很大程度上是不快乐的。
文章声称,“运动让我们悲伤。”在国际层面上真的是这样吗?
运动真的和不快乐有关联吗?那些有很多运动队的国家(无论输球与否)会不开心吗?
方法学
为了验证这一说法,我用一个国家在世界幸福指数上的排名来量化一个国家到底有多幸福(排名越低越好)。这个数据集中有 139 个国家。我使用了以下国际体育联盟的数据:
- 男子 T20 板球(ESPN),女子 T20 板球(维基百科)
- 男子和女子足球(国际足联)
- 男子橄榄球(世界橄榄球)、女子橄榄球(Scrum Queens)
- 男子和女子篮球(国际篮联)
- 男子和女子曲棍球(FIH)
- 男子和女子水球(FINA)
- 男子和女子排球(FIVB)
注意:如果两个国家的幸福等级分别为 1 和 5,数字越小越好,因为该国排名第一,而后者排名第五。
发现 1:有国家运动队的国家比没有国家运动队的国家更幸福。
我使用的数据给了我 0.36 的相关系数,这表明一个国家的运动队数量与其幸福感之间存在适度的正相关。
更多的运动队意味着幸福指数排名更低(即更接*第一)。
更令人信服的是,数据显示至少有一支国家运动队的国家*均幸福指数为 75.72(第 76 位),而没有国家运动队的国家*均幸福指数为 115.09(第 115 位)!
发现#2:有女队和男队的国家比只有男队的国家更幸福。
让我们建立一个叫做*等比率的快速指标,它是一个国家的男队数量除以女队数量。
*等比例为 3.0 的国家的中位数位置是 71,而比例更高的国家(即男队是女队的三倍以上)的中位数位置大约是 120。从本质上讲,一个运动队性别*等的国家一定会更幸福。真的,这很容易。
发现 3:运动队表现较好的国家比运动队表现较差的国家更幸福。
这一点令人惊讶,因为它似乎证实了这篇文章的主张,即更多的国民损失与更差的国民幸福相关。这似乎是显而易见的,但有人可能会说,一支球队在锦标赛的每个阶段获得的累计快乐超过了他们输掉最后一场比赛时的失望。
拥有表现更好的国家运动队(并且有很多)的国家往往比那些表现更差的国家更幸福。
此外,这些国家在所有运动项目上的综合表现都名列前茅。在该表中,联赛排名越低越好(即,如果一个国家在国际篮球赛中排名第四,但在国际水球赛中排名第二,则他们的*均联赛排名将为第三)。
澳大利亚在男子国际体育联盟中*均排名第 13,在女子国际体育联盟中*均排名第 8。
结论
一个快乐的国家是一个投资于体育运动的团结和振奋精神的能力的国家,而且不分性别,一视同仁。事实上,我认为世界幸福指数应该把体育运动作为全国幸福指数的代表。
为了反驳世界经济论坛文章中的研究,体育运动确实能让人快乐。无论是玩家还是观众。
如果你想看我做这个项目用的代码或者数据,可以在这里 找到我的 GitHub 。你也可以在 Medium 上关注我,了解更多类似的内容。感谢阅读!
机器会取代程序员吗?
或者软件如何创造其他软件
我最*开始做一些家庭烘焙。就像许多其他人一样,它始于疫情封锁期,那时我厌倦了每天从超市买同样的面包。老实说,我的面包还过得去,不是很漂亮,但能让家人满意,对我来说已经够好了。
我早期的多谷物面包之一(张秀雄摄)
昨天,我无意中发现了 YouTube 上的一个视频,是关于一家工厂如何同步完美地制作面包的,这让我有点心碎。所有揉面的艰苦工作与旋转马达在一个机械化的巨大桶里翻滚相比,根本算不了什么。当我看着一排排的面团整齐划一地螺旋上升到发酵传送带上,然后慢慢地滚入一个不断发出嗡嗡声的巨大烤箱,变成行进中的面包时,我心中的某种东西死去了。
当面包被装进密封的袋子里,然后被扔进包装盒时,我告诉自己,他们没有用爱为家人做面包的人那样的手艺(在我看来)。
但是在我内心深处,我明白如果面包仅仅依赖于人类面包师,那将会更加昂贵,更多的人将会挨饿。自发明以来,自动化和生产线一直在满足大众的需求。与养活所有不断增长的人口相比,面包师的骄傲无关紧要。
格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
幸运的是,我白天不烤东西。我在软件开发行业,这里的主要活动包括软件程序员(开发人员、工程师、编码人员——由你选择)编写代码来构建简单到复杂的软件系统,这些系统控制着当今世界的大部分地区(甚至面包工厂也由制造控制系统控制)。也是人类的程序员。程序员是非常受欢迎的工匠,他们的经验、天赋和创造力受到称赞。
就像面包师一样。
当然,这回避了一个问题——有没有像面包工厂一样由机器生产软件的软件工厂?它们今天存在吗?
生产线
另一个观点是,今天的软件开发已经是一条生产线,不同的软件开发团队负责整个系统的不同部分,最终在组织良好的流程中进行组装。
取代工厂工人的是程序员,取代主管的是团队领导,取代工厂经理的是工程经理。通过外包、离岸外包、承包以及各种人力补充方法的结合,公司也有可能加速软件开发。
软件工厂?Alex Kotliarskyi 在 Unsplash 上的照片
自然,没有一个程序员喜欢被称为工厂工人。事实上,我们大多数人更喜欢被称为软件工匠。但是不可否认的是,在一个大规模的环境中开发软件很像一个工厂。
今天,所有大规模的软件开发都是在团队中进行的(不管它叫什么,也不管它被赋予了多大的自主权),并由一些过程指导。无论是敏捷的、迭代的、行为驱动的、瀑布式的还是任何混合的变体,大多数软件开发组织都有某种过程和方法。更大的组织甚至有专门的团队来实现过程和过程模型,例如 CMMI(能力成熟度模型集成)和 ISO/IEC 12207 。
其中一些流程模型可能会变得非常严重。例如,由卡耐基梅隆大学(CMU)和美国国防部开发的 CMMI 是许多美国政府软件开发合同中的要求。
虽然软件开发作为生产线的想法不是很吸引人,甚至与酷酷的技术创业开发的形象相反,但是一旦软件达到一定的规模,结构和过程就是生产的一部分。
就像烤面包、酿造啤酒和许多其他工匠工作一样,制作伟大的软件是骄傲和快乐的源泉。但当涉及到规模和生产时,面向过程的方法对于确保质量至关重要,更重要的是一致性。
然而,尽管我们在流程中构建了很多东西,但这些仍然是由人类完成的,并且容易出现著名的 I D-10T 错误。这就是为什么随着时间的推移,我们已经转向持续的自动化集成、测试和部署。我们的想法是,通过使用自动化流程的脚本,在集成我们正在构建的系统的多个部分和组件时,尽可能地减少人为错误。
这非常有效,但显然仍然存在差距——系统是由人类设计的,不同的部分和组件是由人类编写的,甚至自动化脚本也是由人类编写的。系统的强健程度取决于最薄弱的一环,而我们就是那一环。
但是如果这个过程的每个部分都是自动化的呢?
自动化
在我最喜欢的一本书里, 月亮是个苛刻的情妇(1966 年出版),迈克(的简称,,夏洛克的哥哥)是个“醒了”的 AI。迈克能理解经典的编程,但他也能理解 Loglan(这是一种真正的语言)和英语。mannie(Manuel 的简称),叙述者和电脑人(这个名字多酷啊),事实上主要是用英语和他交流。Mike 根据他们的交互编写自己的程序。想象一下。这是在 60 年代中期。
给计算机编程,你只需要告诉它你的问题,它就会创造出必要的软件来解决程序,这种想法令人疯狂地着迷。在 20 世纪 80 年代和 90 年代,出现了几个创造第四代和第五代语言的运动(4GL 和 5GL),这些语言将完全做到这一点,并且它们被大量营销。
安迪·凯利在 Unsplash 上拍摄的照片
其目的是最终,实际的编码是不必要的,所有需要做的是定义问题,代码将被生成来解决它。自然,焦点是以更精确的方式来定义问题,以便生成更好的代码。要做到这一点,你需要建立模型,并有一个用户友好的方式来描述问题,这样即使非软件工程师也可以创建软件。当时,我的公司(像当时的许多企业一样)完全相信了它。说实话,我也上当了。
它从来没有真正起飞,因为…编程语言已经在这样做了。要让一种编程语言适合非程序员,你需要让它不那么死板,更适合人类。但是这将导致它更加模糊和不精确。在这种情况下,它只能创建真正简单、明确的软件。要创建更复杂的软件,你需要一个不仅能定义问题,还能提出解决方案、编写代码、确保运行并根据需要更新代码的人,也就是说,你需要一个程序员。
并不是说 4GL/5GL 没有用,只是它对软件开发行业死亡的承诺被大大夸大了。我参与的项目崩溃了,损失了数百万美元(虽然我不能完全归咎于 4GL,但这也是部分原因,它夸大了能力,但最终却低估了结果)。
软件创建软件
4GL/5GL 不是答案,部分原因是等式中仍然有人类。如果我们深入下去,让软件去创造软件呢?过去几年人工智能的发展,特别是机器学习,重新提出了这个想法。如今,机器学习越来越多地被用于许多软件中。已经有机器学习软件正在击败职业围棋选手,分析市场,驾驶汽车,甚至通过向过去的大师学习来创造音乐和艺术。今天有人在创造一些机器学习软件来编写其他软件吗?
让我们来分析一下这是什么意思。
有几种类型的软件可以创建其他软件。首先,有自我复制,这真的意味着一个软件如何能够自我复制。这个想法并不新鲜,事实上,约翰·冯·诺依曼在 20 世纪 40 年代就提出了自我复制自动机的理论。
奎因斯
在源代码级别,有 quines,这些程序不接受任何输入,生成自己源代码的副本作为唯一输出。这里有一个相当令人印象深刻的奎因,叫做 Qlobe ,由 Ruby 核心成员 Yusuke Endoh 创建。
在命令行中运行:
curl -fSSl https://gist.githubusercontent.com/shime/f0ebe84ca42c33b51d42/raw/5e74315dc6b6fe572f8a457536ad7eb17ad3f1e4/qlobe.rb > qlobe.rb; while true; do ruby qlobe.rb | tee temp.rb; sleep 0.1; mv -f temp.rb qlobe.rb; done
你会看到一个旋转的代码球。
远藤佑介
沃尔姆斯
虽然奎因是无害的乐趣,但电脑蠕虫却不是。计算机蠕虫是独立的恶意软件程序,可以自我复制并在网络上传播。“蠕虫”一词首次出现在约翰·布鲁纳 1975 年的小说《T2》《T3》《冲击波骑士》《T4》中。最早的蠕虫之一是罗伯特·塔潘·莫里斯于 1988 年创建的莫里斯蠕虫。莫里斯蠕虫在一次致命的拒绝服务攻击中扰乱了互联网上* 10%的计算机(考虑到互联网的规模,这并不是一个很大的数字)。
最臭名昭著的蠕虫之一是 Stuxnet,它攻击工业 SCADA 系统,据信对伊朗核计划造成了重大破坏。它也被认为是美国和以色列联合建造的网络武器。过一会儿我会让它沉下去的。国家支持对核设施的网络攻击。
当然,自我复制只是一种机制,它的有效载荷才是恶意的。有效载荷也可能是良性的,尽管它们相对较少。比如 Welchia 蠕虫感染电脑,对抗 Blaster 蠕虫。它会自动下载 Windows 的 Microsoft 安全更新并重新启动计算机,尽管它没有任何权限。显然不是每个人都认为它友好。
遗传表演程序
我们之前说的是自我复制,基本上就是软件克隆一个自己的副本。在有机世界中,除了阿米巴原虫和其他单细胞动物,繁殖更像是生产后代,创造更新的一代。这在软件中也会发生!
遗传编程(GP) 是软件可以产生其他软件的一种方式。GPs 是基于群体的元启发式算法,进化出能最好地解决特定问题的程序。
艾伦·图灵(Alan Turing)是第一个提出进化程序的人,他在 1950 年的论文 计算机器和智能 。然而,GP 和一般意义上的进化算法领域是在霍兰德的经典著作《自然和人工系统中的中首次提出的,该书于 1975 年首次出版。
GPs 一般遵循自然选择的原则。以下是全科医生的基本步骤:
- 随机生成初始程序群体(第一代)
- 评估每个项目的适用性
- 为下一代的繁衍选择最好的节目
- 通过交叉和变异机制,从上一代最佳解决方案中复制下一代程序
- 用下一代程序取代不太适合的程序
- 重复步骤 2 到 5,直到满足终止条件,通常是在找到解决问题的合适程序时
在 GP 中,程序在内存中被表示为树结构,所以传统上 GP 倾向于使用自然使用树结构的编程语言。我已经在另一个故事中谈到了这种算法的另一种变体,叫做遗传算法。GP 和 GA 都是广为人知的领域进化算法的变体。虽然两者的概念非常相似,GP 的主要表示是程序,而 GA 的主要表示是原始数据(通常是字符串)。
GPs 是迷人的,不仅因为它是我们作为程序员没有编码的东西,而且是经过几代人进化而来的。这也是因为它是可以不断变化和适应环境的软件。软件不仅创造软件,而且实际上还产生了软件的后代。
深度神经网络
深度神经网络(或称深度学习)是一种基于人工神经网络的机器学习算法。“深度”一词指的是神经网络中的多个层。深度神经网络(DNN)*年来受到了很多关注,取得了惊人的结果,有时也有点炒作。我不会太深入地探究它是如何工作的,但我已经写了几个关于它的故事,包括一个展示如何从头开始建立一个神经网络的故事。
神经网络并不新鲜,其概念可以追溯到 20 世纪 50 年代,在 20 世纪 80 年代和 90 年代有许多突破。真正加速的是计算能力的突破和可用性以及数据的增长。用更通俗的话来说,云和大数据使 DNNs 成为可能。
2014 年,英国人工智能公司deep mind 启动了一个名为 AlphaGo 的项目,旨在构建一个深度神经网络来参与围棋比赛。到 2016 年 3 月,它与世界上最好的围棋手之一 Lee Sedol 对弈,赢了 5 局 4 胜(使用 1920 个 CPU 和 280 个 GPU)。那 1 场失利是 AlphaGo 上一次在正式比赛中输给人类。
AlphaGo vs Lee Sedol。巴斯特·本森拍摄的照片
2017 年 5 月,AlphaGo 与世界排名第一的围棋选手柯洁进行了 3 场比赛,并赢得了全部 3 场比赛,之后它被中国围棋协会授予职业 9 段。
DNNs 已被用于许多其他领域,从图像和语音识别,到自然语言处理和金融欺诈检测。自动驾驶车辆(汽车、公共汽车、卡车)以及自主机器人(地面和无人机)都严重依赖 DNNs。癌症研究人员使用 DNNs 来检测癌细胞,DNNs 已被用于制作音乐和艺术,甚至黑白照片也使用 DNNs 重新着色。
但是 DNNs 可以用来创作软件吗?
有一些生成源代码的尝试,但我不认为这是真正必要的。我们想要的已经被 DNN 模特们完成了——DNN 模特就是软件。
让我解释一下我的意思。
模型可能是软件
在结构化编程中,我们使用序列、选择(if-then-else)和迭代(for,while)来描述处理数据以产生结果的规则。这些规则通常被捆绑到函数中,函数接受数据输入并产生结果。
DNN 模型使用多个 dnn 中的多个层(许多 dnn 由不同类型的神经网络组装而成)来做同样的事情。DNNs 使用大量数据训练模型,一旦这些模型被训练,它们可以被用于预测结果,给定新数据。这意味着 DNN 模型也是接受数据输入和产品结果的函数。事实上,DNN 模型可以*似和模仿任何函数!
不同之处在于,虽然结构化代码可以被跟踪和遵循,但是很难通过 DNN 模型的不同层来跟踪数据流。这是因为有太多的参数需要合理地遍历。比如LeNet-5(1998 年出版),最简单的卷积神经网络(CNN)之一,大约有 6 万个参数。VGG-16(2014 年出版),一个更*的 CNN 有大约 1.38 亿个参数!
LeNet-5 的架构(作者:Y. LeCun,L. Bottou,Y. Bengio 和 P. Haffner:基于梯度的学习应用于文档识别,智能信号处理,306–351,IEEE 出版社)**
此外,训练模型的过程是随机的,因此即使我们使用相同的训练数据,层内各种节点的参数值也可能不同!
当然,在训练之后,dnn 是确定性的,这意味着如果你每次传递相同的数据,将会再现相同的结果。然而,许多 dnn 被设计成返回概率结果。
这可能会令人困惑,所以让我给你举个例子。比方说,我们设计了一个 DNN,并用大量的猫照片训练它,这样它就可以识别给定的照片中是否有猫。
这张照片里有一只猫吗?照片由 Unsplash 上的 Sereja Ris 拍摄
接下来我们给它一张图片。DNN 模式的回报是什么?照片里有没有猫会是一个概率。
那么我们如何确定模型的准确性呢?我们用一大堆我们(作为人类)认为是猫的照片再次测试,看看有多少是正确的或错误的。回应的正确性再次由我们决定。我们可以说,如果概率> 80%(或者任何数字,真的)它有一只猫。
假设我们用 1000 多张猫的照片进行测试,这个模型有 90%的正确率。这到底意味着什么?那么,我们可以降低正确阈值,如果概率结果> 70%,这意味着它是一只猫,然后突然模型变得 95%正确。或者,如果我们用更多的照片再次训练模型,模型的正确率达到 97%。或者 85%正确,取决于照片。或者如果我们用另外一组 1000 张猫的照片,准确率是 88%。
我们真的不知道。结果是概率性的,尽管模型是确定性的。
它是怎么做到的?
等等,还不止这些。我们知道像 DNN 模型这样的机器学习模型可以预测结果。但实际上我们并不知道它是如何做到的。在训练一个模型后,我们知道它会产生一定的结果,但我们不知道具体的原因。它是一个黑盒子。
但是如果它是确定性的,我们应该知道,对吗?
让我们从一个简单的例子开始。假设我们有一个数学函数f(x,y)
,其中x = 1
和y = 2
接受两个数字1
和2
,并返回第三个数字3
。
立即想到的函数是一个简单的加法,我们取1
加2
,得到3
。但这是唯一的功能吗?实际上不是,我们不知道函数中还会发生什么,所以如果函数取1
并加上100
,然后加上2
,然后减去100
,函数仍然返回3
。出于各种目的,我们无法区分这两者。而且这样的函数可以有无限个,只要我们接受1
和2
并返回3
。
现在让我们假设有一个数学函数f(d)
可以接受照片作为输入,并产生一个概率,其中是否有一只猫。就像我们前面的例子一样,可以有任意数量的这样的函数来做这件事。
我们上面描述的 DNN 模型通过接受相同的输入并产生相同的输出来*似f(d)
,但是我们实际上不知道它实际上*似哪个函数。我们也不能肯定它能复制任何功能,除非我们提供并测试有限的数据集。但是如果我们这样做了,我们就不再需要 DNN 模式了,不是吗?
因此,我们最终得到的是结果和规则不再确定的生成软件。这听起来完全没用,除非 DNN 模型可以逼*任何函数,并预测任何给定合适的算法,大量的处理能力和足够的数据。
这就是它的超能力。
这一切意味着什么?
现在我们已经参观了一点,让我们回到我们最初的问题——机器会取代程序员吗,我们会失去工作吗?
据我所知,还没有任何东西取代程序员的工作。如果说有什么不同的话,那就是它加剧了对更多更好的程序员的需求。但是需要什么样的程序员呢?那不是一个直截了当的回答。
当前结构化和确定性的编程范例已经伴随我们很长时间了,并且在可预见的未来还将继续伴随我们。但许多新的令人兴奋的工作将在创建新的机器学习算法、管理数据管道、训练和培育模型的领域进行。
新的角色将会出现来处理新的概率编程范例。例如,在软件开发中,质量控制活动是整个过程的关键部分。但是你如何确保一个概率函数总是按照需要执行呢?我们如何确保照片中不会漏掉一只猫?或者说没有猫的地方有猫?
遗传程序和 DNN 模型是生成软件。DNN 模型是在没有源代码的情况下生成的,我们不一定理解它的规则和逻辑。这导致了我们还不知道如何解决的问题。例如,如果软件运行时出现错误,谁负责?我们如何保证它不会再次发生?这不是假设。特斯拉的半自动自动驾驶功能被发现对致命事故负有部分责任。
这张具有历史意义的 1980 年的照片拍摄于国家传染病中心(NCDC)流感检测实验室,描绘了实验室人员 Penny Gentry 坐在计算机工作站上,将数据输入流感专用数据库。疾控中心在 Unsplash 上拍摄的照片。
作为程序员,我们需要导航这个新的景观并适应它。但是作为程序员,我们可能会。毕竟,我们的行业就是不断变化的。
离群值会破坏你的机器学习预测吗?寻找最佳解决方案
内部人工智能
在现实生活中,我们很少有正态分布数据。它是倾斜的,缺少数据点或有异常值。HuberRegressor 在 Scikit-learn 银弹吗?
威尔·梅尔斯在 Unsplash 上拍照
在数据的世界里,我们都爱高斯分布(也称为正态分布)。在现实生活中,我们很少有正态分布数据。它是倾斜的,缺少数据点或有异常值。
正如我在之前的文章中提到的,Scikit-learn 的优势无意中对其不利。机器学习开发者。经验相对较少的人在没有掌握特定算法的显著特征和局限性的情况下实现不适当的预测算法。我们已经在前面的中看到了我们不应该使用决策树回归算法来推断数据的原因。
任何机器学习建模的成功总是始于理解将在其上训练模型的现有数据集。在开始任何建模之前,必须充分理解数据。我甚至会走到一个程度说,模型的预测精度和我们对数据的了解程度成正比。
目标
在本文中,我们将看到异常值对 Scikit-learn、中可用的各种回归算法的影响,并了解在这种情况下最适合应用的回归算法。我们将从一些理解数据的技术开始,然后用这些数据训练一些 Sklearn 算法。最后,我们将比较算法的训练结果,并学习在异常值的情况下应用的潜在最佳算法。
训练数据集
训练数据由 3 个特征(自变量)和 1 个目标值(因变量)的 200,000 条记录组成。特征 1、特征 2 和特征 3 的真实系数分别为 77.74、23.34 和 7.63。
训练数据— 3 个自变量和 1 个因变量
步骤 1- 首先,w e 将导入数据分析和回归所需的包。
我们将比较 HuberRegressor、LinearRegression、Ridge、SGDRegressor、ElasticNet、PassiveAggressiveRegressor 和线性支持向量回归(SVR),因此我们将导入各自的包。
大多数时候,训练数据中很少有数据点丢失。在这种情况下,如果任何特定的要素具有高比例的空值,那么最好不要考虑该要素。否则,如果某个特征缺少一些数据点,那么要么可以从训练数据中删除这些特定的记录,要么我们可以用*均值、中值或常数值替换那些缺少的值。我们将导入 SimpleImputer 来填充缺失的值。
我们将导入方差膨胀因子来确定要素间多重共线性的严重程度。我们将需要 Matplotlib 和 seaborn 来绘制各种分析图。
from sklearn.linear_model import HuberRegressor,LinearRegression ,Ridge,SGDRegressor,ElasticNet,PassiveAggressiveRegressorfrom sklearn.svm import LinearSVRimport pandas as pd
from sklearn.impute import SimpleImputer
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
步骤 2- 在下面的代码中 , 包含 200.000 条记录的训练数据从 excel 文件读入到名为“RawData”的 PandasDataframe 中。独立变量被保存到新的数据帧中。
RawData=pd.read_excel("Outlier Regression.xlsx")
Data=RawData.drop(["Target"], axis=1)
第 3 步- 现在我们将开始对训练数据有所了解和理解。在我看来,热图是了解不同功能之间关系的一个很好的选择。
sns.heatmap(Data.corr(), cmap="YlGnBu", annot=True)
plt.show()
它表明,没有一个自变量(特征)是彼此密切相关的。如果你想了解更多关于回归算法的独立变量的方法和选择标准,那么请阅读我之前的文章。
步骤 4- 了解了训练数据中特征之间的相关性后,接下来我们将研究最小值、最大值、中值等。每个特征值范围的。这将有助于我们确定训练数据中是否存在任何异常值及其程度。下面的代码指示绘制所有特征的箱线图。
sns.boxplot(data=Data, orient="h",palette="Set2")
plt.show()
如果你不知道阅读盒子情节,那么请参考维基百科了解更多。特征值分布在很大的范围内,与中值有很大的差异。这证实了训练数据集中异常值的存在。
第 5 步- 我们将检查训练数据中是否有空值,并在建模之前采取任何必要的措施。
print (Data.info())
在这里,我们可以看到在训练数据中总共有 200,000 条记录,并且所有三个特征都几乎没有丢失值。例如,要素 1 缺少 60 个值(200000–199940)。
第 6 步- 我们使用简单估算器,用一个特征的其他记录的*均值来填充缺失值。在下面的代码中,我们同样使用了 strategy= "mean"。 Scikit-learn 提供不同的策略,即均值、中值、最频繁值和常数值来替换缺失值。我建议您作为学习练习,自我探索每种策略对培训模式的影响。
在下面的代码中,我们使用策略“Mean”创建了一个 SimpleImputer 实例,然后将训练数据放入其中,以计算每个特征的*均值。变换方法用于用*均值填充缺失值。
imputer = SimpleImputer(strategy="mean")
imputer.fit(Data)
TransformData = imputer.transform(Data)
X=pd.DataFrame(TransformData, columns=Data.columns)
第 7 步- 在替换缺失值后,最好再次检查特征,以确保我们的训练数据集中没有任何空值。
print (X.info())
我们可以看到,现在所有特征都具有非空值,即 200,000 条记录的非空值。
步骤 8- 在我们开始训练算法之前,让我们检查一下自变量中的方差膨胀因子 ( VIF )。VIF 在普通最小二乘回归分析中量化了多重共线性的严重程度。它提供了一个指标来衡量估计回归系数的方差(估计值的标准差的*方)因共线性而增加的程度。我鼓励大家阅读维基百科上关于方差膨胀因子的页面,以便更好地理解它。
vif = pd.DataFrame()
vif["features"] = X.columns
vif["vif_Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif)
在上面的代码中,我们计算每个自变量的 VIF 并打印出来。一般来说,我们的目标应该是自变量的 VIF 小于 10。我们在之前的热图中已经看到,没有一个变量是高度相关的,同样的情况也反映在特征的 VIF 指数中。
第 9 步- 我们将从 RawData 数据帧中提取目标即因变量的值,并保存在一个数据序列中。
y=RawData["Target"].copy()
第 10 步- 我们将评估各种回归因素的表现,即 HuberRegressor,LinearRegression,Ridge 和其他异常数据集。在下面的代码中,我们创建了各种回归变量的实例。
Huber = HuberRegressor()
Linear = LinearRegression()
SGD= SGDRegressor()
Ridge=Ridge()
SVR=LinearSVR()
Elastic=ElasticNet(random_state=0)
PassiveAggressiveRegressor= PassiveAggressiveRegressor()
步骤 11- 我们声明了一个带有回归实例的列表,以便在以后的循环中按顺序传递它。
estimators = [Linear,SGD,SVR,Huber, Ridge, Elastic,PassiveAggressiveRegressor]
第 12 步- 最后,我们会用训练数据集依次训练模型,并打印模型计算出的特征的系数。
for i in estimators:
reg= i.fit(X,y)
print(str(i)+" Coefficients:", np.round(i.coef_,2))
print("**************************")
我们可以观察到不同模型根据其优化和正则化因子计算出的各种系数。特征 1 系数计算系数从 29.31 到 76.88 不等。
由于训练数据集中的一些异常值,一些模型(如线性和岭回归)预测的系数与真实系数相差甚远。Huber 回归器对异常值非常稳健,确保损失函数不会受到异常值的严重影响,同时不会像 elsen 回归器和 RANSAC 回归器那样完全忽略它们的影响。线性 SVR 在罚函数和损失函数的选择上也有更多的选择,表现优于其他模型。
为你学习行动- 我们用包含离群值的训练数据集训练不同的模型,然后将预测系数与实际系数进行比较。我鼓励你们都遵循同样的方法,比较预测指标,即。用离群数据集训练的不同模型的 R2 评分、均方误差(MSE)、RMSE。
提示 —与我们在本文中看到的系数预测准确性相比,您可能会惊讶地看到模型的 R(决定系数)回归得分函数。如果你偶然发现了什么,请随时联系我。
关键外卖
正如我在之前的文章中提到的,我一直强调我们机器学习从业者的主要焦点是在开始建模之前考虑数据、预测目标、算法的优势和局限性。我们在理解训练数据上多花的每一分钟,都可以通过正确的算法直接转化为预测的准确性。我们不想用锤子拧开,用螺丝刀钉入墙壁。
如果你想了解更多关于识别机器学习监督算法的正确独立变量的结构化方法,请参考我关于这个主题的文章。
"""Full Code"""from sklearn.linear_model import HuberRegressor, LinearRegression ,Ridge ,SGDRegressor, ElasticNet, PassiveAggressiveRegressor
from sklearn.svm import LinearSVR
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as npRawData=pd.read_excel("Outlier Regression.xlsx")
Data=RawData.drop(["Target"], axis=1)sns.heatmap(Data.corr(), cmap="YlGnBu", annot=True)
plt.show()sns.boxplot(data=Data, orient="h",palette="Set2")
plt.show()print (Data.info())print(Data.describe())imputer = SimpleImputer(strategy="mean")
imputer.fit(Data)
TransformData = imputer.transform(Data)
X=pd.DataFrame(TransformData, columns=Data.columns)
print (X.info())vif = pd.DataFrame()
vif["features"] = X.columns
vif["vif_Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif)
y=RawData["Target"].copy()Huber = HuberRegressor()
Linear = LinearRegression()
SGD= SGDRegressor()
Ridge=Ridge()
SVR=LinearSVR()
Elastic=ElasticNet(random_state=0)
PassiveAggressiveRegressor= PassiveAggressiveRegressor()estimators = [Linear,SGD,SVR,Huber, Ridge, Elastic,PassiveAggressiveRegressor]for i in estimators:
reg= i.fit(X,y)
print(str(i)+" Coefficients:", np.round(i.coef_,2))
print("**************************")
系列是否随着时间的推移越来越差?
用 BeautifulSoup 和 Seaborn 可视化来抓取 IMDb 评分
杰瑞米·雅普在 Unsplash 上的照片
你有没有过这样的感觉,随着时间的推移,你最喜欢的电视剧质量下降了?你不再像以前那样着迷了。是的…我有这种感觉。😐
在这篇文章中,我通过检查 IMDb 的分数来分析其他观众是否有同样的印象。IMDb 是一个关于连续剧、电影和视频的在线数据库。数据库中包含的所有剧集都有一个剧集指南,其中提供了每集的相关信息(标题、收视率、上映日期和情节)。
为了执行这一分析,首先,我们将使用 BeautifulSoup 提取每集的收视率,并将它们存储在 Pandas 数据帧中。然后,我们将使用 Seaborn 库用热图可视化结果。
如果您对用于从 IMDb 网页中提取费率以及生成热图的代码感兴趣,请阅读到最后,因为我们首先提供结果,然后解释我们如何获得它们!那么…让我们开始吧,⭐️
据 IMDb 用户称,质量随着时间的推移而下降
在很多情况下,我有一种感觉,一个系列花费了太多的时间。成功的剧集通常会有很多季,有重复的风险。接下来,我们分析了 5 个随时间推移质量逐渐下降或在最后一季急剧下降的系列。
越狱
《越狱》是一部 2005 年上映的美剧。这部电视剧讲述了一个杰出的结构工程师迈克尔·斯科菲尔德制定计划帮助他的兄弟林肯·巴罗斯越狱的故事。林肯因被指控杀害美国副总统的兄弟而被监禁并被判处死刑。
下面的热图显示了每一集的评分。正如你所观察到的,前两季的*均分数比其他的都要高。
监狱破裂
行尸走肉
《行尸走肉》是一部于 2010 年在 AMC频道播出的美剧。该系列呈现了一个后世界末日的世界,一群幸存者试图在僵尸的不断攻击下生存,同时面临与其他人类幸存者的冲突。我们可以观察到,分数随着时间的推移逐渐降低。
行尸走肉
金钱抢劫
金钱大劫案是一部西班牙电视剧,最初于 2017 年在 Antena 3 播出。在被网飞收购后,金钱抢劫已经成为一个世界性的现象。该系列讲述了由“El professor”组织的皇家铸币厂劫案的故事。在计划了多年的抢劫后,El Profesor 招募了八名以城市命名的劫匪(东京、内罗毕、里约、柏林、莫斯科、丹佛、奥尔索和赫尔辛基)来执行他的总计划:印制 24 亿欧元并成功逃离铸币厂。
金钱抢劫
如上图,上一季很多集的评分大幅下降(1 分左右);然而,它们在赛季结束时增加(第 7 和第 8 集)。
我不得不承认金钱大劫案是我最喜欢的❤️系列之一
《权力的游戏》
权力的游戏是一部于 2017 年在 HBO 播出的美剧,改编自乔治·r·r·马丁写的一系列奇幻小说。该系列讲述了王朝之间为争夺铁王座而发生冲突和结盟的故事。
你可以在下面观察到,剧集的评分在所有季节都很高,在最后一季出现了大幅下降。
《黑镜》
黑镜是一部英国反乌托邦电视剧,于 2011 年上映。该系列批评了现代社会,尤其是对技术的不当使用。所有的情节都是独立的,并呈现了不久的将来,科技扮演着重要但也有害的角色。
如上图所示,我们还可以观察到上个赛季的得分有所下降。
其他系列
如纸牌屋、维京人、绯闻少女、罪人等系列,根据 IMDb 用户的说法,也显示出质量随着时间的推移而下降。但是,有没有一个系列能保持它们的质量?答案是肯定的!
根据 IMDb 用户的意见,随着时间的推移,质量保持不变
虽然随着时间的推移,许多系列会失去质量,但也有一些系列能够在整个季节保持质量。让我们看一些例子。
绝命毒师
绝命毒师刚刚好。所有的部分都完美地组合在一起的拼图。什么都不缺,什么都不多余。不用说,绝命毒师是我最喜欢的系列!💚
《T4》系列于 2008 年在 AMC 电视台播出,讲述了沃尔特·怀特的故事,他是一名高中化学老师,在被诊断患有无法手术的肺癌后,开始生产冰毒以保证家庭的经济前景。
如下图所示,该系列甚至随着时间的推移而提高质量。
《绝命毒师》
我完全同意 IMDb 的用户。第四季的最后一章简直完美。
老友记
老友记是 1994 年在 NBC 播出的一部美国连续剧。这部电视剧讲述了住在纽约的六个朋友(瑞秋、莫妮卡、菲比、乔伊、钱德和罗斯)的故事。
由于《老友记》的成功,经过多次薪资谈判,剧组在第九季和第十季每集获得了 100 万美元的报酬!
老友记
如上所示,我们观察到各集之间分数的差异;然而,没有明显下降的质量在整个季节。
如何逃脱谋杀
如何逍遥法外是 2017 年在 ABC 上发布的一部美国系列。这部连续剧讲述了安娜莉丝·基廷的故事,她是米德尔顿大学的法学教授,也是一名成功的律师。她和她的五个学生卷入了安娜莉丝丈夫萨姆·基廷的谋杀案。
在这种特殊情况下,我们无法理解质量随时间的下降。然而,我们可以注意到,这一季的最后几章比第一章评价更高。我们几乎可以在所有系列中观察到这种趋势!
现在,是时候让你自己的形象化了!
密码
首先,我们介绍本文中使用的第三方库。由于这些库不是 Python 标准库的一部分,我们需要单独安装它们。这可以通过使用 pip 组件轻松实现。在计算机上执行代码之前,请验证是否安装了所有库。
然后,我们提供用于从 IMDb 网页抓取数据并生成热图的代码,这样您就可以轻松地制作自己的可视化效果了!
图书馆
请求
请求 是一个第三方库,允许你使用 Python 发送 HTTP 请求。在本文中,我们将只使用请求库来获取一个网页的 HTML 代码。
美味的汤
当执行数据分析时,我们并不总是能够下载 csv 格式的数据,或者通过应用编程接口 (API)访问数据。在某些情况下,我们必须直接从网页获取数据。这时候美汤就派上用场了。
美汤 是一个 Python 库,用于从 HTML 和 XML 文档中提取数据,有很多有用的功能可以从网页中抓取信息(例如从标签或图片中提取超链接、文本)。
熊猫
Pandas 是一个 Python 开源库,用于数据科学,允许我们轻松处理结构化数据,如 csv 文件、 SQL 表或 Excel 电子表格。它提供了以不同格式读写数据、执行探索性分析和数据清理的工具。
海生的
Seaborn 是基于 Matplotlib 的 Python 数据可视化库。与 Matplotlib 、 Seaborn 相比,它允许您使用更少的代码行来绘制图表,并提供更复杂的可视化工具,如热图、盒图和小提琴图。此外,可视化效果看起来更好!❤️
美声网刮
为了从 IMDb 收集数据,我们创建了一个函数(剧集 _ 比率),该函数接受一个剧集(剧集指南)的网页作为输入,返回一个数据帧,其中行表示季,而列表示集,如下所示:
剧集 _ 费率功能
让我们一步一步地理解代码👌
1.我们使用请求模块以字符串形式获取网页的 HTML 代码。首先,我们使用向指定的 url 发送一个 GET 请求。get(url) 方法。然后,我们使用获取页面的 HTML 文本。文本属性属性。
# obtain the html code as a string
response = requests.get(url_serie + url_season)
html = response.text
我们可以观察到,网址由两部分组成:网址 _ 系列和网址 _ 季节。 Url_serie 是函数(剧集 _ 收视率)的输入,在 url_season 时保持不变(例如?季节=1,?季节=2,…)随着我们选择不同的季节而变化。
2.我们将字符串 html 传递给 BeautifulSoup 构造函数,获得一个 BeautifulSoup 类型的对象。现在,我们可以使用美丽的汤中可用的方法轻松地从该对象中提取信息。
# create a BeautifulSoup object
soup = bs4.BeautifulSoup(html, “html.parser”)
3.接下来,我们用 Chrome 开发工具探索 HTML 代码。 Chrome Dev Tools 是一套直接内置于谷歌 Chrome 的网络开发工具,允许你轻松检查页面的 HTML 代码。我们可以通过点击 Ctr + Shift + I 或者选择更多工具>开发者工具来轻松访问 Chrome 开发工具。
在元素选项卡中,我们可以检查和编辑页面的 HTML 和 CSS 。要显示某个元素的 HTML 代码(例如,事件率),您可以点击检查元素按钮(带箭头的方块)并在浏览器中选择该项目,如下所示:
正如我们所观察到的,感兴趣的元素(剧集比率)位于具有类属性(“IPL-rating-star _ _ rating”)的 span 标签内。这个 span 标签在一个 division 标签内,带有一个 class 属性(“IPL-rating-star small”)。
我们使用这种方法。 find_all() 获取所有具有类属性(“IPL-rating-star small”)的标签。这个函数返回一个 bs4.element.ResultSet 对象。然后,我们遍历这个对象(division 标签),使用访问包含分数的 span 标签(“ipl-rating-star__rating”)。find() 方法。为了获得标签之间的文本,我们使用了。文本属性如下。
rates_season = {}
# we obtain all division tags with the class attribute “ipl-rating-star small”
division_tags = soup.find_all(class_=”ipl-rating-star small”)
# we loop through the tags and extract the scores
# we create a dictionary with the scores
for index, tag in enumerate(division_tags):
rate = tag.find(class_=”ipl-rating-star__rating”).text
episode = ‘Episode_’ + str(index + 1)
# we insert the score in the dictionary
rates_season[episode] = float(rate)
# we append the dictionary to a list
rates_all.append(rates_season)
如上图所示,我们将分数插入到一个字典中,作为键的剧集编号和值的剧集分数。最后,我们将这本词典附加到一个列表中。
4.一旦我们收集了一个赛季的所有分数,我们必须访问下一个赛季的 url 来继续收集分数。首先,我们检查另一季是否可用(anchor tag—id = " load _ next _ 剧集")。如果是这样,我们使用。 get() 方法。
# get next season anchor tag
next_season = soup.find(“a”, id=”load_next_episodes”)
# if next_season equal to None break the loop
if not next_season:
break
# if next_season is not equal to None, we access the url
url_season = next_season.get(‘href’)
如上图所示,如果没有 id="load_next_episodes "的主播标签,意味着没有另一季可用,则 while 循环终止。
5.最后,我们获得一个字典列表,其中每个字典包含一个赛季的得分。我们使用这个字典列表创建一个熊猫数据帧,如下所示:
df = pd.DataFrame(rates_all, index=list(map(lambda x: ‘Season_’ + str(x+1), range(num_season))))
瞧!我们获得一个数据帧,只提供一个网页💪接下来,我们使用这个数据帧使用 Seaborn 创建一个热图。
Seaborn 可视化
热图是一种数据可视化技术,其中每个数据点的值用颜色(色调或强度的变化)表示。我们可以使用 seaborn.heatmap() 函数轻松创建一个带有 Seaborn 的热图。
如下所示,我们创建了一个函数网页到热图,它接受剧集(剧集指南)的网页、图像的颜色图以及标题作为输入,返回热图可视化。正如您所看到的,我们使用函数 episodes_rates 返回的数据帧作为 seaborn.heatmap() 函数的输入。
网页热图
现在,让我们选择一个系列,并可视化其分数!
首先,我们转到一个系列的剧集指南,我们复制 url 直到单词 episode,如下所示:
然后,我们选择一个色图和一个标题用于可视化。最后,我们用网页热图函数创建了热图。
如你所见,《广告狂人》随着时间的推移质量不断提高!此外,这一季的最后几章比第一季评价更高。
现在,是时候让你自己的形象化了!
阿曼达💜
股票收益是正态分布吗?
不可能的事变得更有可能了
马库斯·斯皮斯克在 Unsplash 上的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
介绍
在辉瑞公司上周宣布其新冠肺炎疫苗有 90%的成功率后,股票市场立即停止并改变了方向。美国航空公司(American Airlines)和 AMC 等受到疫情重创的股票,突然被突然涌入的资金赋予了新的生命,而所谓的“呆在家里”的股票突然失去了动力(Zoom 度过了艰难的一周)。事件的快速变化让“定量”投资者收拾起刚刚发生的事情。像这样的事件应该是非常罕见的,以至于“写出任何一天发生的概率需要一个 16 位数字,后面跟着 63 个零。”
定量分析师部署的策略突然崩溃,暴露了对股市行为的某些假设,以及为什么做出这些假设如此危险,其中最主要的一个假设是,股票回报或多或少是正态分布的。本文旨在证明这一假设是错误的,股票价格不是正态分布的。这样做结果就是“反常事件”,也就是说,变成了比预期更常见的地方(相对而言,仍然是相当高的比率)。然而,这并不意味着定量模型毫无用处。它只是强调了一个模型的好坏取决于它背后的假设。
正态分布简介
正态分布是一个统计概念,它非常重要,因为它描述了我们每天观察到的数据的行为。更具体地说,它描述了一个变量的值——例如,人的身高——是如何分布的。在进入更多细节之前,让我们看一张正态分布的图片来更好地了解它:
正态分布是一个钟形的 a 曲线,它的关键方面是 1)曲线下 68%的值落在*均值的一个标准偏差内(在图表的红色区域内), 2)95%的值落在*均值的两个标准偏差内(在图表的绿色或红色区域内),最重要的是,在我看来,3)99.7%的正态分布数据落在*均值的三个标准偏差内(在黄色、绿色或红色区域内)。换句话说,一个变量 99.7%的取值都落在上图的蓝色曲线下。使用正态分布的哑数据,如下图所示,一个变量 99.7%的取值范围大约在 0.5 到 3.5 之间。
随机生成的数据
这一点很重要,因为如果股票回报符合这种分布,那么投资者就可以确信回报的 99.7%将被限制在一定的范围内。例如,如果沃尔玛的回报是假定正态分布,如下图所示,那么投资者可以确信可能的价值范围将落在曲线之下。注意,如果数据是正态分布的,收益沿着分布曲线尾部的概率几乎是不可能的,:
常态检验
这个百万美元的问题是,股票回报是否正常,以及一个沃尔玛的投资者,如果知道-0.2 或更低的回报实际上是不可能的,他是否能睡得安稳。检验正态性有几种方法,本文将重点介绍夏皮罗-维尔克检验和分位数-分位数图。
夏皮罗-维尔克试验
夏皮罗-维尔克检验是几种正态性检验之一,它通过使用所谓的 p 值来评估样本从正态分布中抽取的可能性,然后将其与阈值(通常为 0.05)进行比较。在 Python 中,如果 p 值低于 0.05,则有可能(但不确定)所讨论的数据不是正态分布的,如果 p 值高于 0.05,则数据可能遵循正态分布。将该测试应用于上述随机生成的数据,数据可能遵循正态分布:
Python 中的夏皮罗-维尔克测试
然而,将这一检验应用于沃尔玛,产生了不同的结果,即它未通过正态性检验。当然,其他股票可能会通过这个测试。然而,对纳斯达克 100 指数中的每只股票进行同样的测试会得出相同的结果:
没有一只股票的 p 值大于 0.05,这意味着它们的回报可能不符合正态分布。
分位数-分位数检验(QQ 图)
简单地说,分位数-分位数检验是一个通过一系列点画出一条对角线的图形。如果图上的每个点都落在对角线上,则数据可能遵循正态分布:
抽样资料
上面的样本数据非常接*直线,表明数据可能是正常的。对沃尔玛的历史回报率进行这种测试会产生一个结果,表明回报率可能不正常,因为与对角线有偏差:
结论:不可能的事情并没有那么不可能
正态性测试很重要,因为它们有助于确定在建立投资模型时做出一系列假设是否合适。如果数据没有按照假设的方式运行,那么被认为是不可能的事情,比如遭受巨大的投资损失,可能会变得更有可能。要点是不要把投资模型扔到一边,而是要认识到它们的好坏取决于它们背后的假设。
进一步探索
Python 代码可以在这里找到
股票收益是正态分布吗?
从概率分布中得出的预期与真实世界的股票回报匹配吗?
虽然痛苦,但最*金融市场的混乱给我们提供了一个质疑自己假设的好机会。在投资行业中,用正态分布来模拟投资未来回报的潜在范围是很常见的。任何时候我们都可以用正态分布来建模一些东西,这使得生活变得容易多了。例如,由许多投资组成的投资组合(每个投资的回报都是正态分布的)的回报也是正态分布的。为了描述一项投资,我们只需要两个值:*均值(也就是投资的预期回报)和标准差(也就是投资的风险)。如果我们想彻底,我们还应该记录投资与我们整体投资组合的相关性。
我之前写过金融业如何对投资风险进行建模。钟形曲线峰值的 X 轴位置是预期收益,钟形曲线的宽度代表其风险:
投资钟形曲线
但是用这些假设做出的风险估计真的有意义吗?股票收益实际上正常吗?常态假设是否低估、恰当表述或夸大了市场灾难的频率(就像我们在过去几周经历的那样)?
股票收益正常吗?
自 1950 年以来,标准普尔 500 的*均年回报率约为 8%,回报率的标准差为 12%。我想看看月度回报,所以让我们把它们转换成月度回报:
Monthly Expected Return = 8%/12 = 0.66%
Monthly Standard Deviation = 12%/(12^0.5) = 3.50%
让我们将实际回报叠加在理论正态分布之上,*均值为 0.66%,标准差为 3.5%:
实际分布与正态分布
它看起来*似正常,但如果我们看分布的左边,我们可以看到著名的厚尾。厚尾意味着现实中极端事件发生的频率比正态分布预测的要高。更多的证据表明,标准普尔 500 指数月度回报率的实际分布在中心比正态分布更薄。瘦的中间和胖的尾部意味着正态分布可能不是股票收益的最佳描述。相反,似乎有两种制度——一种*静的制度,在这种制度下,我们大部分时间都处于正态分布状态(但波动性低于 12%),另一种制度则具有高波动性和可怕的回报。
另一种检查正常性的方法是 QQ 图(我也写了一篇博客详细介绍 QQ 图是如何工作的)。让我们来看看每月 S & P 500 回报的 QQ 图:
每月标准普尔 500 回报的 QQ 图
与红色 45 度线的偏差代表与正态分布的差异。虽然大多数观察值都或多或少落在红线上,但我们可以在左尾巴上看到明显的偏差,在右尾巴上看到较小的偏差。X 轴上的值(理论分位数)告诉我们期望在正态分布上看到该量级的观察值的频率(它们是 Z 分数,也称为远离*均值的标准偏差,这意味着概率)。Y 轴上的值(样本分位数,也是 Z 分数)告诉我们实际上看到它的频率。
例如,左边的 2 个点是明显的异常值。这两者都代表着标准普尔 500 的回报率低于-20%。在数据集中,总共有 843 个月的观测值。因此,这两个异常点仅占我们观察值的 0.237%。我们可以使用下面的代码行来找到正态分布中 0.237%的观察值位于左侧的点:
**In:**from scipy.stats import norm# Multiply by 2 to account for probabilities in right tail also
theoretical_z_score = norm.interval(1-(0.00237*2))[0]
print('Theoretical Z = ' + str(round(theoretical_z_score, 2)))**Out:**Theoretical Z = -2.82
这意味着在正态分布中(均值=0,标准差=1),我们预计 0.237%的观察值位于-2.82 的左侧(该值是 Z 得分的一个示例)。我们刚刚计算的 Z 分数是 QQ 图上第二差回报的 X 轴位置。
我们可以通过累积密度函数(CDF 方法)来证实这一点,它告诉我们,对于给定的分布,位于 Z 得分左侧的概率之和:
**In:**prob_left = norm.cdf(theoretical_z_score)
print('Probability to left = ' + str(round(prob_left, 5)))**Out:** Probability to left = 0.00237
Z 分数
Z 得分是一种将数量与概率联系起来的度量。它的公式是:
Z-score = (observed - mean)/standard_deviation
Z 值为-2.82 意味着观察值比*均值低-2.82 个标准偏差(在任一方向上离*均值越远,观察的可能性越小)。-2.82 是一个理论上的 Z 值,也称为 Z 值。低于该值时,我们预计 0.237%的观察值将服从正态分布。
现在让我们来计算实际数据的 Z 值。2 个异常点代表了灾难性的月回报率-20.4% (2008 年金融危机)和-22.5%(过去一个月)。因此,我们可以使用-20.4%来计算我们的 Z 得分(因为 842 个观察值中有 2 个是-20.4%或更低),以及标准普尔 500 月度回报的均值和标准差:
**In:**actual_z_score = (-0.204 - 0.0066)/0.035
print('Actual Z = ' + str(round(actual_z_score, 2)))**Out:**Actual Z = -6.02
哇,月收益率-20%是 6 sigma 事件(均值以下 6 个标准差)!让我们用更容易理解的概率来描述这一点:
- 发生-2.82 sigma(或更差)事件的频率为 0.237%。这意味着我们预计每 1/0.00237 个月会发生一次。所以我们预计它每 422 个月发生一次,或者每 35 年发生一次。
- 8.87*10^-8%频率出现-6.02 西格玛(或更差)事件。是的,这个数字对我来说也没有意义,所以我们换个说法。就年份而言,如果股票回报确实正常,那么我们预计像这样的 6 sigma 事件每 93,884,861 年发生一次!
这就是为什么 QQ 图特别突出了这 2 点(其中-6.02 sigma 是 QQ 图上第二差回报的 Y 轴值)。据说我们在数据中观察到 6 sigma 事件(大规模不可能发生的事件)的频率远高于预期(大约 3 sigma 频率)。它试图告诉我们:
这意味着我们在数据中观察到 6 sigma 事件(大规模不可能发生的事件)的频率远远高于预期(大约 3 sigma 频率)。它试图告诉我们:
“嘿,根据我们数据的*均值和标准差,以及最关键的假设,我们的数据是正态分布的,我们在这里观察到的是超级不正常的!”
我们观察到 2 个回报率低于-20%!这是一个只有 70 年历史的数据集中的两个六西格玛事件(9000 万年一次的事件)。所以我们可以非常自信地说(不需要假设检验!)认为没有股票回报是不正常的。此外,假设它们导致我们低估了灾难性市场回报的可能性。
那现在怎么办?
我们是不是要废弃所有的模型,然后从头开始?我不认为我们需要一路走到那里。毕竟,股票回报大致是正常的,即使在股票回报低于正常水*、存在厚尾的世界(或许更是如此),投资理论(如多样化)的许多好处也是成立的。
但是,当我们对我们的投资组合进行压力测试时(以及我们自己对未来可能发生的事情的心理预期),我们绝对应该认识到假设的 4、5 和 6 sigma 事件实际上似乎在每个商业周期都会发生一次。
我们还可以具体反思一下我们估算灾难性市场回报频率的方式。一个问题是金融市场存在的时间还不够长。因此,我们没有足够的观测数据来确信我们对均值、标准差等的估计。真正代表了真实的分布。因此,我们应该承认,我们做出的推论(使用我们确实拥有的市场数据)有时可能会非常不正确。这让我想起了地震预测,科学家们试图利用一个以中小地震为主的数据集来预测大地震的震级和频率(类似的地震可能以前从未记录过)。或许金融业可以向他们借一两页纸。
本文引用的往期帖子:
技术指标是否有效?
使用 Python 回答这个古老的问题
来自 Pexels 的照片
什么是技术指标?
技术指标,是技术分析的一个子集,指的是基于模式的信号,通常取决于证券的价格或成交量。这些指标分析历史数据的趋势,以预测未来的价格变动。但是它们真的有效吗?
在进入代码和结果之前,让我们深入了解有哪些类型的指标以及它们的目的是什么。主要指标包括移动*均线、震荡指标、、和支点。
移动*均线:移动*均线(MA)是一个简单的技术指标,它通过创建定期更新的*均价格来*滑历史定价数据。*均线是在一段特定的时间内取的,不管是 30 分钟,30 天,还是交易者喜欢的任何时间。这些通常会屏蔽价格变动的噪音,并为交易者提供证券变动的总体趋势。
振荡指标:振荡指标是经常用来识别动量趋势的指标,其波动受某个上下波段的限制。通过识别证券过去在相同势头下的表现,交易者可以根据他们是否认为股票过高或过低来做出决定。
支点:支点指标包括支撑位和阻力位的信息,帮助交易者想象证券可能反弹或突破的位置。当与其他分析工具结合使用时,这些指标也有助于识别和确认交易。
一些最受欢迎的指标包括移动*均线交叉(20,50 和 200 天),布林线,相对强度指数,移动*均线收敛发散(MACD),和商品通道指数(CCI)。
因此,为了回答这个问题,我开始创建一个 Python 程序,对任何安全和时间段的这 5 个最流行的指标进行回溯测试。为了节省时间和优化本文中的信息量,我将只解释程序背后的结构,而将重点放在输出上。话虽如此,如果您有任何问题,请联系我!
本文完整代码的链接可以在 GitHub Gist 中找到。
使用 Python 回溯测试技术指标
回溯测试代码的开始!
首先,我们必须导入将用于程序剩余部分的包。主要软件包包括 NumPy、Pandas、TaLib 和 Yfinance。NumPy 和 Pandas 帮助我们进行数据分析,而 TaLib 和 Yfinance 让我们能够轻松计算技术指标并获得历史定价数据。你可以使用 Pythons 包管理器 PyPi 轻松下载这些模块!
我们可以用输入语句设置股票和年数,这样你就不必每次运行时为了检查其他符号/时间段而改变代码。最后,我们可以将信号列表设置为 5 个指标,并将我们将获取的其他统计信息设置为空列表。
回溯测试代码的结构
在代码的这一部分,我们实际上进入了回溯测试!我们可以循环遍历开始时创建的原始信号列表,并设置每个策略。
在这个特定的例子中,短的 SMA *均为 20 天,而长的 SMA 为 50 天。我们可以创建变量 position、counter 和 percentChange 来实现和跟踪策略。接下来,我们可以创建买入(20 SMA > 50 SMA)和卖出(50 SMA > 20 SMA)证券的信号。
最后,我们可以收集策略执行情况的统计数据。统计数据包括交易次数、百分比变化、最后买入价格、最后卖出价格、每次交易的*均盈亏、每次交易的最大盈亏、盈亏比以及信号的成功率。
一旦所有的信号都完成了(只要对其他指标的买入和卖出信号重复这个过程),我们就可以用下面的代码创建一个熊猫数据框架,其中包含我们已经获得的统计数据列表。
为了真正发现策略是否有效,我们还必须将其与同期的证券表现进行比较(买入并持有)。例如,如果布林线产生了 200%的回报,但证券本身获得了 250%,那么很明显,我们必须改变策略或完全放弃它。
到目前为止,我们已经有了一个完整的数据框架,其中包含了在设定的时间段内策略执行情况的所有统计数据,所以是时候回答这个问题了:技术指标有效吗?
回答这个古老的问题
答案是,看情况。
我知道,我答应给一个具体的答案如何有效的技术指标,但答案确实取决于众多因素。技术分析是关于概率和可能性,而不是保证。如果一个指标经常起作用,即使它并不总是起作用,它仍然可以有效地产生利润。
在大多数情况下(约 78%),当我用数百个不同的报价器运行代码时,买入并持有并不是回报的主要策略。然而,导致回报的策略差异很大,因此没有一个指标每次都比其他指标表现得好。
但是这意味着什么呢?
根据我的结果,在交易策略中使用技术指标仍有潜力,但它必须由多个指标组成,并且已经在一系列时期内对多个指标进行了彻底的回溯测试,以便持续产生利润。
一个真正的高性能,可靠的交易策略是很难制定的,你不能仅仅依靠一个图表来告诉你你需要知道的一切。作为一个有风险意识的个人,我个人认为最好利用我的时间和精力不断投资指数基金,而不是选择市场时机。
这个故事的寓意:既然你已经了解了 Python 中如何回测指标的结构,那就为自己做一个明智的决定吧。非常感谢你的阅读,我希望你喜欢!
顺便说一句,如果你想在没有代码的情况下回测这些相同的指标,你可以查看一下 这个我为帮助投资者而创建的网站 (由于它部署在 Heroku 上,最初可能需要一些时间加载)。
免责声明:本文材料纯属教育目的,不应作为专业投资建议。自行决定投资。
如果你喜欢这篇文章,可以看看下面我写的其他一些 Python for Finance 文章!
了解如何在不到 3 分钟的时间内解析顶级分析师的数千条建议!
towardsdatascience.com](/parse-thousands-of-stock-recommendations-in-minutes-with-python-6e3e562f156d) [## 用 Python 制作股票筛选程序!
学习如何用 Python 制作一个基于 Mark Minervini 的趋势模板的强大的股票筛选工具。
towardsdatascience.com](/making-a-stock-screener-with-python-4f591b198261) [## 在 3 分钟内创建一个财务 Web 应用程序!
了解如何使用 Python 中的 Streamlit 创建技术分析应用程序!
towardsdatascience.com](/creating-a-finance-web-app-in-3-minutes-8273d56a39f8)
集群好吗?
了解如何评估集群
聚类定义为在数据中寻找自然群体。但是这个定义本身就是主观的。
什么是自然群体?
如果我们看到下面的图片,我们能找出这些花的自然组合吗?是根据形状还是根据颜色?它甚至可能是由花的大小或种类决定的。因此,自然群体的概念根据我们关注的特征而变化。
图 1:鲜花(资料来源:Unsplash)
让我们再举一个例子,我们在 2D *面上有一些点或观察值,也就是说,我们只有两个属性
图 2:原始数据和不同聚类数的聚类(图片来源:作者)
如果我们看上面的图,它有三个子图。第一个子图显示了原始数据,第二和第三个子图显示了聚类,聚类数分别为两个和四个(属于同一聚类的观察值用相同的颜色标记)。
幸运的是,我们仍然可以可视化并尝试衡量集群的质量,但是,如果我们追求更多的数字特征,我们就无法可视化和看到。因此,需要有一种机制,一些措施,可以让我们比较两组或更多组的聚类,或者可能是对同一组数据的两种或更多种聚类算法。不幸的是,就像我们可以使用精确度比较分类算法一样,或者在使用均方误差进行回归的情况下,聚类就不是那么明确了。
聚类趋势:
如果数据没有任何聚类趋势,即使数据是随机的,我们应用 k-means,算法也会生成 k-clusters。因此,我们如何衡量数据是否有聚集趋势?为了测量这一点,我们借助霍普金斯的统计数据。
霍普金斯统计(H)
在这种方案中,添加的人工生成的随机点与数据集中的原始数据点一样多。对于每个原始点,计算与其最*邻居的距离,用 w 表示,并且对人工生成的点重复相同的练习。这里,与最*邻居的距离计算为 u.
接* 0.5 的值表示数据没有聚集趋势,因为 w 和 p 相等。
聚类评估方法:
误差*方和(SSE):-
最常用的聚类评估工具是误差*方和,由以下等式给出。
SSE 方程(图片来源:作者)
基本上,在第一步中,我们通过取该聚类中所有观察值的*均值来找到每个聚类的质心。
- 然后我们找出该簇中的点偏离中心的程度并求和。
- 然后,我们将单个集群的偏差或误差相加。
- SSE 要尽可能低。
我总是通过例子更好地理解直觉,让我们就这么做吧
图 3:上海证券交易所示意图。(图片来源:作者)
我认为上面的例子不言自明。(1,3)和(8,10)是自然的集群组织,集群数量为 2。上证 4。在另一个设置中,我们在同一个群集中保留了 1、3、8 个,在另一个群集中保留了 10 个,而 SSE 已飙升至 26 个。
SSE 被广泛用于寻找聚类的数目(K ),尤其是 K-均值。
图 iris 数据集上不同聚类数的 SSE(图片来源:作者)
在这里,我们也比较了不同集群数选项的集群质量。这是一个单调递减的函数,如果我们继续增加聚类数,它将继续减少。因此,当插入 SSE 稳定或形成肘形时,采用最佳的集群数量。如果我们试图寻找球状星团,SSE 是一个很好的测量方法。
让我们从一个更广义的角度来看,我们想要的一组结构良好的集群如下
- 一个集群内的观测值要尽可能接*。这被称为内聚力
- 两个星团的观测值应该相距很远。这被称为分离
使用下图进行说明
图 5:凝聚与分离(图片来源:作者)
评估措施可分为两种方式
内测:
当类别标签不可用时,这是一个更通用的方法。轮廓系数就是这样一种流行的测量方法。这使用了内聚和分离的概念。让我们从簇 j 中取一个点 I,首先,我们计算点 I 到 j 中所有点的距离,并求*均值我们称之为 ai(内聚力)。现在,让我们取另一个簇 k,类似地,我们从簇 k 中的所有点中找到点 I 的*均距离,让我们称之为 b(分离)。可以有许多这样的群,它们中的最小值被认为是 bi。
那么点 I 的轮廓系数为
轮廓系数(图片来源:作者)
对于聚类,需要计算聚类中所有点的轮廓系数,并取*均值。该值介于-1 和 1 之间,值越高,分类越好。下图是一个算出的例子
图 6:剪影系数(图片来源:作者)
1,3,5,8,9,10 作为初始点集。假设 1,3,5 是第一个聚类,8,9,10 是第二个聚类。
所以对于点 1,a1 是(2+ 4)/2 = 3,b 是(7+8+9)/3 =7 然后我们用公式。我们可以观察
- 第二类具有更好的轮廓系数,因为它更紧凑
- 与其他点相比,中心点具有更好的轮廓系数
- 边界点具有最低的轮廓系数
其他一些常用的指标有邓恩指数和 DB 指数。
外部测量:
我们有一个可用的类标签,我们使用这个类标签来评估聚类结果。理想情况下,每个类都应该形成一个集群。一种这样的度量被称为纯度,由下面的公式给出。
纯度方程式(图片来源:作者)
k 是聚类的数量,mi 是聚类中的观测值的总数,m 是观测值的总数。Pi 是该群集中多数类的比例。例如,如果聚类 I 具有来自类 1 的 5 个观察值和来自类 2 的 20 个观察值。那么类别 2 是多数类别,纯度是 20/25 或 0.8。下面的例子进一步说明了这一点
图 7:纯度说明(来源:作者)
在上图中,显示了聚类结果的三个变量,这些计算是不言自明的。对于选项 1 和选项 2,两个集群大小相等。第二种选择更均匀,因此纯度更高。对于选项 3,集群 2 支配集群 1。
纯度有 0 和 1 两个数值,越接* 1,纯度越好。还有更多像熵、F 值等度量。关于细节,我强烈推荐你阅读庞、斯坦巴克、库马尔的书。为什么我们要使用聚类,当我们有标签可用时,也许要提出一个新的聚类算法,测试不同的配置和假设。需要注意的是,当然,聚类是在去除类别标签之后对数据进行的,然后标签用于验证聚类质量。
我们不讨论层次聚类的评估,这是另一回事。
结论:
- 聚类本质上是一项复杂的任务,因此需要评估聚类的质量。
- 这有助于比较多个聚类算法,以及使用不同参数值的同一聚类算法的不同结果
- 首先,我们可以测试是否存在聚集趋势
- 群集质量度量应该考虑内聚性和分离性
- 根据类别标签的可用性,它可以是内部的和外部的
参考文献:
[1] Tan PN,Steinbach M,Kumar V .数据挖掘导论。培生教育印度公司;2016.
[2]贾恩 AK。数据聚类:超越 K 均值的 50 年。模式识别字母。2010 年 6 月 1 日;31(8):651–66.
[4]https://towards data science . com/clustering-evaluation-strategies-98a 4006 fcfc
太空入侵者是确定的还是随机的?
对 ALE 和开放式人工智能体育馆注入随机性技术的探讨。
作者图片
摘要
谷歌 Deepmind 使用街机学习环境(ALE)在 49 款雅达利游戏上取得了人类水*的性能。本文描述了我用来重现这种性能的方法,并讨论了 Deepmind 和 Open AI 用来在 ALE 中注入随机性的机制的效率。
简介
作为一个附带项目,我花了一些时间试图在《突围》和《太空入侵者》上实现同样的 Deepmind 的人类级性能。虽然我知道有许多性能更好的架构,但我的目标是使用与 deep mind 2015 年《自然》论文中介绍的相同的网络(通过深度强化学习进行人类级别的控制)。我这样做是为了更好地理解 Deepmind 在童年玩一些标志性游戏时经历的挑战和表现。Deepmind 经历的一个挑战是我特别感兴趣的:环境是随机的还是确定的?Deepmind 和 Open AI 对抗过太空入侵者的确定性波吗?在本文中,我们讨论了 Deepmind 和 Open AI 在 ALE 中注入随机性的机制的效率。
源代码可以在https://github.com/NicMaq/Reinforcement-Learning访问
这个存储库包含我用来支持我的结论的代码,以及我的 tensorboard 运行的数据,以鼓励讨论和促进比较。
此外,对于想了解我的算法如何工作的读者,我发表了 Breakout 解释了和 e-greedy 和 softmax 解释了。这是两个 Google Colab 笔记本,我在其中解释了预期的 sarsa 和两个策略 e-greedy 和 softmax 的实现。
最后,强化学习是一个令人兴奋和有前途的人工智能领域,但要知道它是被诅咒的。阅读我关于 RL 最佳实践的帖子来加速你的成功之路。
游戏分数
在 Deepmind 的 2015 年《自然》论文中,我们发现了两个呈现结果的表格(扩展数据表 2 和扩展数据表 3)。在表 2 中,Deepmind 列出了前 5000 万帧中报告的最高*均剧集分数,同时对 135,000 帧中的每 250,000 帧进行评估。在表 3 中,他们列出了前 1000 万帧中报道的最高*均剧集分数。
我没有 Deepmind 的计算能力,所以我将我的结果与表 3 进行了比较。在前 1000 万帧(用于训练代理人)中,deepmind 报告了《越狱》的最高*均分 316.8,以及《太空入侵者》的最高*均分 1088.9。
这家名为 Open AI 的公司开源了 baselines,这是他们的内部努力,旨在重现强化学习算法,其性能与公布的结果相当。
据我所知,baseline 团队并没有在与 Deepmind 相同的网络上发布结果。我们能找到的最接*的是用双 q 学习训练的网络,正如它的名字所示,它是对 q 学习的改进。尽管如此,通读这些报告并检查我的结果是否具有可比性还是很有趣的。因此,如果 Open AI 使用与 Deepmind 相同的方法,特别是跳过 4 帧,他们在前 1000 万帧中获得的分数在 360 到 410 之间(参见基线 DQN 结果)。
图自【https://openai.com/blog/openai-baselines-dqn/
最后, 2017 ALE 论文报道的《太空入侵者》DQN 的得分是 673。
我使用的方法将在后面的章节中详细讨论。我试图严格遵循 Deepmind 的方法论。下面是我用几乎相同的评估程序得到的《突围》和《太空入侵者》的结果。我在 GitHub 中提交了我的 Tensorflow 运行:
突围(跑 20200902182427)——我的最好成绩是 427
作者图片
太空入侵者(Run 20200910151832)——我的最好成绩是 1085
作者图片
恭喜你,我成功重现了 Deepmind 在《突围》和《太空入侵者》上的表现。
但我真的有吗?
Deepmind 的代码和我的代码之间的一个主要区别是,当我使用 OpenAI Gym 时,Deepmind 直接使用 ALE。当然,最大的不同是我们如何在游戏中注入随机性。
ALE 是确定性的,因此 OpenAI Gym 实现了不同的技术在游戏中注入随机性。我们来讨论一下哪些技术最接* Deepmind 的方法论,以及它们的效率。
ALE 和 OpenAI 健身房的确定性和随机性。
虽然在 2013 年 ALE 的第一篇论文中没有提到决定论。在 2017 中写道,ALE 的一个主要担忧是“在几乎所有的游戏中,Stella 本身的动态是由代理的行为决定的。”
最初的 Atari 2600 控制台没有生成随机数的功能。因此,ALE 也是完全确定的。因此,通过简单地记住一系列好的行动,而不是学习做出好的决定,是有可能获得高分的。这种方法在 ALE 之外不太可能成功。环境的随机性是鼓励 RL 算法的鲁棒性以及它们转移到其他任务的能力的关键因素。
人们已经开发了各种方法来为 ALE 动力学添加各种形式的随机性(通常是在比 Deepmind 论文发表日期更晚的日期)。在 2017 ALE 论文中我们可以发现:
- 粘性动作
- 随机帧跳过
- 初始无操作
- 随机动作噪声
Google deepmind 使用固定的 4 跳帧,最多 30 次初始无操作,以及随机动作噪声。
ALE 是决定性的。我们可以在 2017 ALE 论文 中读到“给定一个状态 s 和一个操纵杆输入 a 存在唯一的下一个状态 s0,即 p(s0 | s;a) = 1。”所以,如果在游戏的每一步只有一个可能的结果,我们应该总是用相同的网络和相同的初始状态获得相同的分数。
在下面的段落中,我们将研究我们获得的分数的方差,以评估不同方法增加的随机性水*。我们也将通过观察结果的分布来支持我们的结论。
粘性动作的随机性
在 2017 ALE 论文中,Machado,Bellemare & al。,推荐粘性动作来加强随机性。粘性动作增加了代理动作的粘性。在每一步,环境要么执行先前的动作,要么执行新代理的动作。
“我们提出的解决方案 sticky actions 利用了其他方法的一些主要优点,而没有它们的大部分缺点。它不受研究者偏见的影响,不干扰代理人的行为选择,并且不鼓励代理人依赖记忆。新环境在整个事件中是随机的,生成的结果是可重复的。”
我们进行了两个实验来学习如何区分随机环境和确定性环境。我们的确定性环境是 BreakoutNoFrameskip-v4。我们可以在 Open AI 的源代码中读到这种环境:“无跳帧。(雅达利没有熵源,所以这些是确定性环境)”。我们的随机环境是带粘性动作的 breakout noframeskip-v4(breakout noframeskip-v 0)。
在左下方,我们可以看到确定性环境下的结果分布,在右侧,我们可以看到随机环境下的结果分布。
按作者分类的图表
正如所料,对于决定论者的环境,我们有一个非常窄的结果分布,而对于随机环境,我们有一个更宽的分布。
查看两种环境的结果直方图也非常有趣:
按作者分类的图表
我们可以在左边看到,在评估阶段的 100 场比赛中,我们都取得了相同的分数。在右边,粘性动作增加的随机性导致代理人获得不同的分数。
为了测量分布,我们可以计算结果的方差。下面是确定性环境和随机环境的方差比较。
按作者分类的图表
对于确定性环境,结果的方差始终为零,而对于随机环境,方差大于零。
让我们将这些初步结果与其他技术的分布和方差进行比较。
跳绳
跳帧包括重复由代理决定的最后一个动作,重复次数为随机的 n 个连续帧。代理在 n+1 帧中只看到 1。
在 Open AI Gym 中,跳帧可以跳过任意数量(2、3 或 4)的帧。跳过固定帧数的环境是{ }确定性 v4 和{ }确定性 v0 环境。跳过随机数量的帧的环境是{}-v4 和{}-v0 环境。
Deepmind 用的是固定跳帧。我们将使用 BreakoutDeterministic-v4。
下面是左边的 BreakoutNoFrameskip-v4 和右边的 BreakoutDeterministic-v4 的结果分布对比。BreakoutDeterministic-v4 与 BreakoutNoFrameSkipV4(确定性)是相同的环境,但是增加了一个固定的跳帧。
按作者分类的图表
这两种分布非常相似。对于 BreakoutDeterministic-v4,我们获得了确定性环境的分布。
如果我们计算两个实验的方差,所有的值都等于零。
按作者分类的图表
在 2017 ALE 论文中,Bellmare 和 al 关于随机跳帧技术的结论是“除了注入随机性,跳帧导致了更简单的强化学习问题,并加快了执行速度。”
根据我们的实验,固定框架技术不会注入随机性,但明显简化了学习问题并加快了收敛速度(见下面的分数)。
按作者分类的图表
下面是我的一个 breakout-v4 实验的分布图,它使用了随机跳帧技术。我们清楚地看到,这种分布类似于我们的随机环境。
按作者分类的图表
随机跳帧技术增加了随机性,但也增加了复杂性。我们可以在 2017 ALE 论文中读到:“贴现也必须更谨慎地对待,因为这使得有效贴现因子是随机的。”
我的代码没有考虑时间失真。在时差强化学习方法中扭曲时间肯定是具有挑战性的。
因为它简化了学习问题并加快了收敛速度,所以在本文的剩余部分,我们将使用 BreakoutDeterministic-v4 作为我们的确定性环境。
初始无操作
Deepmind 使用的另一项技术是通过执行 k 个无操作动作(k=30)来改变初始状态。这个技术不是 Open AI Gym 实现的。
我的无操作突围实现通过在发送“开火”动作之前随机移动飞船来鼓励初始状态的多样性(对于随机数 k,我选择“右”或“左”动作)。
左边可以看到我们确定性环境的结果分布(BreakoutDeterministic-v4)右边是代理执行 k 个无操作动作时的结果分布(k < 0).
Graph by author
The comparison between the two charts is interesting. While we don’t have the same pattern as a deterministic environment, the spread is definitely narrower than the spread of a deterministic environment.
Graph by author
The number of distinct results is increased but remains lower than in a stochastic environment.
Graph by author
When studying the variance, we can notice that the environment presents signs of a deterministic environment. The variance is close to zero for a few evaluation phases and significantly lower than the variance of our deterministic environment. The technique no-ops injects little stochasticity. It is less efficient than other techniques.
This confirms what Machado et al state in the 2017 ALE 论文:“环境在起始状态的选择之外保持确定性。”
随机动作噪音
最后,我们将观察随机动作噪声的效率。一个随机动作噪声是保持一个小概率用一个随机动作替换代理的选择动作。Deepmind 用的就是这个技术。在评估阶段,他们保持 5%的概率来执行随机动作。
左边是ε= 0 的 BreakoutDeterministic-v4,右边是ε= 0.05 的 BreakoutDeterministic-v4。
按作者分类的图表
我们可以观察到,保持ε非 nul 显然注入了随机性。得到的结果非常接*我们用 BreakoutNoFrameskip-v0 得到的结果。在下图中,我们还可以看到,在前 2000 万帧中,方差在增加。
按作者分类的图表
用随机动作噪声注入随机性显然是有效的。尽管它有一个重要的缺点,因为它会影响策略并降低性能。
这支持了贝尔马尔和艾尔。在 2017 年 ALE 论文中写道:“随机行动噪音可能会显著干扰代理人的政策”。
太空入侵者
让我们验证一下我们之前关于太空入侵者的结论。
确定性与随机性
首先,让我们验证我们在 SpaceInvadersDeterministic-v4(确定性的)和 SpaceInvadersDeterministic-v0(随机的)之间有相同的区别。
按作者分类的图表
按作者分类的图表
我们在这两种分布上观察到与突破相同的模式。此外,对于确定性环境,分布的方差为零,而对于随机环境,分布的方差非零。
初始无操作
对于突破来说,最初的不作为并没有注入随机性。
让我们比较一下 SpaceInvadersDeterministic-v4 和 SpaceInvadersDeterministic-v4 与 no-ops (k=30)。
按作者分类的图表
按作者分类的图表
按作者分类的图表
我们可以说,不带任何操作的 SpaceInvadersDeterministic-v4 的行为与 Breakout 相同。它显示了决定性行为的迹象。我们得到了一个显著低于随机环境的方差。
随机动作噪音
让我们比较一下 SpaceInvadersDeterministic-v4(左)和带有随机动作噪声的 SpaceInvadersDeterministic-v4(右)。
下面的两个分布清楚地证实了将ε保持为非零值会引入随机性。
按作者分类的图表
而且,方差几乎和我们随机环境的方差一样。
按作者分类的图表
结论
在本文中,我们证明了在 ALE 中注入一定程度的随机性有不同的有效方法。然而,有些方法会带来不良的副作用:随机的帧跳跃会扭曲时间;最初的无操作表现出决定论的迹象,有时对游戏没有影响;随机行为噪声惩罚行为策略。
这证实了 Machado,Bellemare 等人的结论。谁写的:“我们的建议是使用粘性动作,最终提出粘性动作作为标准的培训和评估协议。”
因此,当我在开放式人工智能健身房训练时,我倾向于使用{ }确定性-v0,我们有很好的随机性,没有时间失真。
重要的是要注意,如果你正在训练一个 RL 算法,检查你分数的分布是否有决定论的迹象总是令人感兴趣的。
现在,要回答关于 Deepmind 战胜确定性太空入侵者的问题,我会说他们使用了两种方法来注入随机性(初始无操作和随机动作噪音)。
使用这两种方法似乎有些过分,因为随机动作噪声足以确保随机性。也许,Deepmind 开始了他们的无操作实验,并注意到他们在一些游戏中过度适应。不清楚,只有 Deepmind 能说。
尽管很难理解基线方法,但从结果中可以清楚地看出,他们增加了无操作。不清楚他们是否使用了随机动作噪音。使用无操作是否足以在游戏中增加足够的随机性来防止过度拟合?
当使用随机突破环境时,我与 Deepmind 处于相同的性能范围。当转换到具有相同超参数的太空入侵者时,我的结果明显更低。也许这与方法论的差异有关,或者仍然需要对超参数进行一些微调,以便在其他游戏中获得良好的性能。
我希望您喜欢看到确定性环境和随机环境之间的差异!并且,我希望这篇文章能加速你的人际网络在其他任务上的转移,帮助你走向成功。
参考文献
Mnih,v .,Kavukcuoglu,k .,Silver,D. 等通过深度强化学习的人级控制。性质 518,529–533(2015)。
M. G .贝勒马尔、y .纳德夫、j .维内斯和 m .鲍林。街机学习环境:通用代理的评估*台,人工智能研究杂志,第 47 卷,第 253-279 页,2013 年。
M. C. Machado,M. G. Bellemare,E. Talvitie,J. Veness,M. J. Hausknecht,M. Bowling。重温街机学习环境:通用代理的评估协议和开放问题,人工智能研究杂志,第 61 卷,第 523-562 页,2018 年。
方法和超参数
AI 里有黑人吗?
弗拉季斯拉夫·奥西娅的混血儿。(作者持有图像许可)
意见
我们仍然是人工智能中代表最少的种族之一,然而我们可能会因为它的利用和滥用而遭受最大的痛苦。
“多样性被邀请参加聚会。包容就是被要求跳舞。”
—武诗源·迈尔斯
介绍
L 先说我问 AI 里有没有黑人的意思。
在这篇文章标题中使用的术语 AI( 人工智能)是广泛的,让我们将它缩小到我将重点关注的 AI 的特定部分。
我会关注人工智能工作/角色中是否有黑人。
我将来可能涉及的其他领域是人工智能伦理、人工智能法规和人工智能研究。
这不是一篇咆哮的文章,我的目的也不是发泄或突出公司或个人的缺点。
如果我想让你从他的文章中得到什么的话,那就是你如何帮助更多的黑人进入人工智能的想法。
因此,如果您很着急,请向下滚动到“我能做什么”部分。
对于那些有更多时间的人,请尽情享受。
请务必阅读到最后,以便了解我在这里试图描绘的全貌,它并不全是黑白的。
AI 的子部分,按作者
为什么黑人个体在 AI 中很重要?
乔恩·泰森在 Unsplash 上的照片
要回答这个问题,我们得看一看 AI 和 AI 过程中省略黑人的后果。这将告诉我们为什么黑人个体在 AI 中很重要。
典型的人工智能过程包括数据收集、数据清理、模型实现、模型评估和部署。如果黑人人工智能从业者没有参与这些过程中的任何一个,那么在某些情况下,它可能会导致这些人工智能系统中固有的偏见。
我以前写过关于人工智能系统中的算法偏差的主题,请在这篇文章之后继续深入研究这篇文章。
这里有几个由于人工智能系统中的偏差和人工智能过程中的疏忽而发生的后果的例子。
- 2015 年,Jacky Alciné写了一条推特,表达了他对谷歌照片背后的分类算法的担忧。该算法将他的黑人朋友误归类为大猩猩。
- 2020 年 4 月,一个谷歌图片标签服务将一个手持物体的黑人误归类为枪。
- 最*在 2020 年 7 月,有消息称底特律警方使用面部识别系统不公*地指控一名男子没有犯下的罪行。
- 最后,一名黑人被捕,原因是面部识别系统将他的脸与安全摄像机镜头中的小偷的脸进行了匹配。
大多数机器学习从业者会告诉你,问题在于用来训练这些系统的数据集。这是真的。但我们也必须认识到,如果我们在人工智能中有更多的黑人个体,他们可能会对数据集的来源和方式带来更多样化的观点。
尽管如此,算法偏差的后果在当前变得更加明显,错误匹配和人工智能偏差事件的频率似乎在增加。
我们最*看到大量数据集被离线,原因是明显的种族和性别偏见内容,以及警方对面部识别系统的访问减少。
让我们回到这篇文章的要点。
那么,AI 工作/角色中有黑人吗?
让我给你提供一些目前人工智能行业中与人工智能相关的工作职位的例子。
常见的人工智能相关工作角色/职位。作者图片
左图:Qim Manifester 的照片,中图:Roberto Nickson 的照片,右图:Rahul Chakraborty 的照片
下面列出的这些角色负责 iPhone 上的面部解锁功能,或特斯拉汽车的自动驾驶功能。这些角色创造了你在智能设备上找到的 Alexa、OK Google 和 Siri。
我们已经确定了黑人需要参与的人工智能角色,以创建更少偏见的人工智能系统。
这些角色通常被归类为技术角色或“技术”角色。现在让我们看看哪些公司是技术和人工智能领域的重要参与者。
你大概能猜到几个。
顶级科技公司招聘人工智能角色,图片由作者提供
我们离答案越来越*了。
为了确定这些公司是否正在雇用黑人/非洲裔美国人担任与人工智能相关的职位,或者更一般的技术职位,我们必须参考其中几家公司的多元化报告。
公司的多元化报告是基于种族、性别、残疾、宗教或性取向等几个类别的员工分布的统计报告。
在我们进入这些报告之前,我必须指出,多元化报告仅涵盖美国公司的员工。
我无法想象在全球范围内观察多样性所需的数据汇总和员工普查计划。尽管如此,我们将集中精力,利用我们所拥有的一切。
但是请注意,这些数字可能并没有真实地反映分布情况,至少在全球范围内是这样。
让我们潜入更深的地方
这一部分的目的不是要指出公司或羞辱他们的多元化努力。
我希望在这一部分完成的是让你的读者直接看到主要技术公司内部种族分布的差异。然后自己决定黑人个体的数量是否过低。
我们的原问题“AI 里有黑人吗?”,现在已经转化为“”人工智能的关键人物是否雇佣了足够多的黑人/非裔美国人来担任人工智能的角色
让我们检查一下所提供的多样性报告中种族的总体分布情况,并仔细看看技术职位中黑人/非裔美国人的数量。在这些技术角色中,你会发现机器学习工程师、机器人专家和数据科学家。
不幸的是,这些报告没有包括基于职位的种族分布,但是总体的技术角色报告就足够了。
脸谱网
在过去的几年里,脸书因为几个不同的原因而成为头条新闻。最受欢迎的事件可能是 2018 年马克·扎克伯格就剑桥分析公司丑闻向美国国会作证。
不管怎样,让我们看看脸书的多样性报告。对于那些对完整报告感兴趣的人来说,你可以在这里获得它,以及人口统计数据。
以下包括的数字和图表侧重于 2019 年,并不反映脸书的现状。
2019 年,脸书黑人/非洲裔美国人的整体比例为 3.8%。可以说是最低的之一,当与其他被包括的种族相比时。
尽管如此,这比 2018 年温和增长了 0.3%,比 2014 年显著增长了 1.8%。
现在我们可以稍微细化一下,看看基于技术角色的种族分布。
2019 年,脸书只有 1.5%的黑人担任技术职务。如果我们只关注基于人工智能的角色,我们可能会发现这个比例要小得多,如果在 0.5-0.9%的范围内,我不会感到惊讶。
回顾六年前,在脸书,黑人在非技术岗位上的增长令人印象深刻。但相比之下,2014-2017 年间,技术岗位上的黑人增长几乎停滞,2017-2020 年间仅增长了 0.7%。
我会尽量避免用更多的数字来烦你,所以让我们以更快的速度看完公司多元化报告的其余部分。
网飞
我不想撒谎,我对网飞上瘾了。
作为一个技术人员,我对他们的推荐算法及其工作原理非常感兴趣。
他们似乎知道你想要什么;网飞系统背后一定有一些有才华的人。
网飞的人口统计数据更符合当前情况,因为它代表了 2020 年第三季度的人口分布,但请记住这只是美国的数据。
就网飞而言,美国网飞约有 7%的黑人/非裔美国人,其中 4%从事技术工作。
同样是最低的百分比之一。
微软
微软可以被视为科技公司的祖父,该公司目前已有 45 年历史。他们还拥有其他主要子公司,如 LinkedIn、GitHub、Skype 等。这里有一个链接到他们 2019 年的全面多元化和包容性报告。
微软的黑人/非洲裔美国人总数约为 4.4%。从下图可以看出,这比上一年有所增加。
公*地说,与前几年相比,所有的统计数据和数字都显示有所增加。我将介绍导致这种增长的一些举措。在我看来,这是一些解决方案的所在。
谷歌
让我们来看看谷歌的多元化报告来结束这一部分,其中包括今年、2020 年和上一年的一些数据。
就像其他科技巨头一样,黑人/非洲裔美国人的分布也很小,这也是一个进步。
请随时思考这些图表和统计数据。或者更好的是阅读完整的多元化报告,以更详细地了解上述公司的种族人口统计。
信不信由你,事情正在好转
上一节中的数字可能会引起一些读者的警觉;你们中的一些人可能甚至不会被数字所影响,因为你们可能已经猜到了黑人在技术岗位上的分布有多低。
但是如果我告诉你事情比以前好了,而且还在改善,那会怎么样呢?
上面提到的每一家公司都有致力于教育来自不同背景的未来人工智能工程师的计划、奖学金、倡议和奖学金。
让我给你举几个例子,也许你会找到一个对你或者你认识的人有用的例子。
- 脸书的 Techprep:这个*台旨在激励不同背景的人在科技领域寻找职业。它为学习者提供免费的编程信息和资源以及程序员可以获得的工作。该*台还容纳了希望更好地装备和激励他们的孩子或学员的学习者的支持者和家长。
- 由脸书编写的 CodeFWD:该*台面向教育工作者,为他们提供所需的工具,为来自少数民族背景、代表性不足的年轻学习者创建引人入胜的课程和活动。
- 脸书常驻工程师:脸书有一个项目,在脸书工程师的监督下,他们为公司内部的计算机科学本科生提供住宿。脸书工程师教授这些学生如何将理论知识直接应用到实际产品中。他们还提供信息和资源,以帮助该计划中的学生在脸书及其合作伙伴中寻找工作机会。该项目针对的是美国主要以黑人和西班牙裔学生为主的学院和大学。
- 网飞更多黑人内容:网飞的黑人员工制作了一份演示文稿,向高管们展示了网飞错过的黑人家庭市场中的一个机会。他们恳求高管集中一些资源,创造更多针对黑人家庭的内容。
- 网飞的包容性和多样性管理职位:网飞有一个管理职位,主要侧重于改善公司内部的多样性和包容性举措。Vernā Myers 目前担任这一职务。
- 谷歌对种族*等的承诺。随着种族紧张局势的加剧和美国黑人公民面临的无端警察暴行的曝光,谷歌发布了一份声明,概述了他们对改善黑人就业能力和谷歌内部员工关系的关注。
- 谷歌的免费计算机科学课程:这是一个面向学习者和教师的开放*台。该*台为学习者提供直观的课程活动,这些活动以实用编程为中心,如创建视频游戏。该*台还为教师提供了高效跟踪学生学习和工作所需的工具。
- 谷歌 code next该项目旨在通过为学生(高中生)提供放学后和周末参加的学习环境,培养下一代黑人和拉丁裔领袖。课程内容主要涵盖计算机科学和相关主题,如编程和解决问题。学生有机会用他们新学到的技能创建应用程序和工具。该项目还在谷歌员工和学生之间建立了一种导师-学员关系。
- 谷歌技术交流:这个交流项目倡议让黑人和西班牙裔学生能够进入谷歌的山景城校园,获得一些关于机器学习和其他基于技术的学科领域的知识
- DeepMind 奖学金项目:该项目提供的奖学金面向低收入背景的个人;非洲或加勒比遗产或妇女。
- 谷歌的目标是让更多的黑人担任高级职位。
“在美国,非裔美国人/黑人雇员的数量总体上增加了 17.3%,其中技术职位增加了 28.6%。”
— 微软多元化报告
这些只是本文中提到的一些科技巨头开展的一些项目和计划。正如你所看到的,在技术的发展和人工智能工具的开发中,有一些精力集中在教育和包括黑人社区上。
改进的速度很重要
在这一点上,我们可以看到在主要技术公司的技术职位中有少量黑人,在人工智能职位中的人数甚至更少。但我们也看到,有一些精力和重点放在让代表名额不足的族裔群体的人数增加。
因此,我们可以说,即使做了一些改进,这些改进的速度和影响也很重要。
如果这些科技公司正在分配一些精力和资源,本文的下一部分将提供你如何做同样事情的想法。
我能怎么做呢?
很高兴你这么问。
我将通过向可能正在阅读这篇文章的不同群体发表演讲来介绍这一部分,并包括他们如何帮助增加 AI 中黑人/非洲裔美国人的数量的方法。
这些是我的建议,但只要目标不变,你可以随意修改和完善它们。
黑人技术人员
我是如何进入科技行业的是一个有趣的故事,但长话短说,这完全是一个意外。
尽管我在科技领域的学术和行业生涯最初是一个意外,但我后来激励了我周围的人在科技行业内学习和工作。我教我的兄弟、堂兄弟和密友,并为他们提供资源,他们对技术表现出了最轻微的兴趣。
你也可以这样做,我相信你可能已经在激励你周围的人至少学习如何编码。
但是更进一步。向你生活中的人展示你制作的工具、你的工作流程,甚至把它们带到你的工作场所。所有这一切都将激发年轻一代的潜力,他们可以实现。
对于担任软件工程、数据分析师、前端开发人员和后端开发人员等角色的技术人员来说,你可能已经隐约涉足一些数据科学或机器学习。我恳求你大胆一试。你可能已经拥有了构建人工智能系统的技术技能,现在你只需要花几个月的时间挑选一些库和工具。
黑人非技术人员
这篇文章的一些读者可能是营销人员、会计师、银行家甚至放射学家,我相信你们都已经听说了人工智能和自动化将导致的即将到来的就业末日。
如果有人告诉你,你可以为你的工作领域建立这些人工智能系统,那会怎么样?
有机器学习程序比交易员更好更有效地交易股票市场;甚至有深度学习系统可以比放射科医生更快地对癌症 X 射线进行分类。
我想说的是,你从非技术角色过渡到基于人工智能的角色所需的技能只需要一个训练营或一个学位。
同样,不要害怕大胆尝试。
人人
无论肤色如何,每个人都需要能够对周围的人做三件事:鼓舞、激励和教育。
激励你周围年轻的黑人孩子;让他们知道,用一些游戏编程技巧,他们完全有能力构建游戏堡垒之夜。
激励你周围的人去寻求知识和新的机会。有些人已经具备了处理一些复杂问题的智慧。然而,他们可能缺乏勇气,只是需要一个好的支持系统。
教育那些愿意学习的人。当今时代,教育资源免费且丰富。它是如此的丰富,以至于对刚开始学习的人来说都是一种威胁。对于那些处于其他人渴望的位置的人,一定要给好奇的学习者提供信息,让他们能够穿过噪音,达到他们的目标。
如果你能走到这一步,我为你鼓掌。让我们结束这篇文章。我希望你已经从这里学到了一些东西。
AI 里有黑人吗?
是的,AI 里有黑人,就拿我来说吧,我是计算机视觉工程师。
但是人工智能里会有更多的黑人吗,当然!
也许问题可能不是顶级科技公司不想雇用黑人人才,问题也可能是一开始就没有大量的黑人人才可以受雇于人工智能角色。
我在 2018 年至 2019 年期间获得了计算机视觉和机器学习硕士学位,我可以用一只手数出我的同学中黑人学生的数量。但我的经历并不代表总的种族代表性。
我们需要鼓励年轻学生不要被机器学习、计算机视觉或机器人等专业角色吓倒。我们还需要告诉许多正在寻求职业改变的有才华的人,成为数据科学家或机器学习工程师只需要 3-6 个月的训练营。
更重要的是,这是一个值得的职业。
信息是关键。
我确信还有其他我没有提到的问题可能会阻碍黑人进入人工智能。我邀请你在评论区告诉我一些你认为也可以包含在这篇文章中的事情。
你在这件事上有责任…
towardsdatascience.com](/algorithm-bias-in-artificial-intelligence-needs-to-be-discussed-and-addressed-8d369d675a70) [## 你是什么类型的人工智能爱好者?
根据人工智能领域内的常用术语,衡量你在人工智能爱好者等级中的排名。
towardsdatascience.com](/what-type-of-artificial-intelligence-enthusiast-are-you-32ca88c01a7e)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 即将上线的视频内容 这里
- 跟我上 中
- 通过 LinkedIn 联系我
全国曲棍球联盟真的摩羯座多吗?
用数据科学测试占星术
拥有一个特定的星座会让你在某些职业中获得成功吗?这可能听起来是一个荒谬的问题,如果不是离谱的话。然而,从数据科学的角度来看,它的合法性不亚于学术研究人员和行业分析师每天都在研究的任何其他假设的相关性。你认为答案是什么并不重要;重要的是你能否用数据和统计数据来支持你的观点。在这方面,占星术提供了一个数据科学案例研究的极好来源,因为在所有丰富多彩的迷信背后,占星术最具挑衅性的问题实际上只是数据问题。因此,对占星术进行测试是展示统计推断、计算数据分析的基础知识的一个很好的方式,并且鉴于它引起的强烈反应,如何在检查一个有争议的话题时抛开你的个人偏见。(声明:我不相信占星术!)
此外,如果你仔细想想,占星学和数据科学的共同点比任何一门学科可能愿意承认的都要多。两人都认为可以从数字数据中得出关于个人和群体的有意义的推论。两者都有着制造极其复杂、高度特定、却又极其不准确的预测模型的不幸记录。对于占星术,有一种奇怪的坚持,即太阳、月亮和行星的坐标总是最相关的因素。
我在我的新书《天堂的计划:占星术的历史和在数据中寻找我们的命运》中探索了古代占星术和现代数据科学之间的联系(W. W. Norton,2020 年 1 月)。我的基本论点是,占星家是原始的数据科学家,这带来了所有的好和坏,即使在今天,或者更确切地说,尤其是今天,我们在生成和解释数字预测时,仍然在努力应对许多相同的模式匹配陷阱。正如我在书中所写的,
“占星家是他们那个时代的定量分析师和数据科学家,我们这些热衷于用数字数据来解开我们自己和我们的世界的秘密的人,只要承认其他人以前走过这条路就行了。”
作为一个恰当的例子,个人是否可以用性格类型来标记,以及这些类型是否适合特定的职业,这个问题实际上几千年来一直令人感兴趣。这又把我们带回了手头的问题:有什么职业显示出与黄道十二宫的相关性吗?为了回答这个问题,我们需要三样东西:
- 我们需要确定职业,在这些职业中,大样本的出生日期是已知的和可获得的。
- 我们需要将黄道十二宫的开始日期确定为日历年的函数,这样我们就可以将出生日期映射到星座上。
- 最后,我们需要选择一个统计测试,它能告诉我们是否有任何星座在我们的数据中被显著地过度呈现
对于这个项目,我使用了标准的 Python 数据科学包 NumPy、Pandas 和 Matplotlib,以及 BeautifulSoup 进行 web 抓取。然而,每一步都相对简单,应该很容易适应其他语言,比如 R、Scala 或 Julia。
第一步。收集生日数据
如今,网上不乏生日数据;唯一的限制是你的好奇心和浏览网页的能力。在的天堂计划中,我对职业与黄道十二宫的相关性的调查是由一首名为 天文学 的古代占星诗的讨论激发的,这首诗是生活在基督时代的一位名叫马库斯·曼尼里乌斯的罗马占星家的作品。尽管它出现的时间相对较晚——很晚,也就是说,鉴于占星术起源于——《天文学》实际上是从古代流传下来的最古老的占星术及其方法。也包含了最古老的十二生肖性格类型的描述。这些中的许多在今天的星象杂志中仍然可以辨认出来。举例来说,金牛座在罗马时代似乎同样缓慢而固执,天秤座也同样墨守成规。
马尼利乌斯与每一个黄道星座相关的职业很大程度上是基于星座本身;例如,双鱼座据说是优秀的水手,而天秤座是一流的法官。然而,我很快发现,最有趣的发现来自职业体育领域。
职业运动员是星座分析的绝佳对象,因为他们非凡的天赋使他们天生迷人,而他们的名气反过来又使他们的生日很容易在网上找到。你也不必担心样本偏差问题,因为你通常可以得到所有玩过这项运动的人的出生日期。对于职业曲棍球来说,HockeyDB.com 网站是一个无与伦比的宝库。为了方便我们, HockeyDB 在按字母顺序排列的网页上列出了国家曲棍球联盟(NHL)每个球员的生日。因此,只需使用 BeautifulSoup 进行几行 html 解析,我就能够检索到超过 7000 名当前 NHL 前玩家的出生日期列表,并将其存储在 Pandas 数据帧中。
第二步。确定每年的生肖开始日期
我们分析的下一步是将生日映射到黄道十二宫。这可以通过 dataframe apply 来实现,它将个人的出生年月日作为输入,并将其与之前计算的黄道起始日期表进行比较。主要的困难是这些生肖的开始日期会随着年份的不同而稍有变化。例如,标志着摩羯座开始的冬至发生在 2019 年 12 月 22 日,但将发生在 2020 年 12 月 21 日。
根据我的经验,我发现每个人,不管他们对占星术的感觉如何,都知道自己的星座。然而很少有人知道这些是如何定义的。事实上,这些占星量是根据纯粹的天文计算确定的。尽管有星座的名字,黄道十二宫和星星没有任何关系;相反,从地球上看,它们指示太阳沿其视在轨道的位置。更具体地说,十二个星座表示太阳黄道经度的整数分 30 度。例如,在天文春分点,太阳有黄道经度 0,这标志着白羊座黄道星座的开始。金牛座从黄道经度 30°开始,双子座从 60°开始,以此类推。
然而,知道这一点并不等同于能够计算出来。对于任何对计算天文学感兴趣的人,我强烈推荐让·梅乌斯的必不可少的书,(威尔曼-贝尔,1998),该书提供了计算任何时期太阳坐标的公式。然而,一种更简单、更准确的方法是通过他们的地*线在线星历系统,直接从 NASA 自身查询这些信息。这项服务由加利福尼亚州帕萨迪纳的喷气推进实验室(JPL)维持,向公众提供用于星际航行的航天器使用的同样的高精度天文数据。深入研究 HORIZONS API 的细节将是另一篇文章的主题,但他们的 web 界面尤其令人耳目一新,用户友好。**
要确定给定年份的黄道起始日期,您只需每隔一天查询一次太阳的黄道经度,或者为了更精确,每小时查询一次。十二个黄道十二宫开始于这个数量经过 30 的偶数增量的日期。无可否认,这种方法有些低效,因为如果每天只查询一次太阳的位置,那么对于任何给定的年份,只需要 365 或 366 个值来标识 12 个日历日期。然而,这种方法的优点是它是精确的,并且在你计算一次之后,你就不需要再计算一次了。
第三步。测试假设
步骤 1 的结果是当前和以前的 NHL 球员的数据框,由球员姓氏索引,具有包括球员生日在内的各种统计数据的列。步骤 2 的结果是在数据框中添加一个新列,列出每个玩家的星座。一个简单的分组和计数操作会生成下面的汇总表,我们也可以将其绘制成直方图(图 1)。
**Table 1\. NHL Players Grouped by Zodiac Sign
╔═════════════╦═══════╗
║ Sign ║ Count ║
╠═════════════╬═══════╣
║ Aries ║ 714 ║
║ Taurus ║ 723 ║
║ Gemini ║ 624 ║
║ Cancer ║ 604 ║
║ Leo ║ 559 ║
║ Virgo ║ 598 ║
║ Libra ║ 533 ║
║ Scorpio ║ 506 ║
║ Sagittarius ║ 470 ║
║ Capricorn ║ 639 ║
║ Aquarius ║ 733 ║
║ Pisces ║ 714 ║
╚═════════════╩═══════╝**
作者图片
表 1 包含了我们将用来检验某些星座是否在职业曲棍球运动员中出现过多的数据。但是怎么做呢?简单地看直方图是不行的,不管它看起来多么有启发性,因为外表可能很有欺骗性,尤其是当样本量很小时。需要一个定量的统计测试来给我们更多的信息。
幸运的是——这也是为什么像这样的黄道分析是教授统计学的一个好方法的另一个原因——我们关于黄道十二宫的问题可以被改写成教科书式的统计假设检验。事实上,我们可以使用有史以来最早设计的统计检验之一:卡尔·皮尔逊卡方检验。皮尔森的测试,他在 19 世纪 90 年代不断完善,最初被用于评估掷硬币、掷骰子以及著名的蒙特卡洛轮盘赌的公*性(他发现,这根本不公*)[1]。令人惊讶的是,数学经常揭示两个看似不同的问题实际上是相同的,事实证明,我们关于黄道十二宫的问题在数学上等同于检查 12 面骰子的公*性。
换句话说,作为假设检验,我们的零假设, H₀ ,是职业曲棍球运动员的出生日期和任何特定的黄道十二宫没有关联。更具体地说,我们将把 H₀ 定义为 NHL 玩家星座的基本分布是均匀的——也就是说,NHL 玩家拥有特定星座的概率与任何其他星座的概率相同,即 1/12。在 H₀ 下,我们在数据中看到的任何偏离完美一致性的情况都可以被解释为最有可能来自随机噪声。另一个假设 H₁ 断言,观察到的均匀性偏差足够大,不太可能是由随机噪声引起的。
**Null and Alternative Hypotheses
════════════════════════════════
H0: probability(zodiac sign) has a uniform distribution
H1: probability(zodiac sign) does not have a uniform distribution**
请注意,我们的均匀分布的零假设的优点是,我们不需要测试与每个星座的相关性;在这方面,就好像我们用一个测试的价格得到了十二个测试。
要进行皮尔逊卡方检验,我们需要知道三个量:
- 根据我们的数据计算的皮尔逊卡方统计χ
- 适合我们数据的自由度ν
- 我们测试的显著性水* α 。
皮尔逊的χ
皮尔逊的卡方统计量χ对于参加过大学水*实验室测试的人来说可能很熟悉,其计算方法如下:
等式 1
这种形式可以作为二项分布对多项分布的扩展。在大数极限中,每个类别中的结果都接*以该类别的期望值为中心的正态(高斯)分布。皮尔逊卡方统计量是这些准正态分布值的*方和,接*真正的卡方分布。
在零假设下, H₀ ,玩家的出生日期均匀分布在十二个星座上,所以每个类别的期望值就是简单的 N ,样本大小,除以类别数,即 12。在我们的例子中,样本大小 N ,是 7417。因此,每个星座的 NHL 玩家期望数为 7417/12 = 618.1。(可以肯定的是,这是一个相当不实际的曲棍球运动员人数,但统计学家并不关心这个数字。)使用该值,将表 1 中测得的计数直接代入等式 1,得到:
自由度,在我们的例子中,玩家的星座有 12 种可能的结果,因此有 11 个自由度
显著性水*,α
α的值是我们要选择的参数。社会科学研究中使用的标准显著性水*为 0.05。这意味着,在零假设下,任何出现概率小于 5%的χ值都被标记为“显著”。相比之下,在粒子物理学中,标准的显著性水*是 1/350 万。**
一个“显著”的结果是否有意义或有趣,完全由测试者自行判断。这种花招是许多研究中许多错误的根源,也是社会科学中复制危机的主要原因。我认为,这也是现代统计学与占星术的共同点,复杂的算法为实际上非常主观的结论提供了客观的外衣。就我们的目的而言,我们简单地指出,任何统计测试的重要结果主要是作为在何处寻找更深层次的提示性指标。它不是一个充分条件,甚至不是支持一个结论的必要条件。
执行测试
我们现在有了进行皮尔逊卡方检验所需的三个要素。回到等式 1,很明显,我们测量的计数越接*预期的计数,我们的χ就越小。相反,我们的样本越不*衡,我们的χ就越大。那么我们的结果 143.8 在哪里呢?这是皮尔逊卡方检验回答的具体问题。
接下来,我们简单地将根据我们的数据计算出的皮尔逊卡方统计χ与临界值标准表进行比较,给出参数ν和 α 。对于ν = 11 且 α = 0.05 的测试,上尾临界值列为 19.675。我们的测量值 143.8 远高于这一临界值,这意味着,在均匀分布的黄道十二宫的零假设下,我们预计获得这一结果的几率不会超过 5%。因此,我们的结果被认为是测试的“重要”结果。这反过来表明,拒绝均匀分布的黄道十二宫的零假设是有统计学依据的。
换句话说,证据表明,是的,职业曲棍球运动员比其他人更有可能有某些星座。
相对年龄效应
你对这个结果感到惊讶吗?我当然是。但是好的数据分析的价值在于它能够揭示一些你以前不知道的东西;否则,整个练习只不过是证明你已经相信的东西的一种精心制作的方式。然而,正如我们在上面所断言的,统计假设检验的结果既不是对这个世界做出任何有意义的推断的必要条件,也不是充分条件。相反,这些测试提供了一种便捷的方式来识别值得深入研究的主题。这当然适用于像我们这样奇怪的结果,这似乎意味着你的星座与你的曲棍球实力有某种联系。
我在进一步研究中发现,这种与恒星或行星完全无关的现象已经被了解和研究了几十年[2]。这被称为相对年龄效应,它在依赖于年龄界限严格的竞技青年联盟的体育运动中相当常见。
例如,青少年曲棍球联盟通常根据球员出生的日历年对他们进行分组。这意味着一个出生于 1 月 1 日的球员将会比他出生于 12 月 31 日的队友大将*一岁,尽管他们属于同一个年龄段。对于 9 岁或 10 岁的球员来说,这种差异代表着巨大的发展优势,无论是身体上还是精神上。由于只有某一年的最佳选手才有可能进入下一个级别,累积效应是一个逐渐淘汰射手座、天蝎座和天秤座而支持摩羯座、水瓶座和双鱼座的系统,甚至在这些选手成为职业选手之前。如图 1 所示,最终结果是惊人的。
类似的偏见也出现在美国职业棒球大联盟和国家足球联盟中,前者的球员倾向于八月生日,后者的球员倾向于一月生日。有趣的是,在有组织的青年联盟不太重要的篮球运动中,没有观察到相对的年龄效应。
相对年龄效应会在体育之外的任何地方出现吗?大多数地方的学年都有一个秋季截止期,一些研究声称,可以在学术成就、工作成功和一系列其他影响我们生活的指标中找到偏见。如果是的话,那么影响是很小的。然而,正是这种发现之前未知的相对年龄效应的诱人可能性,使得分析不同职业的生肖成为一种有趣的数据科学转移。
除了已经讨论过的职业,我还关注了国会中的共和党人和民主党人、最高法院法官、奥林匹克水手和英国足球运动员。对这些群体来说,没有一个数据支持拒绝出生日期全年均匀分布的假设。(当然,请注意,通过采用 0.05 或 1/20 的显著性水*,我可以确保*均而言,20 个调查中有 1 个会产生完全偶然的显著结果。)我知道还有一个众所周知的大群体,他们的生日呈现出明显的、不一致的模式,但我将在另一个时间讨论这个问题——或者你可以在我的书中读到它!
最后,我希望这个练习能提供一个迷人而难忘的例子,说明统计学和数据科学是如何帮助我们理解我们生活的世界的。有了数据,你永远无法准确预测你会发现什么。对我来说,这使它的启示力量比占星术承诺的任何事情都更令人兴奋。
参考
[1]亚当·库恰尔斯基,《完美的赌注:科学和数学如何把运气从赌博中剔除》(纽约:基础图书,2016),第 4–7 页。
[2]特别参见马尔科姆·格拉德威尔,局外人:成功的故事(纽约:Little,Brown 出版社,2008 年),第一章。1.
这些足够相似吗?
人工智能笔记
这是一项重要的数据科学技能,而您以前并不太关心。
当您想要度量两个对象(文档或图像)之间的相似性时,您总是会遇到一些重要的问题,比如“定义相似性的正确方法是什么?”,“我们如何衡量相似性?”,以及“我们应该如何分析相似性度量?”。我对相似性的概念着迷了很长时间,这就是为什么我想与你分享我多年来获得的一些见解。我无法在一篇文章中描述所有的细节,但我会尽可能地阐明这个话题。
—任何不同于解释的相同主体。
我们人类有一个复杂的系统来解释相似性。相似性的概念,不管它必须如何被测量,在不同的环境和问题中是不同的。如果两个物体完全相似,就没有解释的余地。然而,任何不完全相同的解释主体。对象可以是任何东西,如时间序列、文档或图像。
如果需要,人类可以根据问题要求进行大量的处理任务,如旋转或*移。然而,如果没有一系列的编程和训练,这是人工智能解决方案无法完成的。例如,如果以下图片相似,您认为它们有多相似。如果相似意味着具有相似的元素,那么它们是相同的;否则,他们是完全不同的。
两幅图像包含相似的元素。但是它们相似吗?来源。
兔子和鸭子错觉是另一个有趣的例子。同一个形状,不同的角度可以有不同的解读。这显示了角度或旋转在人类解读图像时的重要性。因此,您必须时刻注意算法对输入数据角度的敏感性。你有时需要一个旋转不变的算法,有时需要一个旋转变化的算法。
鸭子或兔子错觉
—我们根据不同的特征来比较物品。
如上所述,任何不完全相同的事物都要被解释。现在,问题是“相似性的主要特征是什么?”。如果我们能够恰当地阐述我们想要测量的相似性方面,那么公式化就会变得容易得多。由于第一部分是使用图像数据来解释的,所以我将基于文本数据来解释这一部分,以展示高级概念适用于任何类型的数据,而不管其类型如何。
在文本处理中,我们有三种主要类型的相似性度量,包括词汇(或形式相关)、句法(或结构相关)和语义(或意义相关)。使用这些措施中的任何一个都不会忽视其他措施的重要性。两个句子在形式上可能相似,但在意义上可能大相径庭。
最简单的文本数据是一系列字母或字符串,它们可能有意义,也可能没有意义。两个字符串之间的相似性可以通过不同的方法来测量,例如基于编辑 距离的或基于标记的。我不想解释您必须如何实现这些方法。我想强调的是,即使是最简单的相似性也可以用不同的方式来衡量。数据长度越大,相似性概念就越复杂。因此,您必须做好准备,以便在文档相似性等数据中遇到长度更大的复杂相似性概念。
在文本处理中,我们有三种主要类型的相似性度量,包括词汇(或形式相关)、句法(或结构相关)和语义(或意义相关)。使用这些措施中的任何一个都不会忽视其他措施的重要性。
—必须正确分析相似性度量的行为。
当您想要使用数学公式来度量相似性时,复杂性就出现了。有各种方法来计算两个对象之间的相似性或距离,我在上一节中简要解释了这些方法。在这一节中,我想描述分析相似性度量行为的重要性,而不考虑计算方法。
一般来说,我们可以在有所考虑的情况下互换使用相似度和距离。例如,相似性和距离是相反的,所以如果两个物体非常相似,这意味着它们之间的距离很小。这就是为什么在很多情况下,相似度(x,y)=1 -距离(x,y)或者相似度(x,y)= 1 /距离(x,y)。这两种方法中的任何一种都对相似性度量施加不同的敏感度,当您想要在机器学习算法中使用它时,这变得至关重要。
由向量表示的数据点的每个维度中的小变化可能会显著扭曲高维空间中的向量,这与向量相对不扭曲的二维空间相反。
相似性度量根据表示对象的空间维度而不同地工作。例如,如果二维空间中两个对象之间的余弦相似度为 0.9,则可以称这些点为相似点。然而,你可能无法在具有该阈值的高维空间中得出相同的结论。再加上,如果 cos(x,y) = cos(x,z) = 0.9 你几乎无法对高维空间中 y 和 z 的关系做出任何有用的结论。相反,你可以在一个基于空间几何的二维空间里得出有用的结论。这些观察表明,您必须根据空间维度不同地使用余弦相似度。
最后一句话
在机器学习中,尤其是在聚类技术中,您必须不断地使用相似性或距离度量。例如,聚类技术中的一个主要步骤是确定新点所属的聚类。在这种情况下,您必须计算新数据点和聚类质心之间的相似性,并将其与阈值进行比较。
在许多应用中,您可以简单地使用欧几里德距离或余弦距离。但是,如果你想成为数据科学领域的专家,强烈建议你深入学习相似性概念。我不能说这将单独解决你所有的问题,但它是你工具箱中的一个重要工具。
感谢阅读!
如果你喜欢这个帖子,想支持我…
[## 通过我的推荐链接加入 Medium—Pedram Ataee 博士
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
pedram-ataee.medium.com](https://pedram-ataee.medium.com/membership)
确定您需要的云工具的智能而简单的方法
你首先关注职位还是公司?
来自佩克斯的亚历山大·帕萨里克拍摄的迪拜城市景观
首先,作为一名数据工程师,我可以告诉你,有这么多工具需要担心,但只有少数工具是你真正会用到的!
其次,当你研究和筛选工作机会时,你会遇到很多工具。Hadoop,Spark,AWS Lambda,TensorFlow,Kafka,Google Pub/Sub,Airflow,Hive,Azure Data Lake,Kubernetes 等等。有些甚至在一个开口中包含了几种语言、框架和工具!
事实是,你永远不需要知道大部分,也绝对不需要知道全部。
通过这三个简单的步骤,你可以找到符合你职业目标的工具。
- 了解数据科学*台的要素
- 了解传统数据科学角色和职责
- 首先关注公司,而不是职位
数据科学*台要素
了解公司中数据科学*台的要素非常重要。一个*台可以是内部的、完全基于云的或部分基于云的(混合)。亚马逊网络服务(AWS)、微软 Azure (Azure)和谷歌云*台(GCP)是一些使用最广泛的云*台。
LinkedIn 顶级语音数据工程师 Andreas Kretz 创建了一个了解任何数据*台的蓝图。他取消了所有工具,以便根据公司不断变化的需求进行调整。
数据科学*台蓝图由 Andreas Kretz
蓝图的模块传达了团队中各种互补的任务。
连接
- 从数据源(API、数据仓库或关系数据库)中提取数据
- 将数据发送到您的 API 服务以存储在临时存储中(以允许后面的模块快速访问)
几个工具:REST APIs,Apache Flume,AWS API Gateway,Azure Event Hub,GCP 云数据流
缓冲器
- 在存储之前,将数据从 API 发布到缓冲区消息队列中
- Buffer 允许您管理数据负载,避免系统不堪重负
少数工具:Apache Kafka、Apache Redis Pub-Sub、AWS Kinesis、Azure Data Factory、GCP Pub/Sub
处理框架
- 以流(实时数据)或批(数据区块)的形式分析数据(存储中)
- 一些用例可能还要求您将数据写入存储
一些工具:Apache Spark,MapReduce,AWS Lambda,Azure Databricks,GCP 计算引擎
商店
将缓冲区中的数据存储在存储模块中
一些工具:SQL 数据库,NoSQL 数据库(Hadoop HDFS,MongoDB 等。)、NoSQL 数据仓库(Hive 等。),AWS 红移,Azure 数据湖,GCP BigQuery。
设想
- 将数据中的见解可视化
- 设置一个网络用户界面,一个移动应用程序,甚至一个数据可视化工具
- 或者,创建一个 API,为开发人员提供对商店模块中数据的访问
- 使用 API,用户可以为他们的业务案例开发定制的可视化
少数工具:Android 和 iOS 应用程序,仪表盘(Grafana,Kibana 等。)、Web 服务器(React、Tomcat 等。)、数据可视化工具(Tableau、Power BI 等。).
在数据科学蓝图中,专业化在最*几年加速发展。理解这些角色会让你深入了解团队内部的协作。
传统角色和职责
数据科学团队聚在一起解决复杂的数据问题。传统数据科学团队中的每个角色都有特定的词汇表。
有数据科学家、数据工程师和数据分析师,但也有混合角色,如机器学习工程师!
数据科学家
这无疑是最受欢迎的角色。
- 他们应用统计学和算法的理论知识来寻找解决数据科学问题的最佳方法。
- 他们将业务问题转化为数据问题,创建预测模型来回答问题,并讲述他们的发现。
数据工程师
可靠的数据基础设施的提供者。
- 他们专注于编程来处理大型数据集,清理数据并实现来自数据科学家的请求。
- 他们构建和维护项目的数据架构,并确保服务器和应用程序之间的数据流不会中断。
机器学习工程师
- 他们接受数据科学家的分析,并将其部署到生产中。
- 这是因为数据科学家传统上不是处理万亿字节数据并将其代码实施到生产中的工程师。
数据分析师
- 他们进行调查,提供报告和可视化来解释数据中隐藏的见解。
- 它们通过图表和仪表板帮助公司员工理解特定的查询。
不同公司的两位数据科学家或数据工程师,甚至同一家公司的两位数据科学家或数据工程师,可能从事完全不同的工作。
所以,首先关注公司——而不是职位头衔
首先关注公司,而不是职位
试着找几个真正适合你工作和发展职业的公司(想想文化、机会、人脉等等)。
确保入围公司拥有相似的数据科学*台架构。例如,你可以通过查看他们在职位空缺中要求的工具来了解一家公司的结构。从同一个提供商那里将他们的系统部署到云上的公司共享许多工具。
接下来,确定特定数据科学角色的交付成果。
您需要在生产环境中编写代码吗?您需要创建数据管道吗?您是否将使用可视化工具对内部数据执行分析?
可交付成果详细描述了候选人日常工作的性质。而职位描述是为了鼓励具备各种技能的候选人去申请。
之后,列出你获取技能并通过项目实施所需的工具。您可以根据蓝图中的每个模块对工具进行分类。
由于你的入围公司有相似的数据*台,你将淘汰市场上的大多数工具。您现在只有少量的工具来构建您的项目。
结束语
一旦你有了相关的经验,不仅仅是在 GitHub 上发布代码,而是在 Medium 或 LinkedIn 上为你的项目写一篇详细的博文。为自己创建一个投资组合。这给了你更多的曝光率,也体现了你对自己工作的深刻理解。
有了相关的经验和曝光率,你会和大多数招聘经理有联系。因为他们看到你知道如何利用他们所使用的工具!
感谢阅读!我很想在下面的评论中听到你的想法。你也可以关注我的 LinkedIn 和Twitter。
如果你觉得这篇文章可能对你认识的人有所帮助,请与他们分享这个链接:https://bit.ly/36Dpj2Z
推特情绪是否反映了 2020 年新加坡大选的结果?
利用 VADER 和伯特,我分析了与新加坡执政党在 2020 年大选前夕相关的推文情绪。
阿诺·杰格斯在 Unsplash 上的照片
一个多月前的 7 月 10 日,新加坡举行了第 14 届国会议员选举。作为第一次投票的选民,当你有很多空闲时间的时候,你会做什么?你进行了一项快速研究,分析推文的情绪,看看它们是否反映了选举的实际结果。好吧,我想我可能是唯一一个以这种方式思考的人(书呆子警告),但无论如何,让我们直接进入它吧!
下载推文
使用 Tweepy API,并借助格里芬在这篇文章中使用的代码,我下载了使用“PAP #GE2020”作为搜索词的推文。
PAP 代表人民行动党,是新加坡的执政党。大多数在推特上发布关于 2020 年新加坡大选的人都使用 GE2020 标签。
我仔细考虑了一下什么是合适的搜索词——简单地使用#GE2020 不太正确,因为收集的推文也包括那些反映公众对反对党情绪的推文。虽然我使用的搜索词会排除那些没有提到人民行动党或使用标签 GE2020 但实际上是在谈论执政党的推文,但我觉得这是我能够最接*于隔离反映对执政党情绪的推文的方法。
我也选择了转发,因为我认为 Twitter 用户倾向于转发他们有共鸣的推文。我的数据集包括 7 月 6 日至 7 月 8 日之间发布的推文和转发,自投票日(7 月 10 日)即将到来以来,这里的在线政治讨论可能是最活跃的。顺便说一句,你可能想知道为什么 7 月 9 日被排除在外,因为这一天是冷静日,在这一天禁止竞选活动,以便让选民在第二天前往投票站之前退一步思考问题。
我原本希望收集 50000 条推文和转发,但最终得到了大量重复的数据,可能是因为在短短 3 天内,没有多少推文符合我的搜索词标准(我还忘了,新加坡的公民人口约为 350 万(T1),从一开始就不算多)。我的最终数据集包括 2504 条推文和转发,以及 406 条独特的推文。
现在,你可能会好奇这些推文中有哪些常用词。让我们创建单词云来了解一下吧!
推文和转发的词云
在包括推文和转发的词云中,一些可能令人感兴趣的术语包括“WP”,代表工人党,“Hougang”和“Aljunied”,这是目前由反对党控制的选区。在推特上频繁提到这些术语可能表明,工人党是最受关注的反对党,Hougang 和 Aljunied 选区可能是即将举行的选举中受到密切关注的选区之一。另外两个反对党,PSP(进步新加坡党)和 SDP(新加坡民主党)也经常在推特上被提及。
“仅用于推文的云”这个词怎么样?
仅用于推文的词云
我们观察到推文中常用的词汇种类要多得多,但工人党仍然是许多推文中的突出主题。
虽然词云允许我们在我们的数据集中挑选出推文中的常用词(到目前为止这并不太令人惊讶),但我们不知道这些推文的情绪是什么样的。这就把我们带到了下一部分,我用 VADER 和伯特进行了情感分析。
使用 VADER 的情感分析
我相信大多数人都非常熟悉 VADER (化合价感知词典和情感推理器),所以我不会在这篇文章中用冗长的解释来烦大家。相反,我将直接进入我的发现,在那里我展示了被分类为携带积极、消极或中性情绪的推文的分类。
推文和转发的推文情感分类
对于包含转发的数据集,VADER 将大多数推文分类为正面,四分之一为负面,略少于 10%为中性。
仅针对推文的推文情感细分
在排除转发后,VADER 将一小部分推文归类为正面,但这一比例仍略高于 50%,其余推文在负面和中性之间相当*均。
显然,VADER 不太擅长讽刺
我快速浏览了一下分类推文,意识到 VADER 在使用讽刺时往往无法察觉正确的情绪,这并不令人惊讶。在这个例子中,推文表达了对执政党的负面情绪,但 VADER 却表达了正面情绪。哇,尴尬,确实(抱歉,我没忍住)。
使用 BERT 进行情感分析
BERT(来自变压器的双向编码器表示)是 Google 开发的最先进的 NLP 模型, Rani 的文章很好地解释了它的内容。
出于这项研究的目的,我将使用由 Preston 使用 Kaggle 航空公司 Twitter 数据集微调的 BERT 模型,详见他的文章 here 。
伯特是如何对推文进行分类的?
推文和转发的推文情感分类
当转发被包括在内时,伯特将大多数推文归类为负面,这与 VADER 的分类大相径庭。
仅针对推文的推文情感细分
当只考虑推文时,BERT 将一小部分推文归类为负面,但它仍然是大多数人的观点。
还记得那条被 VADER 错误归类的讽刺性推特吗?让我们看看伯特是否能找到正确的情绪。
在这里,伯特很好地处理了讽刺性的评论
伯特成功检测出这条推文中的负面情绪!
但是伯特也不是完美的
我快速浏览了一些由模型分类的推文,意识到伯特有时很难发现正确的情绪。在这里,我们看到一个消极情绪的例子,但是伯特把它错误地归类为积极情绪。话又说回来,即使我作为一个人也发现有时很难正确识别情感,所以我们怎么能指望机器完美地完成工作呢?
实际的选举结果是什么样的?
总结 2020 年新加坡大选的实际结果,虽然人民行动党保持了在议会的绝对优势,但它失去了一个额外的选区(Sengkang ),输给了工人党。人民行动党的*均得票率下降到 61.24%,这是自 2011 年选举以来的最低得票率。
即使在存在讽刺的情况下,伯特也可能是正确分类情绪的更好模型,但鉴于它在 Twitter 上检测到的主要是负面情绪,我预计投票会更加激烈地偏离执政党。或许,在转向社交媒体表达政治观点时,存在一定程度的自我选择——在推特上发声更多的人往往是执政党的批评者,而执政党的支持者更有可能在社交媒体*台上保持沉默。
另一个可能的解释是 Twitter 用户的人口统计数据。推特用户往往更年轻,这意味着即使没有表达政治观点的推特用户的自我选择,推特观点也只能代表新加坡人口的一个子集。
包扎
这项研究的一个有趣的延伸是对新加坡更突出的反对党,如 WP,PSP 和 SDP,进行同样的过程,然后比较情绪的比例与 PAP 的比例。
总而言之,我从这个无聊的宠物项目中获得了很多乐趣,所有相关的代码和文件都可以在 GitHub 这里找到!
免责声明:本文观点完全属于我个人,绝不代表我所属组织的观点。
Void 方法不好吗?
编码最佳实践
为什么要避免它们,什么时候不要。
Void 方法定义(图片作者: Pratick Roy )
元
深入探究无效方法的本质和相关的副作用。为什么你应该尽量避免它们。以及那些你不该做的事。
虽然我试图用标题来表达这篇文章的主题,但在上面的段落中,我还是添加了这篇文章的简短描述。这有两个目的。
- 搜索引擎优化😅
- 过去无数次,我点击了一个链接,读了几段才意识到那不是我要找的。所以作为一个好撒玛利亚人,我想给你一个快速的出口点,以防你来这里期待别的东西。
Tldr;有时间吗?阅读全文。否则搜索“
再次按照我自己的阅读模式,有时我想阅读并从帖子中吸取一些东西,但没有时间,或者有时,我大致理解并同意这个主题,所以不想费力地阅读所有文本,只是看看是否有任何新的信息或观点可以从中收集。结果整个帖子,我都标注了: 键外卖 。我鼓励你阅读整篇文章,但是如果你愿意的话,可以点击可信的 Ctrl/Cmd+F .😃
不返回任何东西的方法、函数(或者任何你想称之为它们的东西),也就是具有 void 返回类型的方法、函数,是编程的主要部分。事实上,它是所有 Java 开发人员看到的第一个返回类型。
如果您不是 Java 开发人员,那么,
你先生/女士,是一个没有勇气的恶棍,没有勇气,我说!😛
—约翰·奥利弗
但是不管您选择的是哪种编程语言,您肯定都遇到过 void 方法的概念。因为在我们的二元世界中,void 方法无处不在。这些方法如此普遍,我们如此熟悉,以至于我们很少停下来想一想,我敢说,它们是多么怪异,多么阴险。
因为想想看,一个 void 方法不提供任何输出。那么为什么会有人写一个方法,然后只为了不返回任何东西而调用它呢?对于 Ex 来说,
没有一个头脑正常的人会创造出这样的方法。我们不能用这种方法,来建造任何有价值的东西。我们可以用不同的值调用这个方法一百万次,但这无关紧要。 【关键外卖 1】
就其本身而言,Void 方法是死代码。就像病毒一样。它本身不能“活”在编程的世界里。就像病毒需要宿主真正活着一样。无效方法需要副作用[1][2]才能真正存在。
现在让我们修改上面的代码,引入一些副作用。
现在让我们看看这段代码。每次调用add()
时,作为副作用,加法器类的状态会改变,实例变量cumulativeValue
会增加value
所以现在我们可以用这个来达到某种目的。在这种情况下,我用它来查找从 0 到 9 的所有数字的总和。因此再次重申。
Void 方法本质上是依赖于副作用的方法。如果一个方法没有产出,没有副作用,没有人会写它,也没有人会调用它。
“嗯”,现在可能会说。“如果没有副作用,无效方法就没有意义。酷毙了。我只介绍副作用并加以利用”——说得对。标准编程语言[3]中没有任何东西会阻止你这样做。编译器会毫无疑问地通过它。但是你的代码审查员应该阻止你。而如果审核人是我。那我会的!
你看,当你写一个 void 方法的时候,你实际上是在向世界声明,这个方法是通过副作用工作的。还有,代码或者有状态编程中的副作用,就是代码味。这使得你的代码难以阅读,甚至更难调试和扩展。
所以推而广之,这就引出了一个问题,
void 方法不好吗,我们应该永远不使用它们吗?
— 井、是和否一般是。如果你能写一个方法,它可以工作而没有副作用,那么你一定要写。在大多数标准编程中,你将能够完全避免空洞(看我是怎么做的,嗯..啊..没人吗?好吧)。但是,这很重要,有些事情本质上是有状态的,当这种情况发生时,我不仅会认为 void 方法是可接受的,还会推荐它们。
现在,我明白了,上面的回答似乎有点混乱,在某种程度上自相矛盾。所以,让我们观察一些在行动中的虚空方法,并了解什么使好或坏。
无效方法不正确
一般来说,坏的空是指底层操作不需要状态全满,或者引入副作用。为什么?为了理解这一点,让我们扩展一下我们的加法器类。
现在我们已经为我们的加法器类添加了一个简单的逻辑扩展。reset()
。这个方法本质上是将cumulativeValue
重置为 0,这样我们就可以再次使用加法器了。
逻辑不是封装的
然而,即使在这个简单的例子中,我们也开始发现问题。在随后的add()
之前没有调用reset()
意味着错误的加法。
在这个例子中,错误很容易避免。但这是因为我们在这方面有明显的优势。我们完全了解代码的内部工作原理,并且我们是唯一的作者。现实生活中我们有多少次有这种优势?几乎没有。回想一下,
你关闭过的所有资源了吗?更重要的是,您是否总是知道资源是否需要关闭?
我想说的是,引入状态通常会导致客户必须负责任地使用您的代码,否则会导致问题。虽然我完全信任你的开发伙伴,但我自己也赞同这样的理念: 【关键要点 2】,
为了按预期使用我的代码,越少人需要知道和理解我的代码,越好。你的截止日期快到了,你做了一个合理的假设,只是在这个案例中没有成功。我们都是人,都会犯错。在与我的代码交互时,我给你犯这个错误的机会越少,对产品、客户和代码库就越好。
甚至代码错误也没有封装。
在这个特殊的例子中,假设引入了一个 bug,现在我们的 reset 方法看起来像这样。
现在,没有一种add()
方法会像预期的那样工作。你看到问题了吗? 【关键外卖 3】
void 方法的轻微误用和少量状态满性的引入意味着,甚至代码错误也变成了非封装的。一个方法中的错误会影响另一个方法的运行。最重要的是,这很可怕。
在我们的 30 行代码中,很容易找到这种外部依赖性。但是,如果这一行隐藏在代码库的深处呢?再者,如果这个 bug 是公开直播的怎么办?当你从一根意大利面条摸索到另一根面条,试图找到并解决这个问题时,你的客户在他们所有的订单上都看到了错误的价格信息。
我不会责怪作者或评论家错过了这个 bug。对于添加的特性,代码可能是合法的,但是它在代码的其他部分导致了意想不到的后果,这甚至不是提交的一部分。
于是, 【关键外卖 4】
一个方法的影响应该尽可能保持在本地。做到这一点的一个好方法是不改变类/全局变量的状态或传递的参数的状态。这样做意味着,除非你返回一个输出,否则你的代码是没有意义的,因此,避免 void。
好的无效方法
让我们评估几个场景。
- 在文件/数据库等中写入持久存储的数据。
- 渲染用户界面,使用干净的设计模式和框架,如 MVVM,React-Redux 等。
- 调用其他有副作用的方法。(你不应该这样做,但是全面禁止这种做法是不现实的)
- 等等。
所有这些场景都有一个共同点,该方法的底层操作或意图是提交有状态行为。这里我们绝对必须改变状态。它仍然有风险。外部变化,如数据库损坏,将导致我们的操作失败。我们应该进行合理的验证、幂等性检查和所有的工作来降低风险,但是我们不能消除有状态性,仍然构建我们的产品。
而在这种情况下,当你必须有副作用的时候,不仅可以使用 void。你应该使用 void。因为这凸显了一个事实,即正在讨论的方法有副作用,而且它被设计成有副作用。这做了两件事,
- 首先,它告诉读者所有非 void 方法都不会改变状态,所以可以肯定调用这个方法不会有任何意外的副作用。这是一个很好的能力,因为它本质上降低了我使用、扩展和调试代码所需的知识量。
- 第二,我确切地知道哪些方法将改变状态。如果我想用那种方法,我会小心的。这很重要。如果我们不遵循这一点,所有的方法都可能有意想不到的副作用,那么我在使用任何方法时都需要小心。而人类思维的运作方式,如果我们总是需要小心,那就永远不会小心。通过减少副作用,我们可以有效地与读者、客户和评论者进行沟通,在这种情况下,谨慎是应该的,关注是有保证的。这就像在一篇文章中放入关键的外卖标记一样:)**
于是,【关键外卖 5】**
如果方法的潜在意图是提交有状态的行为,比如写入数据库,那么应该使用 Void 方法。它将纯函数方法与有副作用的方法分离开来,告诉我们哪里需要注意和小心,哪里可以假设调用时不会出现预期的副作用。
我省略了几个要点,其中最重要的是编写无状态方法对性能的影响。在许多情况下,有状态方法更具性能。典型的例子Collections.sort()
[4]。通过就地对列表进行排序,无疑节省了内存,并且可能花费更少的时间。
在这里,我要说的是,在大多数情况下,我会毫不犹豫地接受这一业绩打击。我已经在一篇文章中详细讨论过了,我不久前写的。因此,请检查一下,或者如果你喜欢直接讨论这个或任何其他事情,那么就给我留言吧!😃
10 分钟可操作的介绍。
towardsdatascience.com](/what-is-good-code-an-actionable-introduction-1cad30551ad4)* *[## 点击此处订阅:)
想在我写新东西时得到通知吗?每当我发布时收到电子邮件!
有两种作家,写得多的和写得少的。我是后者。我痴迷于创造价值,回避噪音。如果想看这样的内容,可以考虑订阅。](https://pratickroy.medium.com/subscribe)*
来源、脚注和进一步阅读链接
- 关于副作用的一个很好的介绍维基:
【1】【副作用(计算机科学)】,维基百科 - 一个很有见地的问题,强调了代码中副作用的经常是无意的后果:
【2】system . out . println()在 Java 中有副作用吗? (2016),堆栈溢出 - 当我提到标准编程语言时,我指的是那些通常用于企业开发的语言。他们大多支持一个虚空的概念。但是另一类语言却不这样。建立在函数式编程范例之上的语言。现在重要的一点是,我并不是说这些语言不能用于构建大型产品,事实上,许多其他“标准”语言现在为虚拟编程的许多方面提供了本地支持,包括 Java。但你必须从某个地方开始旅程,我建议你从这里开始。
【3】https://www . Geeks forgeeks . org/functional-programming-paradigm/(2019),极客为极客 Collections.sort()
【4】https://Docs . Oracle . com/javase/7/Docs/API/Java/util/collections . html # sort(Java . util . list)、Oracle Docs
我们正在成为数据科学家还是数据科学工具专家?
当你提出正确的问题时,更容易找到答案。
在 Unsplash 上拍摄的 ThisisEngineering RAEng
数据科学没有严格的定义。一个非常简单而简明的定义是“数据研究”或“将科学应用于数据”。因此,数据科学家可以被描述为研究数据或将科学应用于数据的人。
但是为什么一个人要研究数据呢?数据科学的目标在解释它的重要性方面更占主导地位。目标是通过将科学应用于数据来解决问题、克服问题、回答问题或使事情变得更好、更容易。这些目标可以通过考虑以下问题的系统和结构化研究来实现:
- 问题是什么,怎么解决?
- 需要什么样的数据,如何收集?
- 我们需要如何处理数据?
- 数据告诉我们什么?
- 我们应该建立一个什么样的模型?
- 我们如何评估模型?
- 结论是什么?
- 我们如何告诉别人结果对别人意味着什么?
因此,数据科学是一个过程,而不是单一事件。这一过程的每一步都需要处理好,以取得显著和令人满意的结果。
研究数据并不总是容易的,尤其是当我们有大量数据的时候。就像外科医生、木匠、机械师使用工具来完成工作一样,数据科学家也需要工具。当然,这些工具有不同的形式。数据科学家使用计算机,使复杂的计算变得快速简单。有许多软件包和库以及现成的、经过测试的算法可以加快数据科学的进程。
这些工具非常方便和有用。然而,这些只是工具,不应该是数据科学家的唯一关注点。我觉得成为一名数据科学家与使用这些工具的能力是相关联的。数据科学家的突出特征不应该是他/她在使用 TensorFlow 或 PyTorch 方面有多好。主要目标是回答一个问题。工具可以让您更轻松、无缝地完成工作。
数据科学家的重点应该是找到用数据回答问题的方法。
这些工具帮助数据科学家像从事其他职业一样开展工作。考虑外科医生。他们在手术中使用柳叶刀,他们必须非常善于使用它们。然而,为了治愈一个人,外科医生需要的不仅仅是善于使用柳叶刀。他们必须了解人体的器官、静脉和非常复杂的结构。很好地使用柳叶刀并不能让你成为外科医生。
数据科学家需要 Python、R、Pandas、Scikit-learn、Theano、TensorFlow 等工具。但是,真正重要的不是你有多擅长使用这些工具。在一天结束的时候,如果你不能给桌子带来任何价值,这些工具就没有任何意义。就价值而言,我的意思是改进一个过程,建立一个准确的预测模型,增加企业的利润,让一些人的生活更容易,为使用机器学习的领域做出贡献,等等。
我们可以教一个人如何使用数据科学工具,但我们不能教他们如何成为数据科学家。
我们可以教一个人如何使用这些工具,但我们不能教他们如何成为一名数据科学家。我们可以引领他们,但作为一名数据科学家,需要的不仅仅是使用工具。
数据科学家是:
- 好奇的
- 批判思想家
- 好辩的
- 不怕批评
- 寻找答案
- 还有更多…
这些是一些你无法从软件包中学到的技能或特征,但是对利用数据非常重要。我们可以掌握所有的深度学习框架,我们可以闭着眼睛编码。但是,如果我们不生产,又有什么意义呢?
如果我是一名招聘经理,正在面试一个数据科学家的职位,我的问题会倾向于了解候选人的观点、好奇心和批判性思维。我对掌握软件包或框架的能力不太感兴趣。
我们可以也应该学会如何使用工具,但我们的思维需要超越工具。我们应该能够从许多不同的角度看待数据,并从许多方面解读数据。我对有抱负的数据科学家的建议是,定义一个问题并尝试解决它。当你在解决问题时,你需要并学习如何使用工具。你甚至可以创建自己的工具,因为你会确切地知道你需要什么。
结论
数据科学领域使用的工具是绝对必要的,非常感谢构建并让我们使用这些工具的社区。然而,工具不是答案。数据科学家是寻找答案的人。工具只是帮助他们达到目标。
感谢您的阅读。如果您有任何反馈,请告诉我。
我们注定要满足我们的偏见吗?
德鲁·格雷厄姆在 Unsplash 上拍摄的照片
2016 年,脸书因偏向用户的新闻订阅而遭到猛烈抨击。作为回应,这家社交媒体巨头展示了我们的喜好、联系和活动如何成为决定我们获得哪些内容的算法的主要输入;结果,内容迎合了我们自己的偏见。从商业角度来看,这一切都非常合理。如果脸书和包括 Twitter 和 LinkedIn 在内的其他社交媒体玩家希望最大限度地提高我们对他们*台的参与度,而不是他们的竞争对手,为什么他们的算法会给我们提供可能让我们不愉快的内容?正如 Nelson Granados 言简意赅地指出的,“因为脸书根据你自己的行为来定制你的新闻提要,你无意中成为了你自己偏见的受害者。”
这些算法的潜在假设,以及脸书在获取我们的思想份额方面的巨大成功,是我们喜欢的人的确认偏差,“通过寻找或解释与一个人现有信念一致的信息来处理信息的倾向”(Brtiannica)。换句话说,当我们不同意美联储的内容时,我们更有可能脱离,而不是花时间探索这些令人不安的想法。如果后者是真的,我们的提要看起来会非常不同。
内特·西尔弗把这归因于人类的本能。在《信号与噪音》一书中,他指出“当我们拥有‘太多信息’时,我们本能的捷径是有选择地参与其中,挑选出我们喜欢的部分,忽略其余的部分,与做出相同选择的人结盟,与其余的人为敌。”
但是为什么呢?
一方面,我们普遍认为,向新的和外来的思想敞开心扉会拓宽我们的视野,并最终带来更大的智慧。我们比以往任何时候都更频繁地周游世界,部分原因是为了与狭隘的思想作斗争,这种思想是由于我们把自己限制在有限的智力和身体范围内而产生的。
另一方面,正如脸书的成功所证明的,我们通常不喜欢挑战我们信念的内容。
即使在几十年前,要像这些算法今天为我们做的那样整理我们收到的信息,即使不是不可能,也是难以置信的困难。当然,新闻媒体通常包含一些人的偏见——可能是基于每个媒体所在的国家和地区,以及其制作人、编辑和工作人员所持的主流观点。然而,存在一种社会联系,在这种联系中,我们同意新闻的客观性是最重要的。“偏见!”是我们对新闻提供者最严厉的批评之一。在反对这一契约的过程中,新闻来源经常在其观点部分有不同的观点——而我们作为读者面对的是两种或所有的观点。杂志/报纸中的广泛内容或诸如“60 分钟要点/对位法”等片段中的有意并列,通过提供整体“包”,如报纸或节目,有助于控制个人的无意识偏见,其中有大量个人偏见,但寻求客观性的专业人士做出了贡献。
截至 2018 年,大约 2/3 的人不再以这种方式接收信息。我们宁愿通过我们根据自己的偏好训练的社交媒体算法,一篇篇地、一段段地获取新闻和故事。结果,我们实际上收到了更多的报纸和节目——但整个版面都被剪掉了。我们不会收到一篇支持我们偏见的文章和许多不支持我们偏见的文章,而是会收到每一篇支持我们偏见的文章,没有一篇不支持我们偏见的。
那又怎样?
就像我们训练这些人工智能给我们提供有偏见的信息一样,我们也可以训练它们拓宽我们的视角。但首先,我们必须在情感上准备好质疑我们最根深蒂固的信念。正如戴尔·卡内基 83 年前教导我们的那样,“当与人打交道时,让我们记住我们不是在与逻辑动物打交道。我们面对的是感情丰富的生物,充满偏见、受骄傲和虚荣驱使的生物。”难怪强烈的情绪会降低我们的智商(对于那些倾向于量化的人来说,会降低 10-15 分),关于我们最关心的问题的辩论,比如政治,变得异常激烈。
用人工智能的术语来说,当用户忽略某些内容,或者——对一个以捕捉和保持你的注意力为目标的算法来说更糟糕——从*台上脱离时,它会学习。它不只是肤浅地了解这一点——我们输入这些算法的大量数据为强大的推荐引擎提供了燃料,这些引擎使用数据科学来“找到”你很有可能喜欢的内容,这些内容基于你可能从未见过的与你有相似偏好的人的活动。因此,我们和其他像我们一样的人不仅滋养了我们自己,也滋养了彼此的偏见。
现在怎么办?
虽然没有一个总开关来“提供挑战偏见的内容”,但如果我们改变习惯,这些算法会相应地重新训练自己。如果我们开始喜欢、关注和接触我们不喜欢的内容,我们会得到更多同样的东西。如果我们挑战自己,通过接触我们通常会忽略或反对的内容来质疑我们最亲*的和最具情感触发的偏见,我们将训练这些算法来满足我们的知识好奇心,而不是我们的偏见。
有什么意义?
我写这篇博客的要求说起来简单,做起来却很难:我们每个人都在引导思想开放和对抗自己的偏见方面发挥积极作用;在人工智能时代,我们需要付出额外的努力来做到这一点;我们每个人都为训练这些算法的活动承担个人责任;我们寻求迫使我们质疑自己偏见的想法,并在这样做的过程中变得更加舒适,不是因为拥有所有的答案,而是因为考虑到社交媒体和信息时代让我们触手可及的广泛视角。
简单、直观的地理空间分析,帮助疫情做好准备
深入分析
使用可视化技术和实时数据分析新冠肺炎时代的菲律宾医疗保健系统及其能力
作者: 阿德里安·塞拉皮奥,康纳·g·曼努埃尔,兰斯·迪,蔡美儿
顾问 : 马丁·戈麦斯
非常时期需要非常的关注。在这篇文章中,我们对如何使用经典和创新的数据科学技术来帮助理解当前的疫情,并可能为未来做好准备的细节进行了仔细、细致和深入的关注。
我们是 FCQ 吗?
随着菲律宾从强化社区隔离(ECQ)向普通社区隔离(GCQ)的过渡,我们从多个视角来审视菲律宾与其他国家之间的差距。
tldr 我们想快速了解我们是否完蛋了。最好的方法之一就是从鸟瞰的角度来看待事物。如果你想直接进入漂亮的图形和分析,请直接滚动到它。否则,请欣赏一些高中生的思考:
我们可以大胆地说,你来这里是因为这个部分的标题。这个曾经是讽刺性的问题已经变成了对我们减轻新型冠状病毒疫情影响的能力的严肃思考。我们制定有效和可持续的应对危机行动计划的能力受到质疑,这给已经不堪重负的医疗体系增加了更多压力。在撰写本报告时,新冠肺炎病已设法渗入全球 560 多万人的身体,其中至少 356,000 人已经死亡。正如我们所知,不幸的是,新冠肺炎已经侵入菲律宾领土,在整个群岛造成严重破坏。迄今为止,已经记录了超过 15,000 个病例,其中有 900 多人死亡。
随着菲律宾医疗保健的长期资金不足,人们开始担心我们国家应对每天数百起病例的能力。坦率地说,有理由担心感染的超载,因为目前似乎没有办法绕过这场危机。恕我直言,每个人都在努力减轻这种病毒造成的痛苦,成功击败新冠肺炎是一个相当大的挑战。如果在接下来的几个月里,新增病例持续超过痊愈病例,那么随之而来的额外并发症将是一颗难以下咽的药丸。医院和隔离设施将会人满为患。这可能会进一步增加传播,减少恢复,使医护人员不堪重负,并导致死亡人数急剧上升。
虽然政府已经实施强制隔离以“拉*流行病学曲线”,但随着病例数量每天继续增加,迅速遏制病毒传播的希望越来越渺茫。随着不断波动的数字给我们脸上打耳光,卫生部观察到的“曲线变*的模式”只证明了两件事:1。这场战斗远未结束。2.被指派这项工作的人需要一副新眼镜。
所以,让我们看看我们是否真的被彻底搞砸了。
(剧透:前面好多图)。
让我们首先想象一下菲律宾的人口。
将每个有代表性的人群标绘成一个点,使我们能够识别出人口更密集的地区,如城市和市区,在这些地区病毒更有可能传播。
2020 年菲律宾人口。数据来源:CIESIN 哥伦比亚大学脸书连接实验室和国际地球科学信息网络中心。2019 年 6 月 21 日更新。图片作者。
- 以上总计约 550 万的数据点由脸书的“良好项目数据”提供。脸书使用机器学习技术从商业卫星图像中识别建筑物。然后,他们与哥伦比亚大学合作,根据公开的人口普查数据和其他人口统计数据,叠加总人口估计值。生成的地图是援助和研究组织可用的最详细和最可行的工具。更多信息。
- 然而,我们没有直接使用脸书的高密度图像,而是使用提供的原始数据点来渲染我们自己的图像。这允许我们完全控制可视化。
- 在国家一级进行调整,使普查人口与联合国估计数相匹配。给定国家(或州/地区)的联合国估计数除以给定国家的总人口普查估计数。得出的调整系数乘以目标年的每个行政单位普查值。这保留了各行政单位的相对人口总数,同时与联合国总数相匹配。更多信息。
我们怎么知道上面的可视化有意义?在下面的谷歌地图上查看菲律宾的地形。几乎无人居住的地区要么是水域,要么是山区。
太棒了,不是吗?
那么为什么不全程使用谷歌地图呢?因为它被过度使用了,我们可以做更漂亮的东西。
请注意 对于后续的可视化,我们将人口的绘图变暗,以使其他数据更加可见。其他数据来源在标题后注明。DOH 指的是菲律宾卫生部,NTF 指的是国家抗击新冠肺炎特别工作组。更新日期如下。
让我们画出病毒在人群中的传播图。
每个红圈代表一个有确诊病例的市,每个圈的面积对应于病例数。
新冠肺炎针对菲律宾人口的病例。新冠肺炎病例(DOH2020.05.19).图片作者。
这种可视化使我们能够确定该国的哪些地区是当地的热点——在 NCR 和宿务市可以发现大量的病例,其中 NCR 的集中程度最高。
然而,重要的是要注意,虽然这是菲律宾政府报告的官方数据,但感染和病例的真实情况只有在大规模检测发生后才能知道。
为了解决这些问题,我们需要医疗设施!
让我们来看看菲律宾不同标准的医疗设施。首先是医院。卫生部将医院分为三级:
一级医院配备有提供基本医院功能的设备,满足仅需要轻微护理和监护的患者的需求。然而,L1 的医院有能力隔离病人。
二级和三级医院建立在 L1 医院的基础上。L2 和 L3 医院包括几个额外的设施,如更专业的临床服务。L2 和 L3 医院应对新冠肺炎的关键设施包括呼吸科和重症监护室(ICU),这两个部门对有严重症状的新冠肺炎患者的生存至关重要。因此,卫生部规定 L2 和 L3 医院不得拒绝 COVID 患者和 pui。
我们用圆圈代表医院,根据医院的级别用颜色编码,面积与医院的床位容量相对应。
覆盖菲律宾人口的医院。医院(DOH2020.04.24).图片作者。
显然,更城市化的地区,如大马尼拉、宿务和达沃市,有更高的床位容量和更多的三级医院来满足患者的需求。
然而,民都洛省、巴拉望省、北三宝颜省、三宝颜省、西布盖省和南三宝颜省的情况就不一样了。由于床位不足,以及缺乏二级和三级医院,他们缺乏应对更严重疫情的能力。
将 COVID 病例与医院一起绘制会产生以下结果:
新冠肺炎病例超过医院超过菲律宾人口。医院(DOH2020.04.24).新冠肺炎病例(卫生部;2020.05.19).图片作者。
尽管在城市化程度更高的地区,医疗设施的容量有所增加,但考虑到其人口密度,它们仍倾向于成为当地的热点地区。请注意,由于大马尼拉地区有大量热点,这些医疗保健系统很有可能会出现故障,床位容量会根据单个新冠肺炎病例进行适当调整。此外,尽管宿务的医院容量和该市现有的二级和三级医院,新冠肺炎疫情可以很快淹没他们的医疗设施。
另一方面,人们可能倾向于认为人口密度较低的地区不容易爆发疫情。然而,如果不加以控制,这些孤立的病例可能会迅速传播,尤其是在没有必要的医疗设施来减缓传播的情况下。
由于菲律宾缺乏医疗专业人员、预算和设施,
更重要的是,为了满足轻度病例的需要,建立了地方政府卫生单位,包括镇卫生站和农村卫生单位,以补充医院现有的能力,并为更多的农村地区服务。
镇卫生站主要由镇卫生工作者组成,他们“在社区提供初级卫生保健服务”,如急救管理、生命统计数据收集、免疫援助和其他职责。
镇卫生站是农村卫生单位的卫星卫生设施。
农村卫生单位也被称为市级卫生中心,或在城市化程度更高的地区被指定为市级卫生中心,由一名市级卫生官员、公共卫生护士、助产士和一名卫生检查员组成。它们为市政当局/城市提供基本的临床和预防保健服务。
医务室是为伤病人员提供紧急治疗和护理以及母婴临床管理的医疗机构。他们在药物、非手术分娩和小手术方面提供最低到中级的护理和管理。
如果我们将菲律宾医疗机构的全部能力与全国人口进行对比,结果如下:
针对菲律宾人口的医疗机构。医疗机构(卫生部;2020.04.24).图片作者。
必须指出的是,镇卫生站、农村卫生单位和医务室没有治疗新冠肺炎病例的设备。相反,这些设施最有可能用于急诊和初级保健,从而减轻必须收治新冠肺炎阳性病例的医院的负担。
现在让我们观察一下这些卫生设施以及该国的新冠肺炎病例:
新冠肺炎医疗机构诉菲律宾民众案。医疗机构(卫生部;2020.04.24).新冠肺炎病例(卫生部;2020.05.19).图片作者。
显然,这些农村卫生设施在扩大全国范围内获得即时护理的机会方面发挥了很大作用。然而,这些不应被视为更全面的初级卫生设施的替代品。
为了减缓病毒的传播,菲律宾政府在全国各地设立了隔离区。
这些设施使轻度至中度冠状病毒患者能够得到治疗和隔离。许多这样的设施位于医院附*,以便在病人病情恶化的情况下方便病人转移。这是这些隔离区的示意图,同样用圆圈的大小来表示容量:
针对菲律宾人口的隔离场所。检疫地点(NTF;2020.04.22).图片作者。
为了更好地了解菲律宾当前应对新冠肺炎疫情的医疗能力,我们需要从以下几个方面来看待它:
新冠肺炎针对菲律宾人群的隔离场所和医院案例。医院(DOH2020.04.24).新冠肺炎病例(卫生部;2020.05.19).检疫地点(NTF;2020.04.22).图片作者。
虽然隔离设施能够补充更城市化地区的医院,但它们的设置对解决孤立病例的需求几乎没有作用,使诸如巴拉望、萨马、莱特、和其他岛屿省份等地区容易爆发疫情。
作为一个额外的奖励,这里有一个所有事情的情节!
新冠肺炎病例遍及菲律宾人口的所有医疗设施和隔离场所。医疗机构(卫生部;2020.04.24).新冠肺炎病例(卫生部;2020.05.19).检疫地点(NTF;2020.04.22).图片作者。
在本文的前几节中,我们说过我们可以使我们的工作变得漂亮。我们相信,我们所创造的东西既美观又实用,这是任何好的视觉化设计的目标。每一种颜色,每一个元素,每一个尺寸,都被合理化,以达到可以理解的视觉传达。
我们使用 Python 对其进行编码,使用 Google Research 的 Colab 对其进行处理,利用 Colab 的免费 GPU 渲染功能,使用经典的数据科学库,如 Pandas、Numpy、Matplotlib 和 Shapely。我们还想确保 GIS 的正确性,因此也加入了 GeoPandas。
现在,我们回到这个问题:我们完蛋了吗?
简而言之,我们医疗保健系统的现状并不乐观。假设传播速度继续保持目前的速度,用不了多久,医院和其他医疗保健中心就会不堪重负,这就意味着我们实际上彻底完蛋了。
那么,我们如何赶上来,以确保我们不会被搞砸,或者至少,下一次我们会松开自己?嗯,我们可以做一些事情来为下一次疫情做准备:
- 首先,以最紧急的方式处理任何医疗紧急情况。它不需要先成为流行病或疫情。比尔·盖茨说,我们每 20 年就会面临类似新冠肺炎冠状病毒的大流行。然而,这并不意味着我们每 20 年才准备一次。我们必须时刻准备着。各国政府必须与私营部门合作,不断分配资金和资源,以确保我们为下一个疫情做好充分准备。这里的关键是要积极主动。蒙古国就是这么做的。正如前英特尔 CEO 安迪·格罗夫所说,“只有偏执狂才能生存”
- 与此相关,政府和公众必须努力改善卫生设施的质量和可获得性,特别是在农村地区和省份,具体做法是实际建设卫生设施,并为此划拨更多预算。与城市医疗机构相比,农村医院的床位容量往往要小得多。因此,小医院有不堪重负的趋势,而且不是所有的病人都能得到服务。此外,由于小医院更加拥挤,患者感染医院获得性感染(HAIs)的机会也增加了。这可能会使情况更加复杂,耗尽医院的资源。尚未存在的设施有机会设计得更好,做得更好。
- 最后,练习物理距离。这不仅适用于我们的现状,也适用于我们的日常生活。拥挤的区域是最好的病毒孵化器之一,对传染病的传播产生连锁反应。不用说,在这种情况下,传播率可能会激增。这与其他已知或未知病毒可能发生的情况没有什么不同。通过发挥物理距离的作用,接触同样受到限制,吸入污染液滴的机会更低,暴露于他人可能携带的病毒的可能性更小。例如,日本在没有强制隔离的情况下,实际上已经设法拉*了他们的新冠肺炎曲线,主要部分原因是日本人坚持物理距离。
因此,当我们都在为比吉斯的“生存”而努力时,让我们尽自己的一份力量来帮助遏制疫情,方法是呆在室内,保持适当的卫生习惯,保持身体距离,并与捐赠中心合作,为那些受我国灾难打击最严重的人提供援助。
还有一件事。
当今科技的一个奇妙之处在于,现在查看和分析实时数据变得非常可能。下面是一个实时仪表板,反映了来自卫生部的直接数据,使用 BigQuery 进行了新的处理,并使用 Google 的 Data Studio 进行了动态制作。
案例数据是最新的可用数据。能力数据基于 d-2 的数据。能力数据基于 d-2 数据,因为卫生设施能力报告略有延迟。这是为了确保下面的仪表板不会显示无数据。希望在不久的将来,我们将看到来自卫生机构,特别是二级和三级医院的能力的实时报告。
这是仪表板。对我们来说,当我们看到这个的时候,我们的疑问多于答案。你呢?
互动版在https://data studio . Google . com/reporting/a 5572 DC 1-f966-45bf-8582-9 E0 AC 2d 43d 8 c
对于普通人来说。
我们都是名为Dashboard Philippine的非盈利、纯志愿者组织和技术*台的一部分。
Dashboard Philippines 的举措之一是医院分流系统。它显示了菲律宾主要医疗机构的最新床位利用率。它目前由华金·德卡斯特罗、安德鲁·戈·阿尔坎塔拉和赞德·西管理和维护。Joaq 即将进入 9 年级,Drew 即将进入 12 年级,Zand 即将进入 11 年级,他们都来自 Xavier 学校。
这些数据是通过卫生部的数据收集项目获得的,并通过卫生部的数据投放进行推送。
他们确保,如果病人需要房间来办理入住手续,特别是那些有紧急需求的病人,他们能够这样做。
尽情享受,注意安全!
作者
Adrian Dar Serapio 于 2020 年毕业于 Xavier 学校。由于新冠肺炎,他错过了闭幕式。Adrian 多次获得学校的最高奖项 Xavier Award,并且是 Jose Rizal 模范生获奖者。艾德里安有仆人式的领导能力。作为一名有抱负的医学博士,他是加州大学伯克利分校今年秋天的新生。
Conner G. Manuel 是加州大学伯克利分校的大二学生,主修数据科学和应用数学。他于 2019 年以最高荣誉毕业于泽维尔学校努瓦利分校。他目前是加州大学伯克利分校菲律宾科学家、建筑师和工程师协会的网站开发人员。他的 LinkedIn 可以在 linkedin.com/in/connermanuel/的访问。
Lance Patrick Dy 是 Xavier 学校 11 年级的新生。兰斯一直是一名优等生,也是一名有抱负的医学博士,他已被纽约科学院初级学院录取。他还以优异的成绩完成了伦敦卫生学院热带医学的流行病学课程,以及世界卫生组织的新冠肺炎管理课程。兰斯目前是泽维尔高中官方学生出版物《种马》的特写编辑。
Sean Eugene Chua 也是 Xavier 学校 11 年级的新生。作为 Dashboard Philippines 的一部分,Sean 负责自动处理和分析医院和医疗机构的数据。肖恩对数学、技术和工程充满热情,他最*完成了斯坦福大学的机器学习课程和吴恩达的深度学习专业,这两门课程都是班上的佼佼者。肖恩也是一个在大报马尼拉公报发表的作家。
马丁·戈麦斯也是泽维尔学院的校友,他是团队的顾问和导师。他的 LinkedIn 个人资料可以在www.pmgomez.com访问。
附加参考文献
- 修正 2002 年第 70-A 系列行政命令:关于菲律宾医院和其他卫生设施注册、许可和运营的修订规则和条例,第 147 号行政命令,第 12 届国会。(2004).
- DOH。(2015).NHFR 技术手册。从https://nhfr.doh.gov.ph/nhfr.pdf取回。
- 诺娜托诉(2020 年)。没有足够的床位和医护人员来处理新冠肺炎病例,以防研究激增。检索自https://www . one news . ph/not-follow-beds-health care-workers-to-address-新冠肺炎-cases-in-case-of-surge-up-research。
我们和他们想的一样吗?
我们如何发现 NLP 模型是否像我们一样思考?第一部分
机器学习模型看待语言的方式与我们不同吗,我们如何才能发现?这是在之前的一篇文章之后提出的问题,这篇文章是关于在 NLP 模型中查看哪些单词产生了输出,并问:为什么是这些单词?
当与其他数据科学家讨论这些结果时,我们会开始解释为什么每个词对模型都很重要;为什么一个词被认为是积极的,而另一个不是?例如,在一条关于网飞系列电影《虎王》的推文中,该模型会建议一些明显的词来表达积极的情绪(“被爱的”、“令人惊讶的”),但也会建议像“纪录片”和“我”这样的词对积极的情绪也很重要。
由 NLP 模型突出显示单词的推文。绿色越亮,对情感的贡献越大。
我会犹豫地建议“嗯,纪录片很受欢迎”和“也许使用我们在更深层次上联系的人称代词,因此会对此持积极态度……”
顶多流行心理学。但它提出了一个问题。
随着 NLP 的发展,这一点可能很重要——你的自动化营销活动是否会对错误的信息做出反应?那个读股票预测的报告是否比你预期的使用了不同的短语?一种新的方言或互联网迷因会让你的模式发生变化吗?
因此,计划是测试这个想法,并比较人类如何对情绪和模型进行分类。但为此,我需要关于一个人如何解释一个句子的数据,我不想仅仅依靠我自己的观点,以防我的偏见或流行心理学妨碍我。因此,我打算开发一个工具,从更广泛的受众那里收集数据。这篇文章将讨论这个工具的构建和通过 docker 的部署。
成品工具。设计不是我的强项。
自从在 PyData London 2019 上看到作者谈到它,我就想用总监。这是一个很棒的基于 Jupyter 笔记本的工具,通过它可以对 ML 数据进行主动标记,并且拥有我正在寻找的大部分演示元素,例如进度跟踪、跳过错误的样本、布局标签选项等。
这个界面随后被优秀的 Voila 所改变,这是一个将笔记本变成独立网络应用的工具。一旦以网络形式出现,它将更容易分发给我所希望的许多用户。
再加上一个保存句子和回答的数据库,以及一个连接和运行不同部分的 docker 集群,我就完成了。
首先,我必须确认主管能适应我的需要。一个下午的黑客活动表明,通常使用的静态标签可以通过简单地分割输入文本并将其指定为该示例的标签选项,从给定的输入句子中动态创建。
随后,我需要一个数据库接口层位于管理者和数据库之间,以加载和保存数据。通过扩展现有的类,这主要是关于在创建时添加连接到数据库的调用,然后将提取的样本输入到现有的管理员队列中。
最后,从数据库中提取一些用户可以查看的样本。在这里,我想把重点放在最少被审查的样本上。
为了保持干净,我分叉原来的主管,并在那里做我的更新。所有的变化都可以在这里找到。
docker 配置非常简单——一个运行 Voila 的容器和一个用于 PostgreSQL 数据库的容器。我为数据库数据使用了一个持久卷,这提供了灵活性,但在部署中产生了更多问题。
我已经包括了我的 docker 音量命令,因为这是最难得到正确的领域之一。
创建卷时使用
docker volume create postgres_db_nlp_compare
并且存在于/var/lib/docker/volumes
它们可以通过以下方式查看
docker volume ls
要添加到正常使用的合成文件中,请在 docker-compose.yml 文件中添加以下内容(注意_ data&data目录):
volumes:
- /var/lib/docker/volumes/postgres_db_nlp_compare/_data: \ /var/lib/postgresql/data/
还可以使用以下命令将卷装载到合成网络之外的临时容器中:
docker run \
--env-file database.env \
--volume postgres_db_nlp_compare:/var/lib/postgresql/data/ \
-p 5432:5432 \
--name temp_postgres_nlp postgres
这种方法允许您通过作为标准连接到数据库的笔记本向开发机器上的数据库添加数据。
或者,运行后,您可以登录到容器,通过命令行使用以下命令检查数据:
docker exec -it temp_postgres_nlp bashpsql -U user_name -h localhost -d database_name
可以使用以下命令删除临时容器,但是数据将保留在卷中。
docker rm temp_postgres_nlp
有了这个设置,我就能够在本地开发项目,直到它可以进行远程部署。在这里我研究了 docker-machine。
ocker 机器允许远程机器被视为本地机器。您可以在本地开发,翻转机器开关并运行相同的命令来远程运行。这使得部署一个魅力。
要进行设置,您需要一台安装了 docker 的服务器,您可以通过 ssh 以 root 身份访问该服务器。创建一个新用户(例如 dockeradmin ),并通过 visudo 工具授予他们 sudo 权限,而不需要本地密码(这是为了远程操作)。
# add following to /etc/sudoers using visudo
dockeradmin ALL=(ALL) NOPASSWD: ALL
将用户添加到 docker 组:
sudo usermod -a -G docker dockeradmin
然后使用 ssh-copy-id 使用您的本地 ssh 身份远程登录,不需要密码。
ssh-copy-id dockeradmin@remote_host
然后,您可以使用以下信息登录:
ssh dockeradmin@remotehost
最后,使用以下命令创建远程机器:
docker-machine create -d generic \
--generic-ip-address <remote_host_ip_address> \
--generic-ssh-key $HOME/.ssh/id_rsa \
--generic-ssh-user dockeradmin \
--generic-ssh-port 22 \
name_for_remote_machine
你可以检查它的运行情况
docker-machine ls
此后,您可以使用以下命令在本地和远程机器之间切换 docker-machine 的焦点:
# to run the commands on the remote machine
eval $(docker-machine env name_for_remote_machine)
现在 docker 命令的运行将在远程机器上执行。
# to switch back to the local machine
eval $(docker-machine env -u)
设置这个别名有助于区分 docker-machine 所指向的服务器。
alias de='env | grep DOCKER_'
如果 docker-machine 指向远程机器,随后运行' de '将返回终端信息,否则不返回。此外,要使 docker-compose 正常工作,还需要以下命令。
export COMPOSE_TLS_VERSION=TLSv1_2
因此,远程部署的完整顺序是:
# set up the alias
alias de='env | grep DOCKER_'# ensure correct encryption is used
export COMPOSE_TLS_VERSION=TLSv1_2# refocus to remote machine
eval $(docker-machine env name_for_remote_machine)# check!
de# build the same containers you have locally but remotely
docker-compose build# start the remote compose network
docker-compose up -d# refocus back to development box
eval $(docker-machine env -u)
如果已经部署并执行更新;在建造之前,你可能也想跑
docker-compose down
这个序列将使用本地资源远程构建一组 docker 容器。如果需要,将复制本地文件,下载图像。就好像在本地机器上一样…但是那个卷呢?
这是最难解决的问题。最终这对我有用:
docker run --rm -v postgres_db_nlp_compare:/from alpine ash -c \
"cd /from ; tar -cf - . " | \
ssh dockeradmin@<remote_host_ip_address> \
'docker run --rm -i -v postgres_db_nlp_compare:/to alpine ash -c "cd /to ; tar -xpvf - "'
我首先手动登录到远程机器,并使用上面显示的相同命令创建了一个同名的卷,这不是绝对必要的,但这意味着我不必为本地和远程创建不同的 docker-compose.yml 文件。
然后,该命令将:在本地创建一个临时容器,将该卷装载到该临时容器,记录数据内容,并通过 ssh 将该数据传输到另一个已将远程卷装载到其自身的远程临时容器,并取消记录数据。唷!
有了以上内容,我就能够创建并部署我的工具来捕捉其他人对之前被 NLP 模型分类的推文的想法。下一步是尽可能多的联系一些人,请他们做一些评论。
然后,这些数据将被用来比较用户如何解释推文和模型如何解释推文。当心第二部分。
所有文件都可以在这里找到,这个 T2 项目解释了我使用的推特数据的来源。
女性正在打破数据科学和相关领域的性别差距吗?
人工智能学术界和工业界的包容性和多样性。
数据海报中的女性由穆罕默德·阿古利在商店Displate.com
技术领域为女性和男性提供了广泛的机会。作为其中的一部分,人工智能和分析在过去几十年中也有了大幅增长。关于兴趣爆发的更多细节可以在附加的文章中找到:
先说 AI 状态的统计。
towardsdatascience.com](/is-artificial-intelligence-dead-ceb3830033a1)
如此重要的发现带来了许多相关的问题,其中之一是关于性别差距。虽然这不是一场男人和女人的战斗。但是,统计数据总是提供了一个清晰的视野领域的情况,如果有任何“进入的障碍。”低百分比通常是一个大的危险信号。那么女性在数据科学及相关领域的地位如何呢?
女性在研发中的份额是多少?
研究和开发是学术界和工业界最重要的领域之一。妇女在这样一个充满活力的领域中的存在是一个重要的指标。
在人工智能领域,基于 arXiv 上的出版物进行了一项分析,以跟踪至少有一名女性作者的论文的百分比。
**作为人工智能研究的世界领导者之一,中国被排除在样本之外,原因是对按名称标注作者性别的信心较低,并且在 arXiv 上发表文章少于 5,000 篇的国家不在此分析之列。
至少有一名女性作者的论文百分比——资料来源:NESTA,arXiv,2019 年。
- 荷兰超过 41%的人工智能论文和丹麦超过 39%的人工智能论文至少有一名女性合著者。
- 只有 10%和 16%的日本人和新加坡人有女性合著者。
- 与非人工智能论文相比,马来西亚、丹麦、挪威和以色列的人工智能研究中女性的比例更高。
在整个 2000-2018 年期间,来自欧洲的女性作者的人工智能出版物有了显著增长。一些国家的 arXiv 人工智能论文中有超过 30%的作者是女性,包括阿根廷、加拿大、伊朗和许多欧洲国家(葡萄牙、西班牙、法国、比利时、意大利、荷兰、丹麦、爱尔兰、匈牙利)。在美国,人工智能领域女性作者的比例在此期间略有下降。
会议参与呢?
为了研究女性参与会议的情况,我们挑选了全球知名的例子作为例证。第一个是由一个致力于支持妇女参与机器学习的组织主办的年度研讨会(WiML),第二个是旨在增加人工智能多样性和包容性的人工智能教育倡议(AI4ALL)。
WiML 注册-资料来源:WiML,2019 年
AI4ALL 校友和项目-来源:AI4ALL,2019
在过去的几年里,这两个项目的注册人数都有了显著的增长。WiML 研讨会的参与者比 2014 年增加了 738%,AI4ALL 的校友比 2015 年增加了 2000%。这些增长反映了将妇女和代表性不足的群体纳入人工智能领域的持续努力。
第三项举措是数据科学中的女性(WiDS ),始于 2015 年 11 月,为期一天的技术会议。这个全球会议吸引了来自学术界、工业界、政府和非营利组织的数百名女性。在其头五年中,成千上万的人参加了妇女参与发展。
数据科学统计中的女性。资料来源:妇女参与发展倡议
就业市场?
男性技能渗透率和职业数量-来源:LinkedIn,2019 年
女性技能渗透率和职业数量-来源:LinkedIn,2019 年
数据显示了以下趋势:
- 在样本中的所有国家,男性往往比女性拥有更多人工智能职业。
- 男性的高人工智能技能渗透率并不意味着女性的高人工智能技能渗透率。一些国家在只考虑女性时的排名明显高于考虑男性时的排名。
大型科技公司员工中女性的比例。
据 Adeva IT 称,截至 2018 年,女性仅占科技行业所有工作的 25%,尽管女性占总劳动力的*一半。
教师多元化。
数据显示,男性构成了人工智能系教师的绝大多数,在全球几所领先的计算机科学大学中,*均占人工智能教授的 80%。
- 比例最高的是苏黎世联邦理工学院,为 35%。
- 比例最低的是 IIT 马德拉斯,为 7%。
全球不同地区的性别差异并不明显,教师性别差异与院系规模之间也没有任何关联。
虽然妇女仍然没有接**等代表性,特别是在就业市场,但正在加大努力,以便在学术界和工业界建立包容性和多样性。由于在全球传播意识和教育的多种现有举措,人工智能和相关领域的性别差距正在缓慢但肯定地缩小。缩小这种性别差距的另一个重要因素是,女性目前因其在该领域的杰出成就而得到认可,无论她们是企业主、研究人员,还是在该行业中担任任何职务。
女性和男性应该有*等的机会进入人工智能领域,为他们提供这种权利是共同的责任。
关于作者:
Hajar 是一个数据驱动的人,致力于帮助企业从他们的数据中获得关键的洞察力。三年多的科技志愿者。一个永远充满热情的学生,他愿意不断改进并帮助社区进步。可以在LinkedIn&Twitter上找到她。
**参考:部分提及的统计数据摘自斯坦福大学 2019 年 HAI 年度报告。
你是数据科学家的追求者吗?这是我成为其中一员的故事
我非常想成为一名数据科学家,经过 18 个月的自学,终于在 2016 年 12 月成为了一名数据科学家。在这篇文章中,我将谈论在成为数据科学家之前我在做什么,我是如何成为一名数据科学家的,以及成为一名数据科学家是什么感觉。
亚历山大·辛恩在 Unsplash 上的照片
数据科学出现之前:
我在印度一所三流大学学习计算机科学与工程,2013 年毕业。我不知道在我的生活和事业中我想做什么。我在大学最后一年收到了两份聘书。一个来自 HCL 技术公司,另一个来自 BNY 梅隆大学。我接受了后来的邀请,因为他们要求我在大学毕业后立即加入。
因此,我在企业界作为一名软件工程师的职业生涯始于 2013 年 9 月,在那里我接受了大型机培训。大型机是一项非常古老的技术,发明于 20 世纪 50 年代。他们听起来很酷,只有在电影里,一些戴着耳机的家伙大叫,“他们黑进了我们的主机!”(现实中他们从未被黑过)。我对编程充满热情,所以我喜欢培训,因为我有很多实践经验。在我参与一个项目后,最初的几个月非常棒,因为我开始学习应用程序。一旦我熟悉了这个应用程序,事情就变得*淡无奇了。所以我转到了汇丰科技,印度,因为他们承诺一些纯开发工作。
追求数据科学:
加入汇丰银行后,我知道世界上任何地方都没有纯粹的大型机开发工作。这是开始。
大约在 2015 年中期,我周围的每个人都在谈论 Hadoop。所以我想,为什么我不进入 Hadoop,因为这是一个时髦的词,当然,也是一个高薪的工作。所以我买了一台新的笔记本电脑,学习 Hadoop 教程,并获得了认证。我做过 Hortonworks 数据*台认证开发者(HDPCD)。
同样,对 Hadoop 不满意。我继续阅读关于数据科学的书籍,并开设了一些 MOOCs 课程。一件事接一件事,我终于找到了我的新欢,机器学习。然后我更加专注于 ML,报名参加了华盛顿大学 Coursera 的 ML 专业课程,这是一门很棒的课程(当他们取消了最后一个模块和顶点课程时,我有点失望。我怪苹果!).
经过一年半的 MOOC 之旅,我觉得我现在知道了一些东西,我真的可以解决一些问题。然后,我向公司几乎所有的负责人和高级成员发送了关于我的抱负的垃圾邮件。我在邮件中提到“我是一名有抱负的数据科学家,我想实践机器学习”。此外,我在邮件中提到了我所做过的所有认证和课程。很少有人回复我,也很少有人把我介绍给另一个更相关的人。从没想过我会从那些大人物那里得到这种回应。最终,一扇门为我打开了。在我给他发邮件的第二天,印度大数据部门的负责人,同时也是印度创新实验室的负责人,邀请我去见他。这是我职业生涯的转折点。
我们在创新实验室见面,他问我能做什么。我透露了一点关于 Kaggle 的信息(我尝试了一些问题)。我很确定我搞砸了我唯一的机会。但令我惊讶的是,他们希望我和他们一起工作,但不是正式的,因为那时在印度没有任何关于数据科学的项目。那时 TensorFlow 是开源的,我们银行的每个人都想看看我们如何使用它。所以校长让我带头做点什么。我花了*一周的时间来理解 TensorFlow,幸运的是,我从 Kaggle 获得了 LendingClub 的数据集。利用这一点,我开发了一个信用风险模型,并提交给 iLab 的人。他们都很喜欢。然后我们把它展示给我们的高级成员和各部门的领导。每个人都喜欢它。我想这给了人们对我的信心,让他们相信我能够胜任这份工作。
幸运的是,2016 年 12 月,我们全球市场部在印度有一个数据科学的职位空缺,负责人推荐了我。因为同样的原因被面试并被安排到这个项目中。我是印度第一个数据科学家,当时印度有 10K+员工。
作为一名数据科学家:
我成为数据科学家的前 6 个月是我职业生涯中最具挑战性的时期。这是一个小团队,我们有 5 个人,谢天谢地,我有一个最好的线索,我可以希望的。他教授的是真实生活中的数据科学,而我从 Kaggle 和 MOOCs 中学到的却是相反的。在最初的几个月里,我有点纠结,因为分析行话与软件工程领域非常不同,而且,由于非常接*业务,我不得不付出额外的努力来获得我所从事的领域的知识。我疯狂地工作,几乎一天 16 个小时,周末也是如此!我在学习,我很开心,我每天都在做新的事情!在我工作的同时,我成立了一个机器学习搏击俱乐部(俱乐部的第一条规则是谈论俱乐部!)并开始分享我通过组织会议学到的东西。
从事数据科学 2 年半后,我发现我目前的工作列在我们的内部工作列表门户中。这份工作的地点在多伦多,是为汇丰银行正在建立的一个新的数据实验室。对于喜欢研究的人来说,这份工作看起来很有吸引力,我想探索世界的其他地方。所以我申请了这个角色,经历了差不多 5 轮面试,最终从 2019 年 5 月 19 日开始在多伦多数据实验室工作。我现在是一个由 30 名成员组成的全球(伦敦的另一个实验室)团队的一员,团队成员包括研究生数据科学家、数据工程师和高级数据科学家。作为一个更大的团队的一部分,同时也是一个高级 DS,我可以通过领导一个用例、管理利益相关者等来练习我的软技能。这是我参加过的最好的球队之一!
概要:
我不会说我天生就是一个数据科学家,这一切都是从对我所做的不满意开始的。在没有任何证书的情况下进入数据科学很难,但我为此努力工作,不断学习,敲开我看到的任何一扇门,这一切都有回报。MOOCs 用正确的技术和工具帮助了我,但应用于实际问题是只有实践才能教会的事情。我很高兴成为一名数据科学家,每天都是新的一天,仍然有很多东西要学,这让我不会感到无聊!
你是高级数据科学家吗?
香港李小龙雕像, Pixabay
还是大三?
以下是我个人对如何成为高级数据科学家(SDS)的看法,或者换句话说,如何成为一名初级数据科学家。
我想这些想法也可以推广到其他领域。然而,我个人的兴趣在于数据科学领域。
高级数据科学家应该是独立的。
独立是这里的关键词,但它意味着什么呢?独立包含了各种各样的品质和技能,一个人应该获得这些才能在职业生涯中取得进步。
一般来说,SDS 在研究方面应该完全独立,从创建数据和标记,到交付基于产品设计的成品项目,即端到端。
SDS 应该理解现代产品管理以及如何在与项目经理等利益相关者合作的同时管理项目的期望。他们应该让他们的经理放心,并且应该是团队中每个人都去咨询的人。
让我们将它分解为 SDS 应该擅长的几个关键领域,如个人、学术、技术、管理、产品和业务。
个人的
SDS 应该有“能做”的态度,他们应该总是努力接受更多的责任,运用良好的判断力,做超出预期的事情。
积极主动并始终向前,不断改进和学习,对关键问题和各种用例有完整和深入的回答,同时考虑所有可能的利弊并充分理解决策结果。
持批评态度,给出积极的反馈,能够说服你的同事,同时记住反馈是不够的,他们应该总是提出更好的替代方案,换句话说,说某事“不够好”是不够的。
学术的
SDS 应该是一个思想者,关心并理解真正科学过程的意义,同时*衡产品需求,在不损害其科学完整性的情况下具有生产特性。
要知道假设是万恶之源,并在情况变化时重新审视它们。关心完整和正确的验证、监控、可解释性和可解释性。对“行得通”的心态感到不满。接受科学反馈并高度批评自己的决定和行为,这导致我们再次验证假设并经常踩刹车以批评自己的行为,这导致验证假设,不断查看数据以确保他们所说的是正确的。
提出开箱即用的解决方案,成为一名 macgyver 和一名乐高大师,使用各种科学积木构建算法,以便为他们面临的任何挑战找到创造性的解决方案,无论领域、数据或难度如何。通过分享知识、想法、论文和解决方案来帮助你的同事。流利地谈论他们所知道的话题,连贯地介绍他们的工作,毫不费力地将知识传授给非优等生和低年级学生,并在简短的交谈中发现方法上的问题。
他们应该阅读文献,如学术论文、博客文章、技术和工具文档,以便了解更多信息并扩展其范围。站在当前研究和进步的最前沿,甚至是在其他领域。你知道的越多,你的手艺就越好。IMO 阅读应该在工作时间之外练习。这是一个成为更好的科学家的个人旅程。
熟记 Scikit-learn 或类似软件包提供的所有算法、方法和指标,深入了解深度学习,并理解数据或数据来源是影响我们工作各个方面的最重要元素。
技术的
SDS 应该是一个实干家。他们必须能够将一个特性交付给生产。他们应该在他们选择的编程语言方面有很好的技能,他们应该能够在 Github 的各种条件下使用和实现包。他们应该能够将他们的算法作为基于标准化接口的类或包来交付。他们应该理解 CI/CD 处理,并努力实现某种形式的开发标准化。
经理的
SDS 应该是一个计划者和优先排序者。将复杂的项目转化为可管理的小任务。保持对组织及其经理的持续可见性。在考虑可用资源的同时,对任务进行优先级排序,即重要任务得到更多关注,而其他任务得到的关注较少。成为一名“一劳永逸”的会员。自我管理,以减少他的经理的开销。能够管理期望和风险。撰写清晰透彻的设计文档、演示文稿,并记录他们的工作。换句话说,为了交付一个完整的项目,他们必须能够管理项目,并且他们自己很少或者没有指导。
产品
SDS 应该知道什么是现代产品管理,熟悉与产品世界相关的概念、方法、框架和术语。理解和解决复杂的商业问题和产品问题,同时考虑技术和算法的限制,总是思考如何为特性提供新的能力。这绝不是一种替代产品的方式,而是一种给出产品可能不具备的科学-算法观点的方式。
商业
SDS 应该了解业务。由于他们早期参与项目,SDS 需要了解公司如何赚钱,业务问题是什么,我们如何找到并签下新客户,谁是主要竞争对手,公司关心的业务指标是什么,客户保留率是多少,等等。
领导/原则
最后,如果你问自己一个领导或一个主要的 DS 的品质和技能是什么?简而言之,他们应该能够做一个高级 DS 能做的一切,但要规模化。雇佣并管理多个项目和人员,在了解细节的同时,看到更广阔、更大的图景。他们需要能够承担高风险、高影响的业务产品问题,进行必要的研究,并能够在没有指导的情况下轻松快速地交付工作解决方案。
我为初创企业和扩大规模的企业提供无偿建议。你可以在这里 了解更多关于我的信息并联系我 。
我要感谢菲利普·坦诺、纳塔内尔·达维多维茨、迪安·普莱班和塞菲·凯勒的宝贵意见。
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习和脑机接口(BCI)。他在一家智能城市初创公司领导了一个数据科学团队,主要利用机器和深度学习进行自然语言处理(NLP)和理解(NLU)研究。目前,他是 TLV 新遗迹公司在 AIOps 领域的首席数据科学家。他定期在 Medium.com 撰写关于管理、流程和所有数据科学的文章。
乔氏民主党人和沃尔玛共和党人
使用连锁店模拟美国选举
如果你所在的县的一元树商店比星巴克还多,你很可能是共和党人。如果你所在的县只有一家乔氏商店,你可能是民主党人。
在一个社区中发现的连锁店可以告诉我们许多关于住在那里的人的情况。想想塔吉特和沃尔玛;你与哪个政党有联系?我想调查一下这种看法,所以我建立了一个选举模型,只基于你所在地区的连锁店数量。
我的假设是,连锁店的总数将与民主投票的增加相关,因为连锁店在城市地区更频繁。此外,这些品牌(将在本文后面介绍)表明共和党或民主党选民倾向于某一特定党派。
我的选举数据
为了研究这个问题,我决定利用 2018 年中期选举的选举结果建立一个分类模型。
这个项目的选举数据来自麻省理工学院选举实验室的杰出人士。我用政治边界文件(geojson)和来自data.gov的其他县信息补充了县信息,以便我可以使用 Plotly 创建地图。
我选择看县级数据。美国有 3000 多个县,我觉得这足以建立一个强大的机器学习模型,而不是查看州或国会选区的数据。我根据所有政党候选人(包括当地和全国)的总票数将每个县指定为民主党或共和党。不幸的是,阿拉斯加没有包括在我的选举数据中(我向阿拉斯加的行政区道歉)。
关于美国各县
在美国,大多数州被划分为政治和行政区,称为县。美国 3000 多个县中的大部分都是共和党的,这使得我的数据集一开始就有偏差。民主国家大约有 600 个,通常集中在大城市及其周边。
虽然民主县只占总县数的 20%,但美国* 60%的人口居住在其中。这也是我们在这个项目中发现大多数零售点的地方。
连锁店数据
在做了一些关于品牌政治的研究后,我发现已经有很多关于这个主题的文章了,我推荐看看其中的一些( NBC 、 Time 、 Washington Post 和 The New York Times )。
我根据研究中发现的信息选择了 20 个特征(零售连锁店),还有一些是出于我自己的好奇。我调查的商店如下图所示(最终模型中未使用的功能显示为灰色)。
为我的项目选择的功能
所有功能都是全国连锁,已经扩展到几乎或所有的美国。根据我的研究,我的目标是在感知的共和党和民主党倾向商店之间取得*衡。
现在我所需要的是每家商店的位置,我可以认真地开始这个项目了。有些数据很容易从 Kaggle 和类似的网站上获得,但是对于许多连锁商店来说,我不得不求助于创造性的和合乎道德的网络搜集来编辑位置数据。这部分花了我比我愿意承认更多的时间;网络抓取有时是一项具有挑战性的运动。
总之,我从 20 家连锁店收集了超过 45,000 家店铺的经纬度信息。使用我从 data.gov 和 Python 的 Shapely 库中获得的形状文件,我能够确定每个商店的正确县,并编译一个包含美国每个县的每个连锁店数量的数据集。然后,我添加了选举数据,以确定这些县在 2018 年的投票方式。
在下面的图表中,我们可以看到我选择的所有品牌,以及它们大多数商店的所在地。
每个连锁店的红/蓝分布
初步测绘
首先,我在 choropleth 地图上绘制了 2018 年选举的结果。不出所料,民主党(蓝色)的县主要集中在人口集中的地方,尤其是沿两岸。蓝点点缀着美国中部的共和党红色海洋,但大多数大城市呈现出一片蓝色。
美国中期选举(2018 年)
我还绘制了 choropleth 地图,显示了所有县的每个连锁店的密度。下面两幅图显示了商店分布的极端情况。超过 93%的全食超市位于主要人口中心的民主县。此外,像库克县(芝加哥)这样的大都市地区拥有美国 500 家全食超市中的 15 家。洛杉矶县有 26 个。
全食超市购物地图
相比之下,1900 年拖拉机供应公司的位置似乎一直覆盖整个农村地区,只有最低限度的渗透到城市市场。如果你从未听说过或去过拖拉机供应公司的商店,很可能你住在一个大城市地区。芝加哥的库克县没有一家拖拉机供应公司的商店,而人口 1000 万的洛杉矶县只有一家。——相比之下,内布拉斯加州林肯市(人口 33 万)有三个。
拖拉机供应 Choropleth
在城市和农村地区代表过多或不足的某些连锁店。由于我们的政治分歧至少部分归因于这种城乡分歧,这些特征应该对我们的模型有用。
我们的模型
为了简化模型并考虑到每个县不同的物理和人口规模,我计算了每个县单位面积的商店数量。该模型不是基于商店的数量,而是每*方英里的商店数量。这使得我的数据是连续的,并且更容易建模。当你向西看时,这也是一些相当大的县的原因。(类似的方法是计算每个人口的商店数量)
模型一览:
- 随机森林(基于树的算法)
- 使用 Boruta Python 库算法选择的 10 个要素
- 加权以考虑红/蓝县的不*衡
- 调整以达到最大的准确性
- 使用 0.25 的测试/训练分割
最终的模型达到了 85.7%的准确率。
特征重要性
最重要的功能如下所示。当查看随机森林模型中的单棵树时,我确定了特征的方向(这个特征更多地指示红色还是蓝色状态?).如果更多商店的存在有助于区分一个县是共和党的,它们周围有一个红框(蓝色代表民主党)。
前四个特征是用于识别民主县的特征。最重要的“共和党”特色是沃尔玛,最重要的“民主”特色是星巴克。一般来说,商店越多,功能越有利于模型。
我们的模型重视民主党的“高端”品牌(星巴克、Trader Joe's 和 Whole Foods),以及共和党的“价值”品牌(Dollar Tree、沃尔玛、拖拉机供应公司)。
混淆矩阵
当使用测试数据(n=776)进行预测时,我们看到该模型有点倾向于预测共和党。92%的共和党县被正确识别,相比之下,民主党县只有 52%。民主国家占少数,因此我们预计这将是该模型更困难的任务。
我最*通过电子邮件收到了以下问题:嗨,杰森,问个小问题。一个阶层失衡的案例:90 例…
machinelearningmastery.com](https://machinelearningmastery.com/dont-use-random-guessing-as-your-baseline-classifier/)
上面的链接给出了一个很好的方法来简单地衡量你的模型的有效性。如果我们以 81%到 19%的比率(Dem/GOP 的实际百分比)随机猜测每个县的政治,我们只能达到 69%的准确性。我们的模型通过机器学习获得了额外的 17%。
模型预测法
我们的模型正确预测了几乎 86%的县。让我们看看地图,看看我们错过了什么,并确定我们的模型中的弱点。
我们的模型预测:
2018 年中期选举的模型预测
实际结果:
模型遗漏的地方:
我们模型的不正确预测
我们的地图上有清晰的区域,这个模型漏掉了大量的县。一些领域非常突出:
- 在新英格兰地区,特别是佛蒙特州和新罕布什尔州,民主党人的表现明显优于该模式。这些州的农村地区倾向于民主党,这与假定农村地区是共和党的模式相反。
[## 欢迎来到新罕布什尔州,在这里农村地区投蓝色票,郊区投红色票,而…
如果民主党人依靠多元化的大城市在全国其他地方取得胜利,他们将一无所获…
www.bostonglobe.com](https://www.bostonglobe.com/2020/02/06/opinion/yes-newhampshiresowhite-also-newhampshiresoweird/)
- 新墨西哥州是个例外。这是白人选民占少数的三个州之一。新墨西哥州的拉美裔选民*年来对民主党表现出了热情的支持。
- 密西西比州西部是美国非洲裔选民最集中的地区之一,他们压倒性地(90%)支持民主党。阿拉巴马州的部分地区也存在类似的人口统计数据,这可能是这些失误的原因。
- 该模型还忽略了太*洋西北部和南部腹地的一些县,在这些地方,保守主义和人口统计学在投票习惯中发挥了巨大作用。
- 其他重大失误发生在摇摆州佛罗里达和威斯康星,这两个州的政治倾向是分裂和不稳定的。
《华盛顿邮报》的这篇文章很好地报道了 2018 年大选前各州的政治。
政治分析根据包括数据在内的证据对新闻进行严密解读,并预测如何…
www.washingtonpost.com](https://www.washingtonpost.com/graphics/2020/politics/united-states-political-geography/)
结论
在过去的几年里,品牌比以往任何时候都更加政治化,每天都有新的公司决定试水,让他们的政治理念为人所知。看看像耐克、本杰里、业余爱好游说团、福乐鸡快餐店和巴塔哥尼亚这样外表政治化的公司就知道了。我们似乎无法将购物和政治分开,而且人们认为,随着政治分歧的加剧,这种商店和品牌的二元分类很可能会加强。像这样的模型可能会随着时间的推移而改进。
该模型和方法的优势在于独立于任何普查或投票。这是一种“基于基本面”的方法。这些数据也很容易获得,并且比人口普查数据更新得更频繁,这使得一个政党能够灵活地应对自然灾害、气候迁移和快速变化的经济带来的人口变化。资本主义,随着商业的开放和关闭,对市场变化做出快速反应,一个政党可以利用这一点。
在 85.7%的情况下,该模型可以帮助政党确定他们在哪些领域的表现低于预测模型。这些确定的地区可能需要干预和投资,因为它们是潜在的危险地区。
后续步骤
这种方法可以通过以下方法进行改进:
- 基于区域或更同质的投票区(中西部、亚利桑那州/新墨西哥州、加利福尼亚州、西北太*洋地区、佛罗里达州等)建立几个较小的目标模型。)
- 使用类似的方法评估州级、国会选区级或辖区级的数据。国会选区级别的初步模型预测美国众议院选举的准确率超过 80%。
- 针对我们模型的缺点添加或更改功能。找到在错过的县流行的业务。
- 建立模型专门识别紫色区域,在那里进一步投资可能产生政治席位。
该项目的代码可以在下面的回购中找到。感谢阅读!
[## 科学研究/DSC-mod-3-项目-v2-1-在线-ds-sp-000
零售连锁选择模型回购。github.com](https://github.com/sciencelee/dsc-mod-3-project-v2-1-online-ds-sp-000)
你收集的数据正确吗?
为什么从算法(而不是数据)入手会导致灾难
对于寻求通过数据回答问题、解决问题和做出决策的公司来说,这是前所未有的好时机。收集和存储数据的技术成本正在下降,分析数据的工具甚至更便宜(或免费)。那么是什么仍然导致分析计划失败呢?
任何分析项目最困难的部分不是技术、数学或业务目标,而是将技术和数学与业务目标结合起来。通常,这是因为没有正确的数据来解决手头的特定业务目标。这不是一个新问题,它需要更多的批判性思维而不是专业技能。
第二次世界大战期间,美国海军担心飞越德国上空的轰炸机的耐久性。他们决定对被击中并返回基地的飞机进行研究,并确定轰炸机遭受损坏最严重的地方(右翼、左翼、尾部等)。).他们的想法是在最容易受伤的地方增加额外的装甲。
亚伯拉罕·瓦尔德
一位名叫亚伯拉罕·瓦尔德的统计学家介入协助海军进行研究,并发现他们的方法中有一个关键缺陷:他们没有被击落坠毁的飞机的数据!相反,他们只有返回基地的飞机(和飞行员)的数据。根据从炮火中幸存下来的人那里收集到的信息,给轰炸机配备额外的装甲是没有意义的。
在统计学中,这是一种形式的样本偏差,由缺乏正确解决手头问题的数据导致。如今,这种现象经常出现在数据和业务的交叉点上。“欺诈检测”是机器学习领域的一个热门话题,尽管大多数公司(可能除了大型银行和信用卡供应商)在其数据库中没有足够的欺诈观察数据来准确预测欺诈实例。更糟糕的是,他们甚至可能没有收集欺诈案例的数据。
这并不是说一家试图检测欺诈(或预测任何事情)的公司不能解决与他们拥有的数据相匹配的类似问题。关键是要有所需的专业知识和必要的手段来调整数据以符合业务目标,并开始收集与您想要解决的问题相关的数据。
原载于https://www.ketchbrookanalytics.com/
你是民主党人还是共和党人?让你的推文定义你…
当你在短短几秒钟内分析数百条推文,并自动获得话题、观点和情绪等信息时,感觉就像是魔法一样。
玛利亚·奥斯沃特在 Unsplash 上拍摄的照片
最*,我有一次关于政治和下一届 2020 年美国总统选举的谈话。引起我注意的是,人们对此的态度变得极端对立。他们开始说: “你听起来就像一个民主主义者!” 或 “你是反共和党的吗?” 。通过武力,你开始有理由捍卫自己的立场。所以我很快去做了一些在线测试,试图回答这个问题:“你是民主党人还是共和党人?”****
不幸的是,我没有被说服,所以我想找到一种新的方式,谢天谢地,我们有了 Twitter 的世界作为我们的数据集!
在这项研究中,我将尝试寻找以下问题的答案:
- 民主党人和共和党人在他们的推特上使用最多的词是什么?
- 谁得到的转发和喜欢更多?
- 我们可以对提取的推文进行情感分析吗?
- 我们能否使用机器学习算法来训练一个模型,并确定这条推文是由民主党还是共和党候选人写的?
- 一个神经网络(RNN) 会帮我决定我的推特账号更民主党/共和党吗?
数据收集:
首先,我们需要弄清楚哪些推特账户是民主党或共和党。推特上的国会议员目录TweetCongress.org,列出了网站上的 101 名共和党人和 57 名民主党人。每个政党大多由几个推特超级明星支撑着(像民主党 参议员克莱尔·麦卡斯基尔 和共和党 参议员约翰·麦凯恩 ),但是国会共和党总体上有更多的追随者和更频繁的推特。
另一个选择是直接查看 Twitter 上的 @TheDemocrats 和 @HouseGOP 成员列表。在浏览列表之后,您可以看到我们可以提取所有的全名和用户名类元素。我们还将保存头像图像的 URL,供以后使用。
我将使用 美汤 提取手柄。这是一个用于解析 HTML 和 XML 文档的 Python 库。当 HTML 或 XML 文档格式不良时(例如,如果它缺少结束标签), Beautiful Soup 提供了一种基于启发式的方法,以便在不产生错误的情况下重建语法树。
提取句柄后,我将结果导出到。csv 文件,看起来像这样:
然后,我需要创建一个数据集,其中包含这些成员与 2018 年美国国会选举相关的推文。我收集了 2018 年 1 月 22 日和 2019 年 1 月 3 日J之间的推文从 Twitter API 使用 社交 Feed Manager 。有关收集日期、账户和查询中使用的标签,请参见每个收集的自述文件。
数据收集法
探索性数据分析(EDA):
该数据集包含与 2018 年美国国会选举相关的 86,460 条推文(共和党的 44392 ,民主党的 42068 )。我们可以说,在训练数据集中,民主党和共和党的比例大致相当。
我将从美国的民主党和共和党议员的推文开始快速探索。这个初始分析的主要目的是可视化他们两个使用的标签。****
********
这越来越有趣了。我们现在可以看到共和党党(红衣)吹捧他们的政策(例如 taxcutsandjobsact )。对于那些不太熟悉美国政治的人来说,共和党控制着总统职位和国会两院,因此能够相对不受限制地实施他们的议程。另一方面,对于民主党来说,我们看到了一些明显的痛苦(例如 goptaxscam )。**
此外,我将探讨不同党派使用的词汇。这将通过清理 tweets,将它们解析为单词的向量,移除常见的停用词,通过计数聚合单词,并使用条形图绘制最频繁的结果来实现。停用词的选择有时很关键。我认为最好从【word cloud】库中选择停用词,因为它们包含了所有停用词的*均列表。******
比如民主党人发的推文中使用次数最多的就是【今天】 (3850 次)这个词。然后我们找到【川普】 (2502 次)【美国】 (2053 次)。
如果我们看一下有共和党观点的人的推文,这个词【今天】 (4883 次)再次位于第一位,【税收】位于第二位,【伟大】位于第三位。
我还将词频分为 5 类:
- 如果一个词的使用少于 50 ,它就在极低组。
- 如果在 50 和 200 之间使用,则处于低组。
- 如果在 200 和 750 之间使用,则属于中等组。
- 如果在 750 和 1500 之间使用,则在高组。
- 如果一个词的使用量大于 1500 ,它就在极高组。
用精心制作
解释:
我试图绘制一个矩阵,其中‘X’轴指的是共和党推文的词汇使用频率,而‘Y’轴指的是同一事物,但与民主党有关。
例如,单词“tax reform”被共和党人使用了 966 次,所以它被放在他们的高类别中。然而,民主党人只用了这个词 12 次。另一个例子是【枪】字。它在民主党推文中被使用了 876 次,在共和党推文中被使用了 117 次。
也没有词,当共和党人使用非常高,民主党人使用中等,低或非常低的水*。和民主党人一样。“今天”、“美国人”、“伟大的”、“房子”、“年”、“家庭”、“日子”和“感谢”这些词被民主党人和共和党人高度使用。
离差图:
我在数据集中选择了一些单词,以便绘制一个图表,显示单词在文本中的分布。这几个词分别是**【投票】【民主】【自由】【美国】【美国人】【税收】【特朗普】【克林顿】**。****
民主党推文剧情
共和党推文剧情
情感分析
在这里,我将尝试使用不同的文本分类器将推文分类为有组织的团体或团体,此外还有情感分析以了解给定推文对给定主题是正面还是负面的谈论。
所以我开始将双方的推文集合转换成一个令牌计数矩阵,使用来自sk learn的 计数矢量器 函数。然后我应用 ML 算法进行分类:random forest,logistic regression, Multi-NB , 决策树 , AdaBoost
之后,我试图确定每一方的态度或情绪,即它是积极的还是消极的还是中立的。所以我使用了著名的 Python 库text blob,它返回 2 个重要指标:
- 极性分数在 [-1.0,1.0】范围内浮动。它代表了一个句子所表达的情感。 1 表示正声明, -1 表示负声明。****
- 主观性在【0.0,1.0】范围内浮动,其中 0.0 非常客观1.0非常主观。它指的是个人的观点、情感或判断。
********Democrat_Tweets :**
Sentiment(polarity=0.16538325109722254, subjectivity=0.4649093199451984)**Republican_Tweets:** Sentiment(polarity=0.19837398561739605, subjectivity=0.4590746992419168)******
简单神经网络分类
现在让我们尝试用一个简单的神经网络来回答最后一个问题“如果我的 Twitter 账号更民主党/共和党】。我将利用 Keras 深度学习库,为序列分类开发一个 LSTM 和卷积神经网络模型。****
让我们从导入该模型所需的类和函数开始,并将随机数生成器初始化为一个常量值(例如 7),以确保结果可以重现。
然后,我们分割数据集,根据政党变量分层,以便在整个数据集中分别具有大约相似比例的民主党 & 共和党培训&测试 集合。该设置将基于那些 推特手柄 ,因为我们不希望任何单独的推特出现在两个 训练&设置中。
实际上,就单词而言,tweets 不具有相同的长度,但是在 Keras 中执行计算需要相同长度的向量。这就是为什么我们需要截断和填充输入 tweets,以便它们在建模时长度相同。该模型将了解到零值不携带任何信息。
我们现在可以定义、编译和拟合我们的 LSTM 模型:
- 第一层是嵌入的层,它使用 32 个长度向量来表示每个单词。
- 我们在嵌入层之后添加一个一维 CNN 和一个最大池层,然后将合并后的特征提供给 LSTM 。
- 下一层是 LSTM 层,带有 100 记忆单元(智能神经元)。
- 最后,因为这是一个分类问题,我们使用一个具有单个神经元的密集输出层和一个 sigmoid 激活函数来为两个类别民主党/共和党做出 0 或 1 预测。
我使用 epochs=10 和 batch_size=64 来拟合模型。一旦拟合完成,我们就可以评估模型在看不见的推文上的表现:
我得到了一个74.52%的整体准确率。一条推文被错误分类并不罕见,所以也许我们应该考虑每个人推文的整体分类。
通过这种调整,我们得到了 ~93% 的准确度。
结论:
文本分类不仅有趣,而且是从非结构化数据中提取价值的强大工具。 Twitter 是一个非常受欢迎的社交媒体*台,有数百万用户使用,发布的推文有时可以用来了解公众对某个问题的看法。当你在短短几秒钟内分析数百条推文,并自动获得话题、观点、情绪等信息时,感觉就像变魔术一样
经过这次研究,我发现我们可以对人们进行分类,看看他们是民主党还是共和党,结果在某种程度上是准确的。如果情感分析算法得到改进,我们可以用它们来预测今年的下一次总统选举结果。
尽管如此,开发出来的模型仍然有 2 的主要障碍:
- 讽刺是所有情感分析算法的另一个弱点,我们的模型在这个阶段也无法检测到讽刺。****
- 由于推文可以由任何人发布,并且可能包含拼写&语法错误,拼写错误的关键词可能会被我们的算法错误地分析。
笔记本:
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/chouhbik/Sentiment-Analysis-of-Tweets/blob/master/Tweets Analysis DemvsRep.ipynb)
参考资料:
- TweetCongress.org:http://www.tweetcongress.org/tweeters
- 美汤:https://www.crummy.com/software/BeautifulSoup/bs4/doc
- 社交供稿经理:https://gwu-libraries.github.io/sfm-ui/
- Scikit-learn:https://scikit-learn.org/stable/index.html
如果你设法来到这里,恭喜你。感谢阅读,我希望你喜欢它。关于机器学习的个人接触或讨论,请随时在 LinkedIn 上联系我,别忘了在 GitHub 和 Medium 上关注我。
在 GitHub 上注册你自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方…
github.com](https://github.com/chouhbik)****
以人为中心的数据解决方案设计方法
你是在为人民设计吗?
本·斯威特在 Unsplash 上的照片
2004 年,美国银行聘请设计公司 IDEO 帮助他们吸引更多的客户。当 IDEO 开始参与时,他们做了一些意想不到的事情,他们没有走进美国银行的办公室,而是去实地观察人们如何处理金钱,并记录他们的消费习惯。他们发现,人们将支出四舍五入是因为 1)这更容易计算,2)他们感到安全,因为这增加了储蓄的缓冲。然而,人们仍然在努力存钱。
这种见解启发 IDEO 设计了“保持变化”计划。每次顾客用美国银行的借记卡进行交易时,购买的东西都会被取整,零钱就会进入储蓄账户。每次存入零钱时,银行也会在储蓄账户中存入一部分。通过这个项目节省了 20 多亿美元。统计数据显示,自 2005 年 9 月推出以来,已有 1230 多万客户注册了该计划。那么,IDEO 做了什么?
IDEO 没有试图改变银行内部的战略,或者根据假设设计不同的营销策略来吸引客户,而是从客户的角度来看待问题。他们观察并接触客户,了解他们的习惯,感受他们的痛苦,并利用这些知识来设计一个非常规的解决方案。这种设计解决方案的方法被称为以人为中心的设计。
这种设计方法有什么好处?
以人为中心的设计方法将人置于中心,使设计师能够更接*他们为之设计的人,了解他们所描述的条件背后的实际问题,产生想法并快速构建原型以进行测试、学习和重新定义。
以人为中心的设计过程( IDEO )
它鼓励设计师实践同理心
观察阶段鼓励设计师放下所有先入为主的观念,与用户同理心——感受他们的体验,知道他们所做事情背后的动机。当设计者从用户的角度看问题,而不偏向于预先确定的解决方案时,他们可以找到用户描述的问题的根源。这有助于针对根本原因,而不是治疗症状。
它在每个阶段都把人联系起来。设计师在观察阶段与用户密切合作,他们在构思阶段从用户那里获得关于草图解决方案概念的反馈,并在实施阶段让用户参与测试和体验真正的解决方案。通过将人们包括在观察-构思-实现阶段,这种方法将所有权给予他们,并让他们对影响他们的转换有发言权。
培养信任和信心 在每个阶段都让用户参与进来,听取他们的反馈并减少所有顾虑,培养组织对设计师的信任。设计师对解决方案更有信心,因为这些解决方案是基于不断的反馈反复构建和测试的。它确保解决方案在组织中被接受,并且人们会使用它们。
它非常适合现代技术和实践 像云这样的现代技术*台允许企业动态构建资源,消除管理和维护资源的开销,从而实现快速原型开发。成本是基于使用的,所以实验可能非常便宜,这鼓励了迭代。敏捷方法可以应用于产品开发,它的建立是为了支持变化并提供比传统方法更大的灵活性。这使得设计人员可以快速、持续地发布变更。
为什么这种方法在设计数据解决方案时至关重要?
2019 年进行的一项调查显示,在 77.1%的公司中,采用大数据和人工智能解决方案仍然是一项重大挑战,高管们表示,这些挑战中有 95.0%源于文化变化(人员和流程),只有 5.0%与技术有关。
众所周知的事实是,业务战略和数据战略之间的不一致导致了几个项目的失败,而业务、数据和 It 之间缺乏沟通导致了用户想要的和他们得到的之间的巨大差距。造成这种情况的主要因素之一是 解决方案不能解决用户面临的问题 。
除非将数据放入环境中,否则它对业务没有任何意义。设计师必须通过与业务及其人员密切合作来理解这种背景。许多设计决策是基于过去的经验 或应用以前项目的模板做出的,这降低了解决方案在不同环境中工作的机会。此外,用预先确定的解决方案来解决问题会分散设计者对实际问题的注意力,将他们的注意力转移到产品或服务上。
数据解决方案只有当设计者超越印刷的要求,发现没有陈述的内容时才会成功。 设计师应该在人员、流程和技术之间建立联系——这要求他们放眼全局,思考的不仅仅是分类、整合和存储数据。设计师必须赋予每个用户(以及整个组织)知识和洞察力,帮助他们做出正确的商业决策。
数据解决方案设计师如何应用这种方法?
在实践中,数据解决方案项目有不同的形式和规模,它们有自己的动力,并按照一套通常与特定组织(或部门)相一致的既定原则运行。因此,将这种方法应用于每个项目可能会很棘手。然而,有一些原则,设计师可以在任何环境下遵循,这将有助于以人为本的方式形成解决方案。
- 解决问题时,忘掉以前的项目。用新鲜的镜头看问题。
- 与用户产生共鸣 —了解他们描述的是原因还是症状。
- ****在了解根本原因之前,不要提出解决方案。在理解问题之前谈论解决方案会在设计思维过程中制造界限,甚至会分散用户讲述他们故事的注意力。
- 使用视点(POV)方法生成有意义且可行的问题陈述**。
【用户…】需要【需要…】因为【洞察…】
例子:
—数据科学家/s(用户)需要一个沙箱因为他们要运行机器学习实验。
—数据分析师(用户)每天早上都需要数据仓库中的最新数据,因为他们向外部客户发送每日报告。** - 提出“我们如何可能”的问题来产生想法**。如果你发现用户不信任数据,比如说“我们如何培养用户对数据的信任”,产生尽可能多的想法,而不是建议像“实施数据质量工具”这样的解决方案,或者排列产品。
- 将复杂的问题分解成更小的、可管理的部分。分析每个部分,构思并将不同的想法综合成可能的解决方案。
- ****涉及用户。在构建解决方案之前,听取他们对不同概念的反馈。这可以节省时间。
- 构建、测量、学习Eric Ries 提出了精益创业方法论中的构建-测量-学习概念。它指出“创业公司的基本活动是将想法转化为产品,衡量客户的反应,然后学习是转向还是坚持。”同样的概念也适用于此。小规模构建,向用户寻求反馈,学习并重新定义,如果需要的话。
记住更大的图景
数据解决方案项目通常是企业级数据策略的结果。因此,在设计底层解决方案的同时,设计师也应该记住更大的图景。应用治理方法来审查与业务战略的一致性,并确保较小的解决方案能够很好地解决企业规模的数据管理难题,这一点很重要。
如果目的是 “为人民而设计”, 关于数据和人工智能解决方案采用的令人担忧的统计数据将朝着有利于成功实施的方向变化,为企业创造价值,并塑造一个更好的连接组织。
点击阅读更多关于以人为中心的设计。点击阅读美国银行的故事和更多。
连接上LinkedIn。**
你是否丢弃了太多相关的特性?
对当前方法的分析和建议的解决方案
卡拉·里维拉在 Unsplash 上的照片
更新:本文描述的更新后的 Python 关联函数可以在 PYPI 上的 exploretransform 包中找到。
总结
一些常用的相关滤波方法倾向于丢弃比所需更多的特征。随着数据集变得越来越大,并且随着更多的成对相关性超过特定阈值,这个问题变得更加严重。如果我们丢弃了不必要的变量,那么可用的信息就会减少,从而可能导致模型性能不佳。在本文中,我将展示当前方法的缺点,并提出一个可能的解决方案。
示例
让我们来看一个例子,当前的方法是如何删除本应保留在数据集中的要素的。我们将使用波士顿住房修订数据集,并用 R 和 Python 展示示例。
R: 下面的代码使用 caret 包中的 findCorrelation()函数来确定应该删除哪些列。
该功能确定[ 'indus ',' nox '。lstat ',' age ',' dis' ]应根据 0.6 的相关临界值删除。
Python : Python 没有 findCorrelation()这样的内置函数,所以我写了一个叫 corrX_orig()的函数。
我们得到与 R: drop 列[ 'indus ',' nox '相同的结果。lstat ','年龄',' dis' ]
不幸的是,两者都不正确。年龄一栏不应该被删除。我们来探究一下原因。
这些功能是如何工作的? 首先创建一个相关矩阵。这些数字代表所有数值变量组合的成对相关性。
波士顿住房的相关矩阵
然后,计算每个变量的*均相关性。这可以通过取每行或每列的*均值来实现,因为它们是相等的。
列和行的*均相关性
之后,矩阵的下三角和对角线被屏蔽。我们不需要下面的三角形,因为相同的信息存在于对角线的两边(见上面的矩阵)。我们不需要对角线,因为它代表变量和它们自身之间的相关性(它总是 1)。
下三角形和对角线被遮罩的矩阵
下面是伪代码来演示该函数的其余部分是如何工作的。我将 0.6 硬编码为本例的相关截止值:
现在到了你期待已久的部分。为什么功能不会老化?
下面的表格显示了我从原始函数中捕获的变量。还记得函数告诉我们去掉[ 'indus ',' nox '吗。lstat ',' age ',' dis' ]。所以我们手动从表中删除[ 'indus ',' nox ',' lstat ',' dis' ]。正如您在表中看到的,没有其他变量可以与年龄进行比较来做出放弃决定。因此年龄不应该下降。
但是为什么会这样呢?
由于 R 和 python 函数的顺序性质,它们无法整体考虑所有变量的状态。删除变量的决定按顺序发生,并且是最终决定。
如何证明年龄属于数据集中?
我们可以从下拉列表中删除 age,得到[ indus,nox,dis,lstat],然后从原始数据集中删除这四列。当我们重新运行这个变量子集时,如果它应该被删除,我们将期望“age”作为输出。如果我们没有输出,这意味着“年龄”应该留在集合中。
如下图所示,这两个函数都没有输出。年龄应该留下来。
R
Python
简要回顾
在这个例子中,我们已经证明了常用的相关过滤函数夸大了删除列的数量。我的断言是,这是由于相关矩阵中的每个单元如何被评估和丢弃的顺序性质。
那么解决办法是什么呢?
-
根据原始逻辑记录变量状态
-
使用日志计算最后要删除的变量
-
原始:原始解决方案顺序地、立即地、最终地删除列。
-
修改后的:捕捉变量状态而不落入数据帧 res
2。修订后的:使用 res 计算要删除的变量
下面是 res 的输出,包含变量状态和变量定义
v1,v2 :被分析的行和列
v1,v2【T27。mean] :每个 v1 和 v2 的*均相关性
corr:v1 和 v2 的成对相关性
drop :初始 drop 决定下降(v1.mean,v2.mean)中的较高值
捕获的可变状态
修改了跌落计算中的(2)个步骤
我鼓励读者使用上面的捕获变量状态(res)图来手动完成下面的步骤。我还嵌入了 calcDrop()函数中每一步的代码。整个函数在这一节的末尾。
第一步: all_vars_corr = 所有超过相关临界值 0.6 的变量。因为我们的逻辑将捕获满足这个条件的变量,所以这将是上面 res 表中 v1 + v2 列中的唯一变量集。
结果 : ['tax ',' indus ',' lstat ',' rm ',' zn ',' age ',' nox ',' dis']
第二步: poss_drop = 来自 drop 列的唯一变量。这些最终可能会也可能不会被放弃。
结果 : ['indus ',' lstat ',' age ',' nox ',' dis']
步骤 3: 保持 = 来自 v1 和 v2 的变量不在 poss_drop 中。本质上,任何不可能被删除的变量都将被保留
结果 : ['zn ',' tax ',' rm']
步骤 4: drop =来自 v1 和 v2 的变量出现在与 keep 相同的行中。如果我们知道要保留哪些变量,那么任何与这些变量配对的变量都将被丢弃。
结果 : ['lstat ',' nox ',' dis ',' indus']
第五步 : poss_drop =从 poss_drop 中移除 drop 变量。我们正在删除我们知道会从可能性列表中删除的变量。
结果 : ['年龄']这是可能性中剩下的最后一个变量。
步骤 6 :将数据帧子集化,仅包含 v1 和 v2 中的 poss_drop 变量。我们想知道是否有任何理由降低年龄。
步骤 6 的结果
Step7 :删除 drop 变量在 v1 或 v2 中的行,存储 drop 列中的唯一变量。将结果存储在 more_drop 中。在这里,我们删除了包含要删除的变量的行。在这个较小的例子中,我们将得到一个空集,因为所有的行都包含我们知道要删除的变量。这是正确的结果:年龄不在这个集合中。
结果:设定()
第 8 步:添加更多 _drop 变量到 drop 并返回 drop
结果 : ['lstat ',' nox ',' dis ',' indus']:手动完成 res 表上的步骤后,more_drop 不包含年龄,这正是我们所期望的
下面是完整的 calcDrop()函数:
简要回顾
在本例中,我们展示了一对基于相关性过滤变量的修正函数。这些函数的工作方式如下:
- corrX_new :记录基于原始逻辑的变量状态
- calcDrop :计算要删除的变量
最终示例
让我们使用来自 R 的 caret 包的(mdrr)数据集,它包含许多相关的特性。我们将在本节中使用新旧函数,因为我们已经介绍了一般的测试例程,所以不会太冗长。
R(原始)
findCorrelation()删除了 203 列
Python(原创)
corrX_orig()删除 203 列
Python(修订版)
有 9 列被识别为不应该从数据集中删除。我们用 R 和 Python 来确认一下。
R
当 python 所标识的列被添加回 R 中的主集中时,没有删除任何列。
Python
Python 中的结果是相同的。最初不应该删除列['DDI ',' ZM1V ',' X2v ',' piPC05 ',' VAR ',' SPAN ',' QYYe ',' GMTIV ',' X5sol']。
结论
在本文中,我们已经展示了常用的相关滤波方法是如何不必要地丢弃特征的。我们已经展示了当数据变大时,问题会如何加剧。尽管我们没有给出证据,但可以合理地假设,不必要的特征移除会对模型性能产生负面影响
我们还提供了有效的解决方案,包括代码、解释和示例。在以后的文章中,我们将扩展这个解决方案,将目标相关性添加到过滤决策中。
请随时在 LinkedIn 上联系我。
你是否正确地评估了你的模型的性能?
你的模型真的 95%准确吗?
在 Unsplash 上 engin akyurt 拍摄的照片
作为一个机器学习者,你应该知道如何评估你的分类模型。您应该知道用于显示分类和预测得分的不同指标。
这个故事包括以下几点
- 准确性如何误导?
- 分类标准的构建模块
- 其他分类指标精度和召回率是什么?
- 如何轻松记住精确和回忆的区别?
- 如何在多类(2 类以上)分类上找到精度和召回率?
准确性是广泛用于评估分类模型预测的度量标准。
精确度是
在许多情况下,精确度指标都很有效,如狗与猫的分类、MNIST 数据集等。但是在一些情况下,准确性度量可能会欺骗您。
让我们分析一个这样的场景。
您已经建立了一个人工智能模型,通过实时更新来检测您的 web 服务器上的入侵和网络攻击。只要有攻击,你的模型就会启动警报。
我们的分类指标将使用四个构件。
1.真正
2。真负
3。误报
4。假阴性
这个分类场景有两个类。
1。正面类:网络攻击,警示用户。
2。负类:没有网络攻击,不提醒用户。
真阳性:模型预测为阳性类别,实际类别也为阳性。表示模型正确预测了正类。
真阴性:模型预测为阴性类别,实际类别也为阴性。表示模型正确预测了负类。
假阳性:模型预测为阳性类别而实际类别为阴性。表示模型错误地将负类预测为正类。
假阴性:模型预测为阴性类,而实际类为阳性。表示模型错误地将正类预测为负类。
注意:假阳性和假阴性容易混淆。所以要多关注他们。
准确(性)
如上所述,准确度是正确预测的总数除以预测的总数。
对于二元分类:
精确度是
精确度公式
我将以上述网络攻击模型为例,解释准确性有时会产生误导。
我们在 100 次观察中测试了该模型,以下是结果。
精确度为(2 + 95 ) / (2 + 1 + 2 + 95) = 0.97
97%的准确率。干得好。
在 100 起案件中,有 4 起网络攻击(TP 和 FN)和 96 起非网络攻击(FP 和 TN)。
在 96 次非网络攻击中,有 95 次被正确预测。但在 4 次网络攻击中,只有 2 次被正确识别。 不好。
如果一个模型总是预测每个样本都是非网络攻击,那么我们也会有 96%的准确率,这是误导。在这种情况下,模型没有学到任何东西。
这是一种不*衡数据集的情况,其中一个类(大量观察值)压倒了另一个类(少量观察值)。)
精确度和召回率
精确度和召回率是用于定义分类模型有效性的另外两个度量。
这两个术语很多时候会变得混淆,但是如果你记得下面的公式推导过程,它可能会帮助你记住这两个术语。
第一条对角线只包含真 值。
第二条对角线只包含 假 值。
第一行只包含正值,第二行只包含负值。
精确
公式为 真阳性除以第一行的和,即(真阳性+假阳性)
假阳性意味着实际值/类别为负,但预测值/类别为正。
Precision 告诉我们在所有阳性预测样本中有多少样本是实际阳性的。
回忆
公式为真阳性除以第一列,即(真阳性+假阴性)
假阴性意味着实际值/类为正,但模型预测它为负。
召回告诉我们在所有实际阳性样本中检测到多少个阳性样本。
多类分类中的精度和召回率
我们已经建立了一个水果分类模型,我们有 3 类/水果苹果,猕猴桃和橘子。
让我们找到每种水果的精确度和召回率。
苹果
精度= 5 / (5 + 2 + 1) = 0.625
精密——苹果
回忆= 5 / ( 5 + 3 + 1) = 0.56
召回—苹果公司
猕猴桃
精度= 6 / ( 3 + 6 + 1) = 0.6
精密——猕猴桃
回忆= 6 / ( 6 + 2 + 2) = 0.6
回忆—猕猴桃
柑橘
精度= 7 / ( 1 + 2 + 7 ) = 0.7
精确—橙色
回忆= 7 / ( 1 + 1 + 7 ) = 0.77
召回—橙色
看看我的其他故事。
感谢您的阅读。继续学习!
错误使用“实验”这个词,你是否有罪?
谈论因果的三个要求
电影《公主新娘》的模板。
“实验”是一个被滥用的词。它有多重含义,所以你必须仔细听上下文。这个词是随便用的吗,小孩子用的方式?还是指在成年人的对话中回答有关因果关系的问题的科学黄金标准?
就像“树皮”一样,“实验”有多重含义。与“树皮”不同,混淆它们会产生危险的后果。
滥用(语义)关系
当科学家使用这个词时,它指的是理解事物本质的圣杯。难怪你想通过告诉每个人你也“做了一个实验”来给他们留下深刻印象。令人印象深刻!实验是唯一合法的工具,它给了你在礼貌谈话中使用“因为”这个词的许可。
实验允许你谈论什么导致了什么。
想想一个科学家在看到你写了“实验”这个词的文件时的情绪——保持我们的小心脏!我们要打开生日礼物了!我们要去看看什么导致什么!!!我们太激动了!
当我们发现你所谓的“实验”就是这个时,你能想象我们有多么失望吗?
“让我们看看会发生什么。”
图片修改自维基共享。
你伤了我的心。
作为一名统计学家,我被训练对术语保持精确,但当别人错误地使用他们的话时,我也相当放松。只要没有危险的后果,而且我们或多或少相互理解,我不介意。
这就是为什么我想借此机会把我所有的优惠券花在这个词上:实验。滥用它会导致致命的后果。(尤其是在新冠肺炎的时代。)
安全单词
如果你把“让我们看看会发生什么”**“实验”叫做“让我们看看会发生什么”,并且你已经超过 10 岁了,请把你文档中的这个词替换成别的词。
这个怎么样?
原创模因模板:来源。
“混乱。”或者,如果这太苛刻的话,我给你提供了“让我们看看会发生什么”的七个同义词,就科学而言,它们远没有那么沉重。它们是安全词,从某种意义上说,如果你说它们而不是 T2 实验 T3,你的 T4 统计学家 T5 就会停止伤害你。
如果“实验设计”的意思只是“让我们看看会发生什么”,为什么专业人士会把它放在简历上呢?
前三个是学习 ,调查 *,***分析——你可以用那些做任何事情。当有疑问时,就把一切都称为“学习”**
“学习”这个词可以指任何古老的事物——你可以随意使用这个词。
如果要稍微行话起来,的专业术语是观察研究* 。*****
你也可以称你所做的为试运行或试用,如果你不介意暗示你打算以后回来做一些设计得更严谨的东西。****
尽量不要点燃你随便调查的东西。
最后,“让我们看看会发生什么”的第七个词是…**
……”发射!****
如果你想像孩子一样用这个词来指代一个试探性的程序,那么请不要在讨论商业、科学或政策等成人问题的人面前这样做。对他们来说,实验是一种可靠的、精心设计的、有控制的尝试,以了解什么导致什么。他们在讨论诸如“这种疫苗真的有效吗?”这样的问题时会提到实验误解可能会造成巨大损失的问题。如果你不确定你是否在处理一个真实的实验,避免这个词。
什么是实验?
什么是科学意义上的实验,为什么它带有合法化的含义?
通过主动控制(并消除)替代解释,实验是进行因果推理的最佳科学工具。如果您要在数据的上下文中使用该词,那么请确保以下所有组件都存在:
- 应用不同的处理
- 随机分配的治疗
- 科学假设得到验证(见我的解释这里
假设
一个假设不足以让一项研究成为一项实验。例如,我可能有零假设成年人的真实*均身高超过 3 米,然后我可以收集数据,这将使我得出结论,这个零假设看起来很可笑。我将只剩下科学理论:一个 10 英尺高的巨人将超过人类成年人的*均水*。耶,科学!附*没有任何实验!
一个理论就是一个假设长大后变成的样子。
顺便说一下,你注意到我在那里使用了“理论”这个词吗?是的,理论是科学能做出的最好的东西。就是一个假设长大后变成的样子。(人们混淆了这两者,认为理论不如假设。它不是。)
原图来自 xkcd 。
我没有说“科学事实”,因为这是表明你不知道科学如何运作的一种快捷方式。科学家不崇拜信息,他们只愿意抓住理论不放,直到更好的理论出现,那时他们会像扔烫手山芋一样扔掉旧理论。与此同时,公众在接下来的几年里虔诚地继续在它身上烧钱,因为科学
但是让我们回到正题。一个假设不足以让某件事成为一个实验,但是你应该有一个…否则你将不知道如何应用治疗。
不同的治疗
实验最特别的地方在于,我们不再只是被动地观察数据。相反,我们将把我们的意志强加于现实!Bwahahaha—
总之。
要做一个实验,我们必须对宇宙的不同部分做出不同的改变。我们做的各种事情被称为治疗。(即使实验与医学无关。)我们不做任何额外工作的治疗称为控制。我们假装做某事而实际上什么也没做的对照被称为安慰剂。**
随机分配
如果在我们开始之前,实验单元(对象或受害者,呃,我的意思是参与者)之间有任何变化,那么这不是一个真正的实验,除非这些单元被随机分配到治疗组。
随机化加上足够大的样本量是使实验成为因果推断有效工具的秘方。**
相关性不是因果关系
如果我们有了这三个组成部分,我们就真正有了一个实验。有牙齿的那种。我们能够谈论什么导致什么…甚至在不确定的情况下!这太神奇了。没有实验,你所拥有的只是相关性。相关性是一种很好的表达方式“两种模式似乎在一起移动,但是如果我们用这个来得出一个导致另一个的结论,我们会被嘲笑。”
例如,如果一项观察研究发现喝红酒的人更长寿,那只是一种相关性。没有人会随意给一些人强行灌酒,而让其他人远离。可能是因为其他原因,更健康/更富有/更法国化的人活得更久,而且碰巧也喝更多的红酒。没有实验,没有证据表明红酒会让你更健康。
虽然这些事情高度相关,但我希望你能和我一起怀疑这两者互不因果。更多关于虚假相关性的有趣内容,请查看我发现这个例子的有趣网站。
实验为什么有效?
如果你有兴趣看到一个实验的运行,以理解为什么它们作为因果推论的工具,看看你能做的最简单的实验之一背后的逻辑:A/B 测试。
随机处理是使实验成功的秘方。
如果你想让我向你解释一下 A/B 测试,请阅读我的文章A/B 测试是如何工作的?
致命的错误
当没有太多利害关系时,漂亮的观点是好的,但在一些情况下,不做实验就下结论是危险的。
如果没有真正的实验,对任何人用“因为”这个词来解释复杂现象之间的联系要持非常怀疑的态度。那个人真正想说的是,“我有一个自己认为合理的观点,但我并没有真正做足功课去排除其他的解释。 我喜欢我的故事 而且我在坚持。”
五个例子(众多例子中!)在这里,我建议你在下结论之前要求进行一次真正的实验:
- 这种疫苗会导致人在接触病毒时不生病吗?
- 这种最新的节食和健身时尚会带来你所期望的任何改善吗?
- 这个 ML/AI 系统是否导致 改善结果?
- 这种开放式办公室会让的员工更有效率吗?
- 这项政策会给公民带来更好的条件吗?
看一下最后一项,你会想起有时候做实验太难/太贵/太不道德了。当然,有时候我们买不起好东西(比如使用单词的许可证,“因为”而不是“我希望”)。
没有实验,我们的行动是基于希望而不是证据。
如果生活如此不公*,以至于你不能做实验,这并不意味着你有资格跳到假装你做了实验的那一部分。相反,承认你在黑暗中盲目地四处摸索,并且要格外小心。
感谢阅读!喜欢作者?
如果要说谢谢,我很欣赏分享和转发。如果你渴望阅读更多我的作品,这篇文章中的大部分链接会带你去我的其他思考。
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
脚注
*** 因果推断是统计学的一个子领域,它试图在没有实验的情况下得出因果关系的结论。请注意,要让这些方法有效,你必须愿意接受堆积如山的假设,所以不是每个人都相信它们。他们也倾向于非常依赖于“我们想到了一切”这种想法,考虑到我们这个物种美丽的易错性,是相当牵强的。在大样本中利用随机性的精心设计的实验更有说服力。**
*** 总有一天,我会写关于功耗分析和如何设计实验的文章,但与此同时,你可以在我的其他文章[1&[2]中找到定义。*
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
你生活在一个快乐的国家吗?下面就用 Power BI 来了解一下吧。
采用微软 Power BI 的数据科学
使用微软商务智能分析世界幸福报告的逐步指南
准备好一个关于世界幸福的数据分析仪表板了吗?我将向您展示如何分析幸福报告这个词,并使用 Power BI 可视化它,而无需任何代码。
但首先对《世界幸福报告》做一个小小的介绍:
《T4 世界幸福报告》是联合国可持续发展解决方案网络的年度出版物。它包含了一些文章,以及根据受访者对他们自己生活的评价而进行的国民幸福度排名。
——维基百科
如果你想了解更多关于这份报告的信息,有一个官方网站可以给你提供大量的见解。
获取数据
我们使用的是 2017 年世界幸福报告的数据。csv 格式。虽然有更新的数据可用,但这一个远未过时,而且确实有良好的结构和完整的数据。
您可以下载。来自我的 Github 库的 csv。如果你不熟悉 Github 和 git,不要担心,有一个下载选项。点击克隆或下载并选择下载 ZIP 。把数据提取到你电脑的某个地方。开始分析吧。
获得 Microsoft Power BI 桌面
微软商务智能桌面是免费下载的,可以在的 Windows 商店买到。那些喜欢独立安装程序而不是从 Windows 商店下载的人可以从这里下载。
世界幸福报告分析
现在,我们已经准备好接触分析和 Power BI 桌面。为此,我们遵循 提取、转换、加载 ( ETL ) 的一般过程。
提取数据
启动 Power BI Desktop,随意注册或点击注册表下方的已经拥有 Power BI 帐户链接。
在那里,您可以登录或创建一个 Power BI 帐户并免费试用。
现在从入门窗口点击获取数据,选择 Text/CSV 作为数据源。
找到之前下载过的 data-2017.csv 文件。
接下来,我们从数据类型检测下拉列表中选择不检测数据类型,并点击转换数据。
为什么不自动检测数据类型?除此之外,我们将学习如何手动完成这一重要步骤,这是数据分析工具箱中的一项重要技能。
转换数据
现在我们已经从。csv 文件我们要转换它。
您可能已经发现,我们数据的第一行包含实际的标题(在数据分析中也称为特性)。为了使用第一行作为标题,我们通过点击命令功能区上的使用第一行作为标题来应用我们的第一个转换步骤。
注意第一行是如何被提升为数据标题的。
事实上,这个动作实际上应用了两个步骤:您可以在右侧的应用步骤面板中观察到这一点。除了提升头这一步,Power BI 试图(再次)推断每个特征的数据类型,没有做好我的案例。
为什么我会得到错误的数据类型? 数据类型的检测可能出错的原因有很多。最常见的是您正在使用的设备的区域设置。如果您的设备具有不同于英语(美国)或英语(英国)的区域设置,则值得在 Power BI 中更改区域设置以匹配您的数据。就我而言,我不得不从英语(瑞士)——这是一种非常不常见的环境——切换到英语(美国)。这很容易做到,你可以遵循这里的建议。
要撤销 Power BI 应用的更改类型步骤,只需点击它旁边的 X 图标。
我们在这里学习了一个非常重要的 Power BI 概念:您所做的所有转换都可以被视为一系列步骤,这些步骤一个接一个地应用于底层数据。这样,您可以保持原始数据不变(未修改),并动态地添加/删除转换步骤。记住这种行为,因为它使数据转换变得非常强大和灵活。
我能看到每个步骤对我的数据做了什么吗? 是的,你只需点击 应用步骤 面板中的一个步骤,就可以在你的变换步骤之间来回跳转。这样,您可以监控您的转换步骤实际上对数据做了什么。
现在是手工定义数据类型的时候了。选择总体快乐评分功能,并观察其当前数据类型。该特征应为数据类型十进制数,但目前被分配给数据类型文本。这由特征名称旁边的小 ABC 图标或数据类型控件上的值表示。
让我们通过点击数据类型控件并选择十进制数来改变它。
查看列中的数据如何变化(根据您的区域设置)以及 1.2 图标如何指示新的数据类型。
对数据中的每个特征重复此步骤,并根据下表将其设置为相应的功率 BI 数据类型。**
现在我们已经设置了正确的数据类型,我们可以继续并稍微清理一下数据。数据分析中的典型任务是检查缺失值,如空值、NaN 值或 n.a .值。
如果数据包含缺失值,Power BI 已经为您提供了一个很好的可视化指示。您可以在工作满意度功能上找到这样的指示。悬停指示器并点击移除空值从我们的数据中清除丢失的值。
我们的数据中有哪些缺失值? 没有关于北塞浦路斯和南苏丹的工作满意度数据,如 南 值所示。通过删除这些数据,我们删除了两个国家的完整条目。换句话说:这些国家不会出现在我们的分析中。**
作为我们的最后一步,点击关闭&应用,并使用保存图标随意保存您的工作。
既然我们已经转换和清理了我们的数据,我们准备好可视化它并回答我们的主要问题:你生活在一个快乐的国家吗?****
可视化我们的数据
我们将想象出最幸福的 10 个国家和最不幸福的 10 个国家。此外,我们将使用 Power BI QnA visual 来回答有关我们数据的其他问题。
让我们点击可视化面板上的图标,添加一个堆积条形图可视化。
当视觉仍处于选中状态时,从字段面板中检查国家和幸福分数字段。这将添加国家作为轴值和幸福分数作为值,给我们一个按幸福分数排序的所有国家的视图。****
让我们把范围缩小到前 10 个国家。选择视觉,展开滤镜面板上的国家是(全部)滤镜,从滤镜类型下拉列表中选择前 N 名。将其设置为前 10 位下显示项项。****
来多了?详情见下面截图。
最后,将快乐分数字段从字段面板拖放到过滤器的【按值 面板,然后点击应用过滤器。****
再次重复这些步骤,为最不快乐的国家添加一个第二视觉。这次你选择底部 10 而不是顶部 10 作为过滤器。**
相应地为你的两个画面设置标题。为此,选择视觉效果,点击格式图标,并将标题文本设置为最幸福的 10 个国家和最不幸福的 10 个国家。
要对结果进行升序排序,请单击图像右上角的小 … 图标。
作为最后一步,我们将地图和 QnA 视觉添加到我们的页面。对于地图,像之前一样在字段面板中目视检查国家。
我们已经完成了第一份数据报告的设计!您的最终视图应该类似于下面的屏幕。
你生活在一个快乐的国家吗?
我们来问问权力 BI QnA!我住在德国,所以我想知道我的国家的幸福排名。
点击进入询问一个关于你的数据的问题框,简单地说出类似德国的幸福排名。
这立刻给了我排名 #16 。因此,德国不在前 10 名之内,但它的排名相当不错。你的国家怎么样?
让我们将您的分析导出为 PDF 文件,与朋友或同事分享。转到文件并点击导出为 PDF** 。**
****恭喜你!您已经从一个. csv 文件中提取了数据,转换了数据,清理了数据,并最终可视化了数据,给出了对数据的见解,并回答了我们最初的问题。
就这样吧。
—塞巴斯蒂安
你在轨道上吗?—在没有代码的交互式路线图上传达您的战略主题。
微软 POWER *台解决方案
一张图胜过千言万语,路线图也是如此。让我们用 Microsoft Power BI 和 Power Apps 构建一个
当谈到调整你的组织或项目团队时,没有什么比一个清晰的、视觉上吸引人的路线图更好的了。
所以,如果你想要这个仪表盘👇那么这个故事是给你的!
但是等等! 有问题……
…路线图通常是与您的团队和利益相关者合作的结果。虽然我们有一堆很好的工具来可视化东西,但我们没有一个工具可以即时处理数据。
有了微软 Power BI 和 Power Apps 的组合,我们可以自己构建这样一个解决方案。
最棒的是:不需要编码技能!
设置公共数据服务
首先,我们需要一个存储路线图数据的地方。通常,这会导致在另一台服务器上建立另一个数据库。
幸运的是,微软 Power *台附带了一个叫做公共数据服务 (CDS)的东西,它可以让你安全地存储和管理你的业务应用程序所使用的数据。
我已经准备了一套示例路线图项目来帮助您开始,并将它们打包到一个中。csv 文件,可以从我的 Github 库下载。
使用 Power BI 和 Power Apps 构建路线图仪表盘-sebastianzolg/Roadmap-in-Power BI
github.com](https://github.com/sebastianzolg/roadmap-in-powerbi)
让我们开始在 CDS 中创建我们的路线图项目实体。确保你至少有一个微软电力应用和微软电力商务智能的试用账户。
在浏览器中打开电力应用,打开实体,点击获取数据。
有几种方法可以将数据载入光盘。我们选择文本/CSV 。
将产品路线图 Items.csv 从我的 Github 仓库上传到你的 OneDrive 或者将这个要点的 URL复制到文件路径文本框中,点击下一步。
检查数据是否正确加载,并点击下一步。
基于我们的样本数据,我们现在可以对我们的路线图项目实体进行建模。根据下面的截图对其建模,并确保您已经将所有的目标字段类型设置为文本、,除了描述字段,它应该保持为多行文本。
准备好之后,点击下一步。
我们可以选择定期刷新数据源中的数据,但目前我们坚持手动刷新。
点击创建,等待将您的数据载入 CD 的过程。
回到实体视图,我们可以搜索新创建的路线图项目实体,并确保它已被创建。
就是这样!我们的数据现在在云中,由 CDS 管理,我们可以在任何我们想要的业务应用程序中使用这些数据。
加载数据
现在我们已经将路线图数据保存在 CD 中,我们可以轻松地在 Power BI 中使用这些数据,以进行进一步的 ETL。
打开 Power BI 桌面,点击获取数据。
从可用数据源列表中选择 Power *台并选择公共数据服务。点击连接继续。
现在我们必须输入公共数据服务的根 URL。这个是每个账户唯一的,所以你要先自己查一下。
在 Power Apps 门户中,转到设置(齿轮图标)>高级设置。
复制根 URL,如下图所示。这是您的 CD 的 URL。
回到 Power BI Desktop,将 URL 粘贴到服务器 Url 字段,然后单击确定。
可能会提示您使用您的帐户登录。成功签名后点击连接。
如果一切顺利,您可以在导航器中搜索路线图。请注意,名称前缀会有所不同,因为每个帐户都是唯一的。
勾选 RoadmapsItems 表格图标旁边的方框,点击加载。
添加时间线视觉效果
现在,我们已经从光盘中加载了数据,是时候可视化我们的路线图了。我们将使用 Power BI Marketplace 中的作为时间线自定义视觉效果。
点击可视化面板中的 … 图标,并选择从市场导入。
搜索作为时间线,点击添加。
将空的作为时间轴添加到我们的页面后,我们现在可以将必要的字段从 CDS 数据源拖放到数据面板。查看下面的屏幕截图,看哪个字段放在哪里。
为了使它在视觉上更吸引人,选择时间线视觉,点击格式图标并设置如下属性。
Appearance > Y-Axis label length: 0
Appearance > Element height: 22
Overlay text options > xxx_item: Center
Overlay text options > xxx_item: 14
Title: Off
结果是在你的 CDS 数据上建立了一个看起来相当不错的时间线。干得好!抓紧了!
添加一个 Power 应用程序来处理数据
我们已经有了最重要的可视化工具,所以现在是时候更进一步,通过允许直接从仪表板更改数据,使我们的仪表板真正具有交互性。我们通过在仪表板上添加一个 Power 应用程序来实现这一目标。
为此,从可视化面板点击 Power App 图标,并从字段面板检查 xxx_item 。最后,在 Power App visual 中点击新建。
这将在您的浏览器中启动 Power App 门户。点击确定确认该重定向。
新创建的 Power 应用程序已经包含了一个我们想要去掉的图库控件。点击图库控件旁边的 … 图标,并选择删除。这给了我们一块空白的画布和很多空间来完成我们自己的工作😎。
从控制功能区,点击表单>编辑。
现在我们在画布、上有了一个空的编辑表单,我们可以连接到与 Power BI 仪表板相同的 CDS 数据源。点击数据库图标,搜索路线图项目。你应该看到你的 CDS 实体被列出。单击它,它将作为数据源添加到您的应用程序中。
选中空的编辑表单,从数据源下拉列表中选择路线图项目。这将把编辑表单绑定到我们的数据源。
接下来,我们告诉编辑表单我们想要显示哪些字段并使其可供编辑。点击编辑字段链接打开字段面板。
点击 +添加字段,将所有必要的字段添加到编辑表单中。您可以使用拖拽&对字段进行重新排序。
形态好看!现在我们有了一个可以显示和编辑值的表单,我们需要一个按钮来写回对 CDS 数据源的更改。
从控制功能区添加一个按钮,双击它并将文本更改为保存。
选择新按钮时,从公式栏中选择 OnSelect 动作,并粘贴下面的公式。
SubmitForm(Form1);
PowerBIIntegration.Refresh();
该公式只是将更改写回 CDS 数据源,并刷新 Power BI 连接。
注意 *PowerBIIntegration.Refresh()*
命令有一些限制,超出了这个故事。你可以在这里 读起来 。
接下来,我们需要告诉编辑表单要显示哪个特定的项目。该信息通过使用PowerBIIntegration
对象及其数据属性直接来自 Power BI。
下面的公式将从我们的数据源中查找项目,方法是将其名称与 Power BI 仪表板中的选定项目进行匹配。
LookUp(
'Roadmap Items',
Item = First(PowerBIIntegration.Data).crXXX_item
)
现在我们必须保存我们的工作。点击文件。
选择另存为,将应用程序命名为类似路线图项目编辑器的名称。点击保存。
回到我们的 Power BI 报告,Power 应用程序视觉效果应该已经自动刷新。通过点击时间轴上的单个项目来验证它的工作,并注意我们的编辑表单如何加载相应的细节。
好吧。让我们改变一些数据。单击时间线上的任何给定项目,并修改其开始日期和描述。点击保存按钮,并点击控制功能区上的刷新以查看您的时间线更新。
就是这样!我们需要的所有功能都有了。是时候让它看起来性感一点,并加入著名的黑暗主题🕶.了****
黑暗主题和更多视觉效果
回到 Power Apps,点击主题,选择暗黄色。
为了匹配我们 Power BI 仪表板即将推出的背景颜色,将应用程序的背景设置为#333333
。
别忘了保存并再次发布你的 Power App。变化应该立即反映在您的 Power BI 仪表盘上。
在 Power BI Desktop 中,从控制功能区点击开关主题,选择太阳能主题。
这给了我们正确的调色板,我们可以开始调整它甚至更多。以下是我推荐的一些设置。
动力匕页
Page Background > Color > Custom Color: #333333
Page Background > Transparency: 0%
电力 App 可视化
Background: Off
时间线视觉
Background: Off
Appearance > Scale Color: White
通过拖放添加更多的视觉效果后,你的最终结果应该如下图所示。
恭喜!你做得很好,这是一个非常好的仪表板,你现在可以用各种格式分享。考虑将其导出为 PDF,使用 Power BI 在您的组织内部发布,或者向您的利益相关者发送每周报告。
总结和想法
现在我们已经解锁了微软 Power BI 和 Power Apps 的组合 power ,我们可以实现更高级的场景。
添加一个按钮,将您的路线图项目导出到您组织中与特雷罗、吉拉或 Azure DevOps 合作的任何团队的看板板上,怎么样?
还有其他想法吗?祝你自己试用愉快。
就这样吧!
—塞巴斯蒂安
你准备好开始编程生涯了吗?要考虑的五个个人特征
不是每个人都适合从事编程工作。在你走得太远之前,你可能想知道你是否能成为一名程序员。
法托斯 Bytyqi 在 Unsplash 上的照片
在我们开始分析你是否适合做程序员之前,我们首先要明白编程是一个非常广泛的话题。
首先,你不一定要在软件公司工作才能成为程序员。随着技术的发展,编程几乎进入了所有行业,从空间科学、金融服务、教育、医疗保健,到能源、农业和制造业等传统行业。
第二,有许多不同的工作角色,他们的主要职责是用各种语言编程。例如,你可以是一名使用微软 SQL 的数据库管理员。你可以做一个专门研究 Angular 的网站程序员。你可以使用 Python 或 r 成为统计学家,你可以使用 Java、Kotlin、Swift 或 Flutter 开发移动应用程序。
第三,你不一定要有计算机科学或软件开发的学士学位才能找到一份好的编程工作。这是一个非常开放的就业市场。雇主关心的是你的编程能力。所以,如果你的教育背景不是编程,不要感到害羞。只要你有必要的编程技能,你总能找到编程的工作。
就这三个方面来说,有五件事你需要自己检查,看看你是否很适合程序员的工作,更重要的是,你想把你的职业生涯奉献给它,并有合理的回报,如工资,成就感。
№1.热情
如果你想选择什么作为你的职业,你必须有 100%的兴趣去做。如果你觉得编码很有趣,如果你可以调试你的代码一天而不累,如果你边走边想改进你的代码,你绝对对编程充满热情。
如果你对编程有热情,这里有几个重要的暗示。第一,有时候或者大部分时间自己做项目,你不会感到孤独。第二,你可以全神贯注地编码。我们都明白,如果不给予足够的重视,事情就做不好——编程也不例外。第三,编码是你的爱好。例如,当你有时感到不安时,写一些代码有助于你放松。觉得无聊的时候,写点代码自娱自乐。
№2.学习能力
你能学得多好多快,决定了你的编程生涯能走多远。如今,每隔几个月就会出现新技术、许多不同的编程语言和各种框架。许多旧的编程语言和框架跟不上最新的技术进步(例如,更好的智能手机),因此它们被抛弃了。因此,如果你不想丢掉程序员的工作,你需要思想开放,愿意主动学习新事物。
学习能力的一个重要方面是正确识别需要改进的领域。你需要跟上各种技术及其优缺点,并评估是否有任何东西可以用在你的项目中。我不能再强调它了。但是我见过太多的程序员总是想把最新的技术应用到他们的项目中,而不评估他们是否合适。因此,这个决策过程非常关键。因为你的时间和资源是有限的,如果你把它们投资在错误的方向上,它们就都浪费了。一旦选好了方向,你就投入时间去钻研,去挖掘官方文档,去学习各种相关教程。
№3.批判性分析
这是一个好程序员的基本要求。每个程序员在他/她的代码中迟早总会写出一些 bug。有时候,一个异常可以清楚地告诉你哪里错了。更多的时候,要知道 bug 在哪里并不容易。当它发生时,你必须批判性地分析相关代码,就好像代码是别人写的一样。
当客户或项目经理要求一个新特性时,这也是使用你的关键分析的好时机。首先,您需要评估它是否是一个有效可行的请求。很多时候,许多被请求的特性实际上是无用的。您可能想与利益相关者就是否值得花时间来实现它进行交流。当然,在这种情况下,沟通非常重要。第二,如果是真正的用户需求,你需要批判性地分析如何从数据模型到用户界面和体验实现。
№4.创造力(抽象和想象)
这大概是一个人编程生涯的上限了。要成为一名相当优秀的程序员,你不必在这方面特别优秀。通常,如果你作为一名架构师从零开始设计一个应用程序,你必须有很好的创造力来安排用户界面和交互方面的事情,以及可以使用哪些适当的技术。
即使你不必设计应用程序,编程也是一项或多或少需要创造力的工作。例如,如果您不能抽象某些用户活动和交互背后的逻辑,您就不能编写适当的代码来有效地处理这些活动。
在你编写复杂的代码来实现某些功能之前,你需要在脑海中想象或描绘整个流程。当然,你想为它绘制一些蓝图,但所有这类工作都需要大量的想象力。
№5.沟通
无论你想成为自由职业程序员还是在开发团队工作,你都必须有良好的沟通技巧。例如,如果你是自由职业者,你显然需要确切了解你的客户在寻找什么。你还负责展示你正在开发的产品。
如果你是团队的一员,沟通会更重要。如果你是一个 UI 程序员,你需要向后端开发者明确你在数据下载和上传方面的需求。当一个 bug 涉及到多个开发人员时,你们所有人都需要互相沟通,才能找到解决方案。
结论
如果你考虑以成为程序员为职业,你可以从这五个方面评估你的能力,从而对编程是否可以成为你的终身职业有一个粗略的想法。
最后,我不能再强调这一点,但是如果你对编程没有足够的热情,不要浪费你的时间,因为你会因为要跟上需要不断学习新事物的技术进步而受苦。
你准备好迎接视频分类挑战了吗?
阿尔茨海默氏症研究面临的数据科学挑战
视频分类准备指南
图像源(失速捕捉器)
为了帮助您在家工作时学习新技能并赢得一些在线奖金,MathWorks 推出了一项数据科学竞赛。
预告:Datathon 将于五月上线。注册驱动数据账户,接收发布公告。在这里申请免费的 MATLAB 许可证:用失速捕捉器推进老年痴呆症的研究
该数据集将由取自活鼠大脑的图像堆栈(3D 图像)组成,显示血管和血流。每个堆栈都有一个围绕目标血管段绘制的轮廓,并将被转换为. mp4 视频文件。问题是将目标血管段分类为流动的或停滞的。挑战将在网上进行,全球均可参加,并可免费参与。你可以用任何方法来解决这个问题。
在这个故事中,我将谈谈我在设置这个问题时学到的概念和方法。我还会给你指出你可以参考的文件,开始准备挑战。
使用数据
视频数据
处理视频是处理图像的扩展;我们还必须考虑视频的动态特性,而不是图像的静态特性。视频可以定义为一堆图像,也称为按特定顺序排列的帧。每一帧都有意义,但顺序也很重要。因此,需要测量帧的空间和时间内容。
所以,第一步是从视频中提取帧。确保帧应该同时具有序列建模和时间推理。
过程数据
处理视频的另一个挑战是数据集的庞大。在 MATLAB 中,您可以使用数据存储库的概念,为太大而无法放入内存的数据集合创建一个存储库。数据存储允许您将存储在磁盘、远程位置或数据库上的多个文件中的数据作为一个实体进行读取和处理。
参考文件:
- 了解数据存储的概念:数据存储入门
- 为图像、文本、音频、文件等创建不同的数据存储。不同文件格式或应用的数据存储
- 直接使用内置的数据存储库作为深度学习网络的输入:用于深度学习的数据存储库
- 为基于文件的数据实施自定义数据存储:开发自定义数据存储
- 质询的数据将使用存储在 AWS 中的数据。因此,学习如何从 S3 桶中访问数据
视频分类方法
一旦数据准备就绪,您可以使用以下 5 种方法中的任何一种进行分类。我将从基本的非深度学习方法到高级方法来谈论最常用的视频分类方法。但是由于数据的规模,我会鼓励你使用深度学习方法,并及时从每一帧中提取特征。
经典计算机视觉方法
方法 1:光流、目标跟踪和级联分类器
光流、活动识别、运动估计和跟踪是您可以用来确定视频相邻帧中的类别及其运动的关键活动。
参考资源:
- 要了解如何使用算法 Horn-Schunck 方法、Farneback 方法和 Lucas-Kanade 方法实现光流请查看本教程视频:计算机视觉训练、运动估计
- 关于跟踪&运动估计的更多示例和文档
- 要学习使用基于直方图的跟踪来跟踪物体,使用卡尔曼滤波器来跟踪遮挡或隐藏的物体,请查看本教程视频:计算机视觉训练,物体跟踪
- 举例说明如何对视频中的运动对象进行自动检测和基于运动的跟踪:基于运动的多对象跟踪
另一种方法是使用局部特征,比如图像的斑点、角落和边缘像素。级联分类器支持局部特征,如 Haar、局部二元模式(LBP)和梯度方向直方图(HOG)。
参考资源:
深度学习方法
方法二:卷积神经网络(CNN) +长短期记忆网络(LSTM)
在这种方法中,您使用预先训练的卷积神经网络从每一帧中提取特征,将视频转换为一系列特征向量。然后在序列上训练一个长短期记忆(LSTM)网络来预测视频标签。最后一步,将两个网络中的图层组合起来,组成一个直接对视频进行分类的最终网络。
要了解这个完整工作流程的步骤,请查看这个文档:使用深度学习对视频进行分类
图片来源( MATLAB 文档 t)
方法 3:用 CNN 进行大规模视频分类
如果视频分类像图像分类,为什么不直接用卷积神经网络?
要回答这个问题,记得我说过视频的时间成分。因此,为了捕捉时间和空间方面,你可以使用 CNN,但你需要以不同的方式构建网络。
来自斯坦福大学的论文使用卷积神经网络进行大规模视频分类,讨论了基本 CNN 对视频的挑战。它进一步阐述了您可以使用的所有不同的 CNN 模型,以融合来自多个帧的特征。
图片来源:研究论文
方法 4:双流 CNN
研究人员在本文中解释的另一种方法:用于视频中动作识别的双流卷积网络,是两个分别用于空间和时间方面的 conv 网络。
图片来源:研究论文
在 MATLAB 中开发 CNN 架构要参考的文档:
方法 5:使用 3D 卷积网络
3D ConvNets 是视频分类的首选,因为它们固有地在 3D 空间中应用卷积和最大池。在本文中:用 3D 卷积网络学习时空特征,研究人员提出了一种具有紧凑特征和高效计算的 C3D(卷积 3D)。
图片来源:研究论文
要参考的文件:
- 使用 MATLAB 中的 image3dInputLayer 、 convolution3dLayer 、maxpool3d layer等函数设计 3D-ConvNet
- 使用深度网络设计器设计网络
- 点击这里查看 MATLAB 中深度学习层的完整列表:深度学习层列表
- 处理 3d 医学图像的示例:使用深度学习的 3d 脑肿瘤分割
后续步骤
如果您没有 MATLAB 许可证,请从这里申请免费的 MATLAB 许可证开始准备:用拖延战术推进老年痴呆症研究。
请继续关注进一步的更新,在我五月份的下一篇博客中,在比赛启动日。该博客将是所有其他细节问题的基准代码。
请在下面的评论中给出您的反馈或任何问题。
你准备好接受视觉变形器(ViT)了吗?
“一幅图像相当于 16x16 个字:大规模图像识别的变形金刚”可能会给计算机视觉带来又一次突破
达里娅·谢夫索娃在 Unsplash 上的照片
地球上的生命面临着兴衰循环。它不仅适用于生物,也适用于技术。数据科学中的技术充满了炒作和有偏见的成功故事。说到这里,有一些技术导致了数据科学的发展:卷积神经网络(CNN) 。自 2012 年 AlexNet 以来,不同架构的细胞神经网络已经为实际的商业运作和学术研究带来了巨大的贡献。【ResNet】由微软研究院在 2015 年带来了构建“深度”CNN 的真正突破;然而,这项技术即将光荣退休。神经网络之父、2018 年图灵奖得主之一杰弗里·辛顿(Geoffrey Hinton)多年来一直在提及 CNN 的缺陷。可以找他的一个研讨会“ 卷积神经网络 怎么了?“2017 年。CNN 的一个主要缺陷存在于合并图层中,因为它丢失了许多有价值的信息,并且它忽略了图像的局部与整体之间的关系。代替 CNN,Geoffrey Hinton 和他的团队在 2018 年发表了一篇关于 胶囊网 的论文;然而,它还没有取代 CNN。
目录
- 一幅图像的简介相当于 16x16 个字:大规模图像识别的变形金刚
- 为什么视觉转换器(ViT)很重要?
- 关闭
- 进一步研究的材料
一幅图像的简介相当于 16x16 个字:大规模图像识别的变形金刚
我是从安德烈·卡帕西 2020 年 10 月 3 日的推特上得知这篇论文的。
作者截图。这条推文是由 Andrej Karpathy 创作的。
安德烈·卡帕西(Andrej Karpathy)是特斯拉人工智能的高级主管,他曾在 2016 年教过一堂课 CS231n ,内容涵盖了斯坦福大学计算机视觉方面的主题。尽管内容已经过时,他还是表现出了用简单的语言表达复杂概念的高超技巧。我从他的课上学到了很多东西。
这篇文章的目的是给那些不了解 Transformer 的机器学习工程师和数据科学家提个醒,让他们在“创新科技公司”为 Vision Transformer 推出 GitHub 知识库之前做好准备。
这篇论文是谁写的?
作者截图。出处是论文上的扉页“一个图像抵得上 16x16 个字。”
我一般会在阅读前查看作者/机构的名字,以鉴别论文的可信度。这篇名为 一幅图像抵得上 16x16 个字:图像识别的变形金刚 的论文于 2020 年 9 月 28 日提交,由于论文正在进行双盲评审,作者姓名尚未透露。我不会明确提到公司的名字。然而,你可以做出一个有根据的猜测,谁能花得起 2500 个 TPU 日来训练一个模型(下面突出显示),还有另一个线索表明,该模型是在 JFT-300M 上训练的,这是一个拥有 3 亿张图像的私人数据集。
作者截图。来源是“一幅图像相当于 16x16 个单词”这篇论文中的表 2
为什么视觉转换器(ViT)很重要?
这不是第一篇将 Transformer 应用于计算机视觉的论文。脸书 2020 年 5 月发布【DETR】;然而,DETR 与 CNN 联合使用了《变形金刚》。ViT 是 Transformer 对于计算机视觉最成功的应用,这项研究被认为做出了三点贡献。
训练精度高,计算时间少
与 吵闹的学生 (由谷歌于 2020 年 6 月发布)相比,ViT 减少了 80%的训练时间,尽管 ViT 已经达到了与论文(上图)中表 2 所示大致相同的准确度。Noisy Student 采用了 EfficientNet 架构,我将写另一篇关于 EfficientNet 的博文,以帮助读者了解自 ResNet 以来,CNN 在不久的将来走了多远。
无卷积网络的模型架构
变压器架构背后的核心机制是自我关注。它提供了理解输入之间的联系的能力。当变压器应用于 NLP 时,它以双向方式计算单词之间的关系,这意味着输入的顺序不像 RNN 那样重要。具有 Transformer 架构的模型使用自关注层的堆栈而不是 CNN 和 rnn 来处理可变大小的输入。你可以在我的上一篇文章中了解更多关于 Transformer 的知识,这篇文章是用通俗易懂的语言写给商务人士的,“假装你熟悉 BERT 的最低要求”。
将没有 CNN 的变形金刚应用到图像的一个主要挑战是在像素之间应用自我关注。如果输入图像的大小是 640x640,那么模型需要计算 409K 个组合的自我关注度。此外,您可以想象,图像一个角上的像素不太可能与图像另一个角上的另一个像素有有意义的关系。ViT 通过将图像分割成小块(如 16x16)克服了这个问题。句子的原子是一个单词,这项研究将碎片定义为图像的原子,而不是像素,以有效地梳理模式。
作者截图。来源是纸上的图 1“一个图像抵得上 16x16 个字。”
小贴片变压器的功效
通过分析多头注意的中间结果,分析了 ViT 的内部表征。本文发现,该模型能够在位置嵌入的相似性中编码面片的距离。另一个发现是,论文发现 ViT 整合了整个图像的信息,甚至在《变形金刚》中的最低层。作为旁注,ViT-Large 有 24 层,隐藏大小为 1,024 和 16 个注意头。该论文引用的内容是“我们发现一些头部已经注意到最底层的大部分图像,这表明模型确实使用了全局整合信息的能力。”
定性分析模型性能通常与定量分析一样重要,以了解预测的稳健性。我通常使用 类激活图 (麻省理工学院于 2015 年发布)来验证模型性能的稳健性,方法是查看来自具有正确预测、假阳性和假阴性的图像的类激活图,以创建和测试不同的假设。
关闭
我很少阅读正在接受审查的论文,因为提交的论文内容会被修改,其中许多甚至会被期刊拒绝。但是,我写了这篇文章,因为内容真的很有创意,而且我也喜欢这篇论文富有诗意的标题!当论文正式发表时,我计划对这篇文章做一些更新。
更新:2020 年 12 月 4 日
视觉变形金刚的官方仓库准备好了。享受 ViT 的生活!
进一步研究的材料
- 你可以阅读提交的论文,在 OpenReivew.net,谷歌一幅图像值 16x16 字:大规模图像识别的变形金刚。
- Jay Alamer 的《变形金刚》插图是理解《变形金刚》如何一步一步工作的最佳材料,其中的图片非常有用。
- 如果你想在没有数学的情况下理解 Transformer 的应用,我的博客文章假装你熟悉 BERT 的最低要求将会帮助你,因为我的读者是商务人士和初级数据科学家。
- 如果你对视觉变形器统治这个领域之前,谷歌大脑和研究团队(截至 2021 年 2 月)使用 CNN 的计算机视觉的艺术模型感兴趣,你可以在中看到没有数学的解剖学简单的复制粘贴是计算机视觉问题的游戏改变者。
- 最后一个材料与学习 Transformer 的概念没有直接关系,但读者曾问我如何实现 Transformer。如果你已经对变形金刚有了基本的了解,首先你可以从这篇文章中学习如何使用 PyTorch,通过一个例子了解 PyTorch:一个分步教程,然后你可以通过 HuggingFace 的快速入门来创建你的第一个变形金刚模型。享受变形金刚!
你真的在照顾过度合身吗?
如果你的回答是“是的,我使用过提前停止”,你可能想看看这个
过度合身就像试着穿一套为别人量身定做的衣服。图片来源: Freepik
Y 你坐在一个满是数据科学家的酒吧里,无意中听到了下面这段对话:
-等一下!你解决了过度装配的问题了吗?
-是的,我用过早停。
即使你对机器学习一无所知,但你会说英语,你也能推断出两件事。首先,存在一种叫做“过度拟合”的不好的东西。第二,过度拟合可以用一种叫做“提前停止”的方法来克服。
这不仅仅是酒吧里的谈资。如果你翻阅深度学习的圣经,在第 425 页你会读到“早停应该几乎普遍使用”(Goodfellow)。在数据科学中,并不是每天都能听到“普遍”这个词。所以,你可能会相信提前停止是适配过度的哲人之石。但是,不幸的是,尼可·勒梅从未致力于机器学习。
提前停止是机器学习实践者最大的错觉之一。
事实上,许多人认为,通过使用这种技术,他们变得对过度拟合免疫。遗憾的是,事实并非如此。事实上,经常发生的情况是,你使用早期停止,但是你最终得到一个严重过度拟合的模型。
在本文中,我将使用著名的蘑菇数据集(可在 Kaggle 上获得)来展示这是多么容易发生。此外,我们将观察过度配合在实践中会造成什么样的损害。
以下是段落列表:
- 什么是过度拟合?
- 什么是提前停止?
- 树林中的数据科学家
- 约翰尼·德普谬论
- 德怀特家的晚餐
- 收尾
1.什么是过度拟合?
过度拟合是预测模型无法将它从一些数据 A(“训练数据”)学到的东西推广到一些新数据 B(“测试数据”)。
例如,假设你给一个模型 100,000 张猫的肖像和 100,000 张狗的肖像(训练数据),让它学会区分猫和狗。然后,你拿一万张新的猫狗肖像(测试数据),让模型给它们贴上标签。如果模型在测试数据上的表现不如在训练数据上的表现,则意味着您的模型不能进行归纳。
现在,如果一个预测模型不能很好地处理新的(看不见的)数据,那么拥有一个预测模型首先有什么意义呢?如果不危险的话,过度拟合会使模型无用。这就是为什么它是任何数据科学家都必须处理的最大问题之一。
但是数据科学家是聪明人,所以他们已经找到了防止过度拟合的方法。这些方法被称为“正则化技术”。
2.什么是早停?
早期停止是一种用于对抗过度拟合的正则化技术。它是“大概是深度学习中最常用的正则化形式”(深度学习,247 页)。它是如此简单、有效且无副作用,以至于 Hinton、Bengio 和 LeCun 称之为“一顿美好的免费午餐”。
此外,早期停止可以应用于通过后续迭代训练的任何预测模型,例如具有梯度下降的逻辑回归、梯度推进算法、神经网络等。
让我们看一个在迭代培训过程中培训和测试 ()* 表现的典型例子。
说明提前停止是如何工作的
可以看出,训练数据的性能不断提高。这是为什么呢?因为——随着迭代一个接一个地成功——模型对训练数据越来越“定制”。相反,测试数据的性能会提高到一定程度,然后开始下降。
提前停止的功能正是利用了这种行为。提前停止意味着在测试集上获得最佳分数时(在这种情况下,在第 77 次迭代时)采用该模型。通过这样做,我们将不会浪费时间进行不必要的迭代,我们将拥有一个在看不见的数据上工作良好的模型。
很神奇,不是吗?嗯,提前停止是强大的,但并不可靠。我们来看看为什么。
()为了简单起见,在本文中,我将不适当地使用术语“测试”数据来代替“验证”数据*
3.树林中的数据科学家
Dwight 是一名数据科学家。由于他计划下周末去采蘑菇,他已经从 Kaggle 下载了蘑菇数据集。Dwight 的目标是提出一个预测模型,能够根据蘑菇的特性告诉他蘑菇是否有毒。
数据集由 8124 个蘑菇组成。对于每种蘑菇,记录了 22 种不同的特征(如气味、菌盖形状、菌盖颜色等)。目标变量是蘑菇是可食用的还是有毒的。该数据集有一些特点:
- 所有 22 个特征都是绝对的;
- 它们都由少数独特的价值观组成。
这使得数据集几乎不会过度拟合。
德怀特意识到,如果他建立了一个糟糕的模型,他可能会因蘑菇中毒而住院。因此,他希望他的测试集非常可靠。因此,他只将 33%的数据放在训练集中,其余 67%放在测试集中。
德怀特数据帧的形状
这是德怀特的训练集的样子:
训练数据帧的前五行和前十列
是的,你没看错。德怀特不小心忘记了特征中的行索引!这个男孩如此心不在焉。然而,这个错误应该不会造成太大的伤害。事实上,由于 Dwight 将使用一些正则化技术,模型应该自动忽略“ROW_INDEX ”,因为它会导致过多的过拟合。
由于所有的特征(除了一个)都是分类的,Dwight 选择使用 Catboost ,这是一种非常强大的算法,正是为了处理分类特征而诞生的。为了使模型防弹,德怀特还决定包括早期停止,他认为这应该足以避免过度拟合。
在设置了一些他认为合适的超参数后,Dwight 启动 catboost 分类器:
Dwight 用于训练其模型的 Python 脚本
4.约翰尼·德普谬论
这就是 Dwight 的模型在每次迭代中对训练数据和测试数据的表现。
Dwight 模型在每次迭代中的训练和测试性能
这个数字是一个明显的例子,说明为什么早停并不像许多人认为的那样不可战胜。
早期停止着眼于测试性能发生了什么,但它没有说训练性能。然而,过度拟合是由两者之间的关系给出的。
事实上,在最后一次迭代中,该模型在训练集和测试集上的*均精度分别达到了 94%和 79%。这两个数字之间存在巨大差异,这是过度拟合的一个非常明显的迹象。
但德怀特不在乎。“毕竟——他认为——79%的测试成绩并没有那么糟糕”。他是这么看的:
“唯一重要的是测试集上的性能。谁在乎超配,只要我能有个好的考试成绩就行了?”
我打赌你以前听过这种说法。事实上,在机器学习的世界里,存在一种普遍的倾向,即只关注测试表现,而完全忽视训练表现。这就是我所谓的“T2”约翰尼·德普谬论“T3”。
这和强尼·德普有什么关系?
想象你是一个电影制片人。你的下一部电影需要一名男主角,你开始四处寻找,直到你有了一个想法:约翰尼·德普将是那个角色的完美人选。因为你是彻底的家伙,所以你做足了功课,查了他的一些电影的票房,比如《Mortdecai》(4700 万美元)、《Black Mass》(1 亿美元)、《独行侠》(2.6 亿美元)。现在,你可能会想“哇,那可是一大笔钱啊!约翰尼·德普绝对是个不错的选择。”
但是你没有考虑电影预算。换句话说,这项投资值得吗?事实上,约翰尼·德普已经连续两年成为“T4 片酬最高的演员”。这意味着与他的电影票房相比,他的片酬太高了。如果你只关注票房,你就看不到真正重要的东西:投资回报。
这如何应用于机器学习?
正如电影行业一样,在机器学习中,考虑投资回报也很重要。在机器学习中,“预期回报”是用训练集上的表现来表示的,而实际的“投资回报”是看不见的数据(测试集)上的表现。
德怀特对模特的期望很高。事实上,该模型“承诺”交付 94%的*均精度(训练性能)。然而,结果非常令人失望,仅达到 79%(测试性能)。这种模式就像是一种无法偿还投资者的资产。
5.德怀特家的晚餐
你可能认为票房和机器学习的类比有点鲁莽。好吧,如果你仍然不相信约翰尼·德普谬误在机器学习中与在电影行业中一样危险,那就看看德怀特模型的特征重要性吧:
德怀特模型的特征重要性。行索引是最重要的特性。这没有任何意义!
“ROW_INDEX”是模型中最重要的特性。基本上,Dwight 主要根据数据集中蘑菇的行索引来决定他要吃哪些蘑菇,这只是一个随机数!如果你不是俄罗斯轮盘赌爱好者,我会在接受他的晚餐邀请前三思。
当然,这只是一个玩具例子。在现实世界的应用中,模型要比这复杂得多。你不知道哪些功能应该是重要的,哪些功能不应该是重要的(如果你知道,你会从一开始就放弃这些功能)。这正是仔细观察训练和测试表现如此重要的原因。
例如,您可能最终拥有以下两种模型:
同样的考试成绩,不同的训练成绩
如果你是约翰尼·德普谬误的受害者,你可能会得出结论,模型 A 和模型 B 基本上是相同的,因为它们在测试数据上获得了相同的结果。然而,如果你有完整的图片,你会注意到模型 B 比模型 A 好得多,因为模型 A 显然是过度拟合的。
有很多原因可以解释你为什么要避免过度拟合:
- 当你有一个过拟合的模型时,很可能可行找到一个更好的模型(即训练性能较低和/或测试性能较高的模型),这就是:从模型 A 转移到模型 b。
- 机器学习模型意味着学习模式。过度拟合模型是学习了许多错误模式的模型。
- 过度合身的模特很快就会变老。如果你的意图是随着时间的推移使用你的模型,那么你将遭受更多的概念漂移。
6。结束
在本文中,我们使用了 Kaggle 上最不“过度适应”的数据集之一:蘑菇数据集。仍然不满足于此,我们还包括了在训练阶段提前停止。
但这是徒劳的:无论如何,我们最终得到了一个饱受过度拟合之苦的模型。这证明了对付过度拟合的灵丹妙药并不存在。
与过度拟合密切相关的是我们所称的“约翰尼·德普谬误”:忽视训练表现而只关注测试表现的诱惑。当然,测试性能很吸引人。但是,正如我们所看到的,这只是硬币的一面。
总之,处理过度拟合并不意味着仅仅使用早期停止(或任何其他正则化方法),而是意味着检查模型在训练集和测试集上的表现。这是评估给定模型泛化能力的唯一方法。
使用这款笔记本可以重现上述所有结果。
笔记本上的任何错误都是德怀特的错。
感谢您的阅读!我希望你喜欢这篇文章。
相反,如果你非常喜欢它,请留下掌声,并跟随我在 Medium 上阅读更多关于数据科学的帖子。也可以在 Linkedin 上和我联系。
你正在使用 K-Means 解决 ML 聚类问题吗?
绘制肘部曲线、轮廓曲线、簇间距离的一行程序,并了解 sci kit——了解可以改进模型的技巧。
来源:作者图片
K-Means 是无监督机器学习问题中最常用的聚类算法,它对于找到相似的数据点和确定数据的结构非常有用。在这篇文章中,我假设您对 K-Means 有一个基本的了解,并将更多地关注于您如何能够-
- 使用不同的方法,如肘形曲线、Sillhouette 曲线和簇间距离,找到 K (簇数)的值。
- 一个伟大的可视化库 YellowBrick ,它可以帮助你用仅仅 1 行代码来绘制这些曲线。
- 不同的 sci kit-学习技巧,以改善您的 K 均值模型。
如果你是新手,网上有很多很棒的文章可以帮助你理解 K-Means。我会推荐浏览博客,从 Imad Dabbura 、 K-means Clustering:算法、应用、评估方法和缺点和 Azika Amelia 、 K-Means Clustering:从 A 到 Z 涵盖了大部分内容。你也可以参考 Scikit-Learn 的文档来了解集群的情况,这些文档很好地展示了集群。
让我们开始,看看如何能做到这一点。
求 K-均值中的 K。
要使用 K-Means,我们需要指定 K 的值,这是我们想要将数据分组到的聚类数。大多数情况下,我们不知道数据中会出现多少组,找到 k 的最佳值变得很困难。幸运的是,不同的方法可以帮助我们找到正确的值。
在这里,我将通过 4 种不同的方式。
- 肘部曲线。
- 轮廓曲线。
- 星团间距离图。
- 使用其他聚类算法。
数据集详细信息
为了更好地演示,我将使用 Scikit-Learn 的 make_blobs API 创建一个数据集,该 API 用于通过将每个类分配给一个或多个正态分布的点聚类来创建多类数据集。
看看我创建的笔记本,它有更多的细节,可以随意下载并导入到您的环境中,然后在周围玩玩-
这个库提供了一个如何应用 K-Means 和使用 Yellowbrick 生成肘形曲线的例子…
github.com](https://github.com/ankitgoel1602/data-science/tree/master/clustering-projects/K-Means Example)
这里,我们使用 make _ blobs 创建了一个包含 10 个中心的数据集。
from sklearn.datasets import make_blobs# Generate synthetic dataset with 10 random clusters in 2 dimensional space
X, y = make_blobs(n_samples=1000, n_features=2, centers=10, random_state=42)
虽然我们创建了 10 个随机簇,但下图显示了一些簇之间存在重叠,我们将看到 Elbow 方法如何告诉我们获得最大增益的簇的确切数量。
来源:作者图片
肘形曲线
如维基百科所述-
肘方法是一种用于确定数据集中聚类数量的启发式方法。该方法包括将解释的变化绘制为聚类数的函数,并选取曲线的拐点作为要使用的聚类数。
肘形曲线背后的直觉是,所解释的变化会快速变化,直到数据中的组数增加,然后它会变慢,导致图表中出现肘形,如下所示。拐点是您应该用于 K-Means 算法的聚类数。
最*我发现了一个名为yellow brick的库,它可以帮助我们只用一行代码就绘制出肘部曲线。它是 Scikit-Learn 的包装器,因此可以很好地与之集成。
# Import ElbowVisualizer
from yellowbrick.cluster import KElbowVisualizermodel = KMeans()
# k is range of number of clusters.
visualizer = KElbowVisualizer(model, k=(4,12), timings=False)visualizer.fit(X) # Fit the data to the visualizer
visualizer.show() # Finalize and render the figure
上面的代码将生成这个包含所有细节的漂亮图形。默认情况下,它使用“失真分数”作为度量,计算每个点到其指定中心的*方距离之和。您也可以尝试这里提到的其他指标。
图片:作者来源
一些聚类问题可能不会导致肘形结构,而可能会导致连续下降的图形,从而难以选择 k 值。在这种情况下,我们可以使用其他方法,如下一小节所述。
轮廓曲线
通常,我们在聚类问题中没有基础事实(标签),评估需要使用模型本身来完成。剪影系数通过基于*均聚类内距离和由最大值归一化的该样本的*均最*聚类距离之间的差为每个样本生成分数来计算聚类的密度。我们可以通过为不同的 K 值生成图并根据聚类的分配选择得分最高的一个来找到 K 的最佳值。
下面,我画出了 K = 6,7,8,9 的轮廓图,你可以看到我们用肘方法得到的 K = 7 的分数最高。这也有助于我们识别类别不*衡,因为聚类的宽度显示了该聚类中的样本数量,如果您看到 K=9 的图表,我们有许多小聚类。
来源:作者图片
我用 Yellowbrick 生成了上面的图。下面的代码将为 K=7 生成一个 Sillhouette 图,你可以参考我的笔记本,了解如何通过它循环生成多个图。
model = KMeans(7, random_state=42)
visualizer = SilhouetteVisualizer(model, colors='yellowbrick')
visualizer.fit(X) # Fit the data to the visualizer
visualizer.show() # Finalize and render the figure
集群间距离图
尽管这可能无法直接帮助找到集群的数量。它有助于评估 K-Means 算法,因为它给出了聚类的相对重要性。默认情况下,Yellowbrick 使用 MDS(多维缩放)作为嵌入算法来嵌入到二维空间中。你可以在这里阅读更多相关信息。
model = KMeans(7)
visualizer = InterclusterDistance(model, random_state=0)visualizer.fit(X) # Fit the data to the visualizer
visualizer.show() # Finalize and render the figure
上面的代码会生成下面的图-
来源:作者图片
使用其他算法
我们可以尝试的另一件事是使用其他聚类算法,如亲和传播,它不需要您提供 K 的值,并使其成为学习过程的一部分。这些算法可能不适用于大型数据集。因此,在某些情况下,我们需要在数据子集上尝试它们,然后使用 K-Means 中的值。下面的代码预测了 10 个与我们使用的中心数量相匹配的集群。
from sklearn.cluster import AffinityPropagation# Creating Affinity Propagation model instance
affinity_propagation = AffinityPropagation(random_state=None, damping=0.90)# number of clusters found by Affinity propagation
len(affinity_propagation.cluster_centers_indices_)
决赛成绩
现在,当我们用不同的方法评估时,我们得到的 K 的最佳值是 7。让我们应用 K=7 的 K-Means 算法,看看它如何对我们的数据点进行聚类。
model = KMeans(n_clusters=7)# fit X
model.fit(X)# predict labels
data['y_pred'] = model.predict(X)# plot results
sns.scatterplot(x='feature1', y='feature2', hue='y_pred', data=data)
来源:作者图片
sci kit-学习技巧
Scikit-learn 为我们可以利用的 K 均值提供了不同的配置。你可以在这里找到的完整名单。我将介绍其中的几个,它们有助于改进我们的模型。
init='k-means++ '
K-Means 算法很大程度上取决于你如何初始化质心(聚类的中心)。Scikit-Learn 提供了可以使用的不同的 init 值,但一般来说,k-means++比其他的更突出,因为它试图初始化质心,使其(一般来说)彼此远离,从而导致可证明的更好的结果。
使用降维算法
K-Means 使用欧几里得距离来计算点之间的距离。据观察,在非常高维的空间中,欧几里德距离往往会爆炸,并且不太管用。因此,如果您有大量的特征,在 k-means 之前使用 PCA 等降维算法可以克服这个问题,并加快计算速度。
小批量 K-均值
对于大型数据集,K-Means 可能需要很长时间才能收敛。如 Scikit-Learn 文档所述-
MiniBatchKMeans 是 KMeans 算法的变体,它使用小批量来减少计算时间,同时仍然试图优化相同的目标函数。小批量是输入数据的子集,在每次训练迭代中随机采样。这些小批量极大地减少了收敛到局部解所需的计算量。与其他减少 k-means 收敛时间的算法相比,小批量 k-means 产生的结果通常只比标准算法稍差。
因此,如果您有一个大型数据集,一定要查看 MiniBatchKmeans。
聚类度量
大多数开始机器学习的人都知道准确性、精确度和召回率等指标。我们倾向于认为,如果没有标签,我们如何衡量结果。Scikit-Learn 提供了不同的聚类指标,如同质性、完整性、v-measure 或我们在这里讨论的剪影系数。这些指标可以帮助我们评估模型。虽然其中一些遵循半监督学习方法,并要求您有几个数据点的目标标签,但至少其他方法不需要任何标签。请点击这里查看 Scikit-Learn 中所有可用的集群指标。
缩放数据集
您必须在应用 k-means 之前缩放数据集,因为它会影响距离计算。
不均匀的形状(限制)
由于 K-Means 的工作方式,它通常适用于具有像球形一样的均匀形状的星团。如果您知道您的数据遵循不均匀的形状,那么最好使用其他聚类算法,如适用于不均匀聚类的 DBSCAN。
K-Means 是一种强大而简单的算法,适用于大多数无监督的机器学习问题,并提供了相当好的结果。我希望这篇文章能帮助您解决集群问题,并为将来的集群项目节省时间。还有,你在 Scikit-Learn 里用的是 Pipeline 吗?如果没有,请查看我的另一篇文章这里,它可以帮助你改进你的机器学习工作流程。
注意安全!!!继续学习!!!
你是否花了太多的钱来标记数据?
如何在不牺牲模型质量的情况下节省数据标注
技术专家将会记住 2010 年是大数据的十年。
数据存储变得足够便宜,以至于公司开始囤积数据,甚至不知道如何处理这些数据。数据收集变得无处不在,这在很大程度上要归功于物联网,它允许全新的有价值、可操作的数据流。数据处理极大地受益于 GPU 和 TPU 的新兴能力,以训练更强大的深度学习模型。
一般来说,拥有优势数据来推动业务运营是一件非常积极的事情。但是,今天生产的 90%的 ML 模型使用监督学习方法,这些项目的成功在很大程度上取决于公司准确有效地标记其数据的能力。
这说起来容易做起来难。
标签质量
如果您不熟悉通常收集标签的方式,您可能会认为标注是一项简单的任务。那些职业生涯致力于数据标签的人知道这与事实相去甚远。
当然,注解的概念本身看似简单。通常情况下,数据由负责生成被专家称为“基本事实”的人进行注释。生成的标签(如果标签比简单的值更复杂,我们称之为注释,就像在分段或边界框注释的情况下)是我们希望在该数据集上训练的模型为该特定数据点预测的类或值。举个简单的例子,注释器可能会查看一个图像,并从预先存在的类本体中标记一个对象。标签被输入机器进行学习。在某种意义上,标记是将人类知识注入到机器中,这使得它成为开发高性能 ML 模型的关键步骤。冒着被简化的风险,好的标签驱动好的模型。
问题是,在现实世界中,仅仅因为这些标签表面上看起来很容易,并不意味着它们在实践中很容易。
这里,我们有一个简单的图像和一些简单的说明。一个人类注释者被要求围绕他在原始的、未标记的图像中看到的任何人画一个矩形。很简单,对吧?这里,形象清晰;只有一个人,并且这个人没有被遮挡。然而,有很多方法会出错:例如,画一个太大的方框可能会导致模型过度适应背景噪声,并失去确定相关模式的能力。画一个太小的盒子,你可能会错过有趣的图案。这还没有考虑到注释者在压力下处理数据更快或赚更多钱的情况,或者犯了错误(诚实与否!)或未能正确理解说明。
质量注释(这张照片的所有版本由 Clem Onojeghuo 在 Unsplash 上进行内部注释)
较低质量的注释
更低质量的注释
一句“你在努力吗?”注释
现在认为这实际上是一个简单的用例,因为图像不包含太多的对象(现实生活中的情况实际上看起来更混乱),并且手头的任务是客观的。有多个部分遮挡的人的图像更难处理。同样的道理也适用于情感分析,其中存在固有的主观性。
我们可以继续。但关键是:即使是简单的标记任务也充满了潜在的错误。这些错误相当于你提供给你的模型的坏数据。很有可能,你知道这会导致什么。
相信暴徒!
面对所有这些潜在的挑战,收集足够高质量的标签来训练一个像样的 ML 模型会变得更加困难。然而,在过去几年里,有监督的机器学习仍然取得了巨大的进步。那么是什么原因呢?
“诀窍”是,虽然信任单个人类注释者是不明智的,但是依赖一个更大的群体实际上通常会让我们走得很远。这是因为如果一个注释者犯了一个错误,另一个注释者就不太可能犯同样的错误。换句话说,通过从多个人那里收集每条记录的标签,我们可能会去除大多数离群值,并确保标签更有可能是真实的。
例如,如果一个注释者在一个二进制用例中有 10%的机会出错,那么两个注释者出错的概率已经下降到 0.1 x 0.1 = 0.01 = 1%,这当然更好,但是对于每个(甚至大多数)应用程序来说还不够。三四个注释者会进一步减少这个数字。
注释中的小差异可以累积成大问题(图像来源: CIFAR-10 数据集)
质量与数量:数量能弥补不好的标签吗?
下一个问题是,你能否用越来越多的训练数据来对抗不准确标记的训练数据。换句话说,量可以对抗质差吗?我们在其他地方讨论了其中的一些权衡,但我们能够表明的一件事是,一些类比其他类更可能对坏标签敏感,并且修复坏标签的影响所需的额外数据量在整个数据集中变化很大。使用什么型号并不重要。糟糕的标签会对训练数据造成更大的污染,而且比只有少量标签良好的数据更有害。
换句话说,当涉及到标注时,并不是所有的数据都应该得到同样的关注。我们还证明了对标记噪声的敏感性几乎与模型无关。这是一个好消息,因为这意味着可以使用通用模型来识别需要更高标记准确性的有问题的数据簇,并在标记数据时战略性地依赖该信息。
什么是主动学习,它与数据标注有什么关系?
换句话说,拥有一个智能标签策略比你想象的要重要得多。不可否认,这并不像研究最新的模型那样有趣,但是对于将一个成功的模型推向生产来说,这常常是更重要的。如果你问任何数据标注专家在讨论如何减少标注预算时想到了什么,他们通常会说主动学习。
主动学习是 ML 算法的一个类别,是半监督学习的一个子集,它依赖于增量学习方法,并提供了一个优雅的框架,允许 ML 科学家处理仅部分标记的数据集。
主动学习基于一个简单而强大的假设,即并非所有数据都对模型有同等影响,并且模型不会以相同的速度学习所有数据。这是因为数据集通常包含大量重复的信息(这意味着一些记录可能单独有价值,但当与类似的记录一起使用时,提供的增量改进非常少),也因为一些数据不包含任何相关信息。
一个例子?假设您想要训练 OCR(光学字符识别)算法,但是有一个数据集,其中大部分记录根本不包含任何文本。通过增量添加更多的训练记录,主动学习动态地找到模型最难学习的记录(或最有益的记录),从而允许 ML 科学家首先关注最重要的数据。也就是说,主动学习选择“正确的”记录来标记。这是预算持有人可以欣赏的。
但是主动学习忽略了一些重要的东西。它不能必然推测给定记录需要收集的注释数量。
一般来说,公司一直将贴标频率(或每条记录的注释数量)视为静态参数,必须根据其贴标预算和所需的贴标精度预先确定。换句话说:你给每张图片贴五次标签,或者给每个句子贴三次标签。在如何选择最佳频率方面,真的没有理论支持,也没有框架来动态地调整频率,作为记录对模型的重要性、对噪声的容忍度以及标记它的难度的函数。
我们最*的研究改变了这一点。我们现在有数据来模拟标签准确性对模型准确性的影响,并建立策略来优化如何花费我们的标签预算。了解哪些记录需要更多标签,哪些不需要,这为智能优化标签预算策略打开了大门。
如何用更好的标签策略省钱
因此:标注准确性是每个记录的注释数量和错误标注记录的概率的函数,而模型准确性是标注过程的准确性和训练集大小的函数。当你把这些结合起来。你可以开始考虑如何将一个模型的准确性和它的标签预算结合起来。
我们模拟了一个 250,000 样本数据集的情况,其中每个标注的成本为 25 英镑,假设整个数据集的误标注概率为 40%,并获得了以下标注预算与 5 个不同训练数据量的模型准确性之间的关系:
在上面的图表中,每行的每个点代表一个额外的标签(图表由作者创建)
马上,您可以看到优化预算的战略标准实际上不是数据的量,而是每条记录的注释数量。
例如,预算为 50K 美元,客户最好将 50K 记录标记 4 次。与一次标记 200,000 条记录相比,这种策略的准确率提高了 16%。
然而,如果客户需要她的模型达到 86%的模型准确度,她会做出更好的选择,使用 200K 训练记录 3 次;与在 150,000 条记录的训练集上每条记录 5 个标签的策略相比,这将为她节省大约 50,000 美元(超过 25%)。
精确度与成本的对比分析(图表由作者创建)
如果我们现在表示相同的模拟数据,但是按照每条记录的注释数量对其进行分组,那么很明显,为每条记录标记一次数据是一个糟糕的主意。即使是两个注释也远远胜过一个容易出错的标签。大多数情况下,为每条记录添加 3 次注释似乎是一个安全的赌注,但是如果超过 3 次,你可能会对这一成本的合理性产生疑问。
现在,需要注意的是,到目前为止,我们仍然选择对所有记录使用固定数量的注释。但是自从最*我们能够确定一些类比其他类对标记噪声更敏感以来,尝试利用这一事实来进一步调整和优化我们的标记预算似乎是合理的。
在另一个模拟中,我们现在在一个*衡的 500K 数据集上有一个二元分类图像分类问题,假设一个更有利的误标记概率为 25%,并对一个对噪声的敏感度明显高于另一个的类进行建模。我们针对这个问题分析了四种不同的标记策略:
- 策略 1:我们将最不敏感的类标记两次,将最敏感的类标记三次
- 策略 2:我们将最不敏感的类标记三次,将最敏感的类标记两次
- 策略 3:我们将两个类标记三次
- 策略 4:我们将两个类标记两次
作者创建的图表
我们可以看到,应用于整个数据集的策略 3 导致最强的准确性;然而,它比策略 1 好不了多少,策略 1 要便宜得多。策略 1 似乎最适合低标签预算,而策略 4 更适合中等预算。
在类级别上调整标签策略当然会导致一个先有鸡还是先有蛋的问题,因为标签是对数据进行分类所必需的;然而,同样的敏感性研究可以与无监督的方法相结合,并应用于聚类而不是类;这项研究是我们目前的重点领域之一。
结论
那么这一切给我们留下了什么?首先,我们希望你已经意识到更多的数据并不总是一件好事。另一方面,更干净、标记更好、更准确的数据是。
但实际上,从我们的实验中最重要的是:你可能花了太多的钱来标记数据。如果你像许多 ML 从业者一样,你可能会贴太多标签,而没有深入研究质量,以及你的好标签和坏标签对你的模型有多大影响。记住:不同的类和不同的问题需要不同的标签模式。利用主动学习来了解哪些类需要贴标机的额外关注,有望以现在所需的一小部分成本和时间建立更准确的模型。这应该让你公司的每个人都参与进来。
你仍然没有使用“整洁”的数据集吗?—以下是您应该这么做的原因
什么是整洁的数据集,它们的好处,以及如何用 Python(带代码)将杂乱的数据转换成整洁的数据
所以你有一个数据集。它可能是您自己生成的,也可能是您组织内的另一个部门交付给您的。你们中的一些人甚至可能刚刚从 Kaggle 等地方下载了它。
你通常用它做的第一件事是什么?(嗯,在您加载了它的内容并验证了数据是您所期望的之后。)
你们中的许多人可能已经回答了探索性数据分析——我认为这是一种伟大的本能。
话虽如此,我还是想说,实际上我们应该首先考虑将我们的数据转换成“整洁”的数据。但首先,我们来说说什么是整齐的数据。
(如果你希望跟随我的例子,我在我的 GitLab repo 这里,在tidy_your_data
下面包括我的代码和例子)
在开始之前
我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。
你需要pandas
和plotly
。用一个简单的pip install [PACKAGE_NAME]
安装每一个(在您的虚拟环境中)。
数据怎么整理?
数据科学中提到的“整洁”数据是指数据的特定排列。请看一下这个来自世界银行的特殊数据集,它显示了各个国家的病床数量:
“杂乱”数据的例子
这个数据集是“混乱”数据的一个例子,为什么会混乱?这和缺失值的数量,不同的小数位数,或者任何排序都没有关系。
简单来说,tidy data 排列信息,使得每一行对应一个观察值,每一列对应一个变量。
同样的数据,经过整理后,看起来像这样:
数据,但要让它整洁
看到那里发生了什么吗?在杂乱的数据集中,每一行都包括多个观察值,因为一个变量(年份)的变化由列表示。而在下面的 tidy 数据集中,每个观察值都有自己的行,并且 year 变量在每一行中都有表示。
这确实是它的范围。整齐的数据将每一行限制为仅一个观察值,并且将列限制为变量。凌乱的数据是…字面上任何不是整齐的数据。
(一个更严格的定义出现在哈德利·威克姆的一篇论文中,题目很恰当,叫做“整洁数据”。)
尽管如此,那又怎样?你为什么要关心,我为什么要写这个?让我们来了解一下以这种方式排列数据的好处:
我为什么要关心整洁的数据?
在这一节中,我们将通过一些简单的练习,用一个杂乱的数据集和等价的整齐数据集进行比较和对比。两者都加载:
messy_df = pd.read_csv('srcdata/demo_messy.csv', skiprows=4)
tidy_df = pd.read_csv('srcdata/demo_tidy.csv', index_col=0)
提取/过滤
只是提醒一下,这个数据集包括了各个国家的人均医院床位数(每 1000 人)。假设我们只想获得几个国家的数据,比如中国、德国、新西兰、南非和美国。
在这两种情况下,这样做都很简单:
countries_list = ['China', 'Germany', 'New Zealand', 'South Africa', 'United States']
messy_df_sm = messy_df[messy_df['Country Name'].isin(countries_list)]
tidy_df_sm = tidy_df[tidy_df['Country Name'].isin(countries_list)]
“国家”数据基本上是一个整洁的格式。如果我们想通过多年的观察来筛选呢?
在我们研究精确解之前,让我们停下来,看一下包含在混乱数据集中的列。他们在这里:
['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code', '1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989',
'1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']
您将看到包含各个年份的列列表。为了过滤某些年份,需要保留相关的年份列,而拒绝其他年份。
但这正是数据不整洁成为问题的地方。在杂乱的数据中,每一行都包含多个观察值,一些列(如“国家代码”)与所有这些观察值相关,而另一些列(如“2010”)只与其中一个观察值相关。
因此,在这种情况下,过滤掉数据将需要保留那些引用该行上所有观测值的列,以及那些引用相关年份的列。
这实际上意味着什么?两件事之一,真的。删除引用不相关年份观察值的列,或者筛选相关年份的数据,然后添加可变列。
在代码中,它可能是这样的:
year_list = ['1995', '2000', '2005', '2010']
var_list = ['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code']
messy_df_sm2 = messy_df[var_list + year_list]
而对于整齐的数据,您应该运行:
year_list = ['1995', '2000', '2005', '2010']
tidy_df_sm2 = tidy_df[tidy_df['year'].isin(year_list)]
我们可以开始看到这两个数据集中所需的工作量有所不同。随着查询复杂度的增加,差异可能会增加。看一看数据操作。
处理混乱(-y 数据集)
如何生成整个数据集的*均值?这对于我们整洁的数据来说是微不足道的:
print(tidy_df['hosp_per_1000'].mean())
就是这样!我们所做的只是简单地从列中抓取所有的数据(观察值),并将其*均。
在杂乱的数据集中,我们需要从包含观察值的所有列中获取所有数据,然后生成一个*均值。由于一些值是 null (nan)值,这就更加复杂了。
获取每一列的*均值,然后再获取一个*均值是行不通的,因为空值的存在意味着每一列的权重不同。
所以这可能是一种方法。
all_years = ['1960', '1961', '1962', '1963', '1964', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1974', '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']
messy_df_obs = messy_df[all_years]
messy_avg = np.sum(messy_df_obs.sum()) / sum(sum(messy_df_obs.notna().values))
可以想象,处理混乱的数据集所增加的复杂性可能会导致更多的错误。这是一个像取*均值一样简单的运算——你可以想象,随着数据或运算的复杂性增加,差异只会增加。
(哦,使用整齐的数据可能也有速度上的优势,但是除非你的数据集很大,否则这很难理解)。
那么——我们如何将杂乱的数据转换成整齐的数据呢?
创建整洁的数据
正如他们所说,有一个应用程序可以做到这一点。准确地说,是一种功能。
Pandas 包含了一个[.melt](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html)
功能,可以将杂乱的数据转换成整洁的形式。用 pandas 文档自己的话来说,这个函数将一个“宽的”(杂乱的)数据帧转换成一个“长的”(整齐的)数据帧,可选地留下标识符。
在我们的例子中,这些标识符是变量列表:
var_list = ['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code']
创建一个整洁的数据帧就像messy_df.melt(var_list)
一样简单——看看这个例子:
如果您要构建一个新的示例,只需确保每行只包含一个观察。让我们假设我们需要遍历数据并创建一个数据帧。您可能会这样做:
# With loops
data_list = list()
for i, row in messy_df.iterrows():
for yr in [str(i) for i in list(range(1960, 2020))]:
temp_dict = {k: row[k] for k in var_list}
temp_dict['year'] = yr
temp_dict['hosp_per_1000'] = row[yr]
data_list.append(temp_dict)
tidy_df_2 = pd.DataFrame(data_list)
这需要一些时间来适应,但是一旦你习惯了,它就会成为你的第二天性。
在我们开始之前——让我们来看看一些可视化选项,这些选项打开了整洁的数据。
数据可视化——但要保持整洁。
整洁的数据也更容易可视化。还记得我们之前提到的哈雷·威克姆吗?嗯,他是ggplot2
的创造者,也是整洁数据的最大拥护者之一。因此,ggplot2 更好地迎合整洁数据也就不足为奇了。
类似地,在 Python 中,像 Plotly Express 这样的包被编写为使用整齐的数据,专注于使语法简洁和一致。
因此,一旦 Plotly 被导入:
import plotly.express as px
绘制散点图:
fig = px.scatter(tidy_df_sm, y='hosp_per_1000', x='year', color='Country Name', template='plotly_white')
fig.show()
简单散点图
或者条形图
fig = px.bar(tidy_df_sm, y='hosp_per_1000', x='year', color='Country Name', template='plotly_white', barmode='group')
fig.show()
简单分组条形图
可以用基本相同的一行函数调用语法来完成,除了几个特定于图形类型的参数。
我想继续讨论可视化整齐的数据集,特别是与探索性数据分析相关的,但现在可能已经足够了。
(在 twitter 上关注我,或者点击这里获取更新!)
我希望这篇文章有助于你熟悉什么是整洁数据,它的好处是什么,以及它们是如何产生的。由于这是一个相当简单的概述,我确信有比我展示的更好的好处的例子。请在这里或者在推特上告诉我你的进展如何——如果你有任何建议的话!
下次再见,注意安全!
ICYMI,我也写了这些文章,你可能会感兴趣:
[## 使用 Python 在几分钟内构建一个 web 数据仪表板
通过将您的数据可视化转换为基于 web 的仪表板,以指数方式提高功能和可访问性…
towardsdatascience.com](/build-a-web-data-dashboard-in-just-minutes-with-python-d722076aee2b) [## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析
使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…
towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50)
你仍然没有对数据使用版本控制吗?
什么是数据的版本控制?该不该用?你可以去哪里试试?我做了调查所以你不用做了。
马库斯·斯皮斯克在 Unsplash 上的照片
最*,在一次公司会议上,我的一个同事问道:我们对数据使用某种版本控制吗?我惊讶地看了他一眼。你是指代码的版本控制吗?我的同事坚持说,不要数据。我从来没有听说过或想过数据的版本控制,但它让我思考,所以我就这个主题做了一些研究。在帖子的最后,我也分享一下我的看法。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
有没有产品提供数据的版本控制?有必要吗?让我们找出答案。
我在谷歌上输入任何改变游戏规则的产品想法,市场上已经有十个成熟的产品了——这是一个充满活力的时代。在谷歌上搜索数据的版本控制没有区别。引起我注意的产品是 dolt 。
Gif 来自 giphy
dolt 是什么?
Dolt 是 SQL 数据库中数据体验的真正 Git,为模式提供版本控制,为数据提供单元级控制,所有这些都针对协作进行了优化。使用 Dolt,您可以查看上次收到的数据与这次收到的数据之间的人类可读差异。在部署新数据之前,您可以很容易地看到意料之外的更新并解决问题。
作者说,它就像 Git,但不是数据。它是一个具有 Git 风格版本的开源 SQL 数据库。在从事数据科学项目时,我们自己对数据集进行版本化。很多时候我们不记得 v5 和 v6 有什么区别。当我们将代码提交到存储库时,Dolt 会存储提交日志,这样更容易返回并查看更改。
存储库托管在哪里?
就像 Github 之于 Git,DoltHub 之于 Dolt。 DoltHub 只对在 DoltHub 上公开的数据集免费。价格为每月 50 美元,用于托管私人存储库。
数据的版本控制有哪些用例?
这是一个百万美元的问题,我一直在问自己。作者声称,指导性用例是在互联网上共享数据。Dolt 允许您共享数据库,包括模式和视图,允许您删除所有用于传输数据的代码。
DoltHub 允许你“先试后买”数据。您可以在 web 上运行 SQL 查询来查看数据是否符合您的需求。数据提供者甚至可以构建示例查询来指导消费者的探索。通过提交日志,您可以看到数据更新的频率。您可以看到谁更改了数据以及更改的原因。
怎么才能试试?
DoltHub 对公共数据集是免费的。您可以使用 Google 帐户登录。我创建了一个新的公共存储库,名为 iris(数据科学家知道我所说的数据集)。
带虹膜数据集的 Dolthub
然后,您可以像 wit Git 一样克隆存储库——这一切感觉如此熟悉。但是,在克隆 repo 之前,您需要安装 dolt CLI。开发人员考虑到这一点,所以他们将 install 命令放在 clone 旁边。
sudo curl -L https://github.com/liquidat
安装 dolt 后,您需要使用 CLI 工具登录,将密钥与您的帐户相关联。这将在 web 浏览器中打开页面。
dolt login
现在,您可以克隆存储库了。
dolt clone romanorac/iris
让我们放一些数据进去。我从 sklearn 上获取了虹膜数据集,将其转换为 pandas DataFrame 并保存为 CSV 格式。
import numpy as np
import pandas as pd
from sklearn import datasetsiris = datasets.load_iris()
df = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
columns=iris['feature_names'] + ['target'])
df.target = df.target.astype(int)
df = df.reset_index()df = df.rename(
columns={
'index': 'identifier',
'sepal length (cm)': 'sepal_length',
'sepal width (cm)': 'sepal_width',
'petal length (cm)': 'petal_length',
'petal width (cm)': 'petal_width'
})
df.to_csv('~/Downloads/iris/iris.csv', index=False)
要将 CSV 文件放入 Dolt,您需要创建 SQL 表。
dolt sql -q "create table iris ( identifier int, sepal_length float, sepal_width float,petal_length float ,petal_width float, target int, primary key (identifier) )"
然后,您只需导入该表。
dolt table import -u -pk=identifier iris iris.csv
导入表后,您需要添加文件,编写提交消息并将其推送到存储库——就像使用 Git 一样。
git add .
dolt commit -m "Initial commit"
dolt remote add origin romanorac/iris
dolt push origin master
让我们来看看数据在 DoltHub 中的样子。我们看到了熟悉的虹膜数据集。
现在,让我们改变一个虹膜样本,看看不同的行动。
dolt sql --query 'UPDATE iris SET target=0 where identifier = 100'git add .
dolt commit -m "Change sample 100"
dolt push origin master
我们换了 100 排的班级。DoltHub 很好地将它可视化。
我的看法
作为一名数据科学家,我知道管理多个版本的数据集可能会很麻烦。尤其是对于已经在生产中的模型和多个数据科学家正在研究的模型。在这里我看到了 Dolt 的潜力。diff 功能看起来对较小的数据集很有用,但我不确定它对较大的数据集有什么帮助,因为在较大的数据集里,每一行都是变化的。我还必须用更大的数据集(几千兆字节的数据)对 Dolt 进行压力测试。它会随着时间变慢吗?
我认为 Dolt 和 DoltHub 的真实用例是共享数据。出售数据的公司可以记录每一个变化,因此客户可以透明地观察变化。DoltHub 还在冠状病毒流行期间展示了它的可用性,因为您可以使用分支管理具有相同模式的不同质量的提要。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。
你还在用 JupyterLab 吗?
数据科学城推出了一款新的高端产品。它有超强的编码辅助,调试等等……值得切换吗?
约书亚·索蒂诺在 Unsplash 上拍摄的照片
我喜欢它们或者讨厌它们,有一件事是肯定的——Jupyter 笔记本已经成为从事数据科学的事实标准。虽然这产品不错,但也有它的缺点。JupyterLab 解决了其中的许多问题,增加了选项卡、扩展管理器、主题和快捷方式编辑器。作为一个重度 JupyterLabs 用户,我 80%的时间花在 JupyterLab 上(另外 20%花在 SQL 编辑器上),所以编辑器必须是好的。有更好的选择吗?
Jupyter 笔记本已经成为从事数据科学的事实标准
这里有几个你可能会感兴趣的链接:
- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]
你愿意阅读更多这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。
认识一下 PyCharm 的笔记本
PyCharm 中的 Jupyter 笔记本支持。编辑器在左边,演示视图在右边。
PyCharm 最*获得了另一个超级能力——对 Jupyter 笔记本的原生支持。这使得 PyCharm 处于与 JupyterLab 竞争的最前线。但是有一个问题——Jupyter 笔记本支持只在 PyCharm 的专业版中提供,但是你可以免费试用。
主要特点是什么?
PyCharm 将编辑和查看结果分成两个独立的窗格(看上面的图片),而在 Jupyter 笔记本中,我们得到了两者的混合。当编写 markdown 或 LaTeX 方程时,这种分离非常有效,因为它可以实时呈现。
编写 markdown 时的实时预览
PyCharm 的杀手级特性是编码辅助。虽然 JupyterLab 有某种代码补全功能,但它很快就会丢失。代码完成只需与 PyCharm 一起工作。它显示了所有可用的方法,该方法采用了哪些参数,并突出显示了错误。这就是 PyCharm 领先 JupyterLab 多年的地方。
使用 PyCharm 完成代码
PyCharm 笔记本的杀手锏是编码辅助
PyCharm 远胜于 JupyterLab 的另一个领域是调试。祝 JupyterLab 调试方法好运。我试过 pdb 和 ipdb 包,但感觉很笨重。PyCharm 有一个优秀的调试查看器,您可以在其中列出对象并观察其变量的所有值。
在 PyCharm 中调试笔记本
我也喜欢开箱即用的代码格式化和强大的扩展支持——不需要像 JupyterLab 那样安装代码格式化扩展。PyCharm 还有一个很棒的扩展 IdeaVim,它比当前 JupyterLab 的 Vim 扩展更好。这主要是因为浏览器的限制,比如复制粘贴和 ctrl+n 和 ctrl + p 快捷键——Vim 用户会知道我在说什么。
它在幕后是如何工作的?
PyCharm 只是在端口 8889 上启动自己的 Jupyter 笔记本服务器,这样就不会与已经运行的 Jupyter 服务器发生冲突。
jupyter notebook --no-browser
如何试用 PyCharm 的笔记本?
PyCharm 的专业版有 1 个月的免费试用期,任何人都可以试用。如果你是学生,JetBrains(py charm 背后的公司)为一些大学提供免费的教育许可。
值得转行吗?
虽然毫无疑问 PyCharm 笔记本支持优于 JupyterLab,但它也不是免费的。我要说,如果你把大部分时间都花在编辑 Jupyter 笔记本上,那还是值得一试的。询问你的公司或大学是否能给你提供许可证。决不,我会说 PyCharm Jupyter 笔记本支持是一个必须使用的工具。我在 JupyterLab 工作多年,效率很高。
我在 JupyterLab 工作多年,效率很高
在你走之前
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。
照片由Courtney hedge在 Unsplash 上拍摄
你还在用熊猫做大数据吗?
Pandas 不支持多重处理,处理大数据集时速度很慢。有一个更好的工具可以让这些 CPU 内核发挥作用!
克里斯·库里在 Unsplash 上的照片
谈到探索性数据分析,Pandas 是最好的工具之一。但这并不意味着它是每项任务的最佳工具,比如大数据处理。我花了太多时间等待熊猫读取一堆文件,或者聚合它们并计算特征。
最*,我花时间找到了一个更好的工具,它使我更新了我的数据处理管道。我使用这个工具处理大量数据——比如读取多个 10gb 数据的文件,对它们应用过滤器并进行聚合。当我完成繁重的处理后,我将结果保存到一个较小的“熊猫友好”CSV 文件中,并继续对熊猫进行探索性数据分析。
这里有几个你可能会感兴趣的链接:
- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]
你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。
见见达斯克
Dask 为分析提供了先进的并行性,为您喜爱的工具提供了大规模性能。这包括 numpy,熊猫和 sklearn。它是开源的,可以免费获得。它使用现有的 Python APIs 和数据结构,使得在 Dask 支持的等价物之间切换变得容易。
Dask 让简单的事情变得简单,让复杂的事情变得可能
熊猫大战达斯克
我可以继续描述 Dask,因为它有如此多的特性,但是,让我们看一个实际的例子。在工作中,我通常会收到一堆需要分析的文件。让我们模拟我的工作日,创建 10 个 100K 条目的文件(每个文件有 196 MB)。
from sklearn.datasets import make_classification
**import** pandas **as** pdfor i in range(1, 11):
print('Generating trainset %d' % i)
x, y = make_classification(n_samples=100_000, n_features=100)
df = pd.DataFrame(data=x)
df['y'] = y
df.to_csv('trainset_%d.csv' % i, index=False)
现在,让我们一起阅读那些有熊猫的文件,并测量时间。Pandas 没有本地 glob 支持,所以我们需要循环读取文件。
%%timeimport globdf_list = []
for filename in glob.glob('trainset_*.csv'):
df_ = pd.read_csv(filename)
df_list.append(df_)
df = pd.concat(df_list)
df.shape
熊猫读文件花了 16 秒。
CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s
现在,想象一下如果这些文件大 100 倍——你甚至不能用熊猫来读它们。
用 imgflip 创建的迷因
Dask 可以通过将数据分成块并指定任务链来处理不适合内存的数据。让我们测量一下 Dask 加载这些文件需要多长时间。
import dask.dataframe as dd%%time
df = dd.read_csv('trainset_*.csv')CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms
Dask 需要 154 毫秒!这怎么可能呢?嗯,不是的。 Dask 有延迟执行范式。它只在需要的时候计算东西。我们定义执行图,这样 Dask 就可以优化任务的执行。让我们重复这个实验——还要注意 Dask 的 read_csv 函数本身就接受 glob。
%%timedf = dd.read_csv('trainset_*.csv').compute()CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s
compute 函数强制 Dask 返回结果。Dask 读取文件的速度是熊猫的两倍。
Dask 原生缩放 Python
熊猫与 Dask CPU 使用率
Dask 使用您购买的所有内核吗?我们来比较一下熊猫和 Dask 在读取文件时的 CPU 使用情况——代码同上。
读取文件时熊猫的 CPU 使用率
读取文件时 Dask 的 CPU 使用情况
在上面的屏幕记录中,当读取文件时,pandas 和 Dask 在多重处理上的差异是显而易见的。
幕后发生了什么?
Dask 的数据帧由多个熊猫数据帧组成,这些数据帧通过索引进行拆分。当我们用 Dask 执行 read_csv 时,多个进程读取一个文件。
我们甚至可以可视化执行图。
exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()
读取多个文件时的 Dask 执行图。
Dask 的缺点
你可能会想,如果达斯克这么伟大,为什么不一起抛弃熊猫呢?嗯,没那么简单。只有熊猫的某些功能被移植到 Dask。其中一些很难并行化,比如对值进行排序和对未排序的列设置索引。Dask 不是灵丹妙药——建议只对不适合主存的数据集使用 Dask。由于 Dask 是建立在熊猫的基础上的,所以在熊猫中慢的操作在 Dask 中也会慢下来。就像我之前提到的,Dask 是数据管道过程中的一个有用的工具,但是它不能取代其他库。
Dask 仅推荐用于不适合主存的数据集
如何安装 Dask
要安装 Dask,只需运行:
python -m pip install "dask[complete]"
这将安装整个 Dask 库。
结论
在这篇博文中,我只触及了 Dask 库的皮毛。如果你想更深入地研究,请查看令人惊叹的 Dask 教程和 Dask 的数据框架文档。对 Dask 支持哪些 DataFrame 函数感兴趣?检查数据帧 API 。
下载 Jupyter 笔记本跟随示例。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。
你还在用 sklearn 做回归分析吗?
当谈到 Python 中的经典机器学习算法时,sklearn 是第一个要去的包——还有其他你应该知道的。
安东·达利斯在 Unsplash 上的照片
对于大多数数据科学家来说,当谈到 Python 中的经典机器学习算法时,sklearn 是第一个首选包。但是这并不意味着没有其他优秀的软件包可以用来建模。我在本文中展示的软件包主要与回归分析有关,许多数据科学家不合理地将回归分析与简单化的建模联系起来。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
大多数认为他们需要高级人工智能/人工智能的公司实际上只需要对清理后的数据进行线性回归。罗宾·汉森发推文。
虽然我在上面的推文中感觉到了讽刺,但掌握线性回归的主要假设远远不是简单的(例如,多重共线性,多元正态性,同方差性等)。).许多数据科学家不知道的另一件事是,线性回归和逻辑回归是同一算法家族的一部分——广义线性模型(GLM)。
认识统计模型
我一直很喜欢 R 在训练一个回归模型后给你一个详细的输出。一个提供类似输出的 Python 包是stats models——一个用于估计许多不同统计模型,以及进行统计测试和统计数据探索的包。
r 中训练的回归模型的详细摘要。
在下图中,我们可以观察到用 statsmodels 训练的回归模型的摘要。看起来和 r 里面的差不多,甚至还会显示警告,这是相对于 sklearn 的另一个优势。
使用 statsmodels 训练的回归模型的摘要。
广义线性模型
如上所述,逻辑回归和线性回归是广义线性模型的一部分。GLM 通过链接函数将线性模型与响应变量相关联,并允许每个测量值的方差大小是其预测值的函数,从而推广了线性回归。广义线性模型由约翰·内尔德和罗伯特·威德伯恩提出,作为一种统一各种其他统计模型的方式,包括线性回归、逻辑回归和泊松回归。
想更多地了解 GLM,请听一听伟大的吴恩达的演讲:
吴恩达关于广义线性模型的讲座
GLM 让你使用概率分布作为建模的基础。让我们看一个使用 statsmodels 的逻辑回归的例子:
import statsmodels.api as smmodel = sm.GLM(y_train, x_train, family=sm.families.Binomial(link=sm.families.links.logit()))
在上面的例子中,逻辑回归是用二项式概率分布和 Logit 链接函数定义的。注意,y_train 是一个带有目标变量的数组,x_train 表示一个特征数组。
默认情况下,statsmodels 中不添加截距列(1 的列)。我们可以添加以下内容:
sm.add_constant(x_train)
要用线性回归(普通最小二乘回归)代替逻辑回归,我们只需要改变家族分布:
model = sm.GLM(y_train, x_train, family=sm.families.Gaussian(link=sm.families.links.identity()))
另一种常用的回归是泊松回归,它假设目标变量具有泊松分布。它被用来模拟计数变量,比如在学校患感冒的人数。同样,使用 statsmodels,我们只需要更改家族分布:
model = sm.GLM(y_train, x_train, family=sm.families.Poisson())
虽然 sklearn 中有线性回归、逻辑回归和泊松回归,但我真的很喜欢 statsmodels API 的实现方式。它还提供了许多定制,我将在下一篇关于 statsmodels 的文章中谈到这些。
下降趋势
在 sklearn 上使用 statsmodels 的一个缺点是它不支持稀疏矩阵。这使得用许多稀疏特征来训练模型是不可行的,例如用单词包方法转换的文本特征。
sklearn 文档优于 statsmodels 文档。
总的来说,sklearn 似乎比 statsmodels 更优化。
参考
- [1] 广义线性模型
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。
当你的机器人队友完成更多工作时,你会感到不安吗?
与机器人合作测量人类的成就感
列宁·艾斯特拉达在 Unsplash 上的照片
作为一名受人类心理学好奇心驱使的研究人员,我一直想探索更多关于用户的自我感知和成就感。在卡内基梅隆大学学习人机交互课程期间,我设计了一个项目,并带领另外两名队友探索人机合作如何影响人类的成就感。
在整个研究过程中,我发现当机器人做的工作比他们多得多时,人们对自己的自我表现不满意,尤其是如果机器人纠正了他们!
动机:为什么是成就感?为什么要共享任务?
因为人类是复杂的…机器人可以帮助我们更快更容易地完成工作,但当机器人做得比我们更多更好时,我们是否还会自我感觉良好,就像我们自己做时一样(即使我们对机器人的工作结果感到满意)?
假设
在人-机器人协作场景中,机器人参与程度的提高会导致人类成就感的降低。
研究设计
2x1 研究:每个参与者和一个 Cozmo 组成的团队玩一个 9x9 的数独游戏。在游戏过程中,参与者和科兹莫轮流填写答案,每轮持续 30 秒。轮流是为了确保他们都有*等的机会做出贡献,他们可以根据需要使用尽可能多的回合来完成游戏。由于 Cozmo 能力有限,其答案由语音宣布,由参与者填写。答案用颜色编码以区分玩家,整个研究过程被录像。
条件:
- 正常情况:Cozmo 作为参与者输入了相同数量的答案
- 过度条件:Cozmo 作为参与者输入了两倍的输入数。
独立变量:coz mo 的输入/转数
因变量:参与者的成就感
测量:
- 定量研究——调查(预测试调查和赛后调查);
- 定性研究——赛后访谈、观察。
测量人类的成就感
成就感被定义为“当个人受到挑战并意识到结果将反映他们个人的成功或失败时,他们会被激励去实现目标”(Smith,R. L .,2015)。在设计调查时,我“借鉴”了一些心理测量方法:
- need(N)——非常想达到某个目的;
- 成功的希望(HOS)——在成功实现之前期待成功;
- 成功感受(SF)——成功后的良好感受;
赛前调查
人口统计:
- 你多大了?
- 你的性别是?
- 你想获得哪个教育学位?
- 你以前和机器人交流过吗?
请用 1-5 分来评定您对以下陈述的同意或不同意程度(1-完全不同意,5-完全同意)。
熟练度:
- 我精通数独。
成就动机:
- 我渴望赢得这场比赛。
- 我渴望看到我在比赛中的表现。
- 如果我赢了这场比赛,我会自我感觉良好。
关于与机器人合作的感知
- 我渴望在游戏中与 Cozmo 合作。
赛后调查
请用 1-5 分来评定您对以下陈述的同意或不同意程度(1-完全不同意,5-完全同意)。
成就感:
- 这个游戏对我来说很有挑战性。
- 我喜欢这项运动的挑战。
- 我对比赛的结果很满意。
成就动机的变化:
- 如果我下次再玩,我会渴望赢得这场比赛。
- 赛后自我感觉良好。
- 我认为游戏结果反映了我对游戏的熟练程度。
对与机器人合作的看法
- 我对科兹莫在比赛中的贡献感到满意。
- 我对我和科兹莫在比赛中的配合很满意。
- 如果下次再玩的话,我很想和 Cozmo 再次合作。
- 游戏中你会如何在 Cozmo 的贡献和你的贡献之间分配 10 分?
- 如果 Cozmo 纠正了你在游戏中的输入,你对此作何感想?
除了调查之外,半结构式访谈和观察也补充了我的研究发现。
激动人心的部分…我发现了什么?
以下发现基于 16 名在校园招募的参与者的结果。性别分布和游戏水*分布是相等的。与机器人互动体验的比例为 9(是):7(否)。
一.关于成就
当人们需要帮助时,他们会重视机器人的输入。但是当机器人做了这个人本来可以做的那部分工作时,他/她的成就感很可能会降低。
在赛前和赛后比较以下 3 个要素时,正常组无显著性差异(P>0.05)。
然而,过度组明显增加了赢得游戏的欲望,降低了自我认知,减少了合作的欲望(P <0.05), which showed that 他们在游戏后变得更具竞争性,他们不像以前那样自我感觉良好,他们也不那么渴望与 Cozmo 合作。
这些发现得到了以下观察到的行为的支持:
- 轮流抢着写更多的答案😣
- 甚至在回合即将结束的时候,匆忙写下最后一个答案🤯
- 预测了科兹莫的答案,表明他们知道答案😒
- 冲着科兹莫大喊“站住!!"😫
- 发誓“啊,XXCK!Cozmo!”🤬
当机器人纠正人类时会发生什么…
在正常组中,Cozmo 纠正参与者越多,他们对自己的合作越满意。在过度组中,当 Cozmo 纠正他们时,参与者不太满意。当机器人以一种流畅的方式纠正人们时,这是完全可以接受的,甚至是有帮助的。但是当机器人本身具有攻击性时,人们会强烈地消极地看待纠正。
一个参与者的黑板上写满了更正
“我很沮丧,因为科兹莫不喜欢我的答案,他几乎纠正了一切。”
“我觉得自己不够聪明,无法独自解决这个游戏”
当有人有机会纠正一个机器人时(我们在遥控 Cozmo 时犯了一个错误……),这个人说“那很有趣。那真的很有趣。”🤣— 这向我们展示了一个人的自信可以通过纠正一个机器人来重建。
二。关于信任
在人机协作任务中,人们依赖机器人的贡献。但他们的信任可能会随着时间的推移而建立起来。
科兹莫是一个令人满意的队友吗?
两组人都认可 Cozmo 的贡献,Cozmo 贡献越多,越多人对游戏结果感到高兴。
人们信任科兹莫的能力吗?
总的来说,当 Cozmo 纠正参与者的答案时,有两种反应。
首先,一些参与者立即信任了 Cozmo。
“我会盲目地信任他,因为他是一个机器人,我会假设他有完美的程序来解决世界上任何数独难题。”
其次,对于其他参与者来说,信任需要时间来建立。
“起初我不相信,但这些数字是合理的,所以我知道他是对的”
一名参与者将科兹莫的答案更正回他的答案
限制
一如既往,还是有局限性的。
首先,轮流设置很棘手。它给参与者增加了更多的竞争氛围,但也可能会打断他们的思维过程,就像他们在玩数独时通常会做的那样——不过我确实认为利大于弊。在真正的人-机器人协作任务中,花费的时间是一个重要的衡量标准,因为我们希望优化成本和效率。
第二,让参与者填写 Cozmo 的答案需要更多的认知努力,这对他们来说更困难。
第三,我们需要一个更加多样化的小组和大量的参与者来获得有统计学意义的发现。
参考
史密斯,R. L. 《成就动机的情境测量:对咨询研究的意义》 (2015) 。
你用够优惠券了吗?
建立模型来预测优惠券的兑现和设计更好的促销活动
图片取自giphy.com
我喜欢好的销售。在网上商店的收银台点击购买按钮之前,看到总价打折是如此令人满意。此外,我定期购买家庭用品或我的狗和猫的药物和补充剂,我需要定期获得更多的折扣。我们会收到关于特别优惠和优惠券的通知和电子邮件,我们有时会等待交易来进行大额采购和购买礼物,如黑色星期五。
优惠券营销策略有很多好处。优惠券吸引新客户,重新激活老客户。使用优惠券的促销活动可以吸引客户尝试新产品或相关产品并购买更多产品,从而创造非常有效的广告机会。例如,亚马逊 2019 年的 Prime Day 的销售总额超过了 2018 年黑色星期五和网络星期一的总和。
为了衡量促销活动是否成功以及如何改进,调查优惠券的兑现情况以及影响优惠券兑现行为的因素非常重要。在这篇文章中,我想介绍我的项目对预测优惠券赎回使用机器学习技术。通过构建模型,我们还可以了解哪些因素会影响客户兑换优惠券,以及我们是否可以提出一些建议来设计更好的促销活动。
这篇文章将主要集中在总结这个过程——我如何以及为什么选择在每个步骤中使用的特定方法和技术,以及我如何解释建模结果。
关于数据集
以下是该网站的部分描述:
ABC 促销活动通过各种渠道共享,包括电子邮件、通知等。许多此类活动包括为特定产品/产品系列提供的优惠券折扣。零售商希望能够预测客户是否会兑现跨渠道收到的优惠券,这将使零售商的营销团队能够准确地设计优惠券结构,并制定更精确和更有针对性的营销策略。
此问题中的可用数据包含以下信息,包括活动样本和先前活动中使用的优惠券的详细信息-
用户人口统计详细信息
活动和优惠券详情
产品详情
以前的交易
根据过去 18 次活动的交易和绩效数据,预测每个优惠券和客户组合的测试集中接下来 10 次活动的概率,客户是否会兑现优惠券?
请注意,我只使用了包含 18 个活动信息的训练数据集,将该数据集分为两组——训练集和测试集,因为它具有已知的目标变量值。
数据从 Kaggle 获得,由 6 个表格组成。
来自 Kaggle 的数据库模式
目标变量是序列中的 redemption_status ,预测变量从其余特征中创建。该网站描述的最初任务是使用训练数据集训练模型,这是大多数功能不言自明的结果,所以我只想说明其中一些功能并不明显。但是你可以访问我的 GitHub 库或者ka ggle 站点来获得每个特性的定义。活动数据中的特征 campaign_type 为匿名活动类型(X 或 Y);例如,像半年一次或一年一次的定期销售和像季节性活动这样的不定期销售可以归类为 X 类型,而其他不一致的活动可以归类为 Y 类型。客户人口统计表中的 income_bracket 表示一个标签编码的收入等级,较高的收入对应于较高的数字。
数据理解
我在这些数据中发现了三大特征。
首先,目标变量、redemption_statuse、是分类变量,0(否)或 1(是)用于息票兑现,因此这是一个分类问题。
第二,目标变量不*衡。用数据准备步骤前的原始数据,赎回率为 0.93%!很难为一小部分人正确训练模型,因为预测 100%的“未赎回”将产生超过 99%的准确性。
第三,表格需要仔细合并,需要创建更多的功能。上面的模式显示它是一个关系数据库,除了客户交易数据之外,所有的表都有一个主键,这个主键是表中每个数据点的惟一值。表中包含“id”的模式的列表中的第一个功能是主键,但是客户事务数据没有唯一的事务 id。因此,为了使用此表中的数据,需要按关键字聚合数据,例如使用客户人口统计数据和客户交易数据中的 customer_id 的每个客户使用的优惠券折扣数。
数据准备
我不会重复我所经历的每个数据准备过程,但我会强调主要步骤。你可以访问我的 GitHub 库来查看整个过程和代码。
为了处理不*衡类问题,实现了 SMOTE(综合少数过采样技术)重采样方法。它在训练数据中生成了更多的正类(1,“已兑换”)数据点,这些数据点具有与原始数据点“相似”的属性。由于我们正在干预模型的训练方式,过采样数据的大小应该尽可能小。在图 1 中,当少数类与多数类之比大于 0.33 时,ROC 曲线下面积(AUC)值彼此相似,这是为重采样过程选择的。
图一。测试数据集预测的 ROC 曲线。训练数据集随着少数类(1,赎回)与多数类(0,未赎回)的不同比率而变化。曲线离直线越远(AUC 值越大),模型拟合越好。
注意,SMOTE 方法很容易使用imblearn
包在 python 中实现。
图 2。SMOTE 方法的示例代码。在 SMOTE_ratio = 0.33 的情况下,两个类别之间的比率变为大约 1:3。
此外,数据准备的最大部分之一是组合来自多个表的信息的特征工程。例如,如果我们要从客户交易数据中获得关于商品的信息,我们需要通过 item_id 聚集交易表。我们可以使用pandas.pivot_table
功能创建列表中描述的新特征。
表 1。通过聚合客户交易数据中的列创建的新功能。
图 3。由pivotting tables
汇总数据的示例代码
例如,我无法组合上表中与项目相关的特性列表,因为它们不包括训练和测试数据中的 item_id 。所以transaction1
是通过来自客户交易数据的数据聚合(代码中的transaction
)用新特性创建的。然后合并到物品数据表和优惠券物品映射表。最后,合并的表中的特征通过 coupon_id 聚集,其是训练和测试数据集中的列之一。重复数据聚合和两个表的合并,以提取尽可能多的信息,将它们与训练和测试数据集相结合,作为新特征。
模型建立的过程
在我们进入数据分析和建模之前,我们需要对这个项目的建模有一个清晰的预期。我发现询问和回答这些问题对于选择模型的类型和度量模型性能的标准非常有帮助。
—我想从建模中得到什么?
我想知道是什么影响顾客不使用或使用优惠券,这样我就可以设计有效的促销活动,让更多的顾客参与进来。这意味着我希望模型具有解释哪些预测变量对预测目标变量值影响更大的特征重要性。我选择使用逻辑回归、随机森林和梯度推进方法,因为它们都可以提供特征重要性,并且这三种方法在寻找预测变量和目标变量之间的关系时彼此有很大不同。
—在目标变量(息票兑现状态)的两个类别之间,预测哪个(或曾经哪个)更重要?
由于给定数据集中的大多数交易没有使用优惠券来获得折扣(因此是不*衡的数据集),我希望模型了解优惠券兑换交易的条件。因此,我想专注于预测积极的类权利,并通过专注于回忆分数来检测它们中的大多数;在已知的正类总数中,预测的正类数所占的比率。准确度分数仍然很重要。然而,如前所述,即使大多数正类都是错误的,仍然会产生高精度的模型,而这并不是判断模型的最有用的度量。只要准确度“稍微”高,我们就将模型调成具有高召回分数。
—预测错误的后果(成本)是什么?精准评分怎么样?
在这种情况下,具有相对高数量的假阳性从而具有低精度分数的后果不是很严重。与信用卡欺诈检测或疾病检测问题不同,包括许多假阳性只是意味着基于该模型的下一次推广将针对更广泛的条件。此外,请注意,召回分数和精确度分数是相反的关系。为了增加召回分数,挑选肯定类的规则将是宽松的,并且将接受更多的假肯定,因此精度分数下降。
通过回答以上问题,我的计划变成了:
- 使用逻辑回归、随机森林和梯度推进方法建立模型,
- 调整侧重于召回分数的模型,
- 分析模型结果和特征重要性。
模型评估和结果
表二。不同模型在列车组上的评估分数
表 3。不同模型在测试集上的评估分数
图 4。通过图比较训练集和测试集之间的评估分数
图 5。三种模型的混淆矩阵比较:随着真阳性(右下值)数量的增加,假阴性数量减少。
对于这三种数据,准确度分数表明模型没有过度拟合——训练数据和测试数据之间的准确度分数差异不是太大。然而,训练和测试数据集之间的召回分数的差异更大,尤其是梯度增强模型。正如我们之前所讨论的,当一个模型具有较高的回忆分数(尤其是对于次要肯定类)时,它具有相对较低的 F-1 分数和准确性分数,因为精确度分数较低。对于我们的需求,我们应该选择哪种模式作为最佳模式?嗯,检测更多的正类比预测的准确性更重要。所以我会选择逻辑回归模型和随机森林模型,而不是梯度推进模型。在这两个模型之间,尽管逻辑模型的准确度分数比随机森林模型的分数低大约 16%,但是其召回分数比随机森林模型的高大约 14%。因此,在分析以前的促销活动时,逻辑模型将是我依赖其特征影响的模型。另一方面,我会使用随机森林模型来估计促销活动设计时优惠券兑换的结果,因为它的准确性和 F1 分数高于具有相对较高回忆分数的先前模型。但是现在,让我们分析和比较所有三个模型的特性重要性和我们心目中模型的排序。在下面的图中值得注意的一件事是,从一个图到另一个图,有许多特征是一致的。事实上,随机森林模型中前 10 个重要特征中的每一个特征都在梯度增强模型中的列表上,只是在等级上有所不同。
图 6。每个模型的前 10 个最重要的特征:顶部)逻辑回归,中间)随机森林,底部)梯度增强。请注意,衡量每个模型重要性的系数和分数的尺度是不同的,因为它们的计算方式因模型而异。
首先,请注意,从模型到分级特征的系数和分数是不同的尺度,因为计算这些数字的公式因模型而异。此外,来自最后两个模型的分数现在确实指示每个特征是否对目标变量具有负面或正面影响,不像逻辑回归模型的系数那样假设预测变量之间的线性关系。我使用上述图中的特性重要性列出了解释和建议
客户特征分析
图 7。按优惠券使用次数统计的客户数量:兑换优惠券的大多数客户都不止一次使用过优惠券。
- 每位客户的*均优惠券使用量:*均使用很多优惠券的客户可能会使用更多优惠券:通过改善促销/优惠券广告的来源来鼓励客户使用更多优惠券
- 客户消费总额:在整个交易历史中具有高消费水*的客户,即忠诚客户或挥金如土的人,更有可能使用优惠券——想办法培养和保持忠诚客户,如启动奖励计划。
- 年龄范围:任何年龄范围特征都有负面影响,所以我们应该在相对意义上比较年龄范围相关特征。—调查 36 岁至 55 岁年龄段的客户不太可能使用优惠券的原因,并想办法鼓励他们参与促销活动。
促进
图 8。按活动类型统计的*均事务数:*均而言,X 类型活动期间的事务数要高得多。
- 活动类型 Y(-):虽然有 14 个 Y 类型促销和 4 个 X 类型促销,但 X 类型的交易和优惠券兑换的数量远远大于 Y 类型。通过观察两种类型的频率,X 类型的活动似乎是季节性销售,通常是大销售,而 Y 类型的活动在给定的数据时间内定期进行。对这一特征的负面影响可以被认为是,客户将预期在 X 类型活动期间使用更多优惠券,并且将较少关注通过电子邮件等渠道发送给他们的 Y 类型活动的优惠券。—通过将 type_Y 促销更改为 type_X 促销,在根据随机森林模型增加了 660%的测试数据集中,优惠券兑现率从 0.85%更改为 6.5%。这一预测表明,增加 X 型促销的规模可以导致息票兑现率的增加。另一方面,零售商可能会想出更好地宣传 Y 类促销的方法。
优惠券
- 优惠券使用总数:过去受欢迎的优惠券将有更高的机会被兑换。—调查使某些优惠券受欢迎并推广其他优惠券的因素。
- 优惠券覆盖的品牌数量:不同品牌的广泛适用优惠券更有可能被兑换。—制作不太针对品牌的优惠券
未来方向和局限性
虽然我能够提出有见地的结论和建议来提高息票兑现率,但这个建模工作有一些局限性。
模型通过最小化或最大化数学公式(如损失函数或信息增益公式)来导航和预测结果。他们没有关于这个数据集的业务理解或背景信息。因此,当我们从一个对我们没有意义的模型中得到结果时,我们必须以正确的方式分析它们。例如,根据逻辑回归模型,*均息票折扣对息票赎回有负面影响;顾客拥有的折扣券越多,他/她使用优惠券的可能性就越小。嗯,对我来说没什么意义。但我们可以看到它是*均优惠券折扣。如果每张优惠券的折扣值不像钟形曲线那样分布在中间,它们的*均值就不是表示数据集的最佳方式。这些值的中值或众数可能更好。
此外,虽然实现了三种方法来创建模型,但是可能有更好的方法来再现数据的行为。如果 XGBoost 库可以构建一个提供更好结果的模型,我以后会尝试使用它。
我希望这篇文章对你有用。我试图告诉你整个故事,而不是集中在一个特定的主题或技术。我将真诚地感谢您的评论和问题。
你使用马尔可夫链解决多渠道归因的方法正确吗
马库斯·温克勒在 Unsplash 上的照片
多渠道归属没有一站式解决方案
在过去的一年里,我花了一些时间研究多渠道归因问题。在这个旅程中,我被马尔可夫链解决这个问题的潜力所吸引。由于某些原因,马尔可夫链背后的数学概念非常容易理解,它的实现也很容易理解。然而,这并不是所有情况下的解决方案,我认为,在关于这个主题的文章中,并没有充分考虑到解决多渠道归因的设置是否符合使用马尔可夫链的必要条件。
在这篇文章中,你会发现一个快速演示的条件,需要尊重使用马尔可夫链作为工具来做多渠道归因。
多渠道归因问题:
问题很简单,当有一个涉及多个渠道(广告、网站页面、社交媒体帖子)的营销设置旨在推动客户转化时,我们如何评估每个渠道对转化的整体影响?
为了理解马尔可夫链在多渠道归因环境中的局限性,我们需要快速回顾一下。
马尔可夫链 101:
马尔可夫链是由两组参数定义的数学对象:状态和这些状态之间的转移概率。
对于多渠道归因问题,状态由您想要建模的流程/设置定义,这些是客户在“转换”之前可以采取的各种渠道/步骤(展示、社交媒体、谷歌广告等)。
转移概率是从一个状态转移到另一个状态的概率。它们可以用下面的公式计算。
另一个用例示例是使用马尔可夫链对儿童一天的活动进行建模。这些状态就是活动,比如玩、吃和哭。转移概率是一个活动接一个活动的概率。
路易斯·福克在 Quora
根据定义,马尔可夫链是内存小于,这意味着它只考虑当前状态来评估最可能的下一个状态。它带有强假设,即当前状态拥有关于下一个状态的所有信息。
如果你想了解更多关于马尔可夫链及其用例的知识,这篇文章是一个很好的起点。
多渠道归因的马尔可夫链
多渠道属性的马尔可夫链表示如下:
杰里米·纳尔逊在 Dev
马尔可夫链在哪些情况下可以用来做多渠道归因?
只要客户端从一个状态移动到另一个状态而没有任何中断,使用马尔可夫链进行多通道归因是有意义的,从而尊重无记忆假设。
假设您想要解决多渠道归因问题的设置由以下两个组件组成。首先,广告、文章和社交媒体文章的目标是增加你登陆页面的流量。其次是登陆页面和网站的其余部分(如果有的话)。在这种情况下,状态将是不同的进入通道(第一组件)、网站页面(第二组件)加上转换和空状态,它们分别对应于订单和订单的缺失。在本例中,我选择下订单作为转换状态,但根据您的分析重点,它可能是客户可以对您的业务进行的任何有价值的操作,例如:注册活动、将产品添加到购物篮、订阅时事通讯、请求销售电话等。
基于这种设置,我将给出一个用例示例,对于该用例,使用马尔可夫链作为解决多通道问题的工具是有意义的,而对于该用例,则没有意义。
工作用例示例
分析客户在您网站上的旅程,从引导他们进入您网站的入口渠道(第一部分)开始,到他们退出网站或下订单时结束。在这种情况下,顾客从一个状态到另一个状态没有任何中断地移动,因此无记忆假设得到尊重。
即使它允许将相对影响归因于花费金钱的媒介(展示、谷歌广告、社交媒体广告等),它们之间的预算优化也不应仅仅基于马尔可夫链结果。
非工作用例示例
分析客户的整个购买过程,包括从他们与你的品牌的第一次互动或最后一个订单后的第一次互动到(下一个)订单的所有状态(即转化),或者如果没有订单,直到研究时间框架结束(非转化)。在这种情况下,无记忆的假设是不被尊重的(至少在大多数时候),因为购买旅程只不过是你网站上不同的连续(有时是独立的)旅程的集合。事实上,一个客户最终在谷歌广告上点击了你网站的链接,这并不(完全)是因为他两周前滚动的最后一页,而是因为他通过他所经历的各种状态对你的品牌有了全面的体验。因此,当评估状态(即渠道)对整个购买过程的影响时,无记忆假设是不可接受的。此外,在这种情况下,将未转化状态定义为在研究时间框架结束时没有订单也是一个重要的假设,因为他可以在研究时间框架结束后几天转化。
履行
如果你对使用马尔可夫链解决多渠道归因问题有信心,你可以不遵循本文中的指南。
另外,R 中有一个由 CRAN 开发的很棒的包,用于将马尔可夫链应用于多通道属性问题。它附带了一个文档,将向您介绍使用它之前要做的数据处理步骤。
如果你想帮助我和其他人发现我们如何利用数据科学改善营销,我很乐意在Linkedin上讨论。
你在 Scikit-Learn 中使用 Pipeline 了吗?
使用 Pipeline 和 GridSearchCV 找到最佳的定标器、估算器和不同的变压器。
来源:作者图片
如果你在做机器学习,你会遇到管道,因为它们可以帮助你做出更好的机器学习工作流程,易于理解和重现。
如果你不知道管道,你可以参考 Rebecca Vickery 的博客Scikit-learn 管道的简单指南和Saptashwa BhattacharyyaScikit-learn 的机器学习管道的简单例子。
我最*发现,你可以将 Pipeline 和 GridSearchCV 结合起来,不仅可以为你的模型找到最好的超参数,还可以为你的机器学习任务找到最好的变压器
- 缩放器缩放您的数据。
- 填补缺失值的估算策略。
- 您应该使用的 PCA 成分数量。
和许多其他人。让我们看看如何能做到这一点。
数据集详细信息
为了更好地演示,我将使用 OpenML 中的 Titanic 数据集来演示如何创建数据管道。
您可以使用以下命令下载数据集-
from sklearn.datasets import fetch_openml# Dataset details at- [https://www.openml.org/d/40945](https://www.openml.org/d/40945)
X, y = fetch_openml("titanic", version=1, as_frame=True, return_X_y=True)
此外,看看我的笔记本,里面有关于每个操作的更多细节,可以随意下载并导入到您的环境中,然后进行试验-
该目录详细介绍了如何使用数据管道对数据进行各种操作。还有…
github.com](https://github.com/ankitgoel1602/data-science/tree/master/data-pipeline)
创建数据转换器管道
在这里,我将使用一部分特性来进行演示。数据集既有分类特征又有数值特征,我们将对它们应用不同的操作。流程是这样的-
1.定义数字和分类特征。
2.对于数字特征,填充缺失值,然后缩放数据。
数据集中的数字特征很少有缺失值,我们在这里使用简单估算器来填充这些值,也可以使用其他估算器。此外,我们应该使用比例来标准化数字特征的范围,因为许多机器学习模型需要遵循相同比例的特征。我还没有定义输入的策略和缩放器需要使用,因为同样可以使用 GridSearchCV 搜索。
3.对于分类特征,填充缺失值,然后应用一键编码。
我们数据集中的“已装船”要素几乎没有缺失值。因为我们有不同的策略来填充分类特征,所以要为此创建不同的估算器。此外,由于分类特性只有几个值,所以我使用 OneHotEncoder,它通常用于为分类列中的每个值创建不同的特性。使用 GridSearchCV 搜索输入策略。
4.使用 ColumnTransformer 组合数字和分类转换器。
ColumnTransformer 有助于为不同类型的输入定义不同的转换器,并在转换后将它们组合到单个特征空间中。在这里,我们应用上面为我们的数字和分类特征创建的数字转换器和分类转换器。
5.应用主成分分析降低维数。
主成分分析(PCA)是一种线性降维算法,用于通过保持最大方差来减少数据集中的特征数量。我们可能不需要在这里应用 PCA,因为它是一个小数据集,但我们的想法是展示如何使用 GridSearchCV 在 PCA 中搜索 number_of _components。
将分类器添加到管道中
上面,我们创建了一个预处理器管道,其中包含了我们希望应用于数据的所有操作。我将在这里使用逻辑回归作为我们问题的分类器。如果你有兴趣知道如何应用多种模型,丽贝卡·维克里在她的博客中提到了一个很好的方法。
应用 GridSearchCV
每个数据科学家都知道 GridSearchCV,它可以帮助我们找到模型的最佳超参数。有一点是错过了的,那就是你甚至可以借助管道用它来找出最好的变形金刚。在我们上面创建的预处理器管道中,你可能已经注意到我们没有定义
- 定标器,
- 输入缺失值的策略,
- PCA 中的组件数量
因为我们可以使用 GridSearchCV 来找到它们的最佳值。这是如何做到的-
以上,我试图从 3 个不同的定标器和估算策略中找出最佳定标器,用于我们的数字和分类列,以及 PCA 的组件和我们模型的超参数。很有帮助,不是吗?
可视化管道
Scikit-Learn 0.23.1 增加了可视化复合估计量的功能,这对于交叉检查您应用的步骤非常有帮助。下面的代码可以帮助你可视化数据管道。
来源:作者 GIF
缓存管道中的转换器
在这里,我创建了许多不同的数据可以计算密集型变压器。管道提供了一个参数'存储器,如果参数和输入数据相同,可以用它来缓存转换器。我们可以将“memory”设置为缓存转换器的目录路径,或者它可以是一个 joblib。内存对象。下面,我使用当前目录作为缓存目录,在这里将创建转换器的所有缓存对象。
cache_dir = "."
cached_pipeline = Pipeline(estimators, memory=cache_dir)
我一直在使用管道,因为它非常容易实现,并且帮助我们解决了许多问题。我希望这也能帮助你们改进机器学习的工作流程。如果你刚刚开始你的数据科学之旅,或者想了解一些用于数据科学的很酷的 python 库,那么看看这个- 今天就开始你的数据科学之旅。
注意安全!!!继续学习!!!
你使用 Python 和 API 吗?了解如何使用重试装饰器!
实现重试装饰器可以防止意外的一次性异常。
人们经常将 Python 描述为“胶合语言”术语“粘合语言”对我来说意味着一种语言有助于连接系统,并确保数据以期望的结构和格式从**A**
传到**B**
。
我用 Python 构建了无数 ETL 脚本( E 提取 T 转换 L oad)。所有这些脚本本质上都是根据相同的原理运行的。他们从某个地方提取数据,转换数据,然后运行最后的操作。最后一个操作通常意味着将数据上传到某个地方,但也可能是有条件的删除。
越来越多的典型公司基础设施正在向云迁移。越来越多的公司转向微服务方式。这些从本地到基于云的范式转变意味着您可能也面临过这样的情况,您必须从本地计算机之外的某个地方提取数据或将数据写入某个地方。
在小范围内,很少会有这方面的问题。如果某些提取或写回失败,您通常会注意到这一点,并能够纠正错误。但是,当您走向更大规模的操作和潜在的成千上万的事务时,您不希望由于 internet 连接的暂时中断、太多的并发写入、暂时无响应的源系统或天知道还有什么其他原因而受到影响。
我发现一个非常简单的 retry-decorator 在无数类似的情况下是一个可取之处。我的大多数项目,或多或少,最终都在某个 util 模块中使用了 retry decorator。
装饰者
函数是一级对象
在 Python 中,函数是一级对象。函数就像任何其他对象一样。这一事实意味着函数可以动态创建、传递给函数本身,甚至可以更改。看看下面这个例子(虽然有点傻):
**def** my_function(x):
print(x)**IN:** my_function(2)
**OUT:** 2**IN:** my_function.yolo = 'you live only once'
print(my_function.yolo)
**OUT:** 'you live only once'
装饰功能
很高兴知道我们可以用另一个函数包装一个函数来满足特定的需求。例如,我们可以确保函数在被调用时向某个日志记录端点报告,我们可以打印出参数,我们可以实现类型检查、预处理或后处理等等。让我们看一个简单的例子:
**def** first_func(x):
**return** x**2
**def** second_func(x):
**return** x - 2
当用字符串'2'
调用时,两个函数都失败。我们可以在组合中加入一个类型转换函数,并用它来修饰我们的first_func
和second_func
。
**def** convert_to_numeric(func): *# define a function within the outer function*
**def** new_func(x):
**return** func(float(x)) *# return the newly defined function* **return** new_func
这个convert_to_numeric
包装函数期望一个函数作为参数,并返回另一个函数。
现在,虽然之前会失败,但是如果您包装这些函数,然后用一个字符串数字调用它们,所有功能都会按预期工作。
**IN:**
new_fist_func = convert_to_numeric(first_func)*###############################*
*convert_to_numeric returns this function:* ***def***new_func*(x):* ***return***first_func*(float(x))
###############################*new_fist_func('2')
**OUT:** 4.0**IN:**
convert_to_numeric(second_func)('2')
**OUT:** 0
那么这到底是怎么回事呢?
嗯,我们的convert_to_numeric
以一个函数 (A) 作为参数,返回一个新的函数 (B) 。新函数 (B) 在被调用时,调用函数 (A) ,但是它不是用传递的参数x
调用它,而是用float(x)
调用函数 (A) ,因此解决了我们之前的TypeError
问题。
装饰语法
为了让开发人员更容易理解,Python 提供了一种特殊的语法。我们还可以执行以下操作:
***@convert_to_numeric***
def first_func(x):
return x**2
上述语法相当于:
**def** first_func(x):
**return** x**2first_func = convert_to_numeric(first_func)
这个语法让我们更清楚到底发生了什么,尤其是在使用多个 decorators 的时候。
重试!
现在我们已经讨论了基础知识,让我们转到我最喜欢和经常使用的retry
——装饰者:
此处代码为!
包装被包装的函数。这是一些盗梦空间的东西。但是请原谅我,这并没有那么复杂!
让我们一步一步地浏览代码:
- Outmost 函数
**retry**
:这将参数化我们的装饰器,即我们想要处理的异常是什么,我们想要多长时间尝试一次,我们在两次尝试之间等待多长时间,以及我们的指数补偿因子是什么(即我们每次失败时用什么数字乘以等待时间)。 **retry_decorator**
:这是参数化的装饰器,由我们的**retry**
函数返回。我们正在用**@wraps**
装饰**retry_decorator**
内的功能。严格来说,就功能而言,这是不必要的。这个包装器更新被包装函数的__name__
和__doc__
(如果我们不这样做,我们的函数__name__
将总是**func_with_retries**
)**func_with_retries**
应用重试逻辑。该函数将函数调用包装在 try-except 块中,并实现指数后退等待和一些日志记录。
用法:
用 retry-decorator 修饰的函数,对任何异常最多尝试四次
或者,更具体一点:
用 retry on TimeoutError 修饰的函数将最多尝试两次。
结果:
调用修饰函数并遇到错误会导致如下结果:
被调用的函数在 ConnectionRefusedError 上失败了两次,在 ConnectionResetError 上失败了一次,并在第四次尝试时成功。
这里我们有很好的日志记录,我们打印出了args
和kwargs
以及函数名,这将使调试和修复问题变得轻而易举(如果在所有重试次数用完之后错误仍然存在)。
结论
这就是了。您了解了装饰器如何在 Python 中工作,以及如何用一个简单的重试装饰器来装饰您的任务关键型函数,以确保它们即使在面临一些不确定性时也能执行。
如果你喜欢你所阅读的内容,并且不想错过新的故事,请在此订阅:
[## 通过我的推荐链接加入 Medium-Fabian Bosler
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@fabianbosler/membership)
关于如何加速代码的进一步阅读:
[## 每个 Python 程序员都应该知道并不秘密的线程池
通过多线程,您只需要几行代码就可以将代码速度提高几个数量级
medium.com](https://medium.com/better-programming/every-python-programmer-should-know-the-not-so-secret-threadpool-642ec47f2000) [## 每个 Python 程序员都应该知道标准库中的 Lru_cache
通过使用简单的缓存功能,只需一行代码就可以加快函数的速度
你在你的 Keras 深度学习模型中使用了“Scikit-learn wrapper”吗?
如何使用 Keras 的特殊包装类进行超参数调优?
作者使用开源模板创建的图像
介绍
Keras 是深度学习领域最受初学者和专业人士欢迎的 Python 库/API 之一。虽然它最初是由弗朗索瓦·乔莱作为一个独立项目开发的,但从 2.0 版本开始,它已经被原生集成到 TensorFlow 中。点击 了解更多信息 。
正如官方文档所说,它是“一个为人类而不是机器设计的 API”,因为它“遵循了减少认知负荷的最佳实践。
图片来源: Pixabay
认知负荷肯定会增加的情况之一是超参数调整。尽管有这么多支持库和框架来处理它,但对于简单的网格搜索,我们总是可以依赖 Keras 中的一些内置的好东西。
当创建一个机器学习模型时,你会看到如何定义你的模型的设计选择…
www.jeremyjordan.me](https://www.jeremyjordan.me/hyperparameter-tuning/)
在本文中,我们将快速查看一个这样的内部工具,并研究我们可以用它来进行超参数调优和搜索。
sci kit-学习交叉验证和网格搜索
几乎每个 Python 机器学习实践者都非常熟悉 Scikit-learn 库和它的漂亮的 API 以及简单的方法,比如fit
、get_params
和predict
。
该库还为模型选择流水线网格搜索 能力提供了极其有用的方法。如果你环顾四周,你会发现大量使用这些 API 方法解决经典 ML 问题的例子。但是对于你遇到的一个深度学习问题,如何使用相同的 API 呢?
简介典型的机器学习过程包括在数据集上训练不同的模型,并选择一个…
stackabuse.com](https://stackabuse.com/cross-validation-and-grid-search-for-model-selection-in-python/)
认知负荷肯定会增加的情况之一是超参数调整。
当 Keras 与 Scikit-learn 纠缠在一起时
Keras 提供了几个特殊的包装类——都是为了回归和分类问题——来充分利用这些 Scikit-learn 自带的 API 的全部功能。
在本文中,让我向您展示一个使用简单的 k-fold 交叉验证和穷举网格搜索以及 Keras 分类器模型的例子。它利用了针对 Keras 的 Scikit-learn 分类器 API 的实现。
Jupyter 笔记本演示可以在我的 Github repo 中找到。
从模型生成函数开始
为了正常工作,我们应该创建一个简单的函数来合成和编译带有一些内置可调参数的 Keras 模型。这里有一个例子,
数据
对于这个演示,我们使用的是流行的 皮马印第安人糖尿病 。这个数据集最初来自国家糖尿病、消化和肾脏疾病研究所。数据集的目的是基于数据集中包含的某些诊断测量结果,诊断性地预测患者是否患有糖尿病。所以,这是一个二元分类任务。
- 我们创建特征和目标向量—
X
和Y
- 我们使用 Scikit 的缩放 API 来缩放特征向量——像
MinMaxScaler
一样学习。我们称之为X_scaled
。
数据预处理到此为止。我们可以将这个X_scaled
和Y
直接传递给特殊类,我们将在下一步构建。
Keras 提供了几个特殊的包装类——都是为了回归和分类问题——来充分利用这些 Scikit-learn 自带的 API 的全部功能。
KerasClassifier 类
这是来自 Keras 的特殊包装类,它将 Scikit-learn 分类器 API 与 Keras 参数模型结合在一起。我们可以传递与create_model
函数对应的各种模型参数,以及其他超参数,比如 epochs 和 batch size。
这是我们如何创造它,
请注意,我们是如何将模型创建函数作为**build_fn**
参数传递的。这是一个使用函数作为 Python 中一级对象的例子,在这里你可以将函数作为常规参数传递给其他类或函数。
[## Python 的函数是一流的——dbader.org
Python 的函数是一级对象。你可以将它们赋给变量,存储在数据结构中,传递它们…
dbader.org](https://dbader.org/blog/python-first-class-functions)
现在,我们已经确定了批量大小和我们想要运行模型的时期数,因为我们只想在这个模型上运行交叉验证。稍后,我们将这些作为超参数,并进行网格搜索以找到最佳组合。
10 重交叉验证
使用 Scikit-learn API 可以轻松构建 10 重交叉验证估计器。这是代码。请注意我们是如何从 Scikit-learn 的model_selection
S 模块导入估算器的。
然后,我们可以简单地用这段代码运行模型,在这里我们传递我们之前构建的KerasClassifier
对象以及特征和目标向量。这里重要的参数是我们传递上面构建的kfold
对象的cv
。这告诉cross_val_score
估算者在 10 重分层交叉验证设置中使用提供的数据运行 Keras 模型。
输出cv_results
是所有准确度分数的简单 Numpy 数组。为什么是准确性?因为这是我们在模型编译过程中选择的度量标准。我们可以选择任何其他分类标准,如精确度、召回率等。并且,在这种情况下,该度量将被计算并存储在cv_results
数组中。
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['**accuracy**'])
我们可以很容易地计算 10 倍 CV 运行的*均值和标准偏差,以估计模型预测的稳定性。这是交叉验证运行的主要工具之一。
增强网格搜索的模型创建功能
穷举(或随机化)网格搜索通常是超参数调整或深入了解机器学习模型工作的常见做法。被赋予了大量超参数的深度学习模型是这种系统搜索的主要候选对象。
在本例中,我们将搜索以下超参数,
- 激活功能
- 优化器类型
- 初始化方法
- 批量
- 历元数
不用说,我们必须将前三个参数添加到我们的模型定义中。
然后,我们创建和以前一样的KerasClassifier
对象,
搜索空间
我们决定使穷举超参数搜索空间大小为 3×3×3×3=243。
请注意,Keras 运行的实际数量也将取决于我们选择的交叉验证的数量,因为交叉验证将用于这些组合中的每一个。
以下是选择,
要搜索的维度太多了!
图片来源: Pixabay
用 Keras 学习 GridSearchCV
我们必须创建一个搜索参数字典,并将其传递给 Scikit-learn GridSearchCV
估计器。这是代码,
默认情况下,如果没有明确指定cv
参数,GridSearchCV 会运行 5 重交叉验证(从 Scikit-learn v0.22 开始)。这里,我们将它保持在 3,以减少总运行次数。
建议将GridSearchCV
的详细程度设置为 2,以保持对正在发生的事情的可视化跟踪。记住保留 **verbose=0**
作为主 **KerasClassifier**
类虽然,因为你可能不想显示训练单个时代的所有血淋淋的细节。
然后,就合体了!
当我们都开始欣赏 Scikit-learn 漂亮统一的 API 时,是时候调用这种能力,只需说fit
就可以搜索整个空间了!
图片来源: Pixabay
喝杯咖啡,因为这可能需要一段时间,具体取决于深度学习模型架构、数据集大小、搜索空间复杂性和您的硬件配置。
总共将有 729 个模型拟合,243 个参数组合中的每一个都有 3 次交叉验证运行。
如果你不喜欢全网格搜索,你可以随时尝试 Scikit-learn stable 的随机网格搜索!
结果看起来怎么样?正如您对 Scikit-learn 估算器的期望一样,为您的探索存储了所有好东西。
你能对结果做什么?
您可以根据您的研究兴趣或业务目标,以多种方式探索和分析结果。
最佳精度的组合是什么?
这可能是你最关心的问题。只需使用来自GridSearchCV
估算器的best_score_
和best_params_
属性将其打印出来。
我们使用ReLU activation和Adam optimizer做了最初的 10 重交叉验证,得到的*均准确率为 0.691。在进行彻底的网格搜索后,我们发现tanh activation和rms prop optimizer可能是解决这个问题的更好选择。我们有更好的准确性!
提取数据帧中的所有结果
很多时候,我们可能希望在广泛的超参数下分析深度学习模型性能的统计性质。为此,从网格搜索结果中创建一个熊猫数据框架并进一步分析它们是非常容易的。
这是结果,
视觉分析
我们可以从这个数据集创建漂亮的可视化效果,来检查和分析选择什么样的超参数可以提高性能并减少变化。
这是一组使用 Seaborn 从网格搜索数据集中创建的*均精确度的小提琴图。
这是另一个情节,
…从网格搜索结果中创建熊猫数据框架并对其进行进一步分析非常容易。
总结和进一步的思考
在本文中,我们介绍了如何使用 Keras 库提供的强大的 Scikit-learn 包装器 API 来进行 10 重交叉验证和超参数网格搜索,以实现二进制分类问题的最佳准确性。
使用该 API,可以融合基于 Scikit-learn 的通用 ML 管道和 Keras 模型的最佳工具和技术。这种方法无疑具有巨大的潜力,可以节省从业者为交叉验证、网格搜索、Keras 模型管道化编写定制代码的大量时间和精力。
同样,这个例子的 演示代码可以在这里 找到。其他相关深度学习教程可以在 同库 中找到。如果您愿意,请随意启动和分叉该存储库。
Y 你可以查看作者的 GitHub 知识库中的代码、思想和机器学习和数据科学方面的资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)**
你担心感染冠状病毒吗?
保持冷静,计算自己生病的概率。
如果您有以下任何问题:
- 我感染冠状病毒的真实几率有多大?
- 如果我感染了冠状病毒,我死亡的概率有多大?
- 在我的生活方式中包含社交距离值得吗?
- 根据我的行为、年龄和居住地,我能得到这些问题的具体答案吗?
在这篇文章的结尾,你将能够自己回答其中的一些问题(直到一些计算和一些数据处理)
这个想法是让你根据你的具体情况获得风险估计。当然,这些概率只是提供信息的统计工具,并不能代替官方或医生的官方信息。
让我们从数据开始
为了创建这个工具,我们依赖了来自世界银行、世界卫生组织和《2019 年世卫组织-中国冠状病毒疾病联合任务报告》的公开数据。
- 世界银行的数据提供了每个国家按年龄和性别区分的人口统计数据。
- 世界卫生组织提供了每个国家冠状病毒病例数量的信息。我们可以访问一个更加用户友好的数据表单 Worldometer 网页,在那里我们可以找到病例总数、死亡人数、活跃病例等。每日报告。
- 2019 年世卫组织-中国冠状病毒疾病联合任务报告基于中国 55,924 例实验室确诊病例,并为该样本提供了描述性统计数据。我们感兴趣的报告的主要部分是死亡率,取决于几个因素,如年龄、性别和既往疾病。这些结果也在 Worldometer 网页中进行了总结。我们需要澄清的是,这些统计数据是基于中国的案例。
如果我被感染,死亡的概率
我们将考虑两个特定变量来计算一个人被感染后的死亡概率:居住国家(C)和年龄(A)。如果我们用(D)来表示“如果我被感染就会死亡”的事件,我们要计算的是:
P(D|A ∩ C) →如果被感染死亡的概率,假设我是“A”岁,我住在“C”。
我们将使用贝叶斯定理的一个版本,其中包括在多个事件中的条件来找到这个概率。
多事件贝叶斯定理
特别是 P(D|A∩C)=P(A|D∩C)P(D|C)/P(A|C)。由于原则上我们没有特定国家按死亡年龄区分的特定概率的先验信息,我们可以假设 P(A | D∩C)= P(A | D)= P(D | A) P(A)/P(D)→基本贝叶斯定理。
现在我们得到了一个可以计算的表达式:
P(D | A∩C)= P(D | A)* P(A)* P(D | C)/(P(A | C)* P(D))
我们有全球人口概率,取决于世界银行数据中的年龄 P(A)和 P(A|C)。我们还可以从 worldometer 提供的每日报告中计算出某个国家的当前死亡概率 P(D|C)和全球死亡概率 P(D)。最后,我们有来自世卫组织-中国冠状病毒疾病联合任务 2019 年报告的 P(D|A )(我们可以假设该报告给出了该疾病的“全球”概率)。
编码定制概率
此处我们以 csv 格式提供来自世界银行的世界人口数据,以 xlsx 格式提供来自 Worldometer 的冠状病毒数据(截至 2020 年 4 月 17 日)。
世界银行的年龄范围是 0-14,15-65 和+65,而世卫组织报告的年龄范围是 0-9,10-19,…,70-79,+80。这意味着我们需要对世界银行的数据进行一些插值,以确定世卫组织中国报告的范围:
在我们创建的这个代码片段中
- 包含所有国家疾病状况的一般信息的数据框。这包括病例数、死亡数、康复病例数、人口等。这允许计算 P(D|C)和 P(D)。
- 包含 P(A|C),给定一个国家有某个年龄的概率(A)的字典(C)。这是为每个国家计算的,年龄范围为 0-9 岁,…,70-79 岁,80 岁以上。
- 根据国家的 ISO ALPHA-3 代码,数据框和字典的主关键字(索引)都是国家代码。使用“WORLD”键,我们可以访问世界概率。
现在我来计算我的概率。我在哥伦比亚,年龄范围是 30-39 岁。
我得到 0.001%。
如果你想要你的原始感染概率,你可以用你国家的病例数除以国家人口数(当然这只是一个说明性的估计。
以我为例,我得到< 0.001%,相当低。
最后,如果你想对你还没有被感染的情况下死于冠状病毒的死亡率有一个估计,你可以把之前的两个值相乘(这肯定是非常低的)。
你担心感染冠状病毒吗?
我的感染概率和感染后死亡的概率并不高,因为哥伦比亚的死亡人数相对于感染人数并不多(截至 2020 年 4 月 17 日),但这在其他国家发生了很大变化,当然,这种情况随着年龄的增长而增加,并取决于你的行为(社会距离)。
你也可以在免费的在线冠状病毒概率计算器****中计算出几个涉及性别、既往状况、社会距离的概率。根据你的社交距离,你可以使用 SEIR 模型看到 15 天的预测!
对于疫情之争,我的建议是保持冷静并遵循世卫组织将军的指示,因为当我们将范围缩小到城市和社区时,你的可能性会大大增加。
好了,现在你可以计算你的概率,并与你的朋友分享!
可晕性
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家,这篇文章的观点不应被解释为专业建议。
你的 AWS S3 铲斗安全吗?
自动警报系统
学习释放 IAM 政策的全部潜力,并开始利用'条件'政策元素
定义 IAM 安全策略的一个重要方面是减少爆炸半径,这是人们经常忽略的,这实际上意味着,在访问泄漏的情况下,如何进一步减少/消除损害。从这个角度来看安全定义通常可以帮助您考虑其他因素,以便在发生安全违规时限制损害。
安全性通常归结为两件事:身份验证和授权。认证定义你是谁,授权定义你能做什么(认证后)。在使用 AWS 云时,IAM(身份和访问管理)扮演把关者的角色,从而负责我们讨论的两个方面。 IAM 策略管理授权部分,对于限制用户可以/不可以做什么非常重要。
在这篇文章中,我想讨论当你给别人访问你的 AWS 资源时,你应该考虑的最基本的步骤。让我们用最常用的 AWS 服务 S3 来定义一个示例问题陈述
在 EC2 实例中运行某些工作流的不同 AWS 帐户的用户需要在特定的日期和时间间隔内访问您的 S3 对象。访问被进一步限制为列出具有特定前缀的文件,并且只下载具有相关联的特定标签的文件。流量也应该来自白名单网络
首先,将 S3 桶和与对象相关的权限分离到不同的部分通常是一个好的做法。AWS 在政策文件中将它们称为声明。
基本 IAM 策略框架
谁需要访问权限?
或者用 AWS 的术语来说,谁是**的主要负责人。作为最佳实践,让我们假设没有访问键被提供和注入到消费者 EC2 实例中。相反,有一个 IAM 角色将被承担以访问 S3 资源。要定义主体,您可以扩展策略模板,如下所示:
IAM 策略—具有主体(请求资源的实体)
此时,像 EC2 这样映射到 IAM 角色arn:aws:iam::<requester_account_id>:roleaccess-s3-objects
的服务可以从位于 http://169.254.169.254 的实例元数据端点获取动态临时凭证。这是由官方 SDK 和 CLI 自动处理的,所以用户不必担心。
需要访问什么?
上面的问题陈述提到了需要从不同的帐户访问的 S3 存储桶。这成为 IAM 策略中的资源元素。让我们假设私有桶的名称为my-test-bucket
IAM 策略—需要访问的资源
对于不同的部分,您可以适当地定义资源元素。首先指整个桶,其次指桶内的物体
在 S3 存储桶上应该允许哪些操作?
这由 IAM 策略结构中的动作元素定义。在这里遵循最小特权原则非常重要,要不惜一切代价避免类似s3:*
的事情发生。此外,可以使用 AWS 策略模拟器进行简单的测试,以满足模拟/调试需求。
对于这个场景,用户只需要拥有s3:List ucketVersions
、s3:ListBucket
和s3:GetObject
三个基本权限
IAM 策略—允许其他 AWS 帐户执行的操作
应该在哪个日期间隔内允许访问?
输入 条件
条件给 IAM 政策注入了兴奋剂。您现在可以开始使用他们允许您实施的粒度控制。在这个例子中,假设您只想允许2020-04-01T00:00:00Z
和2020-05-30T23:59:59Z
之间的请求。你可以使用任何 ISO 8601 格式来定义这些时间线。条件键有两种风格:全局的和特定于服务的。介绍完这些之后,IAM 策略看起来像:
IAM 策略—允许在特定时间间隔内进行访问
如果您希望允许临时访问在预定义时间自动过期的外部实体,这将非常有用。
不仅仅是日期,您还希望只允许来自特定网络流量
让我们假设输出 NAT 网关,或实例公共 IP 是13.126.87.165
。您可以限制仅来自此来源的流量。
IAM 策略—仅允许来自特定网络的入口
限制对数据子集的访问
如问题陈述中所述,您还希望控制资源访问,这应该仅限于 bucket 中的一些前缀。使用这种方法,您可以限制不同用户看到的内容,以及他们可以从该集中进一步下载的内容。假设您只想限制列出带有前缀test/
和test/sample-folder
的文件夹的能力
此外,用户应该只能下载带有标签available:yes
的对象
这可以通过其他有趣的条件键来实现:
IAM 策略—标签和文件夹前缀条件
这里需要注意的是,web 控制台中的 S3 看起来像一个典型的目录结构。然而,在内部,它只是名称前缀,您可以使用它来引用单个对象。
完整的 IAM 政策要点可以在这里找到,如果你想复制或编辑的话。
结论和进一步阅读
在这一点上,我相信即使您丢失了访问密钥,您也不会感到害怕,因为粒度策略定义的深度使得黑客在访问您的机密数据之前很难勾选所有的框。
注意事项
- 无论是全局的还是特定于服务的,并不是所有的条件关键字都会一直存在。记得检查哪些 S3 选项支持哪些条件键。
- 当涉及到安全性时,考虑使用策略边界。它们定义了最大权限区域,您自己帐户中的用户可以将其权限提升到。
- 为了更加清晰,将对象和存储桶级别的权限分开
- 如果你也对 EC2 使用的其他安全实践感兴趣,或者有效地管理你的密码,请随意查看我的其他帖子
我希望这篇文章能帮助你下次定义更安全的 IAM 策略。如果能听到您的评论和您已经完成的其他用例,那就太好了。
下次见, tschüss !
对于数据科学的工作,你的编码技能够好吗?
5 编码嗅探如果你在数据科学行业工作,你必须知道
“我 t 是星期五晚上。我清楚地记得那天剩下的时间和家人在一起我是多么兴奋。我的父母第一次去班加罗尔旅行,我已经计划带他们参观这座城市。我已经完成了一天的工作,因此在任何组织中,周五晚上通常都不那么忙碌。我正要离开时,突然收到了一封来自我的利益相关者的电子邮件,要求我提供一份我们一年前就停止提交的非常旧的报告。我很失望,但我知道运行标准代码通常不需要太多努力。唉!我的假设是错误的。因果报应咬了我一口,我整个晚上都在……"
您一定想知道这个故事与数据科学工作所需的任何类型的编码技能有什么关系,或者你们中的一些人可能已经猜到了我的故事和文章其余部分之间的相关性。让我先声明一下“当今的组织正在将数据科学作为决策周期每个阶段的关键杠杆之一,以推动关键业务战略。但是什么构成了数据科学问题呢?数据分析师、业务分析师或数据科学家如何在任何组织中工作?
任何数据科学问题都被分解成两个部分,一组【活动】和一些【最佳实践流程】。数据收集、数据清理、数据争论、假设检验、模型开发、验证等等都属于“活动”。我们大多数在分析组织工作或渴望成为数据科学家的人都非常熟悉这些术语,但当涉及到“最佳实践流程”时,我们知道的并遵循的很少。
根据我在这个行业 4 年的工作经验,我可以告诉你,作为“最佳实践过程”的一部分,很多重点都放在了项目管理、知识库构建、文档、沟通和代码维护上。作为一名数据科学家,您需要确保遵守“ 3 C、一致性、沟通和消费”。你的工作应该是一致的,你应该向你的利益相关者传达每一个商业上的错综复杂,最重要的是你的工作应该消耗。
数据科学行业中的编码与软件开发非常不同。您的编码技能不仅仅局限于您的技术知识,还需要大量的数据和业务理解。今天我将谈论“一致性”以及如何在你的编码实践中实现它。许多这些最佳实践都是基于我在 Mu 适马商业解决方案公司工作的 3 年经验以及我迄今为止所面临的挑战。以下 5 个嗅探会让你简单了解“数学+商业+数据+技术=数据科学”。
"O 当今的组织正在寻找能够创建可跨多个团队扩展的解决方案的数据科学家。把它想象成一个产品,任何人、任何人都可以轻松使用。这不仅节省了他们在不同业务部门的类似问题上的投资成本,还减少了未来几天处理该问题的现有资源的时间和精力"
** [## 使用 Python 实现决策树分类器和成本计算剪枝
使用成本计算修剪构建、可视化和微调决策树的完整实践指南…
towardsdatascience.com](/decision-tree-classifier-and-cost-computation-pruning-using-python-b93a0985ea77)
5 个代码嗅探可以提升你的游戏!
1.你的代码可读性够吗?
一段格式良好且经过注释的代码是代码大师的天堂。它帮助您轻松调试代码,并确保更顺利的质量检查。任何数据科学团队都遵循同行质量检查 (QC)的概念,以确保输出无误。在向利益相关者交付最终成果之前,让您的同行评审您的代码被认为是一种最佳实践。可读代码包括:
- 项目名称、代码目的、版本、作者姓名、创建日期、修改日期、最后修改人、开始更改
- 在每个代码片段开始之前对其进行一行描述(使用这些编码人员跟踪所使用的明确的业务规则或过滤器)
- 每个片段适当缩进,两个片段之间留有足够的空间
- 正确使用表名的命名约定。您可以编写“创建表 customer_volume_summary ”,而不是编写类似“创建表 a”的代码片段。这使得您的表格非常直观,甚至无需浏览其余的代码段
2。你的代码有可重用的模块吗?
很多时候,您将最终处理具有相似模式的数据集,但是根据所面临的业务问题,对不同的属性(列)使用不同的过滤器。也可能反过来,您最终使用同一个表来总结同一业务问题的不同场景。
例如,假设您有一个包含客户 id、交易 id、购买日期、产品类型和销售额的客户数据集。您需要找出对每种产品类型销售额贡献 80%的顶级客户。在正常情况下,您可以为特定的产品类型创建一组代码,复制粘贴相同的代码,然后使用不同的过滤器对产品类型进行重用。一个好的编码人员会创建一个用户定义的模块,该模块将产品类型和销售阈值作为输入,并生成所需的输出。可以在所有*台上创建可重复使用的模块,从而节省不必要的生产线,并确保轻松进行质量控制。
3。您的输出符合数据和商业感觉检查吗?
在任何组织中,交付正确的数字是项目成功的关键。许多业务决策都是基于我们报告的数字做出的,即使是很小的不准确也可能对组织的决策产生更大的影响。
让我们以上面的客户数据集为例。要求您根据交易量确定前 100 名忠实客户。使用您的推荐,该组织将为这些用户提供 30%的折扣券,用于他们即将到来的夏季销售。
这种分析的整体思想是识别忠诚的客户,并影响他们购买更多。该组织正在打击其销售,以确保更高的交易量。现在,我们中的许多人都没有意识到这样一个事实,即大多数组织使用的数据集并不是以最干净的形式出现的,在被消费之前需要进行处理。例如,客户在支付他的账单时可能经历由系统记录的失败的交易。但是,在计算交易量时,应消除此类交易 id,否则我们最终会错误地估计每个客户的交易量。挑战在于识别这种异常现象。以下是您在编码时必须做的一些检查:
- 在开始任何操作之前,请检查数据集的级别。级别被定义为可用于从数据库/表中唯一标识记录的单个列或列的组合。这将有助于您识别任何重复条目,并防止重复计算
- 对数据集进行快速描述性统计。这有助于您找出数据的分布和所有可能丢失的值
- 联接一个或多个表时,请确保它们处于同一级别。务必跟踪所有 join 语句前后的记录数量。这将帮助您识别多重映射或重复计算(如果有)
- 让您组织的关键绩效指标触手可及。这将有助于你在每一步的基线数字。在上面的例子中,购买的客户总数是组织绩效的关键指标。根据贵组织的年度报告,您知道大约有 12,000 名客户从贵组织的网站上购买了产品。但是,在查询数据集时,您只找到 8000 个客户 id。你的数据正确吗?重新检查您的代码,或者向您的利益相关者指出数据问题
4.你的代码输入有弹性吗?
输入弹性意味着无论输入类型如何,代码都应该能够产生输出。任何编码实践中最困难的部分是诱导输入弹性,这导致代码的可重用性。分析师可能会从不同的涉众那里收到类似的数据请求。因此,理想的情况是编写能够满足不同业务需求的代码。
例如,电子产品和化妆品部门的销售主管希望了解不同客户 id 下各自的产品销售情况。由于分析师以前曾在笔记本电脑和*板电脑上工作过,他/她知道所有与电子产品相关联的产品名称都是以小写形式显示的。但是,要检查化妆品,他/她可能必须首先过滤掉所有产品,并查看如何在客户数据中捕获与化妆品相关的交易。相反,在产品列中简单使用 UPPER()可以防止不必要的检查。在真实的场景中,很难使每个代码输入都具有弹性,但是需要考虑所有可能处理的异常。
5.归纳异常处理
输入弹性和异常处理听起来可能相似,但工作方式不同。让我问你一个简单的问题?您认为任何组织的客户数据有多少条记录?20,252 条记录,如上例所示?你在开玩笑吧!任何包含不同产品交易信息的客户数据都将有数百万条记录。在 SQL、R、Python 甚至 Alteryx 中查询这样的数据集需要运行数小时。现在想象一个场景,您需要为不同的产品查询这样的表,您如何引发异常处理?
- 所有编程语言都允许您以这样一种方式设置执行异常过程,即一个失败的查询将停止后续代码片段的执行。这允许您在条件失败或抛出错误时立即做出必要的更正,而不是在整个代码执行之前等待很长时间
- 请确保检查您的查询时间。由于并发使用,查询较大的数据集通常会花费比预期更多的时间,即多个用户可能会同时查询同一个数据集。确保代码执行超过一定的运行时间后自动停止
米 y 的手机突然开始震动起来。我没有意识到已经是晚上 8 点了。我花了 5 个小时来解决一些数字不匹配的问题。一年前从事这项工作后,我几乎记不起当时使用的商业规则。我希望我把它记录在某个地方。缺少流程和每一步的质量控制数据使得发现问题变得更加困难。现在我意识到良好的编码实践的重要性,我希望这篇文章能帮助你在未来的日子里组织你的编码思维过程"**
面积图:标准、堆叠和重叠:
为什么&如何
图片来自 Unsplash 的 Manny Moreno
面积图是折线图的一种形式,横轴和连接数据点的线之间的区域用颜色填充。它们用于传达总体趋势,而不关心显示准确的值。与折线图不同,轴和线之间区域的着色以更大的视觉力量传递趋势。
如何:面积图是二维的,有两个轴。习惯上,纵轴代表一个数量变量,而横轴是一条时间线或一系列数值区间。数据点由形成折线的线段连接,并且折线和水*轴之间的区域用颜色或某种类型的阴影填充。
面积图的示意图
面积图(AC)有四种类型:1)标准 AC;2)堆叠式 AC;3)堆叠交流百分比;4)交迭交流。
让我们分别分析每种类型:
- 标准面积图(又名面积图):它们对于显示一个数值变量随时间的演变特别有效。这样做的目的是更加强调整体趋势以及连接数据点的线的波峰和波谷。相比之下,折线图更强调显示数字变量的精确值。
资料来源:国家大学政策秘书处
上图显示了 1950-2000 年间阿根廷大学生数量的变化。在 1976 年至 1983 年血腥的军事独裁统治期间,学生人数明显减少。如果没有面积图的视觉效果,同样的故事也可以用折线图来讲述。
就像条形图一样,您必须始终从 0 开始垂直轴。与折线图不同,如果修改基线,我们不可避免地会扭曲信息。
2.堆积面积图:就像几个面积图一个叠一个。在这种类型的图表中,有第三个变量,通常是分类变量,以及相应的数据系列。每一个数据序列的表示都是从前一个数据序列结束的地方开始的(它们不重叠)。最后一个数字表示所有数据的总和。
下面的堆叠式 AC 显示了世界上生活在极端贫困中的人们的历史数据和预测数据。纵轴代表数百万人,而横轴代表 1990 年至 2015 年期间的历史数据和 2015 年至 2030 年的预测数据。第三个分类变量是用不同颜色表示的世界区域。最高线的高度相当于某一年生活在贫困中的所有人的总和。该图清楚地展示了数据故事:南亚、东亚和太*洋地区的贫困率持续下降,而撒哈拉以南非洲却没有出现同样的情况。它还表明,在过去 30 年里,超过 10 亿人摆脱了极端贫困。
来源:世界银行,2018 年
现在信息不同了,因为堆积面积图被用来进行成分分析。这是一个典型的部分对整体的图表,其中每个地区(每个部分,每个地区)对整体(整体,生活在极端贫困中的人)的贡献。每个区域的高度代表每个特定类别的值,而最终高度是这些值的总和。
堆叠面积图在可视化时存在一些困难,因为视线移动到每条线的最大值。但是,由于每条线都沿着下面那条线的基线,每个特定的区域都受到下面那条线的强烈影响。因此,随着时间的推移,每一个特定的趋势都类似于下面的趋势。出于这些原因,一些作者警告我们在以下方面谨慎使用它们:“只要确保当你使用这种方法时,你的观众知道不要沿着每个部分顶部的线条斜率来看整体的一部分如何随着时间的推移而变化”(Stephen 少数,2011)。
比较上面的数字: A,B & C 区域对于两个图表有完全相同的数据值。堆栈底部的 A 区没有问题。但是看看 B 区(蓝色区域)。看起来它的总体趋势对于每个图都是绝对不同的。这是堆积面积图的真正问题:它们可能会误导人,因为每个区域都遵循下面区域的基线,并类似于其趋势。
此外,即使堆叠的 AC 创建引人入胜和丰富多彩的视觉效果,也要明智地使用它们,因为堆叠中超过四个或五个级别需要大量的视觉处理时间,并可能使观众困惑。
3.百分比堆积面积图(也称为 100%堆积面积图):就像前面的图表一样,几个区域堆叠在另一个区域的顶部,并表示第三个分类变量。这是一个部分对整体的图表,其中每个区域表示每个部分相对于类别总数的百分比。垂直轴的最终高度始终为 100%。这意味着图表顶部有第二条基线,有助于跟踪某些特定趋势。
如何:每一个不同的堆栈代表整体的不同部分。与堆叠面积图类似,堆叠不会重叠。与它们不同,垂直轴的范围总是从 0 到 100%。每个堆栈的高度表明每个类别的百分比如何随时间变化。在下图中,您可以通过观察不同颜色如何沿水*轴增长或收缩来了解不同的趋势。
百分比堆积面积图的示意图
当我们向上堆叠时,分类变量的项目之间的差异或贡献更难读取。相应的区域无法进行严格的比较,因为它们偏离了不同的基线。特别是,没有连接到底部或顶部基线的区域很难读取,因为它们受到其邻居的强烈影响(上图中的第 3 类)。
永远记住,你必须选择一个合适的调色板。你可以通过选择分类的、连续的或发散的调色板来赋予故事意义。
下面的 100%堆叠交流显示谷歌音乐时间线。这张图表提供了一张基于 Google Play 用户的粗略地图,显示了这些年来流派和艺术家的流行程度。它有一个互动的版本,你可以点击其中一个流派,并获得该流派当时最受欢迎的专辑列表。我喜欢这个图表,因为它清楚地强调了 60' & 70' 的进步摇滚是有史以来最好的音乐。
来源:谷歌音乐时间轴
就像堆积条形图一样(https://towards data science . com/stacked-bar-graphs-why-how-f1 b 68 a 7454 b 7),我们仅在相对差异重要时使用 100%堆积面积图,而在相对和绝对差异重要时使用堆积面积图。
4.重叠区域图:在这种图形中,区域之间有一些重叠。颜色和透明度必须适当调整,以便可以很容易地看到特定的线条。它们让我们能够很好地比较不同的趋势。我们的建议是使用不超过两个区域,因为三个或更多区域的重叠(及其相应的重叠颜色)很容易混淆观众。
以下重叠 AC 显示了全球城市和农村人口的历史值和预测值。浅绿色阴影区域对应于农村人口,而浅蓝色对应于城市人口。与讲故事相关,图表显示,1960 年,地球上大约三分之一的人生活在城市,而在 2008 年,人类历史上第一次,城市人口超过了农村人口。此外,据预测,到 2050 年,城市人口将是农村人口的两倍。重叠的 AC 允许我们对各自种群的进化进行适当的比较,并以一种特别有效的方式传达故事。
来源:世界银行,2018 年
作为最后的警告,永远记住面积图很难阅读和解释,因为它们依赖于观众通过比较面积来解码数字信息的能力。我们更喜欢通过比较长度或高度来比较数值。通过矩形(条)的高度或坐标矩形中点和线的位置,我们可以很容易地跟踪基于趋势的数据可视化。因此,只使用 AC 来传达整体趋势和每个部分对整体的相对贡献,而不关心显示确切的值。面积图优先考虑数据的清晰性而不是准确性。
如果你对这篇文章感兴趣,请阅读我以前的:
簇状和重叠条形图,为什么和如何
https://towards data science . com/clustered-overlapped-bar-charts-94 f1 db 93778 e
堆积条形图,为什么和如何,讲故事和警告
https://towards data science . com/stacked-bar-graphs-why-how-f1 b 68 a 7454 b 7
参考文献:
少数,Stephen,“组合时间序列和部分到整体关系的定量显示”,https://www . perceptual edge . com/articles/visual _ business _ intelligence/Displays _ for _ Combining _ Time-Series _ and _ Part-to-Whole . pdf
谷歌音乐时间轴,http://research.google.com/bigpicture/music/#
http://estadisticasuniversitarias.me.gov.ar/
世界银行,2018,https://www . world bank . org/en/news/feature/2018/12/21/year-in-review-2018-in-14-charts
你所有的实验不都是神圣的吗?—使用 Sacred 管理您的机器学习实验
图片由 Luka 从 Pexels
你可能已经花了无数个小时来调整你的超参数,观察你的机器学习模型的性能指标和运行时间,当你想回到你以前的迭代时,你就是无法获得超参数或其他一些正确的配置来重新创建结果。作为一名研究人员,重要的是记录这些超参数和观察值,以便在需要时再次重现相同的结果。手动将它们记录在某个地方既乏味又容易出错,这会使您的进度落后几天。此外,很难理解你的日志,也很难长时间地重现实验。
假设你正在做一个简单的时尚 MNIST 分类项目,下面是你可能想出的用于训练和评估的代码:
该代码在每个时期具有三个配置参数batch_size
、num_epochs
和learning_rate
以及四个性能度量train loss
、train accuracy
、val loss
和val accuracy
。此外,您可能希望跟踪test accuracy
和run-time
。为每个实验手动地做它是不令人兴奋的,并且你甚至可能有更多的度量想要为每个实验跟踪。
这就是神圣在画面中出现的地方。
每个实验都是神圣的
每个实验都是伟大的
如果一个实验被浪费了
上帝会非常生气
这是《神圣的:D》的标题
什么是神圣?
神圣是由 Instituto Dalle Molle di Studi sull ' intelligenza artificial e(id sia)开发的工具。它可以帮助您配置、组织、记录和重现您的实验。它旨在完成您在实际实验中需要做的所有繁琐的日常工作,以便:
- 记录你实验的所有参数
- 轻松运行不同设置的实验
- 在数据库中保存单次运行的配置
- 重现您的结果
神圣是如何工作的?
神圣连接到一个 MongoDB,并把所有关于实验的信息放入一个名为 experiments 的集合中的一个文档中。MongoObserver
是神圣附带的默认观察者之一。神圣试图捕捉所有的输出,并将信息传送给观察者。
Experiment
是神圣框架的中心类,收集大量关于运行的信息,像:
- 启动时间和停止时间
- 使用的配置
- 结果或发生的任何错误
- 运行它的机器的基本信息
- 实验所依赖的包及其版本
- 所有导入的本地源文件
- 用 ex.open_resource 打开的文件
- 使用 ex.add_artifact 添加的文件
安装神圣的
你可以像这样直接从 pypi 获得神圣:
pip install sacred
我们还需要安装 pymango,因为我们需要连接一个 MongoDB
pip install pymango
修改时尚 MNIST 分类脚本以使用神圣
下面是更早的脚本修改使用神圣。
我们首先创建一个名为fashion_mnist
的实验实例ex
,并将一个观察者链接到它。MongoObserver
是圣物自带的默认观察者。你甚至可以使用其他可用的观察者
ex = Experiment("fashion_mnist")
ex.observers.append(MongoObserver())
接下来,我们在用@ex.config
修饰的函数cfg()
中定义配置变量。这会创建一个配置范围,然后收集函数局部范围内定义的所有变量,并成为实验的配置条目。在我们的示例中,我们将batch_size
、num_epochs
和learning_rate
视为配置变量。
@ex.config
def cfg():
batch_size = 64
num_epochs = 10
learning_rate = 0.01
接下来,我们需要将脚本的模型训练和评估部分放在一个用@ex.automain
修饰的函数内。这告诉实验文件在脚本运行时需要执行什么。这个函数将所有的配置变量和一个_run
对象作为参数。_run
对象表示并管理实验的一次运行。它存储与实验相关的所有信息,然后将这些信息写入观察器。如果您想了解更多关于_run
对象的信息,请参考和。
@ex.automain
def run(_run, batch_size, num_epochs, learning_rate):
# importing the dataset
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) =
fashion_mnist.load_data() # normalizing the images to 0 and 1
train_images = train_images / 255.0
test_images = test_images / 255.0 # setting up the model
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
]) # compiling the model
model.compile(optimizer=keras.optimizers.Adam(
learning_rate=learning_rate),
loss=keras.losses.SparseCategoricalCrossentropy(
from_logits=True
),
metrics=['accuracy']) # training the model
model.fit(train_images,
train_labels,
batch_size=batch_size,
epochs=num_epochs,
validation_data=(test_images, test_labels),
callbacks=[MetricsLoggerCallback(_run)],
verbose=2)
# evaluating the model
test_loss, test_acc = model.evaluate(
test_images,
test_labels,
verbose=2) print('Test loss:', test_loss, ' and Test accuracy:', test_acc) return test_acc
我们还希望记录度量标准,如每个时期的训练和验证的损失和准确性。为此,我们定义了一个名为MetricsLoggerCallback
的 Keras 自定义回调类,它有on_epoch_end
方法。回调类将_run
对象作为参数。_run
对象有一个[log_scalar](https://sacred.readthedocs.io/en/stable/apidoc.html?highlight=_run#sacred.run.Run.log_scalar)
方法,可以用来捕获指标。
class MetricsLoggerCallback(keras.callbacks.Callback):
def __init__(self, _run):
super().__init__()
self._run = _run
def on_epoch_end(self, _, logs):
self._run.log_scalar("training.loss", logs.get('loss'))
self._run.log_scalar("training.acc", logs.get('accuracy'))
self._run.log_scalar("validation.loss",
logs.get('val_loss'))
self._run.log_scalar("validation.acc",
logs.get('val_accuracy'))
度量和日志也可以用一个用@ex.capture
decorator 修饰的函数以不同的方式捕获,如这个示例所示。
我们的@ex.automain
修饰函数也返回test_acc
值。该值存储在_run
对象的[result](https://sacred.readthedocs.io/en/stable/apidoc.html?highlight=result#sacred.run.Run.result)
属性中。它代表了我们实验的主要结果。
运行实验
为了运行实验,您需要在运行脚本时链接一个观察器,如下所示:
python fashion_mnist_sacred.py -m sacred_fashion_mnist
运行脚本时,您还可以从 cli 修改配置变量,如下所示:
python fashion_mnist_sacred.py with learning_rate=0.003 num_epochs= 20 -m sacred_fashion_mnist
一旦运行完成,你可以使用 Sacredboard 或任何其他由 Sacred 支持的前端来查看实验日志。
神圣纸板
SacredBoard 连接到 Sacred 使用的 MongoDB 数据库,显示实验列表、它们的状态、Sacred 的配置和运行程序的标准输出。
您可以用 pypi 安装它:
pip install sacredboard
在运行它时,我们需要将它与我们的观察者连接起来:
sacredboard -m sacred_fashion_mnist
启动后,您可能会看到所有实验的详细信息,如下图所示:
配置详细信息
捕获的日志
结果(即我们的 test_acc)
进行实验的主机信息
训练和验证损失
训练和验证准确性
从这里去哪里?
这只是让你的生活变得简单的一瞥。它有大量的其他功能,更多的功能仍在添加。如果你想进一步探索,他们的文档非常详细。
ARIMA 与预言家:预测航空乘客数量
哪个型号性能更好?
这是我之前文章的后续: 用 Prophet 进行时间序列分析:航空旅客数据
在本例中,使用 R 构建了一个 ARIMA(自回归综合移动*均)模型,通过使用三藩市国际机场关于航空公司月度客运量统计的报告来预测航空旅客人数。
具体来说,对航空公司荷航 (enplaned)调整后的乘客人数进行过滤,作为从 2005 年 5 月到 2016 年 3 月期间的时间序列进行分析。
资料来源:RStudio
结果将与 Prophet 获得的结果进行比较,以了解 ARIMA 相对于该模型的表现如何。
该模型在 90%的时间序列(训练集)上进行训练,序列的后 10%用于与预测(测试集)进行比较。
ARIMA 的背景
ARIMA 模型由坐标(p,d,q)组成:
- p 代表自回归项的数量,即用于预测未来值的过去时间值的观测值的数量。例如,如果 p 的值是 2,那么这意味着序列中的两个先前的时间观察被用于预测未来趋势。
- d 表示使时间序列稳定所需的差异数(即具有恒定均值、方差和自相关的时间序列)。例如,如果 d = 1,则意味着必须获得级数的一阶差分,才能将其转换为*稳的级数。
- q 代表我们模型中之前预测误差的移动*均值,或误差项的滞后值。例如,如果 q 的值为 1,那么这意味着我们在模型中有一个误差项的滞后值。
*稳性
说到预测,时间序列数据的一个关键假设是*稳性。这是一个序列的均值、方差和自相关是常数的地方。
这种假设的原因是,如果一个序列的均值、方差和自相关性在一段时间内不是常数,那么使用预测模型进行预测就会变得困难得多。
然而,正如我们上面提到的,ARIMA 模型中的 d 参数表示使序列稳定所需的差异数。当使用 R 中的 auto.arima 功能时,自动选择 p、d、和 q 值。
*稳性通常可以通过对数据的目视检查直观地表示出来。
我们再来看看时间序列。
资料来源:RStudio
我们可以看到——总的来说——时间序列显示出一种之字形模式,在一段时间内总体趋势几乎没有变化。
然而,这可以通过使用迪基-富勒测试进行正式测试。零假设是序列有一个单位根(非*稳),另一个假设是*稳或趋势*稳。
单位根的测试如下:
来源:作者图片
对序列运行测试时,获得的 p 值为 0.01,这意味着在 5%的显著性水*上拒绝零假设,表明序列中存在*稳性。
> adf.test(passengernumbers)Augmented Dickey-Fuller Testdata: passengernumbers
Dickey-Fuller = -8.061, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary
自相关
ARIMA 的 p 参数说明了模型中自回归项的数量——这使得模型能够处理自相关。自相关是时间序列中不同观测值的误差项之间存在相关性的一种情况,这也会扭曲预测。
这是时间序列的 ACF(自相关函数)图(设置了 20 的最大滞后):
资料来源:RStudio
我们看到自相关在滞后 0 之后持续了两个月,在 6 个月和 12 个月期间持续了正相关和负相关。在这种情况下,滞后是按月计算的,因此 6 个月的周期表示为 0.5 ,而 12 个月的周期表示为 1.0 。
部分自相关函数试图去除由每个观测值之间存在的固有线性函数产生的间接相关性。
这是该系列的偏相关图:
资料来源:RStudio
我们看到偏自相关函数在滞后 0 两个月后仍然显示相关性(尽管是负的)。因此,ARIMA 模型将需要以这样一种方式配置,以便考虑自回归项的正确数量。
以下是时间序列趋势组成部分的概述:
> components <- decompose(passengernumbers)
> components
资料来源:RStudio
当观察该系列时,大约每六到八个月就会观察到显著的季节性模式。考虑到这一点,ARIMA 模型将需要在其预测中考虑这种季节性。
使用 auto.arima 建模
给定自相关和季节性的视觉指示, auto.arima 用于自动生成许多具有不同 p、d 和 q 坐标的 arima 模型,然后根据具有最低 BIC(贝叶斯信息标准)的模型选择最佳模型。
> # ARIMA
> fitpassengers<-auto.arima(passengernumbers, trace=TRUE, test="kpss", ic="bic")ARIMA(2,0,2)(1,1,1)[12] with drift : 1693.37
ARIMA(0,0,0)(0,1,0)[12] with drift : 1779.685
ARIMA(1,0,0)(1,1,0)[12] with drift : 1682.899
ARIMA(0,0,1)(0,1,1)[12] with drift : 1724.722
ARIMA(0,0,0)(0,1,0)[12] : 1775.932
ARIMA(1,0,0)(0,1,0)[12] with drift : 1702.397
ARIMA(1,0,0)(2,1,0)[12] with drift : 1685.158
ARIMA(1,0,0)(1,1,1)[12] with drift : 1684.594
ARIMA(1,0,0)(0,1,1)[12] with drift : 1680.905
ARIMA(1,0,0)(0,1,2)[12] with drift : 1684.211
ARIMA(1,0,0)(1,1,2)[12] with drift : Inf
ARIMA(0,0,0)(0,1,1)[12] with drift : 1772.299
ARIMA(2,0,0)(0,1,1)[12] with drift : 1684.965
ARIMA(1,0,1)(0,1,1)[12] with drift : 1685.149
ARIMA(2,0,1)(0,1,1)[12] with drift : 1688.428
ARIMA(1,0,0)(0,1,1)[12] : 1676.443
ARIMA(1,0,0)(0,1,0)[12] : 1697.822
ARIMA(1,0,0)(1,1,1)[12] : 1680.163
ARIMA(1,0,0)(0,1,2)[12] : 1679.795
ARIMA(1,0,0)(1,1,0)[12] : 1678.467
ARIMA(1,0,0)(1,1,2)[12] : Inf
ARIMA(0,0,0)(0,1,1)[12] : 1768.607
ARIMA(2,0,0)(0,1,1)[12] : 1680.489
ARIMA(1,0,1)(0,1,1)[12] : 1680.677
ARIMA(0,0,1)(0,1,1)[12] : 1720.732
ARIMA(2,0,1)(0,1,1)[12] : 1683.954Best model: ARIMA(1,0,0)(0,1,1)[12]
最佳模型配置表示为 ARIMA(1,0,0)(0,1,1)【12】。
该模型的系数如下:
> fitpassengers
Series: passengernumbers
ARIMA(1,0,0)(0,1,1)[12]Coefficients:
ar1 sma1
0.7794 -0.5001
s.e. 0.0609 0.0840sigma^2 estimated as 585834: log likelihood=-831.27
AIC=1668.54 AICc=1668.78 BIC=1676.44
准确(性)
ARIMA 模型生成以下预测:
资料来源:RStudio
RMSE(均方根误差)和 MFE(*均预测误差)如下:
- RMSE: 698
- MFE: -115
> # Errors
> library(Metrics)
> rmse(df$`Actual Passenger Numbers`, df$`Forecasted Passenger Numbers`)[1] 698.6527
> ## Forecast Error
> forecast_error=(df$`Actual Passenger Numbers`-df$`Forecasted Passenger Numbers`)
> forecast_error
[1] -415.8149 -982.0972 -273.1147 -539.5008 -520.7138 -845.2062 -824.7485
[8] -212.4401 -454.4602 1387.1299 962.7507 153.2876 257.2238 687.3703
> mean(forecast_error)[1] -115.7381
与先知的比较
ARIMA 和预言家之间的一个关键区别是,预言家模型解释了“变化点”,或时间序列中趋势的特定变化。虽然在 R 中用 ARIMA 实现这一点在技术上是可行的——但它需要使用一个名为 AEDForecasting 的独立包。
Prophet 通过使用一个加法模型来工作,从而使序列中的非线性趋势与适当的季节性(无论是每天、每周还是每年)相适应。
在这个特定的数据集中,趋势的转变发生在 2009 年之后,当时我们看到乘客需求的总体趋势出现了逆转:
来源:Jupyter 笔记本输出
标准 Prophet 模型适用于数据集,没有任何季节性的手动说明:
prophet_basic = Prophet()
prophet_basic.fit(train_dataset)
通过反复试验, 4 个变化点被证明可以最小化 RMSE 和 MFE,因此被定义为模型中适当数量的变化点:
pro_change= Prophet(n_changepoints=4)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)
来源:Jupyter 笔记本输出
RMSE 和*均相对误差的计算如下:
>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(passenger_test, yhat14)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)RMSE: 524.263928>>> forecast_error = (passenger_test-yhat14)
>>> forecast_error
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error71.58326743881493
用 Prophet 分别得到 524 和 71 的 RMSE 和 MFE,误差明显低于用 ARIMA 得到的 698 和 -115 的误差。
从这个角度来看,虽然 ARIMA 解释了时间序列中的季节性和自相关性等模式——Prophet 在正确识别序列中的相关变化点方面表现出色——但这似乎提高了模型的预测准确性。
当预测具有更明确定义的趋势或不特别表现出季节性的数据时,ARIMA 可能会表现出色-我们在所讨论的数据集中看到了非常明显的迹象。但是,不存在季节性的其他情况可能不适合使用 Prophet。
结论
在本例中,我们看到:
- 如何配置 ARIMA 模型
- 时间序列中变化点的相关性
- ARIMA 和 Prophet 在计算预报精度方面的比较
非常感谢您的阅读,欢迎提问或反馈。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
参考
- 分析 Vidhya: SARIMA —使用 Python 和 R 预测季节性数据
- 起重机—包装预测
- data.world:空中交通乘客数据(原始来源:三藩市公开数据)
- GitHub: facebook/prophet
- 机器学习掌握:自相关和偏自相关的温和介绍
武装自己选择你的第一个数据库
您没有计算机科学背景,希望更好地了解数据基础设施如何影响您的业务或数据分析项目?这篇文章应该为您揭开数据库之谜。
为了更好地理解数据库选择的概念,您可以将它想象为选择从 A 点到 b 点的正确交通工具。
许多不同的交通工具可以让您从 A 点到 b 点。同样,许多数据库可以让您存储数据。
诀窍在于理解你的优先事项,以及你可以放弃什么。
在当今世界,如果你正在建立一个企业,你可以获得的数据是一种资产。你必须想出如何最好地利用这一资产。在过去,企业家只会依靠直觉。但如今,数据正指引着未来的方向。从降低成本项目到寻找新的收入来源或改善客户体验,数据分析领域是当今公司的关键。
那么,您是否渴望利用您的数据来更好地服务您的客户或跟踪您的增长?在考虑进行任何分析之前,您应该考虑如何存储您的数据。数据存储的目标是允许您访问完整、准确且可查询的业务数据表示。
我在与企业家讨论时注意到,数据库的选择可能会令人困惑。大多数企业家似乎没有意识到数据库对其数据分析性能的未来可能产生的影响,从而影响到整体业务。数据库前景广阔,他们发现很难理解推动他们选择的数据库需求是什么。
阅读完这篇由 3 部分组成的文章后,您应该能够评估哪种类型的数据库(DB)最适合您当前的业务需求,并了解您选择的解决方案的局限性。
本文分为三个部分:
- 第 1 部分—选择数据存储解决方案简介
选择数据库可能会让人不知所措。市场上有数百种数据库解决方案。
将业务需求转化为技术数据存储需求也很复杂。
这一部分向您介绍了数据库世界,并帮助您识别和优先考虑您的数据库需求。 - 第 2 部分—用于克服大数据存储挑战的技术
五种主要技术用于克服传统关系数据库面临的大数据挑战:横向扩展、反规范化、灵活的模式、最终一致性、图形数据库。这部分解释了这些技术是如何工作的——包括解决了什么问题以及带来了什么缺点。
如果对技术角度不感兴趣,可以跳过这部分。 - 第 3 部分—关于选择数据库的可行见解
这一部分涵盖了传统关系型数据库可能无法满足您的数据库需求的五种边缘情况。对于每一个场景,我们都会向您推荐解决这些挑战的技术、目前非常适合这些要求的特定数据库解决方案,以及这些解决方案的利弊。
在这五种边缘情况之外,建议从关系数据库开始,例如 PostgreSQL。你可以参考这篇文章和下面的第一部分——“选择你的第一个 DB”部分来理解这种说法背后的原因。
数据库领域正在快速发展。越来越多的数据库可以累积不同的技术,并尽量减少随之而来的权衡。了解 DBs 面临的典型技术问题及其当前的解决方案,将有助于您找到最适合您业务的 DB。
第 1 部分—介绍如何选择数据存储解决方案
这一部分向您介绍了数据库世界,并帮助您识别和优先考虑您的数据库需求。
例如,如果我们想从法国的巴黎到厄瓜多尔的明多,我们的要求应该是什么—时间、成本、环境影响?
简而言之的数据库历史
回顾 DB 的历史可以让你更好地把握 DB 的前景,并理解各种选择背后的动机。*五十年来,数据主要存储在关系数据库中。关系数据库允许你以一种整洁而有逻辑的方式组织数据:你可以用键列连接的表来组织数据。
您可以在上面找到一个存储在关系数据库中的数据示例。
随着可收集数据量的增加,关系数据库面临着更高的性能要求和新的数据存储格式。“不仅仅是 SQL”(no SQL)数据库是为了解决这些新的数据挑战而开发的。然而,这些新类型的数据库只能解决特定的问题,这是以牺牲一些关系数据库的好处为代价的。
到目前为止,NOSQL 数据库有五种类型:文档存储、键值存储、宽列存储、搜索引擎、图形数据库。
您可以在上面的表格中找到六种主要类型的数据库以及这些数据库的开源示例。
请注意,本文中提到的数据库是每种数据库类型的 db-engines 排名列表中的前两个开源数据库。开源数据库是指任何人都可以访问和修改源代码的数据库。
了解您的数据库用途
在列出需求之前,你应该试着用一句话概括 DB 要实现的总体目标。
举几个例子,您可能需要一个数据库来接收您的企业在给定期间产生的所有交易。您可能需要一个数据库来对历史数据进行分析。在 web/移动应用程序的情况下,您可能需要一个数据库来支持应用程序后端的实时查询。
所有这些用例都意味着不同的需求,因此会有不同的最适合它们的数据库。
到目前为止,还没有哪种数据库能够同时解决所有的数据存储挑战。这就是为什么在开始选择练习之前,你应该确保对你的主要目标有一个清晰的想法。数据库的第一个目的应该是允许你优先考虑你的需求,并在权衡各种数据库的利弊时支持你。
了解您的数据库要求
选择数据库时,您应该按照重要性顺序列出您的数据库要求,并确保您了解您正在考虑的解决方案的利弊权衡。
您可以在上面找到业务需求列表,以及这些需求如何转化为技术需求。
选择您的第一个数据库
如果您还不知道您的业务和性能需求,强烈推荐使用关系数据库。
事实上,只有当您知道您的数据库需求时,您才能评估关系数据库是不可行的,并为您的业务选择正确的 NOSQL 数据库。有许多不同的 NOSQL DB 类型,它们不能解决相同的问题。如果没有您的数据库需求,您将无法选择正确类型的 NOSQL 数据库。
您也可能会失去关系数据库的主要优势,却不知道自己在牺牲什么,例如数据一致性。数据一致性确保数据库中没有矛盾的信息,并且所有数据点都符合适当的约束。在关系数据库中,这是由表周围的固定模式允许的——这在大多数 NOSQL 数据库中是不存在的。此外,关系数据库已经被测试和使用了很长时间。因此,技术更稳定,社区更大(这使得寻找资源或解决问题更容易、更便宜)。
最后,尽管当前存在 NOSQL 趋势,但您应该记住,NOSQL 数据库是为了解决特定的大数据难题而开发的。NOSQL 数据库并不意味着要取代关系数据库。如果您正在开始一项新业务,您很可能不需要数据库来立即解决大数据挑战。
你可以在上面找到关系数据库的三个主要优势。
最后的想法
随着业务的增长,您的数据库需求也将随之发展,您的数据架构也将随之发展。
通常情况下,最终会形成一个由多个数据库组成的混合结构,以解决数据流不同点的各种挑战。
目前,这第一步不应该是解决您不确定的未来问题,而应该是建立数据架构的基础,让您拥有未来。
第 2 部分—用于克服大数据存储挑战的技术
这一部分解释了主要的 NOSQL 技术是如何工作的——包括解决了什么问题,带来了什么缺点。
依靠不同技术的各种引擎可以让我们从欧洲一直旅行到南美洲。
横向扩展—增加存储容量
什么是横向扩展? 扩展数据存储系统的目标是增加其整体存储容量。您可以“横向扩展”或“纵向扩展”。横向扩展或“水*扩展”是指通过增加机器数量来提高解决方案的性能。与扩大规模或“垂直规模”相反,后者是指增加机器的大小。
向外扩展时,数据分布在机器网络的不同节点上。能够向外扩展的系统称为分布式系统。
您可以在上面找到纵向扩展与横向扩展的 插图 。
为什么要横向扩展? 纵向扩展的主要优势在于,在增加数据存储容量时,您无需更改任何数据库管理流程。缺点是您的增长受到硬件的限制,前期成本很高,并且您有更高的系统故障风险。
您的增长能力有限,因为您只能通过购买更大的硬件系统来增加存储容量。换句话说,你被市场上可用的技术所限制。
此外,前期成本很高,因为每次您想要增加存储容量时,都需要购买新的更高性能的硬件。
最后,您有更高的系统故障风险,因为如果管理数据的一台机器出现故障,那么您的整个系统都会出现故障。
横向扩展解决了所有这些问题。
首先,当增加你的存储容量时,你只需要在网络上增加新的机器,所以理论上,你有无限的存储容量。
其次,买多台正常尺寸的机器比买一台性能异常的机器便宜。第三,通过增加机器的数量,你增加了其中一台机器发生故障的风险。因此,这些过程被认为是通过在网络的几个节点中复制数据来降低机器故障的风险。换句话说,即使一个或多个组件出现故障,向外扩展的系统也会继续运行。
您可以在上面找到纵向扩展与横向扩展的优缺点。
**横向扩展有什么缺点,为什么?
此外,根据上限定理,分布式系统必须在一致性、可用性和分区容差之间做出选择,并且不能累积这三个属性。
如果位于不同节点的所有副本始终具有相同的值,则系统是一致的。另一种理解方式是,当您读取数据库时,您应该总是在网络的任何位置更新最新的值。
如果每个非故障节点在合理的时间内返回对所有读写请求的响应,则系统可用。
如果一个系统即使在节点间的通信中断时仍能继续工作,则该系统是分区容忍的。另一种理解方式是,系统可以承受任何数量的网络故障,而不会导致整个网络瘫痪。
总结一下 CAP 定理,在分布式系统中,当出现故障时,您必须在数据的可访问性和数据的一致性之间做出选择。
你可以在下面找到一个例子来帮助你理解 CAP 定理。**
让我们举例说明这个定理,以便更好地理解为什么这三个属性不能累积:
让我们考虑两个节点 A 和 B,每个节点上有复制的数据。如果两个节点 A 和 B 之间的通信失败,分区容差要求系统继续工作。如果您想要一致性,您需要节点 A 或节点 B 充当不可用(否则您可能在 A 和 B 上有不同的值),因此您将有一个不会响应的非故障节点,您将失去可用性。按照同样的逻辑,如果您希望保持可用性并让两个非故障节点做出响应,您可能会从节点 A 和节点 B 获得不同的值,因为它们不再通信,从而失去了一致性。为了保持一致性和可用性,您需要两个节点进行通信,以确保它们具有相同的值,因此您会失去分区容差,也就是说,即使网络出现故障,系统也应该能够运行。
最后,跨节点分布数据限制了连接的能力。根据数据的分布情况,您可能无法完成所有可能的[连接](http://you can picture "joins" as VLOOKUP operations in excel)。如果要连接的数据点没有保存在同一个节点上,则连接可能会失败,并且不会返回所需的结果。不能进行连接限制了可以对数据进行的查询的多样性,因为这意味着您只能逐个查询每个表。
非规范化—提高查询的性能
什么是反规范化?
要理解反规格化,我们先来理解什么是规格化。标准化旨在减少数据冗余(数据的复制)并提高数据一致性。换句话说,通过将每个数据点都放在一个地方,您可以确保自己有一个单一的真实来源,并避免在一个数据点的不同位置有不同的值。标准化还减少了用于存储数据的空间,因为每个数据点只存储在一个位置。
另一方面,反规范化是引入数据冗余来构建自动足够的表格。换句话说,回答业务查询所需的所有信息都存储在每个表中,即使这意味着一些信息在多个表中重复。
你可以在上面找到一个数据模型规格化与反规格化的例子。
为什么要反规范化?
反规范化的主要目标是提高读取性能。当使用反规范化时,您可以根据您将要询问的查询来创建表。您将所有需要的信息都存储在同一个表中,以便轻松快速地访问。
让我们用一个标准化模型来说明相反的逻辑。在规范化模型中,数据不会跨表复制,只存储在一个位置。当查询数据时,您将不得不执行大量的[连接](http://you can picture "joins" as VLOOKUP operations in excel),从而降低查询的性能。
反规格化的缺点是什么,为什么? 复制数据的一个主要缺点是数据一致性下降。通过在不同的位置复制数据点,您就有可能在不同的位置拥有相同数据点的不同值。
此外,更新数据和写入新数据可能会更加复杂,因为您必须确保在所有位置写入或更新数据。
灵活的模式—提高接收数据的性能
灵活模式是什么意思? 要理解什么是灵活模式,我们先来理解什么是 DB 模式。
DB 模式是如何组织数据的框架,包括所有不同的数据概念(可以在公共主题下分组的数据点)、链接这些数据概念的所有关系以及对所有数据点的约束。
具有灵活模式的数据库是可以存储不遵循任何特定结构并且不必遵守任何配置约束的数据的数据库。
您可以在上面找到一个固定模式和灵活模式的数据模型的例子。
为什么要使用灵活的模式数据库?
灵活的模式可以接收任何类型的数据,因为任何模式都没有强制约束。
写入数据的性能得到了提高,因为对于要摄取的数据的结构或格式不再有任何限制。灵活的模式数据库可以适应任何新类型的数据,而不必了解新数据如何与其他数据相适应——因为,同样,对数据的组织方式没有限制。最后,设计固定模式既复杂又耗时。不必在每次新类型的数据进来时都执行这一步,这样可以节省时间。
灵活模式数据库的缺点是什么,为什么?
DB 模式允许您了解数据中有什么,并在存储更多数据的同时保持数据质量。数据质量确保存储的数据是可信的,并且可以用来获得业务洞察力。数据质量通过准确性、完整性、一致性等因素来衡量。对于企业来说,理解数据库应该能够保持的数据质量水*是一件头等大事。
跳过 DB 模式会降低数据质量,最终可能会得到质量差的数据。例如,您可能有错误或没有值的数据点,而您对此一无所知。
此外,因为对数据没有任何约束,也因为没有维护任何类似关系的结构,所以灵活的模式数据库不能执行[连接](http://you can picture "joins" as VLOOKUP operations in excel)。事实上,您将无法找到一个一致的键来连接您的数据。
最终一致性—提高查询的性能
最终一致性是什么意思?
要理解什么是最终一致性,我们先根据 CPA 定理定义来理解什么是一致性。
如第 2 部分—横向扩展章节所述,如果位于不同节点的所有副本始终具有相同的值,则系统是一致的。
另一方面,最终的一致性只要求更新在需要的时间内到达所有系统。换句话说,您可能在某个时间点有不一致的数据,但是如果您等待足够长的时间,它应该在所有位置都是相同的,并且处于最新状态。
为什么使用最终一致性? 如第 2 部分—向外扩展章节所述,根据 CAP 定理,在系统故障的情况下,分布式系统无法同时满足响应性和一致性。为了尽可能地满足这两个要求,系统一直以最终一致性为目标,而不是以完全一致性为目标。
此外,最终一致性还可以通过在写入操作仅排队时考虑写入操作已完成来加快写入过程。
最终一致性的缺点是什么,为什么?
直接的缺点是最终的一致性并不是纯粹的一致性——因此你接受了一个数据点的多个版本同时存储在不同位置的可能性。此外,这意味着在查询数据时,您可能无法获得该数据点的最新版本。
如果你想了解更多关于最终一致性的内容,我建议你看看[碱法和酸法](https://www.freecodecamp.org/news/nosql-databases-5f6639ed9574/ https://medium.com/@katrinagarloff/databases-acid-and-base-simplified-5b0cc5350e90)。
图形数据库—管理具有复杂关系的数据
什么是图形数据库? 图形数据库是不仅存储数据点,还存储链接数据点的关系的数据库。在图 DB 中有两个主要元素,节点(或实体)和边(或关系)。每个节点代表一个概念,如一件事或一个人,通过边链接到其他节点,并由其唯一标识符、传入/传出边及其属性来定义。
你可以在上面的 中找到一个 graph DB 数据模型的例子 。
为什么要使用图结构? 如果存储的数据是高度相关的,使用图形数据库有很多好处。事实上,我们甚至可以说图形数据库比关系数据库更适合于高度相关的数据。图形数据库的主要优点是处理查询的速度和模式的灵活性。
图数据库具有所谓的无索引邻接性质。每个节点和每个边只存储它的邻居信息。它允许查询只遍历需要分析的数据。换句话说,当使用图形数据库运行查询时,查询不必扫描所有数据库,因此查询速度更快。此外,图形数据库支持灵活的模式。换句话说,您不需要预先对数据建模,也不需要构建预定义的数据存储结构。您只能在节点和边到来时更新它们。
graph DB 有哪些弊端,为什么? 图形数据库尚未成熟。图形数据库提出了一种不同于关系数据库的替代方案,因此图形技术的采用比其他 NOSQL 数据库要慢一些。例如,MongoDB(一个文档存储 NOSQL DB)于 2009 年发布,在 DB-engines 流行度排名中排名第 5,而 Neo4j(一个图形 DB——也是 NOSQL)于 2007 年发布,目前排名第 22。因为该解决方案比其他类型的 NOSQL DB 经过的测试和扩展更少,所以 graph DB 的经验更少。
Graph DB 当前状态是求解复杂关系分析。然而,图形数据库在它所能处理的容量方面是有限的。大多数图形数据库都不能横向扩展,因此管理不断增长的数据量并不是现成的。
第 3 部分—关于选择数据库的可行见解
这一部分涵盖了关系数据库可能无法满足您的数据库需求的五种边缘情况。对于每一个场景,我们都会向您推荐解决这些挑战的技术、目前非常适合这一要求的特定数据库解决方案,以及这些解决方案的利弊。
那么,你想去哪里?
关系数据库可能无法满足您需求的五种极端情况是:
- 我希望能够处理大量数据
您还不知道将如何使用您存储的所有数据,但如果您今天不存储这些数据,您可能会丢失明天的宝贵信息。为了确保你不会失去这种潜在的价值,鼓励你收集和保存尽可能多的数据。 - 我希望能够存储任何种类的数据 我们特意选择了“任何种类的数据”这个词来说明世界上存在的各种数据。数据可以来自不同的来源(企业内部或外部),以不同的格式(如文本、照片、视频、表格、PDF、音频等),可以由人或机器生成,可以很容易地获取信息,或者可能需要大量的工作才能获取信息。
- 我希望能够以快速的方式运行查询,与要处理的数据量或同时执行的查询数量无关 网站和应用程序是用户与企业互动的主要窗口。响应时间是关键——如果您的用户等待太久,他们只需点击一下就可以寻找其他选项,或者放弃他们不确定的交易。同时与您的应用程序交互的用户数量或处理的数据量会极大地影响响应时间。
- 我希望能够以快速的方式摄取尽可能多的数据 随着物联网、移动应用和社交媒体的兴起,可供企业收集的数据每天都在增加。这一要求与存储容量无关,而是与快速存储大量数据的能力有关。它必须足够快,才能存储大量数据,而不会破坏系统或丢失数据点。
- 我希望能够处理具有复杂和/或有价值关系的数据 数据点的集合在两个方面有价值:每个数据点和组合数据点包含什么信息,以及数据点是如何连接的。虽然可供存储的数据量在快速增长,但企业了解他们可以访问的数据中有哪些是有价值的,这一点非常重要。它可能是一段时间内多次交易的价值,也可能是这些交易之间的联系以及导致它们发生的潜在原因。根据您的优先级,不同的数据库类型会更适合您的用例。
我希望能够处理大量数据,这可以通过“横向扩展”来解决
您的数据存储需求是什么? 如果您已经收集了数据,您可以通过对您当前的数据存储空间应用一个增长因子来估计您未来的数据存储需求。例如,如果您的增长是由您的用户数量推动的,您可以将您当前的数据存储空间乘以您估计的用户增长。
如果您没有收集到任何数据,您可以粗略估计一段时间内您将收集的数据点的数量。
您可以在下面找到一个如何估算未来数据存储需求的示例。
让我们考虑一下书店的例子。如果您希望每周产生 Y 笔销售,并且每笔销售都以 N 个数据点(账面价格、交易日期和时间、客户 ID 等)为特征,您可以估计在一年内,您将在 DB 中累积 Y x 52(一年中的周数)笔销售(或行)x N 笔销售特征(或列)。然后,您可以参考下表来评估公共关系数据库是否能够处理如此大量的数据。
本练习中要考虑的一个更重要的因素是,在将数据移动到另一个存储空间之前,将数据存储多长时间是合适的。
对于关系数据库来说,有多少数据实际上“太大”而无法处理? DB 引擎提供商分享性能容量指标。您可以使用这些准则来确定关系数据库是否能够处理您的大量数据。
你可以在上面找到 PostgreSQL 和 MySQL 的关键性能指标——两个关系数据库。
您应该注意到,最大列数和最大行数的范围很宽。这些容量限制受其他参数的影响,例如数据的编码技术和数据模型。编码技术是数据在计算机中的存储方式。
数据模型指的是组织数据的方式。例如,通过标准化你的数据,你可以节省大量的存储空间。规格化在本文的第 2 部分——反规格化章节中有详细解释。
什么数据库可以处理大量数据? 为了管理大量数据或者能够快速增加存储容量,您的数据库需要能够横向扩展。您可以参考第 2 部分—向外扩展部分来深入了解向外扩展技术。如今,关系数据库可以横向扩展。然而,没有为此目的而设计的。换句话说,关系数据库并没有被优化为在分布式服务器上运行,也不是开箱即用的。
另一方面,除了图形数据库之外的所有 NOSQL 数据库都被认为能够向外扩展。它们都能够在分布式系统上快速运行。
您可以找到以上针对横向扩展进行了优化的数据库类型和示例。
从业务影响的角度来看,这些 DBs 有哪些缺点?
如第 2 部分—横向扩展章节中所述,横向扩展的第一个缺点是在系统出现故障的情况下,必须在能够访问数据和能够读取数据库上的最新更新之间做出选择。另一个缺点是很难在分布式系统中进行[连接](http://you can picture "joins" as VLOOKUP operations in excel)。让我们讨论一下这对您的企业意味着什么。为了在可用性和一致性之间做出选择,你应该回顾你的需求和你的主要目标。
如果您的数据库正在为一个实时应用程序提供服务,那么在系统出现故障的情况下,您不能允许它有任何停机时间。这意味着可用性是必须的,你必须放弃一致性。
如果您的企业需要确保多个用户始终拥有相同的数据视图,例如,如果您正在管理库存,那么您不应该在物品短缺的情况下向不同的客户销售相同的物品。您需要保持一致性而不是可用性。
关于无法进行连接,这对企业意味着什么?
表示只能逐条表查询数据。换句话说,它限制了您可以在数据库上执行的查询,并迫使您根据将要执行的查询对数据建模,而不是根据数据本身对数据建模。具体地说,如果您有新的查询要运行,您很可能必须创建新的表。因此,更难适应不断变化的业务需求。在关系数据库中,数据库是根据数据建模的,您可以在其中执行连接,您的查询可以随着您的业务需求而发展,而不必重新建模数据库。
我希望能够存储任何类型的数据—可以用“灵活的模式”来解决
您正在收集哪些不同的数据类型? 在选择您的数据库之前,您应该列出您想要存储的不同数据元素,并确定它们的来源、创建者、结构级别和类型。
他们的来源至少应该区分内部数据和外部数据,并且最好应该告知是什么系统生成了这些数据。
它们的创造者应该区分这些数据是由人类还是由机器制造的。它会提示您预期的数据质量水*,以及潜在的转换或检查,您应该在接收数据之前应用。
它们的结构级别可以通过以下三个类别之一来限定:结构化数据、半结构化数据和非结构化数据。简而言之,数据的结构化程度可以看作是从数据中提取信息的难易程度。结构化数据被有逻辑地和一致地组织起来(例如:表格),允许你直接从数据中获取有用的信息。而非结构化数据必须经过处理才能从数据(如文本、表格、图像、视频等)中提取有价值的见解。
它们的类型指的是存储数据的格式。docx,xlsx,。jpg,。wmv 等)。
你可以在上面找到结构化、半结构化和非结构化数据的例子。
你能用关系数据库收集这些数据类型吗?
来源和创建者不应该影响数据是否可以存储。
关系数据库只能存储结构化数据。关系数据库要求要存储的数据可以用预定义列组织成类似表格的结构。半结构化和非结构化数据不符合这一要求,因此如果您要存储半结构化或非结构化数据,您应该寻找 NOSQL DB 解决方案。
关于数据类型,在关系表中存储任何可能的数据类型在技术上是可能的。然而,它会吃掉大量的存储空间,却没有太多的附加值。在这种情况下,建议存储文件的标题或路径,并将实际文件放在 DB 之外。
什么类型的 NOSQL DB 可以处理哪些具体的数据类型? 根据要存储的数据结构,您可以找到最适合您需求的数据库。
键值存储,顾名思义,只存储一个键和值。您可以通过使用键来检索存储的值,除了这些二元关系之外,几乎不维护任何结构。
文档存储类似于键值存储,但是具有扩展的存储选项。使用文档存储,不仅可以存储成对的键值,还可以将这些键值组合成集合,或者将它们嵌套在一起。
宽列存储,顾名思义,以列的形式存储数据。让我们举个例子来形象化它的意思。
你可以在下面找到一个行存储数据的例子和一个行存储数据的例子。
按行存储的数据(关系数据库中的数据):
用户、国家、性别
1:法国吉恩,男性
2:英国路易斯,男性
3:法国安妮,女性存储在列中的数据(宽列存储中的数据):
用户,国家,性别
1:让,2:路易斯,3:安妮
2:法国,2:英国,3:法国
1:男性,2:男性,3:女性
与使用关系数据库运行分析相比,这种结构允许使用宽列存储运行更快的分析。此外,与其他 NOSQL 数据库相比,宽列存储允许维护类似表格的结构。
你可以根据要存储的数据结构找到上面推荐的 DBs。
就业务影响而言,这些 DBs 的缺点是什么? 正如在第 2 部分—灵活模式章节中所解释的,灵活模式的主要缺点是失去了数据质量,并且失去了对存储内容的跟踪。让我们讨论一下这对您的企业意味着什么。鉴于你要存储的数据将是半结构化或非结构化的,从中提取洞察力将更加困难。存储这些数据只会推迟清理数据和找出如何利用数据的过程。此外,存储这些数据可能会给你一种建立某种资产的感觉,你可以从中创造价值。然而,在你弄清楚如何使用这些数据之前,你不能给你存储的东西赋予任何价值。换句话说,你正在失去对一项资产的清晰性,这项资产可能非常有价值,或者根本没有价值。
我希望能够以一种快速的方式运行查询——可以通过“反规范化”来解决
您的数据库的响应速度应该如何?
根据您的数据库的用途,您可能需要不同级别的响应时间。
如果您的数据库位于面向客户端的应用程序的后端,您需要确保您的响应时间足够短,以让客户端满意。根据用户在应用程序上执行的操作类型,进行了许多研究来了解响应时间限制。给你一个的例子,建议任何对用户动作的响应持续时间少于 1 秒。
另一方面,如果您的数据库是为了内部目的而运行分析,您可以更加灵活地组织您的团队来适应数据库的处理时间。
如何评估关系数据库是否能够处理您所需的读取吞吐量?
如果您已经收集了数据并可以对其运行查询,那么您可以收集性能信息并评估您的数据库是否符合您的响应时间要求。
如果您还没有收集到数据或者还不能在您的数据库上运行查询,您可以参考第 3 部分“我希望能够处理大量数据”一节中提到的容量指标。如果要分析的数据量接*存储容量上限,那么查询将会非常耗时。
什么类型的 NOSQL 数据库可以处理高读取吞吐量? 响应时间不仅受数据量的影响,还受查询和数据模型的影响。
查询优化调查运行和构建查询的不同方式,并比较它们的性能。非规范化的数据模型允许查询运行得更快,因为所有的信息都存储在一起。
此外,使用分布式系统,您可以并行操作并减少整个查询的时间。如上所述,关系数据库可以在分布式系统上运行,但这并不是它的目的。一些 NOSQL DB 类型已经过优化,可以在分布式系统上运行。
根据您想要执行的操作,不同的数据库最适合您的需求。
您可以在上面找到多个操作示例和推荐的数据库。
从业务影响的角度来看,这些 DBs 有哪些缺点?
如第 2 部分——反规格化章节所述,反规格化的主要缺点是降低数据一致性。让我们讨论一下这对您的企业意味着什么。
数据一致性确保数据库上同时运行的所有读取操作返回相同的值。具体来说,如果你的数据库被用在网站的后端,并且网站的一些标签上的信息没有在所有的标签上更新,它会使你的网站混乱并损害你的可信度。
如第 2 部分—最终一致性章节所示,如果您通过追求最终一致性来损害数据一致性,这意味着您的目标是在某个时间点拥有一致的数据,但不一定是在任何时间。换句话说,它不允许你运行实时分析。
最后,如果您还没有阅读过第 2 部分—横向扩展部分,因为上面提到的 NOSQL 数据库类型(键值存储、文档存储、宽列存储)都是分布式数据库。
我希望能够以快速的方式接收尽可能多的数据,这可以通过“灵活的模式”和“最终的一致性”来解决
您的数据库接收大量数据的速度应该有多快? 您的数据库接收数据的速度将直接影响它是否能够接收您所需的数据量。您需要数据库足够快地接收数据,以免丢失任何数据点。
如果您计划进行实时分析,您还需要以足够快的速度存储数据以便能够使用。
您如何评估关系数据库是否能够处理您所需的写吞吐量? 如果您已经有要收集的数据并设置了摄取过程,那么您可以收集性能信息并评估您的数据库是否符合您的存储时间要求。
如果您还没有要收集的数据或还不能接收数据,您可以参考第 3 部分中提到的容量指标—“我希望能够处理大量数据” 部分并检查您要存储的数据量是否至少在容量性能指标范围内。
什么类型的 NOSQL 数据库可以处理高写吞吐量?
在数据库中写入数据的时间受存储数据之前和之后要检查的约束以及理解数据应该存储在哪里所花费的时间的影响。
没有约束的灵活模式数据库将允许跳过约束进行检查,并具有更好的写入性能。文档存储(例如:MongoDB、CouchBase)和键值存储(Redis、Memchached)是具有非常灵活的模式的 NOSQL 数据库。
最终的一致性将允许在数据被接收之后推迟一致性检查,而不是在接收被验证之前进行,这将有助于加快写入过程。一些宽列存储使用最终一致性并保持某种模式(比关系数据库的固定模式更灵活,但比文档存储和键值存储中几乎不存在的模式更严格)。Cassandra 就是其中之一,它允许对存储的数据进行一些分析,同时针对写操作进行优化。
就业务影响而言,这些 DBs 有哪些缺点? 如第 2 部分—灵活模式章节所述,灵活模式的主要缺点是失去数据质量,这使得利用数据和对数据进行分析变得更加困难。让我们讨论一下这对您的企业意味着什么。
通过跳过 DB 模式,查询数据变得更加困难,因为您不再确切地知道数据中存储了什么以及如何查询它。同样,您应该回顾您的主要目标和需求,以了解对您将要存储的数据进行分析的重要性。如果您的需求包括能够过滤、排序和检索数据以对其进行一些分析,您还可以找到添加模式的方法,就一些指导原则达成一致,并在数据进入数据库之前强制执行(直接在源数据上,或者在到达数据库之前实现转换过程)。
最后,如果您还没有阅读过第 2 部分——横向扩展部分,我建议您阅读一下,因为上面提到的 NOSQL 数据库类型(键值存储、文档存储、宽列存储)都是分布式数据库。
我希望能够存储复杂的数据关系——可以用图形数据库解决
您的数据中的关系有多复杂和有价值?
数据关系中的复杂性可能来自两个因素。第一个是两个点可以通过不同类型的关系链接起来——例如在网飞,用户可以点击、观看或评论一部电影。第二,一个关系可以将一侧的多个点链接到另一侧的多个点——在网飞的例子中,如果我们考虑“点击”关系,许多用户可以点击许多电影。
如果您的数据在数据模型中累积了大量复杂的关系,您应该认为您的数据是高度关联的。
现在的问题是这些联系有多大价值?你应该问问自己,数据的价值是来自于数据点,还是来自于有联系,如何联系的事实。另一种方式是问问自己,在分析数据点时,如果忽略数据点之间的关系,是否会丢失信息。
您能使用关系数据库收集这些数据吗? 虽然顾名思义——关系数据库不是强调数据关系的数据库。尽管存在跟踪和存储数据的关系,但重点是按照相同的模式对数据点进行分组,并通过索引和列来访问这些信息。如果你的数据是高度关联的,理论上你可以把它存储在关系数据库中。但是,在其上运行查询的性能会受到查询复杂性的影响。事实上,关系数据库上的关系是通过连接【1】调用的。因此,如果您要在高度连接的数据库上运行查询,您很可能会使用大量的连接,这会降低查询的速度。
什么类型的 NOSQL DB 可以处理高度连接的数据? 图形数据库旨在突出数据点之间关系的值。
图形数据库不仅能够对具有复杂关系的数据进行分析,而且能够以非常快速的方式执行这种分析。
要了解更多关于图形数据库的优势,您可以查看第 2 部分——图形数据库章节
从业务影响的角度来看,这些 DBs 有哪些缺点?
如第 2 部分—图形数据库章节中所述,图形数据库的两个主要缺点是尚未成熟,并且没有横向扩展的设计。让我们讨论一下这对您的企业意味着什么。
事实上,有很多新的数据库还没有被测试过,这使得图形数据库不太可信。此外,这项技术的专家更少,因此更难招募和解决问题。
因为图形数据库不是为横向扩展而设计的,所以如果您确实需要增加存储容量,您必须定制您的架构。定制允许您根据自己的特定需求定制解决方案,但同时也会带来更高的成本和失败风险。
很好地完成了这篇文章的结尾!
我希望你理解并学习了数据库的新概念。如果你只需要记住一件事,我会最后一次强调没有数据库是完美的,它们都有缺点。对您来说,关键是理解这些权衡,并找到最适合您业务需求的方案。
*照片从上至下从左至右由:
凯尔·科特雷尔、考特尼·米勒、安德烈亚斯·海默尔、谢里·胡利、马多·埃尔·胡利、阿玛纳斯·塔德、亚采克·迪拉格、斯蒂芬·塞伯、马丁·卡特勒、克里斯托弗·伯恩斯和阿纳斯塔西娅·彼得罗娃在 Unsplash 上。
80 行环游世界
使用 Python 和 Shapely 进行全球地理空间分析
处理穿过反子午线(又名 180 度经线或国际日期变更线)的有问题的现实世界几何图形(多边形)
得益于物联网、运输、物流和气候/地球科学领域新发展的激增,越来越多的数据分析师/科学家(通常熟悉 Python 生态系统)正在将地理空间分析纳入他们的问题和工作流程。
虽然流行的 Python 库,如 Shapely 或 GeoPandas,通常都是开箱即用的,但我现在遇到了几个例子,人们在使用笛卡尔坐标系时经常会遇到问题。特别是,如果一个多边形穿过反子午线(又名 180 度经线) :
- “我的多边形在我的可视化/地图上看起来像一团乱麻!”
- “我的地理空间谓词/操作(例如包含、交集等。)失败"
- “我不知道怎么/懒得把这个吓人的多边形分割开来”
棘手的多边形[Image by pawa rit Laosunthara]:甚至可能在视觉上看起来很好,但进一步的地理空间操作很可能会向南(双关语)
你并不孤单。事实上,即使是官方的 GeoJSON 标准也认识到了这个问题,并提倡沿着反子午线分割几何图形。虽然分割一个线串应该足够简单,但对于挑战多边形来说,这可能并不简单:
- 多次来回穿越反子午线
- 包含孔或内环(即不只是简单的实心形状)
- 会分裂成两个以上的组成部分
放心吧——确实有几种工具可以解决这个问题。然而,我将介绍一个精简的、可访问的 Python 实现,它只需要 80 行代码…不包括文档字符串😅
TL;DR — 这是我对多边形反子午线分裂的实现(最后的片段也在文章的最后提供)。
让我们来看物理
正如本文标题中提到的,我们将利用 Shapely 来解决这个问题最核心的方面。因此,任何几何构造最终都应符合 Shapely Polygon API 规范。
下面是一个输入 GeoJSON(作为一个 Python 字典)的例子,它将被提供给最终的split_polygon
函数(参见本文底部):
我们还应该提出一些实际的假设:
- 如果两个连续点之间的纵向距离超过 180 度,那么我们假设反子午线被穿过。
- 我们假设两个连续点之间的纵向距离总是最小的。例如,[-179,0]到[179,0]表示纵向距离为 2 度,而不是 358 度。
- 我们假设感兴趣的多边形的跨度小于 360 度(即不会环绕整个地球)。这个要求是由于对 Shapely 的分割操作的可接受类型的约束。
步骤 1:检测反子午线交叉
根据上面的假设 1,我们可以编写一个超短函数来检测反子午线是否交叉。该功能将应用于 每个多边形环的连续坐标对。
步骤 2:将顶点移动到笛卡尔空间⬅️ ➡️
对于每个环的每个坐标:如果检测到交叉,我们现在基于假设 2 执行 移位以确保连续顶点之间的纵向距离总是最小。在这个新的移位空间中,我们可以设置范围[-180,+180]之外的 x 坐标(即移位经度)。下面是基本的,* 不完整的* 骨架:
小心,小心:如果一个多边形的边界(外壳)穿过反子午线并因此移动,但是任何内环不包含任何交叉点,那么移动后的几何体可能会以损坏或无效而告终。
理想的视觉表现[ 我法师由帕瓦里·劳孙塔拉]使用:https://geojson.io/
如果在没有任何修正的情况下执行移位,则会导致损坏
为了解决这个问题,我们需要跟踪外壳的边界。在对每个内环执行步骤 2 后,如果相应环的任何坐标仍然位于外壳的边界之外,则必须首先对整个环应用+/- 360 度的 x 分量校正。随后,我们现在可以注意到(移位)环是否与线x = -180
或x = 180
重叠。本质上,这一行将作为我们的。
第三步:拆分✂️并翻译🔙至经度、纬度
在所有这些转变之后,我们现在可以:
- 用我们的移位环在笛卡尔空间中实例化一个形状优美的多边形
- 让刀来做工作 : Shapely 会自动用对应于反子午线的适当线串来分割我们的良好成形的多边形。注意:** Shapely 的分割器只能使用笛卡尔几何进行插值,不能使用测地线。**
- 将生成的几何图形转换回有效的地理空间坐标
…我们完成了!(代码见下面的要点)
成功分割后的示例结果[Ipawa rit Lao sunthara 的法师]
裹住-起来
希望本演练和下面的实现对您有所帮助。如果您有任何疑问、反馈或问题,请随时通过 LinkedIn 与我联系。感谢您的宝贵时间!
Python 的最终实现
常见问题/议题
- https://github.com/Toblerity/Shapely/issues/495
- https://GIS . stack exchange . com/questions/226605/shapely-polygons-crossing-the-anti meridian
- https://GIS . stack exchange . com/questions/95990/split-a-polygon-that-crossed-international-date-line-arcpy
替代工具/实施
- https://www.gplates.org/docs/pygplates/generated/pygplates.DateLineWrapper.html
- https://github.com/briannaAndCo/Leaflet.Antimeridian
在 MATLAB/Octave 中高效循环
作者图片
数组顺序和 permute()函数
在 MATLAB/Octave 中循环数据时,数组顺序是一个重要的考虑因素。选择循环哪个维度实际上会对计算效率产生重大影响。在本教程中,我介绍并说明了数组顺序的概念,创建了一个简单的实验来演示循环时数组顺序的影响,并解释了如何使用 MATLAB 中的 permute() 命令来编写高效的循环。
所有例子的源代码都可以在 GitHub 库中找到。
数组顺序
在处理多维或 N 维(ND)数组时,了解数据在内存中的存储方式非常重要。这被称为数组排序。有两种通用约定:行优先和列优先排序。这两种不同的方法仅仅是指 ND 数组中的哪些元素在内存中是连续的,以及如何对这些数组进行线性索引。在列优先顺序中,列的元素在内存中是连续的。按照行优先的顺序,行的元素在内存中是连续的。所以基本上,我们对列主要的元素按列计数,对行主要的元素按行计数。
下面的代码片段显示了一个 3 x 3 矩阵的示例,其中每个元素都显示了线性索引是什么。同样,你可以把矩阵中的数字看作数据在内存中的顺序(例如 1 是第一个内存地址,2 是第二个内存地址,等等)。
colMaj = [ 1, 4, 7; 2, 5, 8; 3, 6, 9 ];
disp( colMaj )
1 4 7
2 5 8
3 6 9
rowMaj = [ 1:3; 4:6; 7:9 ];
1 2 3
4 5 6
7 8 9
disp( rowMaj )
通过使用“:”操作符,我们可以很容易地看到 MATLAB 是如何存储数据的,这个操作符将打开数据。由于 MATLAB 是以列为主的,您可以看到 colMaj 矩阵以正确的顺序返回索引,但是 rowMaj 矩阵以无序的顺序返回元素。
disp( colMaj(:) )1
2
3
4
5
6
7
8
9disp( rowMaj(:) )1
4
7
2
5
8
3
6
9
为了使这一点更清楚,我们可以建立一个简单的动画。动画展示了如何使用这两种惯例展开矩阵。底部的线性索引显示了各个元素在内存中的实际存储方式。
作者图片
数据循环
那么为什么数组顺序很重要呢?当你在数据上循环时,数组顺序实际上对运行时间有很大的影响。访问内存中连续的数据要高效得多。因此,了解我们的数据在内存中是如何组织的,也可以帮助我们编写计算效率更高的代码。
让我们用一个简单的例子来说明这一点。假设我们有一组想要操作的图像。这些图像的大小为( nX , nY )像素,我们的数据集中有 nI 个图像。这些图像在内存中可能有两种排列方式:[ nX , nY , nI 或[ nI , nX , nY 。在第一方向中,图像将在存储器中连续排列,而在第二方向中则不是这样。
为了了解数组顺序会产生什么样的差异,我们可以编写下面的测试代码。注意, tic() 和 toc() 函数允许我们对部分代码执行进行计时。如果您不熟悉此功能, tic() 实际上启动了一个定时器,而 toc() 记录了自您启动定时器以来已经过了多长时间。您可以在 MATLAB 帮助中找到更多文档。
% Arrange images at the first two dimension
imageData = randn( nX, nY, nI );
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et1 = toc( a );% Arrange images at the last two dimensions
imageData = randn( nI, nX, nY );
a = tic();
for ix1=1 : nI
thisImg = imageData( ix1, :, : );
end
et2 = toc( a );% Plot the results
fprintf( 'Looping over the last dimension: %0.4f seconds\n', et1 );
fprintf( 'Looping over the first dimension: %0.4f seconds\n', et2 );
fprintf( '%0.1f factor increase\n', et2/et1 );
为了说明数组顺序的影响,代码运行时使用了 nX = nY = 128 和 nI 取值 1000、10000 和 50000。鼓励勇敢和好奇的人下载源代码,尝试更多有趣的组合!
从 1,000 幅图像开始,我们可以看到数组顺序似乎没有太大的影响,但是,运行时间仍然有大约 10%的增加。
Looping over the last dimension: 0.8328 seconds
Looping over the first dimension: 0.9570 seconds
1.1 factor increase
将图像的数量增加到 10,000,我们开始看到运行时间有了很大的不同。当图像不是连续存储在内存中时,运行时间会增加 2.4 倍。
Looping over the last dimension: 0.9039 seconds
Looping over the first dimension: 2.1613 seconds
2.4 factor increase
进一步将图像数量增加到 50,000,我们继续看到运行时间的更大增长。现在运行时间增加了 8 倍!
Looping over the last dimension: 1.2299 seconds
Looping over the first dimension: 10.3527 seconds
8.4 factor increase
需要注意的是,这是一个简单的例子,只有一个循环和三个维度。对于多维数组或者嵌套多个循环时,这种影响实际上会更糟。有时,在代码中添加一些 tic() / toc() 调用,或者运行 Profiler 来更新代码是值得的。
MATLAB 中的 Permute()
MATLAB 包括一个名为 permute() 的函数,它是转置函数的一个推广,但用于 ND 数组。 Permute() 接受一个 ND 数组和所需的数组顺序,然后返回重新排列的数据。语法是这样的: newArray = permute( oldArray,[oldDim1,oldDim2,oldIm3 等…] )。在该语法中,变量 oldDim# 表示旧数组的数组顺序索引,函数输入中的位置表示新数组顺序位置。
例如,假设我们有一个形状为[200,450,120,680]的 ND 数组, A ,我们这样调用 permute()函数: B = permute( A,[3,1,4,2])。数组 B 的最终形状将是[120,200,680,450]。这里,我们将维度 3 移至维度 1,维度 1 移至维度 2,维度 4 移至维度 3,维度 2 移至维度 4。
使用 permute() 函数,我们可以根据我们想要循环的维度重新排列任意的 ND 数组。回到我们之前的图像示例,我们可以使用形状为[ nI,nX,nY ]的数组 imageData ,并通过使用以下命令将其重新排列为形状为[ nI,nX,nY ]的数组。
imageData = permute( imageData, [ 2, 3, 1 ] );
这将允许我们在最后一个维度上循环,我们刚刚展示了它的计算效率。将这一简单的行添加到我们之前的示例中,我们可以重新运行我们的测试。更新后的代码将如下所示。
% Arrange images at the first two dimension
imageData = randn( nX, nY, nI );
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et1 = toc( a );% Permute data before looping
imageData = randn( nI, nX, nY );
imageData = permute( imageData, [ 2, 3, 1 ] ); % loop over the last dim
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et2 = toc( a );% Plot the results
fprintf( 'Looping over the last dimension: %0.4f seconds\n', et1 );
fprintf( 'Permute and loop over the last dimension: %0.4f seconds\n', et2 );
fprintf( '%0.1f factor increase\n', et2/et1 );
使用 nI = 50,000 运行该实验,会产生以下输出。
Looping over the last dimension: 1.0844 seconds
Permute and loop over the last dimension: 1.1350 seconds
1.0 factor increase
使用 permute() 命令大大减少了循环时间。当然,使用 permute 函数会有一点点开销,但是在几乎所有的实际情况下,最好包含它。正如我前面提到的,对于高维数组和嵌套多个循环时尤其如此。
摘要
在本教程中,我们讨论了在 MATLAB/Octave 中循环 ND 数组时数组顺序的重要性。使用一些简单的 MATLAB 代码,我们展示了循环访问内存中连续数据的好处。我们进一步展示了 permute() 命令允许我们在循环之前重新排列数组的维数,这样我们就可以始终确保循环是高效的。
以下是需要记住的几点:
- 在 MATLAB 中,数据是按列主顺序排列的
- 我们应该总是在最外层的维度上循环,以使我们的循环尽可能高效。
- 可以在任何循环之前(和之后)使用 Permute() 来确保我们高效地循环 ND-数组。
- 对于嵌套循环,最里面的循环应该在最外面的维度上循环。
编码快乐!
用 Python NumPy 进行面向数组的编程
再见*原,老 For-loops!你好 Numpy 数组!
NumPy 简介
NumPy 是最受欢迎的用于高性能数组实现的 Python 库:数组上的操作比列表上的操作快得多,这在大数据世界中可以放大运行时差异。根据 libraries.io (截至 2020 年 4 月)4K 的图书馆依赖 NumPy,包括最流行的数据科学包,Pandas 和 SciPy。
NumPy 的美妙之处在于它提供了面向数组的编程风格。也就是说,它提供了带有内部迭代的函数式、矢量化操作,而不是使用条件 for 循环(或 n 维时的嵌套 for 循环)来处理数组元素,这使得数组操作更简单、更简洁。
在本教程中,你将发现从初级到高级的所有你需要知道的东西,超过 10 个综合主题。但是如果你是已经进阶的人,不要害怕!您可以 直接跳到最后两个部分(高级 & 专家),在那里将解决数组定向的“症结”以及基本的性能技巧。最后,您将能够将您的过程化编程风格转变为优雅、快速、无循环、基于数组的风格。
我们开始吧。。。
➊ —阵列创建
导入 NumPy import numpy as np
后,我们准备滚动:
一维
我们可以通过传递元素列表来创建数组;本例中的整数:
array = np.array([1, 2, 3, 5, 8, 13, 21])
📌您能在输出中注意到一些有趣的东西吗?
所有逗号分隔的值宽度相同,并且右对齐。由于最大数字 21 占据 2 个位置,所有其他值都被格式化为两个字符的字段。现在你知道为什么在[和 1 之间有一个前导空格了。😏
多维度
我们将创建一个 2 行 3 列的数组,传递两个嵌套的列表,每个列表包含三个元素:
array2x3 = np.array([[1, 2, 3], [10, 20, 30]])
输出的格式基于维度的数量,对齐每行中的列:正如我们看到的,1 和 10 对齐,2 和 20 对齐,等等。
阵列形状
我们可以用shape
属性确定数组的形状,该属性返回一个具有维度的元组:
以及带有ndim
属性的维数(即数组的秩),如下所示:
ndim
与数组形状输出的轴数或长度(len
相同:
元素数量
使用属性size
我们可以得到数组的元素总数:
元素类型和元素大小
由于 NumPy 是用 C 编写的,所以它使用它的数据类型。因此,整数被存储为int64
值——在 c #中对应于 64 位(即 8 字节)整数。
通过访问dtype
属性,确定数组的元素类型很容易:
以及存储每个元素所需的字节数,通过访问itemsize
:
存储容量
内存占用(nbytes
)是元素数乘以字节数。
常见数组
为了用特定的值填充数组,NumPy 提供了三个特殊的函数:zeros
、ones
和full
,分别创建包含 0、1 或特定值的数组。请注意,零和一包含float64
值,但是我们显然可以定制元素类型。
- 0 的 1D 数组:
zeros = np.zeros(5)
- 整数类型的 0 的 1D 数组:
zeros_int = np.zeros(5, dtype = int)
- 1 的 2D 数组(2x 5):
ones = np.ones((2, 5))
- 7 的 2D 阵列(2x 5):
full = np.full((2, 5), 7)
均匀分布的范围
NumPy 为从范围创建数组提供了优化的函数。创建均匀间隔范围的两个最重要的函数是arange
和linspace
,分别用于整数和浮点。
◼️整数:给定区间 np.arange(start, stop, step)
:在半开区间[start, stop)
内产生值,即包括启动但不包括停止的区间。默认start
值为 0,默认step
大小为 1。
- 范围从 0 到 4,增量为 1:
T21 - 范围从 5 到 9,增量为 1:
np.arange(5, 10)
- 范围从 2 到 8,增量为 2:
np.arange(2, 10, 2)
- 范围从 8 到 2,增量为-2:
np.arange(8, 0, -2)
◼️浮点数:给定元素的个数 np.linspace(start, stop, num, endpoint)
:返回num
个间隔均匀的样本,在间隔[start, stop]
内计算。间隔的endpoint
可以选择排除。默认num
值为 50,默认endpoint
为真。
- 5 从 1.0 到 2.0(不包括 2.0)的等间距元素:
np.linspace(1, 2, num = 5, endpoint = False)
- 5 从 1.0 到 2.0(包括 2.0)的等间距元素:
np.linspace(1, 2, num = 5, endpoint = True)
💡虽然我们可以通过将范围作为参数传递来创建数组,但我们总是更喜欢内置函数,因为它们可以优化性能。
随机范围
为了生成随机范围,NumPy 提供了一些选项,但以下是最常用的:
来自[0,1) np.random.rand(d0, d1, ...)
上的均匀分布的◼️随机样本,其中dn
是数组维数:
- 具有 5 个随机样本的 1D 阵列:
np.random.rand(5)
- 2 行 5 个随机样本的 2D 阵列:
np.random.rand(2, 5)
◼️随机整数 np.random.randint(low, high, size)
:返回从low
(含)到high
(不含)的随机整数。如果high
为无(默认),则结果来自[0, low)
。
- 从 1 到 99 的 10 个随机整数:
np.random.randint(low = 1, high = 100, size = 10)
➋ —索引
一维
我们可以使用方括号中的从零开始的索引来引用数组元素,例如在一个五元素数组中,第一个元素由[0]
访问,最后一个由[4]
访问。
也可以通过使用负的索引从末尾访问数组,从最后一个元素的-1 开始。所以在前面的例子中,最后一个元素([4]
)可以用[-1]
访问,它的第一个元素([0]
)可以用[-5]
访问:
所以在这个阵中:
array1D = np.array([0, 1, 2, 3, 4])
我们可以选择第三个元素:array1D[2]
或者从结尾开始:array1D[-3]
多维度
2D 数组可以用这个符号来访问:[row_index, column_index]
。
所以在这个实例中:
array2D = np.array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
我们可以通过array2D[1, 2]
选择第 2 行第 3 列的元素
➌ —切片
使用[first:last]
符号将数组分割成原始元素的子集,这将返回一个包含从索引first
到last-1
的元素的子数组。
→如果省略first
,则假设为 0,因此返回从开始到last-1
的元素。
→如果省略last
,则假定数组的长度,因此返回从first
到末尾的元素。
→如果first
和last
都省略,则返回整个数组。
一维
延续之前的array1D
示例:
- 具有第 2 和第 3 个元素的子数组(从索引 1 到 2):
array1D[1:3]
- 具有前 3 个元素的子数组(从开始到索引 2):
array1D[:3]
- 具有最后 3 个元素的子数组(从第 2 个索引到结尾):
array1D[2:]
- 包含所有元素的子数组:
array1D[:]
多维度
类似的原理也适用于 2D 数组,所以切片使用这个符号:
[row_first:row_last, column_first:column_last]
。
→要选择多行,我们使用:[row_first:row_last, :]
。
→要选择多个列,我们使用:[:, column_first:column_last]
。
承接前面array2D
的例子:
- 从行索引 0 到 1 和列索引 1 到 2 的子 2D 数组
array2D[0:2, 1:3]
- 从开始到索引 2 有多列的子 2D 数组:
array2D[:, :3]
- 从索引 1 到结尾有多行的子 2D 数组:
array2D[1:, :]
- 包含所有元素的子数组:
array2D[:, :]
下一节我们将解释为什么 Numpy 子数组只是视图!
➍ —复印
浅薄的文案/观点
切片不会修改原始数组。新创建的数组使原始元素的 浅 副本(或 视图 )这意味着它复制元素的引用,但不复制它们所指向的对象。
换句话说,对新创建的数组的任何修改也将反映在原始数组中。
这里是一个新创建的有 10 个元素的数组:
originalArray = np.arange(0, 10)
我们通过选择最后 5 个元素来分割它:
subArray = originalArray[5:]
我们通过使用内置的id
函数:
display(id(originalArray))
和display(id(subArray))
,观察到原始数组和切片数组确实是两个不同的对象。
为了证明subArray
与originalArray
查看相同的数据,我们将修改subArray
的第一个元素:
subArray[0] = subArray[0] * 10
然后显示两个数组—原始值也发生了变化:
深层拷贝
尽管浅层副本在共享数据时节省了内存,但有时还是有必要创建原始数据的独立副本。这个操作被称为 深度 复制,在多线程编程中非常有用,在多线程编程中,程序的不同部分可能会试图同时修改数据,这可能会破坏数据。
NumPy 提供了方法copy
,该方法返回一个新的数组对象,其中包含原始数组对象数据的深层副本。
重复前面的示例,我们可以看到,修改子数组时,原始数组没有受到影响。
我们先把originalArray
复制到newArray
:
newArray = originalArray.copy()
然后我们修改第 6 个元素:
newArray[5] = newArray[5] * 10
最后,我们显示两个数组——看看原始数组的值是如何保持不变的?
➎ —元素式操作
NumPy 提供了许多操作符,使我们能够编写简单的表达式来对整个数组执行操作。这是我们以后变得更高级和消除程序中 for 循环的垫脚石!
带标量
我们可以用数组和标量执行基于元素的算术运算。在这些操作中,标量被应用于每个数组元素,所以这个代码片段给每个元素加 5:array + 5
。
每个操作返回一个包含结果的新数组(即不修改原始数组)。
增强赋值修改左操作数中的每个元素。在这个例子中:array += 1
,原始数组的元素现在增加 1。与前面的情况相反,这里没有发生内存分配,因为这种就地操作是首选的。
乘、减、除、取幂和前面的加法一样简单。
📌标量操作是我们将在下一节讨论的最简单的广播形式。
数组之间
我们可以在相同形状的数组之间执行逐元素的算术运算。结果是两个数组的元素组合成一个新的数组。
在本例中,我们有两个数组,每个数组有 5 个元素:
arrayA = np.arange(2, 12, 2)
arrayB = np.arange(0, 5) + 1
当我们添加它们:arrayA + arrayB
时,我们可以看到新的组合数组:
📌请注意,数组乘法不是矩阵乘法。这些元素只是按分量相乘。利用前面的数组,我们可以通过使用dot
函数
np.dot(arrayA, arrayB)
来计算矩阵乘法
比较
当比较两个数组时,我们得到一个布尔数组,其中每个元素为真或假,表示各自的比较结果。
给定两个随机整数数组:
compA = np.random.randint(low = 1, high = 10, size = 5)
compB = np.random.randint(low = 1, high = 10, size = 5)
我们可以检查第一个数组的元素是否大于第二个数组的元素:compA > compB
。
📌为了比较完整的数组是否相等,我们使用了array_equal
函数,如果两个数组具有相同的形状和相同的元素 :
np.array_equal(compA, compB)
,则该函数返回 True
逻辑运算
此外,我们可以通过分别使用logical_or
和logical_and
函数,对数组元素应用逻辑 OR 和 and。
给定两个布尔数组:
logA = np.array([True, True, False, False])
logB = np.array([True, False, True, False])
我们得到:
np.logical_or(logA, logB)
和np.logical_and(logA, logB)
。
通用函数
此外,NumPy 提供了许多独立的通用函数(或ufuncs
)来执行各种元素操作。每个都返回一个包含结果的新数组。
官方文档列出了五个类别——数学、三角学、位操作、比较和浮点。建议快速浏览,这样你就知道什么是可用的。
干得好!你晋级了!
➏ —广播
到目前为止,这些操作需要两个大小和形状相同的数组作为操作数。当阵列的形状与兼容时,广播就放松了这些限制,实现了一些简洁而强大的操作。
较小的阵列在较大的阵列中“广播”。它可以让我们避免循环,也可以创建不必要的数据副本。
基于官方文件:
在两个数组上操作时,NumPy 按元素比较它们的形状。它从 尾随尺寸 开始,一直向前。
两个维度兼容当: 它们相等,或者 其中一个为 1
如果不满足这些条件,抛出*ValueError: operands could not be broadcast together*
异常。
我们将通过几个循序渐进的乘法示例来演示广播的操作原理。很大程度上,较小的数组会“伸展”,以便与较大数组的每一行相乘。
它在内存中不是字面意义上的拉伸;重复的是计算。
说明 1
在本例中,我们有一个 3x3 的表格和一个 1x3 的表格。
ex1A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ex1B = np.array([2, 5, 10])
我们可以观察到广播条件得到满足,并且两个维度是兼容的:
行维度:虽然它们不同(即 3 对 1),但其中一个是 1。
列尺寸:两者相同(即 3)
所以相乘的结果(ex1A * ex1B
)是:
说明 2
在第二个示例中,我们有一个 3x3 的表和一个 3x1 的表。
ex2A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ex2B = np.array([[2], [5], [10]])
同样,阵列是兼容的:
所以相乘的结果(ex2A * ex2B
)是:
说明 3
在第三个示例中,我们有一个 1x3 的表和一个 3x1 的表。
ex3A = np.array([1, 2, 3])
ex3B = np.array([[2], [5], [10]])
同样,阵列是兼容的:
所以相乘的结果(ex3A * ex3B
)是:
不相容尺寸
在本例中,行数不同(即 3 对 2),并且都不是 1。
同样,倒数第二个尺寸不匹配:
➐——塑造操纵
了解播音之后,另一个重要的概念就是操控造型。让我们来看看一些技巧:
使再成形
通常的做法是创建一个 NumPy 数组作为 1D,然后再将其整形为 multiD,反之亦然,保持元素总数不变。
📌reshape
返回一个新数组,它是原数组的浅副本。
这是一个有 9 个元素的 1D 数组:array09 = np.arange(1, 10)
。
我们可以将其重塑为一个 3x3 的数组:array09.reshape(3, 3)
。
或者作为 9x1 数组:array09.reshape(9, 1)
。
调整大小
如果我们需要改变元素的总数,那么我们需要调整数组的大小。如果我们扩大它,它将添加尾随零,直到它达到新的大小。否则,它将被截断为新的大小。
📌resize
修改了原来的阵列。
继续这个例子,我们可以将 9 元素数组扩大到 15 元素:
array09.resize(15, refcheck = False)
。
或者我们可以将其截断为 5 个元素:
array09.resize(5, refcheck = False)
。
📌扩大数组的另一个期望行为是让它重复自己,直到它达到新的大小。在这种情况下,我们可以使用resize
的“静态”版本,它将原始数组作为输入:
np.resize(array09, 10)
新维度
在数组中插入一个新轴会增加数组的维数。newaxis
通常用于使阵列兼容广播。
在本例中,我们将了解如何将一个单行表格转置为一个单列表格:
array1x4 = np.array([1, 2, 3, 4])
print(array1x4)
print(np.shape(array1x4))array4x1 = array1x4[:, np.newaxis]
print(array4x1)
print(np.shape(array4x1))
很整洁,对吧?
变*与变松
展*是整形的逆操作。我们可以用方法flatten
和ravel
将多维数组展*成一维。方法flatten
deep 复制原始数组的数据,而ravel
shallow 复制它,[这样展*比较慢]。
下面是一个 2x2 的数组:array2x2 = np.arange(1, 5).reshape(2, 2)
。
我们将它展*—深度复制:array2x2.flatten()
然后迅速重新设置为 2x2: array2x2 = array2x2.reshape(2, 2)
然后再解开——浅抄:array2x2.ravel()
移项
转置一个数组,也就是改变它的维度(意味着把它的形状从(X,Y)
变成(Y,X)
)也非常简单。
📌transpose
返回一个新数组,它是原数组的浅副本。
下面是一个数组:
toBeTransposed = np.arange(1, 5).reshape(2, 2)
这里是它的转置副本:
toBeTransposed.transpose()
加入
连接或串联意味着将两个或多个数组的内容放在一个数组中,沿着指定的轴,将它们“堆叠”在(axis = 1
)下面或(axis = 0
)旁边。有几个选项可以做到这一点,但concatenate
功能是最受欢迎的。
这里有两个 3x3 数组,arr1
和arr2
:
arr1 = np.arange(9).reshape(3, 3)
arr2 = arr1 * 2
◼️垂直拼接【行式|轴= 0】 np.concatenate((arr1, arr2))
◼️水*串联【列式|轴= 1】 np.concatenate((arr1, arr2), axis = 1)
裂开
拆分是连接的反向操作,即我们将一个数组的内容沿着指定的轴拆分成多个子数组。
我们可以将它们拆分成相同形状的数组,或者指示位置,在此之后应该进行拆分。
使用这个九元素数组(arr3
),我们将看到这两种变化(在axis = 0
上):
◼️均匀分割 np.split(arr3, 3)
将产生 3 个大小相等的子阵列:
◼️不均匀分割,基于一维数组 np.split(arr3, [2, 7]))
中指示的位置,将产生 3 个子数组,在第 2 个和第 7 个元素之后分割:
'Map, Filter and Reduce' are paradigms of functional programming. They allow us to write simpler, shorter code, without needing to bother about for-loops or if-else branching. Even if they are powerful on their own, 'the cherry on top' is that they can be chained together.The next three sections will cover **exactly that**, when it comes to NumPy arrays.
➑ —制图
为了将转换应用到 NumPy 数组中,我们将使用vectorize
函数。返回一个新数组,映射生效。
下面是一个简单的数组:
toBeMapped = np.arange(0, 10)
我们现在将通过传递一个 lambda 匿名函数使数组的所有元素加倍:
np.vectorize(lambda x: x * 2)(toBeMapped)
如果我们有一个更复杂的计算(有许多行代码),我们可以传递一个函数来代替。
📌根据文档,“提供[vectorize](https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html#numpy.vectorize)
功能主要是为了方便,而不是为了提高性能。该实现本质上是一个 for 循环。然而可读性是这里的关键,所以尽管它使用了 for 循环,但我们的代码没有!
➒滤波
Filter,用一元谓词测试每个元素。NumPy 为此提供了extract
函数。满足谓词的元素被保留;不符合的将被删除。返回一个新数组;过滤器不会修改原始数组。
下面是我们的示例数组:
toBeFiltered = np.arange(0, 9).reshape(3, 3)
我们要选择奇数:
np.extract(toBeFiltered % 2 == 1, toBeFiltered)
实现相同结果的等效方式如下:
toBeFiltered[toBeFiltered % 2 == 1]
➓——还原
当面对大量数据时,期望的步骤是通过在整个阵列或其一个轴上应用计算来减少维度。
下面是一个 2x3 的数组:
toBeReduced = np.arange(1, 7).reshape(2, 3)
总和
整个数组 toBeReduced.sum()
上的◼️将产生一个代表所有元素之和的标量:
◼️按列[axis = 0] toBeReduced.sum(axis = 0)
将产生一个 1x3 数组,其中每个元素是各自列的总和:
◼️按行[axis = 1] toBeReduced.sum(axis = 1)
将产生一个 3x1 的数组,其中每个元素是各自行的总和:
其他削减
他们都以同样的方式工作。例如:
◼️最小/最大值 toBeReduced.min()
和toBeReduced.max()
◼️其他
t27】另外两个重要的类别包括:
我建议你浏览一下,然后边走边学。
我的赞美!你已经准备好为一个骰子叫牌了!
NumPy 性能提示和技巧
为了优化程序的性能,我们要做的第一件事就是将计算或内存分配移到 for 循环之外。我们已经介绍了很多关于 NumPy 技术的材料,但是让我们提炼这些技巧和诀窍,并使它们变得清晰,以帮助您编写更高性能的代码。
1️⃣ —矢量化
矢量化是以元素方式处理整个数组的操作。它们将 Python 的显式 for 循环转化为隐式、低级、优化和编译的 C 实现,因此您应该更喜欢它们。
2️⃣ —副本
你应该避免不必要的深层拷贝;尽可能使用浅层副本(或视图)和就地操作。
3️⃣ —广播
在组合数组之前,应该使用广播对尽可能小的数组进行操作;最小的维度在内部被拉伸以匹配另一个维度,但是这个操作不涉及任何内存复制。
4️⃣——记忆
Numpy 数组按行优先顺序存储,即展*的内存是逐行表示的。因此,将数据存储在连续的内存块中可以确保现代 CPU 的架构在内存访问模式和 CPU 缓存方面得到最佳利用。因此,以连续的方式访问或遍历一个数组比随机访问要快得多,所以你应该明智地选择如何在 n 维中表示数据。作为一个说明性的例子,沿行对元素求和比沿列快。
5️⃣ —函数阵列编程
你应该使用 Map、Filter、Reduce 来避免 for 循环和条件编程。
精彩!你坚持到了最后!
推荐阅读
- 100 Numpy 演习
- 真正的 Python:用 NumPy 进行数组编程
- NumPy 数组:高效数值计算的结构
**** ****必读 ******** - 科学讲座:高级数字
- 美丽的代码【论文 19:‘Numpy 中的多维迭代器’】
收场白
我希望 NumPy 的强大和它所带来的灵活性能让你有所启发。现在,您已经具备了帮助您优化代码性能并尽可能消除 for 循环所需的知识和技能。你需要做的就是:
练习——练习——练习!
感谢阅读!
我经常在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我 !
(艺术)智力。新的创造性人工智能。
人类的创造力是唯一永不停止创造事物的机器。但是人工智能会变得“有创造力”吗?
“你能想象的一切都是真实的”——巴勃罗·毕加索
一个人工智能能做很多事情,但它能成为“创意”吗?很明显,人类使用人工智能来提高和增强他们作为人类的创造力,然而我问自己的问题是,这种“人机合作”是否有必要存在,以创造真正有价值的令人兴奋的东西。
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
如果你想了解更多,请访问oscargarciaramos.com
如今,认为人工智能完全取代人类创造力是没有意义的。拥有两台如此强大的“机器”而避开其中一台,将是一个绝对的错误。相反,我们应该利用两者所提供的 200%的潜力,这是一个不可替代的可怕组合。
让我们谈谈艺术、音乐、舞蹈、写作……“有创造力意味着热爱生活”,能够自发地产生新的想法或概念。
AI 是否发生在这些领域?还是应该只留给人类?
艺术
《爱德蒙·德·贝拉米的肖像》,一幅人工智能画作,已经以 43.2 万美元的价格售出。它的创造者?一种算法,特别是一种生成敌对网络(GAN ),它被输入覆盖六个世纪的 15,000 个肖像的数据集,以通知其输出。
如果我们谈论爱达呢?“世界上第一个超现实的人形人工智能机器人艺术家”。它配备了眼睛摄像头和机械臂,能够绘画或说话,这要归功于一个名为人在回路或 HITL 的仿真模型。
关于……
音乐
在过去的几年里,人工智能音乐领域的进展迅速加快。
如果我们回到过去,1951 年,艾伦·图灵是第一个用几乎占满整个实验室的机器录制计算机生成音乐的人。
今天使用最多的技术之一是 强化学习 ,这是一种学习歌曲中发现的特征和模式的算法,以复制或模拟某种音乐流派的新歌曲。 谷歌的 Magenta 项目 就是一个例子,一个制作歌曲的开源*台,编写并生成感谢 AI,或者也是 IBM 的索尼 WatsonFlow Machine解决方案。事实上,格莱美提名制作人亚历克斯·达吉德在他的“创作”过程中就依靠了这个工具。
你听说过 AIVA 吗?“人工智能创作情感配乐音乐”被称为“创意人的创意助手”,它允许你根据不同的风格或影响创作音乐:现代电影,电子,流行,摇滚,幻想,等等。
跳舞
在 Peltarion ,一位人工智能(AI)专家兼舞蹈编导是 AI 在舞蹈中应用的一个明显例子。该团队设法创造了一个解决方案,不仅基于学习某种风格的舞蹈,而且专注于创造自己的编舞。它是如何工作的?它由一个名为“chor-rnn”的循环神经网络组成,从 5 个小时的当代舞蹈中获得+1350 万个不同的位置。仅在 48 小时内,他们就取得了第一批成果。
NVIDIA 还能够根据歌曲的风格,跟随音乐的节拍创造新的舞蹈动作。他们使用一个 MM-GAN(生成对抗网络)收集来自芭蕾、尊巴和嘻哈的不同视频。得益于这一解决方案,他们成功生成了 361,000 个剪辑,总共包含 71 个小时的新舞步。
最后…
写作
在我们“创造力”的最后一个领域,我们可以找到我们所谓的自然语言生成(NLG),它包括从数据中创造“叙事写作”。比如美国美联社目前正在使用 AI 撰写数千篇体育报道。
新的网站也出现了,从一个标题生成“独特的”文本,以创建一篇新文章的完整草稿。这个过程很简单:选择一个主题或标题,等一会儿,并采取自动文章作者起草的。不可思议,你不觉得吗?
那么,下一步是什么?
“人类的创造力”是唯一永不停止创造事物的机器。
让我们开始与人工智能形成新的合作,创造你以前从未想象过甚至梦想过的东西。不是说 AI 要来取代我们。
不是这样的。
我们不要找借口了。顺其自然,利用新的人工智能能力。
让我们开始创造吧!
欢迎发表评论、鼓掌或分享这篇文章。跟随 me 进行未来岗位。
如果你想了解更多,你可以在oscargarciaramos.com找到我
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
基于不同神经网络的艺术风格转换
模型之间的比较
介绍
艺术风格的转变在于将一幅图像转变成一幅类似于艺术家所画的图像。
如果我们是文森特·梵高的粉丝,并且我们喜欢德国牧羊犬,我们可能会想要一张我们最喜欢的狗的照片,用梵高的星夜时尚来画。
作者图片
梵高《星夜》, 公共领域
生成的图片可能是这样的:
作者图片
相反,如果我们喜欢葛饰北斋的神奈川巨浪,我们可能会得到这样一张照片:
神奈川大浪潮作者葛饰北斋, 公共领域
作者图片
如果我们更喜欢瓦西里·康丁斯基的作品 7,就像下面这幅图一样:
瓦西里·康丁斯基作文 7, 公共领域
作者图片
由于计算处理能力的进步,允许使用更复杂的神经网络,这些图像转换成为可能。
在继续之前,您可能想看看如何在没有任何复杂框架的情况下使用 python 实现一个基本的神经网络点击此处
由一系列卷积矩阵运算层组成的卷积神经网络(CNN)是图像分析和物体识别的理想选择。它们采用了与 Gimp 或 Photoshop 等应用程序中使用的图形过滤器和检测器类似的概念,但功能更强大,方式更复杂。
矩阵运算的一个基本例子是由边缘检测器执行的。它获取一个 n×n 像素的小图片样本(以下示例中为 5×5),将其值乘以预定义的 n×n 卷积矩阵,并获得一个值,该值指示图像的该部分中是否存在边缘。对图像的所有 n×n 部分重复该过程,我们可以生成新的图像,其中我们已经检测到存在于其中的对象的边界。
作者图片
CNN 的两个主要特征是:
- 卷积矩阵的数值不是预先定义的,以找到特定的图像特征,如边缘。这些值是在优化过程中自动生成的,因此它们能够检测比边界更复杂的特征。
- 它们具有分层结构,因此第一层将检测简单的图像特征(边缘、色块等)。)并且最新的层将使用来自先前层的信息来检测复杂的对象,如人、动物、汽车等。
这是卷积神经网络的典型结构:
感谢像马修·d·泽勒、罗布·弗格斯的“可视化和理解卷积网络”【1】和克里斯·奥拉、亚历山大·莫德温采夫、路德维希·舒伯特的“特征可视化”【12】这样的论文,我们可以直观地了解 CNN 不同层检测到的特征:
马修·d·泽勒等人的图片“可视化和理解卷积网络”【1】,授权使用
第一层检测图像的最基本特征,如边缘。
马修·d·泽勒等人的图片“可视化和理解卷积网络”【1】,授权使用
接下来的层结合前一层的信息来检测更复杂的特征,如纹理。
马修·d·泽勒等人的图片“可视化和理解卷积网络”【1】,授权使用
下面的层,继续使用以前的信息来检测重复模式等特征。
马修·d·泽勒等人的图片“可视化和理解卷积网络”【1】,授权使用
最新的网络层能够检测复杂的特征,如对象部分。
马修·d·泽勒等人的图片“可视化和理解卷积网络”【1】,授权使用
最终层能够对图像中存在的完整对象进行分类。
检测复杂图像特征的可能性是对这些特征执行复杂变换,但仍然感知图像中相同内容的关键使能因素。
独立图像优化
关于艺术风格转移的最重要的论文之一是由 Leon A. Gatys、Alexander S. Ecker、Matthias Bethge 撰写的“艺术风格的神经算法” [2]。
它的主要发现是,自然图像的 内容 及其 风格 可以彼此独立地分离和处理,这允许我们从经典艺术绘画中“提取”风格并将其应用到我们自己的图像中。
这里讨论的许多其他神经类型转移模型采用了这一思想,并用更快和更复杂的网络扩展了它,但仍然使用这一基础。
Gatys 等人的模型基于 VGG-19[3]神经网络,该网络通常用于视觉对象识别,可与人类性能相媲美。
作者图片
然后,它使用它的片段来定义一些函数:
- 一个内容损失函数,它计算生成的图像内容与我们原始图像的内容有何不同。为了比较内容,而不是比较图像像素,它检查输入图像 的 的 CNN 最高层之一的值和输出图像 的该层的值。这将允许我们生成包含相似对象的不同图像。
- 一个风格损失函数,它计算生成的图像的风格与经典艺术绘画的风格(或我们选择使用的任何风格的图像)有何不同。要比较风格,需要不同的方法。它采用不同级别的层(以比较不同复杂性的特征),并且对于每一层,创建具有检测到的特征之间的相关性的矩阵(Gram 矩阵)。该矩阵指示哪些特征同时出现(如发现水*线总是具有 X 颜色等)。风格损失被计算为 风格图像 的层的克矩阵和 输出图像 的层的克矩阵之间的距离。这使得我们可以将一些简单的特征,如一些颜色的块,应用到最复杂的,如波浪或艺术家的笔触。
- 考虑内容损失和风格损失的总损失函数。
作者图片
然后,它运行几轮优化(数千次或更多),将在我们的工作图像中引入变化,这将减少总损失,从而在我们的照片和绘画风格之间产生混合。
以前所有的德国牧羊犬艺术形象都是用这种方法生成的。
你也可以使用这种方法去 artcopypaste.com 网站制作你自己的艺术图片。
优点:
- 适用于任意样式和任意大小的图像(仅受进程中使用的 GPU 内存限制)。
- 不需要预先训练神经网络(它使用用于对象检测的 VGG19 ImageNet 权重)。
- 主要的深度学习框架都有可用的例子: PyTorch 、 Tensorflow 、 Keras 等。
缺点:
- 它需要很长时间才能产生结果,在中等范围的 GPU 上大约需要几分钟。
- 它需要存储 VGG 预训练的重量数据(550 MB)。
用于单一风格转换的预训练网络
这些网络解决了之前描述的模型的主要缺点:制作艺术图像所花费的时间。
它们基于贾斯廷·约翰逊、亚历山大·阿拉希、李菲菲的论文“实时风格转换和超分辨率的感知损失” [4]中描述的模型。
这些模型用特定的风格预先训练 CNN,这可能需要在 GPU 中花费几个小时,然后这些网络可以用于几乎实时地将选定的风格应用到任何图像,也可以在几分钟内将风格应用到电影。
它们由两个 CNN 组成:
- 一个可优化的 图像变换网络 ,它采用原始图像并按照编码器-解码器设计生成新的艺术图像。图像首先被简化为一组高级特征,然后可以被扩展以重新创建图像,但是在这种情况下,应用了艺术风格。
- 一个固定的 损失网络 ,用于测量“感知损失”,即生成的图像尽管改变了风格,但与原始图像有何不同。这种损失类似于 Gatys 等人 [2]的总损失函数(内容损失+风格损失),但它是使用预训练的 VGG16[3]网络而不是 VGG19 网络来计算的。
作者图片
图像变换网络的结构类似于:
作者图片
- 网络结构遵循来自拉德福德等人【5】的指南
- C1-3 是具有步骤 2 的卷积,没有合并,对图像进行下采样,并且具有批量归一化和重新激活。
- RN1–5 是用于高级图像特征识别的 resnet[6]。在图像识别问题上,雷斯内特被证明比 VGG 更快。
- C4-6 是跨越而不合并的卷积,用于图像上采样,具有批量归一化和 ReLU 激活,除了最后一层使用 Tanh 激活来生成 0 到 255 之间的像素值。
- 卷积 C1 和 C6 使用 9x9 内核,C2–5 使用 3x3 内核。
这种图像下采样和上采样有助于检测图像的更高级特征。在某种程度上,它的工作方式类似于有损压缩,但针对的是图像的高级特征(而不是 JPEG 图像中的像素或颜色)。
使用与之前相同的图像和样式,将产生以下结果:
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
优点:
- 一旦经过训练,图像变换网络就可以很快地将它所训练的风格应用于任何类型的原始图像。它在中档 GPU 中工作在几十秒的量级。
缺点:
- 它需要花费更多的时间来训练,因为它需要根据图像数据集来训练网络。
- 它不仅需要 VGG 的权重数据(550 MB),还需要用于训练的影像数据集(例如,包含 82,700 张影像且需要 13.7 GB 存储空间的 COCO 2014 数据集)
用于任意风格转换的预训练网络
这些网络还生成预训练模型,但不限于仅一种风格,该模型旨在能够再现风格图像中存在的任何风格。
Golnaz Ghiasi、Honglak Lee、Manjunath Kudlur、Vincent Dumoulin、黄邦贤·施伦斯的论文“探索实时、任意神经艺术风格化网络的结构”【7】中描述了创建这种类型的网络模型的一种方法。
另一个非常相似的模型,在黄浚、瑟奇·贝隆吉的“使用自适应实例规范化的实时任意风格转换”【8】中有所描述。
该模型由三个神经网络组成:
- 一个 风格的传输网络 (类似于约翰逊等人的图像传输网络)
- 一张 亏损网 (类似强生等人vgg 16【3】)
- 并增加了一个 风格预测网(Inception V3【9】)。
作者图片
Golnaz Ghiasi 等人 [7]论文扩展了文森特·杜默林、黄邦贤·施伦斯和曼朱纳斯·库德鲁尔在“艺术风格的习得性表征”[10]中描述的初始工作,该工作实现了一个类似于约翰逊等人 [4]的模型,但是通过操纵风格变换网络的归一化参数,它能够将 32 种绘画风格应用于图像。
由于增加了 风格预测网络 ,该模型能够应用任意数量的风格,甚至是它没有被训练过的风格。该网络产生表示风格图像中存在的检测到的风格的标准化参数矢量,并将它们应用于风格传递网络以生成艺术品。
为了训练该模型,不仅需要大的图像数据集来用作训练风格传输网络的内容(在这种情况下,ImageNet 数据集包括 1400 万个图像),而且需要大的风格图像数据集来训练风格预测网络(在这种情况下,Painter by Numbers 数据集包括 80.000 个艺术绘画和可描述纹理数据集,包括 5600 个纹理)。
幸运的是,有一些预先训练好的模型可以直接使用:
- 第一个版本,在 Tensorflow Hub 中可用,权重数据大小只有 39 MB,可以生成以下图像:https://tfhub . dev/Google/magenta/arbitrary-image-stylization-v1-256/1
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
- 第二个更新版本,大小为 82 MB,也可在 Tensorflow Hub 获得:https://tfhub . dev/Google/magenta/arbitrary-image-stylization-v1-256/2
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
你也可以在 artcopypaste.com 的网站用这个模型测试你自己的图片。
优点:
- 这种模式非常快。用预训练的模型仅通过 1 次风格转移网络和风格预测网络,就产生艺术图像输出。
缺点:
- 它需要大量的图像数据集和训练时间。但幸运的是,预先训练的模型是可用的,随时可以使用。
- 由于用于训练的样式的分辨率有限,它们不会生成与 Gatys 等人【2】或 Johnson 等人【4】同样高细节的结果,但它们仍然是非常令人满意的结果。
利用编码器-解码器网络的通用风格传输
该模型在、、、、王、陆、明的论文“通过特征变换的通用风格转换”【11】中有详细描述
它试图放弃在样式图像上训练网络的需要,同时仍然保持视觉上吸引人的变换图像。
它首先训练一系列连接到 VGG 网络不同层的解码器网络。VGG 网络充当编码器。它加载了 ImageNet 权重并被固定。直到解码器连接到编码器的点,每个解码器结构都具有 VGG 的逆结构。
使用图像数据集,解码器被训练来重新生成原始图像馈送到 VGG。一旦他们接受了训练,他们的体重在剩下的过程中是固定的。
作者图片
这产生了一组编码器-解码器,其将原始图像转换成具有不同复杂程度的特征,但是能够重构原始图像,或者执行单级变换,或者为了更好的生成质量,执行多级变换。
对于单级转换:
- 内容和样式图像都通过 VGG 进行编码。
- 两个图像的特征都是从特定层提取的。
- 然后,对这些特征应用白化和着色变换。
- 然后,WCT 的结果被馈送到相应的解码器网络,以生成风格化图像。
作者图片
实际上,白化过程有助于捕捉内容和样式图像中存在的内容特征。另一方面,着色过程有助于捕捉风格特征。最后,该过程混合内容和风格特征,给定每个特征指定的相对权重。这种混合然后被馈送到解码器以继续该过程。
对于多级优化:
- 原始图像和样式图像被馈送到 VGG。
- 从第五层提取两幅图像的特征。
- 在特征中执行白化和着色变换,然后馈送到第五解码器。
- 然后,解码器输出与风格化图像一起再次馈入 VGG。
- 然后我们从第四层提取两幅图像的特征。
- 用白化和着色变换处理这些特征,然后馈送到第四解码器。
- 类似地,重复这些步骤,直到我们从第一个解码器获得生成的图像。
- 这个生成的图像就是我们最终的艺术图像。
作者图片
这种模式的一些例子如下:
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
优点:
- 这种模式速度很快。通过五次传递(每个编码器-解码器一次),它产生艺术图像输出。
缺点:
- 训练五个解码器网络中的每一个都需要大量的图像数据集和时间,但这仅需要一次,但该论文甚至在代码样本中包括预训练的权重。
最后的想法
这项工作远远没有描述所有现有的神经网络模型来执行艺术风格转移的迷人过程,这是在不断演变。
最好的例子是 Gatys 等人将图像的内容和风格分开,这是几乎所有其他模型所采用和扩展的。
我也只是想用几个例子来展示,我们如何更深入地理解我们在图像中考虑的对象,尽管它在颜色和形式上可能会遭受所有可能的转换,并更好地了解我们如何感知我们周围的世界。
其他相关故事:人工智能开端(用 Python 从零开始构建神经网络)
参考文献
1:马修·d·泽勒,罗布·弗格斯,“可视化和理解卷积网络”(2013),https://arxiv.org/abs/1311.2901
2:莱昂·A·加蒂丝,亚历山大·s·埃克,马蒂亚斯·贝赫,《艺术风格的一种神经算法》(2015),https://arxiv.org/abs/1508.06576
3:卡伦·西蒙扬,安德鲁·齐泽曼,“用于大规模图像识别的极深度卷积网络”(2014),https://arxiv.org/abs/1409.1556
4:贾斯廷·约翰逊,亚历山大·阿拉希,李菲菲,“实时风格转换和超分辨率的感知损失”(2016),https://arxiv.org/abs/1603.08155
5:亚历克·拉德福德,卢克·梅茨,苏史密斯·钦塔拉,“深度卷积生成对抗网络的无监督表示学习”(2015),https://arxiv.org/abs/1511.06434
6:何,,任,,《深度残差学习用于图像识别》(2015),
7: Golnaz Ghiasi,Honglak Lee,Manjunath Kudlur,Vincent Dumoulin,黄邦贤·施伦斯,“探索一个实时、任意的神经艺术风格化网络的结构”(2017),https://arxiv.org/abs/1705.06830
8:https://arxiv.org/abs/1703.06868、黄浚、塞尔日·贝隆吉,“自适应实例归一化的实时任意风格转换”(2017)
9:克里斯蒂安·塞格迪,文森特·范霍克,谢尔盖·约夫,黄邦贤·施伦斯,兹比格涅夫·沃伊纳,“重新思考计算机视觉的盗梦空间架构”(2015),https://arxiv.org/abs/1512.00567
10:文森特·杜穆林,黄邦贤·施伦斯,曼朱纳斯·库德鲁尔,“艺术风格的学术代表”(2016),https://arxiv.org/abs/1610.07629
11:,,,,王,,吕鑫,明,“通过特征转换实现通用风格转换”(2017),
12:克里斯·奥拉(Chris Olah),亚历山大·莫尔德温采夫(Alexander Mordvintsev),路德维希·舒伯特(Ludwig Schubert),《特征可视化》(2017),https://distill.pub/2017/feature-visualization/
人工智能艺术:神经风格转移
对卷积神经网络最有趣的应用之一的解释
介绍
如果你能把你的图像转变成像文森特·梵高或莱昂纳多·达·芬奇这样的著名画家风格的艺术品,会怎么样?如果知道卷积神经网络不仅可以帮助你学习对图像进行分类或检测物体,还可以帮助你学习艺术家的绘画或绘画风格,以艺术家自己的风格重建图像,你不会感到惊讶吗?好吧,如果你想知道如何做到这一点,这篇文章就是为你准备的。
神经类型转移
这种深度学习技术可以帮助你生成一个输出图像(表示为 G )基于内容图像(表示为 C ),但是以另一个图像的风格绘制或绘制(称为风格图像,表示为 S )。
使用神经类型转移生成的图像示例
这种技术主要依赖于 ConvNets 的初始层和更深层从给定的风格图像中提取特征并在内容图像上实现它的方式。
卷积神经网络及其学习
让我们以一个 VGG 模型为例来说明学习过程
VGG19 架构
当图像被传送到网络上,并且训练开始时,每一层都有一些激活。现在,如果你试图想象每一层的激活,你会发现最初的层会试图识别图像的简单特征,如边缘或边界或特定颜色的阴影。而更深层的激活将倾向于学习图像的更复杂的特征,如形状、图案、物体、纹理等。接*尾声时,最终图层将能够识别前景或背景物体,如猫、狗、汽车等。
这是我们在神经风格转移中使用的基本直觉,即分离图像的风格和内容。我们从风格图像中提取出所有特征,将其分离,同样,我们从内容图像中分离出复杂的特征,这有助于我们生成输出图像。
构建神经风格转移系统
在建立神经风格转换系统的过程中,第一步也是最重要的一步是定义损失函数:内容损失和风格损失。内容损失最小化确保内容图像和生成图像的更深层之间的差异或误差最小,风格损失最小化确保风格图像和生成图像的所有层之间的差异或误差。
最初,我们将生成的图像( g )定义(或初始化)为可训练变量,事实上,它是唯一可训练的图像,因为内容( c )和样式图像( s )不会被训练。并且预训练模型的参数(权重和偏差)应该被冻结。
内容损失
内容损失功能帮助生成的图像结合内容图像的内容。当生成的图像和内容图像被馈送到 CNN,并且计算不同层的激活时,选择更深的层( l )的输出,其用于找出内容和生成的图像之间的误差。该损失函数基本上是被馈送了内容图像( C )和生成图像( G )的 CNN 的这两个中间层之间的欧几里德距离。用简单的话来解释,内容损失函数为我们提供了更深层次的内容和生成的图像之间有多大差异的答案。
内容损失函数
这仅仅是 CNN 的层 l 的激活与内容和生成的图像之间的均方误差。请注意,我们仅在一个且仅一个层( l )应用内容损失,而不是多个层。
为什么我们要尽量减少内容损失
如上所述,卷积神经网络的更深层捕获更复杂的特征(或者本质上是内容),因此,如果我们需要生成的图像( g )具有与内容图像( c )相同的内容,那么我们将不得不最小化这两个图像的特征表示中的更深层之间的差异,或者换句话说,如果两个图像在更深层中具有非常相似的特征,这意味着两个图像中的内容是相同的。
风格丧失
获取样式损失的过程与我们在内容损失的计算中应用的策略类似,但是我们不使用中间层的原始输出,而是使用各个层的所生成的特征图的 gram 矩阵。然后,我们将损失应用于所有层,与内容损失相反,内容损失仅应用于单个层。
Gram 矩阵计算
Gram 矩阵或 Style 矩阵是一个简单的矩阵,它的第( i,j )个元素具有第 i 个和第 j 个特征图的逐元素乘法的输出,并在图像的宽度和高度上对其求和。
因此,总风格损失分两步计算:
首先,在给定层( l ),计算风格( s )的特征图表示的 gram 矩阵或风格矩阵与生成的图像( g )之间的均方误差,其表示该层的风格损失。
任何给定层的风格损失计算(l)
其次,样式损失被应用于 CNN 中的每一层。它与附加权重( wl )相乘,该权重是对总损失的计算有贡献的每一层的权重因子。
总风格损失计算
为什么我们要尽量减少风格损失
如上所述,在任何给定层( l ),风格损失通过从风格图像( s )和生成图像( g )的该层( l )中的特征映射获得的 Gram 矩阵或风格矩阵的相关性之间的差来计算。并且 Gram 矩阵 G( l )表示该层的特征图( l )之间的特定类型的相关性。其中 G l ( i,j )表示特征图 I 和 j 之间的相关性。因此,非常直观的是,如果我们最小化风格的特征表示( s )和生成的图像( g )之间的距离,则生成的图像将具有与风格图像相似的特征,因为生成的图像是唯一的可训练图像而不是风格图像,因此生成的图像开始获得风格图像的特征。由于样式损失应用于所有图层的要素地图制图表达,因此它将为生成的影像提供在初始图层中识别的样式影像的最小要素。
全损
总损失或最终损失可定义如下:
神经类型转移的最终损失
术语α【alpha】和β【beta】是超参数,可以根据用户偏好进行调整。任何超参数的值越大,与其相关的损失在生成的图像中的贡献就越大。例如,如果用户想要较少的样式图像对生成的图像的影响和更多的内容图像,则用户可以减小超参数【β】(β)并增大超参数α(α)。
优化损失
现在,在我们定义了最终损失函数之后,该过程的最后一步仍然是使用优化算法来最小化该损失。
优化损失的推荐方法是使用 L-BFGS 优化器。其他方法包括使用随机梯度下降或使用 Adam 优化器,但不建议这样做,因为数据不是随机的,即将数据集分成小的小批量是行不通的,因为输入是单个静态图像。此外,对于神经类型转移的任务,L-BFGS 优化器在学习上比 Adam 优化器更快。
结果
在历元的不同阶段输出图像
因此,以类似的方式,你可以尝试不同的风格和内容图像的组合,以创建各种艺术作品,Python 笔记本可在我的 GitHub 帐户上这里获得。
现在你可以继续发挥你的创造力,创作出这样的作品:
借助神经风格转移生成不同的艺术品。
参考:
基于 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 的论文: 使用卷积神经网络的图像风格转移 。
人工智能艺术:用神经风格转换将照片变成艺术品
你曾希望自己能像毕加索或梵高一样画画吗?
- 简介:机器之间的界限&艺术家变得模糊
- 虽然人工智能已被证明在复杂的计算和预测方面更胜一筹,但创造力似乎是机器无法接管的领域。
- 随着人工智能开始产生令人惊叹的视觉效果、深刻的诗歌和超凡的音乐,艺术的本质和人类创造力在未来的作用开始变得不确定。
- 令人惊讶的是,人工智能现在能够创作出具有美感的艺术作品。
请注意: 我保留本博客使用的所有媒体的权利——照片、动画、视频等。它们是我的作品(除了上面提到的 7 件作为风格图片的艺术家作品)。gif 文件可能需要一段时间加载,请耐心等待。在中型应用程序中,它不为我加载。如果是这种情况,请在浏览器中打开。
这是一些我用来从照片中生成数字艺术品的图像处理技术
2。颜色量化
- 减少图像中使用的不同颜色的数量,目的是使新图像在视觉上相似,大小压缩。
- 常见情况:将 24 位彩色图像转换为 8 位彩色图像。
- 使用 K 均值聚类对相似颜色的像素进行分组。
- 聚类的 K 个质心代表 3-D RGB 颜色空间&将替换聚类中所有点的颜色,得到具有 K 种颜色的图像。
3。超像素分割
- 将图像划分为超像素。超像素是一组具有相似颜色或灰度级的相连像素。
- 使用一种称为简单线性迭代聚类(SLIC)的无监督分割技术。使用 K-均值聚类分割图像。
- 它接受图像的所有像素值,并试图将它们分成预定义数量的子区域。
- 然后,每个超像素中的所有像素取该段中所有像素的*均颜色值。
4。神经类型转移
- 一种优化技术,将一幅图像的内容与另一幅图像的风格结合起来,有效地传递风格。
- 图像内容:物体结构,其具体布局&定位。
- 意象风格:色彩、肌理、笔触图案、画风技法。
- 能够产生手工难以产生的迷人结果。
- 如下所示,输出匹配内容图像的内容统计&样式图像的样式统计。这些统计数据是使用卷积神经网络从图像中提取的。
- 简而言之,生成的图像是相同的内容图像,但好像是梵高以其艺术作品“星夜”的风格绘制的。
4.1 项目概述
- 我已经在这个项目上工作了一个多月。我用模型超参数&一对内容图像和样式图像做了很多实验。
- 迄今为止,使用 63 幅内容图片和 40 幅风格图片(8 幅作品和 32 张照片)生成了 2500 多幅数字作品。
- 每个图像(800 像素宽)需要 7 分钟来生成(2000 次迭代)。我能够使用 6GB 的 GPU 生成高达 1200 像素宽的图像。
- 我还应用了基本的图像增强技术&色彩校正来制作视觉上有美感的艺术品。
4.2 风格转移:VGG-19 CNN 架构
- 风格转移是一项复杂的技术,需要一个强大的模型。
- 大到足以完成这项任务的模型可能需要很长时间来训练&为此需要非常大的数据集。
- 出于这个原因,我们导入一个已经在非常大的 ImageNet 数据库上训练过的预训练模型。
- 根据的 NST 原始论文,我们将使用 VGG-19 网络。
- 预先训练的 VGG-19 模型已经学会识别各种特征。
- 图 1 示出了输入图像(1200x800)的不同层的尺寸。
- 特征部分- 处理从图像中提取相关特征。
- 分类器部分- 处理图像分类(此处不需要)。
- 在我们的项目中,我们将只依赖模型的预训练特征部分,而不是从零开始构建我们自己的 CNN。
- 输入图层采用 3 通道彩色 RGB 图像,然后通过总共 16 个图层,因为 VGG-19 中剩余的 3 个图层是完全连接的分类图层。还有总共 5 个最大池层。
- 我们已经冻结了相关参数,这样它们在反向传播过程中不会更新。
4.3 成本函数
- 与深度学习中的常规神经网络算法不同,我们不是优化成本函数来获得一组参数值。
- 相反,我们优化一个成本函数来获得目标图像的像素值。
- 内容损失:内容图像&生成图像产生的某些卷积输出的均方误差。
- 风格损失:风格图像产生的 gram 矩阵的均方误差&生成的图像。
- 总损失:内容损失的加权相加&风格损失。
4.4 优化图像内容:
将目标图像的内容特征与内容图像的特征进行匹配。
4.4.1 特征图—过滤可视化
- 这里我展示了 Conv1_1 层的 64 个特征图中的 2 个。
- 图层中的每个特征地图检测图像的一些特征。
- 下面的特征图试图识别图像中的垂直边缘(更确切地说是左侧比右侧亮的边缘)。
- 下面的特征图识别水*边缘(更具体地,顶部区域比底部区域亮的边缘)。
4.4.2 浅层与深层
- 较浅的层检测边缘和简单纹理等低级特征。
- 更深的层检测高级特征,如复杂的纹理和形状。
- 随着我们越深入,特征地图的维度就越小。
- 以下 gif 显示了上述图层中的一些特征地图。
1200x800
600x400
300x200
4.4.3 选择用于内容提取的层
- CNN 的每一层都会忘记原始图像的具体细节&更多地关注特征(边缘、形状、纹理)。
- 取内容最重要的特征。我们没有填充的任何细节都可以用样式填充。这使得空间可以*衡内容和风格。
- 在神经网络的初期,我们总会得到更清晰的图像。
- 如果你在网络中间选择一个图层,我们将会得到视觉上最愉悦的结果——既不太浅也不太深。
- 这里选择 Conv4_2 层来捕捉最重要的特性。
4.4.4 含量损失
- 目标:生成与输入图像内容相似的图像。
- 内容丢失采用 CNN 的隐藏层激活(此处为 Conv4_2),并测量内容和生成图像的不同激活。
- 最大限度地减少内容损失确保两幅图像有相似的内容。
- 取内容图像(AC)和生成图像(AG)激活之间的*方差,然后*均所有这些*方差。
- content _ loss = mean(σᵢ(ag-AC))∀I = 1 到 512
4.5 优化图像风格:
- 内容特征按原样使用,因为 CNN 在提取输入图像的内容元素方面做得很好。
- 尽管 syle 特征需要一个额外的预处理步骤,但是使用 gram 矩阵进行更有效的风格特征提取。
- 通过将 gram 矩阵应用于所提取的特征,内容信息被消除,然而风格信息被保留。
4.5.1 样式权重
- 我们选择了 5 层从中提取特征。靠*开头的层通常在重新创建风格特征方面更有效,而后面的层为风格元素提供了额外的变化。
- 我们可以通过将某些权重参数与每个层相关联来选择将某些层优先于其他层。
- 我们将加重早期层的重量。
4.5.2 克矩阵—克(克)
- G(gram)度量同一层中特征图之间的相关性。
- 特征映射只是卷积层的激活后输出。
- Conv2_1 有 128 个滤波器,它将输出 128 个特征图。
- 直觉:假设我们有两个滤镜,一个检测蓝色物体&一个检测螺旋。将这些过滤器应用于输入图像将产生 2 个特征图&我们测量它们的相关性。
- 如果特征图高度相关,那么图像中出现的任何螺旋几乎肯定是蓝色的。
- 最小化样式和生成的图像的 gram 矩阵之间的差异导致在生成的图像中具有相似的纹理。
- 然后,所有的激活图被展开成像素值的 2D 矩阵。
- 展开版本中的每一行代表一个滤波器(或通道)的激活。
- g(克)是通过将展开的滤波器矩阵与其转置相乘来计算的,这产生了维度通道 x 通道的矩阵。
- g(克)与图像分辨率无关,即对于 Conv2_1 层,生成的图像和样式图像的克矩阵尺寸为 128x128。
- 因此,生成图像的分辨率(=内容图像的分辨率)和样式图像可能不同。
- 对角线元素测量滤波器 ii 有多活跃,例如,假设滤波器 ii 正在检测垂直纹理,那么 G(gram)ᵢᵢ测量垂直纹理在整个图像中有多常见。如果 G(gram)ᵢᵢ很大,这意味着图像有很多垂直纹理。
- 通过捕捉不同类型的特征 G(gram)ᵢᵢ的流行,以及有多少不同的特征一起出现 G(gram)ᵢⱼ,gram 矩阵 G(gram)测量图像的风格。
4.5.3 风格损失
- 目标:最小化样式图像的克矩阵之间的距离&生成图像的克矩阵。
- 将生成的图像和风格图像通过同一个预先训练的 VGG CNN。
- 取 CNN 的一些卷积的输出,计算它们的 gram 矩阵&然后计算每个选择层的均方误差。
- 在每次迭代中,我们创建一个输出图像,使得输出的 gram 矩阵和样式图像的 gram 矩阵之间的差异最小化。
4.6 优化内容&样式一起:
- 总损失是内容损失和总风格损失的线性组合。
- 总损失=α内容损失+β总损失
- α和β超参数控制内容和风格之间的相对权重。
- 通过 VGG19 模型运行内容映像并计算内容成本。
- 通过 VGG19 模型运行样式图像并计算样式成本。
- 使用 adam 优化器,学习率= 0.003
- 通过将模型和张量转移到 CUDA 来利用 GPU。
4.7 总结
- 我们有内容图像、风格图像&生成的(或目标)图像。
- 虽然样式转印纸从目标图像是随机的白噪声图像开始,但是我从目标图像是内容图像的克隆开始。
- 优化过程然后将尝试&保持目标图像的内容,同时在每次迭代中应用更多来自样式图像的样式。
- 我们将针对生成的图像优化总损耗。
- 内容丢失:我们将内容&生成的图像通过预先训练好的 CNN,如 VGG-19。我们取这两个输出之间的均方误差。
- 风格丢失:我们通过同一个 CNN 传递风格&生成的图像。我们抓取 5 个不同层的输出&计算克矩阵。
- 然后,我们取每一层的样式图像和生成图像的 gram 矩阵之间的均方误差。
- 取这些均方差的加权和。这让我们完全失去了风格。
- 总损失是内容损失和总风格损失的加权和。
- 利用反向传播,计算所有需要的梯度,以最小化相对于我们的目标图像参数的损失。
- 这就是优化器如何学习调整哪些像素&如何调整它们以最小化总损失。
- 用最小化总损失的反向传播更新生成的图像。
- 每次迭代更新权重&重复这个过程。
4.8.1 利用著名艺术品作为风格图像:
- 以从梵高到毕加索的任何艺术家的风格重画这幅画。
- 这里是我为这个博客选择的一些艺术作品。
文森特梵高:星夜
- 世界上最受认可和最宏伟的艺术品之一。
- 我在这里添加了一个运动效果,整个效果是空灵的&像做梦一样。
- 蓝色主导了这幅画,将群山融入天空。星星的黄色白色月亮在天空的映衬下显得格外突出。
- 天空:一笔一笔打着旋儿,卷着星星周围的云&月亮。
- 山丘&树木:弯曲&搭配天空柔和的漩涡。滚进下面的小村庄。
- 村庄:直线&锐角把它和画的其他部分分开。
我梦想画画,然后我画出我的梦想——文森特·梵高
今天的世界没有意义,我为什么要画有意义的画呢?—巴勃罗·毕加索
以下是结果,一些组合产生了令人震惊的艺术品。
4.8.2 使用照片作为风格图像:
这是一个新娘和涂鸦的图像,将它们结合起来会产生一个类似涂鸦的输出。
在这里,你可以看到建筑在背景中被弹出。
这种效果有点像这里的玻璃蚀刻技术。
旧木门的纹理创造了一幅古画的独特外观。
印度人居中心的天花板图案被转移到这里,创造出类似马赛克的效果。
spirograph 生成的设计应用于此处的内容图像。
冰块的纹理在这里非常好用。
好像涂鸦是画在砖墙上的。
马赛克天花板的样式用于生成输出。
4.9 迭代式可视化:
- 形象的风格和内容如何结合起来优化目标图像。
- 随着更多的迭代,图像在整个过程中逐渐变得更有风格&可视化是非常迷人的。
4.10 将一系列照片风格化以创建动画:
- 我能想到的一个应用是在动画行业,在现实世界中拍摄&根据所需的风格图像进行风格化。
- 在这里,我用 DSLR 的连续连拍模式捕捉图像。
4.11 使用风格转移将视频风格化
- 程式化的定时录像,我以 30 帧/秒的速度拍摄,持续时间为 30 秒。
- 然后,900 帧中的每一帧都与不同风格的图像一起通过风格转换算法,以创建独特的效果。
- 对于每一种风格,所有的帧在 720p 分辨率下渲染需要大约 18 个小时。
4.12 结果随内容权重的变化(α ) &样式权重(β):
- α与β的比率越低,风格转移得越多。
- 当α=1 & β=100 时,我得到了令人印象深刻的结果,这个博客中的所有结果都是针对这个比例的。
- 对于 2000 次迭代,下面是比率如何影响生成的图像-
- 这种变化在树木的笔触中更加明显。
4.13 两种风格图像的风格转换:
- 我已经扩展了算法来结合两种风格的图像。
- 下面显示的是用两种风格的图像生成的两个图像。
- 我喜欢第一张生成图像的纹理。然而,我希望它像第二个生成的图像一样更加丰富多彩。
- 因此,我没有使用单一风格的图片,而是使用了两种风格图片的组合&结果令人印象深刻。
- 修改后的总损失= 1 *内容损失+100 *样式 1 损失+45 *样式 2 损失
4.14 结论
完成一幅画需要几个小时或几天甚至更长时间&然而在深度学习的帮助下,我们可以使用照片在几分钟内生成一幅受某种风格启发的新的数字绘画。这让我们想知道未来的艺术家是计算机还是人类。
以一个值得商榷的问题结束博客:如果用人工智能来创造图像,最终的产品真的可以被认为是艺术吗?评论一下你对此的看法。
感谢您的阅读!
我希望你喜欢这个博客。如果你想了解我的文章,请跟我来。🙂
我的下一篇博客将是关于 Deep Dream,这是一种人工智能算法,它在有意过度处理的图像中产生梦一样的幻觉外观。
阅读我的其他博客:
一张图胜过千言万语。字面意思!这张图有 2200+字。😱
towardsdatascience.com](/creating-typography-using-word-cloud-in-python-9652bd62fa69) [## 使用 Spotify API 和 Python 中的 Seaborn 对音乐品味进行国别可视化分析
你知道哪个国家喜欢欢快的音乐,哪个国家喜欢喧闹的音乐吗?
towardsdatascience.com](/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)
本博客中使用的绘画作品归功于它们各自的艺术家。提及他们的官方网站:
在这里,你会看到。梵高的画,水彩画,*面作品,字母素描,以及梵高的…
www.vangoghgallery.com](https://www.vangoghgallery.com/) [## 李奥尼德·阿夫列莫夫在线画廊
李奥尼德·阿夫列莫夫是当代最杰出的艺术家之一,以其不同寻常的绘画方式和独特的艺术风格而闻名
afremov.com](https://afremov.com/) [## 瓦西里·康丁斯基- 610 艺术品,传记,书籍,引文,文章
9 月 05 日布拉德福德·麦考密克写道:“评论说:”我 8 岁的儿子画这样的艺术作品,当他真的…
www.wassilykandinsky.net](https://www.wassilykandinsky.net/) [## 爱德华蒙克-绘画,传记,爱德华蒙克的报价
爱德华·蒙克最著名的身份是出生于挪威的表现主义画家和印刷商。在 20 世纪后期,他…
www.edvardmunch.org](https://www.edvardmunch.org/) [## 巴勃罗·毕加索:毕加索 150 幅名画、传记及语录
就艺术和艺术运动而言,巴勃罗·毕加索可能是 20 世纪最重要的人物
www.pablopicasso.org](https://www.pablopicasso.org/) [## 李奥尼德·阿夫列莫夫在线画廊
李奥尼德·阿夫列莫夫是当代最杰出的艺术家之一,以其不同寻常的绘画方式和独特的艺术风格而闻名
afremov.com](https://afremov.com/) [## 葛饰北斋
点击这里探索关于葛饰北斋传记的完整信息,并从他杰出的…
www.katsushikahokusai.org](https://www.katsushikahokusai.org/) [## 约瑟夫·马洛德·威廉·透纳 1775-1851 |泰特
约瑟夫·马洛德·威廉·透纳(1775 年 4 月 23 日-1851 年 12 月 19 日),现在被称为威廉·特纳,是一个…
www.tate.org.uk](https://www.tate.org.uk/art/artists/joseph-mallord-william-turner-558)
参考文献:
[## 艺术风格的神经算法
在美术中,尤其是绘画,人类已经掌握了通过构图创造独特视觉体验的技巧…
arxiv.org](https://arxiv.org/abs/1508.06576) [## 卷积神经网络:特征映射和滤波器可视化
了解卷积神经网络如何理解图像。
towardsdatascience.com](/convolutional-neural-network-feature-map-and-filter-visualization-f75012a5a49c) [## 用于艺术风格转换的卷积神经网络
现在有一个很棒的应用程序叫做 Prisma,它可以把你的照片转换成艺术作品,使用…
harishnarayanan.org](https://harishnarayanan.org/writing/artistic-style-transfer/) [## 基于 VGG 模型的神经风格迁移
一种采用不同图像风格的数字图像变换技术
towardsdatascience.com](/neural-style-transfer-using-vgg-model-ff0f9757aafc) [## 13.12.神经类型转移-深入研究深度学习 0.14.3 文档
如果你使用社交分享应用程序,或者碰巧是一名业余摄影师,你对滤镜很熟悉。过滤器可以…
d2l.ai](https://d2l.ai/chapter_computer-vision/neural-style.html) [## AI 对于艺术和艺术家意味着什么?宽墙
到目前为止,人工智能系统已经成功地完成了许多以前由人类完成的任务,每一个新的…
www.widewalls.ch](https://www.widewalls.ch/magazine/ai-art-artificial-intelligence-artists) [## 人工智能模糊了艺术家的定义
随着人工智能(AI)融入我们日常生活的更多方面,从写作到驾驶…
www.americanscientist.org](https://www.americanscientist.org/article/ai-is-blurring-the-definition-of-artist#:~:text=To create AI art%2C artists,the aesthetics it has learned.)
利用独立分量分析进行伪影校正
用神经科学的例子来说明
时间序列数据往往被不需要的信号假象所污染,这些假象有可能严重扭曲任何进一步的分析。独立分量分析(ICA)是解决这个问题的有效方法。这里,我将简要介绍 ICA,然后演示如何实现它来消除信号伪像。在整篇文章中,我将使用通过脑电图(EEG)获得的时间序列数据,EEG 是一种来自神经科学的技术,用于测量大脑大脑皮层的电活动。
注意:我在这里只展示关键的代码片段。用 Python 3 写的完整代码可以在我的 GitHub 上以 Jupyter 笔记本的形式找到。
国际通信机构(International Communications Agency)
ICA 是一种信号处理方法,能够将多变量信号分离成它的附加子分量或源。它基于这样的假设,即来源在统计上是独立的,并且每个来源中的值是非高斯分布的基础[1]。源分离的一个经典例子是鸡尾酒会问题,一个房间里的多个人同时说话,他们的声音被位于不同空间位置的麦克风记录下来。然后可以应用 ICA 将混合源数据分离成代表最大时间独立信号的各种信息源。换句话说,房间里每个人的声音都可以以相当高的准确度还原出来,如下图所示。
简化的鸡尾酒会问题。来源:Tharwat,A. (2018) [2]。
脑电图的应用
脑电图及其假象
在 EEG 的情况下,ICA 可以识别包括诸如眨眼或眼球运动等伪影的成分。然后,在数据从源空间(ICA 计算的单个源)转换回传感器空间(原始 EEG 数据)之前,可以移除这些分量。这些传感器或电极的位置图示如下。
头皮上的标准 10–20 电极位置(俯视图)。
通过检查时间序列数据,通常可以相当容易地检测到眨眼和眼球运动。它们尤其被位于眼睛正上方或靠*眼睛的前部通道接收到。每种方法的示例如下所示。
正面通道中眨眼的图示(F & Fp)。来源:https://imotions.com/blog/eeg/
额叶通道的眼球运动图解(F & Fp)。来源:https://imotions.com/blog/eeg/
使用 FastICA 纠正伪影
科学界一直在使用各种 ICA 算法,如 Infomax、JADE 和 FastICA [3,4],后者可以说是最流行的一种。另外, scikit-learn 在其分解模块中提供了 FastICA 算法,这进一步促使我在这次演示中使用它。
这里使用的数据是从大约 8 分钟的静息状态 EEG 会话中获取的。在我们开始之前,让我们看一下脑电图的时间序列。
描述所有 63 个通道的 EEG 时间序列数据的 2000 样本切片。
这里的采样率是 500 Hz,所以上图显示了 4 秒钟的数据。在样本 1250 和 1500 之间可以看到眨眼。眨眼通常在通道 Fp1 和 Fp2 中最明显,因此我们分别绘制它们。
通道 Fp1 和 Fp2 中眨眼的描述。
观察 Fp1,在眨眼开始之前可以检测到轻微的箱形。这代表水*的眼球运动,理想情况下也应该去除。现在,让我们运行 scikit-learn 的 FastICA 并绘制所有 63 个 ICA 组件,看看我们是否可以识别任何伪像的来源。
## Computing ICA componentsfrom sklearn.decomposition import FastICAica = FastICA(n_components=63, random_state=0, tol=0.05)
comps = ica.fit_transform(eeg)# eeg --> raw data, shape: (224930, 63)
# comps --> ICA components, shape: (224930, 63)
ICA 组件。
为了简单起见,我只绘制了 400 个样本的组成部分,从 1200 到 1600,希望能发现 Fp1 和 Fp2 中可见的眨眼。在仔细检查时,看起来好像分量 29 包含水*眼睛运动,而分量 42 包含眨眼伪影。为了证实这一点,我查看了更长的数据切片(此处未显示),发现这些分量中的伪像实际上与各种前额通道中的眨眼和眼球运动伪像同时出现。
注意: ICA 根据统计测量将信号分成子分量,这意味着没有特定的分量顺序。如果你不指定random_state
,你会发现包含工件的组件可以不同。
现在,让我们移除组件 29 和 42,并使用逆变换将源数据转换回原始传感器空间。
## Set artefact components to zero before inverse transformcomps[:,[29,42]] = 0
restored = ica.inverse_transform(comps)
Fp1 和 Fp2 的原始和 ICA 校正信号。
成功了!恢复的信号(Fp1_post 和 Fp2_post,深色)不再包含原始信号(Fp1_pre 和 Fp2_pre,浅色)中存在的眨眼和眼球运动伪影。
注意: ICA 已经被证明对诸如眨眼和眼球运动之类的刻板假象非常有效。然而,在各种空间位置产生噪声的非定型假象,即当受试者抓头时,会破坏 ICA 的工作,应谨慎对待。
参考
[1]hyv rinen,a .,2016 年。独立成分分析:最新进展。菲洛斯译数学物理科学。 371 (1984):20110534。[ 考研 ]
[2]塔尔瓦特,a .,2018 年。独立成分分析:导论。应用计算。通知。https://doi.org/10.1016/j.aci.2018.08.006[PDF
[3]海弗里宁,1999 年。用于独立成分分析的快速且鲁棒的定点算法。 IEEE 神经网络汇刊。10(3):626–634。[ PDF
[4]hyv rinen,a;Oja,e .,2000 年。独立成分分析:算法与应用。神经网络。13(4–5):411–430。[ PDF
有助于您了解 GPT-3 的文章
意见
增强你对最新炒作的人工智能模型:GPT 3 的了解
我通常会张贴本周在 Medium 上遇到的与人工智能和机器学习主题相关的有趣文章。
但是最*,很难逃脱围绕 GPT-3 的炒作和兴趣。
因此,本周我已经确定了几篇文章,它们将带你从零开始了解 GPT 3 号,成为有点像英雄的人物。
本文将为您提供一些知识,以了解 GPT-3 的基本背景,以及其直观的应用和潜在的威胁。
对于那些有点赶时间的人来说,可以随意只阅读' 【短评' 对所提交文章的总结和回顾。
而那些时间稍微多一点的人可以深入研究一下“ ”详细回顾一下“ 的总结来了解我对所提到文章的想法和看法。
您会发现一些文章:
- 这就解释了 GPT 在 3 分钟内 3 投 3 中的原因
- 或者,解释一下为什么 GPT-3 被过度宣传,也是在 3 分钟内
- 深入了解 GPT-3
- 质疑编码角色的寿命,因为 GPT-3 的潜力。
包含文章的封面图像
GPT-3:第一个人工通用智能?朱利安·劳蕾特
一站式获取有关 GPT-3 的历史、发展和潜力的信息。
简短评论
Julien Lauret 的文章全面总结了迄今为止创造 GPT 3 号的历程。
Julien 已经成功地将多年来对建模语言和解决自然语言处理的方法和技术的开发和介绍总结为几个小而简洁的段落。
除了向读者提供 GPT-3 的背景资料,朱利安还用外交辞令回答了 GPT-3 是否是 AGI 的问题。他的回答真实地反映了问题本身的性质,因为无论是谁提出这个问题,这个问题都要服从于智力的定义。
详细审查
朱利安关于 GPT-3 的最新文章是一篇非常需要的文章,因为我觉得人工通用智能(AGI)的话题在我们的想象中几乎已经退居二线了。
朱利安在文章的开头指出了关于 AGI 的两种观点。一种观点暗示 AGI 还有几十年的时间;另一个问题是人类是否有可能到达 AGI。
Julien 的文章中充斥着一些技术和专业术语,但每个术语都附有简短的定义,在某些情况下还有广泛的背景知识。
诸如“深度神经网络”、“机器翻译”、“Word2vec”和“少量学习”等术语的呈现和定义方式为读者提供了语言建模和 NLP 的速成课程,以及有关 GPT-3 的主要信息。
这篇文章直到文章中途才提到 GPT-3,这是因为 Julien 巧妙地带领读者经历了一次概述对语言建模和 GPT-3 本身的进步做出贡献的关键发展和研究的旅程。
关于 GPT-3 和它的前身的内在特征(重量数)的信息被提供给读者,以使读者了解 GPT 模型在每个发布版本中所取得的进步水*。
本文的后半部分展示了早期 access API 用户开发的 GPT-3 的直观应用程序示例。
但更重要的是,朱利安回答了文章题目中提出的问题。朱利安对 GPT-3 是否是 AGI 的结论是,它不是。但更重要的是,问题本身的答案并不像人们想象的那样清晰。
这种不明确性源于这样一个事实,即智力的定义是模糊的,取决于个人的解释。
朱利安指出,讨论 GPT-3 的应用是一个重要的问题。我们已经看到了它生成诗歌、游戏场景和通过语言定义的 web 组件的能力。
我们现在需要观察的是,人工智能的最新成就如何应用于涉及视频和图像的更广泛的环境中。
朱利安的文章有趣地包含了一些哲学观点和陈述。例如,朱利安指出,我们无法确定 GPT-3 拥有的智力水*,就像我们无法确定一个瘫痪的人或身体有缺陷的人的认知功能水*一样。
这篇文章深入探讨了值得思考的人工智能领域。
这篇文章非常适合:
机器学习从业者:使用的语言和技术术语,任何参与机器学习的人都非常熟悉。所包括的定义和论文允许进一步探讨与 GPT-3 有关的主题
当历史学家回顾过去时,他们会选择 2020 年作为发明 AGI 的一年吗?
towardsdatascience.com](/gpt-3-the-first-artificial-general-intelligence-b8d9b38557a1)
GPT-3 由戴尔·马科维茨在不到 3 分钟的时间内解释
关于 GPT 3 号的简短信息
简短评论
对于那些时间不多并且想了解 GPT 3 号的信息的人来说,戴尔·马科维茨的文章是一个完美的停留。有了良好的结构和介绍的段落,你就能得到 GPT-3 关键性能的重要信息。本文还包括一些基于 GPT-3 的应用程序示例。
详细审查
戴尔的文章可以被描述为包含 GPT 3 号重要细节的有用信息的快速拍摄。
戴尔在文章中探讨了 GPT-3 语言模型的一般构成,但没有大量的技术术语和细节。
本文首先通过一系列嵌入式 twitter 帖子展示了一些基于 GPT 3 的应用程序。
戴尔的文章为 GPT-3 相关的通用技术思想的定义提供了信息,这就是“语言模型”。
对“语言模型”的描述附有一个甚至五岁孩子都能理解的例子。
更重要的是,戴尔的文章包括了 GPT-3 的重要性质,以便进行进一步的探索。这篇文章提到了 GPT-3 基于变压器的架构,以及 GPT-3 和它的前身中的一些参数。
文章最后陈述了 GPT-3 号与其同类产品不同的主要原因,主要是 GPT-3 号可普遍应用于各种任务,无需微调。
这篇文章非常适合阅读:
普通观众:这篇文章使用的语言并不太专业。所提供的信息结构合理,格式清晰,便于理解新 GPT 协议的主要特点和优势。不需要主要的技术背景。
快速了解 OpenAI 的 GPT-3 模型如何在引擎盖下工作。
towardsdatascience.com](/gpt-3-explained-in-under-2-minutes-9c977ccb172f)
最新的 AI 会杀死编码吗?由弗雷德里克·巴斯勒
Web 程序员会想要阅读这篇文章
简短评论
弗雷德里克·布斯勒(Frederik Bussler)写了一篇文章,重新点燃了科技行业几年来一直存在的一个问题。
弗雷德里克介绍了不同版本的 GPT 的简要背景,以及基于观点的推理,解释了为什么编码工作角色可能迟早会面临人工智能的末日。
详细审查
弗雷德里克在他的最新文章中向读者指出了人工智能进步的速度有多快。他引用了研究人员在 2017 年提出的一个问题,该问题提出了“到 2040 年,人工智能能写出大多数代码吗?”。毫无疑问,在 2020 年,我们将开始看到这个问题的答案。
像大多数其他描述 GPT-3 的文章一样,弗雷德里克提到了 GPT-3 语言模型的关键特征,即由于其非常健壮的神经网络参数,它能够推广到特定领域的任务。正如弗雷德里克所指出的,这就是为什么 GPT-3 可以用几乎任何编程语言编码。
弗雷德里克脱离了文章试图解决的主要问题,为读者提供了 GPT 语言模型变体的详细描述。
这篇文章回到了主题,有一个部分叫做“进化或死亡”,这是一个大多数行业都可能会经历的信念,但是程序员比其他人更快。
弗雷德里克为读者提供了进一步的信息——那些可能对弗雷德里克的说法持怀疑态度的人——随着 Squarespace、Wix、GoDaddy 等*台的引入,无代码运动已经全面展开,这些*台通常是所见即所得的网站生成*台。
为了支持无代码*台出现的趋势,Frederik 包括 AutoML 和一家公司的链接,该公司能够创建没有编码技能的人工智能模型。
我得到的印象是,Frederik 非常确信,在不久的将来,编码或程序员的角色是人工智能的公*游戏。
阅读这篇基于观点的文章,找到可以重申你对几个行业内人工智能大灾难的担忧的论点。
这篇文章是以下人士的必读之作:
程序员:尽管人工智能和自动化将在未来大量减少工作岗位,但程序员和编码员仍将是必需的,这让我一直感到欣慰。GPT-3 的出现和潜力似乎引发了一些担忧,我们或许应该给予更多的关注。
人工智能现在可以用任何语言编码,无需额外训练。
towardsdatascience.com](/will-gpt-3-kill-coding-630e4518c04d)
一个 3 分钟的解释为什么 GPT-3 被阿尤什·夏尔马夸大了
不是每个人都买 GPT-3 卖的东西
简短版本
赞美 GPT 3 号的文章不在少数,但阿尤什的文章试图将我们带回现实。这篇直言不讳的文章很短,让读者相信 GPT-3 只不过是一个被主流媒体夸大的人工智能工具。
详细版本
Ayush Sharma 这篇文章旨在让那些持有 GPT-3 是备受期待的人工通用智能(AGI)的到来这一概念的技术人员。
我特别喜欢他所用的比喻,他描述了科技领域一些人所信奉的概念与穴居人通过发现火而解决了核聚变的相似性。
阿尤什似乎没有被 GPT 3 中闪亮的新玩具所迷惑。这篇文章提醒我们,我们目前看到的炒作和关注是主流媒体采用的一种熟悉的行为周期,以高估 AI advanced 的潜力,所有这些都是为了出售故事。
将 GPT-3 描述为“美化的 10 美元以上自动完成软件”是相当苛刻的。在这篇文章中,Ayush 直截了当地陈述了为什么 GPT-3 不是 AGI 的原因。
文章进一步列举了 GPT-3 协议的不足之处。
这篇文章的结论包括一条来自 Open AI 首席执行官 Sam Altman 的嵌入式推文,他在其中表示,围绕 GPT-3 的炒作是没有道理的,尽管它可能令人印象深刻,但仍有很长的路要走。
这篇文章非常适合阅读:
每个人:人们很容易迷失在互联网上展示的人工智能的潜力中。因此,有一个相当像批评家的视角总是健康的,这样才能管理公众的期望,防止未来的失望。
[## 一个 3 分钟的解释为什么 GPT-3 被过分夸大。
是的,GPT 3 号令人印象深刻。不,它与人工通用智能(AGI)相去甚远。
medium.com](https://medium.com/@ayushsharma_mit/a-3-minute-explainer-on-why-gpt-3-is-overhyped-7f134d10c8ce)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 即将发布的视频内容 这里
- 跟着我上 中
- 通过 LinkedIn 联系我
人造大脑?具有神经元特性的新材料可能是答案
创造一台像我们一样思考的机器的关键可能最*已经揭晓
由于传统硅基技术的物理限制,预测到 2040 年,我们的全球能源供应将不再能够满足我们的计算需求。因此,迫切需要开发能够更快处理数据的新系统,最重要的是,以更节能的方式处理数据。
科学家们早就知道,实现这一目标的一种方法是创造一种模仿人脑的技术,人脑是我们所知的最强大的机器。在硅计算中,不同的功能由不同的物理实体执行,这减慢了处理时间并导致大量的热浪费。相比之下,我们大脑中的神经元能够通过一个巨大的网络同时发送和接收信息,其电压比我们最先进的计算机低 10 倍。
我们的大脑相对于硅大脑的主要优势是并行处理能力。我们的每一个神经元都与成千上万的其他神经元相连,它们都可以作为信息的输入和输出。在硅计算中,晶体管元件只能有三种连接方式。为了创造一个像我们一样存储和处理信息的人造大脑机器,关键是找到可以像我们的神经元一样在绝缘和传导电流之间无缝波动的物理材料。
上月发表在细胞杂志上的一项研究发现了一种具有这种特性的材料。德克萨斯 A & M 大学的研究人员创造了β'-CuₓV₂O₅纳米线,它展示了响应温度、电压和电流变化,在导电状态之间振荡的能力。
通过进一步的研究,他们发现这种能力源于铜离子在β'-CuₓV₂O₅的运动,这种运动迫使电子移动,从而改变了材料的导电性能。通过操纵β'-CuₓV₂O₅的这一方面,可以根据命令产生电尖峰,这与我们的神经元之间发送信号时产生的电尖峰非常相似。
像这样的小电事件可以用来在材料的电路中存储信息。我们的大脑通过在关键时刻以独特的顺序激活特定的神经元来发挥作用。一个特定的神经元事件序列会导致信息的处理,无论是回忆记忆还是执行身体动作。β'-CuₓV₂O₅的一个环会以同样的方式行动。
这是一个巨大的突破,它创造了一个可以模仿我们大脑工作方式的电路网络。这一研究领域被称为神经形态工程,主要目的是开发能够复制我们大脑的能力和结构的技术,以匹配其处理效率和能力的水*。
“这项工作的重要性在于表明化学家可以合理地设计和创造出具有显著改善的神经形态特性的电活性材料。随着我们了解的越来越多,我们的材料将会得到显著改善,从而为我们计算能力的持续技术进步提供一条新的途径。”R. Stanley Williams,得克萨斯州 A&M 电气和计算机工程师
该团队希望这将是创造像我们一样思考和理解的机器的第一步。随着机器学习和神经网络技术每天都在进步,看到这项技术如何与深度学习算法相结合,以比我们目前使用标准计算机更有效地存储和处理信息,将是令人着迷的。
人工智能——建模中苦乐参半的交响乐
每个模型都是错的,但有些模型是有用的
在过去的几十年里,我们已经看到了人工智能(AI)的巨大进步。然而,这一进展并不是稳步实现的。一路上经历了重大的起伏。在其中一些阶段,人们甚至害怕公开承认人工智能这个术语,因为这个领域的声誉受到了严重损害。在那个时候,任何从事人工智能的人都被认为是梦想家。这也导致了该领域的不同名称和细分,被称为机器学习、数据挖掘或模式识别。
图 1:人工智能炒作周期、摩尔定律和数字数据量不断增长的对比。
理查德·萨顿在最*的一篇博客文章中指出,计算能力的缺乏被认为是迄今为止遭遇起伏的一个重要原因。在他的透彻分析中,观察到一般模型总是胜过那些主要由专家知识驱动的模型。随着计算能力的提高,通用模型能够超越手工制作的、基于专家知识的方法。然而,当通用模型在计算上变得过于昂贵时,摩尔定律就出现了,使用通用方法的进一步发展变得不可能。图 1 示意性地展示了这一发展。基于这种分析,得出的结论是,专家知识的结合是一种资源浪费,因为人们只需要等到有足够的计算能力来解决机器智能的下一个里程碑。这个结论相当激进,值得再分析一下。因此,我们将有一个简短的历史观点,这实际上是最*在 KDnuggets 上发表的三篇文章的简短总结。
感知器的灵感来自左边显示的生物神经元。所得的计算神经元计算其输入的加权和,然后由激活函数 h(x)处理,以确定输出值。这样做,我们能够模拟线性决策边界,因为加权和可以被解释为到决策边界的有符号距离,而激活确定实际的类成员。在右侧,示出了不能由单个线性分类器解决的 XOR 问题。它通常需要弯曲的边界或多条线。图片:来源
第一次人工智能炒作开始于 20 世纪 50 年代,并导致了该领域的重要发展。明斯基开发了第一台被称为随机神经类比强化计算机(SNARC)的神经网络机器,该机器受生物设计的启发,将神经元映射为一台电机。更重要的发展是感知器,它使得受生物启发的神经元可以在计算机程序中训练。那个时代的另一个重要发展是基于规则的语法模型的发明,它被用来解决第一个简单的自然语言处理任务。同样,图灵测试的概念也属于人工智能的这个时期。随着这些巨大的发展,对人工智能的高期望逐渐越来越快。然而,这些概念不能满足他们的期望,在许多日常生活应用中失败了。这些怀疑进一步得到理论观察的支持,例如,感知器不能学习逻辑异或函数,因为它不是线性可分的。结果,人工智能的资金被大幅削减,这也被称为今天的人工智能冬天。
使用层导数的反向传播的图形概述。在正向传递期间,网络被评估一次,并使用损失函数与期望输出进行比较。反向传播算法沿着不同的路径通过层图,以便有效地计算矩阵导数。图片:来源
在 80 年代,人工智能的魅力又回来了。第二次繁荣是由更重要技术的发展促成的,如使多层感知器可训练的反向传播算法,以及具有单个隐藏层的神经网络已经是通用函数逼*器的理论观察。循环网络被开发出来,强化学习也使得博弈论变得可训练。当时的另一个突破是统计语言模型的发展,逐渐开始取代基于规则的系统。甚至深度和卷积网络在那时已经被探索。然而,不断增长的计算需求——由数值不稳定性支持——导致了长时间的训练。与此同时,出现了其他基于模型、不太复杂的技术,如支持向量机和集成,这些技术逐渐降低了神经网络的重要性,因为可以在更短的时间内获得相同或更好的结果。特别是凸优化和变分方法成为重要的概念,有效地结束了这第二次人工智能炒作。当时,神经网络被认为是低效和数值不稳定的。许多研究人员不再在这个方向投入时间,因为其他方法更有效,可以更有效地处理数据。
深度学习擅长检测和分割等感知任务。在这里,我们强调一些医疗应用:左手边显示的是基于人工智能体的地标检测和 X 射线变换不变地标检测(投影图像由 Unberath 博士提供)。右侧显示了基于 U 形网的支架分割。图片:来源
第三个炒作期,我们目前正在经历的这个时期再次受到许多重要突破的推动。我们已经看到计算机打败了世界级的围棋选手,创造了艺术,并解决了以前几乎不可能完成的任务,如图像字幕。在这个时期,一个主要的重复出现的主题是不再需要手工制作和特征工程,深度学习算法解决了所有开箱即用的问题。事实上,已经发现了一些重要的概念,这些概念能够概括许多最先进的方法。深度卷积网络已经取代了 SIFT 和小波理论等多尺度方法。此外,可训练的卷积神经网络已经证明在语音处理中胜过所谓的梅尔频率倒谱系数(MFCCs ),其中这些特征已经主导该领域* 50 年。看来过去发展起来的许多理论已经过时了。然而,人们必须记住,深层网络设计实际上经常受到经典特征提取模型的启发,并且图像处理特征与小波变换有明显的相似性,并且音频处理网络仍然形成隐式滤波器组。同样,知识仍然存在,但是它以不同的形式编码。人们仍然不得不承认,以前算法的可训练版本明显优于它们的前辈。
我们目前的分析缺少第三个组成部分,这是今天人工智能成功的另一个驱动因素:用于训练机器学习算法的数字数据的可用性(参见图 1)。在最*的一篇文章中,Helbing 和他的同事观察到数据每 12 个月翻一番,而即使是 GPU 的处理能力也只在 18 个月内翻一番。因此,我们很快将不再能够像今天这样详尽地处理数据。我们要么选择只处理有限数量的数据,要么必须限制我们用来处理它们的方法的复杂性。因此,基于模型的方法可能很快会再次占据主导地位,我们可能会经历另一个时期,在这个时期,非通用和专用模型将推动研究。
这种研究似乎是徒劳的,因为它可能会在某个时候被更普遍的方法所取代。然而,我们必须记住模型的另一个重要优势:它们可以被理解和相应地操作。以一个物理公式为例,它可以求解一个或另一个变量。我们可以对所有模型执行此操作,并使用它们的属性来重新安排它们的用途。这是我们目前的深度学习模型无法做到的。他们必须从头开始接受培训,而且他们的重用能力有限。因为这样的模型也有很多目前深度学习无法做到的。
时间像箭一样飞逝。AI 的未来会给我们带来什么?图片: Pixabay / Pexels
对于遥远的未来,我们已经可以推测,这种知识驱动的人工智能将在未来几年被真正的通用人工智能所取代,正如萨顿预测的那样,通用人工智能能够自己创建、维护和重用这种模型。然而,在这篇文章的作者看来,将领域知识与深度学习相结合的方法并不是徒劳的,因为下一级的推广将通过从模型驱动的人工智能中吸取的经验教训来实现,而这些经验教训仍将到来。在开发模型驱动的人工智能时,我们将了解如何构建良好的可训练模型人工智能解决方案,并最终创建自动化方法来实现相同的目标。
当然,很难做出预测,尤其是对未来的预测。无论哪种方式,无论是一般的无模型方法还是模型驱动的科学,我们都期待着机器学习、模式识别和数据挖掘的激动人心的未来!
这篇博文最早出现在 http://www.marktechpost.com 的网站上。如果你喜欢这篇博文,我推荐你阅读 MarkTechPost.com 上的其他帖子,或者看看我们免费的深度学习资源。
本文的文本和图像根据知识共享许可 4.0 署名进行许可。请随意重用和分享这项工作的任何部分。
人工智能——欧洲的方法
马库斯·斯皮斯克在 Unsplash 上的照片
欧盟委员会目前正在探索需要什么样的措施和立法来实现人工智能的全部潜力,同时保护欧盟公民。在这种情况下,一份白皮书的初步版本已经泄露。尽管它还不是一份官方出版物,但它已经很好地显示了欧洲目前在人工智能问题上的考虑。
以下是草案摘要(截至 21。2020 年 1 月)。你可以在这里下载的完整论文。
对价值观、法治和构建安全可靠的复杂系统的能力的强烈依赖是帮助实现值得信赖的人工智能的一些基础。
章节有
1。前言
2。简介
3。利用工业和专业市场的优势
4。抓住未来的机遇:下一次数据浪潮
5。卓越的生态系统。信任的生态系统:人工智能的监管框架。结论
1。人工智能正在快速发展,并将对我们的生活产生重要而积极的影响,但也可能存在风险。
对欧盟委员会来说,三个领域非常重要:推动科学突破,保持欧盟的技术领先地位,以及确保新技术为欧洲人服务。
重要的是欧罗巴作为一个整体行动,并定义自己的方式。
该方法基于监管和投资。
2。简介 对价值观、法治的强烈依恋,以及构建安全可靠的复杂系统的能力,是帮助实现值得信赖的人工智能的一些基础。
日期将越来越成为经济增长的原因。尤其是来自商业和工业的数据——欧洲在这两个领域都处于强势地位。
自由、人类尊严和隐私保护的价值观必须成为欧洲人工智能的基础。监管应该是欧洲的,以避免单一市场的分裂和公民的不确定性。
白皮书的两个主要部分是,第一,从研究和创新开始,沿着整个价值链的“卓越生态系统”。第二个是“信任生态系统”,这样公民可以对人工智能的使用充满信心,而公司则了解法律法规。
此外,补充“欧洲数据战略”旨在确保欧罗巴成为“世界上最具吸引力、最安全和最具活力的数据中心”。
3。利用工业和专业市场的优势 欧洲有很大的优势从人工智能的发展中受益:卓越的研究,在许多重要领域的市场领导地位(机器人,竞争性制造,汽车,医疗保健)。此外,欧洲拥有大量未被充分利用的数据。
因此,欧洲应该建立自己的优势,并在价值链中加以利用。
事实证明,欧盟资助计划是协调投资的一种成功方式。自上一时期以来,欧盟对研究和创新的资助增加了 70%,达到 15 亿欧元。不过,与其他地区相比,这只是一小部分。欧洲需要增加和最大化投资。
4。抓住未来的机遇:下一波数据浪潮 欧洲在消费者和在线服务领域的弱势地位是基于数据访问方面的竞争劣势。到 2025 年,*台将失去其在数据仓库中的主导地位,大部分数据将位于本地边缘设备上,例如工厂或医院。
欧洲应该扩大人工智能专用 CPU 的领域。像欧洲处理器倡议这样的项目可以帮助做到这一点。Europa 已经在神经形态工程领域处于领先地位,并在量子计算领域占据强势地位。
欧洲将继续引领人工智能算法基础的进步,并将机器学习、深度学习和符号推理等领域的专业知识与深度神经网络相结合。
5。卓越的生态系统
A .与成员国合作
为了进一步最大限度地扩大研究、创新和部署投资的影响,将向成员国提议修订人工智能协调计划,以便在 2020 年底前通过(行动 1)。
B .联合并集中研究和创新群体的努力
为了达到高水*,欧洲必须巩固其卓越中心。必须创造协同和集中。这也包括留住和吸引最好的研究人员。欧洲需要一个特别引人注目的最高水*的人工智能研究中心,以吸引投资和人才。
这个人工智能研究中心应该专注于欧洲能够取得世界领先地位的领域(例如:工业、卫生、交通、农业食品链、能源/环境、地球观测或太空)。
同样重要的是提供测试和基准站点。这方面的法律框架将于 2020 年第二季度创建(创建“欧盟卓越”标签/品牌)(行动 2)。
C .关注中小企业
重要的是,中小企业既要使用人工智能,又要有获取人工智能的途径。为此,应进一步加强数字创新中心和人工智能按需*台。
根据" InvestEU "方案,将进一步扩大对中小企业和初创企业的投资。
与成员国合作,确保每个成员国至少有一个数字创新中心。为此,计划投入 9 亿欧元。在 Q1 2020 年,1 亿欧元的资金将用于人工智能创新。从 2021 年起,InvestEU 将把这一数额至少增加十倍(行动 3)。
D .与私营部门的伙伴关系
重要的是,私营部门充分参与制定研究和创新议程,并提供必要的共同投资。为此,有必要发展公私合作伙伴关系,并获得公司管理层的批准。
欧盟委员会正在为人工智能和机器人技术建立一个新的公私合作伙伴关系(行动 4)。
E .促进人工智能的采用
公共管理使用 AI 技术是必要的。这里的重点是医疗保健和交通。为此,将在具体部门讨论的帮助下,在 2020 年年中之前制定一项行动计划(行动 5)。
F .保护对数据和计算基础设施的访问
改善数据的获取和管理是一个关键问题。同样重要的是对计算机技术和基础设施的投资。
将拨款 40 亿欧元支持高性能计算机、量子计算机以及人工智能和数据基础设施。
G .技能
欧洲的方法还必须特别关注技能领域。虽然教育政策是成员国的责任,但委员会可以协调最佳做法的交流。
促进人工智能相关能力将是修订后的“人工智能协调计划”和“数字教育行动计划”的优先事项。
欧洲卓越中心以及由此带来的人才增长也将对整个欧洲的技能转移产生积极影响。
数字欧洲方案旨在吸引最优秀的教授和研究人员,并提供人工智能领域的世界领先的硕士学位(行动 7)。
H .国际方面
欧盟的工作已经影响了国际话语(伦理原则)。
欧盟将继续与全球人工智能参与者合作。这是基于欧盟的利益(执行欧洲标准,获取关键资源,如数据,公*的竞争环境)。合作必须旨在促进基本权利。
6。信任的生态系统:人工智能的监管框架
信任是确保人工智能日益普及的重要因素。
为此,编写了关于可信 AI 的指南,其中描述了七个基本要求。根据公司的反馈,透明度和人力监督很重要,但立法者尚未具体要求。
一个有约束力的监管框架可以帮助增加消费者和企业对人工智能的信心,从而促进其使用。该框架受到高级别专家组要求的启发。
人工智能开发商和提供商已经受到欧洲立法的约束。然而,大赦国际的具体性质可能会使这一立法难以适用和执行。因此,必须审查现有立法,以确定它是否已经足够。
为了确保欧盟内部市场的*稳运行,欧盟层面的强有力框架优于国家立法。
6A。问题定义
该框架的重点应该是将风险降至最低。这些风险可能是实质性的(安全、健康、财产损失等)。)和非物质的(失去隐私、限制言论自由、人的尊严、歧视等)。).
人工智能作为“黑匣子”的问题可能会给法律的应用和执行带来困难。
主要风险是数据安全以及对基本权利和安全的威胁。
6A i .基本权利的风险,包括隐私、数据保护和歧视
使用人工智能可能导致侵犯基本权利。要么是因为错误的开发,要么是因为数据的偏差。
这是一个问题,因为公民将越来越多地接触到人工智能的决定。
虽然人类的决策存在偏差,但 AI 没有社会控制机制。
6A 二世。安全风险和责任体系的有效运行
人工智能会产生新的安全风险。例如通过车辆中的错误图像识别。
如果没有明确的安全法规,这可能会导致公司的法律不确定性,当局也无法干预。这将削弱整体安全性,并使责任问题复杂化。
人工智能的特性使得追溯系统决策变得困难。这目前可能导致证据不足。因此,可能无法据此要求赔偿,也无法追查侵犯基本权利的行为。
B .现有的欧盟人工智能立法框架
关于安全和责任问题的全面法律框架(国家和欧盟级别)已经到位,并可能适用于人工智能应用。欧盟立法也涵盖基本权利和消费者权利。
需要研究欧盟立法是否已经能够充分解决禽流感的风险,或者是否需要适应。委员会提出以下领域供审议:
1)有效应用和执行现有的国家和欧盟立法。
2)现有欧盟立法范围的局限性:例如,软件和服务不被视为产品,因此不在立法范围内。
3)人工智能系统的动态本质。
4)不同经济行为者之间责任分配的不确定性。
5)安全概念的变化:在操作过程中出现的风险,例如由于更新或技术或安全变化。
C .监管框架的范围
委员会从 b 中得出结论,补充现有立法是一种行动选择。澄清范围是一个重要的问题。目前的假设是,它涉及利用人工智能的服务和产品。为了创造法律确定性,需要界定人工智能的概念。
对这个定义的建议是:AI 是在软件或硬件中使用算法,识别产品或服务为了实现给定目标应该执行的动作。这是通过解释、推理和从数据中学习来完成的。
D .要求适用的可能情况
该框架不应该过于规范,以免给中小企业造成过多的官僚障碍。
应该关注“高风险”应用,以便监管干预能够保持合理。为此,有必要对低风险和高风险进行精确定义。
确定风险水*的标准可以是:1)高风险部门的定义,2)高风险应用的定义,3)自我评估,4)产出的影响潜力:重要性、不可逆性、高风险群体中的目标群体。
高风险应用程序的定义应基于两个标准:
1)高风险领域的详细列表。
2)关于人工智能使用的高风险的抽象定义。
强制性要求仅适用于满足这两个标准的应用程序。对于所有其他应用,现有立法继续适用。
E .需求类型
必须考虑强制性法律要求及其适用的级别。还必须考虑前面提到的风险水*。调节的强度必须是可调节的。特别是在高风险系统的情况下,所有参与者都必须遵守该法规,包括没有 EU-基地的参与者。
下面提出了高风险应用程序的需求类型:
a)质量和可追溯性义务
高风险应用程序必须使用根据欧洲规则和要求收集的数据进行培训。
这意味着数据必须保证基本权利以及隐私、保密性、完整性、可再现性(根据 DSGVO)和高级别小组道德准则的具体要求:准确性、可再现性、可再现性。
b)透明度和人员监督义务
高风险应用程序应提供符合欧洲法规的文档。这关系到数据的质量、准确性、编程方法以及生产、测试和验证人工智能系统的技术。如果还与可能的偏差相关的话。
正确应用和准确性的能力、限制、目的和条件必须提交给当局和最终用户。
当用户使用人工智能系统时,必须弄清楚这一点。
需要有人监督。
c)远程生物识别系统的具体要求
生物识别系统带来了侵犯基本权利的风险。
关于(a)和(b)的要求,应提供相应的生物特征数据处理指南。
此外,对于风险不高的系统,可能会有一个自愿的“质量标签”。然而,这种标签不会完全涵盖安全、问责和基本权利等问题,而只会鼓励可信人工智能的发展。
F .收信人
在人工智能系统的生命周期中有许多参与者。未来的立法应基于这样的原则,即责任在于最有能力应对潜在风险的行为者。
G .强制执行
应通过事前(之前)和事后(之后)评估相结合的方式对要求进行评估。可能会对风险水*进行调整。
对于高风险申请,将根据现有机制在欧盟内部进行事前评估。发生违规后,将对低风险应用程序进行事后评估。
H .治理
行政结构必须是欧洲的,以便集中责任,提高成员国在人工智能方面的能力,并确保欧洲逐步具备测试和认证人工智能产品和服务的必要能力。这种方法应该是非官僚的和敏捷的。
这些结构还应依靠国家当局网络。
不应与现有机构重叠,而应与其密切合作。
成员国应该将符合性评估留给独立的测试中心。
应确保利益攸关方尽可能广泛的参与。
7。结论 为了让欧洲利用人工智能提供的所有机会,必须建立和加强必要的工业和技术能力。这在欧洲数据战略中有所阐述。欧盟将成为全球数据中心。
欧洲的人工智能方法旨在加强欧洲的创新,同时促进道德和值得信赖的人工智能。
这份白皮书旨在与所有相关利益攸关方开展广泛磋商。
人工智能对抗新冠肺炎:早期评论
人工智能尚未产生影响,但数据科学家已经接受了挑战
来源:Pixabay
简介
由新型冠状病毒病毒引起的新冠肺炎病于 2019 年 12 月在中国被发现,并于 2020 年 3 月 11 日被世卫组织宣布为全球疫情。人工智能(AI)是对抗新冠肺炎疫情的潜在强大工具。就目前的目的而言,人工智能可以定义为机器学习(ML)自然语言处理 (NLP)和计算机视觉应用程序,以教会计算机使用基于大数据的模型进行模式识别、解释和预测。这些功能可用于识别(诊断)、预测和解释(治疗)新冠肺炎感染,并帮助管理社会经济影响。自从疫情爆发以来,为了这些目的,出现了使用和探索人工智能和其他数据分析工具的热潮。
在这篇文章中,我提供了一个早期的回顾,讨论了人工智能对抗击新冠肺炎的实际和潜在的贡献,以及这些贡献目前的制约因素。它旨在从快速扩展的讨论和不断增加的工作中快速获取信息,以便为研究、政策和医学分析中的快速响应提供投入。疫情在生命和经济损失方面的代价将是可怕的;在撰写本文时,对于非药物和药物反应究竟有多糟糕以及有多成功的估计存在很大的不确定性。改进人工智能是过去十年左右开发的最有前途的数据分析工具之一,以帮助减少这些不确定性,是一项值得追求的目标。令人鼓舞的是,数据科学家已经接受了挑战(这意味着这篇论文的保质期可能很短)。
关键要点如下。我发现人工智能还没有对新冠肺炎产生影响。它对人工智能的使用受到缺乏数据和太多噪音和离群数据的阻碍。克服这些限制将需要在数据隐私和公共健康问题之间保持谨慎的*衡,以及更严格的人机交互。在目前的疫情时期,这些问题不太可能得到及时解决,也不会有多大帮助。相反,AI 可能“帮助下一个疫情”。与此同时,收集关于谁具有传染性的诊断数据对于拯救生命和限制围堵造成的经济浩劫至关重要。
AI 对新冠肺炎的实际和潜在贡献
人工智能可以在六个领域为抗击新冠肺炎做出贡献:I)早期预警和警报,ii)跟踪和预测,iii)数据仪表板,iv)诊断和预后,v)治疗和治愈,以及 vi)社会控制。
预警和警报
加拿大人工智能模型蓝点的案例已经成为传奇。它说明了一个相对低成本的人工智能工具( BlueDot 由大约 900 万美元的启动投资资助)可以在发现传染病爆发方面超越人类。根据账户 , 蓝点在 2019 年底预测到了感染的爆发,并在 2019 年 12 月 31 日向其客户发出了警告,早于世界卫生组织在 2020 年 1 月 9 日发出的警告。与蓝点合作的研究人员还在 2020 年 1 月 14 日的旅行医学杂志上发布了一份通知,其中列出了武汉乘客将到达的前 20 个目的地城市。它警告说,这些城市可能处于疾病全球传播的最前沿。
虽然蓝点毫无疑问是一个强大的工具,但它受到的许多宣传都有些夸大和低估了人类科学家的作用。首先,当蓝点在 2019 年 12 月 31 日发出警报时,美国波士顿儿童医院的另一个基于人工智能的模型 HealthMap 甚至更早,在 2019 年 12 月 30 日发出警报。此外,仅在此之后 30 分钟,一名科学家在监测新出现疾病的项目中发出了警告。虽然基于人工智能的模型只快了 30 分钟,但它对疫情爆发的重要性非常低。本质上,它需要人的解释和提供环境来识别威胁。此外,正如蓝点的创始人卡姆兰·可汗在本期播客中解释的那样,即使在蓝点的案例中,人类仍然是评估其产出的核心。因此,强调人工智能的最佳应用需要来自不同学科的人工输入是正确的。**
跟踪预测
人工智能可以用来跟踪(包括临*预报)和预测新冠肺炎病将如何在时间和空间上传播。例如,在 2015 年寨卡病毒的疫情之后,开发了一个动态神经网络来预测 T21 的传播。然而,像这样的模型需要使用来自新冠肺炎疫情的数据进行重新训练。这似乎正在发生。在卡耐基梅隆大学,训练来预测季节性流感的算法现在正根据来自新冠肺炎的新数据进行重新训练。
各种各样的问题困扰着对疫情将如何传播的准确预测。这些包括缺乏训练人工智能的历史和无偏见的数据;导致社交媒体上“噪音”的恐慌行为;以及新冠肺炎感染的特征不同于以往大流行的事实。不仅缺乏历史数据,而且使用“大数据”(如从社交媒体收集的数据)也存在问题。
在这里,传染病背景下大数据和人工智能的陷阱仍然存在,正如臭名昭著的谷歌流感趋势的失败所表明的那样。大卫·雷泽、瑞恩·肯尼迪和亚历山德罗·维斯皮亚尼在 2014 年发表在科学上的一篇论文中将这些称为“大数据狂妄和算法动力学”例如,随着感染的继续传播和周围社交媒体流量的积累,噪音的数量也在积累,必须经过过滤才能看出有意义的趋势。对于依赖于过去行为的预测工具来说,像新冠肺炎这样拥有大量新的和前所未有的数据的全球异常事件被 Ian Rowan 描述为“现代人工智能方法的氪石”,这不仅会影响传染病的预测,还会影响所有的预测模型,包括金融、经济中的预测模型。正如他解释的那样,“许多行业将会把人类拉回到被模型从他们手中夺走的预测椅子上”。
应对大数据傲慢和算法动态的一种方式是通过社交媒体上的内容节制。由于封锁措施导致人员减少,谷歌(YouTube)和脸书(T1)等大型社交媒体*台已经开始更密集地使用人工智能来进行内容审核,包括检查 T2 的假新闻。更多地依赖人工智能进行内容审核暴露了一个事实,即人工智能在这方面仍然做得很差。YouTube 承认在内容审核中更广泛地使用人工智能是“容易出错的”这再次说明了人工智能需要人类的投入和指导。
由于缺乏数据,太多的离群数据和嘈杂的社交媒体,大数据傲慢和算法动力学,人工智能对新冠肺炎传播的预测还不是非常准确或可靠。因此,到目前为止,大多数用于跟踪和预测的模型都而不是使用人工智能方法。相反,大多数预测者更喜欢已建立的流行病学模型,即所谓的 SIR 模型,SIR 模型是一个缩写,代表一个地区的人口是可接受的、可感染的和可移动的。
例如,牛津大学人类未来研究所根据流行病学模型提供了病毒传播的预测。总部位于三藩市的 Metabiota 公司提供一种流行病跟踪器和一种疾病传播的短期预测模型,他们用这种模型来预测 T21。牛津大学数学家汤姆·克劳福德在最*的 YouTube 视频中对这些 SIR 模型做了简短的解释。
柏林的罗伯特·科赫研究所使用了一个流行病 SIR 模型,该模型考虑了政府的遏制措施,如封锁、隔离和社会距离处方。他们的模型在这里被解释为,在这里被解释为。一个类似的扩展 SIR 模型,考虑了针对疫情的公共卫生措施,并使用了来自中国的数据,最*已经预先发布并以 R 格式提供。罗伯特·科克研究所的模型早些时候被用于中国的案例,以说明遏制措施可以成功地将传播速度降低到低于指数速度。
跟踪和预测新冠肺炎的传播是公共卫生当局规划、准备和管理疫情的宝贵数据输入。并评估他们在流行病学曲线上的位置,以及他们是否成功地拉*了这条曲线。它还可以粗略反映为减少或减缓传播而采取的措施可能产生的影响。例如,罗伯特·科赫研究所预测,到 2020 年 3 月 28 日,荷兰的感染人数将达到 10,922 人。根据约翰霍普金斯大学 CSSE 的数据,在这个时候,荷兰的感染患者总数低于预期,为 8647 人。这可能会加强政府的做法有助于减少感染增长的论点。
数据仪表盘
对新冠肺炎的跟踪和预测导致了一个可视化疫情的数据仪表板行业的出现。《麻省理工技术评论》对这些跟踪和预测仪表板进行了排名。他们将最上面的仪表盘排列为 UpCode 、 NextStrain 、约翰霍普金斯、JHU CSSE 、 Thebaselab 、英国广播公司、纽约时报、健康地图。其他值得注意的仪表盘包括微软必应的人工智能跟踪器。
必应的新冠肺炎追踪器截图,2020 年 3 月 31 日
虽然这些仪表板提供了全球概况,但越来越多的国家已经有了自己的仪表板;例如,南非建立了由比勒陀利亚大学数据科学促进社会影响研究小组维护的 COVID 19 ZA 南非仪表板。
为了促进疫情的数据可视化和仪表盘的制作,Tableau 已经创建了一个新冠肺炎数据中心和一个新冠肺炎初级工作簿。Tirthajyoti Sarkar 发表了一个 Python 脚本来说明如何从《纽约时报》的新冠肺炎数据集中提取数据,以创建感染进展的数据可视化。 Amanda Makulec 呼吁对新冠肺炎数据进行负责任的可视化,并列举了“可视化新冠肺炎数据时的十大考虑因素”。
诊断和预后
快速准确地诊断新冠肺炎病毒可以挽救生命,限制疾病的传播,并生成用于训练人工智能模型的数据。人工智能可以在这方面提供有用的输入,特别是基于图像的医疗诊断。根据联合国全球脉动的研究人员最*对新冠肺炎的人工智能应用的审查,研究表明,人工智能可以像人类一样准确,可以节省放射科医生的时间,并且比新冠肺炎的标准测试更快,更便宜。X 射线和计算机断层扫描(CT)都可以使用。 Adrian Rosebrock 提供了一个关于如何使用深度学习通过 X 射线图像诊断新冠肺炎的教程。他指出,新冠肺炎的检查“供应不足且价格昂贵,但所有医院都有 x 光(或 CT)机”。 Maghdid 等人。(2020)提出了一种使用手机扫描 CT 图像的技术。
这方面的几项举措正在进行中。一个名为 COVID-Net 的人工智能已经被开发出来,可以利用来自包括新冠肺炎在内的各种肺部疾病患者的数据,在胸部 x 射线中诊断新冠肺炎。在中国,武汉人民大学的研究人员发表了一个人工智能模型(尚未经过同行评审),用于从 CT 扫描中诊断新冠肺炎,结论是“深度学习模型显示出与专家放射科医生相当的性能,并大大提高了放射科医生在临床实践中的效率。它具有极大的潜力来缓解一线放射科医生的压力,改善早期诊断、隔离和治疗,从而有助于控制疫情。
另一个正在进行的努力的例子包括荷兰代尔夫特大学的研究人员发布了一个通过 X 射线诊断新冠肺炎的人工智能模型。这个被标记为 CAD4COVID 的模型是“一个人工智能软件,它在胸部 x 光图像上对新冠肺炎嫌疑人进行分类”。它依赖于之前由结核病诊断大学开发的人工智能模型。
人工智能在诊断方面的潜力尚未付诸实践,尽管有报道称一些中国医院已经部署了“人工智能辅助”放射技术。然而,放射科医生表达了他们的担忧,即没有足够的数据可用于训练人工智能模型,大多数可用的新冠肺炎图像来自中国医院,可能存在选择偏差,使用 CT 扫描和 X 射线可能会污染设备并进一步传播疾病。事实上,在疫情崩溃后,CT 扫描在欧洲医院的使用已经下降,也许反映了这种担忧。
最后,一旦在一个人身上诊断出这种疾病,问题是这个人是否会被感染以及感染的程度如何。并非所有被诊断患有新冠肺炎的人都需要重症监护。能够预测谁将受到更严重的影响,有助于确定援助目标,规划医疗资源的分配和利用。中国华中科技大学的研究人员已经使用 ML 开发了一种预后预测算法来预测某人感染后存活的可能性。来自温州和纽约的一组研究人员准备了一个人工智能,它可以以 80%的准确率预测哪些新冠肺炎患者将会患上急性呼吸窘迫综合征(ARDS)。然而,他们用来训练人工智能系统的样本很小(只有 53 名患者),并且仅限于两家中国医院。
总之,应用人工智能来诊断新冠肺炎,并对患者的病情发展做出预测,已经激发了许多研究工作,但尚未广泛应用。正如 Devan Coldeway 总结的那样,“今年春天没有人会被人工智能医生诊断为冠状病毒”在将人工智能用于非常早期的诊断目的方面,似乎也付出了相对较少的努力,例如,在 x 光或 CT 扫描显示之前识别某人是否被感染,或者寻找污染风险较小的数据驱动的诊断方法。
治疗和治愈
甚至在新冠肺炎病毒爆发之前很久,人工智能就因其对新药发现的潜在贡献而受到称赞。在新冠肺炎的案例中,许多研究实验室和数据中心已经表示,他们正在招募人工智能来寻找新冠肺炎的治疗方法和疫苗。希望人工智能可以加速发现新药的过程以及重新利用现有药物的过程。
例如,谷歌的 DeepMind 预测了病毒蛋白质的结构——这一信息可能有助于开发新药。然而,正如 DeepMind 在其网站上明确表示的那样,“我们强调,这些结构预测尚未得到实验验证……我们无法确定我们提供的结构的准确性。”
来自韩国和美国的研究人员发表了使用 ML 鉴定现有药物 atazanavir 的结果,该药物可能被重新用于治疗新冠肺炎。英国人工智能初创公司 Benevolent AI 和帝国理工学院的研究人员在 The Lancet 上发表了一篇论文,将用于类风湿性关节炎和骨髓纤维化的药物 Baricitinib 确定为新冠肺炎的一种潜在疗法。隶属于新加坡公司 Gero 的研究人员利用深度神经网络,确定了许多现有的实验性和批准的药物,包括 Afatinib ,一种肺癌治疗药物,可能用于治疗新冠肺炎。–然而,他们的论文还没有经过同行评议。
在不久的将来,这些治疗方法(或许还有治愈方法)不太可能出现,至少在当前的疫情期间不会有太大用处。原因是,一旦这些药物被识别和筛选,在这些药物被批准之前需要进行的医学和科学检查、试验和控制将需要花费 T2 时间,根据估计,一种疫苗需要 18 个月。
社会控制
人工智能已经并可以进一步用于管理疫情,通过扫描公共空间寻找潜在的感染者,并通过实施社交距离和封锁措施。例如,正如《南华早报》所描述的那样,在中国各地的机场和火车站,红外摄像机被用来扫描人群的高温。它们有时与面部识别系统一起使用,该系统可以确定发烧的人以及他或她是否戴着外科口罩。
中国公司百度是这种使用计算机视觉扫描人群的红外摄像机的生产商之一。据报道,这些摄像机每分钟可以扫描 200 个人,并且可以识别出那些体温超过 37.3 度的人。然而,热成像被批评不足以从远处识别戴眼镜的人是否发烧(因为扫描内泪管给出了最可靠的指示),并且因为它不能识别一个人的体温升高是因为新冠肺炎还是其他原因。
更令人担忧的是,正如南华早报进一步报道的那样,“这个系统也被用来确保公民服从自我检疫命令。据报道,无视命令离家出走的人会接到当局的电话,大概是在被面部识别系统跟踪之后。
这种用法不仅限于中国。一个基于人工智能的扫描公共区域的计算机视觉摄像系统被用来监测英国牛津市的人们是否遵守政府的社交距离措施。美国一家基于计算机视觉的初创公司已经在提供“社交距离检测”软件,该软件使用相机图像来检测社交距离规范何时被违反,之后它会发出警告。在更极端的情况下,以色列政府已经批准其安全部门进行网络监控,以识别和隔离可能受感染的人,而俄罗斯正在推出我们的应用程序和 QR 系统的组合,以跟踪受感染的人并控制行动。
尽管由于缺乏历史训练数据,使用人工智能预测和诊断新冠肺炎受到阻碍,但计算机视觉和机器人等人工智能工具并没有受到阻碍。因此,在短期内,我们更有可能看到这种类型的人工智能被用于社会控制。相关技术也更有可能被采用,比如装有人工智能驱动的应用或可穿戴设备的手机,这些设备可以收集用户的位置、使用和健康数据。Bruegel 的圣乔治·彼得罗保罗斯表示,这种应用程序“使患者能够从医疗服务提供者那里获得实时的等待时间信息,为人们提供关于他们医疗状况的建议和更新,而不必亲自去医院,并实时通知个人潜在的感染热点,以便可以避开这些区域
基于来自移动设备的数据,谷歌提供了“新冠肺炎社区流动性报告”,可供 131 个国家使用,这使人们能够观察遏制措施对人们流动性的影响。
谷歌荷兰新冠肺炎社区移动性报告的屏幕截图
尽管这些都很有用,但令人担忧的是,一旦疫情结束,数据隐私的侵蚀将无法逆转,各国政府将继续利用其提高的能力调查其人口,并将在抗击新冠肺炎的斗争中获得的数据用于其他目的。Yuval Noah Harari (2020)警告说"即使冠状病毒的感染下降到零,一些渴求数据的政府可能会辩称,他们需要保留生物识别监测系统,因为他们担心第二波冠状病毒,或者因为中非出现了新的埃博拉病毒株,或者因为。。。你明白了。”
约束:数据太多,又太少
人工智能有潜力成为对抗新冠肺炎和类似流行病的工具。然而,正如布鲁格尔的圣乔治·彼得罗保罗斯得出的结论:“人工智能系统仍处于初级阶段,这种人工智能措施的结果可见还需要一段时间。”这里已经表明,目前人工智能的使用实际上受到限制,一方面是由于缺乏数据,另一方面是由于数据太多。缺乏训练人工智能模型的历史数据,没有足够的开放数据集和模型,但也存在大数据自大、算法不调整以及大量科学发现和异常数据的潜在问题,这些数据需要在最终投入临床试验之前进行转换和评估。
相比之下,在人工智能更容易使用的领域,如监控领域,我们可能会看到更多的努力——但可能会对隐私和相关人权问题产生潜在的长期不利后果。在下文中,我将更详细地讨论这些问题。
首先,就对更多数据的需求而言,新冠肺炎显然需要更多新的训练数据;需要更多的信息开放和共享,需要更多的合作和多学科研究来提高人工智能的能力。此外,还需要进行更多的诊断测试。在所有这些方面,人类在与人工智能互动和指导人工智能方面的作用是必要的。
到目前为止,已经取得了令人鼓舞的进展,开展了一些引人注目的活动,认识到建立和分享关于这一流行病的现有数据集和信息的重要性。第一个是世界卫生组织(世卫组织)的冠状病毒疾病全球研究数据库(T7 ),并链接到其他类似的倡议。
其中最雄心勃勃的专注于人工智能的项目之一,可能是语义学者、艾伦人工智能研究所、微软、脸书和其他人的联合倡议,公开提供新冠肺炎开放研究数据集,其中包含大约 44,000 篇学术文章,现在可用于数据挖掘。
与之相关的是,数据科学竞赛*台 Kaggle 基于这些数据举办了一场数据竞赛,名为“新冠肺炎公开研究数据集挑战赛”。非洲最大的数据竞赛*台 Zindi 也发起了类似的竞赛,旨在“准确预测未来几个月新冠肺炎在全球的传播”。
爱思唯尔在其新型冠状病毒信息中心 公开了关于新冠肺炎的早期和同行评审的研究,以及 ScienceDirect 上约 20,000 篇相关文章,以及数据挖掘的全文。类似地,Lens 也在它所谓的人类冠状病毒创新景观专利和研究工作开放数据集中提供了所有的专利数据,以支持对新药物和再利用药物的研究。 谷歌 已经在其云*台上提供了(直到 2020 年 9 月 15 日)新冠肺炎公共数据集,而亚马逊已经推出了一个公共的 AWS 新冠肺炎数据湖,它将其描述为“一个关于或涉及新型冠状病毒(新型冠状病毒)及其相关疾病新冠肺炎的传播和特征的最新和精选数据集的集中存储库”。
其他数据收集和开放创新计划包括加州大学伯克利分校、伊利诺伊大学厄巴纳-香槟分校和 C3.ai,他们建立了 C3.ai 数字转换研究所。该研究所已经发起了“减轻疫情的人工智能技术”的提案征集除其他外,这些应该涉及“应用机器学习和其他人工智能方法来减缓新冠肺炎疫情的传播”,以及“新冠肺炎研究利用私人和敏感数据的数据分析”。开放存取数据也由 GISAID Initiative (以前的共享所有流感数据全球倡议)收集和提供。
不仅仅是大型科技公司、出版商和大学在推动新冠肺炎数据和科学文献的开放获取,小型创业公司和非政府组织也是如此。例如, Newspeak House — 一所总部位于英国的独立住宿学院——已经启动了一项众包计划,这是一本冠状病毒技术手册,它已经邀请公众为之做出贡献。陈彦宏和他的同事发布了第一个公开的新冠肺炎推特数据集。
限制人工智能应用的不仅仅是数据的缺乏,或许有些矛盾的是,还有太多的数据。正如所指出的,随着疫情的进展,这个问题主导了新闻和社交媒体,产生了太多的大数据噪音和离群数据,算法将不堪重负——这是从谷歌流感趋势失败的倡议中吸取的教训。内容监管和算法调整都涉及到人类的常识,因此变得特别有价值。此外,科学家将需要处理大量的科学论文和新产生的数据,并在它们之间进行转换。
现在每天都有超过 100 篇关于疫情的科学文章出现。然而,这种潜在的信息过载正是数据分析工具可以发挥重要作用的地方。这方面的一个例子是新冠肺炎证据导航,它提供了计算机生成的疫情科学出版物的证据地图,每天从PubMed 更新。
2020 年 4 月 1 日 Gruenwald 等人的新冠肺炎证据导航器截图
结论
至少从流行病学、诊断学和药学的角度来看,AI 还没有在对抗新冠肺炎的斗争中发挥重要作用。它的使用受到缺乏数据和太多噪音和离群数据的限制。为人工智能训练创建无偏的时间序列数据是必要的。这方面越来越多的国际倡议令人鼓舞;然而,有必要进行更多的诊断测试。不仅是为了提供训练数据以使人工智能模型运行,而且是为了更有效地管理疫情并降低其在人类生命和经济损失方面的成本。
在撰写本文时,所有受影响的国家都在努力通过封锁、加强社交距离和取消活动来关闭经济。目前,这些措施似乎成功地减缓了传播速度。然而,这些措施是否能持续几周以上仍值得怀疑。据帝国理工学院新冠肺炎反应小组,“抑制的主要挑战是,这种类型的密集干预……将需要维持到疫苗可用,因为我们预测如果干预放松,传播将迅速反弹”
更多的诊断测试将有助于最终停止疫情,限制封锁带来的经济损失,并避免限制放松后的反弹。Mathias Dewatripont 和他的同事们提出了一个对人群进行广泛诊断测试的案例,以允许人们只有在没有传染性的情况下才能返回工作岗位,并隔离那些有传染性的人。他们还呼吁进行更多的随机抽样检测,以提高我们对无症状病毒携带者比例的估计。目前,我们只是不知道有多少人被感染。本质上,正如《T4 科学》杂志的一项研究表明的那样,86%的感染病例可能没有记录在案。如果是这样的话,那么疫情反弹的危险是非常可能的。因此,克服关于谁具有传染性的有限数据至关重要。
最后,数据是人工智能是否将成为对抗未来流行病和大流行的有效工具的核心。正如我已经提到的,人们担心公共健康问题会压倒数据隐私问题。在疫情战争结束后,各国政府可能希望继续对其公民进行非同寻常的监控。因此,对数据隐私受到侵蚀的担忧是有道理的。
对数据管理的法律和道德层面的全面讨论超出了本文的范围。然而,最*有两篇优秀的评论发表在《布鲁盖尔》和《T2》【自然】杂志上。简而言之,鉴于疫情造成的公共健康威胁,欧洲 GDPR(第 9 条)允许收集和分析个人数据,只要它有一个明确和具体的公共健康目标。及时收集和分析大数据的灵活性对于抗击疫情至关重要,即使这可能需要当局收集比许多人感到舒服的更多的个人数据。因此,至关重要的是,当局在处理此类数据及其理由和向公众传播时要特别小心。危险在于人们可能会失去对政府的信任,正如恩卡和瓦耶纳指出的那样,“这使得人们不太可能遵循公共卫生建议或推荐,更有可能健康状况不佳”
人工智能:人工智能术语简单解释
什么是人工智能?机器学习是什么意思?甘一家怎么样了?在这里你可以找到常用技术术语的清晰定义。
在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
如果你考虑计算机的未来,你不能回避人工智能。而谁想到计算机的过去,其实都不是——思维机器的梦想在古希腊人身上就已经可以找到了。
但传奇的时代似乎已经结束:人工智能如今无处不在。但是我们今天称之为人工智能的是什么呢?它是如何工作的?
人工智能
人工智能的创始人之一约翰·麦卡锡将人工智能描述为“生产智能机器的科学和技术”,即研究人员和工程师的活动领域。
今天,这个术语主要指这些智能机器:人工智能代表行为智能的计算机系统。
智能在这里的意思是:它们解决通常需要智能的任务,如理解和表达语言、图像识别、决策或翻译。
弱/紧 AI
与人类不同,人工智能通常只学习和完成一项高级任务。这样的 AI 因此被称为弱 AI 或窄 AI。在他们的专业上,他们现在经常比人类优越。现在所有的 AI 系统都是弱 AI。
一般/强人工智能
具有类似人类智能、能够将其思维应用于许多不同任务的人工智能尚不存在。但这是人工智能研究的主要目标。这样的 AI 被称为通用人工智能。通常,但由于其哲学渊源,术语强或真人工智能不太清楚。
超级人工智能
如果通用人工智能发展到各方面都超过人类的程度,一个人工超级智能就产生了。对于许多人工智能警告者来说,KSI 的出现——被称为奇点——标志着人类可能的终结。另一方面,一些人工智能专家希望超级人工智能能够解决人类的大问题,如气候变化、贫困和疾病。
如何创造人工智能
创造人工智能有不同的方法。基本上,可以区分两种不同的方法:
所谓的“好的,老式的 AI”(go fai)确定 AI 研究一直到 80 年代末,争取强 AI。想法是:人类思维由包含我们对世界的知识的单个术语的逻辑组合组成。
SHRDLU 是最早尝试理解自然语言的 AI 程序之一。1968 年至 1970 年间创造的人工智能可以移动几何物体,并在需要时提供有关它们的信息。
根据这一想法,所谓的专家系统出现了,它们将关于世界的简单信息打包成符号类别,并以逻辑结论对它们进行操作。
GOFAI 无法满足 AI 的高期望——第一次 AI 寒冬爆发。科研经费取消,项目取消。例如,今天,这种人工智能被用于过程自动化。
机器学习
AI 研究目前最喜欢的是机器学习,尤其是深度学习。
机器学习创造了使用数据来学习如何执行任务的计算机系统。与开发人员以编程代码的形式逐行指定指令不同,该软件在第一次触发后独立更新其代码,并为获得更好的结果进行优化。
该研究学科目前最受欢迎的是所谓的深度学习:具有多层神经网络的机器学习,可以越来越准确地识别数据中的模式,从而学习人类的偏好,识别物体或理解语言。
机器学习驱动了大量当前的 AI 服务。不管是谷歌、网飞还是脸书:学习算法做推荐,改进搜索引擎,让语音助手给出答案。
(人工)神经网络
人工神经网络的灵感来自人类大脑的一个基本图像:一种算法创建了不同层的连接神经元或节点,它们相互交换信息。神经网络的数学起源于 1943 年。
在最简单的情况下,该架构由输入层、中间隐藏层(隐藏层)和输出层组成。输入信号被中间神经元最初随机生成的值修改,并被传递到输出层。
一个简单的人工神经网络。一个圆圈对应一个人工神经元,一个箭头表示一个神经元的输出与另一个神经元的输入的连接。图片:有色神经网络, CC BY-SA 3.0 。
现在可以将输出与输入进行比较——预测是否正确?基于该结果,中间神经元的值被修改,并且用新的输入重复该过程。经过多次重复,预测变得越来越精确。
简而言之:神经网络是自我优化的算法。
如果你想深入了解,推荐这部优秀的英文视频系列。
深度学习
深度学习(Deep learning)或称深度学习,是具有不止一个隐层(hidden layer)的神经网络的机器学习。
这些复杂的神经网络最迟在 2012 年开始了他们的凯旋游行,当时这样一个网络赢得了 ImageNet 图像分析竞赛。
深度神经网络的每一层都可以分析自己的图像信息:边界、纹理和图案,直到对象。图片:蒸馏
深度学习是*年来人工智能热潮的原因,特别是在图像识别、自动驾驶或 deepfakes 方面。
深度学习的突破是由越来越快的处理器和专用人工智能芯片(如谷歌的 TPU)以及用于训练机器的海量数据实现的。
生成对抗网络
GANs 由两个相互促进的神经网络(代理)组成。两者都用共同的数据集进行训练,比如照片。
然后,一个代理创建类似于数据记录的内容,另一个代理将其与原始数据记录进行比较。如果它识别出它是伪造的,它会迫使伪造者改进它的内容——直到它看起来像是属于原始的训练数据记录。
在 4.5 年的时间里,甘-基人已经变得更擅长生成人类肖像。
经过足够的重复,一个大师级的伪造者就诞生了:GANs 创造出看似真实的人、深刻的赝品、街道或假模型。他们作曲、播放音乐、创作昂贵的艺术品,将复古游戏变成高清版本。自 2014 年推出以来,它们一直在稳步改善。
训练,训练,还有更多训练
训练是人工智能的一部分,就像数学公式中的占位符一样。但是你如何学习和训练完全取决于人工智能。我提出一些在人工智能训练中使用的学习方法。
监督学习
通过监督学习,人工智能在训练数据准备就绪的情况下受到监控。一个例子:如果一个人工智能应该识别照片中的物体,所有的猫、汽车、树等等。训练前的照片上都有标注。
这个标记过程(“标记”)非常耗时,但这是成功的监督训练的基础——多亏了密集的人类准备工作,AI 知道它应该寻找哪些模式。
监督学习是大多数目前广泛使用的人工智能的背后,例如自动驾驶、人脸识别或在线搜索。标签通常是由低工资工人制作的,*年来它已经成为一个全球性的行业。
无监督学习
无监督学习是 AI 研究的希望。与监督学习相反,数据不是以复杂的方式准备的:AI 接收大量没有标签的数据并独立搜索数据中的模式。
该方法有两个优点:第一,准备充分、广泛的数据集很少。其次,人工智能可以揭示数据中仍然对人们隐藏的相关性。
用 AI 研究员 Yann LeCun,的话说就是:“如果智能是一块蛋糕,那么这块蛋糕的大部分是无监督学习,蛋糕上的糖衣是监督学习,樱桃是强化学习。”
OpenAI 强大的文本 AI GPT-2 通过自我监督学习成为可能:通过人工智能生成文本的进展也带来了发现虚假文本的新工具。
与此同时,术语自我监督学习也传播开来。根据不同的观点,这是无监督学习的特殊变体或同义词。LeCun 已经宣布,从现在开始他将只谈论自我监督学习,而不是无监督学习。
自我监督学习通常会保留部分训练数据,人工智能必须预测这些数据,例如句子中的下一个单词。这迫使他们学习关于数据的重要细节,比如语义表示。
例如,自我监督学习被用于人工智能扩展,并在过去 1.5 年中实现了语言人工智能的巨大进步。OpenAI 使用强大的 GPT-2 算法的学习方法。
强化学习
鼓励学习依靠胡萝卜加大棒:每当人工智能成功完成任务,它就会得到奖励。如果她错过了她的目标,她要么什么也得不到,要么受到惩罚。
OpenAI 教 AI 玩捉迷藏,强化学习。
通过这种试错法,人工智能通过从初学者到专业人员的尝试,在许多领域得到了发展,例如在围棋和象棋、Dota 2、星际争霸 2 或扑克中。所有最*的成功都依赖于所谓的深度强化学习,即强化和深度学习的结合。
迁移学习
迁移学习是指将从人工智能学到的技能应用于一个新的但相关的问题的训练方法。一个例子是谷歌的图像识别 AI Inception,研究人员用它来检测肺癌。
从长远来看,转移学习人工智能可以远离孤岛人才到更大的灵活性。因此,对迁移学习的研究是对普通人工智能的一个重要贡献。
模仿学习
模仿学习使用演示作为人工智能的培训材料。例如,在视频游戏中,这可以是人类玩家在游戏中奋力拼搏的记录,也可以是机器人通过观察人类动作进行学习的记录。
ai 已经很久不能玩遍雅达利经典《蒙特苏马斯复仇》了。与此同时,人工智能已经通过模仿基于人类游戏策略的学习做到了这一点。
与授权学习相比,模仿学习的一个优势是更大的灵活性:在某些环境下,回报很难定义或实现。纯粹的试错法不会推进人工智能。这就是人类演示有所帮助的地方,人工智能可以从中学习方法。
少数镜头学习
在人工智能成功识别数据模式之前,通常需要无数的例子。所谓的一次性和少量学习方法有助于人工智能,类似于人们如何仅通过几个例子或者甚至仅通过一个例子来学习新的能力。
英伟达的 AI 可以跳舞,可以转移面部表情,可以生成街拍。全才只需要几个例子,比如一个新闻主播的几张照片。视频:英伟达
实际上,人工智能无需大量训练就能学习新任务。例如,三星的研究人员仅用几个例子就成功地交换了人的面部。一个以色列研究小组更进一步,开发了一种无需人脸训练的实时 deepfakes 方法。
人工智能
用外行人的话来说,你需要知道的就是
作为人类,我们可能经常想知道人类的智能是否可以复制,机器是否可以像我们一样工作。
虽然这仍然是一个遥远的梦想,但我们并不遥远。在《通往人工智能之路》中,让我们概述一下它的真正含义以及数据科学如何帮助我们实现它。
AI Vs ML Vs DL 图片作者
人工智能(Artificial Intelligence):这是一门重要的科学,在当今的日常活动中确实有所帮助。任何机器学习或深度学习算法的最终目标都是实现人工智能。
人工智能是指机器的智能,它们可以像做决定、建议行动、解决问题和获取重要信息一样智能。
从自动驾驶汽车到手机中的 Siri,再到网飞推荐,一切都由人工智能驱动。
B)机器学习:机器学习是人工智能的一个子集,其主要目的是从作为输入的数据中学习,并预测连续值或将数据集分类到某个类别中。
这些问题分别称为回归问题和分类问题。
机器学习有 3 种类型:
1)受监督的:在受监督的学习中,我们标记了数据,因为我们有从中训练的具有预测值的数据。
有两种类型的监督学习:
分类
在这种监督学习中,一组独立的数据用输出类标记。
按作者对数据图像进行分类
在上面的例子中,你可以看到像胸痛、动脉阻塞和血压这样的独立特征可以确定一个人是否患有心脏病,这就是分类数据。
当一个模型在这种数据上被训练时,它可以被用来预测心脏病的类别或没有。
用于分类的算法的例子是逻辑、支持向量分类器、决策树分类器等等。
回归
在这种监督学习中,用输出连续预测值来标记一组独立数据。
回归问题图片作者
在上面的例子中,房龄、卧室总数、人口、家庭、家庭收入是决定房屋价值的独立特征,并且尽管可以对数据进行训练,但是该模型可以用于预测各种房屋的房价。
用于分类的算法的例子有线性、支持向量回归、决策树回归等等。
2)无监督:在这种学习中,没有带标签的数据,即不存在输出标签,我们需要确定给定数据之间的关系。像这样的问题大多通过聚类或分组来解决,即数据被分组以形成彼此相关的聚类。
分组或聚类
一个非常有用的例子是任何行业中的客户细分,其中公司试图根据其收入、关系状态、年龄和其他因素将其客户分类为其产品的未来客户。
另一个例子是房子更喜欢附*有名的食品连锁店。
无监督学习中的聚类,按作者分类的图像
离房屋最*的分支将是优选的,并且可以基于位置和离该分支的距离来聚集房屋。
3)强化学习
也称为半监督学习。这是一种在环境中发生的学习,通过采取一些行动,如果行动是正确的,就给予一些奖励,如果不正确,就向系统发送一些观察结果以从中学习,系统的整个想法是通过采取在每次迭代中学习到的和更好的行动来专注于越来越多的奖励。
作者的强化图像
强化学习的例子可以是机器人或人工智能应用驱动的汽车。通过反馈或观察进行学习,模型得到改进。
有两种强化学习
积极: 在这种类型的学习中,给予奖励的行为得到改进和加强,每次都会产生奖励,从而使绩效最大化。
否定: 在这种类型的学习中,观察结果为否定的行为会被避免或停止,每次都会提高绩效。
C)深度学习
深度学习现象是在人工智能必须深度到实际上可以像神经网络一样模仿人脑的时候发展起来的。
机器学习可以学习非常复杂的问题,就像人类通过在环境中反复看到或听到并分析事物来学习一样,这可以被称为深度学习。
人脑有多种功能,如下图所示:
人脑功能图像来源
对于每个功能和零件,人工智能程序正在开发中,如:
枕叶 -用于视觉识别的卷积神经网络(CNN)或深度剩余学习(ResNet)
颞叶-用于语音识别的递归神经网络(RNN)或深度神经网络(DNN),代表用于对话理解的学习(RL)。文本分析和 NLP(自然语言处理)目前正在扩展领域。
运动皮层 -机器人学
一个简单的神经网络是一套算法,试图通过一个非常类似人脑运作方式的过程来识别一组数据中的关系。
它基本上指的是大脑的神经元,以及在给定的情况下它们如何行动。
单层神经网络来源:作者
上图有一个输入层,它类似于给定的一组数据或神经元必须发挥作用的情况。
隐含层有神经元,其内部工作可以分两步进行。
步骤 1)分析输入 x 并赋予它们权重 w。它将每个输入乘以权重并添加偏差 b。
Y =∑ xiwi +b,这非常类似于求解线性方程 y=mx+c
步骤 2)激活神经元-该功能确定神经元是否必须被激活以响应给定的情况。它可以使用任何函数,如 Sigmoid,Tanh,Relu。
它的值将在 0 到 1 之间。
值越接* 0 意味着神经元必须是不活跃的,越接* 1 意味着它必须是活跃的。
我将在我的下一篇博客中更详细地讨论神经网络中隐藏层的内部功能。
感谢阅读!
原载于 2020 年 10 月 19 日https://www.numpyninja.com。