admin管理员组

文章数量:1568331

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

PyTorch 实践指南

原文:https://towardsdatascience/a-practitioners-guide-to-pytorch-1d0f6a238040?source=collection_archive---------0-----------------------

几天前我开始使用 PyTorch。下面我概述了 PyTorch 的关键概念,以及一些我在接触这个框架时发现特别有用的观察结果(如果你没有意识到它们,这可能会导致很多挫折!)

词汇表

张量——(喜欢)一个 numpy.ndarray 但是可以住在 GPU 上。

变量——通过将张量自身包裹起来,使其成为计算的一部分。如果创建时 requires_grad = True,将在向后阶段计算梯度。

pytorch 如何工作

您可以通过写出它们来执行计算,就像这样:

Taking a dot product of x with w using the new Python 3.5 syntax. torch.cuda creates the tensor on the GPU.

一旦完成,您需要做的就是对结果调用#backward()。这将计算梯度,并且您将能够访问使用 requires_grad = True 创建的变量的梯度。

Accessing the gradient of w.

要记住的事情(否则有发疯的危险)

  1. 数据类型很重要! 如果把一个字节或者除以 50 会怎么样?如果你试图将 torch.exp(12)的结果存储在一个半张量中会怎样?实际上,这比乍看起来要简单得多,但确实需要一些思考。
  2. 如果能上溢或下溢,就会。 数值稳定性很重要——当存储在合成张量中时,除法能产生零吗?如果你试着把它记录下来呢?
    再一次——这没什么可详细说明的,但肯定是需要注意的。如果你想更深入地了解这一点,让我向你介绍终极,同时在这一问题上非常平易近人的来源。
  3. 渐变默认累加!我把最好的留到了最后——与我们现在要看的野生动物相比,上面两只是友好的吉娃娃!
    默认情况下,渐变会累积。你运行一次计算,你逆向运行——一切都很好。但是,对于第二次运行,渐变被添加到第一次操作的渐变中!这很重要,也很容易忘记,请看看我们之前的例子:

解决方案是在运行之间手动调零梯度。

最后但同样重要的是,我想推荐官方教程——不管你的经验水平如何,它们都是值得一去的好地方。

我希望这能对你有所帮助,并能省去我在开始学习 PyTorch 时所经历的一些挣扎。祝我们俩好运,因为我们将继续掌握这个令人惊叹的框架!

如果你觉得这篇文章很有趣并且想保持联系,你可以在 Twitter 上找到我 这里

一个生产就绪的多类文本分类器

原文:https://towardsdatascience/a-production-ready-multi-class-text-classifier-96490408757?source=collection_archive---------1-----------------------

在任何业务中,理解客户是成功的基本要素。用户的观点、查询和意见在传递用户观点方面起着重要作用。每个人现在都在试图使用一种叫做“自然语言处理”的新兴技术来收集这些嵌入式用户对产品或服务的看法。文本或句子分类是“自然语言处理”下一个非常热门且必要的问题。在这篇文章中,我们将介绍如何使用支持向量机构建一个生产就绪的多类文本分类器。

[## sambit 9238/机器学习

机器学习——它代表了机器学习在不同场景中的一些实现。

github](https://github/sambit9238/Machine-Learning/blob/master/question_topic_nlp.ipynb)

任何机器学习问题的第一步都是收集所有分析和预测所需的数据。这里,我们使用的数据集包含 5000 个客户查询和相应的问题主题。总共有 5 个独特的问题主题。因此,让我们首先导入所需的依赖项并加载数据集。

import pandas as pd
import numpy as np
#load data
df = pd.read_csv("question_topic.csv")

为了了解数据是如何存在的,让我们探索一下数据集中的 5 个随机观察值。

df.sample(5)

在继续之前,我们需要检查问题主题以及在数据集中出现的次数。

from collections import Counter
Counter(df["question_topic"])

每个职业出现的次数看起来还不错,尽管在职业中不平衡。现在,在进行特征分解之前,我们首先需要做一些预处理,比如去除数字等。因为它们无助于预测问题的上下文。

#pre-processing
import re 
def clean_str(string):
    """
    Tokenization/string cleaning for dataset
    Every dataset is lower cased except
    """
    string = re.sub(r"\n", "", string)    
    string = re.sub(r"\r", "", string) 
    string = re.sub(r"[0-9]", "digit", string)
    string = re.sub(r"\'", "", string)    
    string = re.sub(r"\"", "", string)    
    return string.strip().lower()
X = []
for i in range(df.shape[0]):
    X.append(clean_str(df.iloc[i][1]))
y = np.array(df["question_topic"])

现在,让我们对数据进行训练测试分割,开始建模。一般惯例是取 70%作为训练数据,30%作为测试数据。

#train test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=5)

之后,训练测试分裂,我们应该开始设计分类器。因为输入是文本,我们首先需要将它们转换成数字向量,以输入到任何机器学习算法中。使用以下两种方法完成要素的矢量化。

CountVectorizer: 将评论转化为 token 计数矩阵。首先,它对文本进行标记,并根据每个标记出现的次数,创建一个稀疏矩阵。CountVectorizer 矩阵的计算:假设我们有三个不同的文档,包含以下句子。

“相机很棒”。

“相机太可怕了”。

“相机没问题”。

生成大小为 3*5 的矩阵,因为我们有 3 个文档和 5 个不同的特征。矩阵将看起来像:-

TF-IDF: 它的值代表一个词在语料库中对文档的重要性。TF-IDF 值与一个词在文档中的出现频率成正比。TF-IDF 值的计算:假设电影评论包含 100 个单词,其中单词 Awesome 出现了 5 次。Awesome 的项频率(即 TF)则为(5 / 100) = 0.05。同样,假设语料库中有 100 万条评论,单词 Awesome 在整个语料库中出现 1000 次,则逆文档频率(即 IDF)被计算为 log(1,000,000 / 1,000) = 3。因此,TF-IDF 值计算如下:0.05 * 3 = 0.15。

现在,数字向量作为支持向量机算法的输入给出。因为在文本情况下特征的数量通常很大,所以线性核通常表现最好。

这里的另一个挑战是多类分类。在支持向量机实现中,我们可以使用 OneVsRest 分类器概念。OneVsRest(或一对一对所有,OvA 或 OvR,一对一对所有,OAA)策略涉及每个类训练一个单一的分类器,该类的样本作为阳性样本,所有其他样本作为阴性样本。这种策略要求基本分类器为其决策产生一个实值置信度得分,而不仅仅是一个分类标签;单独的离散类别标签会导致模糊性,即针对单个样本预测多个类别。

为了使分类器设计生产就绪,我们可以创建一个上述所有这些过程的管道,从而使其更容易转移到其他系统。

#pipeline of feature engineering and model
model = Pipeline([(‘vectorizer’, CountVectorizer()),
 (‘tfidf’, TfidfTransformer()),
 (‘clf’, OneVsRestClassifier(LinearSVC(class_weight=”balanced”)))])
#the class_weight="balanced" option tries to remove the biasedness of model towards majority sample

对于使用的每一种机器学习算法,参数调整都起着重要的作用。已经观察到,通过设置适当的参数值,模型的性能合理地提高。我们可以使用网格搜索找到适合我们情况的参数,如下所示

#paramater selection
from sklearn.grid_search import GridSearchCV
parameters = {'vectorizer__ngram_range': [(1, 1), (1, 2),(2,2)],
               'tfidf__use_idf': (True, False)}
gs_clf_svm = GridSearchCV(model, parameters, n_jobs=-1)
gs_clf_svm = gs_clf_svm.fit(X, y)
print(gs_clf_svm.best_score_)
print(gs_clf_svm.best_params_)

所以,现在我们从网格搜索中得到合适的参数。是时候使用最合适的参数来准备最终的管道了。

#preparing the final pipeline using the selected parameters
model = Pipeline([('vectorizer', CountVectorizer(ngram_range=(1,2))),
    ('tfidf', TfidfTransformer(use_idf=True)),
    ('clf', OneVsRestClassifier(LinearSVC(class_weight="balanced")))])

然后,我们将使用训练数据和测试数据来拟合模型,以便对整体性能有一个总体了解。

#fit model with training data
model.fit(X_train, y_train)
#evaluation on test data
pred = model.predict(X_test)
from sklearn.metrics import confusion_matrix, accuracy_score
confusion_matrix(pred, y_test)

Confusion Matrix

否则,如果确信从网格搜索交叉验证获得的准确度分数,我们可以直接用全部数据拟合模型。

model.fit(X, y)

现在我们需要将准备模型保存在 pickle 文件中,以便可以在生产端部署它。python 中的 joblib 函数使它变得更容易。

from sklearn.externals import joblib
model = joblib.load('model_question_topic.pkl')

现在模型已经准备好并保存到文件系统中。对于模型部署,pickle 文件可以移动到生产站点,并将通过如下所示的输入进行调用

from sklearn.externals import joblib
model = joblib.load('model_question_topic.pkl')
question = input()
model.predict([question])[0]

提高文本分类器性能的更多技巧可以是:-

1 .消除低质量特征(单词)

2.有一个合适的停用词表

3.多样化你的训练语料库

4.使用词干化和词汇化

参考文献-

[## sk learn . pipeline . pipeline-sci kit-learn 0 . 19 . 1 文档

管道的目的是组装几个步骤,这些步骤可以在设置不同的…

scikit-learn](http://scikit-learn/stable/modules/generated/sklearn.pipeline.Pipeline.html) [## 4.1.Pipeline 和 FeatureUnion:组合估算器-sci kit-了解 0.19.1 文档

可用于将多个评估器连接成一个。这很有用,因为在…中通常有固定的步骤顺序

scikit-learn](http://scikit-learn/stable/modules/pipeline.html) [## 使用文本数据-scikit-了解 0.19.1 文档

20 个新闻组数据集是大约 20,000 个新闻组文档的集合,这些文档(几乎)均匀地进行了分区…

scikit-learn](http://scikit-learn/stable/tutorial/text_analytics/working_with_text_data.html)

用音乐投资(和获利)的量化方法

原文:https://towardsdatascience/a-quantitative-approach-to-investing-and-profiting-with-music-2537a1260c53?source=collection_archive---------13-----------------------

||简介||

大多数消费者和投资者都非常熟悉通过 Spotify 和 Apple Music 等服务获得的商业音乐的内容流方面,以及如何投资于它们(只需购买 S P O T ∗ 或 ∗ SPOT* 或 * SPOTAAPL ),但制作方面呢?

我(作为一个不能连续两个小时不听好音乐的人)想结合我的一些兴趣,了解一个人如何投资音乐制作,以及在这个领域是否有一个独特的投资机会,可以快速获利?经过一番思考,我缩小了我的关注点,形成了以下研究问题:

是否有某些股票受到音乐输出(如歌曲、专辑等)的显著影响。)那我可以投资吗?如果是这样的话,我能预测哪些专辑/歌曲将会推动价格,从而在市场之前获得可观的回报吗?

答案是一个响亮的也许!

||概述||

在音乐界,有三个音乐制作的“霸主”:环球音乐集团、索尼音乐和华纳音乐集团。在这些群体中有唱片公司,它们是管理自己的艺术家和制作人的子集,负责寻找有前途的人才/为他们提供成功所需的资源(并为唱片公司/总体群体赚钱)。在这三家公司中,索尼音乐和华纳音乐集团的母公司大部分收入来自其他渠道(索尼音乐和华纳兄弟音乐占母公司收入的比例不到 3%)。环球音乐集团(UMG)是个例外——其母公司,一家名为维旺迪的意大利媒体集团,依靠 UMG 获得其总收入的 40%(另外 60%来自一家名为“Gameloft”的游戏公司和一家名为“Canal+”的体育频道)。这意味着 UMG 的任何音乐作品都会影响维旺迪股价的 40%,这足以形成一个可交易的信号。

这在我看来更有希望,进一步的研究显示 UMG 实际上拥有以下唱片公司:

XO,Interscope 记录,Def Jam 记录,Capitol 记录,和 Republic 记录。

签约这些团体的艺术家包括威肯、阿姆、坎耶·韦斯特、酷玩乐队、Jay-Z、蕾哈娜、李尔·韦恩、想象龙、OneRepublic 和魔力红——我永远不会想到所有这些著名的艺术家都在为同一家公司创造收入!

然后,我的目标是弄清楚这些艺术家(以及其他许多 UMG 签名者)发行的畅销专辑是否创造了一个积极的信号,可以用来明智地交易维旺迪的股票。

||数据||

我需要一种方法来找到 UMG 艺术家发行的专辑之间的共同点,因为如果每张专辑都与其他专辑不同,任何价格上涨都很可能与专辑本身无关。

我决定使用专辑认证(银,金,白金等。)、首周销量、曲目数量、专辑类型(单曲、汇编等。),以及发行日期,作为可以用来寻找相似性的潜在因素。我现在可以开始尝试将这些因素整合到一个数据集中。

威望迪的股票价格
我用雅虎财经为“威望迪股份有限公司”( $VIV)提取每日收盘价。PA ,但这并不符合我的目的,因为我想衡量一张专辑在特定时间窗口内发布的效果。我选择了专辑发行后的七个交易日(因为第一周的销售额是音乐行业的一个常见指标),并计算了滚动百分比变化。

专辑发布 我刮了 Genius 的“专辑发布时间表”得到了最近两年(2016,2017)的专辑滴滴和各自艺人的名单。

专辑信息
使用 Spotify Web API,我搜索了我在上一步中找到的每张专辑,并能够获得每张专辑的更多信息,具体来说,我能够提取专辑中的曲目数量、专辑类型(单曲、汇编等)。),以及它们的具体发布日期。

UMG 艺术家 我还从维基百科的一篇文章中搜集了一份 UMG 艺术家的名单,并将他们与上一步的数据进行交叉引用,以获得 118 张 UMG 专辑的名单,以及他们各自的艺术家和上述因素。

我最初的计划是从美国唱片工业协会(RIAA)收集认证数据,该协会拥有每张专辑的获奖数据(如果它获奖的话)。不幸的是,我提出了太多的 HTTP 请求,并因安全原因被锁定在网站之外,所以我不得不转向。

||分析||

专辑认证数据的缺乏迫使我求助于二元问题,即专辑发行是否使 Vivendi 的股价上涨了 3%以上(这是一个任意选择的数字,似乎具有统计学意义)。这个支点意味着我没有因素去尝试和预测股价变化了多少,只有它到底有没有变化。

我通过一种算法计算了 118 张专辑的日期,用 1 的 target 值标记了对 Vivendi 有重大影响的专辑(其余的用 0)。

在这个算法的最后,我发现在过去两年的 118 张专辑中,有张 UMG 的专辑在发行后的一周内可能使威望迪的股价上涨了至少 3%。

Factor data for all 118 album releases by UMG artists (includes target values of “0” for no significant impact and “1” for significant impact)

为了建立 3%的 VIV 增量之间的依赖关系。PA 和这些专辑,标记为“1”的专辑之间需要有一些共性从上面的图表来看,很容易说这些有影响力的专辑彼此之间没有什么共同点(至少就我所能得到的因素而言)。然而,最后一张图表是最有趣的,因为它表明拥有 10-15 首曲目的专辑最有可能导致价格上涨。其他图表显示,专辑在接近年初或年底发行时表现最佳,“专辑”的表现比“单曲”或“合辑”好得多(但这也可能是因为 118 张专辑中的大多数是专辑)。

||结论||

一句话,我的小实验得出了以下结论:

在某张专辑发行一周后,Vivendi 的股票价格上可能有可交易信号的证据,但进一步的工作是必要的,以确定如何确定该信号,或者它甚至是什么

也有一些潜在的变量可能扭曲了我的实验,例如 Vivendi 其他细分市场的表现(如 Gameloft 和 Canal+)。此外,我肯定有一个有限的数据集,因为 Genius 在 2016 年才开始他们的专辑发布日历。

118 张专辑中的 25 张可能就足以暗示出 V I V 。帕和 U M G 的专辑发行,但这种相关性取决于 25 张专辑,标志着超过 3 VIV。帕和 UMG 的专辑发行,但这种相关性取决于 25 张专辑,标志着超过 3%的增长。如果这 25 张专辑有一些共同点,就有可能区分出哪种专辑会导致 VIV。帕和UMG的专辑发行,但这种相关性取决于25张专辑,标志着超过3VIV.PA 的飙升。

不幸的是,由于我能够提取的数据有限,我无法找出对威望迪股价产生重大影响的这些专辑之间更能说明问题的共同点。因此,尽管有轻微的证据表明这种相关性可能存在,但我不能断言这种相关性有多强。

所以,就像统计学中的大多数事情一样,

这个问题的真实答案唱了一首不为人知的曲子。

||后记||

我用 R 进行了这个实验,并使用了几个包,包括“ggplot2”(数据可视化)、“rvest”(web 抓取)和“httr”(HTTP 请求)。

我邀请你进行你自己的与这个主题相关的实验,并希望听到任何发现或进展!如果你喜欢这篇文章,请给它一些掌声,请继续关注 TDS 团队和我( Abhinav Raghunathan ),了解更多数据驱动的投资理念探索!

总统言论的快速下降,还是永久的暴跌?

原文:https://towardsdatascience/a-quick-dip-in-presidential-rhetoric-or-a-permanent-plunge-fda7f3cc2625?source=collection_archive---------12-----------------------

超过 130,000 份总统文件抄本的语言学分析

到首先,这个项目几乎完全归功于美国总统项目在记录和归档总统文稿方面所做的大量工作。我有兴趣看看总统的语言是如何随着时间的推移而变化的,以及是否有任何有趣的模式可以提取。我非常依赖 Hadley Wickham 的 rvest 软件包从美国总统项目的 html 源代码页面中抓取并阅读文字记录。总的来说,我使用的文件记录取自 1789 年 4 月 30 日(乔治·华盛顿的第一次就职演说)到 2018 年 9 月 21 日(概况介绍——唐纳德·j·特朗普总统获得资金来照顾我们的退伍军人,重建我们的军队,并投资于我们的基础设施),尽管对于这个项目,我决定只关注相对现代的总统(艾森豪威尔到特朗普),因为从 20 世纪中叶开始,每位总统的文件/记录的数量急剧增加:

To partially control for the increase in Presidential transcripts over time, Eisenhower was taken as the cutoff. For one thing, current Presidents are simply much more well-documented than those in the past; in addition, many older Presidents don’t have much in the way of verbal addresses (e.g., Taft and Harding had a lot of Executive Orders and Proclamations, but not many actual speeches).

其他分析已经研究了就职演说和其他更正式的演讲是如何随着时间的推移而变化的。我更感兴趣的是总统们在准备不充分的情况下用词的选择,所以我决定把我的大部分分析集中在总统的讲话上,我预测总统的讲话会更少排练,更少由演讲稿撰写人团队撰写,也许会更直接地衡量每位总统的基本词汇。因此,我提取了原始语音数据的一个子集,其中每个语音都包含单词“Remarks”(例如:“选举前夕的 Remarks”、“抵达德国时的 Remarks”、“参观明尼苏达州明尼阿波利斯州际公路 35W 大桥损坏后的 Remarks”),然后通过删除会话记录(“交流”、“通话”、“问答”等)来进一步细化数据集。).我还删除了不是来自现任/未来总统的文字记录(因此没有新闻秘书、副总统或初选候选人)。这给我留下了 19433 份抄本。

为了简单、直接地测量语言内容,我计算了每组评论的弗莱斯奇-金凯等级水平。这种方法通过一个考虑了句子长度和音节数的公式得出文档的近似美国等级阅读水平(更高等级→更复杂的语音)。因为音节计数是一个相当缓慢和乏味的过程(而且绝对不是无足轻重的),我还尝试缩短一些较长的演讲。我发现,从一些较长的转录中随机抽取 50 个句子,得到的 F-K 等级与整个文档的 F-K 等级高度相关,而计算只需要很少的时间。因此,用这种抽样方法来计算每份备注的 F-K 分数。由此得出的数据提供了一个有趣的(也是相当惊人的)总统语言随时间变化的图像:

Flesch-Kincaid reading grade level for each set of Presidential “remarks” plotted by the date of the remarks and colored by President. The timeline at the top provides a key of which party the President belonged to. Harry Truman is plotted at far left, though he was not a part of later analyses.

