数据科学工作流
Photo by Kevin Ku from Pexels https://www.pexels.com/photo/coding-computer-data-depth-of-field-577585/
Jupyter 笔记本可以在这里找到。
没有解决数据科学问题的模板。路线图会随着每个新数据集和新问题而变化。但是我们确实在许多不同的项目中看到类似的步骤。我想创建一个干净的工作流程,作为有抱负的数据科学家的榜样。我还想给与数据科学家一起工作的人一个易于理解的数据科学指南。
这是一个高层次的概述,概述中的每一步(以及几乎每一句话)都可以单独解决。许多书籍,如哈斯蒂和蒂布希拉尼的《T2 统计学习导论》和许多课程,如吴恩达在斯坦福大学的机器学习课程,更详细地探讨了这些主题。数据科学社区有大量的文献和资源。一定要深入任何你感兴趣的话题。
概述:
- 目标
- 导入数据
- 数据探索和数据清理
- 基线建模
- 二次建模
- 交流结果
- 结论
- 资源
最后,我想说这个过程不是完全线性的。随着你对数据了解的越来越多,你会跳来跳去,并发现新的问题需要解决。
我们开始吧!
1)目标
你想解决的问题是什么?从等式中删除建模、评估指标和数据科学。你的公司面临的问题是什么?你想进一步了解什么?清楚地陈述你的问题是解决问题的第一步,没有一个清楚的问题,你会发现自己陷入了数据科学的兔子洞。
对于此工作流,我们将分析 IMDB.com 排名最高的电影。我想建立一个模型来预测 IMDB 电影评级的基础上,如预算,运行时间和网站上的投票功能。
2)导入数据
数据可以来自各种来源。您可以从本地计算机导入 CSV 文件,查询 SQL 服务器,或者使用 web scraper 从 Internet 上提取数据。我喜欢用 Python 库,*熊猫 *,导入数据。Pandas 是一个非常棒的开源数据分析库。我们还将在这个工作流程的数据清理步骤中使用 Pandas。
对于本例,我们将从本地机器导入数据。我将使用 Kaggle.com 用户 Sai Pranav 的数据集。该数据集的标题是“这十年排名靠前的英语电影”,它是在一个 CSV 文件中。
理解高收视率电影的成功。
www.kaggle.com](https://www.kaggle.com/saipranava/top-ranked-enlglish-movies-of-this-decade/data)
import pandas as pd
df = pd.read_csv(‘/Users/aakashtandel/Downloads/IMDB.csv’, index_col=0, encoding=’latin-1')
我想马上说,这个数据集非常小。观察次数相对较少。但是因为这只是一个示例问题,所以我可以继续。在工业界,你肯定会想要一个更大的数据集。
3)数据探索
现在我们已经将数据导入到 Pandas 中,我们可以检查数据帧的前几行。
df.head()
我喜欢一开始就做三个区分。这是监督学习还是非监督学习?这是分类问题还是回归问题?这是预测问题还是推理问题?
监督或无监督学习:有了监督学习,我们已经明确标注了因变量和自变量。因变量(我们的目标)是已知的。如果我们在看线性回归,我们的 y 变量是显而易见的。如果我们确实有一个明确标记的 y 变量,我们正在执行监督学习,因为计算机正在从我们明确标记的数据集学习。它正在学习我们的 x 变量和我们的 y 变量之间的关系。监督学习可以分解为回归和分类问题。无监督学习,我们没有一个明确的因变量。我们有一个 x 变量的特征矩阵,没有 y 变量。无监督学习问题可能涉及聚类和创建关联。在这篇概述中,我不会涉及集群,但是这是一个很好的学习技巧。此外,从数据探索的角度来看,无监督学习可能是有益的。
分类或回归:现在我们知道我们有一个监督学习问题,我们可以决定它是分类问题还是回归问题。我查看 y 变量,并确定该变量是连续变量还是离散变量。分类 y 变量属于分类设置,而连续数量变量属于回归设置。分类问题的一个例子是确定信用卡交易是否是欺诈性的。这是一个二元分类问题,因为每笔交易要么是欺诈性的,要么不是欺诈性的。回归问题的经典例子是根据平方英尺、卧室数量和地块大小等特征来确定房子的价格。
预测或推断:在预测设置中,我们希望我们的模型估计一个 y 值,给定各种特征。从上面的回归示例中,我们希望为我们的模型提供一栋 1500 平方英尺、两间卧室和一块 0.50 英亩土地的房子。然后我们的模型会预测房子价值 20 万美元。在推理设置中,我们想知道一个特征( x 变量)如何影响输出( y 变量)。我们可以看到当你给房子增加一个额外的卧室时,房子的价格是如何增加的。
在解决您的数据科学问题时,这三组问题可以提供很多指导。
在我们的示例中,我们将使用回归(监督学习)从元批评评级、预算、运行时间和投票中预测 IMDB 评级。
回到编码部分!让我们确定哪个变量是我们的目标,哪些特征是我们认为重要的。
我们的目标是标题为 Rating 的列,我们的功能是标题如下的列:MetaCritic、Budget、Runtime、VotesUS、VotesnUS 和 TotalVotes。我将删除本次分析不需要的所有列。
df = df[['Title', 'Rating', 'TotalVotes', 'MetaCritic', 'Budget', 'Runtime', 'VotesUS', 'VotesnUS']]
Pandas 和 Matplotlib(一个流行的 Python 绘图库)将帮助我们进行大部分的探索。探索性数据分析(EDA) 让数据科学家有机会真正了解他或她正在处理的数据。许多数据科学家发现自己后来又回到了 EDA 以及他或她在 EDA 中发现的发现。
在整个 EDA 过程中,我清理数据。来自真实世界的数据非常杂乱。但是,当我在 EDA 过程中工作并学习数据时,我会记下需要修改的地方,以便进行分析。数据清洗对我来说和 EDA 齐头并进。我在这两个阶段之间工作了相当长的时间,我经常发现自己又回到了这两个阶段。
我首先检查的是数据类型。以正确的格式获取所有值非常重要。这可能涉及到从字符串中剥离字符、将整数转换成浮点数或许多其他事情。
df.dtypesdf.TotalVotes = df.TotalVotes.str.replace(',', '')
df.TotalVotes = df.TotalVotes.astype(int)
# Total Votes column is ready.df = df[(df.Budget.str.contains("Opening") == False) & (df.Budget.str.contains("Pathé") == False)]
df.Budget = df.Budget.str.replace('[^\x00-\x7F]','')
df.Budget = df.Budget.str.replace(',', '')
df.Budget = df.Budget.str.replace('$', '')
df.Budget = df.Budget.astype(int)
# Budget column is ready.df.Runtime = df.Runtime.str.extract('(\d+)', expand=False)
# Runtime column is now ready.
缺失值和空值很常见。有时你有很大的矩阵,但里面的信息很少。这些被称为稀疏矩阵。处理缺失值和空值本身就是一个完整的主题。这个话题被称为缺失数据插补,我不能在这里深入探讨。一定要查找更多关于这个主题的信息,尤其是当你遇到稀疏矩阵的时候。出于我们的目的,我将简单地删除具有空值的电影。这并不总是最好的主意,但是在这个分析中我选择了这样做。
df = df.dropna()df.Runtime = df.Runtime.astype(int)
df.VotesnUS = df.VotesnUS.astype(float)
df.VotesUS = df.VotesUS.astype(float)
有许多不同的方法可以对你的数据进行 EDA。检查缺失值、检查数据类型和格式化数据只是冰山一角。寻找唯一值的数量。使用 Pandas describe 方法获得列的汇总统计信息。在数据分析过程的这个阶段,Pandas 是一个非常有用的工具,熟悉 Pandas 的数据清理对于任何数据科学家来说都是一个必不可少的工具。
EDA 的最后一部分是绘图。绘图非常重要,因为它允许你直观地检查你的数据。直方图、散点图和箱线图都可以用来提供对数据问题的另一层洞察。对于这个例子,我们将使用熊猫来创建一个散布矩阵。
import matplotlib.pyplot as plt
pd.plotting.scatter_matrix(df, figsize=(20,20))
plt.show()
在数据探索和清理阶段,我还执行特征工程。特征工程是从旧特征中构造新特征。特征工程的一些基本类型是从两个特征中创建交互变量或为时间序列分析创建滞后变量。特征工程是我将在这个工作流程中讨论的另一个主题,但它不应该被遗忘。
4)基线建模
作为一名数据科学家,你会建立很多模型。您将使用各种算法来执行各种各样的任务。你需要用直觉和经验来决定什么时候某些模型是合适的。作为一名职业经济学家,我更喜欢用线性回归来解决我的回归问题,用逻辑回归来解决我的分类问题。(我也倾向于使用 kNN 用于基线分类模型,使用 K-Means 作为我在无监督学习中的第一个聚类算法。)这些模型会给你一个可以改进的基线。
在 Kaggle 竞赛中,许多获胜者使用先进的神经网络、 XGBoost 或随机森林来解决数据科学问题。所有这些都将随后出现,应该会比线性回归和逻辑回归给我们带来更准确的预测。
Scikit-Learn 是一个 Python 的机器学习包,可以用于各种任务。我们可以使用 Scikit-Learn 进行建模(分类、回归和聚类)。它还可以用于降维(主成分分析)、模型选择(网格搜索、评估度量)和数据预处理。当您在 Scikit-Learn 中工作时,不同算法的建模基础是相似的。
在模型预处理期间,我们将从因变量中分离出我们的特征,全面扩展数据,并使用训练-测试-分割来防止我们的模型过度拟合。过度拟合是指当我们的模型过于紧密地跟踪我们的训练数据,并且当它被输入新数据时,它的表现不好。这意味着该模型不能很好地推广到新问题。该模型会拾取训练数据中的所有噪声,并记忆下来。创建训练-测试-分割有助于对抗过度拟合。此外,我们可以使用交叉验证来防止过度拟合。一定要自己查找更多关于交叉验证的信息。
y = df.Rating
X = df[['TotalVotes', 'MetaCritic', 'Budget', 'Runtime', 'VotesUS', 'VotesnUS']]
# We need to separate our feature matrix from our y variable for Sklearn.from sklearn.preprocessing import MinMaxScaler
cor_X = MinMaxScaler().fit_transform(X)from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cor_X, y, test_size=0.2)
print (X_train.shape, y_train.shape)
print (X_test.shape, y_test.shape)
现在我们准备使用我们的模型。我们将根据训练数据拟合我们的模型。然后,我们将通过让预测我们的 X_test 数据的 y 值来测试我们的模型。然后,我们可以通过查看预测的 y 值与实际的 y 值相差多远来评估我们的模型表现得有多好。
from sklearn import linear_model
lm = linear_model.LinearRegression()
model = lm.fit(X_train, y_train)
predictions = lm.predict(X_test)plt.scatter(y_test, predictions)
plt.xlabel('True y')
plt.ylabel('Predicted y')
plt.show()
# Graph print ('Score:', model.score(X_test, y_test)) # R-squared is the default metric used by Sklearn.
我们的模型表现得相当好。它能够达到 0.96 的 R 平方。这个评估指标 R 平方是一个拟合优度指标。它是我们的模型解释的我们的 y 变量的变化百分比。对于这个回归问题,我们也可以用均方根误差和调整的 R 平方来评估我们的模型。
模型评估指标很多。对于分类问题,常用的评价指标是准确率和 ROC-AUC 得分。评估您的模型是非常重要的,了解更多关于评估指标是明智的。
总的来说,我会谨慎对待这些结果。我们选择的特征很可能共线。基本上,共线性是指当你有非常相似的特征或者给我们关于因变量的相同信息时。共线性(完美共线性)的典型示例是一个以摄氏度为单位给出温度,另一个以华氏度为单位给出温度的要素。这些变量中有一个是多余的。VotesUS 和 VotesnUS(非美国投票)的特征可能非常相关。这可能是我们有如此高的 R 平方值的原因。幸运的是,我们将在第 5 部分使用非参数算法。
有几种方法可以对抗共线性,其中最基本的方法是删除一个投票变量。还有其他方法,比如代理变量,我们可以用来解决这个共线性问题。但是我们不会在这里讨论这些(我似乎经常这么说)。
lm.coef_
在讨论其他模型之前,我想先讨论一下线性模型的β系数。我们看到,美国以外的投票对 IMDB 评级产生了最大的积极影响。这种形式的推断可能不是一个好主意,因为我们不知道这些系数是否有统计学意义。如果你试图解决一个回归推理问题,我会推荐使用 Python 库 Statsmodels 。Statsmodels 的输出是一个 ANOVA 表加上系数及其相关的 p 值。
5)二次建模
你可以建立数百个模型,我有朋友花了大量的时间进行模型建立和模型调整。我将使用 Kaggle 最喜欢的一种方法,随机森林,而不是在这个场景中使用的每一个回归模型。随机森林模型是一个集合模型,它使用许多决策树来分类或回归。训练算法使用 bagging,这是引导和聚集的组合。随机森林算法还具有非参数化的优势。因为这不是一个模型教程(制作起来可能会很有趣),所以我不打算深入这个算法的细节。让我们看看如何在 Scikit-Learn 中使用它。
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
model = rf.fit(X_train, y_train)
predictions = rf.predict(X_test)print ('Score:', model.score(X_test, y_test)) # R-square is still the default for Sklearn.model.feature_importances_
哇哦。我们的随机森林模型比我们的线性回归模型表现更差。这是一个令人惊讶的结果。这向我们展示了像线性回归这样简单易懂的模型的力量。如果我们看看特征的重要性,我们可以看到这个随机森林模型与我们的线性回归模型一致,即美国以外的投票在预测 IMDB 评级方面非常重要。我们的数据集非常小,所以这个奇怪的结果可能是小数据集的产物。
或者,我们已经提到,我们的线性回归可能遭受高度共线性。在这种情况下,由于共线性问题,我会相信随机森林模型的结果,而不是线性回归的结果。
现在有一个完整的参数调整的兔子洞我们可以下去了。每个算法都有一组你可以优化的参数。对于我们的随机森林模型,我经常试验最大深度和学习率。但是正如您所知,这些参数是特定于您的建模算法的,所以我不会在这里深入讨论。我将提到网格搜索。网格搜索允许您改变模型中的参数(从而创建多个模型),训练这些模型,并使用交叉验证来评估每个模型。Scikit-Learn 对此有一个 GridSearchCV。当您决定一次调优多个参数时,使用网格搜索可能会有好处。
现在怎么办?
Photo by energepic.com from Pexels https://www.pexels.com/photo/architect-composition-data-demonstration-313691/
6)交流结果
在我看来,你的数据科学项目可以有两个方向:数据科学产品和数据科学报告。
首先,你可以创建一个数据科学产品。让您的模型投入生产,这本身又是一个话题。首先,您需要将代码从 Jupyter 笔记本转移到脚本中。在大多数公司中,数据科学家将与软件工程团队一起编写代码。首先需要对模型进行酸洗,这可以通过 Scikit-Learn 的 Joblib 来完成。然后我们可以使用 Flask 和 Heroku 为您的模型创建一个应用程序。在本教程中,我选择放弃这种方法。开发数据科学产品是一项非常有用的技能,我本人正在深入研究这些过程。我鼓励你也这样做!
除了数据产品,您还可以创建一份数据科学报告。你可以用演示文稿向公司展示你的成果,并对整个过程进行技术概述。记住要记住你的听众。如果你要向一屋子的数据科学家展示结果,请详细说明。如果你在给销售团队提建议,在解释你的结果之前,不要花 45 分钟谈论通用逼近定理。对我来说,数据科学报告有点像迷你论文。你正在提交一篇论文,你的同事(和老板)会仔细审查,你需要为这篇论文辩护。
如果你的公司允许你发表结果,我会建议你把你的报告带到数据科学会议上。对于数据科学社区来说,关于您的项目的反馈总是一次很好的学习经历。如果你想看一些精彩的演示,可以看看 YouTube 上的 PyData 视频。此外,写一篇博客文章并将您的代码推送到 GitHub ,这样数据科学社区就可以从您的成功中学习。交流你的结果是科学过程的一部分,所以不要隐藏你的发现!
7)结论
我希望这个工作流程和迷你项目对有抱负的数据科学家和与数据科学家一起工作的人有所帮助。就像我提到的一百万次,有很多细节,我在这里掩饰。如果您有任何问题或意见,请告诉我!
8)资源
工作流程的想法来自威廉·沃尔夫(Platzi.com)和凯茜·奥尼尔和瑞秋·舒特的《做数据科学》。
统计学习的要素和统计学习介绍是很好的文本,可以提供我忽略的许多主题的更多细节。
电汇给布里斯·沃尔夫冈编辑。
Aakash Tandel
aakashtandel.com
aakashtandel 有 12 个可用的存储库。在 GitHub 上关注他们的代码。
github.com](https://github.com/aakashtandel)
高效项目生命周期的数据科学家指南
最近,我发现自己处于一个项目的末尾,这个项目花费的时间可能是它应该花费的 3 倍。与预期的 6-8 周不同,我的团队花了 5 个多月的时间来应对不断变化的目标、收集和验证数据的低效方法,以及探索各种解决方案。
回过头来看,这些都是反复出现的问题,本可以通过更有纪律的决策来缓解。简而言之,有三个主要原则可以在不牺牲结果质量的情况下大幅缩短项目长度:
- 快速失败
- 40/70 法则
- 费米估算
在回顾这些原则的作用之前,我应该提到定义总体目标的重要性。正如我在之前的帖子中所说:
您定义问题和目标的方式对于确定使用哪些绩效指标以及在何处设置标准至关重要。定期停下来,以确保您的问题、目标、指标和数据仍然一致。
假设我们的任务是建立一个识别狗图片的模型。我们可以找到地球上所有动物的数据集,训练一个模型单独挑出每种动物,然后然后选择只有狗的照片。然而,我们也可以只选择有狗和没有狗的照片,用更少、更有效的数据训练更有效的分类器。方法的不同可能意味着数月的数据收集、验证和复杂的评估指标。花在案例驱动目标上的每一个单位的时间都将为你的团队节省数十个到达终点线的时间。
快速失败
快速判断解决问题的方法是否可行是很重要的。快速失败是一种方法论,用于在初步测试后判断一个想法是否值得追求。
设定一个初始目标并尝试 A 方法可以很快告诉你是否在大概范围内。如果没有,在回到 A 方法进行微调之前,你可能值得花时间去寻找其他途径。
举个例子:我想把情感分析放在我的产品里,我收集了一些真相数据。我可以尝试使用一种简单的方法,通过识别一系列表示积极和消极情绪的单词,并计算出现的次数。然而,如果当我仔细地为我的产品设置一个 70%准确率的标准时,这个方法达到了 25%的准确率,当我可以尝试另一个方法时,修改这个方法可能没有用。
四七法则
通常情况下,人们在做决定前会尽量等待,直到掌握尽可能多的信息。虽然这有助于我们感觉更好,但从长远来看,这并不一定会带来更好的结果,尤其是当许多决定需要快速做出的时候。
前国务卿科林·鲍威尔(Colin Powell)认为,领导者应该掌握不低于 40%也不高于 70%的信息来做决定。任何低于这个门槛的都被认为是不成熟的,任何高于这个门槛的都意味着你已经等了太久。
问问你自己完美的信息是什么样的,然后反过来找出门槛在哪里。这不是一个硬性规定,因为 35%到 45%的信息之间的界限太难尝试和客观区分。相反,关键在于找到知情和及时决策之间的平衡。
例如:如果我有 10 个类问题,我需要弄清楚我的真实数据有多可靠,也许我可以使用众包来验证 4 个类,并进行推断以减少成本和时间。如果数据被错误标注,那么使用它就没有什么意义了。我已经决定尝试一种新的方法,而不是花费时间和金钱来检查每一寸数据,因为我已经有了做出及时而明智的决定所需的所有信息。
费米估计
费米估计是使用近似值来获得一个复杂问题的“足够好”的答案,而不需要花费大量的时间和金钱。要获得更详细的解释,请阅读本文,或者略读引言以获得其要点。
我发现费米估算在估算项目长度时非常有用。通过分解项目的不同部分,我们可以快速乘以各种任务的预期长度,以找到一项任务将花费多长时间的粗略估计。在项目开始的时候,知道某件事需要一天、一周还是两周是非常有用的。有一个大概的估计可以帮助数据科学家更有效地设置期望值和规划他们的工作流程。
费米估算本质上是不精确的,并且估算总是可以被更新,以获得关于项目长度的预期的越来越精确的视图。
简单>花哨(加分)
这一原则的核心是机会成本。过度设计解决方案会浪费时间追求不必要的复杂解决方案,没有真正的附加价值。例如,当我们可以通过 scikit-learn 的逻辑回归模型获得足够好的分数时,为什么要用 tensorflow 精心设计复杂的神经网络呢?绝招问题**——**没有理由这样做。
然而,并不是所有的例子都如此明显。让我们考虑一下我们的情感示例:如果我设定一个 70%准确率的目标来发布一个用于生产的情感分析模型,我可以尝试朴素的单词字典方法,并计算正面和负面单词的出现次数。
如果这种方法让我达到 67%的准确率,我应该重新考虑成功的标准,并在尝试使用更复杂的东西之前确保我们的简单模型 T2 确实不够好。
有时候,简单的解决方案已经足够好了,你最好把时间花在新的问题上,而不是对现有的解决方案进行不必要的微调。机会成本是关键。
结论
数据科学问题很复杂,在没有完美信息的情况下做出决策会让感到错误。通过一些启发和保持更大的视野,我们可以克服寻找完美信息和设计完美解决方案的自然倾向。感谢您的阅读,希望您能在这些提示中找到价值!
数据科学家的数据结构和算法指南,第 1 部分
注意:这是 2 部分系列的第 1 部分。后续帖子见 此处 。
在数据科学中,计算机科学和统计学融合在一起。作为数据科学家,我们使用统计原理来编写代码,以便我们可以有效地探索手头的问题。
这至少需要对数据结构、算法和时空复杂性有一个基本的了解,这样我们才能更有效地编程并理解我们使用的工具。对于较大的数据集,这变得尤为重要。我们编写代码的方式会影响我们分析数据的速度,从而得出相应的结论。在这篇文章中,我将描述大 O 符号作为一种描述时空复杂性的方法,并简要回顾一些与时间复杂性相关的算法。在以后的文章中,我将讨论与空间复杂性相关的算法。
大 O 批注
在编程中,算法是为了实现特定目标而遵循的一个过程或一组规则。一个算法的特征是它的运行时间(运行时间),无论是空间还是时间。作为数据科学家,我们对最有效的算法感兴趣,这样我们就可以优化我们的工作流程。
在计算机科学中,大 O 符号用于描述一个算法增长有多“快”,通过比较算法内的运算次数。这将在后面进一步详细解释,但现在,让我们理解所有的正式符号。
形式符号
- 大ω:最好的情况。算法的大ω描述了算法在最佳情况下运行的速度。
- 大 O:最坏的情况。通常,我们最关心的是大 O 时间,因为我们感兴趣的是一个给定的算法在最坏的情况下会运行多慢。我们如何从本质上让“最坏的情况”不那么糟糕?
- 大θ:这只能用来描述一个算法的运行时间,如果大ω和大 O 相同的话。也就是说,算法的运行时间在最好和最坏的情况下都是相同的。
因为我们最关心的是一个算法的大 O,所以这篇文章的其余部分将只关注大 O。
我们如何用大 O 来描述一个算法?假设你想在电话簿中搜索某人的名字。
Phone books: before Google was a thing
找到这个人最直接的方法是什么?你可以查遍电话簿上的每个名字直到找到你的目标。这就是所谓的简单搜索。
如果电话簿很小,只有 10 个名字,这是一个相当快的过程。但是如果电话簿里有 1000 个名字呢?
在最好的情况下,你的目标的名字在列表的前面,你只需要检查第一项。在最坏的情况下,你的目标的名字在电话簿的最后,你需要搜索所有 1000 个名字。随着“数据集”(或电话簿)大小的增加,运行简单搜索所需的最长时间也呈线性增加。
在这种情况下,我们的算法是一个简单的搜索。大 O 符号允许我们描述最坏的情况是什么。最坏的情况是,我们将不得不搜索电话簿中的所有元素( n )。我们可以将运行时间描述为:
O(n) where n: number of operations
因为操作的最大数量等于我们的电话簿中元素的最大数量(您可能需要搜索所有元素来找到您的目标的名字),所以我们说简单搜索的大 O 是 O( n )。一个简单的搜索绝对不会比 O( n )时间慢。
不同的大 O 运行时间
不同的算法有不同的运行时间。也就是算法增长速度不同。从最快到最慢,最常见的大 O 运行时间是:
- O(log n ):又名日志时间
- O( n ):又名线性时间
- O( n 日志 n )
- O( n )
- O( n !)
大 O cheatsheet 对于不同运行时间的快速图形表示以及它们之间的相互比较也非常有用。
A graphical representation of common Big O run times (credit: http://bigocheatsheet.com/)
在这篇文章及其后续文章中,我将描述由这些不同的运行时描述的常见算法。
笔记
在讨论一些常用算法之前,有一些重要的原则需要理解。
递归:递归是指函数调用自己。也许递归的典型例子是阶乘函数的实现:
def factorial(n):
if n < 1: #base case
return 1
else: #recursive case
return n * factorial(n-1)
该函数在函数自身内被调用,并且将继续调用自身,直到到达基本情况(在本例中,当 n 为 1 时)。
分而治之(D & C): 一种解决问题的递归方法,D & C (1)确定问题的最简单情况(也称为基本情况)和(2)减少问题,直到它现在是基本情况。
General overview of divide & conquer technique (credit: http://bigdata.ices.utexas.edu/project/divide-conquer-methods-for-big-data-analytics/)
也就是说,一个复杂的问题被分解成更简单的子问题。这些子问题被解决,然后它们的解决方案被组合以解决原始的、更大的问题。
常见算法
搜索和排序算法可能是首先要理解的最重要的算法。
搜索
简单搜索 这在前面的电话簿示例中已经描述过了,最糟糕的情况是需要搜索电话簿中的所有名字,然后才能找到感兴趣的名字。一般来说,简单搜索的时间为 O( n )。所需的最大时间与列表中元素的数量成线性关系。
二分搜索法
让我们继续以电话簿为例。我们仍然对在电话簿中查找某人的名字感兴趣,只是这一次我们将尝试更有效地查找。我们将从电话簿的中间开始,从那里开始,而不是单调乏味地浏览电话簿中的每一个名字。
假设我们的目标名字以一个 P. 开头,我们打开到大约在字母表中间的 M s。我们知道在字母表中 M 比 P 早,所以我们可以删除从 A 到 M 的部分。现在我们可以查看电话簿的后半部分( N 到 Z ),从中间分割该部分(到 Ts ,并与我们的目标进行比较。在字母表中,T 比 P 靠后。我们然后知道要剔除后半部分( T 到 Z )。我们现在专注于 N 到 S ,把这个分成两半等等,直到找到我们感兴趣的名字。
一般来说,在二分搜索法,你把你的排序后的(这很重要)数据,找到中点。每一次,你都将你的目标与中间值进行比较。如果目标值与中间值相同,那么您的工作就完成了。否则,根据比较,你就知道应该消除列表中的哪一半。继续分割,直到找到目标或数据集无法再被分割。
Diagram of binary search with a list of numbers
因为二分搜索法涉及到数据集的减半,所以大 O 时间是 O(log n )。因此,它比简单搜索更快,尤其是当数据集增长时(该算法的增长不是线性的,而是对数的,因此相对于 O( n ))的线性运行时间,它增长得更慢)。
顺便说一句,二分搜索法可以递归编写,但不认为是 D&C 算法。尽管较大的输入确实被分解成子集,但是如果这些子集不包含感兴趣的值,它们将被忽略。没有为这些子集产生解决方案,因此它们可以被组合以解决更大的输入。
分类
选择排序 很像简单的搜索搜索算法,选择排序可能是最直接的,对你的数据进行排序的‘蛮力’方式。本质上,您遍历列表中的每个元素,并按照所需的顺序将每个元素添加到一个新列表中。例如,如果您对从最大到最小的数字列表排序感兴趣,您可以:
- 在列表中搜索以找到最大的数字
- 将该号码添加到新列表中
- 转到原始列表,再次搜索以找到下一个最大的数字
- 将该号码添加到新列表中,以此类推…
对于选择排序,您必须遍历列表中的每一项(这需要花费 n 次,就像简单搜索一样),并且您必须这样做 n 次(不仅仅是一次,因为您必须不断返回到原始列表以找到您想要添加到新列表中的下一项)。因此,这需要 O( n 时间。
快速排序与选择排序有什么不同?如果我们像以前一样处理一系列数字:
- 从列表中选择一个元素,称为轴心。枢纽的选择对于确定快速排序算法的运行速度非常重要。现在,我们可以每次选择最后一个元素作为轴心。(关于 pivot 选择的更多信息,我推荐斯坦福 Coursera 算法课程。)
- 对列表进行分区,使所有小于主元的数字都在它的左边,所有大于主元的数字都在它的右边。
- 对于列表的每一半,你可以把它当作一个有新支点的新列表,重新排列每一半,直到它被排序。
Diagram of quicksort with a list of numbers
快速排序是 D&C 算法的一个例子,因为它将原始列表分成越来越小的有序列表。然后将这些较小的有序列表组合起来,得到一个较大的有序列表。
快速排序是独一无二的,因为它的速度取决于枢轴选择。在最坏的情况下,它可能需要 O( n )的时间,这与选择排序一样慢。但是,如果 pivot 总是列表中的某个随机元素,则 quicksort 平均运行时间为 O( n log n )次。
假设我们仍然在处理我们的数字列表。对于合并排序算法,列表将被分解成单个元素。然后从这些元素创建有序对(较小的数字在左边)。然后,这些有序对被分组为四个有序组,这一过程一直持续到最终的合并排序列表被创建。
Animated overview of mergesort algorithm (credit: By Swfung8 — Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=14961648)
与 quicksort 一样,mergesort 是一种 D&C 算法,因为输入列表在被组合以产生更大的原始列表的有序版本之前被分解和排序。
Mergesort 运行 O( n log n )次,因为整个列表被减半(O(log n )),并且这是针对 n 个项目完成的。
算法和数据结构的知识对数据科学家很有用,因为我们的解决方案不可避免地是用代码编写的。因此,理解我们的数据结构以及如何从算法的角度思考是很重要的。在我的下一篇文章中,我将描述常见的数据结构、空间复杂性和常见的相关算法。
其他有用资源:
数据科学家的数据结构和算法指南,第 2 部分
在我的上一篇文章中,我描述了大 O 符号,为什么它很重要,以及常见的搜索和排序算法及其时间复杂度(本质上,一个给定的算法在数据大小变化时的运行速度)。现在,有了基础知识,我们可以开始讨论数据结构、空间复杂性和更复杂的绘图算法。
空间
以前,我使用大 O 符号来描述一些常见的搜索和排序算法的时间复杂度。大 O 也是用来形容空间复杂度的。毕竟,时间不是我们可支配的唯一有限资源。任何计算机都只有这么多的空间(也称为内存),任何给定的算法也可以用它需要的工作存储量来表征。可以想象,随着我们感兴趣的数据集的增长,空间变得更加令人担忧。
当处理数据时,选择正确的数据结构允许我们优化时间和空间,这样我们的管道运行得足够平稳,允许我们得出结论
数据结构
数据可以以不同的方式存储;存储的方式确实是依赖于上下文的。
让我们从由它们的排序行为定义的更抽象的数据结构开始。这些数据结构被称为堆栈和队列,在许多语言中可能没有正式的实现,尽管它们可以并且经常是手动实现的。
它们的重要性主要在于解释管理数据和访问内存的不同方式。随着数据量的增加,数据结构的选择变得越来越重要;与各种操作相关的大 O 时间取决于数据结构。栈和队列,作为概念,告知基本数据结构(如列表和数组)是如何组织的。实际上,堆栈和队列也经常被合并到许多算法中,并且是这些算法如何工作的组成部分。
栈
后进先出(LIFO)排序。添加到堆栈中的最后一个项目总是第一个被移除。为了理解堆叠是如何工作的,想象一个假设的盘子堆叠。
你总是把一个新盘子放在盘子堆的顶部(或末端)。当你想要一个盘子时,你可以从盘子堆里拿最上面的(或者最近添加的)盘子。添加(“推入”)到堆叠中的最后一个板首先被移除(“弹出”)。
您可能在处理列表时认识到了这个“推送”和“弹出”术语(实际上,在本文的后面,我们将把列表(或数组)称为数据结构)。
visual representation of a stack
队列
先进先出(FIFO)。添加到队列中的第一个项目将总是第一个被删除。这最好用一个实际的排队人群来说明。
第一个进入队列的人也将是第一个接受所需服务的人,对吗?这正是队列作为数据结构的工作方式。最新的项目仍然被推到队列的末尾,但是第一个项目首先被弹出。
既然我们理解了堆栈和队列,我们就可以描述我们通常会遇到的具体的数据结构实现。
具体数据结构
我们如何将这些抽象结构(栈和队列)与我们经常遇到的数据结构协调起来呢?
数组一个数组由一个线性的项目集合(称为元素)组成,连续存储在内存中。任何给定的元素都可以使用数字索引来访问,该索引指向元素在数组中的位置。在 Python native 中,这是用 list 类型实现的。
哈希表 在哈希表中,唯一键映射到值。在 Python 原生语言中,字典是哈希表的实现。
图表
作为一种抽象数据结构,图由节点和边组成,以模拟连接。想想一个人如何建立一个社交网络模型:
How are Bob, Sue, and Joe connected?
对于任何给定的节点,它的邻居构成了它所连接的所有节点。需要注意的是,上图是一个有向图的例子(节点是箭头,表示连接的单向方向)。因为苏和乔有联系(联系从苏到乔),所以乔是苏的邻居。然而,苏不是鲍勃的邻居。这种关系是单向的。
对于无向图,边不是箭头,关系是双向的。
在这样的无向图中,乔和鲍勃都是苏的邻居。
树
熟悉决策树的人应该已经知道树的一般结构。
every tree has a single root node from which all other nodes stem. each ‘child’ node will only have one parent node.
每棵树都有一个根节点,它实质上是所有其他节点的“起点”。任何两个节点之间都只有一条路径(而对于常规图,两个节点之间可以有多条边)。
由于决定它们各自结构的特征,通常用图来模拟网络,用树来模拟层次结构。图和树之间还有许多其他的差异,但这是最重要的一点。
然而,相同的算法对图和树都起作用(尽管由于结构的不同,实现方式不同)。因为图和树用于通过节点和边来建模关系,所以这种算法旨在沿着这些边“搜索”以表征任何给定节点之间的距离(和连接程度)。
图形/树遍历
有不同的方法来遍历(搜索)这些结构,以便我们可以从起始节点找到感兴趣的节点。
这为什么有用?实际上,你可以做这样的事情:
- 找到去教室的最快路线
- 找到赢得象棋的最短路径
- 在“迷宫”中找到通向出口的路径
- 在你的 LinkedIn 网络中找到最近的 X 公司关系
从这些例子中可以明显看出,我们可以将许多问题建模为图,然后使用图搜索算法来解决这些问题。我们使用这些算法来评估(1)感兴趣的节点之间是否存在路径和/或(2)这些节点之间的最短路径。
这些算法最容易用树来解释(由于它的层次性)。然而,这也适用于图形。
广度优先搜索(BFS) BFS 从根节点(或图形的某个随机节点)开始,在移动到下一个深度之前,它检查第一个“级别”或深度的所有节点。BFS 通常用于评估任意两个给定节点之间是否存在路径,以及这两个节点之间的最短路径。
numbers correspond with the search order
实现是如何工作的?让我们考虑一下 BFS 要求的行为:第一个项目(根)也是第一个被搜索的项目(一旦被检查,就被删除)。这是先进先出(FIFO) 行为,因此将使用队列来顺序检查节点,直到找到目标。
这可能会令人困惑,所以让我们用更高级的术语来描述它。
我们使用图(或树)结构来描述关系。因为图是抽象数据结构,所以必须使用具体的数据结构(将每个节点映射到其相邻节点)在代码中手动实现。现在我们需要在图上实现我们感兴趣的算法(BFS)。因为 BFS 的特点是 FIFO 行为,我们使用队列结构来手动实现 BFS。
抽象地说,我们可以说树结构是用来描述关系的。堆栈和队列结构用于描述行为。
BFS 在日常生活中有什么用处?
你对 X 公司感兴趣,你想在你的关系网中找到在 X 公司工作的人。你更喜欢找一个和你“更亲近”的人;一级连接比四级连接更可取。这对 BFS 来说再好不过了。你先搜索你的一级人脉(先加的),再搜索你的二级人脉(他们的朋友)等等。
深度优先搜索(DFS) DFS 从根节点(或图的某个随机节点)开始,在回溯之前沿着单个分支一路向下搜索。
numbers correspond with the search order
与涉及队列实现的 BFS 不同,DFS 涉及堆栈的实现。总是首先检查根节点(在 BFS 和 DFS 中)。如果它不是感兴趣的节点,它的后续子节点将被添加到堆栈的顶部:
- 节点 8、7 和 2 按此顺序添加到堆栈中。此时,节点 2 位于堆栈的顶部
- 栈顶(节点 2)被检查。如果它不是感兴趣的节点,它的子节点,即节点 6 和 3,将按此顺序添加到堆栈的顶部。此时,节点 3 位于堆栈的顶部。
- 栈顶(节点 3)被检查。如果它不是感兴趣的节点,它的子节点,即节点 5 和 4,将按此顺序添加到堆栈的顶部。此时,节点 4 位于堆栈的顶部。
- 节点 4 已选中。它没有孩子。如果不是感兴趣的节点,则检查下一个节点(节点 5)。
诸如此类…
DFS 通常用于更复杂的算法中。
与树不同,图可能是循环的(每个节点可以有一个以上的连接,因此,存在返回到同一个节点的风险)。当与图形结构一起使用时,这些算法变得更加复杂。我推荐斯坦福算法课程了解更多信息。
BFS 与外勤支助部
BFS 和 DFS(以及相关的运行时间)的使用确实因数据和图/树结构而异。
两种算法的时间复杂度相同。在 BFS 和 DFS 中,每个节点只被访问一次。big-O 时间是 O(n)(对于树中的每个节点)。
然而,这些算法的空间复杂度各不相同。
对于 BFS,它遍历树中给定深度的所有节点,并使用队列实现,树的宽度很重要。BFS 的空间复杂度是 O(w ),其中 w 是树的最大宽度。
对于 DFS,它沿着一个“分支”一直向下,并使用堆栈实现,树的高度很重要。DFS 的空间复杂度是 O(h ),其中 h 是树的最大高度。
Dijkstra 算法
对于 BFS,我们假设所有的树都没有加权。最短路径简单地定义为具有最少边的路径。
像 BFS 一样, Dijkstra 的算法也试图找到节点间的最短路径,但它是在加权图(有向无环图)上操作的;这些边具有不同的权重或一些成本(如时间或距离)。
因为边将具有不同的权重,所以任意两个给定节点之间的最短路径不一定是具有最少线段的路径。Dijkstra 的算法识别总权重最小的路径。
流程1。从起始节点,找到并访问“最便宜”的节点
assume cost is in minutes. from start, go to node A (has the lowest cost, 3 versus 10)
到节点 A 的时间:3
到节点 B 的时间:10
到结束的时间:无穷大(未知)
2.在这个新节点上,更新其相邻节点的成本(对于任何给定的邻居,可以通过计算从起始节点到那里的成本来完成)。
2a。如果先前访问的任何相邻节点的成本发生变化(您必须访问图中的每个节点,因此成本可能会发生变化),您必须更新任何成本。
time to node B is updated from 10 to 7 minutes (fastest path is through node A)
到节点 A 的时间:3
到节点 B 的时间:7
到结束的时间:8
3.对图中的每个节点重复上述步骤。
focus on node B now
不需要更新权重。
到节点 A 的时间:3
到节点 B 的时间:7
到结束的时间:8
4.计算最终的最低成本路径。
最短路径仍然是通过节点 a。
数据结构的大时代
对于任何给定的数据结构,访问、搜索、插入和删除都有不同的运行时间。
例如,对于一个数组,如果删除了任何给定的元素,所有后续的元素都必须相应地移动。访问数组非常快(O(1)),因为元素在内存中是连续排列的,并且可以通过索引来访问。但是连续排列使得与删除相关的 big-O 时间变得更糟。
source: http://bigocheatsheet.com/
随着数据结构基础的下降,我认为简要讨论两个在讨论算法时经常使用的主题可能会有所帮助。
贪婪算法
贪婪算法是一种快速找到最大值或最小值的方法。它用于描述常见的算法,如决策树分析(根据熵减少的多少在每一步做出决策)。
背包问题是描述贪婪算法如何工作的一种常见方式。
假设你有一个背包,一个只能装 20 磅的背包。你面前有几样东西,每样都有不同的重量和价值。你想最大化你放入背包的物品的总价值,而不超过背包所能承载的最大重量。(假设尺寸不是问题。)
- 笔记本电脑:2200 美元(3 磅)
- 显示器:2500 美元(18 磅)
- 扬声器:1500 美元(15 磅)
第一步,你伸手去拿价值最高的东西,显示器。在第二步,你会拿到下一个最高价值的物品,笔记本电脑。然而,背包只能容纳 20 磅,所以现在没有更多的空间放笔记本电脑或任何其他物品。你有价值 2500 美元的物品。
最佳解决方案实际上是带上笔记本电脑和扬声器。你不会超过 20 磅的最大重量,并且会有价值 3700 美元的物品。
背包问题说明了贪婪算法的过程及其缺陷。它并不完美,当然,贪婪算法也不能保证你得到最优解。但它离工作地点很近,有时,这就是你所需要的。最终,你的包里仍有价值 2500 美元的物品。
动态规划
与贪婪算法相反,d 动态规划是一种详尽的问题解决方法,它涉及将一个大问题分解成子问题并解决这些子问题。保证能找到最优解。在每一步之后,基于先前的决策做出决策,并且可以重新考虑先前的步骤(参见上面的 Dijkstra 算法中的动态规划示例)。
它不同于也涉及子问题的分治(D&C)方法。D&C 涉及递归解决子问题,然后组合这些解决方案来解决更大的问题。动态规划解决重叠子问题(考虑与到达任何给定节点相关的成本如何取决于先前访问的节点)。每个子问题只需要解决一次,因为每个子问题的解决方案都存储在一个表中,如数组或哈希表(称为记忆)以供将来参考。
我希望大家清楚为什么理解数据结构和算法对于数据科学的成功工作如此重要。当然,除了我的博客帖子所涵盖的内容之外,还有更多的内容,我鼓励你寻找更多的资源来真正丰富你对这个主题的理解。下面是我推荐的一些资源(也列在我之前的博文中):
TensorFlow 路演的一天
TensorFlow Roadshow Bangalore
TensorFlow 最初是由谷歌大脑团队的研究人员开发的内部项目,现在已经成为 2018 年最受欢迎的软件库( Stack Overflow 的 2018 年调查)。谷歌在 2015 年将 TensorFlow 开源,从那以后,它一直在不断发展,在社区方面也在增长。这是一个令人鼓舞的因素,不仅让谷歌变得更好,让更多的研究人员可以访问,也让机器学习社区尝试这个库,并用它来建立模型,从而解决了许多关键问题。关注社区的反馈确实对 TensorFlow 有所帮助,TensorFlow 团队一直在以多种方式与社区互动。昨天,TensorFlow 团队在班加罗尔为机器学习社区组织了一次路演,并进行了精彩的会议。
此次路演出席人数众多,谷歌开发人员关系主管 Karthik Padmanabhan 对开发人员社区表示欢迎并致辞。在过去的几年里,机器学习,更具体地说是深度学习,改变了许多关于技术如何影响人类生活的事情。深度学习的进展导致了计算机视觉和 NLP 相关任务的快速发展。在所有这些进步的帮助下,ML 使许多以前想都不敢想的事情成为可能。TensorFlow 作为一个帮助构建机器学习解决方案的库,正在通过让研究人员将他们解决问题的想法转化为现实来推动机器学习向前发展。Dushyantsinh Jadeja 开始了当天的第一场会议,强调了 ML 在我们生活中的不可避免性,以及 TensorFlow 如何帮助构建了一些改变生活的解决方案。
TensorFlow 用于解决许多问题,如在天文学中检测新的太阳系和行星,通过使用传感器进行实时检测来避免砍伐森林,并自动警告任何非法活动,评估谷物质量,更好地帮助农民和农业,最积极的是,在医学领域帮助医生做出更好更快的决定。作为一个有潜力解决这类问题的库,TensorFlow 成为 ML 使用最多的库之一并不奇怪。
TensorFlow 的项目经理 Sandeep Gupta 在当天的第一次演讲中简要介绍了一些主要的和最常用的 TensorFlow 模块和功能。TensorFlow 提供高级 API,如 Estimators、tf.data 和非常受欢迎的 Keras API,使构建机器学习模型变得简单快捷。保存的 TensorFlow 机器学习模型可以使用 TFLite 转换并部署到移动设备上。TF.js 使 JavaScript 开发人员能够在浏览器本身利用机器学习。Tensor2Tensor 是一个独立的库,提供现成的数据集和模型。当天晚些时候,我们进行了非常有用的讨论,深入了解了一些有用的工具和库的细节。虽然 TensorFlow 到目前为止有超过 1600 名贡献者,但他们中的大多数人都来自谷歌之外!
Using TensorFlow to Prototype and train models
建立机器学习模型来解决问题包括几个步骤,从数据收集开始,直到保存和部署训练好的模型。Amit Patankar 使用一个心脏病数据集来快速带领我们完成建立机器学习模型的不同步骤。在这样做的同时,他还展示了评估者如何通过提供可以尝试和评估的不同模型来使这一过程变得更容易和更好。这时是沃尔夫·多布森上台的时候了。为了在 TensorFlow 中编码和运行任何东西,首先需要创建一个包含所有必要组件的图,然后从一个会话中运行该图。虽然这种执行模式有其自身的优点,如更好的优化、简化的分布式培训和部署等,但这种方法可能会有点乏味,而且对初学者不太友好。与此相反的是急切执行模式,在这种模式下,执行会立即发生,不需要会话。对于初学者和研究人员来说,这听起来要好得多,可以对他们的模型进行原型化和编码。但是这里的权衡正在失去前一种方法带来的优势。如果我们能获得两种方法的优点,那不是很好吗?这就是亲笔签名的作用!
AutoGraph — Credit
AutoGraph 以 eager 模式获取代码,并将其转换为等价的图形。上面的图片是一个例子,它展示了代码在两种模式下是多么的不同,以及 AutoGraph 是多么的有用!通过使用 AutoGraph,可以在 eager 模式下构建原型,在 Graph 模式下部署。Wolff Dobson 还谈到了将于明年发布的 TensorFlow 2.0 正在进行的工作,并要求社区通过 RFCs(征求意见)流程参与设计决策。
接下来的两个演讲是关于使用分布式计算和加速器的 TensorFlow。Priya Gupta 谈到了分布式张量流。根据使用的数据集、选择的架构和其他一些因素,训练机器学习模型可能需要几分钟到几天或几周的时间。与非分布式模式相比,分布式培训有助于大幅减少培训时间。在这种模式下,集群(一组工作器/处理器)用于图形执行,而不是单个处理单元。这不仅导致更少的训练时间,而且导致更好的性能,这可以通过最小的代码改变来实现。TPU 是张量处理单元,具有强大的计算能力。TPUs 与分布式 TensorFlow 一起为构建深度学习模型提供了很好的结果。在他的演讲中,Sourabh Bajaj 解释了快速发展的深度学习方法的计算需求如何导致 TPU 的设计和开发。
Distributed TensorFlow
在建立机器学习模型时,除了代码之外,还有许多事情需要考虑和担心。收集数据,为模型训练做准备是一个耗时的过程。由于模型的性能和准确性高度依赖于用于训练的数据,因此数据验证和转换非常重要。在高层次上,机器学习模型获取数据并从中学习,以输出可用于推理的训练模型,将此用于生产涉及许多约束和要求。TensorFlow 不仅专注于构建和部署模型,还在增加对机器学习管道其他部分的支持,TensorFlow Extended (TFX)正是这样做的。Kenny Song 通过一系列幻灯片解释了 TFX 是什么以及它的作用。TFX 是一个端到端的 ML 平台,它提供库来验证和分析训练和服务的不同阶段的数据,分析不同数据切片的训练模型等。他还谈到了 TF Hub,这是一个可重用机器学习模块的存储库。模块包含 TF 图及其为某些特定任务训练的学习权重。这些模块可以按原样用于相同的任务,也可以通过一些修改来重用,以解决类似的其他任务。
TFX
仅在几年前,没有多少人会想到在浏览器中训练和运行机器学习模型。但这现在已经成为现实,这要归功于 TensorFlow.js. Sandeep Gupta 就此发表了另一篇演讲,他分享了 TensorFlow Playground 如何为 TensorFlow.js 铺平了道路。Playground 是一种交互式神经网络可视化工具,旨在从浏览器运行。开发这个工具的团队必须做大量的工作,因为移植这个机器学习工具以从浏览器运行涉及一些障碍和限制。在这样做的同时,他们意识到了将机器学习引入浏览器的潜力。从浏览器运行 ML 模型有很多好处——不需要安装驱动程序,它是交互式的,与传感器连接良好,数据与用户在一起。所有这些导致了 TensorFlow.js,它是一个用于在浏览器中构建和部署 ML 模型的 JavaScript 库。对于一些可以在你的浏览器上运行的很酷的 ML 项目,请看博客末尾的链接。
Edge TPU — Credit
如果模型能在高端设备上高效运行,这还不够。随着手机成为最常用的设备,让 ML 模型尽可能高效地在低端设备上运行的探索也取得了一些成果。软件工程师 Andrew Selle 是 TensorFlow 团队的一员,他带我们了解了 TensorFlow Lite,该软件使移动和嵌入式设备能够运行 ML 模型。直接从设备运行 ML 模型有很多优点。由于不需要联系任何服务器来进行推断,移动 ML 导致了更低的延迟,并且不依赖于数据连接。在这种情况下,数据完全不在设备上,因此避免了任何隐私问题。但这是一项具有挑战性的任务,因为手机和嵌入式设备内存紧张,能耗低,计算能力差。TFLite 使这成为可能,并且已经被许多应用程序用于生产。边缘 TPU 是 TPU 的变体,开发用于为移动通信的边缘设备供电。
TensorFlow for art and music
随着 ML 在几乎每个领域都找到了自己的位置,艺术家们也投身其中。使用 ML 来提出某种艺术形式已经成为一种日益增长的兴趣。ML 被用来创作自己的绘画、作品、音乐等。Magenta 是一个 TensorFlow 项目,用于使用机器学习生成艺术和音乐。沃尔夫·多布森再次登上了舞台,最后一次讲述了这神奇的一天。他向我们展示了使用 TensorFlow 构建的一些播放音乐和游戏的应用程序的演示。
成为技术的一部分是一个激动人心的时刻。像这样的会议可以提供很多东西,通过参加这样的社区活动,人们可以了解和学习到很多东西,这是令人惊讶的。除了非常有用的谈话,见到 TensorFlow 团队和其他 ML 研究人员真的很高兴。感谢整个谷歌印度团队为社区组织了许多这样的精彩活动!
谷歌为任何对 ML 感兴趣的人免费提供许多资源,从初级速成课程到研究级博客。我写了一个博客,上面有很多这样有用的资源,你可以在这里找到——谷歌知道如何教。
你觉得这篇文章有用吗?欢迎留下任何反馈/意见。感谢阅读!!
连接:LinkedIn,Twitter和我的 博客***。***
有用链接:
[## AutoGraph 将 Python 转换为张量流图
亚历克斯·维尔奇科,丹·摩尔多瓦,沃尔夫·多布森
medium.com](https://medium.com/tensorflow/autograph-converts-python-into-tensorflow-graphs-b2a871f87ec7) [## 可教机器
可教机器:探索机器学习,活在你的浏览器里。
teachablemachine.withgoogle.com](https://teachablemachine.withgoogle.com/) [## Metacar:浏览器中自动驾驶汽车的强化学习环境。
算法:Q-用表学习在这个例子中,目标是演示一个简单的 a…
www.metacar-project.com](https://www.metacar-project.com/) [## 用神经网络绘制在一起
更新(2018 . 8 . 2):sketch-rnn 已经移植到 Magenta.js 项目下的 TensorFlow.js!看一看…
magenta.tensorflow.org](https://magenta.tensorflow.org/sketch-rnn-demo) [## MusicVAE:使用机器学习创建乐谱调色板。
当一个画家创作一件艺术品时,她首先在艺术家的调色板上混合和探索颜色选项,然后…
magenta.tensorflow.org](https://magenta.tensorflow.org/music-vae) [## 谷歌知道如何教学
“够了够了!我受够了!”我脑袋里面的声音就是这样磨了几个小时才向我吼的…
towardsdatascience.com](/google-knows-how-to-teach-45e531ab3ada) [## 通过 Magenta.js 连接音乐
编者按:在过去的几个月里,我们注意到许多由 creative.ai 的 Tero Parviainen 开发的令人印象深刻的应用程序…
magenta.tensorflow.org](https://magenta.tensorflow.org/blog/2018/05/03/connecting-with-magenta-js/)
tensor flow Hub—https://tfhub.dev/
https://dl.acm.org/citation.cfm?id=3098021 TFX 纸—
TensorFlow.js 图库—https://github.com/tensorflow/tfjs/blob/master/GALLERY.md
营销分析专家的一天
营销分析是一个多方面的,但往往被误解的做法。这里有一个例子来突出这个角色的多样性。
营销分析通常是任何世界级营销计划的基础。但是会议、采访和会谈让我明白,很少有人了解营销分析的世界。
一些人错误地将营销分析仅仅描述为数字分析——跟踪访问、点击和转化。是的,我们是这样做的,但这不是我们所做的全部。我听说有人把营销分析和市场调查混为一谈。*我和我的市场研究同事密切合作,但我通常不做研究。*有一次,有人愤怒地告诉我,我要为他们在 Spotify 上的广告负责。我从未在 Spotify 工作过。
我热爱我的工作的原因是,我的一天可以从简单的 SQL 编码到成熟的机器学习算法。我的角色是多样的,有影响力;我的分析推动数百万美元的决策。我有机会与每个人见面,从首席财务官到精力充沛的实习生。我观察整个生态系统的数据。我回顾每个产品领域的数据,深入研究产品行为、人口统计信息和文化趋势之间的关系。我将这项工作描述为应用计算社会科学。
为了提升这个价值,并揭示营销分析专业,我总结了“营销分析专业人员的一天”。项目和任务被压缩为 45 分钟的间隔,以确保我能够提供我经常处理的项目的代表性概述。
欢迎来到我作为营销分析从业者的一天。
—
上午 7.30—运行资源密集型 SQL 查询。
我喜欢早到。早餐,咖啡和 SQL 代码。数据库在早上运行最快,因为运行查询和消耗计算资源的分析师较少。我启动了一些需要大量计算能力的大型查询。快跑,你这个甜数据库,你。
上午 8.15——电子邮件和管理。
我的收件箱在嘲讽我。我支持全球各地的营销人员,所以我尽量早点查看收件箱,回答问题,尤其是来自 EMEA 同事的问题,他们刚刚结束一天的工作。
上午 9 点—聚类分析。
聚类时间。我拉起 R(统计软件)开始编码。我正在为基于教育的营销活动寻找产品的低于平均水平的用户。聚类是一种 ML(机器学习)技术,帮助我找到用户的“自然”分组。在这种情况下,我使用 ML 来确定“低于平均水平”的自然定义。我的 ML 工具根据特定的指标给出了从高到低的用户群。我接受低于平均水平的用户定义,这就是我的受众。
Cluster example; Source: CSSA
上午 9 点 45 分——咨询营销同事。
我与营销团队成员会面,帮助他们为即将到来的营销活动制定战略和方法。我们讨论潜在受众、关键绩效指标(KPI)、战略和预算。很有趣。我喜欢创意和头脑风暴。
上午 10:30——查看仪表盘和趋势。
回到我的办公桌,现在是“仪表板审查和电子邮件”时间。我为营销团队维护总共四个自动化仪表板。这些仪表板涵盖人口统计、营销绩效、区域数据细分和营销基准。我的目标是每两周发送一封简短的电子邮件,介绍仪表盘上的趋势。今天,我正在查看并通过电子邮件发送关于区域数据趋势仪表板的更新,查看特定国家的趋势,以帮助国内营销团队。
Tableau example; Source: Analytics Vidya
上午 11.15 分—活动结果分析。
结果时间。法国为期两个月的营销活动刚刚结束,团队正在寻找结果。我调出媒体印象文件开始分析。我们几乎所有的营销都是用测试和控制的形式来衡量的——测试受众接受营销,而类似的控制受众没有接受营销。我使用 SQL 和 R 来比较测试组和控制组的行为。我的目标是看看在产品行为指标上,各组之间是否有统计学上的显著差异。结果和学习进入总结报告卡文档以及我们的基准数据库。
中午 12 点——与产品分析师会面。
午餐会议。我会见了产品数据科学家,他们提供了他们看到的最新趋势和他们建立的新数据表。产品分析师负责理解特定产品领域的深层趋势和细微差别。他们还为自己的产品领域建立和维护关键数据表。作为一名营销分析师,我负责观察所有产品领域的相关性和相互作用。所以我依赖产品分析师的深入见解,并使用他们的各种数据表来衡量营销对用户行为的影响。我们谈论蜂巢表和趋势。 #BigData
下午 12.45——构建机器学习工具的工作会议。
我会见了我团队中的数据工程师。我们正在建立一个机器学习工具,它将自动化我们营销活动的各个部分,以帮助我们进行大规模测试和学习。这是一个令人兴奋的项目。我们花时间讨论算法,将我的 R 代码翻译成 Python,并计算出我们需要建立的数据库。科技爱好者团结起来。
下午 1 点 30 分——预测投资回报率。
回到我的办公桌。我的下一个项目专注于预测一个计划好的营销活动的投资回报率。目标是弄清楚这个活动是否值得投资。如果我开了绿灯,数百万美元将被投入,三个不同的团队将在这个项目上工作——所以我确保我仔细检查了我的数字。我会查看潜在覆盖范围、估计点击率和近似 CPAs(每次收购成本)等指标。我正在平衡快速回复和准确回复的需求。这种玩杂耍的行为是现代营销分析师的通病。我使用基准和多元回归来进行预测。
下午 2 点 15 分——活动的地理测绘。
位置,位置,位置。我将注意力转移到地理和制图上。一些队友已经获准在英国各地的城市创建一个“弹出式”活动计划。我已经在我们的规划和战略会议中预先选择了城市。现在,他们需要明确知道他们应该在城市的什么地方举办活动。他们询问午餐时间人流量大的地点。我使用 R 中带有映射功能的位置数据(我喜欢使用传单映射 API)来创建按位置划分的步行交通热图。我找出前三个地点,发给营销团队。我喜欢这个项目,我是一个喜欢热图的书呆子。
Heat map example; Source: Stack Overflow
3pm——撰写测量计划。
接下来,我需要写营销活动的测量计划部分。所有营销活动计划都必须包括一个衡量部分,概述 KPI、二级指标、目标、目标受众、地理位置和衡量方法。如果有意识或情绪研究的成分,我的研究同事也会添加到这一部分。我们的组织拥有强大的测试和学习文化,因此分析和研究(如果适用)部门会签署所有营销计划。
下午 3.45 分——第二轮邮件。
一天快结束了。我会花点时间查看邮件,回答当天的问题,或者前几天的未决问题。我每天都会收到很多问题,随着时间的推移,我学会了在回答问题时要简洁直接。我尽可能地使用主动的声音。这几天我已经把邮件里的垃圾都删除了,因为时间不够了。我把闲聊留到面对面交谈和咖啡聚会时。
下午 4:30—回顾日本的数据趋势。
我今天的最后一次会议——我正在和我们的日本市场经理讨论行为趋势。他是一个充满激情、风趣的人,喜欢钻研数字。我试着每两个月会见一次国家营销经理,向他们汇报我在仪表盘上看到的最新情况。这也是一个很好的机会听取他们对重要问题、我可以提供额外见解的领域以及他们的推广计划的意见。我打开为日本制作的交互式仪表盘,我们聊起了数据。Tableau 是我处理小型数据集的“首选”,但它无法处理我使用的数据表,所以我还使用了一个内部仪表板工具,可以处理大型(阅读:新标准)数据集。
下午 5.15——设置 SQL 查询通宵运行。
我的一天就要结束了。我的最后一个任务是设置一些 SQL 查询在夜间运行,为明天的分析创建数据表。我通宵运行它们,因为人们回家后有更多的服务器资源可用。当您处理具有数十亿和数万亿数据行的表时,您需要所有您能争取到的服务器资源。
—
如你所见,营销分析专业远远不止点击和转化。这是仪表板、算法、编码和内部咨询的大杂烩。这种多样性是我喜欢这个职业的原因。星期很少是相同的。
希望这篇文章已经强调了营销分析中提供的一些多样性。哦……如果你正在考虑一个结合数据、多样性和影响力的职业,营销分析将是值得考虑的。
深入了解物联网
读安德鲁·明特尔 的《物联网分析》
本周,我一直在阅读 Packt 出版社最近出版的一本名为《物联网分析》的书。这是一本很棒的读物,我绝对可以把它推荐给任何想更多了解这个迷人领域的人。
有很多关于物联网的书,但这本书最吸引我。广告的文字“突破宣传,了解如何从海量的物联网数据中提取可操作的情报”特别吸引我——物联网是一个随处可见的术语,甚至在你最意想不到的地方。此外,它仅在一个月前(2017 年 7 月)出版,因此至少这意味着内容将是最新的,这是一个优势,因为该领域正在快速发展。
我不仅有兴趣了解物联网应用,还有它背后的技术,以及硬件和软件的结合,最后还有一个开发者的视角。这本书的作者是 Andrew Minteer,他目前是一家领先的全球零售公司的数据科学和研究高级总监。他是物联网领域的专家,拥有统计学、软件开发、数据库设计、云架构方面的背景,领导分析团队超过 10 年。从这本书来看,他也是一位伟大的作家。
“物联网分析”面向各种读者群体。在 Packt Publishing books 的序言中,有一个名为“这本书是给谁的”的部分描述了目标读者。最重要的是,这本书面向的是*“目前正在努力利用物联网数据创造价值,或者正在考虑在不久的将来建立这种能力的专业人士。”*这些人可能是"*开发人员、分析从业人员、数据科学家和普通物联网爱好者。"*就成本与收益而言,价值创造的确是一个突出的主题,但同样重要的是物联网数据流的不同组成部分:设备和传感器、网络协议以及数据收集技术。最后,读者将获得数据存储和处理选项及策略的概述,所有这些都以使用物联网大数据集实现商业价值最大化为基本主题。Python、R 以及 Tableau 中都有代码示例。
我喜欢这本书的一点是,作者从零开始,向你解释了人们对“物联网”、“物联网数据”的理解,以及为什么物联网数据不同于其他数据。作者用日常用语来阐述他的观点。例如,他在物联网分析中的第一条规则如下:“永远不要相信你不知道的数据。像陌生人给你糖果一样对待它。”另一个伟大的想法是以一个虚构的场景开始每一章,该场景是一名数据科学家与他的首席执行官进行对话,每次应用新的物联网数据分析场景时,都会接到新的任务,从而带来新的挑战。这些成为每一个新章节的主题,并赋予这本书一定的逻辑。它们读起来也很有趣,给了文本一点空气,因为大多数章节都很复杂。
事情很早就变得复杂了,例如在第 2 章中讨论了物联网设备和网络协议。下一章涵盖了面向云的物联网分析,描述了来自云基础设施市场领导者亚马逊的亚马逊网络服务。AWS 的服务列表长度令人印象深刻,作者在后面的章节中详细介绍了本书的一些相关服务,例如 AWS Lambda 和 AWS IoT 平台。正如作者解释的那样,这种云基础设施是来自各地设备的大量数据的最佳选择——云是处理和分析物联网数据的首选。
下一步是定义收集物联网数据的策略,以便进行分析。在这里,我们进入了大数据技术领域,因此期待来自 AWS、Microsoft Azure 和 Hadoop 生态系统等存储大数据技术的大量关于物联网特定服务的信息。我发现这一章是书中最强的一章,因为它详细解释了多个生态系统的许多不同组件,同时揭开了大数据分析的复杂性。干得好。
本书的后半部分更加实用:您将学习如何使用 Tableau 来探索和可视化数据,使用 R 语言来增强可视化工具,并了解一些特定于行业的示例。外部数据集可以增加现有数据集的价值,并且可能更容易访问,因为有许多免费的在线数据集可用。Tableau 再次用于可视化物联网数据分析的结果,这在准备仪表板时提供了一些很好的建议。
关于将地理空间分析应用于物联网数据的单独一章有点令人失望,因为它相当短,因此不完整。它没有提到最近的物联网和大数据分析工具,如 Esri 的 ArcGIS GeoAnalytics 和 ArcGIS GeoEvent Server。虽然这不是本书的重要部分,但它很容易成为一本书的主题。另一方面,作者解释得很好的是 GIS 中使用的不同文件格式,以及几个开放和封闭源数据库如何处理空间数据。
在关于物联网分析的数据科学的一章中介绍了机器学习概念,以及深度学习和预测。特别关注如何将这些方法用于物联网数据。每一个的核心概念都通过 r 中的例子进行了回顾,同样,如果你是这些主题的新手,这本书是一个很好的资源来解释它们和一些示例代码。由于作者是这些领域的专家,这是一个非常复杂和详细的章节,因此是核心章节,第三章是关于云的物联网分析。最后两章最后关注经济学(预算)和组织数据进行分析的策略。这两者是相互关联的:更多的数据意味着更多的云基础设施成本。如果没有明确的维护策略,数据湖可能会变成数据沼泽。
关于 Python 和 R 的使用,最后说一句:这两种语言在整本书中都有使用,但作者承认 Python 是大型数据集的更好选择,这通常(如果不总是)是物联网数据分析的情况。但是 R 比 Python 更容易实现数据分析,这也是事实(有时)。这也可能是作者的偏好问题,因为他在本书中多次选择 R 而不是 Python。我从这本书中获得的另一个深刻见解是 Linux 在大数据计算集群中的作用。正如作者在第 130 页所写的那样,“……你需要知道如何与 Linux 操作系统进行交互,以进行物联网分析。这是不可避免的,一旦你习惯了,也没那么糟糕。你不需要成为专家,但你需要知道如何找到自己的路,运行程序,并做一些基本的脚本。”这本书提供了许多这样的建议。这是与物联网相关的所有内容的绝佳资源,强烈推荐。
深入探究嵌入——一种语言学方法
所以你可能知道 Word2vec 或者 Glove 甚至 Elmo,甚至可能知道它背后的算法(Skipgram 等)。但是,它们之间的区别是什么,为什么一个比另一个好?这个博客是关于单词嵌入及其解决的语言学问题的,利用了一篇非常棒的关于 ACL 的论文来帮助解释一些语言学概念。
那么首先,什么是嵌入?
它们可以被认为是一个学习查找表,其中输入是一个单词(一位热编码),输出是一个 n 维向量。
Picture from Adrian Colyer
这个博客不是为单词嵌入初学者准备的。如果你是这样的人,请访问 Adrian Colyer 的惊人的帖子,以获得对嵌入、连续单词包和 Skipgram 的良好概述。
所以——让我们从头开始,带着 NLP 的前辈们必须解决的问题:建模语言的问题。我们如何预测哪些单词序列有意义,哪些没有意义?更具体地说,给定一个长度为 t 的句子,其中有单词 w_1,w_2,…,w_t,那么 p(w_1,w_2,…,w_t)是多少,或者一个单词以那个特定顺序一个接一个出现的概率是多少?这将需要准确地表示单词的含义。
那么,建模的真正含义是什么呢?
You in the future when others don’t understand what the big deal is about using the ELMO word embedding over Word2Vec.
一点语言形态学背景
首先,我们需要确保那些只是彼此版本的单词被映射到一个向量上。作为人类,我们知道“吃”,和“吃”有相同的意义,但形态结构不同。单词有一个词干,或引理,在吃和被吃的情况下会是“吃”正如这篇论文所言,“一个词的所有可能的词形都代表了这个词的词素”。
其次,有些词可能看起来很相似,但意思不同。以“蝙蝠”为例蝙蝠可能意味着恐怖电影中的动物,或者是美国最受欢迎的运动之一的击球动作。这两个义,或者说 bat 的意思,被分配到各个词汇单位。
所有这些可能看起来只是一堆术语,所以论文中的这张图表很好地总结了这一点。
单词嵌入的神经网络方法使用直觉
“相似的单词也会被相似的上下文所包围”
从数学上来说,上面可以写成下面的目标函数
其中 x*和 x_t 是在句子中频繁出现在彼此 2N 个单词内的两个单词。
这意味着给定一个焦点词 x_t,Skipgram 将最大化该焦点词周围的相似词 x*的对数概率。通常,神经网络 Skipgram 训练模型的最终隐藏层将被用作单词嵌入。
虽然这一切都做得很好,但基于 Skipgram 的 approach post(在这里解释得很好)基于精确的字符匹配为每个单词分配一个表示。这意味着“bat”只获得一个平均 bat 的各种含义的向量,并将“bat”可能使用的各种上下文编码到一个向量中——这意味着对于该词的每个上下文,表示都将过于一般化(这是一个万事通,无所不能的情况)。然而,Skipgram 将“吃”、“吃”和“吃”映射到不同的单词表示,因为“吃”!=“吃”!=“吃了”,虽然都是同一个词干,来自同一个词汇单位。那样的话,Word2Vec 就太具体了,没有很好地处理多义词,所谓的多义词词。
Yep that’s probably what our NLP forefathers probably felt like
那我们该怎么办?
我们可以通过明确标注词类及其词汇形式来帮助半监督这种方法,从而增加一个额外的步骤。例如,您可以用词类显式地标记语料库中的单词,和/或将其转换为词条。例如,您可以将所有动词“going”替换为“going”。v”(表示词性)和 lemma(“go”),这将允许模型为多义词的各种意义区分和分配不同的向量。
现在,一切都解决了吧?
那么,单词嵌入模型没有见过的单词呢?多次被训练成单词级模型(至少在 Word2Vec 中)的 Skipgram 不能很好地处理这些情况。
其次,不同于诸如去除标点符号的更机械的预处理步骤,必须为每个目标函数和每个 NLP 问题训练单词嵌入。例如,虽然“快乐”和“悲伤”在大多数上下文中可能使用相似,并且都是情绪,但在情感分析的上下文中,这些词的使用非常不同。因此,使用预先训练的模型可能不会很好地工作。
ELMO 来了
今年早些时候推出的 ELMO 使用语言模型方法来解决缺乏可训练性和看不见的单词。
与其他嵌入不同,ELMO 使用基于字符的模型,这意味着不是给它一个单词的热编码,而是给它一个字符的热编码。这意味着它能够处理没有出现在其训练语料库中的单词的表示,从而通过编码其词根和前缀的语义来处理拼写错误的单词或未见过的单词(类似于 GRE 或 SAT 的方式!).如果你有兴趣了解更多关于 ELMO 的信息,请看这篇文章。
ELMO 由多双向 LSTM (biLM)组成,它还在每一层(而不仅仅是最后一层)暴露其输出和隐藏状态,从而允许科学家了解特定 NLP 问题所需的 LSTM 每一层的权重。例如,与更抽象的理解有关的问题,如句子摘要,可能会受益于比第一层嵌入更多地加权 ELMO 的最后几层。
所以,下次你听到有人说,“哦,我就用 Word2Vec 吧,”让他们想想 ELMO、Sense2Vec 和其他单词嵌入方法,以找出哪种方法最适合你的问题和数据集,并针对你自己的特定数据进一步训练嵌入。
如果你对这篇文章有任何编辑或评论,请通过 yp913@nyu.edu 联系我。爱说话:)
参考资料:
介绍性单词嵌入博客
加深对网络英语的理解(上)——CNN
介绍
深度学习和人工智能是 2016 年的热门词汇;到了 2017 年底,它们变得更加频繁,也更加混乱。所以让我们试着一次理解一件事。我们将研究深度学习的核心,即神经网络(NNets)。Nets 的大多数变体很难理解,底层架构组件使它们听起来(理论上)和看起来(图形上)都一样。
感谢阿西莫夫研究所的 Fjodor van Veen,我们有了最流行的 NNet 架构变体的公平代表。请参考他的博客。为了提高我们对网络的理解,我们将每周学习和实现一个架构。以下是我们将在未来几周讨论的架构。
第一周
本周的架构是卷积神经网络或 CNN 。但是在开始 CNN 之前,我们将首先对感知器进行一次小小的深入探究。NNet 是称为感知器的几个单元/单元的集合,感知器是二元线性分类器。让我们快速看一下,以了解相同的内容。
输入x1
和x2
乘以各自的权重 w1 和 w2,并使用函数f
求和,因此得到f = x1*w1 + x2*w2 + b
(偏置项,可选添加)。这个函数f
可以是任何其他的运算,但是对于感知器来说,它通常是求和。该功能f
随后通过允许所需分类的激活进行评估。Sigmoid 函数是用于二元分类的最常见的激活函数。关于感知机的更多细节,我推荐这篇文章。
现在,如果我们堆叠多个输入,并使用函数f
将它们与堆叠在另一层中的多个单元连接,这形成了多个完全连接的感知机,来自这些单元(隐藏层)的输出成为最终单元的输入,最终单元再次使用函数f
和激活来导出最终分类。如下图所示,这是最简单的神经网络。
由于被称为“通用近似函数的 nnet 的独特能力,nnet 的拓扑或架构变体是多样的。这本身就是一个巨大的话题,最好由迈克尔·尼尔森*在这里讲述。读完这篇文章后,我们可以相信这样一个事实:无论多么复杂,NNet 都可以表现为任何函数。上述网络也被称为前馈神经网络或 FFNN,因为信息流是单向的而不是循环的。现在我们知道了感知器和 FFNN 的基础知识,我们可以想象数百个输入连接到几个这样的隐藏层,会形成一个复杂的网络,流行称为深度神经网络或深度前馈网络。*
深度神经网络和 CNN 到底有什么不同?让我们找出答案。
CNN 通过像 ImageNet 这样的竞赛而变得流行,最近它们也被用于自然语言处理和语音识别。要记住的一个关键点是,许多其他变体,如 RNN、LSTM、GRU 等,都是基于与 CNN 相似的架构,但在架构上有所不同。我们将在后面详细讨论这些差异。
使用 3 种类型的层来形成 CNN,即“卷积”、“汇集”和“密集或完全连接”。我们之前的网络是“密集”层网络的典型示例,因为所有层都是完全连接的。要了解更多关于需要切换到卷积和池层的信息,请阅读 Andrej Karpathy 的精彩讲解这里。继续我们对层的讨论,让我们看看卷积层。
(对于下面的讨论,我们将使用图像分类作为理解 CNN 的任务,稍后转移到 NLP 和视频任务)
卷积层:考虑一个 5X5 像素的图像,有1 as white
和o as black
,这个图像被识别为一个 5X5 尺寸的单色图像。现在想象一个具有随机1s and 0s
的 3×3 矩阵,这个矩阵被允许与图像子集进行矩阵乘法,这个乘法被记录在一个新的矩阵中,因为我们的 3×3 矩阵在每次迭代中移动一个像素。下面是这一过程的视觉效果。
上面考虑的 3X3 矩阵被称为“滤波器,它的任务是从图像中提取特征,它通过使用“优化算法来决定 3X3 矩阵中的特定1s and 0s
。我们允许几个这样的过滤器在一个神经网络的卷积层中提取几个特征。3×3 矩阵的单个步骤被称为“步距
下面提供了使用两个 3 通道滤波器产生两个卷积输出的 3 通道(RGB)图像的详细视图。感谢安德烈·卡帕西!
这些滤波器W0 and W1
是“卷积”,output
是提取的特征,由所有这些滤波器组成的层是卷积层。
池层:该层用于使用不同的函数降低输入的维度。一般来说,卷积层之后经常使用" MAX Pooling "层。池化使用 2X2 矩阵,并以与卷积层相同的方式对图像进行操作,但这一次它缩小了图像本身。以下是使用“最大池化或“平均池化”来池化图像的两种方法
密集层:该层是激活层和前一层之间的完全连接层。这类似于我们之前讨论的简单的“神经网络”。
注意:归一化层也用在 CNN 架构中,但它们将单独讨论。此外,池层不是首选,因为它会导致信息丢失。通常的做法是在卷积层中使用更大的步幅。
ILSVRC 2014 年的亚军 VGGNet ,是一个受欢迎的 CNN,它通过使用 16 层网络而不是 ILSVRC 2012 年获奖者 AlexNet 的 8 层网络,帮助世界了解网络深度的重要性。一个即插即用模型“VGG-16”可在 keras 中使用,我们将使用相同的来查看一个获奖的 CNN 架构。
在 Keras 中加载模型后,我们可以看到每一层的输出形状以了解张量维度,以及 Param # 以查看如何计算参数以获得卷积特征。" Param # "是所有特征的每个回旋特征的总权重更新。
现在,我们已经熟悉了 CNN 的架构,了解了它的层次和工作原理,我们可以进一步了解它在 NLP 和视频处理中的应用。这将在下周的文章中讨论,同时介绍 RNNs 以及 CNN 和 RNNs 之间的主要区别。同时,免费阅读自 2012 年以来赢得 ImageNet 竞赛的所有 CNN 模特,此处,感谢 Adit Deshpande!
未来的工作
- 一旦我们讨论了所有的架构,我们将遵循相同的顺序,并使用 jupyter 笔记本来实现它们。一旦我们完成实施,所有的代码链接都将可用。
更新者上的类似帖子
- 合成成分
- 阿达德尔塔
- 阿达格拉德
- 亚当
- 涅斯特罗夫
- RMSPROP
- 签名于
- 共轭梯度
- 黑森自由报
- LBFGS
- 线梯度下降
类似开机自检激活功能
- ELU
- 硬乙状结肠
- 哈尔坦
- 身份
- LEAKYRELU
- 理性坦
- RELU
- RRELU
- 乙状结肠的
- SOFTMAX
- SOFTPLUS
- 软设计
- 双曲正切
感谢您的阅读,希望有所帮助
数据科学入门指南
目标
这篇文章旨在探讨构成数据科学的主要概念和重点。对于每一个概念,我希望有效地传达一个的一般定义,以及对其在该领域所扮演角色的充分的**解释。**以下列表反映了我将涉及的相关子主题:
- 统计数据
- 线性代数
- 编程
- 机器学习
- 数据挖掘
- 数据可视化
统计数字
什么事?
《商业词典》将统计学定义为“数学的一个分支,涉及对数字事实的收集、分类、分析和解释,以便根据其可量化的可能性进行推断”。或者更简单的说,统计学就是收集数字,看数字,从数字中得出结论。
数据科学中的意义
统计学在数据科学实践中有多种发挥作用的方式。这些实践对于解释数据和产生有趣的结果非常有帮助。
实验设计:如果你有一个问题,并且想要得到答案,不管你是否知道,你很可能会进行某种实验来寻找答案。这包括建立实验,处理样本大小,控制组,等等。
**频繁统计:**使用统计实践,如置信区间和假设检验,可以让你确定一个结果或数据点有多重要。能够从数据中计算重要性和其他重要信息将使你成为更强的数据科学家。
建模:回归和聚类等技术经常在数据科学中用于建模工作。无论你是想预测什么,在数据中找到更大的图景,还是理解数据背后的推理;有可能你最终会使用某种预测模型。
有多重要?
这是事情变得有点模糊和意见开始变化的地方。为了更准确地回答这个问题,我建议我们将统计数据分成两组:新的和旧的。
回归和假设检验等旧的统计方法本质上是简单化的。虽然它们很有用,但许多杰出的数据科学家预测它们会越来越少被使用。说明随着我们的前进和统计技术的发展,这些概念可能会变得不那么重要。另一方面,像决策树和预测能力这样的新统计数据非常有用,并且经常被数据科学家使用。
话虽如此,我仍然建议有抱负的数据科学家通过一般的统计理论和实践来工作。即使你不会在日常工作中使用它们,它们仍然非常有助于帮助你进步到更高级的概念,你将在训练分析思维时经常使用它们。
资源
数据科学和统计学有什么区别? : 关于这两个领域区别的精彩解释。
数据科学与统计 : 又一篇关于类似问题的伟大文章。
数据科学家使用统计数据的 7 种方式 : 更详细地介绍了实施目的。
线性代数
什么事?
我个人觉得维基百科的定义是最有帮助的:线性代数是关于向量空间和这种空间之间的线性映射的数学分支。这是一个很好的开始,但是我相信我们可以简化这个定义,让它不那么像教科书。
简单来说,线性代数就是处理空间中直线东西的数学。
数据科学中的意义
以下是当今数据科学中线性代数的一些比较突出的用例:
**机器学习:**大量的机器学习策略与线性代数的各个方面联系在一起。仅举几个例子,有主成分分析、特征值和回归。当您开始处理高维数据时尤其如此,因为它们往往会包含矩阵。
**建模:**如果你想以任何方式对行为进行建模,你可能会发现自己在这样做之前需要使用一个矩阵来将样本分成子组,以便建立准确的结果。这个法案要求你使用一般的矩阵数学,包括求逆、求导等等。
**优化:**了解各种版本的最小二乘法对任何数据科学家都非常有用。**可用于降维、聚类等。**所有这些都在优化网络或投影中发挥作用。
你们中的一些人可能已经意识到矩阵和矩阵这两个词的重复,这不是巧合。矩阵是一般线性代数理论的一大部分。矩阵上使用的这些概念在表和数据框上同样有效,这是数据科学中使用的两种基本结构。
资源
线性代数维基百科页面 : 适合所有教科书式的东西。
线性代数有什么意义?**😗*Quora 上的大线程,特别注意山姆·利希滕斯坦和丹·皮波尼的前两个回答。
一个好的数据科学家应该掌握线性代数的哪些概念? : 另一个优质 Quora 线程,姜黎黎的第一个回答特别有见地。
面向数据科学家的线性代数: 如果你正在寻找一个可以快速浏览基础知识的地方。
编程;编排
有多重要?
如果你计划从事数据科学的职业,你将需要学习如何编码,并且很好地编码。这就是为什么这么多数据科学家有计算机科学背景的原因;这是个很大的优势。然而,如果你不够幸运,没有一些编程经验,那么不要担心,像生活中的大多数事情一样,它可以自学。
什么时候最重要?
我们已经确定,无论你在哪个领域,编程能力都是数据科学家的一项基本技能。尽管如此,通用脚本或命令并不是数据科学中编程真正繁荣的地方。通过编写自动化任务的程序,你不仅节省了以后的宝贵时间,还使你的代码更容易调试、理解和维护。
一般来说,如果你不得不做一件事两次以上,你应该写一个脚本或程序来自动化它。
我应该知道些什么?
让我们转到数据科学中与编程相关的一些关键技能。请记住,下面的列表更侧重于实践技能而不是具体实践(例如,时间管理技能,而不是右外连接)。
开发:如今,许多数据科学家被称为“软件开发人员”,尽管他们执行的任务与数据科学中的任务非常相似。当从事大型商业项目时,熟悉软件开发实践的数据科学家通常比学者更自在。
数据库:数据科学家在不断地使用数据库。为了有效地工作,你需要有这方面的经验。随着面向 NoSQL 和云的数据库的增长,传统的 SQL 数据库急剧下降。然而,雇主仍然希望你对 SQL 命令和数据库设计实践有基本的了解。
协作:协作是软件的关键。毫无疑问,你对这句古老的谚语很熟悉,“一个团队的好坏取决于它最薄弱的环节”。尽管这是老生常谈,但这也适用于任何数据科学团队。你的大部分工作将在小组中完成,因此你需要在与你的团队沟通以及维护关系方面得到提升,以最大限度地提高生产率。
重要实践
如果你问任何软件开发人员或数据科学家,在工作场所编程最重要的方面是什么,他们肯定会用一个词,三个音节的答案来回答:维护。在工作场所,简单、可维护的代码几乎总是胜过复杂的 genius 代码。如果其他程序员不能理解你的代码是否足够好来扩展和维护它,那么你的代码最终是无关紧要的。有几种方法可以轻松提高代码的可维护性。它们如下所示…
**不要在代码中使用“硬”值:**使用变量和输入,它们本质上是动态的,会随着时间的推移而变化,而不是输入任何静态值。代码中的这个小变化将使您的工作更加轻松。
**坚持不懈地记录和注释你的代码:**让你的代码更容易理解的最有效的方法就是疯狂地注释。通过用简洁和信息丰富的轶事进行评论,你将会省去向你的同事解释你自己的无尽转换。
**重构你的代码:**记住,一旦你提交了一段代码,它不会就此结束。不断回顾你过去的工作,寻找优化它的方法,让它更有效率。
资源
数据科学家的软件开发技能 : 这是对编程实践的重要软技能的极好概述。
所谓数据科学家的 5 个维度 : 有趣的是,数据科学家可以扮演不同的角色。密切关注“编程专家”和“数据库专家”。
成为一名数据科学家所需的 9 项必备技能 : 这篇短文的“技术技能”部分提供了很好的信息。
机器学习
什么事?
首先,机器学习是更广阔的人工智能领域的一部分。人工智能是约翰·麦卡锡在 1956 年创造的一个术语,最初定义为“制造智能机器的科学和工程”。在这个领域中,随着时间的推移,机器学习变得越来越重要。
机器学习允许我们教会计算机如何给自己编程,这样我们就不必为某些任务编写明确的指令。
两种类型
机器学习可以分解成两种学习形式:有监督的和无监督的。
**监督学习:**今天大多数实用的机器学习都是使用监督学习来完成的。监督学习是算法从数据中学习的过程,产生预期的结果,然后由用户进行纠正,以便算法在下次运行时提高准确性。因此,通俗地说,把计算机算法想象成学生,把你想象成老师,在需要的时候纠正它,并把它引向正确的方向。
**无监督学习:**虽然这种类型的机器学习目前还没有多少实际用途,但它可以说是更有趣的分支。无监督学习是让算法自己去发现和识别数据中的潜在结构。
数据科学中的意义
机器学习无疑是当今科技领域的一件大事。托尼·泰瑟和约翰·汉尼斯已经分别称之为**、、、。比尔·盖茨在这个话题上也被引用过,他说“机器学习上的一个突破抵得上十个微软”。**
随着自动驾驶汽车、图像分类和语音识别等著名应用的出现,人们可以很容易地看出所有关于机器学习的宣传是什么。这个领域正在迅速发展,所以现在就跟上潮流吧,否则就会被甩在后面。
资源
什么是机器学习?**😗*Quora 上的好帖子,有几个略有不同的答案,旨在定义机器学习。
机器学习简史 : 再深入一点看看机器学习的历史。
有监督和无监督的机器学习算法 : 对机器学习算法类型的清晰、简明的解释。
机器学习的可视化 : 轻松搞定我最喜欢的资源这件事。出色的可视化,带你了解机器学习是如何使用的。
数据挖掘
是什么?
如果你已经仔细阅读了大量的在线数据科学资源,那么你可能已经见过“数据挖掘”这个术语了。但是这种做法到底是由什么组成的呢?看了各种资料后,我觉得最好这样描述:
数据挖掘是探索数据以提取重要信息的过程。
词汇表
根据我的经验,我遇到了数据挖掘中的许多其他主题,我认为了解这些主题会有所帮助。下面你会发现一个快速简单的数据挖掘俚语定义列表。请记住,区分它们可能会很棘手,因为它们都非常相似。
**数据争论:**这是将数据从原始形式转换成更有用形式的行为。它通常由几个重要步骤组成,包括清理和解析成预定义的结构。
**数据争吵:**与上面显示的“数据争吵”完全一样。为什么我们需要两个术语来描述这个过程,我可能永远也不知道…
**数据清洗:**这是一个关键的步骤,包括从数据集中检测并纠正(或删除)损坏的、不准确的或缺失的值。
**数据抓取:**一种计算机程序读入来自另一个程序或网站(如 Twitter )的数据的技术。
数据科学中的意义
每个人都想做出令人敬畏的预测模型,并把令人瞠目结舌的可视化。然而,人们经常忽略的是,在你完成“看门人”的工作之前,这些事情都不会发生。纽约时报最近的一篇文章(将发布在参考资料中)发现数据科学家花费大约 50%-80%的时间来收集和准备数据。
这一严酷的现实需要传达给未来的数据科学家。在丰厚的基本工资和 21 世纪最性感工作的头衔之间,年轻的专业人士在不了解职业现实的情况下盯上了数据科学家的工作。
资源
什么是数据挖掘?**😗*Quora 上一个关于数据挖掘各种定义的好线程。
什么是数据角力? : 简短阐述一下数据角力到底是由什么组成的。
“看门人的工作”是洞察的关键障碍 : 这篇有趣的文章详细介绍了数据挖掘实践在数据科学领域的重要性。
数据可视化
什么事?
数据可视化似乎比其他主题更容易理解。然而,我想你会意识到数据可视化并不像看上去那么简单。让我们从定义我们的主题开始,尽管这看起来有些多余。
数据可视化是通过某种图片或图表传达数据或结果的行为。
一个常见的误解是,视觉化最重要的部分是它看起来有多吸引人。虽然这非常重要,但这不是我们想要表达的意思。最终,我们的目标是以大脑最容易理解的方式交流你在数据中发现的见解。根据 NeoMam Studios 的报道,研究人员发现,彩色视觉效果可以增加读者 80%的阅读意愿
常见类型
现在让我们来看看一些常见的可视化类型。请记住,这绝不是一份详尽的清单。相反,它只是我个人在有生之年遇到的一些最常见的二维可视化。所以给你:
**多维:**这些是处理多个变量的图形和图表。这是你将会看到的最常见的视觉化形式。一些例子包括:饼图、直方图和散点图。
**时间驱动:**所有这些可视化都使用时间作为有效交流数据的基线。这些都是在一段时间内传达变革的有力工具。一些例子包括:时间序列、甘特图和弧形图。
**地理空间:**正如人们可能猜测的那样,地理空间可视化都与位置有关。这些通常用于传达对特定领域或地区的见解。一些例子包括:点分布图、比例符号图和等高线图。
关键要素
所有伟大的数据可视化都有一些共同的关键元素。下面你会发现一个我认为最重要的清单。
**信息:**这涉及到拥有准确一致的信息。如果数据不可靠,你的最终产品是什么并不重要。
你的视觉化应该有意义。它应该是以这样或那样的方式与一个项目或社会相关的东西。如果没人愿意看,制作一个视频还有什么意义呢?
**功能:**无论你在传达的信息多么详尽,你的工作就是让它简洁易懂。**将您的数据转换成对不一定是技术背景的人有用的形式的能力将被证明是非常重要的。**在职场上尤其如此。
吸引力:最后,你的形象需要总体上好看。它应该吸引人,并且赏心悦目。为了做到这一点,你将不得不考虑诸如平衡、颜色、稠度和尺寸等诸多因素。
数据科学中的重要性
**无论你想专注于哪个领域,数据可视化技能对数据科学家来说都非常有用。**能够通过图像而不是文字有效地传达你的数据,会让你的信息更容易理解,反过来,会让你有更大的机会影响你的工作。
资源
什么是好的数据可视化 : 优秀的维恩图解释了优秀的数据可视化的组成部分。上面提到了一些,但是我仍然强烈建议你看一看。
杜克可视化简介 : 贯穿杜克大学图书馆所见的所有数据可视化类型。
数据可视化 Quora 线程 : 关于数据可视化通用话题的一些好问题供进一步阅读。
把它包起来
现在你可能已经意识到了,**数据科学是一个复杂的领域,由各种独特的子主题组成。**对于一名有抱负的数据科学家来说,更清楚地理解这些子主题是朝着正确方向迈出的重要一步。
感谢阅读!如果你喜欢这篇文章,请继续向鼓掌按钮展示你的爱。对更多的帖子感兴趣吗?请务必关注我并订阅下面的我的简讯以接收任何新内容。想了解更多关于我和我在做什么,请查看我的网站。
一种不同的(深度)学习:第 1 部分
自我监督学习导论
深度学习真正重新洗牌了机器学习领域的东西,特别是在图像识别任务中。2012 年,Alex-net 发起了一场解决(或至少显著改善)计算机视觉任务的竞赛(仍远未结束)。虽然主要思想相当稳定(对所有事情都使用深度神经网络),但研究人员采取了非常不同的途径:
- 尝试优化模型架构。
- 尝试优化**训练计划,**例如优化者自己。
- 尝试优化数据,例如它的顺序、大小、多样性等等。
这些研究路径中的每一条都提高了训练质量(速度、准确性,有时还有泛化能力),但似乎做更多同样的事情可能会导致一些逐渐的改进,但不会有重大突破。
另一方面,深度学习领域越来越多的工作表明,当前的方法存在重大缺陷,特别是在泛化方面,例如最近的这个对象旋转时的泛化失败:
因此,似乎有必要进行更积极的改进。或者把研究范围扩大到更冒险的想法。
除了上述方法,还有一些方向试图改变学习范式。可能是:
- 镜头学习
- 半监督学习
- 领域适应
- 自我监督学习
这些方法采用一些不同的训练范式,试图更具创造性,或者模仿一些类似人类的模式。虽然我们还没有从上述方法(和其他方法)中获得重大突破的证据,但它们确实取得了一些不平凡的结果,也教会了我们许多关于训练过程的知识。
在这篇和接下来的文章中,我将尝试讨论一些最有趣的方法,并将这个系列命名为“不同种类的(深度)学习”。我绝不试图预测深度学习的未来发展,而仅仅是描述最近的有趣作品,这些作品可能不会受到关注。这可以为读者提供几个目的:
- 你可能有兴趣了解你不知道的作品。
- 你可能会对自己的工作有新的想法。
- 你可能会在深度学习中了解到你没有意识到逻辑部分和任务之间的关系。
这个系列的第一部分将是关于自我监督学习,这是我写这个系列的主要动力之一。
自我监督学习
想象一下,你有一个搜索网络的代理,它可以从遇到的每张图片中无缝学习。这个想法非常有趣,因为如果它将被实现,深度学习的最大障碍,即注释数据,将(部分)被移除。
但是怎么做呢?嗯,它首先在 text 中提出:文本由人类很好地组织,因此有许多概念可以在没有任何注释的情况下从中学习。预测下一个/前一个单词是一个突出的例子,如在 单词嵌入 和语言模型任务中所做的。
在视觉中,做这样的技巧有点复杂,因为视觉数据(图像和视频)不是人类明确创建的(嗯,一些摄影师可能在他的摄影中投入了一定的思想),但不是每个视频,并且肯定不是每个图像都有任何类型的逻辑结构可以用来提取信号。
不就是另一种形式的无监督学习吗?的确,但是它有一个特殊的微妙之处:因为任务是被监督的(例如分类),但是没有主动的注释发生。这个话题是我的最爱之一,也迅速成为了本文的主要话题。我不能保证这种特定的范式会给深度学习带来最好的成就,但它肯定已经带来了一些伟大的创造性想法。
如上所述,这种任务的名称是自我监督学习。与“弱注释”不同,弱注释意味着图像具有不同的标签、标题或说明,自监督任务被认为除了图像本身没有注释。如果你问从一张没有标注的图片中能学到什么,敬请期待。
着彩色
也许图像中最直观的信号是它的颜色。当大多数计算机化颜色表示中有 3 个通道时,1 或 2 可以无缝地用作注释。
由于给旧图像着色是一项有趣的任务,因此有许多作品致力于此。然而,如果我们考虑全自动着色(这是自我监督的资格),数量减少到相当少。
这种情况下的着色任务形成为“交叉通道编码器”,这意味着图像中的一个(或一些)通道用于编码其他通道。这个概念将在以后的文章中进一步讨论。
最引人注目的彩色纸是张曦轲和阿列克谢·埃夫罗斯的这张。
解决着色任务的常见方法不是使用标准的 RGB 编码,而是使用 Lab 色彩空间。在 Lab 色彩空间中, L 代表亮度(B & W 强度),用于预测 ab 通道(a —绿色到红色,b —蓝色到黄色)。
Colorization with Lab encoding, from [1]
正如我们将在我们讨论的所有任务中看到的,自我监督学习不像我们在深度学习中习惯的那样简单。有一些工件打断了模型实现它的设计目标。此外,有时如果训练没有被仔细检查,模型会制造出“捷径”,这将阻碍它推广到其他任务。
以下是着色任务的一些挑战:
**1。彩色化中固有的模糊性:**很明显,对于一些图像来说,有不止一种似乎合理的彩色化。这个问题会在培训和评估中引起多种问题:
在下面的唐纳德·特朗普图片中,窗帘的颜色可能是红色或蓝色(以及许多其他颜色)。唐纳德的领带可以搭配(也可以不搭配)。给定数据集中领带和窗帘的不同示例,模型将倾向于对它们进行平均,将这些项目用灰色着色。
解:在张的文章中,研究者将彩色化处理为一个分类问题,而不是回归问题。除了使用特殊的损失函数,他们的模型还预测了一个概率分布层,而不是图像的实际颜色,然后将这些概率转换为颜色-从 Lab space 的 313 种可用颜色中选择:
**2。偏向:**实验室不是一个均匀分布的空间。由于云、路面等的高频率,大多数解决方案倾向于较低的值。
解决方案:对损失函数进行重新加权来解决这个问题。
3。评估问题:既然模型可以预测不同的正确答案,例如,如果地面实况是蓝色,模型将选择红色,那么在标准评估中它将被认为是错误的。
解决方案:使用不同的评估方法,其中包括:人类后 hok 分类—“彩色化图灵测试”,要求人们区分真实图像和机器彩色图像。此外,将图像输入图像分类器,将结果与真实图像进行比较。
该模型在彩色化图灵测试中获得了 35%的分数,这……还不算太差。
in this image the machine-colored dog looks more real than the original one
在另一篇最近的论文中,Larson 等人与 Zhang 和 Efros(两篇论文都提到对方)同时工作,并使用了空间定位的多层切片(超柱)和回归损失。他们试图通过预测颜色直方图并从中采样来克服模糊问题:
除了使用 LAB 空间之外,这项工作还试图预测色调/色度属性,这与“HSV”颜色空间有关。
语境
除了颜色预测,下一个最明显的(但也是创造性的)任务是从图像结构中学习东西。更准确地说,试图预测一些关于图像裁剪的事情。
这个任务的灵感直接来自于 word2vec ,或许我们可以称之为图像的“跳过克”。
然而,在文本中,字数受限于词汇量的大小,很可能不会超过一百万。而一个像素接一个像素地完成图像补片占用了大得多的空间。你可能会说 GANs 正是这么做的,但是:
- 确实有大量的正确解,因此很难一概而论
- 我们将在下一部分讨论 gan。
在这种范式中,实际任务不会自然出现:研究人员必须想出模型要解决的“游戏”。会举一些突出的例子:
拼图背景
从图像中提取上下文最简单的方法是使用类似拼图的任务。第一个是由 Doersch 和 Efros 完成的工作:从图像中裁剪小块,并训练模型对它们的关系进行分类。一个例子可以很好地解释这一点:
和着色一样,任务并不简单。具体来说,model 正在寻找“快捷方式”:它可能会学习某些低级特征,如边缘和光照关系,而不是实际学习高级特征及其关系。这倾向于暗示图像部分。
为了解决这个问题,研究人员在补丁上应用了一些抖动(如图所示)
研究人员遇到的另一个问题是通过一些照明伪像预测斑块位置的模型—。这意味着在一些相机中,图像不同部分的颜色分布是不同的。解决方案:这部分是通过一些颜色转换处理的,特别是将绿色和品红色向灰色转移。
下一个突出的成果是诺鲁齐和法瓦罗的这篇论文,它一路走来,使用了一个更难的问题,解决了完整的 9 部分拼图,但作为回报,它获得了更强的性能:
研究人员验证了片的良好混排和每幅图像多于 1 个混排样本。
上下文编码器
如前所述,text 中的 word2vec 会填充缺失的单词。在视觉上有没有尝试这样做?事实上,有。在这篇文章中,Pathak 等人(当然还有 Efros)尝试了一些自动编码器模型来填充图像上的裁剪空间。
结果表明,这实际上是可能的,特别是增加了对抗性损失,这成功地避免了处理多模式(如前所述),从而防止模糊,“平均”的结果。
旋转
在我们跳到下一个级别之前,我想提一下这个花絮:旋转预测。这篇论文采用了预测图像旋转的创造性方法。
旋转预测除了具有创造性之外,还相对较快,并且不需要像我们之前看到的其他任务那样进行任何预处理,以克服对琐碎特征的学习。
论文还探讨了一些“注意力地图”,显示出他们的网络聚焦于图像的重要部分:头部、眼睛等。
虽然将迁移学习的最新成果报告给了 imageNet 分类(大多数其他作品都与 pascal 相关),但评论者在论文中发现了一些缺陷,因此不得不持保留态度。
一般化
那么在所有这些工作之后,我们从中获得了什么呢?当然,给 B&W 图像着色很好,解决拼图可能是一个有趣的演示应用程序,但更大的目标是在主要任务中取得更好的结果——特别是分类**、检测和分割。**
当使用 imagenet 预训练时,最常见的基准是 VOC Pascal 数据集,具有当前的技术水平:
目前的结果是:
Detection results, from rotation article
嗯,看来我们还没到那一步。虽然自我监督的数据实际上是无限的,但还没有一项工作挑战“经典的”基于 Imagenet 的迁移学习结果。然而,在具体任务上有一些好的结果,我们将在后面的帖子中讨论。
除了对上述任务的标准概括,研究人员还利用这组任务的具体特征来尝试和概括其他一些任务,如图像聚类(最近邻、可视化数据挖掘等)
包裹
下一个大的进步会来自于自我监督学习吗?也许是,也许不是,但我相信探索这样不同的方法会显著改善深度学习领域,并可能间接积极影响真正的突破。在下一篇文章中,我们将了解更多的想法和方法,这些想法和方法会带来一些有趣和新奇的结果。
如果您希望进一步阅读,请继续关注(并跟随我)本系列的下一部分。此外,以下是一些对我研究和学习这些主题有很大帮助的资源:
系列链接:
- 自我监督学习介绍(这篇文章)
- 自我监督学习:生成方法
一种不同的(深度)学习:第 2 部分
自我监督学习:生成方法
介绍
在之前的帖子中,我们已经讨论了一些自我监督学习文章,以及一些朝着“圣杯”努力的尝试:利用几乎无限数量的无注释图像,以推广到其他任务。希望能更接近目前未达到的基准 ImageNet 预培训。
令人惊讶的是,或者也许不那么令人惊讶的是,我们从阎乐存那里获得了一些额外的支持,他在他的 NeurIPS 演讲(“迈向人工智能的下一步”)中花了几分钟时间讨论自我监督学习。他将自我监督学习描述为“蛋糕的主体”当浇头是监督学习,樱桃是强化学习(因为 RL 中奖励的稀疏性)。Lecun 还从我们最喜欢的自我监督研究员 Aloysha Efros 那里拿了一些幻灯片,所以我很高兴我们有共同的兴趣。
此外,一些读者指出,也有突出的自我监督机构处理视频,这是显而易见的。然而,视频将在稍后的帖子中讨论,因为我们有另一个主题,即生成模型。
生成模型和自我监督有什么关系
在他关于自我监督的谈话中,Efros(是的,他也将在这篇文章中占主导地位)经常讨论为自我监督的任务找到正确的损失函数的困难。
在前一篇文章中,我们检查了用于着色任务的特殊分类损失,并强调了为它们找到正确损失函数的难度。
在的演讲中, Efros 描述了一种寻找这种损失函数的方法。他称之为:“研究生血统”。换句话说,为这些模型找到一个好的损失函数需要大量的反复试验。那么我们能有更好的,更通用的方法来找到它们吗?
colorization, super resolution, etc: is there a universal self supervised loss function?
此外,还有彩色图灵测试的事情:为了评估结果,研究人员使用机械土耳其人来区分真假照片。因此,我们希望有某种机制来区分这两种类型的图像。
如果您在 2014 年就热衷于深度学习,您可能还记得,当伊恩·古德费勒(Ian Goodfellow)首次展示他开创性的作品《T0》、《T1》、《T2》、《T3》时,社区对这种有希望的代际能力非常兴奋,但许多研究人员对这项工作的目的持怀疑态度。对他们来说,这只是一个玩具,至少在取得重大进展之前是这样。
自我监督的研究人员有一些不同的想法:在他们看来,GAN 可能是自我监督任务的一种定制丢失功能。
This is how Generative Adversarial network works
让我们想一想:在着色工作中,我们使用了标准的深度学习范式来预测每个像素的颜色。我们可以将 GAN 鉴频器的能力用作定制损耗吗?如果是这样,就需要用不同的方式来构造问题。
我们知道,氮化镓本质上是从一个完全随机的分布产生图像。如果我们可以让它给定一个黑白图像,生成一个彩色图像,使用鉴别器来评估结果呢?
这需要范式上的一些改变:从不同的东西生成图像,然后通过条件 GAN 完成完全随机的分布:向生成器添加一个特征,使其生成目标空间的一些子集。例如,来自 Mnist 数据集的特定数字。但是如果我们可以使用标量(数字)作为“条件”,我们也可以使用向量。如果我们可以用一个向量,我们也可以用一个张量。图像只是一个张量,不是吗?
因此,我们的想法是:训练一个类似条件 GAN 的网络,其中条件(以及生成器的输入)是黑白图像,这将限制输出为彩色图像。
Pix2pix
菲利普·伊索拉(Phillip Isola)是 Efros 的学生,也参与了之前讨论的彩色化工作,他在论文“中承担了这项任务,论文名为 Pix2pix 。这需要对 GAN 架构进行重大调整:首先为生成器使用编码器-解码器架构。第二,鉴别器不能只从数据集和生成器中获得随机配对的图像。它应该有严格的图像对,一个是原始的 RGB,另一个是由黑白图像生成的。鉴别器架构和训练时间表也不同于标准。你可以在这个帖子中读到关于它的很好的解释。很明显,这份文件投入了大量的辛勤工作。
The pairing strategy of pix2pix. Here with edges=>photo instead of B&W=>RGB
但伊索拉更进一步:他可能对自己说:好吧,如果我成功地建立了一个彩色化-GAN,它从成对的图像中学习,为什么我不能将其应用于不同的图像对?关于:
- 谷歌地图和谷歌地球图像对
- 建筑抄本和实际建筑立面
- 边缘和对象
诸如此类。一切都成功了。
这成为了过去几年中最有趣的深度学习作品之一(这意味着有史以来),它引发了 Efros 所谓的东西:“ Twitter 驱动的研究”。由于这篇论文的代码在 GitHub 上很容易获得,许多人在各种图像配对上训练它,并得出一些高度 创造性的结果。这些也是:
你也可以通过在 twitter 上寻找 #pix2pix 找到更多。埃夫罗斯说,这些项目让他感到惊讶,带来了许多新的想法,并使他们的研究前进了许多步。
好吧,我们有点忘乎所以了——所有这些令人兴奋的事情带来了各种新的选择。然而,在通往创新的道路上,一个小细节被忽略了:自我监督的范式,它旨在使用自我监督的模型进行迁移学习,在这个过程中被忽略了,甚至在本文中也没有提到。也许发生器的结构太不一样,无法尝试,或者也许生成结果的重要性掩盖了又一次部分成功的自我监督尝试的潜力。
甘比
嗯,pix2pix 作品是第一篇文章中着色和背景作品的“自然继承者”。但还有另一项工作确实尝试在 GAN 网络上应用迁移学习:双向 GAN—。
甘比提出了一个新概念(当时,2016 年):除了标准的 GAN 架构,一个编码器被添加到该架构中(见下文)。出于不同的目的,该编码器用于学习发生器的逆过程。
这项工作采用了一种非常有趣的方法:采用标准的 GAN 架构,而不是为鉴频器提供 x (真实图像)和 G(z) (生成的图像,当 z 是发生器的随机输入时)鉴频器馈入 2 对: (x,E(x))、( G(z)、z) ,这意味着随机输入 z 和 有趣的是,生成器和编码器之间没有共享知识。
这有点难以理解,所以您可以在文章中阅读更多的细节——关于编码器和生成器的正式(和直观的)解释必须学会相互反转以欺骗鉴别器。
虽然这里没有条件元素— z 不是标签,但是编码器可以通过迁移学习用于分类(以及因此的检测和分割,在切换一些层之后)。结果可以说是“合理的”。
如果你觉得类似的想法出现在甘比和 Pix2Pix 作品中(我应该提到甘比更早出现)这不是偶然的。pix2pix 的后续论文 CycleGAN 是两者的结合,允许在没有“成对”训练图像的情况下训练这样的网络,并显著扩展了可转移的对象,创造了著名的斑马到马(和背)的转移。
some results from CycleGAN
交叉通道编码器
因此,我们已经看到 GANs 在自我监督学习中有巨大的潜力(不知何故还有待实现)。但是他们更老的、目前不太受欢迎的同类产品自动编码器怎么样呢?
事实上,自动编码器在某些任务上已经取得了很好的结果,但是它们总是遭受通过它们的层的信息丢失。
在自我监督学习中,他们也取得了一些成功。
在我们之前的文章中关于彩色化的讨论中,我们提到了彩色化实际上是一个跨通道编码器。意思是,用一些渠道去预测其他的。如果我们给真正的自动编码器一个机会,用不同的方式定义通道,会怎么样?
更具体地说,通过试图用另一半来重建图像的一半。接下来的工作,名为“裂脑”正是这么做的。它定义的任务是对角地将图像一分为二,并使用自动编码器预测一半,使用另一半。
更进一步,每个图像可以使用两次,每一半用于预测另一半。
看到这种方法对对角线平分法相当有效,研究人员又回到了颜色,来回预测:B&W 预测 RBG,反之亦然,颜色预测黑白(特别使用实验室空间)
总结和评估
根据之前的帖子,我有一些关于自我监督模型的实际迁移学习结果的问题。如那里所说,重要的特征是对不同任务的概括,例如检测和分割。有意地,我没有把太多的重点放在这些结果上,因为它们相当脆弱,并且总是保持与它们的目标 10%的相当稳定的差异:ImageNet 预训练。
上面的表格摘自轮换的作品,这可能是令人惊讶的自我监督迁移学习的当前“艺术状态”。大多数其他讨论过的论文也在那里。然而,这应该有所保留,因为:
- 审稿人对轮换论文的评价不高
- 这些论文中有一些数据展示技巧,使它们在发表时看起来领先,但在现实生活中并不真正有用。
因此,再一次,它似乎有很大的潜力,特别是在客户损失函数的想法,但结果还没有“在那里”。然而,我们仍然有一些理由保持乐观:幸运的是,视觉信号不仅限于图像,也存在于…视频中。视频增加了重要的时间维度,这反过来又增加了大量新的可能的任务、范例和选项,最终,一些真实的结果(!).这一点和更多将在下一篇文章中讨论,敬请关注。
一如既往,我欢迎反馈和建设性的批评。可以通过 Twitter @shgidi 联系到我
系列链接:
- 自我监督学习简介
- 自我监督学习:生成方法(本帖)
- 通过视频进行自我监督学习(未来帖子)
识别季节性客户的时间序列的不同用法
我以前写过关于创造性地利用你的数据,使用细分来了解客户群。文章此处。在文章中,我提到了利用任何可能相关的数据。尝试识别具有季节性使用模式的客户是我提到的听起来很有趣的变量之一。由于我准备做另一个聚类分析,我决定解决这个问题。
这些是我最喜欢的数据科学问题类型。设计解决方案需要你跳出框框思考。基本上,我希望能够标记每个客户,无论他们是否表现出季节性模式,这将是第一步。稍后,我可能会进一步扩展这一点,以确定每个客户的“淡季”的开始。这将使我们能够更好地培养这些客户关系,并提供更加个性化的体验。
我是 Constant Contact 的数据科学家,我们为小型企业提供电子邮件营销解决方案。由于这是一个订阅产品,客户有不同的使用模式,我可以使用这些模式进行分析。
起初,我的假设是这些顾客中有很大一部分可能生活在一个有四个季节的地区。你知道,新英格兰的冰淇淋店冬天关门。经过进一步思考,如果我在寻找季节性的使用模式,这也将包括那些不一定受天气影响的季节性商业模式的人。在教育领域有账户的人会在暑假休假,这是季节性的。零售业全年都有相当稳定的使用量,但在圣诞节增加使用量的企业也呈现出季节性模式。因此,模型将确定哪些人是季节性的,这不仅仅是基于天气,也可能是基于业务类型。(或者可能有些人足够幸运,在年中无缘无故地随意休长假,我想确保我也能找到这些人,如果他们存在的话)。
为了进行这项分析,我按客户、按月汇总了每个客户至少两年的电子邮件发送模式。每个客户都有自己的时间序列。然而,有几个复杂的问题。有一个细节特别值得注意,客户可能会停止使用一两个月(或更长时间)。所以首先我必须写一些代码来填充这几个月的零。我不能指定我正在寻找一个每年的模式,但是在模型中只给出每年 8 个月的数据,我需要这些零。我使用 Python 找到了这些丢失的零,然后决定我想使用 R 来表示时间序列/确定是否存在季节性模式。我第一次使用 Python 中的 rpy2 包。从我想尝试的新包列表中检查一下。
我为 r 中的每个客户拟合了一个 TBATS 模型。这可能是多余的,因为 TBATS 旨在处理非常复杂(并且可能是多个)的季节性模式。然而,询问模型是否有每年的季节成分真的很简单。另外,TBATS 比其他方法对平稳性更具鲁棒性。
这是一个被模型确定为季节性的客户的图片,右边是一个明显不是季节性的客户,模型也同意这一点。
在我得到我的模型的输出后,我回去对这些客户的样子做了一个全面的分析。他们在东北部指数过高,而在西部和南部指数较低。
季节性用户也更有可能自我报告处于如下行业:
- 零售
- 体育和娱乐
- 非营利组织
非季节性用户也更有可能自我报告处于这样的行业:
- 汽车服务
- 财务咨询机构
- 医疗服务
- 保险
任期只有 2-3 年的客户比任期更长的客户更不可能是季节性的。这可能是由于几个不同的因素。也许只是还没有足够的数据来检测它们,也许他们在真正达到他们的大步之前需要一段时间来熟悉这个工具(涉及不同的使用模式),或者也许他们真的不是季节性的。有更多的见解,但这是公司的数据😉
这是东北部季节性客户过度指数化的地图。利益相关者通常喜欢看到漂亮的地图。注:季节性和非季节性的比例不是 50/50。
目前,我们正在考虑在即将到来的细分中我们可能能够利用哪些数据(其中这个季节性变量将是一个候选变量。这可能包括来自 BigData 环境的信息或关系数据库中的任何信息。我们也在权衡获得一个特定变量的难度与我们从收集数据中可能获得的附加值。
我感到非常幸运,能够参与帮助我们了解客户的项目,这样当我们向他们传达信息时,我们可以更有针对性。没有什么比收到一个完全不了解你的公司的信息更糟糕的了。我发现这种工作令人兴奋,它让我有创造力,这对我很重要。
我希望你觉得这篇文章很有趣,也许有几个人会发现这也适用于他们自己的工作。我希望你有很多有趣的项目,让你感到鼓舞🙂
如果你想订阅我未来的文章,你可以在这里订阅。
原载于 2018 年 7 月 3 日【datamovesme.com。
生物信息学入门
Bioinformatics and related fields
单词 生物信息学 在当今的科学世界中正在发生巨大的转变。这个词似乎由两部分组成,这两部分涉及两个不同的领域,生物学和计算机科学。大约一、二十年前,人们认为生物学和计算机科学是两个完全不同的领域。一个人将学习生物及其功能,而另一个人将学习计算机和基础理论。
让我们把详细的谈话留到以后。如果你对这个新兴领域毫无头绪,那你来对地方了。在这篇文章中,我将尽可能简单地解释这个领域,不会深入到生物学或计算机科学。
什么是生物信息学?
生物+信息学=生物信息学
根据维基百科,
生物信息学是一个跨学科领域,开发理解生物数据的方法和软件工具。作为一个跨学科的科学领域,生物信息学结合了计算机科学、统计学、数学和工程学来分析和解释生物数据。
随着生物分析中新概念、新理论和新技术的出现,科学家们在进行各种实验后收集了大量的数据。尽管数据量呈指数级增长,但手动分析它们变得不切实际。这是计算机科学技术与统计学、数学和工程学相结合的地方。计算技术被用来更准确和有效地分析这些大量的数据。因此,生物信息学可以被认为是解决生物学问题的数据科学领域。
过去和现在的实验
在生物信息学出现之前,生物实验只有两种方式。
- 在一个活的有机体内部( 在体内, 意为 在活的 在拉丁文中)
- 在人工环境中( 试管内 ,拉丁文中的意思是 玻璃内 )
In vitro and in vivo experiments (Image Source: http://www.invivotransfection.com)
生物信息学领域在 silico 上被认为是*(在 silicon 上的意思是在拉丁文中的意思是*),我们在一个硅片上,或者更准确地说是在一个微处理器上进行生物实验。计算机模拟方法的一个主要优点是,你可以在不使用任何动物或试剂的情况下进行模拟和实验。这将是动物权利活动家的好书。😊
为什么要学生物信息学?
生物信息学已经成为生命科学和生物医学科学的重要交叉学科。如果你是一名生物学家,你会发现拥有生物信息学的知识可以让你的实验和研究受益匪浅。
目前的就业行业充满了具有生物信息学技能的人的空缺。科学杂志称,主要的制药、生物技术和软件公司正在寻求招聘具有生物信息学经验的专业人员,他们将在这些领域处理大量的生物和医疗保健信息。去 Indeed.com 的看看生物信息学领域的几个工作机会。
除了工作和职业要求,如果你热爱生物和计算机科学,那么这个领域很适合你。作为一个热爱生物学,目前正在学习生物信息学的计算机科学本科生,相信我这样说,你一定会热爱这个领域。
生物信息学会学到什么?
首先,你必须学习一点生物学知识;具体来说就是遗传学和基因组学。这将包括研究基因、DNA、RNA、蛋白质结构等。
然后你将不得不学习生物序列**(例如,在 DNA、RNA 和蛋白质中发现的序列)以及发现和分析其中各种模式的技术。你会遇到不同技术使用的各种算法。**
因为您将处理大量的数据,所以很好地理解统计是至关重要的,因为您必须根据特定的需求来分析数据。因此,你也会学到很多关于统计学的知识。
当然,你会需要编程技能。r、Python 和 Bash 是最有用、最常用的编程语言。决定从哪个开始取决于你的目标。我选择了 Python。🐍您也可以使用其他语言,如 C/C++和 Java。
在对基本概念有了基本了解之后,你可以继续学习其他领域,如结构生物信息学、** 系统生物学和生物网络。**
生物信息学的应用
据科学日报报道,生物信息学正被用于许多不同的方面,包括 DNA 序列、基因、蛋白质和进化建模**。我们不会深入讨论这些细节。**
生物信息学的一个众所周知的应用是在精准医学和预防医学领域。在精准医疗中,针对个体患者的医疗保健技术正在相应地定制,包括治疗和实践。精准医疗不是治疗或治愈疾病,而是开发预防疾病的措施。这些领域的一些重点领域是流感**、癌症、心脏病和糖尿病。人们已经开展了研究来识别病人身上的基因变化,这使得科学家们能够提出更好的治疗方法,甚至可能的预防措施。你可以从这篇由国家癌症研究所撰写的文章中了解更多关于生物信息学在癌症治疗中的作用。**
Disease Identification
生物信息学的另一个重要应用是创造药物。我们可以使用计算工具来了解疾病,确定疾病的原因,并相应地使用合适的药物进行治疗,而不仅仅是治疗症状。
这是生物信息学的一些应用。使用生物信息学知识的情况更多,包括微生物学、基因技术和农业。
最后的想法
我开始学习生物信息学已经有几个星期了,我对它非常感兴趣。我读了一些书,想推荐以下几本书。
- 假人生物信息学 作者 Cedric Notredame 和 Jean-Michel Claverie
- 初学者生物信息学:基因、基因组、分子进化、数据库和分析工具 作者 Supratim Choudhuri
- Python 中的生物信息学编程:初学者实用教程 作者鲁迪格-马库斯·弗莱格
- 利用 Python 进行生物信息学编程 采用米切尔 l .模型
我认为这些书对初学者来说非常好。读完这些之后,你会对基本概念有一个很好的基础和理解,并且开始编程。
因为我对这个领域还很陌生,所以我想听听你的建议。😇
我希望你对生物信息学有一个基本的了解。
感谢阅读…!😃
Python 中用于机器学习的特征选择工具
使用 FeatureSelector 实现高效的机器学习工作流
特征选择,即在数据集中寻找和选择最有用的特征的过程,是机器学习管道的关键步骤。不必要的特征降低了训练速度,降低了模型的可解释性,最重要的是,降低了测试集的泛化性能。
我发现自己在机器学习问题上一遍又一遍地应用特别的特征选择方法,这让我感到沮丧,于是我用 Python 编写了一个特征选择类,可以在 GitHub 上找到。FeatureSelector
包括一些最常见的特征选择方法:
- 缺失值百分比高的特征
- 共线(高度相关)特征
- 在基于树的模型中具有零重要性的特征
- 重要性低的特征
- 具有单一唯一值的特征
在本文中,我们将在一个示例机器学习数据集上使用FeatureSelector
。我们将看到它如何允许我们快速实现这些方法,从而实现更高效的工作流。
完整的代码可以在 GitHub 上获得,我鼓励任何贡献。功能选择器是一项正在进行的工作,并将根据社区需求继续改进!
示例数据集
对于这个例子,我们将使用 Kaggle 上的家庭信用违约风险机器学习竞赛的数据样本。(参赛入门,见本文)。整个数据集可以从下载,这里我们将使用一个示例来说明。
Example data. TARGET is the label for classification
竞争是一个监督分类问题,这是一个很好的数据集,因为它有许多缺失值、许多高度相关(共线)的要素和许多对机器学习模型没有帮助的不相关要素。
创建实例
为了创建一个FeatureSelector
类的实例,我们需要传递一个行中有观察值、列中有特性的结构化数据集。我们可以使用一些只有特征的方法,但是基于重要性的方法也需要训练标签。由于我们有一个监督分类任务,我们将使用一组特征和一组标签。
(确保在与feature_selector.py
相同的目录下运行此程序)
from feature_selector import FeatureSelector# Features are in train and labels are in train_labels
fs = FeatureSelector(data = train, labels = train_labels)
方法
要素选择器有五种方法来查找要移除的要素。我们可以访问任何已识别的特征,并手动将其从数据中删除,或使用特征选择器中的remove
功能。
在这里,我们将介绍每种识别方法,并展示如何同时运行所有 5 种方法。FeatureSelector
另外还有几个绘图功能,因为视觉检查数据是机器学习的一个重要组成部分。
缺少值
查找要移除的要素的第一种方法很简单:查找缺失值比例高于指定阈值的要素。下面的调用识别缺失值超过 60%的特征(输出粗体)。
fs.identify_missing(missing_threshold = 0.6)**17 features with greater than 0.60 missing values.**
我们可以看到数据帧中每一列缺失值的比例:
fs.missing_stats.head()
为了查看被识别为要删除的特性,我们访问了FeatureSelector
的ops
属性,这是一个 Python 字典,特性在值中作为列表。
missing_features = fs.ops['missing']
missing_features[:5]**['OWN_CAR_AGE',
'YEARS_BUILD_AVG',
'COMMONAREA_AVG',
'FLOORSMIN_AVG',
'LIVINGAPARTMENTS_AVG']**
最后,我们绘制了所有特征中缺失值的分布图:
fs.plot_missing()
共线特征
共线特征是彼此高度相关的特征。在机器学习中,由于高方差和较低的模型可解释性,这些会导致测试集上的泛化性能下降。
identify_collinear
方法基于指定的相关系数值寻找共线特征。对于每对相关的特征,它识别要移除的特征之一(因为我们只需要移除一个):
fs.identify_collinear(correlation_threshold = 0.98)**21 features with a correlation magnitude greater than 0.98.**
我们可以用相关性做一个简洁的可视化,这就是热图。这将显示至少有一个相关性高于阈值的所有要素:
fs.plot_collinear()
和以前一样,我们可以访问将被移除的相关要素的完整列表,或者在数据帧中查看高度相关的要素对。
# list of collinear features to remove
collinear_features = fs.ops['collinear']# dataframe of collinear features
fs.record_collinear.head()
如果我们想要研究我们的数据集,我们也可以通过向调用传递plot_all = True
来绘制数据中所有相关性的图表:
零重要性特征
前两种方法可以应用于任何结构化数据集,并且是确定性的 —对于给定的阈值,每次结果都是相同的。下一种方法仅设计用于监督机器学习问题,其中我们有用于训练模型的标签,并且是不确定的。identify_zero_importance
函数根据梯度推进机器(GBM)学习模型查找重要性为零的特征。
利用基于树的机器学习模型,比如 boosting 集成,我们可以发现特征的重要性。重要性的绝对值不如相对值重要,相对值可用于确定任务的最相关特征。我们还可以通过移除零重要性特征来使用特征重要性进行特征选择。在基于树的模型中,重要性为零的特征不用于分割任何节点,因此我们可以在不影响模型性能的情况下移除它们。
FeatureSelector
使用梯度推进机器从 LightGBM 库中找到特征重要性。为了减少方差,在 GBM 的 10 次训练运行中对特征重要性进行平均。此外,使用验证集的早期停止来训练模型(有一个选项可以关闭它),以防止过度拟合训练数据。
下面的代码调用方法并提取零重要性特征:
# Pass in the appropriate parameters
fs.identify_zero_importance(task = 'classification',
eval_metric = 'auc',
n_iterations = 10,
early_stopping = True)# list of zero importance features
zero_importance_features = fs.ops['zero_importance']**63 features with zero importance after one-hot encoding.**
我们传入的参数如下:
task
:对应我们问题的“分类”或“回归”eval_metric
:用于提前停止的度量(如果提前停止被禁用,则不需要)n_iterations
:平均特征重要性的训练运行次数early_stopping
:是否使用提前停止来训练模型
这次我们用plot_feature_importances
得到两个图:
# plot the feature importances
fs.plot_feature_importances(threshold = 0.99, plot_n = 12)**124 features required for 0.99 of cumulative importance**
左边是plot_n
个最重要的特征(根据归一化重要性绘制,总和为 1)。右边是累积重要性与特征数量的关系。垂直线画在累积重要性的threshold
处,在本例中为 99%。
对于基于重要性的方法,需要记住两点:
- 训练梯度推进机器是随机的,这意味着特征的重要性将在每次模型运行时发生变化
这应该不会有很大的影响(最重要的特性不会突然变得最不重要),但是会改变一些特性的顺序。它还会影响所识别的零重要性特征的数量。如果特性的重要性每次都发生变化,不要感到惊讶!
- 为了训练机器学习模型,首先对特征进行一键编码。这意味着某些被标识为重要性为 0 的要素可能是在建模过程中添加的一次性编码要素。
当我们到达特征移除阶段时,有一个选项来移除任何添加的独热编码特征。然而,如果我们在特征选择之后进行机器学习,我们无论如何都要对特征进行一次性编码!
低重要性特征
下一种方法建立在零重要性函数的基础上,使用模型中的特征重要性进行进一步选择。函数identify_low_importance
查找对指定的总重要性没有贡献的最低重要性特征。
例如,下面的调用查找实现 99%的总重要性不需要的最不重要的功能:
fs.identify_low_importance(cumulative_importance = 0.99)**123 features required for cumulative importance of 0.99 after one hot encoding.
116 features do not contribute to cumulative importance of 0.99.**
基于累积重要性的图和该信息,梯度推进机器认为许多特征与学习无关。同样,这种方法的结果会在每次训练中发生变化。
要查看数据框架中所有特征的重要性:
fs.feature_importances.head(10)
low_importance
方法借鉴了的一种方法,使用主成分分析(PCA) ,其中通常只保留需要保留一定百分比方差(如 95%)的 PC。占总重要性的百分比是基于同样的想法。
基于特征重要性的方法实际上仅在我们要使用基于树的模型进行预测时才适用。除了随机性之外,基于重要性的方法是一种黑盒方法,因为我们并不真正知道为什么模型认为特征是不相关的。如果使用这些方法,运行几次,看看结果如何变化,也许可以创建多个带有不同参数的数据集进行测试!
单一独特价值特征
最后一个方法相当简单:查找任何具有唯一值的列。只有一个唯一值的特征不能用于机器学习,因为这个特征的方差为零。例如,基于树的模型永远不能对只有一个值的特征进行分割(因为没有组来划分观察值)。
与其他方法不同,这里没有可供选择的参数:
fs.identify_single_unique()**4 features with a single unique value.**
我们可以绘制每个类别中唯一值数量的直方图:
fs.plot_unique()
需要记住的一点是,默认情况下,NaNs
在计算 Pandas 中的唯一值之前被删除。
移除功能
一旦我们确定了要丢弃的特性,我们有两个移除它们的选项。所有要删除的特征都存储在FeatureSelector
的ops
字典中,我们可以使用列表手动删除特征。另一种选择是使用remove
内置函数。
对于这个方法,我们传入methods
来用来移除特性。如果我们想使用所有实现的方法,我们只需传入methods = 'all'
。
# Remove the features from all methods (returns a df)
train_removed = fs.remove(methods = 'all')**['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run
Removed 140 features.**
该方法返回一个移除了特征的数据帧。要移除在机器学习过程中创建的一次性编码特征:
train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)**Removed 187 features including one-hot features.**
在继续操作之前检查将要删除的功能可能是个好主意!原始数据集存储在FeatureSelector
的data
属性中作为备份!
同时运行所有方法
我们可以通过identify_all
使用所有的方法,而不是单独使用这些方法。这需要每个方法的参数字典:
fs.identify_all(selection_params = {'missing_threshold': 0.6,
'correlation_threshold': 0.98,
'task': 'classification',
'eval_metric': 'auc',
'cumulative_importance': 0.99})**151 total features out of 255 identified for removal after one-hot encoding.**
请注意,由于我们重新运行了模型,总特征的数量将会发生变化。然后可以调用remove
函数来丢弃这些特征。
结论
特征选择器类实现了几个常见的操作,用于在训练机器学习模型之前移除特征。它提供了用于识别要移除的特征以及可视化的功能。方法可以单独运行,也可以同时运行,以实现高效的工作流程。
missing
、collinear
和single_unique
方法是确定性的,而基于特征重要性的方法会随着每次运行而改变。特征选择,很像机器学习的领域,很大程度上是经验性的,需要测试多个组合来找到最佳答案。最佳实践是在管道中尝试几种配置,特性选择器提供了一种快速评估特性选择参数的方法。
一如既往,我欢迎反馈和建设性的批评。我想强调的是,我正在寻求关于FeatureSelector
的帮助。任何人都可以在 GitHub 上做出贡献,我感谢那些刚刚使用这个工具的人的建议!也可以通过 Twitter @koehrsen_will 联系到我。
Pytorch 1.0 初探
Image by Facebook
今年 10 月 2 日,我有幸参加了第一届 Pytorch 开发者大会。这是一次很棒的经历!Pytorch 已经迅速成为深度学习框架中的一等公民,两年前刚刚起步。在这次活动中,我遇到了许多熟悉的面孔。我将讲述 Pytorch 1.0 上午会议中与软件开发人员最相关的部分。会议包括脸书副总裁 Jerome Pesenti 和 Pytorch 核心开发团队成员的演讲,旨在向社区介绍 Pytorch 1.0。
Pytorch 主要由 Facebooks 的人工智能研究团队开发。目标是使人工智能开放和协作,以便越来越多的人可以利用它。这个团队成立于大约 5 年前,从那时起,他们为脸书的大部分产品提供核心支持。脸书广泛使用人工智能来增强他们产品的功能。一些广泛的领域是(a)提供推荐(新闻源/你可能喜欢的文章),(b)机器翻译(这样世界各地的每个人都可以相互理解),以及©创建机器人和消息助手。脸书研究公司在工业界和学术界有很多合作伙伴。
Pytorch 用于新模型和系统的研究和原型制作。这个框架是灵活和必要的,因此易于使用。接下来,必须使用 ONNX(开放式神经网络交换)将 Pytorch 模型移植为更适合生产的形式。ONNX 是深度学习模型的一种格式,能够跨不同的开源 AI 框架移植它们。正在讨论的生产系统是 Caffe2。在脸书,Caffe2 是大多数人工智能应用的主力,并在数据中心大规模部署。Caffe2 框架是健壮的、稳定的,每天能进行 300 万亿次预测。Pytorch 1.0 的目标是将所有这 3 个框架的伟大特性结合成一个单一的框架,以便提供从研究到生产的无缝路径。
T5【py torch 1.0 之路】T6
在之前的升级中,这一次非常重要(因此从 0.4 跳到了 1.0)。每个 Pytorch 版本之前都解决了 Pytorch 框架中的一个核心增强/改进,如图所示。Pytorch 1.0 的重点是引入了高级编译器 torch.jit 。torch.jit 的引入是出于解决两个主要问题的需要:
**将模型与代码分离:**在 1.0 之前,AI 模型是用 Pytorch 编写的代码,为了运行它,需要一个 python VM/环境。对于定制计算环境、移动系统、多线程服务器等,这不是最佳解决方案。Pytorch 1.0 通过在 torch.jit 中提供函数和类注释,允许您将模式与 python 代码分开。这些函数/类可以被编译成可检查、可导出并保存在磁盘上的高级表示。
**针对定制硬件的高效模型优化:py torch 模型可以在服务器、TPU 的 GPU、移动设备等上运行。**Python 代码的纯命令式执行会错过很多优化机会。 Torch.jit 模型可以提前检查,以在不同的粒度级别执行整体程序优化、节点融合等。
Pytorch 1.0 预览版被认为是相当稳定和成熟的,据称 90%的特性已经存在。在脸书,这个系统已经在生产中使用,团队不希望开发人员暴露在严重的错误中。预计 1.0 的稳定版本将于 2018 年 NIPS 前后发布。
深入研究 torch.jit
急切执行模式是研究的绝佳选择。我们可以在代码中使用任意的 python 库,并使用我们选择的调试工具快速构建原型。一旦我们有了一小组想要投入生产的模型,事情看起来就变得更加麻烦了。python 解释器的要求使得移动环境或多线程环境下的服务器设置变得不舒服。即使使用 python 解释器,代码的优化和并行化程度也是有限的。
脚本模式代码可以在没有 python 解释器的情况下执行。这是一个使用 Python 子集编写的模型,可以优化并转换成中间格式。脚本模式拥有构建 AI 模型所需的所有基本构件,但它限制了 python 语言的其他动态行为。
理想的过渡看起来会像上面这样。正如我们所知,大多数人会以渴望模式开始编写程序,这是常规的 Pytorch 代码。当您想要将一个特定的模型转移到生产中时,可以使用 pytorch.jit 工具来注释代码,以将其从渴望模式转移到脚本模式。这可以逐步完成,从您最有信心的模型部分开始,同时仍然保留可调试性,并用其余代码进行测试。为了实际完成从一种形式到另一种形式的转换, torch.jit 提供了两种方法:
Torch.jit.trace — T his 适用于现有的 eager python 模型,这些模型是没有控制流的“直线型”(vision CNN 模型)。跟踪器使用提供的输入运行模块,记录它遇到的张量运算。
例如,可以在常规 python 函数 foo 上运行 torch.jit.trace ,也传入预期的输入。跟踪器基础结构记录发生了什么操作,并将其存储在对象 traced_foo 中。traced_foo 是一个独立的包,可以独立于 python 运行,保存到磁盘和加载等等。
Torch.jit.script — 这对于控制流很重要的模型很有用,比如自定义 RNN。这里我们直接用 Torch 脚本编写代码,这是 Python 的一个子集,可以进行优化。我们使用类和方法注释( @torch.jit.script,@torch.jit.script_method )来表示 python 代码的 torch 脚本部分。循环、打印语句和控制流被保留下来,因为我们只是在 python 代码上使用注释。要使用标准 python 工具调试这部分代码,或者切换到急切执行模式,我们只需要移除注释。
在任何一种情况下(跟踪模式或脚本模式),基本部分仍然是用 python 编写的,而不是用任何中间元编程范式编写的。一个模型可以包含脚本和跟踪代码的混合。保存模型并将其加载到另一个环境中,比如说 C++非常简单,如下图所示。
Pytorch 1.0 和 C++,Pytorch C++前端
首先,Pytorch 1.0 使得将现有的 C++函数集成到您的 Python 环境中变得很容易。例如,您希望使用一些 OpenCV 库功能,并将其引入 Python 代码中。Pytorch 已经有了像 ATEN 这样的库,可以让你用 C++编程,它还有 Autograd,引入了梯度和微分。在 eager 和 script 模式场景中支持 C++似乎很容易:(a)对于 eager 模式,您可以将 C++程序代码转换成一个 Python 模块进行实验(b)对于 script 模式,在 script 模式中使用 C++代码本身
第二,对于特殊的环境,有一个 C++前端,你甚至可以用它来运行训练循环,而不仅仅是推理。这对于具有低延迟、裸机、多线程需求的应用程序来说可能是有意义的。C++前端支持现有的 Pytorch 特性,如 torch::nn、torch::optim、序列化等。
参考资料:
Pytorch 开发者大会活动。视觉效果取自活动期间展示的幻灯片。Pytorch 核心发展演讲者是 Soumith Chintala、Dmytro Dzhulgakov、Zack DeVito、Peter Goldsborough 和李腾
为 scikit-learn 模型提供服务的 Flask API
Scikit-learn 是一个直观而强大的 Python 机器学习库,使得训练和验证许多模型变得相当容易。Scikit-learn 模型可以被持久化(腌)以避免每次使用时重新训练模型。您可以使用 Flask 来创建一个 API,该 API 可以使用一个 pickled 模型基于一组输入变量提供预测。
在我们进入 Flask 之前,重要的是要指出 scikit-learn 不处理分类变量和缺失值。分类变量需要用编码为数值。通常分类变量使用 OneHotEncoder (OHE)或 LabelEncoder 进行转换。LabelEncoder 为每个分类值分配一个整数,并将原始变量转换为一个新变量,并用相应的整数替换分类变量。这种方法的问题在于,名义变量被有效地转换成顺序变量,这可能会欺骗模型,使其认为顺序是有意义的。另一方面,OHE 没有这个问题,但是它倾向于增加变换变量的数量,因为对于分类变量的每个值都会产生一个新的变量。
关于 LabelEncoder 需要知道的一件事是,转换将根据变量中分类值的数量而变化。假设您有一个值为“黄金”和“白金”的“订阅”变量。LabelEncoder 会将这些分别映射到 0 和 1。现在,如果您将值“free”添加到组合中,分配就会改变(free 编码为 0,gold 编码为 1,platinum 编码为 2)。因此,在预测时保留原始的 LabelEncoder 以备转换非常重要。
对于这个例子,我将使用泰坦尼克号数据集。为了进一步简化,我将只使用四个变量:年龄、性别、上船和幸存。
import pandas as pd
df = pd.read_csv('titanic.csv')
include = ['Age', 'Sex', 'Embarked', 'Survived']
df_ = df[include] # only using 4 variables
性别和从事是分类变量,需要转换。“年龄”有缺失值,通常是估算值,这意味着它被汇总统计数据(如中值或平均值)所替代。缺失值可能非常有意义,值得研究它们在现实应用程序中代表什么。这里我简单的用 0 代替 NaNs。
categoricals = []for col, col_type in df_.dtypes.iteritems():
if col_type == 'O':
categoricals.append(col)
else:
df_[col].fillna(0, inplace=True)
上面的代码片段将遍历 df_ 中的所有列,并将分类变量(数据类型为“O”)追加到 categoricals 列表中。对于非分类变量(整数和浮点数),在本例中只有年龄,我用零代替 NaNs。用单个值填充 nan 可能会产生意想不到的后果,尤其是当您用来替换 nan 的值在数值变量的观察范围内时。因为零不是一个可观察到的合法的年龄值,所以我不会引入偏见,如果我用 40,我会的!
现在我们准备好 OHE 我们的分类变量。Pandas 提供了一个简单的方法 get_dummies 为给定的数据帧创建 OHE 变量。
df_ohe = pd.get_dummies(df, columns=categoricals, dummy_na=True)
OHE 的好处在于它是决定性的。按照下面的 column_value 格式,为每个列/值组合创建一个新列。例如,对于“已装船”变量,我们将得到“已装船 _C”、“已装船 _Q”、“已装船 _S”和“已装船 _nan”。
既然我们已经成功地转换了数据集,我们就可以开始训练我们的模型了。
# using a random forest classifier (can be any classifier)
from sklearn.ensemble import RandomForestClassifier as rfdependent_variable = 'Survived'
x = df_ohe[df_ohe.columns.difference([dependent_variable])
y = df_ohe[dependent_variable]clf = rf()
clf.fit(x, y)
训练好的模特准备好被腌制了。我准备用 sklearn 的 joblib。
from sklearn.externals import joblib
joblib.dump(clf, 'model.pkl')
就是这样!我们坚持了我们的模式。我们可以用一行代码将这个模型加载到内存中。
clf = joblib.load('model.pkl')
我们现在准备使用 Flask 来服务我们的持久模型。
烧瓶非常简约。下面是启动一个裸机 Flask 应用程序所需的内容(在本例中是在端口 8080 上)。
from flask import Flaskapp = Flask(__name__)if __name__ == '__main__':
app.run(port=8080)
我们必须做两件事:(1)当应用程序启动时,将我们的持久模型加载到内存中,以及(2)创建一个端点,该端点接受输入变量,将它们转换成适当的格式,并返回预测。
from flask import Flask, jsonify
from sklearn.externals import joblib
import pandas as pdapp = Flask(__name__)@app.route('/predict', methods=['POST'])
def predict():
json_ = request.json
query_df = pd.DataFrame(json_)
query = pd.get_dummies(query_df)
prediction = clf.predict(query)
return jsonify({'prediction': list(prediction)})if __name__ == '__main__':
clf = joblib.load('model.pkl')
app.run(port=8080)
这只在理想情况下有效,在这种情况下,传入的请求包含分类变量的所有可能值。如果不是这样,get_dummies 将生成一个数据帧,其列数少于分类器的列数,这将导致运行时错误。此外,需要使用我们训练模型时使用的相同方法来替换数值变量。
列数少于预期的一个解决方案是保存来自培训的列列表。记住 Python 对象(包括列表和字典)是可以被腌泡的。要做到这一点,我将使用 joblib,就像我以前做的那样,将列的列表转储到一个 pkl 文件中。
model_columns = list(x.columns)
joblib.dumps(model_columns, 'model_columns.pkl')
因为我们有这个持久化的列表,所以我们可以在预测的时候用零替换丢失的值。我们还必须在应用程序启动时加载模型列。
@app.route('/predict', methods=['POST'])
def predict():
json_ = request.json
query_df = pd.DataFrame(json_)
query = pd.get_dummies(query_df) for col in model_columns:
if col not in query.columns:
query[col] = 0 prediction = clf.predict(query)
return jsonify({'prediction': list(prediction)})if __name__ == '__main__':
clf = joblib.load('model.pkl')
model_columns = joblib.load('model_columns.pkl')
app.run(port=8080)
这个解决方案仍然不是万无一失的。如果您碰巧发送了不属于训练集的值,get_dummies 将产生额外的列,您将遇到错误。为了使这个解决方案有效,我们需要从查询数据帧中删除不属于 model_columns 的额外列。
GitHub 上有一个可用的解决方案。
利用以太坊收盘价进行时间序列预测的尝试
Photo by Executium on Unsplash
围绕加密货币的狂热炒作不同于我在这个星球上 25 年来所目睹的任何事情(也许除了狂骨的崛起,这在我上小学的时候是身份的象征)。每天,似乎都有各种密码达到“历史新高”的新报告,经济学家预言众所周知的密码泡沫破裂,新玩家(我正看着你,涟漪)震撼市场。伴随着所有的讨论,我开始思考——这个市场有什么逻辑吗?昨天(甚至最后一小时)的市场动态可以用来预测未来的表现吗?带着这些问题,我开始寻找噪音中是否有信号。
在本帖中,我将使用几种不同的算法,看看是否有可能仅使用“传统”加密货币市场数据(开盘价/收盘价、高/低价、成交量)对每小时的加密货币价格进行可靠的预测。由于许多不同的因素驱动着市场(供给/需求、媒体炒作和/或公众认知、硬币效用等。),这可能看起来像是一个西西弗式的努力,但正如我们将看到的,即使使用节省计算费用的模型,也可以生成相当不错的预测。(此外,这个项目给了我一个深入时间序列分析/预测的借口,我在这里的一组笔记中详细介绍了这一点。)
事不宜迟,我们开始吧!
数据源
对于这项工作,我通过 crypto compare API(https://www.cryptocompare.com/api/)获取每小时的加密货币数据。我发现使用他们的 API/文档非常简单,事实上他们集成了 75 个以上不同的交换,这对我来说是一个一站式商店。然而,唯一的缺点是,当使用免费帐户的 API 时,只能访问 2000 年最近的时间点(大约 3 个月的每小时数据)。
Cryptocurrency closing prices (standardized for visualization).
在这个脚本中,我从五个最大的交易所(比特币基地、波洛涅克斯、北海巨妖、Bitstamp、Bitfinex)提取了五种流行的加密货币(比特币、以太币、莱特币、Dash 和 Monero)的数据。一旦我有了所有的数据,我就执行必要的聚合(平均)以将来自每个交换的特征组合成一个,尽管人们可以想象将它们都保存起来并观察这如何改变事情。
您可能会从脚本中注意到,我还添加了一些额外的功能。除收盘价外,我还包括:
- 成交量:总成交量(交易所平均;一个总数会更自然,但是我丢失了一些交换的数据)
- 波动:波动性的度量;定义为小时最高价和最低价与开盘价之差(交易所的平均值)
- relative_hl_close :波动率的附加度量;使用高/低价(交易所的平均值)对收盘价进行最小-最大缩放。值为 1 表示收盘价与所有交易所在该小时的最高价相同,而值为 0 表示所有交易所的收盘价都是最低价。
在博客的其余部分,我将通过时间序列分析/预测,使用 ARIMA 、随机森林和长短期记忆( LSTM )网络来预测收盘价,详细描述我的冒险经历。我选择使用比特币的亲戚以太坊,它正日益流行。在我修补各种模型/算法的时间里,以太坊市场增长如此之快,以至于我可能会在我这里添加更多的最新数据(我的数据集只持续到 2017 年 12 月的一周左右),但现在,我们将使用我手头的数据。
预赛
在深入研究结果之前,我想花点时间讨论一下贯穿本文其余部分的几个总体统计概念— 平稳性、时间序列验证、和先行一步预测。
Ethereum closing prices (blue) and differenced closing prices (red), standardized for the sake of visualization. The Augmented Dickey-Fuller Test was used to assess stationarity.
平稳过程的维基百科定义是“一个随机过程,它的无条件联合概率分布在时间移位时不变”。对于那些讲统计的人来说,这是一个非常好的一行程序(因此被引用),但是如果它让你抓耳挠腮,不要害怕!本质上,平稳性意味着生成时间序列数据的基本过程与时间无关——如果存在时间相关性,我们如何能够以有意义的方式进行预测?平稳性是一些经典预测技术的核心(例如, ARMA ),即使在它不是必要条件的情况下(树,神经网络),它也是准备数据时要考虑的因素。
时间序列验证是一个相当任性的企业。在一个普通的机器学习问题中,您将获得手头的所有数据,将其随机划分为训练集/测试集(其中一些训练集被保留用于验证),根据训练集拟合模型,根据训练模型为测试集生成预测,并使用所述预测来评估模型的性能。然而,当您有时间依赖性时,这种方法可能不可行,这取决于您选择的算法——随机分割您的时间序列可能会对可以利用的任何类型的自相关造成严重破坏,并且在实践中,您可能会对选择尊重数据的时间依赖性的分割感兴趣(即,使用滚动窗口)。即使找到了合适的验证方案,您也必须决定如何生成预测(一次一个/多个步骤,使用实际/预测值等)。).
Train-test split (time ordering preserved) for Ethereum closing prices.
在这篇文章中,我用以下方式来解决这些问题:
- 对于随机森林,我在超参数调整期间使用了滚动窗口(时间序列分割)。对于 LSTM,为了节省计算时间,我没有加入任何花哨的验证方案。(不过,我确实添加了一些剔除层,有望解决过度拟合的问题)。
- 我保留最近一周左右的数据作为测试集,并生成提前一步的预测,其中实际观察值在需要时成为滞后协变量。我之前提到过,我将在本文的剩余部分使用以太坊,这样做的部分原因与测试集和训练集末尾的收盘价动态之间的偶然相似性有关。如果我们在测试集中有以前没有观察到的不可靠的行为,评估模型性能将是一个徒劳的练习——在这里,这不应该构成太大的问题。
ARIMA
首先,我决定看看我是否能在以太坊的收盘价上安装一个 ARIMA 。如果我在数据中发现了某种 AR§或 MA(q)特征,那么我将尝试引入一组额外的外生变量(ARIMAX ),看看我是否可以改进 ARIMA 的拟合/预测。然而,我很快发现,在这种情况下,单靠 ARIMA 是不可行的,这可能是因为推动加密货币市场的许多不同因素(对自回归/误差项进行线性拟合是不够的)。
我和 ARIMA 的工作进展如下:
- 在 ARIMA, I 代表“整合的”——在实践中,它指的是使所考虑的时间序列平稳所需的差分(d)阶。对于以太坊收盘价,一阶差分(d=1)是我们使时间序列平稳所需要的。
- AR §和 MA (q)分别指我们模型的自回归和移动平均部分。说白了,AR 项是感兴趣的量的滞后值(我们保留其中的 p ),而 MA 项说明过去时间点的回归误差(我们保留其中的 q )。传统上,参数 p 和 q 是从差分(平稳)序列的部分自相关和自相关函数(PACF/ACF)中手动确定的,尽管它们也可以通过模型选择经由AIC/BIC(auto . ARIMA用于 R 用户)来选择。
- 自相关(在滞后 n 时)就是一个时间序列和移动了 n 个周期的同一序列之间的线性相关。另一方面,部分自相关是一个时间序列和偏移了 n 个周期的相同序列之间的线性相关性的度量,调整来自滞后 n 之前的所有滞后的相关性。后者消除了中间(少于 n )滞后阶数之间可能存在的任何相关性,允许对任何给定滞后阶数的相关性进行独立评估。
Autocorrelation (ACF) and partial autocorrelation (PACF) functions for differenced closing prices.
- 本质上,我们在寻找 AR 模型的 PACF/ACF 在滞后零之后稳定/急剧下降的某种模式,以及 MA 签名的相反情况(ACF/PACF)(有关更详细的概述,请查看这些注释)。为了可视化的目的,我已经将上面显示的 ACF/PACF 缩短到只有 50 个滞后,但是最终,没有结构指示 ARMA 过程。
回想起来,我们在这里运气不佳可能并不奇怪。正如我前面提到的,加密货币市场的兴衰是由不确定的潜在因素驱动的,这使得自回归/误差项的线性拟合充其量是可疑的。
随机森林
尽管在 ARIMA 没有取得成功,我还是想探索一些流行的 ML 方法会有怎样的表现。另一个简单(但流行/强大)的预测时间序列的方法是通过回归树,所以我决定尝试一下随机森林 (RF)!
当使用 RF 进行时间序列分析/预测时,人们通常会使用时间序列的滞后值和任何其他被认为在您的问题环境中具有某种效用的附加特征来构建特征矩阵。在这里,我包括了以太坊收盘价的八个滞后值,我前面提到的衍生功能,以及 Monero (XMR)的相同功能集,因为在早期我将完整的功能集(八个滞后加上所有五种加密货币的附加功能)输入 RF 时,这两者之间似乎有某种联系。(旁注:为了更严格地做到这一点,可以用 Boruta 来代替)。
Snapshot of feature matrix (target variable in red box, predictors contained in blue box).
在对一些 RF 参数(n_estimators、max_features、min_samples_leaf)执行了(一点点)网格搜索交叉验证之后,在检查结果之前,我查看了特征的重要性,试图了解 RF 正在做什么:
Feature importances for ETH_USD.
正如人们可能预料的那样,我们看到收盘价的最后几个滞后值支配了所有其他特征(我加入的额外值也完全无关紧要)。由于 ARIMA 只包含目标变量滞后值(和误差项)的线性回归,这将表明,在所有之后,可以从滞后值中收集到一些东西(非线性的)。
此外,Monero (XMR_USD)的一些滞后收盘价中包含一小部分信息。由于我对加密没有深入的投资,我不确定这是否是伪造的,但我认为即使没有适当的解释,我也会保留这些特性。
现在,看看结果:
Actual/predicted ETH_USD closing prices for training set (RF).
Actual/predicted ETH_USD closing prices for test set (RF).
还不错!尽管我们有时会与实际收盘价不同步,但我们从未偏离它们太远。凭借更具识别性的功能,RF 可能会表现得足够好,让加密投资者用他们的钱包做出合理的金融决策——目前,它可能只适合那些喜欢在生活中加点料的人。
LSTM
如果模型的可解释性不是问题,为什么不试着把数据塞进神经网络呢?这里,我们将使用一个长短期记忆网络。(关于 LSTMs 的更多背景,请看这里,这里这里,这里这里。如果你想了解与 crypto 类似的努力,只需看看这里的和这里的。
在将我们的数据输入 LSTM 之前,我们将标准化我们所有的输入特性——为了保持一致,我将包括与 RF 相同的特性。在将其分成适当的训练/测试集之后,我们将把我们的数据分块输入到 LSTM 中——我已经决定以 12 小时为间隔进行此操作——并尝试预测紧接在每个 12 小时窗口之后的一个小时的(标准化)收盘价。对于测试集,我们将使用前面详述的方案进行预测。提前一步预测会对我们的预测提出一个过于乐观的观点(立即预测更长的时间段或使用拟合值会做得更差),但它应该足以用于演示目的。
我们的 LSTM 的总体框架如下:
- 在内部,我们将有一个两层,堆叠的 LSTM。我在每个隐藏层中任意选择了 20 个隐藏节点,但是在实践中,人们可以通过反复试验来确定最佳数量。
- 为了使正规化,我在每次 LSTM 后加入两层退图层。我为每个下降层提供的参数(0.2)也是任意选择的,但也可以调整。
- 出于计算方面的考虑(我正在笔记本电脑上运行这个程序),我将时期的数量限制为五个。通过增加这个数字,你不会烧掉房子,但是损失看起来稳定了,即使是很少的时期。
随着这些细节的公开,以下是我们的 LSTM 的表现:
Actual/predicted ETH_USD closing prices for training set (LSTM)
Actual/predicted ETH_USD closing prices for test set (LSTM).
汪汪。虽然我们看到 LSTM 在 11 月底之前的训练中表现相似,但我们在测试中表现不尽如人意。然而,值得注意的是,我们似乎能够捕捉到该系列的总体形状(上涨时上涨,下跌时下跌,等等。),但我们永远无法到达最高点和最低点。如果我是一个打赌的人,我会把这种行为归因于缺乏参数调整,或者我们的 LSTM 学习到的大多数“长期”行为可能来自 9 月到 11 月初,在 11 月底/12 月更不稳定的行为之前。这反过来又说明了 LSTMs 的一个局限性——要使它真正发挥优势,我们需要许多样本,这些样本包含像这样的时间序列的所有细微行为,以馈入我们的网络。
总结(TL;博士)
在这篇博文中,我介绍了在加密货币收盘价的背景下用于时间序列分析/预测的三种流行方法的比较。虽然我们确实观察到了不错的结果,但加密货币市场的善变性质阻止了我们提升到吉姆·坎托雷级别的预测者,并且从理论上来说,纳入从诸如外汇市场和 T10 在线论坛 T11(或 Twitter/Google)构建的其他协变量可能会带来更好的时机。
参考
Jupyter 笔记本:各种剧情、 ARIMA 、随机森林、 LSTM
评估数据科学家能力的框架
不乏建议 讲解 如何 如何 聘请 一个 数据 科学家。我以前写过这个话题。大多数建议假设一个理想的数据科学家应该具备的技能或素质列表,并专注于如何对求职者拥有这些技能感到自信。我想更仔细地看看这份基本技能清单。标签是有问题的。例如,“统计学”通常被认为是数据科学家技能集的一个重要方面,但你会发现数据科学家更多地来自计算机科学背景,而不是统计学背景。因此,我们可能会创建一个“机器学习”维度来适应这种背景。因此,我们要么专注于两种实际上有很多重叠的不同技能,要么将它们归为“统计和机器学习”技能,这正好避免了这个问题。换句话说,数据科学家需要什么技能的问题是一个降维问题。
大多数降维的一个关键特征是关注正交性,我认为这也是大多数讨论所缺少的。数据科学家技能框架应该采用庞大、杂乱的数据科学家-数据科学家-技能矩阵,并尝试将其缩减为几个重叠最小的信息维度。这可能需要一些文字上的修饰,以避免使用已经加载的术语,但这在概念上是值得的。例如,我认为“编码能力”不属于技能框架,更不用说像 R 或 Python 这样的特定语言了。在设计良好的主题中展示所有技能的数据科学家应该理所当然地展示编码技能,因为公司有技术堆栈,数据科学家需要与技术堆栈集成的技能,以确保他们的工作是可重复和可扩展的。像编码这样的东西是一种手段,而不是目的,因此我认为它们不应该成为直接的目标。
我还应该提前声明,我坚信“数据科学家”的角色应该与“工程师”和“分析师”的角色分开。这就是我目前工作的角色,但我知道在许多其他组织中情况并非如此,包括我以前工作过的那些组织。我认为我现在的雇主说得对。即使在财务或其他业务考虑要求一个人担任两个或更多角色的情况下,我认为这也应该被视为一个人身兼数职,而不是数据科学家的帽子大到足以包含其他两个角色的标志。
我开始认为“好的数据科学”是在个人层面上不存在的东西:虽然单个团队成员都非常擅长某些技能,但建立强大的数据科学能力是任何一个人都无法完成的事情。我看到的大多数关于数据科学技能的讨论都没有明确承认这一点。我们所有人的技能都有差距,但只要团队没有任何差距,那就没问题:它确保我们能够共同完成我们需要做的事情,并且仍然给我们所有人留下许多成长的机会。我通常在这样的讨论中看到的是某种免责声明,大意是不是每个人都需要检查每个框。如果这是我们作为数据科学专业人员的想法(我认为大部分是这样),那么它应该明确地纳入我们的框架。
框架
个人技能
让我们来看一下每一项技能,并讨论当我们看到它们时如何识别它们。
设计分析。属于该能力的技能与将业务需求转化为技术分析计划有关。数据科学家使用这些技能做出的决策部分取决于可用数据的结构、类型和数量,但也取决于存在的业务需求,而不管数据看起来如何。该能力范围内的所有技能都可以归入“知道如何处理不明确的需求”的大标题下
- **明确地计划分析。**这包括里程碑的范围界定、排序和证明。分析很少会有一个自然的停止点——几乎所有的分析都可以被无休止地改进。在业务应用程序中,需要对分析进行范围划分和划分:需要设定里程碑,需要为每个里程碑确定停止规则,并且需要以保持概念完整性的方式将所有部分总结为一个整体。
- **预见并解决相互矛盾的解释。**这可能包括实验设计、抽样策略或敏感性分析。任何分析都做出断言:预测足够准确,有商业价值,变量 x 和 y 是重要的预测指标,增加变量 z 并没有增加足够的价值,值得等等。所有这些主张都容易受到对立解释的影响:抽样有偏差,数据集不平衡,变量定义不当,等等。预测这些漏洞是一种技能。特定的方法可能会减轻问题,但通常关键是将假设检查纳入分析的设计中。
- **确定评估结果的最佳方式。**这可能包括诊断指标、基准或 KPI 开发,以监控产品质量。分析很少产生具有明确解释价值的结果。通常,问题不是“结果好吗?”,而是“结果是否比我们以前获得的结果对业务更有价值?”评估分析结果需要了解分析方法的输出,以及结果将部署到的业务环境。
**进行分析。**当人们谈论数据科学时,属于这种能力的技能通常会受到大量关注。数据科学家利用这些技能做出的决策几乎完全取决于数据本身的细节。
- **适当地探索数据。**这包括分布、汇总指标、可视化和功能选择/工程。这些技能可以简单到知道如何表征分布或集中趋势的度量,也可以复杂到设计全新的功能。这项技能的重点是了解在数据集中寻找什么类型的“陷阱”,以便可以转换、省略、适应或减轻这些特质。
- **建立或应用适当的算法。**这包括回归、分类、降维、聚类和参数调整。分类数据有时会对分析施加不同于连续数据的约束。稀疏与密集数据、有监督与无监督学习问题等也是如此。不同的问题需要不同的技术方案,知道如何选择合适的技术方案是一项有价值的技能。
- **明确记录调查结果。**这通常包括数据可视化和技术交流。记录分析结论的摘要有助于其他人从一个数据科学家停止的地方继续分析,但也可以作为对数据科学家结论的健全性检查。如果分析结果不能清楚地记录下来,那么很有可能分析不够连贯,不可信。
**将分析纳入管道。**数据在用于分析之前和之后会发生很多变化。数据科学家的部分职责是确保这些移交顺利进行。这是数据科学家的技能组合与工程师的技能组合最一致的地方。当工程师能够按照数据科学家需要的方式清理、构建和定位数据时,这总是有用的,但这应该是提高效率的一种方式,而不是能够完成工作的先决条件。
- **从任何格式和位置读取/写入数据。**这包括数据库查询、合并不同的文件类型、API 和文件管理。数据科学家不能奢望让别人来组织他们的数据集。需要从数据所在的任何格式和位置提取用于分析的数据,并输出到那些将使用结果的人所需的任何格式和位置。
- **合并复杂匹配和过滤。**进行布尔匹配或过滤,将字符串或数字作为整体进行比较,是一项相对简单的任务。然而,许多数据科学需要更复杂的操作,定义匹配字符串子集的模式或使用复杂的数据类型,如时间戳、shapefiles、图形。
- 使工作与工程堆栈兼容。这包括版本控制、编码风格和软件工程最佳实践。如果不能整合到业务的其他技术系统中,或者不能扩展(如果业务需要的话),那么世界上最好的分析也是没有用的。
**将管道纳入业务。**该能力中的所有三项技能都属于“沟通技能”的范畴。这个标签通常不够精确,没有用。如果一个数据科学家可以在任何情况下都与每个人很好地沟通,那就太好了。任何人能做到这一点都很好。数据科学家必须能够在三种特定环境下进行交流。
- **发现业务的需求。**这包括前期技术要求和对更广泛行业背景的理解。这项技能主要是为了让数据科学家理解非技术主题。数据科学家通常充当技术和非技术利益相关者之间的桥梁,因此应该能够理解业务的非技术方面。
- 浏览企业的组织结构。这包括建立关系和利益相关者管理,有时被总结为“软技能”。任何组织都有需要驾驭的人际关系,以实现业务成果。这当然包括不做混蛋的人际技巧,但也包括,例如,识别项目的非官方看门人并在计划更广泛的听证会之前获得此人的认可的更微妙的技巧。
- **为不同的受众打包技术工作。**这包括非技术交流,包括视觉效果和信息。这是“发现业务需求”技能的另一面。无论是出于营销目的还是为了确保利益相关者能够明智地使用数据科学产品,数据科学家都需要能够让非技术人员了解技术主题。
**建立职业。**这个能力领域可能看起来更像是一个“值得拥有的东西”,但我认为这大大低估了超越一个人的工作进入更大的职业领域的价值。数据科学作为一种职业变化太快,如果数据科学团队不持续地重新评估什么是数据科学,他们就无法真正跟上技术的发展。与更大范围的职业接触标志着一个个人贡献者,他做出有意义贡献的能力已经被审查。
- 尽力做出贡献。聚会、黑客马拉松、开源代码库、博客和其他公共贡献让数据科学家与更广泛的社区保持联系。公共捐款会引起公众的评论和批评,这反过来会改进实践。
- **领导团队。**参与工作小组、担任团队初级成员或实习生的导师是团队中最常见的非正式领导职位。在某些方面,非官方领导是公开贡献的缩小版:它让数据科学家的实践接受审查,从而改进实践。
- **起草政策和程序。**这可能包括创建候选人面试协议、会议出席政策或社交媒体政策。对更广泛的数据科学社区的贡献不一定要公开。如何最好地组织和管理数据科学团队仍然是一个悬而未决的问题。政策和程序是可传播的人工制品——能够改善的不仅仅是创建它们的组织。
能力水平
确定正交的能力领域是定义数据科学技能标准的一半挑战。挑战的另一半是决定如何评估能力程度。我发现意识能力学习模式是思考技能水平的一种便捷方式:
无意识的不称职意味着数据科学家不熟练,但在很大程度上没有意识到这一点——事实上,甚至没有意识到拥有技能的重要性。例如,从事技术职业的人通常被刻板地认为在软技能领域无意识地无能——他们不擅长与人互动,没有意识到自己不擅长,有时甚至否认擅长这种事情的重要性。无意识无能的人对某项技能的直觉很差:他们得出错误的结论,因为他们甚至不知道问题出在哪里。
有意识的无能意味着数据科学家知道问题是什么,但不知道如何解决。这一阶段的学习是艰难的——数据科学家可能会将错误视为对他们作为员工的价值的控诉,或许在请求导师指出更微妙的方法之前,模仿公认的最佳实践的时间超过了明智的时间。
自觉能力意味着数据科学家知道问题和答案。这仍然是学习的高速增长阶段,但数据科学家将错误视为新信息的宝贵来源。困惑或无能的感觉被认为是一种积极培养能力的信号。
无意识能力是一种技能已经成为“第二天性”的阶段——以至于展示这种技能几乎不需要有意识的思考。
使用标题
传统上,一个标题提供了一个清单:评估者为每一行项目选择一个最能体现被评估者技能水平的选项。由于数据科学家非常清楚报告集中趋势而非分布测量的危险,因此该标题是为更细微的用法而设计的。例如,我在目前的职位上只呆了几个月,下面是我如何为自己填写的:
因为一个数据科学家可以有几十甚至几百种方式来举例说明一项特定的技能,我已经描绘了我认为我在每项技能中的最低()表现在哪里。下面是我决定用这种方式填写表格时的想法的简要解释。
- **明确规划分析。**我在社会科学领域的背景,以及我在各种行业和部门工作的十年,让我或多或少地习惯于将一个模糊的目标分解成几个可衡量的子目标,并为我的计划提供理由。也就是说,我阅读关于设计原则的文章和书籍,仍然经常发现我不知道的最佳实践。
- 预测并解决不同的解释。定义我在分析中做出的假设,并对这些假设进行测试,这是我的第二天性。我对实施大多数采样策略或提出自己的策略完全满意。我对实验的形式设计原则只是略知一二,如果没有进一步的学习,我不会觉得自己有能力实施这些原则。
- 确定评估结果的最佳方式。我认为我在这方面一般比较可靠。这不是第二天性,但我已经有一段时间没有遇到任何完全陌生的领域了。
- **适当发掘数据。**在探索性可视化方面,我会给自己打高分到非常高的分,但在统计分布方面,我会稍微低一点(我不是统计学出身,所以在那个领域有很多我不知道的东西)。我也意识到有许多我只是名义上熟悉的工程特征的方法。
- **建立或应用适当的算法。**我觉得我在这方面总体上是有能力的,但是我很少有机会使用深度学习方法。这是我技能组合中的一个明显的缺口。
- **清楚地记录调查结果。**我对这项技能的感觉类似于我对“明确计划分析”技能的感觉。我的背景训练我这样做,我的经验给了我很多实践。我很少需要考虑如何去做。
- 从任何格式和位置读取/写入数据。在这项技能上,我从第二天性(CSV、Postgres)到一般胜任(SQL、Spark、AWS EC2 和 S3 的大多数其他版本),到不胜任但知道它(其他 Hadoop 技术、其他 AWS 服务、其他像 Google Bigtable 这样的云系统,等等)。)
- **合并复杂的匹配和过滤。**文本模式匹配(正则表达式等。)是我的第二天性,大多数日期时间数据管理也是如此。我最近对形状数据和图形非常熟悉,但我知道在这些领域我还有很多东西要学。
- **使工作与工程堆栈兼容。**在很大程度上,我觉得自己在这方面总体上是称职的,这主要是因为我过去组建并管理过一个数据科学和工程团队。然而,对于顺利移交给需要大规模运营的工程团队,我仍在学习许多东西。
- 发现业务需求。总的来说,我在利益相关者管理、需求开发、业务流程映射等方面有很多经验。然而,我转到了现在的工作岗位,却没有那份工作的行业经验。我很大程度上对这个行业一无所知,并满足于在机会到来时学习,而不是明确地优先考虑这个领域的增长。
- 浏览企业的组织结构。总的来说,我在这方面很擅长,但是我在一个新的组织中工作,这个组织的结构和政策正在发生很大的变化。说到具体的,我不知道我不知道的。
- **为不同的受众打包技术工作。**我通常很擅长这个。我作为人类学家的背景使我能够相对容易地理解他人的观点,几年的教学经验使我能够相对容易地对甚至难以理解的话题进行陈述。
- 对外投稿。我写博客已经很多年了。我曾经在 Github 上发布过很多我的作品,但是已经有几年没有这么做了,因为我的大部分作品都是专有的。我仍然在业余时间想办法做志愿者或咨询,我积极参加招聘活动。
- **带队。**我领导一个外部拓展和协作工作组,并指导团队中的初级成员。
- 政策和程序草案。除此之外,在我从事的所有工作中,我倾向于关注政策。有时候这是我的主要工作职责之一。
我个人更喜欢在前瞻性对话中使用技能标准,而不是在回顾性对话中。例如,绩效评估不一定是谈论数据科学家在任何特定技能集方面的一般能力的合适时间和地点。然而,这是一个合适的时间和地点来谈论数据科学家如何花几个月的时间,比如说,创建一个优雅的统计解决方案,不能大规模部署。审查时的问题不是缺乏技能;这是缺乏价值的传递。然后,这可以为一个单独的前瞻性对话奠定基础,在这种情况下,建立一个人的软件工程约束和最佳实践的知识。绩效评估作为一种现实检查,然后这个标题作为一种工具来构建一个增长计划。在我为自己填写标题时,我决定在一些领域发展,按优先顺序排列如下:
- 更好地了解业务需求。我觉得与我们客户的实际需求有些距离。我的大部分创新想法来自我自己,而不是来自实际使用我们产品的人。我希望感觉自己有一个了解客户痛点和愿望清单的既定渠道。
- **提高我的分析规划/设计技能。**当时我正在阅读弗雷德·布鲁克斯的设计的设计,我很喜欢它,但我觉得我没有保留足够的东西来真正地将它融入我的实践中——我想要更多的经验来明确地设计整个数据支持的项目,而不仅仅是设计单个的分析。
- **练习使用流式数据。**我使用的大部分数据可以来自流,但它总是一段时间内的快照或摘要。我想在使用 Kafka、Spark Streaming contexts 等方面获得更多的经验。
- 网络分析。通过我最近的一些工作,我对网络分析变得更加熟悉,但是在这个领域还有大量的领域需要探索,我发现我真的很喜欢它。
- **学习 Scala。**我使用 PySpark,但是我遇到过几种情况,如果我使用 Scala 的话,工作效率可能会更高。当我看到 Scala 代码时,我知道的足够理解它,但我不会写它。
- **开源我的一些作品。**我对创建自己的图书馆不感兴趣,虽然我很想为已经建立的图书馆做些贡献,但我不确定我能在哪里增加价值。与此同时,我开发了几个方便的函数来处理杂乱的形状数据,还开发了一些函数通过 Spark 从邻接表中获取连接的组件。我想优先记录这些事情,并获得我的雇主的许可,公开分享这些信息。
- 扩展我在功能工程方面的经验。有很多方法。我使用的相对较少,并且熟悉许多其他的,但是我觉得那只是我技术专长的一小部分。
- **熟悉深度学习。**它现在很流行,而且在它成功的领域确实产生了一些很好的结果,所以我认为在这方面胜任对我有好处。
为什么重要?
我想说,质疑我们为什么需要如此具体地定义数据科学技能集是公平的,但我真的不认为质疑这一点是公平的。当我们有如此多的招聘广告规定数据科学家必须拥有 STEM 领域的高等学位,或者必须通过一系列玩具编码挑战,或者必须在一系列不可思议的技术工具中拥有在职经验时,就不会这样了。任何在就业市场上寻找数据科学职位的人都看到,大多数潜在雇主对他们在寻找什么或如何识别能力知之甚少。技能框架为对话建立了共同的基础,即使这些对话是在观点大相径庭的人们之间进行的。这个规则迫使你和其他人对评估都要明确。一个好的框架不能保证对话会有成效,但是一个糟糕的框架几乎可以保证对话不会有成效。很多人想雇佣一名数据科学家。许多潜在的数据科学家希望被雇佣。如果我们能够更加清楚和准确地了解数据科学家需要能够做什么,我们就可以让这两个群体都比现在更高兴。
一个免费的谷歌数据工作室是一个好的开始,但是在民主化分析方面我们还有很长的路要走
Google Data Studio 向分析民主化迈进了一步,但却未能向最需要的人提供数据分析的 3 个原因。
谷歌最近在其谷歌数据工作室中启用了无限报告。在这样做的时候,他们实际上让他们的旗舰数据分析工具免费供每个人使用。
从高层次来看,Google Data Studio 提供了一套全面的分析功能,包括:
- 集成来自多个数据源的数据,包括 SQL 数据库、Google Analytics 和 Google Sheets。
- 格式化和清理集成数据集,为分析做准备。
- 基于清理后的数据集生成和共享数据可视化和仪表板。
传统上,这些功能只在 Chartio 和 Quill 等付费工具中提供。因此,推出免费的谷歌数据工作室是向数据分析普及迈出的一大步。
首先,我想首先为谷歌这一前瞻性的决定鼓掌。免费的数据可视化和集成工具是走向分析民主化的关键一步。
然而,我也相信,就像谷歌分析一样,让谷歌数据工作室免费只是让数据分析变得简单、有趣、对所有企业都有价值的过程中的第一步。
虽然谷歌数据工作室(GDS)提供了许多有用的功能,但它在帮助中小企业理解和提取数据价值方面存在不足,因为:
- 尽管 GDS 拥有强大的数据清理和整合能力,但它并不指导一个组织的整体数据战略,也不帮助它决定首先收集和分析哪些数据集。
- 虽然它的可视化和仪表板功能可以快速测试业务假设,以找到“已知”业务问题的答案, **GDS 不能帮助组织发现令人惊讶的见解,**或“未知的未知”。
- 虽然 GDS 可以帮助企业监控和跟踪指标,它没有告诉你如何首先识别和选择好的指标来跟踪。
我来详细说明一下。
GDS 并不指导一个组织的整体数据战略
数据分析本身从来都不是目的。它总是实现某些商业目标的一种手段。
因此,在开始一个分析项目之前,你需要非常清楚它如何为你的业务增加价值——是增加收入、削减成本还是获得更多客户。
如果没有明确的战略,您甚至不知道首先要在您的组织中收集哪些数据集,您的分析也不会为您带来任何即时的业务洞察力。
Google Data Studio 使在您的组织中收集和清理数据集比以往任何时候都更容易,但它并不能帮助您首先提出数据收集的策略。
然而,制定良好的数据战略并理解数据的直接价值是阻碍中小型企业在其组织中采用分析的最大挑战。
作为 Humanlytics 客户开发流程的一部分,我的团队采访了 70 多家中小型企业(SMB)。在所有接受采访的企业中,我们发现的两个最大的难点与数据策略有关,而不是分析项目本身:
- 采用:“我们不理解在我们公司实施数据分析的商业价值。”
- 解读:“我们缺乏人才和资源来理解我们拥有的数据,并从数据中提取可操作的见解。”
尽管许多公司也抱怨集成、清理和可视化方面的痛点,但实际上是数据采用和解释首先阻止了中小型企业使用任何分析。
Google Data Studio 根本没有解决这两个挑战,因为您仍然需要有经验的分析师或顾问来协助中小型企业,并帮助他们了解如何在他们的组织中使用数据,而数据人才通常对这些企业来说非常昂贵。
**GDS 不会帮助组织发现令人惊讶的洞察力,**或者“未知的未知”
在分析过程中,您可以向数据提出三种类型的问题:
- “已知的已知”:什么是我们已经知道的,我们想要验证或定期跟踪的洞察力?
- “已知的未知”:有哪些我们知道自己不知道的因素,需要我们去调查?
- “未知的未知”:有哪些我们尚未意识到的隐藏见解可能会提供机会?
虽然发现“已知的已知”和“已知的未知”的能力在帮助公司建立数据驱动的行动和调查流程方面至关重要,但发现未知的未知的能力被认为是分析可以提供的最有价值的见解。
这是因为发现“未知的未知”的能力可以为您的公司提供超越竞争对手的分析优势,并为您提供竞争对手不知道的独特信息和模式。
Google Data Studio 的可视化和仪表板功能使组织能够回答“已知已知”级别(通过仪表板和主动监控)和“已知未知”级别(通过提供数据可视化工具)的问题。然而,它不能提供发现“未知的未知”洞察力的能力。
本质上,需要丰富的数据分析经验和时间来发现“未知的未知”分析师不仅需要使用多个维度快速分割数据,还需要有统计敏锐度来识别数据中的异常。
此外,随着更多的维度被添加到分析中,所需的分析工作量也呈指数级增长。
例如,如果您想要通过流量来源确定跳出率,您可能只需要进行 3 次分析,但如果您想要通过流量来源和地理来源确定跳出率,您将需要 5*5 = 25 次分析,并且随着您添加更多维度,复杂性只会呈指数级增加。
渐渐地,从人力和经济上来说,进行分析来揭示所有相关的“未知的未知”变得不可能,而 Google Data Studio 并没有充分缓解这种分析压力,使其在经济上可行。
3.尽管 GDS 可以帮助企业监控和跟踪指标,它并没有告诉你如何首先识别和选择好的指标来跟踪
Google Data Studio 的交互式仪表盘和数据可视化功能使用户能够几乎实时地跟踪重要指标,并将这些分析结果传达给整个团队。
这种度量跟踪和监控功能对于许多企业来说非常重要,因为它可以为他们的业务活动提供实时反馈,并使他们能够快速迭代和调整他们的策略。
然而,虽然跟踪指标很重要,但我们采访的许多中小型企业都很难首先提出这些指标。
这是因为提出好的指标非常困难,需要丰富的行业经验和良好的分析能力。
通常,好的指标需要具有可比性、可理解性、相关性和可操作性。它们还需要足够精细以捕捉真实信息,并且足够简洁以避免因分析而瘫痪(我在本文的中谈到了选择好的度量标准)。
除了这些标准之外,企业还需要在度量选择过程中避免“度量陷阱”,如“虚荣度量”(没有上下文的度量)和“错误度量”(没有反映业务目标的度量)。
此外,因为只建议企业一次跟踪大约 10 个指标,所以即使一个错误的指标也会严重损害公司的决策过程。这反过来会侵蚀数据驱动的决策文化中的信任。
对于没有经验丰富的分析人才的中小型企业来说,通常很难在第一时间选择好的指标供 Google Data Studio 跟踪。因此,在这一领域,GDS 工具在帮助这些公司采用分析方面再次表现不佳。
在本文中,我们研究了 Google Analytics 无法帮助企业解决的一些重要商业问题。
然而,本文的目的绝不是批评谷歌数据工作室,而是指出一个事实,即它不应该被视为商业中所有分析问题的“万灵药”。
在我看来,Google Data Studio 并没有让中小型企业的分析变得更容易,而是让营销分析师和分析机构的数据分析和可视化变得更容易。
事实上,我们唯一一次与对 Google Data Studio 非常感兴趣的受访者交谈的是那些喜欢将自己的发现传达给客户的顾问。
这里的问题是,数据顾问通常为大型企业提供良好的服务,这就是为什么他们不断与大型企业签订合同。但我们不要忘记中小企业,它们提供了我们国家 55%的工作岗位,是我们经济的支柱。他们通常没有钱或资源来雇佣数据科学家或顾问团队。
在中小型企业能够理解他们可以通过跟踪已知信息、测试已知未知信息和发现未知未知信息从数据中提取的可操作的业务洞察力之前,我们还有很长的路要走…
在 Humanlytics,我们希望为中小型企业打造一款工具,不仅能帮助他们回答业务问题和实时跟踪指标,还能告诉他们应该问什么问题,并教他们如何实施解决方案。
如果你对更多类似的内容感兴趣,请关注数据科学。请在 媒体上关注我们 ,或者在 推特*【脸书 上关注我们。如果你对这篇文章有任何问题,请随时给我发电子邮件,地址是 bill@humanlytics.co。*