预测性早期停止——一种元学习方法
作者:Dhruv Nair,数据科学家,Comet.ml
介绍
预测性提前停止是一种用于加速模型训练和超参数优化的最新方法。我们的基准研究表明,预测性早期停止可以加快模型训练多达 30%的底层基础设施独立。
我们基于从学习曲线外推、超带和中位数停止等项目中收集的见解,以创建一个预测模型,可以估计亏损曲线的收敛值。
Comet 能够利用其平台的公共部分的超过200 万个模型的模型数据,如超参数和损耗曲线,来创建一个模型,该模型的预测可以跨超参数和模型架构进行推广。
在某些情况下,我们能够在收敛实际发生之前的数百个时期提供收敛的估计。除了预测收敛值之外,我们的预测提前停止产品还提供了当前模型优于当前训练扫描中看到的最佳模型结果的概率估计。
在某些情况下,我们能够在收敛实际发生之前的数百个时期提供收敛的估计。
这些预测允许我们终止表现不佳的模型的训练,以便搜索过程只评估最有希望的候选人。
基准测试:
我们在三种不同的设置中测试了我们的预测性早期停止方法:
- 一种超参数搜索,用于优化充当神经网络代理的函数的参数
- 使用 SMAC 优化器在 CIFAR10 上优化 6 层 CNN 的超参数搜索,具有和不具有预测性早期停止。
- 使用具有超波段的随机搜索与具有预测性提前停止的随机搜索来优化相同的 6 层 CNN 的超参数搜索。
代理函数的结果:
在我们的第一个测试中,我们设置了一个指数衰减函数作为神经网络的代理。我们将这个代理模型运行了 20 步,并使用 Comet 的贝叶斯优化器和预测性提前停止来确定这个函数的参数的最佳值。在超参数搜索过程中,我们观察到不允许次优模型训练完整的 20 个步骤。图 1 ,说明了我们的停止机制。
SMAC 的 CNN 模型的结果:
我们对 CNN 模型的基准测试是以如下方式建立的:
我们使用 SMAC 优化器来估计 6 层 CNN 模型中的以下超参数。模型超参数和结构基于 AlexNet。
{
"learning_rate":{
"type":"loguniform",
"value":[0.0000001, 0.01]
},
"learning_rate_decay":{
"type": "uniform",
"value":[0.000001, 0.001]
},
"weight_decay": {
"type": "loguniform",
"value": [0.0000005, 0.005]
}
}
我们对优化器进行了 8 次测试,包括有无预测性提前停止。每个优化器试验都有 6 个小时的预算来评估尽可能多的配置。允许每个超参数配置最多训练 100 个时期,并且在每个时期结束时评估验证集。我们的预测性提前停止模型使用验证损失来确定是否终止超参数配置。
在所有试验结束时,我们确定了所有试验中试验损失的平均值,作为达到该损失值所需的超参数扫描中总次数的函数。
我们可以在图 2 中看到,使用预测性早期停止允许 SMAC 获得可比的损失值,几乎快了 300 个时代。这减少了 25%的超参数优化时间。
我们还根据最终验证损失,将超参数配置划分为分位数。然后,我们计算了优化器在所有试验的每个分位数上花费的平均时期数。
在图 3 中,我们看到 SMAC 和预测性提前停止 SMAC 花费大致相同的时间来评估前 25%和前 50%的配置。然而,预测性早期停止在结果的后 50%中花费少 30 个时期训练模型,在后 25%中花费少 20 个时期。
在图 4 中,我们看到了预测性提前停止的超参数扫描的样本损失曲线。次优配置会在允许的训练步骤总数之前停止。
具有超波段的 CNN 模型的结果:
我们以类似于 SMAC 的方式为 Hyperband 设置了测试。我们特别使用了在 Optuna 中实现的异步连续二等分普鲁纳。我们可以认为这是一个带有单个括号的超带。我们随机选择了 120 个超参数配置。每个配置被分配了最少 10 个时期的资源,并且被允许训练最多 100 个时期。这导致最大培训预算为 12000 个纪元。
在每个评估点,基于最差的验证损失,配置的数量减少 N 倍。在我们的实验中,我们评估了 N 值为 2、4 和 8 的超带。
对于预测性提前停止,我们使用不同的间隔参数值测试了每个配置。每 10、15 和 20 个时期评估一次配置。在每一次评估中,我们都会估计当前配置优于目前最佳配置的可能性。如果这个概率小于一个阈值,在我们的例子中是 90%,我们终止当前的配置。阈值和间隔都是用于预测性早期停止的可配置超参数。
然后,我们确定超参数扫描中实现的最佳验证损失,以及扫描后预算中剩余的历元数。
在图 5a 中,我们看到所有方法都找到了验证损失的最佳值,然而,预测性提前停止仅使用总预算的 15%就能评估配置,相比之下,Hyperband 使用了 25%。这在速度上提高了 10%。
结论
预测性提前停止具有非常明显的时间、能量和成本节约优势。浪费计算周期对环境或研究人员的预算都没有好处。
艾伦人工智能研究所最近发表了一份报告,报告内容是关于训练机器学习模型的计算成本不断上升,以及这些日益增长的能源需求如何对环境产生不利影响。该论文指出,当前最先进的人工智能研究进展主要集中在准确性或误差等指标上,代价是对环境不友好。他们称这种模式为红色人工智能。为了对抗红色人工智能研究的盛行,他们提出了向强调计算效率的人工智能研究的转变:绿色人工智能。
该论文建议根据生成结果所需的浮点运算(FPO)总数来跟踪人工智能算法的效率。FPO 的总数与调整期间评估的超参数配置的数量以及每个配置上花费的训练迭代次数直接相关。
我们希望我们在预测性早期停止方面的努力有助于提高超参数搜索过程的计算效率。我们认为这个工具是降低人工智能研究相关货币壁垒的一种方式,也是朝着采用绿色人工智能实践迈出的一步。
在我们的下一篇文章中,我们将描述在不属于较大参数搜索的单独运行中应用预测性早期停止。
*购买 Comet Teams 或 Comet Enterprise 后,预测性提前停止功能可作为附加功能提供。正在通过一项或多项未决专利申请寻求对预测性提前停车的专利保护。
了解更多信息并在此注册。
预测销售线索评分
在 Unsplash 上由 Carlos Muza 拍摄的照片
如今,成功的现代公司通过利用数据驱动的模型和见解,在了解其客户、产品和服务方面进行了大量投资。什么是预测性销售线索评分?为什么它对公司收购和销售策略的成功很重要?在客户旅程的每个阶段,您如何开发一个线索评分模型来优化具有预期质量的客户和潜在客户的数量?营销和销售团队如何有效地监控预测的销售线索得分,以及跟踪销售线索的质量和绩效?
我将回顾预测性销售线索评分的基本概念以及添加到营销和销售运营中的商业价值。然后,我将解释如何得出销售线索得分阈值,并系统地监控客户和潜在客户的表现,以推动最佳的销售线索质量和数量。
什么是预测性销售线索评分?
销售线索评分是关键的营销自动化任务之一,用于锁定正确的客户和潜在客户,并提高营销和销售团队的生产力和效率。预测性销售线索评分将传统的销售线索评分方法提升到了一个新的水平,方法是应用大数据和机器学习算法来评估现有客户和潜在客户的关键行为,并根据一个可以区分更有可能转化、保留或购买公司产品和服务的客户和潜在客户的量表对其进行排名。首先,预测性销售线索评分根据反映客户和潜在客户感知价值的标准生成一个可跟踪的指标。其次,它允许营销团队开展更有针对性的活动和投资,以最大限度地提高营销支出的投资回报率。第三,它通过优化销售团队与高质量客户和潜在客户打交道的时间和精力,提高了销售团队的效率和生产力。最后但同样重要的是,它通过协调收购和销售目标,提高了整体转化率和购买率。
如何开发预测性销售线索评分模型?
预测性销售线索评分流程从识别现有和潜在客户生成的数据和评分属性开始。确定优化的目标指标很重要——无论是转化率、保留率、产出还是服务质量等。此外,您需要根据一组关键属性训练销售线索评分模型,该模型可以捕捉客户生命周期的不同方面。该模型评估与客户和潜在客户相关联的各种属性和所识别的行为(即,客户购买)之间的关系,并基于实现所识别的行为的倾向对它们进行评分。
预测性销售线索评分模型包括哪些关键属性?
- 客户档案数据衡量您的客户和潜在客户的核心档案属性。这些属性可能包括客户的人口统计信息,如年龄、位置、职称、行业、任期以及角色细分。
- 帐户档案数据反映了重要的公司地理属性,如公司规模、行业和帐户类型等。
- 客户意向数据衡量现有和潜在客户对特定产品和服务的兴趣,以及他们与您的营销团队或销售代表接触的意愿。
- 客户参与数据捕捉重要的客户活动,包括电子邮件活动,如 CTO、CTR,网站活动,如访问、表单填写、产品页面浏览或下载、来宾帐户创建、免费或付费试用激活、网上研讨会或活动出席等。
- 客户购买数据捕获现有客户的购买活动,包括购买您的产品和服务的质量和金额,以及他们购买的时间和频率。
- 营销和销售绩效还提供了关于营销和销售计划和活动有效性的重要信息。表现出色的项目和活动通常可以揭示公司营销和销售活动的范围和影响的关键见解。此外,当营销和销售团队执行计划和活动时,他们从各种渠道获取客户和潜在客户,如直接、付费、有机搜索、推荐、社交媒体等。确定表现最佳的渠道将使团队能够更有效地与客户和潜在客户互动,并帮助发现各种渠道的优化策略。
一旦您收集了这些关键数据点,这些与客户或潜在客户相关的信息将被整合到系统中,同时触发预测性销售线索评分模型。整合的数据将流经预测性销售线索评分模型,该模型将科学地评估这些确定的属性与目标行为之间的关系。
好模式与坏模式
在开发您的销售线索评分模型时,训练几个模型并执行适当的模型验证是非常有用的,以便选择预测部署最准确的最佳模型。例如,AUC 是比较模型的好指标。一个好的模型将产生更高的 AUC,其中具有更高预测销售线索得分的客户最有可能对应于实际购买,而质量差的客户几乎没有购买该公司产品或服务的动机。另一方面,一个糟糕的线索评分模型可能会产生更多的“错误”,这意味着该模型要么会错过预测已经购买的高质量客户,要么会高估未成熟客户的质量。这意味着一个糟糕的模型往往会产生相对较少的真阳性(TP),但是会产生比你预期的更多的假阳性(FP)。
如何评价预测线索评分模型的性能?
在您训练评分模型后,预测的销售线索得分是如何工作的?市场营销和销售团队能否信任模型得出的分数,并根据预测的销售线索分数确定目标客户和潜在客户?要评估评分模型的性能,您可以将预测的销售线索得分应用于已完成销售周期的真实客户。
如左图所示,预测销售线索得分≥91 的前 10%客户几乎达到了累计购买百分比的 23%。专注于前 10%的客户可以覆盖给定时间段内总客户购买量的近 23%。同样,将预测销售线索得分≥75 分的前 30%客户作为目标客户,将允许团队覆盖客户购买总量的 2/3 以上。随着您的团队有能力覆盖更多的客户,在达到前 40%-50%的客户后,累积收益的提升开始下降。建议的销售线索评分阈值是立即与质量更高的前 40% -50%的客户合作。对于预测销售线索得分较低的客户和潜在客户,他们需要首先通过有针对性的信息培育计划进行热身。因此,很明显,营销和销售团队可以通过关注高质量的线索来实现生产力和效率的显著提升。
如何监控客户和潜在客户的质量?
营销和销售团队将需要建立收购和销售目标,并制定实现这些目标的策略。营销和销售团队如何有效地监控客户和潜在客户的质量,并优先考虑最有可能购买的人群?团队可以考虑以下用例,并决定他们希望如何在日常业务运营中利用预测的销售线索得分。
- **根据预测的销售线索得分有效地细分客户和潜在客户,并将其放入不同的类别。**如下表所示,仅关注预测销售线索得分≥75 分的热情销售线索将使团队覆盖客户总购买量的 84%。但是,如果他们花时间瞄准这些冷线索,他们预计只能覆盖客户购买量的 4%。
- **系统监控预测销售线索得分和客户购买率之间的关系。**在下面的图表中,当您从图表的左侧移动到右侧时,几乎可以立即看出预测销售线索得分和客户购买率之间有很强的正相关关系。因此,它向您的营销和销售团队发出了一个强烈的信号,要求他们优先关注高质量而不是低质量的客户。
- **准确提供关于关键优化指标的宝贵见解。**在这种情况下,您可以利用预测销售线索评分模型,深入了解哪些客户特征和行为属性对购买率的贡献最大,并揭示表现最佳的渠道、计划和活动等。
总之,预测性销售线索评分为现代公司取得成功提供了必要的信息。它不仅揭示了基于从现有和潜在客户以及产品和服务中收集的实时数据,哪些客户和潜在客户最有可能转变、保留甚至购买的关键见解,而且还帮助公司基准化和揭示关键优化指标,并一致地跟踪关键客户概况和细分,以便描绘出现有和潜在客户群中哪些销售良好而哪些销售不佳的完整画面。
如果你觉得这篇文章有帮助,请告诉我。如果您有任何问题或想法要分享,请随时发表评论。
阅读更多:
预测性维护:利用 CRNN 和光谱图检测传感器故障
应用深度学习和频谱图转换来防止故障
预测性维护是各个领域的一个活跃的研究领域。特别是在最近几年,机器学习解决方案出现了巨大的发展。一些企业投入大量资金来开发能够提前预测在商业活动中可能发生的故障的解决方案。
这些研究的一个有趣领域是物联网行业,我们有传感器来监控机器或特定引擎部件的工作状态。解决这类问题的经典方法通常包括采用时间序列模型和信号处理技术,使我们能够从高频数据中提取价值。
在这篇文章中,我们采用深度学习架构来执行预测性维护任务,以处理我们用光谱图预处理的高频数据序列。这一步使我们能够采用一种特定的神经网络结构,称为卷积递归神经网络(CRNN) ,它同时从我们数据的空间和递归结构中学习。
数据
我们的任务需要研究压力条件下的液压管道,以便跟踪系统特定部分的活动状态。
该数据集是用液压试验台通过实验获得的。该试验台由通过油箱连接的一次工作回路和二次冷却过滤回路组成。当四个液压部件(冷却器、阀门、泵和蓄能器)的状态定量变化时,系统周期性地重复恒定负载循环(持续时间 60 秒)并测量过程值,如压力、体积流量和温度。
这些数据是由 UCI 储存库(液压系统状态监控)收集的,我们都很熟悉,因为我在以前的帖子中使用过这些数据来开发预测性维护解决方案。现在,我们的范围始终是开发一种能够检测故障的机器学习解决方案,但我们对处理高频数据感兴趣。因此,我们利用以 100 Hz 采样的压力数据(每个传感器 6000 个属性:总共 6 个)来建立一个模型,该模型将蓄能器的状态分为四类(最佳压力、稍微降低的压力、严重降低的压力、接近完全失效)。
光谱图变换
处理这种原始数据的第一步包括充分的预处理阶段。数据只是被分成固定的、相同的标记序列,我们的职责是从这些信息来源中提取价值。如前所述,我们采用光谱图对这些信号片段进行预处理,并输入 CRNN。频谱图是信号的时频画像。它们是信号频率成分强度随时间变化的曲线图。它们在音频处理/分类中被广泛采用,并且由于它们在高频域中映射数据行为的能力而对我们有用。为了应用声谱图变换,我们必须首先降低级数的幅度;一个简单的区分,加上一个适当的剪辑来限制极端的变化,听起来不错。以下是由 6 个不同压力信号组成的原始和标准化序列的示例:
用 python 计算光谱图相当容易;Librosa 是一个提供这种功能的好库。我们对每一个压力系列都进行了转换,所以我们对每一个样品都进行了 6 个光谱图的转换,而不是原始信号的转换。
单个压力信号的频谱图示例
模型
卷积和递归神经网络是构建深度学习模型最常见和最强大的结构。CNN 和 rnn 并不相互排斥,因为两者都可以对图像和文本输入进行分类,从而为结合两种网络类型以提高效率创造了机会。如果要分类的输入在视觉上是复杂的,并且增加了 CNN 单独无法处理的时间特性,则尤其如此。
CRNN 架构示例
典型地,当这两种类型的网络结合时,有时称为 CRNN,输入首先由 CNN 层处理,其输出然后被馈送到 RNN 层。这些混合架构正被开发用于视频场景标记、光学字符识别或音频分类等应用。对于我们的分析,我们将先前生成的光谱图输入 CRNN,以检测液压管道中蓄能器的工作状态。每个观察值现在由叠加的光谱图组成(总共 6 个,每个压力信号一个)。在 Keras 语言中,我们可以这样复制 CRNN:
def get_model(data):
inp = Input(shape=(data.shape[1], data.shape[2], data.shape[3]))
x = Conv2D(filters=64, kernel_size=(2, 2), padding='same')(inp)
x = BatchNormalization(axis=1)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 1))(x)
x = Dropout(0.2)(x)
x = Permute((2, 3, 1))(x)
x = Reshape((data.shape[2], -1))(x) x = Bidirectional(GRU(64, activation='relu',
return_sequences=False))(x)
x = Dense(32, activation='relu')(x)
x = Dropout(0.2)(x)
out = Dense(y_train.shape[1], activation='softmax')(x)
model = Model(inputs=inp, outputs=out)
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
return model
在第一阶段,网络从频谱图中提取卷积特征,保留结构频率 x 时间 x n _ 特征。当我们传递到递归部分时,我们需要以格式time x n _ features:time对我们在卷积级别和频谱图中观察到的维度进行整形;新的 n_features 是在卷积 n_features 和频率上计算的谄媚操作的结果。
最后,我们的模型在我们的测试集上可以达到大约 86%的准确率。
摘要
在这篇文章中,我执行了一项预测性维护任务,对液压管道中特定类型的组件的工作状态进行了分类。在预处理阶段,我们可以应用原始高频压力信号的频谱图变换和强大的 CRNN 作为模型结构,从我们的数据中提取空间和时间特征,从而实现很好的性能。
如果你对题目感兴趣,我建议:
保持联系: Linkedin
涡扇发动机的预测维修
使用时间序列数据并询问 RNN“下一次故障何时发生?”
比尔·杰伦在 Unsplash 上的照片
预测性维护对于制造商和维护人员都非常重要,它通过在问题导致设备故障之前解决问题来降低维护成本、延长设备寿命、减少停机时间和提高生产质量。
“预测性维护技术旨在帮助确定在用设备的状况,以便估计何时应该进行维护”——来源维基百科
在这篇文章中,我想展示一下使用 **RNN(递归神经网络)/LSTM(长短期记忆)架构不仅更准确,而且与之前由 Marco Cerliani 编写的 **CNN(卷积神经网络)方法相比,它在准确分类结果方面表现得更好。
资料组
本帖使用 C-MAPSS 数据集 进行涡扇发动机的预测性维护。这里的挑战是确定剩余使用寿命(RUL) 直到下一次发动机发生故障。
数据集可以在 这里 找到,下面简单介绍一下数据集,
“在每个时间序列开始时,发动机正常运行**,但在序列中的某个时间点出现故障。**
在训练集中,故障在数量上增长,直到系统故障。
在测试组中,时间序列在系统故障之前的某个时间结束。
以下是模型训练中使用的发动机状况
列车轨迹:100 个
测试轨迹:100 个
条件:一个(海平面)
故障模式:一个(HPC 退化)
了解数据集
加载数据集后,我们将获得 100 台发动机的时间序列数据,其中包含每 100 台发动机的运行设置和传感器读数,以及故障发生的不同场景和总共 20631 个训练示例。举例来说,下面是我们的训练数据集的前 5 个训练示例。
train_df.head()
图 1:训练数据
为了进一步理解给定的数据,(见图 2)描述了对于给定的发动机,在下一个故障发生之前还有多少循环。
例 1:69 号发动机(最左边)在故障前大约还有 360 个循环。
例 2:发动机识别号 39(最右边)在故障前大约还有 110 个循环。
train_df.id.value_counts().plot.bar()
图 2:发动机及其各自的剩余有用循环直到故障
以下(图 3 和图 4)是 id 为 69 的发动机的时间序列数据。
engine_id = train_df[train_df['id'] == 69]ax1 = engine_id[train_df.columns[2:]].plot(subplots=True, sharex=True, figsize=(20,30))
图 3:运行设置 1、2 和 3 的时间序列读数以及 s2 到 s7 的传感器读数
图 4:传感器 s8 直到 s20 的时间序列读数
*图片(图 2、图 3、图 4)使用 Marco Cerliani 的 GitHub Notebook ( 此处 )的源代码获得。
数据预处理
数据预处理是训练任何神经网络的最重要的步骤。对于像 RNN(递归神经网络)这样的神经网络,网络对输入数据非常敏感,数据需要在-1 比 1 或 0 比 1 的范围内。这个范围即-1 比 1 或 0 比 1,通常是因为 tanh ( 见图 5) 是伴随在网络隐层中的激活函数。因此,在训练模型之前,必须对数据进行标准化。
图 5:MathWorks 文档中的 tanh 函数
使用 sklearn 的预处理库提供的最小最大缩放器函数,我们在 **0 到 1、**的范围内归一化我们的训练数据,尽管理论上我们可以将我们的数据归一化并实验到-1 到 1。然而,这篇文章仅仅展示了数据在 0 到 1 范围内的缩放。
from sklearn.preprocessing import MinMaxScalersc = MinMaxScaler(feature_range=(0,1))
train_df[train_df.columns[2:26]] = sc.fit_transform(train_df[ train_df.columns[2:26]])
train_df = train_df.dropna(axis=1)
使用列号 2 到 26(见图 1)的原因是,我们采用操作设置 1(列号 2)、设置 2、设置 3、传感器 1 直到传感器 21(列 25),python 范围不考虑上限,因此上限为 26。为便于说明,这里是训练数据标准化后的前 5 个训练示例(图 6)。
图 6:训练集的标准化数据
一旦我们将数据标准化,我们就采用一种分类方法来预测 RUL。我们通过以下方式为我们的分类方法在数据集上添加新的标签来做到这一点。
"使用以下源代码:fromGithub"
w1 = 45
w0 = 15train_df['class1'] = np.where(train_df['RUL'] <= w1, 1, 0 )
train_df['class2'] = train_df['class1']
train_df.loc[train_df['RUL'] <= w0, 'class2'] = 2
这段代码现在为我们的分类问题创建标签(见图 7 ),分类方法如下:
标签 0:当剩余 45+个循环后出现故障。
标签 1:当在 16 和 45 之间的周期直到故障时。
标签 2:当在 0 和 15 之间的周期直到故障时。
图 7:添加标签
太好了!现在,我们需要进一步准备数据,以便神经网络有效地处理时间序列数据,我们通过指定时间步长(或窗口大小)来做到这一点。诸如 RNN 或 CNN 之类的神经网络要求输入数据为三维形式。因此,我们现在需要将二维数据转换成三维数据。
为了演示这一转换过程(见图 8),我们简单地通过指定时间步长(窗口大小)来运行时间序列数据。这个过程也被称为滑动窗口技术 。
图 8:来自弹簧连杆的滑动窗口技术
对于我们的时间序列数据,我们将滑动窗口技术用于所有传感器和操作设置,通过指定时间步长(或窗口大小)为 50,尽管时间步长大小可以任意设置。下面的代码片段将我们的二维数据转换为大小为 15631x50x17 的三维数据(numpy pandas 数组),这对于神经网络的输入是最佳的。
“以下源代码修改:来自Github
*time_steps = 50def gen_sequence(id_df):data_matrix = id_df.iloc[2:26]
num_elements = data_matrix.shape[0]for start, stop in zip(range(0, num_elements-time_steps), range(time_steps, num_elements)):
yield data_matrix[start:stop, :]def gen_labels(id_df, label):data_matrix = id_df[label].values
num_elements = data_matrix.shape[0]return data_matrix[time_steps:num_elements, :]x_train, y_train = [], []
for engine_id in train_df.id.unique():
for sequence in gen_sequence(train_df[train_df.id==engine_id]):
x_train.append(sequence)
for label in gen_labels(train_df[train_df.id==engine_id['label2']):
y_train.append(label)x_train = np.asarray(x_train)
y_train = np.asarray(y_train).reshape(-1,1)*
*更多时间序列数据的进一步阅读,请阅读文章( 此处 )。
深度学习模型
RNN/LSTM 在处理时间序列数据方面得到了最好的证明,网上有大量的文章证明了其在广泛应用中的有效性。因此,我们采用 RNN/LSTM 架构。
现在,由于我们的数据已经准备好,并且是三维形式,我们现在可以定义 RNN/LSTM 神经网络架构,该架构包括 2 个隐藏层,每个隐藏层具有激活函数 tanh (见图 5),后面是一层 softmax 分类器。
*model = Sequential()#inputmodel.add(LSTM(units=50, return_sequences='true', activation='tanh',
input_shape = (x_train.shape[1], x_train.shape[2])) )
model.add(Dropout(0.2))#hidden layer 1
model.add(LSTM(units=60, return_sequences='true',activation='tanh'))
model.add(Dropout(0.2))#hidden layer 2
model.add(LSTM(units=60, activation='tanh'))
model.add(Dropout(0.2))#output
model.add(Dense(units=3,activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])print(model.summary())*
这是模型摘要的输出(见图 9)。
图 9:模型架构
培训 RNN/LSTM 模型
RNN/LSTM 模型总共被训练了 30 个时期,尽管我试图训练该模型 40 个时期,该模型被视为过度拟合。
*history = model.fit(x_train, y_train,batch_size=32, epochs=30)*
注:‘历史’变量用于记录模型在训练过程中的损耗、准确度等必要参数。
通过使用 keras.evaluate()函数获得准确度,并且获得接近 94%的总准确度(参见图 10)。
*model.evaluate(x_test, y_test, verbose=2)*
以下代码展示了如何绘制精度和损耗。
*plt.subplot(211)
plt.plot(history.history['accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['accuracy'], loc='upper left')*
这是模型精度的输出,与 79%的精度相比,获得了大约 94%的精度。我们已经看到了对以前方法的改进。
图 10:模型的准确性
我们获得的模型损耗为 0.12,比 CNN 方法好*。***
图 11:模型的总损失
这是混淆矩阵(见图 12 ),它更深入地展示了模型在分类中的实际表现。
***cnf_matrix = confusion_matrix(np.where(y_test != 0)[1], model.predict_classes(x_test))plt.figure(figsize=(7,7))plot_confusion_matrix(cnf_matrix, classes=np.unique(np.where(y_test != 0)[1]), title="Confusion matrix")plt.show()***
**** 注:函数-混淆 _ 矩阵()位于 sklearn 文档***
图 12 : 来自 sklearn 文档
结论
在这篇文章中,我们看到了一种替代方法,如何使用 RNN/LSTM 神经网络架构通过解决预测性维护问题*,并证明比之前的 CNN 方法更好。***
参考
- https://towards data science . com/playing-with-time-series-data-in-python-959 e 2485 BF F8
- https://towards data science . com/extreme-rare-event-class ification-using-auto encoders-in-keras-a565b 386 f 098
- https://towards data science . com/remaining-life-estimation-with-keras-2334514 f9c 61
涡轮风扇发动机的预测性维护
埃米尔·莫勒纳尔在 Unsplash 上拍摄的照片
探索美国宇航局的涡轮风扇数据集
探索性数据分析和基线线性回归模型
尽管 NASA 的涡扇发动机退化模拟数据集(CMAPSS)发布于十多年前,但至今仍很受欢迎且具有相关性。到目前为止,2020 年已经发表了 90 多篇新的研究论文[1]。这些论文提出并测试了预测涡扇发动机数据集剩余使用寿命(RUL)的新算法。
当我第一次开始学习预测性维护时,我偶然发现了一些使用涡扇发动机退化数据集的博客文章。每篇文章都包括探索性数据分析和预测 RUL 的简单模型,但我觉得缺少两样东西:
- 我从来没有完整地了解如何将不同的合适技术应用于同一问题
- 博客帖子只关注第一个数据集,让我猜测如何解决更复杂的挑战。
几年后,对我来说,这似乎是一个有趣的项目。在一系列的文章中,我计划展示和解释多种分析技术,同时为更复杂的数据集提供一个解决方案。
我已经创建了一个索引,在下面我会更新新帖子的链接:
1.FD001 —探索性数据分析和基线模型(本文)
2。FD001 — 更新了 RUL 的假设&支持向量回归
3。FD001 — 时间序列分析:分布滞后模型
4。FD001 — 预测性维护的生存分析
5。FD003 — 随机森林(我把顺序改了,看文章找原因)
6。Jupyter 笔记本
7 中 NNs 的可重现结果引物。FD002 — 滞后 MLP &基于条件的归一化
8。FD004 — LSTM &总结
涡扇发动机数据集有四个复杂性递增的数据集(见表 1)[2,3]。发动机开始时运转正常,但随着时间的推移出现了故障。对于训练集,引擎运行到故障,而在测试集中,时间序列在故障前“某个时间”结束。目标是预测每台涡扇发动机的剩余使用寿命(RUL)。
表一:涡轮风扇数据集概述
数据集包括多个涡扇发动机随时间的模拟,每行包含以下信息:
1。发动机单元号
2。时间,以周期为单位
3。三种操作设置
4。21 传感器读数
我发现这个数据集真正酷的地方是,你不能使用任何领域知识,因为你不知道传感器一直在测量什么。因此,结果纯粹是基于应用正确的技术。
在今天的帖子中,我们将重点探索第一个数据集(FD001 ),其中所有发动机都出现相同的故障,并且只有一种运行条件。此外,我们将创建一个基线线性回归模型,以便我们可以比较未来帖子的建模工作。
探索性数据分析
让我们从导入所需的库开始,读取数据并检查前几行。请注意,一些列的值似乎没有偏差或偏差很小。我们将在下面进一步探讨这些。
train.head()的结果
接下来,FD001 应该包含 100 台发动机的数据,让我们检查单元号以验证情况是否如此。我选择使用熊猫描述功能,这样我们也可以了解分布情况。当我们这样做的时候,让我们也检查一下时间周期,看看我们能了解到引擎在崩溃之前平均运行的周期数。
unit_nr 和 time_cycles 数据集描述统计
当我们检查 unit_nr 的描述性统计数据时,我们可以看到数据集总共有 20631 行,单元号从 1 开始,到 100 结束。有趣的是,平均值和分位数与 1-100 向量的描述性统计数据并不完全一致,这可以解释为每个单元具有不同的最大 time_cycles,因此行数也不同。当检查最大时间周期时,可以看到最早出现故障的发动机在 128 个周期后出现故障,而运行时间最长的发动机在 362 个周期后出现故障。发动机平均在 199 到 206 个周期之间发生故障,但是 46 个周期的标准偏差相当大。为了更好地理解,我们将在下面进一步想象。
数据集描述还表明涡轮风扇在单一工况下运行。让我们检查设置以进行验证。
发动机设置的描述性统计
观察设置 1 和 2 的标准差,它们并不完全稳定。然而,波动是如此之小,以至于无法识别其他操作条件。
最后,我们将检查传感器数据的描述性统计数据,寻找信号波动的指标(或不存在的指标)。
传感器信号的描述性统计。
通过查看标准偏差,很明显传感器 1、10、18 和 19 根本没有波动,这些传感器可以安全地丢弃,因为它们不包含有用的信息。检查分位数表明传感器 5、6 和 16 波动很小,需要进一步检查。传感器 9 和 14 的波动最大,但这并不意味着其他传感器不能保存有价值的信息。
计算 RUL
在我们开始绘制数据以继续 EDA 之前,我们将计算剩余使用寿命的目标变量(RUL)。目标变量有两个用途:
- 在绘制传感器信号时,它将作为我们的 X 轴,使我们能够轻松地解释发动机接近故障时传感器信号的变化。
- 它将作为我们的监督机器学习模型的目标变量。
没有关于训练集中引擎的 RUL 的进一步信息,我们将不得不提出我们自己的估计。我们将假设 RUL 随时间线性减小,并且在发动机的最后一个时间周期具有 0 值。这种假设意味着击穿前 10 个周期的 RUL 为 10,击穿前 50 个周期的为 50,等等。
数学上我们可以使用max_time_cycle — time_cycle
来计算我们想要的 RUL。因为我们想考虑每个引擎的max_time_cycle
,所以在计算max_time_cycle
之前,我们将按照unit_nr
对数据帧进行分组。然后将 max_time_cycle 合并回数据帧中,以便通过减去列max_time_cycle — time_cycle
来轻松计算 RUL。之后,我们删除max_time_cycle
,因为不再需要它,并检查前几行来验证我们的 RUL 计算。
测绘
为了更好地理解数据集,绘制总是一个好主意。让我们从绘制麦克斯·RUL 的直方图开始,来理解它的分布。
直方图再次证实,大多数发动机在 200 个周期左右就会发生故障。此外,分布是右偏的,很少有发动机能持续超过 300 次循环。
下面我将展示用于绘制每个传感器信号的代码。由于发动机数量众多,为每个传感器绘制每个发动机的图是不可行的。一幅图中有这么多线条,这些图表将不再能被理解。因此,我选择绘制每个 unit_nr 可被 10 整除且余数为 0 的引擎。我们恢复 X 轴,因此 RUL 沿轴减小,RUL 为零表示发动机故障。由于传感器数量众多,我将讨论几个代表整个系列的图表。请记住,根据我们的描述性统计,我们应该明确检查传感器 5、6 和 16 的图形。
S1 与衰落的 RUL 图
传感器 1、10、18 和 19 的图形看起来相似,平坦的线表示传感器没有有用的信息,这再次证实了我们从描述性统计得出的结论。传感器 5 和 16 也显示一条扁平线,这些可以添加到要排除的传感器列表中。
S2 与下降的 RUL 的曲线图
传感器 2 显示出上升趋势,对于传感器 3、4、8、11、13、15 和 17 可以看到类似的模式。
S6 对衰落的 RUL 的图表
传感器 6 的传感器读数有时会下降,但似乎与 RUL 下降没有明显关系。
七国集团对 RUL 的图表
传感器 7 显示下降趋势,这也可以在传感器 12、20 和 21 中看到。
S9 对 RUL 的图表
传感器 9 与传感器 14 具有相似的模式。
基于我们的探索性数据分析,我们可以确定传感器 1、5、6、10、16、18 和 19 不保存与 RUL 相关的信息,因为传感器值始终保持恒定。让我们从基线线性回归模型开始我们的模型开发。该模型将使用剩余的传感器作为预测器。
基线线性回归
首先,我们将定义一个小函数来评估我们的模型。我选择包括均方根误差(RMSE ),因为它将给出预测平均偏离多少时间周期的指示,并解释方差(或 R 得分)以指示我们使用的自变量可以解释我们的因变量的比例。
我们将删除不包含任何信息的unit_nr, time_cycle, settings and sensors
。定型集的 RUL 列存储在自己的变量中。对于我们的测试集,我们删除了相同的列。此外,我们只对测试集中每台发动机的最后一个时间周期感兴趣,因为我们只有这些记录的真实 RUL 值。
线性回归的设置非常简单。我们通过简单地调用方法并将其赋给“lm”变量来实例化模型。接下来,我们通过传递我们的“X_train”和“y_train”来拟合模型。最后,我们对训练集和测试集进行预测,以全面了解我们的模型如何根据提供给它的数据进行操作。
# returns
# train set RMSE:44.66819159545453, R2:0.5794486527796716
# test set RMSE:31.952633027741815, R2:0.40877368076574083
请注意,RMSE 在测试集上较低,这与直觉相反,因为通常模型在训练期间看到的数据上表现更好。
一种可能的解释是,训练集的计算 RUL 范围一直到 300 多。观察下图的趋势,线性计算的 RUL 的较高值似乎与传感器信号没有很好的关联。由于测试集的 RUL 预测更接近失败,并且较低的目标 RUL 和传感器信号之间的相关性更清楚,所以模型更容易对测试集做出准确的预测。训练和测试 RMSE 的巨大差异可以被看作是我们对 RUL 假设的一个缺陷,这也是我们将来要努力改进的地方。现在,我们已经完成了 EDA 和基线模型。
描述线性下降的 RUL 和 S12 的图表。该图旨在展示传感器信号和线性下降的 RUL 强相关的地方。
在今天的帖子中,我们探索了美国宇航局涡扇发动机退化模拟数据集的第一个数据集,并创建了一个测试 RMSE 为 31.95 的基线模型。我要感谢 Maikel Grobbe 和 Wisse Smit 对我的文章的评论。在下一篇文章中,我们将看看如何改进计算出的 RUL,使预测更加准确。此外,我们将开发一个支持向量回归来进一步提高性能。
如果你有任何问题或评论,请在下面的评论中留下。完整的笔记本你可以查看我的 github 页面这里。
参考文献:
[1]2020 年迄今发表在 NASA CMAPSS 数据上的论文: Google scholar search ,2020–08–08
访问[2] A. Saxena,K. Goebel,D. Simon 和 N. Eklund,“飞机发动机运行至故障模拟的损伤传播建模”,载于 2008 年 10 月丹佛市 Ist 国际预测与健康管理会议(PHM08)会议录。
【3】美国宇航局官方数据仓库
Oracle DBMS 20c 的预测性维护
物联网传感器可以提供关于系统健康状况的信息,但隐藏了与即将发生的故障相关的有价值的早期警告,而这些故障可以通过预测性维护来避免。一种在核电站和关键基础设施中使用了几十年的机器学习算法MSET-SPRT*,能够检测到这些被信号噪音隐藏的关键警告会用Oracle DBMS 20c发布。在本文中我将展示如何将应用到一个真实的测试用例中。*
根据麦肯锡的研究:“ 可视化 AI 和其他分析 的使用和潜在影响”,2018 年,人工智能和其他分析对所有行业关于异常检测问题的估计影响估计在 1.0 到 1.4 T 美元之间。
异常检测是关键的成功因素,例如,在预测性维护中,它试图预测何时需要维护,而不是传统的预防性方法,在传统的预防性方法中,活动是在定期安排的基础上计划的,或者在基于条件的维护活动中,甚至通过物联网传感器来监控资产。
预测性维护的问题可以用下图来解释:
赡养的金发女孩问题
应用基于机器学习的异常检测算法,可以执行预测,以估计系统或组件的状况及其剩余使用寿命 (RUL),尝试预测即将发生的故障。
最著名的算法之一是 MSET-SPRT ,在这篇博文中用一个用例进行了很好的描述:“ 机器学习用例:对工程系统的实时支持 ”。它最初于 20 世纪 90 年代在美国 DOE 的 Argonne 国家实验室开发,几十年来一直用于监控核电厂或空军,在这种情况下“故障不是一个选项”,它将被包含在 Oracle DB 的下一个版本 20c 中,作为由Kenny Gross@Oracle Labs改进的实现。
Oracle DB 20c 现在可以作为 Oracle 云基础设施上的预览版使用,并可用于测试其性能。
多变量状态估计技术 e — 序贯概率比检验(MSET-SPRT) 算法监控关键过程并检测细微异常。MSET 是一种非线性、非参数异常检测机器学习技术,它基于来自监控信号的正常操作序列的历史数据来校准系统的预期行为。它的工作方式如下图所示:
MSET-SPRT 算法
MSET 模型在来自 N 个传感器的一系列 M 个基于时间的观察值上被训练,并用于根据输入中的新值估计信号值。为了形成关于系统总体健康状况的假设,这些函数计算估计信号值和实际信号值之间的差(残差),并使用 SPRT 计算来确定是否有任何信号变得退化。对于输入中的正常信号,提供值为 1 的输出,对于检测到的异常,提供值为 0 的输出——为了描述评分,还提供了其他一些信息。假设被监控数据的特征不会随着时间而改变。
我们希望达到的目标是尽快检测到即将到来的故障,从信号中提取信息,以便在早期发出警报。
使用案例
为了试验这种异常检测算法,我选择了一个数据集,该数据集来自美国宇航局艾姆斯预测数据库 ,命名为“轴承数据集,由辛辛那提大学智能维护系统(IMS)中心提供。
它收集了一个机械测试工厂的数据,该工厂有 4 个轴承——我们称之为:B1、B2、B3、B4——安装在一个以 2000 RPM 旋转的轴上,电机连接到轴上,连续几天不间断地运行。每个轴承上安装了 2 个加速度计,因此我们有 8 个信号,每次以 20 KHz 采样 1 秒钟。每次采样有 20480 个点,每 10 分钟重复一次。有几组测试可用,但我使用了从 2003 年 10 月 22 日 12:06:24 到 2003 年 11 月 25 日 23:39:56 收集的数据(Set №1)。我们总共有超过 44 毫升的记录。
在该测试结束时,轴承 B3 和轴承 B4 都被损坏。
方法
为了创建一个能够尽快检测到即将到来的缺陷的模型,以便在正确的时间进行维护活动,我使用了一个 Oracle DB 20c 实例和一个配置为使用 PL/SQL 作为解释器的 Zeppelin 笔记本:关于如何重现该测试的所有信息都在本文的末尾。
关于 Oracle DB 上 PL/SQL 中的 Oracle 机器学习的大致了解,请参考我的帖子“ 自治数据库上的机器学习:一个实用的例子 ”。在这篇文章中,我谈到了自治数据库,但是从编程的角度来看,使用 Zeppelin 是同样的方法。
首先,我已经从 44 Ml 记录数据集中提取了第一个时间框架,我们可以使用它作为系统正常行为的示例,必须在其上训练 MSET(从 10 月 22 日到 11 月 1 日)。数据集的剩余部分已被用来评估算法训练的准确性。数据集准备的重要注意事项。传感器值记录的时间戳字段必须为日期或时间戳类型。在我们的例子中,我选择了允许存储几分之一秒的时间戳,如以下代码所示:
**CREATE** **TABLE** MSET_TRAINING_SH_DATA
( "TIME_ID" **TIMESTAMP** (6) **NOT** NULL **ENABLE**,
"B11" NUMBER,
"B12" NUMBER,
"B21" NUMBER,
"B22" NUMBER,
"B31" NUMBER,
"B32" NUMBER,
"B41" NUMBER,
"B42" NUMBER
);
为了直观显示 B3.1 传感器的正常状态与接近故障状态,我绘制了以下图表:
B3.1 与故障信号相比,传感器处于正常状态
为了获得更有价值的数据可视化,我计算了连接到轴承 B3 的传感器的均方根和 B4,即 20 KHz 下每个样本一秒钟的观察值。正如你所看到的,直到 11 月 24 日,当情况恶化时,没有证据表明 B3 会遭受损失。对于 B4,11 月 21 日有一些微小的波动
来自附在轴承上的 4 个加速器的 RMS 信号将被损坏
仅监控这些参数,您没有时间计划维护活动来替换轴承 3 和 4,并避免每次整个系统的故障。
作为训练样本,与训练集大小(10 Ml)相比,MSET-SPRT 需要更有限的记录数,因此我查询了第一个第二个采样:22–10–2003 12:06:25.005000,对应于 2010 年 10 月 22 日系统测试运行早期的 20480 条记录。
MSET-SPRT 实现需要几个参数,但我只设置了这些参数:
- MSET_MEMORY_VECTORS: 125
- MSET_ALPHA_PROB: 0.1
- 毫秒警报计数:5
- MSET _ ALERT _ windows:5
- 准备 _ 自动:开
必须理解的是,与在评分期间没有记忆的分类算法不同,在 MSET-SPRT 中,评分是在考虑一组按时间顺序的连续样本(MSET_ALERT_WINDOW)以及有多少样本(MSET_ALERT_COUNT)已经超过触发警报的阈值的情况下进行的。
对于调用 create_model() 函数,我们不需要设置目标,因为该算法是在正常条件观测值上训练的,但是我们需要指定时间戳字段。
BEGIN DBMS_DATA_MINING.DROP_MODEL('MSET_MODEL1'); **DBMS_DATA_MINING**.**create_model**(
model_name => 'MSET_MODEL1',
mining_function => 'CLASSIFICATION',
data_table_name => 'sample',
case_id_column_name => 'time_id',
target_column_name => '',
settings_table_name => 'MSET_SH_SETTINGS');END;
之后,我对由超过 33 Ml 记录组成的完整测试数据集运行了预测,以评估该模型在多少天后有助于预测即将到来的故障。
为此,我编写了一个存储过程 test_model(startDay,stopDay) :
%osql
CREATE OR REPLACE PROCEDURE test_model (startDay NUMBER,stopDay NUMBER) AS str1 varchar2(4000);
str2 varchar2(4000);
i varchar2(2);
ii varchar2(2);
BEGINstr1 := q'[
insert into pred_stat_temp
select dt,count(pred) as fail_num from (
SELECT to_char(time_id,'DD') as dt,b11,b31,
PREDICTION(mset_model1 using *) OVER (ORDER BY time_id) pred
FROM mset_test_sh_data where to_char(time_id,'DD')=']';
str2 := q'[') where pred=0 group by dt order by dt]';for i in startDay..stopDay loop
if i<10 then
ii:= '0'||to_char(i);
else
ii:= to_char(i);
end if;
execute immediate str1|| ii ||str2;
end loop;
END;
为了执行这样一个长时间运行的过程,我使用了 Oracle DB 作业,如下所示:
%osql
DECLARE
X NUMBER;
begin**dbms_job.submit**(
X,
'BEGIN test_model(1,25); END;',
SYSDATE
);
end;
并通过以下方式监控状态:
select job_name,job_action,start_date,end_date from USER_SCHEDULER_JOBS
这种方法允许我测试超参数的几种组合,以便在算法设置上找到最合适的组合。
下图是从 11 月 10 日开始每天发射的异常数量图。
故障前最后一段时间每天检测到的异常数量
在第 18 个上已经检测到 47 个异常(在 2.375.680 记录上),与第 19 个上的 282 (在 1.474.560 记录上)相比,归一化代表增长的 866 %,足以在故障前 5 天触发报警**。**
但是与同一天的正常信号范围相比,这个指标有用吗?为了有个概念,我计算了 11 月 18 日和 11 月 19 日 B3.1 信号的 RMS、Min、Max 和方差,后者是模型开始显著增加警报数量的时候。
如果我们比较这两天,没有任何指标比模型检测到的 866%的异常增长更好。
因此,您可以使用根据 19 日触发的异常数量调整的阈值来发出警报,以请求维护活动。
自己试试
如果您想自己测试算法和这个用例,您必须按如下方式设置环境:
- 在 OCI 上提供数据库云服务,获得一个试用账户。请注意,当您在数据库版本列表中提供 DBCS 的一个实例以具有选项 **20c(预览)**时,您必须选择存储管理软件作为:逻辑卷管理器:
要选择的存储类型,以选择版本 20c
- 按照这些指令安装 Zeppelin 环境并配置 Oracle DBMS 解释器;
- 从这里下载轴承数据集,使用脚本 pythonprepare . py创建训练和测试 CSV,通过 SQLDeveloper 等工具上传到 DB 上;
- 运行 Zeppelin 笔记本提供的。
引文
[1] J. Lee、H. Qiu、G. Yu、J. Lin 和 Rexnord Technical Services (2007 年)。辛辛那提大学。“轴承数据集”,美国宇航局艾姆斯预测数据库(http://ti.arc.nasa.gov/project/prognostic-data-repository),美国宇航局艾姆斯研究中心,加利福尼亚州莫菲特菲尔德
放弃
本文表达的观点是我个人的观点,不一定代表甲骨文的观点。
使用 ResNet 进行预测性维护
利用深度学习检测高频传感器的故障
在 Unsplash 上由 Lasse Nystedt 拍摄的照片
迟早,所有的机器都会出故障。确定设备状况或计划何时进行维护,是影响成本和生产率的极具战略性的决策。
机器学习方法已经作为一种有前途的工具出现在预测性维护应用中,以防止生产线中的故障。然而,这些解决方案的性能取决于适当的数据分析和正确分析方法的选择。
在这篇文章中,我们面临着一个类似于以前其他相关文章中的预测性维护任务: 使用 CNN 的预测性维护和 使用 CRNN 的预测性维护。这里的特殊性在于,我们只使用一个单高频信号源到产生我们最终的预测。基于 Mel 频率倒谱系数(MFCCs)的特定变换的应用是从信号中提取特征的基础。这一步使我们能够采用一个残差卷积神经网络结构,它学习我们数据的正确隐藏结构。
数据
我们的任务是研究压力条件下的液压管道。数据由 UCI 资料库收集。在液压系统状态监控中跟踪各种系统部件的活动状态。
该数据集是用液压试验台通过实验获得的。该试验台由通过油箱连接的一次工作回路和二次冷却过滤回路组成。当四个液压部件(冷却器、阀门、泵和蓄能器)的状态定量变化时,系统周期性地重复恒定负载循环(持续时间 60 秒)并测量过程值,如压力、体积流量和温度。
更准确地说,我们重点监控整个系统的状态(用稳定标志标识为稳定或不稳定)分析电机功率。该 KPI 由单个传感器监控,该传感器以 100 Hz 的采样率记录信号。
我们尝试分类的时间序列切片的形状与下图相似。
使用一阶差分对原始信号进行标准化,并对其进行限幅以限制疯狂值。标准化信号以这种方式用于产生 MFCCs。
MFCCs 通常按如下方式得出:
- 从原始信号的窗口摘录中进行傅立叶变换;
- 将上面获得的光谱功率映射到 mel 标度上;
- 对梅尔对数幂进行离散余弦变换;
- MFCCs 是最终频谱的幅度。
它们在音频分析中的应用很常见,但我们在这里利用它们处理高频数据的能力。
模型
如前所述,我们使用基于卷积的网络来预测液压管道的系统状态。我们使用剩余跳跃连接在卷积块中添加一些 bost。
更深的网络更难优化。向网络中添加额外的层会增加训练过程的难度。我们的优化算法变得更难最小化损失。剩余结构试图通过增加跳跃连接来解决这个问题。跳跃连接增加了从网络中的一个初始点到前向点的映射。如果网络没有更多可以学习的东西,则网络的权重保持不变,否则,如果记录了改进(在损失或度量优化中),则网络权重随之改变。
下面是一个残余块的例子,我们可以很容易地在我们的网络架构中使用。此外,根据问题需要,层的数量、激活函数或内核大小的不同变化是可能的。使用这种块时,唯一必须保持不变的是它内部的维度。在我们的例子中,我们注意在卷积运算中操作填充,并使初始维度等于最后的卷积层,以操作最终的连接。
def residual_block(init, hidden_dim):
init = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(init)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(init)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(x)
x = Conv1D(hidden_dim, 3,
activation=’relu’, padding=”same”)(x)
skip = Add()([x, init])
return skip
我们将我们的方法与虚拟基线进行比较,虚拟基线包括将我们的测试样本分类为测试数据中的大多数类别(稳定条件)。我们的网络在看不见的测试数据上达到了 87%的准确率。这是一个很好的结果,相对于我们的基线(66%的准确率)是一个很大的进步。
摘要
在本文中,我们执行了一项预测性维护任务。更详细地说,我们预测了仅考虑电机功率的液压试验台的一般情况。所考虑的信号具有高频率的特征,这使得不可避免地对我们的数据进行一些初步处理。我们通过基于 MFCC 的特征提取过程创造了有价值的信息。生成的新信号被用于输入基于剩余连接的深度学习模型,以产生最终预测。
如果你对题目感兴趣,我建议:
保持联系: Linkedin
预测建模者为初学者选择最佳回归模型指南
如何选择最适合的回归模型
在寻找预测的最佳拟合模型时,**找到正确的算法一直被证明是整个项目成败的关键。**对于像我和其他机器学习专家一样的机器学习新手来说,找到最适合的模型可能非常令人困惑,这通常不仅是因为低水平的编码能力,而且主要是因为对概念的理解和应用较差,并且容易陷入错误的度量标准。
在这篇文章中,我将通过的 3 个主要步骤来一步步介绍构建最佳拟合模型的概念和指南,以解决任何回归问题。假设您至少知道这些模型的概念,所以我将更多地关注它们的应用。我们将比较以下机器学习算法的性能:
线性回归
K-最近邻(KNN)回归变量
决策树回归器
随机森林回归器
Adaboost 回归器
XGBoost 回归器,和
支持向量机(SVM)回归器
指标:首先,让我们从指标开始,因为选择用来评估模型的指标非常重要。R 平方®、调整后的 R 平方(Adj R)、均方误差(MSE)和均方根误差(RMSE)是回归变量非常流行的度量标准。
r 回归得分或决定因素系数是一种直观的统计尺度,用于测量回归模型中由自变量解释的因变量的变化比例。无论输入要素如何,总是预测 y 的期望值的常数模型将获得 0 的 R 值,而完美拟合模型的 R 值为 1.0。对于表现任意差的模型,r 值可以是负的。通常,R 是模型的相对拟合的度量。然而,这一指标有一个值得注意的缺陷,因为 R 分数往往总是随着附加功能的增加而增加,而不一定会提高模型的拟合度。为了克服这个缺点,另一个度量标准,调整后的 R,被解释为由所有独立变量组成的模型所解释的总方差的比例,是优选的。调整后的 R 考虑了自由度。当向模型中添加更多的特征提高了模型的拟合度时,它会增加,否则会减少。
均方误差(MSE) 是回归线与一组点的接近程度的度量。它测量从点到回归线的距离,称为误差或残差方差,并对其求平方,以消除任何负号。均方根误差(RMSE) 取 MSE 的平方根,表示模型与数据的绝对拟合度——观察数据点与模型预测值的接近程度。RMSE 相对更容易解释,因为它与响应变量是同一个单位。较低的 RMSE 值意味着回归线接近数据点,表明拟合较好。RMSE 可以很好地衡量模型预测响应的准确程度,如果模型的主要目的是预测,则它是最重要的拟合标准。
建立了基本的概念之后,让我们开始动手实践吧。我选择了隐藏警告,以避免它们出现在输出中,使输出变得混乱。隐藏所有警告时要注意的是,您必须确保代码没有错误。
为了让代码看起来更专业,我发现在一个地方导入所有需要的库是一个不错的开始。
1.设置目录并导入相关库
导入数据,探索,预处理,为建模做准备。
2。探索和准备数据
浏览数据以了解其维度、数据类型、基本统计数据等。根据数据集的不同,可能需要处理分类变量和缺失值。在本例中,如上所示,没有空值,但是我必须对 cd、multi 和 ads 中的分类值进行编码。
另一件需要检查的重要事情是异常值。准备带有异常值的数据集进行建模的方式与准备不带异常值的数据集的方式不同,您将在后面的缩放中看到这一点。在这里,你可以看到上图中价格和高清的异常值。虽然价格异常值不是问题,因为它是目标特征,但在这种情况下,像 hd 、这样的预测值中异常值的存在会影响模型的性能。检测异常值并选择适当的缩放方法来最小化它们的影响最终会提高性能。你可以在我的 Github 库这里找到完整的代码和数据集。
因为我们在处理回归问题,所以了解预测值和目标变量之间的相关性是很重要的。这可以通过使用如下所示的关联热图和矩阵来实现。
从相关矩阵中,我们可以看到自变量与目标的相关程度不同。较低的相关性意味着弱的线性关系,但是可能存在强的非线性关系,因此,我们不能在这个水平上通过任何判断,让算法为我们工作。
谈到缩放,sklearn 中有各种各样的缩放器,包括 MinMaxScaler、StandardScaler、RobustScaler、minmax_scale、MaxAbsScaler、Normalizer、QuantileTransformer 和 PowerTransformer。我对比了一下本文常用的,找到最合适的。可以随意添加,也可以根据自己的要求选择。下面的程序在缩放和三个选择的类型之前可视化。
正如你从上面的第二张图中看到的,它重新缩放了范围[0,1]中的所有特征值。然而,它对异常值的存在非常敏感。
StandardScaler:此缩放器忽略平均值,并将数据缩放到单位方差。然而,异常值会影响均值和标准差。因此,像 MinMax scaler 这样的 StandardScaler 在存在异常值的情况下不能保证平衡的特征比例。
RobustScaler:与前两个不同,RobustScaler 基于百分位数,因此不容易受到离群值的影响。
PowerTransformer:对每个要素应用幂变换,使数据更像高斯分布。
MaxAbScaler:类似于 MinMaxScaler,但用于只有正值的数据,也存在大的异常值。
QuantileTransformer:匹配高斯分布而不是均匀分布,并为极值引入饱和伪影。
最终的选择取决于数据集的领域知识或试错法。从上图可以看出,只有 RobustScaler 返回了一个很好的分布,其异常值超出了分布的大部分,因此,它是实现最佳性能所需的显而易见的选择。
3.训练模型并进行预测
现在让我们分割数据集并导入适当的建模库。
在构建模型之前,我希望每个模型都发挥出最佳性能,因此为线性回归选择特征并调整 XGBoost、AdaBoost、决策树、随机森林、KNN 和 SVM 的超参数以找到模型中使用的最佳参数非常重要。
线性回归:当建立一个线性回归模型时,没有必要包含那些对目标变量的变化没有合理贡献的不必要的特征。使用向后排除法,您可以取消选择 p_values >为 0.05 的要素,这被解释为无法解释目标的变化,而非偶然变化。以下代码仅返回 p_values <为 0.05 的选定要素。
查看所选要素的 p 值:
调整超参数是优化超参数模型性能的一个关键方法,如下所示。
XGBoost: 这里要调优的常用超参数包括:学习率、最大深度和 n 估计量。
AdaBoost: 学习率和 n 估计量
决策树: max_depth
**随机森林:**最大深度和 n 估计量
KNN: 当我们的要素具有不同尺度的值时,将它们标准化到相同的范围非常重要,这样无论值的单位是什么,算法都不会对较大值、较高值进行加权,并将较小值视为较低值。这对于 KNN 等基于距离的算法至关重要。我们之前发现 RobustScaler 是最适合该数据集的缩放器,因此我们将在这里使用它进行缩放。
这里要调优的常见超参数是 n_neighbors 和 p。
SVM: 同样,规模化对 SVM 来说也很重要。这里要调整的超参数是 gamma、C 和 kernel。
选择了最佳特性并调整了超参数后,就该使用这些参数构建优化模型了。这可确保每个模型在数据集上发挥最佳性能。下面是我们发现的值的使用演示。
现在我们来预测一下
肮脏的工作做完了,现在让我们看看结果。
R 分数:
调整后的 R
RMSE 值:
正如预期的那样,调整后的 R 分数略低于每个模型的 R 分数,如果我们基于此指标进行评估,最佳拟合模型将是调整后 R 分数最高的 XGBoost,最差模型将是 R 分数最低的 AdaBoost。但是,请记住,这一指标只是对健康的相对测量,因此我们必须查看 RMSE 值。在这种情况下,XGBoost 和 AdaBoost 分别具有最低和最高的 RMSE 值,其余模型的顺序与其调整后的 R 值完全相同。这进一步证实了该数据集的最佳拟合模型是 XGBoost,最差拟合模型是 AdaBoost。注意,这并不总是发生,所以要小心。一般来说,当你有一个模型与最高调整的 R 和高 RMSE,你会更好地与一个有适度调整的 R 和低 RMSE,因为后者是绝对适合的措施。
查看预测价格与实际价格的曲线图,还可以看到 XGBoost 中的数据点彼此更接近,而 AdaBoost 中的数据点则相距更远。
感谢您的来访,我希望您喜欢这篇文章,并发现它很有帮助。你可以在 GitHub 这里找到完整的代码和数据集。
Linkedin 简介:https://www.linkedin.com/in/freemangoja
预测查询与监督 ML 模型
未来预测查询会取代有监督的机器学习模型吗?
超过 4 个数据集的精度基准。本文比较了预测查询和监督 ML 模型的工作流程、架构和缩放/准确性。图像源 Aito
当今科技领域最大的趋势之一是机器学习的民主化。因为商品最先进的模型,更好的工具和更好的硬件:机器学习正在成为公司工具箱中的日常工具。
ML 民主化仍然是一个持续的趋势,鉴于这一领域的混乱,值得问一问:这一转变将把我们带向何方?未来的日常管理会是什么样子?
预测查询是机器学习的一种有趣的方式,尤其是在 ML 民主化的背景下。像麻省理工学院的 BayesLite 和 Aito 这样的解决方案提供了一种使用类似 SQL 的查询立即获得任意预测的方法。例如,Aito 中有一个预测查询:
{
"from": "invoice_data",
"where": {
"Item_Description": "Packaging design",
"Vendor_Code": "VENDOR-1676"
},
"predict": "Product_Category"
}
因此:预测查询似乎是一种更容易、更快、完全不同的机器学习方式。它们让我们看到了未来,任何人都可以像查询数据库一样轻松地进行机器学习。
本文简要介绍了预测查询,并从三个不同方面对预测查询和监督学习进行了比较:
- 工作流,比较预测查询和监督机器学习之间的容易程度和成本
- 该架构比较了使用预测查询和使用监督模型之间的高级差异
- 质量是一项新兴的、有前途的技术的一个明显的关注点。
预测查询简介
预测查询类似于普通的数据库查询,除了它们提供关于未知的的预测,而传统的数据库查询提供关于已知的的事实。下面是一个针对 BayesLite 数据库的 BQL (贝叶斯查询语言)查询示例:
BayesLite 中的预测性 BayesQL 查询。BayesQL 基于 sQL,它提供了一种非常优雅的方式来查询任意估计值。该查询可以在创建群体、创建分析、初始化分析和分析操作之后执行。图片来源:Aito
本质上,预测查询可以为监督 ML 模型提供非常类似 SQL 的替代方案,主要区别在于:
- 虽然受监督的机器学习模型需要在使用前进行配置、训练和部署,但预测查询可以在数据库准备好数据后提供即时答案。因此:预测查询具有不同的工作流程。
- 虽然监督机器学习总是专门用于从 A 到 B 的单个预测,但是预测查询可以用于 A)基于任何已知的 Y 即时预测任何未知的 X,以及 B)还提供推荐、智能搜索和模式挖掘。因此,监督模型是狭窄的,而预测查询是多用途的,这对架构有影响。
- 当有监督的机器学习时,窄模型被显式地形成训练时间,预测查询在查询时间期间做多用途建模或窄建模。因此:预测查询在技术上更具挑战性。
只有很少的解决方案提供这种预测查询。一个是提到的 BayesLite,它在一个特殊的准备阶段创建了一个内存中的多用途模型。另一个解决方案是 Aito.ai,它在没有显式准备的情况下进行查询时窄建模。这是 Aito 工作流程的一个例子。
Aito 中 3 步预测查询。数据上传到数据库后,可以立即运行预测查询。对于像 Titanic 这样的小数据集,预测通常需要几毫秒(图中可见的 187 毫秒延迟是由网络 ping 爱尔兰引起的)。图片来源:Aito
我们将以下比较集中在 Aito 上。我们认为这种关注是合理的,因为在 Aito,我们更熟悉该解决方案,并且它足够成熟,可以在实际生产环境中为最终客户服务。虽然 BayesLite 非常令人印象深刻,他们的 BQL 界面和 DB/ML 集成值得羡慕:BayesLite 似乎有一些属性,如简单数据的 16 分钟准备阶段,这与提出的论点不一致。
因此,接下来让我们更深入地挖掘预测查询和监督 ML 模型之间在工作流、架构和质量方面的差异。
1.工作流程
预测查询和传统监督模型之间的第一个区别与工作流程和成本有关。
受监督的 ML 模型通常部署在数据科学项目中,这些项目有几个步骤,如移交给数据科学家、数据准备、特征工程、模型拟合、部署、集成、再培训以及监控和维护。作为这种线性进展的补充,您通常还会有一个迭代阶段,在此阶段,通过细化数据、准备、特性、模型、部署或集成来改进结果。
数据科学项目的简化版本。关于这些项目的更多信息可以在网上广泛获得。图片来源:Aito
一个人或两个人可能需要几个星期或几个月的时间将一个监督模型投入生产。这可以将每个型号的价格提高到 10 万欧元。如果你需要几个模型,你需要几个数据科学项目,导致成倍的费用和延迟。
现在,如果您使用预测查询来实现机器学习功能,这个过程会发生相当大的变化。对于预测查询,工作流本质上如下:
- 准备一次辅助预测数据库(如果它不用作主数据库)
- 用评估请求验证足够好预测质量
- 像集成 SQL 查询一样集成预测查询
- 编写测试/评估案例,将它们推给 Git,让 CI 处理回归测试
- 如果认为有必要:通过分析跟踪生产预测质量,并在产品仪表板中显示指标。
预测查询的工作流程类似于数据库查询的工作流程。然而,由于预测功能是统计性的,其行为可能会随着数据的变化而变化:建议在实施之前验证预测质量(步骤 2),并在生产中监控预测质量(步骤 5)。图片来源:Aito
虽然将辅助数据库(如 ElasticSearch)投入生产可能需要数周时间,但将每个查询投入生产的相关费用更接近于使用搜索/数据库查询的费用。这种查询通常只占相关功能费用的一小部分,而基于查询的功能通常可以在几小时内实现,几天内投入生产。
工作流程和费用之间的这种巨大差异可以解释为:a)预测数据库的 AutoML 功能被专用数据库加速;b)由于数据和 ML 已经集成到单个系统中,部署和集成的需求减少。数据科学项目的复杂阶段被系统地消除或简化:
- 不需要将数据科学项目移交给数据科学家,因为预测查询工作流对于软件开发人员来说已经足够简单。
- 数据准备和特征工程步骤可以通过 ML-数据库集成大大减少。如果数据已经在数据库中,您不需要重新准备和重新上传数据。如果您可以通过数据库引用进行推理,那么您不需要手动将数据聚合到平面数据框架中。您也不需要手动特征化文本,因为预测数据库会像 ElasticSearch 一样自动分析文本。最后:如果数据库有内置的特征学习能力,你就不需要管理特征冗余。
- 建模阶段可以通过一个复杂的模型实现自动化,这个模型可以为大多数应用程序提供足够好的结果。
- 对于每个模型云部署,模型的实时集成和重新训练完全消失了,因为您不需要“部署”或重新训练预测查询。相反,你可以像集成 ElasticSearch 一样集成一个辅助预测数据库。如果您使用预测数据库作为您的主数据库,您甚至可以省略那个集成。
- 维护更容易,因为您不用为每个预测目标维护已部署的基础设施,而是像使用 Git & CI 维护代码一样维护类似 SQL 的查询。
因此,通过预测查询实现 ML 的工作流程和成本与通过 SQL 实现普通业务逻辑的过程相似。
2.建筑
预测查询和监督模型之间的第二个区别是狭窄性及其对软件架构的影响。
众所周知:受监督的 ML 模型在两个不同方面狭窄:
- 预测设置的狭窄性。监督学习模型本质上是从 A(例如文本)到 B(类别)的狭窄函数,这意味着如果你有 10 个不同的问题,你最终会有 10 个不同的监督 ML 模型。
- 预测功能类型的狭窄性。一种监督方法通常只能用于一种预测。因此,你经常需要完全独立的系统或产品来实现预测、推荐、智能搜索和模式挖掘。
这种组合的狭窄对架构有负面影响。如果你有 10 种不同的预测功能,混合了预测、推荐和智能搜索用例:你最终会陷入一个非常复杂的系统。该系统可以包括具有半打部署模型的单独的监督模型平台、单独的推荐系统、单独的智能搜索产品和单独的模式挖掘工具。这种复杂性很难学习、掌握和维护。智能搜索和基于内容的推荐引擎经常复制数据库的大部分,这导致了冗余。系统也可能不能很好地相互集成,并且它们可能以不一致的状态结束,其中智能搜索可能返回旧的信息,并且推荐和预测可能忽略新产品和数据。
监督模型的狭窄性推动了额外的部署和集成,因为每个预测模型通常需要单独的服务器用于模型特定的 API 和数据集成。每个外部服务通常通过单独的集成服务器集成。这扩大了维护的基础设施和复杂性。图片来源:Aito
另一方面,可以认为预测查询本质上是多用途的,并且在两个方面都不狭窄。首先:预测查询没有固定的预测设置,它们不需要针对 10 个不同的问题进行 10 个单独的模型部署。10 个问题可能需要 10 个预测查询,这是一个明显的优势:虽然创建和维护 10 个不同的监督 ML 模型可能很难,但大多数软件工程项目在创建、理解和维护数十甚至数百个 SQL 查询方面并不费力。
第二,关于预测类型的狭窄性:对于预测数据库,多用途的性质自然地从这种系统中不可避免的设计选择中显现出来。在某种程度上,它的出现与传统数据库中出现多用途的原因是一样的:数据库无法预先知道查询,因此从设计上来说,它必须准备好服务于任何通用需求。这使得设计选择通常是通用的,而不是特定的。
作为一个不太明显但不可避免的设计选择:教科书中的贝叶斯/概率方法最适合快速统计计算,这使得预测数据库成为可能。这在 BayesLite 和 Bayesian Aito 中都很明显。与此同时,如此坚实的数学基础很容易进一步推广,以创建一个多用途的预测系统,这在这两个系统中都很明显。BayesLite 和 Aito 都提供广泛的智能功能组合。
预测数据库本质上是多用途的。Aito 查询 API 提供预测、推荐、匹配(例如从职位到候选人)和统计关系发现作为对基本查询和全文搜索(FTS) 功能的补充。推荐可以与全文搜索相结合,以提供个性化的搜索。预测、匹配和推荐查询也可以作为普通查询执行,其中结果按概率排序。图片来源:Aito
在 Aito 的例子中,贝叶斯数学被推广,不仅服务于预测,还服务于建议。因为搜索数学是基于贝叶斯二元独立模型和预测数据库需要索引所有文本以发挥作用:扩展贝叶斯 Aito 以服务于传统搜索,匹配和个性化搜索用例是很自然的。同样,使用教科书数学来使可解释的人工智能变得极其简单。向一个需要快速模式挖掘才能正常运行的系统添加模式挖掘支持几乎是不可避免的。另一方面:BayesLite 通过广泛的分析能力、SQLite 广泛的数据库功能和令人印象深刻的生成数据的能力补充了 Aito 的功能组合。
因此,类似地,对于已知数据,数据库是非常多用途和通用的,对于未知数据,预测数据库也是非常多用途和通用的。现在,如果您将传统数据库和预测数据库功能结合起来,您将创建更多用途的系统,可以灵活地服务于所有知识相关的需求,包括已知和未知的需求。
在预测方法中,1)客户端 API 集成、2)预测服务器和 3)每模型数据集成被 a)单个预测查询请求和 b)预测数据库的一次性集成所取代。该方法更符合行业最佳实践,如 DRY 、可重用性,避免了 NIH 和用代码替换基础设施。图片来源:Aito
对于单个应用程序的结果是:也许您只需要一个预测数据库来满足您的所有需求。你得到查询,自然语言搜索,预测,推荐,智能搜索等。从单一来源。不需要额外的服务器部署、定制模型或数据集成,因为一切都由单个数据库提供。冗余、一致性和互操作性问题也消失了,因为所有功能都基于相同的事务数据。
面向预测查询的架构也更符合行业最佳实践。用查询替换预测服务器有助于用查询/代码替换基础设施,如在无服务器计算和中将围绕数据(在数据库中)的关注点与查询/代码(在 Git 中)分开。用单个集成替换多个冗余数据集成符合 DRY 原则,并且该方法允许重用旧的数据集成。使用现成的解决方案通常比创建定制的解决方案更可取,以避免重新发明轮子和不是在这里发明的 反模式。总的来说,这种方法减少了需要维护的代码、基础设施和复杂性的数量,并且与良好的旧软件架构目标和原则相一致。
监督 ML 模型和预测查询之间的简化架构比较。图片来源:Aito
因此,面向预测查询/数据库的方法是对传统方法的彻底背离,对行业具有广泛的影响。就像一个思考游戏:如果您有一个可以回答已知和未知查询的数据库:为什么您要另外维护一个单独的普通数据库或者部署大量冗余的 ML 模型/系统?
3.质量
在人工智能的早期,你可以看到人们设想一个类似预测数据库的系统。一个愿景是 McCarthy 对的认识论部分的想法,它将以无缝的方式将机器学习、知识表示和推理结合起来。这个认识论部分本质上是一个世界模型,它可以用来查询已知和未知,就像预测数据库一样。尽管如此,这个愿景从未完全实现,原因很明显:创建一个基于查询的统计推理系统在算法和性能方面都极具挑战性。
最基本的问题是预测总是需要一个模型,但是如果你事先不知道预测的细节,你就有三个相当具有挑战性的选择:
- “世界模型”,您可以在其中创建一个通用模型,为任意查询提供服务。这里的问题是很难创建一个通用的 ML 模型来服务任意的预测,如果你不想降低写/准备的性能就更难了。
- “特别模型”,您可以当场为每个查询训练一个单独的监督模型。这里的挑战是,在不降低查询延迟和吞吐量的情况下,创建高质量的模型查询时间是非常困难的。
- 第三个也是直觉上最合理的选择是将这两种方法结合起来,因为这不仅可以提供最佳的结果,还可以提供最佳的写入和查询速度。从负面来看,它还结合了前两种方法的挑战。
BayesLite 是“世界模式”方法的一个很好的例子。它在额外的“创建群体”、“创建分析”和“分析”步骤中创建了一个内存通用模型。虽然这种方法很优雅,但是即使数据集有限,建模步骤也可能需要 10 分钟以上,这很好地说明了写入/准备时间方面的牺牲。不过,通过使用更专业的数据库(BayesLite 基于 SQLite)和不同的算法(查询时间表示学习可以像在 Aito 中一样加速到毫秒级,这意味着快速的写时准备也应该是可能的),准备速度可能会大大提高。
另一方面,Aito 使用“特定模型”方法,在这种方法中,性能损失发生在查询时。接下来,我将重点介绍我们如何利用这种方法解决一些固有的性能挑战。
Aito 的统计推理管道。Aito 为每个预测查询执行特征选择、特征学习和贝叶斯推理步骤。一种基于 MDL 的表示学习技术创造了“概念学习”用于特征学习,它为贝叶斯推理提供了独立的高级特征。图片来源:Aito。
实质上,为特定查询创建“特定模型”通常需要:1)针对数百个查询特定特征的温暖且快速的数据结构;2)几千个相关统计测量;以及 3)每个感兴趣特征/检查的几千个相关样本。为了满足毫秒级的这些需求,Aito 1)为每个可能的特性快速准备了数据结构,2)使用专门的索引来计算微秒级的完整数据库统计数据,3)使用专门的数据结构来实现亚毫秒级的数据采样。
因此:预测性查询通常可以在毫秒级提供服务,如图 1 所示。您可以在本笔记本中找到关于基准的更多信息。
**图一。**根据 7 个平均词或 31 个平均词(在高端笔记本电脑上测量)预测二进制值或预测 128 个备选项的分类值时的 Aito 性能。根据查询的规模,可用于推理的文本特征的数量在 10k 和 1.5M 之间。注意对数刻度。 Benchmark 的 Jupyter 笔记本和更多信息可从 这里获得。图片来源:Aito
虽然大多数预测可以以较低的延迟提供服务:因为 Aito 当前使用完整的数据库统计信息,所以 Aito 的伸缩有一个 O(N)组件。这意味着一旦你开始接近百万个数据点:性能就会下降。此外,查询中已知功能的数量和预测类别中备选功能的数量会影响性能,如图所示。
目前,这些性能特征对 Aito 的可能用途造成了一定的限制,因为大数据集和复杂推理可能会影响延迟和吞吐量。然而,值得注意的是,受监督的机器学习性能和资源需求也经常在百万样本规模或例如基准 SVM 实现的 10k 样本规模中开始下降。Aito 查询性能对于数据集有限、延迟和吞吐量要求不严格的应用程序来说也是绰绰有余,例如公司内部工具、PoCs/MVP、后台流程、智能流程自动化和 RPA 。
虽然性能质量对于许多用途来说已经足够好了,但我们确实希望它在未来会更好。对更加专门化的数据库结构的早期实验表明,写速度和采样速度仍然可以提高 10-50 倍。这可以让预测数据库具有 a)与搜索数据库相当(或更好)的写性能,b)更好的缩放,因为基于采样的推理缩放更像 O(1)而不是 O(N ),以及 c)大大提高的预测速度。在未来,通过进行写入时间特征/表示学习来集成“世界模型”方法可以使预测速度更接近我们在传统监督学习中看到的速度,但写入性能会有所下降。
最后,但同样重要的是:让我们考虑预测质量。在基准测试中,我们将 Aito 与 7 ML 模型进行了比较,包括 4 个不同分类数据集上的随机森林和离散数据(Aito 不做回归)。
图二。 Aito 基准测试超过 4 个数据集和 8 种算法( RF 、 CART 、 AITO 、 LDA 、 LR 、 KNN 、 NB 、 SVM )。你可以在这里找到基准代码。图片来源:Aito
正如我们在基准测试中看到的那样,尽管训练预测模型的预算是毫秒级的,但临时模型方法产生了非常好的预测质量。
创建一个毫秒级的好的即席模型是可行的,因为创建一个特定的模型来为特定的预测服务比创建一个通用的模型来为通用的预测服务要快得多。如前所述,训练阶段不需要考虑每百万个特征和每百万个可用样本,而只需要考虑与查询相关的几百个特征和几千个样本。降低的复杂性和专用的数据库使得能够立即服务于适度复杂的特定于查询的模型。
临时模型也可能出奇地好,因为该模型针对单个预测进行了微调。当预测必须基于稀有特征时,传统的监督模型可能丢弃稀有特征并忽略数据中的稀有模式以限制模型的复杂性,这成为一个问题。有了预测查询,问题就简单地消失了,因为查询时间训练允许选择最适合每个单独查询的特征和模型细节。
同样值得注意的是,数据库包含大量的元数据。公司 ID 可以指整个公司表,其元数据可以通过贝叶斯先验用于预测。还有一些数据库友好的机制,如类推(已经在 Aito 中实现了),它可以假设像('消息有 Bob ','接收者是 Bob ')和('消息有 John ','接收者是 John ')这样的关系具有共享的结构('消息有 X ','接收者是 X ')和共享的统计行为。这种技术可以通过利用传统方法无法获得的数据和模式来改进预测。
这都提出了一个问题:通过各种技术,预测查询不仅可以达到奇偶性,而且在许多实际应用中可以达到比最佳监督 ML 模型更好的性能吗?
结论
因此,预测查询可以通过以下方式颠覆机器学习领域…
- …用类似于数据库查询相关工作流的更快的工作流取代昂贵的监督式 ML 工作流…
- …用一个多用途系统和类似 SQL 的查询取代狭窄的监督模型和产品的复杂性…
- …同时保持与监督学习相比具有竞争力的性能和预测质量。
作为这 3 个因素的结果:可以想象,在未来的现实世界应用中,预测查询将取代大多数监督 ML 模型。这是一个简单的思维体验所暗示的:如果你可以从数据库中即时获得预测:你为什么要花数周时间生产和集成冗余的监督模型?
此外,可以想象,预测查询/数据库将成为机器学习民主化的主要驱动力。就像思想实验一样:如果做 ML 就像数据库查询,那么为什么没有开发人员能做 ML 呢?还有:如果基于 ML 的功能成本变得类似于基于数据库的功能成本,为什么 ML 不能像数据库一样用于每个公司、每个项目和每个功能中?
预测性与适应性 SDLC:区别是什么?
想知道您的下一个项目是使用预测软件开发生命周期(SDLC)还是自适应 SDLC?
在 Unsplash 上由 Austin Distel 拍摄的照片
各个组织各不相同。项目和商业策略互不相同。确保您的开发方法与您的组织和项目相匹配。许多项目经理正在从传统的预测性软件开发生命周期 (SDLC)方法转向适应性 SDLC 方法。
你应该吗?
要确定这一点,您应该对预测性和适应性 SDLC 方法有一个清晰的理解,并确定最适合您的组织和项目的方法。
预测软件开发生命周期:概述
顾名思义,预测性 SDLC 假设您可以预测完整的工作流。它包括充分理解最终产品并确定交付过程。在这种形式的项目生命周期中,您在项目的早期阶段确定成本、范围和时间表。
瀑布模型是最常见的预测模型之一。它假设 SDLC 中的各个阶段可以顺序发生,这意味着一个阶段会进入下一个阶段。简而言之,在瀑布模型中,所有的阶段一次发生一个,并且彼此不重叠。
虽然瀑布模型非常简单,易于使用和理解,但它也有一些缺点,可能会对您的项目产生重大影响。
由于瀑布模型遵循顺序方法,一旦应用程序处于测试阶段,就很难在开发阶段返回并调试它。
预测性 SDLC 的优势
- 这很容易理解和遵循,因为每个阶段都是在另一个阶段完成后开始的。
- 详细的说明和简洁的工作流程使开发人员更容易在指定的预算和时间范围内工作。
- 它使组织能够承担预期的项目预算和时间表(如果一切按计划进行)。
- 预测性 SDLC 中的每个阶段都有具体的时间表和可交付成果,这使得团队更容易操作和监控整个项目。
预测性 SDLC 的缺点
- 在预测性 SDLC 中,工作软件是在较晚的阶段生成的,这导致了对应用程序中的错误和漏洞的延迟识别。
- 如果在项目的测试阶段发现了 bug,组织通常不得不承担延迟应用程序的额外成本。
- 对于复杂的项目,它不是理想的 SDLC 模型。
- 预测性 SDLC 不适合需要灵活需求或最终产品不确定性的动态项目。
预测性 SDLC 方法的主要关注点是开发和维护最终产品的规格。这使得它成为项目的理想选择,在这些项目中,所有的需求都被定义,并且对最终产品有一个清晰的愿景。
在预测性 SDLC 中,由于工作已经是预测性的和众所周知的,因此预期的变化很小。团队对项目的发展方向以及如何遵循顺序有一个清晰的想法。
另一方面,预测方法可能非常严格,要求开发人员在整个生命周期中保持严格的标准。由于工作的顺序已经预先确定,任何随后的改变都可能非常昂贵和耗时。
适应性软件开发生命周期:综述
适应性 SDLC 方法混合了增量开发和迭代开发。它包括逐步增加功能,并根据反馈进行修改和完善。换句话说,工作可以很容易地根据从客户那里收到的新反馈来适应变化的需求。
敏捷和其他迭代方法属于自适应 SDLC 的范畴。自适应 SDLC 方法的一个关键要素是,虽然它定义了 SDLC 中的某些里程碑,但它也允许实现它们的灵活性。
适应性 SDLC,例如敏捷,关注于通过快速适应动态业务需求来实现期望的最终目标。它更加关注当前的需求,并为项目的未来范围留有余地。
自适应 SDLC 的优势
- 自适应 SDLC 需要迭代的、进化的和增量的方法,这些方法提供了灵活的指导方针和简单的工作流程。
- 像敏捷这样的方法在本质上是高效的,并且增强了团队协作。
- 短的反馈循环导致快速适应变化的需求。
- 在部署阶段减少潜在的漏洞和错误,因为应用程序在开发阶段经常被测试。
- 它专注于交付高质量的应用程序,同时保持技术优势。
- 鼓励不同的团队在一个项目上合作,增加面对面的互动,营造更好的工作环境。
自适应 SDLC 的缺点
- 它要求客户/用户在整个 SDLC 中广泛参与。
- 在使用自适应 SDLCs 时,不同的团队必须不断地一起工作,这涉及到大量的交互。团队之间的持续沟通可能非常耗时,并且需要更多的承诺。
- 由于自适应 SDLC 需要组织和他们的客户之间的紧密合作,任何一方缺乏承诺都会影响软件质量。
- 经常性的变更正好在开发的时候被采用,这可能导致不太详细的文档。
自适应 SDLC 方法最适合于范围有可能发生重大变化的项目,或者不确定什么是期望的项目。您可能需要适应客户对这些项目不断变化的需求。
自适应 SDLC 方法通常比预测 SDLC 方法更快。这主要是因为很少有项目被充分理解并真正使用预测性 SDLC 方法。当需求没有被充分理解时,问题会在生命周期的后期被发现,这会导致昂贵的返工。
哪个更好?
由于每种方法对于特定类型的项目都有其用途,因此没有明确的决定哪种方法更好。选择很大程度上取决于项目类型、您的策略和组织需求。
如果您仔细分析预测性 SDLC 和适应性 SDLC,并权衡每个项目的利弊,而不是依赖所有项目的统一方法,这是最好的。
在以下情况下,预测性 SDLC 方法可能是更好的选择:
- 你正在做一个团队已经熟悉的项目。团队将会更有生产力,因为他们已经确切地知道项目的期望和他们应该做什么。
- 项目参数发生变化的可能性很小。这是至关重要的,因为在项目结束时,任何后续的变更都将是非常复杂的,并且在预测方法中实现起来非常昂贵。
- 对于最终的可交付产品应该是什么,有非常好的定义和理解的需求。
- 你有一个完整的项目开发过程文档。
- 你喜欢可预测性,喜欢事先对可能/预期的变化有一个清晰的想法。
- 项目经理对其他方法不太有经验。在这种情况下,如果他们在一个他们有大量经验的熟悉的方法中工作,事情会进行得更顺利。
在以下情况下,自适应 SDLC 方法可能是更好的选择:
- 您正在进行一个参数不断变化或尚未确定的项目。自适应方法为您提供了根据新的或更新的参数进行调整的空间。
- 对最终产品的结果没有严格的预期。换句话说,只有当项目具有创新性和/或探索性时,您才应该使用适应性方法。
- 你的工作时间表很灵活。
- 你在一个快速发展的行业工作。
- 项目经理对适应性 SDLC 方法很有经验。
结果
正如您所看到的,预测性和适应性 SDLC 方法都有独特的优势,因此在您的所有项目中只使用其中之一将是一个巨大的错误。仔细评估每个项目的需求和规格,看看你应该采取哪种方法。
关于预测型与自适应型 SDLC,您有任何疑问吗?请在评论中告诉我们。
预测分析与解释分析
蝴蝶效应和如何成为百万富翁
您是否注意到如今“分析”一词经常与“预测”一词联系在一起?“预测分析”已经成为 IT 界的热门词汇。
事实上,“预测”这个词似乎比“解释”更有吸引力,因为对我们这些懒惰的人来说,我们认为工作会更少。“解释性的”或“解释性的”(不是“不言自明的”)意味着你仍然需要理解,而“预测性的”意味着你只是知道会发生什么。人类总是着迷于预测未来的概念,就像童话中的水晶球一样。
诚然,预测可能会告诉你将会发生什么,但不知道为什么会发生。在某些情况下,你可能还是要理解这一点。
由 Ayanna Johnson 在 Unsplash 上拍摄的照片
只有当一个人不能轻易做出预测,或者当结果不能轻易改变时,预测才有用。
一个很好的例子就是天气,你自己无法预测,也无法改变。对于预测性人工智能(AI)来说也是一样,它通常会被设计成告诉你将会-可能-发生什么,但不会告诉你为什么会发生。这就是“黑箱”效应或“可解释性问题”。
那么,你什么时候还需要这种预测人工智能呢?其实只有两种情况:
- 当人工智能在预测方面比你更好——或更快——时,这并不容易,因为人类一直在做这种事,而且是惊人的预测机器。请记住,你可以在一眨眼的时间内,通过闻到附近的空气,以惊人的准确度预测出某种食物会让你生病(但你也缺乏内置的大气压力传感器,无法准确预测天气)。
- 当你无法改变结果时,因而你无论如何也不需要理解。你可能需要知道是否会下雨,但你不需要了解天气是如何工作的,除非你非常好奇,或者你想成为一名气象学家。
如果你能理解和改变结果,你应该关联和理解,而不是预测。
我们来问这个问题:你会成为百万富翁吗?你是希望得到一个预测,一个简单的“是”、“否”,甚至是基于历史数据的“何时”,还是希望得到一个详细的解释,说明你所做的事情有什么帮助,什么没有帮助?
这就是蝴蝶效应的切入点。作为一个人,你无时无刻不在做决定,其中很多决定将会对你的未来产生影响。有些决定可能看起来无关紧要,但仍然会产生巨大的影响,例如,你是否会遇到你一生的挚爱。
因此,假设你是一个聪明的人,一个努力工作的人,你有一个关于你应该做什么才能成功的好主意,然后你得到一个预测(例如,从一个水晶球),你肯定会在大约三年内成为一个百万富翁。然后,你开始变懒,并决定你更喜欢诗歌而不是大数据,因为你将成为百万富翁,你认为这没问题。
嗯,那个关于你会成为百万富翁的预言现在已经应验了。因为这是现实世界,不是童话,你的诗也没那么好。
如果你稍微想一想,你会发现你最好了解如何成为百万富翁,而不是仅仅得到一个你是否会成功的预测。因为你所做的所有决定都会对结果产生影响,因此你在得到预测后所做的任何事情都会使预测出错,比如,决定成为一个懒惰的诗人。你需要理解“如何”和“为什么”。
让我们再举一个例子,这次你是公元 136 年左右的一个暴躁的 60 岁的罗马皇帝。你已经病得很重了,经常流鼻血和水肿,预言(古罗马没有水晶球)说你会在 62 岁时死于心脏病发作。在这种情况下,在这些时候,清楚地了解人们为什么会心脏病发作,从而有助于防止他们,可能会比预言家的预测容易得多。顺便说一下,这是一个有趣的故事(除了占卜者,那是我),尝试谷歌一下。
现在,当你从一家公司的角度看问题时:首席执行官更喜欢对下一年财务收入的预测,还是清楚地了解过去几年导致收入增加或减少的原因?
公司可以获得大量数据(内生的或外生的),这些数据可以与收入的增加或减少相关联。一旦你明白了这些相关性,你就可以开始寻找因果联系和根本原因,然后进行改进。那么在预测收益之前,我们是不是应该先试着了解如何增加收益呢?
数据是我们信息系统内部真实世界的“反映”,但是它可能有很多,而且不是不言自明的。
财务收入或任何其他与其直接相关的指标通常是一个结果(抱歉),会受到公司每个人(从一线员工到首席执行官)做出的运营或战略决策的影响。
因此,在我们将所有资金和精力投入预测分析之前,我们应该利用先进的分析技术和技能来帮助我们发现模式、相关性和因果联系,以便更快、更好地理解为什么我们会得到这种特定的结果,以及我们如何采取行动来改变它,使之对我们有利。如果数据可用,人工智能、现代分析和数据科学可以通过帮助解释事物的“为什么”、为什么有些事情可行以及为什么其他事情不可行来提供巨大的商业价值。我说的是 人工智能,旨在解释或帮助解释事物,而不是“可解释的预测性人工智能”,它会做出预测,并解释如何或为什么。
我们举个实际的例子:销售。销售转化为作为“对象”的数据,这个“数据对象”(可能是数据库中的一行或一组行)具有属性(可能是数据库中的列),例如:
- 国家
- 城市
- 积范畴
- 产品
- 量
- 客户类别
- 日期
- 等等。
销售的所有这些业务“属性”通常都可以在信息系统的数据中获得,可能有数百万行销售数据。
你可以开始手动分析,使用传统的商业智能工具(或 Excel…),你可能会发现在美国的销售情况很好,而在日本却很差。但这并不能告诉你太多。所以,你继续分析,你可能会发现在日本某个产品类别的销售非常糟糕。您继续分析,您可能会发现特定产品类别中的一些产品表现不如其他产品,其中一些产品总体表现不佳,而在一些客户类别中表现良好,在其他一些客户类别中表现不佳。这个过程会一直持续下去,直到你有一个完整的“场景”来调查,然后你会开始寻找要解决的根本原因。
现在想象一下,你给我原始数据,我给你最有影响的属性列表+最糟糕的场景列表(属性的组合),以及它们相对于结果的“权重”(糟糕的销售)。
其中一个场景可能是这样的:
【国家 02】;[产品类别 A];【产品 A08】;[客户类别 X];【2019 年】;[Q1 时期];【等。] = 5%的不良销售
现在,您可以开始分析不是一次一个属性,而是完整的场景,并清楚地知道从哪里开始。你马上就会知道,在某个特定时期,该产品在某个特定城市的客户类别中销售不佳,这占了“不良销售”的 5%。因此,您可以从现在开始,调查根本原因,进行补救和改进。
您有一个可以研究的场景的完整列表,它们都是相关的,值得研究,因为它们是由算法基于特定标准(通过属性影响和场景相对于结果的权重)选择的。它可以是一个列表,或者看起来像这样,不好的场景用橙色表示,好的用蓝色表示:
有了这种可视化,您可以立即看到日本销售存在问题,并且可以深入每个分支机构,通过分析详细的场景来了解原因。
现在,您可以要求数据和分析团队设计一个算法来预测明年的销售额。这种算法可能会告诉你,日本的销售仍然会很糟糕,这不会帮助你理解为什么以及如何补救。
我们现在需要对每个关键绩效指标进行解释性分析。
我并不是说预测分析毫无用处,但对于许多公司来说,这种“解释性”或“解释性”分析比预测分析要多得多。这里没有深度学习或超级复杂的东西,只有统计数据,没有那么简单,但也不是科幻小说。
我们监控许多指标,对于这些指标,清楚地了解什么导致好的或坏的结果将比简单地预测结果带来更多的商业价值。因为当你清楚地了解不同的变量及其对结果的影响时,你就可以对这些变量采取行动,以优化和改善结果。
总之,在投资新的预测算法之前,先问这两个问题:
- 如果你有时间,你能自己做这个预测吗?
- 你能采取纠正措施使预测出错吗?
如果两个答案都是“是”,那么重新考虑,把注意力放在理解而不是预测上。这样你不仅能适应,还能提高。
通常,如果你曾经因为一种预测算法而感到沮丧,这种算法无助于解释为什么一个特定的结果被预测,那可能是因为你需要理解,而不是预测。
感谢您的阅读,请让我知道您的想法,并毫不犹豫地分享。
数据科学面试准备指南
为合适的工作从合适的资源中获得合适的技能
这是前所未有的时代,我们中的许多人都在寻找转换或找到工作。面试准备成了焦点。面试对每个人来说都很重要。
不确定性、随机性和人为错误让面试变得非常可怕。肾上腺素在你的血管里涌动,你正处于把一切都搞砸的边缘。
做好准备是在面试中减少损失的唯一办法。正如本杰明·富兰克林所说:
没有做好准备,你就是在为失败做准备。
我上周的一篇帖子是关于建立有效的数据科学投资组合的,在那里我分享了一个全面可行的建立投资组合的指南。
一个好的投资组合在大多数时候会帮助你接到第一个电话,如果你真的了解自己的事情,你差不多有 90%的把握。剩下的 10%是由本文第一行提到的三种特质所占。
因此,这篇文章旨在为您提供可行的技巧和资源,为您的下一次数据科学面试做好准备。
为自己确定合适的角色!
数据科学也是一个非常多样化的领域。在你开始建立投资组合之前,你需要做的第一件事就是确定哪一部分技能与你的专长/兴趣相匹配。
为了帮助您,这里列出了当今数据科学中四种常见的角色类型,
- 数据分析师— 在这四种角色中,大多数人都是数据分析师。常见任务包括从 SQL/NoSQL 数据库和其他存储库中提取数据,执行探索性数据分析,分析 A/B 测试结果,处理谷歌分析,或掌握工具 Excel、Tableau。
研究一份好的分析师职位描述会告诉你需要掌握和准备什么,这里有一个例子:
2。数据工程师— 这些人专门为经历大量流量的数据驱动型公司设计和开发数据基础设施。常见任务本质上是核心技术,如设计数据模型、管理 SQL 和 NoSQL 数据库、使用 Hadoop、Spark、Airflow 等构建数据处理系统。
3。ML/AI 工程师— 像这样的职位更加注重研究,需要你了解机器/深度学习算法的来龙去脉。常见的任务包括设计、开发、部署 ML 模型/基础设施,构建支持大型应用程序的库和框架。
**4。数据科学家(全栈)——**没有“全栈数据科学家”的头衔,但每家数据支持公司(尤其是初创公司和中型公司)都梦想拥有他们。他们几乎涵盖了上述角色中提到的所有技能,并在解决复杂的技术和算法问题方面拥有丰富的经验。一个不断学习和使用机器/深度学习的数据分析师会在 3-4 年内称自己为数据科学家。
**注:**了解公司的需求因为有时候光有技能是不够的,还有几个因素,比如某个特定部门的特定需求、领域专长、解决某类特定问题的经验等等。
面试准备课程
一旦你发现哪个角色适合你的兴趣,接下来的工作就是做一个作品集,如果你已经准备好了,你就应该开始准备面试了。
我将课程分为两类:
- 一般话题(技能)——每个有志之士都应该努力掌握和练习这些技能的资源。
- 特定角色主题 —针对上述特定角色的强制性主题以及掌握这些主题的资源。
一般主题
你必须具备的四项主要技能如下:
1.编程;编排
每个职位描述都在他们的资格标准中提到良好的编程技能,因为没有一个数据科学工作是完整的,除非你能够操作数据。几乎每个技术面试都是从一个需要解决的编程问题开始的。
你可以选择任何你觉得舒服的编程语言。在数据科学中两种广泛使用的语言是 Python 和 R 。我推荐你学习 Python,因为它的多功能性。
练习编程的资源:
- **leet code—**掌握编程技巧的最佳去处。庞大的社区,每个话题都有好的问题,大公司面试时常见的问题。
- Hackerrank、code forces、** 编码忍者 也是你可以一头扎进去的顶级平台之一。**
- 如果你是一个完全的初学者并且想学习 Python,从这里开始https://www.learnpython.org/。
- 你也可以使用我的 YouTube 播放列表上的编程基础或者我的博客上的数据科学 Python 基础开始学习 Python(针对初学者)。
数据科学入门基础 python 编程精要。
towardsdatascience.com](/python-fundamentals-for-data-science-6c7f9901e1c8)
2.概率与统计
统计学在数据科学家的职业生涯中起着至关重要的作用。没有多少数据科学家和分析师接受过正式的统计培训,你应该从数据科学的角度切入主题。为探索性分析、抽样、实验设计等奠定基础。即使你正在使用 Excel 或 Tableau,理解基础统计学也是非常重要的。
资源刷量统计:
- 实用统计学书籍**——**这将从数据科学的角度教你统计学。你应该至少读这本书的前三章。
- 统计与概率|可汗学院**——**本课程将为你在面试中所有统计与概率相关的问题做好充分的准备。一个免费的课程,有很好的视频讲座和练习题的汇编。
- 赤裸裸的统计— 对于惧怕数学、更喜欢理解实际例子的人来说,这是一本令人惊叹的书,解释了统计学如何在现实生活场景中应用。
3。使用 SQL/NoSQL/熊猫的数据争论
从关系或非关系数据库中提取数据是每个分析师都需要知道的事情。一些分析师的工作描述明确要求编写复杂的 SQL 查询来收集数据的专业知识。
然后,一个人应该精通 Python 包,如 pandas、NumPy、scipy、statsmodel,以便能够处理数据集。
使用 Python 提高数据分析技能的资源:
- Kaggle Learn — 你应该看看 Kaggle 的系列课程,这里涵盖了 SQL、熊猫、数据可视化等等。
- **Data camp Data Analyst Python Track—**该课程还将帮助您快速掌握作为分析师所需的技能,尤其是在数据操作和可视化方面。他们针对上述每一种工具提供交互式动手练习。
- 使用 Python 进行数据分析 — 本课程涵盖了数据分析师的所有重要技能。
- 练习题— 一旦你有了很好的理解,通读几个博客和职业网站上的例题比如跳板。(如果你想让我准备一份问题清单,请回复这个帖子)
4。机器学习算法
一些初级角色可能不需要这样做,但如果你能展示你对开发 ML 模型的理解,这将是一个很好的例子。我建议每个人都熟悉基础知识,包括 ML 问题的类型,线性回归,决策树,逻辑回归,以及如何使用数据训练和测试它们。
学习和实践机器学习的资源
对于初学者来说,这将是理解机器学习的圣经。这是任何想尝试 ML 的人的必读之作。这本书涵盖了所有的基本算法以及数学解释和实践问题。
这本书的第二部分深入研究了深度学习,这是 ML/AI 工程师应该彻底了解的东西。
这本书会让你跟上机器学习的速度。安德烈写得很好的一本书,他试图将基本算法、构建模块和问题浓缩到这本书里。
谈到机器学习,没有 Andrew NG 关于 ML 的课程,推荐是不完整的。理解 ML 和统计模式识别的必看。它涵盖了监督/非监督学习以及最佳实践。它还涵盖了许多应用 ML 解决现实世界问题的案例研究和应用。**
角色特定主题
除了预演你的项目陈述,你应该复习将在技术面试和课后作业中测试的主题。这些都是特定角色的话题,取决于工作要求,所以研究工作描述是非常重要的。
1.数据分析师:
作为一名合格的数据分析师,您应该重点准备以下主题:
- 数据清理/争论—转换数据并从中获得洞察力。
- 统计学基础——概率、统计和线性代数的基础。
- Python/SQL 复习工具
- 谷歌分析(基于职位描述)
- Excel 和 Tableau 为那些对商业智能分析师和市场分析师感兴趣的人提供复习资料
2.数据工程师
你们更注重技术,不需要太多的数学和统计数据。牢固掌握编程并理解数据管理工具是至关重要的。这些工程师是数据科学的开发人员。
- 胜任的编程/开发技能,web 框架、REST APIs 等知识。
- 大数据工具— spark、Hadoop、airflow(DevOps)。学习开发分布式系统。
- 开发 ETL 管道。
- 云服务提供商(Google Cloud 或基于 JD 的 AWS)
3.ML/AI 工程师
人工智能工程师应该对最大似然算法有深刻的理解,他们应该知道驱动那些算法到优化状态的数学。以下是你应该掌握的基本概念:
- 出于显而易见的原因,良好的编程技能。
- 研究不同的损失函数、成本函数、训练算法、正则化方法、神经网络优化器等。动手操作的书将非常方便准备这些。
- 很好地掌握算法的数学和统计基础——至少是线性代数、多元微积分、随机分析。
- 利用庞大的数据集和最佳实践来实现批量学习和在线学习。
- 熟悉数据工程工具—您可能需要自己部署模型,或者帮助工程团队集成您的深度模型,以便在生产服务器上按预期工作。
4.数据科学家
大多数公司都希望多面手加入他们的数据科学家团队。该职位要求你设计和执行 A/B 测试实验,对数据样本进行统计分析,有时重构生产代码并可视化数据。
因此,您应该准备的主题是:
- 良好的编程技能(Python,R,Matlab)。
- 对数学和统计概念有深刻的理解,能够设计和进行研究实验,并评估它们对观察结果的重要性。
- 应该学过分类和回归问题,学会处理有监督和无监督学习。
- 证明有能力解决复杂的问题,如图像分类,语音识别,自然语言处理。学会使用预先训练好的模型;使用 TensorFlow、PyTorch 等库的经验。
- 领域专长——这完全取决于你的研究领域和公司所属的行业。例如,对冲基金的研究科学家需要对金融和经济有深刻的理解。
- 熟悉数据工程工具——他们还应该对如何建立数据基础设施以及他们的代码如何进入生产服务器有一个简单的了解。
摘要
如果我必须给你一个简单的步骤来总结整个过程,你可以用这个工作流程来制定你自己的策略:
- 确定你擅长的角色。
- 研究所有大中型公司的职位描述,寻找他们想要的特质、领域专长和技术能力。
- 准备一份投资组合,展示广泛的研究和解决公司同一领域内复杂问题的能力。根据公司的不同,域名可能无关紧要,但对几乎所有的大人物来说都很重要。
- 重温这些主题。
- 排练你对所有关键主题和项目的陈述和解释。
- 请一位朋友或导师对你进行模拟面试。越多越好。如果你在找导师,你应该去看看 Codementor.io 。使用这个链接可以让你获得 10 美元的积分,帮助你安排第一次会议,因为我是他们的会员合作伙伴。
- 保持冷静,扼杀面试!
数据科学与哈什特
通过这个渠道,我计划推出几个覆盖整个数据科学领域的系列。以下是你应该订阅频道的原因:
- 这些系列将涵盖每个主题和子主题的所有必需/要求的高质量教程,如数据科学的 Python 基础。
- 解释了为什么我们在 ML 和深度学习中这样做的数学和推导。
- 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
- 项目和说明实施到目前为止所学的主题。
通过计算非参数统计测试的置信区间来做晚餐和挽回局面
完整的 python 代码,带有用于曼恩-惠特尼 U 检验和威尔科森符号秩检验的工作示例。
“我想我需要去看医生”,睡眼惺忪的 Janhvi 说。
“为什么?”,我问道,仍然半睡半醒,享受着慵懒的早晨氛围。
“这几天感觉很累,没胃口。我最好去确诊一下”,她一边回答,一边拉开我的毯子,半踢着我下床。这是我做好准备开车送她去看医生的暗示——我美好的早晨就这样过去了!
“啊!但是你穿那条白裙子看起来很迷人。我相信你几个小时后就会好的”——我想,涂黄油总是有帮助的。她看着我时的眼神足以让这个表情符号为它的钱而战,所以我减少了损失,站了起来。是时候去拜访我们信任的医生了。
你该选择什么——爱情还是金钱?
我们的血浆数量下降了一点。工作压力大,饮食不合理,你是 Janhvi 吗?”“医生叔叔”骂道。
“我可以给你开你常用药物的处方,过两三个星期就应该好了。然而,在过去的 6 个月里,这个新品牌似乎在我试用过的病人身上取得了更好的效果。我觉得你应该试试。一周之内效果就很明显了。”
“一样的价格?”我问道,尽管有点太急切了,但我必须承认。
“我以为询问任何新的副作用会是第一个问题。但是,是的,它花费更多一点。那是哪一个?”博士叔叔干巴巴地打趣说,没有从 Janhvi 转移他的眼睛。
那是当时最贵的一家。在接下来的 10 分钟里,我绞尽脑汁想出一个冗长的借口来挽回面子。在开车回家的路上,我心中的数据科学家开始发挥作用。“你知道,统计学家有一大堆测试来比较两类或两种治疗方法。他们只是不会凭直觉说一个比另一个好。由于患者如此之少,很难概括不同方法之间的差异。”
哈维:“嗯……嗯”
我:“我想在这种情况下,我们可以很好地记录在我们的医生手下接受治疗的每个患者的血浆计数,根据他们接受的治疗将其分为两组,然后使用统计测试来检查是否真的有任何差异。”
哈维:“嗯……嗯”
我:“我们测量的是你的血浆数,不是吗?我认为这不符合正态分布。曼-惠特尼测试应该会给我们答案。”
Janhvi:“说什么?!我的血浆不正常?你是这个意思吗?”
我:“没有,没有!我说它不遵循正态分布*。看到那座远山了吗?想象一下,就在 2D。中间的一个峰值,向左右逐渐变小。我们在宇宙中测量的大多数事物都倾向于遵循正态分布——比如身高、血压、考试成绩或智商。在不涉及数学的情况下,如果我数一数这个星球上所有的人,或者至少是很多人,身高在 6 英寸到 20 英尺之间,并以如下方式记在一个表格中——数最左边的最矮的人→数右边高 1 英寸的人→数右边高 1 英寸的人→以此类推,直到数最高的人是最右边的人,那么我会看到一个有趣的模式,在我们周围经历的许多事情中都观察到了。”*
高度和数量
Janhvi:“哪个是?”她的兴趣增加了。
我:“一座山,一条钟形曲线*。如果我去我们的花园,开始堆砌砖块,为我在表格中输入的每个条目创建一个新列(每个新列刚好竖立在前一列的右侧),砖块列的高度等于我在表格中输入的计数,那么您将拥有一个山形结构。”*
正态分布
Janhvi:“有意思。不要在我们的花园里这样做。”
我:“好吧。”
“我认为这是我们能够与这个世界上的其他人产生共鸣的原因之一。我们大多数人在某个时候都会经历同样的事情。
我们分享很多。"
她看着远处的地平线,轻声说道。
我笑了。我从来没有那样想过。我想她是对的。
“血浆数量不符合正态分布吗?”。她回到这个世界就像她离开这个世界一样快。
我:“不。不是所有的事情都是这样,我认为人与人之间的血浆计数不是这样。但我们可以稍后向医生确认。”
Janhvi:“那么这有什么关系呢?”
我:“简单来说,要用的统计检验类型取决于你处理的数据类型。在我们的病例中,我们根据输出数据比较了两类治疗,血浆计数是连续的数据,但不正常。曼-惠特尼 U 检验用于这种情况。”
Janhvi:“你会向医生解释这一点,请他做这个对比测试,然后就能确定新的治疗方法是否比旧的好?”
我:“嗯……我可以自信地说出来。我将能够做出一个听起来像这样的声明——我们可以 95%地确信,治疗之间的平均血浆计数的差异在 x 和 y 之间的范围内。由于这个范围看起来不太大,这两种治疗方法对患者的效果很有可能是一样的。或者说,它们可能是不同的。”
“这么多工作为了T5 那 的声明!”,她大声说道。
“为你做任何事,亲爱的!我绝不会让你服用一种新药,除非你对它有足够的信心”,我说,希望在我的声音中传达出一丝自豪和关心。“你可能现在还没有意识到,但这种测试对制药或金融领域的研究至关重要。”
Janhvi:“是的,没错。我想你很幸运在过去的一周里有机会研究了这些测试,并发现它们很有趣?”
我:“是啊!找出其中一些测试(称为非参数测试)的置信区间并不容易,也没有标准的编程包,至少在 python 中没有。所以我做了一些调查,并为它们创建了自定义函数。我计划很快就此写一篇文章。你怎么知道的?”
珍妮薇:“我太了解你了,我最亲爱的。我们快到家了。告诉你,我觉得我需要睡到很晚,当我起床的时候我会很饿。你在接下来的几个小时里安静地完成你的文章,然后给我做一顿丰盛的晚餐,这样我就完全忘记你问医生叔叔的那个问题了,怎么样?”
“听起来很公平”,我说,不好意思地笑着。
用代码弄脏我们的手
所以在这里,分步代码。
代码背后的方法已引用自英国医学杂志,第 296 卷,1988 年 5 月 21 日:M . J .坎贝尔&M . J .加德纳的“计算某些非参数分析的置信区间”。
对于不成对的样本
non_param_unpaired_CI python 函数
让我们看一下论文中列出的例子,这样我们可以比较结果:
不成对数据集
n =第 1 组或样本 1 数量= 10
m =第 2 组或样本 2 大小= 10
对两个样本的值进行排序,并将它们分别作为列标题和行索引输出。我们需要计算样本 1 中的每个观察值与样本 2 中的每个观察值的差异,给出我们nxm的差异。它看起来是这样的:**
n x m 差异
在我们的 python 函数*non _ param _ unpaired _ CI()*中,这是通过下面一行代码实现的:
python 中的 n x m 差异
人口中位数或平均数的差的估计现在由这些差的中位数给出。从表中的 100 个差异中,第 50 个最小差异为-6 g/l,第 51 个第最小差异为-5 g/l,因此中值差异估计为(-6+(-5))/2= -5.5 g/l。这可以通过 python 计算得出:
差异的中位数
我们需要第 K 个最小的和第 K 个最大的中值差值来找到区间范围。k 由下式给出:
k 代表不成对样本
在这里,这个术语就是给定置信度下的百分位数。如果我们的置信水平是 0.95,那么 alpha 就是(1–0.95)= 0.05。我们可以用 python 中的这个来计算 N 为:
n 已计算
因此 K 为:
k 计算值
这出来就是 24 。第 24 个和第 24 个的最小差值为-10 g/l,第 24 个和第 24 个的最大差值为+ 1 g/l。因此,群体中位数差值的 95%置信区间为从 -10 g/l 到+1 g/l 。
对于成对样本
这可用于 Wilcoxon 带符号等级测试的情况。
non_param_paired_CI python 函数
工作示例—成对样本
请注意,这里的第一步是计算每个样本的观察值差异(之后-之前)。
n =每个样本的大小= 11
现在让我们计算我们的 N 和 K ,置信水平为 0.95,alpha =(1–0.95)= 0.05:
n 已计算
k 公式
k 计算值
k 出来就是 11 。
我们现在将创建一个包含所有差异平均值的nxn表格。因为列标题和行索引是相同的,所以我们只需要 n(n+1)/2 个值:
差异的平均值
在 python 中:
python 中的平均差异
第 11 个最小的和第 11 个最大的平均值是 11.9 和 25.1 ,因此是我们的区间。
劈!时间刚刚好!希望这能帮助到外面的人。如果是的话,一定要让我知道。现在我要走了,去做一顿丰盛的晚餐:)
对分享想法、提问或简单讨论想法感兴趣?在 LinkedIn 、 YouTube 、 GitHub 上与我联系或者通过我的网站:我只是一个学生。
回头见&学习愉快!
** [## Himanshu Chandra -业务主管-ML
www.linkedin.com](https://www.linkedin.com/in/himanshu-chandra-33512811/)**
演职员表&参考资料:
M J .坎贝尔的《起点的统计数据》
“计算某些非参数分析的置信区间”,作者 M . J .坎贝尔&M . J .加德纳
为企业采用人工智能做准备
创建促进人工智能转型的文化的执行指南
肖恩·波洛克在 Unsplash 上的照片
行动纲要
大多数公司未能扩大其人工智能试点项目的规模。大多数人工智能项目的预算都被削减了,因为它们没有足够快地交付结果。
问题不在技术,也不在人才。罪魁祸首往往是为前人工智能时代设计的企业文化和组织结构。为了大规模部署人工智能,高管们必须建立一种文化,让业务和技术团队能够无缝协作。
**以下是一个由 10 部分组成的框架,帮助高管们为公司大规模实施人工智能做好准备。**这不是一个让公司前进的顺序列表。大多数公司都会精通这个框架的一个或多个部分。
相反,本执行指南描述了成功人工智能实施文化的必要条件。企业领导人可以使用这个框架来诊断他们公司在这些领域的熟练程度。
然后,他们可以建造。
人工智能转型框架
面向高管的人工智能转型框架。作者制图,照片由 Laurenz Heymann 在 Unsplash 上提供
几乎每个 CEO 都说他们在‘做 AI’,就像你的朋友告诉你他在‘打健身房’一样。
这两个人很可能都得不到自己希望的结果。许多公司不会超越人工智能试点项目,你的朋友会告诉你,他太忙了,没有时间锻炼。
2019 年 Gartner CIO 调查声称3000 家被调查公司中有 37%已经部署了人工智能。可以肯定的是,剩下的 63%中的许多人在他们的人工智能之旅中遇到了一两个障碍。
光有技术和人才是不够的。企业必须打破文化障碍,重新思考组织结构,以便跨部门和地域部署人工智能。
企业 AI 部署没有单一的蓝图。企业如何实现人工智能取决于它们的规模、人才库和人工智能成熟度。
然而,高管可以使用这个由 10 部分组成的框架来指导他们的人工智能转型之旅:
- 旨在大规模部署人工智能
- 在整个公司建立人工智能意识
- 在高管层致力于“人工智能转型愿景”
- 规划人工智能项目的投资组合
- 建立内部人工智能团队,并与人工智能供应商合作
- 在公司内分配人工智能人才并分配职责
- 在整个公司中采用数据驱动的决策
- 打破数据孤岛
- 弥合业务和技术团队之间的差距
- 整合和变革管理预算
一、以大规模部署人工智能为目标
人工智能使企业能够对数据进行分类,找到模式,预测结果,并大规模地重复决策。
规模很重要。对于银行来说,部署用于客户细分的机器学习工具来帮助交叉销售和向上销售相对容易。部署一套人工智能解决方案来优化从入职到持续关系管理的整个客户旅程,更具挑战性,也更有回报。
企业如何构建和部署可扩展的人工智能解决方案组合?归结为组织结构和文化。公司必须促进业务和技术团队之间的合作,以便人工智能解决方案能够适应不断发展的业务需求。组织结构也必须足够灵活,以允许人工智能人才被部署到最需要的地方。
二。在整个公司建立人工智能意识
企业必须提高整个组织的人工智能意识。从 C-Suite 到个人贡献者的每个人都必须知道人工智能如何解决业务问题,以及他们如何使用人工智能工具。
AI 教育可以是内部的也可以是外部的。AI 成熟度高的公司会设立内部 AI 学院和在职培训项目。其他公司可以在课堂和研讨会上使用外部培训师和顾问。
高级管理人员
高管和高级经理将已经对他们公司的业务需求、目标和挑战有了深刻的理解。因此,他们必须建立人工智能意识,以便能够:
- 获得对人工智能技术如何工作的高级理解(例如,机器学习、机器视觉、自然语言处理)
- 确定其行业和公司内的高价值人工智能用例
- 认识他们公司可以用来实现业务需求的特定人工智能工具和技术
- 学会优先考虑人工智能计划
- 了解采用的障碍、对人员角色的影响以及所需的文化变革
技术职工
企业必须投资于数据科学家、人工智能工程师和人工智能工具开发者的技术培训。根据他们的角色,他们的培训可以包括:
- 数据最佳实践(例如,收集、清理、治理、修正偏差)
- 对机器学习和深度学习的技术理解
- 了解用于构建和培训人工智能和数据模型的开源和第三方工具(例如 Python、PyTorch、TensorFlow)
- 了解行业标准和新兴人工智能技术
商务翻译
也被称为分析翻译,这一新兴角色将在业务和技术团队之间架起桥梁,以确保人工智能产品满足业务需求。业务翻译也可以管理构建人工智能工具的技术人员,并负责人工智能项目的实施和采用。
业务翻译通常来自业务部门(如项目经理、业务分析师、主题专家、业务部门经理)。他们已经对业务有了很好的理解,也可能擅长项目管理、人员管理或战略规划。
商务翻译需要基本的技术培训和人工智能意识,以便:
- 用技术术语向构建人工智能工具的数据科学家和工程师传达业务需求和要求
- 将分析方法和人工智能工具应用于商业问题
- 详细开发人工智能用例
- 了解部署人工智能工具将如何改变工作流程
商业用户
这些是人工智能工具在营销、财务、销售或其他功能方面的最终用户。这些员工需要接受如何在日常工作中使用人工智能工具的培训。他们还需要克服对人工智能的恐惧。
大多数人害怕 AI 和自动化会抢走他们的工作。如果高管们把机器看得比自己人的技能和经验更重要,经理们可能会感到被冒犯。高管必须让员工相信,人工智能将帮助他们实现更多的目标。他们必须讲述一个令人信服的故事,说明为什么人工智能至关重要,以及它将如何惠及公司及其员工。
至关重要的是,高管必须让员工相信,人类永远是等式中最重要的部分。虽然人工智能可以产生数据驱动的见解并自动化流程,但只有人类拥有常识和功能知识来应用这些见解。把 AI 想象成增强的智能,而不是人工的智能。
实际上,自动化会导致一些失业。涉及常规和重复性任务的工作风险最大。然而,关于自动化将如何导致三分之一的工作岗位流失的头条新闻并没有讲述事情的全部。人工智能自动化了任务,而不是整个工作。真实的故事是关于员工的人工智能增强,而不是大规模的人工智能替代。
员工应该欢迎人工智能增强。一旦日常任务实现自动化,员工就可以将更多的时间投入到有影响力和令人满意的工作中。雇主也希望如此。德勤(Deloitte)对 1900 名人工智能采用者的企业调查显示,人工智能的一个主要好处是它解放了员工,使他们更具创造力。
如果员工认为人工智能对增长(或生存)至关重要,他们更有可能接受人工智能。零售业高管只需要指出亚马逊和电子商务带来的生存威胁。解释人工智能如何让零售商变得更高效、反应更灵敏,这很有说服力。强调员工发挥的关键作用并描绘未来成功的蓝图将会让员工完全参与进来。
三。致力于首席执行官级别的人工智能转型愿景
当一家公司的高管能够解释他们的人工智能转型愿景时,该公司人工智能成功的几率就会增加。转型愿景不是关于单个用例。这是为了在市场上大获全胜。
具体来说,最高管理层应该对四个问题有详细的回答:
- 人工智能可以帮助我们应对哪些商业挑战?
- 人工智能将如何在 3-5 年内使我们从竞争中脱颖而出?
- 我们将如何使用人工智能来增长和占领市场份额?
- 在数据可用性、人才和创新文化方面,我们今天必须采取哪些措施?
假设一家暖通空调公司在办公楼中安装供暖、通风和空调设备。他们看到了一个将传感器与机器学习结合起来的机会,以根据人类活动管理整个建筑的温度。这使得暖通空调公司的客户能够最大限度地减少能源使用。在这种情况下,采用人工智能节省的能源将使公司与众不同,并帮助它获得市场份额。
这是暖通空调公司 AI 转型愿景的开始。接下来,他们应该问自己如何通过利用他们的数据、人才和文化取得胜利。
人工智能转型愿景应该为公司的人工智能战略和项目组合提供信息。这也应该有助于公司优先考虑人工智能项目。
考虑长远,寻求试点项目的短期知识
一个长期的人工智能转型愿景将帮助高管们致力于一个多阶段的人工智能之旅。高管们会意识到真正的收益需要时间。如果没有长远的眼光,高管们可能会在看不到结果的时候撒手不管。
即使是成功的人工智能项目也可能需要时间来产生投资回报。试点项目可能根本不会产生财务投资回报。尽管如此,如果试点项目告诉公司应该如何改革数据基础设施,以实现大规模人工智能的采用,这是一个有价值的快速胜利。
试点项目花费不多,但可以给公司提供宝贵的见解,以构建可扩展的人工智能解决方案。它们可以揭示应该以更高的数量或更详细的方式收集什么类型的数据,并确定当前的数据缺口在哪里。例如,这些知识将帮助公司开发与数据收集和治理相关的核心能力。
致力于长期转型愿景的高管更有可能激励和鼓励创新文化,在这种文化中,财务 ROI 不是衡量成功的唯一标准。这种心态为更大的长期财务投资回报率打开了大门。
四。规划人工智能项目的投资组合
成功的人工智能转型是由不同时间跨度的项目组合驱动的。
更大、更雄心勃勃的人工智能计划带来的可衡量的好处可能需要数年时间,同时在短期内产生巨大的成本。单独投资大型多年项目会造成预算压力和管理层的不耐烦。
公司应该计划不同时间范围的人工智能项目组合。这使得公司能够从短期项目中获得稳定的收益,从而说服高管继续支持他们。一个结构良好的人工智能项目组合包括:
- 小型试点项目教授如何扩展人工智能的宝贵经验
- 在 6-12 个月内有可观回报的短期项目
- 处理越来越有价值的用例并在 12-24 个月内产生投资回报的中期项目
- 在整个企业中应用可扩展人工智能的长期项目
假设一家银行的人工智能转型愿景是“通过用人工智能简化整个客户旅程来获得更大的市场份额。”然后,项目应该使客户更容易注册,帮助银行提供方便和定制的客户服务,这反过来又说服更多的人注册。
试点项目主要是学习和概念验证。他们的价值来自于向公司展示他们现在所处的位置,以及他们在数据、人才和基础设施方面的需求,以便成功部署人工智能。
短期项目专注于从单一用例中产生“速赢”。银行可能会启动一个项目,在客户入职期间自动执行“了解您的客户”( KYC)流程。人工智能支持的自动化工具随时可用,KYC 流程也实现了标准化,这使得该项目成为帮助银行削减成本和提高效率的短期项目。
中期项目可以关注更高价值的用例,这些用例需要更多的时间来产生回报。在自动化 KYC 之后,我们的银行可能会开展一个项目,使用无监督的机器学习来构建一个客户细分工具。该工具将根据行为和特征将客户分类,使银行能够更有效地进行交叉销售并增加收入。
长期项目为公司及其客户提供真正的价值。这些可以是独立的项目,也可以是将较小的项目实现组合成一个连贯的解决方案的计划。我们的银行希望简化整个客户旅程,可以创建一个应用程序或网络平台来处理客户入职事宜,提供量身定制的产品推荐,并提供客户服务。
一个结构良好的投资组合可以分阶段提供投资回报。除了来自早期阶段的知识和见解,在阶段中产生 ROI 的项目可以资助(并验证)未来的阶段。
动词 (verb 的缩写)建立一个内部人工智能团队,并与人工智能供应商合作
从长远来看,公司应该致力于在内部构建人工智能。从短期来看(对于特定的用例来说),从供应商那里购买人工智能工具可以产生立竿见影的回报。
**收购人工智能的理由。**与人工智能供应商合作可能会加快一次性人工智能项目的速度,特别是如果该公司处于人工智能之旅的早期。一个人工智能供应商可能有一个用例的完美工具,这节省了公司的时间。供应商的专业知识也可以缩短新的内部人工智能团队的人工智能学习曲线。
**人工智能建筑案例。**内部构建的人工智能工具更有可能满足业务需求,并与数据和工作流相结合。从长远来看,依赖供应商产品来实现多个人工智能计划是不可行的。供应商不熟悉公司的业务需求、流程和数据。现成的供应商工具可能无法与公司的数据和业务流程集成。公司也不能让供应商接触敏感数据。至关重要的是,在内部构建人工智能工具使公司能够发展其人工智能能力并扩大规模。
混合方法。在迫切需要定制解决方案的情况下,与人工智能供应商合作构建定制的人工智能工具是一种选择。当内部员工可以准确地告诉供应商该工具应该做什么时,该工具更有可能与公司的流程和数据集成。例如,汇丰银行与人工智能供应商 ayas di合作开发了一款人工智能反洗钱工具。尽管汇丰无疑有内部人工智能团队,但他们利用供应商的专业知识来更快地获得结果。
除了供应商合作伙伴关系,一个良好的人工智能转型愿景需要一个帮助整个公司的集中式人工智能团队。这个团队将包括数据科学家、数据工程师、机器学习工程师和 AI 产品经理。根据公司的组织结构,团队可能向 CTO、CIO、首席数据官甚至首席 AI 官报告。
内部人工智能团队的职责包括:
- 人工智能策略和问题识别
- 人工智能标准和流程
- 规划和执行人工智能项目组合
- 数据和治理标准
不及物动词在公司内分配人工智能人才并分配职责
为人工智能的可扩展性而组织。图片作者。
哪种组织模式最适合大规模部署人工智能?人工智能人才应该居住在公司的什么地方?《哈佛商业评论》关于人工智能驱动的组织的专题讨论了扩展人工智能的三种组织模式:
- 集中化:将人工智能人才集中到一个中央核心(“枢纽”),比如总部或地区办公室
- 去中心化:将人工智能人才嵌入各个业务部门(“辐条”)
- 混合:将人工智能人才&的职责分配给核心和业务部门
与人工智能战略、项目和采用相关的任务可以由三个组织层中的任何一个拥有:核心、各种业务单元,或者跨核心和业务单元工作的“灰色区域”。
核心
核心负责人工智能&数据战略、招募、治理以及与人工智能&数据供应商合作。
核心创建人工智能标准、流程和最佳实践,帮助在整个组织中扩展人工智能。这确保了业务部门不会重复工作,并且人工智能部署是无缝的,符合公司标准。
核心应该负责数据计划,如数据清理、标记和集成。这些计划应该与人工智能项目一起逐步实施。在确定业务需求和人工智能用例之前,没有必要花费数百万美元进行公司范围的数据收集和清理——如果管理层意识到它们不适合人工智能项目需求,这些数据计划可能会被放弃。
业务部门
业务单位负责与采用相关的活动,因为他们是人工智能系统的最终用户。这些任务包括业务分析、鼓励采用、培训用户、重新设计工作流程和衡量效益。
业务部门必须最终对人工智能产品的成功负责。由于人工智能工具是为解决业务需求而设计的,业务部门的领导,如区域经理,应该对人工智能产品的成功负责。
灰色地带
落入灰色区域的任务可以由核心或单个业务单元拥有。这些任务包括 项目管理、算法开发、产品设计&测试、IT 基础设施和变更管理。
选择由核心部门还是业务部门负责这些任务取决于三个因素:
- 人工智能成熟度:公司以前部署人工智能的经验
- 人工智能的紧迫性:人工智能计划的速度和复杂性
- **商业模式:**参与人工智能采用的部门、职能或地理位置的数量
如果企业的人工智能成熟度低、紧迫性高、商业模式简单,它们应该将人工智能人才和运营集中在核心。相反的情况要求将人工智能人才分散到各个业务部门。
**AI 成熟。**一家开始人工智能之旅的公司可能会将其数据&分析高管、数据科学家、人工智能工程师和支持人员集中在核心。这使得标准化工具、数据流程、存储库和基础设施的开发更快。当然,这些人员可以根据需要部署到业务部门。
**艾尿急。**需要快速部署 AI 项目的公司,可能会选择将其 AI 人才集中在核心。这允许更好地监控行业技术趋势,并在构建人工智能产品时更容易协调。
**商业模式。**人工智能工具有时必须支持大量的业务单位、地理位置或功能。在这种情况下,该公司复杂的商业模式可能会说服高管将人工智能人才整合到核心部门,并根据需要将他们分配到组织的其他部门。
归根结底,这与其说是一门科学,不如说是一门艺术。一家必须紧急部署人工智能解决方案并拥有复杂商业模式(建议人工智能人才集中化)的公司可能具有较高的人工智能成熟度(建议分散人工智能人才)。在这种情况下,高管应该考虑这三个因素的相对重要性,并确定人工智能人才在核心部门还是在业务部门最有用。
假设银行投资组合中的一个人工智能项目涉及为某个国家构建一个 KYC 自动化工具。如果该国的客户关系团队之前已经为客户入职部署了人工智能工具,该团队可以接管通常由核心处理的活动,如业务案例分析和项目实施。
七。在所有级别接受数据驱动的决策
人工智能应该通过赋予人们数据洞察力来改善日常运营。因为运营是由人来执行的,所以公司必须采用一种从最高管理层到基层的数据驱动的决策文化。
当人工智能被正确采用时,员工可以通过算法建议来增强他们的技能和判断力,以实现比人类或机器单独更好的结果。
这只有在员工能够信任人工智能工具并感到被授权做出决策的情况下才会发生。信任是通过 AI 感知建立的(如上所述)。当企业放弃传统的自上而下的方法时,决策权就产生了。
以一家全国连锁超市为例。关于优化占地面积和产品布局的决策通常由区域经理根据历史数据做出。对于拥有数百家商店的连锁超市来说,这种自上而下的决策可能不会给单个商店带来最好的结果。在数据驱动的决策文化中,使用人工智能工具跟踪实时店内客户行为的当地经理能够更好地决定商店如何展示产品。
八。打破数据孤岛
人工智能需要来自组织许多部门的大量数据。许多公司部门将数据存储在孤岛中——这些系统相互之间没有接口,只能由特定的团队访问。这是人工智能采用的一个障碍,但却是可以克服的。
大型保险公司因其数据孤岛而臭名昭著。保险公司往往有几十个独立的遗留(即旧的)系统,这些系统相互之间没有连接,也没有连接到新的数字和云平台。这种不利于人工智能和该行业正在着手的数字化举措。
像大多数数据密集型行业一样,保险公司也在投资对遗留系统进行现代化改造,或将数据迁移到数字系统、数据湖和数据仓库。数据湖和数据仓库都存储大数据。数据湖是一个巨大的原始数据池,没有结构或标签。数据仓库存储用于特定目的的结构化、带标签的数据。
打破数据孤岛不是一蹴而就的。在实施 AI 之前投资昂贵的大规模数据转换通常是一个坏主意。最好是两者一起做,以便根据您的人工智能计划的需要来完成数据转换。
人工智能试点项目在这里很有帮助——它们揭示了当前的数据差距在哪里。有了这些知识,公司可以开始智能地打破数据孤岛。
九。弥合业务和技术团队之间的差距
业务翻译者,前面介绍过,确保 AI 和数据科学解决方案的设计考虑到了业务需求。
业务和技术团队并不总是说同一种语言。区域销售经理可能确切知道他们想要从人工智能驱动的客户细分工具中获得什么——它应该将客户分成代表他们对哪些产品感兴趣的桶。然而,销售经理可能无法用技术术语将这些需求传达给实际构建工具的数据科学家或机器学习工程师。
这不是企业界的新问题。部署内部 IT 系统或面向客户的移动应用的公司将这些项目的所有权交给专注于 IT 的项目经理和业务分析师。例如,IT 项目经理理解新 IT 系统的业务目标。他们还将对技术有一个基本的了解,并能监督构建系统的技术人员。
当涉及到人工智能计划时,这些业务翻译可以是项目经理、业务分析师,甚至是内部顾问。他们需要对人工智能方法和能力有广泛的认识,这样他们才能理解技术团队在做什么,并给他们指明方向。
商业翻译可以利用他们对商业和人工智能的认识来识别人工智能采用的障碍。在项目早期,他们可以调查最终用户,研究工作流,与业务和技术领域的关键利益相关者交谈。这使他们能够诊断和解决问题,如缺乏员工认同或最终用户的不合理期望。
确定具有商务翻译能力的员工至关重要。这个角色很快就会大受欢迎——而且没有太多的人同时拥有人工智能意识和商业知识。德勤人工智能在 2019 年的企业调查中发现,商业人才几乎与人工智能人才一样受重视,在公司实施了 20 多个人工智能系统后,甚至更受重视。
X.整合和变革管理预算
整个公司的人工智能意识加上员工对人工智能计划的认同为人工智能的采用奠定了基础。然而,仅仅这些还不足以确保 AI 与业务流程的顺利集成。公司必须至少为采用活动和开发活动做同样多的预算。
集成人工智能工具涉及工作流重新设计、培训和变更管理。这些支持活动应该在部署 AI 解决方案之前就开始。它帮助员工准备好使用人工智能工具,并避免不愉快的意外。它还确保员工了解、参与和支持人工智能之旅。
尽早开始可以让业务翻译人员和最终用户在实施之前发现潜在的采用问题。也许人工智能工具需要重新设计一些工作流程,这样会带来更多的麻烦而不是好处。在部署之前认识到这一点允许技术团队修改 AI 工具。
外卖食品
AI 不容易。投资回报需要时间。一家公司的人工智能之旅是由其独特的需求和情况决定的——将会有未知的领域需要跨越。
高管们可以通过推广一种为人工智能转型量身定制的文化,让他们的公司为这一旅程做好准备。上面描述的 10 部分人工智能转型框架可以帮助高管诊断组织需要如何改变,以便大规模部署人工智能。
扩大人工智能需要时间,知道该做什么只是第一步。强大的文化、人工智能意识和各级员工的认同将是关键。
为时间序列分析准备数据
一些简单的技巧和窍门来获得分析就绪的数据
每个单独的时间序列(TS)数据都装载有信息;时间序列分析(TSA)就是解开所有这些的过程。然而,为了释放这种潜力,数据需要在通过分析管道之前进行适当的准备和格式化。
TS 可能看起来像一个简单的数据对象,很容易处理,但事实是,对于一个新人来说,在真正有趣的事情开始之前准备数据集可能是一项艰巨的任务。
因此,在本文中,我们将讨论一些简单的技巧和诀窍,以获得可供分析的数据,从而潜在地节省大量的生产时间。
查找数据
如果你用你自己的数据集做分析,你就有了。但是,刚刚学习 TSA 的人,找到正确的数据集可能会很麻烦。
数据来源其实不少。机器学习库附带的一些数据集——众所周知的玩具数据——已经存在很长时间了。这些“玩具”数据很好玩,尤其是对初学者来说。但这是一种瘾,每个人都需要尽快戒掉,投入到现实世界中去。
下面是一些在不同领域的一系列主题上查找数据的来源——一些是经过策划的,一些需要清理。你一定能从这个列表中找到你最喜欢的。
我建议你从整理过的数据集开始,这样你就不必揪着头发去解决数据问题,对真正有趣的东西失去兴趣。但是一旦你学会了基本原理,发现数据越乱越好,这将迫使你经历整个分析过程。
好了,这里有一些玩具数据集——干净、有条理、可供分析——经常在机器学习教程中使用:
- 1949 年至 1960 年间每月报道的航空旅客人数
- 美国某些州的客户每小时消耗的电能
- 股票市场数据不同公司的开盘价、最高价、最低价和收盘价以及交易量
- 一个关于洗发水销售的超小型数据集
- 1981-1990 年间的日最低气温数据(不知道代表哪个国家/城市,不过那不重要)
- 每日记录的空气质量数据(一氧化碳、二氧化硫、臭氧等。)针对印度的不同城市
对于真实世界的数据集,有一些非常棒的存储库。老实说,我认为您不需要超越这些存储库来学习高级 TS 分析和建模。
1)美国人口普查局拥有大量美国商业活动的时间序列数据
2 ) 美联储经济数据(FRED) 是关于美国经济指标的一个很好的数据源
3 ) 世界发展指标(WDI) 是一个由世界银行维护的关于世界各国社会、经济和环境问题的巨大资料库。
数据准备
首先,人们总是倾向于像对待任何其他数据集一样对待时间序列。然后操之过急。但是 TS 观测和我们熟悉的横截面观测是不一样的。
时间序列数据已经存在很长时间了,许多人致力于让其他人的生活更轻松(想到了 R 编程语言中的 Rob Hyndman 和 Python 世界中的 Jason Brownlee )。
有很多非常好的库是专门用来处理 TS 数据的。通过转换数据,您让库认识到它是一个特殊的 TS 对象。
假设您已经完成了所需的预处理,例如重命名列、处理缺失值等。—以下是如何通过几个步骤准备数据。
在这个练习中,我使用了一个在机器学习中被过度使用的玩具数据——航空乘客数据集——并用 Python 执行代码。
# import a couple of libraries
import pandas as pd
import numpy as np# import data
df = pd.read_csv("../DataFolder/file.csv")# look at the head
df.head()
数据集的前几行
从前面几行我们可以看到,数据集有两列,第一列表示“yyyy — mm”格式的日期列,另一列表示实际观测值。
记住,我们还不知道它是否是一个时间序列对象,我们只知道它是一个有两列的数据帧。
df.info()
数据帧信息
因此,在其他信息中,这个摘要确认了它是一个有两列的pandas
数据帧。第一列是对象,第二列是整数。
它不显示任何时间维度,这是因为月列存储为字符串。所以我们需要将其转换成日期时间格式。
df_air["Month"] = pd.to_datetime(df_air["Month"])
接下来,让它成为索引。这样做的好处是,您可以以任何方式过滤/切片数据:按年、月、日、工作日、周末、特定的日/月/年范围等等。
df_air = df_air.set_index("Month")
df_air.head()
将月份更改为日期时间并设置为索引后的数据帧
最后一个好的实践是从日期时间索引中提取年、月和工作日,并将它们存储在单独的列中。如果需要的话,这为根据年/月等对数据进行“分组”提供了一些额外的灵活性。
df_air['year'] = df_air.index.year
df_air['month'] = df_air.index.month
df_air['weekday'] = df_air.index.weekday_name
这就是我们的最终数据集。只需对比与原始数据的差异。此外,正如下面用黄色墨水突出显示的,它现在确认它不只是任何数据帧,而是一个时间序列对象。
df.head()
总之,我们做了一些事情来将我们的数据转换成时间序列对象:
1)将月份列从字符串转换为日期时间;
2)将转换后的日期时间列设置为索引;
3)从索引中提取年、月和工作日,并存储在新列中
现在怎么办?
现在您已经有了可供分析的数据,下一步是什么?你现在可以用它进行所有你想要的有趣的分析了,我会在以后的文章中介绍。与此同时,如果你想阅读一些先进的运输安全管理局分析,我写了几篇,看看下面。
祝你 TSA 之旅好运!
联系提问或者只是关注: 推特 。
用网络分析准备研究生院面试
利用数据科学发现跨机构教师之间的联系。
图一。不同机构的教职员工的图表(彩色),由他们的出版历史联系起来。
本文是正在进行的关于在研究生院面试过程中利用数据科学的系列文章的第一部分。查看下一期 专题造型 ,敬请期待更多。
美国的研究生院面试季正在火热进行中,这意味着你会遇到很多在某个特定领域可能相互认识的重要人物。当你准备的时候,你会开始意识到世界是多么的小,全国和全世界的教师是如何通过合作和相互尊重来建立他们的职业生涯的。为了帮助理解这些关系,我花了几周时间思考如何最好地收集、处理和呈现这些数据,以便在采访中有效地使用。我刚从我的第一轮面试中回来,并与我的同事分享了我的一些结果,他们的兴趣促使我写了这篇简短的走查,所以任何有兴趣为自己做同样事情的人都可以。
我们将主要使用 Python,包括以下模块:
- 学术,通过谷歌学术收集数据。
- 熊猫和 Numpy,进行基础数据角力和操作。
- Networkx 和 Matplotlib,用于绘图和数据表示。
- Python-docx,用于自动化文档构造。
其中一些可能包含在 Python 的典型安装中,也可能不包含在其中,因此我建议您参考它们各自的网站/文档以获得专门的帮助。
第 0 部分:数据收集准备
根据我的理解和知识,并没有一个确切的谷歌学术 API 可以被接口来直接获取数据,因此实现了学术。这带来了一些优点和缺点,其中一些有时会由于高容量使用而被阻塞。出于这个原因,我们想在安装后对它的脚本做一些小的修改。请在 Python 下的 lib/site-packages/文件夹中,或者在您决定维护该模块的任何地方找到 scholastic . py 文件。这里我们将添加一个简单的随机用户代理生成器:这里是这里是。在 scholastic . py 中,您可以找到 web-scrapers 标题的定义,如下所示:
_HEADERS = {
‘accept-language’: ‘en-US,en’,
‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36’,
‘accept’: ‘text/html,application/xhtml+xml,application/xml’
}
这对于简单的运行来说已经足够好了,然而,根据你感兴趣的教师数量,这可能是不够的。因此,在脚本的开始,我们将从前面的超链接文章中添加随机用户代理生成器,我们的 scholarly.py 脚本的开始应该是这样的:
def get_random_ua():
random_ua = ''
ua_file = 'C:/Users/Masters-PC/Documents/ua_file.txt'
try:
with open(ua_file) as f:
lines = f.readlines()
if len(lines) > 0:
prng = np.random.RandomState()
index = prng.permutation(len(lines) - 1)
idx = np.asarray(index, dtype=np.integer)[0]
random_proxy = lines[int(idx)]
except Exception as ex:
print('Exception in random_ua')
print(str(ex))
finally:
return random_ua_GOOGLEID = hashlib.md5(str(random.random()).encode('utf-8')).hexdigest()[:16]
_COOKIES = {'GSP': 'ID={0}:CF=4'.format(_GOOGLEID)}
_HEADERS = {
'accept-language': 'en-US,en',
'User-Agent': get_random_ua(),
'accept': 'text/html,application/xhtml+xml,application/xml'
}
这应该让我们为我们的应用程序做好了准备,尽管您可以随意浏览带超链接的文章的其余部分,并实现他们的其余建议。
第一部分:数据收集
取决于你离面试日期有多近,你可能会也可能不会有你将会见的教员名单。这是我们将使用谷歌学术获得他们数据的广度的地方。首先,导入相应的模块并定义这个作者列表。
authorlist = """Wilhelm Ostwald
Linus Pauling
Max Perutz
Frederick Sanger
Michael Smith
Harold Urey
Milton Friedman
Friedrich Hayek"""
我只包括了 7 个随机的诺贝尔奖获得者,但是这个想法是你应该能够同时包括你感兴趣的所有教师。我的名单上有超过 40 人,分布在 10 多个机构,我还包括了我以前的导师,以防那里有任何以前未被发现的联系。有了这个,我们就可以利用学术并把输出写到一个. csv 文件中,我们可以继续检查错误。
import scholarly
import csv
authors = authorlist.split('\n')
table = [['Name','ID','Affiliation','Domain','First Year Cited','Citations','Citations (5 Years)','cites_per_year','coauthors','hindex','hindex5y','i10index','i10index5y','interests','publications']]for i in range(len(authors)):
print(i)
query = authors[i]
try:
search_query = scholarly.search_author(query)
author = next(search_query).fill()
data = [author.name,
author.id,
author.affiliation,
author.email,
'first cited year',
author.citedby,
author.citedby5y,
author.cites_per_year,
['coauthors'],
author.hindex,
author.hindex5y,
author.i10index,
author.i10index5y,
author.interests,
['publications']]
coauthors = []
for j in author.coauthors:
coauthors += [[j.name,j.affiliation]]
data[8] = coauthors
publications = []
for j in author.publications:
publications += [j.bib['title']]
data[-1] = publications
except:
print(query + ' is not available')
data = ['']*15
data[0] = query
table += [data]with open('FoIScholardata.csv', 'w', newline='', encoding='utf-16') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
for i in table:
wr.writerow(i)
运行后,您现在应该在当前工作目录中有一个 FoIScholardata.csv 文件,可以在 Microsoft Excel、Google Sheets 或任何其他电子表格编辑器中打开该文件来检查数据。
第 1a 条。证明、清理和扩充数据。
你应该做的第一件事是仔细检查你是否获得了正确的教授数据,因为那些有相同或相似名字的人可能会混淆。如果是这种情况,您可能希望在搜索查询中包括他们的机构名称/缩写以消除歧义,例如:
authorlist = "...
Linus Pauling CalTech
..."
你可能注意到的下一个问题是一些教授的数据不可用。如果这不是你的情况,你可以继续第 1b 部分。最可能的原因是他们没有创建自己的谷歌学术个人资料。为了解决这个问题,我们可以用其他网站来增加我们的数据,包括他们的机构网页或其他网站,如 ResearchGate。如果您感兴趣,可以随意创建新的数据列。一旦你这样做了,如果你还需要获得他们的出版物列表,你可以使用学术以及下面的代码片段。将“用户”列表替换为谷歌学术网站上作者出版物中的缩写名称列表。
import scholarly
import pandas as pd
import time
import random
table = pd.read_csv("FoIScholardata.csv", encoding='utf-16')
users = ['W Ostwald', 'MF Perutz']
names = list(table.Name)
surnames = []
for i in names:
surnames += [i.split(' ')[-1]]
for user in users:
print(user)
try:
srch=scholarly.search_pubs_query(user)
except:
print('Holding for an hour.')
time.sleep(3600)
pubs = []
noerror = True
while noerror:
time.sleep(0.5+random.random())
try:
pub = next(srch)
if user in pub.bib['author']:
pubs += [pub.bib['title']]
print(len(pubs))
except:
noerror = False
titles = []
for i in pubs:
titles += [i.bib['title']] n = surnames.index(user.split(' ')[-1])
table.publications[n] = titles
export_csv = table.to_csv (r'fillins.csv', index = None, header=True) #Don't forget to add '.csv' at the end of the path
print('Holding for about a minute')
time.sleep(45+random.random()*30)
根据您的兴趣修改导出的文件名,并将您的结果添加回原始 FOIScholardata.csv 文件。睡眠时间包括在内是为了方便逃避被封锁,但你可以随时删除/修改它们。
第 1b 节:确定作者之间的合作关系。
谷歌学术确实包括了一个共同作者的列表,这得到了概要持有者的认可,但这似乎是一个相对较新的特性。因此,它可能是在用户更新了他们的简档,或者他们的合作者创建了他们的简档等之后引入的。,可能不包括所有实际的合著者。因此,我们将基于共享同名出版物来手动添加这些协作。
import pandas as pd
import numpy as np
table = pd.read_csv("FoIScholardata.csv")
matrix = [[0]*len(table)]*len(table)
matrix = np.array(matrix)
newcol = []
for i in range(len(table)):
print(i)
author = table.Name[i]
pubs = []
collaborators = []
if type(table.coauthors[i])==str:
pubs = eval(table.publications[i])
for j in range(len(table)):
if i == j:
continue
if type(table.coauthors[j])==str:
coms = list(set(eval(table.publications[j])) & set(pubs))
matrix[i][j] = len(coms)
if matrix[i][j]>0:
collaborators += [table.Name[j]]
newcol += [collaborators]
table['collaborators'] = newcol
export_csv = table.to_csv (r'FoIScholardata.csv', index = None, header=True) #Don't forget to add '.csv' at the end of the path
第 2 部分:生成主要合作者图表。
现在,我们的主要活动,虽然我们肯定有很多事情要做,我希望你留下来。有了适当组织的数据,我们将不会利用 Networkx 来构建和显示我们的图表。
import math
import pandas as pd
import numpy as np
import networkx as nx
from matplotlib import cm
import matplotlib.pyplot as plt
table = pd.read_csv("FoIScholardata.csv")
G=nx.Graph()
for i in range(len(table)):
G.add_node(table.Name[i])
for i in range(len(table)):
for j in eval(table.collaborators[i]):
G.add_edge(table.Name[i],j)
domains = np.unique(table.Domain);
#see [https://matplotlib.org/tutorials/colors/colormaps.html](https://matplotlib.org/tutorials/colors/colormaps.html)
viridis = cm.get_cmap('hsv', len(domains))
from matplotlib.pyplot import figure
figure(num=None, figsize=(16, 12), dpi=100, facecolor='w', edgecolor='k')
pos = nx.spring_layout(G, k = 0.25) # positions for all nodes
labels = { i : table.Name[i] for i in range(0, len(table.Name) ) }
options = {"alpha": 0.8}
for i in range(len(G.nodes())):
nx.draw_networkx_nodes(G, pos, nodelist=[table.Name[i]],node_size=table.hindex[i]*19,node_color=viridis(list(domains).index(table.Domain[i])), **options)
for i in pos:
angle = 0
plt.text(pos[i][0],pos[i][1],s=i,fontsize=12,rotation=angle, rotation_mode='anchor')
plt.axis('off')
plt.savefig("CollaboratorSpringGraphColor.png") # save as png
plt.close()
幸运的话,您的结果应该看起来有点像这样:
**图二。**共同发表科学家的 Spring (Force-directed)图。注:这些科学家之间的联系事实上是不正确的。
如果您遇到颜色格式的问题,您可能需要手动修改数据中的“域”变量。在这种格式中,您可以很容易地识别该图中可能出现的子网和其他模式。其他格式也是可用的,即我们名义上的图像,圆形图。为此,我们应该分三部分稍微修改我们的代码:
- 修改位置声明:
pos = nx.circular_layout(G)
2.旋转名称标签,使它们不重叠:
for j in range(len(pos)):
i = list(pos.keys())[j]
angle = 0
if ((math.atan2(pos[i][1],pos[i][0])*180/math.pi) > (70)) & ((math.atan2(pos[i][1],pos[i][0])*180/math.pi) < (110)):
angle = 45
elif ((math.atan2(pos[i][1],pos[i][0])*180/math.pi) > (-110)) & ((math.atan2(pos[i][1],pos[i][0])*180/math.pi) < (-70)):
angle = -45
3.更改输出文件名:
plt.savefig("CollaboratorCircleGraphColor.png")
生成的图像应该如下所示:
**图三。**标注的圆形图展示了所选院系之间的相互联系。注:这些科学家之间的联系事实上并不正确。
第 3 节:得出每位研究人员的额外个性化数据。
现在,这个图表对于一幅大图来说是很好的。然而,当你接近被邀请的日期时,为了考虑到每一位教授,你可能会想把它大大地分解一下。首先,我们将建立在谷歌学者的“兴趣”概念上。正如我们已经习惯的那样,该特征可以由轮廓支架来完成,也可以不由轮廓支架来完成。然而,我们可以通过再次查看出版物标题来构建一个替代品。我们要做的是提取所有出版物的词频,并查看哪些出现在顶部。如果没有安装,您可能还需要安装 get_stop_words 模块。
import pandas as pd
import matplotlib.pyplot as plt
from stop_words import get_stop_wordsexcs = get_stop_words('en')
table = pd.read_csv("FoIScholarData.csv")
def valuef(x):
return worddict[x]
newcol = []
for i in range(len(table)):
pubs = eval(table.publications[i])
worddict = {}
for j in pubs:
words = j.lower().split(' ')
for k in words:
if k in worddict.keys():
worddict[k] += 1
else:
worddict[k] = 1
values = []
topics = []
for j in worddict:
if worddict[j] > 5:
if not (j in excs):
values += [worddict[j]]
topics += [j]
width = 0.3
topics.sort(key=valuef)
values.sort()
newcol += [topics]
plt.bar(topics[-15:], values[-15:], width, color='b')
plt.xticks(rotation = -45)
plt.gcf().subplots_adjust(bottom=0.22)
plt.title('Title Word Frequency for ' + str(table.Name[i]))
plt.savefig(str(table.Name[i]) + "_WF.png") # save as png
plt.close() # displaytable['topics'] = newcol
export_csv = table.to_csv (r'C:\Users\Masters-PC\Desktop\ProfNetworks\FoIScholardata.csv', index = None, header=True) #Don't forget to add '.csv' at the end of the path
除了在我们的数据电子表格中为我们提供一个新列之外,这还将为每位教授生成一个可视化效果,如下所示:
图 3。宾夕法尼亚州立大学 Charles Geier 博士的出版物标题词频直方图。
这张图表立即提供了信息,因为我们可以确定研究人员对抑制控制和一般认知发展的兴趣。也许,更深入的分析,包括主题建模,以获得研究人员之间更深层次的联系是可能的,尽管这超出了本文的范围。
更新:我决定贯彻这个承诺,并且有效地执行了一个 主题建模方法 来连接这些部分。请随意查看!
第 4 部分:对每位研究人员的图表进行近距离观察。
我们创建的大图表可能不适合每个研究人员的个性化报告。因此,我们可能只对提取子网络感兴趣,类似于力定向图中的可视化。为此,我们将考察他们的一阶合作者(直接),和二阶合作者(合作者的合作者)。
import math
import pandas as pd
import numpy as np
import networkx as nx
from matplotlib import cm
import matplotlib.pyplot as plt
table = pd.read_csv("FoIScholardata.csv")def f(n, c2, c1):
m = (c2-c1)/4
b = c2 - m*5
return m*n+bfor qt in range(len(table.Name)):
G=nx.Graph()
# adding just one node:
G.add_node(table.Name[qt])
for j in eval(table.collaborators[qt]):
G.add_node(j)
G.add_edge(table.Name[qt],j)
if len(eval(table.collaborators[list(table.Name).index(j)]))>0:
for k in eval(table.collaborators[list(table.Name).index(j)]):
G.add_node(k)
G.add_edge(j,k)
N = len(eval(table.collaborators[qt]))
domains = np.unique(table.Domain);
#see [https://matplotlib.org/tutorials/colors/colormaps.html](https://matplotlib.org/tutorials/colors/colormaps.html)
viridis = cm.get_cmap('hsv', len(domains))
from matplotlib.pyplot import figure
figure(num=None, figsize=(16, f(N, 12, 4)), dpi=100, facecolor='w', edgecolor='k')
#pos = nx.spring_layout(G, 1/(len(G.nodes))) # positions for all nodes
#pos = nx.circular_layout(G) # positions for all nodes
pos = nx.kamada_kawai_layout(G) # positions for all nodes
labels = { i : list(G.nodes())[i] for i in range(0, len(G.nodes())) }
#nx.draw(G)
#options = {'node_size': 500, "alpha": 0.8}
options = {"alpha": 0.8}
for i in range(len(G.nodes())):
nx.draw_networkx_nodes(G, pos, nodelist=[list(G.nodes())[i]],node_size=table.hindex[list(table.Name).index(list(G.nodes())[i])]*19,node_color=viridis(list(domains).index(table.Domain[list(table.Name).index(list(G.nodes())[i])])), **options)
nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
for i in pos:
surname = i.split(' ')[-1]
plt.text(pos[i][0],pos[i][1],s=i,fontsize=f(N, 36, 48))
plt.axis('off')
xlims1 = plt.xlim()
plt.xlim(xlims1[0],f(N, 2, 2.5))
#plt.ylim(-3, 3)
plt.savefig(table.Name[qt]+ "CollaboratorSpringGraphColor.png") # save as png
plt.close() # display
我想这个自定义的 f 函数值得讨论一下。并非所有的研究人员都有相同数量的合作者,因此,我对每个条目的 f 函数进行了线性校准,我认为应该根据创建的图像进行适当的缩放,这样当我们进入下一部分,即生成我们的报告时,它将是美观的。这些数字可能有点武断,所以请随意调整它们以满足您的要求。
第 5 部分:执行每位研究者的个性化报告。
所有这些数据都已可视化并准备就绪,我们现在可以开始最终完成我们的总结报告。为此,我们将使用 Python-docx。
from docx import Document
from docx.shared import Inches
from docx.enum.table import WD_ALIGN_VERTICAL
import pandas as pd
import numpy as np
import networkx as nx
from matplotlib import cm
import matplotlib.pyplot as plt
def f(n, c2, c1):
m = (c2-c1)/4
b = c2 - m*5
return m*n+btable = pd.read_csv("FoIScholardata.csv", encoding='utf-16')for qt in range(len(table.Name)):
print(qt)
document = Document()
try:
if type(table.Affiliation[qt])==float:
continue
document.add_heading(table.Name[qt], 0)
p = document.add_paragraph('')
p.add_run(table.Affiliation[qt]).italic = True
p.add_run('\n'+'Interests '+str(table.interests[qt])[1:-1])
document.add_picture(table.Name[qt]+"_WF.png", width=Inches(5))
if len(eval(table.collaborators[qt]))>0:
document.add_heading('Collaborators', level=1)
coltable = document.add_table(rows=1, cols=2)
coltable.cell(0, 0).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
for j in eval(table.collaborators[qt]):
pol = coltable.rows[0].cells[0].add_paragraph(
j, style='List Bullet')
co = coltable.rows[0].cells[1].add_paragraph()
bo = co.add_run()
bo.add_picture(table.Name[qt]+"CollaboratorSpringGraphColor.png", width=Inches(f(N, 4.9, 4)))
cols = []
ncols = []
bestcol = []
for j in eval(table.collaborators[qt]):
k = list(table.Name).index(j)
collabs = list(set(eval(table.publications[qt])) & set(eval(table.publications[k])))
cols += [table.Name[k]]
ncols += [len(collabs)]
bestcol += [collabs[0]]
ntable = document.add_table(rows=1, cols=3)
hdr_cells = ntable.rows[0].cells
hdr_cells[0].text = 'Collaborator'
hdr_cells[1].text = 'Title'
hdr_cells[2].text = 'N'
for k in range(len(cols)):
row_cells = ntable.add_row().cells
row_cells[0].text = cols[k]
row_cells[0].width = Inches(1)
row_cells[1].text = bestcol[k]
row_cells[1].width = Inches(5)
row_cells[2].text = str(ncols[k])
row_cells[2].width = Inches(0.5)
margin = Inches(0.5)
sections = document.sections
for section in sections:
section.top_margin = margin
section.bottom_margin = margin
section.left_margin = margin
section.right_margin = margin
document.add_page_break()
document.save('ScholarSheets/'+table.Name[qt]+'.docx')
except:
print(str(qt) + 'not')
这将为我们留下一个最终的 Word 文档,看起来有点像这样:
**图 4。**Charles Geier 博士的示例输出文档。
有了这份文件,我们现在有了关于我们教授的数据的简明摘要,并可以开始编辑笔记和执行更有针对性的文献搜索,以选择作为面试过程中您的审查的一部分。我们可以通过阅读教授之间的共享论文,制定潜在的问题,并记下笔记来一举两得。如果你能走到这一步,谢谢你的支持,我希望你这个赛季表现最好!如果您想更深入地了解,请不要忘记查看第 2 部分的主题建模。