这个图中有几件事很突出(至少对我来说)。一个是肯尼迪-尼克松辩论期间令人难以置信的言论密度(尤其是对肯尼迪而言);另一个是总统之间相对明显的变化(除了福特和卡特);还有一个原因是,至少从罗纳德·里根开始,随着任期的进行,总统言论的等级倾向于降低(并且经常在下一任期开始时“重置”)。我不确定这到底是怎么回事:随着总统任期的延长,他们会变得更加自在/随和吗?学期开始时是否更需要正式的演讲?言论是不是一开始准备得更充分,然后就变得更像总统自己的(随意的)声音?他们在为选举做准备时是否有意识地降低自己的讲话水平?我不清楚,但这仍然是一个有趣的模式。

到更深入地查看数据,为了控制一些总统在整个任期内比其他总统发表更多言论的事实,我接下来只查看了他们每个任期头 600 天的言论(这大约是特朗普执政的天数)。

(Left) The average Flesch-Kincaid reading grade level for all “remarks” made by each President in the first 600 days of each term. (Right) All individual remarks made by Donald Trump are plotted in black, along with his running average (orange) and the running averages of the previous four Presidents (colored by party and weighted by relative recency in office).

随着时间的推移,弗莱什-金凯对总统言论的阅读水平明显下降,尽管这一趋势似乎对共和党总统比对民主党总统更为明显(在过去的四任总统中,民主党总统基本上保持了 10-11 年级的水平)。JFK 的阅读难度最高,紧随其后的是理查德·尼克松,这符合认为他们是博览群书的“知识分子”的观点。我还发现有趣的是,奥巴马在第一任期和第二任期之间的成绩变化最大,在第二任期内,他讲话的冗长程度明显下降。

更仔细地观察最近几任总统,我们也可以看到,特朗普没有任何迹象表明他回到了前任的水平;如果有什么不同的话,随着他任期的延长,他可能会更加偏离到一个更低的 F-K 等级水平。在执政的头 600 天里,他的言论从大约 8 级水平上升到大约 7 级水平,而前四任总统都很稳定。此外,通过绘制单个评论点,我认为很明显,这个滚动平均值并不是对潜在语言内容的不公平估计。看了几个例子后,我有自己的理论来解释为什么这个指标可能会下降:

The first 50 sentences of one set of remarks from Donald Trump, about four months into his term.

首先,特朗普总统倾向于重复自己,多次以略有不同的措辞重申同一想法。我在上面的文本中对这些分组进行了颜色编码,以突出它们,这不仅是基于相同单词的直接重复,也是基于相同想法的重复。偶尔,他似乎会偏离主题,如方框中所述,他从谈论帮助创建医疗改革立法的一群人转向谈论……他自己,以及他成为总统是多么令人惊讶。这种即兴创作也明显不同于演讲中更直接的部分,因为句子更短,单词更单音节(这有助于解释 Flesch-Kincaid 评分较低的原因)。当然,这只是一份示例记录,但我认为它提供了一些关于特朗普的言论与前几任总统的言论有何显著不同的见解。

为了获得每位总统的全部言论,我接下来计算了每位总统言论中使用的所有词语的 tf-idf 得分(使用 tidytext 包)。这提供了一个衡量每位总统比其他总统使用频率更高的词汇的方法,同时控制了所有总统使用词汇的总体频率。

特朗普被 tf-idf 顶上的三个字都是针对他的政治“敌人”:希拉里·克林顿和巴拉克·奥巴马,这相当不寻常。另外一位在前三名中提到政治对手的总统是 JFK,他的言论主要倾向于他上任前与尼克松的辩论(乔治·布什和吉米·卡特不在此列,对手分别排在第五和第四位最常用词)。值得注意的是,特朗普是自吉米·卡特以来唯一一位妻子的名字不在前 15 个单词中的总统;取而代之的是他女儿的名字伊万卡(考虑到正在进行的评论 对 他们的 关系,这真的对情况没有帮助)。同样值得注意的是:奥巴马显然大量使用了“人们”这个词;你可以清楚地看到 911 对乔治·w·布什言论的影响,他的大部分热门词汇都与中东和恐怖主义有关;里根的热门词汇中大约有一半是与金钱或经济相关的,比其他任何一位总统都多。我还对二元和三元语法(分别是两个和三个单词的序列)进行了同样的 tf-idf 量化。

从这些分析中还可以发现其他一些有趣的方面(至少对我来说)。首先,特朗普反复使用三个词的短语的可能性比他使用一个或两个词的短语的可能性小得多,这与之前发现的较低等级/较短的句子相吻合。总的来说,这些二元词和三元词提供了一个很好的窗口,让我们了解每位总统认为最重要的问题;我想象一下,如果大多数人只是简单地看到一组没有名字标签的这些克,那么说出它们来自哪个总统就相当容易了(尤其是特朗普的“假新闻”)。有一些证据表明,宗教,或者至少是基督教,在从里根开始的保守派总统中变得越来越重要(“上帝保佑”,“基于信仰的项目”)。在乔治 H.W 布什时代,医疗保健似乎已经成为最重要的问题,此后历届总统都不断提到它(“医疗保健”、“医疗保险改革”、“平价医疗”)。LBJ 对 JFK 遗产的依赖是非常突出的,JFK 在所有单词集中反复出现。然而,最让我惊讶的是,艾森豪威尔如何看起来比他的共和党继任者有更多的全球主义目标(“红十字会”、“新兴发展中国家”、“自由世界”、“和平”)。

总结——我认为,在总统言论相对一致的专业水平中,特朗普是否真的是一个暂时的异类,或者他是否只是延续了前任(共和党)总统的趋势,这种结论是不准确的。演讲能力对选民来说已经不重要了吗?现代共和党选民会更喜欢孤立主义、民族主义的特朗普,而不是更为全球乐观的艾森豪威尔吗?我更倾向于这样一种观点,即尽管特朗普落在了规范之外,但他只是继续朝着规范在过去几十年中一直在变化的同一方向前进。即便如此,也很有可能总统们只是越来越多地试图给选民们他们想听的东西。为此,如果选民决定他们更喜欢发表更有思想、更鼓舞人心的演讲的政治家,他们有能力改变这一点。

Power BI 中的地理信息快速指南

原文:https://towardsdatascience/a-quick-guide-to-geojsons-in-power-bi-f4736e76aa9d?source=collection_archive---------0-----------------------

将 GeoJSONs 转变为仪表盘

Washington, DC Crash Data Dashboard built using the Open Data DC API

任何城市都有丰富的安全数据——犯罪、交通违章、撞车等。—但是拥有数据本身并不总是等同于拥有信息。如果是的话,这个世界就不需要分析师了!

在多次收到为我们的客户执行交通安全分析的请求后,我承担了开发一个交互式工具的任务,该工具将使城市能够以一种轻松的方式探索自己的安全数据,使他们能够提取相关的安全相关信息和见解。

该工具的一个关键组成部分是能够为城市提供尽可能最新的交通事故数据,而不必在每次刷新时手动更新交通事故数据。我选择在 Power BI 中这样做,并使用 DC 的 Washington 作为该工具的原型。

首先,我需要找到我的数据。从过去的分析中,我知道 DC 的华盛顿州有一个非常令人印象深刻的开放数据设置,所以我无意中找到了那里并开始搜索。结果,他们正好有我需要的东西——一个包含所有车祸及其位置的数据集,由地区交通部维护。头奖。

接下来,获取数据。开放数据 DC 网站允许您下载 CSV、KML 和 shapefiles,但这些只是某个时间点的快照。创建这个工具的目的,在某种程度上,是为了构建一个产品,以取代我每个月左右在数据发生变化时执行相同分析的需要。幸运的是,DC 开放数据有一个 API。

如果你像我一样不熟悉 API 的整个世界,Petr Gaza ROV 的这篇文章非常容易理解,信息量也很大。

访问他们的 API 很简单,但是弄清楚如何在 Power BI 中利用这些数据对我来说是一次学习经历。我花了几个小时探索他们提供的不同 API,他们返回的数据,并在网上做了一些研究。在我的搜索过程中,我找不到任何能真正带领我完成从查找数据到将其加载到 Power BI 数据模型(尤其是 GeoJSON 文件)的过程的东西,所以我想我应该写一篇快速的文章,一步一步地介绍它。

Screenshot of the “Crashes in DC” API drop down menu. You da real MVP, Open Data DC.

开放数据 DC API 下拉菜单提供了几个 URL,您可以在这些 URL 上获得完整的碰撞数据集,但我将在本文中使用的是 GeoJSON 格式。在讨论连接到 API 的细节之前,我将花一点时间来讨论 GeoJSON 文件。

在今天的“了解你的文件类型”节目中

JSON 文件基于 JavaScript,以文本格式存储信息,这种格式非常容易被各种类型的程序解析。GeoJSON 文件本质上是相同的东西,但是它们存储的信息对应于地理数据。由于这个特定数据集的文件相当大,让我们快速查看一下 GeoJSON 文件的一般结构,以确定一旦我们将它加载到 Power BI 中,我们将需要提取哪些元素,而不是直接打开文件本身(此代码的扩展版本可以在 GeoJSON 维基百科页面这里找到):

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [102.0, 0.5]
      },
      **"properties": {
        "prop0": "value0"
      }**
    }

看起来有两个特征:“几何”和“属性”。可以肯定的是,几何图形包含用于可视化数据集的空间信息(在这种情况下是点的坐标对,但它们也可以是线或面边界)。Properties(上面代码中的粗体文本)包含每个记录的各种属性和值(在我们的例子中,这对应于每个崩溃的不同属性)。这里值得注意的是,通过浏览网站上的碰撞数据集,我们可以看到纬度和经度的特定字段,这些字段将属于属性功能,因此我们不必从几何功能中提取它们。

连接到 Power BI 中的 API

本节要求您在计算机上安装 Power BI Desktop。 免费下载,随便玩玩!

在 Power BI Desktop 中,单击顶部功能区上的“获取数据”按钮,然后从下拉菜单中选择“Web”。这将弹出一个对话框,您可以在其中粘贴来自开放数据 DC 网站的 GeoJSON 文件的 URL。

The data set looks pretty unimpressive, but has a pretty impressively complex name

导入数据集后,我们将通过单击功能区左上角“convert”选项卡下的“Into Table”按钮将其转换为表格。

回想一下我们之前对 GeoJSON 文件结构的探索,我们期望有两个特性:几何和属性,属性包含我们想要的每次崩溃的信息。为了达到这些目的,我们将执行以下步骤:

  • 将“名称”列向下筛选为“功能”
  • 通过单击“值”列标题右上角的两个箭头,枚举所有单独的崩溃记录,并选择“扩展到新行”
  • 再次单击“值”下拉菜单,选择“属性”功能

现在,您将得到如下所示的内容:

Tabular data set from the GeoJSON data source

我们快到了。我们已经使用过几次“价值”下拉菜单,但是…

再次单击“Value”列(现在名为 Value.properties)的下拉菜单后,美妙的事情发生了——我们找到了崩溃的属性。您可以选择保留哪些列或保留所有列,但是为了您自己的健康,请取消选择“使用原始列名作为前缀”框(否则数据集中的每一列都将以“Values.properties”开头)。

This is what your data should now look like. Nailed it.

您可能需要进行一些后续的列转换(日期字段转换,可以在下面的建议部分找到,或者将数值字段转换为实际的数字而不是文本),但是此时数据已经可以使用了!下面是我将 GeoJSON 文件中包含的一些最基本的数据放在一起的快速仪表板:

Crash dashboard (crashboard?) that is built on data pulled directly from the Open Data DC API

使用数据集的建议

  • 我建议创建一个转换后的“报告日期”列。GeoJSON 的报告日期格式如下:“YYYY-MM-DDTHH:MM:SS.000Z”。您可以通过使用以下代码在超级查询编辑器中添加自定义列来进行转换:
DateTime.FromText(Text.Start( [REPORTDATE], 19))
  • 将近 20 万起撞车事故映射为单独的点是非常没有意义的(没有双关语的意思),因为它可能会覆盖整个地区。此外,我使用的地图可视化工具(ArcGIS Maps for Power BI)只能绘制有限数量的点。由于这个原因,我建议只过滤相关日期的视觉效果,并使用热图作为地图主题。
  • 如果您想要发布包含这些数据的仪表板,不要忘记通过网关设置计划的刷新,以保持它是最新的!

就是这样!我们已经成功连接到一个 API,并将提供的 GeoJSON 文件转换为可用的 Power BI 数据集,该数据集可以定期刷新,无需在源更新时手动替换数据。

面向机器学习者的衍生品快速入门

原文:https://towardsdatascience/a-quick-introduction-to-derivatives-for-machine-learning-people-3cd913c5cf33?source=collection_archive---------11-----------------------

简介

如果你和我一样,你可能在生活中的很大一部分时间里都在使用衍生品,并学到了一些关于它们如何运作和表现的规则,但并没有真正理解它们的来源。作为孩子,我们很早就学习了一些规则,例如幂法则,我们知道 x 的导数是 2x ,它以更一般的形式变成了 dxᵃ/dx=axᵃ⁻ 。这在原则上是没问题的,因为所有的规则都可以很容易地记忆并在表格中查找。这样做的坏处当然是,你在使用一个你根本不理解的系统和形式主义。同样,如果你不是每天都在开发机器学习框架,这不一定是个问题,但是知道幕后发生了什么真的很好。我本人鄙视黑盒◼.为了更深入地研究这个问题,我将向你们展示它的基础。为了做到这一点,我们必须定义一个导数应该为你做什么。你知道吗?我相信你有,但万一你没有;

导数是对函数如何随着一个或多个变量的微小变化而变化的连续描述。

我们将从多方面来研究这一声明。例如

  • 小是什么意思?
  • 改变意味着什么?
  • 为什么是连续的?
  • 这有什么用?

我们开始吧!

全微分和偏导数

这些术语通常是许多人混淆的来源,因为它们有时被视为等同物,并且在许多情况下,它们似乎彼此无法区分。然而他们不是!让我们从定义偏导数开始,然后从这里继续到全导数。为此,我将使用一个虚函数 f(t,x,y) ,其中我们有三个变量 txy 。偏导数回答了一个变量小幅度变化(∂ x )时 f 如何变化(∂ f )的问题。在此设置中,所有其他变量都被假定为常量和静态变量。因此偏导数记为∂ f /∂ x 。为了展示当我们做这个操作时会发生什么,我们需要首先定义 f 为某物。假设它看起来像这个 f(t,x,y)=txy 4π/3顺便说一下,这是一个椭球体的体积。嗯,也许不是那么偶然…无论哪种方式,我都选择了不同于通常使用的参数化。在下图中,你可以从上到下从左到右分别看到一个球体、一个椭球体和一个椭球体。在我们的设置中,我们可以选择 t=a,x=b,y=c 作为尺寸。

By Ag2gaeh — Own work, CC BY-SA 4.0, https://commons.wikimedia/w/index.php?curid=45585493

这些几何空间的体积的偏导数就变成了∂f/∂x= 4π3ty这里我们应用了幂律。如您所见,tt和 yy没有被触及,因为我们假设它们是固定的。因此,在上图中,我们模拟了当 b 少量延伸或缩短时,体积会发生什么。这回答了我们的问题,如果他们真的独立于 x 。但是如果他们不是呢?在这种情况下,我们需要 f 相对于 x 的总导数,用 df/dx 表示,定义如下

你可以看到偏导数是总导数的一部分。为了便于说明,让我们将函数限制在 t=x 的情况下。那么导数会发生什么呢?之前的偏导数保持不变。但是我们需要计算的另外两项。第一部分变成(∂f/∂t) (dt/dx)=4π/3 ⋅ xy ⋅ 1,而最后一部分变成

因此现在我们得到了

通过在最后一步中添加术语并替换 t=x 。现在希望很明显,∂f/∂x≠df/dx 和你需要小心,在你做导数的时候,在你的变量之间陈述独立性之前。

等等!我听到你哭了,我们能不能在计算完偏导数后直接代入?事实上,你可以,你会得到一个相差 2 倍的东西,这可能是很大的。基本上你会得到以下的疯狂

这是因为我们通常追求的是全导数,而不是偏导数。然而,你当然可以在计算偏导数之前进行代入运算。这看起来会很好

我们再次达成一致。因此,在计算完之后,你不能在偏导数中插入依赖项!

作为差异的解释

让我们暂时回到全导数的定义上来。记得它看起来像这样

对于一个三变量函数 f(t,x,y) 。现在,如果我们把这个乘以 dx,我们会得到

它是函数 f 的微分视图的表达式。它指出, f 中非常小的变化可以定义为变量中小变化的加权和,其中权重是函数相对于相同变量的偏导数。我们可以这样概括一个函数 qM 变量

这是一种更简洁、更好的方式来看待它。快速明确地写出术语变得很乏味。另一方面,我们也得到一种简洁的方式来表示我们的全微分定义。再次坚持函数 q 和它的 M 变量。

δᵢₚ在任何地方都被定义为 1 ,除了在 i=p 的情况下,我们将其定义为 0 。我知道这不是很传统,但它是有效的,所以我将以这种方式使用 delta 函数。我这样做是因为

虽然是正确的,但并没有把重点放在,感兴趣的变量 xₚ的偏导数上,但这实际上是一个品味问题,对用法来说一点也不重要。

微积分的链式法则

在计算解析导数时,最常用的规则之一可能是链式法则。从数学上讲,它基本上表述如下

这看起来并不令人印象深刻,但不要让它的简单性欺骗了你。在梯度分析领域,它是无与伦比的主力。记住, g(x) 在这个设置中可以是任何东西。就此而言, x 也可以。因此,这条规则适用于与梯度有关的一切。

概率的链式法则

这里有一个关于命名的小注意事项。“链式法则”实际上也以“概率链式法则”或“一般乘积法则”的名义存在于概率中。我觉得后者更自然。无论如何,该规则规定如下

其中 p 是事件 xy 的概率函数。这个规则可以通过迭代这个规则进一步推广到 n 个变量。请参见以下示例:

你可能会被原谅,因为你认为在应用这个规则时,变量的顺序有点重要,但当然这并不重要,因为我们所做的只是将概率空间分割成更小的独立小块。因此,在一个更紧凑的格式中,我们可以这样表达这个一般规则

这里我们用了 n 个一般变量来表示我们的概率分布。现在谈谈我提出这个问题的原因。

概率的链式法则与微积分的链式法则无关。

所以记住,如果你听到有人说出“链式法则”时,一定要想到上下文,因为没有上下文,它是很模糊的。

为深度神经网络构建您自己的反向传播引擎

在这一节,我将带你通过一个简单的多层感知器和反向传播算法的衍生物。有许多方法可以得出这一点,但我将从误差最小化方法开始,该方法基本上描述了神经网络 f( x *,θ)*与已知目标 y 的偏差的拟合。我们要解决的架构如下图所示,我们有两个隐藏层。为了简单起见,我们坚持这样做。我们也将只使用一个输出,而不是多个,但它很容易推广。

Illustration of a simple feed forward neural network with two layers.

我们不是用图形来表示我们的网络,而是用一种更正式的方式来表示,在这里,函数形式将以数学的方式来表述。基本上函数形式将是

其中粗体符号表示向量。φ(s)= 1/(1+exp(-a s))函数是带有超参数 a 的 sigmoid 激活函数,我们在本介绍中不会对其进行调整或关心。这里有一个小注意,忽略这里的参数是非常愚蠢的,因为它将从根本上改变这个网络的学习。我允许自己这么做的唯一原因是,这已经超出了本文的讨论范围。

为了训练神经网络,我们需要根据参数对我们看到的误差的影响程度来更新参数。对于数据点( x ₜ,yₜ).)的类似回归的问题,该误差可以这样定义

如果我们看倒数第二层,那么我们简单地根据下面的规则更新参数

对于每个新的数据点。这叫随机梯度下降( SGD )。你可以在很多地方读到这方面的很多内容,所以我在这里就不赘述了。只要说这个过程可以对每层中的每个参数重复就够了。因此,臭名昭著的反向传播算法只是一个应用,通过误差对参数的偏导数来更新参数。现在自己做偏导数,看看你能有多容易推导出来。你可以使用的一个小技巧是认识到 φ '(s)=φ(s)(1-φ(s)) 这里我使用了导数的素数符号。这里有一个很好的关于如何在数字上做这件事的教程。

带回家的信息

  • 全导数和偏导数是相关的,但有时根本不同。
  • 所有约束和变量替换必须在计算偏导数之前完成。
  • 偏导数忽略了隐含的依赖性。
  • 总导数考虑了所有的相关性。
  • 许多神奇的配方,像反向传播算法,通常来自于非常简单的想法,自己动手做确实是有指导意义和有用的。

最初发表于doktormike . github . io

神经算术逻辑单元快速介绍

