您不需要的数据:移除多余的样本
在 ML 中有这样一句话:垃圾进,垃圾出。但是数据好坏到底意味着什么呢?在本帖中,我们将探讨时尚 MNIST 训练集中的数据冗余,以及它如何影响测试集的准确性。
什么是数据冗余?
我们将在下一篇文章中给出更详细的解释,但是让我们给你一个冗余数据的例子。想象你正在构建一个分类器,试图区分猫和狗的图像。您已经有一个 100 只猫的数据集,并且正在寻找一个狗图片的数据集。你的两个朋友,罗伯特和汤姆,提供了他们的数据集。
- 罗伯特上周给他的狗贝拉拍了 100 张照片。
- 汤姆给你看了他去年收集的 100 只不同的狗的照片。
你会选择哪一组狗?
当然,这取决于分类器的确切目标以及它将在生产中运行的环境。但我希望在大多数情况下,你会同意,汤姆和 100 只不同的狗的数据集更有意义。
为什么?
让我们假设每个图像都有一定数量的信息可以贡献给我们的数据集。具有相同内容(相同的狗)的图像比具有新内容(不同的狗)的图像添加更少的附加信息。人们可以说相似的图像有语义冗余。
有一些论文,如《你不需要的 10%》,更详细地探讨了这个问题。
删除冗余数据
像你不需要的 10%这样的文件遵循一个两步程序来发现和删除信息较少的样本。首先,他们训练一个嵌入。然后,他们应用聚类方法,使用凝聚聚类来移除最近的邻居。对于聚类,他们使用常见的余弦距离作为度量。您也可以将要素归一化为单位范数,并使用 L2 距离来代替。
我们需要解决两个问题:
- 我们如何得到好的嵌入?
- 凝聚聚类具有 O(n)的时间复杂度和 O(n)的空间复杂度
作者通过使用提供的标签训练嵌入来解决第一个问题。考虑训练一个分类器,然后去掉最后一层,得到好的特征。
第二个问题需要更多的创造力。让我们假设我们有很好的分离各个类的嵌入。我们现在可以独立处理各个类。对于具有 50k 个样本和 10 个类的数据集,我们将对每个 5k 个样本运行 10 次聚类。由于时间和空间复杂度都是 O(n)和 O(n ),这是一个显著的加速。
WhatToLabel 的启动方式
在 WhatToLabel,我们希望通过关注最重要的数据来更有效地利用机器学习。我们帮助 ML 工程师过滤和分析他们的训练数据。
我们使用同样的两步方法。
我们数据选择算法的高级概述
首先,我们想得到一个好的嵌入。我们的很多努力都集中在这一部分。我们有预先训练好的模型,我们可以使用这些模型作为基础,通过自我监督对特定数据集进行微调。这使我们能够处理未标记的数据。我们将在另一篇博文中解释自我监督部分。预训练模型具有类似 ResNet50 的架构。然而,嵌入的输出维度只有 64 个维度。高维引入了各种问题,如更高的计算和存储时间,以及由于维度的诅咒而导致的更少有意义的距离。
我们训练嵌入的方式仍然可以获得很高的精确度:
ImageNet 2012 val 集上不同嵌入方式的比较
其次,我们希望使用一种基于嵌入的快速数据选择算法。凝聚聚类太慢。我们通过构建一个图来探索局部邻域,然后在其上迭代地运行算法。我们使用两种算法。破坏性的,我们从完整的数据集开始,然后移除样本。另一方面,构造性算法通过一个接一个地添加相关样本来从头开始构建新的数据集。
当我们结合这两个步骤时,我们得到了一个快速过滤解决方案,即使没有标签也能工作。
我们开发了一种产品,你可以在whattolabel.com查看,或者你可以按照这个两步过滤程序建立自己的管道。
对于下面的实验,我们使用 WhatToLabel 数据过滤解决方案。
过滤时尚-MNIST 去除冗余
GitHub 资源库中提供了重现实验的完整代码:https://github.com/WhatToLabel/examples
现在,我们知道什么是冗余,它们会对训练数据产生负面影响。让我们来看看一个简单的数据集,如时尚-MNIST。
时尚-MNIST 在训练/测试集中包含 50k/ 10k。对于下面的实验,我们只过滤训练数据。我们的目标是去除 10%。一次使用随机选择的样本,一次使用更复杂的数据过滤方法。然后,我们针对整个数据集评估各种子采样方法。为了评估,我们简单地训练一个分类器。
实验设置
我们使用 PyTorch 作为框架。为了进行评估,我们使用以下参数训练带有 SGD 的 resnet34:
- 批量:128 个
- 纪元:100 年
为了确保再现性,我们为随机数生成器设置了种子:
为再现性设置随机种子
我们使用 ImageNet 统计数据对输入数据进行标准化,对于训练数据,我们使用随机水平翻转作为数据扩充。此外,我们将黑白图像转换为 RGB。
训练集和测试集的数据转换
为了用不同%的训练数据进行多次实验,我们使用了一个简单的技巧。在数据加载器中,我们使用随机子集采样器,它只从索引列表中采样。对于 WhatToLabel 过滤的数据集,我们提供了存储库中的索引列表。对于随机子采样,我们使用 NumPy 创建自己的列表。
获取实验索引和创建数据加载器的代码
在训练我们的分类器之前,我们希望根据每个类别的样本数量重新平衡交叉熵损失的权重。
基于每个类的样本数重新平衡损失的 Python 代码
现在一切就绪,我们可以开始训练模型了。在 Nvidia V100 GPU 上,每个时期大约需要 15 秒。完成整个笔记本大约需要 75 分钟。
结果
在完成训练和评估过程后,我们应该看到三个不同的情节。在左边的第一行,我们有使用随机二次抽样的两个实验的训练损失。在右边,我们有所有三个实验的测试精度(两个二次采样实验和一个全数据集实验)。在底部,我们仔细查看了 50–100 个训练时段的准确性结果。
显示三个实验的训练损失和测试准确度的图
在时间点 60 和 80 有两次准确性和损失的跳跃。那两次跳跃来自于学习率的更新。如果你仔细观察精确度,你会注意到使用 WhatToLabel 子采样(红色)的实验精确度与使用完整数据集(蓝色)的实验精确度非常相似。使用随机子采样(绿色)的实验精度较低。培训过程的结果支持这些发现。三个实验的最高精度如下:
- 使用 WhatToLabel 子采样的最佳测试精度(90%): 92.93%
- 使用完整训练数据集的最佳测试准确度(100%): 92.79%
- 使用随机二次抽样的最佳测试精度(90%): 92.43%
用更少的训练数据获得更高的精度!?
起初,这可能没有意义。但是让我们回到文章的开头,在那里我们讨论了冗余数据。让我们假设在时尚 MNIST 数据集中有这样的冗余。如果我们删除它们,数据集会更小,但模型通过训练获得的信息不会减少相同的数量。这种冗余最简单的例子是一个看起来相似的图像。但是我们寻找的不仅仅是相似的图像,我们寻找相似的特征激活或语义冗余。
用不同的种子重复实验?
进行多次实验并报告平均值和标准偏差非常重要。也许我们之前的结果只是一个异常值?
我们在 WhatToLabel 有一个内部基准测试套件,可以在各种数据集上评估我们的过滤软件,具有多种训练集大小和多种种子。
whattolabel 与随机二次抽样的时尚-MNIST 检验准确性
我希望你喜欢这篇文章。在我们的下一篇文章中,我们将更详细地讨论数据冗余。
伊戈尔,whattolabel.com
联合创始人
现代分析的黎明——2020 年商业智能工具的一些最新趋势
基于调查的方法来确定每个数据科学家都应该知道的 BI 工具
斯蒂芬·道森在 Unsplash 上拍摄的照片
商业智能(BI)是一个概念,通常涉及组织中适当且有价值的商业信息的交付和集成。公司使用 BI 来检测重大事件,如深入了解客户行为、监控关键绩效指标以及获取市场和销售情报,以快速适应不断变化的动态业务。
BI 构成了所有报告项目的支柱,尤其是在行业决定从孤立的工作方式转变为为所有业务部门创建单一的真实来源之后。70%的工作围绕着数据操作和报告,这就是为什么数据科学家、业务分析师、数据分析师,甚至利益相关者都应该熟悉至少一种自助式 BI 工具。
作者注 —本文见解来源于在线 数据分析调查 。来自数据分析行业不同垂直行业的专业人士的 100 份回答样本用于记录趋势。
背景
Bob 目前是 Cooper Company 的一名数据分析师,Cooper Company 是一家组织德克萨斯州文学博览会的小型组织。Bob 目前使用 MS Excel 跟踪所有活动,包括门票销售、宾客名单、安排、活动时间等等。他们的首席执行官安迪希望将这一活动扩展到其他三个州,鲍勃有权创建一个在线跟踪器,帮助创始人跟踪实时事件。看起来鲍勃是工作中的冠军。但是 Bob 以前从未使用过 BI 工具。鲍勃现在手头有一项艰巨的任务。他需要选择一个具有实时数据操作功能和自助服务分析能力的平台。可怜的鲍勃。在决定平台之前,让我们找出他做的所有研究。
鲍勃的谷歌搜索
一个晴朗的星期五,当公司的每个人都在计划团队出游时,Bob 决定花时间了解 BI 工具的市场和趋势。他对 BI 工具的功能、优势和关注领域做了一些初步研究,以了解他应该使用哪种工具。
商业智能(BI)工具的变化比我们大多数人所能理解的要快得多
BI 工具用于实现以下目标:
- 将数据转化为可操作的见解 —利用现有数据和分析能力推动业务决策
- 随着时间的推移跟踪关键绩效指标 —关键绩效指标包括销售额、收入、流量、访问量、新客户等。
- 在报告的数字中实现粒度 —使用动态过滤器和其他交互式功能允许用户对报告的指标进行自上而下的分析
- 允许同时使用仪表板 —多个利益相关者可以同时使用同一个报告。防止不同业务单位报告的数字不一致
所有商业智能工具的四个重点领域
大多数 BI 工具将继续投入资源,使其平台具有可伸缩性和健壮性。然而,代表数据素养、集中化、分析和性能的 D-CAP 框架仍将是主要关注领域。在深入探讨这些趋势之前,让我们先来看看它们代表了什么。
数据素养—“Gartner 将数据素养定义为在上下文中读取、写入和交流数据的能力,包括对数据源和结构、应用的分析方法和技术的理解,以及描述用例应用和最终价值的能力。”
**集中化—**BI 中的集中化是主要出于治理和安全原因,在一个中央位置或部门存储、管理和维护所有商业智能或数据的系统。该模型确保了数据的准确性、可访问性和规模质量。
**分析—**BI 中的分析就是使用软件和统计数据从原始历史数据中总结关键信息,并提供见解以促进数据驱动的决策。
绩效— 商务智能的绩效包括三个关键方面:
- 后端数据的处理速度
- 数据加载后仪表板(前端)启动的速度
- 仪表板能够处理并发用户吗?
2020 年商务智能工具的发展趋势
鲍勃仍然很困惑
Bob 现在非常清楚商业智能代表什么,但是他仍然需要一个工具来使用!他意识到,虽然有些文章倾向于 Tableau 或 QlikSense,但也有一些文章建议使用 IBM Cognos & Power BI。为了避免任何困惑,他决定调查数据科学家和其他分析专业人士,以了解当今的需求
什么行业用?
调查问题—您最常用的可视化工具是什么?(您可以选择多个)。
共有 97 名专业人士参与了此次调查,并记录了 163 份回复,即平均每个人最终都会使用至少两种商务智能工具。
数据分析—调查结果
调查结果:
- Excel 仍然是最受欢迎的可视化工具,广泛应用于不同的垂直行业
- 与市场上的任何其他 BI 工具相比,Tableau、QlikSense 和 Power BI 更受分析师青睐
- 像 R Shiny、Python (dash 和 plotly)这样需要编码的可视化工具并不是用户的最爱。这说明了为什么自助 BI 工具在今天如此受欢迎
Bob 需要更多数据点
Bob 现在已经将他的工具选择范围缩小到 Tableau、Power BI 和 QlikSense。但是他想比较这三个平台,看看哪一个更符合他的要求。
比较框架
BI 工具的比较
作者说明
该行业正慢慢转向自助式 BI 工具。在与航空公司、医疗保健和保险行业合作时,我注意到 Tableau 和 Qlik Sense 是市场上使用最广泛的两种 BI 工具。Qlik Sense 正在加快步伐,特别是因为它的数据转换功能,减少了对 ETL 工具的依赖。然而,Qlik Sense 的最大挑战是使用扩展来实现更好的可视化。扩展通常是第三方脚本,拥有数据隐私协议的大型组织可能不习惯使用它们。如果你对脚本感兴趣,那么你可以专注于 Tableau 或 Qlik Sense 中的一个,否则拥有 Tableau & Qlik Sense 的工作知识是很好的。
关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;你可以和我在 上联系 和 上推特;
辩论喝酒游戏,用数据科学
利用文本挖掘技术分析特朗普、拜登的演讲
新冠肺炎可能取消了我们的现场辩论观看派对,但这并没有阻止我们用它来做一个饮酒游戏!在我最新的 Youtube 视频中,我使用文本挖掘技术为即将到来的总统辩论开发了终极数据驱动的饮酒游戏规则。这篇文章将带你了解我是如何做到的。
首先,我从竞选集会、演讲和过去几周发生的任何其他活动中搜集了一些抄本,这些活动中拜登或特朗普(或两者都有!)说话了。我搜集的完整事件列表可以在这个项目的 Github repo 中看到(见“辩论. csv”文件)。
我从 rev.com 那里刮来了成绩单(在他们的允许下!)因为它似乎有最详尽的 2020 年选举事件列表,还因为文字记录遵循标准化格式,这使得收集过程更容易。下面是我用来刮抄本的函数:
def scrapeTranscriptFormat1(url, sep):
html = requests.get(url)
html = html.text
bs = BeautifulSoup(html, "lxml")
paragraphs = bs.findAll("p")
for paragraph in paragraphs:
try:
paragraph.find('u').decompose()
except:
continue
speaker = []
speech = []
pattern = r'\[.*?\]' for paragraph in paragraphs:
try:
speechText = paragraph.text.replace(u'\xa0', u'')
speechText = re.sub(pattern, '', speechText)
if sep == "parenthesis":
speech.append(re.search("[0-9]{2}\)[\r\n]+(.*)", speechText).group(1).strip(" "))
else:
speech.append(re.search(":[\r\n]+(.*)", speechText).group(1).strip(" ")) # search for speaker's speech, append to list
speaker.append(re.search("^(.*?):", speechText).group(1)) # search for speaker name, append to list
except:
continue
return pd.DataFrame({'name': speaker, 'speech': speech})
上面的函数接受两个参数——rev.com 上的脚本的 URL 和“分隔符”“分隔符”是指用来表示每行发言人的字符;对于大多数抄本,分隔符是“括号”(例如,遵循下面的格式)。
克里斯·华莱士:( 01:20 )
晚上好,来自……的健康教育校园
如果分隔符不是括号,我假设我写的正则表达式假设它是一个冒号(例如,遵循下面的格式)。根据抄本的格式,您可能需要修改正则表达式。
克里斯·华莱士:
晚上好,来自……的健康教育校园
scraping 函数应该返回一个类似于下面的数据帧。
抄本的数据框架。图片作者。
一旦你收集了所有的抄本并连接了数据框架,我们就可以开始文本分析了!
在开始语篇分析之前,我们必须准备好数据框架。尽管我是从同一个网站上搜集来的文字记录,但命名惯例并不一致——例如,拜登有时被称为“乔·拜登”,有时被称为“副总统乔·拜登”
我只是在 dataframe 的“name”列上调用了 pd.unique(),这样我就可以看到每个候选人的所有名字变化。然后,我创建了一个字典,并使用 pd.replace()替换所有这些变体。
name_variations = {"name":
{
'Chris Wallace':"moderator", 'Vice President Joe Biden':"Joe Biden",
'President Donald J. Trump':"Donald Trump", 'Moderator':"moderator", 'Ilia Calderón':"moderator",
'Joe Biden':"Joe Biden", 'Bernie Sanders':"bernie", 'Dr. Sanjay Gupta':"moderator",
'Amy Langenfeld':"moderator", 'John':"moderator", 'Donald Trump':"Donald Trump", 'President Trump':"Donald Trump",
'Hannah Cannon':"moderator", 'President Donald Trump':"Donald Trump", 'Justin Gaethje':"moderator"
}
}
df.replace(name_variations, inplace=**True**)
然后可以使用下面的“getSpeech”函数和代码来构造语料库。
def getSpeech(name):
candidate = df[df['name']==name].reset_index()
candidateSpeech = ""
for row in range(0,len(candidate)):
candidateSpeech = candidateSpeech + " " + candidate['speech'][row]
return candidateSpeech
candidateSpeech = candidateSpeech.translate(str.maketrans('', '', string.punctuation))
candidateSpeech = candidateSpeech.strip(" ")
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(candidateSpeech)
filtered_sentence = [w for w in word_tokens if not w in stop_words]
filtered_sentence = []
for w in word_tokens:
if w not in stop_words:
filtered_sentence.append(w)
return ' '.join(word.lower() for word in filtered_sentence)biden = getSpeech("Joe Biden")
trump = getSpeech("Donald Trump")
moderator = getSpeech("moderator") corpus = {'Moderator': moderator, 'Biden':biden, 'Trump':trump}
然后我使用 sklearn 库来计算“tf-idf”统计数据。Tf-Idf 代表术语频率-逆文档频率,是计算单词重要性的好方法。它不仅考虑了短语的频率,还贬低了两位候选人可能会说的一般短语(如“谢谢你的问题……”),这确保了最后的短语将是特朗普或拜登独有的。
在计算了语料库中每个对象的 tf-idf 分数并转换了列之后,您将得到如下所示的数据帧:
左:特朗普的得分短语。右图:拜登的得分短语。作者图片。
有几点需要注意:首先,这个脚本只识别三到四个单词短语(不包括停用词)。因此,像“a”、“to”和“the”这样的词被删除了,这使得一些短语变得难以理解。例如,“don know don”的完整短语是“我不知道,我不知道。”“竞选自豪的民主党人”的完整短语是“作为一个自豪的民主党人竞选。”
第二,输出数据帧中的这些短语只有三或四个单词长,这一事实会带来许多问题。这意味着关键的词可能会被省略——“提高税收”的完整短语实际上是“而不是提高税收。”这也意味着较长的短语可能会被分成较小的块,并且在表中出现过多。拜登更常用的一句话是“上帝保佑你们所有人,愿上帝保护军队”,这句话被分成数据框中的第 7、9、10 和 11 行。
最后,tf-idf 分数并不表示频率——它是一个短语的频率和唯一性的组合。这就是为什么“谢谢,谢谢,谢谢”这个词在两位候选人身上都出现了——它不是唯一的,但被说了很多次,以至于出现在了前 10 名中。尽管它是最常见的,但它并不在列表的首位。(值得注意的是,拜登和川普都没有说过这句话。它指的是当主持人说“谢谢你,总统先生。谢谢主席。谢谢您…。”当候选人随时间推移)。
为了计算每个短语被说了多少次,你必须手动浏览你的辩论记录 CSV。或者至少,我是这么做的。
在清理替换停用词和按频率重新排序短语后,我们终于有了周四总统辩论的饮酒游戏规则!
左:拜登的饮酒游戏规则。右图:为川普制定饮酒游戏规则。作者图片。
对其中一些短语感到困惑?我在我的视频中解释了这些短语背后的背景,看看吧!
喝酒开心!请记得喝酒(还有投票!)负责任。
数据科学的十年
从沃森到白宫,看看过去 10 年中最有价值的成就。
对于数据科学来说,这是地狱般的十年——沃森主导了《危险边缘》(Jeopardy)(2011),白宫宣布了第一位首席数据科学家( 2015 ),Deepfakes 提供了所有我们想要的尼古拉斯·凯奇电影( 2017 )。甚至我们学科的名字,数据科学,也是最近 10 年来的。随着 2019 年即将结束,不可避免地会有类似上述日期特定事件的文章和列表。然而,在过去 10 年里,也出现了一些缓慢发展的重要趋势。当我想到现在的数据科学与 2010 年的数据科学相比时,有三个项目引起了我的注意。
1.我们自己的语言
数据科学家通常来自各种背景,数学、天文学或医学。这一切都有助于我们的工作,但拥有许多背景的早期缺点之一是,它导致了编程语言的巴别塔。2010 年初,一场语言战争开始了。STATA、SPSS、SAS、Matlab 和 Mathematica 等付费解决方案与 R、C++、Python、Julia、Octave 和 Gretl 等开源工具竞争。
起初,R 似乎有可能获胜。微软甚至通过收购 Revolution Analytics(一家提供 R 增强版的公司)进行了尝试。尽管处于领先地位,但 2015 年标志着向 Python 的转变。它令人印象深刻的软件包库、简单易学的语法和稳定的性能都对它有利。
来源:谷歌趋势
快进到今天。战争已经结束,新的边界已经划定,Python 是首选语言。这并不是说所有其他语言都死了。r 仍然在统计学中大量使用,根据您的行业,您可能会使用 SAS 或 Matlab。然而,答案十有八九是 Python。这种共享语言的好处不能被夸大。这使得阅读他人的作品更容易,代码也更容易共享。
2.Jupyter 笔记本和 GitHub
搜索任何数据科学主题的教程,你找到的任何文章几乎肯定会包含 GitHub 上托管的 Jupyter 笔记本的链接。这种做法非常普遍,基本上是一种潜规则。理所当然:这是一个强大的组合。Jupyter 笔记本将你的文档和代码合并成一个文件,使得理解是什么和为什么更加容易。将这与 GitHub 结合起来,你不仅有了一种解释你的作品的方法,也有了一种分享它的方式。GitHub 甚至采取措施支持 Jupyter 笔记本,允许它们直接在浏览器中呈现。
一台托管在 Github 上的笔记本电脑,来自 Sentdex 的量子计算
Python 给了我们一种共同的语言,Jupyter 和 GitHub 给了我们一种共同的语法和分享的礼仪。
3.数据集的激增
10 年前,数据要难得多。即使你找到了你想要的主题的数据集,也很可能是很小的。那里有数据,但是没有组织,格式不一致,人们不太可能分享他们收集的数据。在我有 MNIST 或泰坦尼克号数据集之前,我有来自 STATA 的“汽车”数据集。这是一个 1978 年的车辆收集,包括头部空间和燃油效率等功能,并附有高达 74 项观察。
相比之下,现在,你可以让公司把他们的数据公布给全世界。在某种程度上,Kaggle 已经成为企业数据的火种。各公司不再犹豫不决,而是热情地分享数据,希望能从一个热切的年轻定量分析师那里获得一把。地方政府也加大了行动力度。像芝加哥和纽约这样的城市已经使任何人都有可能获得从路况到啮齿动物观察等主题的数据。搜索数据集的资源也有所改进,比如使用了r/datasetssubredit 和 Google Dataset Search 等工具。如果数据是新的石油,那么今天的每个数据科学家可能都有点像中的丹尼尔·戴·刘易斯。
数据科学家查看可供他们使用的广阔信息领域
共同的线索:开放科学
在上述主题中有一条贯穿的线,它们每一个都代表了向开放科学的发展,或者工具、方法和数据应该公开的哲学。我认为,采纳这种理念是我们社区在过去十年中最有利可图的投资之一,有助于我们的成长、扩展我们的能力并提高我们的工作质量。
就增长而言,数据科学的大门现在向所有人开放,而不到十年前,进入数据科学需要付出高昂的代价。在 Python 之前,SAS 是最接近标准语言的东西,在 Jupyter 笔记本之前还有 Wolfram 笔记本。但是这些解决方案不是开放和免费的。根据服务的不同,你可能已经支付了 800-8000 美元,只是为了用“行业标准”工具进行回归。甚至他们的网站也不方便新手使用。访问其中的任何一个网站,你都会看到几十个不同的版本和链接,询问你是否想“获得报价”,这让你的体验不像是一头扎进一个动态学科,而更像是购买一辆二手车。
在过去的十年里,用于数据科学的商业软件已经衰落。我不会声称知道确切的原因,但我会给出我的观点:没有什么比价格标签更能消除好奇心。当我接近本科毕业时,我记得我在想“我喜欢做数值分析,但是我负担不起 STATA。我估计我还是学这个 R 的东西吧。”我不是一个人,有大量的业余爱好者涌入,他们好奇并渴望测试数据科学的水域。
除了容易进入,开放科学还扩展了每个人能力的深度和广度。一个数据科学家不一定是一种资源。有一个巨大的代码库,来自世界各地的贡献者。这可能采取 Python 包、中等教程或堆栈溢出答案的形式。这个代码库使项目更像是混合和匹配乐高积木,而不是从零开始构建。
堆栈溢出是数据科学的难题吗?
这种开放性也有助于保持我们工作的诚实。伴随着数据科学,这十年也给我们带来了短语“复制危机”虽然欺诈性工作没有万灵药,但透明度是一种强有力的预防措施。十年来我最喜欢的文章之一,科学论文过时了,引用了 Wolfram 在谈论笔记本时的一句名言:“这里没有废话。它就是它,它做它该做的。你不能篡改数据。”
向前看,向后看
在某些方面,这不仅仅是数据科学的好十年,而是数据科学的十年。我们进入了 2010 年代的时代精神。我们被授予最性感职业的称号,我们得到了布拉德·皮特和乔纳·希尔的电影,数百万人看到 AlphaGO 成为世界冠军。在某些方面,我觉得这十年是我们走向成熟的十年。虽然下一个十年将带来许多改进的工具和方法,但 2010 年将是我带着喜爱和怀旧的感觉回顾的时候。
深度学习的进化
探索深度学习在过去几十年的成长!
Frank Rosenblatt 的感知来自 Reddit (左)&ann 来自神经网络和深度学习(右)
我们大多数人都知道深度学习是 21 世纪的发明,但信不信由你,它自 20 世纪 40 年代就已经存在了。
我们大多数人不知道 20 世纪深度学习进步/研究的原因是因为当时使用的方法由于其各种缺点而相对不受欢迎,并且事实上从那时起它已经有过几次重新命名。
任何领域的新的原创研究都需要了解导致该领域普及的历史、演变和重大突破。深度学习也不例外。
纵观深度学习的历史,可以发现三大进步浪潮:
控制论——1940-1960 年
连接主义——在 1980-1990 年间
深度学习—自 2006 年以来
在前两次浪潮中所做的研究由于其缺点受到批评而不受欢迎,然而,毫无疑问,它帮助该领域发展到今天的位置,并且在那些时间中开发的一些算法直到今天仍广泛用于各种机器学习和深度学习模型。
让我们更详细地探讨一下这三种波,以获得一些视角。
控制论
是现代深度学习最早的前身,基于 生物学习——人脑如何学习的思想。以控制论的名义取得的进步是基于在更简单的计算模型中复制人类/动物大脑工作的目标,这将有助于建立像真正的大脑一样开始学习的系统,并在给定一些输入的情况下提供结论。这种思维模式下的进一步研究在计算神经科学下继续进行,直到现在。
控制论的发展拉开了 麦卡洛克-皮茨神经元 的序幕。这是一种模仿生物神经元的尝试。这是基于一个线性模型,将采取各种投入[X1,X2 …Xn],对于每个输入,模型有一些权重[W1,W2 … Wn]和输出 f(x,w) = X1W1 + X2W2 + …。+ XnWn。该模型只能根据输入和权重输出真/假。
麦卡洛克-皮茨模型从走向数据科学
权重需要正确设置,并由人工输入。
后来在 20 世纪 50 年代, 感知器 由美国心理学家 Frank Rosenblatt 开发,可以自动学习权重。感知器最初被设计成一个电机,而不是一个程序/软件。Frank 为图像识别建立了感知器,它包含连接到多个神经元的光电池(接收器),这些神经元将对光电池捕获的输入进行分类。
感知器来自维基百科
虽然感知器在当时是一台非凡的机器,但它做出了当时无法实现的大胆主张。
ADALINE—由Bernard wid row开发,被称为自适应线性元件,它大约与感知器同时开发,也可以在学习阶段适应基于输入加权和的权重。
ADALINE 来自 mlxtend
ADALINE 的学习函数类似于目前线性回归中使用的 s 到随机梯度下降。
这些线性模型有各种各样的局限性,看到这些局限性的批评家们导致了它们的受欢迎程度大幅下降,并使研究停滞了一段时间。一个主要的限制是这些线性模型不能训练异或函数。
因为这些模型受到神经科学研究的启发,它们受欢迎程度的下降也激发了对神经科学基础之外的模型的探索。
连接主义
或者说 并行分布式处理 在上世纪 80 年代开始流行。这种方法受到了认知科学的启发。与 20 世纪 80 年代被称为古典主义者的科学家们正在探索的各种符号推理方法相比,联结主义显示出了希望。
即使我们从更抽象的角度来看大脑,符号推理方法也很适合,但很难用经典的编程模型来明确实现。因此,实用连接主义者认为他们的工作是利用神经网络来实现与符号推理相似的效果。
但是激进的联结主义者简单地抛弃了符号推理的想法,声称它无论如何也不能解释我们大脑的各种复杂特征,并且是对人类大脑的不正确的认知。
人工神经网络 (ANNs)的概念就是在这一波浪潮中引入的。人工神经网络背后的主要思想是开发一个由个体单元组成的网络,这些个体单元可以被编程以实现智能行为。这是第一次引入隐藏层的概念。
相互连接的人工神经元网络允许沿着网络的不同分支分布的并行信号处理。“神经元”单位的连接包含了控制一个神经元对另一个神经元的影响强度的权重。
****安来自维基百科
这种方法被认为与我们神经系统内部发生的事情非常相似,这在研究人员中引起了一些关于这些模型有效性的 hipe。
在这一波连接主义期间,各种模型,如 LSTM 、分布式表示和处理、反向传播被开发出来,并继续成为深度学习的各种高级应用的关键组件。
但在 20 世纪 90 年代中期,基于人工智能的初创公司开始提出不切实际的主张,并且由于缺乏计算资源,永远无法从这些模型中提供那种复杂程度。投资者撤出,这导致了第二波深度学习的下降。
第二波从未消失,但被削弱了。各种实验室都在进行研究,但直到 2000 年代初,应用非常少。
深度学习
经过两次下跌后,第三波在 2006 年出现突破。杰弗里·辛顿使用贪婪的逐层训练来训练深度信念网络。
在最简单的形式中,DBN 是多个隐藏层的组合,每一层包含各种潜在变量。连接存在于 b/w 层中,但不存在于每层内部的变量之间。DBN 的一个非常简单的实现也可以叫做受限玻尔兹曼机器。
****受限玻尔兹曼机来自维基百科
杰弗里·辛顿的进步被其他研究人员用来训练不同类型的深度网络。这使得世界各地的研究人员能够训练越来越深的神经网络,并导致了术语 深度学习的普及。
虽然 Geoffrey Hinton 似乎导致了深度学习的出现,但你不能忽视计算能力和大型数据集可用性的增加。当在越来越大的数据集上训练时,在连接主义期间开发的相同算法开始给出更好的结果。
当时和现在的区别在于,随着越来越多的人使用在线服务,我们有了更多的数据和更多的计算资源来处理这些数据,从而提高了各种模型的准确性。
深度学习更有趣、更复杂的应用正在浮出水面,但仍处于实际应用的早期阶段。例如,深度学习已被用于开发大脑的 3D 地图(连接体),以帮助神经科学家和认知科学家研究大脑。制药公司开始使用深度学习来预测不同分子将如何反应,并帮助加速药物开发。
结论
今天,深度学习在性能上超过了各种机器学习方法,并被广泛用于各种不同的任务。与其他方法相比,深度学习提高了语言翻译和图像识别等任务的准确性。但这不是/不可能在几年内发生,而是需要几十年!
尽管深度学习自 20 世纪 40 年代的第一个前身以来已经发展了很多,但记住它从何而来以及它是如何随着时间的推移而发展的非常重要,因为它仍然有很长的路要走。研究早期的构建模块有助于开发深度学习未来的新应用(站在巨人的肩膀上)。
如果有任何话题能引起你的兴趣,我会试着添加一些书籍和文章。如果你想要我的建议,一定要试试马文·明斯基的【T2 感知机】。它深入研究了弗兰克·罗森布拉特的感知机。
资料来源和进一步阅读
书
文章
** [## 麦卡洛克-皮茨神经元——人类第一个生物神经元的数学模型
众所周知,深度神经网络的最基本单元被称为人工神经元/感知器…
towardsdatascience.com](/mcculloch-pitts-model-5fdf65ac5dd1) [## 深度信念网络
深度信念网是一种概率生成模型,由多层随机的、潜在的…
www.scholarpedia.org](http://www.scholarpedia.org/article/Deep_belief_networks) [## 人工神经网络中的反向传播是如何工作的?
自从机器学习的世界被引入到递归工作的非线性函数(即人工…
towardsdatascience.com](/how-does-back-propagation-in-artificial-neural-networks-work-c7cad873ea7) [## 用单一感知器求解异或
提倡多项式变换作为增加人工神经元代表能力的一种方法。
medium.com](https://medium.com/@lucaspereira0612/solving-xor-with-a-single-perceptron-34539f395182)**
如何制作德国“绿酱”的 ML 方法
一个关于如何准备传统食物的 fast.ai 教程
法兰克福附近奥芬巴赫的一家非常独特的黑森餐厅——照片由 Pia Scharf 拍摄
你有没有想过神奇的关键词深度学习会如何影响你的生活——除了自动驾驶汽车、辅助服务和图像识别之外,1984 年令人恐惧的科幻场景突然不知何故变成了现实?这里有一个想法:使用深度学习来准备一道传统菜肴。让我提前说一句:我不认为当传统转化为对未知未来的恐惧时,或者当传统转化为对漫长(可能并不那么辉煌)过去的模糊记忆时,它就达到了最佳潜力。当传统有助于享受日常生活时,例如当它变成美味的食物时,它最能发挥潜力!在我看来,传统往往不是必需品,而是奢侈品。但这是另一个值得写的话题。
然而,由于深度学习技术非常强大,并且有许多潜在的用例,我试图包括我从杰瑞米·霍华德和雷切尔·托马斯的 fast.ai 课程中学到的一些东西。我问自己:机器学习如何帮助我更好地理解身边的日常事物?我能通过让传统可见来揭开它们吗——至少对我来说?在我看来,传统的关键在于我们每天周围的许多事情。在这个例子中,我想使用图像分类算法来分享过去的知识。
典型的黑森州:来自黑森州酒罐的苹果酒叫做“BEM bel”——照片由 Pia Scharf 拍摄
差不多十年前我搬到了法兰克福。起初,我对法兰克福 Hessestub 提供的食物和饮料非常陌生。在这些古老的餐馆里,有大量装在原装黑森州瓶里的苹果酒,即所谓的“bembel”。人们经常一起坐在木制长椅上的大桌子旁,餐馆里很拥挤,通常很吵。所以你坚持喝苹果酒,点非常原始和厚重的菜,这些菜可能是由一个非常快速但不那么友好的主人提供的(有时我认为他们讨厌友好——这让游客的整个体验更加有趣)。如果你要一份“原始黑森地区餐”,主人只是摇摇头,因为他们提供的一切都是地区性的,他或她不知道你的要求是什么意思。
如果你碰巧去了法兰克福或黑森州,我想给你一些建议:试试绿酱。黑森州人偶尔会把它和肉(如炸肉排)一起端上来,但通常只有土豆一起端上来。人人都爱。如果你带着它去野餐,这就是绿酱的样子:
黑森绿酱——照片由 Pia Scharf 拍摄
法兰克福绿色酱包含七种香草:欧芹、细香葱、山萝卜、琉璃苣、酸模、水芹和沙拉地榆
除非你有超能力,可以说服厨师(和德国老奶奶)改变传统食谱:忘记添加或改变这些草药中的一种。这是传统。香草是问题的核心:所以要做绿色酱汁,我们需要能够识别和收集这七种香草!我们制作绿色调味酱所需的所有香草都可以在法兰克福附近找到,它们生长在城市附近的田野和森林中。我已经告诉过你关于德国祖父母的事情:直到今天,一些年长的公民仍然确切地知道在哪里可以找到做绿色调味汁的草药。如果你想知道它们生长在哪里,你可以参加地区性的课程,尤其是在夏天。专家将向你展示只有到过那里的人才能发现的秘密景点。但我不想等待:我的目标是为我和我的朋友建立一个小助手,以确定制作我们自己的绿色酱所需的草药。我们开始吧!
深度学习是我选择的解决方案,它是我的人工祖父母,指引我找到荒野中的宝藏。
德国绿酱中使用的七种香草——照片由 Pia Scharf 拍摄
O ur 问题是一个分类问题。所以我们想知道我们找到的草药是否与制作绿色酱汁有关。我们打算将它们归类为欧芹、细香葱、山萝卜、琉璃苣、酢浆草、水芹和沙拉用地榆。作为我们的小算法助手的输入,我们选择图片。一旦我们到了地里,我们就可以拍下我们想要识别的植物或叶子的照片,并“展示”给我们的程序。简而言之,我们希望建立一个模型(一种数学抽象),通过对输入图像进行分类,告诉我们该图像对应于哪一类。
我们将要工作的环境是一个 jupyter 笔记本。Fastai 是一个位于 Pytorch 之上的库(library =工具/代码部分的集合),py torch 是一个非常强大的机器学习库,使用 Python 代码。如果你从未听说过这些东西:Python 是我们编写代码的语言,Pytorch 和 fastai 是我们正在使用的工具,jupyter notebook 帮助我们组织代码。有关设置的更多信息,请访问 fastai 网站。
我们打开 jupyter 笔记本,输入:
from fastai import *
from fastai.vision import *
这样我们就拥有了 fastai 库的所有图像识别功能。接下来,我们要确保我们可以训练我们的网络。通过向神经网络提供数据,我们希望建立一个数学表示(模型),然后我们可以用它对发现的植物/叶子的新照片进行分类。
我们的模型不知道欧芹是什么,它从未见过绿色酱汁或任何类似的东西。为了训练一个模型,我们向它展示一系列带有正确标签的照片。这就是为什么我们首先要创建七个文件夹,分别贴上七种不同的标签:欧芹、细香葱、山萝卜、琉璃苣、酸模、水芹和沙拉地榆。
第一步:获取数据集
因此,我们打开 chrome 浏览器,进入谷歌图片搜索,输入:比如“欧芹”。然后我们得到大量欧芹的图片并向下滚动。然后我们按 Shift+Control+j 打开浏览器的 Javascript 控制台。我们输入:
urls = Array.from(document.querySelectorAll('.rg_di .rg_meta')).map(el=>JSON.parse(el.textContent).ou);
window.open('data:text/csv;charset=utf-8,' + escape(urls.join('\n')));
当我们点击 enter 时,我们下载了一个包含欧芹谷歌图片的所有 URL 的文件。我们将它保存在“欧芹. txt”下,并继续使用其他六种草药。太好了!准备好输出数据集链接。我们将所有文本文件放在一个名为“seven _ herbs”的文件夹中,并确保它位于我们主目录的 data 文件夹中(否则 fastai 不会找到它)。
第二步:下载图像文件
接下来,我们将数据直接下载到我们正在处理的服务器上。Fastai 需要知道我们的数据集所在的路径。在某些环境下,这一步可能会有所不同——例如,如果您正在 kaggle 的内核中工作。如果你纠结,可以在 kaggle 上访问我的入门内核。
path = Path('data/seven_herbs')
后来,我们将草药的名称分类。
classes = ['borage', 'chervil', 'chives', 'garden_cress', 'parsley', 'salad_burnet', 'sorrel']
接下来的步骤看起来有点复杂,实际上非常简单。它只获取文本文件并做两件事:为每个类(又名 herb)创建并命名一个文件夹,然后用同名文本文件中定义的图片填充这个文件夹。(在 kaggle starterset 中,您不需要执行这些步骤,因为我已经将数据集附加到了内核。)
for x in range(0,7):
dest = path/(classes[x])
dest.mkdir(parents=True, exist_ok=True)
download_images(path/(classes[x]+str('.txt')), dest, max_pics=200)
然后,我们检查我们的文件,以确保它们没有损坏或链接没有错误。以下代码将清除那些无法正确打开或下载的文件。
for c in classes:
print(c)
verify_images(path/c, delete=True, max_workers=8)
第三步:创建一个 ImageDataBunch
现在越来越严重了。我们通过创建一个 ImageDataBunch 对象开始处理数据。通过这种方式,我们可以处理数据,并在以后训练我们的模型。np.random.seed(13)定义了从我们的训练数据中随机选择哪些图像。(如果我们想以同样的方式再次训练模型,我们只需要这一行代码。)我们的 ImageDataBunch 是通过传递包含照片数据的文件夹的路径创建的。我们定义了一个代表 20%数据的验证集,并定义了图像的大小。
np.random.seed(13)
data = (ImageList.from_folder(path)
.split_by_rand_pct(0.2)
.label_from_folder()
.transform(tfms, size=128)
.databunch())
接下来,我们还需要将我们的类分配给 ImageDataBunch。
data.classes
如果我们输入下面的代码,ImageDataBunch 就会出现,我们可以查看我们的数据。
data.show_batch(rows=3, figsize=(7,8))
步骤 4:训练模型
开始训练吧!首先,我们加载 vision.learner,一个保存 cnn_learner 的模块:想象这是一个预训练的神经网络,它在一个大型图像数据集上进行训练。接下来,我们将“迁移学习”作为一种技术——我们向 cnn_learner 展示我们的数据集,以便它学习七种草药的具体细节。
from fastai.vision.learner import create_cnn,models
from fastai.vision import error_rate
最后:让我们创建我们的模型——我们的标签和图片之间相关性的数学表示。
learn = create_cnn(data, models.resnet34, metrics=error_rate)
所以我们从 Fastai 库下载了预训练的模型。接下来,我们要根据数据调整模型。为了确保我们可以在以后保存我们的结果,我们在四个训练周期后直接保存模型。
learn.fit_one_cycle(4)
learn.save('green-sauce-stage-1')
在这个过程之后,我们得到了一个结果,显示错误率为 0.33,这意味着在 33%的情况下,模型仍然会出错。我们想进一步了解这意味着什么:
learn.unfreeze()
learn.lr_find()
learn.recorder.plot()
这个图向我们展示了学习率和我们训练好的模型的损失。如需进一步解释,请查看,例如这里的。简而言之,损失函数向我们展示了我们的模型做得有多好。对于每个预测,图表向我们显示了我们的模型做出的预测和照片持有的实际标签之间的绝对差异。(记住:我们所有的训练数据都是有标签的)。根据经验,我们总是想在情节中寻找一条下坡路。如果我们看从 1e-5 到 1e-3 的部分,似乎那里的模型仍然在变得更好。在 1e-3 之后不久,梯度再次非常快速地上升,这意味着错误率也再次增加。我们可以通过进一步训练来改进我们的模型。
learn.fit_one_cycle(2, max_lr=slice(1e-5,1e-3))
learn.save('green-sauce-stage-2')
第四步:解读结果
在所有这些训练之后,我们想知道我们做得有多好。我们解释我们的结果。
interp= ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()
混淆矩阵向我们展示了基于模型做出的预测和图像的实际标签之间的关系。正如我们所看到的,在大多数情况下,模型做出了正确的决定:特别是,韭菜图像在 33 个案例中被正确识别。失败者是山黧豆和酢浆草:山黧豆,一种比长而光滑的细香葱更不容易被人眼识别的草本植物,不那么令人惊讶,而酢浆草,至少让我惊讶的是,已经被神经网络几次误认为是花园水芹。最混乱的列表也指出了这一点:
interp.most_confused()
由此可见,训练中出了问题。总的来说,我们的模型还不错,尽管我们当然还可以做很多事情来改进我们的结果,例如:
- 通过删除图像搜索中出现的图像来改进我们的数据集,但这些图像并不完全符合我们的预期结果(例如 fastai 库的 FileDeleter 小部件)。).
- 通过训练更多/用更多数据/用其他数据,使我们的模型更加适合
- 设计更好的验证集。在这里阅读更多
现在,我们就这样宣布:我们准备好了!我们已经建立了自己的神经网络。你可能会想:‘好吧,太好了,但是我如何拍摄一种药草,并展示给我训练有素的网络?’
测试:我想把这张照片展示给我的网络——照片由 Pia Scharf 拍摄
第五步:建立网站
请记住,我们的目标是有一个网站,我们可以上传图片。现在需要一个界面设计。(在本教程中,我们不会在设计本身上花时间,但在接下来的几个教程中可能会花时间。)为了简单起见,我们希望创建一个只能接收一个图像的图形用户界面。我们希望我们的服务可以随时通过互联网访问,所以我们制作了一个简单的主页,只有一个交互选项,即分析照片。为了让我们的小应用程序可用,我们使用了渲染。这是一个云提供商,你可以用它来提供应用和网站。
首先,我们需要导出我们的模型。这就是 kaggle 内核的样子:
learn.load('green-sauce-stage-2')
learn.export(file = Path("/kaggle/working/export.pkl"))
这将在我们的数据结构中添加文件“export.pkl”。我们把文件下载到硬盘上。接下来,我们将它推到一个 google drive,并确保它对任何人都是免费的(否则下面的命令将不起作用)。我们使用这个直接链接生成器,所以下载我们的文件自动从点击链接开始。
为了使用 Render,我们需要将我们想要‘渲染’的项目上传到 github 。如果你不知道 github:它基本上是一个人们共享代码的地方。github 的伟大之处在于,你会发现很多不错的项目,你可以把它们作为你自己项目的起点。
在这种情况下,我们使用 anurag 的库作为基础,并利用它创建自己的。如果你在 anurags 仓库点击“fork ”,你会在你的 github 账户中找到他的仓库。然后您可以修改它(重命名,输入您的代码)并“提交”更改(不要担心——这只会更改您的“分支”——换句话说:您的存储库版本)。如果你想详细了解 github 的工作原理,我强烈推荐你阅读 github 指南。
因此,在分叉一个 anurags 存储库之后,您可以将其重命名为“green-sauce ”,我们需要做两件重要的事情来使代码工作:
- 我们需要编辑文件“server . py”(green-sauce/app/server . py),这样我们的应用程序就可以找到模型的直接下载链接。我们还修改了 classes-section 并输入了我们七种草药的名称(又名 class)。然后,我们点击“提交更改”。
export_file_url = 'https://YOUR-DIRECT-DOWNLOAD-LINK'export_file_name = 'export.pkl' classes = ['borage', 'chervil', 'chives', 'garden_cress', 'parsley', 'salat_burnet', 'sorrel']
- 我们修改 index.html(green-sauce/app/view/index . html)。我们可以通过改变括号之间的文本来改变网页的标题(例如this text),并且我们可以在括号< p >之间写一些描述文本。我们还“提交”变更
如果我们想改变颜色、字体或其他视觉元素,我们可以修改 css 文件。我们一完成,就继续渲染。
在 render 的仪表板上,我们单击“新建 web 服务”图标。在那里,我们输入我们的存储库 github-address。你可以在 https://github.com/piaoyapia/Seven-Herbs 的找到我的 github 知识库。如果你想渲染你自己的应用程序,把环境下拉菜单留在“Docker”上。就是这样。Render 会搞定剩下的!
第六步:测试网站
最后,我们完成了,我们可以测试我们的网站!如果您一直跟着做,那么现在您可能已经有了自己的版本。不然就测测我吧。
于是上传了一张我拿着香菜的照片。然后我点击了“分析”。从视觉上看,结果并不那么壮观,但至少它是正确的:网络将药草识别为欧芹。耶!🎉
你可以在 https://seven-herbs-green-sauce.onrender.com访问我的应用版本
任务完成——我们有了寻找草药的模型。理论上,我们可以去法兰克福的田野里,分辨生长在那里的七种不同的草药。你可能已经注意到了,我们没有一个类叫做当这些草药都不出现在我们的镜头前的时候。这意味着,即使我们拍摄了一只可爱的小猫,我们的神经网络也会看到图片中七种草药中的一种。总之,我不建议——我也不对任何损害负责——在现实生活中使用这个网站。相反,这个项目旨在激励人们寻找使用机器学习概念的方法,这些概念可以告诉我们一些关于我们生活的世界的事情,而这些事情是我们在日常生活中没有想到的。寻找绿色调味酱的草药当然不是一个世界难题,但它背后有文化。如果你读到这里,你可能不仅学到了一些关于机器学习的知识,还学到了一个古老的德国食谱。让我们在未来的项目中结合旧知识和机器学习——在比饮食文化更重要的领域!
深度学习专业化
Coursera 与吴恩达深度学习专业化述评
Andrew ’ s NgCoursera 上的深度学习专业化 是网上最著名的机器学习课程之一。许多数据科学家或机器学习工程师在其 Linkedin 的课程部分列出了这一专业。在这篇文章中,我们将探索它的内容,看看它是什么,不是什么,并澄清所有围绕它的炒作。我们开始吧!
我最近完成了这个专业,想分享我的经验,拨开迷雾,澄清它是什么,它不是什么,并帮助其他人做出是否接受它的决定。
注 :我对任何报名参加任何深度学习课程的人都没有任何好处。这篇文章的唯一目标是总结这种专业化,并提供关于它的诚实而深入的评论。
这是什么?
来自 Flaticon 的机器学习图标
吴恩达的 深度学习专门化 可能是互联网上最著名的机器学习课程。它可以在 Coursera 上获得,它涵盖了成为神经网络专家所需了解的一切内容:从它们的基本形式,到如何构建深度学习项目和图像识别和自然语言处理的最先进网络:卷积和递归神经网络。
它分为 5 个不同的课程,每个课程大约 3-4 周。然而,这个持续时间是相对的,因为它取决于你每天/每周花在课程上的时间。对我来说,我通常可以在大约半周的时间内完成一周的课程,所以我可以在不到两周的时间内完成一门课程。
这类课程的一个主要优势是它们提供的灵活性,所以我建议你花点时间去做,试着深入学习并对内容进行自我测试。
是给谁的?
来自平面图标的学生图标
这个专业面向拥有数据科学和机器学习知识的人,因为它探索了机器学习的一个特定分支:深度学习和人工神经网络。如果你想了解一般的机器学习,并向这个世界迈出第一步,吴恩达还有一门非常著名的课程:机器学习专门化,你应该考虑提前选修。
参加机器学习专业化然后深度学习是一个非常流畅的过程,会让你成为一个准备非常充分的机器学习从业者。
先决条件
从平面图标中列出图标
用吴恩达在莱克斯·弗里德曼采访中的话说(这是一个精彩的演讲,关于人工智能、教育和努力工作,我将在这一段中留下),为了轻松完成这一专业化,你需要知道基本的编程(用 Python),并对数学有非常基本的理解(甚至高中数学就足够了)。
安德鲁对莱克斯·弗里德曼的采访
然而,正如我之前提到的,从我的角度来看,如果你已经熟悉了机器学习及其主要概念,你将充分利用这种专业化。
内容
来自平面图标的内容图标
该专业由 5 门课程组成,每门课程分为不同的周。这些课程如下:
- 课程一:神经网络与深度学习 。解释如何从一个简单的神经元逻辑回归到一个完整的网络,包括不同的激活功能,向前和向后传播。关于人工神经网络如何工作的最基本的信息将在本课程中解释。
- 课程二:改进深度神经网络 : **超参数调优、正则化和优化。尽管不是一门精确的科学,但这门课程提到了如何调整学习速率、层数以及每层中神经元的数量。**然后介绍了剔除和批量归一化等正则化技术,最后是讨论随机梯度下降、动量、RMS Prop 和 Adam 优化算法的优化部分。
- 课程三:结构化机器学习项目 。对我来说,这门课程对数据科学家/工程师来说是最有帮助的。这都是关于如何建立你的项目,快速获得结果,并迭代改进这些结果。它为如何诊断我们的模型的结果提供了令人愉快的见解,以便我们可以看到性能问题来自哪里(如果有的话):小的训练集、训练和测试集的不同分布、过度拟合和其他问题,以及它们的解决方案。
- **课程四:卷积神经网络。**本课程是关于图像识别网络的最新发展。它涵盖了 CNN 如何工作,CNN 的不同风格,还详细介绍了它们的起源。然后,它解释了不同的用例,如对象识别,人脸验证,人脸识别,或神经类型转移。
- 课程五:序列车型 。所有关于递归神经网络:它们如何工作,为什么它们在一些特定的任务中优于传统网络,以及不同类型的优缺点。RNNs,LSTMs,gru 的解释,以及他们如何用于像语音识别,自然语言处理和时间序列分析和预测的任务。
课程结构
来自平面图标的结构图标
正如前面几次提到的,课程分为不同的周:从最短的 3 周到最长的 5 周。每周包含几个短视频(时长大约从 3 分钟到 15 分钟不等)一个小测验和一个编程练习。
视频以快速介绍开始,然后是一系列涵盖技术内容的幻灯片,最后是对已解释内容的精彩总结,有时还有后续视频的简短通知。它们很有教育意义,而且因为时间长,一点也不难看。其中一些可以在视频速度超过正常速度的情况下被完全理解。
测验有一个类似考试的结构,有关于那一周内容的单项选择和多项选择问题。它们并不是非常难,但是你确实需要很好地理解所解释的内容,并仔细注意这些问题。为了能够在课程中取得进步,你需要在这些测试中获得至少 80/100 的分数,但是你可以想做多少次就做多少次,所以不要担心不及格。
最后,我们有编程练习。他们被呈现一个笔记本结构,在那里一周所涉及的材料被划分和解释,有代码块让我们不需要编辑就能运行,而其他的我们必须为某个任务编程。它们是复习概念理论和学习如何在实践中实现它们的绝佳材料。它们的难度相差很大:在前两门课程中,笔记本相当容易,大多数时候代码几乎完全给你了。课程 IV 和 V 有更难的笔记本,上面有挑战你的 Tensorflow 网络实现。同样,这些笔记本是有分数的,你需要一个最低分数才能通过。
在最初的课程中,每周都以一次名为 “深度学习的英雄 ”的采访结束,吴恩达在采访中采访了该领域的某个顶级人物。这是一个很好的补充,绝对值得观看这些视频。
最后,在每门课程结束时,会给你一张证书,证明你已经成功完成了课程。
概述和意见
来自平面图标的意见图标
我认为格式很棒,有短视频、快速判断题和笔记本**。较长的视频会让人感觉乏味且永无止境,通过这种方式,你可以真正感觉到自己在进步。这也有助于清楚地区分不同的内容,如果学生愿意,他们可以更深入地学习任何内容。**
此外,在课程中,涵盖了许多实际案例,讲座通常以真实世界的例子来支持理论,在我看来,这很有帮助,对巩固所获得的知识非常有用。从这个意义上说,第三个课程特别好,有真实的用例作为练习。
我还喜欢的是,尽管有相当坚实的数学基础,但讲座更多地坚持每个优化/结构/方法解决的不同方面,而不是这些数学。它还在培训和应用之间做出了明确的区分,这是为了成为令人敬畏的机器学习实践者而在我们的思维方式中创建的基本分离。
总的来说,我认为专业化是学习深度学习和人工神经网络的一个好资源。它包含大量的材料,测验和笔记本真正测试你对内容的理解。
我唯一怀念的是一种期末项目,可能在每门课程结束时,或者在专业结束时,你必须自己从头开始编写整个项目的代码,然后由审校修改。我知道由于学生人数众多,这样做是不可能的,但也许可以提出一些其他建议。
对我来说,这绝对是值得的时间和金钱,我希望我可以把我所学到的审判很快!如果你也有兴趣做,可以在 Coursera 上找。好好享受吧!
就这些,我希望你喜欢这篇文章。随时 在 Twitter 上关注我 在***@ jaimezorno****。还有,你可以看看我在数据科学、统计学、机器学习上的帖子**这里 。好好读!*
阅读詹姆·佐诺扎在媒介上的作品。数据科学、机器学习与生活。每天,詹姆·佐诺扎和…
medium.com](https://medium.com/@jaimezornoza)*
人工智能监控的权威指南
从我们的工作中学习跨深度学习和机器学习用例为团队创建生产可见性
图片来自 Shutterstock (标准许可下)
本文与 Itai 吧 Sinai 合著。
各垂直行业的人工智能团队强烈同意,他们的数据和模型必须在生产中受到监控。然而,许多团队很难准确定义要监控的内容。具体来说,在“推断时间”收集什么数据,跟踪什么指标以及如何分析这些指标。
人工智能系统的多样性和复杂性决定了“一刀切”的监控方法是行不通的。然而,我们在这里提供一些清晰度,并讨论普遍适用的方法。
在与多个垂直行业的团队(以及深度学习和机器学习)合作后,我们听到了一些一致的动机,包括:
- 希望更快地解决问题
- 强烈需要从“被动”转变为“主动”,即在业务 KPI 受到负面影响或客户抱怨之前检测数据和模型问题
那么,你应该如何跟踪和分析你的 AI 呢?
1.定义模型性能指标
为生产人工智能获得成功的客观测量需要你的推断数据的标签或“基础事实”。可能出现这种情况的几个例子包括:
- 人在回路的机制,注释者、客户或第三方至少标记一个推理数据样本。例如,欺诈检测系统接收实际欺诈交易的列表(事后)。
- 商业 KPI 可以提供一种“标签”。例如,对于一个搜索或推荐模型,您可以跟踪点击或转换(与每个推断联系在一起)。
顺便说一句,后者可能导致监控的圣杯——能够精确地评估模型对业务结果的影响(积极的或消极的)。
标签的可用性使得能够计算和分析常见的模型验证指标,例如假阳性/假阴性率、误差/损失函数、AUC/ROC、精确度/召回率等。
需要注意的是,上面提到的标签通常在推断时不可用。可能在模型运行(例如,用户点击推荐的广告)几秒后,但也可能在模型运行(例如,商家向欺诈系统通知真实的欺诈交易)几周后,“基本事实”反馈才可用。因此,人工智能监控系统应该能够异步更新标签(和其他类型的数据)。
关于监控注释器的说明
不用说,被标记的数据的好坏取决于标记过程和标记它的注释者。具有前瞻性思维的人工智能团队利用监控能力来评估他们的注释过程和注释者。你会怎么做?一个例子是跟踪模型和注释器之间的平均差值。如果这个度量超过了某个阈值——我们可以假设要么是模型表现不佳,要么是注释器出错了。
“…监控的圣杯——能够精确评估模型对业务成果的影响(积极或消极)。”
2.建立模型输出的粒度行为指标
跟踪模型输出是必须的。
从一个角度来看,输出行为可以指示通过查看其他地方几乎检测不到的问题(即,模型的高灵敏度可能意味着输入中几乎检测不到的变化可能真的“脱离模型”)。从另一个角度来看,输入要素可能会发生重大变化,但不会对输出行为产生太大影响。因此,基于产出的指标是监控范围内的首要任务。
以下是从模型输出中创建的一些指标示例:
- 原始分数的基本统计分析,例如欺诈概率分数的周平均值和标准差
- 置信度得分/区间,例如,
- 距决策边界的距离(例如,距 SVM 模型中的超平面,或使用简单阈值时)
- 多类别分类模型中所选类别和第二位置之间的差值
- 在分类模型中,所选类别的分布
- 未分类的比率(即,当您的班级没有一个分数超过您的阈值时)
总的来说,基于输出创建的度量中的异常告诉团队有事情正在发生。为了理解原因,以及是否和如何解决正在发生的事情,团队应该将功能和元数据包括在监控范围内。以下是更多相关信息。
3.单独或作为一个集合跟踪要素行为
跟踪特征行为有两个目的:
- 解释在输出行为中检测到的变化
- 检测上游阶段的问题(例如,数据接收和准备)
当在输出行为中检测到问题时,可能会调用特性来解释原因。在这种情况下,解释问题的过程可能需要进行特征重要性分析,利用一系列流行的方法,如 SHAP 和莱姆。
另外,跟踪功能行为的变化是另一种不看输出就能发现问题的独立方法。那么,哪些上游事件可能表现为异常特征行为?太多了,数不过来。一些例子包括:
- 新客户涌入等业务变化
- 外部数据源的变化(例如,新浏览器、新设备)
- 先前管道中引入的更改,例如,数据摄取代码新版本中的错误
由于上述原因,收集和分析生产中的特征行为是监控范围的关键部分。
4.收集元数据以正确划分指标行为
到目前为止,我们已经讨论了为了创建行为度量而收集的数据类别。这些指标可以在全球范围内进行跟踪和分析。然而,为了真正实现监控的价值,必须考虑模型运行的子部分的行为度量。
例如(有点琐碎),广告服务模型可能整体表现一致,但为退休人员提供的推荐逐渐变差(通过点击率下降来衡量),这通过为年轻专业人员提供的逐渐更好的推荐来平衡(通过点击率增加来代表)。人工智能团队希望了解每个子群体的行为,并在必要时采取纠正措施。
基于片段的行为分析的关键使能因素是全面收集关于模型运行的上下文元数据。这些上下文元数据通常存在于人工智能系统中,但对模型的特性没有贡献。
以下是元数据驱动细分价值的几个额外示例:
- **合规性评估:**一家银行希望确保其承销模式不偏向(或反对)特定性别或种族。性别和种族不是模型特征,但却是评估模型指标并确保其符合贷款法规的重要维度。
- **根本原因分析:**一个营销团队发现有一个消费者子群体,推荐模型对他们不太有效。通过元数据驱动的细分,他们能够将这些消费者与特定的设备和浏览器相关联。经过进一步分析,意识到该特定设备和浏览器的数据接收过程存在缺陷。
关于模型版本的注释
有助于跟踪的元数据的另一个突出例子是模型版本(以及 AI 系统中其他组件的版本)。这使得恶化的行为与对系统的实际改变相关联。
“基于细分的行为分析的关键使能因素是全面收集关于模型运行的上下文元数据。”
5.在训练、测试和推理期间跟踪数据
在推理时进行全面的监控可以产生巨大的好处。然而,为了更深入地了解人工智能系统,前瞻性思维团队将监控范围扩大到包括训练和测试数据。当模型在推理时表现不佳时,能够将该数据段的特征分布与模型被训练时的对应分布进行比较,可以提供对行为变化的根本原因的最佳洞察。
如果可能,我们强烈建议跟踪上面讨论的相同元数据字段,在记录训练运行时也是如此。通过这样做,团队可以真正地比较相应的数据段,并更快、更准确地找到问题的根源。
摘要
评估复杂人工智能系统在生产中的性能和行为具有挑战性。一项全面的监测战略可以真正发挥作用。
根据我们的经验,此类监控策略包括使用推断阶段甚至更晚阶段可用的数据定义模型性能指标(例如,精度、AUC/ROC 等),建立模型输出的粒度行为指标,单独或作为一个集合跟踪特征行为,以及收集有助于分割指标行为的元数据。
建议将监控范围扩展到培训和测试阶段,以全面了解系统状态,并更快地隔离问题的根本原因。
表现最好的人工智能团队已经在实施类似的监控策略,作为他们人工智能生命周期不可或缺的一部分。这些团队对潜在生产问题的焦虑更少,而且更好的是,能够将他们的研究扩展到生产中,并随着时间的推移显著改进他们的模型。
设计产品指标的权威指南
讨论精确度和召回指标、指标设计访谈和指标生命周期
作者扎卡里·托马斯(zthomas.nc@gmail.com,推特,领英)
斯蒂芬·道森在 Unsplash 上拍摄的照片
(这篇文章最初是作为一个妙语文档写成的)
背景
如果你有一个技术产品,你也会想要它的度量标准。这是 Reddit 的联合创始人在这段视频中给出的建议:在开始一个产品时,你会想要跟踪一些东西及其趋势,以避免数据债务。科技公司的产品和工程团队现在认为这是传统智慧。产品的成功和质量取决于验证它的指标。不去衡量就无法提高。
看新闻,看电影,比如《社会困境》,科技行业和社会似乎有一个广泛的愿望,那就是超越仅仅使用参与度作为成功的衡量标准。也就是说,令人惊讶的是,我遇到的讨论如何设计一个好的指标的平易近人的在线资源很少。这非常令人惊讶,因为这是数据科学团队的核心职责之一!该指南旨在填补这一空白。
两桶指标:精确度和召回率
在我们设计新的指标之前,我们应该了解现有的指标已经测量了什么。就个人而言,我发现将度量标准分成两大类很有帮助:精度和召回。
分析师可以将现有的指标分为这两个类别,并为新的指标找到要解决的度量差距。或者,这个框架可以帮助将提议的新指标放在现有指标中。第一个召回指标可能比第十个精度指标更有影响力,反之亦然。
精确度指标🎯
精度度量测量产品当前迭代的使用和反馈。这些指标通常来自产品日志。团队使用它们来衡量增长和优化特性。事实上,我可以说绝大多数分析师使用和设计的度量标准本质上都是精确的。
例子包括:
- DAU、MAU 和其他使用指标:了解产品及其功能的总使用量和参与度是产品分析团队的核心任务
- *阅读更多:*参见 Y Combinator 的关键指标指南的“广告”部分的非收入指标
- CSAT 和其他以产品为中心的调查指标:类似 CSAT 的指标(用 1 到 5 的等级对功能或产品进行评级,通过自由形式的回答询问原因)侧重于收集关于产品当前状态的反馈
- 阅读更多:这篇 GetFeedback 文章概述了计算 CSAT 和不同行业基准的两种方法
- **延迟指标:**延迟指标衡量产品加载时间和基础设施性能
- 阅读更多:产品分析师团队通常不会处理延迟指标,但是非常成熟的产品可能希望了解延迟与产品增长和满意度之间的关系。特雷诺·斯洛斯、努卡拉和劳写的这篇关于谷歌如何看待基础设施指标的文章可能会在这方面提供一些思路
召回指标📚
召回指标根据基本事实跟踪产品性能。如果精度指标衡量增长和优化现有功能,召回指标有助于衡量产品质量和推动新功能开发。与精度指标不同,召回指标可能不仅仅需要产品日志来衡量。由团队进行的用户调查或数据标记可以作为召回指标的数据输入。有时,用户体验研究团队将拥有基于调查的召回指标,而不是数据科学团队,后者往往更关注基于日志的指标。
例子包括:
- 净推介值(NPS) :可以说,最著名的召回指标是 NPS,因为客户对产品的忠诚度是可能的替代品的函数
- 阅读更多信息:此指标概述除了指标的计算之外,还包括 NPS 跟进问题的提示
- 推荐系统或搜索系统的召回:召回指标衡量推荐或搜索系统的结果是否真正满足了最终用户的意图
- *阅读更多:*正如的第 21 张幻灯片所示,你可以使用实际的用户喜欢/点击作为回忆分级的基础
- *注意:*这种方法可能会夸大召回分数,因为它排除了潜在的喜欢,这些喜欢甚至不是产品的选项。例如,如果用户搜索一个产品,但根本没有看到它被列出来,召回指标应该理想地惩罚一个电子商务产品的推荐🤯。如果人们基于用户意图对推荐系统输出的样本进行人工评分,团队可以产生高覆盖率的召回指标。分析师的输入或指导有助于减少这些人工贴标过程中的偏差
- 竞争分析指标:对于有强大竞争对手的产品,分析师可以设计产品偏好、质量或任务完成指标来比较不同时期的产品
- 阅读更多:这篇博文描述了 Loup Ventures 如何向 Siri、Google Assistant 和 Alexa 询问同样的 800 个查询,并根据响应正确性和查询理解程度对每个查询进行评分。三个月后,他们重复了这个实验,看看每种产品在同一组查询中提高了多少
指标生命周期
既然我们已经建立了存在哪种度量,那么让我们深入到创建、报告和可能终止度量的过程中。
新的指标来自哪里?👶
总体而言,产品方向和市场、产品或客户成熟度的变化会推动对新指标的需求。更具体地说,新的指标可以来自:
- 建立用户漏斗或发展现有漏斗:新产品将从其用户获取和参与漏斗中获得其初始指标集
- 阅读更多内容:我见过的设计用户参与度漏斗及其相关指标的最佳教程是来自 Udacity 的 A/B 测试课程的第 3 课
- 当前指标对功能发布没有反应:新功能可能不再显示产品漏斗指标的统计和实际改进。这可能发生在一个产品饱和的市场,或者当产品变得足够复杂的时候。在这种情况下,分析师团队可能需要设计新的、更具可操作性的指标
- 阅读更多信息:在设计和评估指标的因果接近度部分,Sean Taylor 描述了产品和工程团队应该如何通过特性发布来影响指标的驱动因素。缺少该属性的度量是不可操作的
- 用户投诉或显著损失:反复的负面用户或客户反馈以及媒体和市场分析师的评论可能会推动注重质量的指标的创建
- 阅读更多内容:如中所述,这项新的美国案例研究(见脚注 82-89 周围的文字)从 2016 年左右开始,Youtube 开始通过用户调查来衡量视频满意度,以更好地优化 Youtube 关于用户幸福和满意度的建议,而不是观看时间
- **领导的指示+年度计划:**更实际的情况是,分析师团队经常在年度计划期间投资新的指标,以使指标与下一年的产品或公司战略保持一致
提出一种新的度量标准:访谈框架和古德哈特定律📝
一旦分析师团队确定了对新指标的需求,分析师就开始指标设计工作。数据科学团队希望这些分析师通过在实验和性能跟踪中使用提议的指标的潜在二阶效应进行推理
数据科学家访谈通常会围绕这一推理过程提出案例研究问题。根据我的经验,面试官要么会要求应聘者设计一个衡量标准,要么会提出一个衡量标准,并要求应聘者对其进行评估。以下是解决这些问题的框架:
- 🤔提出澄清性问题,以理解数据输入:确保你和面试官在哪些用户行为或其他数据输入会影响指标上保持一致。例如,在社交媒体产品上滚动、点赞、链接共享、状态发布、发送消息等。所有这些都可以作为专注于参与度的成功衡量标准吗
- *提示:*由于数据输入是特定于产品的,我建议研究一下你的面试官会问到的产品,并创建一个关于你可以想象公司团队使用的指标的备忘单
- 例如,注释“对于像 Lyft 或优步这样的公司来说,最重要的拼车指标是什么?”及其相关问题可以帮助您熟悉拼车指标及其输入
- 实际试用一个产品并理解它的机制和特性也是有帮助的——令人惊讶的是很多候选人没有这样做!
- 🤝**就该指标应衡量的行为或属性达成一致:**向面试官重复问题,并询问边缘案例。例如,如果一个电子商务平台的访问者要求定义一个对成功客户帐户进行分类的指标,那么可能值得询问团队是否期望该指标将一个具有高交易量但低 NPS 且不断下降的帐户分类为成功的
- 🧑🎓**提出指标:**我的建议是尽量简单,让后续问题帮助你决定是否需要让你的指标更复杂
- *提示:*如果是顶线指标,面试官可能会跟进你的指标应该是什么时间粒度。例如,每天、每周或每月的活跃用户?
- ⬇️讨论该指标会阻止哪些行为:如果用户最终只是做了该指标衡量的事情,并停止了产品上的其他行为,会发生什么?回答这个假设性的问题会引出一个指标的二阶效应
- 举例:你提议将滚动作为基于订阅源的社交媒体产品的成功衡量标准。如果用户最终只在产品上滚动,这将使减少滚动的行为(如发帖、评论和点击链接)的使用为零。团队对激励这一结果满意吗?
- **🚧讨论产品团队如何人为增加(“黑掉”)指标:**古德哈特定律指出,当人们知道他们的绩效是基于某个指标的时,他们会调整自己的行为以优化该指标。在技术产品的背景下,产品经理、设计师和工程师可能会开始改变产品,以增加成功指标,尽管存在负面的权衡
- 举例:你提议将滚动作为基于订阅源的社交媒体产品的成功衡量标准。这个指标激励设计者把内容块做得很长,或者把默认文本做得很大,以迫使用户滚动更多。该指标还激励产品经理和工程师创建有助于启动内容农场和传播其内容的功能和算法,以便用户有更多的项目可以滚动浏览。这些变化一起降低了产品的质量,但也增加了用户的滚动
- 🏆🙅♂️讨论了哪些相关属性没有用度量标准来衡量:不幸的是,简单明了的度量标准不会立刻衡量所有相关属性或用户行为。你应该向面试官概述你的衡量标准没有衡量的相关属性。你应该仍然能够论证你提出的度量标准与那些相关的属性相关,或者你是否需要为它们设计一个新的度量标准
- 举例:如果面试官让你为支付平台选择一个单一的成功指标,你可以说完成的交易效果最好,并且与其他重要指标相关,如 CSAT 和处理的总支付,即使完成的交易并不直接衡量这些属性
这个框架包含了我在公制设计面试中的经验。在接下来的部分中,我将讨论更多关于在分析师团队中经验地验证一个提议的度量标准,以及获得涉众的认同。
通过实验和分析验证新的度量标准📈
提出指标后,下一步是完成数据和实验分析,证明指标的行为符合预期且可行。验证指标需要几个步骤:
- (如果相关)显示不同阈值的指标分布:如果指标基于阈值,则显示不同的阈值可能值如何影响指标的分布
- 举例:如果我们将流失阈值设置为 7 天、14 天、21 天或 28 天,流失指标会将百分之多少的用户归类为流失用户?实际显示每个值的分布,作为选择特定值的解释的一部分
- 与相关现有指标的相关性分析:展示相关性对于注重质量的新指标或现有指标的改进特别有用
- *举例:*在拼车应用程序上,我预计随着乘车过程中增加的停车次数增加,用户满意度会下降或持平。相反,如果新的满意度随着停靠次数的增加而增加,那么这可能意味着日志问题,或者需要进行单独的调查来了解这种用户行为,因为这是违反直觉的
- 精确/召回基本事实:如果分析师使用调查或用户研究作为验证这些标签的基本事实,他们可以使描述某些行为为“好”、“坏”或“质量”的指标更有意义
- *示例:*基于日志的数据分析,业务应用程序的产品分析师可能会建议将“良好的工作流完成”定义为点击次数不超过 3 次。为了令人信服地证明 3 次或更少的点击是“好的”,分析师还可以收集用户对不同工作流长度的满意度调查响应,并测量所提议的指标相对于调查响应的精确度和召回率
- 通过实验进行的敏感性分析:如果产品团队认为将持续推动度量标准的新特性没有改变度量标准,那么该度量标准可能不像设计的那样可操作。设计和评估指标的指标生命周期部分的“验证”和“实验”要点描述了分析师如何使用保存的历史实验数据来显示一个新指标是否具有实验可以测量的实际的和统计上显著的效果
获得利益相关方对新指标的认可🤹
在验证流程的某个阶段,数据科学团队需要向工程和产品团队展示新指标及其行为,以获得认同和反馈,从而用作产品成功指标。
指标验证是数据分析的一种形式,所以我会记住 Roger Peng 关于这个主题的建议:*如果数据分析的受众接受结果,那么数据分析就是成功的。*确保产品和工程团队的直觉检查通过了这个提议的指标和与之相关的分析。
监控和报告度量🗓️📊
在涉众批准之后,您的度量应该准备好进行记录了!用数据交流、可视化和讲述故事是一个可以写满一整本书的主题。也就是说,这里有一些可能有用的提示:
公制格式和通信
- 使用 7 天滚动平均值来说明影响大多数产品的日常指标的工作日/周末变化
- 团队通常建议基于调查或 95%置信区间的采样日志来报告指标
- 就如何沟通基于百分比的指标的变化与您的团队保持一致——它总是很快变得令人困惑
仪表盘
- 工程师和分析师都可以轻松地启动仪表板,因此风险承担者可能很难知道哪些仪表板最适合回答他们的问题。在大型技术公司,数据科学团队将在特定网站/应用程序上创建他们自己的“可信”仪表板集,产品领导层将这些仪表板视为真理
- 这是一个简单的建议,但是我喜欢 Eric Mayefsky 在这篇博文中所说的话——实际看看你创建的仪表板!使用它们来激发更深入的数据调查。“泡在数据里。不要把你创建的仪表盘和报告当成是别人的产品——定期花时间,最好是每天都花时间,只是随便逛逛"
季度/预定指标评审
- 除了实验报告之外,与工程和产品领导一起进行预定的指标审查和趋势分析,可以在更大的组织中推动指标影响
- 需要回答的常见问题包括指标变化归因于新功能/客户或外部影响、指标值与预测的比较、深入探究指标下降或未达到目标的原因、群组分析等。
日落度量🌅
根据我的经验,分析师很少反对指标。相反,数据工程团队和代码管理推动了度量标准的贬值。
数据团队试图优化计算核心指标所需的时间,通常是每天一次。他们的日常工作需要计算的指标越多,这些工作运行的时间就越长,工作失败的可能性就越大。这些工程团队有动机停止计算分析师和产品团队既不监控也不会发现有用的指标。
不重要的或未采用的度量在他们离开团队后可能缺少所有者,并且在很长一段时间没有更新后没有人要求记录。数据工程团队有反对这些无主度量的余地。
总结一下:公制设计清单📋
所以你有它!我们已经讨论过…
- 🎯📚两桶指标:精确度和召回率
- 👶新指标的来源和原因
- 📝如何思考指标的二阶效应(以及这个问题如何出现在面试中)
- 📈通过相关性和敏感性分析验证指标
- 🗓️📊指标监控和报告技巧
- 🌅公制日落发生的原因和方式
一如既往,我认为这是一个活的文档,我欢迎反馈——如果你有任何想法,请随时给我发邮件到 zthomas.nc @ gmail 或 LinkedIn上!谢了。
Data Vault 的权威介绍
数据工程
以及它与其他传统的数据仓库建模技术(如维度建模)相比如何
本文最后一次更新是在 2022 年 6 月 18 日。
W 随着数据数量的指数级增长和数据种类的大幅增加,企业面临着设计和维护数据仓库和数据集市的问题,这些数据仓库和数据集市必须能够跟上敏捷团队进行软件开发的步伐。过去十年中发生的大数据爆炸迫使我们重新思考我们如何存储、检索和分析数据。
导致我们从关系模型转向维度模型的原因也是导致我们转向 Data Vault 的原因,但有一点不同——Data Vault 不一定是 OLAP 维度模型的替代或升级。对于一些用例来说,这是一个更好的方法,而对于其他用例来说则不是。这同样适用于维度建模。
维度建模的替代方案
由于软件应用的不断变化的性质和数据团队的需要,出现了对新的建模技术的需求。在传统的数据仓库建模技术中,非常频繁地进行更改代价很高。另一方面,Data Vault 就是为解决这类问题而设计的。
敏捷软件团队需要敏捷数据团队来补充。
传统的数据仓库建模技术,如星型模式,仍然非常相关和有用。Data Vault 刚刚尝试从这两者中吸取思想,使用星型模式的维度建模和第三范式(3NF)的关系建模。
和…一样重要。支持快节奏应用程序开发的是无缝的可伸缩性。云计算使得数据仓库的部署和扩展变得容易,但是由于低效的模型和过度的维护,云数据仓库也会遭受很多损失。如果模型不好,那么无论您向仓库分配多少资源,查询的性能都会很差。
什么构成了数据仓库
DataVault 的创建者 Dan Linsteadt 对他的建模方法做了如下描述
数据仓库是一个面向细节的、历史跟踪的和唯一链接的标准化表集,支持一个或多个业务功能领域。
记住这些原则,让我们来理解 Data Vault 域中存在的两种不同类型的保险库—原始保险库和业务保险库。Raw Vault 是将来自不同来源的数据加载到 Data Vault 的第一层。该数据未经过滤。另一方面,Business Vault 只不过是 raw vault 的扩展(有时是可选的)。business vault 具有应用于表的所有业务逻辑,例如 case-when 语句、多列计算、断开和连接多列等。business vault 的目的是让业务用户更容易访问和理解数据。
业务用户可以是营销人员、数据分析师、报告工程师、数据工程师、软件开发人员等等。
在这里,我们为您的企业集成需求提供同类最佳的混合数据建模解决方案。加入成长…
danlinstedt.com](http://danlinstedt.com/solutions-2/data-vault-basics/)
在 Data Vault 模型中有 5 种不同类型的表。最初的 Data Vault 规范只有 3 个,Data Vault 2.0 引入了另外 2 个
- 集线器 —仅包含企业使用的业务密钥(自然密钥)。业务键不应该是替代品(像在一些维度模型中),它们应该对业务有意义。
- Link —包含各种业务键之间的唯一关系。它本质上是一个映射表,除了不同 hub 之间的映射(使用业务键)之外,没有任何实际数据。
- 卫星 —包含所有非关键的描述性数据——当前的和历史的。理想情况下,集线器和链路表都应该有几个卫星表。
- PIT —这是卫星表的升级,尤其是当查询中使用的中心有多个卫星表要加入时。
- 网桥 —就像 PIT 表用于扩展卫星一样,网桥表用于扩展链路,以帮助连接具有多个中枢&链路的连接。
总而言之,数据仓库模型是数据仓库建模中更传统方法的替代方案,原因如下
- 跟上来自源系统的数据的种类和数量,即可伸缩性
- 跟上敏捷软件开发实践所要求的频繁变化
- 为业务用户提供数据的上下文视图,使他们能够轻松地浏览和分析从各种来源生成的数据
进一步探索
复杂数据环境中的数据仓库建模
德勤数据科学家访谈
德勤数据科学面试问题
图片来自 Pixabay
介绍
德勤会计师事务所总部位于纽约,是一家私营跨国公司,提供审计和鉴证、咨询、风险和税务评估以及财务顾问方面的专业服务。自 1845 年成立以来,该公司已发展成为世界上最大的会计和审计公司之一,在全球 150 多个国家开展业务,拥有超过 25 万名员工。
德勤拥有“四大”会计师事务所中最大的客户群,通过其服务产生大量数据,努力利用和分析信息进行业务设计和组织领导。德勤利用“市场领先的端到端分析、信息管理和解决方案组合”,为其客户的业务提供可操作的数据和见解。
德勤的数据科学角色
图片来自 Unsplash
在德勤,数据科学家主要为其他团队提供咨询服务,为决策提供依据和信息。这些角色是专业化的,从完善模型和算法到通过高级分析概念释放洞察力,从而显著提高盈利能力。
通过这种方式,数据科学家可以致力于应用基本的业务分析或统计概念,或者开发和设计预测模型、挖掘数据和优化信息。使用高级分析和建模(AAM)概念,数据科学家使用机器学习/深度学习模型和高度技术化的统计技术,以便从内部和外部数据提供端到端的解决方案。
来温习一下你的机器学习, 回顾一下关于面试查询的“亚马逊机器学习面试问题与解决方案”文章!
所需技能
鉴于德勤高度专业化的数据科学家角色,该职位的候选人必须在数据相关领域拥有至少 3 年(高级职位为 5 年以上)的咨询或行业经验。
其他相关资格包括:
- 计算机科学、工程、数学、统计学、管理信息、经济学、会计学或其他数据相关领域的学士、硕士或博士。
- 有编程语言经验,如 Python,R,VBA,SQL
- 具有建模和模拟分析经验,如逻辑和线性回归、文本分析、预测分析、自然语言处理、优化、决策树、神经网络或聚类技术。
- 具有结构化、半结构化和非结构化数据的定量分析经验。
- 具有使用 Spark、Kafka、Flink、Hadoop 和 NoSQL 数据存储等大数据技术的经验。
- 使用 Apache Hadoop、MapReduce、Pig & Hive 构建可扩展的高性能数据管道的经验。
- 精通数据提取、转换和加载,以支持高级分析。
- 有 AWS、Azure 或 Google 等基于云的平台的经验。
德勤的数据科学团队
德勤的数据科学和分析团队与其他团队合作,通过从客户数据中生成的应用数据决策来释放商业机会。鉴于数据科学家所扮演角色的跨职能方面,工作职责和责任可以从业务或机器学习分析到预测建模。
**分析和认知:**专注于利用数据分析、数学技术和预测建模的力量,从海量数据中发现隐藏的关系。与客户合作实施大规模数据生态系统,包括数据管理、治理以及结构化和非结构化数据的集成,从而深入了解如何利用基于云的平台。
政府和公共服务(GPS): 利用德勤客户关系管理(CRM)系统(Salesforce)的销售和渠道分析来支持和改善 GPS 销售。应用自然语言处理(NLP)和机器学习模型来促进研究和收集/设计流程,以挖掘各种业务发展,从而确定提高增长率的方法。
DevOps: 与数据工程师合作,构建和维护前沿的人工智能解决方案,为客户提供实时的客户洞察。与数据科学团队合作提供生产级管道,包括构建 ETL 作业以将数据接收到数据库中,管理和编目关于 ETL 数据集的元数据,以及实施数据模型解决方案。
财务和管理:提供专业知识、支持和资源,帮助企业更高效地完成工作。跨职能部门与团队合作,发现高质量的解决方案和创新,以解决当前和未来的挑战。
**工程(德勤数字)😗*建立和维护最先进的营销平台,为客户提供跨所有渠道(店内、在线、呼叫中心)的客户品牌互动的单一视图。设计、构建和维护先进的数据解决方案,为德勤的客户提供实时的客户洞察,以实现价值。
德勤面试流程
图片来自 Unsplash
德勤数据科学家面试遵循大多数科技公司标准的数据科学家面试模式。首先是招聘人员打来电话,详细讨论过去的项目或相关经历,以及它们如何融入你面试的数据科学家团队的计划。
想了解更多关于科技公司数据科学面试的信息吗? 阅读“谷歌数据科学家访谈”上的访谈查询!
通过仅概述与团队目标一致的相关经历 ,给面试留下好印象是很重要的。初次面试后,招聘人员将安排与数据科学家同事、招聘经理和团队经理进行现场面试。
初始屏幕
这是对招聘人员的电话或视频面试,通常持续 30 到 60 分钟。这只是一个标准的“普通”面试,问题围绕着你的背景经历、过去的项目以及可能与工作相关的工作经历。主要的重点将是更多地了解你的背景,同时,你将更多地了解德勤的文化和工作角色。
注意:这次面试可能会包含一些技术元素,所以你要准备一些 SQL 和机器方面的问题。
样题:
- 告诉我你不得不与难相处的人一起工作的时候。
- 为什么是咨询,为什么是德勤?
现场面试
标准的德勤现场面试流程包括不同的面试轮次,由行为、技术和基于案例的面试组成。
有四到五轮面试(一轮文化契合、两轮行为和两轮技术),每轮持续 45 分钟,由一组面试官组成:团队成员、其他数据科学家、高级经理、招聘经理和合作伙伴/主管。面试问题是基于案例研究的,有时是开放式的。技术问题是标准化的,涵盖了广泛的数据科学概念。
典型的德勤数据科学家访谈包括:
- **行为访谈:**这是与合作伙伴/客户的访谈。
- **文化契合面试:**这是一次与高级经理的面试,围绕过去的项目以及它们与工作角色的关系。
- **招聘经理的技术面试:**潜在的问题包括 Python、SQL、R、基础统计和概率。
- **与经理的另一次技术面试:**这是一次评估你的核心机器学习算法知识的面试。它还评估你的数学解决能力和商业领域知识。
注意事项和提示
图片来自 Unsplash
请记住,德勤数据科学家面试流程旨在评估候选人利用数据科学概念提供基于科学和数据驱动的见解的能力。德勤聘请具有丰富行业经验的专家,他们可以利用数据分析来解决问题,发现新的见解,并帮助德勤的客户提高决策质量。
- 德勤的数据科学家面试问题是标准化的,可以跨越广泛的数据科学概念。记得复习你的统计学、逻辑回归、时间序列、SQL、机器学习和预测建模知识。在白板上练习编码和在interviewquery.com上练习中级数据科学家问题可以帮助你为技术现场面试做好心理准备。
有关不同数据科学采访的更多信息,请在采访查询中查看“Lyft 数据科学家采访”。
德勤数据科学家面试问题
- 你将如何为想与最好的出租车公司竞争的客户解决问题?
- 你最喜欢的 ML 算法是什么?
- 随机森林和额外树分类器有什么区别?
- 给亚马逊这样的电商网站设计一个数据库?
感谢阅读
- 希望在数据科学面试中胜出?查看 面试查询 !
- 前往我的 Youtube 频道 获取更多面试指南,以及解决问题的技巧&。
- 在面试查询博客上找到更多数据科学面试指南,如 Lyft 数据科学家面试 和 谷歌数据科学家面试 。
原载于 2020 年 7 月 6 日 https://www.interviewquery.com**的 。
每个数据科学家都应该使用需求销售预测技术来减少错误
使用 Python 在分步教程中创建破纪录的需求销售预测
为了更好地了解市场,组织有责任超越他们自己的四面墙去寻找数据源
Douglas Laney(Gartner Research 副总裁)
图片来自 Shutterstock
介绍
世界上成千上万的公司,从小创业公司到全球公司,都发现能够准确预测销售的巨大价值,这几乎总是他们的数据科学/分析团队的优先事项之一。
然而,他们似乎都试图通过主要关注两件事来提高精度(减少误差):
-
功能工程(充分利用您的功能)
-
模型/参数优化(选择最佳模型&最佳参数)
以上两者确实非常必要,但是还有第三件事,即以一种互补的方式增加价值,并且它不仅在这个用例中,而且在大多数数据科学项目中都被广泛地低估了:
- 结合外部信息。
在本文中,我们将做一个简单的销售预测模型,然后混合外部变量(正确完成)。
我们要做什么
- 第一步:定义并理解目标
- 第二步:制作一个简单预测模型
- 第三步:添加财务指标和新闻
- 第四步:测试型号
- 步骤 5:测量结果
第一步。定义和理解目标
流行的 沃尔玛销售预测 竞赛已经有好几个实施来预测他们的销售额。
来自 Kaggle 比赛的截图
在本文中,我们将使用数据,并通过结合外部信息来改进模型。
沃尔玛发布了包含每个实体店 99 个部门(服装、电子产品、食品……)的周销售额以及一些其他附加功能的数据。
沃尔玛数据集截图
为此,我们将创建一个 ML 模型,以“ *Weekly_Sales”为目标,*使用前 70%的观察值进行训练,并在后 30%进行测试。
目标是最小化未来周销售额的预测误差。
我们将添加影响销售或与销售有关系的外部变量,如美元指数、石油价格和关于沃尔玛的新闻。
我们不会使用模型/参数优化或特征工程,因此我们可以区分收益 和添加外部特征。
第二步。制作一个简单的预测模型
首先,您需要安装 Python 3 和以下库:
$ pip install pandas OpenBlender scikit-learn
然后,打开一个 Python 脚本(最好是 Jupyter notebook),让我们导入所需的库。
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import OpenBlender
import json
现在,让我们定义用于所有实验的方法和模型。
首先是,数据的日期范围是从 2010 年 1 月到 2012 年 12 月**。让我们定义用于训练的数据的第一个 70% 和用于测试**的后一个 30% (因为我们不希望我们的预测出现数据泄漏)。
接下来,让我们定义一个标准模型和一个随机森林回归量,有 50 个估计量,这是一个相当好的选择。
最后,为了使事情尽可能简单,让我们将误差定义为误差的绝对和。
现在,让我们把它放到一个 Python 类中。
class **StandardModel**:
model = RandomForestRegressor(n_estimators=50, criterion='mse')
def **train**(self, df, target):
# Drop non numerics
df = df.dropna(axis=1).select_dtypes(['number'])
# Create train/test sets
X = df.loc[:, df.columns != target].values
y = df.loc[:,[target]].values
# We take the first bit of the data as test and the
# last as train because the data is ordered desc.
div = int(round(len(X) * 0.29))
X_train = X[div:]
y_train = y[div:]
print('Train Shape:')
print(X_train.shape)
print(y_train.shape)
#Random forest model specification
self.model = RandomForestRegressor(n_estimators=50)
# Train on data
self.model.fit(X_train, y_train.ravel()) def **getMetrics**(self, df, target):
# Function to get the error sum from the trained model # Drop non numerics
df = df.dropna(axis=1).select_dtypes(['number'])
# Create train/test sets
X = df.loc[:, df.columns != target].values
y = df.loc[:,[target]].values
div = int(round(len(X) * 0.29))
X_test = X[:div]
y_test = y[:div]
print('Test Shape:')
print(X_test.shape)
print(y_test.shape)# Predict on test
y_pred_random = self.model.predict(X_test)
# Gather absolute error
error_sum = sum(abs(y_test.ravel() - y_pred_random))
return error_sum
上面我们有一个包含 3 个元素的对象:
- 模型 (RandomForestRegressor)
- **训练:**用数据帧和目标训练模型功能
- getMetrics: 用测试数据对训练好的模型进行测试并检索错误的函数
我们将在所有实验中使用这种配置,尽管您可以根据需要修改它来测试不同的模型、参数、配置或其他任何东西。附加值将保持不变,并有可能提高。
现在,让我们得到沃尔玛的数据。你可以在这里得到那个 CSV。
df_walmart = pd.read_csv('walmartData.csv')
print(df_walmart.shape)
df_walmart.head()
有 421,570 个观察值。如前所述,观察值是每个部门每个商店的每周销售额的记录。
让我们将数据插入到模型中,而不要篡改它。
our_model = StandardModel()
our_model.train(df_walmart, 'Weekly_Sales')
total_error_sum = our_model.getMetrics(df_walmart, 'Weekly_Sales')
print("Error sum: " + str(total_error_sum))*> Error sum: 967705992.5034052*
整个模型的所有误差总和为 $ 967,705,992.5 美元。
这个本身没有太大的意义,唯一的参考就是那个时期所有销售额的总和 $ 6,737,218,987.11 美元。
由于有大量的数据,在本教程中,我们将仅关注商店#1 ,但该方法绝对可用于所有商店。
再来看看商店 1 单独产生的错误。
# Select store 1
df_walmart_st1 = df_walmart[df_walmart['Store'] == 1]# Error of store 1
error_sum_st1 = our_model.getMetrics(df_walmart_st1, 'Weekly_Sales')
print("Error sum: " + str(error_sum_st1))**# > Error sum: 24009404.060399983**
因此,商店 1 应对24,009,404.06 美元误差负责,而这个 将是我们进行比较的阈值。
现在,让我们按部门分解错误,以便稍后有更多的可见性。
error_summary = []
for i in range(1,100):
try:
df_dept = df_walmart_st1[df_walmart_st1['Dept'] == i]
error_sum = our_model.getMetrics(df_dept, 'Weekly_Sales')
print("Error dept : " + str(i) + ' is: ' + str(error_sum))
error_summary.append({'dept' : i, 'error_sum_normal_model' : error_sum})
except:
error_sum = 0
print('No obs for Dept: ' + str(i))
error_summary_df = pd.DataFrame(error_summary)
error_summary_df.head()
现在,我们有了一个数据框架,其中包含了与阈值模型中商店 1 的每个部门相对应的错误。
让我们提高这些数字。
第三步。添加财务指标和新闻
让我们选择部门 1 作为一个简单的例子。
df_st1dept1 = df_walmart_st1[df_walmart_st1['Dept'] == 1]
现在,让我们搜索相交的数据集。
# First we need to add the **UNIX timestamp** which is the number
# of seconds since 1970 on UTC, it is a very convenient
# format because it is the same in every time zone in the world!df_st1dept1['timestamp'] = OpenBlender.dateToUnix(df_st1dept1['Date'],
date_format = '%Y-%m-%d',
timezone = 'GMT')df_st1dept1 = df_st1dept1.sort_values('timestamp').reset_index(drop = True)
现在,让我们在 OpenBlender 中搜索关于“商业”或“沃尔玛”的时间交叉(重叠)数据集。
**注意:**要获得您需要的令牌必须在 openblender.io (免费)上创建一个帐户,您可以在个人资料图标的“帐户”选项卡中找到它。
token = '**YOUR_TOKEN_HERE**'print('From : ' + OpenBlender.unixToDate(min(df_st1dept1.timestamp)))
print('Until: ' + OpenBlender.unixToDate(max(df_st1dept1.timestamp)))# Now, let's search on OpenBlender
search_keyword = 'business walmart'# We need to pass our timestamp column and
# search keywords as parameters.
OpenBlender.searchTimeBlends(token,
df_st1dept1.timestamp,
search_keyword)
搜索找到了几个数据集。我们可以看到名称、描述、url、特征,最重要的是,我们的时间交互,因此我们可以将它们混合到我们的数据集。
让我们从混合这个沃尔玛推文数据集开始,寻找宣传片。
- 注意:我选择这个是因为它有意义,但是你可以搜索成百上千个其他的。
我们可以通过搜索按时间聚合的文本或新闻,将新的列混合到我们的数据集中。例如,我们可以创建一个“ promo ”功能,其提及次数将与我们自制的 ngrams 相匹配:
**text_filter** = {'name' : 'promo',
'match_ngrams': ['promo', 'dicount', 'cut', 'markdown','deduction']}# **blend_source** needs the id_dataset and the name of the feature.blend_source = {
'id_dataset':'**5e1deeda9516290a00c5f8f6**',
'feature' : '**text**',
'filter_text' : **text_filter**
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_st1dept1.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'list')df_anchor = pd.concat([df_st1dept1, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)
timeBlend 功能的参数(您可以在此处找到文档):
- anchor_ts :我们只需要发送我们的时间戳列,这样它就可以作为一个锚来混合外部数据。
- blend_source :关于我们想要的特性的信息。
- blend _ type:‘agg _ in _ intervals’因为我们希望对我们的每个观察进行 1 周时间间隔的聚合。
- inverval_size :间隔的大小,以秒为单位(本例中为 24 * 7 小时)。
- 方向:‘time _ prior’因为我们希望间隔收集前 7 天的观察值,而不是转发以避免数据泄漏。
我们现在有了我们的原始数据集,但是增加了两个新列,我们的“推广”功能的“计数”和一个实际文本的列表,以防有人想要遍历每个文本。
df_anchor.tail()
现在我们有了一个数字特征,关于我们的 ngrams 被提及的次数。如果我们知道哪个商店或部门对应于“1”,我们可能会做得更好。
让我们应用标准模型,并将误差与原始值进行比较。
our_model.train(df_anchor, 'Weekly_Sales')
error_sum = our_model.getMetrics(df_anchor, 'Weekly_Sales')
error_sum#> 253875.30
目前的模型有 253,975 美元的误差,而以前的模型有 290,037 美元的误差。这是一个 12% 的改进。
但是这个证明不了什么,可能是随机森林运气好。毕竟,原始模型是用超过 299K 的观测值训练的。目前的一架只训练了 102 架!!
我们也可以混合数字特征。让我们尝试混合美元指数、油价和月度消费者情绪
**# OIL PRICE**blend_source = {
'id_dataset':'5e91045a9516297827b8f5b1',
'feature' : 'price'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)**# DOLLAR INDEX**blend_source = {
'id_dataset':'5e91029d9516297827b8f08c',
'feature' : 'price'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)**# CONSUMER SENTIMENT**blend_source = {
'id_dataset':'5e979cf195162963e9c9853f',
'feature' : 'umcsent'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)df_anchor
现在我们又有了 6 个特征,石油指数、美元指数和消费者情绪在 7 天时间间隔内的平均值,以及每个特征的计数(这在本例中是不相关的)。
让我们再运行一次那个模型。
our_model.train(df_anchor, 'Weekly_Sales')
error_sum = our_model.getMetrics(df_anchor, 'Weekly_Sales')
error_sum>223831.9414
现在,我们减少到 223,831 美元的错误。相对于最初的 290,037 美元,提高了24.1%!!
现在,让我们分别对每个部门进行尝试,以衡量收益的一致性。
第四步。在所有部门进行测试
为了一目了然,我们将首先对前 10 个部门进行实验,并比较添加每个额外资源的优势。
**# Function to filter features from other sources**def excludeColsWithPrefix(df, prefixes):
cols = df.columns
for prefix in prefixes:
cols = [col for col in cols if prefix not in col]
return df[cols]error_sum_enhanced = []**# Loop through the first 10 Departments and test them.**for dept in range(1, 10):
print('---')
print('Starting department ' + str(dept))
# Get it into a dataframe
df_dept = df_walmart_st1[df_walmart_st1['Dept'] == dept]
# Unix Timestamp
df_dept['timestamp'] = OpenBlender.dateToUnix(df_dept['Date'],
date_format = '%Y-%m-%d',
timezone = 'GMT')df_dept = df_dept.sort_values('timestamp').reset_index(drop = True)
**# "PROMO" FEATURE OF MENTIONS ON WALMART**
text_filter = {'name' : 'promo',
'match_ngrams': ['promo', 'dicount', 'cut', 'markdown','deduction']}
blend_source = {
'id_dataset':'5e1deeda9516290a00c5f8f6',
'feature' : 'text',
'filter_text' : text_filter
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_st1dept1.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'list')df_anchor = pd.concat([df_st1dept1, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)
**# OIL PRICE** blend_source = {
'id_dataset':'5e91045a9516297827b8f5b1',
'feature' : 'price'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg',
missing_values = 'impute')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)**# DOLLAR INDEX**blend_source = {
'id_dataset':'5e91029d9516297827b8f08c',
'feature' : 'price'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg',
missing_values = 'impute')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)**# CONSUMER SENTIMENT**blend_source = {
'id_dataset':'5e979cf195162963e9c9853f',
'feature' : 'umcsent'
}df_blend = OpenBlender.timeBlend( token = token,
anchor_ts = df_anchor.timestamp,
blend_source = blend_source,
blend_type = 'agg_in_intervals',
interval_size = 60 * 60 * 24 * 7,
direction = 'time_prior',
interval_output = 'avg',
missing_values = 'impute')df_anchor = pd.concat([df_anchor, df_blend.loc[:, df_blend.columns != 'timestamp']], axis = 1)
try:
error_sum = {}
# Gather errors from every source by itself# Dollar Index
df_selection = excludeColsWithPrefix(df_anchor, ['WALMART_TW', 'US_MONTHLY_CONSUMER', 'OIL_INDEX'])
our_model.train(df_selection, 'weekly_sales') error_sum['1_features'] = our_model.getMetrics(df_selection, 'weekly_sales')
# Walmart News
df_selection = excludeColsWithPrefix(df_anchor, [ 'US_MONTHLY_CONSUMER', 'OIL_INDEX'])
our_model.train(df_selection, 'weekly_sales') error_sum['2_feature'] = our_model.getMetrics(df_selection, 'weekly_sales')
# Oil Index
df_selection = excludeColsWithPrefix(df_anchor,['US_MONTHLY_CONSUMER'])
our_model.train(df_selection, 'weekly_sales') error_sum['3_features'] = our_model.getMetrics(df_selection, 'weekly_sales')
# Consumer Sentiment (All features)
df_selection = df
our_model.train(df_selection, 'weekly_sales') error_sum['4_features'] = our_model.getMetrics(df_selection, 'weekly_sales')
except:
import traceback
print(traceback.format_exc())
print("No observations found for department: " + str(dept))
error_sum = 0
error_sum_enhanced.append(error_sum)
让我们把结果放到一个数据框架中,然后可视化。
separated_results = pd.DataFrame(error_sum_enhanced)
separated_results['original_error'] = error_summary_df[0:10]['error_sum_normal_model']separated_results = separated_results[['original_error', '1_feature', '2_features', '3_features', '4_features']] separated_results.transpose().plot(kind='line')
部门 4 和 6 的级别比其他部门高,让我们将它们移除,以便更仔细地了解其他部门。
separated_results.drop([6, 4]).transpose().plot(kind=’line’)
我们可以看到,随着我们增加新功能,几乎所有部门的错误都降低了。我们还可以看到,石油指数(第三个特征)对某些部门不仅没有帮助,甚至是有害的。
我排除了石油指数,并在所有部门上运行具有 3 个特征的算法(这可以通过迭代所有 error_summary_df 而不仅仅是前 10 个来完成)。
让我们看看结果。
第五步。测量结果
这些是所有部门的“3 个特征”混合和改进百分比的结果:
添加的功能不仅改善了超过 88%的部门的错误,而且一些改进是显著的。
这是改善百分比的直方图。
原始误差(在文章开头计算)为24,009,404.06 美元,最终误差为9,596,215.21 美元,表示减少了 60%以上
而这只是一家店。
感谢您的阅读。
SIEM 的消亡助长了安全数据湖的兴起
激动人心的景点就在前方;阅读下面的“电影评论”。(图片来源:http://www.redkid.net/generator/sign.php)
十年前,日志管理通常用于为法规遵从性和安全性用例捕获和保留事件。随着对手及其 TTP 变得越来越复杂,简单的日志记录演变为安全信息和事件管理(SIEM ),规则驱动的关联功能使得将原始事件数据转化为潜在的有价值情报成为可能。尽管实现并使一切正常工作具有挑战性,但找到所谓的“大海捞针”并识别正在进行的攻击的能力是一个巨大的进步。
今天,SIEM 仍然存在,市场主要由 Splunk 和 IBM Q-Radar 主导。许多客户最终转向了云原生部署,并且正在利用机器学习和复杂的行为分析。然而,新的企业部署更少,成本更高,最重要的是,CISO 和 SOC 中辛勤工作的团队的整体需求发生了变化。这些需求已经发生了变化,因为安全团队几乎普遍认识到他们正在输给坏人。减少对 SIEM 的依赖以及许多其他变化正在顺利进行。SIEM 不会消失,但它的角色正在迅速变化,它在 SOC 中有了一个新的合作伙伴。
为什么暹罗的作用正在迅速减弱?
- 这是过于狭隘的关注:仅仅收集安全事件已经不够了,因为这个数据集上的窗口太窄了。虽然在您的事件中可能有大量的事件数据要捕获和处理,但您却错过了大量的附加信息,如 OSINT(开源情报信息)、可消费的外部威胁源,以及恶意软件和 IP 信誉数据库等有价值的信息,甚至是来自黑暗网络活动的报告。情报来源无穷无尽,对于 SIEM 的架构来说太多了。
- 成本(数据爆炸+硬件+许可证成本=糟糕的结果) : 有了如此多的物理和虚拟基础架构,被捕获的信息量已经爆炸式增长。机器生成的数据增长了 50 倍,而平均安全预算年增长率为 14%。存储所有这些信息的成本使得 SIEM 成本过高。SIEM 的平均成本已经飙升到接近每年 100 万美元,这还只是许可证和硬件成本。经济因素迫使 SOC 中的团队捕获和/或保留更少的信息,以试图控制成本。这导致 SIEM 的有效性进一步降低。我最近与一个 SOC 团队进行了交谈,该团队希望查询大型数据集以寻找欺诈的证据,但在 Splunk 中这样做成本高昂,而且过程缓慢而艰难,因此需要努力探索新的方法。
结果是可怕的—pone mon Institute 最近的一项调查调查了近 600 名 IT 安全负责人,发现尽管每年平均花费 1840 万美元,平均使用 47 种产品,高达 53%的 IT 安全负责人“甚至不知道他们的产品是否工作”。显然,改变是理所应当的!
进入安全数据湖
安全驱动的数据可能是多维的、动态的和异构的,因此,数据仓库解决方案在提供用户需要的敏捷性和性能方面效率较低。数据湖被认为是数据仓库的一个子集,然而,就灵活性而言,它是一个重大的进步。数据湖更加灵活,支持原生格式的非结构化和半结构化数据,可以包括日志文件、提要、表格、文本文件、系统日志等。您可以流式传输您的所有安全数据,没有一个被拒绝,一切都将被保留。安全团队可以以较低的成本轻松实现这一点。例如,如果在 S3 桶中,则为每月每 GB 0.03 美分。这种能力使数据湖成为 SIEM 的倒数第二次进化。
(图片来源:http://www.redkid.net/generator/sign.php)
如果您正在构建一个安全数据湖,您将能够专注于更具战略性的活动:
- **威胁追踪:**老练的对手知道如何隐藏和躲避现成安全解决方案的检测。高度熟练的安全团队将跟踪触发器(可能是可疑的 IP 或事件),并继续攻击,在损害发生之前找到并补救攻击者。威胁搜寻团队的经验是成功的最关键因素,但是,他们高度依赖于大量的威胁情报,因此他们可以交叉引用他们在内部观察到的情况,并使用最新的威胁情报来关联和检测真实的攻击。
- **数据驱动调查:**每当检测到可疑活动,分析师就会开始调查。为了有效,这必须是一个迅速的过程。在典型组织中,行业平均使用 47 种安全产品,这使得访问所有相关数据变得非常困难。但是,有了安全数据湖,您可以将所有的侦察信息流入数据湖,并消除收集日志的耗时工作。该过程的价值在于将新观察到的行为与历史趋势进行比较,有时与跨越 10 年的数据集进行比较。在传统的 SIEM 中,这将是成本过高的。
数据湖在加载数据时自动处理数据(称为解析),使安全团队更容易专注于他们工作中最关键的元素,防止或阻止攻击。
大量的历史数据,通常追溯到十年前,以确定特定的模式是典型的还是异常的。
有趣的公司为您的安全数据湖提供动力:
如果你正计划部署一个安全数据湖或者已经有了,这里有三家尖端公司你应该知道。我不是这些公司中任何一家的员工,但我对它们非常熟悉,并且相信每家公司都会以一种非常有意义的方式改变我们的行业,并且可以转变您自己的安全数据湖计划。
- 团队 Cymru 是你还没听说过的最强大的安全公司。他们组装了一个全球性的传感器网络,当互联网上基于 IP 的流量通过 ISP 时,它会“监听”这些流量,并且可以“看到”,因此比典型 SOC 中的任何人都知道得多。他们通过将这些数据出售给大型公共安全公司来建立公司,如 Crowdstrike、 FireEye 、微软,以及现在的 Palo Alto Networks,上周他们以 8 亿美元收购了expense。此外,JPMC 和沃尔玛的尖端足球团队正在接受我在这篇文章中支持的东西,并利用 Cymru 的遥测数据馈送。现在,您可以访问相同的数据,您将希望他们的 50 多种数据类型和 10 多年的数据湖中的情报帮助您的团队根据某些特征(如 IP 或其他签名)更好地识别对手和不良行为者。
- Varada.io : 安全数据湖的全部价值在于轻松、快速、自由地访问大量信息。它消除了移动和复制数据的需要,并提供了用户所需的敏捷性和灵活性。随着数据湖的增长,查询变得越来越慢,需要大量的数据操作来满足业务需求。云存储可能很便宜,但计算很快变得非常昂贵,因为查询引擎通常基于完全扫描。Varada 通过索引和虚拟化任何维度的所有关键数据解决了这个问题。数据以粒度形式保存在更接近 SOC 的 SSD 卷上,因此数据消费者可以在需要时随时利用最大的灵活性来运行任何查询。好处是通过避免耗时的全扫描,查询响应速度提高了 100 倍,而且成本更低。这支持诸如搜索攻击指标、事件后调查、完整性监控和威胁搜寻等工作负载。Varada 是如此的创新,以至于数据供应商 Starburst 最近刚刚收购了他们。
- Panther:snow flake 是一个广受欢迎的数据平台,主要面向中端市场和企业部门使用。它不是 SIEM,没有安全功能。来自 AWS 和 Airbnb 的工程师创建了 Panther,这是一个威胁检测和调查平台。该公司最近将 Panther 与 Snowflake 连接起来,能够将两个平台之间的数据连接起来,使 Snowflake 成为“下一代 SIEM ”,或者更好的定位是将 Snowflake 发展成为一个高性能、经济高效的安全数据湖。它仍然是一个较新的解决方案,但它是一个很酷的想法,有很大的前景,并且已经在 Dropbox 等公司以令人印象深刻的速度取代了 Splunk 的实施。如果你想知道未来会是什么样子,你甚至可以在这里免费试用。
总的来说,安全组织平均每年花费 1800 万美元,但在防止违规、知识产权盗窃和数据丢失方面却收效甚微。零敲碎打的方法没有奏效。安全数据湖虽然不是一种简单的“现成”方法,但它将您所有的关键威胁和事件数据集中在一个大型的中央存储库中,而且访问简单。它仍然可以利用现有的 SIEM,该 SIEM 可能会利用相关性、机器学习算法甚至人工智能来通过评估模式来检测欺诈,然后触发警报。无论如何配置,安全数据湖都是您应该考虑的令人兴奋的一步,还有我在本文中提到的三家创新公司。
我很想听听您对安全数据湖如何帮助您和您的团队的看法,以及它对您现有的 SIEM 投资意味着什么。你可以直接联系 dan@hightide-advisors.com 或 https://www.linkedin.com/in/schoenbaum。
如果你想阅读更多我的文章——专注于网络安全,并为投资者和高管提供如何改善公司走向市场的建议,可以在这里找到:https://schoenbaum.medium.com/
民主党的推特战争
每位候选人如何在网上争夺提名
卡尔·冯·克劳塞维茨将军有一句名言:“战争是政治的另一种方式”。似乎反过来也是一样的。过去,政治斗争发生在幕后办公室、筹款晚宴和社论版。2020 年这些战役都是线上的。推文、点赞、链接都是战争武器。公众、媒体和政治阶层无休止地发射这些弹药。幸运的是,这些武器留下了分析起来很有趣的大数据痕迹。
随着我们进入民主党初选,我认为这将是一个很好的时间来看看自从我上次对民主党推特的分析以来,事情发生了怎样的变化。正如下面的数据所显示的,战斗仍然很激烈,战场仍然是敞开的。让我们来看看剩下的每一位候选人,看看他们在这个在线舞台上的表现如何。
乔·拜登
直到 2019 年夏天,乔·拜登的竞选策略似乎是尽可能少说话。他在网上也是如此,直到 5 月份他才真正开始发微博。下图显示了拜登今年每周发送的推文数量。
乔·拜登在 201 周内每周发送的推文数量
随着活动的增加,拜登赶上了其他顶级候选人的水平,使他在网上有了重要的存在。
请注意,这些推文的内容变化不大。拜登的热门词汇揭示了一些关键主题。
乔·拜登推特的文字云
在几乎所有的信件中,拜登都表示,我们“必须”击败“特朗普”,拜登竞选是实现这一目标的唯一途径。他最受欢迎的推文都是对现任总统的攻击。
伯尼·桑德斯
谈到网上受欢迎程度,没有民主党人能胜过伯尼·桑德斯。对候选推特粉丝的比较清楚地表明了这一点。
当然,拥有如此众多的追随者也有一些缺点。桑德斯因其支持者在社交媒体上的行为受到了持续的批评。然而,桑德斯的在线和离线支持都在飙升。下面是伯尼·桑德斯每周收到的推特点赞数的图表。这与他的民意测验非常接近。
一些人指责记者戴维·西罗塔秘密控制伯尼的账户,包括其偶尔的负面言论。不管是真是假,3 月份聘用西罗塔与桑德斯崛起紧密相关。
如果我们看看桑德最受欢迎的推文,我们会发现它们都是 2019 年末的简短声明。唯一的例外是桑德斯发布的解释他心脏病发作的消息。
桑德的推特和他的演讲一样,焦点总是在“人”上。
伊丽莎白·沃伦
伊丽莎白·沃伦是最后的领跑者,在在线支持方面仅次于伯尼·桑德斯。对 2019 年推特总赞数的比较显示了这一点。
数据显示,在下半年,沃伦的候选人资格一直在动摇。例如,她的账户每周获得的赞数急剧下降。
不仅如此,她的粉丝也没有增长多少。下图显示了沃伦的个人账户和参议院账户每月新增的 Twitter 粉丝数量。
回顾沃伦 2020 年的热门推文,可以看到这种下降的进一步证据。所有这些都是在 2019 年 10 月她的民调达到峰值之前写的。
沃伦的衰落有多种理论。就我个人而言,我将此归咎于奥巴马时代政客们的影响,他们全力支持她,包括竞选联合主席 Ayanna Pressley。
皮特·布蒂吉格
在所有顶级候选人中,皮特·布蒂吉格发微博最少。统计 2019 年每位候选人的推文总数就清楚地说明了这一点。
然而,当 Buttigieg 发微博时,他得到了关注。通过候选人的推特粉丝来衡量推特点赞数,我们发现 Buttigieg 名列榜首。因此,在极少数情况下,Buttigieg 确实写了一些东西,它可能会受到好评。
但如果他以其他方式吸引注意力,那么他缺乏持续的沟通就不是问题。不幸的是,他不再有 Twitter 追随者,这表明他的竞选意识正在下降。
当 Buttigieg 发微博时,它往往是出于一种道德优越感。他最受欢迎的信息听起来都像是告诫,符合他作为中间派改革者的风格。
Buttigieg 推文的词云显示,他喜欢的术语是经典政治言论的一部分。
杨安泽
杨安泽在许多方面都与众不同。杨是该领域唯一剩下的少数族裔候选人,也是唯一一个不是职业政治家的人。除此之外,杨是最在线的。他在 2019 年发了最多的推文,也是迄今为止社交媒体上最活跃的。
此外,对候选人推文的情感分析显示,杨是最积极的候选人。也就是说,他在 Twitter 上使用的词语和句子比他的对手有更少的负面感觉。
使用情感库的候选人情感
他的推文词云显示,“谢谢”是他目前最喜欢的词。
图尔西·加巴德
Tulsi Gabbard 不太可能赢得提名,但她确实让竞选变得有趣。在所有候选人中,加巴德是唯一一个公开反对党内精英的人,这让她在网上赢得了钦佩和愤怒。
这方面最好的例子是她在十月份与希拉里·克林顿的口水战。那次口角为她赢得了大量的赞和关注者。
Tulsi Twitter 每周点赞数
这场争论证明了攻击政治对手有明显的好处。Twitter 就像一场皇家战争,战斗人员在冲突中茁壮成长。那些最能驾驭这些竞赛的人能够获得显著的关注。
最后的想法
今年 2 月,2020 年民主党提名战进入了最后阶段。随着我们进入爱荷华州党团会议,我们将看到哪位候选人在传播他们的信息方面做得最好。虽然没有什么能打败地面上的靴子和基层的支持,但我认为 2020 年在线宣传是必不可少的。当初选结果出来后,我想我们会看到那些在网上表现最出色的候选人将会在投票中获得奖励。
大数据及其应用的发展与趋势
探索大数据和人工智能
关于大数据的发展和趋势及其在电信行业和其他领域的应用
大数据是近年来计算机科学的一个重要分支。大数据领域的研究和创新从未停止。大数据发展迅速,正在越来越深刻地影响着我们的生活。是时候回顾一下大数据的发展历史,预测一下趋势了。本文有两个主要部分,第一部分是大数据的发展历史和趋势,第二部分是大数据的应用。
大数据的发展
首先,我们来看看大数据的发展。一个叫做 Hadoop 的项目诞生于 2005 年。Hadoop 是大数据领域非常重要的技术。它使用 MapReduce 编程模型为大数据的分布式存储和处理提供了一个软件框架。世界上许多国家和一些研究机构已经在 Hadoop 上进行了一些试点项目,并取得了一系列成果。
2011 年,EMC 举办了云与大数据的全球峰会,同年 5 月,麦肯锡发布了相关研究报告。他们预计,在未来十年内,所谓的数字宇宙将包含 35 吉字节的信息。EMC 推出了所谓的“EMC 大数据堆栈”,定义了他们对如何存储、管理和处理下游大数据的看法。
同年 12 月,中国工业和信息化部发布了物联网“十二五”发展规划。未来中国将加大对智能工业、智能农业、智能物流、智能交通、智能电网、智能环保、智能安防、智能医疗、智能家居的金融支持。它代表了大数据的初步应用。
2012 年至 2015 年间,包括联合国在内的全球多个政府和企业发布了一系列相关理念或行动纲要,以推动大数据的发展。之后,大数据进入高速发展阶段,2017 年大数据产业十三五发展规划在中国诞生,这意味着大数据开始在全球范围内被广泛应用和高速发展。
大数据的发展趋势
那么我们来看看大数据的发展趋势。大数据将如何一步步发展?
- 一开始,我们主要做的是将大数据开源技术商业化,并进一步深化相关技术。还有,根据不同行业定制相关技术。
- 在第二阶段,我们开始根据不同的行业开发不同的大数据应用,并将每个行业的端到端应用打包,以开拓新的行业市场。
- 第三阶段,进一步细分行业市场,进一步提升规模。
- 第四阶段,大数据会促进相关公司的并购,进而进一步增加更大公司的规模和数量。当这些工作完成后,就需要大数据才能真正得到一些有价值的分析结果。
- 在第五阶段,一种革命性的大数据分析方法将开始出现,它带来了一种新的分析理念和分析方法,可以在未来更长的时间内获得一些数据或结果的更准确的预测。
- 在第六阶段,我们将整合大数据和云计算,进一步改善大数据的性能,提高其计算效率。大数据的普遍性和泛化,让更多人接触到大数据技术。
- 然后一体机大数据机会陆续发布,也就是说大数据的硬件和软件会融合在一起,可以以一体机的形式快速被客户使用。根据客户的不同需求,我们可以进行一些软硬件定制开发,以适应各行业的不同特点。
大数据行业应用
先说大数据行业的应用。这部分主要看大数据在电信行业的相关应用和在非电信行业的相关应用。
大数据在电信行业的应用
我们来看看大数据在电信行业应用的主要方面。嗯,在电信行业,我们积累了很多数据:网络数据,运营数据,还有我们其他的一些数据。我们对这些数据进行单独分析和交叉融合分析。我们可以在网络、客户关系、业务运营管理和数据商业化方面孵化许多不同种类的应用。下面就让我们逐一看看。
网络操作
首先,我们看一下大数据在网络运营上的应用。大数据在电信网络上有许多应用。例如,网络基础设施的优化和性能管理是非常典型的相关应用。我们收集整个设备网络的性能信息,并进行相关的汇总和分析。然后我们看看基础设施哪里还有薄弱点需要加强,或者如果有故障,我们需要及时修复。
由于中国的高铁现在发展非常快,中国的电信公司也做了相关铁路的专项绩效管理建设。他们对这些主要铁路线进行了专题性能分析。当他们发现某个地方有信号衰减或者信号波动的时候,可以很快检查出这个地方为什么会出现这种问题。这是不是跟基站不足有关,是他们需要新建基站,还是相关设备需要调试,或者已经出现故障需要维修?都可以利用收集的大数据进行优化。
还有一些对网络运行的其他分析。可以总结出业务的端到端情况和整个网络的资源利用情况。从网络资源的供应到实际使用,再到对使用情况的监控,都可以得到优化和改进。
客户服务
然后我们来看看在客户关系中的应用。客户服务部的日常接线员需要处理来自客户的各种询问。我们可以利用大数据技术,在后端为他们建立一个庞大的知识库,帮助他们快速准确的找到答案,对每天收到的问题进行分析总结。可以找出主要集中在哪些问题,然后解决相关问题。
企业管理
大数据在企业的运营管理中也发挥着非常重要的作用。企业的运营管理会有很多运营监控指标。可以利用大数据技术收集相关指标进行计算。一方面,当指标表现出现波动时,我们可以及时给出预警,同时也可以分析这些指标为什么会出现波动,原因是什么,然后找到相关的解决方案。
精准营销
最后,电信行业的数据也能带来一些商业收入。比如广告,我们可以先进行一个简单的数据探索性分析:应该在哪个区域投放广告才能获得更大的响应率?一些重要事件怎么样?哪一组目标反应好?然后我们就可以根据这些数据来训练相关的模型,我们就可以知道我能精准投放广告的区域和地方,哪些是响应率最高的,比如一个城市的火车站,或者一个机场。
在我们投放这个广告后,我们必须跟踪投放广告的营销结果,我们有进一步的营销洞察力。我们收集广告投放后的一系列指标数据,我们会分析这个广告在这个地方投放的实际效果如何。通过这样一个不断迭代的过程,大数据也可以不断丰富相关指标,不断完善相关模型,进而为我们的商业决策提供越来越准确,越来越详细的决策依据。
环境保护
我们再来看看大数据在非电信领域的应用。那么大数据在非电信领域也有非常广泛的应用,比如和我们大家息息相关的环境问题。大数据广泛应用于环境保护,包括污染监测、灾害预警。在森林中安装了大量传感器,为监测和灾害预报提供环境数据。
公共安全
在我们熟知的公共安全领域,大数据被用来分析相关的公共安全数据,相关的预测,比如一些不寻常的人群,一些重点区域的人群监控,像在一个体育场,都需要用到。它不仅分析一些视频数据,图片数据,还从相关视频图像中提取内容,然后进行相关性分析,为大家营造一个安全的公共环境。
斯蒂芬·莱纳在 Unsplash 上拍摄的照片
金融
此外,我们在金融领域有很多大数据应用,如电子支付,以及一些相对较新的概念,如比特币和金融科技。
医疗保健
大数据现在也被用于医疗保健领域。已经有成功的案例是通过对大数据的分析,预测某种疾病的爆发。
建筑、运输等其他传统行业。也采用了大数据技术来构建自己的应用程序。
摘要
最后我们总结一下这篇文章的主要内容,从 2005 年到现在大数据的主要发展,然后我们谈到了大数据的发展趋势,从一开始它只是一个开源的 Hadoop 软件,到后来进行了定制和商业化,再到后来革命性算法的出现,最后是大数据一体机的出现,大数据已经逐渐成熟。
在第二部分中,我们讨论了大数据在电信行业中的一些应用,如网络性能管理和网络优化,这些应用可以为网络质量的提高带来巨大的价值。及时反馈网络存在的问题,也可以为网络优化提供一些决策依据。
然后我们谈到了在客户关系中的应用。比如在一个客服中心,我们可以利用大数据技术建立一个庞大的知识库,快速检索客服需要的答案,然后我们可以对问题进行总结,我们可以来分析我们还有哪些问题。
然后简单讲了一下大数据在企业运营中的应用。我们主要分析了一些指标,找到了这些指标变化背后的原因。
除了这些应用之外,我们还研究了电信行业中网络数据的使用,以生成一些具有商业价值的应用。比如广告投放,我们可以从广告投放的精准预测入手,然后跟踪广告投放的表现。通过持续这样的迭代,我们可以越来越准确地进行广告投放。这种商业实践为决策提供了更准确和更全面的基础。
最后,我们简单讲了一下在非电信行业的一些应用,我们可以看到大数据在环保、金融、交通、医疗、公共安全等等方面有非常广阔的应用场景。
如果你想对大数据和人工智能有一个大概的了解,也可以看看下面的文章:
大数据和人工智能发展迅速,正在深刻影响我们的生活,并大大提高我们的生活质量
towardsdatascience.com](/what-is-big-data-and-what-artificial-intelligence-can-do-d3f1d14b84ce) [## 人工智能的基本概念及其应用
机器学习,深度学习,强弱人工智能,神经网络简介:BP 和…
medium.com](https://medium.com/towards-artificial-intelligence/basic-concepts-of-artificial-intelligence-and-its-applications-294fb84bfc5e) [## 人工智能的三大领域及其工业应用
人工智能是一门研究和发展理论、方法、技术和方法的新技术学科
towardsdatascience.com](/three-major-fields-of-artificial-intelligence-and-their-industrial-applications-8f67bf0c2b46)
“细节决定成败”。机器学习也不例外。
人类是唯一两次被同一块石头绊倒的动物。你确定你不是其中之一吗?
我应该选择哪种算法?哪些假设是合理的?当我们构建一个新的机器学习解决方案或产品时,有不同的选项来实现它们,并且它们都假设不同的事情。
一开始不要觉得自己很傻。很明显,我们都会犯错误。
但是,对于刚接触机器学习的你来说,你可能想知道一些最常犯的错误。如果一切顺利,它将帮助您创建更强大的解决方案,并产生真正的价值。
如果你想了解更多,请访问oscargarciaramos.com
我们将从最常见的开始…
让我用我最喜欢的算法来解决所有问题!
可以想象,同一块不会适合所有的拼图。有多少人完成了他们的第一个教程,并开始为他/她能想到的任何用例使用相同的算法?错误。
让数据为你选择型号。要习惯这样一个事实,数据一旦处理完毕,就需要馈入不同的模型,比较它们的结果,才能知道哪些效果最好,哪些应该丢弃。
我们继续…
离群值不重要!
打扰一下。!你了解你的用例的上下文吗?离群值可能很重要,也可能被完全忽略,但您必须看上下文。还是确定公司销售的一个峰值不重要?你失去的不仅是金钱,还有信任。
从一个更技术性的角度来看,异常值可能具有不同的敏感度,这取决于我们正在使用的案例和模型。一个例子是比较 AdaBoost 模型*(自适应增强)*的灵敏度,其中异常值被视为“困难”情况并被赋予相当大的权重,以及比较 决策树 的灵敏度,其中异常值可能被识别为错误分类。
第三…均方误差总是很大的!
好吧,我们都知道这是一个很好的默认值,但是当我们推断和谈论现实世界时,这个误差函数对于我们试图解决的用例来说通常不是最佳的。
一个明显的例子是欺诈检测。想象一下,由于欺诈造成的金钱损失,我们想要惩罚假阴性。我们可以使用均方误差,它会给我们一笔钱,但肯定远远不是真实的。记住,我们谈论的是钱!
当我们谈论金钱时,错误是不被接受的。
几天、几小时、几个月……我该如何处理这些周期性特征?
当我们谈论第 23 小时时,我们必须确保 0 小时就在它旁边。通常犯的一个错误是没有将这些特征转换成可以将信息保存为其原始值的表示,这种情况发生在循环特征中。
解决方案?记住计算正弦和余弦分量,以便将它们表示为圆的坐标(x,y)。这样,如果我们要表示时间,23 永远和时间 0 并驾齐驱,理所应当。
回归呢?…
了解系数
线性回归通常会返回每个系数的 p 值。最常见的错误是什么?“系数越高—重要性越大” →错误。
记住,变量的比例完全改变了系数的值。如果变量或特征是共线的,系数可以从一个变化到另一个。因此,我们的特征集越大,它们共线的可能性就越大,因此,孤立的解释就越不可靠。
提醒一下:如果一个变量 X1 是另一个 X2 的线性组合(共线),意味着两者通过表达式 X1 = b1 + b2X2 相关,其中 b1 和 b2 为常数,因此两个变量之间的相关系数将为 1。
我们应该知道特征的重要性或权重,但是系数不能告诉你全部事实,只能告诉你一部分。
最后…
规范而不规范,不行!
如你所知,学习包括寻找最小化成本函数的系数。正则化包括向成本函数添加惩罚。然而,有时我们会忘记在规范化之前先规范化的重要性。想象一下,如果我们开发一个模型,其中包含以美元表示的变量和以美分表示的变量,我们会损失多少钱。押金。
那么,下一步是什么?
如你所见,“细节决定成败”。即使是最稳健、最有效和最稳定的模型也会有偏差和误差。
努力工作,检查两遍,不要过于自信。
一切都可以改进,一切都可以进化。
欢迎留言、鼓掌或分享这篇帖子。以后的帖子关注 me 。
如果你想了解更多,你可以在 oscargarciaramos.com 的找到我
数据科学和统计学的区别
意见
你是哪个角色,该不该转行?
由Unsplash【1】上的 krakenimages 拍摄的照片。
目录
- 介绍
- 数据科学家
- 统计员
- 类似
- 差异
- 摘要
- 参考
介绍
最有可能的是,在 21 世纪初,数据科学家的头衔在任何行业都不会出现,但它很快成为近年来职业趋势中爆发的热门词汇。这真的是我们第一次看到这样的工作吗?答案是不,在数据科学出现之前,我们已经看到过非常相似的职业。我们现在也看到了这个职业——统计学家的角色。
他们有什么不同?有哪些相似之处?这些是我将在以下部分回答的问题。继续阅读,找出哪个角色是哪个。
数据科学家
照片由 Arseny Togulev 在Unsplash【2】上拍摄。
这个角色最近变得非常受欢迎,这是有原因的。当你的业务中有一名数据科学家时,你是在为一个人招聘几个角色。成为一名数据科学家所需的技能令人望而生畏,需要勾选许多选项。这个角色可以被认为是跨职能的——需要了解业务的技术技能和软技能。仅仅知道编码技术是不够的,还要知道如何与非技术利益相关者和公司领导一起解决重要的业务问题。数据科学家需要了解一些简单明了的技能,但随着时间的推移,在这些情况下,您需要通过实践获得一些不一致的技能。这些技能是技术性较低的技能,通常包括但不限于:形成一个问题,形成一个问题陈述,创建一个回答该问题的过程,向利益相关者展示发现和解释结果。
数据科学所需的一些关键技能包括:
machine-learning librariesPython or R programmingSQL
统计员
统计学家的角色比数据科学家的角色存在的时间要长得多。需要这个岗位的行业数不胜数。如果你想在医疗保健、安全、学术、营销、经济和许多其他领域工作,你肯定会成为那里的统计学家。统计员的主要职责包括但不限于:实验设计、进行研究、创建估计和开展调查。你需要在数学和实验设计方面有很强的背景知识。这个职位也需要软技能。其中包括向利益相关者报告您的发现,以及这些统计发现需要他们各自做出的改变。
以下是统计的一些关键技能:
SAS ProgrammingExperimental designMathematics
类似
正如您可能已经看到的,这两个角色需要的一些技能是相似的,如果不是完全相同的话。那么,数据科学家和统计学家之间的主要相似之处是什么?以下是这两种角色之间的一些相似之处:
- 对数学的理解
- 调查问题
- 探索性数据分析
- 分析趋势
- 创建预测
- 可视化
- 向非技术用户报告调查结果
当然,这些角色之间有更多的相似之处,但这些是我从角色以及各自的工作描述中遇到的一些相似之处。随着时间的推移,知道统计学是否变得更像数据科学或者相反,或者它们是否彼此背离,将是一件有趣的事情。
差异
现在,让我们讨论一下这些角色之间的区别。
首先,统计学家比数据科学家存在的时间更长,这意味着差异可能在于新技术。
这是它们之间的主要区别,主要由那些新技术组成。
统计数字
- 一次性报道
- 使用 SAS 编程
- 关注诊断图
- 关注显著性检验
- 侧重于 t 检验、方差分析、方差分析等。
- 更多手动数据收集(有时来自调查)
- 通常,你会发现医疗保健和经济领域的统计学家
- 或更多学术设置
数据科学
- 自动化
- 使用 SQL 查询收集数据
- 像 sklearn 和 TensorFlow 这样的机器学习库
- 使用 Python 和 R 编程语言
- 部署自动化模型(到应用程序中)
- 关注软件工程实践
上述差异也可以在工作描述和个人经历中看到。根据公司的不同,你可能会发现其中一些技能是重叠的,但我相信这是这两种角色之间最大的区别。
摘要
照片由克里斯蒂娜@ wocintechchat.com在Unsplash【4】上拍摄。
所以,总结一下,统计学家和数据科学家或者数据科学和统计学研究之间的区别是什么?这可以用一句话来概括— 来自新技术的自动化。一个角色比另一个角色更重要吗?否。他们都是重要的角色。如果你想专注于显著性、测试、实验设计、正态分布和诊断绘图,那么成为一名统计学家。如果你想实践更多的软件工程,比如编码和机器学习模型的自动化,那么就成为一名数据科学家。你会发现,这两种角色的许多工作描述都有重叠,但很少找到统计员角色所需的机器学习库。
如果你正在考虑开始一份新的职业或转行,我希望这篇关于统计学家和数据科学家之间的相似性和差异的概述是有趣的,并对你有所帮助。当然,有更多的相同点和不同点,所以请在下面随意评论你在这些角色中有哪些经历。感谢您的阅读!
请记住,本文来自个人经验,这些研究和角色可能因大学和公司而异。
参考
[1]照片由 krakenimages 在Unsplash(2020)拍摄
[2]2019 年 Unsplash 上 Arseny Togulev 拍摄的照片
[4]照片由克里斯蒂娜@ wocintechchat.com在Unsplash(2019)上拍摄
特征转换、工程和选择之间的区别
作为数据科学家,它们是日常任务。但是你知道每一个是什么意思吗?
简介
当您开始学习数据科学概念时,您意识到有许多事情需要考虑。修饰过的名字无助于解释我们应该做什么,对吗?今天,我们将一劳永逸地了解它们的含义。
数据集
图片由雷南·洛里科拍摄——中号
我将使用我为另一篇文章创建的数据集。这组人工数据模拟了一些关于心脏病可能性的数据,这就是我们的目标。为了找到答案,我们有一些虚假的医疗信息,如血压、年龄和钠含量。
特征转换
图片由吉菲提供
我们将遵循一个顺序,从第一步到最后一步,这样我们可以更好地理解一切是如何工作的。首先,我们有特征转换,它修改数据,让机器更容易理解。这是数据清理和数据争论的结合。
图片由雷南·洛里科拍摄——中号
这里,我们填充空值,对分类资源进行编码,调整数值列的大小,并应用标准化和规范化;注意我们没有从当前的创建新的列;这就是转换不同于特征工程的地方。
特征工程
图片由 Giphy 提供
特征工程使用已经修改的特征来创建新的特征,这将使任何机器学习算法更容易理解和学习任何模式。
让我们看一个例子:
图片由雷南·洛里科拍摄——中号
例如,我们可以创建两个新列来检查患者是否患有低钠血症(钠浓度小于 135)或高钠血症(钠浓度大于 145)。输出将是下图。
图片由雷南·洛里科拍摄——中号
“心脏病”功能是一个条件列,也是我们的目标;如果心脏收缩指数大于 140 或心脏舒张指数大于 90,则为真。年龄也会影响结果。虚构的表示!
纪念
每个新创建的资源都需要以某种方式提高产量;否则会适得其反,恶化最终结果。当这种情况发生时,我们需要应用特征选择。
特征选择
图片由 Giphy 提供
比方说,你的数据包含一个巨大的特征集,它可以改善或恶化你的预测,而你只是不知道哪些是需要的;这就是你使用特征选择的地方。
特征选择学习每个特征对你的模型的影响并带来结果。这样,您就可以用正确的资源创建训练集、验证集和测试集。
特征选择。图片由雷南·洛里科拍摄——中号
但是等等!正如你在上面的图片中看到的,他们总是会出错,看起来“名称”功能有很大的影响,但我们知道它不会对我们的模型产生积极的影响。
最终提示
- 和特征选择一样,还有降维,降维要完整复杂得多。
- 几乎每个项目都可以用特性工程来改进,尽可能地使用它。
- 特征选择的使用直接取决于数据集中可用的特征数量;不到 20?考虑使用特征选择;否则,降维可能是必要的。
- 您不需要在所有项目中使用特性选择。
想了解更多?
有一篇文章列出了特性转换中的每一个必要步骤;真是过瘾!让我们来看看?
数据插补,宁滨,编码,等等!熟练掌握所有步骤!
towardsdatascience.com](/feature-transformation-for-data-scientists-3a9eed562752)
我在哪里可以找到这些材料?
如果您对我如何创建所有这些图形和代码感兴趣,您可以:
就这样,伙计们!
我希望你喜欢这个内容,并能熟练运用你的新知识!如果你想每天学习有趣的东西,我很乐意与你分享精彩的内容!
另外,你可以在 Github 上查看我的个人资料。我从事一些数据科学项目已经有一段时间了。所有的关键概念都可以学习和重用!
在 GitHub 上注册你自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方…
github.com](https://github.com/renfelo)
为什么难以销售人工智能驱动的解决方案
以及如何关注客户真正关心的问题
在 Unsplash 上拍摄的 ThisisEngineering RAEng
O 机遇敲门
对于我们中的一些人来说,这是当你发现自己处于一种商业环境中时,你会感觉到浪费时间,看到无处不在的低效,并开始思考“一定有更好的做事方法”。
你会看到大量的数据被生成,并对其中潜在的丰富性感到惊讶。你知道有一些价值,因为环顾四周,人们整天都在编写脚本只是使数据可用。
有一天,有人拉出了一个看起来很锋利的仪表盘,可以减少噪音,经理们都很兴奋…可能是因为他们现在可以更好地向上管理了。
一个声音低语道:“我们已经收集了这么多数据,我们是否应该开始寻找趋势…和模式?”。
但是谁有时间呢?还有能量?
几年后,一家公司带着为你的数据集量身定制的 AI/ML 解决方案来敲门。
他们承诺在所有数据中找到有价值的模式。可以导致更好决策的模式,减少浪费的时间,从而降低成本。
但是它的代价会让你的老板停下来问…“它真的值得吗?”
你的人工智能驱动的解决方案能提供多少价值?
“谁说数据是新的石油,谁是对的,现在石油一文不值。”——Philo Daniel,2020 年 4 月 27 日
试图销售人工智能解决方案的最难的一课是发现你提供解决的大多数问题都不够重要。并且已经以某种方式或形式解决了吗?
也许没有效率,也许没有效果,也许甚至很差…但足以维持现状。
乔希·温特斯在他那篇极其诚实的文章 中涵盖了所有这些,这是给人工智能 来之不易的建议,我们真希望自己在几年前第一次上市时就读过这本书。
没有人会失败
如果有一个信息一直被分析师重复,那就是数据科学/人工智能/ML/分析项目的失败率非常高。
原因有很多——缺乏目标、缺少专业知识、非数据驱动的文化以及解决一个可能不存在的问题。
总之,商业案例根本不起作用。
但正是在这种环境中,每一个失败的理由都围绕着我们,在这种环境中,我们必须以某种方式展示价值……对参与我们解决方案的每个层次的客户都切实可见的价值。
我们需要知道客户……企业……并不真正关心我们的技术或机器型号。
没有借口
假设您已经入门并开始试验,那么您最好找到一种方法来快速转换数据(不管有多糟糕),获得一个工作模型并产生接近可用的输出。
这些是赌桌。
如果数据是垃圾,想办法填补空白。考虑到客户可能也不知道,说“我们不能给你输出,除非你告诉我们输入数据是什么意思”是冒提前结束的风险!
借口并不重要,因为对于那些说“但我们认为你的人工智能可以找出丢失的东西并进行补偿”的人,通常没有礼貌的回答方式。
商业价值
最终(希望!),我们可能会到达一个感知价值的点,即您的 AI/ML 输出最终为客户提供了一个结果。
然后,这需要转化为一个商业案例,可以卖给那些可能不在房间里的人。
供应商— “看看这些见解…你们现在可以在硬件出现故障前一个月更换硬件了”
客户— “等等,我们为此信息向您支付了 100,000 美元,但计划外硬件故障的影响大约是 5,000 美元”。
供应商— “正是。此信息向您显示了 30 件硬件的计划—150,000 美元…因此您节省了 50,000 美元”
客户— “嗯,你的人工智能有多准确?你不是说 70%吗?你跟我说的精确是什么?
最根本的问题总是最终成为,人工智能驱动的解决方案是否能产生足够大的差异,从而值得购买?
从这一刻起,只是客户关心的商业案例。
脱离技术
当你不在的时候,你试图说服一个可能需要说服别人的人。因此,任何商业案例都必须独立存在。
然而,惰性无处不在,大多数客户都在努力构建自己的故事。
那么,我们如何提供帮助呢?
#1:使用 Tableau 或 Power BI 等数据可视化工具
无论 AI/ML 系统的输出是原始的,通过正式的 UI,还是使用 Python 库后期构建的,data viz 工具都可以帮助它与您的客户相关联。
对我们来说,这让我们的销售主管有机会随时改变视觉效果(甚至在会议期间),直到她找到最能引起客户团队不同成员共鸣的组合。
所有这些都不依赖于坐在千里之外的数据科学家。
这些不是复杂或花哨的仪表板。它们是简单的“决策支持”视觉效果,将销售过程推向正确的方向。
#2:微软 Excel
我们很少有项目没有使用 Excel 为客户构建商业案例的基础。
几乎总是,来自客户的某个人会向你要“数字”(他们可能不会告诉你具体是什么),然后用他们自己的内部预测来更新它。
通常,来自机器模型的数据需要被剥离,然后用财务、工时和各种其他指标进行补充,人们只有在很久以后才知道这些指标是重要的。
我们的大部分工作包括确保电子表格足够简单,便于客户使用,数字足够可靠,便于他们滥用!
#3:微软 Powerpoint
在顾客旅程的某个时刻,你的故事变得更清晰、更干净、更简洁,更有针对性地满足当下的需求。
这几乎总是需要反映在一两页的幻灯片中,用客户的话总结主要优势*。*
同样,这是一个客户问你的情况,你构建它并发送它,他们改变并将其提交给他们的利益相关者…没有你在房间里。
因此,确保消息传递的质量及其简单性是第一位的。数据科学上的不超载技术废话排第二!
或者,如果感到极度自信,你可以冒险让他们制作自己的幻灯片…
亲爱的读者,你觉得无趣吗?
老实说,如果你几年前问我们,我们会承认我们从来没有想到微软桌面工具会出现在数据科学文章中。
我们希望我们可以吹嘘我们如何巧妙地使用了 Bokeh 或 TensorFlow,或者我们最新的 ML 模型如何适合我们的用途。
但事实是,我们也在可视化、电子表格和幻灯片上花费了大量的时间。这一切都是为了让约定继续下去,并且沟通、沟通、沟通…
“我们不是做咖啡生意的。这是我们作为产品销售的东西,但我们从事的是人的业务——每周雇佣数百名员工,每周服务六千万顾客,这都是人与人之间的联系”——Howard Schulz,星巴克
我们问自己,我们是如何走到这一步的,我们得出的唯一结论是,数据科学工具和概念在很大程度上对我们的客户来说是相对陌生的。他们的输出太原始了…而且无情。
即使技术人员能够理解,工程师自己也很难与开支票的人沟通。
简单中有魔力
我们提到的工具既熟悉又安全…就像婴儿的安全毯。
对这些工具的熟悉有助于客户在他们能够理解和参与的平台上与我们的信息联系起来。
这些工具传达了客户将获得的结果。
引人深思的事
这也有助于我们理解客户的困境,并更好地表达同情。
对我们来说,这是关系建立的基础。
当然,这仅仅是我们的观点。也许我们正在吸着什么。
所以请不要误解我们。这需要时间…和努力…以及更多的时间。商业案例必须有效。他们还是要喜欢你,喜欢你说的话。也不总是以胜利告终。
但是下一次你看到数据科学敲打微软 Office 的时候,有一种更直截了当的回应方式。
(2020 年 2 月)上午 10 点左右,法国阿尔卑斯山雷伯蒂的云层翻滚