比较重复测量数据的常用分析策略
处理数据中的依赖关系。
这是怎么回事?
我希望这篇文章能提供一个关于如何处理社会科学中常见的特定类型数据集的概念概述(在我自己的实验心理学和认知神经科学学科中也很常见)。我的目标不是提供数学形式,而是建立一些直觉,并尽可能避免术语。具体来说,我想比较一些人们可以使用的更常见的分析策略,以及它们如何因情况而异,最后是一些有望指导您未来决策的要点。但要做到这一点,我们需要从头开始…
重复什么?
数据集有各种不同的形状和大小。在许多介绍性教程、课程甚至真实世界的例子中,人们通常会处理被称为满足许多常见统计模型的“i.i.d .假设”的数据集。这在英语中是什么意思?它指的是每个数据点在很大程度上独立于完整数据集中的其他数据点。更具体地说,这意味着模型的残差(即模型无法解释的剩余部分)彼此独立,并且它们都来自于相同的分布,其平均值为 0,标准差为σ。换句话说,了解模型产生的一个错误很少会告诉你模型产生的任何其他错误,并且通过扩展,了解一个数据点的一些情况很少会告诉你任何其他数据点。
然而,许多类型的数据包含“重复”或“复制”,例如在一段时间内或在不同条件下测量相同的人。这些数据明显违反了这个假设。在这些情况下,一些数据点比其他数据点更相似。违反这些假设会导致模型估计不尽如人意( Ugrinowitsch 等人,2004 )。更隐蔽的问题是,使用这些估计值做出的推断(例如,计算 t-统计量和延伸的 p 值)可能非常不准确,并产生假阳性 ( Vasey & Thayer,1987 )。让我们通过考虑两个不同的数据集来使这一点更加具体。
在案例 1(左)中,我们给 21 个人每人一次调查,并尝试查看他们的调查回答是否与他们的一些人口统计数据有任何关系。总共 21 个数据点,非常简单。在案例 2(右图)中,我们给 3 个人每人 7 次调查,做同样的事情。总共 21 个数据点,但是这次每个数据点不是相互独立的。在第一种情况下,每个调查答复都是相互独立的。也就是说,了解一个人的反应并不能告诉你另一个人的反应。然而,在第二种情况下,这是不正确的。在你第一次调查时了解了 A 的一些调查结果,在你第二次调查时,你会对 A 的调查结果有更多的了解,而这也必然会给你更多关于 B 的回答的信息。因此不独立。在最极端的情况下,忽略数据中的这些依赖性来估计模型可能会完全逆转最终的估计,这种现象被称为辛普森悖论。
分析策略。
那么我们通常会怎么做呢?有一些不同的分析“传统”以不同的方式处理这个问题。这绝不是一个详尽的列表,而是许多不同文献中相当常见的方法。
多层次模型
像许多其他心理学/神经科学研究人员一样,我第一次被告知重复测量 ANOVAs 是分析这类数据的唯一方法。然而,这已经有点脱离实际,而支持多级/混合效果建模的更灵活的方法( Baayen 等人,2008 )。我不想关注为什么多层建模通常更可取,因为这是一个不同的讨论(例如,更好地处理缺失数据,不同数量的重复,额外水平的重复,不同数量的重复等),但足以说,一旦你开始使用这种方法,基本上没有理由再次运行重复测量的方差分析。深入研究这些模型如何工作的所有细节超出了本文的范围,但是我将链接一些参考资料。从概念上讲,多级建模同时估计描述整个数据集以及每组重复内的关系的系数。在我们上面的例子中,这相当于估计调查响应和调查应答者的整个人口统计之间的关系,以及个人偏离这些估计的程度。这具有将估计及其相关误差“汇集”在一起的净效果,并且如果你熟悉贝叶斯术语,其工作方式与使用先验知识并不完全不同,或者如果机器学习更适合你,其工作方式与使用正则化/平滑并不完全不同。以这种方式估计模型的结果意味着估计可以“相互帮助”,这样,如果我们的一些调查受访者没有在每次我们要求他们填写调查时填写调查,我们就可以估算值,或者我们可以通过假设个人的估计都来自同一人群来“清理”我们从特定个人那里获得的有噪声的估计,从而限制他们可能采取的不可靠的值。
在实践中,使用这些模型可能有点棘手。这是因为,如何设置这些模型进行评估并不是一目了然的。例如,我们是否应该假设每个回答者的调查结果和人口统计数据之间有不同的关系?或者我们应该简单地假设他们的调查结果平均起来不同,但随着人口统计数据的变化而变化?具体来说,用户对于如何指定模型的“随机效应”(偏差估计)部分有多种选择。你可能遇到过像“随机截距”或“随机斜率”这样的术语在我们的示例中,这是允许模型学习每个人的调查响应的唯一平均估计和学习每个人的调查响应和人口统计结果测量之间的关系的唯一回归估计之间的差异。在许多情况下,计算一个可以计算的完整系数集(截距、斜率以及每个预测值之间的相关性)(巴尔等人,2013 )会导致模型无法收敛,给用户留下不可靠的估计。这导致了一些建议,即保持模型相对于人们试图做出的推理相对“简单”(贝茨等人,2015 ),或者比较不同的模型结构,并在执行推理之前使用模型选择标准在它们之间进行裁决( Matuschek 等人,2017 )。很棘手吧?尝试这个指南来帮助你,如果你冒险沿着这条路走下去,或者查看这个帖子来一个漂亮的视觉治疗。 Brauer & Curtin,2018 是一个特别好的一站式商店,提供审查、理论、实践、评估问题和代码片段。如果多层次的模型让你兴奋的话,有吨的资源 可用。
稳健/校正的标准误差
在其他学术领域,有一种完全不同的传统来处理这些类型的数据。例如,在一些经济学学科中,“稳健/三明治/休伯-怀特”标准误差是为标准线性回归模型计算的。本讲座提供了这些技术的数学概述,但总的来说,这种方法需要使用普通最小二乘(OLS)回归以“典型”方式计算回归系数,但需要“校正”这些估计量的方差(即标准误差),以了解它们的异方差程度。也就是它们的方差相差多少。有几种方法可以解释异方差性,包括小样本和自相关校正等,但另一种方法是计算关于数据中“簇”或分组因子的稳健估计。在上面的例子中,聚类将包括调查回答者,并且每个调查响应将包括该聚类中的数据点*。因此,这种方法完全忽略了在计算回归系数时存在重复测量的事实,而是在通过调整其标准误差对这些系数进行推断时考虑重复测量数据。有关这种计算的概述,请参见本演示文稿,有关更正式的处理,请参见卡梅伦&米勒,2015 。*
两阶段回归/汇总统计方法
最后,我们可以使用的第三种方法是所谓的两阶段回归或汇总统计方法( Frison & Pocock,1992;福尔摩斯&弗里斯顿,1998 。这种方法是功能磁共振成像数据分析的常规方法(芒福德&尼科尔斯,2009 )。从概念上来说,这看起来像是将一个标准的 OLS 回归模型分别拟合到每个调查对象,然后将第二个 OLS 模型拟合到每个个体对象的拟合系数。在最简单的情况下,这相当于对个人系数计算单样本 t 检验。您可能会注意到,这种方法“感觉”类似于多级方法,在通俗英语中,实际上存在多级建模。但是,请注意每个第一级模型是如何完全独立于每个其他模型进行估计的,以及它们的误差或估计值的方差是如何以任何有意义的方式进行合计的。这意味着我们失去了从上述正式的多层建模框架中获得的一些好处。然而,我们可能失去的好处在简单性中得回了:没有额外的选择要做,例如选择一个适当的“随机效应”结构。事实上, Gelman,2005 指出,两阶段回归可以被视为多级建模的一种特殊情况,在这种情况下,我们假设个体/聚类级别系数的分布具有无限方差。
我们如何决定?
拥有所有这些工具有时会让我们很难判断哪种方法更适合什么情况,以及是否有一种方法总是比其他方法更好(剧透:没有)。为了更好地理解我们何时可以使用每种方法,让我们考虑一些我们可能遇到的最常见的情况。我将这些称为我们的数据可以变化的“维度”。
维度 1:我们想要做出推论的单位的样本大小
不同数据集之间最常见的差异就是它们的大小,也就是我们真正要处理的观察值的数量。在非独立数据的情况下,分析师可能最感兴趣的是对数据的特定“级别”进行推断。在我们的调查示例中,这是对“人”的概括,而不是调查的具体实例。所以这个维度根据我们采样的个体数量而变化,不管我们对任何给定的个体采样了多少次。
维度 2:嵌套在我们想要推断的单元中的单元的样本大小
我们的重复测量数据可能变化的另一个方面是我们要处理多少次重复。在上面的例子中,这是我们对任何给定个体的观察数量。每个人都填写了 5 次调查吗?10?100?因此,这个维度根据我们对任何给定个体的采样频率而变化,而不管我们总共采样了多少个个体。
维度 3:我们想要做出推论的单元之间的可变性
每种分析方法的一个关键不同之处在于它们如何处理(或不处理)不同重复组之间的可变性。在上面的例子中,这是个人之间的方差*。不同的人真的会有不同的反应吗?在一个极端,我们可以将每一个人的调查回答视为完全独立的,忽略我们多次调查个人的事实,假装每一次调查都是完全独特的。另一方面,我们可以假设调查响应和人口统计之间的关系来自更高层次的分布,并且特定人的估计是该分布的实例,保留每个人自己的响应彼此之间比他们与其他人的响应更相似的事实。我将在下面再回到这个话题。*
模拟可以帮助我们建立直觉。
通常在这种情况下,我们可以使用模拟数据,以特定的方式设计变化,以帮助我们获得一些洞察力,了解这些事情如何影响我们不同的分析策略。让我们看看这是什么样子。我将主要使用我编写的 pymer4 Python 包来模拟一些数据并比较这些不同的模型。我最初写这个包是为了减少我在工作中不断在 R 和 Python 之间来回切换的切换成本。我很快意识到我对 R 的主要需求是使用奇妙的 lme4 包进行多层建模,因此我编写了这个 Python 包,作为一种在 Python 内部使用 lme4 的方式,同时与其他科学 Python 堆栈(例如 pandas、numpy、scipy 等)配合良好。从那时起,该软件包已经有了很大的发展( Jolly,2018 ),包括适应上面讨论的不同类型的模型和模拟不同类型的数据的能力。好了,我们开始吧:
# Import what we need
import pandas as pd
import numpy as np
from pymer4.simulate import simulate_lmm, simulate_lm
from pymer4.models import Lm, Lmer, Lm2
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context('poster')
sns.set_style("whitegrid")
%matplotlib inline
从小处着手
让我们从单个模拟数据集开始,并拟合上面讨论的每种类型的模型。下面我正在生成多层次的数据,类似于上面的玩具例子。数据集由 50 个“人”组成,每个人有 50 个“复制品”。对于每个人,我们测量了 3 个独立变量(例如 3 个调查问题),并希望将它们与 1 个因变量(例如 1 个人口统计结果)联系起来。
num_obs_grp = 50
num_grps = 50
num_coef = 3
formula = 'DV ~ IV1 + IV2 + IV3' data, blups, betas = simulate_lmm(num_obs_grp, num_coef, num_grps) data.head()
我们可以看到,整个数据集是如上所述生成的。以这种方式模拟数据还允许我们为数据集中的每个人生成最佳线性无偏预测( BLUPs )。这些是每个人的系数。
blups.head()
最后,我们还可以检验生成这些数据的“真实”系数。这些是我们希望我们的模型能够恢复的“正确答案”。由于这些数据是使用添加到每个人的数据中的噪声( mu = 0, sigma = 1)进行模拟的,并且个体之间存在差异(pymer4 的默认值为 sigma = 0.25),因此我们不期望这些参数能够完美恢复,而是非常接近(我们将在下面对此进行更深入的探讨)。
# Regression coefficients for intercept, IV1, IV2, and IV3
print(f"True betas: {betas}") True betas: [0.18463772 0.78093358 0.97054762 0.45977883]
评估绩效
是时候评估一些建模策略了。对于每种模型类型,我将根据所述数据拟合模型,然后计算 3 个指标:
- 系数恢复的绝对误差 —这只是真实系数和估计系数之间的绝对值差之和。它给出了我们的模型相对于数据生成系数的总误差。我们可以计算平均值,而不是总和,但是由于我们的模拟数据都在相同的范围内,总和为我们提供了我们期望恢复的确切数量。
- 模型标准误差之和 —这个和下一个度量与我们想要对参数做出的推断更相关。SE 和相关的置信区间告诉我们在给定这种特定建模策略的情况下,估计值周围的总方差。同样,我们可以计算平均值,但是像上面一样,总和给出了所有参数的总方差。
- 模型 T-统计量之和 —这是我们的模型估计的 T-统计量的绝对值之和。这给了我们一种感觉,我们有多大可能带着这样的推断离开,即在我们的自变量和因变量之间有一种统计上显著的关系。在其他条件相同的情况下,较大的 t-stats 通常意味着较小的 p-值,因此我们可以建立一种直觉,了解我们的建模策略有多敏感,告诉我们“是的,这是一个统计上显著的影响。”
多层次模型
让我们从拟合一个多级模型开始,该模型指定了我们可以估计的所有可能参数的完整集合。这样做的效果是让每个人都有自己的一套回归估计,同时仍然将这些估计视为来自一个共同的分布。您可以在下面看到,我们可以很好地恢复参数,正如我们预期的那样,我们所有的结果都是“显著的”
# Fit lmer with random intercepts, slopes, and their correlations lmer = Lmer(formula + '+ (IV1 + IV2 + IV3 | Group)',data=data) lmer.fit(summarize=False) print(f"Absolute Error of Coef Recovery: {diffs(betas, lmer.coefs['Estimate'])}") print(f"Sum of Model Standard Errors: {lmer.coefs['SE'].sum()}") print(f"Sum of Model T statistics: {lmer.coefs['T-stat'].abs().sum()}")
Absolute Error of Coef Recovery: 0.10582723675727804
Sum of Model Standard Errors: 0.16626160033359066
Sum of Model T statistics: 54.46274837271574
接下来,让我们看看当我们用最简单的“随机效应”结构拟合一个多级模型时会发生什么。请注意,由于不让每个人自由拥有自己的估计值(除了他们自己的均值/截距),我们的系数恢复会下降一点,但我们的 t 统计量会显著增加。这看起来是由系数的方差估计(标准误差)非常小这一事实驱动的。在其他条件相同的情况下,我们更有可能使用更简单的,或者在这种情况下,“错误指定”的多水平模型来识别“显著”关系,因为我们知道数据是这样生成的,每个人实际上有不同的 BLUPs。
# Fit lmer with random-intercepts only
lmer_mis = Lmer(formula + '+ (1 | Group)',data=data) lmer_mis.fit(summarize=False) print(f"Absolute Error of Coef Recovery: {diffs(betas,lmer_mis.coefs['Estimate'])}") print(f"Sum of Model Standard Errors: {lmer_mis.coefs['SE'].sum()}") print(f"Sum of Model T statistics: {lmer_mis.coefs['T-stat'].abs().sum()}")
Absolute Error of Coef Recovery: 0.1311098578975485
Sum of Model Standard Errors: 0.10466304433776347
Sum of Model T statistics: 101.04453264690632
聚类稳健模型
接下来,让我们来评估聚类稳健误差建模方法。请记住,这涉及到估计一个单一的回归模型,以获得系数估计,但然后应用一个校正因子的 SEs,从而 t 统计量来调整我们的推论。看起来我们的系数恢复与上面的简单多层模型大致相同,但是由于较大的标准误差和较小的 t 统计量,我们的推断要保守得多。事实上,这些甚至比我们最初估计的完全指定的多级模型还要保守一点。
# Fit clustered errors LM
lm = Lm(formula,data=data) lm.fit(robust='cluster',cluster='Group',summarize=False)print(f"Absolute Error of Coef Recovery: {diffs(betas,lm.coefs['Estimate'])}") print(f"Sum of Model Standard Errors: {lm.coefs['SE'].sum()}") print(f"Sum of Model T statistics: {lm.coefs['T-stat'].abs().sum()}")
Absolute Error of Coef Recovery: 0.13278703905990247
Sum of Model Standard Errors: 0.17543089877808005
Sum of Model T statistics: 51.03327490657406
两阶段回归
最后,让我们使用两阶段回归法。我们将对 50 个人中的每个人进行单独的回归,然后对这 50 个系数进行另一次回归计算。在这个简单的例子中,我们实际上只是对这 50 个系数进行单样本 t 检验。请注意,我们的系数恢复比我们完全指定的多级模型好一点点,我们的推论(基于 T-stats 和 SEs)在很大程度上是相似的。这表明,对于这个特定的数据集,我们可以采用任何一种策略,并得出相同的结论。
# Fit two-stage OLS
lm2 = Lm2(formula,data=data,group='Group')
lm2.fit(summarize=False)print(f"Absolute Error of Coef Recovery: {diffs(betas, lm2.coefs['Estimate'])}") print(f"Sum of Model Standard Errors: {lm2.coefs['SE'].sum()}") print(f"Sum of Model T statistics: {lm2.coefs['T-stat'].abs().sum()}")
Absolute Error of Coef Recovery: 0.09216204521686983
Sum of Model Standard Errors: 0.16523098907361963
Sum of Model T statistics: 55.00162203260664
模拟一个宇宙。
现在,这只是一个特定的数据集,具有特定的大小和特定的个体差异水平。还记得上面概述的维度吗?我们想要回答的真正问题是,这些不同的建模策略在每个维度上是如何变化的。因此,让我们在这里扩展我们的模拟。让我们生成一个设置“网格”,这样我们就可以在合理的时间内模拟所有维度的组合。这是我们将尝试模拟的网格:
接下来,我们将从 5 到 100 改变维度 1 我们正在进行推理的单位的样本大小(人数)。遍历各个列,我们将改变维度 2 ,即嵌套在我们正在进行推断的单元内的单元的样本大小(每人的观察次数)从 5 到> 100 不等。在 z 平面上,我们将改变维度 3 我们正在进行推理的单位之间的方差(人与人之间的可变性)从 0.10 - > 4 个标准差。
因为改变维度 1 和维度 2 应该有直观的意义(它们是我们数据样本大小的不同方面),所以让我们探索一下改变维度 3 是什么样子的。这里的图表说明了改变个人之间的方差是如何影响系数的。下图描述了人员水平系数的分布;这些是我们上面讨论过的虚张声势。当模拟具有由截距和斜率(IV1)描述的两个参数的数据集时,请注意每个分布如何以参数的真实值为中心,但是随着组间方差的增加,分布的宽度也会增加。这些分布是我们的人员级别参数所来自的分布。因此,虽然它们的平均值是相同的,但它们越来越分散在这个值周围。随着这些分布变得更宽,如果数据集太小,恢复数据的真实系数变得更具挑战性,因为模型需要更多的数据来稳定它们的估计。
为了简洁起见,我删除了下图的绘图代码,但我很乐意根据要求分享它们。
设置它
下一个代码块设置这个参数网格,并定义一些助手函数来计算上面定义的指标。由于这个模拟在 2015 四核 Macbook Pro 上运行大约需要 50 分钟,所以我还定义了一些函数来将每个模拟保存到 csv 文件中。
# Define the parameter grid
nsim = 50 # Number of simulated datasets per parameter combination num_grps = [10, 30, 100] # Number of "clusters" (i.e. people) obs_grp = [5, 25, 100] # Number of observations per "cluster" grp_sigmas = [.1, .25, 1., 2., 4.] # Between "cluster" variance num_coef = 3 # Number of terms in the regression equation noise_params = (0, 1) # Assume each cluster has normally distributed noise seed = 0 # to repeat this simulation
formula = 'DV ~ IV1 + IV2 + IV3' # The model formula # Define some helper functions. diffs() was used above examining each model in detail
def diffs(a, b):
"""Absolute error"""
return np.sum(np.abs(a - b)) def calc_model_err(model_type, formula, betas, data):
"""
Fit a model type to data using pymer4\. Return the absolute error
of the model's coefficients, the sum of the model's standard
errors, and the sum of the model's t-statistics. Also log if the
model failed to converge in the case of lme4\. """ if model_type == 'lm':
model = Lm(formula, data=data)
model.fit(robust='cluster',cluster='Group',summarize=False)
elif model_type == 'lmer':
model = Lmer(formula + '+ (IV1 + IV2 + IV3 | Group)',data=data)
model.fit(summarize=False, no_warnings=True)
elif model_type == 'lmer_mis':
model = Lmer(formula + '+ (1 | Group)',data=data)
model.fit(summarize=False, no_warnings=True)
elif model_type == 'lm2':
model = Lm2(formula,data=data,group='Group')
model.fit(n_jobs = 2, summarize=False) coef_diffs = diffs(betas, model.coefs['Estimate'])
model_ses = model.coefs['SE'].sum()
model_ts = model.coefs['T-stat'].abs().sum()
if (model.warnings is None) or (model.warnings == []):
model_success = True
else:
model_success = False
return coef_diffs, model_ses, model_ts, model_success, model.coefs def save_results(err_params, sim_params, sim, model_type, model_coefs, df, coef_df, save=True):
"""Aggregate and save results using pandas""" model_coefs['Sim'] = sim
model_coefs['Model'] = model_type
model_coefs['Num_grp'] = sim_params[0]
model_coefs['Num_obs_grp'] = sim_params[1]
model_coefs['Btwn_grp_sigma'] = sim_params[2]
coef_df = coef_df.append(model_coefs)
dat = pd.DataFrame({
'Model': model_type,
'Num_grp': sim_params[0],
'Num_obs_grp': sim_params[1],
'Btwn_grp_sigma': sim_params[2],
'Coef_abs_err': err_params[0],
'SE_sum': err_params[1],
'T_sum': err_params[2],
'Fit_success': err_params[3],
'Sim': sim
}, index = [0]) df = df.append(dat,ignore_index=True)
if save:
df.to_csv('./sim_results.csv',index=False)
coef_df.to_csv('./sim_estimates.csv')
return df, coef_df # Run it results = pd.DataFrame()
coef_df = pd.DataFrame()
models = ['lm', 'lm2', 'lmer', 'lmer_mis']
for N in num_grps:
for O in obs_grp:
for S in grp_sigmas:
for I in range(nsim):
data, blups, betas = simulate_lmm(O, num_coef, N, grp_sigmas=S, noise_params=noise_params)
for M in models:
c, s, t, success, coefs, = calc_model_err(M, formula, betas, data)
results, coef_df = save_results([c,s,t, success], [N,O,S], I, M, coefs, results, coef_df)
结果
为了简洁起见,我删除了下图的绘图代码,但我很乐意根据要求分享它们!
系数恢复
好,让我们先看看我们的系数恢复。如果我们从网格的左上往下看,首先要跳出来的是,当我们增加总体样本量(聚类数每个聚类的观察数)时,我们的聚类间可变性为中到低,所有的模型类型在恢复真实数据生成系数方面做得同样好。换句话说,在良好的条件下(大量数据不太多变),我们选择任何分析策略都不会出错。相反,从左下方到右上方,当聚类之间的可变性很高时,我们很快看到拥有更多聚类*而不是每个聚类更多观测值的重要性;如果没有足够的聚类来观察,即使是完全指定的多级模型也不能很好地恢复真实系数。
当我们有小到中等规模的数据集和大量的聚类之间的可变性时,所有模型往往在恢复真实系数方面表现不佳。有趣的是,每个聚类(最左边的列)的观测值特别少会不成比例地影响两阶段回归估计(橙色箱线图)。这与 Gelman,2005 的观点是一致的,他认为,由于每个聚类的观测值很少,第一级 OLS 估计值非常差,具有高方差,并且没有多级建模的好处来帮助抵消这种情况。这种情况似乎也最有利于完全指定的多级模型(绿色方框图),特别是当聚类之间的可变性很高时。有趣的是,在这种情况下,集群健壮和错误指定(简单)的多级模型似乎表现相似。
在中等数据情况下(中间列),聚类稳健模型似乎在恢复系数方面表现稍差。这很可能是因为估计值完全忽略了数据的聚类性质,并且没有通过平均(在两阶段回归模型的情况下)或通过随机效应估计(在多级模型的情况下)对其进行平滑/正则化。
最后,在每个聚类的高观测值的情况下(最右边的列),所有模型似乎表现得非常相似,这表明当我们密集地对感兴趣的单元进行采样(每个聚类的观测值增加)时,每种建模策略都与任何其他策略一样好,即使希望对聚类本身进行推断。
做出推论(SEs + T-stats)
接下来,让我们看看标准误差和 t-统计量,看看我们的推断可能如何变化。组间方差的增加对 SEs 和 t-stats 值有非常显著的影响,通常使其不太可能识别统计显著性关系,无论数据大小如何。有趣的是,两阶段回归模型在每个聚类的观测值很少的情况下表现出较差的系数恢复,它们用较高的标准误差估计来弥补。我们可以看到,在这些情况下,他们的 t-统计量较低,这表明在这些情况下,这种方法可能会使天平倾向于较低的假阳性,较高的假阴性推断。然而,与其他模型类型不同,它们不一定受益于总体上更多的集群(左下图),并且冒着假阴性水平膨胀的风险。错误指定的多水平模型似乎具有相反的性质:在大多数情况下,它们具有较高的 t-stat 和较低的 SEs,具有中到高的类间可变性,并且在每个类具有大量观察值的情况下受益最多。这表明,在其他模型可能表现得更保守,但也可能在面临高簇间方差时对检测真实关系更敏感的情况下,它们可能会冒引入更多假阳性的风险。他们似乎也从星团内越来越多的观测中获益最多。从聚类稳健和完全指定的多水平模型的推论似乎在很大程度上是可比的,这与这些模型类型在多个文献中的广泛使用是一致的。
额外好处:当完全指定的多级模型失败时
最后,我们可以简单地看一下,对于我们完全指定的多层模型,什么情况最常导致收敛失败(注意:前面检查的简单多层模型在这些模拟中从未失败过)。一般来说,这似乎发生在聚类之间的可变性较低时,或者每个聚类的观察数量很少时。这是有意义的,因为即使数据是以多级方式生成的,聚类也是非常相似的,并且通过丢弃试图以有意义的方式对数据可能不显示的方差进行建模的项来简化模型(例如,丢弃“随机斜率”)总体上实现了更好的估计。换句话说,模型可能试图拟合一个足够小的方差参数,以使其在达到适当小的误差变化之前用完优化器迭代。这就像通过比较你当前台阶的高度和前一个台阶的高度,试图在一个坡度很小的“小山”上找到最低点。
结论
那么我们学到了什么?以下是我认为这个练习有助于充实的一些直觉:
- 当每个聚类有足够的观测值时,保留两阶段回归。这是因为在没有多级建模所施加的任何类型的平滑/正则化/先验的情况下单独对每个聚类进行建模,在这些情况下会产生较差的第一级估计。
- 小心使用错误指定/简单的多级模型。虽然它们可以消除指定模型的“随机效应”部分所涉及的一些复杂性,并且它们几乎总是收敛,但相对于其他方法(所有其他条件都相同),它们更有可能导致具有统计意义的推论。如果您的数据没有表现出足够的集群间差异,这可能是有保证的。一般来说,最好是指定一个模型结构,该结构考虑了与感兴趣的预测值混淆的方差( Barr 等人,2013 )(即,去掉随机截距和随机斜率之间的相关项,而不是去掉随机斜率),换句话说,就是你可以得到的最“最大”的结构,这与你想要对数据做出的推断有关。
- 如果您的主要目标是进行推理,并且您可以接受比其他方法精度稍低的系数估计,那么聚类稳健模型似乎是一种有效的解决方案。如果数据中存在多个聚类级别(例如,个人内、城市内、州内等的调查回答),或者项目级别的影响是否重要,则更难确定( Baayen 等人,2008 )。然而,有一些技术可以合并双向或多向群集鲁棒性误差,这种方法在经济学中相当常见。本讲座和本论文将进一步讨论这些方法。本文使用的 Pymer4 只实现了单向集群。
- 考虑使用两阶段最小二乘法或聚类稳健误差,而不是错误指定的多层模型,因为您的推理可能在很大程度上类似于成功收敛的完全指定的多层模型。如果需要考虑项目级别的差异或多级别的聚类,这可能是不正确的,但对于本文中说明的相对简单的情况,它们似乎很好。
- 一般来说,模拟是建立统计直觉的有用方法,尤其是当背景数学令人畏惧的时候。这是我更深入地学习统计概念的首选方法之一,并使阅读大量数学形式的文献变得更加容易。
警告和注意事项
我不想在结束这篇文章时感觉我们已经想通了一切,现在是专家分析师了,而是意识到这个练习有一些限制,值得记住。虽然我们可以建立一些一般的直觉,但在某些情况下,这些直觉可能并不总是成立,意识到这些直觉非常重要:
- 在许多方面,这些模拟中生成的数据对于试验这些不同的方法来说是“理想的”。数据点都在相同的范围内,来自具有已知均值和方差的正态分布,不包含缺失的数据点,并且符合未讨论的这些统计方法的其他基本假设。
- 同样,我将“真实关系”内置到数据中,然后试图恢复它们。我在整篇文章中提到了假阳性和假阴性,但我没有正式估计这些方法的假阳性或假阴性率。同样,这是为了给你留下一些一般的直觉,但有几篇论文利用这种方法更明确地为某些推理技术的使用辩护(例如 Luke,2017 )。
- 我们探索的参数空间(即我们数据的不同“维度”)跨越了一个范围,我认为这个范围合理地涵盖了在实证社会科学实验室研究中经常收集的各种数据集。在现实世界中,数据要混乱得多,而且越来越大。越多的数据几乎总是越好,特别是如果它是高质量的,但是基于一个人想要做出的推论,质量的构成可能是非常不同的。有时聚类之间的高可变性是可取的,其他时候密集地对一小组聚类进行采样更重要。这些因素会根据一个人试图回答的问题而变化。
- 我选择用来评估每个模型的指标只是我想知道的。当然,根据您想要建立的直觉,还有其他或多或少能提供信息的指标。比如每个模型的预测精度如何?
结论
我希望这对外面的一些人有用,即使没有用,它也确实帮助我建立了一些关于可用的不同分析策略的直觉。此外,我希望,如果没有别的事情,这可能会激励那些觉得自己在统计/机器学习方面接受的正规培训有限的人,采取一种更修补/黑客的方法来进行自己的学习。我记得当我还是个孩子的时候,打碎东西并把它们拆开是我最喜欢的了解事物工作原理的方式之一。随着像 scientific Python 和 R 这样的免费开源工具的大量出现,我看不出有什么理由统计教育不能一样。
附录
这是一本不错的快速指南,它定义了不同领域的许多术语,并以更简洁的方式回顾了这里涉及的许多概念(还有更多)。对于感兴趣的人,使用 lmerTest R 软件包计算多级模型的 p 值,使用 Satterthwaite 近似法计算自由度;请注意,基于指定的随机效应结构,这些自由度可能会发生显著变化。其他模型类型的 p 值是使用标准 t 分布计算的,但是 pymer4 也为其他类型的推理提供了非参数排列测试和可靠的置信区间。在撰写本文时,拟合两阶段回归模型仅在 github 的开发分支中可用,但应该会在未来的新版本中包含。
注释和更正
- 在这篇文章的前一个版本中,这种方法被错误地称为两阶段最小二乘法(2SLS)。2SLS 是一种完全不同的技术的正式名称,属于工具变量估计的更广泛范围。这种混淆是因为上面讨论的两阶段回归方法在技术上确实采用了普通最小二乘估计的“两阶段”,然而这并不是文献中的 2SLS。感谢 Jonas Oblesser 指出这一点,并感谢 Stephen John Senn 使用适当的术语,这些术语实际上在医学和 fMRI 文献中是一致的。
- 虽然在本文中(通常在文献中),两阶段甚至多层次建模和聚类稳健推理被视为两种不同的可能的分析策略,但另一种可能性涉及结合这些方法。即,使用多级模型或两阶段回归来获得系数估计,然后在执行推断时计算最高级别系数的稳健标准误差。感谢詹姆斯·e·普斯特约夫斯基提出这个经常被忽视的选项。
Eshin Jolly 2019
原载于 2019 年 2 月 18 日【eshinjolly.com】。
不平衡数据集上不同分类机器学习模型的比较
如果一个数据集包含来自一个类的样本比来自其余类的样本多得多,则称之为不平衡数据集。当至少一个类仅由少量训练样本(称为少数类)表示,而其他类占大多数时,数据集是不平衡的。在这种情况下,由于较大的多数类的影响,分类器可以对多数类具有良好的准确性,但对少数类的准确性非常差。这种数据集的常见示例是信用卡欺诈检测,其中欺诈= 1 的数据点通常比欺诈= 0 的数据点少得多。
数据集可能不平衡的原因有很多:第一个目标类别在人群中可能非常罕见,或者数据可能很难收集。
让我们通过处理一个这样的数据集来解决不平衡数据集的问题。
**关于数据:**我这里是一家游戏公司的数据,他们想知道哪个客户会成为 VIP 客户。这里的目标变量有两个值:0(代表非 VIP 客户)和 1(代表 VIP 客户)。在可视化该目标列时,我们可以从下面的饼图中看到,只有 1.5%的数据是 VIP 客户的,其余 98.5%的数据是非 VIP 客户的。
Distribution of Majority and Minority Class
First few rows of the dataset
如果我们使用这些数据来训练我们的预测模型,那么该模型将表现不佳,因为该模型没有在代表 VIP 客户的足够数量的数据上进行训练。为了演示如果我们使用这些数据,预测模型的结果会如何,下面是一些算法的结果:
Results from the k-NN Algorithm
Results from the Gradient Boosting Algorithm
Results from the Logistic Regression Algorithm
从上面的结果可以清楚地看出,机器学习算法几乎无法预测 VIP 客户(因为 VIP 客户的 f1 分数非常低)。
在监督学习中,克服类别不平衡问题的一种常见策略是对原始训练数据集进行重新采样,以降低类别不平衡的整体水平。重采样是通过对少数(正)类进行过采样和/或对多数(负)类进行欠采样来完成的,直到这些类被近似相等地表示。
在使用不同的重采样技术之前,需要记住的最重要的一点是所有的重采样操作都必须只应用于训练数据集。如果在将数据集分割成训练集和验证集之前进行上采样,则可能在两个数据集中得到相同的观察结果。因此,当在验证集上进行预测时,机器学习模型将能够完美地预测这些观察值,从而提高准确性和召回率。
重采样技术的类型:
**欠采样/下采样:**该方法使用多数类的子集来训练分类器。由于许多多数类示例被忽略,训练集变得更加平衡,训练过程变得更快。最常见的预处理技术是随机多数欠采样(RUS),在 RUS,多数类的实例从数据集中随机丢弃。下面是实现缩减采样的 python 代码
from sklearn.utils import resampledf_majority_downsample = resample(df_majority,
replace=True,
n_samples=105,
random_state=123)
df_train = pd.concat([df_majority_downsample, df_minority_upsampled])
# Display new class counts
print (df_train.IsVIP_500.value_counts())**Output:** 0 105
1 105
Name: IsVIP_500, dtype: int64
**过采样:**它通过复制少数类实例来实现更均衡的类分布。过采样不会丢失任何信息,因为少数类和多数类的所有原始实例都保留在过采样数据集中。下面是实现上采样的 python 代码。
df_minority_upsampled = resample(df_minority,
replace=True,
n_samples=5000,
random_state=123)
df_train = pd.concat([df_majority, df_minority_upsampled])
# Display new class counts
print (df_train.IsVIP_500.value_counts())**Output:** 0 6895
1 5000
Name: IsVIP_500, dtype: int64
尽管这两种方法都解决了阶级不平衡的问题,但它们也有一些缺点。随机欠采样方法可能会删除某些重要的数据点,而随机过采样可能会导致过拟合。
SMOTE: 合成少数过采样技术被设计用来生成与少数类分布一致的新样本。主要思想是考虑样本之间存在的关系,并沿着连接一组邻居的线段创建新的合成点。下面是实现 SMOTE 的 python 代码。
**#SMOTE**
from imblearn.over_sampling import SMOTE
import numpy as np sm = SMOTE(random_state=12)
x_train_res, y_train_res = sm.fit_sample(X_train, Y_train)print (Y_train.value_counts() , np.bincount(y_train_res))**Output:
#previous distribution of majority and minority classes**0 6895
1 105#**After SMOTE, distirbution of majority and minority classes**
0 6895
1 6895
现在我们的数据已经准备好了,让我们在 SMOTE 创建的数据集上应用一些机器学习算法。我尝试了以下算法:Logistic 回归,K 近邻,梯度推进分类器,决策树,随机森林,神经网络。以下是最高性能的机器学习算法的结果和解释:
**随机森林:**基本思想与 bagging 非常相似,我们引导样本,因此我们对训练数据集进行重新采样。然后我们在每个引导样本上重建分类或回归树。一个区别是,在每次拆分时,当我们在分类树中每次拆分数据时,我们也引导变量。换句话说,在每次潜在拆分时,只考虑变量的子集。这有助于建立一系列不同的潜在树木。所以我们的想法是种植大量的树木。对于预测,我们要么投票,要么对这些树进行平均,以获得对新结果的预测。下面是实现随机森林分类器的 python 代码。
from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier(n_estimators=1000)
model.fit(x_train_res , y_train_res)
y_pred = model.predict(X_test)
target_names = ['NON-VIP', 'VIP']
print(classification_report(Y_test, y_pred,target_names=target_names))
The result of the Random Forest applied to dataset derived from SMOTE
**梯度增强:**与并行构建和组合随机不同树的森林的随机森林方法不同,梯度增强决策树的关键思想是它们构建一系列树。其中每棵树都被训练,以便它试图纠正系列中前一棵树的错误。以非随机的方式构建,创建一个模型,随着树的增加,错误越来越少。模型建立后,使用梯度增强树模型进行预测速度很快,并且不会占用太多内存。下面是实现梯度增强分类器的 python 代码。
model_GB = GradientBoostingClassifier(n_estimators=1000)
model_GB.fit(x_train_res , y_train_res)
y_pred = model_GB.predict(X_test)
target_names = ['NON-VIP', 'VIP']
print(classification_report(Y_test, y_pred,target_names=target_names))
The result of the Gradient Boosting applied to dataset derived from SMOTE
Ada Boost: 这是一种迭代集成方法。AdaBoost 分类器通过组合多个性能较差的分类器来构建一个强分类器,以获得高精度的强分类器。Adaboost 背后的基本概念是设置分类器的权重,并在每次迭代中训练数据样本,以确保对异常观察值的准确预测。下面是实现 Ada Boost 分类器的 python 代码。
from sklearn.ensemble import AdaBoostClassifiermodel_ad = AdaBoostClassifier()
model_ad.fit(x_train_res , y_train_res)
y_pred = model_GB.predict(X_test)
target_names = ['NON-VIP', 'VIP']
print(classification_report(Y_test, y_pred,target_names=target_names))
The result of the Ada Boosting applied to dataset derived from SMOTE
**注意:**预测准确性,一种评估分类器性能的流行选择,在数据不平衡时可能不合适。不应该使用它,因为它不能提供真实的情况。例如,模型的准确度可能是 97%,并且人们可能认为该模型表现得非常好,但是实际上,该模型可能仅预测多数类,并且如果该模型的主要目的是预测少数类,则该模型是无用的。因此,应该使用召回率、精确度和 f1 分数来衡量模型的性能。
**结论:**到目前为止,我们看到,通过对不平衡数据集进行重新采样,并选择正确的机器学习算法,我们可以提高少数类的预测性能。我们性能最好的模型是 Ada,梯度增强在使用 SMOTE 合成的新数据集上运行。使用这些模型,我们为少数民族类获得了 0.32 的 f1 分数,而使用原始数据以及逻辑和 k-nn 等算法,少数民族类的 f1 分数为 0.00
**进一步改进:**为进一步改进模型,可考虑以下选项:
- 尝试使用 SMOTE 的变体。
- 超参数(学习率、最大深度等)的调整。)以上型号。
- 此外,可以使用不同的机器学习模型,如堆叠或混合机器学习算法、深度学习模型。
谢谢,学习愉快:)
比较星期五第 13 次建议从惊讶和含蓄
帮助你计划下一个电影之夜的功能代码。
在最近的一篇博客文章中,我详细介绍了如何令人惊讶地进行单品推荐。我选择惊喜,部分是因为它是我训练营的一些导师强烈推荐的(没有双关语),但我完全意识到还有很多其他选择,其中一些我在我的上一篇推荐帖子中详细介绍过。我认为从隐式开始深入研究我已经跳过的其他一些库是值得的。
Implicit 是一个库,旨在为其他一些已建立的推荐库(如 Annoy 和 NMSLib)提供更快的 Python 实现,所以它似乎是一个不错的起点。我将仅仅触及这个库所提供的皮毛,所以请随意查看这里的文档和这里的 GitHub
现在评估 Surprise 和 Implicit 各自推荐的质量有点武断。没有一些用户的反馈,这完全取决于我的主观意见,哪一个做得更好。本着这种精神,我将把重点放在提取建议的代码上。
在我们推荐任何东西之前,我们首先要构建并运行我们的模型。我已经在之前的博客中详细介绍了如何构建和运行惊喜(这里是再次是),所以我将在这里运行隐式。
首先,我们必须导入数据。
import implicitdf = pd.read_csv("final_data.csv", index_col=0)
# This dataframe has the movie titles, which I'll need later.
与 Surprise 不同,Implicit 特别需要一个稀疏矩阵。令人惊讶的是,假设您只传递 userid、itemid 和 weight(或 rating)列,那么您可以将数据帧直接传递给模型。但是使用 Implicit,您需要首先转换您的数据。
df_sparse = pd.read_csv("item_item_final.csv", index_col=0)
sparse = scipy.sparse.csr_matrix(df_sparse.values)
当谈到模型时,Implicit 有很多选项,包括 onyy、NMSLib 和 Faiss 的版本,但出于说明的目的,我将坚持使用良好的 ole 交替最小二乘法。
als_model = implicit.als.AlternatingLeastSquares()
als_model.fit(sparse)
现在是有趣的部分——我们可以推荐一些电影。先说惊喜。我会选择单品推荐,这很简单,但会给你带来惊喜。
惊喜的好处在于,无论你的 item _ ids 是什么,都可以是字符串。在这种情况下,这非常有用,因为最终我想要吐出的是一个易于阅读的电影名称列表。Surprise 通过将“原始 id”(即电影名称)转换为“内部 id”(数字)来处理这些字符串。这使得你可以相对容易地将你的标题从模型中取出来。
# First, select the title you are recommending for:
hd_raw_id = 'Friday the 13th Part VII: The New Blood (1988)'#Transform that raw_id to an inner_id.
hd_inner_id = KNN_final_model.trainset.to_inner_iid(hd_raw_id)# Get nearest neighbors.
hd_neighbors = KNN_final_model.get_neighbors(hd_inner_id, k=5)# Convert inner ids of the neighbors back into movie names.
hd_raw = [KNN_final_model.trainset.to_raw_iid(hd_inner_id)
for hd_inner_id in hd_neighbors]
以下是我的建议:
['Friday the 13th Part VIII: Jason '
'Takes Manhattan (1989)',
'Leatherface: Texas Chainsaw Massacre '
'III (1990)',
'Amityville: A New Generation (1993)',
'Jaws 3-D (1983)',
'Texas Chainsaw Massacre: The Next '
'Generation (a.k.a. The Return of the '
'Texas Chainsaw Massacre) (1994)']
不算太差!我们有所有的恐怖电影,所有的续集,它包括另一个 13 号星期五,这是我的数据集的一部分。至少从表面上看,这是有道理的。
现在为含蓄。得到相似的物品,其实在隐性上是极其简单的。您只需调用“相似项”函数。代码如下:
sim_items = als_model.similar_items(70)
诀窍是返回一些可理解的东西,尤其是对最终用户。隐式返回 n 个最近邻居的行 id。当然,没有人愿意被推荐一些行 id。这意味着,对于实际应用,您将需要一个助手函数。这是我想到的:
def get_item_recs(movie):
"""Takes a movie row from the model and makes a five recommendations."""
id_list = []
sim_items = als_model.similar_items(movie,5)
for item in sim_items:
iid = df_sparse.iloc[item[0],[1]]
id_list.append(int(iid[0]))
final = []
for rec in id_list:
final.append(df.loc[df['movieId']== rec, 'title'].iloc[0])
return final
这是清单:
['Friday the 13th Part VIII: Jason Takes Manhattan (1989)',
'Iron Eagle IV (1995)',
'Lawnmower Man 2: Beyond Cyberspace (1996)',
'Troll 2 (1990)',
'Problem Child 2 (1991)']
这份清单比《惊奇》多了一点多样性,但仍然相当不错。同样,另一个 13 号星期五是它的一部分,它都是续集。榜单上还有铁鹰四和问题儿童 2,有意思。
显然,我没有真正调整 ALS 模型的参数,Implicit 还有许多我没有包括在内的特性和功能,但有趣的是拍摄的不同之处。
比较图形数据库 I
第 1 部分:TigerGraph,Neo4j,亚马逊 Neptune
Oooh. Aaah.
简介
关系数据库具有分类帐式的结构。可以通过 SQL 查询,而且是大多数人熟悉的。每个条目由表中的一行组成。表通过外键约束相关联,这是将一个表的信息与另一个表的信息连接起来的方式,就像主键一样。在查询关系数据库时,通常会涉及到缓慢的多层连接。
对于一个图形,特别是散点图,可以把元素想象成节点或点。线图的元素同样由顶点表示。每个节点都有键值对和一个标签。节点由关系或边连接。关系有类型和方向,它们可以有属性。图形数据库简单地由点和线组成。当意义在于数据之间的关系时,这种类型的数据库更简单、更强大。关系数据库可以轻松处理直接关系,但间接关系在关系数据库中更难处理。
当构建关系数据库时,它是带着问题构建的。我们想要回答什么样的问题?例如,您想知道有多少人购买了烤面包机,住在堪萨斯州,有犯罪记录,并使用优惠券购买了该烤面包机。如果数据库管理员或创建数据库的人没有预料到这样的问题,那么从关系数据库中检索信息可能会非常困难。对于图形数据库,回答意料之外的问题是可能的。有了图,你就可以回答任何问题,只要数据存在,数据之间有路径。图是用来遍历间接关系的。使用图形数据库,您甚至可以添加更多的关系,同时仍然保持性能。图形数据库不仅仅是存储数据点,而是存储数据关系。图形数据库存储关系信息。
https://www.nextplatform.com/2018/09/19/the-graph-database-poised-to-pounce-on-the-mainstream/
我将简要描述一些最流行的图数据库实现的优缺点:
- 老虎图
- Neo4j
- 亚马逊海王星
这是外面的一个例子。看看这里更多的选项:【https://db-engines.com/en/ranking/graph+dbms
TigerGraph —“一个完整的分布式并行图形计算平台,支持网络规模的实时数据分析”
通过其固有的并行图形技术,TigerGraph 成为世界上速度最快、扩展性最强的图形平台…
www.tigergraph.com](https://www.tigergraph.com/)
一个完整的分布式并行图形计算平台,支持网络规模的实时数据分析
2017 年发布,这是一个图形数据库的商业选项。它的实现语言是 C++,但也支持 Java。它的操作系统是 Linux,查询是通过一种类似 SQL 的查询语言 GSQL 进行的。
TigerGraph 的加载时间比主要竞争对手 Neo4j 要长。考虑到预处理时间,TigerGraph 其实比 Neo4j 要快。TigerGraph 之所以高效,是因为它需要的存储空间比 Neo4j 少 19.3 倍。TigerGraph 在一跳路径查询上比 Neo4j 快 24.8 倍。在三跳路径查询上,TigerGraph 比 Neo4j 快 1,808.43 倍。TigerGraph 还能够完成六跳路径查询。这种类型的处理会在 2 小时后杀死 Neo4j,因为它耗尽了内存。
TigerGraph 在体验上所欠缺的,似乎在资源上有所弥补。就性能而言,TigerGraph 似乎在竞争中胜出,但这是有代价的。TigerGraph 的成本不取决于性能或核心或插槽的数量,而是取决于放入图形数据库的数据大小。50-100 GBS 的图形年费为数万美元,1 TB 的图形年费接近 100 万澳元。
2019 年 9 月推出的 TigerGraph Cloud 上的免费层选项可用。还有一种按小时付费的模式,每小时几美元起。它根据性能定价,虚拟 CPU 和 RAM 越大的实例成本越高,客户可以启动和停止实例,只需按小时支付所需费用。下面是关于这些定价选项的详细信息的链接。
https://www.tigergraph.com/tigergraph-cloud-pricing/
[## 半 TB 基准测试 Neo4j 与 TigerGraph - DZone 数据库
图形数据库已经变得越来越流行,受到了越来越多的关注。为了了解图表如何…
dzone.com](https://dzone.com/articles/half-terabyte-benchmark-neo4j-vs-tigergraph)
neo4j——“开源图形数据库”
Neo4j 创建于 2007 年,被 db-engines.com 评为排名第一的图形数据库。Neo4j 是开源的,支持多种编程语言,包括:。Net、Clojure、Elixir、Go、Groovy、Haskell、Java、JavaScript、Perl、PHP、Python、Ruby、Scala。服务器操作系统有 Linux、OS X、Solaris 和 Windows。
Neo4j 拥有最受欢迎和最活跃的图形数据库社区。评论报告称,他们的产品简单易学,易于使用,有大量的资源,从培训材料到书籍。Neo4j 已经为他们的用户提供了大量的资源。Neo4j 提供了一种新的查询语言 Cypher,并正在将其引入 Spark。Neo4j 声称 Cypher 是一种与 Spark 上的图形数据进行交互的更方便的方式。Neo4j 带来了 ETL、分析和改进的性能。谈到 ETL,Neo4j 提供了一个新的工具,可以自省关系模式并自动提取 CSV。
为了跟上 TigerGraph,Neo4j 确实需要跨越一些性能障碍,但它仍然拥有所有图形数据库中最大的追随者和支持网络。
使用 Neo4j 构建的应用程序可应对互联数据挑战,包括人工智能、欺诈检测、实时推荐和主数据。
Solutions by Neo4j
Neo4j 还有一个即将到来的活动:Nodes 2019。去他们网站注册。还有一个黑客马拉松,你现在就可以参加!投稿截止时间为 2019 年 9 月 29 日。
Amazon Neptune —“为云构建的快速、可靠的图形数据库”
[## Amazon Neptune -为云构建的快速、可靠的图形数据库
为云构建的快速、可靠的图形数据库 Amazon Neptune 是一个快速、可靠、完全托管的图形数据库…
aws.amazon.com](https://aws.amazon.com/neptune/)
与 TigerGraph 类似,亚马逊 Neptune Graph 数据库于 2017 年首次亮相,并已商用。服务器操作系统托管,支持的编程语言有 C#、Go、Java、JavaScript、PHP、Python、Ruby、Scala——范围比 TigerGraph 更广。Neptune 正在努力实现高可用性和耐用性。“这相当于 1000 亿个节点/边/三元组,同时跨三个可用性区域(az)自动复制六份数据拷贝,并将数据持续备份到 S3。AWS 还表示,Neptune 旨在提供超过 99.99%的可用性,并在不到 30 秒的时间内自动检测和恢复大多数数据库故障。因此经久耐用!Neptune 还提供高级安全功能,包括通过亚马逊虚拟专用云(VPC)的网络安全和使用 AWS 密钥管理服务(KMS)的静态加密
海王星因其双重性而与众不同。它能够支持流行的图形数据库模型、RDF 和属性图 (PG)。这个优势是一把双刃剑,因为你不能互换使用。AWS 的目标是统一这两种模式,但这是一个相当大的挑战,因为差异不是微不足道的。
[## AWS Neptune going GA:图形数据库用户和供应商的好、坏、丑
这是官方的:AWS 有一个生产就绪的图形数据库。今天包括哪些功能,将来会包括哪些功能…
www.zdnet.com](https://www.zdnet.com/article/aws-neptune-going-ga-the-good-the-bad-and-the-ugly-for-graph-database-users-and-vendors/)
要查看这三个数据库系统的更详细的比较,以及更多信息,请访问 db-engines.com 查看这个伟大的资源:
[## 亚马逊 Neptune vs. Neo4j vs. TigerGraph 对比
亚马逊海王星和 Neo4j 和 TigerGraph 的详细并排视图
db-engines.com](https://db-engines.com/en/system/Amazon+Neptune%3BNeo4j%3BTigerGraph)
图形数据库的应用
- 欺诈检测
- 实时推荐引擎
- 主数据管理
- 支持网络和 IT 运营
- 身份和访问管理
进一步阅读
下面是一个链接,你可以在那里下载一本免费的书籍《T1》,即奥赖利的《T2》图表数据库。
[## O’Reilly 图形数据库- Neo4j 图形数据库平台
编辑描述
neo4j.com](https://neo4j.com/lp/book-graph-databases-rem/?utm_source=google&utm_medium=ppc&utm_campaign=*NA%20-%20Display%20-%20Remarketing%20-%20O%27Reilly%20Book%20-%20Text&utm_adgroup=*NA%20-%20Display%20-%20Remarketing%20-%20O%27Reilly%20Book%20-%20All%20Users&utm_placement=www.analyticsvidhya.com&gclid=Cj0KCQjw2efrBRD3ARIsAEnt0ejjkZFqyPis1FZYBcFhcri-pmqOhZtG0xSlF2vdwMJhIffenZMIYBIaAqf2EALw_wcB)
比较图形数据库 2
第 2 部分:ArangoDB、OrientDB 和 AnzoGraph DB
很高兴看到人们对他们最喜欢的图形数据库提供商,或者至少是他们工作的图形数据库公司充满热情。既然有这么多可用的选项,请查看 db-engine 为您的图形数据库需求列出的 33 个不同选项。在这篇文章中,我将简要地强调一下:
- OrientDB
- ArangoDB
- AnzoGraph 数据库
根据 db-engines.com 的提供的榜单,这三家分别排名第三、第四和第二十六。为了新闻报道的可信度,我将谦虚地尽可能做到不偏不倚,报道公司网站上提供的信息以及最近的文章。
请参见我以前的文章(第 1 部分)快速比较关系数据库管理系统和图形数据库。
OrientDB —“为现代世界设计的数据库”
文件:https://orientdb.org/docs/3.0.x/
OrientDB 最初于 2010 年发布,支持许多编程语言,包括:。Net,C,C#,C++,Clojure,Java,JavaScript,JavaScript(Node.js),PHP,Python,Ruby,Scala。OrientDB 是一个无模式的多模型数据库系统,支持图形、文档、键/值和对象模型。它支持无模式、全模式和混合模式。Gremlin 和 SQL 查询都支持图形遍历。OrientDB 是用 Java 实现的,所以可以在 Java JDK ≥ JDK6 的所有操作系统上运行。它是开源的,但是 OrientDB 也提供商业支持。
根据他们的网站, OrientDB 提供图形数据库系统的服务,而不需要“部署多个系统来处理其他数据类型。”这种方法有助于提高“性能和安全性,同时支持可扩展性。”OrientDB 通过在设计上管理多模型系统来区别于 多 图形数据库系统。它不是简单地“为额外的模型增加层,导致性能下降。”
G2 上有 33 条用户评论,平均评分 4/5 星。大多数评论都非常积极,应该注意的是,上一次平均评论是从 2016 年 6 月开始的,所以看起来 OrientDB 正在修复漏洞和部署完全开发的功能。对评论的主要批评似乎是对更强大的文档的渴望。主要的优点包括价格合理,安装快捷,以及对用户友好。
https://www.g2.com/products/orientdb/features
https://www.predictiveanalyticstoday.com/orientdb/
arango db——“一个引擎。一种查询语言。多个型号。”
文件:https://www.arangodb.com/documentation/
ArangoDB 最初在 2011 年被称为 AvocadoDB,从它的标志可以看出,它是在 2012 年诞生的。ArangoDB 是开源的、多模型的(键/值、文档和图形),用 C、C++和 JavaScript 实现。服务器操作系统包括:Linux、OS X、Raspbian、Solaris 和 Windows。它是无模式的,支持以下语言:C#、Clojure、Java、JavaScript (Node.js)、PHP、Python 和 Ruby。 ArangoDB 以一个数据库核心和自己的统一查询语言 AQL (ArangoDB Query Language)运行,在很多方面与 SQL 相似。AQL 是声明性的,允许在单个查询中组合不同的数据访问模式。ArangoDB 是专门设计来允许键/值、文档和图形数据存储在一起,并使用一种通用语言进行查询的。
根据他们的 网站ArangoDB 可以作为一个分布式&高度可扩展的数据库集群运行。它运行在 Kubernetes 上,包括持久原语&简单的集群设置。ArangoDB 本身集成了跨平台索引、文本搜索和信息检索排名引擎,并针对速度和内存进行了优化。还提供了完整的 GeoJSON 支持。
在 G2 上有 41 条用户评论,平均 5/5 星。2017 年的单一平均评级表明缺乏 SQL 支持以及对必须适应 AQL 的不满。其他人认为 AQL“直观”,并将 ArangoDB 描述为“功能丰富”
https://www.g2.com/products/arangodb/features
https://www.predictiveanalyticstoday.com/arangodb/
为了抢先一步了解即将到来的 3.6 版本中的新功能,请查看 2019 年 10 月 10 日美国东部时间下午 1 点 ArangoDB 的网络研讨会。
** [## 网上研讨会:ArangoDB 3.6 -未来充满特性- ArangoDB
America/los Angeles arang odb 网上研讨会:ArangoDB 3.6 -随着最近发布的
www.arangodb.com](https://www.arangodb.com/arangodb-events/arangodb-3-6-the-future-is-full-of-features/)
AnzoGraph —“在快速、可扩展的数据库上构建您的解决方案”
文档:https://docs . Cambridge semantics . com/anzograph/user doc/home . htm
这个商业图形数据库最初于 2018 年发布,使用 RDF(资源描述框架)进行操作。RDF 模型以主-谓-宾的形式将信息表示为三元组。RDF 存储可以被认为是图形 DBMS 的一个子类,但是 RDF 存储是有区别的,因为它们提供了超越一般图形 DBMs 的特定方法。大多数 RDF 商店,包括 AnzoGraph,都支持 SPARQL,这是一种类似 SQL 的查询语言,用于 OLAP(在线分析处理)风格的分析。AnzoGraph DB 的操作服务器是 Linux,它支持 C++和 Java。
根据他们的网站介绍, AnzoGraph DB 专为在线数据分析而打造,性能可线性扩展。这是一个大规模并行处理(MPP)原生图形数据库,专为大规模分析(万亿次以上)、速度和深度链接洞察而构建。它面向需要图形算法、图形视图、命名查询、聚合、内置数据科学功能、数据仓库式 BI 和报告功能的嵌入式分析。你可以尝试他们的真实世界测试,检查他们的基准研究,并下载一个 60 天免费试用。
一些关于 AnzoGraph DB 的评论就在媒体上。查看这篇文章:图形数据库。有什么大不了的?法维奥·巴斯克斯。他指出,“随着机器学习和人工智能的发展,图 OLAP 数据库变得非常重要,因为许多机器学习算法本身就是图算法,在图 OLAP 数据库上运行比在 RDBMS 上运行更有效。”
乔治·阿纳迪奥蒂斯写的文章中有另一个关于 AnzoGraph 的检查,这篇文章比较了 AnzoGraph 和 TigerGraph。
结论
有许多绘制数据库的选择,似乎每个人都在试图找到自己的市场角落。哪个最好?这真的取决于你的需求。每个 Graph DB 都有其独特的优点、缺点和基准。随着这些系统的发展和壮大,它们的弱点将会改变,它们可能会变得更加全面和强大。花时间货比三家,自学所有可用的选项,因为有很多,而且数量还在不断增加。**
比较机器学习模型:统计与实际意义
模型 A 还是模型 B 更准确?嗯…
在构建和调整 ML 模型方面已经做了很多工作,但是在所有这些艰苦的工作之后,一个自然的问题最终出现了——我们实际上如何比较我们已经构建的模型?如果我们面临模型 A 和 B 之间的选择,哪一个是赢家,为什么?是否可以将这些模型组合在一起,以实现最佳性能?
一种非常肤浅的方法是在测试集上比较整体准确性,比如说,模型 A 的准确性是 94%,模型 B 的准确性是 95%,然后盲目地断定 B 赢了这场比赛。事实上,除了调查整体准确性之外,还有更多的事实需要考虑。
在这篇博文中,我很乐意分享我最近在模型比较方面的发现。我喜欢用简单的语言来解释统计数据,所以这篇文章对于那些在统计方面不是很强,但想多学一点的人来说是一个很好的读物。
1.“理解”数据
如果可能的话,想出一些能马上告诉你实际发生了什么的情节确实是个好主意。在这一点上做任何绘图似乎都很奇怪,但是绘图可以给你提供一些数字所不能提供的洞察力。
在我的一个项目中,我的目标是在预测用户文档的税收时,比较相同测试集上 2 ML 模型的准确性,因此我认为按用户 id 聚合数据并计算每个模型正确预测税收的比例是一个好主意。
我拥有的数据集很大(超过 100K 个实例),所以我按地区分解分析,并专注于较小的数据子集——每个子集的准确性可能不同。在处理大得离谱的数据集时,这通常是一个好主意,因为一次消化大量数据是不可能的,更不用说得出可靠的结论了(稍后将详细介绍样本大小问题)。大数据集的一个巨大优势是,你不仅可以获得数量惊人的信息,还可以放大数据,探索特定像素子集上发生的事情。
subset 1: model A vs. model B scores (picture is my own)
subset 2: model A vs. model B scores (picture is my own)
subset 2: model A is clearly doing better than B… look at all those spikes! (picture is my own)
subset 3: model A vs. model B scores (picture is my own)
在这一点上,我怀疑其中一个模型在一些子集上做得更好,而他们在其他数据子集上做的几乎相同。这比仅仅比较整体准确度前进了一大步。但是这种怀疑可以通过假设检验进一步调查。假设检验可以比人眼更好地发现差异-我们在测试集中的数据量有限,我们可能会想,如果我们在不同的测试集上比较模型,准确性会有什么变化。遗憾的是,并不总是有可能得出不同的测试集,因此了解一些统计数据可能有助于研究模型准确性的本质。
2.假设检验:让我们把它做好!
乍一看,这似乎是微不足道的,您可能以前见过这种情况:
- 建立 H0 和 H1
- 想出一个测试统计,并假设正态分布
- 以某种方式计算 p 值
- 如果 p < alpha = 0.05 reject H0, and ta-dam you’re all done!
In practice, hypothesis testing is a little more complicated and sensitive. Sadly, people use it without much caution and misinterpret the results. Let’s do it together step by step!
步骤 1。我们设置 H0:零假设 =无两个模型之间有统计学意义的差异:备选假设= 两个模型之间有有统计学意义的差异——由你决定:模型 A!= B(双尾)或 A 型<或>B 型(单尾)
第二步。我们提出了一个检验统计量,以便在观察到的数据中量化将无效假设与替代假设区分开来的行为。有许多选择,甚至最好的统计学家也可能对 X 数量的统计测试一无所知——这完全没问题!有太多的假设和事实需要考虑,所以一旦你知道你的数据,你就可以选择正确的。关键是要理解假设检验是如何工作的,实际的检验统计只是一个工具,很容易用软件来计算。
请注意,在应用任何统计测试之前,需要满足许多假设。对于每个测试,您可以查找所需的假设;然而,现实生活中的绝大多数数据并不完全符合所有的条件,所以可以放松一点。但是如果你的数据,比如严重偏离正态分布呢?
有两大类统计测试:参数和非参数测试,我强烈推荐在这里阅读更多关于它们的内容。我长话短说:两者的主要区别在于,参数检验需要对总体分布进行某些假设,而非参数检验则更稳健一些(请不要参数!)。
在我的分析中,我最初想使用成对样本 t 检验,但是我的数据显然不是正态分布的,所以我选择了 Wilcoxon 符号秩检验(成对样本 t 检验的非参数等价检验)。由你来决定在你的分析中使用哪种检验统计,但是总是确保假设得到满足。
My data wasn’t normally distributed 😦 (picture is my own)
****第三步。现在是 p 值。p 值的概念有点抽象,我打赌你们很多人以前都用过 p 值,但是让我们澄清一下 p 值实际上是什么:p 值只是一个衡量对 H0 不利的证据的数字:对 H0 不利的证据越强,p 值就越小。如果你的 p 值足够小,你就有足够的信用拒绝 H0。
幸运的是,在 R/Python 中可以很容易地找到 p 值,所以您不需要折磨自己并手动完成它,尽管我一直主要使用 Python,但我更喜欢在 R 中进行假设检验,因为有更多的选项可用。下面是一段代码。我们看到,在子集 2 上,我们确实获得了一个小的 p 值,但置信区间是无用的。
**> wilcox.test(data1, data2, conf.int = TRUE, alternative="greater", paired=TRUE, conf.level = .95, exact = FALSE)V = 1061.5, p-value = 0.008576
alternative hypothesis: true location shift is less than 0
95 percent confidence interval:
-Inf -0.008297017
sample estimates:
(pseudo)median
-0.02717335**
****第四步。非常简单:如果 p-value <预先指定了 alpha(传统上为 0.05),您可以拒绝 H0 而支持 H1。否则,没有足够的证据来否定 H0,这并不意味着 H0 是真实的!事实上,它可能仍然是错误的,但根据数据,没有足够的证据来否定它。如果 alpha 为 0.05 = 5%,这意味着只有 5%的风险得出存在差异的结论,而实际上并不存在差异(又名类型 1 错误)。你可能会问自己:那么为什么我们不能追求 alpha = 1%而不是 5%?这是因为分析将更加保守,所以拒绝 H0 将更加困难(我们的目标是拒绝它)。
最常用的阿尔法是 5%,10%和 1%,但你可以选择任何你喜欢的阿尔法!这真的取决于你愿意冒多大的风险。
alpha 可以是 0%吗(即没有类型 1 错误的可能性)?不:)在现实中,你总有可能犯错误,所以选择 0%是没有意义的。给错误留些空间总是好的。
如果你想玩玩 p-hack(p-hack)游戏,你可以增加你的 alpha,拒绝 H0,但是你必须满足于较低的信心水平(随着 alpha 的增加,信心水平下降——你不能拥有一切:)。
3.事后分析:统计与实际意义
如果你得到一个小得可笑的 p 值,那当然意味着这两个模型的准确性之间有一个统计上显著的差异。之前,我确实得到了一个小的 p 值,所以从数学上来说,模型肯定不同,但是“显著”并不意味着重要。这种差异真的有什么意义吗?这种微小差异与业务问题相关吗?**
统计显著性是指样本中观察到的均值差异由于抽样误差而发生的可能性。给定一个足够大的样本,尽管看似无关紧要的人口差异,人们可能仍然会发现统计意义。另一方面,实际意义查看差异是否足够大,在实际意义上是否有价值。虽然统计意义是严格定义的,但实际意义更加直观和主观。
此时,你可能已经意识到 p 值并没有你想象的那么超级强大。还有更多要调查。考虑到效果大小也是很棒的。效应大小衡量差异的大小——如果存在统计上的显著差异,我们可能会对其大小感兴趣。效应大小强调差异的大小,而不是将其与样本大小混淆。**
**> abs(qnorm(p-value))/sqrt(n)0.14# the effect size is small**
什么是小、中、大效果尺寸?传统的临界值分别是 0.1、0.3、0.5,但同样,这真的取决于你的业务问题。
样本量有什么问题?如果你的样本太小,那么你的结果就不可靠,但这无关紧要。如果你的样本量太大怎么办?这看起来很棒——但是在这种情况下,即使是非常小的差异也可以通过假设检验检测出来。有如此多的数据,即使是微小的偏差也可能被认为是重大的。这就是效果大小变得有用的原因。
还有更多的事情要做——我们可以尝试找到测试的功效和最佳样本量。但我们现在没事了。
假设检验如果做得好,在模型比较中会非常有用。建立 H0 & H1 公司、计算检验统计量和寻找 p 值是日常工作,但解释结果需要一些直觉、创造力和对业务问题的深入理解。请记住,如果测试是基于一个非常大的测试集,被发现具有统计显著性的关系可能没有太多实际意义。不要盲目相信那些神奇的 p 值:放大数据并进行事后分析总是一个好主意!😃
请随时通过电子邮件或 LinkedIn 联系我,我随时准备好与您聊聊数据科学!
用数据可视化比较漫威和 DC
为漫画世界的比较设计可视化
Marvel & DC Visualization — Storm’s partners
比较漫画宇宙有很多种方法。在这里,我解释了我是如何使用来自维基百科的数据创建了一个比较漫威大学和 DC 大学的可视化系统。
我的目标是定义一个简单的可视化,以清晰快捷的方式展示漫威和 DC 之间的差异。我为每个宇宙创造了一个隐喻,并在一个视图中将它们并排显示为星系。
你可以找到我是如何从维基百科提取数据的(简单!)以及之前在我的漫画数据系列其他帖子中的讨论:
你可以在这里找到最终的可视化效果:
可视化设计
条形图和散点图等可视化技术非常常见,但有局限性。对于具有多种信息数据集,对不同可视化隐喻进行分组的个性化可视化是必要的。
当我设计漫画数据的可视化时,首先想到的是用太阳和行星来比较两个星系。
事实上,维基百科已经用虚构的宇宙这个术语来代表漫画。这里我把事情简化了,用了星系的概念。
除了漫画和星系之间的联系意义,人们习惯了一个星系图的结构。一个太阳在中心;一些代表轨道的椭圆;代表行星、恒星和其他天体的小圆圈和大圆圈。
我将我的问题重新定义为比较漫威和 DC 的星系,探索星系图可能存在的视觉差异。
下面,我展示了一些我的草稿,关于星系的结构和意义,它们的位置和形状,以及其他与编码相关的项目——反应组件,类属性,方法等等。
Designing the visualization metaphors and layout
每个虚构的宇宙都是一个有太阳的星系。太阳代表其品牌(漫威或 DC),身体代表虚构的人物。太阳的能量很大,不是吗?有道理。
这组隐喻代表了人物的数量和重要性、他们的超能力和性别。我还介绍了一些关系,揭示了他们的伴侣和子女。
Explaining the meaning of sizes, colors, distance from the sun (orbit) and connections.
这些是指导可视化设计的属性:
- 超能力:超能力列表
- 重要性:角色出现在作品中的数量
- 性别
- 名称
超级大国
人物离太阳越近,拥有的超能力就越多。
每个轨道(椭圆)代表一系列超级大国。第一个代表超级大国,离太阳最远;第二个代表1–2超级大国,以此类推。
蝙蝠侠因为没有超能力,所以远离太阳。
邪恶先生离太阳很近,因为他有 7 项超能力。
Mister Sinister is close to the sun because he has 7 superpowers.
用轨道比喻,我们可以看到漫威和 DC 在使用众多超能力方面的比较。
漫威似乎比 DC 更限制超能力的使用。
Marvel & DC comparison — DC has more characters with 7 superpowers or more than Marvel.
在这个比较中,注意 DC 在整个星系中有更多的角色。这可能导致太阳周围更高的密度。
字符重要性
圆圈越大,它们所在作品的数量或衍生作品的数量就越大(它将它们相加)。两者之和就是我定义的重要性。
如果一个角色的重要性等于零,那么他的身体就用一个紫色的灰尘— 圆圈表示,这个圆圈具有最小的有效半径。当它们的重要性等于或大于 1 时,它们的大小与重要性成正比。
金刚狼是漫威星系中最大的身体,因为他出现在 53 部作品中(包括衍生作品)。
Wolverine has importance 53.
用大小来表示重要性,会弹出探索最多的字符。通过这样做,考虑到大型天体和尘埃的数量,很容易检查星系之间的比较。
漫威只关注金刚狼,而 DC 关注超人和蝙蝠侠。
还是关于重要性,我认为颜色也与它有关。当一个角色的作品比平均值多的时候,我用黄色给它上色;否则为灰色。紫色代表 0 作品(尘埃)。
性别
我将性别分为两大类:男性和非男性,非男性代表女性、跨性别者和其他人,如 agender Phoenix Force。
除去性别不明确的角色,在 10 多部作品中,80%的漫威角色和 72%的 DC 角色都是男性。
当我们考虑出现在更少作品中的人物时,这些数字变得更加平衡:当考虑在维基百科上注册了至少一部作品的人物时,67%(漫威)和 67%(DC);当考虑具有 0 个或更多注册作品的角色时,这两个数字分别为 61%(漫威)和 64% (DC)。
考虑到代表性和多样性这些天被更多的讨论,因为大多数非男性在星系中是小天体,我用白色突出显示了非男性。
Mystique is highlighted in white because she is in the non-male category.
然而,我们几乎看不到白色的圆圈。这反映了漫画史上正在形成的性别差异。
一个虚构的宇宙会有这种差距有很多原因;其中包括漫画受众——以男性读者为重点的漫画可能会有更多的男性角色。
Jacques Nyemb 写了一篇关于这个话题的有趣的文章,以他作为漫画创作者的经验,关于观众和他的角色的种族和性别:种族,性别和漫画…哦,我的天!
“用他们的视角讲故事,包容各种人。这启发人们看到的不仅仅是肤色或性别,而是人物的内涵。”雅克·奈姆布
伴侣和孩子
从维基数据中提取了两种类型的关系,分别用红色的边、伙伴和蓝色的孩子来表示。伴侣可以是配偶,也可以是非配偶。
我找不到任何特别的区别,比如一个网络比另一个网络有更多密集的集线器。你可以在下面的图片中看到:
Partners-edges
Children-edges
我没有表示边的方向(子-边)。它们被设计成当用户选择一个要分析的字符时突出显示,如下例所示。
在下图中,我显示了点击金刚狼和风暴的结果。这个网络让我们知道金刚狼有很多伴侣和 2 个孩子(在维基百科上注册),而暴风有 3 个伴侣和 0 个孩子。
Storm and Wolverine’s connections
在 DC 星系中也发现了类似的模式。在下图中,我们看到神奇女侠有 3 个伴侣,没有孩子;超人有 3 个孩子,7 个伴侣。
Wonder Woman and Superman’s connections
条形图
为了展示超能力和职业的一般用法,我创建了条形图,就像我在这里实现一样。
当您将鼠标放在一个栏上时,您可以看到这两个属性的分布,并可视化角色的名称和其他细节。
因为我想给出关于这些属性的附加信息,所以我添加了第三个信息来定义比较性别的条的颜色。
我使用每个职业/超级大国的非男性和男性的数量来强调男性比其他性别少的情况。常规条形图为灰色;突出显示的是橙色。
以下是漫威和 DC 最常用的超能力:
Superpowers Bar Chart
这些是漫威和 DC 最常用的职业:
Occupations Bar Chart
履行
我使用 Javascript、React 和 D3 实现了所有的可视化。
完整的代码在我的 GitHub 库中:https://github.com/heberleh/comics-universe
我在 2019 年 6 月从维基数据中提取了数据。
我做的完整漫画系列解释了从提取数据到可视化的所有步骤。你可以在这篇文章的开头找到这三篇文章。
放置/投影算法使用椭圆方程为半径为a
和b
的每个轨道的每个节点计算x,y
。当它是灰尘(work=0)时,算法使用随机增量来计算不同的x, y
。这使得尘埃在轨道上围绕着它的原点扩散,用*椭圆方程计算,*创造了一个有趣的效果。
在幕后
https://heberleh.github.io/comics-universe/漫威和 DC 可视化—
如果你是一个漫画专家,并且发现了数据中的任何空白,考虑通过在他们的系统中插入新的信息来为维基百科和维基数据做贡献。
请留下您对任何主题的评论或私人笔记。
谢谢你看我的文章!
比较 Python 虚拟环境工具
我很喜欢我们在 Medium 上的社区。我最近发表了一篇关于为 Python 项目使用虚拟环境的文章。这篇文章很受欢迎,读者的反馈为我打开了一个新的视角。我以前不知道pew
、venv
和pipenv
。他们的推荐帮助我了解了该领域的最新技术,并进一步提高了我的知识和经验。
在他们的建议之后,我阅读了所有的建议。在这篇文章中,我将分享我学到的新的虚拟环境工具,以及它们之间的对比。
Python 虚拟环境的各种工具
Photo by Plush Design Studio on Unsplash
我浏览了各种文档和文章,了解了它们如何带来不同的东西。我的发现描述如下:
1.虚拟
我在之前的文章中已经讨论过virtualenv
了。你可以在这里查看。该指南可在这里获得。
优点: 通过pip
很容易升级,可以轻松使用多个版本的 Python。它还支持 Python 2.7+。
缺点: 这里 Python 解释器二进制实际上是复制到一个新的位置,需要从那里读取。此外,如果您想使用它,您必须单独安装它,因为它不是 Python 附带的。
边注:如果打算用
*virtualenv*
,rafabluszcz 扎瓦日基 推荐使用virtualenvwrapper。一定要去看看。
2.Python 环境包装器(pew)
pew
作为一个包装器,一旦你开始使用它,你只需要记住这个命令,因为它可以用于我们需要的所有命令。完整的文档可以在这里找到。
优点:
它让虚拟环境的工作变得非常容易。使用一个简单的命令,您就可以创建一个新的环境,安装一个软件包列表并激活该环境。
缺点: 我注意到的主要问题是现在它的支持非常有限。代码上最后一次提交是 2018 年 3 月,差不多一年了。
3.venv
venv
也可以用来设置和访问虚拟环境。从 Python 3.5 开始,它成为创建虚拟环境的推荐方法。你可以在这里找到它的文档。
优点: 它生成的配置文件是 Python 二进制直接理解的,不需要把二进制复制到新的位置。此外,Python 开发人员也支持它。
缺点: 不是针对 3.3 之前的 Python 版本。
4.pipenv
该工具将 Python 和虚拟环境的使用提升到了一个新的水平,因为它将包和环境管理支持结合到了一个工具中。这里的文件是这里的。
优点: 我们可以简单的指定我们工作的环境。此外,它允许我们为我们的环境创建单独的部分,如生产和测试开发。
缺点: 必须通过pip
单独下载。它增加了很多功能,但是如果他们觉得他们也需要额外的功能,应该采用它。
根据我的经验,所有不同的工具都能解决这个问题。它们中的每一个都可以帮助你轻松地创建一个虚拟环境,没有太多的麻烦。你可以简单地选择其中任何一个并学习它的工作原理。
我认为pipenv
是处理虚拟环境的最佳工具之一,并且由于其增加的功能,它的势头越来越大。因此,我将讨论让您开始使用pipenv
的基础知识。
pipenv
Photo by Farhan Azam on Unsplash
要使用brew
安装pipenv
,使用以下命令。
brew install pipenv
创造环境
一旦pipenv
安装完毕,我们就可以开始处理我们的环境了。转到您想要创建环境的任何文件夹。我来创造pipenvProject
里面的环境。只要进入它,安装你喜欢的任何软件包。让我们安装requests
。这将自动设置环境,创建Pipfile
和Pipfile.lock
。
cd pipenvProject
pipenv install requests
pipenv install requests
将在目录中创建两个文件。Pipfile
其中包括包列表、Python 版本等信息。锁文件也被生成为Pipfile.lock
。
Pipfile
Pipfile.lock
要激活这个环境,我们可以简单的说pipenv shell
。我们现在在虚拟环境中。我们现在可以使用python
命令进入 Python,并使用import requests
检查我们是否有这个包。由于我们没有得到任何错误,这意味着软件包已经安装。
Inside environment
我们可以使用exit
退出环境。当我们退出环境时,我们将不再能够访问requests
包。
Outside environment
我们也可以直接在环境中运行命令,而不需要显式调用shell
。为此,我们可以使用run
命令。因此,如果您必须运行 Python,请使用以下命令:
pipenv run python
与非 pipenv 用户的兼容性
每当我们在 Python 中安装一组包时,我们通常在一个名为 requirements.txt 的文件中指定列表。
pip install -r requirements.txt
因此,当您开始使用pipenv
时,有一种方法可以为该文件创建文本。简单地说,使用命令:
pipenv lock -r
Requirements file text
它将显示其他人可以使用的我们的requirements.txt
文件的文本。
删除环境
使用pipenv —-rm
命令很容易删除一个环境。要再次创建它,使用命令pipenv shell
。
但是,目录中的文件仍将保持原样。如果您希望完全删除它,请删除该目录。
cd ..
rm -r pipenvProject
结论
在本文中,我讨论了 Python 虚拟环境的新的高级工具,包括pew
、venv
和pipenv
。我也列举了他们的优缺点。
奖励:
Error
如果您在创建虚拟环境时遇到了上述错误,那么有一个简单的解决方法。在主目录中用touch
命令创建一个文件.bash_profile
。然后,在编辑器中打开它(我用的是vim
)。
touch ~/.bash_profile
vim .bash_profile
添加以下两行,保存并重启您的终端。问题会得到解决。
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
请随意分享你的想法和想法。我很乐意收到你的来信。
图像特征提取算法的比较
从颜色直方图到 VP 树
有许多算法专门用于图像的特征提取。它们中的许多工作原理类似于肺活量描记器或 Roomba。小机器人在房间里走来走去,撞到墙上,直到它有希望覆盖整个地板上的每一个斑点。类似地,一种算法将在一幅图像中穿行,从该图像中提取有趣的信息。这个过程称为特征检测。
球
特征检测的一个很好的例子可以用 ORB(面向快速和旋转简短)算法来看。它实际上是快速和简洁的结合。
ORB feature detection (Original photo provided by Limbik, features identified by me)
这些标记表示该图像的重要特征。这种算法甚至可以匹配已被扭曲(变灰、旋转和收缩)的同一图像的那些特征。
Matching features
ORB 本质上是找到图像的“角”。快速组件将特征识别为具有鲜明亮度对比的图像区域。如果超过 8 个周围像素比给定像素更亮或更暗,则该点被标记为特征。既然已经检测到了我们的特征,就要表达出来。BRIEF 通过将提取的点转换为二进制特征向量来实现这一点。这些是 128–526 个 0 和 1 的字符串。ORB 很有用。但是,在将 ORB 应用于完整的图像数据库,然后将这些特征存储到 CSV 中,然后使用 CSV 与给定的查询图像进行比较,以找到最相似的图像时,我遇到了麻烦。这个方法对任何 CBIR 来说都很棒,但是我很难正确实现。如果大家有什么指点,欢迎在下面随意评论!😃
文档:https://docs . opencv . org/3.0-beta/doc/py _ tutorials/py _ feature 2d/py _ orb/py _ orb . html
当心!页面底部的代码实际上并不好。请务必使用:
orb = cv2.ORB**_create**()
它可能需要一些巧妙的调试才能正常工作。
颜色梯度直方图
该方法简单地测量图像的红色、绿色和蓝色值的比例,并找到具有相似颜色比例的图像。颜色梯度直方图可以主要通过宁滨值来调整。
Color Gradient Histogram
Adrian Rosebrock 有一个实现这种比较图像方法的很好的教程:https://www . pyimagesearch . com/2014/01/22/clever-girl-a-guide-to-utilizing-color-histograms-for-computer-vision-and-image-search-engines/
这个方法很好,但不是很详细。如果你用蓝天查询和成像,它可以返回海洋图像,或者一个水池的图像。你可以把它想象成谷歌图片搜索中的颜色功能。
Google Image Search
有利位置树
如果您试图在数据库中查找重复的图像,VP-Tree 非常有用。该算法能够找到与查询图像相同的图像,或者近似相同的图像。同样,Adrian Rosebrock 在这方面有一个很好的教程:https://www . pyimagesearch . com/2019/08/26/building-an-image-hashing-search-engine-with-VP-trees-and-opencv/
这种方法主要分析图像的内容,并将所有信息压缩成 32 位整数。理论上,具有相似构图的图像将被相似地排序,并且基于构图将是相邻的。这被称为散列,下面是一个例子。
Images assigned a number
正如你所看到的,这两幅向日葵的图像有着相同的 8 位数。白色的文字是造成差异的原因,但它们最有可能是邻居。因此,如果两个图像都在您的数据集中,则一个查询会导致另一个。这种算法非常适合返回相同或接近相同的图像。它不考虑图像中被旋转或模糊的对象。
卡兹
这个算法很有趣,因为它似乎不是一个首字母缩写词。KAZE 指的是日语中的“风”风通过“非线性力”流动,因此,该算法由图像域中的非线性扩散过程组成。
https://www . doc . IC . AC . uk/~ ajd/Publications/alcantilla _ et al _ eccv 2012 . pdf
在我看来,这种类比有点牵强。看看下面的视频,感受一下 KAZE 使用的功能。
最后一个视频展示了 KAZE 模型的稳健性。KAZE 是在不同图像中识别同一物体的一个很好的模型。如果你有一个图像数据库,比如酒瓶,这将是一个很好的标签检测模型,并根据酒的标签找到匹配。
这是对许多不同形式的图像特征提取的快速概述。有许多选项可用,每一个都有不同的优势,可用于不同的目的。
如果你试图寻找重复的图像,使用 VP-trees。KAZE 和 ORB 非常擅长在不同的图像中检测相似的对象。颜色直方图非常适合制作由成千上万张图片组成的图片,或者至少可以找到具有相似颜色组成的图片。
Here’s content-based image retrieval!
使用这些算法中的一些,或者使用不同的算法,创建你自己的基于内容的图像检索系统!有这么多可以选择。我很想听听你的想法。
比较变压器标记器
比较最先进的变形金刚的分词器词汇(伯特,GPT-2,罗伯塔,XLM)
如果有人使用 Word2vec 或 GloVe 之类的单词嵌入,那么适应 BERT 之类的新的上下文嵌入可能会很困难。在这个故事中,我们将研究其中的一个区别:子词标记。这个故事的灵感来自于探索多语言 BERT 词汇的一个类似帖子。
对于这个实验,我们将使用 Huggingface transformer 库[1]。他们实施了多种最先进的架构。这个实验的代码可以在 Google Colab 上获得。
子词标记
子单词标记(或单词片段)可用于将单词分割成多个片段,从而减少涵盖每个单词的词汇量[2]。单词片段背后的思想和书面语言一样古老。字符是最知名的词块,英文单词可以用 26 个字符书写。
然而,寻找单词块的正确大小还没有被规范化。字符可以用 26 个左右的键来表示每个单词,而原始单词嵌入对每个单词使用不同的键(3M 键用于这个 word2vec 字典)【3】。小说《变形金刚》中的记号赋予者使用的词汇量介于两者之间。
Vocabulary size of the Transformers used in this experiment
伯特
BERT [4]使用单词片段[2]标记,其中非单词起始片段以##
开始。不同的 BERT 模型有不同的词汇表。例如,无外壳的基本模型有 994 个令牌保留用于可能的微调([unused0]
到[unused993]
)。cased 模型只有 101 个未使用的标记,因为它需要更多的标记来覆盖大写字母和小写字母。多语言模型只有 100 个未使用的标记,然而,它的总词汇量是无案例的四倍。多语言模型存储更多的特殊字符,以涵盖 104 种语言的单词。
单词标记化用bert-base-cased
:
[‘token’, ‘##ization’]
标记化
罗伯塔 GPT2
Huggingface 的 GPT2 [5]和 RoBERTa [6]实现使用相同的词汇表,包含 50000 个单词。他们使用 BPE ( 字节对编码【7】)字段和\u0120
作为特殊的信令字符,然而,Huggingface 实现对用户隐藏了它。
BPE 是一种基于频率的字符拼接算法:它以两字节字符作为标记开始,并基于 n 元语法标记对的频率,包括额外的更长的标记。例如,如果字母e
和r
在语言中频繁出现,一个新的标记er
将被添加到词汇表中。接下来,如果h
和er
经常在一起,her
被添加到词汇表中。该算法继续下去,直到它达到所需的大小。
单词标记化用模型gpt
:
[‘token’, ‘ization’]
标记化
XLM
与之前的词汇相比,XLM [8]在词尾使用了一个后缀:</w>
表示这是一个单词的结尾。XLM 使用多种语言和模型共享的基于 BPE 的词汇表。
用模型xlm-mlm-en-2048
:
[‘to’, ‘ken’, ‘ization</w>’]
将单词标记化
词汇相似度
下面的实验通过计算不同词汇的交集来度量它们之间的相似性。唯一的预处理步骤是消除上一节提到的特殊字符。第 I 行第 j 列单元格的计算公式:size(intersection(vocab(i),vocab(j)))/size(vocab(j))
。
为了正确分析该表,应该注意不同的模型具有不同的词汇量。bert-base-cased
(28996wps)和bert-base-multilingual-cased
(119547wps)的交集只能覆盖多语言词汇的四分之一,即使这两个词汇完全匹配。
Word2Vec [3]和 GloVe [9]是使用单词作为关键字的静态单词嵌入。对于其他信息,该表包括这些嵌入的 30000 个最常见的单词以及总词汇表。我们对 Word2Vec 使用 3M GoogleNews 模型,对手套使用维基百科 2014 + Gigaword 5 模型。
Comparison of the tokens in the different vocabularies
从这个表中,我们可以看到在 Word2Vec 模型中,bert-base-cased
中 87%的所有标记都被表示为单词。此外,bert-base-uncased
和xlm-mlm-en-2048
与其他相比彼此相对相似,因为它们具有超过 70%的相似性。
标记化差异
不同的单词片段带来不同的标记化。以下是一些不同单词分词的例子:
The different tokenization of the words “Marion”, “baptist” and “nuggets”
下图显示了 Word2vec 最常见单词的无大小写修改中同等标记化单词的增加。正如我们所看到的,在前 1000 个单词中,有 763 个单词以同样的方式被标记,然而,这个数字在前 4000 个单词中只增加到 1986 个,如果我们看前 10000 个最常见的单词,则增加到 3055 个。
Words tokenized the same way in every model
摘要
在这个故事中,我们看到不同的 Transformer 模型使用不同的标记器和不同的子词标记。正因为如此,在令牌级对模型进行比较是困难的。全球标准化子词模型的可能性是一个公开的问题。即使对于英语来说,标记化的词汇也有很大差异。
参考
[1]t . Wolf,处女作,l .,Sanh,v .,Chaumond,j .,Delangue,c .,Moi,a .,… & Brew,J. (2019)。拥抱脸的变形金刚:最先进的自然语言处理。 ArXiv,abs 。 arXiv:1910.03771
[2]吴,m .舒斯特,陈,z .乐,Q. V .,m .马切里,w .,… &克林纳,J. (2016)。谷歌的神经机器翻译系统:弥合人类和机器翻译之间的鸿沟。T11【arXiv 预印本 arXiv:1609.08144 。
[3]t .米科洛夫,陈,k .,科拉多,g .,&迪安,J. (2013 年)。向量空间中单词表示的有效估计。arXiv 预印本 arXiv:1301.3781 。
[4] Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。 Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805 。
[5]a .、吴 j .、蔡尔德 r .、栾 d .、阿莫代伊 d .、&苏茨基弗 I. (2019)。语言模型是无人监督的多任务学习器。 OpenAI 博客, 1 (8)。
[6]刘,y .,奥特,m .,戈亚尔,n .,杜,j .,乔希,m .,陈,d .,… &斯托扬诺夫,V. (2019)。Roberta: 一种稳健优化的 bert 预训练方法。 arXiv 预印本 arXiv:1907.11692 。
[7]森里奇(r .)、哈多(b .)、伯奇(a .)(2015 年)。带子词单元的生僻字神经机器翻译。 arXiv 预印本 arXiv:1508.07909 。
[8]康奈尔大学和兰普尔大学(2019 年)。跨语言语言模型预训练。神经信息处理系统的进展(第 7057–7067 页)。
[9]j .潘宁顿、r .索彻和 c .曼宁(2014 年 10 月)。 Glove:单词表示的全局向量。见2014 年自然语言处理经验方法会议论文集(第 1532-1543 页)。
比较单词嵌入
我们应用单词嵌入,因为它们已经被证明可以提高 NLP / ML / AI 任务的结果质量。一个有点天真的想法是,它们通过拓宽一个词、一个句子或一个文档与一个巨大的文本语料库中的平均上下文所铺设的狭窄路径来工作。通常,使用 Word2Vec 或 GloVe 的各种实现来生成单词嵌入。对于那些想要深入了解的人来说,这里有太多的artIcles描述了它们内部运作和底层算法背后的数学原理。
下面让我们仔细看看 Word2Vec 中实现的通用单词包(CBOW)和跳过语法(SG)模型。我们已经知道在训练 CBOW 时,我们试图从上下文预测单词,而在训练 SG 时,我们试图预测上下文单词。因此,CBOW 在处理大量训练数据和更频繁的单词时表现更好,而 SG 在处理少量训练数据时也表现良好,并且更好地表示不太频繁的单词。此外,SG 比 CBOW 花费更多的时间来训练。
“因此,假设我们使用相同的设置在相同的语料库上训练 CBOW 和 SG,当我们查看单词嵌入级别而不是应用程序中的性能时,我们会期望什么样的比较结果?”
“也许 CBOW 会返回更频繁的单词,而 SG 会返回不太频繁的单词.”
“最终的单词嵌入会有多大的不同呢?”
“不知道,让我们开始一个实验,并从中学习一些东西。”
—我内心的对话
所以我去从一个镜像获得了 2019 年 4 月的德语维基百科的转储,并应用了轻量级预处理(即,没有词汇化或其他繁重的 NLP 技术)来获得 2 GB 的纯文本,其中一些短语粘在一起。然后,我使用 gemsim 计算 CBOW 和 SG 模型,这两个模型有 324 个维度,窗口大小为 10,最小频率为 10,每个模型有 1.33M 个向量。
一种非常简单(但相当耗时)的比较方法是遍历其中一个模型的词汇表,并计算前 10 个相似单词中有多少匹配。结果以 1k 个词汇单词的步长绘制在下面,并且示出了两个发现:1)模型中的单词向量具有顺序,并且该顺序对一致率有影响。2)一般来说,最相似的单词在很大程度上取决于所选择的模型。
Walking through the agreements in vector order
语料库中的词频根据 Zipf 定律(幂定律)分布,使得非常少的非常常见的词构成了大量的原始词计数。然后是相当数量的中等频率的单词,最后是长尾巴的不常用单词。看上面的图片,单词向量顺序似乎主要是基于频率的。当逐字查看词汇并与源文本进行比较时,会发现它实际上是按单词在源语料库中的出现顺序排列的。因为单词的出现分布在整个语料库中,所以我们期望平均来说更频繁出现的单词比不太频繁出现的单词更早出现。我们还可以得出结论,源词的词频与符合率相关。
所以,让我们继续把词汇分成数量可观的几类,每一类都在一定的频率范围内。考虑到幂定律,可以通过将语料库中最常见的词的频率(这里为:“der”)与每个词的频率进行比较,取比率的对数(这里为:以 2 为底)并对结果进行舍入来构建频率类。在分布的顶部,数据非常稀疏,因此所有 200 个最频繁出现的单词被分配到类别“6”。下图中产生的 16 个频率类别在大小上相差甚远,但与最常用的单词相比,该单词在一个类别中的频率相差不到 2 的 1 次方。
number of words per frequency class
现在我们可以按频率等级重复最初的比较。此外,由于最初的计算耗时太长(2 天!),我们可以从每个类别(1k)中为输入单词抽取足够大的样本。下面的结果表明,词频和模型一致性之间的相关性假设总体上是正确的。在分布的顶部(类别 6-8 ),有一些单词具有较小的一致性,并且不适合整体趋势。这些是我们可以放心地称之为停用词的词。在分布的中间(9-15 级),有一个区域的协议一般是公平的,频率影响相当低。接近分布的尾部(16-21 级),符合率随着频率影响的增加而下降。
Agreement counts by relative word frequency
现在我们已经了解了 CBOW 和 SG 之间的协议以及词频的影响。接下来,我们可以通过与输入单词的频率类别进行比较来研究他们提出的最相似单词的频率类别的个体模型以及协议模型。我们再次使用采样,因为完整的计算需要很长时间。
CBOW: frequency class of result in dependency of frequency class of input
CBOW(上图)认为相似的词往往比 SG(下图)更频繁。在分布的顶部,对于 CBOW,建议的非常频繁的词的数量非常高,而对于 SG,建议的非常频繁的词的数量相当低。在分布的中间部分,CBOW 建议的单词比 SG 建议的单词更频繁一些。在分布的末尾,这种效应继续存在,但是 CBOW 也开始产生更多非常不常用的单词。当使用单词嵌入时,消除不太频繁的相似单词可能会产生有趣的效果。
SG: frequency class of result in dependency of frequency class of input
最后,我们再次达成了下面描述的协议模型。对于中低频率的单词,乍一看,它似乎结合了 CBOW 和 SG 模型的优点。然而,热情是有限的,因为我们还需要考虑根本没有达成一致的大量情况。
CBOW vs. SG: frequency class of result in dependency of frequency class of input
更新:我需要第二次尝试从同一个语料库中创建一个手套模型,因为我没有考虑手套的临时空间需求(大约是原始语料库的 9 倍)。
GloVe: frequency class of result in dependency of frequency class of input
总体观察是 GloVe,它比其他模型提出了更多不常见的相似词,这在尾部变得相当压倒性。
GloVe vs. CBOW: frequency class of result in dependency of frequency class of input
当比较手套和 CBOW 时,符合率略高于手套和 SG 之间的符合率(32.1%对 28.6%),而 CBOW 和 SG 之间的符合率最高(40%)。通过与 CBOW 的比较,我们仍然得到稍微更频繁的单词,但是在分布的中间(也是最重要的部分),差异不是非常显著。
GloVe vs. SG: frequency class of result in dependency of frequency class of input
最后还有:
- CBOW、SG、GloVe 的 1000 字/频类样本对比用数字和图表的 Google sheet:https://docs . Google . com/spreadsheets/d/1 ewmy _ npb 0-ui 5 czktw 7 bv 7 ICR 7c p 9 tjgmcwywaxwmky/edit?usp =共享
- 一个 jupyter 笔记本:https://github . com/al Hague/word _ embedding _ comparison/blob/master/Model % 20 comparison . ipynb
希望以上发现能有用。合乎逻辑的下一步将是把它们应用到与单词嵌入相关的任务中……在后续的故事中。
深度神经网络激活函数的比较
阶跃函数、线性函数、Sigmoid 函数、双曲正切函数、Softmax 函数、ReLU 函数、Leaky ReLU 函数和 Swish 函数都有手把手的讲解!
🔥 激活函数在神经网络中起着关键作用,因此了解其优缺点以获得更好的性能至关重要。
有必要从引入非线性激活函数开始,它是最著名的s 形函数的替代函数。重要的是要记住,在评估激活功能的最终性能时,许多不同的条件都很重要。在这一点上,有必要提请注意数学和导数过程的重要性。因此,如果你准备好了,让我们卷起袖子,动手干一场吧!🙌🏻
**什么是人工神经网络?让我们先记住这个:**基于通过生物的神经系统对学习结构进行建模/模仿的人工学习技术。该神经结构通过分级电流感测过程来实现。从感受器获取的电脉冲使我们能够学习、记忆和记住我们自出生以来所看到、听到、感受到和想到的一切。神经科学是一个非常深入和有趣的研究领域。
为什么我们需要激活功能?
CS231n: Convolutional Neural Networks for Visual Recognition
我们需要激活函数将非线性真实世界的属性引入人工神经网络。基本上,在一个简单的神经网络中,x 被定义为输入,w 是权重,我们传递 f (x)是传递给网络输出的值。这将是另一层的最终输出或输入。
为什么不激活就不能把这个信号切换到输出?
如果不应用激活函数,输出信号变成简单的线性函数。线性函数只是单级多项式。**未激活的神经网络将充当学习能力有限的线性回归。**但是我们也希望我们的神经网络学习非线性状态。**因为我们会给你图像、视频、文本、声音等复杂的现实世界信息,让你学习到我们的神经网络。**多层深度神经网络可以从数据中学习有意义的特征。
那么为什么非线性函数需要?
多阶函数称为非线性函数。人工神经网络被设计为通用函数 近似器并用于此目标。这意味着他们必须具备计算和学习任何函数的能力。由于非线性激活函数,可以实现更强的网络学习。这篇文章已经和这个问题完全相关了😇
为了计算与权重相关的误差值,应用人工神经网络的反向传播算法。有必要确定优化策略并最小化错误率。选择合适的优化算法也是一个单独的问题。
激活功能
阶跃函数
Step Function and Derivative
它是一个接受二进制值的函数,用作二进制分类器。因此,在输出层中通常是优选的。不建议在隐藏层使用,因为它不代表衍生学习值,未来也不会出现。然后,我们来想一个导函数,线性函数马上就想到了。
线性函数
Linear Function and Derivative
它生成一系列激活值,这些值不是二进制值,就像阶跃函数一样。它当然允许你将几个神经元(神经细胞)连接在一起。但是这个功能有一个重大问题!修正了导数。为什么我们需要它的导数,它被固定的负面影响是什么?我们所说的;通过反向传播算法,我们完成了神经元的学习过程。这个算法由一个导数系统组成。当 A = c.x 由 x 导出,我们就到了 c,这就意味着与 x 没有关系,好吧,如果导数始终是一个常数值,我们能说学习过程正在进行吗?可惜没有!
还有一个问题!当在所有图层中使用线性函数时,在输入图层和输出图层之间会达到相同的线性结果。**线性函数的线性组合是另一个线性函数。**这意味着我们最开始所说的神经元可以干扰互连层!🙄
Sigmoid 函数
假设自然界中的大多数问题都不是线性的,sigmoid 函数的组合也不是线性的。答对了。
Sigmoid Function and Derivative
然后我们可以对这些层进行分类😃所以让我们考虑非二元函数。它也是可导的,因为它不同于阶跃函数。这意味着学习是可以发生的。如果我们检查图形 x 在-2 和+2 之间,y 值变化很快。x 中的小变化在 y 中会很大。这意味着它可以用作一个好的分类器。此函数的另一个优点是,当遇到线性函数中的(- infinite,+ infinite)时,它会产生(0,1)范围内的值。所以激活值没有消失,这是个好消息!🎈
sigmoid 函数是最常用的激活函数,但还有许多其他更有效的替代函数。
那么乙状结肠功能有什么问题呢?
如果我们仔细观察函数两端的图形,y 值对 x 的变化反应很小,让我们想想这是什么问题!🤔这些区域的导数值非常小,收敛到 0。这被称为消失梯度并且学习是最小的。如果为 0,则没有任何学习!当缓慢学习发生时,使误差最小化的优化算法可以附加到局部最小值,并且不能从人工神经网络模型获得最大性能。所以让我们继续寻找另一种激活功能!🔎
双曲正切函数
Hyperbolic Tangent and Derivative
它的结构非常类似于 Sigmoid 函数。但是,这一次函数被定义为(-1,+ 1)。相对于 sigmoid 函数的优势在于它的导数更陡,这意味着它可以获得更多的值。这意味着它的效率会更高,因为它的学习和评分范围更广。但是,函数两端的梯度问题仍然存在。虽然我们有一个非常普通的激活功能,但我们将继续寻找最好的一个!
ReLU(校正线性单位)功能
ReLU Function and Derivative
乍一看,它似乎与正轴上的线性函数具有相同的特征。但最重要的是,ReLU 本质上不是线性的。事实上,一个好的评估者。也有可能通过 ReLU 的组合与任何其他函数收敛。太好了!这意味着我们仍然可以(再次)在我们的人工神经网络中对层进行排序😄
**ReLU 估值在[0,+G0],但是回报是什么,有什么好处?**让我们想象一个拥有太多神经元的大型神经网络。Sigmoid 和双曲线正切导致几乎所有的神经元都以相同的方式被激活。这意味着激活非常密集。网络中的一些神经元是活跃的,并且激活是不频繁的,所以我们想要有效的计算负载。我们用 ReLU 得到它。负轴上的值为 0 意味着网络将运行得更快。**计算负荷小于 sigmoid 和双曲线正切函数的事实导致了多层网络的更高优先性。**超级!😎但是即使是 ReLU 也不是很好,为什么?因为这个零值区域给了我们这个过程的速度!所以学习不是发生在那个区域。😕那你就需要找一个新的激活功能,有窍门的。
漏流函数
💧你能看到负平面上的漏洞吗?😲
Leaky ReLU Function and Derivative
这个泄漏值被给定为 0.01。如果给定一个接近零的不同值,函数的名称随机地改变为 Leaky ReLU。(没有,没有新功能?!😱)泄漏 ReLU 的定义范围仍然是负无穷大。这是接近于 0,但 0 与非生活梯度的价值在 RELU 生活在负区域的学习提供的价值。多聪明啊。🤓
Softmax 函数
它的结构非常类似于 Sigmoid 函数。与同一个 Sigmoid 一样,它在用作分类器时表现相当好。最重要的区别是在深度学习模型的输出层优先,尤其是需要分类两个以上的时候。 I t 允许通过产生 0-1 范围内的值来确定输入属于特定类的概率。所以它执行概率解释。
Swish(自门控)功能
Swish Function and Derivative
与 ReLU 最重要的区别是在负区域。**ReLU 里 Leaky 的值一样,有什么区别吗?**其他所有激活功能都很单调。请注意,即使输入增加,swish 函数的输出也可能下降。这是一个有趣的 swish 特有的特性。
f(x)=2xsigmoid(betax)
如果我们认为 beta=0 是 Swish 的简单版本,是一个可学习的参数,那么 sigmoid 部分总是 1/2,f (x)是线性的。另一方面,如果β是一个非常大的值,sigmoid 就变成了一个接近两位数的函数(0 代表 x < 0,1 代表 x > 0)。因此 f (x)收敛于 ReLU 函数。**因此,选择标准的 Swish 函数为β= 1。**通过这种方式,提供了软插值(将变量值集与给定范围和期望精度内的函数相关联)。太棒了。已经找到了解决梯度消失问题的方法。
Mathematical Expressions of Activation Functions
点击此处 查看梯度和偏导数可视化!
应该优先选择哪种激活功能?
当然,我不会说你会用它或者那个。因为我已经列出了每个激活功能的独特优缺点。 sigmoid 函数可以用如果你说双曲正切或者模型因为激活函数范围广可以学的稍微慢一点。但是如果你的网络太深,计算量是主要问题,可以首选 ReLU 。你可以决定使用 Leaky ReLU 作为 ReLU 中渐变消失问题的解决方案。但是你做的计算比 ReLU 多。
所以激活函数是一个关键的优化问题,你需要根据所有这些信息和你的深度学习模型的要求来决定。
- 网络的简单和快速收敛可以是第一标准。
- ReLU 在速度方面会有优势。你必须让渐变消失。它通常用于中间层,而不是输出。
- 漏 ReLU 可以是梯度消失问题的第一个解决方案。
- 对于深度学习模型,用 ReLU 开始实验是可取的。
- Softmax 通常用于输出图层。
你可以找到无数的文章来评价他们的比较。我最好的建议是把手弄脏!所以,测试你自己,如果你准备好了…
激活函数的定义和绘制
首先,让我们看看激活函数的识别和绘制:
Demonstration of Activation Functions
激活功能的性能评估
让我们来看看卷积神经网络模型在经典 MNIST 数据集上的激活函数的比较,我们称之为最先进的
Summary of Deep Learning Model Used
当具有两个卷积层的模型应用于 Sigmoid、双曲线正切、ReLU、Leaky ReLU 和 Swish 函数时,您可以观察到一些函数是如何领先于其他函数的,以及一些函数是如何接近的。您可以测试不同的数据集。此外,其他的,epoch,batch-size,dropout 等参数的影响也可以考察。也许我下一篇文章的主题可以是其中之一!
给出了 20 个历元的样本验证、训练精度和损失值的结果。测试结果也如下表所示。
Comparison of Validation and Training for Different Activation Functions (TRAINING)
Comparison of Validation and Training for Different Activation Functions (LOSS)
Comparison of Activation Functions for Deep Neural Networks by Merve Ayyüce Kızrak is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
🌈你可以在谷歌实验室找到代码👇🏻
colab.research.google.com](https://colab.research.google.com/drive/1fCVQ8JFiuyVWs6BoCIw0UqWPZPshU25h)
🌈激活函数如何帮助创建非线性决策极限?您可以在此处获得其他申请!
所以,欢迎随时关注我关于 中**推特 ,以及LinkedIn👽**
如果你想用土耳其语阅读这篇文章,点击这里!
❓ 如果有任何意见或问题,请不要犹豫让我知道。 ❗️
🎉我之前的一些博文!干杯!
heartbeat.fritz.ai](https://heartbeat.fritz.ai/capsule-networks-a-new-and-attractive-ai-architecture-bd1198cc8ad4) [## 什么是可解释的人工智能,是否需要?
可解释的人工智能-XAI 是一个近年来经常被争论的话题,也是一个…
interestingengineering.com](https://interestingengineering.com/what-is-explainable-artificial-intelligence-and-is-it-needed) [## 人工智能与律师:人工智能和法律的未来
“机器会思考吗?”让我们扩展一下艾伦·图灵在 50 年代提出的这个问题。无数的灾难场景,在…
interestingengineering.com](https://interestingengineering.com/ai-vs-lawyers-the-future-of-artificial-intelligence-and-law)
参考
- 深度学习的基础——激活函数以及何时使用它们?
- 理解神经网络中的激活功能
- 深度神经网络的非线性激活函数在 MNIST 分类任务上的比较
- SWISH:自门控激活功能
- 开创性的激活功能
- soft max 函数及其导数
- 在 MNIST 数据集上使用 SWISH 激活函数的实验**
数据分析工具的比较:Excel、R、Python 和 BI 工具
数据分析的时代已经到来。从国家、政府、企业到个人,大数据和数据分析已经成为大家耳熟能详的趋势。但你可能没有数据分析和编程的专业知识,或者你学了很多数据分析的理论,但还是实践不出来。这里我就比较一下最受数据分析师欢迎的四个工具, Excel , R , Python ,BI,作为入门数据分析的基础。
1.擅长
1.1 使用场景
- 一般办公室要求下的数据处理工作。
- 中小型公司的数据管理和存储。
- 对学生或教师进行简单的统计分析(如方差分析、回归分析等。).
- 结合 Word 和 PowerPoint 创建数据分析报告。
- 数据分析师的辅助工具。
- 为一些商业杂志和报纸制作图表(数据可视化)。
1.2 优势
- Excel 很容易上手。
- 学习资源非常丰富。
- 你可以用 Excel 做很多事情:建模、可视化、报告、动态图表等。
- 可以帮助你在进一步学习其他工具(比如 Python 和 R)之前,理解很多操作的意义。
1.3 缺点
- 要完全掌握 Excel,需要学习 VBA,所以难度还是很高的。
- 数据量大的时候会出现卡顿的情况。
- 在没有其他工具帮助的情况下,Excel 数据文件本身只能容纳 108 万行,并且不适合处理大规模数据集。
- 内置的统计分析过于简单,实用价值不大。
- 与 Python、R 和其他开源软件不同,正版 Excel 是收费的。
2.稀有
2.1 使用场景
R 的功能几乎涵盖了任何需要数据的领域。就我们一般的数据分析或者学术数据分析工作来说,R 能做的事情主要包括以下几个方面。
- 数据清理和数据简化。
- 网页抓取。
- 数据可视化。
- 统计假设检验(t 检验、方差分析、卡方检验等。).
- 统计建模(线性回归、逻辑回归、树模型、神经网络等。).
- 数据分析报告输出(R 降价)。
2.2 R 好学吗?
在我看来,入门 R 非常简单。10 天的集中学习,对于掌握基本的使用,基本的数据结构,数据的导入导出,简单的数据可视化已经足够了。有了这些基础,当你遇到实际问题时,你就可以找到你需要使用的 R 包。通过阅读 R 的帮助文件和网络上的信息,您可以相对快速地解决特定的问题。
3.计算机编程语言
3.1 使用场景
- 数据抓取。
- 数据清理。
- 数据建模。
- 基于业务场景和实际问题构建数据分析算法。
- 数据可视化。
- 数据挖掘和分析的高级领域,如机器学习和文本挖掘。
3.2 R 与 Python
R 和 Python 都是需要编程的数据分析工具。不同的是,R 专门用于数据分析领域,而科学计算和数据分析只是 Python 的一个应用分支。Python 还可以用来开发网页,开发游戏,开发系统后端,做一些运维工作。
目前的一个趋势是,Python 在数据分析领域正在赶超 R。在某些方面已经超越了 R,比如机器学习和文本挖掘。但 R 在统计学领域依然保持优势。Python 在数据分析方面的发展,在很多地方对 R 的一些特性进行了建模。所以,如果你还是新手,还没有开始学习,我建议你从 Python 开始。
Python 和 R 都很好学。但是如果你同时学习两者,会非常混乱,因为它们在许多地方非常相似。所以建议不要同时学它们。等到你掌握了其中一个,再开始学习另一个。
3.3 选择 R 还是 Python?
如果因为时间有限只能选择其中一个学习,我推荐用 Python 。但是我还是建议你两个都看一看。你可能在某些地方听说 Python 在工作中更常用,但解决问题才是最重要的。如果你能用 R 有效地解决问题,那么就用 R。事实上,Python 模仿了 R 的许多特性,比如 Pandas 库中的 DataFrames。正在开发的可视化软件包 ggplot 模仿了 r 中非常著名的 ggplot2。
4.双性恋的
数据分析有句话:文字不如表格,表格不如图表。数据可视化是数据分析的主要方向之一。Excel 的图表可以满足基本的图形要求,但这只是基础。高级可视化需要编程。除了学习 R、Python 等编程语言,还可以选择简单易用的 BI 工具。关于 BI 的介绍,可以看我的另一篇文章,开始数据分析师的职业生涯,应该学习哪些数据分析工具?
商业智能是为数据分析而生的,它的诞生起点非常高。目标是缩短从业务数据到业务决策的时间。这是关于如何使用数据来影响决策。
BI 的优势在于它更擅长交互和报告。它擅长解释历史和实时数据。可以极大的解放数据分析师的工作,促进整个公司的数据意识,提高导入数据的效率。市场上有很多 BI 产品。他们的原则是通过维度的链接和钻取来构建仪表板,从而获得可视化分析。相信大家对 SAP BO 、甲骨文、 Power BI 、 Tableau 这样的 BI 工具已经非常熟悉了。但如果你是数据分析初学者,我建议你学习使用 FineReport 。这是一个零编码工具。无需任何学习编程语言的基础,你就可以轻松掌握这个软件。传统开源软件功能有限,无法满足个性化需求。没有服务保障。而且他们学习成本高,需要长期学习。像 FineReport 这样的工具提供了解决所有这些困难的解决方案。
它有三个主要功能。
数据集成
FineReport 提供多数据源关联、跨数据库和跨数据表访问以及多业务系统数据的简单应用。它还将相关的业务数据整合到一个报表中,使更多的数据应用于运营分析和业务控制。
数据收集和建模分析
报告设计器允许用户以灵活简单的方式设计所需的报告。数据决策系统实现了报表的统一访问和管理,实现了各种业务的数据分析和填报。
数据显示
可以通过 PC 或移动终端访问数据。为了提高报表数据的可读性和挖掘数据价值, FineReport 提供了多种图表分析、钻取分析、多维分析、自定义分析和实时分析等功能。
Personalized charts of FineReport
Real-time dashboard of FineReport
Dynamic map of FineReport
还有一点
正如乔布斯的演讲,惊喜彩蛋放在最后!
个人版 FineReport 完全免费。可以去官网下载试试。
原载于 2019 年 5 月 28 日http://www.finereport.com。
图像艺术风格嵌入的降维技术比较
这项任务是作为一个高清历史图片在线图书馆的概念验证的一部分。
在之前的故事中,我开发了一个模型,将图像的艺术风格编码成高维空间中的向量,其中向量之间的欧几里德距离表示图像在视觉上的相似程度。
对于使用这些嵌入的图像推荐系统,数据集中每个图像的向量需要存储在磁盘上,并且需要在某个点计算两个或多个向量之间的距离。每个向量中存在的维度越多,系统的存储和计算需求就越大,从而增加了成本和搜索时间。
由于这个原因,减少嵌入向量中的维数是有益的,同时最小化在这样做时丢失的信息。为了实现这一点,测试了许多技术,下面更详细地探讨了所使用的方法。然而,对于这些嵌入,更传统的方法优于基于神经网络的方法。由于这个原因,PCA 维数减少被向前使用,PCA 在被应用于剩余部分之前在嵌入的样本上被训练,以便减少训练 PCA 所花费的时间。
降维效率
从信息的角度来看,有效的维度缩减依赖于至少一些存在的维度是冗余的,这意味着它们可以被其他存在的维度的函数所替代。
例如,考虑一个 3D 向量 V = [X,Y,Z]。如果 Z 可以表示为 Y,X 的精确函数,那么它可以从向量中移除,而不会从系统中移除任何信息。即使 Z 是 X,Y 的不精确函数,例如 Z = X + Y + e,其中 e 是一个不可观测的变量,我们仍然可以删除 Z,代价是删除 e 提供的信息。随着 e 的方差增加,丢失的信息也会增加。总的来说,通过降维丢失的信息可以通过降低 V 的维数,然后恢复去除的维数,并比较原始向量和变换向量的方差来找到。丢失的方差是通过维度减少丢失的信息的度量。
我正在处理的嵌入向量具有使它们成为降维的良好候选的特征,包括两个部分:
- 纹理之间的(展平的)协方差矩阵:该矩阵提供了两个纹理的每个组合之间的协方差。考虑三个纹理 I、j、k。如果纹理 I 和 j 相关,并且 j 和 k 相关,则我们期望 I 和 k 相关。这意味着 I 和 k 之间的协方差的维数包含一些冗余信息。便利矩阵包含数千个维度,其中许多是冗余的,可以在不牺牲大量信息的情况下删除。
- 由每种颜色组成的图像所占比例的向量,每个维度代表一种颜色。一些颜色可能永远不会被使用,因此可以被移除,而其他颜色可能显示出足够高的相关性,因此是多余的。
主成分分析
PCA 是一种线性降维技术,利用变量之间的线性关系来表达它们在更少的维度中所包含的信息。如下例所示,两个维度被压缩为一个。
这种技术非常有效,将维度减少了 94%,同时保留了原始数据的 99.3%的方差。
神经网络自动编码器
还测试了各种基于神经网络的自动编码器。这些将嵌入向量作为输入和目标,并使用连续的层来将嵌入的大小减少到一个小的“编码”状态,然后以类似沙漏的方式恢复到其原始尺寸,如下所示。
与 PCA 非常相似,这种设置可以最小化输入向量和解码向量之间的误差,同时创建一个维数更少的中间编码向量。与 PCA 不同,该技术通过多层引入非线性,允许在较低维度表示中捕获嵌入向量的元素之间更复杂的关系。理想情况下,这将导致较少量的信息丢失,然而,这种技术导致比 PCA 更多的信息丢失和更长的计算时间。
通过对不同网络体系结构的进一步实验,可能会有更好的信息丢失,但 PCA 提供的准确性和快速计算时间使其成为测试技术中的明显选择。
弥补 NLP 的理解不足
没有 AGI 的更好的人工智能应用
Photo by Patrick Tomasso on Unsplash
“一幅画胜过千言万语”这句话对语言媒介有点不公平。这表明语言是一种低效的交流方式,而事实恰恰相反。当人类使用语言交流时,因为说话者和听者分享同一个世界的经验,所以有很多东西被遗漏了,这使得在日常生活中没有必要对这个共享的世界进行明确的陈述。例如,如果我对你说“花瓶是侧着的,沿着桌子滚动”,我不需要告诉你花瓶是由易碎的材料制成的(这是一个合理的假设),或者桌子没有阻止花瓶滚动的边缘,或者因此花瓶可能会从桌子上滚下来,或者重力会使花瓶掉到地板上,地板很硬,因此会导致易碎的花瓶破碎。我说“花瓶侧着,沿着桌子滚动”就足以让你知道,除非有人干预,否则花瓶很可能会摔得粉碎。
Our shared world is left out of our utterances
我们在谈话中忽略的是我们可以合理假设我们的听众也拥有的所有知识。毫不夸张地说,整个世界都被忽略了,这就是自然语言处理(NLP)如此困难的原因,NLP 是一个让机器理解语言的领域。虽然一幅画可能胜过千言万语,但它们大多是没人愿意说出口的话。想象一张照片,一只狗在公园里追一个球。如果你在看这样一张图片,被要求描述你所看到的,你会提到草是绿的吗?这种信息在图像识别任务中是免费的,但在用于 NLP 任务的数据中却完全没有。
在我看来,这些事实使 NLP 成为人工智能中最有趣的领域。目前,机器对世界一无所知,因此也没有真正理解语言的能力。因此,尽管缺乏理解,最近 NLP 的所有令人难以置信的进步,如机器翻译能力的巨大飞跃,都发生了。这提出了两个有趣的问题:
- 我们会让机器拥有足够的世界知识,像人类一样理解语言吗?
- 在缺乏理解的情况下,NLP 的局限性是什么?
我们无法知道第一个问题的答案,尽管这是一个值得探索的有趣问题。向计算机灌输世界知识,即常识,是否等于创造所谓的人工一般智能(AGI)?或者有什么方法可以提供这样的知识,不像 AGI 那样,但足以完成自然语言理解的任务(NLU)?或许知识图谱是关键?或者完全是别的什么原因。DARPA 最近推出了机器常识计划来解决这个问题。这也是艾伦人工智能研究所的主要关注点。虽然我同意这种研究对于掌握问题的范围以及如何衡量解决问题的进展非常重要,但我必须承认我对实际或有用的结果持怀疑态度。作为一个在工业界工作并希望使用 NLP 解决当前业务问题的人,我不禁发现第二个问题更有说服力。在缺乏真正理解的情况下,我们需要能够认识到 NLP 的局限性,因为这就是今天的实际情况。
纵观当前的 NLP 应用,机器翻译(MT)是被广泛使用的一种。谷歌翻译现在每天翻译超过 1000 亿个单词,所以它显然提供了有用的翻译。但它不会很快完全取代人类翻译(事实上,美国劳工统计局预测,从现在到 2026 年,笔译员和口译员的就业增长将远远高于平均水平)。在正式翻译中,目标语言文本的质量必须与输入的质量一样高,例如法律文件或文学作品,仍然需要人工翻译。MT 系统通常会犯某些类型的错误,如果没有 NLU,就无法可靠地防范这些错误。一个例子是代词(“他”、“她”、“它”、“他的”、“她的”、“他们”、“他们的”等)。认知科学家道格拉斯·霍夫斯塔德去年写道他称谷歌翻译“肤浅”,指出它无法“理解”它所翻译的内容。霍夫施塔特的许多例子都涉及代词的误译。这些情况对机器翻译来说如此困难的原因是,要正确翻译一个代词,你必须知道它指的是什么。我们人类利用我们对世界的了解如此轻易地完成了这项任务,以至于我们几乎没有意识到自己在做这件事。但这恰恰是机器所缺乏的技能。
性别代词使这个问题特别清楚。在一些语言中,根本没有性别代词;在其他语言中,如法语,所有格代词的性别与名词一致,而不是像英语中那样与所有者一致:法语“sa maison”在英语中的正确翻译可能是“他的房子”或“她的房子”,这取决于我们谈论的是谁的房子。虽然一些简单的启发式方法在许多情况下可以有所帮助(例如,假设代词指的是最后提到的名词),但几十年的人工智能研究已经揭示了基于规则的方法对自然语言的普遍不足。此外,性别代词可能是机器翻译应用中偏见最明显的地方。你可能已经看过土耳其语句子翻译成英语的例子,根据名词的不同,一个无性别的代词变成了有性别的:“他”代表医生,“她”代表护士,等等。即使给出了大量关于正确的性别代词应该是什么的提示,谷歌翻译今天仍然默认有偏见的猜测:
The fact that we’re talking about John’s sister is a big hint that “she” is the correct pronoun here, not “he”, unless we’re so biased that we assume all doctors must be men.
被视为人工智能问题,这个代词问题很难解决。到目前为止,进展主要是以建立方法来测量 it 进展的形式出现的(例如,参见 GLUE 基准和 Winograd 模式挑战)。但是看做一个软件应用问题,代词问题其实很好解决。在这种情况下,讨论中的软件应用程序是一个翻译应用程序,解决方案只是在 UI 中为用户提供一个翻译选择:“他是医生”或“她是医生”。对于人类用户来说,答案是显而易见的。那么为什么不让用户来决定呢?碰巧的是,这正是谷歌最近在他们的帖子中宣布的改变,减少谷歌翻译中的性别偏见。但是从上面的截图来看,很明显这个解决方案只实现了一部分。如果你只是输入一个像土耳其语“o bir doktor”这样的句子,你会得到两个特定性别的选项,但似乎如果你提供任何上下文,系统仍然相信自己,可以说,从上下文中猜出正确的代词。但是,由于上述原因,这恰恰是不能相信它会做对的事情。
这个例子中值得注意的一点是,当没有给定上下文时,多个答案都是正确的,如果系统进行猜测并选择其中一个,它可能只是显示其偏见,但它不会是错误的。但是当提供上下文时,实际上只有一个正确的答案,选择另一个答案不仅会(在某些情况下)显示出偏见,而且显然是错误的。因此,在我看来,对系统来说,猜测何时提供上下文实际上比猜测更重要,因为在这种情况下,可能会出现错误的翻译。然而,谷歌只选择在一个问题得到解决的地方实施修复,即延续性别陈规定型观念的问题。但是它没有解决误译的问题。
当然,对于较长的文本,提供单独的翻译变得不太可行,但在这些情况下,有问题的代词至少可以以某种方式标记出来,以便用户处理。在 API 调用的情况下,调用者可以指定如何处理它们。重要的一点是,这里需要的是直接的工程解决方案,而不是人工智能解决方案(因为目前还没有)。
深度学习(尤其是 NLP 的深度学习)历史上的核心人物 Yoshua Bengio 最近在 NLP 专家的一次调查中被问及该领域的当前方向和最大的未解决问题。作为回应,他谈到了“基础语言学习”和“常识理解”的必要性,并批评了当前试图在没有这些关键要素的情况下取得进展的纯数据驱动的方法。他甚至声称,试图训练真正理解语言的模型将是徒劳的,“如果我们不解决建立世界模型的更困难的问题,即理解我们的世界如何工作的模型,其中有人类和其他代理人。相反,我们需要咬紧牙关,争取用自然语言处理解决人工智能这个更大的奖项。”
虽然学术研究人员可能会开始瞄准这个更大的奖项,但我们这些在行业中寻求用 NLP 解决商业问题的人今天需要用我们已经掌握的技术来凑合,尽管它们可能有限。当涉及到文本分类、情感分析,当然还有机器翻译等任务时,基于神经网络的 NLP 方法已经被证明是一个巨大的进步。这些方法通过消耗大量的文本数据来学习单词和短语的有用的数字表示。参与训练这些系统的架构正变得越来越复杂,预训练的表示和模型正被广泛使用。这一切都很棒,但是这些模型和架构的复杂性无法克服它们固有的局限性:缺乏理解仍然存在,并且不可避免地会产生错误。设计使用这些技术的应用程序必须包括为他们将会犯的错误而设计,即使这意味着提供一个用户界面,这个界面是关于应用程序缺乏智能的。我敢打赌,用户会重视这种诚实,更不用说应用程序的实用性提高了。
来自虚拟员工的竞争?为什么客服人员不应该害怕聊天机器人
围绕聊天机器人的大肆宣传和 Gartnerr 的预测,在未来两年内,50%的大中型企业将使用聊天机器人,这可能会导致客户服务员工夜不能寐。用机器代替人类从事面向客户的工作毕竟不是什么新鲜事。想想自助扫描收银台和自动取款机。因此,客服人员的担忧是合理的吗?聊天机器人在中大型公司客服部门的应用会不会很快引起裁员潮?
掌舵聊天机器人
几乎可以肯定的是,在未来几年,聊天机器人将越来越多地接管消费者和公司之间的联系。
“聊天机器人技术很容易使用,即使对于中小型企业也是如此。如果我们相信 Gartner 的预测,我们将在未来几年看到更多成功的聊天机器人应用,”OBI4wan 首席执行官 Alexander de Ruiter 说。
聊天机器人已经有许多可能的应用。无论是通过在线零售商的实时聊天应用程序提供产品和风格建议,还是支持在度假预订网站上找到合适的航班或酒店,或者回答标准的客户服务问题,聊天机器人都可以随时提供帮助。虚拟助理可以完美地融入所有现代客户服务渠道,如 Facebook Messenger、WhatsApp、Twitter 和实时聊天。Gartner 的研究表明,客户服务是聊天机器人的最大领域,我们预计这一趋势将在 2019 年继续。在我们最新的博客中阅读更多关于 2019 年聊天机器人趋势的信息。
聊天机器人正在使人类成为客服中的多余人员吗?
在某些情况下,聊天机器人可以在没有人类同事的情况下独自解决整个案件。此外,由于人工智能,现代机器人变得越来越聪明。他们在与每一位顾客的接触中学习和提高。这是否意味着迟早我们将能够完全没有人力资源的客户服务?拥有 25 年客户服务经验的 OBI4wan 首席执行官亚历山大·德·鲁特(Alexander de Ruiter)的回答是明确的“不”。
“尽管机器人变得越来越智能,但我们相信人类劳动力仍将是必要的。机器人将无法取代人类。但是,工作的内容会发生变化,会出现新的职位。”
OBI4wan 首席创新官弗兰克·斯密特(Frank Smit)宣称,我们已经迎来了第二次工业革命:
“当时人们认为每个人都会被机器抢走工作,现在聊天机器人就是这样。,尽管实际上是机器人确保员工获得更大的附加值。因为有了机器人,员工可以花更多的时间更好地帮助他们的客户。聊天机器人的成功部署可确保提高客户满意度、员工满意度和效率。‘’
人类在客户服务中不可替代的 3 个理由
1.聊天机器人很聪明,但不够强势
当与客户直接联系时,聊天机器人最适合回答简单的日常问题,以及获取缺少的信息,如订单号。这里最大的附加价值是它们的响应能力和全天候可用性。然而,对于复杂的情况,聊天机器人缺乏必要的同理心。聊天机器人客观、真实的回答并不适用于所有情况。要真正理解顾客,回应他们,满足他们的需求,需要换位思考和敏感。
“机器人是为了效率,员工是为了同理心。由于这种有效性,机器人创造了更好的客户体验。”obi 4 wan 首席执行官亚历山大·德·鲁特
2.复杂的情况需要人与人之间的互动
根据具体情况,需要找到个性化的解决方案,这需要客户服务人员的创造力和创新思维。不能总是遵循规则和标准程序以尽可能最好的方式解决案件。在这里,客户服务员工比聊天机器人有更多的“自由”,聊天机器人必须遵守预先定义的业务规则才能正常工作。
3.最好的结果是通过人和机器人之间的合作来实现的
聊天机器人可以在几秒钟内从大量数据和系统中过滤信息,并将其提供给人类同事。此外,他们可以独立回答常规问题,并准备答案。这样,客户服务员工的工作量就减少了,这样他们就可以花更多的时间为单个客户服务,并以最好的方式帮助他们。通过将重点从回答常规问题转移到更复杂的案例,客服人员的工作变得更有意义。这正是运动器材和服装零售商和制造商迪卡侬(Decathlon)自 2018 年 9 月推出聊天机器人以来所经历的情况。
“自从 9 月份推出聊天机器人以来,我们有了更多的时间为客户服务,这是显而易见的。我们都是迪卡侬的运动员,擅长回答关于运动的问题。我们的目标和梦想是让我们的员工完全专注于体育建议,把标准问题留给聊天机器人。然后,我们就可以真正将我们对运动的热情传递给我们的顾客。迪卡侬社交媒体经理 Paul de Vries
有关迪卡侬社交媒体经理 Paul de Vries 的完整采访,请点击此处
如果客服人员反对他们的团队中有聊天机器人,该怎么办?
公司不应该忽视客户服务人员的担忧,而是应该公开交流聊天机器人的意义和目的。重要的是要明确聊天机器人不是一种竞争,但从长远来看,它将使工作变得更容易,并提高满意度——不仅在客户中,而且在员工中。客服员工可以释放他们的全部潜力,专注于他们工作的核心:与客户互动,并为解决复杂的问题提供协助,而不是在简单的日常问题上浪费你的精力。
你是如何在你的组织中实现聊天机器人的?让我知道!
为新的和有抱负的数据科学家汇编建议
将 30 多条建议浓缩到 6 分钟内
Photo by Christopher Burns on Unsplash
也许这只是我的看法,但我注意到在数据科学社区的媒体和其他地方,越来越多的帖子围绕着向该领域的新人提供建议。我认为这很棒,正是这种类型的内容在我的数据科学家之旅中给了我巨大的帮助,并且在我继续学习和成长的今天仍然帮助着我。
但是随着这些帖子的数量越来越多,读者需要做更多的工作来寻找、筛选和处理所有可用的信息。这篇文章旨在让有抱负的数据科学家更容易找到该领域专家的所有优秀建议。下面的大部分观点都是从我觉得特别有帮助的以下 6 个帖子中提炼出来的:
- 给新手和初级数据科学家的建议
- 开始成为数据科学家之前我希望知道的 12 件事
- 给新数据科学家的建议
- 给有抱负的数据科学家的 6 条建议
- 给有抱负的数据科学家的 16 条有用建议
- 有抱负的数据科学家掌握这些基础知识
首先,我通读了每一篇文章,挑出每一条个人见解或建议。然后,我查看了想法列表,并记下了不同资源之间的任何共同主题,如下所示。在这篇文章的后面,我包括了所有其他独立的建议。我们开始吧。
共同主题
如前所述,以下是上面链接的几篇文章中重复出现的观点。对于每一点,我都会附上一点我自己的评论。
掌握沟通的艺术
这可能是其中最受欢迎的主题。数据科学中沟通的重要性经常被反复提及,而且理由充分。如果你不能传达这些见解,而以某种方式推动影响,那么筛选数据以发现见解是没有用的。像其他任何事情一样,有效的沟通是一项技能,你可以随着时间的推移不断练习和提高。
建立坚实的统计基础
无论是数据分析、机器学习、运行实验,还是更深奥的东西,都无法避免使用统计学。花时间建立一个坚实的基础并掌握基本的统计概念将会一次又一次地给你带来回报。
保持怀疑——不断质疑你的假设
作为数据科学家,我们不断做出假设,不管我们是否知道。这些假设可能与我们正在处理的数据或我们试图解决的问题有关,但它们需要被质疑。通过对我们的产出保持某种程度的偏执,我们确保我们在正确的轨道上。这种技能通常与探索性的、研究性的工作联系在一起,但它比你想象的更适用。
好奇心会带你走很长的路——问很多问题
与最后一点类似,保持好奇心也是值得的。好奇心可以让你获得有趣的见解,否则你永远也不会发现。它驱使你采取一种成长的心态并不断提问——这些问题会像工作本身一样帮助你学习和成长。
将你的作品公之于众(Github、博客等)。)
这对我来说是个大问题。在我职业生涯的早期,我了解到将你的工作推向世界的好处。无论是通过博客帖子、项目、推文,还是其他方式——这都不重要。重要的是你把一些东西放在那里。下面的推文很好地总结了我对此的立场:
用你感兴趣的真实数据建立学习项目
当从事学习项目时,确保你对这个主题感兴趣。这看起来很简单,但许多有抱负的数据科学家都在努力开发对潜在员工和同事来说最复杂或最令人印象深刻的项目。坚持你喜欢的,使用真实世界的数据,而不是超级干净的 Kaggle 或 UCI 数据集。对于加分,收集一些数据,建立自己的数据集。
你永远不会知道所有的事情——这没关系
很明显,数据科学是一个广泛而复杂的领域。你可以用你的整个职业生涯来练习它,甚至不去浏览它的表面。总会有另一种技术需要掌握,另一种工具需要学习,还有另一篇文章需要阅读。这就是为什么冒名顶替综合症在这个领域如此重要。我发现这同时令人沮丧和兴奋。
为问题选择正确的工具并掌握它们
同样,仅仅因为你不能掌握所有的工具,并不意味着你不能掌握其中的一些。可能会有几个你一天中大部分时间都在使用的构建模块。那可能是 R、SQL、Vim、Airflow、Scikit-learn,任何真正的东西。只要你专注于你的关键工具并学好它们,这并不重要。
更多要点
这些是我在不止一个链接的帖子中没有找到的想法。您将在这里找到同样有用和有趣的信息,有些比以前的常见主题更专业。
- 有效地划分优先级
- 学会正确估计任务需要多长时间
- 想想你的关键路径
- 与经验丰富的数据科学家合作
- 教授和传播数据科学
- 学习领域知识,而不仅仅是方法
- 最重要的技能是批判性思维
- 参加活动——黑客马拉松、会议、聚会
- 学习相关技能,而不仅仅是技术技能
- 灵活选择进入该领域的方式
- 获得一些云计算的实践经验
- 习惯于将事物粘合在一起并支持服务
- 写白皮书
- 在开始之前,一定要确保你理解了你的数据
- 混合算法通常只能打败一种算法
- 尽可能多地学习数学和物理课程
- 投资于你的软件工程技能
- 相信自己,追随你的激情
- 尝试数据科学中的不同角色
- 交流分析时,讲一个故事
- 变量的分布通常比它的位置更重要
- 取样是困难的,不会总是完美的
- 成为自信的命令行用户,提高工作效率
- 不断学习
- 开一个博客,建立一个作品集来展示你的技能
- 寻找将数据科学用于其战略的公司
- 公司的规模会影响你的角色
- 不要对你的第一份工作要求完美
- 学习如何推销你的想法
额外资源
除了我用来编辑这个列表的主要文章,还有一百万篇其他伟大的博客文章供有抱负的数据科学家利用。下面的这些帖子也有助于了解上面列出的一些要点。
要想了解更多关于以上要点的信息,请务必浏览我在这篇文章中链接的精彩资源。
数据科学家之旅并不轻松。作为一名数据科学家起步也没什么不同。但是信息共享的美妙之处让事情变得简单多了。它让我们向前人学习。我认为这是一件很酷的事情。传下去,享受旅程。
感谢阅读!请随意查看下面我的一些类似文章,并订阅我的简讯以接收任何新内容。
你可以在 Medium 上关注我更多类似的帖子,也可以在推特上找到我。更多关于我和我在做什么的信息,请查看我的网站。
用机器学习和特征重要性来补充 A B 测试
特性重要性如何帮助我从 A B 测试中得出正确的结论
Photo by Everton Vila on Unsplash
在这篇文章中,我想重点关注使用机器学习来补充其他数据科学任务,特别是 A/B 测试。这应该是一个实用的帖子,而不是理论上的讨论,我假设你至少对 A/B 测试和随机森林和特征重要性有些熟悉。
我最近遇到了一个有趣的挑战,要求我运行一个 A/B 测试,以测试一种拍卖类型是否比另一种拍卖类型卖得快。简单地运行 A/B 测试会得出这样的结论:一种拍卖类型确实比另一种类型卖得快,但事实证明,拍卖类型不是更快销售时间背后的主要驱动因素。这是一种拍卖类型的较低的相关价格。如果销售这些汽车的公司决定通过这种拍卖方式来销售,而不是首先关注定价,这可能会产生可怕的后果。
我发现这一点的方法是在数据集上运行随机森林,然后获取要素重要性,这有助于我发现这一点。事实上,我通常认为机器学习是探索性数据分析(EDA)以及 A/B 测试的一个很好的补充工具。
数据
我们先来快速看一下数据。对于 A/B 测试,感兴趣的是销售渠道,即两种不同的拍卖类型和销售时间,这是销售日期和购买日期之间的差异。
挑战
挑战在于运行 A/B 测试来判断拍卖类型 1 或 2 是否卖得更快——例如,如果我们可以得出一种类型比另一种类型卖得更快的结论,公司可以专注于通过一次拍卖卖出更多。
A/B 测试
事实证明,两种拍卖类型的销售时间分布都不是“正态”或 t 分布。两者都有一条长长的尾巴。然而,由于有了中心极限定理,我们可以通过从这些分布中随机取样并每次取其平均销售时间,将这些分布转换成更正态的分布。例如,如果我们这样做 1000 次,那么我们从图 1(显示每种拍卖类型的销售时间)到图 2(显示每种拍卖类型的平均销售时间)。
# Do the samplingresults = [] # create an empty list into which I insert the sampled means
random_state = np.arange(0,1000) # random seeds for reproducibility# sample with replacement using 50% of the data; do this 1000 times
# and append the mean seeling time to the list ‘results’
for i in range(1000):
sample = df.sample(frac=0.5, replace=True,
random_state=random_state[i]).groupby(by=’sales_channel’)[‘selling_time’].mean()
results.append(sample)
results = pd.DataFrame(results)
Graph1 — Distribution of Selling Time in Days
Graph 2 — Average Selling Time in Days
图 1 中不太明显的情况在图 2 中变得非常明显:拍卖类型 1 的平均销售时间比拍卖类型 2 短得多。运行 A/B 测试证实了这一点,p 值为 0.00。在这里运行 A/B 测试似乎是多余的,因为分布甚至没有重叠。
如果我们现在得出结论,该公司应该只通过拍卖类型 1 销售,因为汽车销售更快,那么我们可能会犯一个错误。
如果除了销售时间之外,还有其他特性/特征使这两种拍卖类型截然不同呢?这个数据集只有很少的特征,所以我们可以绘制更多相似的分布,计算可能的相关性等等。一种更简单、更有效的方法是使用机器学习来帮助我们——当我们有更多功能时,这变得特别有用——如果不是必要的话。
对救援的重要性
大多数机器学习算法都有一种计算其特征重要性的方法,即每个特征在预测目标/依赖特征时发挥了多大的作用。这里的目标是销售时间。
我在数据集上运行了随机森林,并计算了特征重要性。我还使用了 CatBoost,一种梯度提升树方法,但得出了相同的结论。这就是我坚持使用随机森林的原因,因为这是一种更容易让你理解的算法。
# Set up the model and define its parameters — let’s keep it simple
rf = RandomForestRegressor(n_estimators=100, max_depth=5)# Fit the model
rf.fit(X_train, y_train)# Calculate the mean feature importance
importances = rf.feature_importances_# Calculate the standard deviation of the feature importance
std = np.std([tree.feature_importances_ for tree in rf.estimators_],
axis=0)# Sort the features by their importance
indices = np.argsort(-importances)[::-1]# Plot the feature importances
plt.figure(figsize=(12,8))
plt.title(“Feature importances”)
plt.barh(range(X.shape[1]), importances[indices],
color=”r”, yerr=std[indices], align=”center”)
plt.yticks(range(X.shape[1]),X.columns[indices], rotation=0)
plt.ylim([len(importances)-6, len(importances)])
plt.show()
Random Forest Feature Importance
SHAP Values
在左侧,您可以看到每个特性对预测销售时间的重要性,柱越长,特性越重要。购买价格是最重要的特征,而销售渠道(拍卖类型)几乎无关紧要。
然后我计算了另一种叫做 SHAP 的特征重要性。阅读图表的方法如下:每个点是数据集中的一行/一个观察值。负 SHAP 值意味着特征值降低了目标预测值(销售时间)。蓝色表示特征值低,红色表示特征值高。当查看买入价格时,我们看到所有负 SHAP 值都是蓝色的,即低买入价格导致低卖出时间的预测。但是请注意,也有一些蓝点具有正 SHAP 值。在这种情况下,低买价导致相反的预测,即较长的销售时间。当要素相互交互时,可能会发生这种情况。有趣的是,销售渠道(拍卖类型)被很好地划分为红色的拍卖类型 1 和蓝色的拍卖类型 2。
# Plot the overall Feature Importance using SHAP
shap.initjs()
explainer = shap.TreeExplainer(cat)
shap_values = explainer.shap_values(pool_val)
shap.summary_plot(shap_values, X_val)
Average selling price distributions per auction type
在我们结束之前,让我们简要地看一下拍卖类型的购买价格。我们已经从特性的重要性中怀疑过这一点。两种拍卖类型的价格分布非常不同。拍卖类型 1 (ca。$6k)的价格比拍卖类型 2(大约 24k 美元)。
结论
简单地进行 A/B 测试,看一种拍卖类型是否比另一种卖得快,可能会导致错误的结论。运行随机森林或任何其他机器学习算法,然后计算特征重要性,可以让您更好地了解哪些特征会影响您感兴趣的目标。我发现使用机器学习来补充 A/B 测试有助于我做出更好的决策。希望对你也有帮助。
使用 Python 处理 Whatsapp 数据的完整初学者指南
利用基本的 Python 方法而不是 Regex 来处理文本数据
Photo by Rachit Tank on Unsplash
自由文本金矿
从给你爱的人发短信、发送迷因和专业用途,Whatsapp 一直以每月 15 亿活跃用户统治着全球的 messenger 市场。当涉及到复杂的 NLP 建模时,自由文本就是黑金。
面向企业的 NLP 提供了增强的用户体验,包括拼写检查、反馈分析甚至虚拟助手。
有了 NLP,自动完成并不是企业升级网站搜索的唯一方式。Klevu 是一个智能搜索提供商…
www.wonderflow.co](https://www.wonderflow.co/blog/natural-language-processing-examples)
在某些情况下,小企业可能会创建 Whatsapp 聊天组,在成员之间传递信息,作为建立系统记录数据的低成本替代方案。基于规则的聊天系统在聊天开始时就商定如何传播信息。考虑下面的例子:
21/09/2019, 14:04 — Salesperson A: Item B/Branch C/Sold/$1900
21/09/2019, 16:12 — Salesperson X: Item Y/Branch Z/Refund/$1600, defect found in product, not functioning
我们可以立即识别出与来自不同销售人员销售订单相关的模式,这些模式由常见的运算符分隔,如“/”和“,”。有了这样一个简单的系统(但容易出现人为拼写错误),我们可以使用 Whatsapp 分析不同产品和不同地区的销售模式。
方法学
网上有很多很好的资源可以把 Whatsapp 的数据转换成熊猫的数据框架。大多数(如果不是全部的话)使用 Python 的 Regex 库作为相当复杂的解决方案,将文本文件分割成数据帧的列。
然而,我在这里的目标是针对初学字符串操作的 Python 用户。对于学习 Python 的初学者来说,我们更熟悉不是来自外部库的基本 Python 方法。在这篇文章中,我们将使用许多基本方法来处理 Whatsapp 数据到 pandas 数据框架中。
以下是我们将要讨论的内容:
- 2 个库(用于 dataframe 和 datetime 的 pandas,用于检测 datetime 对象)
- 很多。split()方法
- 列出理解
- 错误处理
步骤 1:获取数据
如果直接从手机导出信息不太方便,您可以尝试以下方法:
[## 在安卓、iPhone、黑莓手机上阅读、提取 WhatsApp 信息备份
毫无疑问,WhatsApp 是移动设备上排名第一的信息服务,在 Android、iOS、黑莓等平台上都有应用
geeknizer.com](http://geeknizer.com/read-extract-whatsapp-messages-android-iphone-blackberry/)
不然最简单的提取 Whatsapp 的方法。txt 文件可以通过以下方法完成:
- 打开你的 Whatsapp 应用
- 选择您感兴趣的聊天
- 点击“…”>选择“更多”>选择“不带媒体的导出聊天”并将其发送到您的个人电子邮件
完成后,您的文本文件应该如下所示:
21/09/2019, 23:03 — Friend: my boss dont like filter
21/09/2019, 23:03 — Friend: he likes everything on a page
21/09/2019, 23:03 — Me: so basically you need to turn your data into ugly first then come out pivot table
21/09/2019, 23:03 — Me: haha
21/09/2019, 23:04 — Me: pivot table all in 1 page what
21/09/2019, 23:05 — Me: but ya i hate this kinda excel work sia
21/09/2019, 23:05 — Me: haha
21/09/2019, 23:05 — Friend: as in
21/09/2019, 23:05 — Me: hope to transition to data scientist asap
步骤 2:将数据导入 Python IDE
我们要做的第一件事是确保我们知道你的文本文件的位置。一旦我们知道了它的目的地,我们就可以将我们的工作目录设置为文件的位置:
import os
os.chdir('C:/Users/Some_Directory/...')
一旦解决了这个问题,我们就要定义一个函数,用下面的方法将文本文件读入 Python 变量:
上面的函数将我们的文本文件转换成一个字符串列表,允许我们使用。split()方法。但是现在,你需要做一些清洁工作。
步骤 3:处理多行消息
有时,由于多行文本,您提取的数据可能不是完美的格式。考虑下面的情况,使用上面已经转换为列表的同一个销售人员示例:
21/09/2019, 14:04 — Salesperson A: Item B/Branch C/Sold/$1900**'Some random text formed by new line from Salesperson A'**21/09/2019, 16:12 — Salesperson X: Item Y/Branch Z/Refund/$1600, defect found in product, not functioning
我们可以观察到**‘某个随机文本’**并不具有 Whatsapp 文本的每一行都应该具有的相同的通常格式。要处理这样的元素,我们先来看看 Whatsapp 短信的模式。
忽略日期之后的所有内容,显然不需要的元素中没有日期对象。所以我们通过检查它们是否包含第一个’,'之前的日期来开始删除它们。我们通过利用基本错误处理技术来做到这一点。
正如你所看到的,我们已经删除了大约 100 个元素,这些元素可能会对以后的特征提取造成阻碍。除非我们和朋友分享带标题的链接,否则不使用多行文本是我们大多数休闲短信文化的一部分。
步骤 4:特征提取
现在,您将使用基本的 Python 技能从列表中提取要素,稍后您将把这些要素解析到数据帧中。首先,我们需要重新审视 Whatsapp 数据中的字符串模式。
我们想要提取的第一个特征是日期。请记住,日期字符串正好出现在第一个’,'之前的**。所以我们使用。索引 0 处的 split(“,”)方法。我们可以用 Python 的 list comprehension 漂亮地写出这个。**
请注意,我来自 R 背景,我非常习惯在 for 循环中使用“I”。不使用 range()函数编写上述代码的另一种方法如下:
date = [text.split(‘,’)[0] for text in chat]
相比之下,这是使用 Regex 方法检查字符串模式是否为 date 所需要的。
Credits: Samir Sheriff
All that just to identify the date feature?! (Photo by Ben White on Unsplash)
这样一来,我们可以在提取发送者的时间和姓名时使用相同的逻辑。请注意以下模式:
- 时间字符串出现在第一个’,‘之后,第一个’-'之前
- 名称字符串出现在索引 0 处的第一个’-’ 之后,紧接着是第二个’:'之后的
最后,我们要提取消息的内容。这有点棘手,因为某些行不包含任何消息。相反,它们是系统生成的消息,如下所示:
21/09/2019, 11:03 — **Salesperson A created the group "Dummy Chat"** 21/09/2019, 11:03 — **Salesperson A added Salesperson B** 21/09/2019, 14:04 — Salesperson A: Item B/Branch C/Sold/$1900
21/09/2019, 16:12 — Salesperson X: Item Y/Branch Z/Refund/$1600, defect found in product, not functioning
请注意,在时间字符串中出现的第一个“:”后面没有附加的“:”。要正确看待这个问题,请考虑以下几点。拆分(‘:’)方法:
chat.split(":")#['21/09/2019, 14','04 — Salesperson A',' **Item B/Branch C/Sold/$1900**']
索引 2 处的元素是我们感兴趣的。但是,由于系统生成的消息不包含第二个“:”,在索引 2 处提取信息将会产生错误。因此,我们将继续我们的第二个错误处理技术。
您可以选择稍后删除带有“缺失文本”的元素。
最后一步:将所有内容连接成一个数据帧
现在我们有了 4 个特性列表,我们终于可以用一行代码创建一个熊猫数据框架了!
瞧啊。您的数据框已准备好进行后期分析!请注意出现在“名称”列中的系统生成的消息。您可以使用以下代码有条件地删除系统生成的消息中的行:
df = df[df[‘Content’] != ‘Missing Text’]
最后的想法
有许多方法可以利用处理过的 Whatsapp 文本数据来进行分析。从 把自己重新塑造成一个机器人 ,用 NLP 进行情感分析 到只是简单的 分析 。利用 Whatsapp 数据对于任何复杂的 NLP 项目来说都是很好的实践。
基本的字符串操作足以将文本文件转换成如上所示的熊猫数据帧。如果你是 Python 的新手(像我一样),最好习惯于基础知识,而不是尝试新技术,这些新技术在开始时可能会有点让人不知所措。然而,Python 的 regex 库仍然是文本挖掘和数据验证的中级到高级应用的重要工具。
这里有一篇很棒的文章,解释了 Python 中 Regex 库的概念及其在数据分析和数据科学中的潜在用途:
原始模式查找器
towardsdatascience.com](/the-ultimate-guide-to-using-the-python-regex-module-69aad9e9ba56)
编码快乐!
用 Mlflow 为非傻瓜完成数据科学项目模板。
从刚起步的忍者到大型企业团队,在本地或云中工作的每个人的最佳实践。
数据科学作为一个领域和业务职能部门已经走过了漫长的道路。现在有跨职能团队在研究算法,一直到全栈数据科学产品。
Kenneth Jensen [CC BY-SA 3.0]
随着数据科学的日益成熟,出现了最佳实践、平台和工具包的新兴标准,大大降低了数据科学团队的准入门槛和价格。这使得公司和从业者更容易接触到数据科学。对于大多数商业应用团队来说,数据科学家可以站在高质量开源社区的肩膀上进行日常工作。
但是成功的故事仍然被许多未能获得业务适应性的数据科学项目所掩盖。据普遍报道,超过 80%的数据科学项目仍然无法产生业务影响。有了所有高质量的开源工具包,为什么数据科学难以产生业务影响?这不是一道数学题!
数据科学的成功受到了通常称为“最后一英里问题”的困扰:
“模型的生产化是数据科学中最棘手的问题”(Schutt,R & O’Neill C .从第一线直接做数据科学,O’Reilly 出版社。加利福尼亚州,2014 年)
在这篇博文中,我讨论了建立一个数据科学项目,模型开发和实验的最佳实践。数据科学项目模板的源代码可以在 GitLab 上找到:
[## Jan Teichmann 的基于 Mlflow 的数据科学项目模板
GitLab.com 项目源代码
gitlab.com](https://gitlab.com/jan-teichmann/ml-flow-ds-project)
你可以在我之前的一篇博文中读到 Rendezvous Architecture,它是在生产中操作模型的一个很好的模式:
如何构建一个前沿的数据科学平台来解决数据科学中的真正挑战:生产化。
towardsdatascience.com](/rendezvous-architecture-for-data-science-in-production-79c4d48f12b)
像专家一样研究数据科学
当工程师构建生产平台、DevOps 和 DataOps 模式以在生产中运行模型时,许多数据科学家的工作方式仍然在数据科学和生产环境之间造成了巨大的差距。许多数据科学家(没有任何指责)
- 在本地工作而不太考虑可能在生产中托管他们的模型的云环境
- 使用 python 和 pandas 在内存中处理小型数据集**,而没有过多考虑如何将工作流扩展到生产中的大数据量**
- 使用 Jupyter 笔记本工作,无需过多考虑可重复实验
- 很少将项目分解成独立的任务,为 ETL 步骤、模型训练和评分构建分离的管道
- 软件工程的最佳实践很少应用于数据科学项目,例如抽象和可重用代码、单元测试、文档、版本控制等。
不幸的是,我们心爱的灵活的 Jupyter 笔记本电脑在这方面发挥了重要作用。
From “Managing Messes in Computational Notebooks” by Andrew Head et al., doi>10.1145/3290605.3300500
请务必记住,数据科学是一个正在经历快速创新的领域和业务职能。如果你在我发表文章一个月后读到这篇文章,可能已经有新的工具和更好的方式来组织数据科学项目了。成为数据科学家的激动人心的时刻!让我们看看数据科学项目模板的详细信息:
数据科学环境
Icons made by Freepik, phatplus, Becris from www.flaticon.com
一个数据科学项目由许多可移动的部分组成,实际的模型可能是项目中最少的代码行。数据是您项目的燃料和基础**,首先,我们应该为我们的项目建立坚实、高质量和可移植的基础。数据管道是大多数数据科学项目中隐藏的技术债务,您可能听说过臭名昭著的 80/20 法则:**
80%的数据科学是寻找、清理和准备数据
我将在下面解释 Mlflow 和 Spark 如何帮助我们更高效地处理数据。
Google NIPS 2015, fair usage
创建您的数据科学模型本身是在实验和扩展项目代码库以捕获有效的代码和逻辑之间的持续往复。这可能会变得混乱,Mlflow 在这里使实验和模型管理对我们来说明显更容易。这也将为我们简化模型部署**。稍后将详细介绍这一点!**
数据
W.Rebel [CC BY 3.0]
你可能听说过数据科学的 80/20 法则:许多数据科学工作都是关于创建数据管道来消费原始数据、清洁数据和工程特征,以最终提供给我们的模型。
我们希望如此
- 我们的数据是不可变的:我们只能创建新的数据集,而不能就地改变现有的数据。因此,
- 我们的管道是 DAG 中一组分离的步骤**,逐步提高我们数据的质量和聚合到特性和分数中,以便在生产中轻松地将我们的 ETL 与 Airflow 或 Luigi 等工具相结合。**
- 每个数据集都有一个定义的数据模式T21,可以安全地读取数据,不会出现任何意外,这些数据可以记录到一个中央数据目录中,以便更好地管理和发现数据。****
数据科学项目模板有一个保存项目数据和相关模式的数据文件夹:
[OC]
数据科学家通常不仅处理大数据集,还处理非结构化数据。构建数据仓库的模式需要设计工作和对业务需求的良好理解。在数据科学中,当创建 DWH 的模式时,许多问题或问题陈述是未知的。这就是为什么 Spark 已经发展成为该领域的黄金标准
- 使用非结构化数据
- 分布式企业成熟的大数据 ETL 管道
- 数据湖部署
- 统一批处理和微批处理流平台
- 能够在许多不同的系统之间使用和写入数据
拥有成熟基础设施的公司的项目使用先进的数据湖**,其中包括用于数据/模式发现和管理的数据目录,以及带有气流的调度任务等。虽然数据科学家不一定要理解生产基础设施的这些部分,但是最好在创建项目和工件时牢记这一点。**
这个数据科学项目模板使用 Spark,不管我们是在本地数据样本上运行它,还是在云中针对数据湖运行它。一方面,Spark 在本地处理小数据样本时会感觉有些矫枉过正。但另一方面,它允许一个可转移的堆栈为云部署做好准备,而无需任何不必要的重新设计工作。这也是一种重复的模式,可以很好地自动化,例如通过 Makefile。
虽然模型的第 1 版可能会使用来自 DWH 的结构化数据,但最好还是使用 Spark,并减少项目中的技术债务,因为模型的第 2 版将使用更广泛的数据源。
对于本地项目开发,我使用一个简单的 Makefile 来自动执行数据管道和项目目标。然而,这可以很容易地转化为气流或 Luigi 管道,用于云中的生产部署。
[OC]
该项目的端到端数据流由三个步骤组成:
- 原始数据:从机器学习数据库档案中下载虹膜原始数据
- 中间数据:执行特征工程流水线,用 Spark 批量实现虹膜特征
- 处理数据:执行分类模型,使用 Spark 批量实现预测
您可以使用以下 make 命令,通过 Spark 管道将 iris 原始数据转换为特征:
make interim-data
它将压缩当前项目代码库,并将project/data/features . py脚本提交给我们 docker 容器中的 Spark 以供执行。我们使用 Mlflow runid 来识别和加载所需的 Spark 功能管道模型,但稍后将详细介绍 Mlflow 的使用:
[OC]
在执行我们的 Spark 特征管道之后,我们在我们的小型本地数据湖中实现了临时特征数据:
[OC]
如您所见,我们保存了我们的特征数据集及其相应的模式。Spark 使得保存和读取模式变得非常容易:
some_sparksql_dataframe.schema.json()
T.StructType.fromJson(json.loads(some_sparksql_schema_json_string))
总是用相应的模式来具体化和读取数据!强化模式是打破数据科学中 80/20 法则的关键。
我认为为 csv 和 json 文件编写模式是强制性的,但我也会为任何自动保留其模式的 parquet 或 avro 文件编写模式。我真的推荐你多读一些关于三角洲湖、阿帕奇胡迪、数据目录和特色商店的内容。如果有兴趣的话,我会就这些话题发表一篇独立的博文。
实验用 Jupyter 笔记本
Jupyter 笔记本对于实验来说非常方便,数据科学家不太可能会停止使用它们,这让许多被要求从 Jupyter 笔记本“生产”模型的工程师非常沮丧。折中的办法是利用工具的优势。在笔记本上进行实验是高效的,而且效果很好,因为在实验中证明有价值的长代码会被添加到遵循软件工程最佳实践的代码库中。
我个人的工作流程是这样的:
- 实验:首先在 Jupyter 笔记本上测试代码和想法
- 将有价值的代码整合到 Python 项目代码库中
- 删除 Jupyter 笔记本中的代码单元格
- 用从项目代码库导入的代码替换它
- 重启你的内核和按顺序执行所有步骤,然后继续下一个任务。
[OC]
隔离我们的数据科学项目环境并管理我们的 Python 项目的需求和依赖性是很重要的。没有比通过 Docker 容器更好的方法了。我的项目模板使用来自 DockerHub 的jupyter all-spark-notebook Docker image作为方便的实验室设置,包括所有电池。项目模板包含一个 docker-compose.yml 文件,Makefile 通过一个简单的
make jupyter
该命令将启动我们的项目所需的所有服务(Jupyter with Spark、Mlflow、Minio ),并在我们的实验环境中安装 pip 的所有项目需求。我使用 Pipenv 为我的项目管理我的虚拟 Python 环境,使用 pipenv_to_requirements 为 DevOps 管道和基于 Anaconda 的容器映像创建 requirements.txt 文件。考虑到 Python 作为一种编程语言的流行程度,Python 工具有时会让人觉得笨重和复杂。😒
下面的屏幕截图显示了示例笔记本环境。我使用片段来设置个人笔记本,使用 %load magic 。它还展示了我如何使用项目代码库的代码来导入原始 iris 数据:
Jupyter 笔记本展示了我的开发工作流程,扩展了项目代码库和模型实验,并添加了一些注释。https://git lab . com/Jan-teichmann/ml-flow-ds-project/blob/master/notebooks/Iris % 20 features . ipynb
笔记本电脑的 Git 版本控制
public domain image
Git 中 Jupyter 笔记本的版本控制并不像我希望的那样用户友好。的。ipynb 文件格式不是很友好。至少,GitHub 和 GitLab 现在可以在他们的 web 界面中呈现 Jupyter 笔记本,这非常有用。
为了使本地计算机上的版本控制更容易,该模板还安装了 nbdime 工具,它使 Jupyter 笔记本的 git 差异和合并变得清晰而有意义。您可以在项目中使用以下命令:
- 以终端友好的方式比较笔记本电脑
- nbmerge 三方合并笔记本,自动解决冲突
- nbdiff-web 向您展示丰富的笔记本渲染差异
- nbmerge-web 给你一个基于 web 的三路笔记本合并工具
- 以终端友好的方式呈现单个笔记本
https://github.com/jupyter/nbdime
最后但同样重要的是,项目模板使用 IPython 钩子来扩展 Jupyter 笔记本保存按钮,并额外调用 nbconvert 来创建一个额外的。py 脚本和。html 版本的 Jupyter 笔记本,每次您将笔记本保存在子文件夹中。一方面,这使得其他人更容易通过检查纯 Python 脚本版本的 diff 来检查 Git 中的代码更改。另一方面,html 版本允许任何人查看渲染的笔记本输出,而无需启动 Jupyter 笔记本服务器。这使得将笔记本输出的一部分通过电子邮件发送给不使用 Jupyter 的同事变得非常容易。👏
要在每次保存时自动转换笔记本,只需放置一个空的。ipynb _ saveprocess文件放在您笔记本的当前工作目录下。
[OC]
Mlflow 跟踪实验和日志模型
fair usage
作为我们在 Jupyter 实验的一部分,我们需要跟踪我们创建的参数、度量和工件。Mlflow 是创建可重复且可靠的数据科学项目的绝佳工具。它为中央跟踪服务器提供了一个简单的用户界面来浏览实验,并提供了强大的工具来打包、管理和部署模型。
在我们的数据科学项目模板中,我们使用专用跟踪服务器和存储在 S3 上的工件来模拟生产 Mlflow 部署。我们在本地使用 Min.io 作为开源的 S3 兼容替身。无论您是在本地使用 Mlflow,还是在云中托管或完全在数据块上管理,使用 ml flow 的行为和体验都不应有任何差异。
docker-compose.yml 文件为我们的项目提供了所需的服务。您可以访问http://localhost:9000/minio上的 blob 存储 UI 和 http://localhost:5000/ 上的 Mlflow 跟踪 UI
在 Mlflow 中,我们命名了可以运行任意次数的实验。每次运行都可以跟踪参数、指标和工件,并且有一个唯一的运行标识符。Mlflow 1.4 还刚刚发布了一个模型注册表,以便更容易地围绕模型生命周期组织运行和模型,例如不同版本的生产和试运行部署。
[OC]
这个示例项目训练两个模型:
- 一种火花特征流水线
- Sklearn 分类器
我们的 Spark 特性管道使用 Spark ML StandardScaler 使管道有状态。因此,我们对待特征工程的方式与对待任何其他数据科学模型的方式完全相同。本例的目的是在批评分和实时评分中同时使用使用不同框架的两个模型,而无需对模型本身进行任何重新设计。这将有望展示使用 Mlflow 简化数据科学模型的管理和部署的强大功能!
Icons made by Freepik, phatplus, Smashicons from www.flaticon.com
我们简单地遵循 Mlflow 惯例,将训练好的模型记录到中央跟踪服务器。
public domain image
唯一的问题是,当你试图用 boto3 上传空文件到 minio 时,当前的 boto3 客户端和 Minio 不能很好地协同工作。Spark 用 empty _SUCCESS 文件序列化模型,导致标准的 mlflow.spark.log_model() 调用超时。我们通过将序列化的模型保存到本地磁盘,并使用 minio 客户端记录它们,而不是使用project . utility . ml flow . log _ artifacts _ minio()函数,来解决这个问题。下面的代码训练一个新的 spark 特性管道,并以两种方式记录管道:Spark 和 Mleap。稍后将详细介绍 Mleap。
[OC]
在我们的项目中,模型被保存并记录在 models 文件夹中,不同的 docker 服务将它们的数据保存在这里。我们可以在 models/mlruns 子文件夹中找到来自 Mlflow tracking server 的数据,并在 models/s3 子文件夹中找到保存的工件。
[OC]
示例项目中的 Jupyter 笔记本有望给出如何使用 Mlflow 来跟踪参数和度量以及日志模型的好主意。Mlflow 使序列化和加载模型成为一个梦想,并从我以前的数据科学项目中删除了许多样板代码。
[OC]
Mlflow 模型的批量评分
我们的目标是使用具有不同技术和风格的完全相同的模型对我们的数据进行批量和实时评分,而无需任何更改、重新设计或代码复制。
我们批量评分的目标是火花**。虽然我们的特征管道已经是 Spark 管道,但是我们的分类器是一个 Python sklearn 模型。但不用担心,Mlflow 使处理模型变得非常容易,并且有一个方便的函数可以将 Python 模型打包到 Spark SQL UDF 中,以便在 Spark 集群中分发我们的分类器。就像魔法一样!**
- 加载序列化的 Spark 功能管道
- 将序列化的 Sklearn 模型加载为火花 UDF
- 使用特征管线转换原始数据
- 将火花特征向量转化为默认火花阵列
- 用展开的数组项调用 UDF
[OC]
有一些关于正确版本的 PyArrow 的问题,UDF 不能与火花矢量一起工作。
public domain image
但是从一个例子来看,这很容易实现。我希望这能为您省去无尽的 Spark Python Java 回溯的麻烦,也许未来的版本会进一步简化集成。现在,在 Spark 2.4 中使用 PyArrow 0.14,将 Spark 向量转换成 numpy 数组,然后转换成 python 列表,因为 Spark 还不能处理 numpy 类型。您在使用 PySpark 之前可能遇到的问题。
所有详细的代码都在 Git 存储库中。https://git lab . com/Jan-teichmann/ml-flow-ds-project/blob/master/notebooks/Iris % 20 batch % 20 scoring . ipynb
Mlflow 模型的实时评分
我们希望使用我们的模型使用 API** 实时地对请求进行交互式评分,而不是依赖 Spark 来托管我们的模型。我们希望我们的评分服务快如闪电,由集装箱化的微服务组成。同样,Mlflow 为我们提供了实现这一目标所需的大部分东西。**
我们的 sklearn 分类器是一个简单的 Python 模型,将它与 API 结合并打包到容器映像中非常简单。这是一种非常常见的模式,Mlflow 为此提供了一个命令:
mlflow models build-docker
这就是用 Mlflow 打包 Python 风格的模型所需的全部内容。不需要用 Flask 编写 API 的重复代码来封装数据科学模型。🙌
不幸的是,我们的功能管道是一个火花模型。然而,我们在 Mleap 版本中序列化了管道,这是一个托管 Spark 管道的项目,不需要任何 Spark 上下文。
fair usage
Mleap 非常适合数据量较小且我们不需要任何分布式计算且速度最为重要的使用情形。在 Makefile 中,Mleap 模型的打包是自动进行的,但包括以下步骤:
- 使用 Mlflow 将模型工件下载到一个临时文件夹中
- 压缩工件以进行部署
- 运行combustml/mleap-spring-bootdocker 映像,并将我们的模型工件挂载为一个卷
- 使用 mleap 服务器 API 部署用于服务的模型工件
- 将 JSON 数据传递给我们服务的特性管道的转换 API 端点
运行make deploy-real time-model命令,您将获得两个微服务:一个用于使用 Mleap 创建要素,另一个用于使用 Sklearn 进行分类。 project/model/score.py 中的 Python 脚本将对这两个微服务的调用包装成一个方便的函数,便于使用。运行make score-real-time-model以获得对评分服务的示例调用。
您也可以从 Jupyter 笔记本中调用微服务。下面的代码显示了我们的交互式评分服务有多快:对两个模型 API 的调用加起来不到 20 毫秒。
测试和文件
示例项目使用 Sphinx 来创建文档。进入文档目录,运行 make html 为你的项目生成 html 文档。只需将斯芬克斯 RST 格式的文档添加到 python 文档字符串中,并在 docs/source/index.rst 文件中包含要包含在生成的文档中的模块。
[OC]
单元测试放在测试文件夹中,python 单元测试可以用
make test
在写这篇博文的时候,数据科学项目模板和大多数数据科学项目一样,还没有测试😱我希望有一些额外的时间和反馈,这将改变!
数据块
fair usage
没有对 Databricks 平台的讨论,任何关于 Mlflow 的博客文章都是不完整的。如果没有 Databricks 的持续开源贡献,数据科学社区将不会是现在这样,我们必须感谢他们对 Mlflow 的最初开发。❤️
因此,运行 MLFlow 的另一种方法是利用 Databricks 提供的 Apache Spark 的平台即服务版本。Databricks 使您能够以非常少的配置运行 MLFlow,通常称为“托管 MLFlow”。这里可以找到一个特征对比:https://databricks.com/product/managed-mlflow
只需用 pip 将 MLFlow 包安装到您的项目环境中,您就拥有了所需的一切。值得注意的是,Databricks 中的 MLFlow 版本不是已经描述过的完整版本。这是一个在 Databricks 生态系统内部工作的优化版本。
[OC]
当你创建一个新的“MLFlow 实验”时,系统会提示你输入一个项目名称和一个要用作人工制品存储的人工制品位置。该位置表示您将捕获在 MLFlow 实验期间生成的数据和模型的位置。您需要输入的位置需要遵循以下约定“dbfs:/ ”。DBFS 中的位置可以是 DBFS(数据块文件系统),也可以是使用外部装载点映射的位置,例如 S3 存储桶。
[OC]
配置 MLFlow 实验后,您将看到实验跟踪屏幕。在这里,您可以看到模型在训练时的输出。您可以根据参数或指标灵活地过滤多次运行。创建实验后,您需要记下实验 ID。在每个笔记本中配置 MLFlow 的过程中,您需要使用它来指回这个单独的位置。
[OC]
要将实验跟踪器连接到您的模型开发笔记本,您需要告诉 MLFlow 您正在使用哪个实验:
with mlflow.start_run(experiment_id="238439083735002")
一旦 MLFlow 被配置为指向实验 ID,每次执行将开始记录和捕获您需要的任何指标。除了度量标准,您还可以捕获参数和数据。数据将与创建的模型存储在一起,这为前面讨论的可重用性提供了一个很好的管道。要开始记录参数,只需添加以下内容:
mlflow.log_param("numTrees", numTrees)
要记录损失指标,您可以执行以下操作:
mlflow.log_metric("rmse", evaluator.evaluate(predictionsDF))
[OC]
一旦度量被捕获,就很容易看到每个参数是如何对模型的整体有效性做出贡献的。有各种可视化来帮助你探索不同的参数组合,以决定哪种模型和方法适合你正在解决的问题。最近 MLFlow 实现了一个自动记录功能,目前只支持 Keras。当这个被打开时,所有的参数和度量将被自动捕获,这真的很有帮助,它大大减少了你需要添加的模板代码的数量。
[OC]
如前所述,可以使用以下工具记录模型:
mlflow.mleap.log_model(spark_model=model, sample_input=df, artifact_path="model")
如果您已经在使用数据块,托管 MLflow 是一个很好的选择。实验捕捉只是提供的众多功能之一。在 Spark & AI 峰会上,宣布了支持模型版本控制的 MLFlows 功能。当与 MLFlow 的跟踪功能结合使用时,使用新的模型注册中心只需点击几下鼠标,就可以将模型从开发转移到生产中。
摘要
在这篇博文中,我记录了我的[固执己见的]数据科学项目模板,该模板在本地开发时考虑了云中的生产部署。这个模板的全部目的是应用最佳实践,减少技术债务和避免重新设计。
它演示了如何使用 Spark 创建数据管道和带有 Mlflow 的日志模型,以便于管理实验和部署模型。
我希望这能为你节省数据科学的时间。❤️
密码
public domain image
数据科学项目模板可在 GitLab 上找到:
** [## Jan Teichmann 的基于 Mlflow 的数据科学项目模板
GitLab.com 项目源代码
gitlab.com](https://gitlab.com/jan-teichmann/ml-flow-ds-project)
信用
我并不总是一个优秀的工程师和解决方案架构师。我正站在巨人的肩膀上,我要特别感谢我的朋友们来自 www.advancinganalytics.co.uk的特里·麦肯和西蒙·怀特利
****
**
Jan 是公司数据转型方面的成功思想领袖和顾问,拥有将数据科学大规模应用于商业生产的记录。他最近被 dataIQ 评为英国 100 位最具影响力的数据和分析从业者之一。
****在 LinkedIn 上连接:https://www.linkedin.com/in/janteichmann/
****阅读其他文章:https://medium.com/@jan.teichmann