原文:https://towardsdatascience/a-quick-introduction-to-neural-arithmetic-logic-units-288da7e259d7?source=collection_archive---------14-----------------------

(Credit: aitoff)

经典的神经网络非常灵活,但是它们不太适合某些任务。特别是一些算术运算,对神经网络来说是个挑战。这就是为什么 Trask 等人在他们的论文神经算术逻辑单元中介绍了两个新模块,这两个模块旨在很好地执行某些算术任务。在这篇博文中,我将描述本文旨在解决的问题,提出的解决方案,并讨论使用 PyTorch 的实现细节和结果再现。

所以你想学习恒等函数?

对于神经网络来说,这听起来是一个足够简单的任务,对吗?如果我们的测试集和我们的训练集在同一个范围内,那就是这样。然而,一旦我们的测试数据超出训练范围,大多数神经网络就会失败。这个失败揭示了一个令人不安的事实:理论上,多层感知器能够表示任何连续的函数,但架构、训练数据和学习时间表的选择将严重偏离 MLP 最终学习的函数。Trask 等人用下图有效地说明了这一失败:

Failure of MLPs to learn the identity function. (Credit: Trask et al)

为了克服这些限制,该论文建议使用两个新模块:神经累加器(NAC)和神经算术逻辑单元(NALU)。让我们看看它们是什么,以及它们背后的数学原理。

南汽和 NALU

先说 NAC:

NAC (Credit: Trask et al)

正如我们在上面看到的,NAC 类似于线性变换,但我们使用的权重矩阵是两个学习矩阵的结果,我们在将它们按元素相乘之前对其应用了tanhsigmoid:

为什么要这么麻烦?这如何帮助我们的网络正确地学习算术函数?让我们来看看下图:

tanh(x) * sigmoid(y)

我们可以看到权重向量的值偏向 0、1 和-1。这意味着 NAC 的输出是输入向量的加法和减法,而不是缩放。这允许 NAC 无限地堆叠在一起,并且仍然保持输入表示的一致缩放。这对于学习处理加减的算术运算显然是有帮助的,但对于乘除就不行了。

这就是 NALU 的用武之地:

NALU (Credit: Trask et al)

NALU 使用 NAC 作为子单元,并增加两个额外的信息流。第一个使用 NAC 在对数空间中操作,第二个用作学习门,计算标准 NAC 和对数空间 NAC 之间的加权和。这在理论上应该允许 NALU 学习诸如乘法和除法以及加法和减法之类的功能。

闲聊够了,让我们看看代码!

NAC 和 NALU 的实现相当简单。你可以看看 GitHub 回购,但我会在这里回顾重要的部分。首先,我们将从 NAC 开始:

class NAC(Module):    
  def __init__(self, n_in, n_out):
    super().__init__()
    self.W_hat = Parameter(torch.Tensor(n_out, n_in))
    self.M_hat = Parameter(torch.Tensor(n_out, n_in))
    self.reset_parameters() def reset_parameters(self):
    init.kaiming_uniform_(self.W_hat)         
    init.kaiming_uniform_(self.M_hat) def forward(self, input):
    weights = torch.tanh(self.W_hat) * torch.sigmoid(self.M_hat)
    return F.linear(input, weights)

代码应该是不言自明的。我们首先对 PyTorch 的Module进行子类化。在初始化步骤中,我们将两个学习到的矩阵W_hatM_hat定义为Parameters,并使用初始化对它们进行初始化。在向前的步骤中,在我们将W_hatM_hat相乘之前,我们通过tanhsigmoid传递它们。然后,我们获取生成的矩阵,并使用它和单元的输入执行线性变换。这就是你拥有的:一个全功能的 NAC 模块!

在我们转向 NALU 实现之前,重要的是要强调这样一个事实,即在上面的代码中只有两个学习过的矩阵。被传递到线性变换中的矩阵没有被训练,只是实际学习的矩阵W_hatM_hat的数学运算的结果。当 NALU 的论文第一次出现时,许多 PyTorch 实现将最终重量作为参数,这将它们的 NAC 变成简单的线性层。这些我称之为 FauxNALUs ,成为一项意外消融研究,我将在下一节讨论它们的意义。

在我们到达那里之前,我们仍然需要看一看 NALU 的实现:

class NALU(Module):    
  def __init__(self, n_in, n_out):
    super().__init__()        
    self.NAC = NAC(n_in, n_out)        
    self.G = Parameter(torch.Tensor(1, n_in))        
    self.eps = 1e-6        
    self.reset_parameters()          def reset_parameters(self):        
    init.kaiming_uniform_(self.G)          def forward(self, input):        
    g = torch.sigmoid(F.linear(input, self.G))        
    y1 = g * self.NAC(input)        
    y2 = (1 - g) * 
         torch.exp(self.NAC(torch.log(torch.abs(input) + self.eps)))
    return y1 + y2

我们首先定义 NAC 和学习门矩阵,并初始化它们。在前面的步骤中,我们首先通过对输入和门矩阵进行线性变换来计算门值G。然后,我们计算标准 NAC 输出和对数空间 NAC 输出,然后返回它们的加权和。值得注意的是,在计算 log-space NAC 时,我们需要向log函数传递一个小的 epsilon 值,以避免任何未定义的行为。

数学课时间到了

现在我们知道了 NALUs 背后的理论以及如何在 PyTorch 中实现它们,剩下的就是实际观察它们的运行了。我们将尝试使用基于 kevinzakka 的代码的脚本来重现论文中函数学习部分的结果,我已经修改了这些脚本,在这里加入了 FauxNALU 的代码。函数学习测试的想法是,我们将提供符合特定函数(加、减、除、平方根等)的随机生成的输入数据,然后测试我们的 MLP 是否能够正确地学习算术函数:

从这些结果中可以得出以下几点:

  • NAC 在加法和减法方面表现惊人,但在乘法、除法和幂函数方面表现糟糕。这是有意义的,因为当它必须学习其他函数时,使它强大的加法(没有输入的任意缩放)的同样的东西极大地限制了它。
  • 除了减法之外,NALU 在其他方面都表现得很好。鉴于 NACFauxNALU 在减法上表现良好,这表明 log gate 和 NAC 在减法用例中以某种方式相互干扰。
  • FauxNALU 的结果最有趣。它的表现与 None MLP(仅使用线性的那种)一样好,这表明学习门本身对学习这些功能没有帮助。在学习除法和平方根方面,NALU 决定性地击败了 T21**,这表明对数空间 NAC 和标准 NAC 的结合真正发挥了作用。**

就这些了,伙计们!

NAC 和 NALU 当然是有趣的模块,尽管他们在我们所研究的玩具问题上表现不一。只有时间和进一步的实验才能告诉我们这些专门的模块是否会成为机器学习实践者常规工具箱的一部分。有一件事是肯定的:我们可以通过巧妙定义权重矩阵和使用门来设计具有特定偏好的模块,这一想法将继续存在,我们将看到许多其他模块利用这一点。

感谢阅读!如有任何问题或建议,欢迎留言或推文 @AlexievValeri 。

机器学习中文本摘要的快速介绍

原文:https://towardsdatascience/a-quick-introduction-to-text-summarization-in-machine-learning-3d27ccf18a9f?source=collection_archive---------0-----------------------

文本摘要是指缩短长文本的技术。目的是创建一个连贯流畅的摘要,只包含文档中概述的要点。

自动文本摘要是机器学习和自然语言处理中的一个常见问题。

Skyhoshi 是一位拥有 13 年经验的美国机器学习专家,目前正在向人们传授他的技能,他说:“这项技术已被证明在快速准确地总结大量文本方面至关重要,如果没有机器,这可能会非常昂贵和耗时。”

机器学习模型通常被训练来理解文档,并在输出所需的摘要文本之前提取有用的信息。

文本摘要的需求是什么?

在现代技术创新的推动下,数据对于本世纪就像石油对于上个世纪一样重要。今天,我们的世界被大量数据的收集和传播所覆盖。

事实上,国际数据公司(IDC)预计,全球每年流通的数字数据总量将从 2013 年的 4.4 兆字节增长到 2025 年的 180 兆字节。数据真多啊!

随着如此大量的数据在数字空间中流通,需要开发机器学习算法,可以自动缩短较长的文本,并提供准确的摘要,可以流畅地传递预期的信息。

此外,应用文本摘要减少了阅读时间,加快了信息搜索的过程,并增加了适合某个区域的信息量。

自动摘要的主要方法有哪些?

在 NLP 中有两种主要的文本摘要方式:

  • 基于抽取的摘要

提取文本摘要技术包括从源文档中提取关键短语,并将它们组合成一个摘要。根据定义的度量进行提取,而不对文本进行任何更改。

这里有一个例子:

来源正文: 约瑟和玛丽 骑着驴去 参加 一年一度的 大事*耶路撒冷 。在城市里, 玛丽 出生 给一个孩子取名 耶稣 *

摘录概要: 约瑟和马利亚参加耶路撒冷的活动。玛丽亚出生耶稣。

正如你在上面看到的,粗体字已经被提取出来并连接在一起形成了一个摘要——尽管有时候这个摘要在语法上很奇怪。

  • 基于抽象的摘要

抽象技术需要解释和缩短源文档的一部分。当抽象应用于深度学习问题的文本摘要时,可以克服抽取方法的语法不一致性。

抽象文本摘要算法创建新的短语和句子,从原始文本中传递最有用的信息——就像人类一样。

因此,抽象比提取执行得更好。然而,进行摘要所需的文本摘要算法更难开发;这就是为什么提取的使用仍然流行。

这里有一个例子:

约瑟和马利亚来到耶稣诞生的耶路撒冷。

文本摘要算法是如何工作的?

通常,NLP 中的文本摘要被视为有监督的机器学习问题(基于提供的数据预测未来的结果)。

通常,使用基于抽取的方法来概括文本是如何工作的:

1.介绍一种从源文档中提取有价值的关键短语的方法。例如,您可以使用词性标记、单词序列或其他语言模式来识别关键短语。

2.收集带有肯定标记的关键短语的文本文档。关键短语应该与规定的提取技术兼容。为了提高准确性,您还可以创建带有负面标签的关键短语。

3.训练二进制机器学习分类器来进行文本摘要。您可以使用的一些功能包括:

  • 关键词的长度
  • 关键短语的频率
  • 关键短语中最常出现的词
  • 关键短语中的字符数

4.最后,在测试短语中,创建所有关键短语单词和句子,并对它们进行分类。

摘要

文本摘要是一个有趣的机器学习领域,越来越受到关注。随着该领域研究的继续,我们可以期待看到突破,这将有助于流畅和准确地缩短长文本文档。

你对这个激动人心的领域有什么想法?

请在下面分享你的评论。

NumPy 库快速介绍

原文:https://towardsdatascience/a-quick-introduction-to-the-numpy-library-6f61b7dee4db?source=collection_archive---------0-----------------------

在我的上一篇关于熊猫的博客文章之后,我想退一步写一篇关于 T2 熊猫图书馆的文章可能是个好主意。NumPy(Numerical Python 的缩写)是“用 Python 进行科学计算的基础包”,它是 Pandas、Matplotlib 和 Scikit-learn 构建的库。您可能会想“当我可以使用这些库时,使用 NumPy 有什么意义呢?”但是我认为 NumPy 经常被低估,如果使用得当,它可以成为 Python 中数值运算的一个非常强大的工具。

安装和入门

默认情况下,NumPy 没有附带 Python,所以需要安装它。正如我为熊猫安装所推荐的,获得 NumPy(以及大量其他软件包)的最简单方法是安装 Anaconda 。如果你不想安装所有这些软件包而只是安装 NumPy,你可以从这个页面下载你的操作系统版本。

下载并安装 NumPy 后,每当您想在 Python IDE ( 集成开发环境)中使用它时,如 Jupyter Notebook 或 Spyder (默认情况下,它们都附带了 Anaconda),您都需要导入它。提醒一下,导入一个库意味着把它加载到内存中,然后你就可以使用它了。要导入 NumPy,您需要编写以下代码:

import numpy as np

你已经准备好了!通常你会添加第二部分(“作为 np”),这样你就可以通过写“npmand”来使用 NumPy,而不是每次你想使用它时都必须写“numpymand”。这不是一个巨大的差异,但嘿,每一个关键的中风计数!请记住,每当你开始一个新的 Jupyter 笔记本,Spyder 文件等,你需要这样做。

使用 NumPy

创建 NumPy 数组,加载和保存文件

NumPy 使用称为多维数组的 Python 对象。数组基本上是值的集合,它们有一个或多个维度。NumPy 数组数据结构也叫 ndarray ,是 n 维数组的简称。一维数组称为向量,二维数组称为矩阵。数据集通常以矩阵的形式构建,例如,用 NumPy 打开比用列表的列表打开要容易得多。

将列表转换成 NumPy 数组非常简单:

numpy_array = np.array(list)

打印/显示该数组将如下所示:

array([[  7.4  ,   0.7  ,   0\.   , ...,   0.56 ,   9.4  ,   5\.   ],
       [  7.8  ,   0.88 ,   0\.   , ...,   0.68 ,   9.8  ,   5\.   ],
       [  7.8  ,   0.76 ,   0.04 , ...,   0.65 ,   9.8  ,   5\.   ],
       ..., 
       [  6.3  ,   0.51 ,   0.13 , ...,   0.75 ,  11\.   ,   6\.   ],
       [  5.9  ,   0.645,   0.12 , ...,   0.71 ,  10.2  ,   5\.   ],
       [  6\.   ,   0.31 ,   0.47 , ...,   0.66 ,  11\.   ,   6\.   ]])

另一个选项是使用 np.genfromtxt() 函数打开一个 CSV 文件:

numpy_array **=** np**.**genfromtxt("file.csv", delimiter**=**";", skip_header**=**1)

