自然语言处理文本预处理:步骤、工具和例子
为自然语言处理任务预处理文本的标准逐步方法。
文本数据无处不在,从你每天的脸书或 Twitter 新闻,到教科书和客户反馈。数据是新的石油,文本是我们需要钻得更深的油井。在我们真正使用油之前,我们必须对它进行预处理,使它适合我们的机器。对于数据也是一样,我们必须清理和预处理数据以符合我们的目的。这篇文章将包括一些简单的方法来清理和预处理文本分析任务的文本数据。
我们将在新冠肺炎推特数据集上模拟这种方法。这种方法有三个主要组成部分:
首先,我们清理和过滤所有非英语的推文/文本,因为我们希望数据的一致性。
其次,我们为复杂的文本数据创建一个简化版本。
最后,我们对文本进行矢量化处理,并保存它们的嵌入内容以供将来分析。
如果您想查看代码:请随意查看第 1 部分、第 2 部分和第 3 部分嵌入这里的代码。你也可以在这里查看整个项目的 blogpost 和代码 。
(来源)
第 1 部分:清洁&过滤器文本
首先,为了简化文本,我们希望将文本标准化为只有英文字符。此功能将删除所有非英语字符。
def clean_non_english(txt):
txt = re.sub(r'\W+', ' ', txt)
txt = txt.lower()
txt = txt.replace("[^a-zA-Z]", " ")
word_tokens = word_tokenize(txt)
filtered_word = [w for w in word_tokens if all(ord(c) < 128 for c in w)]
filtered_word = [w + " " for w in filtered_word]
return "".join(filtered_word)
我们甚至可以通过删除停用词做得更好。停用词是英语句子中出现的对意思没有多大贡献的常用词。我们将使用 nltk 包来过滤停用词。由于我们的主要任务是使用词云可视化推文的共同主题,这一步是必要的,以避免常见的词,如“the”、“a”等。
然而,如果你的任务需要完整的句子结构,比如下一个单词预测或语法检查,你可以跳过这一步。
import nltk
nltk.download('punkt') # one time execution
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))def clean_text(english_txt):
try:
word_tokens = word_tokenize(english_txt)
filtered_word = [w for w in word_tokens if not w in stop_words]
filtered_word = [w + " " for w in filtered_word]
return "".join(filtered_word)
except:
return np.nan
对于 tweets,在清理之前我们需要考虑一个特殊的特性:提及。您的数据可能有(或没有)这样的特殊特性,这是具体情况具体分析,而不是普遍要求。因此,在盲目清理和预处理之前,要充分了解您的数据!
def get_mention(txt):
mention = []
for i in txt.split(" "):
if len(i) > 0 and i[0] == "@":
mention.append(i)
return "".join([mention[i] + ", " if i != len(mention) - 1 else mention[i] for i in range(len(mention))]
之前,我们清理非英语字符。现在,我们移除非英语文本(语义上)。Langdetect 是一个 python 包,允许检查文本的语言。它是 Google 的语言检测库从 Java 到 Python 的直接端口。
from langdetect import detect
def detect_lang(txt):
try:
return detect(txt)
except:
return np.nan
然后我们过滤掉所有非英语的列。
第一部分的所有代码都可以在这里找到。
第 2 部分:简化复杂的数据—位置?
对于数字数据,好的处理方法是缩放、标准化和规范化。这个资源有助于理解并将这些方法应用于您的数据。在这篇文章的范围内,我不会进一步讨论,因为其他资源已经做了很好的工作。
对于分类数据,有许多方法。两种名义上的方法是标签编码器(为每个标签分配不同的数字)和一种热编码(用 0 和 1 的向量表示)。关于这些分类值的更多细节可以在这里找到。这个资源非常丰富,比我提到的这两种编码类型更多。
本帖将介绍一些降低数据复杂度的方法,尤其是位置数据。在我的数据集中,有一个位置栏,有作者的地址。然而,我不能对这些原始数据进行太多的分析,因为它们太杂乱和复杂了(有城市、县、州、国家)。因此,我们可以对文本进行标准化,并将其简化到“国家”级别(如果您感兴趣,也可以是州)。处理位置数据的包是 geopy 。它可以识别正确的地址并将这些位置重新格式化为标准格式。然后,您可以选择保留您需要的任何信息。对我来说,国家已经够体面了。
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="twitter")def get_nation(txt):
try:
location = geolocator.geocode(txt)
x = location.address.split(",")[-1]
return x
except:
return np.nan
Python 有这么多包,太牛逼了。我相信你总能找到满足你特定需求的东西,就像我处理我杂乱的位置数据一样。祝你好运,简化这些杂乱的数据。
第二部分的代码可以在这里找到。
第 3 部分:矢量化和嵌入
文本矢量化是将文本转换成值的向量来表示它们的含义。早期,我们有一种热门的编码方法,它使用一个向量,这个向量的大小是我们的词汇量,在文本出现的地方取值 1,在其他地方取值 0。如今,我们有更先进的方法,如空间、手套,甚至伯特嵌入。对于这个项目的范围,我将向您介绍 GloVe in python 和 Jupiter 笔记本。
首先,我们下载嵌入。你可以在这里手动下载或者直接在笔记本上下载。
!wget [http://nlp.stanford.edu/data/glove.6B.zip](http://nlp.stanford.edu/data/glove.6B.zip)
!unzip glove*.zip
然后,我们创建一个函数来矢量化每个数据点。这个句子是每个单词的意思表示。对于空句子,我们将其默认为零向量。
def vectorize(value, word_embeddings, dim = 100):
sentences = value.to_list()
sentence_vectors = []
for i in sentences:
if len(i) != 0:
v = sum([word_embeddings.get(w, np.zeros((dim,))) for w in i.split()])/(len(i.split())+0.001)
else:
v = np.zeros((dim,))
sentence_vectors.append(v)
sentence_vectors = np.array(sentence_vectors)
return sentence_vectors
最后,我们对整个数据集进行矢量化,并将矢量化的 numpy 数组保存为一个文件,这样我们就不必在每次运行代码时都重复这个过程。矢量化版本将保存为 numpy 数组,格式为。npy 文件。Numpy 包便于存储和处理海量数组数据。
作为我个人的标准实践,我尝试在每个部分之后将所有数据保存为单独的文件,以便更灵活地评估数据和修改代码。
def vectorize_data(data = data, value = 'english_text', dim = 100):
# Extract word vectors
word_embeddings = {}
f = open('glove.6B.{}d.txt'.format(str(dim)), encoding='utf-8')
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
word_embeddings[word] = coefs
f.close() text_vec = vectorize(data[value], word_embeddings, dim)
np.save("vectorized_{}.npy".format(str(dim)), text_vec)
print("Done. Data:", text_vec.shape)
return True
第三部分的代码在这里。
结论
数据预处理,特别是文本,可能是一个非常麻烦的过程。你的机器学习工程师工作流程的很大一部分将是这些清理和格式化数据(如果你的数据已经非常干净,那你是幸运的&所有数据工程师都为此做出了贡献)。
本帖所有的代码都很抽象,可以应用到很多数据项目中(只需要改成列名,应该都可以正常工作)。在笔记本中,我还添加了异常函数来处理失败情况,确保您的代码不会中途崩溃。我希望它对你的项目有所帮助,就像我对我的项目有所帮助一样。
你可以在这里查看项目博客。
祝你的项目好运,如果有什么需要改变和改进的地方,请告诉我!谢谢,下一篇帖子再见!
参考资料:
黑尔,J. (2020 年 2 月 21 日)。使用 Scikit-Learn 进行扩展、标准化或规范化。检索自https://towards data science . com/scale-standard-or-normalize-with-scikit-learn-6 CCC 7d 176 a 02
KazAnova。(2017 年 9 月 13 日)。包含 160 万条推文的 Sentiment140 数据集。检索自https://www.kaggle.com/kazanova/sentiment140
普雷达,G. (2020 年 8 月 30 日)。COVID19 推文。检索自 https://www.kaggle.com/gpreda/covid19-tweets(2020 年 4 月 25 日)。关于分类变量编码的一切。检索自https://towardsdatascience . com/all-about-category-variable-encoding-305 f 3361 FD 02
抽象主题建模
从长文本中引出主题
这是 4 部分文章的第 3 部分。到目前为止,我们一直在谈论:
在本文中,我们将使用长文本文档 的摘要版本来查找构成每个文档 的主题。我们在主题建模之前对文本进行总结,因为在一些文档中可能会有额外的细节。然而,其他人可能只是抓住了要点。
等等,但是为什么要模型题目呢?这到底是什么意思?
主题建模用于发现文档集合中出现的抽象“主题”。它是一个常用的文本挖掘工具,用于发现文本中隐藏的语义结构。
作者图片:原始文本文档
我们希望保持简洁明了的信息,以便识别每个长文档的主题。所以,我们把这段文字总结成这样:
图片 bu 作者:总结文字
主题建模
我们将不会做任何进一步的预处理,因为我们已经基本上预处理时,清理文本最初,只有短语在总结中。
和前面的章节一样,我们首先证明了总结是否可行。让我们看看集群是否可行。
from numpy import dot
from numpy.linalg import normexam = nlp.parser.vocab[u"exam"]# cosine similarity
cosine = lambda v1, v2: dot(v1, v2) / (norm(v1) * norm(v2))allWords = list({w for w in nlp.parser.vocab if w.has_vector and w.orth_.islower() and w.lower_ != "exam"})# sort by similarity to Exam
allWords.sort(key=lambda w: cosine(w.vector, exam.vector))
allWords.reverse()
print("Top 5 most similar words to exam:")
for word in allWords[:5]:
print(word.orth_)
哇!!!那么这是否意味着我们甚至可以找到文档之间的相似之处呢?是啊!!因此,我们有可能找到这些不同文档的集群!!!!
寻找主题的最佳数量
潜在狄利克雷分配(LDA) 是文本文档的贝叶斯概率模型。它从未被观察的组中确定观察集。因此,解释了数据的相似部分。
观察是来自文档的单词。每个文档都是少量主题的组合。每个单词的出现都归因于文档的一个主题。
主题建模
你们中有多少人真正理解了上面部分发生的事情?如果你不知道,请告诉我,我很乐意再写一篇关于这本字典解释的文章!
我们能想象一下上面的话题吗?是的,我们可以。
作者图片:点击每个主题,了解它是如何由术语组成的
这表明话题是根据谈论的疾病/状况来分配的。太好了,让我们看看成绩单中的话题倾向。
当 LDA 找到上面的主题时,它本质上是试图在组中找到单词的出现。这确实意味着我们有一个与每个主题的每个图表相关联的概率分数。但是,我们并不是对它们都有信心。所以我们只提取 90%以上倾向的。
如果仔细观察,并不是所有的图表都有主题。这是因为该算法不符合我们的话题倾向性截止标准。
作者提供的图片:带有最终主题和主题倾向的图表注释(范围为 0–1)
让我们想象一下我们已经确定的图表的主题/集群和频率
作者图片:话题频率
结论
这里可以看到 topic_21 的图表最多。紧随其后的是 topic_15 和 topic_14 。
接下来,我们对这些文本文档进行聚类!
如果你想自己尝试整个代码或跟随,请到我在 GitHub 上发布的 jupyter 笔记本:https://GitHub . com/gaurikatyagi/Natural-Language-Processing/blob/master/introduction % 20 to % 20 NLP-Clustering % 20 text . ipynb
2020 年的 NLP 趋势和使用案例
业界最喜欢的 NLP 技术、最大的趋势、挑战和使用案例
由两张 Adobe Stock 照片创建的图像
自然语言处理(NLP)是人工智能中最令人兴奋的领域之一,它使计算机能够理解人类语言。NLP 技术在不断发展,越来越多的组织开始使用有前途的应用程序来解决各种各样的问题。
公司使用 NLP 到底是为了什么?在实际环境中,什么是令人兴奋的自然语言处理技术?应用它们时有什么挑战?
我们与不同行业中应用 NLP 的思想领袖谈论了他们最喜欢的 NLP 技术、最大的趋势以及 NLP 在 2020 年的机遇和挑战。他们是这样说的:
你认为最近你的组织在应用 NLP 方面最大的变化是什么?
“在数据不断变化的情况下训练越来越大的模型。我们推出的功能越来越复杂,这意味着他们通常需要更大的 ML 模型来支持他们,这反过来又会影响基础设施和培训时间。同时,特别是使用 COVID,我们需要为用户提供的信息会不断变化,这意味着我们需要确保我们的模型不断更新。幸运的是,我们已经能够调整我们的开发和数据维护流程,以适应频繁但更长的培训时间,但要跟上这一过程是一个相当大的挑战。”—Bespoke 首席技术官 Christine Gerpheide
“AI 和 NLP 的准确性主要基于大量和多样化的训练数据,这是许多组织所不具备的。合成训练数据只能到此为止。因此,让我们的客户能够收集丰富多样的培训数据已成为我们的首要任务。
更具体地说,将道德第一的方法引入培训数据收集,帮助我们的客户进一步提高了在聊天、电子邮件、网络和移动设备上个性化客户体验的能力。”— 彼得·斯塔德林格,Freshworks CRM 产品负责人
在未来 1-3 年内,您认为哪个 NLP 使用案例是让您的行业受益的最大机会?
“要创建高质量的生产就绪型 NLP 应用程序,缺乏足够的格式化/标记数据以及经济实惠的计算/GPU 机器仍然是该行业大多数人面临的最大挑战。随着迁移学习/预训练模型的出现,更多由 NLP 技术驱动的应用将会更快地进入市场。我们将在未来 1 到 3 年内开始看到新的和改进的数字和虚拟助理(下一代现代机器人和聊天机器人)进入市场。在不久的将来,在房地产、法律和教育等领域使用 NLP 的垂直目标企业将开始激增。”—Unify Consulting/加州大学伯克利分校数据科学总监 Vamsi sistra
“医疗保健或任何其他特定领域面临的挑战是文档中使用的独特术语和有限的数据集,以便能够训练现有的模型。目前,该行业正在收集和预处理原始数据,我认为在未来 1-3 年内,我们将看到许多新的名称实体识别模型的实现,以及分类和总结。”— 约翰·斯诺实验室的高级数据科学家艾莉娜·佩图霍娃
“我们为旅游部门和紧急通信制作了一个聊天机器人通信平台。现在,许多交流仍然是通过电话、联络中心或纸张进行的。这些媒体对许多人来说是一种痛苦,尤其是那些使用其他语言的人。我认为 NLP 在这些领域推动社会进步的最大机会之一是充分提高对自然语言的理解,以便我们可以几乎完全依赖自动化的即时客户服务来提供旅行和紧急咨询。这个想法本身并不新鲜,但研究现在已经存在,所以在产品公司内部,我们需要保持全速前进,利用研究来实现这一理想。”Bespoke 首席技术官 Christine Gerpheide
“我对 NLP 如何用‘结构化’文本来提高自动化非常感兴趣,比如编程语言和专业通信(例如,我在想飞行员和空中交通管制员是如何通信的。)通过对这些语言的分析,我们能理解什么?我们能否自动检测错误,如软件错误或空中交通管制中的沟通失误?”—Anyscale 的开发者关系主管迪恩·万普勒
“虽然聊天机器人多年来一直处于上升趋势,并得到了广泛的采用,但它们在本质上仍然非常基础,不容易增强或扩展,更不用说自我训练了。不可否认的是,像 GPT 3 这样的突破性技术将推动下一代聊天机器人——对话聊天机器人的进步和采用。这些人将能够不断自我提高,并处理更复杂的对话。
在商业软件中,这将使品牌能够显著改善客户体验,同时保持甚至降低成本。我和我的团队处于开发和普及这种聊天机器人的最前沿。——peterstadlinger,Freshworks 的 Freshworks CRM 产品主管
“像伯特、GPT 或其他衍生工具这样的大型语言模型将成为主流,并将全面惠及所有行业。它们捕捉大量语言结构的能力可以作为许多应用程序的基础。这些语言模型的迁移学习或微调将导致许多形式的监督学习 NLP 任务的性能飞跃。”—Adarga 的机器学习工程师 Sebastian Reitz
你个人对哪种新的 NLP 技术和想法最感兴趣?
“自然语言处理在医疗保健领域带来了一些令人兴奋的机会。在医疗保健中实现自然语言处理是未来的趋势,因为这些技术在很大程度上改善了医疗服务。
对我个人来说,最令人兴奋的想法之一是它在临床决策中的规则,因为自然语言处理和医疗保健中的机器学习帮助医生为他们的患者做出更好的医疗决策,因为 NLP 用于帮助他们检查症状、诊断、药物、过敏、程序和副作用以及正在治疗的病例的每一个可能的原因。
另一个引人入胜的应用是计算机辅助编码,因为 NLP 承诺提高编码器的准确性,因为计算机辅助编码提取关于所有症状、诊断、程序和药物的信息,以捕获每个可能的代码并最大化索赔,因此这两种用途对患者和整个医疗保健系统都非常有益。约翰·斯诺实验室的临床数据研究员玛丽安·麦
“基于变形金刚的语言模型,如伯特或 GPT,是自然语言处理的突破性进展。然而,它们非常大,包含数百万个参数。因此,这些模型越大,快速和大规模的推理就越慢或成本越高。较小的模型版本如 ALBERT 或 DistilBERT 是应对这种情况的好方法。它们仍然可以捕获大量的结构和语义知识,同时允许更快速的微调和推理。”Adarga 的机器学习工程师 Sebastian Reitz
“可控一代。NLP 和 ML 在生成自然对话方面最近有了实质性的进展。但是,在旅行尤其是紧急通信中,往往会有特定的内容需要我们以某种语气回复或回复。因此,我们面临的最大技术挑战之一是将策划的对话内容与生成的内容相融合,前者质量高,但制作起来需要大量劳动力,后者是自动生成的,但不可预测。因此,我对最近的进展和可控生成的潜力感到非常兴奋,它可以帮助我们实现生成的、听起来自然的内容,同时保留我们需要的细节或细微差别。”Bespoke 首席技术官 Christine Gerpheide
“将我们在卷积神经网络中用于图像分类的方法应用于文本处理的想法让我非常兴奋,例如 CNN 层和注意力机制。现在我感兴趣的焦点是图形神经网络在自然语言处理中的应用。”—约翰·斯诺实验室的高级数据科学家 Alina Petukhova
你认为在你的行业中成功应用 NLP 的最大挑战是什么?
“如果我必须选择一个:在 R&D 和组织的其他部分之间建立桥梁,以确保产品公司有效地利用研究。这些天有很多令人惊讶的 NLP 研究,对这种职业道路的兴趣已经飙升。但是现在我们需要确保我们知道如何将 NLP 用例的范围扩大到那些将使真正的客户受益的用例。最直接的例子是确保我们不会过度工程化简单的事情,并且我们的目标用例具有适合 NLP 或 ML 的正确的安全性、隐私性和可再现性需求。
在我看来,更致命的是在选择研究领域时没有考虑过程。例如,你的 R&D 团队可能开发了一个杀手级的新模型,但是如果它不能用当前的公司流程来维护,那么在它有用之前必须解决这个问题。更新组织范围内的流程不是一件容易的事情,过去我已经看到它扼杀了有前途的研究项目。”Bespoke 首席技术官 Christine Gerpheide
“许多监督学习任务明显缺乏训练数据,尤其是在国防和安全行业。该行业对训练数据的高特异性和可靠性的需求加剧了这种情况。因此,训练和测试数据的标记需要由主题专家来完成——就像在许多 NLP 任务中一样。这使得获取数据更加困难,成本也更高。”Adarga 的机器学习工程师 Sebastian Reitz
“在商业软件中,NLP 中有许多“小数据”问题,只有通过使企业能够从其员工和客户那里收集更精细和相关的培训数据,才能解决这些问题——通过用户界面无缝收集。用户界面显然已经成为商业软件中人工智能和自然语言处理的新战场。”— Peter Stadlinger,Freshworks 的 Freshworks CRM 产品主管
“在过去的两年中,NLP 的突破主要是由类似 BERT 的架构(即变压器)推动的。然而,与经典的预训练嵌入相比,这些方法在预训练、下游任务训练和推理期间需要大量的计算资源(存储器、时间)。此外,我最担心的是,研究人员正在远离 NLP 的基本原理,同时试图用另一个 BERT 来击败最新的 BERT 基准。我在面向客户的实际工作项目中的亲身经历告诉我,变形金刚并不是一根能够解决所有问题的魔杖。有时,即使简单的计数矢量化也比复杂的 BERT 方法做得更好。
另一个问题是,只有少数研究人员对变压器有足够的了解,而且由于高级别的易于使用的包和包装,在行业中工作的人使用这些工具时并不太担心其内部机制。如果不了解它是如何工作的,以及在引擎盖下发生了什么,这些块盒模型通常无法解决来自特定领域的真实世界的情况,在这些领域中,带有一点特征工程的更简单的模型会用更少的努力做得更好,并且从长远来看易于维护和修改。”— 约翰·斯诺实验室首席数据科学家兼 ML 工程师维塞尔·科贾曼
“管理所有工件,包括数据和模型,尤其是满足受控生产部署的需求,是一项挑战。做特别的实验是一回事,做精心控制的模型开发和生产部署是另一回事,然后监控他们做得如何。您需要完整的生命周期管理。”Anyscale 的开发者关系主管迪安·万普勒
你喜欢这本书吗?你想深入实际的 NLP 应用和趋势吗?加入由约翰·斯诺实验室提交的# NLP 会议的思想领袖们,会议将于 10 月 6 日至 9 日举行。该活动将包括 30 多场独特的会议和高级认证培训研讨会。
沃森和 GPT 的 NLP 视频摘要
Siri,请观看我长达 1 小时的大学讲座视频,并为我做一个总结
阿玛多·洛雷罗在 Unsplash 上的照片
在这个项目中,我探索了 GPT2(它有大约 10 亿个参数)的能力,并且只能想象最近的 GPT3(它有 1750 亿个参数)的能力!,可以写从软件代码到艺术诗。在这个项目中,我使用了 Silvia Salini 教授(米兰大学数据科学负责人)的大学讲座-统计学习入门课程,并让 AI (IBM WATSON)观看了整个讲座并为我写下它,然后我训练了 GPT 2 模型,因此它可以将沃森写的 500 行文本总结为 10 行。
- 我使用 IBM Watson 是因为它可以让你免费使用 500 分钟的语音到文本,而不需要输入任何信用卡信息,不像 Google Cloud 和 Azure。
- 在 GPT2 模型中,我保持了低概率和高词汇使用率,因此 GPT2 不会从自身制造任何新信息,从而使讲座摘要完全错误
- 我只通过一次讲座来训练模型,从而创建了一个原型,但是为了更好地学习模型和词汇,您可以尝试特定主题的多次讲座。
1 将讲座转换成音频文件
2 让沃森观看讲座并学习
IBM Watson 基于文件持续时间和大小对免费用户的语音转文本文件有限制,所以我把 1 小时的演讲音频文件分成 6 个不同的音频文件。
Watson API 凭证可以从 cloud.ibm.com 的演讲文本资源中获得
让沃森听完我制作的所有 6 段音频,并将其写入文本,
我选择了第一个对准确性最有信心的选项。
将结果写入文本文件,并将所有音频的结果合并到一个名为 lecture.txt 的文本文件中
3 GPT 2 模型调优
GPT 2 是一个因果文本生成,来自开放人工智能的预训练模型,用于预测。
GPT-2 生成合成文本样本,以响应用任意输入启动的模型。这个模型就像变色龙一样——它适应条件文本的风格和内容。这使得用户可以根据他们选择的主题生成真实且连贯的续篇—https://openai.com/blog/better-language-models/
4 讲座摘要生成
结果
虽然 GPT2 模型的能力令人印象深刻,但我们仍然不能依赖 GPT2 的确凿事实,尽管我发现它更准确,更省时,例如,当你在 NLP 上投资的资源较少时,像 GPT2 或罗伯塔这样的预训练模型显然会比一个人做单词嵌入和训练一周的 NLP 模型工作得更好,所以,GPT 2 是一个不错的开始,或者是引入像聊天机器人这样的实验项目, 或者会说话的网站,但是对于更专业的使用,好的资源需要根据自己的需要花在定制的 NLP 模型上。
关于完整的 jupyter 笔记本和代码,你可以在 github.com——https://github . com/Alexa Mann/NLP-Video-summarying-with-Watson-and-GPT上查看我的知识库
带 CNN 的 NLP
一步一步的解释,以及该架构的 Keras 实现。
https://en.wikipedia.org/wiki/Convolutional_neural_network
卷积神经网络(CNN)是图像处理和图像识别中最广泛使用的深度学习架构。鉴于他们在视觉领域的至高无上,尝试在机器学习的不同领域实现是很自然的。在本文中,我将尝试从自然语言处理的角度解释有关 CNN 的重要术语,还将提供一个简短的 Keras 实现和代码解释。
滑动或卷积预定数据窗口的概念是 CNN 如此命名背后的核心思想。这个概念的一个例子如下。
作者图片
这里首先要注意的是将每个单词(记号)表示为三维单词向量的方法。然后,一个 3×3 的权重矩阵在句子中水平滑动一步(也称为步幅),一次捕获三个单词。这个权重矩阵被称为过滤器;每个滤波器也由一个激活函数组成,类似于前馈神经网络中使用的那些。由于一些数学性质,激活函数 ReLU(校正线性单元)主要用于细胞神经网络和深度神经网络。回到图像分类,这些滤波器背后的一般直觉是,每个滤波器可以检测图像的不同特征,滤波器越深,就越有可能捕捉到更复杂的细节,例如,Convnet 中的第一批滤波器将检测边缘和线条等简单特征,但最后面的特征可能能够检测某些动物类型。所有这些都是在没有对任何过滤器进行硬编码的情况下完成的。反向传播将确保从数据中学习这些滤波器的权重。
下一个重要步骤是计算输出(卷积特征)。例如,下面我们将考虑一个 55 的图像和一个 33 的过滤器(在处理 CNN 时,您将主要使用正方形矩阵)。当每个过滤器在数据窗口上滑动一个步长时,通过对元素乘法求和来计算输出图层,每个像素乘以其在过滤器中的相应权重。以下示例说明了如何计算输出图层中的第一个像元;图像中的红色数字代表过滤器中的权重。
作者图片
计算如下:(1∫2)+(1∫1)+(1∫0)+(0∫1)+(2∫0)+(0∫1)+(0∫0)+(2∫1)+(0∫4)= 5
具有激活功能的 python 代码应该是:
z0 = max(sum(x * w),0)
在 2D 滤波器的情况下,可以使用以下公式计算输出层的大小:
(N-F)/S +1
N =图像的大小,F =滤波器的大小,S =步幅(在我们的例子中为 1)
当应用于文本时,您将使用在一维窗口中水平滑动 3 步的过滤器:
作者图片
填充
最后两个示例产生的输出大小小于输入的大小。也不难想象过滤器不完全适合给定数量幻灯片的矩阵的情况。为了应对这些复杂情况,可以通过两种方式使用衬垫:
- 用零向量填充外部边缘(零填充)
- 忽略不适合过滤器的矩阵部分(有效填充)
作者图片
统筹
池化相当于 CNN 中的降维。中心思想是,我们必须将输出层划分为子部分,并计算最能代表输出的值。之所以如此有效,是因为它有助于算法学习数据的高阶表示,同时减少参数的数量。联营的类型:
- 总和池
- 最大池化
- 平均池
以下是最大池的一个示例:
作者图片
全连接层
末端的全连接层接收来自先前池化和卷积层的输入,然后执行分类任务。在我们的例子中,我们将把 300 个单词的表征窗口分类为 1-积极情绪。0-负面情绪。全连接层中的最后一个神经元将 250 个神经元的加权平均值作为 sigmoid 函数(返回(0,1)之间的值)
Keras 实施
在这一节中,我们将尽量保持代码对于 NLP 用例的通用性。为了简单起见,我们将不深入数据预处理的细节,但是一般的过程是对数据进行标记化和矢量化。在我们的示例中,使用了 word2vec 嵌入,每个标记表示为一个 300 维的单词向量。我们的数据也被填充,每个句子包含 400 个标记,长句在 400 个标记后被删除,而短句用零填充。每个句子的最终尺寸是 300*400。然后我们把数据分成 x_train 和 x _ test 我们不会在这个项目中使用验证数据集。现在我们已经准备好数据,我们可以定义一些超参数。
##hyper parameters
batch_size = 32
embedding_dims = 300 #Length of the token vectors
filters = 250 #number of filters in your Convnet
kernel_size = 3 # a window size of 3 tokens
hidden_dims = 250 #number of neurons at the normal feedforward NN
epochs = 2
现在我们可以开始使用 Keras 库构建模型了。
model = Sequential()
model.add(Conv1D(filters,kernel_size,padding = 'valid' , activation = 'relu',strides = 1 , input_shape = (maxlen,embedding_dims)))
这里我们知道填充是有效的,这意味着我们不会保持输入的大小,得到的卷积矩阵的大小将是 100*1。在两个窗口中取最大值的最大池层。
model.add(GlobalMaxPooling1D())
#GlobalMaxPooling1D(n) default = 2.
然后,我们以 0.2 的丢失率添加完全连接的层(我们用它来应对过度拟合)。最后,输出神经元将基于 sigmoid 激活函数触发。Keras 会把低于 0.5 的归为 0,高于 0.5 的归为 1
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
最后一步是编译和拟合模型。
model.compile(loss = 'binary_crossentropy',optimizer = 'adam', metrics = ['accuracy'])
model.fit(x_train,y_train,batch_size = batch_size,epochs = epochs , validation_data = (x_test,y_test))
现在你可以坐下来看你的模型训练了。我们能够使用斯坦福大学 60%的训练数据达到 90%的准确率。你可以在本书的第 7 章找到更多细节:自然语言处理在行动。
摘要
- 在自然语言处理中,细胞神经网络可以用于不同的分类任务。
- 卷积是在更大的输入数据上滑动的窗口,重点是输入矩阵的子集。
- 在正确的维度上获取数据对于任何学习算法都是极其重要的。
使用朴素贝叶斯似然的特征选择的文本分类
使用 Python 和一个小型说明性数据集的教程
在本文中,我将讨论如何使用朴素贝叶斯似然法来确定重要的特征,即 P(feature | class)。
假设我们有一个文本分类任务,作为第一步,我们将把单词标记化和词条化成特征。接下来的问题是,在分类任务中,哪些特征具有最强的预测能力。
为了简单起见,我们将考虑这个人工玩具天气数据集,其中的特征包括九个与天气相关的英语术语,因变量使用一些未指定的标准来指示天气是否“适合”。
因为这只是一个说明性的研究,所以我不想分成训练集和测试集。对全部特征集运行朴素贝叶斯分类会得到以下结果:
接下来,计算要素可能性 p(要素|类)得出:
在这里,我按照两个类之间可能性的绝对差异进行排序。你可以看到,多风的特征最能说明问题:在不适宜的天气(0.27)发生的频率是适宜天气(0.09)的三倍。无风和温和特征具有高度预测性,仅在合适的天气中被提及。而特征多云根本没有预测能力,在合适和不合适的天气中同样可能发生。
接下来,我将重新运行仅具有前三个特征的朴素贝叶斯分类:多风、平静 & 温和:
你可以看到准确率提高了 11 个百分点。
另请注意,重要的是,由于我们将特征集从九个减少到三个,朴素贝叶斯分类器使用的特征可能性也发生了变化:
实际值与预测值的比较:
总之,基于条件似然概率区分能力的特征选择可以提高查准率和查全率。
当然,数据集非常简单,结果可能会有所不同。在我的下一篇博文中,我将尝试将这种方法应用于更大的 tweets 语料库。
Python 代码
我现在将强调实现的一些特性。完整的 Python 代码在这里:https://github . com/benlaird/tweet _ 情操/blob/master/feature _ selection . py
函数compute _ relative _ freq _ df使用相对频率计算可能性:
内置 Python 函数 SelectKBest 调用的可调用函数:
我使用的管道:
#原色
使用自然语言处理分析提及 2020 年民主党总统候选人的推文
*** 该分析在二月中旬进行
虽然今年早些时候民主党初选激烈激烈,但我和我的合作伙伴 Julia 认为,在我们的数据科学训练营期间,对政治推特进行自然语言处理(NLP)项目是一个好主意。由于 Twitter 是一个非常受欢迎的新闻和人们分享观点的论坛,我们想看看我们是否可以根据 Twitter 的活动发现关于这场比赛将如何进行的任何见解。
我们是这样做的:
数据
为了获得推文,我们使用了一个名为 Twint 的高级 Twitter 抓取工具,它允许您在不使用 Twitter API 的情况下抓取推文。为了避免明显的偏见,我们专注于提到候选人的推文,而不是候选人自己写的推文*。*
- 每条推特只包含一个候选人的名字和/或推特账号
- 使用来自验证过的账户的推文,只使用来限制推文的数量,因为推文太多了
- 从推文中移除了链接和图片,并使用 语言检测 移除了非英语
情感分析
为了运行情感分析——从文本中提取感觉/情感——我们使用了 VADER 情感分析 (价感知词典和情感推理机)。正如其文档所述,VADER 是“一个词汇和基于规则的情绪分析工具,专门适应社交媒体中表达的情绪。”
- 获得每位候选人推文的正面、负面、中性和复合得分:
# Create sentiment analysis functions analyzer = SentimentIntensityAnalyzer()def positive_sentiment(row):
scores = analyzer.polarity_scores(row['tweet'])
positive_sentiment = scores['pos']
return positive_sentimentdef neutral_sentiment(row):
scores = analyzer.polarity_scores(row['tweet'])
neutral_sentiment = scores['neu']
return neutral_sentimentdef negative_sentiment(row):
scores = analyzer.polarity_scores(row['tweet'])
negative_sentiment = scores['neg']
return negative_sentimentdef compound_sentiment(row):
scores = analyzer.polarity_scores(row['tweet'])
compound_sentiment = scores['compound']
return compound_sentiment
2.获得每个候选人在每个类别中的平均极性得分
3.根据哪个分数更高,将每条推文标记为正面或负面
4.为每位候选人创建了一个包含正面和负面推文平均数量的字典,用于可视化:
(将特朗普总统纳入分析进行比较)
我们看到,总体而言,大多数关于每位候选人的推文都被认为是“积极的”,围绕更具争议性的候选人的“消极”情绪有所上升。
主观性分析
对于我们的主观性分析——提取个人意见/观点/信念——我们求助于 TextBlob ,这是一个用于处理文本数据的 Python 库。“TextBlob”提供了一个一致的 API,用于处理常见的自然语言。
- 获得每条推文的情感
- 使用 正则表达式 捕获浮点值,然后将字符串转换为浮点值
主观性是在[0.0,1.0]范围内的浮动,其中 0.0 非常客观,1.0 非常主观
正如我们所看到的,大多数关于伯尼·桑德斯的推文似乎都非常客观,而其余的主观性得分呈正态分布。
TF–IDF
TF–IDF(词频–逆文档频率),在这种情况下,反映了一个词在整个推文中对一条推文有多重要。“TF–IDF 值随着一个词在[Tweet]中出现的次数成比例增加,并被包含该词的[Tweet 集合]中的[Tweet]数量抵消。”对于我们的 TF–IDF 分析,我们使用 Scikit-Learn 的 特征提取 方法。
- 将符号化 所有的 Tweets 使用 NLTK 函数,并将所有的符号小写
- 删除了 NLTK 的 停用词 列表中的词
- 将我们的推文集合转换为令牌计数矩阵
- 使用 TfidfVectorizer()、TfidfTransformer()、CountVectorizer()、fit_transform()和 fit()函数获得每个候选人推文的 TF–IDF 向量
通过 TF–IDF 分析,我们可以深入了解我们收集的推文中的重要词汇。
单词云
单词云是很好的可视化工具,可以看到候选人的每条推文中哪些单词出现的频率最高。我们利用 NLTK 的 FreqDist() 函数来制作我们的单词云:
word_freqdist = FreqDist(biden_bank)
most_common_biden = word_freqdist.most_common(100)
biden_common_df = pd.DataFrame(most_common_biden, columns=['word', 'count'])
biden_common_df.set_index('word').to_dict()
biden_common_df = pd.DataFrame({biden_common_df['word']:biden_common_df['count']}) # Create the Word Cloud:from wordcloud import WordCloudwordcloud = WordCloud(colormap='Spectral').generate_from_frequencies(biden_dictionary) # Display the generated image w/ Matplotlib:plt.figure(figsize=(10,10), facecolor='k')
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
这个词在“云端”出现得越大,它在推特上的使用频率就越高:
与 TF–IDF 类似,我们从每位候选人的推文中反复出现的词语中获得了洞察力。
基于 LDA 的主题建模
LDA 或潜在的狄利克雷分配,根据潜在的、未被观察到的相似主题来分离推文中的标记,以帮助用户解释它们。对于我们的 LDA,我们使用了 pyLDAvis ,这是一个用于主题建模可视化的 Python 库。
- 创建了一个候选人所有推文的列表,并删除了给定和选择的停用词
- 对 Tweets 运行 CountVectorizer()和 TfidfVectorizer()函数,然后运行 LatentDirichletAllocation()函数
- 尝试使用 TF 或 TF–IDF 创建七个不同主题的主题模型(民主党初选候选人各一个,特朗普总统一个):
每个泡泡代表一个不同的主题,由算法决定
总体而言,提到候选人的推文都非常相似,因此很难区分彼此。Twitter 经常是一个非常两极分化的平台,意见从光谱的两端传达,可能导致整体中立。朱莉娅和我觉得,将这一分析与 2016 年总统选举期间大约同一时间的推文进行比较,或者建立一个分类模型,试图区分候选人的推文,这将是有趣的未来工作。然而,就目前而言,看看提到拜登和特朗普的推文可能会很有趣,因为他们是 2020 年总统大选的最后两个人。
如果你有兴趣看我们项目的完整代码,请查看我的 GitHub!
你的 B2B 人工智能项目没有足够的数据?
别担心,这种方法可能会让你留住你的客户。
艾米丽·莫特在 Unsplash 上的照片
人工智能现在比以往任何时候都更受科技行业的青睐。你会发现全球各地涌现出新的创业公司,试图利用炒作赚钱,有时他们在人们中间制造更多的混乱,他们将人工智能描绘成某种将永远改变你生活的超人机器。真的是这样吗?
技术上来说是的,但不是这些人说的那样。人工智能是真实的,并且会一直存在。它将增强人类的能力,重新定义人机交互,这已经在发生了。
但是不久的将来会怎样呢?嗯,我觉得这将是智能自动化,我们已经可以看到趋势朝着有利于它的方向转变。
越来越多的公司正在采用更智能的工作方法,并走上全面数字化转型的道路。现在是从事人工智能和人工智能的创业公司和小公司向更大的客户群提供专业知识和知识的时候了,以帮助他们实现数字化转型。说起来容易做起来难,对吧?
构建生产就绪的机器学习(ML)或深度学习(DL)应用程序在许多方面都具有挑战性。需要考虑的事情太多了,以至于你经常会得到一个训练很差的模型,或者你有一个 ML 后端,这对于响应时间来说是一个灾难。
但这是否意味着你正在解决的问题太复杂了,或者不能用统计学习工具来解决?
嗯,也许吧,但在做出任何结论和失去一个潜在客户之前,看看我们帮助客户理解他们的人工智能项目的范围的策略,并告诉他们我们可以提供什么样的附加值。也许它可以帮助你根据你公司的投资组合设计你自己的方法。
照片由普里西拉·杜·普里兹在 Unsplash 拍摄
与任何人工智能或人工智能项目一样,成功或失败在很大程度上取决于学习机(LM)可用的数据。我们经常会遇到各种规模的公司,要么拥有大量非结构化数据,要么根本没有数据。
后者更具挑战性,因为没有数据或数据非常少,我们无法理解问题的规模,开发一个好的人工智能模型变得很困难,因为我们可能无法为现实世界的突发事件准备模型。
如果你觉得用例没有什么开创性的东西,很容易走开,但是如果用例看起来很酷,如果你决定处理它,你可能会发现一些东西,但是数据是垃圾,那该怎么办?
我学到的是,缺乏数据不应该成为你放弃它的理由。
我们采用了一些方法来帮助我们的客户利用人工智能的能力来转变他们的工作流程。一个叫做反馈学习或迭代学习的简洁的小概念是这个的关键。这一步更关注正确的数据采集,而不是模型的完善。
它帮助客户提前接触人工智能技术,并帮助他们以正确的方式教育自己如何定位这项技术。这种方法也可以用于大量非结构化数据的情况,这些数据只能由领域专家进行注释。
例如,如果您有一个数据集,其中包含一组定义人们贷款资格的属性。只有来自银行领域的专家才能确定定义一个人是否合格的属性的正确组合。这种见解决定了数据的质量和基于数据训练的模型的能力。
这种洞察力在大多数时候可能会从数据集中消失,因为现实生活与 Kaggle 数据集相去甚远。那么在这种情况下你会怎么做呢?
反馈学习到救援!!!
正如我提到的,反馈学习的主要目的是从客户端获取正确的数据集,模型改进是次要的。反馈学习有一些关键要素。
交互式仪表板是拼图的主要部分。它让用户/客户/数据操作员能够快速与我们的后端进行交互,以进行数据注释、模型训练、版本控制模型、管理部署、查看数据集等。
数据列表屏幕(图片由 Vysakh S Mohan 提供)
数据注释编辑器(图片由 Vysakh S Mohan 提供)
上图显示了智能 IVR 的反馈学习仪表板。该模型的目的是基于从语音到文本模型转录的文本来学习意图和实体。
该应用程序的主要挑战是良好数据集的可用性,而可用的数据是非结构化的。客户需求决定了需要一个高度可扩展和可移植的学习后端,该后端可以迁移到不同的服务提供商,以满足不同用户群的需求。
这意味着模型必须动态地学习识别各种意图和实体,这使得我们很难考虑所有可能的场景。
除此之外,该模型还需要轻量级和超快的响应时间,因为它将在 IVR 之后运行,那里的呼叫流量将非常高,我们不希望该模型在工作流中造成任何延迟。
我们最初是通过查阅现有的数据开始的。根据客户的观点,我们确定了构建基线模型所需的意图和实体。一旦构建了模型并确定了超参数,我们就交付了具有端到端能力的仪表板来构建数据集、对其进行注释、训练模型等。人工智能后端被集成到 IVR 系统中。这通常是我们的 alpha 版本。
现在,无论何时来电,转录的文本都可以被发送到人工智能后端以获得预测,在那里模型试图从句子中提取意图和实体。
该信息被记录到数据库中,并且可以由客户端操作员查看。如果他在人工智能解析的输出中发现错误,他可以编辑并发送它来重新训练模型。操作员可以根据用例添加/删除意图和实体。
最终,随着时间的推移,我们会获得一个良好的基线数据集来构建一个合适的人工智能模型。这将作为我们的生产测试版发布。
上面的例子很基本,但是你也可以扩展到许多其他的用例。我们还没有在计算机视觉问题上进行尝试,但对于自然语言处理(NLP)、预测建模、时间序列等用例,我们已经用这种方法取得了相当大的成功。
是的,它确实有其局限性。例如,超参数调整就是其中之一。由于模型训练是由非人工智能专家通过仪表板迭代完成的,因此正确的模型训练和基准测试可能是不可能的。此外,根据数据类型和注释方案,可能会出现过拟合或欠拟合的情况。
那么真正的目的是什么呢?这个练习的真正目的是建立适当的带注释的数据,以防你的客户想要用 AI 自动化他的工作流,但是缺少适当的数据或者可用的数据太零碎。
这也有助于他们了解人工智能如何帮助他们实现数字化转型路线图。
这种方法是一年前由我们孵化的,在它的帮助下,我们已经成功地交付了 NLP、预测建模等多个人工智能项目。一家领先的制药公司、欧盟的一家食品配送服务公司、美国的一家电信公司是我们的一些主要客户,他们从上述方法中受益匪浅。
希望这能启发你制定更新的方法来扩展和帮助你的客户用人工智能的力量无缝地转变他们的工作流程。
不,艾不是公正的。人工智能基于性别、种族和隶属关系进行歧视。
照片由 sebastiaan stam 拍摄。
一个常见的误解是机器是无偏的。没有什么比这更偏离事实了。
我这是一个常见的论点,我看到它一直在被使用。“我们应该实现人工智能(AI),因为它是无偏见的。它不在乎你的性别、种族、民族和性取向——它不像我们人类那样歧视。”我甚至从大型科技公司那里听到过类似的观点。人们普遍认为人工智能是一个中立的实体,一个客观的灯塔,一个不偏不倚的圣人。
可悲的是,这是一个谎言。
性别歧视的招聘工具。
亚马逊精通人工智能。他们使用人工智能来推动他们业务的许多部分,他们甚至通过亚马逊网络服务向客户出售人工智能解决方案。亚马逊本质上是一家科技公司,存在于一个由男性主导的行业。像许多同行一样,亚马逊正试图变得更加多样化。《多元化使命》中的一个大问题是,人力招聘人员和经理存在偏见。研究表明,人类在招聘过程中会歧视他人。此外,对于拥有成千上万名申请人的公司来说,确定哪个申请人是任何给定职位的更好选择是非常具有挑战性的。
对于一家注入人工智能的公司来说,获得更加多样化的劳动力的自然步骤是在招聘过程中使用人工智能。毕竟,招聘人员是有偏见的,而众所周知机器不会。
对于不在机器学习领域的人来说,简单地告诉人工智能在选择申请人的过程中忽略性别,听起来似乎是显而易见的。但是,正如你所看到的,这并不容易。
这只是众多关联之一。由于多年来的政治议程将人们引入刻板印象,男性和女性学习了不同的科目。不同的性别也有不同的业余爱好。发现这些相关性是困难的。非常难。纠正它们更难。对于你给人工智能的每一条规则和每一次引导它向特定方向的尝试,你都把你自己的偏见应用到人工智能上。无论你做什么,人工智能都会有一定程度的偏差。
你如何应对这种情况?你是否试图找到更多样的数据?你从哪里得到的?你会从竞争对手那里买简历吗?他们也没有。你不能伪造简历;没用的。你需要真实的数据。
在这一整节中,我只讨论了性别歧视。不同种族之间的歧视呢?如果你的公司成立于一个白人占主导地位的国家,并且碰巧有 99.8%的白人员工,那该怎么办?即使你有来自地球上各大洲的人的可靠混合数据,如果你有一个来自你没有数据的国家的申请人,并且申请人在他们的简历中有你的 AI 从未见过的 prio 经历,那该怎么办?为这些场景设计不考虑性别或种族等因素的公平算法不仅具有挑战性,甚至可能是不可能的。平衡有利于多样性的限制是一种方式,然而,每增加一个限制,组合中也会增加一些偏差。
无论你最终做什么,人工智能都会有偏见。
通往人工智能的道路布满了堆积如山的有偏见的数据。由亚历山大·米洛拍摄。
警方数据有种族歧视。因此,警察人工智能是种族主义者。
在我以前的一篇文章中,我讨论了世界各地的警察部队如何使用歧视性的人工智能系统。事实上,世界各地的警察当局现在都在使用人工智能来跟踪和识别公民。警察使用人工智能的最大问题之一是歧视,人工智能正在放大现有的偏见。
几十年来,警察系统地、不成比例地针对少数民族。有报道称,警察为了达到逮捕配额,在无辜的少数民族身上种植非法药物,也有记录称警察完全伪造报告。这些可怕的数据现在被输入到世界各地警察部门使用的机器学习算法中。该系统使用这些数据来学习在他们的犯罪预测中进行区分。在英国,警察经常发现自己不同意机器学习人工智能做出的预测,表示人工智能本身创造了一个自我实现的预言。
然而,警察部队仍然欢迎人工智能系统,因为它们让他们的生活更轻松。人工智能提供了更快的决策和更轻的良心,使其成为打击犯罪的另一个工具。
有时候,保持中立是不可能的。
在许多情况下,不偏不倚是不可能的。即使你有世界上最广泛的数据库和最复杂的算法,一个必须在招聘过程中决定选择哪个申请人的人工智能也总是要做出主观选择。
认为人工智能是公正的误解可能源于这样一个事实,即传统的编程机器确实是公正的。无论你是谁,你的电子邮件客户端都会像对待其他人一样给你发送邮件。你的微软 Word 文档不关心你是谁;它会给你和其他人一样的编辑功能。
然而,机器学习的不同之处在于它从数据中学习。由于一些数据是人类努力的直接产物,并且由于人类不可能是无偏见的,基于这些数据教授的 AI 也不可能是无偏见的。
人工智能的例子:它仍然可以比人类中立得多。
尽管如此,人工智能仍然是对抗偏见的未来。我这篇文章的重点是强调人工智能是有偏见的——T4 而不是 T5,它比人类更有偏见。一个人工智能被提供了一组不同的数据,被给予了公平的约束,并被赋予了适当的变量权重,尽管如此,它仍然比任何人都不偏不倚。人类永远是有偏见的。对我们的大脑进行重新编程以使其不偏不倚是不可能的(除非我们进入一些非常先进的基因工程领域)。计算机的大脑更容易编程。
一个训练有素的人工智能肯定不会像人类那样偏心。要做到这一点,人工智能的实现不能操之过急。他们需要接受不同数据的培训,并且需要仔细管理和测试。
此外,我想强调在实现机器学习人工智能时应该遵循的三条规则。
一个。AI 必须有一个可解释的日志。一定有某种机制告诉你为什么人工智能会做出这样的决定。通常情况下,人工智能会做出决定,但没有人有能力解释它为什么会做出这样的决定。
两个。必须减轻偏见。人工智能必须根据不同的数据进行训练。如果无法找到不同的数据,必须应用约束和适当的权重。我一直强调约束和权重——虽然它们确实增加了某种程度的人为偏见,但它们对于减轻薄弱的数据集是必要的。
第三。不能让人类过度依赖人工智能。虽然人工智能可能经常比人类更少偏见,但它并非完美无缺。它会犯错误。质疑一下。
虽然使用人工智能完全自动化一个过程可能很诱人,但有时最好通过使用人工智能作为指导决策的助手来开始一个人的人工智能之旅。毫无疑问,未来在于人类与人工智能的合作,机器与人类平等相处,但我们还没有到那一步。例如,在今天,招聘人员不能被人工智能取代。然而,有了人工智能的陪伴,招聘人员的工作会变得容易得多。在阅读简历时,人工智能可以提供总结和见解,同时还可以清楚地展示其信念旁边的确定性。在对候选人进行面试时,人工智能可以实时推荐后续问题,并向招聘人员提供行为分析。
看一看这篇文章中关于这些规则的更多细节,以及一些如果你选择忽视它们可能会发生什么的可怕故事。
[## 为什么人工智能必须是道德的——以及我们如何做到这一点
当人工智能决定谁是有价值的,谁是正确的,谁是罪犯,你只能希望它使…
towardsdatascience.com](/why-ai-must-be-ethical-and-how-we-make-it-so-b52cdb1dd15f)
和人类打交道的 AI 永远是有偏见的。
我们有责任减少这种情况。
用于小儿肺炎检测的无代码人工智能
使用胸部 X 射线图像创建并公开部署 98%准确的图像分类模型。
由弗朗切斯科·帕尔马和厄恩·纪勤撰写
小儿肺炎是 5 岁以下儿童的主要杀手,每年有超过 800,000 人死亡。世卫组织报告称,大多数儿童临床肺炎病例发生在东南亚和撒哈拉以南非洲等地区。
尽管肺炎导致的儿童死亡大多发生在发展中国家,但在发达国家,仍有大量与肺炎相关的医疗相关费用。
肺炎导致的死亡人数超过了疟疾、脑膜炎、营养不良和艾滋病的总和。
细菌和病毒病原体是肺炎的主要原因(Mcluckie,2009),但需要非常不同的管理形式。细菌性肺炎需要紧急转诊和立即使用抗生素治疗,而病毒性肺炎则接受支持性治疗。因此,准确及时的诊断至关重要。诊断的一个关键方法是使用放射数据,因为胸部 X 射线是常规获得的,以确定这些症状的原因,并有助于区分不同类型的肺炎。然而,图像的快速放射学解释并不总是可用的,特别是在儿童肺炎最流行且死亡率最高的低资源环境中。
在本文中,我们创建并部署了一个人工智能模型,以 98.89% 的准确率从胸部 x 光图像中自动识别肺炎。所有的开发都不需要写一行代码,也不需要专家的监督。如果给系统数百张看不见的图像,分析它们只需要不到一秒钟的时间。
我们部署的可以用来分类看不见的图像的网络应用程序可以在这里找到:https://cloud.giotto.ai/ic/pneumonia
密码:肺炎
Web 应用程序显示
当前的检测方法和局限性
除了 X 射线和血液检测,还有多种方法用于检测儿童肺炎,但它们往往缺乏同样的准确性和可靠性,或者对于这种类型的疾病来说过于先进。其中包括:
- 痰培养:通过测试从肺部咳出并进入口腔的粘液来识别感染(通常很难从幼儿身上收集到这些样本)
- 脉搏血氧仪:测量血液中的含氧量
- 胸部 CT 扫描:使用胸部结构的图像(很少进行)
- 支气管镜检查:用于观察肺部气道内部的分析(也很少使用)
- 胸膜腔液体培养:从胸膜腔(肺和胸壁之间的区域)抽取液体样本进行测试
脉搏血氧仪使用光和光电探测器来测量远离心脏的身体最深处(通常是手指或脚趾)的血氧含量。
在医疗基础设施相对较差的国家,诊断通常依赖于非常基本的方法,如呼吸率(高呼吸率通常被标记为肺炎的潜在迹象),或呼吸时胸腔内的视觉迹象(当他们吸气时,他们的下胸部可能会收缩或收缩,健康人的胸部在吸气时会膨胀)。
由于该地区缺乏强大的医疗基础设施,并且缺乏 x 光或血液检测的效率和准确性,这些方法经常被使用。
即使在有基础设施的地方,医学专家也不总是能够及时提供准确的评估,这正是自动化系统派上用场的地方。
直观、易用:使用 Giotto 对 X 射线进行分类
人工智能的美妙之处在于它可以向该领域的专家学习,使技术传播到可能无法接触到这些专业人员或复杂技术系统的社区,从而改善疾病的诊断和治疗,并最终拯救无数生命。
我们的目标是创建和部署一个人工智能图像分类模型,该模型能够及时地以高准确度从 X 射线中识别肺炎病例。该系统需要对之前由训练有素的医疗专业人员标记的图像进行训练,但之后可以被任何有互联网接入的人用来对新图像进行分类**。**
对于我们的任务,我们使用了无代码 AI** 平台 Giotto ,在这里可以访问**。Giotto 的目标是在一个易于使用的平台上提供最先进的人工智能技术,所有人都可以访问,不需要编码技能。最重要的是,网络应用部署功能允许用户与每个人分享他们的模型。****
有了 Giotto 等无代码人工智能平台,任何有互联网连接的人都可以点击几下就能访问最高效的深度学习基础设施和 GPU 计算系统,并将其用于自己的目的。
如果你想通过 一步一步的教程 来了解如何开始使用 Giotto,你可以看看我们之前的博客帖子,在那里我们使用包含各种花卉物种的大型数据集上的图像分类模型来探索这个平台。
在这项任务中,我们使用了来自一项名为“通过基于图像的深度学习识别医疗诊断和可治疗疾病”的研究的数据(Kermany 等人,2018 年)
**** [## 通过基于图像的深度学习识别医疗诊断和可治疗的疾病
开发了一个采用迁移学习技术的人工智能系统
www.cell.com](https://www.cell.com/cell/fulltext/S0092-8674%2818%2930154-5)
在本文中,该团队使用迁移学习模型来创建生物医学成像中的通用、高效应用。该数据集由 5,853 张人工标记的胸部 x 光图像组成,分为两类:正常和描述肺炎。数据可以通过在这里访问。
为了训练我们的模型,我们在两个文件夹中上传了之前标记为的图像,正常和描绘肺炎。Giotto 上的流程非常直观并且不需要任何监督**。上传数据后,您将被要求选择数据增强技术。在模型选择阶段,您选择 resNet 大小和您希望用来训练它的历元数。**
如果您在过程中的任何步骤不确定,您可以随时使用“使用 Giotto 自动选择”选项。
模型性能,以及在医疗保健中使用人工智能的进一步含义
医学成像的临床决策支持算法经常面临审查。让一台机器来诊断潜在威胁生命的疾病的想法仍然让许多人对其可靠性和可解释性产生怀疑。这就是为什么对我们来说,达到至少相当于(如果不是更好的话)医疗专业人员的精确度水平是很重要的。
一旦通过我们的机器学习模型,我们就能够在我们的测试数据集上实现 98.89% 的准确性,使用 resnet 34 和少至 15 个时期。通过查看混淆矩阵,我们还观察到特异性、灵敏性和精确性都在 98%以上。这一结果类似于一个由训练有素的放射科医师组成的团队,他们拥有多年的放射影像解释经验。而且只需要 30 分钟就可以教会我们的机器区分两组肺所需的细微差别。****
Giotto 在培训后展示的模型结果
鉴于胸部 X 射线成像的复杂性(即相对大量的可变对象,包括与肺炎检测无关的肺外大面积),结合我们的模型所达到的令人印象深刻的准确性,这表明类似的模型将能够使用相对较小的数据集从日益复杂的图像中学习,具有高度的泛化能力**。**
这个迁移学习框架为生物医学图像的进一步探索和分析提供了一个有趣的机会,它使用一个直观的模型,世界各地的人,无论他们在该领域的背景和专业知识水平如何,都可以很容易地训练和部署(T21)。 Giotto 因此可用于使用类似的 X 射线成像数据集区分不同形式的肺炎,但也可用于其他基于胸部的呼吸问题的进一步应用,甚至不同且更复杂的医学成像应用。
结论
使用人工智能平台促进对医学图像的快速准确诊断有助于减少疾病对发达国家和发展中国家的影响。它不仅有助于减轻识别疾病的经济负担,还可以通过减少诊断疾病所需的时间来拯救无数的生命,从而确保更快地实施拯救生命的治疗。
降低与人力相关的成本,如训练有素的放射科医生和其他医疗专业人员,也可以让政府和非政府组织更多地投资于医疗基础设施,如 x 光机,以抗击疾病。
随着时间的推移,我们可以预测这种技术的成本会降低,可部署性会提高。将这一点与 Giotto 这样的平台的好处结合起来,可能确实会对全球数百万人产生真正的积极影响。****
无代码/低代码人工智能:新的商业模式和数据科学家的未来
无代码人工智能和低代码人工智能平台:正在使用哪些商业模式,数据科学家的未来是什么?
随着无代码/低代码人工智能平台的兴起,我想写这篇文章来解释这些解决方案背后的商业模式,以及它对数据科学家意味着什么。数据科学家的工作会消失还是会进化?
这些无代码的解决方案通常出现在引导平台中,为适合初学者和机器学习专业人员的全自动机器学习服务提供经典的拖放功能。
未开发市场
今天的现实是,机器学习专家很难找到,也很难留住。将你的企业转变为人工智能驱动的组织需要时间和投资。因此,一些公司几乎不可能采用人工智能。
就中型公司而言,对数据科学家的需求很高,因为公司缺乏构建可扩展人工智能解决方案所需的技术人才,但无法雇用开发人员的公司面临着被落在后面的风险。因此,越来越多的公司转向机器学习的无代码平台。
**无代码平台:**这种平台可以让公司和没有或只有很少编程经验的商务人士构建应用程序,填补他们组织中的人才缺口。
帮助数据科学家的新工具
除了无代码人工智能解决方案,我们还看到了许多低代码解决方案。事实上,越来越多的工具有望让数据科学领域变得更加触手可及。显然,考虑到数据科学和机器学习管道的复杂性,这不是一项容易的任务。然而,包括 Keras、FastAI 和 Weka 在内的许多库和工具为我们提供了一个易于使用的高级界面和许多预构建的组件,从而使创建数据科学项目变得非常容易。
我意识到,一家公司通常很难吸引到高素质的机器学习专家,这种需求正在增长,很多时候超过了供应。这里的解决方案可能是提供对自动化机器学习工具的访问。
**自动化机器学习:**将机器学习应用于现实世界问题的过程自动化的过程。AutoML 涵盖了从原始数据集到可部署的机器学习模型的完整管道。
这个想法是为了挑战传统的学习技术机器学习的方法,并引入更容易理解的机器学习。
新的商业模式
这些商业模式的潜在目标是利用没有数据科学团队或数据科学团队有限的中小型企业的规模和国际范围。
其次,通过构建低代码或无代码的人工智能平台,市场领导者将更容易将自己确立为中央人工智能生态系统,并进一步建立联盟来扩展用例及交付。
我还认为,大型科技公司投资于无代码人工智能模型构建平台,以加速人工智能民主化,并从品牌的角度建立这种顶级意识。此外,它有助于公司赢得将构建自己模型的程序员或最终用户。商业模式可能是创建一个相对容易使用但有限的平台,并为更好的人工智能相关服务(培训、协助等)提供高级订阅。).从今天开始,我希望这些公司根据用户的请求数量来收费。
我相信大型科技公司实际上正在建立人工智能生态系统,拥有一个无代码人工智能平台可以帮助客户提供一种无需大脑的方法来保持在那个品牌的生态系统和路线图,这加强了客户锁定效应。此外,它增加了大型科技公司的用户覆盖范围,使他们能够不仅向数据科学家,而且向商业用户提供服务。
领先的人工智能公司正在开发各种平台战略,以加速大型企业的采用,但与此同时,中小企业市场仍未开发…
理想情况下,这些公司希望企业用户从小型概念验证开始,看看这项技术能做什么,并消除所有可能的进入壁垒。随着他们对技术和流程越来越熟悉,他们会对人工智能如何解决具体的业务问题有其他想法。
我相信现在人工智能领域实际上正在进行两场竞赛:
—一个拉拢程序员,一个拉拢用户。“问题是,有多少最终用户会真正构建他们自己的模型,即使它像使用拖放机制一样简单?”。
大型科技公司开源或开发无代码应用程序,因为他们希望成为其他人创新的基础。通过这样做,他们将能够收集许多中小企业的所有最具战略意义的数据……
开源和无代码人工智能平台服务于这些公司保持技术前沿的更广泛目标。从这个意义上说,他们没有放弃成功的钥匙:他们在为自己的未来铺路。
除了所有这些元素,无代码人工智能平台还使这些公司有可能通过顾问和计算资源提出额外的人工智能专业知识,快速高效地完成人工智能在线培训,从而进行一些交叉/向上销售。
另一个有趣的观点是,无/低代码人工智能平台可以帮助缺乏正式人工智能实践的初创公司快速构建更好的应用程序和解决方案,而无需任何编码经验,成本低得多。这也是另一个非常有趣的市场……
解决方法
数据科学家执行的许多任务都将实现自动化…事实上,每个主要的云供应商都在某种类型的 AutoML 计划或无/低代码 AI 平台上进行了大量投资。
如今,大多数解决方案都提供了预建算法和简单的工作流,具有拖放建模和可视化界面等功能,可以轻松连接数据,加快服务/应用的上市速度。
- 谷歌的 Cloud AutoML 训练无代码机器学习模型,界面简单(基于拖放)。它侧重于人工视觉、自然语言和翻译。谷歌还提供 Teachable Machine,这是一个更简单的工具,专为对机器学习实验和理解其工作原理感兴趣的业余爱好者设计。Teachable Machine 只需一个摄像头(网络摄像头或手机摄像头),就可以在浏览器中为小型神经元网络提供信息,而不必将图像发送到服务器,并将其导出到网站、应用程序、物理机器等。
- 优步·艾开发了路德维希(Ludwig)这款无代码深度学习工具箱,让深度学习更容易被非专家使用。非专家可以快速训练和测试深度学习模型,而不必编写代码。专家可以获得强大的基线来比较他们的模型,并拥有一个实验设置,通过执行标准的数据预处理和可视化来轻松测试新想法和分析模型。
- 百度的 EZDL 是一个简单的拖放平台,允许用户设计和构建定制的机器学习模型。
- 显然,ai 是一家初创公司,用户只需用自然语言提问,就可以对数据进行复杂的预测和分析。
这些无代码的机器通常出现在引导平台中,提供经典的拖放功能到适合初学者和机器学习专业人员的全自动机器学习服务
我认为,这种不断增长的无/低代码人工智能解决方案将对应用平台供应商构成更大的竞争威胁,包括缺乏低代码战略的 MEAP 和 PaaS 提供商。
通过无/低代码 AI 有什么可能?
大多数现有解决方案可以:
当谈到用例时,可以创建一个算法,它可以
- 从房屋内部图像中自动识别设计风格和房间类型
- 识别制造环境中的缺陷产品
- 监控道路和人行道的裂缝
- 检测客户是否可能流失
- 贷款是否会被批准等。
在这一点上,领先的只是帮助网络的实际实现和训练,而不是功能工程、数据分析或测试。
数据科学家呢
当前解决方案的局限性
**这些解决方案听起来很棒,但是……你肯定仍然需要数据专家。**的确,商业用户必须知道拖动什么和放在哪里…然而,复杂的项目有成千上万的任务,需要数据科学家。
如果你只需要拖放一些东西,拖放工具看起来很棒,但是现实并不那么容易。我看过很多人工智能项目的工作流程,我可以向你保证,为了扩大规模并达到生产,你的人工智能项目将有数千个任务。
关于数据科学家
可以肯定的是,您的数据科学家不会对使用无代码/拖放工具感到舒服。事实上,他们已经知道如何编写代码,所以他们不需要拖放式 UI。你可能会听到他们抱怨这些工具缺乏可扩展性…
尽管有这些合理的因素,数据科学家的收获是提高他们在不可自动化的事情上的技能。
我相信数据科学家的角色将仍然是人工智能项目成功的一个重要因素(取决于复杂性)。
在我看来,没有,也永远不可能有一个人工智能或无代码工具,你可以用最温和的商业规则来喂养它,让它生成一个应用程序。总会有人的因素来完成功能工程、架构、测试和维护。
此外,随着无/低代码人工智能解决方案的兴起,我们可能会看到数据科学家最终花费太多时间来修复他们同事的工作,因为他们可以完成自己的任务。
可以有把握地假设,随着我们继续让人工智能民主化,许多机器学习元素的任务将会自动化。这种转变将使数据专家在解决问题时更具战略性和创造性。
没有数据专家的帮助,人们很难指望企业能够使用自动化机器学习的结果。无论如何,人工智能项目的数据准备、结果解释和其他阶段仍然需要数据专家。
在我看来,数据科学将继续具有战略意义,但世界正在向功能性数据科学转变,从业者可以进行自己的分析。您需要数据工程师,而不是数据科学家来启用数据管道和集成数据结构。
未来的数据科学家应该更加专业化,解决最关键、最复杂的业务挑战,帮助他们的业务创造附加值。
所有这些平台和工具仍然有其局限性,但这是业余爱好者的 ML——简化和几乎自制的 AI——越来越近的一个标志。
不怕机器学习——如何用不到 10 行代码对文本进行分类
文本数据的机器学习导论
图片来自 Pixaby
这篇文章建立在我前两篇文章的基础上,在那两篇文章中,我分享了一些关于如何开始使用 Python(或 R) 进行数据分析的技巧,并解释了一些关于 Python 中文本分析的基本概念。在这篇文章中,我想更进一步,谈谈如何在机器学习的帮助下开始文本分类。
写这篇文章背后的动机和之前的一样:因为有足够多的人受困于对给定任务来说不是最佳的工具,例如使用 MS Excel 进行文本分析。我想鼓励人们使用 Python,不要害怕编程,尽可能多地自动化他们的工作。
说到自动化,在我的上一篇文章中,我介绍了一些如何从文本数据中提取信息的方法,以铁路事故报告为例。我展示了如何从数据集中提取最常见的词(以获得数据的整体概念),如何查找特定的词,如“损害”或“危险材料”,以记录损害是否发生,以及如何在正则表达式的帮助下提取损害的成本,而不是必须阅读每个事件文本。
但是,要找的词太多怎么办?以犯罪报告为例,如果您对未成年人是否参与其中感兴趣,该怎么办?你可以用很多不同的词来描述未成年人:未成年人、未成年人、青年、少年、少年、青春期等。记住所有这些单词将是相当乏味的。但是,如果您已经标记了过去的数据,有一个简单的解决方案。假设您有一个手动标记的以前犯罪报告的数据集,您可以训练一个分类器,该分类器可以学习标记的犯罪报告的模式,并将它们与标签进行匹配(是否涉及未成年人,此人是否喝醉,等等)。如果您得到一批新的未标记的犯罪报告,您可以对新数据运行分类器,并自动标记报告,而不必阅读它们。听起来很棒,不是吗?如果我告诉你这只用 7 行代码就可以完成,会怎么样?令人震惊,我知道。
在这篇文章中,我将回顾机器学习和自然语言处理(NLP)中的一些主要概念,并链接文章以供进一步阅读。需要一些文本预处理的知识,比如停用词移除和词条满足,我在我的上一篇文章中描述过。然后,我将展示一个真实世界的例子,使用我在最近的博士研究中获得的数据集,如何训练一个分类器。
分类问题
分类的任务是识别一个新观察值属于哪一组类别。一个简单的例子是将电子邮件分类为垃圾邮件和垃圾邮件(二进制分类)。如果你有两个以上的类别,这就是所谓的多类分类。有几种流行的分类算法,我不会深入讨论,但邀请您查看提供的链接并进行自己的研究:
培训和测试数据
当您收到一封新邮件时,发件人不会将该邮件标记为“垃圾邮件”或“垃圾邮件”。您的电子邮件提供商必须将收到的电子邮件标记为垃圾邮件并将其发送到您的收件箱,或者标记为垃圾邮件并将其发送到垃圾邮件文件夹。为了告诉你的分类器(机器学习模型)在现实世界中工作得有多好,你在开发期间将你的数据分成个训练集和个测试集。
假设你有 1000 封邮件被标记为垃圾邮件。如果您使用全部数据训练您的分类器,您就没有数据来判断您的分类器有多准确,因为您没有模型没有看到的任何电子邮件示例。因此,您希望将一些电子邮件排除在训练集之外,让经过训练的模型预测这些被排除的电子邮件的标签(测试集)。通过将预测的标签与实际标签进行比较,您将能够知道您的模型对新数据的概括程度,以及它在现实世界中的表现。
以计算机可读格式(数字)表示文本
好了,现在你有了你的数据,你已经把它分成了训练集和测试集,让我们开始训练分类器,不是吗?假设我们正在处理文本数据,我们还需要做一件事。如果我们处理的是数字数据,我们可以将这些数字直接输入分类器。但是计算机不理解文本。文本必须被转换成数字,这被称为文本矢量化。做这件事有几种方法,但我只讲一种。查看这些文章,进一步了解 tf-idf 和单词嵌入。
一种流行且简单的利用文本数据进行特征提取的方法被称为文本的词袋模型。让我们以下面这句话为例:
苹果很好,但梨也很好,不过,有时我想吃桔子,有时我想吃香蕉
这句引语被用作我们的词汇。这个句子包含 17 个不同的单词。下面三个句子可以用我们的词汇表示为向量:
- 《我喜欢苹果》
【1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0】 - “香蕉很棒。香蕉很牛逼,
【0,2,1,0,0,0,0,0,0,0,0,0,0,2】
或者
【0,1,1,0,0,0,0,0,0,0,0,0,0,1】如果你不在乎一个词出现的频率。 - 《她吃猕猴桃》
【0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
下面你可以看到表格形式的句子向量。
你可以看到我们计算了词汇中的每个单词在句子的向量表示中出现的频率。不在我们初始词汇表中的单词当然是不知道的,因此最后一句话只包含零。现在你应该能够看到分类器在预测句子的标签时是如何识别模式的。想象一个包含关于不同水果的句子的训练集。在向量表示中,谈论苹果的句子在索引 1 处的值将大于 0,而在向量表示中,谈论香蕉的句子在索引 17 处的值将大于 0。
测量精度
太好了,现在我们已经训练了我们的分类器,我们怎么知道它有多准确呢?这取决于你的数据类型。衡量分类器准确性的最简单方法是将测试集上的预测与实际标签进行比较。如果分类器获得 80/100 的正确率,则准确率为 80%。然而,有几件事需要考虑。我不会讲太多细节,但我会举一个例子来证明我的观点:假设你有一个关于信用欺诈的数据集。该数据集包含信用卡交易,并显示两天内发生的交易,其中 284,807 笔交易中有 492 笔欺诈。您可以看到数据集高度不平衡,欺诈仅占所有交易的 0.172%。你可以给所有的交易分配“非欺诈”,并获得 99.98%的准确率!这听起来很棒,但完全忽略了检测欺诈的要点,因为我们准确地识别出了 0%的欺诈案例。
这里有一篇文章,解释了评估机器学习模型的不同方法。这里的是另一个,描述了如何处理不平衡数据的技术。
交叉验证
在介绍编码示例之前,我还想介绍一个概念,那就是交叉验证。有许多很棒的视频和文章解释了交叉验证,所以,我将再次从准确性评估的角度快速介绍一下。交叉验证通常用于避免模型对训练数据的过拟合和欠拟合。这是机器学习中的一个重要概念,所以我邀请你仔细阅读。
当将您的数据分成训练集和测试集时,如果您幸运地使用了测试集,并且模型在测试集上的性能高估了您的模型在现实生活中的性能,该怎么办?或者相反,如果你运气不好,你的模型在真实世界的数据上可能比在测试集上表现得更好。因此,为了更全面地了解您的模型的准确性,有必要执行几次不同的训练和测试分割,并对每次迭代获得的不同准确性进行平均。
对人们对潜在新冠肺炎疫苗的担忧进行分类。
最初,我想使用来自英国广播公司的公共数据集,该数据集由 2225 篇文章组成,每篇文章都标有 5 个类别:商业、娱乐、政治、体育或技术,并训练一个可以预测新闻文章类别的分类器。然而,通常流行的数据集给你很高的准确性分数,而不必对数据做太多的预处理。笔记本可以在这里找到,在这里我演示了不需要对文本数据做任何事情就可以获得 97%的准确率。这很好,但不幸的是,对于现实生活中的大多数问题,这并不奏效。
所以,我使用了我自己的小数据集,这是我在最近的博士研究中收集的。一旦我写完论文,我会把它链接到这里。我收集了一些反对研发新冠肺炎疫苗的人的意见。我部分自动地标记了数据,部分手动地标记了论点所针对的“关注”。毫不奇怪,最普遍的担忧是疫苗的潜在副作用,其次是对政府缺乏信任,以及担心疫苗开发速度过快导致测试不足。
我使用 Python 和 scikit-learn 库来完成这个任务。Scikit-learn 可以为您做很多繁重的工作,正如本文标题中所述,它允许您用少至 7 行的代码为文本数据编写分类器。所以,我们开始吧!
读入数据后,这是一个 CSV 文件,包含 2 列、参数和指定的关注点,我首先对数据进行预处理。我在我的上一篇文章中描述了预处理方法。我将包含预处理参数的新列添加到数据框中,并将使用预处理参数来训练分类器。
我将参数和它们的标签按 80:20 的比例分为训练集和测试集。Scikit-learn 有一个 train_test_split 函数,它也可以为你对数据进行分层和洗牌。
接下来,我实例化一个 CountVectoriser,将参数转换成稀疏向量,如上所述。然后,我调用 fit() 函数从测试集中的参数中学习词汇,之后,我对参数调用 transform() 函数,将每个参数编码为一个向量(scikit-learn 提供了一个同时执行这两个步骤的函数)。现在注意,我只对测试参数调用了 transform() 。为什么?因为我不想从测试参数中学习词汇,也不想在分类器中引入偏见。
最后,我实例化了一个多项式朴素贝叶斯,将其拟合到训练参数上,在测试参数上对其进行测试,并打印出准确度分数。差不多 74%。但是如果我们使用交叉验证呢?那么准确率下降到 67%。所以我们只是幸运地拥有随机状态产生的测试数据。随机状态确保您生成的分割是可重复的。
出于好奇,我打印出笔记本中的预测,并检查分类器出错的参数,我们可以看到,最令人担忧的“副作用”是错误标记的参数。这是有道理的,因为数据集是不平衡的,而且解决副作用的论点是第二大最受关注的问题,即缺乏政府信任的两倍多。因此,将副作用指定为一个关注点比指定另一个关注点更有可能是正确的。我已经尝试过欠采样,并放弃了一些副作用的论点,但结果并不太好。我鼓励你尝试一下。
我又编写了几个分类器,我们可以看到它们的准确率都在 70%左右。我设法用支持向量机把它提高到 74%,并去掉了大约 30 个副作用参数。我还使用 tensorflow 编写了一个神经网络,这超出了本文的范围,它将准确性提高了近 10%。
我希望这篇文章为您提供了开始对文本数据进行机器学习的必要资源。请随意使用笔记本中的任何代码,我鼓励你尝试不同的预处理方法、分类算法、文本矢量,当然还有数据集。
逐步增加自定义对象检测中的每秒帧数(FPS)
由 Unsplash 上的 chuttersnap 拍摄
如何提高物体检测中的 FPS 率
你可能用过很多机器学习或者深度学习模型。但是,当谈到在云中或任何服务器上部署您的模型时,我们面临许多问题。如果你正在云中部署深度学习模型,那么主要问题是 GPU。云对在你的模型中使用 GPU 收取大量费用。您的行业不想投资 GPU,但仍然需要更好的准确性和对象检测速度。那你来对地方了。在本文中,我将介绍如何在云机器或“本地主机”机器上使用 CPU 获得更好的性能和准确性。
喝杯茶,好好休息,享受旅程。
物体检测是一种计算机视觉技术,它允许我们识别、定位、和跟踪图像或视频中的物体。通过这种识别、定位和跟踪,对象检测可以对场景中的对象进行计数,并确定和跟踪它们的精确位置,同时准确标记它们。
所需步骤:
在这里,我将简要地向您介绍我们计划提高每秒帧数(FPS)的所有其他必要步骤。FPS(每秒帧数)定义了对象检测模型处理视频并生成所需输出的速度。
- 任何自定义对象检测的第一步都是获取图像进行标记。你可以从互联网上抓取照片,或者你可以出去寻找需要训练你的模型的对象,然后自己点击一些图像。
- 给你的图片贴上标签。为这一步提供大量数据,因为这对你的准确性至关重要。您可以使用任何工具来标注数据。没有自动标记自定义数据的方法。你必须手动操作。这是客体滞留中最令人沮丧也是最费时的部分,但是如果你把你的奉献给这一部分,你肯定会得到一个丰硕的成果。我使用了“LabelImg”工具进行标注。要了解更多关于这个工具是如何工作的,请跟随这篇文章如何为物体检测标记图像。
- 您必须选择适当的对象检测算法。在这里,我们将使用 YOLO-泰尼。您可以参考这里的自定义对象检测代码https://github.com/pranjalAI/Yolo-tiny-insurance。
- 在从步骤 3 中获得 Yolo 体重文件后,您需要将 Yolo 生成的体重文件转换为 TensorFlow 服务,以便使用 TensorFlow 服务于我们的网页。
- 要将暗网格式的重量文件转换为 TensorFlow 格式,您需要遵循以下步骤。
克隆这个目录【https://github.com/pranjalAI/tensorflow-yolov4-tflite
您需要使用命令提示符进入目录。
安装库
如果您安装了 Anaconda,您需要按照下面指定的命令在一个环境中安装所有需要的库。执行完命令后,将创建一个新环境。环境名的名称可以在。yml 文件。
# Tensorflow CPU
conda env create -f conda-cpu.yml
conda activate yolov4-cpu
# Tensorflow GPU
conda env create -f conda-gpu.yml
conda activate yolov4-gpu
如果您没有安装 Anaconda,那么请使用 pip 命令。我建议使用 Anaconda。
# TensorFlow CPU
pip install -r requirements.txt
# TensorFlow GPU
pip install -r requirements-gpu.txt
因此,创建了具有各自依赖性的新环境。现在,要使用新创建的环境,您需要激活它。(这一步是为那些使用 Anaconda 创建环境的人准备的。)
照片由 Serghei Trofimov 在 Unsplash 上拍摄
环境激活
conda activate yolov4-gpu
这里“yolov4-gpu”是环境名。您可以在中更改它。yml 文件。(这一步是为那些使用 Anaconda 创建环境的人准备的。)如果您使用的是 pip,那么直接进行下一步。
现在,如果您进入了刚刚克隆的文件夹,并且已经激活了环境,最后,您需要在克隆的文件夹中进行两项更改。
首先,复制并粘贴您的自定义。重量文件到’数据’文件夹,并复制和粘贴您的自定义。“数据/类/”文件夹中。
其次,您需要对代码进行的唯一更改是“core/config.py”文件的第 14 行。更新代码以指向您的自定义。names 文件,如下所示。(我的习俗”。names”文件称为“custom.names ”,但您的文件可能会有不同的名称)
**注意:**如果你使用的是已经训练好的 yolov4,确保第 14 行保持 coco.names 。
开始了。!现在,我们需要一个命令行来使代码 TensorFlow 兼容。
python save_model.py - weights。/data/your _ weight _ file . weights-output。/check points/yolo-tiny-416-input _ size 416-model yolov 4
这里,416 是您在训练“Yolo-tiny”模型时在配置文件中定义的图像大小。运行上面的命令后,您将得到一个“.pb”文件
的”。pb”文件给 yolo-tiny
现在,您需要在检测对象时给出这个文件夹的位置。而且,跑了”。py”文件来使用您训练过的对象检测器。
在这里,使用 GPU,我用 YoloV4-Tiny 达到了 70 FPS,甚至有更好的准确性,可以进一步提高。使用 CPU,我达到了大约每秒 7 帧的速度。
进一步提高 FPS 速度的技巧
我用过 416 的图像尺寸。通过将图像大小缩小到 32 的倍数,可以获得更高的帧速率。这里是速度和准确性之间的权衡。您可以减小图像尺寸,直到您的用例达到满意的精度。
你走之前……
如果你喜欢这篇文章,并希望关注更多关于 Python &数据科学的精彩文章**——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。**
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,可以随时订阅我的免费简讯: Pranjal 的简讯 。
没有标签?没问题!
使用通气管的无标签机器学习
浮潜可以使标记数据变得轻而易举
具有一定讽刺意味的是,机器学习,一种用于任务和过程自动化的工具,往往始于高度手工的数据标记过程。
创建标签以教会计算机新任务的任务正迅速成为 21 世纪的蓝领工作。
它创造了复杂的供应链,而这些供应链往往以低收入国家为终点,如 T2、肯尼亚、印度和菲律宾。虽然这一新兴行业创造了数千个工作岗位,但工人们可能会受到低薪和剥削。
数据标签市场在 2018 年超过 5 亿美元,到 2023 年将达到 12 亿美元。它占了构建人工智能技术时间的 80%。
因此,从成本、时间甚至伦理的角度来看,使创建数据标签的过程自动化的能力是非常需要的。
在本文中,我们将通过 Python 中的一个工作示例,使用优秀的通气管库来探索如何实现这一点。
有更智能、更快捷的方法来标记您的数据
进入通气管
浮潜是一个真正创新的概念;创建一系列“杂乱”的标签函数,并以智能的方式组合这些函数来为数据集构建标签。然后,这些标签可以用于以与标准机器学习工作流完全相同的方式训练机器学习模型。虽然这超出了本文的范围,但值得注意的是,该库也有助于促进增加训练集的过程,并监控数据集的关键区域,以确保模型被训练为有效地处理这些问题。
自 2016 年以来,浮潜本身已经存在,但仍在继续发展。它现在被行业中的许多大公司(Google、IBM、Intel)使用。2019 年的 0.9 版本带来了一种构建标签模型的更复杂的方式,以及一套覆盖软件所有关键领域的文档齐全的教程。即使你以前遇到过,这些更新也值得你再看一眼。
何时使用通气管
在我们开始一个工作示例之前,值得考虑一下什么时候应该使用这个库而不是传统的(手动)创建标签的方法。如果以下所有问题的答案都是肯定的,那么就值得考虑浮潜:
- 您有一个没有标签或标签集不完整的数据集。
- 手动标记数据集将花费大量的时间和精力。
- 你有数据的领域知识(或者可以和有知识的人密切合作)。
- 您可以想出一个或多个简单的函数来将数据分成不同的类(例如,通过使用关键字搜索,或者为某个值设置特定的阈值)。
浮潜是怎么工作的?
使用通气管的过程很简单:
- 🏅**【可选】为数据集中的项目创建一小部分“黄金”标签**(这有助于审查最终模型的性能,但不是必需的。另一种方法是“目测”结果,以了解模型的表现。)
- ⌨ 写了一系列的‘标签函数’,定义了训练数据的不同类别。
- 🏗构建一个标签模型并将其应用于数据集以创建一组标签。
- 📈在你正常的机器学习管道中使用这些标签(即使用产生的标签训练一个模型)。
这个过程是迭代的,你会发现自己在评估结果,重新思考和提炼标签函数,以提高输出。
成功的例子
让我们用一个现实生活中的问题来展示如何将浮潜用于机器学习管道。
我们将尝试在一个开源的商业数据集中从“合同”中分离出“框架”(来自 Contracts Finder ,这是一个英国透明系统,记录了所有超过 10k 的政府合同)。
什么是框架?
一个框架可以被认为是一个“母协议”。这是一种与一个或多个供应商解决“条款和条件”的方式,这样就可以达成合同,而不必从头再来一遍。
问题是,由于框架和契约之间存在父子关系,这可能导致在分析数据时重复计算。因此,能够将框架从合同中分离出来是很重要的。
数据
本例中的数据由合同标题、描述和值组成。下面是我们必须处理的一个例子:
请注意“框架”列中缺少的标签
我们有一个名为“框架”的占位符列,我们将使用它来添加标签。我们将使用的命名约定是:
**1** = Framework
**0** = Not Framework
**-1** = Abstain (ie not sure!)
创建我们的第一个标签函数:
我们将从创建一系列标签函数开始。这些函数本质上可以是任何标准的 Python 函数,并且可以根据您的需要而变得简单(或复杂)。
我们将从数据集上的简单关键字搜索开始。本示例搜索短语:
“英国公共部门机构使用”
因为这只可能出现在框架的描述中。通气管让这变得非常简单,你所要做的就是用装饰器@labeling_function()
包装一个标准的 Python 函数:
from snorkel.labeling import labeling_function@labeling_function()
def ccs(x):
return 1 if "use by uk public sector bodies" in x.desc.lower() else -1
太好了,我们刚刚创建了第一个标签函数!我们现在构建了许多其他的函数来帮助将框架从契约中分离出来。
创建有效标签功能的技巧
使用该库后,以下指导原则将有助于设计有效的标签函数:
- 🤔设计标签功能时,始终牢记最终结果。特别是思考精度,回忆。这将有助于决定在生产的标签中是覆盖面更重要还是特异性更重要。
- 📑在对潜在的功能进行编码之前,仔细考虑它们。用简单的英语创建一个列表有助于让你在编码之前优先考虑最有效的标签功能。
- 🎯**少即是多。**采用散弹枪的方法来构建函数通常很有诱惑力,但是少量的经过深思熟虑的函数总是比大量不太精确的标签函数更有效。
- ⚗️ 在添加标签函数之前,总是要单独测试数据集上的任何新函数。它返回什么结果?这是你所期待的吗?
应用和评估我们的标签功能
一旦您建立了一个或多个标签函数,您需要应用它们来创建一组数据点。这可以通过使用PandasLFApplier
来实现,它允许你直接从熊猫数据框架中建立这些数据点。
from snorkel.labeling import PandasLFApplier
lfs = [ccs,Other_label_functions...]
applier = PandasLFApplier(lfs=lfs)L_train = applier.apply(df=df_train) #unlabelled dataset
L_dev = applier.apply(df=df_test) #small label dev set
请注意,在本例中,我们有一组训练和“开发”数据。dev 集是一个手动标记项目的小型数据集(我们的“黄金”标签)。这使得快速了解标签函数的执行情况变得更加容易(这是目测结果的替代方法)。
一旦您应用了您的标签功能,通气管提供了使用LFAnalysis
轻松访问标签性能
LFAnalysis(L=L_dev, lfs=lfs).lf_summary(Y=Y_test)
由于我们有一组带标签的开发信息,这将为我们提供以下信息:
这些术语的含义如下(直接来自通气管文件):
- 极性:该 LF 输出的唯一标签集合(不包括弃权)
- 覆盖率:LF 标记的数据集的分数
- 重叠:该 LF 和至少一个其他 LF 标签所在数据集的分数
- 冲突:该 LF 和至少一个其他 LF 标记和不一致的数据集部分
- 正确:该 LF 正确标注的数据点数(如果有金色标注)
- 不正确:该 LF 标注错误的数据点数(如果有金色标注)
- 经验精度:该 LF 的经验精度(如果有金标)
创建标签模型
一旦我们对我们的标签函数满意了,我们就可以把它们放在一个概率模型中。这是浮潜的“神奇来源”,它结合了每个函数的输出,或者返回具有特定标签的数据点的概率,或者返回标签本身。
from snorkel.labeling import LabelModellabel_model = LabelModel(cardinality=2, verbose=True)label_model.fit(L_train=L_train, n_epochs=500, lr=0.001, log_freq=100, seed=123)
过滤数据集
根据我们标签函数的覆盖范围,在使用标签训练机器学习模型之前,我们需要过滤掉一些训练数据。原因是一些数据点不会被我们的任何标签函数拾取。我们希望删除这些项目,因为它们会给训练数据增加噪声。通气管有一个内置的功能,使这很容易:
from snorkel.labeling import filter_unlabeled_dataframe#For label probabilities (optional):
probs_train = label_model.predict_proba(L=L_train)#For actual labels:
probs_train = label_model.predict(L=L_train,return_probs=False)#filtering the data:
df_train_filtered, probs_train_filtered = filter_unlabeled_dataframe(X=df_train, y=probs_train, L=L_train)
你们都完了!
现在,您拥有了一个带有标签的训练数据集,而无需对数据集执行任何手动标签操作。
您可以将这些作为监督机器学习任务的起点。
进一步阅读
正如前面所强调的,关于通气管的文档非常优秀,并且有许多深入的教程深入介绍了库中可用的功能:
手工建立标签和管理训练数据集是机器学习的最大瓶颈之一。在…
www.snorkel.org](https://www.snorkel.org/)
图像来源:
- 封面图片 来自 needpix.com
- 通气管 标识来自项目网站
- 迷因来自 迷因武库
没人需要你的数据
降低数据产品不增值的风险
尼克·西格雷夫在 Unsplash 上的照片
本文是系列文章的第一部分。 查看这里的介绍 。
我的手机跟随着我,并与谷歌分享我的位置。他们每年收集大约 22 万条关于我所在位置的观察信息,我把这些信息交给他们,以换取地图服务和广告(他们还让我访问我在 timeline.google.com的数据——如果你还没有的话,可以看看,这很有趣)。
当然,这些数据是有价值的。位置数据包含丰富的信息。谷歌用它们来做广告。但是它们的原始形态有多少价值呢? TechCrunch 报道通过数据经纪人和交易所,一个位置数据本身价值约 0.0007 美元,这意味着我可以以每年约 150 美元的价格出售我的数据。这并非一无是处,但对我来说,出售数据可能不值得努力。
让我们把这个放大一点。拼车公司 Lyft 在 2018 年完成了 6.2 亿次乘车。假设上述定价估算有效,Lyft 的旅行目的地数据在 2018 年将价值约 43.4 万美元——同样有价值,但与他们 2018 年 22 亿美元的收入相比微不足道。
尽管有潜在的额外收入,拼车公司不愿意向他人提供他们的数据是出了名的。为什么?除了原始数据的直接货币价值,Lyft 还对他们正在收集的数据有更大的计划。Lyft 正在完善他们的原始位置数据,以得出支持他们自己平台的结果,从提高到达估计到测试自动驾驶汽车。
数据本身不会增加价值
2019 年我的手机在北美去哪儿。图片作者。
原始位置数据是有价值的,但它们本身不会增加价值。这是因为最终目标永远不是获取数据。最终目标是完成工作。因此,人们获得的价值并不是数据所固有的,而是取决于与备选方案相比,它能在多大程度上实现结果。
如果我的个人位置数据带有额外的衍生信息,比如我是谁,我喜欢什么,那么它的价值就会上升。这些额外的数据增加了更多可操作的信息。对于一家广告公司来说,去年我只去过我当地的咖啡店七次(尽管 114 次都在 100 米范围内),这一事实比知道我也是一名年龄在 24 岁至 39 岁之间的男性(这一人群中,比其他人花费更少但消费更多的咖啡,并且更有可能在家而不是在咖啡店喝咖啡)更不具信息性。
根据我的人口统计,我会在杂货店买很多当地烘焙的咖啡,在家里煮。一家咖啡公司会发现,知道我喝咖啡的概率比仅仅知道我去其他咖啡店的频率更有价值,更不用说知道我的年龄和性别或获得一堆我去过的地方的数据了。
类似地,尽管原油公司和运输公司都使用石油作为投入,但它们向完全不同的客户提供完全不同的产出。大多数人不提炼他们自己的原油来给他们的汽车提供燃料,或者甚至不关心它是如何提炼的或者在哪里提炼的。当我给汽车加满汽油时,我是在购买一种衍生产品,这样我就可以四处走动了。如果我使用拼车服务或购买电动汽车,我甚至不需要那种精致的产品来满足我的主要需求:四处走动。
数据中不同类型的值
数据的价值会因其产品化方式的不同而发生巨大变化。如上所述,原始数据通常不如经过进一步处理的表单有价值,因为使用它们进行工作更加困难。更高层次的 outputs——例如构建算法来支持甚至自动化 decisions——涉及更多的复杂性,但会产生不同的结果。
这在数据产品类型的金字塔中得到了很好的体现:
数据产品金字塔。作者图片,基于设计数据产品中的内容。
我喜欢这个概念,因为它阐明了结果。从根本上说,你的数据产品只是原始信息。在中间,你的数据产品是基于一些输入的计算。在顶部,您的数据产品是决策。
这个金字塔恰好符合对产品不断增长的要求和需求。原始数据是最基础的,因为它们是最不精确的,在数据科学家和工程师的需求层次结构中,每一个连续的层次都建立在前一个层次之上(更高的层次通常需要更多的技术开发)。因此,它也与您对用户的要求密切相关。金字塔的较低层次必然需要更多的技术用户。
数据产品金字塔是一种工具,用于考虑您的数据能为谁带来什么结果。言下之意是,数据产品和生产这些产品的公司并不都一样。它们相当多样化。 Cassie Kozyrkov,谷歌的首席决策科学家,用面包解释了商业的后果:
如果你要开一家面包店,雇佣一名经验丰富的面包师是个好主意,他精通制作美味面包和糕点的细微差别。你也会想要一个烤箱。虽然它是一个重要的工具,但我敢打赌,你不会让你的顶级糕点师承担知道如何制作烤箱的任务;那么,为什么你的公司专注于机器学习的等价物呢?
你是做面包的吗?还是做烤箱?
有时候,替代方案已经足够好了
想象一下,我想把我的位置数据卖给一家自动驾驶汽车制造商(并得到我的 150 美元!).他们为什么要我的数据?自动驾驶汽车制造商面临的一个市场问题是让消费者安全地从 A 点到 B 点。获取新数据可以帮助这些公司更好地完成这项工作,方法是根据我在哪里开得快或慢来训练它们的车辆。
我的数据的价值随着它为特定结果的提炼而上升。例如,我是否提供我的车辆位置(原始数据)或我加速和减速的导数(派生数据)?使用数据产品金字塔,从原始车辆位置数据到推导出的速度数据,再到根据交通状况建议速度的算法,再到警告乘客车辆将减速让行人过街的自动决策系统,都会增加价值(和工作量)。
但自动驾驶汽车如何训练对消费者来说并不重要,只要它经过训练。(培训是厂商的终极问题。)对于上面的第一步,制造商可能能够利用我的数据实现飞跃,但他们也可以只是在赛道上进行一些现场测试。第二或第三,他们可以从另一家供应商那里购买总流量数据。如果最后一步是他们的主要目标,他们可能甚至不需要真实的位置数据。这些都是我的数据的替代品(竞争对手),最终,如果不做一些额外的工作,我的数据可能无法真正满足他们的需求。
我认为这可能就是为什么福特*等公司决定收购模拟公司来支持自动驾驶汽车开发,而不是仅仅购买一堆位置数据。他们正在购买比通过收集真实世界数据更快获得高阶结果的能力。
*披露:我在一家福特公司的全资子公司工作。
如何确保数据产品增值
确保数据产品的价值就像任何其他产品一样:它需要考虑客户问题、产品解决方案和备选方案。但是,数据产品对每一步都有一些独特的限制。
识别客户需求。
数据产品解决的问题不一定是新颖的,即使方法或输出是新的。另外,你的客户不太可能是技术型的。事实上,有时通过发现客户现有的效率低下问题,可以更容易地确定数据可以解决的问题,这些客户在其他解决方案方面有很好的框架问题。例如, sabermetrics 发展成为棒球队获得战略竞争优势的量化方法。你的问题需要验证吗?如果你在过程的早期,也许不会,但是记住,没有问题的产品是一个假设。(Sabermetrics 用了大约 20 年才开始流行,因为客户没有认识到的价值。)
确定客户需求几乎就像任何其他产品发现一样。但是,如果您正在阅读本文,您可能会认为数据产品是解决某些问题的好方法。鉴于此,数据产品的一个主要挑战是从对话中移除解决方案,以避免确认偏差。数据产品、机器学习和人工智能是超级装载的嗡嗡声,如果你不小心,可能会给你假阳性。[在未来的版本中,我会用一些警示故事来阐述!]
阐明您的数据提供的结果。
通过在转向数据产品金字塔之前从问题开始,您可以保护自己免受针对数据产品的常见批评,这些数据产品没有解决预期结果。先了解客户问题有什么帮助?因为您定位解决方案的方式(以及您提供的解决方案类型)将取决于用户及其需求。比如,你是否在帮助其他软件公司了解他们的产品使用情况?如果您的用户是产品经理(例如 Pendo),那么您可能需要在漂亮的图表中提供一些派生输出。如果您的用户是软件工程师和数据科学家(例如,Segment),那么您可能需要一个原始数据 API。
了解您在数据产品金字塔中的位置将有助于您明确您可以向客户交付哪些成果。一般来说,金字塔顶端的结果更复杂,可以吸引更多的价值,但情况并非总是如此,在接下来的几周,当我谈到复杂对复杂和环中人时,我们会看到这一点。因此,选择合适的解决方案对于实现价值最大化非常重要。如果您不能确定您的数据产品如何有助于解决问题,那么您可能需要先做一些验证,以确保您的问题需要解决。
解释与备选方案的区别。
所有产品都有竞争对手。对于数据产品,这些也可能包括不依赖于您的数据类型的替代方案。你可以通过区分你的产品和其他产品来展示你的价值。没有你的产品,人们怎么能做同样的事情呢?可能有人在手工记录信息或者需要做大量的手工重新整理信息。也许他们需要自己进行计算。也许有人在依靠直觉做决定…也许有人需要做决定!关注这些竞争优势也将有助于您阐明您可以提供什么样的结果。
数据产品的一个常见卖点是它们“更快、更准确、更一致、更透明”他们有时也更昂贵,无论是在金钱上还是在努力。正因为如此,保持怀疑和批判性地询问为什么你的产品真的比替代品更有价值是有益的。例如,当一个公司可以用更少的钱让一个人做到 80%的准确率时,为什么要花更多的钱去买一个准确率为 90%的新系统呢?有人能在电子表格中得到类似的结果吗?额外的 10%是否提供了足够的附加值?如果你不能区分你的结果,那么你可能需要回到数据产品金字塔,重新评估你所提供的。
摘要
没有人需要你的数据,但这可能有助于他们更好地完成工作。您的数据增加了多少价值取决于您可以支持什么类型的结果。
确保你为客户增加价值取决于发现需求,阐明你如何解决它,并解释为什么你的方法比其他方法更好。对于数据产品,对炒作保持中立,关注有形的结果,并对你的产品与众不同的原因保持怀疑,可以降低不增加价值的风险。
跟随系列?看看第二部分,这是关于为你的企业增加数据产品可行性的策略。联系LinkedIn或Twitter想多聊聊,我很想听听你的看法。
未选择切片器 Power BI 中没有图表
了解如何轻松定制您的 Power BI 报告并更改默认设置
卡罗琳娜·格拉博斯卡在 Pexels.com 拍摄的照片
在日常使用 Power BI 时,我喜欢不时地“挑战”工具,看看它在一些非标准设置中的表现。我的意思是,我们都喜欢在短时间内完成任务,Power BI 有一个的各种功能来帮助我们实现这一点,但有时我觉得改变默认行为可以增强用户体验。
方案
比方说,我想创建一个图表,只有在切片器中选择了至少一个特定值时,该图表才会显示。像往常一样,我将使用示例 Contoso 数据库进行演示。
您可能知道,默认情况下,如果在切片器中没有选择特定的值,Power BI 将显示所有切片器值的数字:
现在,我们的想法是隐藏这些条,直到在切片器中至少有一个选择。如果不是这样,我们想显示一个空白图表。我们如何实现这一目标?
达克斯是你的朋友!
我们将使用 ISFILTERED() 函数来检查指定的列是否被直接过滤。在我们的例子中,它是来自 Product 维度的列 BrandName。该函数的结果属于布尔类型(真/假)。
让我们写下我们的度量:
Filtered Brands = ISFILTERED('Product'[BrandName])
我将把这一措施放在卡片视觉中,只是为了检查一切是否如预期那样工作:
一旦我在切片器中选择了一个特定值,我的度量将返回一个不同的结果:
我们需要做的下一件事是删除当前的过滤器上下文。为此,我们将使用all selected()函数。这是一个相当复杂的函数,可以用于各种不同的事情,所以如果你想完全理解 ALLSELECTED()函数,我推荐你阅读 Marco Russo 和 Alberto Ferrari 的这篇文章。
所以,让我们扩展一下我们的衡量标准:
Filtered Brands = CALCULATE(
ISFILTERED('Product'[BrandName]),
ALLSELECTED('Product'[BrandName])
)
基本上,我们报告的当前外观不会发生任何变化,但我们扩展了衡量标准的逻辑,并为我们试图实现的最终目标奠定了基础。
三,二,一…我们到了!
现在,让我们创建我们的最终度量:
Filtered Sales Amt = IF(
[Filtered Brands] = TRUE,
[Sales Amt],
BLANK()
)
让我停下来解释一下我们在这里做什么:通过使用 IF,我们可以控制度量的最终结果。简单地说,如果我们之前创建的 measure Filtered Brands 的结果为真,我们希望返回 Sales Amt measure 值;如果没有,我们将返回空白。
让我们看看这是否可行:
看起来不错,我会说:)
抛光以获得更好的体验
尽管我们实现了最初的目标,但乍一看这似乎有悖常理。想象一下当用户打开一个报告,看到默认切片器设置的空白画面时的反应!我打赌你会接到一些电话,抱怨什么东西坏了…
所以,让我们做最后的润色,让我们的用户开心!我要做的第一件事是创建一个度量,它将为我的用户保存消息:
Message = IF (
[Filtered Brands] = TRUE,
"",
"Please select a value in BRAND slicer!"
)
同样,IF 函数将允许我们定义流:如果用户在切片器中进行选择,它将返回一个空字符串;如果没有,它将显示指定的文本。
现在,让我们在报告画布上放置一个可视卡片,将我们的消息度量放入其中,并在可视卡片的格式窗格中进行一些重要的调整:
我们将关闭类别,并将透明度设置为 100%。当我把卡片放到我的簇状柱形图上时,我会看到我的消息显示在上面,指示用户他需要做什么。一旦他在品牌切片器中选择了一个或多个值,他将看到数据条而不是消息出现。
让我们检查一下这是否如预期的那样工作:
挺牛逼的吧:)
结论
正如我一直喜欢强调的,Power BI 是一个了不起的工具!它为您提供了以多种不同方式讲述数据故事的灵活性。这个例子展示了如何根据特定的业务需求,轻松地更改默认设置和定制报表的外观。
当然,您不应该在每一个场景中都使用这种技巧——老实说,在 99%的情况下,您应该坚持使用默认行为。但是,拥有另一个工具也不错,而且您知道您可以使用它来定制您的 Power BI 报告。
订阅这里获取更多有见地的数据文章!
无应力高斯过程
如何处理无穷多个函数的分布?
当人们第一次接触到高斯过程时,他们会听到类似“高斯过程允许你在回归任务中使用无限空间的函数”这样的话。这是一件很难处理的事情。事实上,简而言之,高斯过程非常简单,这一切都始于(多元)正态(高斯)分布,它具有一些我们可以用于 GPs 的良好特性。作为这篇文章的经验法则,我建议当有疑问时,看一看 GP 方程,然后文本应该变得清晰。
高斯过程有什么好处?从理论的角度来看,它们是通用函数逼近器,所以答案是你需要拟合某种函数的任何东西。但是有一些计算上的考虑要做,我们稍后会得到这些考虑,它们会影响是否使用它们的决定,以及数据的可用性。
高斯过程在机器学习的大背景中处于什么位置?首先,GPs 是非参数模型,也就是说我们对于某种基于训练数据的模型参数并没有一定的更新规则。非参数算法的另一个例子是 k-最近邻。总而言之,这里(在 GPs 最基本的情况下)我们没有梯度,没有可以直接优化的目标函数。
其次,在机器学习中,GPs 很好地服从贝叶斯观点(我建议当看到贝叶斯时,考虑量化预测中的不确定性或信息量)。
因此,在我们进入 GPs 之前,我们需要了解高斯分布的这些良好特性。正如您将在后面看到的,除了使用众所周知的多元高斯分布的结果,GPs 并没有带来更多的东西。为简单起见,让我们只看高斯的二元情况,它是用均值向量μ和协方差矩阵σ定义的:
为了有个感觉,下图显示了以 0(零均值)为中心的二元高斯分布的密度。试着找出不同高斯分布下的协方差矩阵。
洗牌属性。我们可以分别取均值向量和协方差矩阵,并将它们混洗,使得各自的协方差和均值归在一起。新的发行版和旧的一样,没有变化。
**边际财产。**多元高斯分布定义了一组变量的联合分布。这些变量中的每一个也是按照高斯分布分布的,事实上我们可以从协方差矩阵中读出这个分布的协方差,例如,我们可以取第一维的平均向量,μ₁和所属的协方差矩阵将是σ₁₁.边际高斯则是σ₁₁).的 N(μ₁
**调节性质。**如前所述,多元高斯定义了变量的联合分布。事实上,对这些变量中的一个进行调节也会产生高斯分布。此外,计算得到的分布的协方差和均值是简单的,并且可以以封闭的形式进行。这是我们将在 GPs 中使用的一个基本属性。
从多元高斯到推论
现在我们已经讨论了高斯函数的性质,我们可以谈谈 GPs 是如何工作的。首先,让我们记住我们有一个回归的一般任务,我们有一个( x,y )对的训练数据集。正如我先前所说的:
高斯过程完全由均值函数 μ 和核函数 k 指定
下面的等式只是说函数 f 的概率分布是按照 GP 分布的:
核函数将是数据点相似性的度量,或者更好地说, k( x ₁, x ₂) 告诉我们 y₁和 y₂.有多接近本质上,通过指定均值函数和核函数,我们指定了无限多个函数的先验分布。我们可以把这个 GP 分布看作是多元正态分布的占位符,因为最终,我们将只处理多元正态分布,但是我们计算多元正态分布的均值和协方差的方式是高斯过程的美妙之处。当我们将前面的等式扩展一点时,这可能会更清楚:
我们可以看到,为了计算这个多元正态分布的均值向量和协方差矩阵,我们只需要将均值函数应用于训练集中的每个点,将核函数应用于训练集中的所有点对,这就产生了协方差矩阵。这里值得注意的是,我们显然不能使用任何函数作为核函数,协方差矩阵必须是正定的,因此需要相应地选择核函数。
现在我想把你的注意力再次转移到句子“在函数上的分布”。为什么我们会这样看?为了更清楚地说明这一点,请看下图。 x 轴定义输入变量,y 轴定义函数值。在蓝色部分,我们看到特定值 x 的不同函数实现。红线指定在 x 上的函数的采样实现。我们如何进行这样的采样?从全科医生的定义来看,这一点非常清楚。我们可以从变量的联合分布中抽取某一组 Y ,即 f(X) 。我们说一个多元高斯的边际分布也是高斯的,这就是我们从同一个 x 得到多个值 f(x) 的原因,因为 x 是正态分布。
这是如果我们有更多的数据,更多的 xs 时的样子,同样,它只是从多元高斯定义的联合分布中取样。
但是当然,我们还没有做任何适当的推论,不是吗?我们刚刚看到,我们可以对无限数量的函数进行采样,我们希望实际预测未知点 x 处的函数值。这正是我们通过调节所实现的,让我们假设我们的训练数据集包含变量 x₂ 和 x ₄.我们想预测 x₁ 和 x₃ 的函数值。合乎逻辑的做法是以已知值为条件。通过调节,我们减少了靠近点的不确定性(函数 f 的可能值)。“接近”的实际含义是由内核函数定义的。
或者用多一点的函数来展示(说多一点,并没有固定数量的函数,我们只是从无限的函数集中抽出 N 个函数):
你可能想知道:“但是,等等,我们是以某种值 f(x) 为条件的,但是 f(x) 甚至没有出现在分布的定义中”。我承认,当谈到 GPs 时,这可能会令人困惑。但实际上, f(x) ,也就是 y 确实出现了。它出现在条件分布和预测点的均值和协方差的封闭解中。等式如下所示(在我们的均值函数μ为 0 的情况下):
小 K 是核函数,不要与大 K 混淆,大 K 是我们通过将核函数应用于训练集 x 而指定的“设计矩阵”。μ是新的均值,ν是条件分布的协方差。
如你所见, y 对于计算新的平均值是必不可少的,这基本上是我们在预测中最有信心的一点。这是我们不假设噪声数据的情况。但是如果我们的数据实际上是有噪声的呢?在机器人应用中,这种情况很常见,我们通常假设噪声正态分布,均值为 0。对条件方程的改变很小,正如你所看到的,我们只是在设计矩阵中增加了对角方差。直观来看,这意味着什么?这意味着我们正在增加我们的边缘的不确定性,这正是我们的训练数据点,这就是我们在存在噪声的情况下想要做的。
通过向协方差矩阵添加额外的不确定性,我们考虑了噪声训练数据/观察值。
做完这一小部分线性代数后,我们可以画出函数的条件分布:
其他注意事项和有趣的事实
这里也许还有一些值得思考的事情。
**计算协方差的倒数。**众所周知,计算协方差矩阵的逆矩阵在数值上是不稳定的,尤其是在大型数据集的情况下。请注意,在高斯过程中,推理的计算复杂度与数据集大小成比例,而在参数模型中并非如此。因此,您选择的求逆方法对性能至关重要,最常用的方法之一就是采用乔莱斯基分解。
推理的计算复杂度是多少?严峻的事实是,增加训练数据量会增加推理的计算复杂性。为了缓解这种情况,一些人研究稀疏高斯过程,该过程基本上以一种聪明的方式选择以矩阵 K 的哪一部分为条件。直觉上,我们不需要使用所有的训练点来进行预测,我们只需要使用那些“接近”的训练点。通过减小调节中使用的协方差矩阵的大小,我们降低了计算复杂度。
我应该使用高斯过程还是深度神经网络?这是一个争论激烈的问题。当然,提出随着数据集规模的增加,推理的计算复杂性增加的观点可能是神经网络的一个论点,但有工作表明高斯过程在许多任务上大大优于神经网络。也有理论工作表明,一个非常“大”的神经网络基本上是一个 GP。
**高斯过程有过拟合的问题吗?**不一定。原因是我们在预测中有一个不确定性的度量,它高度依赖于设计矩阵的核函数的选择。
这些果仁到底是怎么回事?我写了一篇关于这个话题的博文,内容可能很丰富。简而言之,核是两个事物之间相似性的度量,或者你可以称之为距离度量。这是一个有点不幸的名字,因为术语“内核”在 ML 的不同上下文中使用,例如“卷积内核”与内核函数无关,或者内核技巧。
哪里有数据,我就确定,哪里没有,我就不确定,这不是太傻了吗?不,不仅仅是“哪里有数据”,“确定性”的大小高度依赖于内核函数的选择以及“接近”意味着什么。但是,是的,它和为当前问题选择的核函数一样愚蠢。
一些有用的链接
谢谢!
数据本身不会说明任何问题
不要让数据说话
丽贝卡·巴里在 Flickr 上的图片
我被类似“很明显,数据表明……”或“从数据来看,很明显……”的陈述所困扰。很多时候,既不清晰,也不明显。我们需要推理。数据甚至不会说话——它怎么可能自己说话呢?
等等,不,让我试试。听起来很有趣。咳咳。这里的结论很清楚:
图片由泰勒·维根提供
我遇到过一些种族至上主义者,他们引用一些统计数据作为某些种族或性别不如其他种族或性别的“证据”,这让我很不高兴。当然,如果“数据不言自明”,我们应该同意他们的观点?然而,我们许多人不同意。即使那些没有统计背景的人也能感觉到一些东西——统计数据没有捕捉到更大的画面,并且有一些复杂性(强大的不可测量的混杂因素或中介因素)阻止我们从表面上看数字。如果我们可以将这种健康的怀疑态度正式化,那不是很好吗?
很长一段时间,我很难表达这个想法,直到我看到凯西的文章。她指出:
推断=数据+假设
是我们的假设赋予了数据声音。我想进一步分解这一点,因为有一个微妙但重要的区别:
推断=数据+统计假设+因果假设
为什么要分开?即使是像“人口的平均高度是 X”或“森林中有 Y 棵树”这样的单参数估计,我们也需要假设一些数据生成机制,比如简单的随机抽样——一种因果陈述。
数据科学家/数据分析师可能是统计假设方面的专家,但他们可能不太了解因果假设。例如,如果你是一名处理医疗数据的统计学家,你会疯狂地认为你比医学博士或公共卫生硕士更了解医学。有些人是统计学和科学领域的专家,但他们很少。
假设的质量极大地影响了洞察力的质量。然而,人们很少谈论假设。团队最好召开会议来讨论这些问题。
推理意味着抛开你的自我。你必须表现出谦逊,尊重他人的专业知识,这样你才能将他们的知识融入到模型中。这是一个团队的努力。
辛普森悖论
UCB 招生数据集是说明因果假设重要性的最简单和最好的例子之一。你可能会从辛普森悖论中了解到这一点。数据(列名不是我的):
问题:UCB 的录取过程中存在性别歧视吗?
安娜计算了一些数字。她把计数加起来,像这样:
并运行逻辑回归:
安娜总结道:“女性的系数是负值,p 值很小。很明显,数据显示招生过程存在性别歧视。
芭芭拉也处理了这些数据,但她保留了原始数据。她运行逻辑回归,控制部门:
Barbara 总结道“女性的系数是正的,p 值很大。很明显,数据显示招生过程是性别歧视。”
等等,什么?
他们都使用相同的数据。他们都有合理的统计假设。然而,由于方法不同,他们得出了截然不同的结论。谁是对的?
我重申我希望在统计学课程中教授的内容:
数据+统计假设不足以得出推论。我们需要因果假设。
那么我们应该如何解决这个问题呢?为了简化,假设我们已经测量了所有相关变量。我们提出了一些因果假设:
- 性别直接影响录取率(性别歧视)
- 院系直接影响录取率(有些院系比较难进)
- 性别直接影响部门(男性申请者比女性申请者更喜欢不同的专业)
(1)是我们要测试的。出于形式上的考虑,我们假设(1)为真,这样我们就可以通过将它放入模型中来测试它。
那(2)和(3)呢?如果你问我,这两个都是合理的假设,我们可以假设它们是真实的。
“哇,别着急!”有人可能会说。“那太不舒服了!不能随便假设那些东西!”但是,但是,但是!我们必须做出这些选择;我们不能成为不可知论者。当我第一次了解因果建模时,我也有同样的保留,并最终对这个想法产生了兴趣。对于任何给定的变量对 X 和 Y,我们必须选择其中之一:
- x 直接影响 Y
- y 直接影响 X
- x 和 Y 并不直接相互影响
在(2)的情况下,“录取率影响院系”没有意义,而“院系和录取率没有直接关系”肯定是假的(取决于其他假设,这可能意味着“所有院系的录取率相同”)。剩下的唯一说得通的就是“院系影响录取率”。
尽管一种方法可以对应多组假设,但是即使没有口头说明,假设的选择也是由分析师的方法暗示的。没有说出来并不意味着这些假设不存在。如果有什么不同的话,那些没有明说的假设往往是最没有意义的(见我以前的文章)。这几乎就像为了显得“客观”而通过省略来撒谎。
我们所有问题的解决方案:如果我们看不到假设,它们就不存在。(来源)
这三个假设合在一起暗示了这个因果图:
为什么要经历这么多麻烦?如果你不熟悉因果图,我建议阅读我关于因果关系的文章的后三分之一。事实证明,假设告诉我们应该如何分析数据:
- (1)或(1) + (3)规定我们汇总所有数据,并使用性别作为预测值
- (1) + (2)规定我们使用原始数据并使用性别作为预测值
- (1) + (2) + (3)规定我们使用原始数据,并使用性别和部门作为预测值
安娜的方法论假设院系和录取率没有直接关系。我对此深表怀疑,所以她的分析是错误的。(小心。即使错误的分析也可能意外地得出正确的结论。)
芭芭拉的方法论假设(2)和(3)。这比安娜的假设合理多了,所以我更倾向于相信她的结论,录取过程没有性别歧视。
因果建模
“控制 X”与“通过 X 切割”是一样的,除了你的变量不必是绝对的。
因果建模是以“正确”的方式分割数据的艺术。
FiveThirtyEight 制作了一个有趣的互动页面,在这里你可以 p-hack 你的方式进入统计学意义。试试看。如果你回归州长的就业率,共和党对经济有积极的影响(p 0.01)。如果你回归总统的就业率,共和党对经济有负面影响(p = 0.02)。那么数据说明了什么?不要混淆建模选择和数据的内在质量。
一个老笑话说“当你把 10 个经济学家放在一个房间里,你会得到什么?11 条意见。”一个更准确的笑话应该是“当你把 10 个统计学家放在一个房间里,你会得到什么?10 估计。”
这就是问题所在。人们根据他们对数据的选择得出不同的结论。甚至“正确”的结论是什么?存在吗?是神话生物吗?柏拉图式的理想?
与其争论我们不同的结论,不如讨论一下因果假设?也许我们可以让整个团队同意用一种方式来分割数据。而且,希望所有相关方都有足够的宽容度来接受这种分割方式得出的结论。本质上,这就是因果建模。
我们把你的头发切得恰到好处!相信我。我是专家。(照片由 Flickr 上的 MTSOfan 拍摄
A/B 测试是有价值的,因为这是我们完全知道因果图的唯一时间(警告:如果你有缺失的数据,或者如果有来自其他部分重叠实验的效应修正,或者如果新奇效应很强,或者…)不成立。这是我们不必做因果假设的唯一情况。我们确切地知道如何正确地分割数据。这个问题纯粹归结为统计假设。
当然,因果建模有很多问题,比如这个批评。然而,尽管有缺陷和限制,因果建模是我们得到的最好的工具。
这会让你成为一个应声虫吗?
本着贝特里奇定律 : 不。
在 UCB 招生的例子中,我们可以就假设(1) + (2) + (3)达成一致,但有人反对这个结果。我们可以问:你对哪些假设有异议?
例如,如果他们不同意(3),只要团队作为一个整体诚信行事,其他团队成员应该附和说(3)是最合理的选择。假设是团队的努力。
如果他们同意所有的因果假设,但仍然反对,那么问题可能出在统计假设上。这是一整篇文章本身,所以我将跳过它。
如果他们同意所有的因果和统计假设,但仍然怀疑结论,那么,团队更容易看到这种反对是不合理的。
而且,就像如何通过双盲来改进实验一样,团队可以在任何人都不知道这些假设的结果的情况下讨论这些假设。
我想知道当假设驱动的分析成为常态时,团队会变得更加快乐和协作吗?每个人在分析中都有发言权,而不是只留给统计人员,通过事先就条款达成一致,结果和决定将被认为更加公平。
预测模型被高估了
好了,我说了。
我总是告诉人们,在做任何事情之前,先问问自己:预测还是推理?两者不可兼得。(嗯,好吧,可以,但只是有时候,作为一种享受。不幸的是,许多人甚至没有意识到这种区别,因为大多数数据科学都与预测有关。
对于许多应用程序,我们只关心预测——想想将模型投入生产。我们需要得出的唯一结论是“这个模型能做出好的预测吗?”这是一种特权。
然而,根据数据做出决策需要推理。从数据中得出结论需要推理。从数据中推荐行动需要推理。
自然,纯粹的预测模型对这些任务是不利的。考虑像 random forest 这样的模型,除了 LIME 之外,没有任何可解释性的外表,它在一个地点之外不做任何陈述。根据可变重要性图,您应该采取什么措施?它如何以任何方式帮助决策?
是的,但这意味着什么?我不知道数据科学是抽象艺术!(照片由 Flickr 上的戴尔·克鲁斯拍摄)
即使你使用一个像 elasticnet 这样更容易解释的模型,你也不能把所有东西都扔进去,最大化预测能力,并期望得到好的推论。你可能会在对撞机上进行条件反射,得到虚假的关联,或者你可能会阻断因果路径,隐藏影响(如果你不明白这意味着什么,请阅读我关于因果关系的文章的后三分之一)。一个例证:
控制气压,珠穆朗玛峰与死海的高度相同。(来源)
这肯定是一个愚蠢的结论,但是人们总是通过“控制一切”来不知不觉地得出这种结论。很少很明显。或者,同样糟糕的是,人们认为打开洒水装置可以防止下雨。(嘿,它是一个优秀的预测器。)
因果建模是一个“我们有客户(商业利益相关者)需要的产品,但是客户不知道这是他们需要的”的例子。
“可操作的见解”已经成为数据科学中的一个流行词。然而,人们追逐纯粹的预测模型,这些模型不可能产生“可操作的见解”,同时他们忽略了推理/因果建模。很奇怪。因果建模应该是分析的核心。
最后
如果有人试图用数据吓唬别人,说“数据明明说 X!”,试着问问他们的因果假设是什么。很有启发性。如果他们声称没有假设,要么数据来自 A/B 测试,要么它可能是:
我对数据研究得越多,对结论就越不确定。那些在统计数据周围炫耀的人,就像是对真理的一瞥一样,很可能处于 T2·邓宁-克鲁格效应之下:他们做出了强有力的推论,却不知道假设在推论中的作用。
我们很少知道我们是否以“正确”的方式分割数据,尽管有些方式比其他方式更可信。尽管我们喜欢认为科学和信仰是截然相反的,但许多科学都建立在无法证实的假设之上,这需要信仰的飞跃。永远不要忘记出错的可能性。
不,你不会和机器人一起工作
人工智能的新进展预示着人机共生时代的到来
照片由 Jehyun Sung 在 Unsplash 上拍摄
1997 年,IBM 的“深蓝”击败了当时的世界象棋冠军加里·卡斯帕罗夫。世界震惊了。似乎迄今为止被认为只不过是美化了的计算器的计算机,最终侵入了人类想象力和创造力的领域。
担心是徒劳的。深蓝没有创造力。它仅凭蛮力就赢了,每秒钟评估 2 亿个位置。将如此初级的算法与人类的创造力相提并论是令人厌恶的。当这个没有头脑的机器在试错中辛苦工作时,卡斯帕罗夫被他的潜意识温柔地召唤着采取有希望的行动。他有直觉,它仍然只是一个装有类固醇的算盘。
和之前无数的人工智能一样,深蓝也不得不抑制自己的雄心。它不是取代我们,而仅仅是补充。卡斯帕罗夫意识到“计算机擅长的就是人类薄弱的地方,反之亦然。”在这种洞察力的鼓舞下,他组织了一场比赛,让人类和机器可以搭档比赛。果然,一对人机,一个凭直觉,一个精于计算,证明了它比任何纯人工对手都优越。即使只有一个屁股,我们人类仍然可以证明我们坐在游戏凳上是合理的。
深蓝的寓言经常被认为是人类和计算机天生互补的证明。“当然,机器一天比一天聪明”,碳-硅共生体承认,“但是只渴望我们发现平凡的乏味任务,它们永远不会完全取代我们。自动取款机并没有让银行出纳员变得过时。相反,这些设备解放了职员,让他们从事更有意义的工作,比如提供金融专业知识。
人类和计算机不可分割地交织在一起,没有对方就不完整,这种观点和计算机本身一样古老。早在 1843 年,世界上第一个计算机程序的作者阿达·洛芙莱斯就宣称,她所工作的现代计算机的前身“没有任何创造任何东西的野心”。它可以跟随分析,但它没有能力预测任何分析关系或真理。”
艾伦·图灵后来称之为“洛夫莱斯夫人的反对意见”,大约一个世纪后,控制论先驱诺伯特·维纳将其引入主流。当他在麻省理工学院的同事马文·明斯基和约翰·麦卡锡正在寻求创造在各方面都超过人类的智能机器时,维纳认为一条更有成效的道路是“设计出能与人类思维很好合作的机器,而不是试图取代它们。”
他的信念或许更适合宗教领袖,而不是头脑冷静的科学家,他宣扬道:“计算机越强大,将它与想象力、创造力和高级人类思维联系起来的价值就越大。”
在众多被维纳福音带走的研究人员中,有约瑟夫·利克里德。作为一名多才多艺的科学家,Licklider 在技术和心理学方面都游刃有余,他是想象人和机器如何在合作伙伴关系中一起工作的大师。他开创了去中心化网络和分时共享的概念,这两个概念在现代互联网的创建中都是不可或缺的。
但在 Licklider 的所有贡献中,他在 1960 年发表的具有里程碑意义的论文《人机共生》在硅谷的精神景观中留下了最大的陨石坑。“计算机技术的大多数重大进步——包括我的团队在 PARC 施乐公司所做的工作——都只是对利克设想的推断,”PARC 计算机科学实验室的创始人罗伯特·泰勒证实道。
幸运的是,在 70 年代末,乔布斯和沃兹尼亚克将其中的一些进步,包括鼠标和图形用户界面,整合到苹果 2 中,这是世界上第一台大规模销售的个人电脑。最后,计算机进入了普通美国人的家庭,不是为了嘲弄,而是为了增强主人的智力。乔布斯将新机器比作一种工具,称之为“大脑的自行车”。
从苹果手中接过接力棒的软件远见者也有类似的倾向:人类应该被赋予权力,而不是被取代。微软将开发一些程序,把办公室工作人员从手工文档管理的恐惧中解放出来。MATLAB 将帮助科学家进行机械计算,允许他们以前所未有的速度测试原始假设。谷歌地图将弥合从比特到原子的鸿沟,帮助我们在现实世界中导航。
甚至是 IBM 的沃森,的 Jeopardy!-在节目中扮演支配人类对手的计算机,是在增强意识的基础上开发的。至少有一段时间,它在医生身边找到了自己的家,帮助他们理解病人表现出的无数症状。正如 IBM 研究部主任约翰·凯利所说:“……在认知系统的时代,人类和机器将合作产生更好的结果,每个人都为这种合作带来自己的优势技能。”
在今天,有了智能助手在我们手中,我们向 Licklider 预言的人机共生体的蜕变一如既往地完整。但是,即使计算的历史讲述了无数人与机器之间的友谊故事,我们也不能自欺欺人地认为,后者融入劳动力大军无疑对所有人都有好处。
当数字时代的技术专家沉浸在个人电脑革命的兴奋中时,他们在社会科学部门的朋友们却在焦虑不安。西方世界自 20 世纪 70 年代以来经历的经济不平等的急剧上升似乎与个人电脑的出现完全吻合。
衡量财富不平等的一种方法是使用 T4 技能的概念,或者一个人的正规教育水平。不管是好是坏,这个看似粗糙的近似值与工人的工资密切相关。现在,经济学家绘制了每一个职业在过去几十年中平均工资(或在总就业中的份额)的变化,作为该工作所需技能水平的函数。他们所看到的使他们震惊。历史上第一次,图表被扭曲成 u 形。
新技术似乎对低技能和高技能工人都有帮助,但对中等技能的工人帮助不大。正如经济学家丹尼尔·苏斯金德(Daniel Susskind)在他的新书《一个没有工作的世界》(A World Without Work)中所说,“许多经济体传统上为中产阶级提供高薪工作的丰满腹部正在消失。”。我们可以在下图中清楚地看到这一趋势:
1995 年至 2015 年选定经济区域总就业份额的百分点变化。来源:OECD 2017 年就业展望。
“作为整体就业的一部分,现在有更多的高收入专业人士和经理,以及更多的低收入护理人员和清洁工,教学和医疗助理,护理员和园丁,服务员和理发师。但中等收入的秘书和行政职员、生产工人和销售人员却越来越少。更重要的是,尽管劳动力市场已经变成了两级市场,但是高技能人群的工资却大幅上涨。
为了理解新的经济现实,一个由三名麻省理工学院经济学家组成的小组提出了一个理论,这个理论后来以“奥托-利维-默南(ALM)假说”而闻名首先,男人们认识到许多中产阶级的工作很大程度上由日常任务组成,这些任务可以通过遵循明确、易于表达的规则来完成。第二,他们观察到这样的任务特别适合自动化,因为遵循一套清晰的指令正是现代计算机擅长的。
因此,ALM 假说在劳动力市场的空心化和 Licklider 的人机互补理论的广泛采用之间建立了联系。它表明,即使我们认知能力的部分自动化也会对我们的就业前景产生有害影响。是的,人和机器现在确实在办公室里并肩工作。但是一双这样的鞋被证明是如此的有效,以至于每一双鞋就有十个人在麦当劳从穿西装变成穿围裙。
至少就目前而言,还有一线希望。经济学家一致认为低技能和高技能工作是安全的。在光谱的一端,遛狗者和出租车司机,在另一端,工程师和医生,没有可辨别的正式规则可循。这类任务缺乏可以翻译成计算机代码的明确说明手册,因此不受自动化的影响。也就是说,直到最近…
大约在阿达·洛芙莱斯宣称她怀疑计算机能“创造”任何东西的时候,与她同时代的作家玛丽·雪莱构想了一个完全不同的装置。她笔下的弗兰肯斯坦怪物不仅具有想象力,而且还拥有一大堆人类天赋。与阿达的客观机器形成鲜明对比的是,这种生物感受到了情感,它巨大的爱的能力——以及令读者恐惧的恨——甚至挑战了我们自己的情感。
1956 年,雪莱的文学思考在如今颇具传奇色彩的达特茅斯研讨会上以严格的数学形式化,在那里,一群志趣相投的科学家在弗兰肯斯坦式的渴望驱使下,创造出比 Licklider 和他的追随者认为实用的更接近他们形象的机器,为他们称为人工智能的研究领域奠定了基础。这个研讨会的提议是“……学习的每个方面或智力的任何其他特征原则上都可以被精确地描述,以至于可以用机器来模拟它”,这是这个新领域的主要原则。
模拟智力的确切方法还没有具体说明。很快,一些根本不同的方法开始崭露头角,这个新生的学科一分为二。
大多数研究人员认为人类的知识可以直接提取到软件中。他们试图记下专家在执行任务时遵循的所有可能的逻辑规则,并费力地亲手将它们硬编码到计算机中。IBM 的深蓝和沃森就是这种方法的例子,也是《经济学人》的资产负债管理假说的基础。这种技术在解决算法问题上结出了丰硕的果实,我们大多数人都觉得这是一项脑力劳动,比如定理证明,但事实证明,当面对人类下意识完成的任务时,比如从大量像素中识别出一只猫的轮廓,这种技术完全不够用。
另一小组科学家很早就预见到了这些局限性。他们没有刻意将大脑建模为事实和规则的固定组合,而是试图让计算机自己学习世界是如何运转的。
机器学习阵营强势冲出盖茨。1958 年,就在达特茅斯研讨会两年后,哈佛大学心理学家弗兰克·罗森布拉特从我们大脑的工作中获得灵感,开发了一个能够学习识别数字的生物神经元的简化模型。这个模型被称为感知器,引发了一阵兴奋,《纽约时报》甚至宣称它“……将能够走路、说话、看、写、自我复制并意识到自己的存在。”
尽管最初大肆宣传,单个神经元只能做这么多。赋予大脑巨大能力的是数以百万计的神经元,它们被组织成一个深层次的堆栈,每一个连续的层都形成了对感官所感知的事物的更好理解。然而,将罗森布拉特的感知器组织成这样的层级结构,却比预期更困难。目前还不清楚不同层次的神经元应该如何相互交流,以形成对世界的共同理解。在接下来的几十年里,进展甚微。
20 世纪 80 年代,当几个独立的研究人员,其中包括图灵奖获得者杰弗里·辛顿,发现了通过神经元层次传递的正确信号时,事情又有了转机。随着主要障碍的克服,狂热的研究随之而来。1989 年,另一位图灵奖获得者 Yann LeCun 开发了一个能够识别手写数字的人类视觉皮层的原始模型。八年后,德国科学家 Juergen Schmidhuber 和 Sepp Hochreiternd 将神经网络提升到序列领域,赋予它们理解长段文本、音频和 DNA 的能力。
不幸的是,在 21 世纪初,研究遇到了另一个障碍。虽然在图像和语音识别等任务上已经取得了很大的进步,但模型的表现远不及人类。很明显,进一步的进展需要更大的模型。人类大脑由数十亿个神经元组成,形成数万亿个连接,但它们的人工对应物只有数万个参数。即便如此,那些相对较小的型号已经达到了当代 CPU 硬件的极限。研究人员陷入了僵局。
2012 年,当 Hinton 的门徒 Alex Krizhevsky 意识到神经网络背后的数学几乎与计算机图形学中的数学相同时,一个解决方案出现了。两者的核心都是巨大的矩阵乘法,游戏行业已经投入了数十亿美元进行优化。在这种观点的驱动下,Krizhevsky 放弃了通用 CPU,转而使用显卡。后者支持的模型比迄今为止所设想的任何模型都要大一个数量级,这导致了 Krizhevsky 在当年所有领先的图像识别比赛中的尤塞恩·博尔特式的统治地位。
其他研究人员很快跟上,开始了对越来越大的神经网络的军备竞赛。建立了一个又一个图形卡仓库,其中有超过一亿个参数的巨大模型。在过去几年中,这些非常强大的模型已经在语音转录、物体检测和视频游戏等多种任务中超越了人类。他们甚至创作音乐和艺术。简而言之,他们终于摆脱了非原创性的枷锁,步入了直觉和创造力的领域。当然,艾达在九泉之下也不会安宁。
他的新科技景观留给人类的空间很少。21 世纪初提出的 ALM 假说没有考虑到机器学习革命。计算机只限于执行有明确指令的任务这一假设不再成立。向低技能劳动力和高技能专家承诺的安全港正在消失。
以送餐为例。没有任何其他领域的人机共生像这里这样堪称典范,机器处理数据以找到最佳路线,而人则做实际的跑腿工作。但是,随着车轮上的电脑证明了它们比车轮上的青少年优越,这种原始的安排已经开始瓦解。自动送货机器人充斥着街道,很快,人类不再能够对送货过程的任何部分做出有意义的贡献。机器正在接管整个管道。
或者参加医学诊断。Alphabet 的人工智能部门 DeepMind 开发了一种神经网络,在诊断五十多种眼病方面优于眼科医生。它还推出了一种算法,能够在 x 射线中准确地发现乳腺癌,甚至比放射科医生更好。更引人注目的是,牛津的一个团队利用机器学习开发了一种“指纹”,可以用来预测未来几年的致命心脏病发作。趋势很明显:未来的诊断医生将由硅制成。
诸如此类的例子并非个别现象,而是常态。现在,在蛮力计算和直觉模式匹配方面都优于我们的机器,正在让我们变得多余。我们不再增加合作的价值。随着机器人涌向街头工作,我们被集体推到街头乞讨。人们只能希望他们给我们一两个季度。
节点嵌入
入门
介绍
这是从克里斯特斯·齐亚卡斯、扬·吕廷格、到里希特的节点嵌入调查。它是在 TUM 数据分析和机器学习小组的机器学习实验室中进行的。我们感谢 Oleksandr Shchur 监督我们的项目,并感谢günnemann 博士教授让我们有可能在他的团队中进行研究。
这个项目的代码可以在 GitHub 上找到。
我们希望这篇文章有助于理解现代节点嵌入模型的基础,并提供一些不同方向的最佳实践。当然,类似的评估协议也是公开的。
为什么是图表?
图表已经变得无处不在。你不能只把社交网络理解为图形结构,还可以理解为生物结构、搜索引擎等等。甚至图像分类任务也在用图结构进行探索。因此,对信息强大表示的研究兴趣增加了。然而,很难将经典的机器学习模型应用于图结构,因为它们是为不同的数据表示而设计的。此外,天真地将它们应用于图结构被证明是低效的。
应用程序
节点嵌入的潜在动机在于捕捉图或图的节点的特征的可能性。社区、邻近或节点的角色只是有趣应用的几个例子。利用嵌入式空间中的计算,可以利用矢量数据的标准机器学习模型。这样,就可以应用广泛和成熟的方法,如分类、预测或聚类。
节点分类,按作者分类的图像
节点分类可用于对节点进行分类,例如,如果某个机构的社交网络中的人更可能是博士生或教授。在我们的实验中,这种分类完全依赖于非属性图,基于图的结构和已知节点的类别。
链接预测,作者图片
例如,在给定两个人已经见过的人的情况下,链接预测可以回答这两个人见面的可能性有多大的问题。在这种情况下,甚至不需要考虑节点的类。
节点聚类,按作者分类的图像
由于社交网络中的人彼此接近,节点聚类可以应用于将他们分组在一起,例如,为了将大学教职员工中的机构聚集在一起。在这个例子中,来自一个研究所的员工比来自其他研究所的员工彼此更接近。这种接近可以表述为“相互了解”。
动机
许多科学家正在研究这一有趣的现象。在不同的想法之后,取得了巨大的成果。然而,这导致了不可比性。使用不同的评估协议,并且大多数资源当然被投入到新颖的方法中,而不是要击败的前辈。因此,进步的其他原因,如技术优势或更多的投入资源,可能不会在比较中进行审查。这些和其他方面导致在该领域中不完全可比的结果。这项工作的目标是提供一个基本原则的可靠比较,这些基本原则是大多数新颖想法的基础。为了实现这一目标,尽可能使用相同的环境和相同的评估协议。这使得结果具有可比性。在这个项目中,我们只依赖于非属性图,这意味着只有节点的类和图的结构是已知的。
嵌入技术
我们遵循嵌入技术,除了流行的图形神经网络,奠定了节点嵌入的大多数新方法的基础。相比之下,我们更多地放弃了调整模型的现代方法。因此,这项工作为节点嵌入的基础技术提供了比较。这些模型被细分为不同的相似性得分,即显示图中节点邻近性的度量。
图 1:节点嵌入的损失,作者图片
伯努利(4 种型号)
对于伯努利模型,真实图的相似性得分以邻接矩阵的形式给出。因此,如果两个节点相连,则条目为 1,否则为 0。解码器给出嵌入空间中的相似性得分,其可以是 sigmoid、指数、高斯或基于距离的嵌入。因此,给定嵌入矩阵,我们对损耗建模以生成邻接
伯努利可能性,作者图片
其中内核可以是
Sigmoidal,作者提供的图像
指数,作者图片
高斯(也是径向基函数核),图片作者
基于距离的#2,图片由作者提供
训练模型,即。让嵌入尽可能接近原图,对数似然最大化。
伯努利可能性,作者图片
KL 分歧(3 个模型)
KL 散度是一个概率分布与另一个概率分布的不同程度的度量。在我们的例子中,图表被建模为一个概率分布,即。图形矩阵的行数总和为 1。使用不同的模型来捕获概率分布中的真实图形特征,即个性化页面排名、转移的幂和以及转移矩阵。当然,嵌入空间中的图也需要是有效的概率分布,以便 KL 散度有意义,因此 Softmax 应用于嵌入节点。为了使嵌入的图形尽可能接近原始图形,或者更准确地说,接近在各个编码器中捕获的图形特征,KL 散度被最小化。
KL Divergence,作者图片
奇异值分解(7 种型号)
在奇异值分解中,众所周知的方法被应用于能够捕捉图形特征的不同矩阵。这样,矩阵被嵌入到低维空间中。
奇异值分解,作者图片
实验
总共 14 种嵌入方法使用 3 个评估任务在 4 个流行的图数据集上进行比较。
实验概述,作者图片
调查的结果
对于结果,在不同的嵌入技术下,相同的相似性度量(例如邻接矩阵)之间的比较是特别有趣的。
关于链路预测:
对于相同的相似性度量,对于随机矩阵,基于 KL 的模型优于基于 SVD 的模型。
链接预测的结果,图片由作者提供
关于节点分类:
对于节点分类,所有模型都表现出相似的性能。
节点分类结果,按作者分类的图像
关于节点群集:
基于 KL 的模型比基于 Bernoulli 和 SVD 的模型表现更好。特别是 SVD 由于在更高的维度中包含了太多的噪声而失去了这种比较。在奇异值分解结果中,对此进行了进一步分析。
节点聚类的结果,按作者分类的图像
在 SVD 上:
随着嵌入维数的增加,SVD 模型的节点聚类性能下降。
增加嵌入维数下的奇异值分解结果,图片由作者提供
关于伯努利:
基于 z_i - z_j 的模型比基于 ZZ^T 的模型表现更好。其原因可能是随着乘法运算而出现的正则化的必要性。为了便于比较,正则化被排除在外。
关于收敛时间:
尤其引人注目的是,基于 KL 的模型比基于 Bernoulli 的模型收敛得更快。
结论
在这项工作中提供了节点嵌入的基本原则的基准。所进行的实验证明了这样的假设,即在开发新方法之前,应该重新考虑基本原理,因为结果可能是显著不同的性能。我们公开提供我们实验的代码。如有疑问和反馈,请随时联系我们!
节点嵌入:使用 Neo4j 的 Node2vec
了解如何使用 Neo4j 图形数据科学训练您的自定义 node2vec 算法
我上一篇关于将图形与 NLP 技术相结合的博文是迄今为止最成功的。这促使我写更多关于这个话题的东西。在我的研究过程中,我偶然发现了 node2vec 算法,并注意到用 Neo4j 和图形数据科学库来实现它是多么容易。我想这让我别无选择,只能戴上我的 Neo4j 数据科学眼镜并展示实现它是多么容易。
图形导入
今天我们将使用 Kaggle 上的匙羹鱼食物数据集。它包含营养信息以及 1600 多种菜肴中使用的配料。不幸的是,它没有包含酸奶面包的配方。
图表模式
图形模式中有三种类型的节点。一道菜由一种或多种食材组成,我们将其表示为一道菜与其食材之间的联系。食谱分为不同的类别或类型,如午餐、早餐等等。我们使用apoc.schema.assert
过程来定义图表模式。它允许我们在一个查询中描述多个索引和唯一约束。
CALL apoc.schema.assert(
// define indexes
null,
// define unique constraints
{Ingredient:['name'], Dish:['id'], DishType:['name']})
在执行导入查询之前,我们必须下载数据集并将其复制到 Neo4j 导入文件夹中。在导入查询中,我们做了一点点预处理,将配料的名称小写,并用空格替换破折号(-
)。
LOAD CSV WITH HEADERS FROM "file:///newfood.csv" as row
CREATE (d:Dish{id:row.id})
SET d += apoc.map.clean(row, ['id','dishTypes','ingredients'],[])
FOREACH (i in split(row.ingredients,',') |
MERGE (in:Ingredient{name:toLower(replace(i,'-',' '))})
MERGE (in)<-[:HAS_INGREDIENT]-(d))
FOREACH (dt in split(row.dishTypes,',') |
MERGE (dts:DishType{name:dt})
MERGE (dts)<-[:DISH_TYPE]-(d))
基本图形探索
首先,我们将进行一些图形探索。我们来看看哪些食材用的最多。
MATCH (n:Ingredient)
RETURN n.name as ingredient,
size((n)<--()) as mentions
ORDER BY mentions DESC
LIMIT 10
结果
橄榄油是迄今为止最受欢迎的,因为它在超过一半的食谱中使用。慢慢接着是大蒜、盐和黄油。我不知道黄油如此受欢迎。我也发现凤尾鱼被如此广泛地使用是相当令人惊讶的。或者也许数据集只是偏向于含有凤尾鱼的菜肴。
我们可以在这个数据集的基础上构建一个应用程序,根据我们想要烹饪的配料来搜索食谱。我从马克·尼达姆和 Lju Lazarevic 写的什么是烹饪系列中借用了这个密码查询。比方说,你今天想吃西葫芦和羊乳酪,但不知道该吃哪种食谱。幸运的是,我们的应用程序可以通过下面的 cypher 查询帮助我们解决这个问题。
WITH ["feta cheese", "zucchini"] as ingredients
MATCH (d:Dish)
WHERE
all(i in ingredients WHERE exists(
(d)-[:HAS_INGREDIENT]->(:Ingredient {name: i})))
RETURN d.title AS dish
ORDER BY size(ingredients)
LIMIT 10
结果
我们可以配沙拉或鱼。我想我会跳过去 node2vec 吃甜点。
Node2vec 算法
node2vec 算法相对较新。它是在 2016 年由 Jure Leskovac 和 Aditya Grover 在一篇文章 node2vec:可扩展的网络特征学习中提出的。要了解它是如何工作的,首先要了解 word2vec 算法。Word2vec 算法是由谷歌的托马斯·米科洛夫领导的研究团队在 2013 年提出的。使用神经网络来学习单词嵌入是一种流行的技术。它将一个句子列表作为输入,并为文本语料库中出现的每个单词生成一个向量或嵌入。词义相近的词在嵌入空间上要更近一些。比如苹果和梨应该比苹果和汽车更相似。word2vec 有两种训练算法。第一种方法被称为连续单词袋(CBOW),它使用单词的上下文来预测目标术语。上下文被定义为出现在文本中目标单词附近的单词。第二种方法叫做跳格法。它不是试图从上下文中预测目标单词,而是试图预测给定术语的上下文。如果您想了解更多关于 word2vec 算法的知识,互联网上有大量关于它的好文献。
你可能会问我们是如何从 word2vec 到 node2vec 的。这其实很简单。我们不使用句子列表作为输入,而是使用随机漫步列表。这是唯一的区别。
Neo4j 图形数据科学库
Neo4j 图形数据科学库支持随机游走算法,这使得我们实现 node2vec 算法变得非常容易。如果你需要快速复习一下 GDS 图书馆是如何运作的,你可以看看我之前的博客文章。我们将从投影内存中的图形开始。我们将所有三个节点标签和项目关系描述为无向的。
CALL gds.graph.create('all',
['Dish', 'Ingredient'],
{undirected:{type:'*', orientation:'UNDIRECTED'}})
现在我们准备训练我们的第一个 node2vec 模型。该流程将包括三个部分:
- 从图中的每个节点开始执行随机行走算法
- 将随机漫步输入 word2vec 算法
- 通过查看最相似的邻居来检查结果
随机行走算法有一个可选的start
参数,可以用来定义行走的起始节点。我们还可以用steps
设置指定行走的长度,用walks
参数指定行走的次数。请注意,每次执行随机漫步时,我们都期望得到不同的结果。
我们将使用 gensim 库中的 Word2vec 算法实现。它还有几个我们可以定义的超参数。最值得注意的是:
- 大小:嵌入向量的维数
- 窗口:当前字和预测字之间的最大距离
- min_count :训练模型时要考虑的最小字数;出现次数少于此计数的单词将被忽略。
- sg :训练算法:跳格 1;否则默认 CBOW
查看官方文档了解更多关于 word2vec 超参数的信息
结果
[('anchovy fillet', 0.6236759424209595),
('pork shoulder roast', 0.6039043068885803),
('penne', 0.5999650955200195),
('cherry', 0.5930663347244263),
('cooked quinoa', 0.5898399353027344),
('turkey', 0.5864514112472534),
('asiago cheese', 0.5858502388000488),
('pasillas', 0.5852196216583252),
('fresh marjoram', 0.5819133520126343),
('prunes', 0.5735701322555542)]
如果我知道有这么简单,我早就写 node2vec 算法了。另一方面,结果有点可疑。我不知道这个数据集和凤尾鱼有什么关系。看起来食谱大多是由真正喜欢它们的人写的。你可能会得到完全不同的结果。
在最初的 node2vec 论文中,作者定义了两个控制随机漫步执行的参数。第一个是返回参数。
返回参数 ,p .参数 p 控制在行走中立即重访一个节点的可能性。将其设置为较高的值(> max(q,1))确保我们不太可能在接下来的两步中对已经访问过的节点进行采样(除非遍历中的下一个节点没有其他邻居)。该策略鼓励适度探索,并避免采样中的 2 跳冗余。另一方面,如果 p 较低(< min(q,1)),它将导致遍历返回一步(图 2),这将使遍历“局部”靠近起始节点 u。
第二个参数称为输入输出参数。
In-out 参数 ,q .参数 q 允许搜索区分“向内”和“向外”节点。回到图 2,如果 q > 1,则随机行走偏向于靠近节点 t 的节点。这种行走相对于行走中的开始节点获得基础图的局部视图,并且在我们的样本包括小局部内的节点的意义上近似 BFS 行为。相反,如果 q < 1,walk 更倾向于访问离节点 t 更远的节点。这种行为反映了鼓励向外探索的 DFS。然而,这里的一个本质区别是我们在随机游走框架内实现了类似 DFS 的探索。因此,被采样的节点与给定的源节点 u 的距离不是严格递增的,但是反过来,我们受益于易处理的预处理和随机行走的优越采样效率。注意,通过将πv,x 设置为行走 t 中前一节点的函数,随机行走是二阶马尔可夫的。
总之,return 参数指示随机漫步多长时间回溯一步或两步。进出参数控制随机行走是更侧重于局部探索(类似于 BFS)还是更倾向于向外探索(类似于 DFS)。尽管随机游走算法仍处于 alpha 层,但它支持这两个 node2vec 参数。让我们在实践中尝试一下。
结果
[('leg of lamb', 0.7168825268745422),
('anise seeds', 0.6833588480949402),
('basic bruschetta', 0.6759517192840576),
('dried chilli flakes', 0.6719993352890015),
('tuna in olive oil', 0.6697120666503906),
('spaghetti pasta', 0.669307291507721),
('prime rib roast', 0.661544919013977),
('baby artichokes', 0.6588324308395386),
('rice vermicelli', 0.6581511497497559),
('whole wheat fusilli', 0.6571477651596069)]
看结果让我很饿。羊腿和橄榄油要不要算类似食材,真的不好说。如果我们观察图表,在八个包含羊腿的食谱中,有七个也使用橄榄油。按这种逻辑,两者颇为相似。
在下一个例子中,我们将展示如何运行 node2vec 算法并将结果嵌入存储回 Neo4j。我们将返回内部的 Neo4j 节点 id,而不是返回菜肴和配料的标题。这将有助于我们有效地将结果链接回 Neo4j。
这些嵌入现在在 word2vec 模型的词汇表中可用。我们将使用UNWIND
cypher 语句将它们一次性存储到 Neo4j 中。如果可能的话,尽量避免每行提交一个事务,因为这不是很高效。
Word2vec 模型使用余弦相似度来查找最相似的单词。图形数据科学库还支持余弦相似度算法,可用于推断相似度算法。与所有相似性算法一样,我们必须微调similarityCutoff
和topK
参数以获得最佳结果。它们直接影响推断的相似性图的稀疏程度。
MATCH (node)
WITH id(node) as id, node.embedding as weights
WITH {item:id, weights: weights} as dishData
WITH collect(dishData) as data
CALL gds.alpha.similarity.cosine.write({
nodeProjection: '*',
relationshipProjection: '*',
similarityCutoff:0.5,
topK:5,
data: data,
writeRelationshipType:'COSINE_SIMILARITY'})
YIELD nodes, similarityPairs
RETURN nodes, similarityPairs
结果
为了完成这个分析,我们将使用标签传播算法检查推断网络的社区结构。由于我们只对社区结构的大致轮廓感兴趣,我们可以使用算法的stats
模式为我们提供一些基本的社区结构统计数据。
CALL gds.labelPropagation.stats({
nodeProjection:'*',
relationshipProjection:'COSINE_SIMILARITY',
maxIterations:20})
YIELD communityCount, communityDistribution
RETURN communityCount,
apoc.math.round(communityDistribution.p50,2) as p50,
apoc.math.round(communityDistribution.p75,2) as p75,
apoc.math.round(communityDistribution.p90,2) as p90,
apoc.math.round(communityDistribution.p90,2) as p95,
apoc.math.round(communityDistribution.mean,2) as mean,
apoc.math.round(communityDistribution.max,2) as max
结果
标签传播算法在相似性网络中找到 118 个组。其中大多数成员不到 40 人。有一些大型社区,最大的有 393 名成员。
结论
node2vec 算法是一种学习图中节点的低维表示的有用方法,可以在机器学习管道的下游使用。在这篇博文中,我意识到改变随机游走算法参数以及 word2vec 超参数可以产生非常不同的结果。尝试一下,看看什么最适合你。
和往常一样,代码可以在 GitHub 上获得。
正则化方法:用于改进深度学习模型的噪声
将随机噪声引入训练过程
当你开始学习神经网络时,你学到的第一个概念是 过拟合和欠拟合 的含义。有时,训练一个完美概括数据的模型是一项挑战,尤其是当您有一个小数据集时,因为:
- 当您使用小数据集训练神经网络时,网络通常会记住训练数据集,而不是学习我们数据的一般特征。因此,该模型在训练集上表现良好,在新数据(例如:测试数据集)上表现不佳
- 一个小的数据集不能很好地描述我们的问题,因此,它可能会导致一个难以学习的问题。
获取更多的数据是一项非常昂贵和艰巨的任务。然而,有时你可以应用一些技术(正则化方法)来获得更好的模型性能。
在本文中,我们将重点关注使用噪声作为神经网络中的正则化方法。这种技术不仅减少了过度拟合,而且还可以更快地优化我们的模型,提高整体性能。
你可以在我的 GitHub 中找到完整的代码!😃
目标
这一条的目标如下:
- 使用 sklearn 生成合成数据
- 正则化方法
- 训练一个基本的神经网络作为基线(MLP)
- 使用噪波作为正则化方法-输入图层
- 使用噪波作为正则化方法-隐藏层
- 使用噪声作为正则化方法-输入和隐藏层
- 网格搜索以查找模型最佳性能的值
正则化方法
训练一个机器学习模型是一个挑战,它将在以前看不见的输入上表现良好,而不仅仅是那些我们的模型被训练的输入。这个特性被称为 泛化 ,对未观测到的输入表现良好。有一些像训练测试分割或交叉验证的方法来衡量我们的模型有多一般化。
我们可以将模型的性能分为三种情况:
- 该模型在训练数据集和新数据上表现不佳— 欠拟合模型。
- 该模型在训练数据集上表现良好,而在看不见的数据上表现不佳— 过拟合模型。
- 该模型学习我们的训练数据集,并在看不见的数据上表现良好,它能够进行归纳— 良好拟合模型
在我们的问题中更有可能面临过拟合模型因此,在训练期间监控性能以检测其是否过拟合是很重要的。通常在训练过程中绘制准确度的演变和损失,以检测常见模式。
合身、合身和合身
正则化 是修改我们的学习算法,减少它的泛化误差而不是训练误差。神经网络中最常见的正则化方法有:
这些方法在神经网络中很流行,其中大多数已被证明可以减少过拟合。然而,噪声对深度学习模型的影响从未被系统地研究过,准确性提高的潜在原因也没有。上述观察的一个假设是放松一致性将随机噪声引入训练过程。这隐含地减轻了模型的过度拟合,并且更好地概括了模型以分类测试数据。
使用 Sklearn 生成数据
我们想了解在过度拟合的神经网络中使用噪声作为正则化方法的效果,我们决定使用二元分类问题来解释这一点。因此,我们将应用 sklearn 生成一个二进制数据集,具体来说就是生成 2 个二维同心圆的make_circles
。这些参数是:
n_samples=100
(生成的总点数)noise=0.09
(加到数据上的高斯噪声的标准偏差)param_random=24
(通过多个函数调用传递一个 int 以获得可再现的输出)
生成并绘制数据我们数据
培训用数据
我们需要评估我们的网络的性能,看看我们是否有过度拟合,因此,我们需要分割我们的数据,以生成另一个数据集x_test
进行测试。我们将数据分为train_set
(30%)和test_set
(70%)。
因为我们需要强制过度拟合,所以我们为我们的训练集选择了较小的大小(30%),因为我们希望创建一个不会概括我们的数据并且在测试数据集上具有较高错误率的神经网络。
分割和绘制我们的训练和测试数据
我们可以绘制出X_train
和X_test
的分布图:
训练和测试集的分布
我们选择了这种类型的数据,称为圆形数据,,因为这些类是不可线性分离的(我们不能使用直线分割我们的数据)。为此,我们需要一个神经网络来解决这个非线性问题。
因为我们需要在我们的模型中找到过度拟合,以作为一种正则化方法来研究噪声的影响,所以我们只生成了 100 个样本。这是一个训练神经网络的小样本,它使我们能够过拟合训练。
第一步:基本神经网络——MLP
为了研究噪音如何影响我们的训练,我们训练了一个基本的神经网络作为基线。我们定义了一个多层感知器(MLP) 来解决我们的二元分类问题。
第一层是使用400 nodes
和relu
激活函数的隐藏层。在输出层,我们使用了一个sigmoid
,因为我们想要预测 0 或 1 的类值。我们使用binary_crossentropy
作为损失(适用于二元分类),使用adam
作为优化器。
我们为5000 epochs
训练神经网络,并使用X_test
和y_test
作为验证数据。
基本神经网络作为基线
我们绘制了一个图表来表示训练集和测试集的准确性和损失。可以观察到,我们的神经网络具有过拟合,因为该图具有过拟合模型的预期形状,test accuracy
增加到一点,然后再次开始降低。同时,loss
是发散性的。
基本神经网络训练精度和损失的演变
结果基本神经网络
我们可以观察到,测试机组的精度约为train_acc=1
,测试机组的**精度约为test_acc=0.5857
。它在训练集上表现出比在测试数据集中更好的性能;这可能是过度合身的迹象。**
现在,我们将使用 Keras 的Gaussian Noise Layer
添加噪声,并比较结果。该层应用加性的零中心高斯噪声,这对于减轻过拟合是有用的。高斯噪声(GS)是实值输入破坏过程的自然选择。
这个正则化层只在训练时有效。
但是什么是高斯噪声呢?
高斯噪声 是概率密度函数(PDF)等于正态分布的统计噪声。它也被称为高斯分布。高斯随机变量𝑧的概率密度函数𝑝由下式给出:
概率密度函数
其中𝑧代表灰度级,𝜇代表平均值,𝜎代表标准差。综上所述,噪声可能呈现的值是高斯分布的。
2 个概率密度函数—高斯噪声
为了理解高斯噪声的含义,假设我们有一幅图像,并绘制了两个概率密度函数。如果我们观察红色 PDF: 噪声的平均值将是-2 。因此,平均而言,图像的所有像素将减去 2。但是,如果我们观察橙色的 PDF,平均值是 3 。所以平均来说,所有像素加 3。例如,如果我们拍摄这张图像,并应用高斯噪声:
左:原始图像—右:带有高斯噪声的图像
我们可以检查每个图像的直方图,以评估应用高斯噪声的效果:
直方图—左侧:原始图像。右图:带有高斯噪声的图像
虽然我们已经用图像解释了高斯噪声,但是在 Keras 中应用高斯噪声作为正则化方法的方法应用了相同的理论。
添加噪声会增加我们的训练数据集的大小。当我们训练神经网络时,随机噪声被添加到每个训练样本中,这是数据扩充的一种形式。此外,当我们使用噪声时,我们增加了数据的随机性,并且模型不太能够从训练样本中学习,因为它们在每次迭代中都是变化的。因此,神经网络学习更多的一般特征,并具有更低的泛化误差。
当我们应用噪声时,我们在训练样本的附近创建新的样本,因此,输入数据的分布被平滑。这使得神经网络更容易从我们的数据中学习。
神经网络中的输入层噪声
我们将添加一个高斯噪声层作为输入层,我们将分析这是否有助于提高泛化性能。当我们添加噪声时,我们会创建更多的样本,并使数据分布更加平滑。
具有输入层噪声的神经网络
在线图中可以看出,由于我们在训练中引入的具有噪声的点与训练数据集的点冲突,噪声导致模型的准确性和损失跳跃。我们使用std=0.1
作为输入噪声,这可能有点高。
精度的演变和训练损失——输入层噪声
通过在输入层使用噪声作为正则化方法,我们减少了模型中的过拟合,此外,我们还改进了test_accuracy=0.642
。
结果神经网络-输入层噪声
神经网络中的隐含层噪声
现在,我们将尝试用高斯噪声创建一个隐藏层。这必须在应用激活功能之前完成。我们将使用 0.1 的标准偏差,也是任意选择的。
具有隐含层噪声的神经网络
训练精度的演变和损失——隐含层噪声
在这种情况下,可以看到train_accuracy
保持不变,尽管我们设法增加了test_accuracy=0.671
。似乎将噪声添加到我们的模型中允许改进神经网络的训练,并且对于减轻过拟合是有用的。
结果神经网络—隐藏层噪声
神经网络中的输入+隐含层噪声
我们结合了前面的两个例子,通过同时添加一个input layer noise
和一个hidden layer noise
来研究我们的模型的性能。我们将使用 0.1 的标准偏差,也是任意选择的。
输入+隐含层噪声的神经网络
训练——输入+隐含层噪声——精度和损失的演变
再次可以看到,随着噪声的使用,如input_layer
和hidden_layer
,同时,我们减少了模型中的过拟合。此外,它增加了test_accuracy=0.6857
,似乎高斯噪声作为一种正则化方法允许模型更好地概括我们的数据。
结果神经网络—输入+隐藏层噪声
应用噪声,我们在训练样本附近创建新的样本,从而平滑输入数据的分布。
网格搜索-噪波图层
我们将开发一个网格搜索来找出噪声的确切数量和隐藏层中的节点,从而使我们能够获得性能最佳的模型。
我们将使用带有隐藏层噪声的神经网络作为网格搜索的例子。我们需要用模型创建一个函数来搜索噪声的最佳值。
网格搜索-隐藏图层噪波
我们已经创建了一个名为grid_values
的字典,其中包含了模型中每个参数的值的范围。最后,我们将模型create_model()
插入到名为KerasClassifier
的包装器中,该包装器实现了 Scikit-Learn 分类器接口。
计算网格搜索
**Best: 0.833333 using {'nodes': 300, 'noise_amount': 0.001} 0.766667 (0.133333) with: {'nodes': 50, 'noise_amount': 0.001} 0.766667 (0.133333) with: {'nodes': 50, 'noise_amount': 0.01} 0.766667 (0.133333) with: {'nodes': 50, 'noise_amount': 0.1} 0.766667 (0.081650) with: {'nodes': 50, 'noise_amount': 0.2} 0.700000 (0.066667) with: {'nodes': 50, 'noise_amount': 0.7} 0.633333 (0.124722) with: {'nodes': 50, 'noise_amount': 1} 0.800000 (0.163299) with: {'nodes': 100, 'noise_amount': 0.001} 0.800000 (0.163299) with: {'nodes': 100, 'noise_amount': 0.01} 0.766667 (0.133333) with: {'nodes': 100, 'noise_amount': 0.1} 0.800000 (0.124722) with: {'nodes': 100, 'noise_amount': 0.2} 0.766667 (0.169967) with: {'nodes': 100, 'noise_amount': 0.7} 0.666667 (0.105409) with: {'nodes': 100, 'noise_amount': 1} 0.833333 (0.149071) with: {'nodes': 300, 'noise_amount': 0.001} 0.800000 (0.163299) with: {'nodes': 300, 'noise_amount': 0.01} 0.766667 (0.133333) with: {'nodes': 300, 'noise_amount': 0.1} 0.833333 (0.105409) with: {'nodes': 300, 'noise_amount': 0.2} 0.666667 (0.105409) with: {'nodes': 300, 'noise_amount': 0.7} 0.633333 (0.124722) with: {'nodes': 300, 'noise_amount': 1} 0.800000 (0.163299) with: {'nodes': 500, 'noise_amount': 0.001} 0.800000 (0.163299) with: {'nodes': 500, 'noise_amount': 0.01} 0.800000 (0.124722) with: {'nodes': 500, 'noise_amount': 0.1} 0.833333 (0.105409) with: {'nodes': 500, 'noise_amount': 0.2} 0.600000 (0.133333) with: {'nodes': 500, 'noise_amount': 0.7} 0.600000 (0.133333) with: {'nodes': 500, 'noise_amount': 1}**
我们可以看到,使用在隐藏层中具有300 neurons
和具有大约 83%精确度的noise_amount=0.001
的网络获得了最好的结果。
未来的实验
我们可以用下面的想法来改进这个添加噪声作为正则化方法的实验:
- 用噪波添加更多的层来研究他的效果。
- 用更深层次的神经网络重复同样的实验。
- 在没有过度拟合的情况下,在模型中研究噪声作为正则化方法的影响。
- 尝试在激活和权重中添加噪声。
欢迎建议和评论。关注我,感谢你的阅读!😃