括号内的参数是文件名(和路径,如果需要的话),分隔符设置为“;”为了确保正确解析,可以使用不同的字符进行解析(比如’,');而 skip_header 设置为‘1’将使 csv 加载到没有标题行的数组中。如果您确实需要标题,可以不包含它(因为缺省值是零)。

还可以使用 np.savetxt()将 NumPy 数组保存到文件中。例如,np.savetxt('file.txt',arr,delimiter=' ')将保存到文本文件,而np.savetxt('file.csv',arr,delimiter=',')将保存到 CSV 文件。

另一个很酷的特性是能够创建不同的数组,比如随机数组:np.random.rand(3,4)将创建一个 0 到 1 之间的 3x4 随机数数组,而np.random.rand(7,6)*100将创建一个 0 到 100 之间的 7x6 随机数数组;你也可以用不同的方式定义数组的大小:np.random.randint(10,size=(3,2))用 0 到 9 之间的随机数创建一个 3x2 大小的数组。请记住,使用此语法时,最后一位数字(10)不包括在范围内。

也可以创建一个全 0 的数组:np.zeros(4,3)(全 0 的 4x3 数组)或 1np.ones((4))(1 的 4x1 数组);您可以使用命令np.full((3,2),8)创建一个由 8 个元素组成的 3x2 数组。当然,你可以改变每一个数字来得到你想要的数组。

工作和检查阵列

现在您已经加载了数组,您可以通过键入array.size来检查它的大小(元素的数量),并通过键入array.shape来检查它的形状(尺寸——行和列)。您可以使用array.dtype来获取数组的数据类型(浮点、整数等——参见 NumPy 文档),如果您需要转换数据类型,您可以使用array.astype(dtype)命令。如果您需要将 NumPy 数组转换成 Python 列表,也有一个命令可以完成这个任务:array.tolist()

索引和切片

索引和分割 NumPy 数组的工作方式与处理 Python 列表非常相似:array[5]将返回第 5 个索引中的元素,array[2,5]将返回索引[2][5]中的元素。您也可以选择前五个元素,例如,使用冒号(😃。array[0:5]将返回前五个元素(索引 0–4),而array[0:5,4]将返回第 4 列中的前五个元素。您可以使用array[:2]来获取从开始到索引 2(不包括索引 2)的元素,或者使用array[2:]从第二个索引返回到数组的末尾。array[:,1]将返回所有行中索引 1 处的元素。

给 NumPy 数组赋值也非常类似于在 Python 列表中这样做:array[1]=4将值 4 赋给索引 1 上的元素;您可以对多个值执行此操作:array[1,5]=10或者在赋值时使用切片:array[:,10]=10会将整个第 11 列更改为值 10。

分类和整形

array.sort()可用于对 NumPy 数组进行排序——您可以在括号内传递不同的参数来定义您想要排序的内容(例如,通过使用参数“order = string/list of string”)。参见文档中的更多示例。array.sort(axis=0)将对数组的特定轴——行或列进行排序。two_d_arr.flatten()将二维数组展平为一维数组。array.T将转置一个数组——意味着列将变成行,反之亦然。array.reshape(x,y)会将您的数组重新调整为您用 x 和 y 设置的大小。array.resize((x,y))会将数组形状更改为 x 和 y,并用零填充新值。

组合和拆分

您可以使用np.concatenate((array1,array2),axis=0)来组合两个 NumPy 数组——这将把数组 2 作为行添加到数组 1 的末尾,而np.concatenate((array1,array2),axis=1)将把数组 2 作为列添加到数组 1 的末尾。np.split(array,2)会将数组拆分成两个子数组,而np.hsplit(array,5)会在第 5 个索引处水平拆分数组。

添加和删除元素

当然,有一些命令可以在 NumPy 数组中添加和删除元素:

  • np.append(array,values)将值追加到数组末尾。
  • np.insert(array, 3, values)将在索引 3 之前将值插入数组
  • np.delete(array, 4, axis=0)将删除数组索引 4 上的行
  • np.delete(array, 5, axis=1)将删除数组索引 5 上的列

描述统计学

您可以使用 NumPy 方法获取 NumPy 数组的描述性统计信息:

  • np.mean(array,axis=0)将返回沿特定轴的平均值(0 或 1)
  • array.sum()将返回数组的总和
  • array.min()将返回数组的最小值
  • array.max(axis=0)将返回特定轴的最大值
  • np.var(array)将返回数组的方差
  • np.std(array,axis=1)将返回特定轴的标准偏差
  • array.corrcoef()将返回数组的相关系数
  • numpy.median(array)将返回数组元素的中值

和 NumPy 一起做数学

如果没有数字和数学运算,任何 NumPy 教程都是不完整的!让我们复习一下:

np.add(array ,1)将把数组中的每个元素加 1,np.add(array1,array2)将把数组 2 加到数组 1。对于np.subtract(), np.multiply(), np.divide() and np.power()也是如此——所有这些命令都将以与上述完全相同的方式工作。

您还可以让 NumPy 从数组中返回不同的值,比如:

  • np.sqrt(array)将返回数组中每个元素的平方根
  • np.sin(array)将返回数组中每个元素的正弦值
  • np.log(array)将返回数组中每个元素的自然对数
  • np.abs(arr)将返回数组中每个元素的绝对值
  • 如果数组具有相同的元素和形状,np.array_equal(arr1,arr2)将返回True

可以对数组中的不同值进行舍入:np.ceil(array)将向上舍入到最接近的整数,np.floor(array)将向下舍入到最接近的整数,np.round(array)将向下舍入到最接近的整数。

这只是你能用 NumPy 做什么的冰山一角!我真的希望这篇博客文章能帮助你看到使用 Python 处理数据的可能性和 NumPy 的强大之处。如果你喜欢这个教程,请随意查看我的熊猫教程(无耻地推销自己:-P)。一如既往的感谢您的阅读!我很感激任何评论、笔记、更正、问题或建议——如果你有什么想让我写的,请不要犹豫让我知道。下一篇博文再见!

“熊猫”Python 库快速介绍

原文:https://towardsdatascience/a-quick-introduction-to-the-pandas-python-library-f1b678f34673?source=collection_archive---------0-----------------------

Pandas are cute, but it’s a different kind of panda 😃

一些背景

大家好!今天我想写关于熊猫图书馆(链接到网站)。Pandas 代表“Python 数据分析库”。根据维基百科关于熊猫的页面,“这个名字来源于术语“面板数据”,计量经济学术语多维结构化数据集。”但我觉得这只是一个超级有用的 Python 库的可爱名字!

当谈到用 Python 分析数据时,Pandas 是一个相当大的游戏改变者,它是数据管理/争论中最受欢迎和广泛使用的工具之一。Pandas 是开源的,可以免费使用(在 BSD 许可下),它最初是由 Wes McKinney 编写的(这里有他的 GitHub 页面的链接)。

Pandas 的酷之处在于它获取数据(如 CSV 或 TSV 文件,或 SQL 数据库)并创建一个包含行和列的 Python 对象,称为数据框,它看起来非常类似于统计软件中的表格(例如 Excel 或 SPSS)。熟悉 R 的人也会看到 R 的相似之处)。与通过 for 循环或列表理解来使用列表和/或字典相比,这要容易得多(请随意查看我以前的一篇关于使用 Python 进行非常基本的数据分析的博客文章。用熊猫做我在那里做的事情会容易得多!).

安装和入门

为了“得到”熊猫,你需要安装它。您还需要 Python 3.5.3 及更高版本。作为安装的先决条件(将与 Python 3.6、3.7 或 3.8 一起工作),它还依赖于其他库(如 NumPy )并具有可选的依赖项(如用于绘图的 Matplotlib)。因此,我认为安装 Pandas 最简单的方法是通过一个包来安装它,比如 Anaconda 发行版,“一个用于数据分析和科学计算的跨平台发行版”你可以在那里下载 Windows、OS X 和 Linux 版本。如果您想以不同的方式安装,这些是的完整安装说明。

为了在您的 Python IDE ( 集成开发环境)中使用 Pandas,如 Jupyter Notebook 或 Spyder (两者都默认带有 Anaconda),您需要首先导入Pandas 库。导入一个库意味着把它加载到内存中,然后你就可以使用它了。为了导入 Pandas,您只需运行以下代码:

import pandas as pd 
import numpy as np 

通常你会添加第二部分(’ as pd ‘),这样你就可以用’ pdmand ‘来访问 Pandas,而不是每次需要使用它的时候都要写’ pandasmand '。此外,您也可以导入 numpy,因为它对于使用 Python 进行科学计算是非常有用的库。现在熊猫可以使用了!请记住,您需要在每次启动新的 Jupyter 笔记本、Spyder 文件等时执行此操作。

和熊猫一起工作

用 Pandas 加载和保存数据

当您想要使用 Pandas 进行数据分析时,您通常会以三种不同的方式使用它:

  • 将 Python 的列表、字典或 Numpy 数组转换为 Pandas 数据框
  • 使用熊猫打开一个本地文件,通常是一个 CSV 文件,但也可以是一个分隔文本文件(如 TSV),Excel 等
  • 通过 URL 打开网站上的远程文件或数据库,如 CSV 或 JSONon,或者从 SQL 表/数据库中读取

每个选项都有不同的命令,但是当您打开一个文件时,它们看起来像这样:

pd.read_filetype()

正如我之前提到的,熊猫可以处理不同的文件类型,所以你可以用实际的文件类型(比如 CSV)替换“文件类型”。你应该在括号内给出路径、文件名等。在括号内,您还可以传递与如何打开文件相关的不同参数。有许多参数,为了了解它们,您必须阅读文档(例如,pd.read_csv() 的文档将包含您可以在这个 Pandas 命令中传递的所有参数)。

为了转换某个 Python 对象(字典、列表等),基本命令是:

pd.DataFrame()

在括号内,您可以指定创建数据框的对象。该命令也有不同的参数(可点击链接)。

您还可以将正在处理的数据框保存到不同类型的文件中(如 CSV、Excel、JSON 和 SQL 表)。一般的代码是:

df.to_filetype(filename)

查看和检查数据

现在您已经加载了数据,是时候看一看了。数据框看起来怎么样?运行数据框的名称会得到整个表,但是您也可以用df.head(n)得到前 n 行,或者用df.tail(n)得到后 n 行。df.shape会给你行数和列数。df.info()会给你索引、数据类型和内存信息。命令s.value_counts(dropna=False)将允许您查看一个系列(比如一列或几列)的唯一值和计数。一个非常有用的命令是df.describe(),它输入数字列的汇总统计数据。也可以获得整个数据帧或一系列(一列等)的统计数据:

  • df.mean()返回所有列的平均值
  • df.corr()返回数据帧中各列之间的相关性
  • df.count()返回每个数据框列中非空值的数量
  • df.max()返回每列中的最大值
  • df.min()返回每列中的最小值
  • df.median()返回每列的中值
  • df.std()返回每列的标准偏差

数据选择

与从列表或字典中选择值相比,在 Pandas 中选择您想要的数据要容易得多。您可以选择一列(df[col])并将带有标签 col 的列作为系列返回,或者选择几列(df[[col1, col2]])并将列作为新的 DataFrame 返回。您可以按位置(s.iloc[0])或按索引(s.loc['index_one'])进行选择。为了选择第一行,可以使用df.iloc[0,:],为了选择第一列的第一个元素,可以运行df.iloc[0,0]。这些也可以用在不同的组合中,所以我希望它能给你一个不同的选择和索引的概念。

筛选、排序和分组依据

您可以使用不同的条件来筛选列。例如,df[df[year] > 1984]将只给出大于 1984 年的列。您可以使用& (and)或| (or)向您的过滤添加不同的条件。这也被称为布尔过滤

可以使用df.sort_values(col1)对某一列中的值进行升序排序;并且还使用df.sort_values(col2,ascending=False)以降序排列。此外,可以使用df.sort_values([col1,col2],ascending=[True,False])按升序对值进行排序,然后按降序对值进行排序。

本节中的最后一个命令是 groupby。它包括根据某些标准将数据分组,独立地对每个组应用一个函数,并将结果组合成一个数据结构。df.groupby(col) 返回一列值的 groupby 对象,而df.groupby([col1,col2]) 返回多列值的 groupby 对象。

数据清理

数据清洗是数据分析中非常重要的一步。例如,我们总是通过运行检查空值的pd.isnull()来检查数据中的缺失值,并返回一个布尔数组(缺失值的数组为,非缺失值的数组为)。为了获得空值/缺失值的总和,运行pd.isnull().sum()pd.notnull()pd.isnull()相反。在你得到缺失值的列表后,你可以去掉它们,或者通过使用df.dropna()删除行或者df.dropna(axis=1)删除列来删除它们。另一种不同的方法是用其他值填充缺失值,方法是使用df.fillna(x)用 x 填充缺失值(您可以随意放置),或者使用s.fillna(s.mean())用平均值替换所有空值(平均值可以用统计部分的几乎任何函数替换)。

有时需要用不同的值替换值。例如,s.replace(1,'one') 将用'one'替换所有等于1的值。对于多个值也可以这样做:s.replace([1,3],['one','three']) 将用'one'替换所有的 1,用'three'替换3。您还可以通过运行:df.rename(columns={'old_name': 'new_ name'})来重命名特定的列,或者使用df.set_index('column_one')来更改数据框的索引。

加入/合并

最后一组基本 Pandas 命令用于连接或组合数据帧或行/列。这三个命令是:

  • df1.append(df2) —将df1中的行添加到df2的末尾(列应该相同)
  • df.concat([df1, df2],axis=1) —将df1中的列添加到df2的末尾(行应该相同)
  • df1.join(df2,on=col1,how='inner') — SQL 样式将df1中的列与df2中的列连接起来,其中col的行具有相同的值。怎么可能等于:'left''right''outer''inner'中的一个

这些是非常基本的 Pandas 命令,但我希望您能看到 Pandas 在数据分析方面有多么强大。这篇文章只是冰山一角——毕竟,整本书都可以(并且已经)写关于熊猫的数据分析。我也希望这篇文章让你感觉像拿着一个数据集,用熊猫来摆弄它!😃

一如既往,如果你有任何意见,笔记,建议或问题,请不要犹豫给我写信!感谢阅读:)我将以一张可爱的熊猫图片和一个问题结束,大熊猫和小熊猫你更喜欢哪一个???

下次见!

附言

如果你喜欢这个教程,请查看我的NumPy快速介绍!

快速浏览 100 位顶级风险投资家的名单

原文:https://towardsdatascience/a-quick-look-at-the-evolving-list-of-top-100-venture-capitalists-7064a8bf559a?source=collection_archive---------4-----------------------

《福布斯》每年都会发布一份 100 位风险投资家的“迈达斯排行榜”,列出全球顶尖的科技投资者。虽然对这份名单的含义有健康的批评,但任何过分美化的衡量也可能引发问题。我将只关注数据方面,而不是含义,并试图回答这些问题:

  • 每年名单上的新进者和退出者是谁?
  • 迈达斯·李斯特的典型特征是什么?
  • 与之相关的常见风投有哪些?
  • 哪些公司是由名单上的相同投资者投资的?

进化名单

平均每年,18%的 Midas lister 将在明年退出榜单,16%将是新进者(不在去年的榜单上),其余的将留在排名榜上。

2013/2017 don’t have complete prior/next year data for comparison. Click for detailed names

显然,排名越靠后,列表就越有可能发生变化。

人口统计

基于过去 4 年的数据和相对完整的生物数据,通过按年龄、国家和性别分类,我们得到了 Midas lister 大部分是 40 岁的美国人的照片。

与 Midas listers 相关的顶级风投和投资

#num of times VCs are associated with Midas listers

这些是每年 Midas 排行榜上有显著交易的投资者。

由同一个迈达斯·李斯特投资的公司

这是我关于数据科学和视觉故事的# 100 日项目的第 68 天。我去度假了几天。完整代码在我的 github 上。感谢阅读。欢迎新主题的建议和反馈。

下面是什么?机器学习的核心是优化

原文:https://towardsdatascience/a-quick-overview-of-optimization-models-for-machine-learning-and-statistics-38e3a7d13138?source=collection_archive---------5-----------------------

优化是数据科学中几乎所有机器学习和统计技术的核心。我们讨论最流行的机器学习/统计建模方法背后的核心优化框架。

免责声明:本文中的许多方程和优化形式化,均来源于 佐治亚理工学院在线分析硕士(OMSA) 项目学习资料。我很自豪能继续这个优秀的在线硕士项目。你也可以在这里查看详情。

介绍

通常,数据科学(DS)和机器学习(ML)的新手会被建议尽可能地学习统计学和线性代数。对于 DS/ML 领域的成功职业生涯来说,这两个学科的坚实基础的效用是毋庸置疑的。然而,优化这个话题,虽然不太出名,但对任何数据科学和分析的严肃从业者来说都同样重要。

委婉地说,如果没有很好地理解这个话题,我们对数据驱动的文化和生活的现代世界观仍然是不完整的。

这是因为优化是每一个主要商业、社会、经济的核心,我敢说*-*-个人决策,由个人、集体代表或智能机器和软件代理做出。

日常例子

你整天都在优化变量和基于你的个人决定,大多数时候甚至没有意识到这个过程—

  • 安排回复邮件的顺序
  • 切换到回家的新路线,以尽量减少交通问题
  • 努力挤出午餐和下午会议之间的最佳间隙,在办公区周围安静地散步

听起来很熟悉?在这里阅读有趣的插图…

[## 如何使用算法解决日常问题

借鉴计算机科学,优先级队列可以用来优化去杂货店的行程。插图…

mitsloan.mit.edu](http://mitsloan.mit.edu/newsroom/articles/how-to-use-algorithms-to-solve-everyday-problems/)

每一个看似个人的决定都可以用冷酷、困难的数学精确建模,以显示我们的大脑是一个惊人的优化器,整天解决这些计算复杂的问题!

但是,离开个人领域,现在谈谈关于数据科学的问题…

优化对数据科学有多重要?

极其重要。

基础科学、商业组织和工程企业长期以来一直在使用优化技术和方法。从这个意义上来说,几乎每一个工程产品都是优化问题的解的紧凑物理(或虚拟)形式。工程师经过专门培训,能够在资源有限的情况下工作,并从不完整或有噪声的数据或输入中产生足够好的解决方案(T2)。本质上,他们每天都在用计算机、半导体集成电路、熔炉或内燃机解决优化问题。

商业组织也是如此。事实上,在时间、预算、空间以及法律和道德界限的约束下,每个商业决策的目标都是最大化某种形式的收益(例如利润率或知识产权领导地位)。这些都是某种形式的优化问题或其他。

[## 成为数据驱动或灭亡:为什么你的公司需要一个数据战略,而不只是更多的数据人

在过去的 14 年里,我一直以这样或那样的方式处理数据。我一开始是做管理信息的…

towardsdatascience](/become-data-driven-or-perish-why-your-company-needs-a-data-strategy-and-not-just-more-data-people-aa5d435c2f9)

今天,几乎所有的业务和技术都受到数据科学和机器学习的出现所带来的新范式变化的影响。然而,这并没有改变这样一个事实:基本的自然资源和人力资源仍然是有限的。一天还有 24 小时。法律和道德界限不会很快消失。

人工智能或机器学习的先进技术可能能够以更快的速度引导企业走向更好的最优解决方案,但他们必须面对和解决与之前相同(或更复杂)的优化问题。大量的新数据将有助于这一过程,但随着时间的推移,人们的期望值也会提高。

举一个非常简单的例子,如果在过去,一个工程团队可以访问 1 GB 的数据,并可以以 10 美元的成本产生一个最佳解决方案,那么如果给我一个“更丰富”的 10 GB 数据集,他们将会把成本降低到 7 美元。不然大数据有什么意义?

Source: Timo Elliott’s Blog (https://timoelliott/blog/2017/06/from-understanding-big-data-to-monetizing-it.html)

因此,对于数据科学/机器学习从业者来说,对常用统计/机器学习算法所使用的优化框架的理论基础有充分的了解是至关重要的

  • 如何有效利用数据
  • 如何估算处理大型数据集的计算量
  • 如何避免局部极小,从复杂的多维空间中搜索到好的解。

在我关于数据科学的基本数学背景的文章中,我讨论了优化的作用和一些在线课程,你可以很好地掌握这个主题。在这里阅读。

[## 数据科学的基本数学——“为什么”和“如何”

数学是科学的基础。我们讨论了成为更好的数据科学家需要掌握的基本数学主题…

towardsdatascience](/essential-math-for-data-science-why-and-how-e88271367fbd)

优化的基本要素

任何优化问题都有三个基本要素-

  • 变量:这些是算法可以调整的自由参数
  • 约束:这些是参数(或其组合)必须落入的边界
  • 目标函数:这是算法驱动解决方案的一组目标。对于机器学习来说,这通常相当于最小化一些误差度量或者最大化一些效用函数。

本文的其余部分集中于一些基本的、广泛使用的统计模型和 ML 算法,并展示了具有上述元素的优化框架。

简单线性回归

此外,从两个角度来看,请注意回归中的以下区别:

正则线性回归

逻辑回归

支持向量机

时间序列分析—指数平滑

时间序列分析— ARIMA

K-表示聚类

深度学习/神经网络

大多数神经网络通过反向传播技术优化神经元之间连接的权重来工作。采用先进的优化方法以确保找到一个高收敛概率的好解。

Image source: Types of Optimization Algorithms used in Neural Networks and Ways to Optimize Gradient Descent

强化学习

RL 是任何现代人工智能代理/系统的核心。如果你听说过谷歌著名的 AlphaGo 程序,它在古代棋盘游戏围棋中击败了最好的人类冠军,你可以确信在所有这些“机器智能”背后有一些真正先进的优化技术。

[## 用 Q-Learning 从零开始解决 MDP 问题——黑客的深度强化学习(第 1 部分)

是时候学习价值函数、贝尔曼方程和 Q 学习了。你将利用所有的知识…

medium](https://medium/@curiousily/solving-an-mdp-with-q-learning-from-scratch-deep-reinforcement-learning-for-hackers-part-1-45d1d360c120)

稍微绕了一下——利用机器学习进行优化

可能会有令人兴奋的优化问题,使用机器学习作为前端来创建模型/目标函数,与其他方法相比,该函数可以更快地进行评估/计算。这当然不同于本文的主要讨论点。但还是展示了最优化和机器学习之间错综复杂的相互作用。

作为说明,优化框架中的更新公式(例如梯度下降)可以使用神经网络来代替复杂的函数。

[## 通过强化学习学习优化

自从我们去年发表了关于“学习优化”的文章后,优化程序学习领域得到了越来越多的关注…

bair.berkeley.edu](https://bair.berkeley.edu/blog/2017/09/12/learning-to-optimize-with-rl/)

这种方法的应用之一是在优化循环中用机器学习映射功能取代耗时的模拟模型,在优化循环中,成千上万的输入变量被输入到模拟模型中,我们希望以某种方式找到最佳模拟输出的优化参数集。这个想法如下图所示,

总结和其他方法

在本文中,我们讨论了优化在现代商业和工程企业中的一般作用,以及为什么了解优化对于数据科学变得至关重要。

我们展示了基本的优化模型,它是一些广泛流行的统计技术和机器学习算法的核心。

通过一些简单的搜索,你会在其他流行的 ML 方法的核心找到类似的优化框架,

  • 期望最大化
  • 深度学习/神经网络( 梯度下降如何工作 )
  • 遗传算法
  • 模拟退火

如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。此外,您可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。

[## Tirthajyoti Sarkar - Sr .首席工程师-半导体设计、人工智能、机器学习- ON…

查看 Tirthajyoti Sarkar 在世界上最大的职业社区 LinkedIn 上的个人资料。](https://www.linkedin/in/tirthajyoti-sarkar-2127aa7/)

使用 Git 进行版本控制的快速入门

原文:https://towardsdatascience/a-quick-primer-to-version-control-using-git-3fbdbb123262?source=collection_archive---------3-----------------------

source: xkcd

版本控制是一种系统,它允许您跟踪一段时间内对代码所做的更改。因此,版本控制非常有用,因为:

  1. 您可以恢复到代码的特定“版本”
  2. 因为特定的变更和相关的贡献者被跟踪,所以在相同的工作上的协作是可能的

由于编码是数据科学不可或缺的一部分,因此使用版本控制来维护源代码和数据库是最佳实践。它还简化了协作项目。更改可以记录在存储库中:存储文件和对这些文件所做更改的记录的数据结构。

Git 是最流行的版本控制系统之一。它是一个分布式版本控制系统。变更不一定要提交到同一个中央存储库中,这将要求项目中的每个人访问该中央存储库并下载最新的代码以保存变更。取而代之的是,每个人都可以拥有自己的本地化存储库及其全部历史。

事实上,Git 是一个相当简单的工具,与 Github(在云上托管 Git 存储库)等服务相结合,有助于版本控制。

Git 基本步骤

确保你的机器上安装了Git。

所有后续命令都在终端上执行,您必须在项目目录中。

注意:将来所有需要用户指定输入的代码(比如特定的文件)都将以斜体显示。

add *filename*

上面的代码意味着您总是键入“add ”,但是您必须指定您想要添加的文件。

general overview of edit-stage-commit process. the rectangles delineate the ‘state’ of the file(s) in question. when the file is finally committed, we revert back to the unmodified state until we are ready to stage and commit more changes.

1.初始化 Git 储存库

要在项目目录中初始化 Git 存储库:

git init

这将在项目目录中创建一个. git 目录。

2.检查文件状态

要检查是否有任何文件已被修改但尚未提交,

git status 

这将返回存储库的当前状态,如下所示:

尚未“跟踪”(暂存和/或提交)的文件将在此处注明。如果所有文件都被跟踪,那么 Git 将会注意到没有什么需要提交的,工作树也是干净的。

2a。创建一个. gitignore 文件

答。gitignore file 对于确保包含敏感信息(如密码和个人 API 密钥)的文件不被跟踪非常重要。当您选择将存储库推送到云服务以便公开显示时,这一点尤其重要。来创建。gitignore 文件:

touch .gitignore

在。gitignore file,添加决定要忽略的文件的文件名或通用规则(详细定义见 Octocat )。gitignore 规则)。

最佳做法是将文件添加到。gitignore 在进行任何提交之前。将任何文件添加到。gitignore 将确保文件不会在 后续的 提交*中被跟踪。*该文件的任何先前提交仍将可用,并且该文件将需要从那些较旧的提交中移除。

3.暂存文件更改

您可以有选择地暂存已修改的文件,将它们添加到“暂存区”以准备提交。未添加到临时区域的已修改文件随后将不会被提交。这允许更细化和更具体的提交(例如:只对项目的 A 部分进行变更),这对将来的参考很有用。

#to stage specific modified files
git add *filename*#to stage all modified files
git add .

应当注意,记录当前分支的提交;这被认为是项目历史上的一个分支

4.提交文件更改

然后提交所有暂存文件,实质上是在特定时刻创建这些特定文件的“屏幕截图”。这有效地记录了对存储库的新变更。

git commit -m '*describe change(s) made here*' 

每次提交都必须有一条消息,描述所做的更改。这是用现在时完成的,最好是更具描述性的。这将有助于以后查看日志。

4a。使用过去的提交

检查过去的提交可能非常有用,无论是查看自那以后做了什么新的更改(潜在地识别新 bug 的来源),还是甚至回到以前的提交。

要显示所有提交的日志:

git log

这将返回一个提交日志,其中每个提交如下所示:

每个提交都有一个相关的描述(这就是为什么提交期间的描述很重要)、时间和提交 ID。头是指当前分支,在这种情况下,它是主分支。

要检查特定提交中所做的更改,请执行以下操作:

git show *commit-id*

提交 ID 也称为哈希(随机生成)。

要完全恢复到以前的提交:

git reset --hard *commit-id*

这实质上将返回到指定的提交(以及该特定提交处的文件);自该提交以来的所有更改都将丢失,并且头指向指定的提交。不包括“— hard”选项将导致软复位;所有更改将作为未分级的更改保留,并且头指向指定的提交。

在继续之前,描述分支很重要,这是 Git 的一个基本方面。

分支

source: Atlassian

一个分支 本质上是一个“新”目录,在你将那些变更合并到包含你所有源代码的主分支之前,你可以在这个目录上处理一个项目的特定部分或特性。

您总是开始的默认分支总是被称为主分支。主分支包含最新的可用源代码。始终假设主分支已经准备好进行部署。所有的试验和变化,无论大小,都是在以后要合并的其他分支上进行的。

基本步骤

要列出存储库中的所有分支:

git branch

要创建新分支:

git branch *new-branch-name*

这只会创建分支。要切换到特定分支并开始在其中工作:

git checkout *another-branch*

或者,如果您想要创建一个新分支并立即切换到它:

git checkout -b *new-branch-name*

合并分支

要合并两个分支(在本地存储库中),如特征分支和主分支:

1。确保您在接收分支上(主设备将从特征分支接收)

git checkout *master*

2。特征分支和主分支都必须是完全最新的,包括远程更改。

要提取并合并最近的远程更改:

git pull

3。将特征分支合并到主分支:

git merge *feature-branch*

4。删除现在不相关的特征分支

git branch -d *feature-branch*

使用 Github

确保您有一个 Github 帐户,并且您已经为您的项目创建了一个 Github 资源库。然后,您可以将本地回购推送到这个存储库。

或者,您可以克隆一个现有的存储库,这实质上是在您的机器上创建一个公共存储库的副本。

git clone *filepath*

克隆时,会自动创建到原始存储库的远程连接(称为“源”)。这允许您向前推和拉变更(到原始存储库和从原始存储库)。

Github 的主要用处是因为它加速了协作工作。项目的每个参与者都可以拥有自己的项目本地私有存储库,对本地存储库进行更改,并在以后将更改推送到公共存储库。他们可以做到这一切,而不必跟上公共存储库的变化。

README.md

自述文件是公共存储库不可或缺的一部分,因为它有助于描述项目、识别错误、列出依赖项等。对于数据科学项目的自述文件中应该包含哪些内容,RociosNG 提供了很好的指导。它通常被创建为 README.md。

通用 Git 工作流程

一般的 Git 工作流程是什么样子的?这将因团队和项目而异,但每个工作流都从存储在服务器上的公共存储库(通常是 Github)开始,并依赖于分支。要解释的最基本和最直接的 Git 工作流是集中式工作流。许多其他工作流只是集中式工作流的扩展。

集中式工作流依赖于单个公共存储库。

1.贡献者从 Github 克隆中央存储库,从而在他们的本地机器上创建存储库的副本。

git clone *repository*

2.然后,他们可以在他们的本地存储库上创建自己的分支,在那里他们可以在本地进行、暂存和提交他们的更改。

git checkout -b *branch*

3.然后,他们可以将这些(提交的)变更推送到 Github 上他们分支的远程版本(仍然与主远程分支分开)。

#ensure local version of master is up-to-date
git pull --rebase origin master#push to remote branch
git push origin *branch*

4.一旦贡献者准备好了,他们就可以为他们的远程分支提交一个拉请求。其他协作者可以检查这些更改,一旦这些更改被批准,这些更改就可以被合并到主远程分支。

如果有冲突,Git 将产生一个错误消息,冲突需要由贡献者来解决。一旦解决了冲突,就可以成功地推送更改。

解决冲突

因为贡献者正在对他们的本地存储库进行更改,一旦这些更改实际上被推送到中央存储库,他们的代码可能会与其他贡献者的代码冲突。

假设两个贡献者都在处理同一个文件,他们都以不同的方式修改了第 13 行。如果做了同样的改变,那么就不会有冲突了。如果更改不同,那么可能会出现冲突。通常 Git 会尝试以一种智能的方式组合变更,但是当它不能确定哪个变更应该被集成时(如果它们不能都被包含),那么冲突必须被手动解决。

1。从中央存储库中提取所有新的变更

git pull --rebase origin master

这将会把贡献者克隆的所有变更推到中央存储库。这将更新主分支。

通过包含 rebase 选项,在本地进行的提交被添加到新更新的主分支。这实质上将重写主分支的项目历史;所有本地提交现在都是其项目历史的一部分。

这将导致一个更干净的项目历史,没有分叉或者额外的合并提交。这样更便于日后参考。

2。解决冲突

重置基础将一次提交添加到主分支的项目历史中。当它这样做时,任何冲突也会出现。这使得解决冲突变得容易得多,因为它们可以在个案的基础上处理。

因为数据科学的特点是协作工作,这通常需要编码,所以学习和实践版本控制非常重要。我觉得讨论 Git 是最有用的,因为它是目前最流行的版本控制系统。应该注意的是,它不是唯一的版本控制系统。但是,至少了解版本控制和一些版本控制系统是很重要的。

这是对 Git 要点的一个非常广泛的概述。有关更深入的资源,请参见下文。

资源

  • 数据营
  • GitHowTo
  • Git 文档
  • 进一步 Git & Github 练习
  • 亚特兰蒂斯 Git 教程
  • Github 流程

关于运行一周编程工作体验的思考

原文:https://towardsdatascience/a-reflection-on-running-a-week-of-programming-work-experience-585eaeb6e4b4?source=collection_archive---------13-----------------------

我参与开发并指导了两个学生为期一周的工作经历,这两个学生的 A-level 考试正进行到一半(对于那些不住在英国的学生来说,这意味着他们还有一年就要高中毕业了)。这篇文章将记录我认为进展顺利的事情;而且,如果我有一台时间机器,还有什么可以改进的。

我在牛山做软件工程师。我们应用机器学习技术来自动化设备可靠性部门的流程。我们是一家小公司,但仍然设法在地球的两端都有软件团队——英国牛津;和澳大利亚的珀斯。

当我被告知我将指导两名有工作经验的学生时,我得到的唯一信息是:其中一名实习生对编程和我们的领域感兴趣;另一个对编程有点兴趣,但对我们的领域更感兴趣。另一个与我共同开发工作经验的人是牛山的技术总监,查理·迪布斯代尔。

这不是我第一次教编程。在我本科学位(计算机科学)的最后一年和博士学位(也是计算机科学)的前三年,我在各种课程中帮助了所有三年的本科生和硕士生。我真的很喜欢这些经历,能够和人们坐下来,解释概念,看到他们在他们理解的时候微笑,这太棒了。因此,管理这份工作经历将是继续我已经完成的教学的一个很好的方式。

我回想起十年前那一周的工作经历。虽然我很感激这个机会,但我并不觉得我学到了很多东西,也没有参与公司做的任何事情——这一点也不觉得个性化。每天我都有八个小时的时间来玩一些随机的新应用程序,没有设定目标,除此之外没有任何指导。这令人失望,因为那时我已经编程五年了,所以我期望我会做一些编程。因此,利用我自己工作经历中的缺点,结合我认为对这两名学生的职业生涯有益的其他经历,我制定了一些目标,希望与我指导的那些人一起实现:

  • 开发工作组合:他们和我们一起做的工作将能够放在 GitHub 存储库上,并成为对工作申请过程有用的编程组合的开始。
  • 参与公司的目标:虽然我们不能让他们用真实的数据在真实的系统上工作;他们所做的工作应该与公司的工程数据相关,而不仅仅是让他们跟随一个他们可以去任何地方的随机在线教程。
  • 事先与他们沟通,让他们知道自己将要做什么:这给了他们做任何准备的机会,如果他们愿意的话——就我个人而言,在开始工作之前,我会尽可能多地获取关于技术堆栈的信息,以便阅读。我发现这有助于减轻我的压力,也是购买更多编程书籍的绝佳借口。

带着这些目标,我们设计了本周的结构。它包括使用 Python(使用 Jupyter 笔记本)对一些与我们所在行业相关的模拟数据进行数据分析,并在周末结束时对他们所做的工作进行 15 分钟的演示。完整的任务集以及用于完成任务的数据在这里可用。

关于实习生的表现,我要讨论的是,他们表现出色,很高兴看到他们一起工作和演讲。这是为了匿名,也与本文无关。

A beautiful photo with a reflection (albeit not a personal reflection).

什么效果好

  • 这两个学生都完成了课程,现在他们每个人都有一个 GitHub 库来处理这项工作。
  • 学到了很多东西:他们都学到了很多编程知识(一个是从零开始,另一个有一些以前的知识)。我还教他们版本控制(Git 和 GitHub ),这让我意识到 Git 很难向以前没有使用过它的人解释。试图解释“git pull”和“git push ”,并告诉他们只接受“origin master”部分必须存在(否则我最终会掉进试图解释版本控制细节的兔子洞)。
  • 与这些人单独交谈,了解他们的生活计划——并试图用我仅有的一点生活经验给他们一点建议。
  • 他们看起来很享受,嗯,看起来很享受,这对我来说足够了!

有哪些可以改进的地方

  • 重点太放在编程上了。如前所述,其中一个人对工程方面的东西更感兴趣,所以更深入地研究这个领域会更好。尽管以我的计算机科学背景(以及近乎零的工程知识),很自然地,它最终会偏向于编程。潜在的,事先面试他们以了解他们想从工作经历中得到什么可能是有用的——然而,面试工作经历可能有点过头了。查理确实和这两个人聊了大约一个小时,虽然我没有亲眼目睹那次对话;但即便如此,1 小时相对于工作周的其余时间来说,仍然感觉不平衡。
  • 我自己从来没有完成过这些任务。我们生成了数据和任务,而没有实际测试它们。现在,这只是其中一个任务的一个小问题,但它给学生们造成了很大的混乱,让我有点尴尬。其中一项任务涉及在箱线图中总结数据,然而,数据有点缺乏,箱线图看起来不像典型的箱线图。这导致了混淆,认为代码是错误的,而实际上代码是正确的。这里得到的教训是:首先测试所有东西!
  • 演示时间:最初的计划是让他们单独工作,单独演示 15 分钟。他们最终做了一个联合演示,但我们仍然说 15 分钟。事后看来,我们应该在演示结束后分配更长的时间来思考和反馈,因为我们觉得他们的工作有更多的问题和学习点需要强调。
  • 代码回顾:这些任务使用了 Pandas 库,它们提供了一组丰富的数据操作函数,其中许多是学生手工实现的(计算平均值、中位数等)。其中一个甚至实现了数据的冒泡排序算法。如果能花些时间来概述熊猫的这些特征,那就太好了。虽然这肯定是在他们手动开发算法之后,因为我不确定单独加载数据帧和调用描述函数能学到多少东西。整整一周,我试图演示他们如何优化代码,但专门安排一个时间段可能更好。

结束语

总的来说,我和公司的其他人认为这是一个巨大的成功。我在这里更多地考虑缺陷,好像我们最终会再次运行它。我希望没有缺陷,它会完全顺利地进行(一个人可以做梦)。你从失败中学到的比从成功中学到的更多。

对我来说,我非常喜欢这样做,能够教人们投资组合并让他们从第一个投资组合开始是一种很棒的感觉。设计这门课程的一个潜在好处是,它可能是培训大学水平的实习生(无论能力水平如何,甚至可能是新员工)如何使用我们的代码库的一个良好开端——接受所有那些为模拟数据设计的任务,并将它们应用于真实系统中复杂得多的真实数据。

如果能听到其他运行类似工作经验计划的人的意见,以及你发现哪些是可行的,哪些是不可行的,那就太好了。请随时在这里或 LinkedIn 上联系我。欢迎评论和批评,尤其是对我的写作。

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

基于简历自动摘要的命名实体识别(NER)综述

原文:https://towardsdatascience/a-review-of-named-entity-recognition-ner-using-automatic-summarization-of-resumes-5248a75de175?source=collection_archive---------2-----------------------

了解什么是 NER,以及它是如何在行业中使用的,NER 的各种图书馆,使用 NER 进行简历汇总的代码演练。

这篇博客讲述了自然语言处理(NLP)和信息检索(IR)中的一个领域,称为命名实体识别,以及我们如何通过只提取姓名、教育背景、技能等主要实体来应用它自动生成简历摘要。

什么是命名实体识别?

命名实体识别 ( NER )(也称为实体识别实体分块实体提取)是信息提取的子任务,其寻求将文本中的命名实体定位并分类到预定义的类别中,例如人名、组织、位置、时间表达式、数量、货币值、百分比等。

已经创建了使用基于语言语法的技术以及诸如机器学习的统计模型的 NER 系统。手工制作的基于语法的系统通常可以获得更好的精度,但代价是较低的召回率和经验丰富的计算语言学家数月的工作。统计 NER 系统通常需要大量人工标注的训练数据。有人建议采用半监督方法来避免部分注释工作。

最先进的 NER 模型

斯帕西·NER 模型:

作为一个免费的开源库,spaCy 使得 Python 中的高级自然语言处理(NLP)变得更加简单。

spaCy 为 python 中的命名实体识别提供了一个非常有效的统计系统,它可以将标签分配给连续的标记组。它提供了一个默认模型,可以识别各种命名或数字实体,包括公司名称、位置、组织、产品名称等等。除了这些默认的实体之外,spaCy 还支持向实体识别模型中添加任意的类,方法是通过训练模型用更新的训练样本来更新它。

模型架构:

spaCy 中的统计模型是定制设计的,提供了速度和准确性的卓越性能组合。目前使用的架构尚未发布,但以下视频概述了该模型如何工作,主要关注 NER 模型。

斯坦福命名实体识别器:

斯坦福 NER 是一个命名实体识别器,用 Java 实现。它提供了一个默认的训练模型,用于识别主要实体,如组织、个人和位置。除此之外,还提供了针对不同语言和环境的各种模型。

模型架构:

斯坦福 NER 也被称为 CRF(条件随机场)分类器,因为线性链条件随机场(CRF)序列模型已经在软件中实现。我们可以为各种应用使用我们自己的标记数据集来训练我们自己的定制模型。

CRF 模型最初是由 Lafferty,McCallum 和 Pereira (2001) 首创的;详细易懂的介绍请参见萨顿和麦卡勒姆(2006) 或萨顿和麦卡勒姆(2010) 。

NER 模型的使用案例

命名实体识别在自然语言处理和信息检索领域有着广泛的应用。下面列举了几个这样的例子:

自动汇总简历:

各个公司的人力资源部门面临的一个关键挑战是评估一大堆简历以筛选候选人。为了增加他们的负担,申请人的简历经常被过分详细地填充,其中大部分信息与评估者寻求的无关。为了简化这一过程,通过我们的 NER 模型,我们可以快速评估简历,从而简化从一堆简历中筛选候选人的工作。

优化搜索引擎算法:

为了设计搜索引擎算法,更有效的方法是对文章运行一次 NER 模型,并永久存储与其相关的实体,而不是在数百万篇文章和网站中搜索输入的查询。然后,可以将搜索查询中的关键标签与和网站文章相关联的标签进行比较,以进行快速有效的搜索。

为推荐系统供电:

NER 可以用于开发推荐系统的算法,该算法可以自动过滤我们可能感兴趣的相关内容,并根据我们以前的行为相应地指导我们发现相关的和未访问的相关内容。这可以通过提取与我们的历史或先前活动中的内容相关联的实体,并将它们与分配给其他看不见的内容的标签进行比较,以过滤相关的内容来实现。

简化客户支持:

NER 可用于识别客户投诉和反馈中的相关实体,如产品规格、部门或公司分支机构的详细信息,以便对反馈进行相应分类,并转发给负责已识别产品的适当部门。

我们将在接下来的章节中详细描述使用 NER 模型的简历汇总。

简历汇总的 NER

数据集:

当然,手头的第一项任务是创建手动标注的训练数据来训练模型。为此,从一个在线招聘平台下载了 220 份简历。这些文件被上传到 Dataturks 在线注释工具,并进行手动注释。

该工具自动解析文档,允许我们创建感兴趣的重要实体的注释,并生成 JSON 格式的训练数据,每行包含文本语料库和注释。

数据集的快照如下所示:

以上由 220 份带注释的简历组成的数据集可以在这里找到。我们用 200 份简历数据训练模型,用 20 份简历数据进行测试。

使用 python 中的空间模型训练自定义模型:

数据集格式:

由 Dataturks 注释工具生成的 json 格式数据的一个示例提供给代码,如下所示:

训练模型:

我们使用 python 的 spaCy 模块来训练 NER 模型。spaCy 的模型是统计的,他们做出的每一个“决定”——例如,分配哪个词性标签,或者一个词是否是命名实体——都是一个预测。这一预测基于模型在训练期间看到的例子。

然后向模型显示未标记的文本,并进行预测。因为我们知道正确的答案,所以我们可以以计算训练样本和预期输出之间的差异的损失函数误差梯度的形式给出关于其预测的模型反馈。差异越大,梯度和模型更新就越显著。

当训练一个模型时,我们不仅仅希望它记住我们的例子——我们希望它能提出可以在其他例子中推广的理论。毕竟,我们不只是想让模型知道“亚马逊”的这个实例是一家公司——我们想让它知道,在像这样的的环境中,“亚马逊”最有可能是一家公司。为了调整准确性,我们分批处理我们的训练示例,并对[minibatch](https://spacy.io/api/top-level#util.minibatch)大小和辍学率进行实验。

当然,仅仅向一个模型展示一个例子是不够的。特别是如果你只有很少的例子,你会想要训练一个数量的迭代。在每次迭代中,训练数据会被打乱,以确保模型不会基于示例的顺序做出任何概括。

另一种改善学习结果的技术是设置一个退出率,一个随机“丢弃”个别特征和表示的速率。这使得模型更难记住训练数据。例如,0.25丢弃意味着每个特性或内部表示有 1/4 的可能性被丢弃。我们对模型进行 10 个时期的训练,并保持辍学率为 0.2。

下面是训练模型的代码片段:

[## data Turks-Engg/Entity-Recognition-In-Resumes-SpaCy

通过在 GitHub 上创建一个帐户,为简历中的实体识别空间开发做出贡献。

github](https://github/DataTurks-Engg/Entity-Recognition-In-Resumes-SpaCy)

spaCy 模型的结果和评估:

该模型在 20 份简历上进行了测试,预测的汇总简历被单独存储。每份简历的 txt 文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度分数、精确度、召回率和 f 分数。将每个实体的这些指标值相加并平均,以生成一个总分数,来评估由 20 份简历组成的测试数据上的模型。实体方面的评估结果如下所示。据观察,所获得的结果已经预测了值得称赞的准确性。

下面显示了通过我们的模型预测获得的一份来自 indeed 的员工的未公开简历的示例摘要:

Resume of an Accenture employee obtained from indeed

Summarized Resume as obtained in output

使用 Java 中的斯坦福 NER 模型来训练定制模型:

数据集格式:

用于训练的数据必须作为文本文件传递,以便每行包含一个单词-标签对,其中单词和标签标记由制表符空格“\t”分隔。对于一个文本文档,就像在我们的例子中,我们将文档标记为单词,并将每个单词和相关的标签添加到训练文件中。为了指示下一个文件的开始,我们在训练文件中添加一个空行。

以下是输入培训文件的示例:

注意:每个单词都必须包含一个标签。这里,对于我们不关心的单词,我们使用标签 0。

属性文件:

Stanford CoreNLP 需要一个属性文件,其中包含构建定制模型所需的参数。例如,我们可以定义提取学习特征的方法,等等。以下是属性文件的示例:

# location of the training file
trainFile = ./standford_train.txt
# location where you would like to save (serialize) your
# classifier; adding .gz at the end automatically gzips the file,
# making it smaller, and faster to load
serializeTo = ner-model.ser.gz# structure of your training file; this tells the classifier that
# the word is in column 0 and the correct answer is in column 1
map = word=0,answer=1# This specifies the order of the CRF: order 1 means that features
# apply at most to a class pair of previous class and current class
# or current class and next class.
maxLeft=1# these are the features we'd like to train with
# some are discussed below, the rest can be
# understood by looking at NERFeatureFactory
useClassFeature=true
useWord=true
# word character ngrams will be included up to length 6 as prefixes
# and suffixes only
useNGrams=true
noMidNGrams=true
maxNGramLeng=6
usePrev=true
useNext=true
useDisjunctive=true
useSequences=true
usePrevSequences=true
# the last 4 properties deal with word shape features
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
#wordShape=chris2useLC
wordShape=none
#useBoundarySequences=true
#useNeighborNGrams=true
#useTaggySequences=true
#printFeatures=true
#saveFeatureIndexToDisk = true
#useObservedSequencesOnly = true
#useWordPairs = true

训练模型:

斯坦福 CoreNLP 的首席类是CRFClassifier,拥有实际模型。在 Github 存储库中提供的代码中,我们提供了使用训练数据和属性文件来训练模型的代码,并将模型保存到磁盘,以避免每次训练所耗费的时间。下次我们使用该模型对一个看不见的文档进行预测时,我们只需从磁盘加载训练好的模型,并使用它进行分类。

输出中的第一列包含输入标记,而第二列引用正确的标签,第三列是分类器预测的标签。

下面是训练模型并将其保存到磁盘的代码片段:

[## data Turks-Engg/Entity-Recognition-In-Resumes-Stanford ner

通过在 GitHub 上创建一个帐户,为 StanfordNER 的简历中的实体识别发展做出贡献。

github](https://github/DataTurks-Engg/Entity-Recognition-In-Resumes-StanfordNER/blob/master/StanfordCRFTagger.java)

斯坦福 NER 模型的结果和评估:

该模型在 20 份简历上进行了测试,预测的汇总简历被单独存储。每份简历的 txt 文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度分数、精确度、召回率和 f 分数。将每个实体的这些指标值相加并平均,以生成一个总分数,来评估由 20 份简历组成的测试数据上的模型。实体方面的评估结果如下所示。据观察,所获得的结果已经预测了值得称赞的准确性。

下面显示了通过我们的模型预测获得的一份来自 indeed 的员工的未公开简历的示例摘要:

A resume of an Accenture employee obtained from indeed

Summarized Resume as obtained in Output

斯帕西、斯坦福 NER 和最先进模型的比较;

现实世界简历文档中的绝大多数标记不是通常定义的实体名称的一部分,因此基线精度、召回率非常高,通常> 90%;按照这个逻辑,两个模型的实体精确召回值都相当不错。

从对模型的评估和观察到的结果来看,spaCy 在总结简历的任务上似乎优于斯坦福 NER。两种模型确定的实体的 F 分数审查如下:

这是标有 NER 实体的简历数据集。

用于训练 spaCy 模型的上述项目的 Python 代码可以在 github 存储库中的这里找到。

上述用于训练斯坦福 NER 模型的项目的 Java 代码可以在 GitHub 仓库的这里找到。

注意:这个博客是发表在 Dataturks 的 NER 博客的扩展版本。

英伟达 GTC 2018 大会综述——新 GPU、深度学习加速、数据增强、自动驾驶…

原文:https://towardsdatascience/a-review-of-nvidia-gtc-2018-conference-new-gpus-deep-learning-acceleration-data-augmentation-d6d4f638bcda?source=collection_archive---------4-----------------------

会议主题是“AI 与深度学习”。

NVIDIA DGX-2 Workstation, 10x faster than the DGX-1 released 6 months ago. Source.

在 NVIDIA GPU 技术大会上为期 4 天的精彩演讲、主题演讲、演示、海报和互动。作为一名对应用人工智能感兴趣的 HCI 研究人员,了解人工智能硬件(GPU)的进展是令人兴奋的,这些技术讲座涵盖了人工智能科学和人工智能的行业用例。这篇文章总结了我参加的会议主题和技术会议的笔记。

TLDR——一些亮点

  • NVIDIA AI 宣布了新的 GPU,并原生集成了他们的深度学习推理优化器(tensort)与 TensorFlow 。
  • 人们对构建模拟环境以测试自动驾驶汽车算法的兴趣越来越大。英伟达公布了一款自动驾驶平台。
  • 对于人工智能的许多现实应用,数据增强策略越来越重要。参见 Fatkun 插件采集训练图像,参见 imagaug 库进行图像增强。另请参见这篇关于 python/Tensorflow 中的数据扩充步骤的博文。
  • 生成性人工智能(GANs,进化算法)正在被探索用于 CAD 和游戏设计用例——艺术内容生成(人物,背景),内容重用等。
  • 研究人员正在探索人工智能在安全领域的应用——例如检测域生成算法。
  • 人工智能正被用于通过加速模拟来加速科学研究。

主题演讲 GPUs、图形应用、人工智能、自动驾驶的进步。

图形处理器

宣布了几款新的 GPU——Quadro gv 100(10,000 个内核)和 DGX 2 号工作站(2 PFlOPS,512GB HBM2,10Kw,350 磅)。从性能的角度来看,DGX 2 号比 6 个月前发布的 DGX 1 号快 10 倍。模型训练时间中的示例进一步展示了 GPU 进步对人工智能研究和实践的影响。

就在 5 年前,用2 GTX 580 训练 Alexnet 花了 6 天。今天,Alexnet 可以在 DGX-2 上进行 18 分钟的训练。相当大的进步!

主题演讲还强调了 GPU 现在如何实现运动图形的实时光线跟踪,以及以前在超级计算机上完成的工作现在如何能够在 DGX 工作站上高效地完成,其价格仅为功耗 空间 要求的一小部分。

医学成像超级计算平台

CLARA — NVIDIAs system to enable medical imaging. Source.

英伟达还提到了他们对医疗成像超级计算机的尝试——克拉拉。这个项目很有前景,因为它旨在利用人工智能/深度学习的进步来扩展现有医疗成像设备的能力。有一个有趣的视频,讲述了深度学习算法如何用于心脏的 3D 重建(心室大小、血流等细节),这些图像是基于 15 年前的超声波扫描仪捕捉的图像。点击这里了解更多关于克拉拉的信息。

自动驾驶,传感器融合

获取训练数据和设计算法融合来自自动驾驶所需的多个传感器的输入(传感器融合)是很难的。NVIDIA 提到了创建一个平台——NVIDIA DRIVE——来帮助解决这些问题的努力。对于自动驾驶汽车研究人员来说,这是个好消息。**

NVIDIA DRIVE 平台结合了深度学习、传感器融合和环绕视觉,以改变驾驶体验。它能够实时了解车辆周围发生的事情,在高清地图上精确定位自己,并规划安全的前进路径。该平台围绕多样化的冗余系统架构设计,旨在支持最高级别的汽车功能安全 ASIL-D。

还有一些其他的技术讲座,强调了对高质量模拟环境的需求,以训练/测试自动驾驶汽车算法。

张量流+张量

NVIDIA AI 也宣布原生 Itensort 与 Tensorflow 整合。NVIDIA TensorRT 是一款深度学习推理优化器和运行时,它通过基于 GPU 的平台的优化和高性能运行时来加速深度学习推理。如果您正在 NVIDIA GPUs 上运行 Tensorflow 应用程序,您现在可以添加一些代码行来自动启用 TensorRT 优化和加速!

技术会谈

下面是我参加的一些技术讲座。

温斯顿·许的数据增强策略[ 幻灯片

我发现这个演讲很有趣,因为它提供了关于如何满足监督深度学习的数据饥渴需求的实用建议。演讲者从数据的人工注释是一个昂贵的过程这一前提开始,并提出了他们在工作流程中使用的四种方法来解决这一问题。

网络抓取:从网站和社交网络中高效抓取标签数据的方法。
弱监督方法:给定一个由专家标记的小数据集,我们可以学习标记策略,并将其应用于标记更大的数据集。
数据转换:我们可以通过使用简单的线性转换生成额外的示例来扩充数据集,例如裁剪、移位、色偏、镜头失真、晕影、随机背景等。这种转换的库的例子是 imageAug 。
数据合成:我们可以生成纹理化的 CAD 模型作为训练数据,我们可以给数据添加特定的特征,例如给面部图像添加眼镜,以及使用 GANs 一起合成新的图像。

更多信息请点击此处查看主讲人的幻灯片。

司机睡意检测——英伟达的 Siddarth Varier

英伟达的研究人员展示了一些检测司机睡意的早期工作。作者训练了一个按比例缩小的 VGG16 模型,并使用从 3D 人脸模型生成的合成数据增加了他们的训练数据集。对于分类,它们依赖于在一段时间内预测的眼睛俯仰角。

生成人工智能

Autodesk 创成式设计:在这次演讲中,演讲者讨论了进化算法在生成 CAD 设计中的一些有趣的应用。给定一个设计挑战,目标通常是平衡成本(材料)和性能。为此,他们试验了生成候选设计的进化算法,同时优化成本/性能/制造方法等参数,并使用自动化压力测试(FEA 分析)作为反馈的一部分。给出了一个具体的例子,其中一个进化算法提出了一个摩托车的高性能(和不寻常的外观)部件。

人工智能颠覆游戏内容创作的未来——艾瑞克·里塞尔, Artomatix

Left — original: We can see a clear vertical and horizontal seam line running through the center of the image, Right — Artomatix output:The seam was intelligently repaired with new features that appear realistic. Source — Artomatix Blog.**

本次演讲的重点是如何将人工智能加速的工作流应用于媒体行业的各个方面(例如电影、视频游戏)。演示者透露,视频游戏行业在艺术内容生成上花费了 61%的预算——主要角色和背景。大部分工作包括手动工作流程。创造性或生成性人工智能提供了改善这一点的机会,涉及纹理合成、材料增强、杂交和风格转移等领域。这包括使艺术家能够用结构绘画的方法、基于示例的工作流(扫描现实世界的对象并利用人工智能进行改进)和摄影测量。人工智能还可以帮助回收旧内容,例如高清视频。给出了一个行业使用案例,宜家能够轻松扫描产品的 3D 模型,然后在网站上使用(研究表明,拥有 3D 模型可使网站销售额提高 20%)。查看主持人公司博客的更多详情。

生长生成模型 — Samuli Laine 等人 NVIDIA 的研究人员展示了一些关于如何使用生成对抗网络(GANs)生成高分辨率图像的有趣工作。他们的方法解决了 GANs(模式崩溃)的一个已知问题,加速并稳定了训练过程。关键思想是逐渐增加发生器和鉴别器:从低分辨率开始,随着训练的进行,增加新的层来模拟越来越精细的细节。他们强调了这项工作在为游戏和电影生成资产以及调节 GAN 以确定输出(例如男性或女性面孔)方面的潜力。更多细节可以在他们的论文中找到。

Examples of high resolution faces generated by their GAN. Paper.

网络防御——用机器智能对抗 DGAs

另一个有趣的话题是如何使用 ML 来解决一些安全问题——检测域生成算法。域生成算法 DGAs 是各种恶意软件家族中常见的算法,用于定期生成大量域名,这些域名可用作其命令和控制服务器的集合点。它们被黑客用来交流和从网络中窃取数据,旨在绕过传统的网络防御,并取得了极大的成功。他们引用了最近的一篇论文“深度网络在线 DGA 检测”。

看见 AI ,一款针对视障人士的 app—Anirudh Koul

微软研究院的 Anirudh Koul 的有趣演讲展示了他的团队如何为视障人士(VIP)开发 seeingAI 移动应用程序。

他注意到这一方向如何孕育创新,从而激发了应用程序的可访问性设计。例如,雷·库兹韦尔受一位盲人的启发,发明了一种阅读机器。格雷厄姆·贝尔也有类似的故事,他在研究助听器时发明了电话。

对残疾人来说是小众的东西明天将成为主流。

seeingAI 应用程序可以帮助 VIP 阅读文本、识别人物、场景、笔迹、文档、产品、货币、光源等。也许这项工作的创新之处在于 大部分这些功能都是在设备 上本地执行的。演示者分享了他们对这个项目体验的有趣想法。

  • 训练视觉模型:他们试验了几种方法来组合他们的数据集和 customvision.ai 来训练它。他们建议使用 Fatkun 插件来删除具有适当权限的数据。他们还讨论了为货币生成受控合成数据的实验——例如,采用货币、翻转、遮挡、添加背景等。这里的一个重要思想是确保模型不会仅仅通过看到非鉴别特征(例如,具有零的边缘)来学习预测音符…可以是 10 或 20 美元的钞票)。
  • 为用户体验而不是验证准确性挑选最佳模型。演示者提出了一个重要的观点,即高验证准确性可能不会很好地转化为良好的用户体验。例如,一个准确率为 95%但偶尔会将 100 美元的钞票标记为 10 美元的模型对一个准确率为 90%但不会犯这种错误的模型的吸引力要小得多。针对精度进行优化。在逐帧分析过程中,UX 还需要考虑何时发言。
  • 人们如何使用这款应用:一个盲人根据来自应用的信息——面部、情绪等——改变音调。一个盲人学校的老师,他有自己的电话,当学生进入教室时,他会通知他们。父母能够第一次阅读他们孩子的家庭作业或阅读圣诞信息。
    演讲者还指出,人们通过自我训练来理解人工智能的极限——它能做什么和不能做什么。

使用 ML 加速研究

有一些有趣的演示显示了机器学习如何通过以很少的时间和成本复制昂贵、耗时的模拟来加速科学发现。尤其是在物理科学领域,通常会有让科学家测试想法的模拟器,例如用于碰撞测试、化学反应、压力测试等的模拟器。这些模拟中的许多是复杂的、计算昂贵的(有时高达每年数十亿个 CPU 小时),并且可能需要几天或几周来完成单个模拟。这个想法是训练 ML 模型,学习这些模拟器中使用的过程并复制它们的功能——只需很少的时间和成本。Google Research 的相关工作已经展示了机器学习模型,与现有的预测有机分子属性的模拟器相比,这些模型同样准确并且更快 ( 300,000 倍)。在 GTC,也有一个类似的关于使用 GANs 改进高能物理模拟器的报告。**

用甘斯加速科学— 米凯拉·帕格尼尼

Accelerating Science with Generative Adversarial Networks: An Application to 3D Particle Showers in Multi-Layer Calorimeters. Paper here.

Michela Paganini 做了一个有趣的演讲,讲述了她如何应用 GANs 来模拟量热法——高能物理实验中计算量最大的模拟之一。虽然结果并不完美,但它们展示了一些前景,有可能加快研究周期。更多细节可在他们的 arxiv 论文中找到。

结论

这是一次非常有趣的会议。大会上有 900 多场会议,我在这里所涉及的只是很小的一部分。我发现的共同主题是各种数据增强策略的使用,人工智能的创造力,自动驾驶汽车的模拟环境,人工智能和安全,以及人工智能促进加速研究。

有反馈或意见吗?随时联系— twitter , linkedin 。

强化学习在医疗保健中的应用综述

原文:https://towardsdatascience/a-review-of-recent-reinforcment-learning-applications-to-healthcare-1f8357600407?source=collection_archive---------9-----------------------

让机器学习超越诊断,找到最佳治疗方法

Photo taken from Wang et al. KDD Video

机器学习在医疗保健领域的应用已经取得了许多重大成果。然而,这些研究大部分集中在诊断病情或预测结果,而不是明确的治疗上。虽然这些可以间接帮助治疗患者(例如,诊断是找到治疗方法的第一步),但在许多情况下,特别是在有许多可用治疗方案的情况下,为特定患者找出最佳治疗策略对人类决策者来说是一项挑战。虽然强化学习已经变得非常流行,但大多数论文都专注于将其应用于棋盘或视频游戏。RL 在学习这些(视频/棋盘游戏)环境中的最优策略方面表现很好,但是相对而言,在医疗保健等真实世界环境中尚未经过测试。RL 是实现这一目的的一个很好的候选,但是在实际工作中有许多障碍。

在本文中,我将概述一些最新的方法,以及将 RL 应用到医疗保健中存在的最大障碍。如果你对这个话题感兴趣,我将在 PyData Orono Meetup 上详细介绍几个模型,该会议将于本周三美国东部时间 7-9:30 在 Zoom 上播出。本文假设您对强化学习有基本的了解。如果你不知道,我建议你读一读关于数据科学的文章。

基本挑战:

  1. 对纯(或主要)观测数据的学习和评估

与 AlphaGo、Starcraft 或其他棋盘/视频游戏不同,我们无法模拟大量的场景,在这些场景中,代理人进行干预以学习最优策略。最重要的是,利用患者来训练 RL 算法是不道德的。此外,这将耗资巨大,可能需要数年才能完成。因此,有必要从观察史料中学习。在 RL 文献中,这被称为“政策外评估”。许多 RL 算法,如 Q-learning,“理论上”可以在偏离策略的上下文中有效地学习最优策略。然而,正如 Gottesman 等人在他们最近的文章中指出的那样,“在观察性健康设置中评估强化学习算法”,准确评估这些学习到的策略是棘手的。

在正常的 RL 环境中,为了评估一项政策,我们只需让代理人做出决策,然后根据结果计算平均奖励。然而,如上所述,由于道德和后勤方面的原因,这是不可能的。那么我们如何评价这些算法呢?截至目前还没有一个满意的答案。Gottesman 等人在他们的报告中详细描述了这一点,并陈述了可能的情况,但他们没有就使用哪种度量得出具体的结论。下面是常用指标的简要分类。在讨论个别论文时,我也会更详细地介绍。

  • 重要性抽样

Gottesman et al. *Note don’t confuse “weight” here with the weight of neural network. Here you can think of weight almost as a measure of similarity between the histories of the patient under the clinical policy versus what it would be under the learned policy.

为了简化数学术语,这种方法本质上涉及到寻找由医生制定的、匹配或几乎匹配所学政策的治疗方案。然后我们根据这些实际治疗的结果来计算奖励。这种方法的一个问题是,在许多情况下,“非零重要性权重”的实际数量非常小这意味着本质上,如果学习政策建议了医生永远不会做的治疗(或缺乏治疗),那么你将很难评估该政策,因为没有类似的历史,我们实际上有可以比较的结果。

戈特斯曼等人。艾尔。不要提供这个问题的解决方案。相反,他们指出,人们应该*“*总是检查重要性权重的分布”,因为大多数人往往会坐在零附近。为此,Gottesman 指出“因此,我们应该确保用于评估政策的有效样本量足够大,以使我们的评估具有统计学意义。如上所述,将我们自己限制在与医生相似的政策范围内,也将有利于增加有效样本量。"

  • u 形曲线

Examples of the U-Curve from Gottesman et al.

这种方法侧重于比较学习策略和医生策略之间在结果方面的差异。这种评估方法本身也有问题,因为它很容易导致糟糕的政策看起来比临床医生的政策更好。该方法的核心是潜在的假设,即如果当政策推荐剂量和医生剂量匹配时,死亡率低,则政策一定是好的。然而,Gottesman 等人发现,由于数据中发现的差异,随机或无治疗策略看起来会优于医生的策略。

选择良好的评估指标很重要,因为在某些情况下,由于大多数接受治疗的患者具有不良结果,代理可能会学会将治疗与负面结果相关联。这是由于缺乏未治疗患者的数据。正如 Gottesman 等人关于脓毒症所述:

“我们观察到一种已有政策的趋势,即建议对非常高急性(SOFA 评分)的患者进行最低限度的治疗。从临床角度来看,这个建议没有什么意义,但从 RL 算法的角度来看是可以理解的。大多数 SOFA 评分高的患者接受积极的治疗,由于他们病情的严重性,这一亚群的死亡率也很高。在缺乏没有接受治疗的高急性患者的数据的情况下,RL 算法得出结论,尝试一些很少或从未进行的事情可能比已知结果不佳的治疗更好。第 4 页

这又回到了相关性不等于因果性的经典问题。虽然在这里很明显,这个模型在其他环境中有问题,但如果没有适当的评估,它可能更加微妙,不容易被发现。

2。部分可观察性

与医学中的许多游戏不同,我们几乎永远无法观察体内发生的一切。我们几乎可以每隔一段时间测量一次血压、体温、二氧化硫和其他简单的指标,但这些都是信号,并不是患者的真实情况。此外,有时我们可能在某些时间点有数据,但在其他时间点没有。例如,医生可能只在治疗肺炎病人的前后进行胸部 x 光检查。因此,模型必须在没有所有数据的情况下估计条件的状态。这是医疗保健中的一个难题,因为在每个时间点都有很多关于病人的未知信息。

奖励功能

在许多现实世界的问题中,找到一个好的奖励函数是具有挑战性的。医疗保健也不例外,因为通常很难找到一个奖励函数来平衡短期改善和整体长期成功。例如,在脓毒症的情况下,血压的周期性改善可能不会导致结果的改善。相比之下,最后只给出一个奖励(生存或死亡)意味着一个很长的序列,没有任何中间反馈给代理人。通常很难确定哪些行为(或不行为)导致了奖励或惩罚。

RL 渴望数据

几乎所有深度强化的重大突破都是基于多年的模拟数据。显然,当您可以通过模拟器轻松生成数据时,这就不是什么问题了。但是,正如我在以前的许多文章中所描述的那样,特定治疗的数据通常很少,这些数据需要付出巨大的努力来注释,并且由于 HIPPA 合规性和 PHI,医院/诊所对共享他们的数据非常谨慎。这为将深度 RL 应用于医疗保健带来了问题。

非平稳数据

医疗保健数据本质上是非静态和动态的。例如,患者可能会在不一致的时间间隔记录症状,并且一些患者会比其他人记录更多的生命体征。治疗目标也可能随着时间的推移而改变。虽然大多数论文关注的是降低整体死亡率,例如,如果患者的病情有所改善,关注点可能会转移到缩短住院时间或其他目标上。此外,病毒和感染本身可能会以训练数据中未观察到的动态方式快速变化和进化。

有趣的近期研究

既然我们已经解决了医疗保健中关于强化学习的一些最大挑战,让我们看看一些令人兴奋的论文以及他们如何(试图)克服这些挑战。

  • 深度强化治疗脓毒症

这篇文章是最早直接讨论深度强化学习在医疗保健问题中的应用的文章之一。在这篇文章中,作者使用了 MIMIC-III 数据集的脓毒症子集。他们选择将作用空间定义为由升压药和静脉注射液组成。他们将药物剂量分成四组,每组包含不同数量的药物。核心网络是具有独立价值流和优势流的双深度 Q 网络。基于测量器官衰竭的 SOFA 评分,奖励函数是临床激励的。为了评估,他们使用了戈特斯曼所谓的 U 型曲线。具体来说,他们将死亡率视为处方政策与实际政策之间剂量差异的函数。

  • 强化学习与行动衍生奖励化疗与临床试验给药方案选择

本文描述了一种通过强化学习寻找化疗患者最佳治疗策略的方法。本文还使用 Q-Learning 作为底层模型。对于一个行动空间,他们制定了一定数量的剂量给定的持续时间,代理人能够从中进行选择。剂量周期只能以专家确定的频率启动。在每个周期结束时计算转换状态。回报函数被定义为肿瘤直径的平均减少。使用模拟临床试验进行评估。目前还不清楚这些模拟是如何建立的,但这种类型的模拟通常包含病理和统计数据。

  • 用递归神经网络监督强化学习进行动态治疗推荐

本文将监督式 RL(通过演员评论方法)与 RNNs 一起用于学习整体治疗计划。这篇论文值得注意的是,它试图利用完整的 MIMIC-III 数据集,为所有患者提供治疗,而不仅仅是一个子集。该设置基本上包含三个主要组件:基于患者状态推荐药物的参与者、评估这些药物的价值以鼓励或阻止它们的批评家网络,以及用于通过总结历史观察来帮助克服部分可观察性问题的 LSTM。动作空间是 1,00 种确切的药物或 180 种药物类别。作者根据估计的住院死亡率来评估他们的方法。

  • 对医疗登记数据进行动态治疗方案的深度强化学习

Image from article detailing using RL to prevent GVHD (Graft Versus Host Disease).

这是一篇有趣的论文,旨在为各种动态治疗方案提供一个框架,而不像以前的论文那样局限于特定的个体类型。作者声明“提出的深度强化学习框架包含一个监督学习步骤,以预测最可能的专家行动;和深度强化学习步骤,以估计动态治疗方案的长期价值函数。”第一步是监督学习,以预测给定患者的一组可能的专家治疗方法,以预防移植物抗宿主病(GVHD),GVHD 是骨髓捐赠后的一种常见并发症,其中捐赠者的免疫细胞攻击宿主的细胞。第二步是 RL 步骤,代理人寻求将并发症的可能性降至最低。

还有一些其他的论文,由于篇幅原因,我就不赘述了,但仍然很有趣。

  • 一种鼓励糖尿病患者身体活动的强化学习系统

这是一篇完全不同的论文,它涉及使用 RL 来鼓励健康的习惯,而不是直接治疗。

  • 脓毒症患者个性化血糖控制的表征和强化学习

这是另一篇关于脓毒症和 RL 的论文。然而,它采用了一种稍微不同的方法,只关注血糖控制。

  • 从观测数据中学习最优策略

这实际上不是一篇强化学习的论文,不管它有多好。它侧重于反事实推理和使用领域对抗性神经网络。

结论

在医疗保健中应用强化技术仍然存在许多挑战。最困难和最突出的是在医疗保健场景中有效评估 RL 算法的问题。其他挑战涉及培训所需的数据量、数据的非平稳性以及数据仅部分可观察的事实。也就是说,有很多最近出现的文献可以帮助解决一些问题。如上所述,我打算在即将举行的 meetu p 会议上深入探讨其中的一些方法。此外,我希望复兴关于医疗保健机器学习的 Slack 频道,所以如果你感兴趣,请加入。

附加注释的参考文献

医疗保健领域的数字医生研讨会强化学习

这是一个非常好的演讲,由 MLHC 的组织者之一做的,关于将 RL 应用于 HIV 治疗。在这里,她以一种清晰明了的方式讨论了许多问题。

在不稳定和竞争环境中通过元学习进行持续适应

这篇论文与医疗保健无关,但我认为它提供了一个很好的框架来处理 MAML 的非固定问题(可能会出现)。此外,(只是直觉)我认为它可能对进化非常快的病毒和 RL 必须快速适应并基于少量数据的其他情况有用。

评估观察健康环境中的强化学习算法

我已经为这篇文章做了大量的采样,但是我认为如果你真的想理解评估,你应该通读这篇文章。

在企业中集成深度学习的路线图

原文:https://towardsdatascience/a-roadmap-for-integrating-deep-learning-in-an-enterprise-d99f9be233dd?source=collection_archive---------12-----------------------

未来今日研究所的第 11 份新兴技术年度报告称,深度学习将很快成为每个组织的隐形部分。该报告强调了计算能力的大幅增长和海量数据的可用性是企业内部更广泛采用深度学习的两个关键驱动因素。

Photo by Franck Veschi on Unsplash

所有这些似乎都与一个广泛的共识一致:今年人工智能将突破成为主流。也就是说,每个组织仍然需要一个战略路线图来实现智能自动化的未来,即利用自我开发的算法和系统实时、大规模地做出复杂决策的未来。像机器人流程自动化(RPA)这样的基础技术可以在使企业简化和加速深度学习和真正人工智能的旅程中发挥战略作用。

尽管 RPA 已被证明是一种变革性的技术,但它仍被视为一种工具,用于自动化企业内简单的、基于规则的、低复杂性的流程。不可否认 RPA 在成本、质量和生产率方面的影响,但它仍然普遍缺乏深度学习和人工智能的破坏性声誉。

但是,在人工智能采用和智能自动化的竞赛中,EY 全球首席数据分析官克里斯·马泽伊说,在 RPA 方面有一个“的特殊机会。正如马泽伊解释的那样,将人工智能的智能与 RPA 的运营效率结合起来,有助于加快新兴智能技术在企业中的应用步伐。

大多数进步的 RPA 解决方案已经整合了机器学习驱动的认知组件,这些组件提供了复杂的决策能力,超越了简单的基于规则的自动化。例如,智能自动化软件提供商 WorkFusion 的自动化工具包包括一个认知自动化系统,它与 RPA 一起工作,以自动化更复杂的判断活动,并不断从中学习。

像这样的下一代 RPA 解决方案旨在为企业集成智能自动化技术的紧急迭代提供基础。这些解决方案能够利用深度学习概念的力量,如深度神经网络和 NLP 来增强和提高他们的自我学习能力。

随着深度学习慢慢从研究机构进入主流,它也变得越来越容易获得。事实上,在未来三到五年内,易于使用的深度学习工具预计将成为打包的 SaaS 应用程序和特定功能库的。工具、框架和库的开源也有助于将概念主流化,并加速对深度学习的企业潜力的研究。今天,深度学习的先驱,如谷歌、 AWS 和微软都有开源的深度学习库、训练算法和神经网络模型,使企业更容易使用自己的数据进行深度学习实验。

即使深度学习成为主流— Gartner 预测到 2018 年,80%的数据科学家将在他们的工具包中拥有深度学习——在技术和数据专业知识方面,仍然存在与专门要求相关的挑战,需要解决。但尽管如此,企业将越来越难以忽视深度学习的颠覆性潜力,以解决目前超出传统自动化解决方案范围的复杂业务需求。

针对您的数据科学环境使用 Docker 的简短指南

原文:https://towardsdatascience/a-short-guide-to-using-docker-for-your-data-science-environment-912617b3603e?source=collection_archive---------6-----------------------

告别 OS 烦恼,向便携性问好!

Source : Docker + Jupyter teams

为什么

在新系统上开始工作/开始一项新工作或只是简单地分享您的工作,最耗时的部分之一是由于硬件/软件/安全策略等方面的差异而导致的可用工具的变化(或缺少工具)。容器化近年来兴起,作为一种现成的解决方案,可以解决各种应用程序的平台差异,从单用户开发环境(使用 docker 试用JetBrains工具)到高度分布式的生产环境(例如Google CloudDocker)。在本文中,我们将介绍 Docker 作为我们的容器服务,以及开始为数据科学构建定制开发平台所需的步骤。

就个人而言,我认为使用 docker 的最大优势之一就是能够在他人的系统上进行构建。如果一个已经存在的环境满足您的所有需求,您可以简单地从克隆它开始,或者,您可以使用您的 dockerfile 在它的基础上进行构建,使它对您的特定用例更加有用!

如何

让我们讨论几个场景:

方法 A:从您选择的 linux 发行版开始

假设您决定最好从头开始,即从您喜欢的 linux 发行版开始,安装适合您需要的所有软件。通过这种方式,您可以完全控制正在安装的每个软件,并且可以根据需要为每个工具安装特定的版本。这也可能给你最小的图像尺寸,因为你可以跳过任何你不需要的工具。下面显示了这种方法的几个示例 docker 文件:

*# Using ubuntu 18.04 as base imageFROM ubuntu:18.04
RUN apt-get install python3-pip python3-dev && \
    ln -s /usr/bin/python3 /usr/local/bin/python && \
    pip3 install — upgrade pip*

仅此而已。将它复制到一个空文件夹中的文件中,并使用 docker build 构建一个映像,以访问 ubuntu 中的基本 python3。

另一种构建映像的方法是使用 dockerhub 的官方 python 库。您可以使用 docker pull 命令克隆一个映像:

*docker pull python*

方法 B:使用已经安装了所有工具的可用映像

这就是我爱上使用 docker 进行日常工作的原因。Jupyter Docker Stacks 的工作人员已经创建了许多已经安装了不同工具的测试良好、功能齐全且随时可用的映像。从他们的文档中提取的依赖关系树如下所示:

Docker image tree by Jupyter Docker Stacks — Each child contains every tool in the parent image

使用这些图像或对它们稍加修改,对于大多数用例来说就足够了。要使用这些图像中的一个,只需使用“docker run”命令,如果图像不存在,它将被下载。

*docker run -p 8888:8888 jupyter/scipy-notebook*

-p 参数将您的系统端口 8888 镜像到 docker 镜像端口 8888,因此现在,您可以在本地浏览器中启动 jupyter 或 jupyterlab!如果您想以随机方式转发所有暴露的端口,请使用 -P 来代替。这些映像来自 Anaconda 的 python 发行版,正如我前面提到的,您可以从任何映像开始,通过使用 docker 文件并在本地构建来添加额外的工具。

对于我的使用,我已经将使用 Anaconda 的 Julia、Python27 和 Python36 环境添加到了all-spark-notebook映像中。

这个修改后的映像包含以下可从 Jupyter 访问的内核:

  1. 基本 python Jupyter 笔记本环境
  2. Python 3.6
  3. Python 2.7
  4. 斯卡拉
  5. 稀有
  6. 朱莉娅
  7. 火花
  8. Mesos 堆栈

我的图像储存库在 Github 的上,你可以随意使用和修改。要使用此环境并为工作挂载本地目录,请使用以下命令运行它:

*****docker run -P -v "path_to_shared_local_directory":/home/jovyan/work/ -t cvbi/datascience-environment*****

上面的命令做了 3 个重要的步骤。下载并运行容器 cvbi/data science-environment
2。将所有暴露的容器端口转发到随机主机环境端口
3。挂载主机目录
“path _ to _ shared _ local _ directory”以从位于 /home/jovyan/work/ 的容器中访问

运行完上述命令后,复制 jupyter 令牌并使用以下命令查看端口映射:

*****docker ps*****

打开您的浏览器访问上述端口,例如 localhost:32780,然后粘贴您的密钥来访问这个 Jupyter 环境。

注意:向映像添加软件意味着增加总的映像大小(显然是),所以在另一个映像上构建肯定会增加第一次运行的总下载大小。

模型选择的“简短”介绍

原文:https://towardsdatascience/a-short-introduction-to-model-selection-bb1bb9c73376?source=collection_archive---------4-----------------------

大数据和小数据下的超参数选择和算法选择综述

在这篇文章中,我将讨论构建好的(有监督的)机器学习模型的核心主题:模型选择。这并不是说模型选择是数据科学工作流程的核心,没有高质量的数据,模型构建就是一纸空文。然而,模型选择在建立良好的机器学习模型中起着至关重要的作用。

不同比例的模型选择

那么,模型选择是怎么回事呢?机器学习上下文中的模型选择可以具有不同的含义,对应于不同的抽象级别。

首先,我们可能有兴趣为选定的机器学习方法选择最佳的 超参数 。超参数是我们必须先验指定的学习方法本身的参数,即在模型拟合之前。相反, 模型参数 是作为拟合的结果而出现的参数[1]。例如,在逻辑回归模型中,正则化强度(以及正则化类型,如果有的话)是必须在拟合之前指定的超参数,而拟合模型的系数是模型参数。为模型找到正确的超参数对于模型在给定数据上的性能至关重要。

另一方面,我们可能希望从一组合格的机器学习方法中选择最佳的 学习方法 (以及它们相应的“最优”超参数)。在下文中,我们将此称为 算法选择 。对于手头的分类问题,我们可能想知道,例如,逻辑回归模型或随机森林分类器是否在给定的任务上产生最佳的分类性能。

“还有一件事”:模型评估

在深入研究模型选择的不同方法的细节以及何时使用它们之前,我们需要讨论“另一件事”: 模型评估 。模型评估旨在估计所选模型的泛化误差,即所选模型对未知数据的表现。显然,好的机器学习模型不仅对训练期间看到的数据表现良好(否则机器学习模型可以简单地记住训练数据),而且对看不见的数据也表现良好。因此,在将模型交付生产之前,我们应该相当确定模型的性能在面对新数据时不会降低。

但是 为什么 我们需要 模型选择和模型评估的区别吗? 原因是过拟合。如果我们用我们用来选择获胜模型的相同数据来估计我们选择的模型的泛化误差,我们将得到一个过于乐观的估计。为什么?
我们来做个思想实验。假设给你一组黑盒分类器,并指示你选择性能最好的分类器。所有的分类器都是无用的——它们输出 0 和 1 的(固定)序列。您评估了数据上的所有分类器,发现它们平均有 50%的正确率。偶然地,一个分类器在数据上比其他分类器表现得更好,比如说,差 8%。您将此性能作为分类器对未知数据的性能估计(即,作为泛化误差的估计)。你报告说你找到了一个比随机猜测更好的分类器。然而,如果你使用一个完全独立的测试集来估计泛化误差,你会很快发现这个骗局!为了避免这样的问题,我们需要完全独立的数据来估计模型的泛化误差。我们将在交叉验证的上下文中回到这一点。

如果数据不是问题

模型选择的推荐策略取决于可用的数据量。如果 有足够的数据 可用,我们可以将数据分成几个部分,每个部分服务于一个特殊的目的。例如,对于 超参数调整 ,我们可以将数据分成三组: 训练/验证/测试 。训练集用于训练与模型超参数的不同组合一样多的模型。然后在验证集上评估这些模型,并且在该验证集上具有最佳性能的模型被选为获胜模型。随后,使用选择的超参数集在训练+验证数据上重新训练该模型,并且使用测试集来估计泛化性能。如果这种泛化误差类似于验证误差,我们有理由相信该模型在看不见的数据上表现良好。最后,在将模型用于“生产”之前,我们根据完整数据(训练、验证&测试集)对其进行重新训练。
因为并非所有的数据都是平等的,所以没有关于数据应该如何分割的通用规则。典型的比例是 50%/25%/25%。无论如何,验证集应该足够大,以测量我们希望能够测量的性能差异:如果我们关心模型之间 0.1%的差异,我们的验证集必须不小于 1000 个样本,但 10000 个样本就足够了。

对于 算法选择 ,按照上面的推理,我们可以使用 几个训练/验证/测试集 ,每个算法一个三元组。由于这种方法对数据要求很高,我们将在下面讨论一种替代方法。

学习曲线,以及它们为什么有用

但是为什么要在模型选择/模型评估之后重新训练模型呢?答案最好用 学习曲线 来说明。在学习曲线中,模型在训练集和验证集上的性能被绘制为训练集大小的函数。 图 1 显示了一条典型的学习曲线:随着训练集规模的增大,训练得分(在训练集上的表现)降低,而验证得分同时增加。高训练分数和低验证分数同时指示模型过度拟合数据,即,对特定训练集样本适应得太好。随着训练集的增加,过度拟合会减少,验证分数会增加。
特别是对于数据饥渴的机器学习模型,在给定的训练集规模下,学习曲线可能尚未达到平稳状态,这意味着当向模型提供更多数据时,泛化误差可能仍会降低。因此,在估计测试集的泛化误差之前增加训练集(通过添加验证集)并在发布模型之前进一步利用测试集数据来拟合模型似乎是合理的。是否需要这种策略很大程度上取决于初始训练集大小的学习曲线的斜率。

Fig. 1: Example of a learning curve.

学习曲线进一步允许容易地说明(统计的) 偏差方差 的概念。在这种情况下,偏差是指错误的(例如,简化)模型假设,这可能导致模型对数据拟合不足。高偏差模型不能充分捕捉数据中存在的结构。另一方面,方差量化了当我们改变训练数据时模型变化的程度。高方差模型对训练数据的微小波动非常敏感,这会导致模型过度拟合。可以使用学习曲线来估计偏差和方差的量:如果训练分数稳定在高水平,而验证分数处于低水平,即,如果训练和验证分数之间存在大的差距,则模型表现出高方差,但是偏差低。相反,具有低方差但高偏差的模型是训练和验证分数都低但相似的模型。非常简单的模型是高偏差、低方差的,而随着模型复杂性的增加,它们变得低偏差、高方差。

模型复杂性的概念可用于创建有助于模型选择的度量。有一些措施明确处理拟合优度和模型简单性之间的这种权衡,例如*(AIC)和 贝叶斯信息标准 (BIC)。两者都惩罚模型参数的数量,但奖励训练集的拟合优度,因此最佳模型是具有最低 AIC/BIC 的模型。BIC 对模型复杂性的惩罚力度更大,因此更青睐“错误更多”但更简单的模型。虽然这允许在没有验证集的情况下进行模型选择,但它可以严格地仅应用于参数线性的模型,即使它通常也适用于更一般的情况,例如用于一般的线性模型,如逻辑回归。关于更详细的讨论,参见例如参考文献。[2,3].*

分而治之——但是要小心

贯穿以上讨论,我们隐含地假设训练、确认和测试集是从同一分布 中采样的 。如果不是这样,所有的估计都将是完全错误的。这就是为什么在建立模型之前必须确保数据的分布不受数据分区的影响。例如,假设您正在处理不平衡的数据,例如,一个二元目标的数据集只有 10%的情况是肯定的。例如,按照 50%/25%/25%的比例将数据随机分为训练/验证/测试集可能会导致 5%的阳性案例分布在训练集中,15%的阳性案例分布在验证测试集中&,这可能会严重影响算法性能估计。在这种情况下,您可能希望使用(如果您的学习方法需要,可能与过采样或欠采样技术相结合)进行划分。**

最后提醒一句:当处理任务是进行预测的时间序列数据时,必须通过沿着时间轴 拆分 数据来选择训练、验证和测试集。也就是说,“最老的”数据用于训练,最近的数据用于验证,最近的数据用于测试。随机抽样在这种情况下没有意义。****

如果你只有少量数据

但是如果我们只有小数据呢?这种情况下我们怎么做选型评估?模型评估不会改变。我们仍然需要一个测试集来估计最终选择的模型的泛化误差。因此,我们将数据分成两组,一组训练集和一组测试集。与之前的过程相比,我们使用训练集的方式发生了变化。

鱼与熊掌兼得:超参数选择的交叉验证

对于 超参数选择 ,我们可以使用K*-折叠 交叉验证 (CV)。交叉验证的工作方式如下:*

  1. 我们将训练集分成 K 个更小的集合。注意,关于不平衡数据的警告在这里也适用。
  2. 我们将每个 K 折痕留出一次,如图 图 2 所示。我们在剩余的 K-1 折叠上训练与模型超参数的不同组合一样多的模型,并计算保留折叠上的验证分数。
  3. 对于每组超参数,我们计算平均验证分数,并选择在保留验证集上具有最佳性能的超参数集。或者,我们可以应用“一个标准误差规则”[2],这意味着我们选择最节省的模型(具有最低复杂性的模型),其性能不超过最佳性能模型的标准误差。

随后,我们在全训练集上用选择的超参数集训练模型,并使用测试集估计泛化误差。最后,我们使用训练集和测试集的组合数据重新训练模型。

Fig. 2: Illustration of 5-fold cross-validation.

我们应该做多少次分裂,也就是说,我们应该如何选择 K ?不幸的是,没有免费的午餐,也就是说,没有一个答案总是最好的。如果我们选择 K=N 其中 N 是训练样本的数量,我们处理的是一种叫做 留一交叉验证 (LOOCV)的方法。这里的优点是,由于我们总是使用几乎全部数据进行训练,因此估计的预测性能是近似无偏的,这意味着预测误差的期望值和“真实”预测误差之间的差异非常小。然而,缺点是 LOOCV 的计算量很大,并且方差可能很高,这意味着我们的预测性能估计值可能会在其“真实”值附近剧烈波动。相比之下,如果我们选择 K=5K=10 ,我们预测性能估计的方差较低,但我们的估计可能过于悲观,因为我们仅使用 80–90%的可用数据进行训练(参见上面对学习曲线的讨论)。尽管如此,作为经验法则,推荐 10 倍(或 5 倍)CV[2]。

matryoshka 内部:算法选择的嵌套交叉验证

对于 算法选择 我们需要一个更精细的方法。这里, 嵌套交叉验证 就来帮忙了,如图 图 3 所示,工作原理如下:

  1. 我们将数据分成 K 个更小的集合(外层折叠)。
  2. 每一个 K 折叠我们留出一次。对于每种学习方法,我们然后在剩余的 K-1 折叠上执行K’-折叠 CV(按照上面的程序),其中我们做超参数选择。为简便起见,将具有 K 外折叠和K’内折叠的嵌套 CV 称为KxK’嵌套 CV。 KxK’ 的典型值为 5x25x3
  3. 我们使用每个算法的最佳超参数集来估计其在保留折叠上的验证分数。
  4. 然后,我们计算在 K 折叠上的平均验证分数(以及标准偏差),并选择最佳执行算法
    。随后,我们使用完整训练集选择基于 CV 的最佳超参数集,并使用测试集估计泛化误差。

最后,我们使用训练集和测试集的组合数据重新训练模型。

Fig. 3: Illustration of 5x2 nested cross-validation.

嵌套交叉验证的复杂业务

如果我们 不使用在嵌套 CV 程序的内循环 中找到的“最佳”超参数,为什么我们 还要选择超参数?原因是在算法选择中,我们并不是真的对为特定数据样本(我们的训练集)找到最佳算法&对应的超参数集感兴趣。我们更希望算法能够很好地推广,并且如果我们使用稍微不同的数据进行训练,它不会从根本上改变[4]。我们想要一个稳定的算法,因为如果我们的算法不稳定,泛化估计是无用的,因为我们不知道如果算法遇到训练集中的不同数据点会发生什么。因此,如果在内部循环中发现的超参数是不同的,只要在保持集上的相应性能估计是相似的,我们就没有问题。如果它们是,那么不同的超参数很可能导致相似的模型,并且在完整的训练数据上训练算法将再次产生相似的(尽管希望略有改进)模型。

特征选择等预处理 呢?根据经验,监督预处理(包括数据标签)应该在(内部)CV 循环内完成[2]。相比之下,无监督的预处理,如缩放,可以在交叉验证之前完成。如果我们忽略这个建议,我们可能会得到一个过于乐观的性能估计,因为在所有训练数据的基础上选择了相关特征之后,为了验证的目的而搁置数据会在训练和验证之间引入依赖性。这与独立性的假设相矛盾,当我们使用数据进行验证时,独立性是隐含的。然而,通过在内部 CV 循环中进行预处理(如特征选择),我们可能会得到一个悲观的性能估计,因为预处理过程可能会在使用更多数据时得到改善。

当散文不够的时候

如果您想知道如何使用代码 实现这种略微繁琐的嵌套交叉验证过程 ,您可以在这里找到一个 示例(python jupyter notebook with scikit-learn)。

虽然到目前为止还不全面,但这篇文章涵盖了许多关于模型选择的重要概念和“最佳实践”。关于这个主题还有更多要说的,特别是关于模型选择的统计测试和用于估计性能估计的不确定性的基于采样的方法(例如 bootstrapping)。如果这篇文章只是让你开始,请参考参考文献。【1-3】供进一步阅读。

参考

[1] 机器学习中的模型评估、模型选择和算法选择Sebastian rasch ka。

[2] Hastie T .、Tibshirani R .和 Friedman J,《统计学习的要素》,美国纽约州纽约市:斯普林格纽约公司(2008 年)。

[3]Neptune . ai 博客上的机器学习中模型评估和选择的终极指南。

[4]参见 Stackexchange 讨论此处,此处此处,此处此处。

Python 中的自然语言处理简介

原文:https://towardsdatascience/a-short-introduction-to-nlp-in-python-with-spacy-d0aa819af3ad?source=collection_archive---------2-----------------------

自然语言处理(NLP)是数据科学最有趣的子领域之一,人们越来越期望数据科学家能够迅速找到涉及利用非结构化文本数据的解决方案。尽管如此,许多应用数据科学家(STEM 和社会科学背景)缺乏 NLP 经验。

在这篇文章中,我将探索一些基本的 NLP 概念,并展示如何使用 Python 中越来越流行的 spaCy 包来实现它们。这篇文章是为绝对的 NLP 初学者写的,但是需要具备 Python 知识。

你说是 spaCy?

spaCy 是 Matt Honnibal 在 Explosion AI 开发的“Python 中的工业强度 NLP”的一个相对较新的包。它的设计考虑到了应用数据科学家,这意味着它不会让用户在决定使用什么深奥的算法来执行常见任务时感到沉重,而且它的速度很快。非常快(在 Cython 中实现)。如果你熟悉 Python 数据科学栈,spaCy 就是你的 NLP 的numpy——它相当低级,但是非常直观和高性能。

那么,它能做什么呢?

spacy 为任何 NLP 项目中常用的任务提供一站式服务,包括:

  • 符号化
  • 引理满足
  • 词性标注
  • 实体识别
  • 依存句法分析
  • 句子识别
  • 单词到向量的转换
  • 许多方便的方法来清理和规范文本

我将提供其中一些特性的高级概述,并展示如何使用 spaCy 访问它们。

我们开始吧!

首先,我们加载 spaCy 的管道,按照惯例,它存储在一个名为nlp的变量中。声明这个变量需要几秒钟的时间,因为 spaCy 会预先加载它的模型和数据,以便以后节省时间。实际上,这很早就完成了一些繁重的工作,这样就不会在每次对数据应用nlp解析器时产生成本。请注意,这里我使用的是英语语言模型,但也有一个全功能的德语模型,跨几种语言实现了标记化(下面讨论)。

我们对样本文本调用 nlp 来创建一个Doc对象。Doc对象现在是文本本身、文本片段(Span对象)和文本元素(Token对象)的 NLP 任务的容器。值得注意的是,TokenSpan对象实际上没有数据。相反,它们包含指向包含在Doc对象中的数据的指针,并且被延迟评估(即,根据请求)。spaCy 的许多核心功能都是通过对Doc (n=33)、Span (n=29)和Token (n=78)对象的方法来访问的。

In[1]: import spacy 
...: nlp = spacy.load("en") 
...: doc = nlp("The big grey dog ate all of the chocolate, but fortunately he wasn't sick!")

标记化

标记化是许多 NLP 任务中的基础步骤。将文本标记化是将一段文本拆分成单词、符号、标点、空格和其他元素,从而创建“标记”的过程。一种简单的方法是在空格处拆分字符串:

In[2]: doc.text.split() 
...: Out[2]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate,', 'but', 'fortunately', 'he', "wasn't", 'sick!']

表面上,这看起来很好。但是,注意a)它忽略了标点符号,b)它没有拆分动词和副词(“was”、“n t”)。换句话说,它是幼稚的,它无法识别文本中帮助我们(和机器)理解其结构和意义的元素。让我们看看 SpaCy 是如何处理的:

In[3]: [token.orth_ for token in doc] 
...: Out[3]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', ',', 'but', 'fortunately', 'he', 'was', "n't", ' ', 'sick', '!']

这里我们访问 each token 的.orth_方法,该方法返回 token 的字符串表示而不是 SpaCy token 对象,这可能并不总是可取的,但值得注意。SpaCy 识别标点符号,并能够将这些标点符号从单词符号中分离出来。SpaCy 许多标记方法提供了处理文本的字符串和整数表示——带下划线后缀的方法返回字符串,不带下划线后缀的方法返回整数。例如:

In[4]: [(token, token.orth_, token.orth) for token in doc] 
...: Out[4]: [
(The, 'The', 517), 
(big, 'big', 742), 
(grey, 'grey', 4623), 
(dog, 'dog', 1175), 
(ate, 'ate', 3469), 
(all, 'all', 516), 
(of, 'of', 471), 
(the, 'the', 466), 
(chocolate, 'chocolate', 3593), 
(,, ',', 416), 
(but, 'but', 494), 
(fortunately, 'fortunately', 15520),
 (he, 'he', 514),
 (was, 'was', 491),
 (n't, "n't", 479),
 ( , ' ', 483), 
(sick, 'sick', 1698), 
(!, '!', 495)]

这里,我们在一个元组列表中返回 SpaCy 令牌、令牌的字符串表示和令牌的整数表示。

如果您希望避免返回标点符号或空白符号,SpaCy 为此提供了便利方法(以及许多其他常见的文本清理任务)—例如,要删除停用词,您可以调用.is_stop方法。

In[5]: [token.orth_ for token in doc if not token.is_punct | token.is_space] 
...: Out[5]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', 'but', 'fortunately', 'he', 'was', "n't", 'sick']

很酷,对吧?

词汇化

与记号化相关的一个任务是引理满足。引理满足是将一个词简化为其基本形式的过程,如果你愿意,可以称之为其母词。一个词的不同用法往往有相同的词根意义。例如,practice, practised and practising本质上都是指同一个东西。人们常常希望将词义与其基本形式相似的词标准化。通过 SpaCy,我们可以用一个令牌的.lemma_方法访问每个单词的基本形式:

In[6]: practice = "practice practiced practicing" 
...: nlp_practice = nlp(practice) 
...: [word.lemma_ for word in nlp_practice] 
...: Out[6]: ['practice', 'practice', 'practice']

这为什么有用?一个直接的用例是机器学习,特别是文本分类。例如,在创建“单词包”之前对文本进行词条匹配可以避免单词重复,因此,允许模型建立跨多个文档的单词使用模式的更清晰的图像。

位置标记

词性标注是分配语法属性(如名词、动词、副词、形容词等)的过程。)到话。共享相同 POS 标签的单词倾向于遵循相似的句法结构,并且在基于规则的过程中是有用的。

例如,在一个事件的给定描述中,我们可能希望确定谁拥有什么。通过利用所有格,我们可以做到这一点(前提是文本语法正确!).SpaCy 使用了流行的 Penn Treebank POS 标签,参见https://www . ling . upenn . edu/courses/Fall _ 2003/ling 001/Penn _ tree bank _ POS . html。使用 SpaCy,您可以分别使用.pos_.tag_方法访问粗粒度和细粒度的 POS 标签。在这里,我访问细粒度的 POS 标记:

In[7]: doc2 = nlp("Conor's dog's toy was hidden under the man's sofa in the woman's house") 
...: 
pos_tags = [(i, i.tag_) for i in doc2] ...: 
pos_tags 
...: Out[7]: [(Conor, 'NNP'), ('s, 'POS'), (dog, 'NN'), ('s, 'POS'), (toy, 'NN'), (was, 'VBD'), (hidden, 'VBN'), (under, 'IN'), (the, 'DT'), (man, 'NN'), ('s, 'POS'), (sofa, 'NN'), (in, 'IN'), (the, 'DT'), (woman, 'NN'), ('s, 'POS'), (house, 'NN')]

我们可以看到“’s令牌被标记为POS。我们可以利用这个标签来提取所有者和他们所拥有的东西:

In[8]: owners_possessions = [] 
...: for i in pos_tags: 
    ...: if i[1] == "POS": ...: owner = i[0].nbor(-1) 
...:         possession = i[0].nbor(1) 
...:         owners_possessions.append((owner, possession)) ...: ...:         owners_possessions 
...: Out[8]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

这将返回所有者拥有元组的列表。如果你想在这方面表现得更好,你可以在一个清单 comprehenion 中这样做(我认为这样更好!):

In[9]: [(i[0].nbor(-1), i[0].nbor(+1)) for i in pos_tags if i[1] == "POS"] 
...: Out[9]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

这里我们使用每个令牌的.nbor方法,它返回一个令牌的相邻令牌。

实体识别

实体识别是将在文本中发现的命名实体分类到预定义的类别中的过程,例如人、地点、组织、日期等。spaCy 使用一种统计模型来对广泛的实体进行分类,包括人、事件、艺术品和国籍/宗教(完整列表请参见文档https://spaCy . io/docs/usage/entity-recognition)。.)

例如,让我们从巴拉克·奥巴马的维基百科条目中选取前两句话。我们将解析这个文本,然后使用Doc对象的.ents方法访问标识的实体。通过在Doc上调用这个方法,我们可以访问额外的Token方法,特别是.label_.label:

In[10]: wiki_obama = """Barack Obama is an American politician who served as ...: the 44th President of the United States from 2009 to 2017\. He is the first ...: African American to have served as president, ...: as well as the first born outside the contiguous United States.""" 
...: 
...: nlp_obama = nlp(wiki_obama) ...: [(i, i.label_, i.label) for i in nlp_obama.ents] 
...: Out[10]: [(Barack Obama, 'PERSON', 346), (American, 'NORP', 347), (the United States, 'GPE', 350), (2009 to 2017, 'DATE', 356), (first, 'ORDINAL', 361), (African, 'NORP', 347), (American, 'NORP', 347), (first, 'ORDINAL', 361), (United States, 'GPE', 350)]

您可以看到模型已经识别的实体,以及它们有多准确(在本例中)。人是不言自明的,NORP 是国家或宗教团体,GPE 识别地点(城市,国家等)。),DATE 表示特定的日期或日期范围,ORDINAL 表示代表某种顺序的单词或数字。

在我们讨论Doc方法的时候,有必要提一下 spaCy 的句子标识符。在 NLP 任务中,想要将文档分割成句子并不罕见。通过访问一个Doc's .sents方法,使用 SpaCy 很容易做到这一点:

In[11]: for ix, sent in enumerate(nlp_obama.sents, 1): 
...: print("Sentence number {}: {}".format(ix, sent)) 
...: 
Sentence number 1: Barack Obama is an American politician who served as the 44th President of the United States from 2009 to 2017\. Sentence number 2: He is the first African American to have served as president, as well as the first born outside the contiguous United States.

原载于 2017 年 3 月 17 日 dataflume.wordpress

一个简短实用的使用 Python 从网站上抓取数据的指南

原文:https://towardsdatascience/a-short-practical-how-to-guide-to-scrape-data-from-a-website-using-python-888373227d4f?source=collection_archive---------0-----------------------

读者注意:Python 代码在最后被共享

这个星期我不得不为一个客户刮一个网站。我意识到我做得如此自然和迅速,分享它会很有用,这样你也可以掌握这门艺术。【免责声明:本文展示了我的刮痧实践,如果你有更多相关实践请在评论中分享】

这个计划

  1. 确定你的目标:一个简单的 html 网站
  2. 用 Python 设计你的抓取方案
  3. 奔跑&让魔法发挥作用

How much time do you need to scrape a website? A practitioner would take ~10 minutes to prepare the Python script for a simple html website

第一部分:找到你的目标(一个网站)

在我的例子中,我需要从 SWIFT 代码(或法国 BIC 代码)中收集银行的名称。)http://bank-code/country/FRANCE-%28FR%29.html网站有 4000 多个 SWIFT 代码和相关银行名称的列表。问题是他们每页只显示 15 个结果。浏览所有页面并一次复制粘贴 15 个结果是不可行的。刮擦对于这项任务来说很方便。

首先,使用 Chrome 的“inspect”选项来识别你需要获取的 html 部分。将鼠标移动到检查窗口(右侧)中的不同项目上,并跟踪代码突出显示的网站部分(左侧)。选择项目后,在检查窗口中,使用“复制/复制元素”并将 html 代码粘贴到 python 编码工具中。

On the right side is the Google Chrome’s “inspection window” you get when using right click / Inspect

在我的例子中,具有 15 个 SWIFT 代码的所需项目是一个“表”

第二部分:用 Python 设计你的抓取方案

a)刮去第一页

就这样,3 行代码,Python 就收到了网页。现在您需要正确解析 html 并检索所需的项目。

记住所需的 html:

它是一个“”元素,id 为“表 ID ”。它有一个 id 属性这一事实很棒,因为这个网页上没有其他 html 元素可以有这个 id。这意味着,如果我在 html 中查找这个 id,除了所需的元素之外,我找不到其他任何东西。它节省时间。

让我们用 Python 正确地做这件事

所以现在我们已经得到了想要的 html 元素。但是我们仍然需要获取 html 中的 SWIFT 代码,然后将其存储在 Python 中。我选择把它储存在熊猫体内。DataFrame 对象,但也可以仅使用列表列表。

要做到这一点,回到 Chrome 检查窗口,分析 html 树的结构,并注意到你必须去的元素。在我的例子中,所需的数据在“tbody”元素中。每个银行及其 SWIFT 代码包含在一个“tr”元素中,每个“tr”元素有多个“td”元素。“td”元素包含了我正在寻找的数据。

The html tree can be described as follows: table, tbody, tr, td

我用下面的代码做了一行:

b)准备自动化

现在我们已经抓取了第一个网页,我们需要思考如何抓取我们还没有看到的新网页。我的做法是复制人类行为:存储一页的结果,然后转到下一页。现在让我们专注于进入下一个网页。

页面底部有一个菜单,允许您进入 swift 代码表的特定页面。让我们检查一下检查器窗口中的“下一页”按钮。

The “>” symbol will lead us to the next page

这给出了以下 html 元素:

现在用 Python 获取 url 很简单:

我们就快到了。
到目前为止,我们已经:
-开发了一个页面的表格的抓取
-识别了下一个页面的 url 链接

我们只需要做一个循环,然后运行代码。我推荐以下两个最佳实践:

1.当你登陆一个新的网页时打印出来:了解你的代码处于进程的哪个阶段(抓取代码可能要运行几个小时)

2.定期保存结果:避免在出错时丢失所有刮到的数据

只要我不知道什么时候停止抓取,我就用惯用的“ while True: 语法进行循环。我打印出每一步的计数器值。我还将每个步骤的结果保存在一个 csv 文件中。这实际上会浪费时间,例如,更好的方法是每 10 或 20 步存储一次数据。但是我选择了快速实现。

代码是这样的:

完整代码(只有 26 行)可以在这里找到:https://github . com/Felix shop/mediu articles/blob/master/Scraping _ SWIFT _ codes _ Bank _ names . py

如果你喜欢这篇文章,考虑发送至少 50 个掌声:)

本文标签: 中文翻译博客TowardsDataScience十七