TowardsDataScience 博客中文翻译 2020(三百一十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用半空间树检测数据流中的异常

原文:https://towardsdatascience.com/detecting-anomalies-in-data-streams-2daedbdaa436?source=collection_archive---------29-----------------------

scikit-multiflow 简介和一种有前途的异常检测技术。

如今,许多领域都可以访问连续的数据流。如果没有一定程度的自动化,个人或团队通常很难管理这些信息。在展示流学习领域中一些令人兴奋的新发展之前,我想先从几个定义开始。

数据流: 一个近乎连续的数据源。例如传感器数据或遥测数据。

流学习: 机器学习的子领域专注于开发专门从数据流中学习的技术。

既然我们在同一页上,我想介绍一下工具包!我将使用新的(ish) python 库 scikit-multiflow

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

连续数据流正迅速成为许多机器学习应用的标准。像 scikit-multiflow 这样的专用库为流式数据提供了一个熟悉的用户界面。图片来自 Unsplash (Joshua Sortino)

为了这篇短文的目的,我将使用 skmultiflow 的内置数据生成器来创建数据流。

这里我使用 AnomalySineGenerator 类来生成一个包含异常点的数据集。

stream = AnomalySineGenerator(n_samples=1000, n_anomalies=250)

该发生器对正弦和余弦函数进行随机采样,以生成应在给定范围±一些噪声内的数据。

为了让大家了解数据集的样子,我在下面用橙色突出显示了异常情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成的数据集的绘图。异常点用橙色突出显示。图片作者。

现在,我们可以使用 skmultiflow 的流式半空间树异常检测器,并评估它在我们的数据集中检测异常的能力。

half_space_trees = HalfSpaceTrees()

在[ 1 中介绍了 skmultiflow 中使用的 HS-Tree 异常检测技术。尽管将 HS-Trees 与流数据耦合起来并不简单,但从概念上讲,该算法以一种简单的方式工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 HS-Trees 进行数据分区的示例(图片来自[ 1 ])

每个 HS-Tree 将数据空间划分成几个窗口,并根据每个窗口中的数据点数量进行预测。对于异常检测,大多数点应该落在相同的窗口内,那些不在窗口内的点被预测为异常。当然,在现实中,该算法是一种集成算法,这意味着生成许多 HS-树,并且预测是这些树的多数投票。

既然我们对算法的作用有了更好的了解,我们可以继续进行预测。在下面的代码中,我们遍历流并进行预测,同时通过对每个新样本调用 partial_fit()来不断更新模型。

max_samples = 1000
n_samples = 0
true_positives = 0
detected_anomalies = 0
preds = []
target = []stream.restart()
while n_samples < max_samples and stream.has_more_samples():
    X, y = stream.next_sample()
    target.append(y[0])
    y_pred = half_space_trees.predict(X)
    preds.append(y_pred)
    if y[0] == 1:
        true_positives += 1
        if y_pred[0] == 1:
            detected_anomalies += 1
    half_space_trees.partial_fit(X, y)
    n_samples += 1

最终,流学习算法正确地预测了它负责识别的 221 个异常中的 165 个!

检查这些预测,很明显这个模型忽略了数据流早期的异常。这很直观,因为 it 没有太多时间来了解数据的底层分布。此外,在这种特定情况下,“异常数据”占整个数据集的很大一部分,这可能使决策树在早期面临挑战。

好吧,我希望你们都喜欢学习一些关于流学习的知识!Scikit-Multiflow 拥有一个充满活力的开发人员社区,非常受欢迎。如果你正在寻找一个好的开源项目,我强烈建议你参与!

参考文献:

[ 1 ] S.C.Tan,K.M.Ting,和 T.F.Liu,“流数据的快速异常检测”,载于 ij Cai Proceedings-International Joint Conference on Artificial Intelligence,2011,vol. 22,no. 1,PP . 1511–1516。

用计算机视觉检测儿童孤独症谱系障碍

原文:https://towardsdatascience.com/detecting-autism-spectrum-disorder-in-children-with-computer-vision-8abd7fc9b40a?source=collection_archive---------25-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

凯利·西克玛在 Unsplash 上的照片

调整面部识别模型以检测自闭症谱系障碍

计算机视觉(CV)已经帮助医疗领域诊断骨折血栓,甚至癌瘤。它还可以用来帮助专家诊断自闭症。

自闭症谱系障碍(ASD) 是一种神经和发育障碍,始于儿童早期,持续人的一生。专家认为,患有 ASD 的人有独特的面部特征,这可以用来帮助诊断他们的 ASD ,甚至与 ASD 的严重程度相关。这种相关性可用于训练 CV 模型,以使用那些独特的面部特征来检测 ASD。

目标是提供一个免费的初步诊断工具,可以帮助父母决定进行进一步的 ASD 测试。对于具有重大现实影响的模型来说,负责任地表示它们的结果并使用贝叶斯统计来解释它们的意义是很重要的。

为什么这很重要

大约 25% 的自闭症儿童未被确诊。诊断自闭症是一个复杂的 T21 和昂贵的过程,不是每个家庭都能经历的。让合适的孩子去看合适的专家对于减少未确诊儿童的数量和家庭负担至关重要。

我想强调的是,我的目标不是诊断 ASD。相反,我想利用 CV 的力量和贝叶斯统计的基本原理来帮助父母决定他们是否应该带他们的孩子去看自闭症专家。

履行

所有的代码都可以在 GitHub 上获得,数据可以在 Kaggle 上获得。

[## mm 909/ka ggle-自闭症

用计算机视觉检测儿童自闭症谱系障碍——采用面部识别模型检测…

github.com](https://github.com/mm909/Kaggle-Autism) [## 自闭症儿童数据集

训练模型以从面部图像中检测儿童自闭症的数据集

www.kaggle.com](https://www.kaggle.com/gpiosenka/autistic-children-data-set-traintestvalidate/version/5)

数据

Kaggle 数据集的第 5 版有 2940 幅图像,平均分为两类:自闭症和非自闭症。这些图像大小不一,但已经被裁剪成只显示孩子的脸。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Kaggle,自闭症儿童数据集 v5

年龄

该数据集的年龄分布大约为 2 岁到 14 岁,但大多数照片来自 2 岁到 8 岁的儿童。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Kaggle,自闭症儿童数据集 v5

性别

性别比例接近各自人口。男性被诊断为自闭症的人数是女性的 3 倍。因此,自闭症班级中男女比例接近 3:1。在非自闭症班级中,这一比例更接近 1:1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Kaggle,自闭症儿童数据集 v5

人种

白人儿童与有色人种儿童的比例是 10:1。这和美国的真实分布接近 7:1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Kaggle,自闭症儿童数据集 v5

模型

该模型将基于 VGG 人脸牛津深度面部识别模型。****

迁移学习

为了提取检测自闭症所需的面部特征,新模型将使用与 VGG 人脸相同的架构和权重。这是特征表征迁移学习的一个例子。当源域和目标域寻找相似的特征,但基于这些特征做出不同的推断时,使用这种类型的迁移学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征-表征迁移学习,来源:作者与 Lucidchart

牛津模型被训练来识别潜在的面部特征,以识别独特的面孔。新模型还想识别潜在的面部特征,但要检测自闭症。

结果

尽管在训练过程中使用准确性来衡量模型性能,但对于贝叶斯预测来说,灵敏度和特异性是更重要的考虑因素。

学习曲线

该模型在 44 个时期后在验证集上达到 85%的准确度。该模型在纪元 60 左右开始过度拟合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最佳模型的学习曲线,来源:作者

混淆矩阵

编辑 2020 年 8 月:此表有误。假阴性应该有假阳性值,假阳性应该有假阴性值。接下来的一切仍然是正确的信息,但数字不正确。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最佳模型的混淆矩阵,来源:作者

灵敏度和特异性

灵敏度和特异性用于量化模型预测假阴性和假阳性的频率。

敏感性是真正的阳性率。它衡量一个积极的预测正确的频率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者用代码编码

特异性是真正的阴性率。它衡量一个负面预测正确的频率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者用代码编码

该模型实现了 76%的灵敏度和 85%的特异性。

影响:贝叶斯规则

贝叶斯规则对于理解任何机器学习(ML)模型产生的结果都是至关重要的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯法则,来源挪威创造

模型可能是错误的

重要的是要记住模型是会出错的。模型的正面结果并不意味着现实世界的正面结果。相反,这个新的信息,就像一个积极的预测,应该用来更新我们之前对该事件的了解。

贝叶斯计算

随机选择的男性患自闭症的概率非常低,约为 2.7%。这是男性在知道任何其他信息之前患有自闭症的概率。因此,它被称为先验概率。

模型预测提供了新的信息,在做出决策时,应结合现有知识考虑这些信息。

贝叶斯定理可用于量化这种新信息对先验概率的影响程度。这个更新的概率称为后验概率。

利用模型的敏感性和特异性,可以计算出阳性预测的后验概率。对于男性来说,阳性结果会使患自闭症的概率从 2.70%增加到 12.34%。对于女性,概率从 0.66%增加到 3.27%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯规则的结果,来源:作者

限制

真实地展示模型的不足之处,可以让开源软件做出更好的贡献,也可以让数据科学整体变得更好。

一如既往:更好的数据,更好的模型。

年龄

这个模型是在 2 岁到 8 岁的儿童图像上训练的。因此,在该范围之外对儿童进行测试将给出不太准确的结果。

人种

白人儿童与有色人种儿童的比例是 10:1。缺乏有色人种儿童的训练数据意味着结果对他们来说不太准确。

结论

诊断自闭症是一个困难且昂贵的过程。幸运的是,面部特征和自闭症之间的相关性意味着可以训练一个 CV 模型来检测它。使用贝叶斯统计,可以负责任地报告该模型的结果,父母可以对孩子的健康做出更明智的决定。

项目存储库

** [## mm 909/ka ggle-自闭症

用计算机视觉检测儿童孤独症谱系障碍——采用面部识别模型检测

github.com](https://github.com/mm909/Kaggle-Autism)**

用贝叶斯模型检测新冠肺炎病例的变化

原文:https://towardsdatascience.com/detecting-changes-in-covid-19-cases-with-bayesian-models-1b628214e8b1?source=collection_archive---------30-----------------------

贝叶斯变点模型,以估计不同国家的新新冠肺炎病例数开始变平的日期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弗洛里安·奥利佛在 Unsplash 上拍摄的照片

问题

当前全球疫情及其相关资源(数据、分析等)。),一段时间以来,我一直试图提出一个有趣的新冠肺炎问题,用统计数据来攻击。在查看了一些县的确诊病例数后,很明显在某个日期,新增病例数不再呈指数增长,其分布也发生了变化。然而,这个日期对每个国家来说是不同的(很明显)。这篇文章介绍并讨论了一个贝叶斯模型,用于估计特定国家新新冠肺炎病例分布变化的日期。模型系数是可解释的,可用于未来分析不同国家采取的社会距离措施的有效性。

在我们深入研究之前,有一个重要的提醒是,所有的模型都是错误的,但有些是有用的。这个模型对于估计变革的日期是有用的,但对于预测新冠肺炎将会发生什么是没用的。它不应该被误认为是一个惊人的流行病学模型,它会告诉我们隔离何时结束,而是一种用概率分布描述我们已经观察到的情况的方式。

这篇文章的所有代码可以在这里找到,你可以在这里阅读这篇文章的原始版本。

模型

我们想要描述 y ,特定国家每天新增新冠肺炎病例数的对数,作为 t 的函数,即该病毒在该国开始传播的天数。我们将使用分段回归模型来实现这一点。we 分段的点将由学习参数τ确定,如下所述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

换句话说, y 将被建模为 w ₁ + b ₁,直到第τ天。在那之后,它将被模仿成₂+₂.

这个模型是用 Pyro 编写的,这是一种基于 PyTorch 的概率编程语言。这篇文章中包含了大量代码,但是大部分代码都在的笔记本中。

数据

使用的数据是从 Kaggle 下载的。我们掌握的是每个国家每日确诊病例的数量,下图显示了意大利的这一数据。很明显,在如何报告数据方面存在一些不一致,例如,在意大利,3 月 12 日没有新增确诊病例,但 3 月 13 日的预期病例增加了近一倍。在这种情况下,数据被分成两天。

这种病毒在不同的国家不同的时间开始传播。因为我们有一个回归模型,所以在病毒出现在某个特定国家之前包含数据是不合适的。这一日期是根据新病例的进展情况为每个国家人工选择的,决不是记录第一个患者的日期。“开始”日期最好解释为病毒开始持续增长的日期,而不是记录患者 0 的日期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

先前规格

病毒的增长对各个国家的人口动态很敏感,而我们可用的数据量有限,因此事先说明在这里非常重要。

w ₁和 w ₂开始,这些参数可以大致解释为日期变更前后病毒的增长率。我们知道,增长在开始时将是正的,不可能大于 1(毕竟, w ₁是一个梯度)。有了这些假设, w ₁ ~ N(0.5,0.25)是一个合适的先验。我们将对 p(w ₂ ) 使用类似的逻辑,但是要记住灵活性。如果没有足够灵活的先验,在数据中没有真正的变化点的情况下,模型不会做得很好。在这些情况下, w ₂ ≈ w ₁,我们将在结果部分看到这个例子。现在,我们希望 p(w) 关于 0 对称,大多数值位于(-0.5,0.5)之间。我们将使用 w ₂ ~ N(0,0.25)。

接下来是偏向项, b ₁和 b ₂.这些参数的先验对国家特征特别敏感。新冠肺炎暴露程度较高的国家(无论出于何种原因)在高峰期的确诊病例将多于暴露程度较低的国家。这将直接影响 b ₂的后验分布(这是第二次回归的偏差项)。为了使该参数自动适应不同的国家,我们分别使用 y 的第一个和第四个四分位数的平均值作为 b ₁和 b ₂ 的先验平均值。 b ₁的标准差取为 1,这使得 p(b) 成为一个相对平坦的先验。将 p(b) 的标准差取为其先验均值的四分之一,这样先验均值越大。

至于τ,由于此时我们无法访问所有数据(病毒正在传播),我们无法获得完全平坦的先验并让模型对其进行估计。相反,假设变化更可能发生在手头日期范围的后半部分,因此我们使用τ ~ Beta(4,3)。

下面是用 Pyro 写的模型。

class COVID_change(PyroModule):
    def __init__(self, in_features, out_features, b1_mu, b2_mu):
        super().__init__()
        self.linear1 = PyroModule[nn.Linear](in_features, out_features, bias = False)
        self.linear1.weight = PyroSample(dist.Normal(0.5, 0.25).expand([1, 1]).to_event(1))
        self.linear1.bias = PyroSample(dist.Normal(b1_mu, 1.))
        self.linear2 = PyroModule[nn.Linear](in_features, out_features, bias = False)
        self.linear2.weight = PyroSample(dist.Normal(0., 0.25).expand([1, 1])) #.to_event(1))
        self.linear2.bias = PyroSample(dist.Normal(b2_mu, b2_mu/4)) def forward(self, x, y=None):
        tau = pyro.sample(“tau”, dist.Beta(4, 3))
        sigma = pyro.sample(“sigma”, dist.Uniform(0., 3.))
        # fit lm’s to data based on tau
        sep = int(np.ceil(tau.detach().numpy() * len(x)))
        mean1 = self.linear1(x[:sep]).squeeze(-1)
        mean2 = self.linear2(x[sep:]).squeeze(-1)
        mean = torch.cat((mean1, mean2))
        obs = pyro.sample(“obs”, dist.Normal(mean, sigma), obs=y)
        return mean

哈密顿蒙特卡罗用于后验采样。这方面的代码如下所示。

model = COVID_change(1, 1,
                     b1_mu = bias_1_mean,
                     b2_mu = bias_2_mean)num_samples = 800
# mcmc
nuts_kernel = NUTS(model)
mcmc = MCMC(nuts_kernel,
            num_samples=num_samples,
            warmup_steps = 100,
            num_chains = 4)
mcmc.run(x_data, y_data)
samples = mcmc.get_samples()

结果

因为我住在加拿大,接触到预防措施开始的日期,所以建模将从这里开始。我们将 2 月 27 日作为病毒“开始”的日期。

前科:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后验分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从₁的 w 和₂的 w 的后验概率开始,如果数据没有变化,我们预计会看到这两个分布彼此接近,因为它们控制着病毒的增长率。这些分布以及₁和₂的后验概率没有重叠,这是一个好现象。这证明了我们的模型估计的变化点是真实的。

这个变化点估计为:2020–03–28

作为补充说明(警告:不科学)我的公司在 3 月 16 日发布了一项在家工作的强制性政策。大约在这一天,多伦多的大多数公司都会发布强制性在家工作政策。假设报告的病毒潜伏期长达 14 天,这一估计日期的变化是合理的,因为它是在广泛的社会距离措施开始后的 12 天!

在下图中可以看到模型拟合以及 90%可信区间带。左边是每日案例数的日志,这是我们用来拟合模型的,右边是每日案例的真实数量。单纯看日例数很难直观确定一个变化点,看确诊总例数更难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评估趋同

运行这些实验时,最重要的步骤是诊断 MCMC 的收敛性。我通过观察链的混合和平稳性以及 R_hat 来采用 3 种方法评估该模型的收敛性。R_hat 是当样本数趋于无穷大时,每个后验分布将减少的因子。理想的 R_hat 值是 1,但是小于 1.1 的值是收敛的强指示。我们观察马尔可夫链的混合和平稳性,以便知道 HMC 是否产生合适的后验样本。

下面是每个参数的轨迹图。每条链都是固定的,混合良好。此外,所有 R_hat 值都小于 1.1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

收敛之后,在继续其他示例之前,最后要检查的是模型对数据的适合程度。和之前做的假设一致吗?为了测试这一点,我们将使用残差图和 QQ 图,如下所示。
我已经列出了估计的变化点,以便比较变化前后的残差来检验同质性。残差服从均值为零的正态分布,在变化日期之前和之后都不依赖于时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有变化呢?

啊哈!如果新病例的数量还没有开始变平呢?!为了测试该模型对这种情况的稳健性,我们将查看加拿大截至 3 月 28 日的数据。这是模型估计曲线在加拿大开始变平的日子。

没有真实的更改日期并不意味着模型会输出“无更改”(lol)。我们将不得不使用后验分布来推断模型提供的变化日期是不合适的,因此数据中没有变化。

前科:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后验分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

w ₁和 w ₂的后验概率有明显重叠,表明病毒的增长率没有明显变化。₁b和₂b的后验概率也是重叠的。这些表明模型很难估计一个合理的τ,这对我们来说是一个很好的验证,先验并不太强。

尽管我们已经得出结论,该数据没有更改日期,但出于好奇,我们仍将绘制该模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与前面的例子相似,MCMC 已经收敛。下面的轨迹图显示了链的充分混合和稳定性,并且大多数 R_hat 值小于 1.1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后续步骤和未决问题

该模型能够很好地描述数据,足以产生曲线开始变平的日期的可靠估计。一个有用的副产品是第二条回归线的系数项, w ₂.通过计算不同国家的₂和₂,我们可以比较他们的社交距离措施的有效性。这一分析和更多内容可能会在随后的文章中发布。

请关注我的个人博客上的相关帖子!

感谢您的阅读,如果您有任何建议或推荐,请通过电子邮件或其他方式联系我,甚至只是聊天!

检测在线文章评论中的建设性

原文:https://towardsdatascience.com/detecting-constructiveness-in-online-article-comments-477bf4b4bd8?source=collection_archive---------79-----------------------

使用带 ktrain 的 Distilbert 的端到端分类教程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马修·施瓦茨在 Unsplash 上的照片

促进在线评论区的建设性是让互联网成为一个更有生产力的地方的重要一步。除了通过简单地指出错误或试图伤害来给出反馈,建设性可以通过论证和尊重的话语技巧来使用,以便利用这些过去的错误来进行未来的改进。

类似于情感分析或毒性检测,可以使用深度学习技术来建模建设性和分类文章评论。当前最先进的模型使用 transformer 架构,在并行处理输入序列时,它比通常的递归单元(LSTM、GRU……)更有效。在这篇文章中,我们将使用由 HuggingFace 创建的 Distilbert (Sanh 等人,2019)。该模型是 BERT (Devlin 等人,2018 年)的精华版本,本质上意味着一个轻得多的模型,几乎达到类似的性能。我们将使用 ktrain Python 库(Maiya,2020),它允许在 Tensorflow Keras 中非常容易地实现最先进的模型。关于 ktrain 实现的更多信息,本教程官方文档可以帮到你!

对于建设性来说,标记数据的数量相当有限,所以我们将使用最大和最新的一个,建设性评论语料库(C3),可在 Kaggle 上获得,并在 Kolhatkar 等人(2020)中详细描述。该数据集由 12000 条新闻评论组成,包含几个建设性和毒性标签,但我们将使用的唯一标签是 constructive_binary

数据处理

像往常一样,第一步是导入项目所需的所有库。您将需要安装 ktrain ,根据您的设置,这可能会很棘手,然后导入它。我们还从 scikit-learn 导入了基本的三重奏熊猫numpymatplotlib ,以及一些度量和拆分工具。

让我们从读取熊猫数据帧中的数据集文件开始。我们还应该看看我们感兴趣的列, comment_textconstructive_binary

C3 数据帧头

我们很快就需要知道我们想要允许的最大输入长度,所以了解一下注释长度是很有用的。运行以下代码以显示 DataFrame comment 列的描述。

结果显示长度平均值为 71 个标记,第 90 个和第 99 个百分点分别对应于 157 和 362 个标记,因此将 MAXLEN 设置在 150 到 200 个标记之间似乎是个好主意。为了节省一些内存空间,就说 150 吧。

接下来,我们应该定义几个全局变量,包括最大输入长度、数据集的路径和保存训练模型路径、目标标签名称和我们想要使用的 HuggingFace 模型,在我们的例子中是 bert-base-uncased ,它只使用小写输入。

现在让我们看一下输出类分布,以检查数据集是否平衡:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标类别分布

建设性的评论比非建设性的评论多,所以数据集略有不平衡。在验证和测试步骤中,我们希望保持输出类的良好代表性,这意味着我们希望目标类分布在所有 train/val/test 集中是相同的。为此,我们将使用 scikit-learn 实现的分层分裂。让我们从划分训练集(我们称之为中间集)和测试集开始,将完整集的 20%放在一边。为了更加方便,数据帧的索引可以在以后重新设置。

将另外 10%到 20%的训练数据设置为验证目的是一种好的做法,此外,在 ktrain 中使用验证集是可能的,因此我们再次使用分层分裂,并将 10%设置为备用。再次重置每个数据帧的索引。

完美!我们现在已经准备好使用三个数据集,所以让我们将输入和输出分开,以馈入我们的机器学习模型。您可以将输入列(X)读入一个 numpy 数组,并将输出(y)转换为一个小 int。

分类

现在是时候通过加载一个 Transformer 对象来初始化 ktrain 模块了,该对象采用前面定义的 MODEL_NAMEMAXLEN标签。最先进的体系结构不一定需要特殊的预处理,如停用词删除、标点符号删除等。相反,他们使用一种特殊的无监督标记化方法,优化了称为 WordPiece 的词汇外(OOV)的数量。由于这一点,并且因为我们的数据集不是很嘈杂,我们简单地使用 ktrain 预处理器。最后,您可以获得一个分类器对象,然后获得一个采用 batch_size 超参数的学习器对象。这个超参数在逻辑上可以根据您的需要进行调整(就像 MAXLEN 一样),但是在增加它时要注意内存问题。

以下代码为您完成了所有这些工作:

就在训练模型之前,您可以选择使用学习率查找器(Smith,2018)轻松优化学习率调整过程,它基本上在短期内训练模型,同时以指数方式提高学习率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

学习率查找图表

一个可供选择的学习率值位于第一个显著下降的斜坡上,比第一个平坦区域稍靠前一点,红色箭头指向的位置。在这种情况下,合适的值是 0.00001。让我们现在最后训练模型。我们使用循环训练政策(Smith,2017)来连续增加和减少学习率,但如果您想改变,也可以使用其他政策! 4 个时期对于模型收敛来说肯定是足够的,但是这也可以根据您的方便进行调整(训练这样大的模型需要大量的时间和资源!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详细培训

一旦训练结束,您可以使用学习者对象的 validate 方法进行验证,但是为了简短起见,我们将跳过这一部分。

ktrain 的预测器对象允许对新数据进行预测。运行下面的代码对整个测试集进行预处理和分类。它还打印了几个常用的指标来帮助您解释结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试集上的构造性分类结果

我们达到了 0.94 加权 F1 和 0.94 的精度,非常好,干得好!您的 Distilbert 模型现在适合检测建设性的新闻文章评论。您可以用下面的代码行保存模型,但是要注意,它相当重(~300MB)。

现在由您来调整超参数,使用更高级的机器学习方法或更重的模型(BERT、XLNet 等)。)去尝试,去取得更好的成绩!

感谢阅读! 我希望这对你来说是有益的,对我来说也是有趣的

参考

德夫林、雅各布、张明蔚、肯顿·李和克里斯蒂娜·图塔诺瓦(2018)。“BERT:用于语言理解的深度双向转换器的预训练”。 arXiv 预印本 arXiv:1810.04805

Kolhatkar、Varada、Nithum Thain、Jeffrey Sorensen、Lucas Dixon 和 Maite Taboada(2020)。《C3:建设性评论文集》。竖锯和西蒙·弗雷泽大学”。d O I:10.25314/ea 49062 a-5c F6–4403–9918–539 e 15 FD 7b 52

马亚,阿伦 S (2020)。“ktrain:用于增强机器学习的低代码库”。 arXiv 预印本 arXiv:2004.10703

莱斯利·史密斯(2017)。“训练神经网络的循环学习率”。2017 年 IEEE 计算机视觉应用冬季会议。 IEEE,第 464–472 页

莱斯利·N·史密斯(2018)。“神经网络超参数的训练方法:第 1 部分-学习速率、批量大小、动量和权重衰减”。 arXiv 预印本 arXiv:1803.09820

用迁移学习从胸部 X 射线检测新冠肺炎诱发的肺炎:在 Tensorflow 和 Keras 中的实现。

原文:https://towardsdatascience.com/detecting-covid-19-induced-pneumonia-from-chest-x-rays-with-transfer-learning-an-implementation-311484e6afc1?source=collection_archive---------3-----------------------

深度学习正在向新型冠状病毒进军。

介绍

新型冠状病毒(SARS-COV-2)已经成为人类面临的最紧迫的问题。新冠肺炎病像野火一样席卷全球,仅在三个月内就改变了全球面貌。高繁殖率和更高的并发症几率导致了边境关闭、空无一人的街道、猖獗的囤积、大规模的自我隔离政策、经济衰退和文化转向不信任。世界进入了一场新的世界大战,由一个看不见的敌人发动了闪电战。

随着发达国家的病例数量不断增加,各国政府正在慢慢意识到这个问题的严重性,人们希望看到全世界团结起来应对这一威胁。然而,无论是在 T2、国家还是个人层面,我们仍然可以观察到分歧和不信任。关于种族主义袭击盗窃不负责任行为的报道十分猖獗。医生呼吁公众认真对待这种情况,并在避免所有非必要旅行的同时就地躲避。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选定国家的 COVID 病例数 19。(图片来源:路透社)

三月前抗击病毒的策略主要围绕遏制和追踪——在疾病发展之前发现和隔离可能的病例。然而,随着病例的指数增长,世界各地的医院已经迅速变得不堪重负,政府政策已经转向缓解甚至接受。受影响国家缺乏检测能力进一步加剧了这一令人沮丧的过程,导致确诊病例数落后于真实值。这导致中国卫生当局暂时转而根据症状和胸部 x 光/CT 进行诊断。然而,这种解决方案仍然存在与其他肺炎原因重叠的风险,它们导致了许多混乱,国家又回到了基于 PCR(聚合酶链式反应)的测试。

基于人工智能的解决方案最近已被广泛探索用于 研究 中的肺炎检测,此类方法也已在本次疫情期间提出。据报道,定制模型的灵敏度和特异性接近 90%。然而,它们在确定肺炎病因方面的特异性,特别是对其他病毒性疾病(如流感)的特异性,仍在激烈辩论中。它们固有的实验性质要求同时使用确认方法,作为多学科诊断方法的一部分。

在本文中,我们将探讨使用相对简单的迁移学习过程和受约束的数据集,构建一个能够在胸部 X 射线中检测各种肺炎原因的系统的可行性和困难。当然,这里描述的方法和内容仅用于教育目的。这不是一项科学严谨的研究,不应用于医学目的。

履行

我们已经在以前的文章中详细介绍了 迁移学习 卷积神经网络 ,强烈推荐我们的读者参考它们以获得更全面的考虑。

为了解决手头的问题,我们收集了自己的数据集,将蒙特利尔大学的约瑟夫·保罗·寇恩博士收集的 Kaggle 胸部 x 光数据集COVID19 胸部 x 光数据集结合起来。这两个数据集都由肺炎患者的后前胸图像组成。随着更多案例的发布,COVID19 数据集每天都在更新,因此我们访问了 2020 年 3 月 18 日可用的实例。我们的数据集分为 4 个不同的类别,每类 9 张图像用作测试集。

  • 健康:79 张图片
  • 肺炎(病毒性):79 张图片
  • 肺炎(细菌性):79 张图片
  • 肺炎(新冠肺炎):69 张图片

让我们看一些例子来强调不同原因之间的细微差别。特别是,如果没有广泛的放射培训 ,病毒性病例和新冠肺炎病例之间的差异是无法区分的 ,这加剧了一线医护人员面临的困难

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

入院病人的胸透。从左至右:健康、细菌、病毒、COVID19。

我们的代码是用 Keras 和 Tensorflow 编写的,并在一个支持 GPU 的 Google 协同实验室笔记本实例中运行。所有代码都可以在 GradientCrescent 库上获得。

二进制案件

让我们从二元案例开始——比较健康的肺和那些表现出由 SARS-COV-2 病毒引起的肺炎的肺。这在covid 19 _ GradientCrescent _ Binary笔记本中有所涉及。

首先,让我们从 GradientCrescent Google Drive 导入数据集。

!gdown [https://drive.google.com/uc?id=1coM7x3378f-Ou2l6Pg2wldaOI7Dntu1a](https://drive.google.com/uc?id=1coM7x3378f-Ou2l6Pg2wldaOI7Dntu1a)!unzip Covid_Data_GradientCrescent.zip

接下来,我们将导入一些必要的库,并定义数据集路径和网络的一些参数。因为我们是迁移学习,我们将保持我们的学习率在 5e-4 的低值。

import numpy as npimport tensorflow as tfDATASET_PATH = ‘/content/two/train’test_dir = ‘/content/two/test’IMAGE_SIZE = (150, 150)NUM_CLASSES = len(data_list)BATCH_SIZE = 10 # try reducing batch size or freeze more layers if your GPU runs out of memoryNUM_EPOCHS = 20LEARNING_RATE =0.0005 

接下来,让我们使用 ImageDataGenerator 类来设置相应的训练和验证预处理以及批处理图像准备函数,对于这种情况,将我们的 class_mode 参数指定为“binary”。

#Train datagen here is a preprocessor
train_datagen = ImageDataGenerator(rescale=1./255,
 rotation_range=50,
 featurewise_center = True,
 featurewise_std_normalization = True,
 width_shift_range=0.2,
 height_shift_range=0.2,
 shear_range=0.25,
 zoom_range=0.1,
 zca_whitening = True,
 channel_shift_range = 20,
 horizontal_flip = True ,
 vertical_flip = True ,
 validation_split = 0.2,
 fill_mode=’constant’)train_batches = train_datagen.flow_from_directory(DATASET_PATH,
 target_size=IMAGE_SIZE,
 shuffle=True,
 batch_size=BATCH_SIZE,
 subset = “training”,
 seed=42,
 class_mode=”binary”,

 )valid_batches = train_datagen.flow_from_directory(DATASET_PATH,
 target_size=IMAGE_SIZE,
 shuffle=True,
 batch_size=BATCH_SIZE,
 subset = “validation”,
 seed=42,
 class_mode=”binary”,

 )

完成所有这些后,让我们来定义我们的网络,它在我们的两台笔记本电脑之间共享。我们采用预训练的 VGG16 网络,并将其与我们自己的一系列密集连接的层相适应,我们的输出层具有针对二进制分类情况的 sigmoid 激活函数。我们将编译我们的网络,并将 ADAM 优化器附加到它上面。

from keras import models
from keras import layers
from keras.applications import VGG16
from keras import optimizers
from keras.layers.core import Flatten, Dense, Dropout, Lambdaconv_base = VGG16(weights=’imagenet’,
 include_top=False,
 input_shape=(150, 150, 3))conv_base.trainable = Falsemodel = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation=’relu’))
model.add(layers.Dense(1, activation=’sigmoid’))model.compile(loss=’binary_crossentropy’,

 optimizer=optimizers.Adam(lr=LEARNING_RATE),
 metrics=[‘acc’])

定义好我们的网络后,让我们开始 20 个纪元的训练。

STEP_SIZE_TRAIN=train_batches.n//train_batches.batch_size
STEP_SIZE_VALID=valid_batches.n//valid_batches.batch_sizeresult=model.fit_generator(train_batches,
 steps_per_epoch =STEP_SIZE_TRAIN,
 validation_data = valid_batches,
 validation_steps = STEP_SIZE_VALID,
 epochs= NUM_EPOCHS,
 )

您应该会发现,我们的验证准确性收敛速度相对较快,超过了 80%。有了更大的数据集,我们将能够提供更多的验证示例来减少不同时期之间的差异,但结果对于演示目的来说是令人满意的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二进制情况的最后 3 个时期的精度和损失。

最后,我们将使用 matplotlib 库来绘制我们的精度和损失参数,作为我们训练时期的一个因素。

import matplotlib.pyplot as pltdef plot_acc_loss(result, epochs):
 acc = result.history[‘acc’]
 loss = result.history[‘loss’]
 val_acc = result.history[‘val_acc’]
 val_loss = result.history[‘val_loss’]
 plt.figure(figsize=(15, 5))
 plt.subplot(121)
 plt.plot(range(1,epochs), acc[1:], label=’Train_acc’)
 plt.plot(range(1,epochs), val_acc[1:], label=’Test_acc’)
 plt.title(‘Accuracy over ‘ + str(epochs) + ‘ Epochs’, size=15)
 plt.legend()
 plt.grid(True)
 plt.subplot(122)
 plt.plot(range(1,epochs), loss[1:], label=’Train_loss’)
 plt.plot(range(1,epochs), val_loss[1:], label=’Test_loss’)
 plt.title(‘Loss over ‘ + str(epochs) + ‘ Epochs’, size=15)
 plt.legend()
 plt.grid(True)
 plt.show()

plot_acc_loss(result, 20)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于二进制情况,取 20 个时期的精度和损耗参数。

为了确认我们的结果,我们将在测试数据集上测试我们的模型,每个类包含 9 个图像。请注意,您需要将随机播放参数设置为以获得准确的结果。

test_datagen = ImageDataGenerator(rescale=1\. / 255)eval_generator = test_datagen.flow_from_directory(
 test_dir,target_size=IMAGE_SIZE,
 batch_size=1,
 shuffle=False,
 seed=42,

 class_mode=”binary”)
eval_generator.reset()x = model.evaluate_generator(eval_generator,
 steps = np.ceil(len(eval_generator) / BATCH_SIZE),
 use_multiprocessing = False,
 verbose = 1,
 workers=1
 )print(‘Test loss:’ , x[0])
print(‘Test accuracy:’,x[1])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然看起来我们的模型在这个任务中表现得很完美,但是考虑到一个大得多的测试数据集,我们希望这个值与我们的验证精度相匹配。最后,让我们使用 cv2 图像处理类和 Keras 的 predict_generator() 方法绘制一些测试图像以及它们各自的预测。注意,要复制这一点,您需要将 evaluation_generator 的 shuffle 参数设置为 False ,以避免类索引混乱。

eval_generator.reset() 
pred = model.predict_generator(eval_generator,1000,verbose=1)
print(“Predictions finished”)import cv2import matplotlib.image as mpimg
for index, probability in enumerate(pred):
 image_path = test_dir + “/” +eval_generator.filenames[index]
 image = mpimg.imread(image_path)
 #BGR TO RGB conversion using CV2
 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)pixels = np.array(image)
 plt.imshow(pixels)

 print(eval_generator.filenames[index])
 if probability > 0.5:
 plt.title(“%.2f” % (probability[0]*100) + “% Normal”)
 else:
 plt.title(“%.2f” % ((1-probability[0])*100) + “% COVID19 Pneumonia”)
 plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

COVID19(左)和健康(右)测试集图像的预测概率。

我们的网络成功地发现了两个案例之间的差异。但这是肤浅的,让我们把赌注提高一个档次,试着区分不同类型的肺炎。我们将切换到第二本 Jupyter 笔记本,covid 19 _ GradientCrescent _ multi . ipynb .

多级案件

在这种情况下,我们不仅试图将健康的肺与感染肺炎的肺分开,还试图区分肺炎的不同原因,无论它们是由细菌、新型冠状病毒病毒还是其他病毒引起的。

我们的大部分代码与二进制代码是相同的。为了避免重复,我们来强调一下主要区别:

  • 我们的 ImageDataGenerator 类中的 class_mode 参数被设置为“分类”。
  • 现在,我们最终密集连接层中的神经元数量对应于所考虑的类的数量,并附带了一个 softmax 激活函数。这将允许我们给出每个类别的概率输出,并取最大值作为我们的最终预测输出。
  • 该模型现在用分类 _ 交叉熵损失函数编译。
  • 训练时期的数量增加,以适应增加的情况复杂性。同样的,学习率也降到了 1E-4。

让我们在考虑三个类别(健康、新冠肺炎、细菌)时,在以 5E-4 的学习速率训练 100 个时代之后,查看训练结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三级情况下,100 个时期内的精度和损耗参数。

虽然我们的模型的性能到目前为止是令人满意的,达到 80%以上,但让我们来看看合并了其他病毒性肺炎原因的四级情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四级情况下,100 个时期内的精度和损耗参数。

正如可以观察到的,三级病毒性肺炎类别的引入使准确性显著下降到 60%以上。这是可以理解的,因为新冠肺炎本身是由 SARS-COV-2 病毒引起的,因此我们可以预期这两个类别之间的特征域有很大的重叠。随着更细观的模型、更高的数据可用性和更长的微调过程,我们预计精确度会提高。

我们的结果增加了单独使用 CT/X 射线诊断 COVD-19 的难度,并有助于部分解释为什么中国卫生当局放弃了这种方法,转而使用基于 PCR 的测试:由于所有其他冬季病菌都在传播,确定个别病例中肺炎的原因变得非常困难。甚至可能有几种并行的肺炎原因,进一步使临床诊断复杂化。

我们希望你喜欢这篇文章,并希望你查看 GradientCrescent 上的许多其他文章,涵盖人工智能的应用和理论方面。要了解关于 GradientCrescent 的最新更新,请考虑关注该出版物并关注我们的 Github 资源库。

记得保持安全,洗手,并互相照顾。正如古代诗人长谷所言——“虽然我们生活在不同的地方,但我们共享一片天空”。

通过废水监测检测新冠肺炎疫情

原文:https://towardsdatascience.com/detecting-covid-19-outbreaks-through-wastewater-monitoring-f97bace1eb57?source=collection_archive---------40-----------------------

通过废水监测检测新冠肺炎疫情

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

试图监控新冠肺炎疫情的政府通常不得不做出艰难的权衡。

大规模测试人口中的个体成员既昂贵又困难:有限的实验室设备和医疗设施使得测试整个国家的人口几乎是不可能的。一个更便宜且逻辑上更简单的策略是分析污水。因为可以在人类排泄物中检测到新冠肺炎病毒和其他病毒,所以废水处理厂提供了综合信息。

目前,与单独测试相比,废水监测在 T2 更慢,在 T4 更不准确:需要更长的时间才能得到结果,而且更难确定爆发的确切地点。

但是,我们几乎已经掌握了让废水监测更快、更准确所需的所有知识。我们可以通过以下方式更有效地检测和应对新冠肺炎(和其他病毒)疫情:

  • 驱动一套开放标准
  • 开发小型化设备;和
  • 创建互操作数据平台

我们最近概述了一个由五部分组成的解决方案,该方案可以扩展到在整个大陆甚至全球范围内监测新冠肺炎。因为我们相信许多人、国家和组织可以从这些建议中受益,所以这里有一个我们发现的潜力的总结。

废水监测的工作原理

世界各地的污水处理系统都是类似的。水从单个的房子被倒入一个更大的集中管道系统。然后污水流向中央水处理厂。

病毒通常可以在受感染者的粪便中检测到。这就是为什么查看在特定水处理厂检测到的病毒浓度可以让我们估计该厂服务区域内的感染人数。

但是废水可能需要几天或几周的时间才能到达一个集中处理厂,因为在这个过程中经常有中间的清洁步骤。因此,监测工厂的废水通常意味着,虽然我们知道爆发发生了,我们知道它有多大,但我们不知道它发生在集水区的确切时间或地点(专家称之为空间分辨率和时间分辨率)。

因此,废水监测作为检测病毒爆发的潜在解决方案经常被忽视。

这将需要大规模的协调努力,以改善目前的技术和废水监测过程。但是考虑到确定新病毒爆发的价值,并与扩大个体测试所需的成本和努力相比,很明显这项工作需要完成。

我们改进废水监测的五部分解决方案

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的五部分解决方案包括:1)监控指导,2)参考样本,3)小型化设备,4)可互操作的数据平台,以及 5)机器学习分析。来源:作者

我们提议的改善和扩展废水监控的五部分解决方案包括:

  1. 关于如何设置监测设备和取样的标准化指南:所有各方都需要同意这套标准,因为为了获得可比较的数据,每个人都必须以相同的方式进行。
  2. 用于制备样品和量化病毒的参考方法:即使有关于设置监测设备的标准指南,每个人还需要就如何在实验室制备样品以及如何测量废水中特定病毒的浓度达成一致。
  3. 小型化仪器在更靠近源头的地方测量废水:我们需要制造小型的某些监测设备。
  4. 跨部门和国家共享数据的互操作数据平台:这些都需要开发。
  5. 机器学习预测分析:这将使我们能够尽早发现新病毒或已知病毒的新爆发,以协调适当的应对措施。

其中一些组件已经存在或正在开发中。我们详细查看这五项建议中的每一项,以显示我们所处的和我们可能达到的**(在 3-24 个月的时间内)。**

解决方案 1:监控指南

为处理厂制定一套关于如何提取样本和优化监测流程的指南,将有助于确保所有后续步骤中的数据一致。

我们在哪里:

  • 我们已经使用废水监测来回顾性地分析和描述疫情。不同城市的做法略有不同,很多步骤都是手动完成的。比如污水采样有两种不同的方法:
    抓样:在单个时间点取单个样本;
    复合取样:在 24 小时内收集和组合样本。
    ****
  • 目前的工艺通常需要在每个处理厂现场训练有素的专家。
  • 可能需要数周才能得到有用的结果,而且不同工厂或国家之间的数据并不总是可比的。

我们可能在哪里:

  • 随着监测设备和过程的改进,我们可以主动分析废水来预测即将到来的疾病爆发。
  • 通过自动化尽可能多的步骤,标准化设备和协议,并确保工厂和国家之间的一致性,我们可以降低成本并提高监测质量。

解决方案 2:制备样品和定量病毒的参考方法

为实验室创建参考样品和方案将确保样品制备和浓度测量的一致性。

我们在哪里:

  • 我们知道我们可以在废水中检测病毒,包括 SARS 和新型冠状病毒病毒,但有几种方法可以测量样本和量化病毒浓度。
  • “正常”是什么并不总是很清楚。
  • 样品可能以不同的方式制备,这可能会影响结果,并使不同实验室之间的数据比较变得困难。

我们可能在哪里:

  • 通过创建用于制备样品和量化病毒的标准化方案,以及就一组参考样品达成一致,不同国家的不同实验室可以共享和比较数据。这种标准化将使更快更灵敏的分析成为可能——这两个因素都很重要,尤其是对早期预警系统而言。

解决方案 3:收集和标准化粪便样本的小型化仪器

制造适用于大型污水处理厂的小型监测设备,将有助于我们更准确、更经济地查明疫情。

我们在哪里:

  • 废水处理厂测量整个集水区的平均信息。由于一些设备是为大型处理厂设计的,因此在更精细的层面上复制这种取样过程存在后勤方面的挑战。
  • 这意味着特定集水区的较小部分中的爆发可能被较大区域的平均值“抹平”,从而难以检测到爆发。

我们可能在哪里:

  • 开发小型化的取样设备将使我们能够进行更详细的测量。
  • 更详细的测量可以告诉我们疾病爆发的确切位置——精确到一个街区,甚至一座特定的建筑。
  • 通过不等待废水到达一个集中的工厂,我们也可以更快地获得这些测量值,给我们更好的空间和时间分辨率——也就是说,允许我们采取行动来遏制甚至防止疾病爆发。

解决方案 4:开发一个可互操作的平台来整合环境和健康数据

跨部门、跨角色和跨城市使用的单一数据平台将让所有人都在同一页面上。

我们在哪里:

  • 许多部门和国家已经在更广泛地共享他们的数据。这允许其他国家和部门之间的一些合作,甚至让公众成员直接获得信息。
  • 卫生部门和水管理部门并不总是有效合作,有时很难利用废水管理的见解来推动与健康相关的决策。
  • 各国共享数据仍然很困难。

我们可能在哪里:

  • 建立一个可互操作的数据平台来处理和组合来自水管理部门(如病毒浓度激增)和卫生部门(如感染率和住院率)的指标,将有助于我们做出更有效的决策。
  • 通过鼓励多个城市采用相同的平台,我们可以很容易地看到从“鸟瞰”到特定邮政编码爆发的一切。
  • 研究人员、工程师、政治家和决策者都可以从一个可靠的、集中的“真理来源”获得数据。

解决方案 5:预测分析

我们可以使用机器学习来自动预测何时何地爆发。

我们在哪里:

  • 废水监测目前太慢,无法用于预警系统。
  • 即使实现了上述所有解决方案,仍然需要时间来收集和分析我们需要的样本和数据。
  • 我们目前主要使用这些数据进行回顾分析。

我们可能在哪里:

  • 通过使用先进的机器学习,我们可以在废水中发现指示疾病爆发的新模式——甚至在患者首次报告症状之前。
  • 我们可以使用机器学习来纠正使我们的测量产生偏差的因素,例如一天中的时间、一周中的哪一天,甚至是天气,所有这些因素都会影响任何给定时间集水区内的人数。
  • 宏基因组分析也将帮助我们检测新病毒。我们可以监测以前在废水中没有检测到的新病毒 DNA,并将其与已知病毒进行映射,以识别新突变的潜在危险爆发。

有前途的废水监测项目实例

你想把这项技术带到你的城市吗?

如果您参与水资源管理或病毒爆发监测,并希望讨论将这项技术引入您的城市,我们很乐意与您交谈。如果你是一名居民,你的城市采用这种技术会使你受益,请与你的代表分享这篇文章。

如果您想讨论使用机器学习进行健康监测,请与我们的首席执行官预约通话。

使用深度学习检测新冠肺炎

原文:https://towardsdatascience.com/detecting-covid-19-using-deep-learning-262956b6f981?source=collection_archive---------13-----------------------

一个实用的方法来帮助医生帮助我们对抗新冠肺炎

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“冠状病毒病 2019 ( 新冠肺炎)是由*严重急性呼吸综合征冠状病毒 2”*引起的高度传染性疾病。

“这种疾病于 2019 年 12 月首次起源于中国武汉,自那以来,它已经在全球范围内传播,影响了超过 200 个国家。影响如此之大,以至于 世界卫生组织(世卫组织) 已经宣布新冠肺炎正在发生的疫情为国际关注的突发公共卫生事件。”

截至 4 月 29 日,全世界 200 多个国家共有 31,30,191 例病例,2,17,674 例死亡。(来源:必应新冠肺炎追踪器)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,在这个特定的场景中,需要做的一件主要事情是手动测试,并且大多数国家已经开始做这件事情,以便能够了解真实情况并做出适当的决定。

但是人工检测的缺点包括检测试剂盒的可获得性差,血液检测成本高且效率低;验血大约需要 5-6 个小时才能得出结果。

因此,我们的想法是利用深度学习技术来克服这些情况,以获得更好、更有效的治疗。由于这种疾病具有高度传染性,因此我们越早得出结果,城市中的病例就越少,这就是为什么我们可以使用卷积神经网络来完成我们的工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果没有贴标签,你能区分两张 x 光片吗?我打赌你不能,但是 CNN 可以。

该问题是一个二元分类问题,其中我们对正常和新冠肺炎病例进行分类。

使用深度学习来解决这种情况有几个利弊:

  1. 优点:更节省时间;不太贵;易操作的
  2. 反对意见:实际上我们需要 100%的准确性,因为我们不能错误地识别患者,因为这可能导致疾病的进一步传播,这是非常不鼓励的。

但是,这个模型仍然可以返回良好的准确性,并可以进一步得到加强。

数据准备

机器学习需要大量的数据来训练;对于这种类型的问题,我们需要的数据是 COVID 受影响和健康患者的胸部 x 光片。

  1. 约瑟夫 博士最近开源了一个 数据库 包含患有新冠肺炎病患者的胸部 x 光照片。所使用的数据集是一个开源数据集,包括来自公开研究的新冠肺炎图像,以及不同肺炎致病疾病(如 SARS、链球菌和肺囊虫)的肺部图像。
  2. 我还使用了 Kaggle 的胸部 X 射线 竞赛数据集来提取健康患者的 X 射线,并对 100 幅图像进行了采样,以与新冠肺炎可用图像进行平衡。

所以,数据集由新冠肺炎 X 射线扫描图像组成。事实证明,最常用的视图是后前视图,我在分析中考虑了新冠肺炎 PA 视图 X 射线扫描。

为了对我们的数据进行分层,我们将获取相同数量的图像,并将它们混合,稍后将分为测试和训练数据。

模型部署

由于我们已经准备好了数据,这是这个项目中最繁琐的部分,让我们进入下一步,我们将创建一个深度学习模型,该模型将学习正常 X 射线和新冠肺炎影响 X 射线之间的差异。

我假设你们都知道 CNN 架构的基础知识,如果没有,我强烈推荐你们关注:-CNN 基础知识

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型架构

我倾向于有3 个隐藏层,** 你可以试验更多或更少的层,这取决于你。我将模仿增加神经元的传统路线,因为我们越深入层内,学习的特征就越多。**

我将有 (224,224,3) 个输入神经元,我们正在将数据调整为具有 3 个通道 的 224224,因为它被认为是理想的大小。*

最后,我将展平我们的特征,并将使用 sigmoid 作为激活函数,因为我们有二进制分类问题,因此我们的输出将只包含一个单元格, adam 作为优化器配合得非常好,因此除了 交叉二进制熵之外,还使用它们来编译模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因素

你可能想知道为什么我不直接部署 VGG16 或任何预定义的模型,但为此,你必须知道 VGG16 的架构,它包含大约1.4 亿个参数*** ,另一方面,我们的模型包含大约570 万个参数 ,所以使用定制的模型比在迁移学习上训练几个小时更好,更优化,特别是对于这样的小数据集。***

培训用数据

因为我们已经定义了我们的模型,我们剩下的下一个任务是在定义的模型上训练我们的数据。

我试着在不进行剪切、缩放和水平移动的情况下训练数据,所以我得到的准确率约为 50%,对于像这样的实时项目来说,这是相当低的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于数据没有成型,接收信号较少,因此准确性较低

因此,为了更好地接收特征,最好对数据进行建模,因此,我们对训练数据执行剪切、缩放和水平旋转。

一旦图像被增强,我们可以在输入形状中对它们进行整形,即224 * 224**,批量大小为 32 的 ,并且可以训练我们的训练集。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备培训数据

在我的训练过程中,我用 10 个周期,每个周期 8 步 ,再次自由试验超参数,也许会产生更好的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结模型

此外,我们可以绘制损耗和精度图,以便更好地理解所需的超参数。

定义的超参数产生 96.4%的准确性,这并不坏,但仍可以提高,因为如果我们在真实场景中部署一个准确率约为 96.4%的模型,错误识别的患者仍可能传播疾病,我们的高效方法目标将无法实现。

同样,如果你想节省训练的时间,你可以从我的 Github 库 下载训练好的模型。

混淆矩阵

为了以更容易理解的方式可视化结果,我们将实现一个混淆矩阵。

混淆矩阵的原型如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们得到的混淆矩阵如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传********外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解码混淆矩阵,在 30 名 COVID 受影响的患者中,我们得到了 30 人我们得到了 0 名被错误分类的患者,在 2 名 8 名正常患者中,我们得到了 28 名患者被正确分类, 2 名被错误分类。

我们得到的结果是好的,但仍然可以提高精度,以实现我们的意图。

如果你喜欢这篇文章,请考虑订阅我的简讯: 达克什·特雷汉每周简讯

源代码

完整的源代码以及数据集和训练好的模型可以在我的 Github 存储库中找到:- 新冠肺炎检测

结论

因此,作为总结,我想再次思考这样一个事实,即分析是在有限的数据集上进行的,结果是探索性的,不能从中推断出任何结论性的东西。该方法尚未经过医学验证。

我计划改进这个模型,用更多的 X 射线扫描来增加我的模型的韧性,这样这个模型就可以推广了。此外,我鼓励读者对模型进行实验,以使其更加精确。

一如既往,非常感谢你的阅读,如果你觉得这篇文章有用,请分享!

待在家里,注意安全!

请随意连接:

在 www.dakshtrehan.com 和我一起

**LinkedIN ~https://www.linkedin.com/in/dakshtrehan/

**Instagram ~https://www.instagram.com/daksh_trehan/

**Github ~https://github.com/dakshtrehan

阅读我的其他文章:-

逻辑回归解释

线性回归解释

确定最适合您的 ML 模型

将机器学习技术与现实生活联系起来

为新手提供数据科学服务

关注更多机器学习/深度学习博客。

**中等~https://medium.com/@dakshtrehan

干杯。

封面模板和混淆矩阵模板是我在www.canva.com 上做的。x 射线图像是 github 和 kaggle 上可用的开源数据集的一部分。其余图片来自我的 Jupyter 笔记本。如果您想获得使用许可,请联系我。

另外,我还要感谢 Prateek bhaiyaa 和编码模块,他们通过他们的数据科学会议帮助我更好地理解了这些模型。

以 97%的准确率检测新冠肺炎:小心人工智能炒作!

原文:https://towardsdatascience.com/detecting-covid-19-with-97-accuracy-beware-of-the-ai-hype-9074248af3e1?source=collection_archive---------14-----------------------

当病毒式营销走得太远时

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

疾控中心Unsplash 拍摄的照片

一名 n 澳大利亚人工智能博士生最近在 LinkedIn 上发了一篇帖子关于他对新型冠状病毒的研究。这个帖子收集了成千上万的观点、赞和分享。

AI 很棒

他建立了一个深度学习模型,能够从胸片中预测病人是否感染新冠肺炎病毒,准确率为 97.5%。

目前,该项目的特点是:

  • 受过训练的 PyTorch 模型
  • 集装箱化应用代码
  • 翻译成 8 种语言的 GitHub
  • 开发中的 web 应用程序
  • 开发中的移动应用程序
  • AWS 中用于托管模型的无服务器架构的蓝图
  • 在营销和赞助方面付出了很多努力

上面的一切都是在大约一周内建成的。

医疗诊断中的深度学习

深度卷积网络对于疾病诊断和治疗具有潜在的益处。近年来出现了许多科学出版物[1],下面是其中的一些:

  • 2016 年,一组伦敦研究人员发表了一种诊断糖尿病视网膜病变的方法,准确率为 86%,在 8 万张眼底照片的数据集上进行训练[2]。
  • 同年,乌干达研究人员使用 10,000 个对象的数据集评估了 CNN 在显微血涂片上的性能[3]。
  • 两名日本研究人员在 550,000 个 CT 扫描数据集上领导了一项对肺结节进行分类的工作[4]。

但在这里,快速浏览一下 GitHub 知识库,往好了说,描绘了对深度学习和人工智能的严重缺乏理解,往坏了说,描绘了在利用疫情的同时进行自我宣传的恶意尝试。原因如下。

糟糕的工程

这个解决方案有几个问题,其中大部分在下面的 Reddit 线程中被揭穿。

首先,这些网络的潜在神经表示非常复杂,因此它们需要大量的训练样本,如前述研究中所述。

但截至目前,新冠肺炎探测器是在… 50 张图像 的数据集上训练的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:模型从胸部 x 光片中学习。来自 NIH 胸部 x 光数据集的图像

对于一个拥有超过 150 层和超过 2000 万个参数的网络来说,这完全是荒谬的。

此外,还存在巨大的数据偏差。这 50 张图片并不是根据一个人是否携带病毒来标记的,而是根据新冠肺炎急性病例的肺部损伤来标记的。除非你的肺已经被病毒破坏了,否则这个模型无法检测到感染。在一个人出现肺炎症状的情况下,如果这些症状不是急性的,则该模型的准确性未经证实。

最后,COVID 模型基于一个流行的基线网络 ResNet-50[5]。虽然这是图像识别和分类的常用方法,但 ResNet 是使用日常物体的照片进行预训练的。因此,其隐藏层的内部表现被几何形状和彩色图案激活(2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 ResNet 特征的可视化[6]

这种模式在 x 光照片中是找不到的。这就是为什么大多数医学神经网络都是从零开始制作的。

当我们仔细查看代码库时,会出现许多其他问题。训练、验证和测试数据集包含重复图像;大部分的训练过程都是从 PyTorch 教程中截取的,用不必要的代码混淆;Github 的问题是荒谬的…

很明显,那篇文章注定会有成千上万的赞、分享和观点,不管标题背后的内容是什么。

宣传作为商业竞争的一种手段,给发明者带来了机会,也极大地刺激了科学家的研究。

爱德华·伯奈斯

尼日利亚王子的蛇油

然而,作者在面对事实时并不绝望,经常提出以下答案:

你好 xxx ,在加拿大一家研究机构放射学家的支持下,我们已经策划了 5000 例

我不知道这个大胆的答案中的部分真理,但如果这样的模型被用于医学应用,它可能是非常危险的。

作者甚至创建了一个拥有多个渠道的 Slack group 。不用说,它引起了很多人的兴趣。

#数据科学家频道没有太多严肃的内容,被满怀希望但经验不足的热情新人打断。同样,在*#医生频道中唯一的有形内容来自解决医疗问题的专业人士,例如,胸部 x 光检查不是新冠肺炎诊断的推荐方法。最后,#研究人员*频道几乎空无一人。

另一方面,UI/UX 频道正在生成大量内容。该倡议现在有 5 个不同的标志和一个手机和网络界面的模型。

甚至还有一个*#营销频道来寻找加强沟通和筹集资金的方法,还有一个#赞助商*频道,潜在投资者询问投资回报的未来前景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自己看

当心炒作

深度学习不是银弹解决方案。许多没有做好准备的公司试图将其内部化为数据团队,当他们看到成本上升而很少或根本没有投入生产时,他们变得疯狂了。

尽管如此,如今人工智能的进步是开创性的。完全忽视它们的人是疯狂的。

这并不意味着直接跳入池中,在水中扑腾着呼吸空气。因此,拥有 AI / ML、数据操作、架构、开发和许多其他主题的横向技能的坚如磐石的团队非常重要。

安托万冠军,2020 年 3 月 23 日

参考

[1]医学图像处理的深度学习:概述、挑战和未来,Muhammad Imran Razzak,Saeeda Naz,Ahmad Zaib,2017。

[2]哈里·普拉特、弗兰斯·科恩、黛博拉·M·布罗德本特、西蒙·P·哈丁和郑亚林。糖尿病视网膜病变的卷积神经网络,2016 年。

[3]John A . Quinn、Rose Nakasi、Pius KB Mugagga、Patrick Byanyima、William Lubega 和 Alfred Andama。基于显微镜的护理点诊断的深度卷积神经网络,2016 年。

[4]坂本雅治和中野博树。具有选择性分类器的级联神经网络及其使用肺部 x 射线 ct 图像的评估,2016。

[5]深度残差学习在图像识别中的应用,何,孙,2015 .

[6],戴伦·杨,拉维·塔迪纳达。可视化剩余网络,2017。

用 Python 中的自动编码器检测信用卡欺诈

原文:https://towardsdatascience.com/detecting-credit-card-fraud-with-autoencoders-in-python-98391cace8a3?source=collection_archive---------25-----------------------

使用 Tensorflow 和 Keras 的两种方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

粘土银行Unsplash 拍摄的照片

在本文中,我们将演示两种不同的使用自动编码器的方法。特别是,我们将尝试使用自动编码器将信用卡交易分为欺诈性和非欺诈性。我们将要使用的数据集是“信用卡欺诈检测”数据集,可以在 Kaggle 中找到。完整代码可在 GitHub 上获得。其中有一个在 Colab 中打开和执行代码的链接,所以请随意尝试。代码是用 Python 写的,用了 Tensorflow 和 Keras。

该数据集包含欧洲持卡人的 284,807 笔信用卡交易。出于安全原因,数据集的原始特征不可用。可用的是 28 个特征,它们是原始特征的 PCA 的结果。还有,每笔交易的金额和“时间”一栏。最后一个函数计算每个事务和集合中第一个事务之间的秒数。最后,每个交易的类型在“类”列中。欺诈交易用 1 表示,非欺诈交易用 0 表示。该数据集高度不平衡,非欺诈交易占总数的 99.8%。因此,我们的分类问题也可以被视为异常值检测问题,欺诈性交易被视为异常值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

284,807 笔交易中只有 492 笔是欺诈

对于我们的例子,我们将忽略“时间”列。训练和测试数据集中的标准分割方法将用于评估每种方法。因为一个类的情况太少,我们将把数据集分成两半,而不是通常的 70%-30%。

如开始所述,我们将使用自动编码器来完成分类任务。根据维基百科:

自动编码器是一种人工神经网络,用于以无监督的方式学习有效的数据编码。

简而言之,自动编码器是一个神经网络,它被训练来重新创建作为输入的任何内容。在输入层和输出层之间有一堆隐藏层。在正中间有一层,包含的神经元比输入少。这一层的输出是自动编码器的所谓编码器部分的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个自动编码器的表示(作者:切尔文斯基来源:维基百科

使用自动编码器的理由是,隐藏层将以一种良好的方式将输入映射到向量空间(无论“良好”可能意味着什么)。通过使用具有很少神经元的层的结果,我们将我们的输入从高维空间映射到更低维的空间。

第一种方法:使用重建误差

我们的第一个方法是创建一个自动编码器,只在非欺诈交易上训练它。合乎逻辑的是,预期欺诈情况下该自动编码器的重构误差将高于非欺诈情况下的重构误差。我在 Venelin Valkok 的优秀媒体文章中读到过这种技术。我建议你学习它,因为在它里面,这个方法以一种非常详细和容易理解的方式被解释。

[## 使用 Keras 中的自动编码器检测信用卡欺诈——面向黑客的 TensorFlow(第七部分)

信用卡交易中的异常检测是如何工作的?

medium.com](https://medium.com/@curiousily/credit-card-fraud-detection-using-autoencoders-in-keras-tensorflow-for-hackers-part-vii-20e0c85301bd)

出于演示的原因,我们将创建一个简单的由三层组成的自动编码器。输入层、一个隐藏层和输出层。隐藏层将有 12 个神经元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一种方法中使用的简单自动编码器的表示

如前所述,网络仅使用训练集的非欺诈案例进行训练。在 100 个时期之后,我们获得了一个网络,我们用所有的训练集案例来喂养这个网络。然后,我们可以计算输入和输出之间的误差(重建误差)。结果如下表所示。

+----------------+--------------------+--------------------+
|     Class      | Mean Squared Error | Standard Deviation |
+----------------+--------------------+--------------------+
| Non-Fraudulent |      0.767519      |       3.439808     |
|    Fraudulent  |     29.855354      |      43.107802     |
+----------------+--------------------+--------------------+

基于这些结果,在测试数据集中,如果实例的重构误差大于平均值的标准偏差的三倍,即大于 0.767519+3*3.439808=11.078922,则我们将该实例描述为欺诈性实例。当然,阈值的选择是我们的模型的超参数,在实际应用中,它应该被微调。

我们可以看到,我们的模型在测试数据集的 243 个(46.5%)欺诈案例中检测到了 113 个。此外,142161 个非欺诈案件中有 771 个(0.5%)被归类为欺诈案件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一种方法的混淆矩阵

第二种方法:编码器和 k-NN

在我们的第二种方法中,我们将使用自动编码器的编码器部分。编码器将把实例映射到低维空间,并且 k-最近邻(k-NN)将用于分类。在这种方法中,欺诈性和非欺诈性交易都将用于训练编码器。可以说,编码器将用于降维,从而加速 k-NN 的执行。

我们将使用与第一种方法相同的模型。输入层和具有 12 个神经元的内部隐藏层将是编码器部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编码器由自动编码器的前两层组成

对于分类部分,所有实例(来自训练集和测试集)将通过编码器映射到 12 维空间。对于测试集中的每个实例,训练集的三个最接近的相邻案例将决定它是否是欺诈性的。

第二种方法从测试数据集的 243 个欺诈案例中检测出 184 个(75.7%)。此外,142161 个非欺诈案件中有 12 个(0.008%)被归类为欺诈案件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二种方法的混淆矩阵

结束语

我们很快看到了两种使用自动编码器进行分类的方法。欢迎您尝试使用 Colab 代码。可以尝试的事情有:

  • 在第一种方法中改变误差阈值
  • 向自动编码器添加更多层
  • 改变编码器最后一层的神经元数量

进一步阅读

侦查房地产投资犯罪

原文:https://towardsdatascience.com/detecting-criminal-investment-in-real-estate-5311d5a91ac8?source=collection_archive---------33-----------------------

将半监督机器学习应用于德克萨斯州贝克萨尔县的房产数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蒂亚戈·罗德里格兹在 Unsplash 上的照片

背景

腐败的墨西哥政客和贩毒集团经常在美国,尤其是德克萨斯州的住宅房地产中洗钱。在美国,利用房地产清洗非法所得有几个好处:价格通常稳定,有可能升值,资产具有功能性。此外,全现金购买是一种有效的方式来避免获得抵押贷款所涉及的银行审查,有限责任公司可以为真正的买家提供匿名。因此,房地产为非法资金融入合法金融体系提供了一个简单而直接的途径。

由于目前 20%的房地产购买不涉及融资,这种通过住宅房地产进行的洗钱活动已成为美国财政部金融犯罪执法网络(FinCEN)的一个重要关注点。作为这一重点的一部分,FinCEN 于 2016 年 1 月开始发布地理目标指令。这些 GTO 在法律上要求产权保险公司报告符合特定标准的房地产交易。在县一级应用,它们主要覆盖门户城市,如迈阿密、纽约和洛杉矶。一个被 GTO 覆盖的县一直让我印象深刻,那就是德克萨斯州的贝克萨尔县,圣安东尼奥周围的那个县。

直到 1836 年,贝克萨尔县一直是墨西哥的一部分,至今仍与该国北部保持着密切的文化联系,周末通勤是家常便饭。根据 2016 年 7 月以来的一项 GTO,该县最近发生了几起墨西哥政客和白领罪犯在圣安东尼奥周围的房地产中藏匿不义之财的高调事件。⁴ ⁵作为一名前调查分析师,我经历过一些这样的案例,但还有很多比我最初意识到的更多。

因此,我使用了来自贝克萨尔县财产评估员和德克萨斯州的公开可用数据来建立一个能够检测该县住宅房地产犯罪投资的模型。[结果的 TLDR:我标记了一小部分数据,半监督方法将 F1 分数从 0.667 提高到 0.8]

数据

贝克萨尔县评估区提供(实体光盘!)以象征性的费用购买其年度评估数据。由于该县的一些洗钱事件发生在数年前,我获得了 2015 年至 2019 年四年的数据。每个都有超过 600,000 个属性的多个数据集,我使用的特定数据集包含 408 个特征,我在几次迭代中对其进行了精简。

为了设计关于财产所有权的潜在有用特性,我从德克萨斯州公共账户审计员那里获得了几个数据集,这需要直接接触他们的开放记录部分。

我选择了一个包含活跃企业纳税人的数据集和另一个提供这些公司官员和董事信息的数据集。我将这两者合并,创建了一个包含公司董事信息的数据集。

为了将公司数据与 Bexar 县的财产数据结合起来,在执行了一些基本的文本清理之后,我合并了一个完全匹配的名称。

特征工程

荷兰的一项研究在很大程度上启发了这个项目,该研究发现,识别荷兰引人注目的房产的三个最佳指标是外国所有权、所有者是一家刚刚成立的公司以及不寻常的价格波动。⁶因此,创造相似的特征是至关重要的。我能够通过从财产契约日期中减去公司执照日期来复制刚刚成立的公司。

根据荷兰的调查结果和我调查洗钱的经验,我做了几个不同的二元特征来表明财产的所有者是公司还是信托。例如,如果包括纳税人姓名,这是一个法人,而不是一个公司。或者,如果名称包含几个公司术语或后缀中的一个,那么它可能是一家公司。

为了近似一个不寻常的价格波动特征,我计算了每套房产从 2015 年开始的市值同比变化百分比。

我还为房产是否满足 Bexar County 的两个 GTO 标准创建了一个显式特性:房产价值大于 300,000 美元,所有者是一家公司。

标记一小部分数据

因为我获得的公共记录数据没有欺诈活动的标签,所以我创建了一个小的标签数据集来验证我的方法。虽然近年来在无监督机器学习方面取得了很多进展,但当标记一个小的子集是可行的时,半监督方法已经显示出巨大的前景。⁷因此,我必须为涉及刑事诉讼的财产创建积极的类别标签。通过使用当地报纸和法庭文件,我能够找到 59 处大致符合这些标准的房产。

圣安东尼奥的 1115 Links Cv 就是这些物业的一个例子,该物业由 Red Kaizen Investments LLC 所有。Red Kaizen Investments LLC 是墨西哥金融家 Rafael Olvera Amezcua 被指控经营虚假储蓄和贷款业务,诈骗储户超过 1.6 亿美元的法庭案件中被列为被告的数十家公司之一。⁸

在 GTO 覆盖的辖区内,有 1,082 笔交易符合高风险可疑活动报告(SARs ),占符合报告要求的所有交易的 17%。⁹ ⁰通过粗略计算,我预计这将转化为大约 700 处符合贝克萨尔县数据中这些标准的房产。必须注意的是,并非所有标记为犯罪的属性实际上都符合 GTO 要求,因此这不应被视为一个精确的指标。

尽管如此,我有一个非常强的积极的犯罪财产类别,但超过 600,000 个财产,虽然可能是非犯罪的,但没有标记。因此,存在着巨大的阶级不平衡和标签挑战。为了解决班级不平衡的问题,我依靠精确、回忆和混淆矩阵,而不是准确度。如果只有 0.1%的交易是欺诈性的,一种算法总是可以预测交易是非犯罪的,并且在 99.9%的时间里是正确的。精度和召回允许捕获假阳性(精度)和假阴性(召回)的比率。

作为标记未标记财产的相当大的子集的快速第一步,我将数据中最常见的 30 个财产所有者(即,拥有最多财产的 30 个所有者)所拥有的财产标记为非犯罪财产。我有信心将这些房产归为非犯罪类,因为房主是大型建筑公司以及州政府和市政府。然而,应该指出的是,这并不能产生一个真正有代表性的样本,因为它偏向于大业主。

在过滤掉异常属性并匹配我手动标记的犯罪属性后,我在数据集中有 5516 个非犯罪属性和 47 个具有强标签的犯罪属性。

数据伪标记

我的半监督欺诈检测方法的下一步是对我的大型未标记数据集的剩余部分的 15%进行伪标记。首先,我用手工标记的小数据子集上的表格数据训练了几个适合分类任务的基线模型:支持向量机、XGBoost、随机森林和梯度增强。梯度增强在测试数据上具有最强的性能,XGBoost 次之。

梯度提升使用一系列决策树来迭代上一个决策树的残差。这 100 个弱学习者集合起来形成一个强模型。通常,我发现梯度提升是一个很好的基础模型,因为它是一个性能更高的决策树,训练起来相对较快。此外,决策树是一种更容易解释的机器学习模型,这对于我确定哪些特征对欺诈分类最有帮助至关重要。

因此,我使用基于原始训练数据训练的超参数优化梯度推进模型来预测 86,708 个属性的标签。接下来,我将这个伪标记数据与标记数据相结合,并进行新的超参数搜索,现在我在这个更大的数据集上训练了一个新的梯度提升分类器。

结果

这个新模型在召回率、精确度和 F1 分数方面都优于基线模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我很高兴召回率如此之高,同时仍然保持较低的误报率。在这种情况下,当务之急是减少误报,但是误报越多,法规遵从性分析师需要做的手动工作就越多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,该模型发现的对预测最重要的特征与荷兰的研究吻合得很好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的模型的最重要的特征是,房产由一家在房产购买日 365 天内成立的公司拥有。前面提到的荷兰研究与他们的第二强指标具有相同的特征。

我的模型依赖于多年来的年度价格差异作为最重要的特征之一。这大致反映了荷兰的研究如何将不寻常的价格波动作为其首要指标。⁴

拥有多处房产的业主符合我在资产追踪方面的经验,也符合荷兰研究的第二层指标之一。

结论

我的方法验证了检测犯罪投资的伪标记方法,表明一小部分标记数据可以用来对抗现有技术。这进一步证实了这种方法在新应用中的可行性,并提出了在这种应用中的可行途径,在这种应用中,访问完全标记的数据集是禁止的。以下是一些有趣的后续内容:

  • 使用主动学习来找出哪些额外的数据点需要标记。
  • 根据地理定位命令在其他县采用这种方法。
  • 合并更多数据集(如邻域数据)以构建更多要素。

感谢 妮娜·洛帕蒂娜 ,感谢所有在这方面的帮助。如果你对 NER 感兴趣,一定要看看她做的所有很酷的工作。

这个项目的资源库可以在 这里找到

[1]https://home . treasury . gov/system/files/136/National-Strategy-to-Counter-Illicit-finance v2 . pdf,第 18 页。

[2]https://www . fin cen . gov/sites/default/files/shared/Real _ Estate _ GTO-mia . pdf

[3]标准是:购买为全现金,购买者为公司,购买价格为 30 万美元或以上(根据最新 GTO)。

[4]https://www . express news . com/news/local/article/Coahuila-corruption-and-drug-ties-spread-5665058 . PHP #/0

[5]https://translate.google.com/translate?hl=en&sl = es&u = https://www . elfinanciero . com . MX/opinion/raymundo-Riva-Palacio/El-imperio-de-los-Medina&prev = search

[6]https://www . politieacademie . nl/kennisonderzoek/kennis/media theek/PDF/86218 . PDF

https://arxiv.org/abs/1805.03620

[8]https://www . document cloud . org/documents/6248702-Agreed-Final-judgment . html

[9]风险较高的可疑交易报告由金融机构提交给 FinCEN,fin cen 随后对交易进行调查。财政部上下文中的高风险 sar 是指那些由于涉及高风险外国管辖区、毒品洗钱和跨国犯罪的活动而提交的 sar。

[10]https://home . treasury . gov/system/files/136/National-Strategy-to-Counter-Illicit-finance v2 . pdf,第 18 页。

[11]我的数据集中有 21,131 处房产符合价格和公司所有的 GTO 要求。全国平均有 20%的房产是在没有贷款的情况下购买的,有 4226 处房产符合这三个标准;其中的 17%是 718。

[12]我为此遵循的实现是:https://datawhatnow . com/pseudo-labeling-semi-supervised-learning/

[13]https://www . police academy . cn/知识调查/媒体中心/PDF/86218.pdf】第 231 页。

[14]https://www . police academy . cn/知识调查/知识/媒体中心/pdf/86218.pdf第 231 页。

检测链表中的循环

原文:https://towardsdatascience.com/detecting-cycles-in-linked-lists-an-analogy-559c3639ef43?source=collection_archive---------51-----------------------

用类比理解龟兔算法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)用野兔和乌龟探测周期

当我们开始用算法思考时,链表是我们首先遇到的一些数据结构。在这个主题上经常遇到的问题是检测链表中的循环。

在这篇文章中,让我们来解决这个问题。但是在那之前…

什么是链表?

想象一个狭窄的隧道。隧道里的每一个点都指向前方的一个点。你知道这个隧道的入口。一旦踏入隧道,里面完全是漆黑一片,其他什么都看不到。但是还是有希望的。如果你在 X 点,那么你前面的 Y 点会出现一道光,所以你现在可以移动到 Y 点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)正前方的聚光灯亮起

灯在你前面的台阶上一直亮着,当你一到达那里就消失了。所以你只能一步一步地前进(不知道后面是什么,也不知道前面还有什么)

如果隧道到了尽头,你就能看到前方的阳光。所以一旦你踏上“最后一步”,你就会知道隧道已经结束了。隧道就是你的链表

什么是循环?

想象你在这样一个隧道前面。但是你被警告隧道可能有一个周期,即“隧道的尽头”可能链接回隧道中间的某个地方。所以事实上隧道没有尽头。例如,想象一个 9 字形的隧道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)陷入噩梦循环

如果隧道没有周期,它有一个实际的终点,从那里你可以看到阳光,知道你已经到达了终点。如果你最终走过一个有循环的隧道,你会一直循环下去,永远被困在黑暗中,不知道隧道的尽头是否有光明,或者你是否被困在一个噩梦般的循环中。

问题出在哪里?

你的工作是想出一个策略,让你能检测出你面前的这个隧道是否有循环,也就是你能检测出你的链表是否有循环?假设你在隧道里,你意识到隧道有一个循环,你可以用无线电发出求救信号,有人会来救你。

很酷的策略!

你邀请你的两个爱冒险的朋友过来。他们将被送进装有无线电的隧道。他们同时进入隧道,但其中一人会以比另一人慢的速度行走。

如果隧道没有循环,一切都很好,两个朋友都将退出隧道(当然,更快的一个会更快退出)。

如果隧道确实有周期怎么办?嗯,速度快的会先陷入循环。他一直跑来跑去。较慢的一个也将在稍后陷入循环。他也不停的跑来跑去。但最终…这两个人会相遇!!

他们为什么会相遇?这看起来很直观,但是我们需要证据。一个明智的朋友低声说“想想相对速度”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)一个证明的想法!

从慢一点的人的角度想想。他相对于自己是静止的,而较快的人以非零速度运动。当你站在环形轨道上不动,而你的朋友在绕着它跑,会发生什么?他撞到了你。瞧啊。

总结

因此,在我们的隧道(也称为链表)中检测循环的策略是——使用两个装有无线电(指针)的朋友,一个慢一个快来遍历隧道。如果他们中的任何一个离开隧道,他们会用无线电通知你,你知道隧道没有循环。否则,如果隧道确实有一个循环,他们将会相遇,一旦他们相遇,将会用无线电通知你,你将会知道确实有一个循环。

名字是…

毫不奇怪,这种算法的一个名字显然是龟兔赛跑算法

我们来编码吧!

让我们将我们的策略翻译成 python 代码。

class ListNode:
    def __init__(self, x=None):
         self.val = x
         self.next = Nonedef hasCycle(head: ListNode) -> bool:
    ''' Return True if linked list has a cycle, else false'''

    #Base case : If linked list has <= 1 element, no cycle
    if head is None or head.next is None:
         return False #Position slow and fast pointers at start and start+1 position
    slow_pointer = head
    fast_pointer = head.next #Traverse linked list while fast_pointer is not at end of list
    while(fast_pointer is not None):
        #If pointers meet, return True
        if slow_pointer == fast_pointer:
            return True
        #if fast pointer is 1 step before end of list, return False
        elif fast_pointer.next is None:
            return False
        #else move fast_pointer up by 2 steps, slow_pointer by 1
        else:
            slow_pointer = slow_pointer.next
            fast_pointer = fast_pointer.next.next #Fast_pointer has reached end of list, return False
    return False

使用 NANs/复数检测机器学习流水线中的泄漏

原文:https://towardsdatascience.com/detecting-data-leakage-in-ml-pipelines-using-nans-and-complex-numbers-66a066116b40?source=collection_archive---------31-----------------------

检测数据泄漏的简单而精确的方法

机器学习管道中的数据泄漏可能会对您的模型造成严重破坏。在这篇文章中,我将分享一个非常简单的方法,使用 nan 和复数来检测数据泄漏,同时将 ML 管道视为一个黑盒。我将非常简单地谈谈什么是数据泄露。我还会谈到leak-detect,我发布的 python 包可以在一行代码中完成所有这些。

数据泄露快速介绍

描述数据泄漏最精确的方式可能是这样的:

当在训练期间用于创建预测变量的数据在推断时不可用时,在 ML 模型中发生数据泄漏。

显然,在训练期间使用推断时不可用的数据(特征)会导致模型在生产中表现不佳。根据您公司的规模,这种低性能可能意味着数百万美元的损失!

泄漏的一个例子

特征创建管线会通过哪些方式引入数据泄漏?

  1. 使用用于创建特征工程目标的目标或数据。
  2. 使用未来期间的数据进行特征工程。

首先通常更容易检测和跟踪。所以,让我们试着用一个例子来理解第二个。假设您正试图预测一家公司 5 天后的股价。我们的数据包含日期和每日开盘价。

## target (to be predicted): Open price after 5 days.
data['target'] = data['open_price'].shift(-5)

我们希望为这项任务创建各种手工制作的功能。比如说,我们想要的一个特性是“前一天的价格”。

data['price_previous_day'] = data['open_price']**.shift(1)**
# .shift(1) gives value from previous row

但是我们没有做.shift(1),假设我们错误地做了.shift(-1),并使用开盘价下一行的值作为特征。我们只是创建了“第二天的价格”。这是一个漏洞,因为它使用了未来时期的数据。

有许多避免泄漏的最佳实践可以遵循,但是没有一个可以让你 100%确定你的管道没有泄漏。这就是 NANs 和复数的用武之地!这种方法可以看作是数据泄漏的单元测试。

方法论

在进入方法论之前,我们先做个类比:)。

比方说,你有两个水箱通过一根封闭的管道相连。不检查管道,怎么能检测出这个管道确实是封闭的,没有漏水呢?您可以向一个水箱添加颜色,并检查另一个水箱是否也有该颜色。**就像水彩画一样,NANs 和复数非常适合于泄漏检测任务,因为它们具有在实数的任何操作之后持续存在的能力。**实数与 NAN 或复数之间的加法、减法等运算分别产生 NAN 或复数。当然,这也有例外,我们稍后会谈到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在股票价格示例中,假设我们将特定日期 D 的开盘价设置为 NAN,并使用该数据创建我们的特性。第二天的价格(泄漏特征)将具有第 D-1 天的 NAN 值,而“前一天的价格”(非泄漏)将具有第 D+1 天的 NAN 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,对于泄漏特性,我们将在 D 日之前的特性中观察到额外的 NAN。本质上,如果 D 日的开盘价用于创建 D 日之前的特性(这是泄漏),我们将在 D 日之前的特性中看到额外的 NAN。如果在一个输入为 NAN 时使用任何产生 NAN 的操作来创建特性,则情况确实如此。

如果我们想检查 D+1 日、D+2 日等的数据是否用于创建 D 日之前的要素,该怎么办?嗯,我们把它们都设置为 NAN,并且只在 d 日之前的最终特征中计算 NAN。

该方法可以总结为 4 个简单的步骤:

1.定义一个假想的泄漏分区,将数据分成上下两半。在我们的例子中,我们不希望下半部分数据(未来)用于创建上半部分数据(过去)的特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.对原始数据运行数据创建管道,并计算上半部分所有要素中的 nan 数量。我们的数据创建管道创建了上面描述的泄漏和非泄漏特性。我们的非泄漏特征(前一天的价格)有 1 个 NAN,因为我们的数据从 2020 年 1 月 1 日开始,而泄漏特征(第二天的价格)有 0 个 NAN。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.现在,将原始数据中用于创建要素的所有列设置为渗漏分区下的 NAN。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.用 NANs 在这个原始数据上运行数据创建管道。再次计算分区上方的 NANs 的数量。对于我们的漏功能,有一个额外的南!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

非泄漏特性的上半部分中的 nan 数量保持不变,但泄漏特性增加了 1 个。这个多余的 NAN 是哪里来的?它唯一能来自的地方是全是南的下半部。我们刚刚在我们的泄漏特征中检测到泄漏!这种方法适用于任何特性,因为它不依赖于特性的定义。

通过增加一个虚部而不是用 NAN 代替,并计算具有虚部的行数,可以重复上述相同的过程。Pandas 和 numpy 已经支持所有 nan 和复数运算。所以,你根本不用修改代码!此外,这只能检测管道中的泄漏,而不能检测原始数据中可能已经存在的泄漏。

为什么同时使用 NANs 和复数?

用 NANs 和复数运行这个测试很重要,因为您的管道可能会用一个值替换 NANs。或者 numpy 把复数转换成实数进行一些运算。我测试了它的不同功能,包括加法、乘法、最大、最小运算和泄漏检测功能。尽管如此,留意特殊情况还是很重要的。

Python 包

我还发布了一个 python 包:[**leak-detect**](https://github.com/abhayspawar/leak-detect)用一行代码完成所有这些![leak-detect](https://github.com/abhayspawar/leak-detect)可以检测由于错误代码而发生的水平(从目标到特性)和垂直(从未来到过去)泄漏。在下面的示例中,我们创建了两个使用未来数据的渗漏特征:“return_2day_leaky”和“open_10day_before_leaky”。两者都被检测到具有垂直泄漏。它还打印出数据漏入的先前行数。对于第一个特性,它是 2,因为它使用 2 天后的价格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用泄漏检测的示例

回购中的检漏示例. ipynb 笔记本列举了更多这样的例子。你可以通过pip install leak-detect来安装这个包。下面是 github 回购

其他类型的数据创建管道呢?

泄漏检测只对类似于股票价格数据的数据有效。在您的情况下,您可以使用多个数据集来创建要素,甚至可以使用 SQL。无论你的管道是什么,想法仍然是一样的。您必须编写自己的自定义函数,通过查看泄漏检测代码来复制这些函数。

希望这是对你有用的东西。如果你有什么想法,请在评论中告诉我!你也可以通过 abhayspawar 在 TwitterLinkedin 和 Gmail 上联系我。非常感谢你的阅读。注意安全!

用 Doc2vec 检测文档相似度

原文:https://towardsdatascience.com/detecting-document-similarity-with-doc2vec-f8289a9a7db7?source=collection_archive---------7-----------------------

Python 的分步实践介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“什锦浆果”由威廉·费尔克Unsplash 上演唱

我们可以用很多方法来分析和理解文本数据。这种方法通常处理称为自然语言处理(NLP)的人工智能领域。

NLP 允许我们执行大量的任务,其中我们的数据由文本或语音组成。情感分析、机器翻译和信息检索只是我们日常使用的 NLP 应用的几个例子。今天,通过结合使用 NLP 和机器学习技术,这些任务中的许多都可以很成功地解决。

在这篇文章中,我想举例说明一个这样的方法,doc2vec,并希望提供一些关于它如何工作以及如何实现它的基本见解。

任务

简而言之,给定大量的文本文档,我们希望能够:

  1. 衡量文档在语义上的相似程度。
  2. 使用此信息根据相似性对文档进行聚类。

我们将涵盖的内容

我知道这是一个较长的职位。因此,在我们开始之前,这里有一个我们将涵盖的所有内容的大纲:

  1. 数据集介绍
  2. doc2vec 和矢量表示概述
  3. 训练 doc2vec 模型
  4. 可视化生成的文档向量
  5. 评估模型

你可以随意阅读,以你觉得舒服的速度。我甚至鼓励你把它分成几部分,在你认为合适的时候反复阅读,以保持专注。

数据

为了训练和测试我们的模型,我们将使用20 个新闻组数据集。这个数据集由 20 个不同主题的大约 18000 个新闻组帖子组成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

20 个新闻组数据集的结构

为了加快训练速度,也为了让我们以后的评估更加清晰,我们把自己限制在四个类别。此外,为了确保这些类别尽可能不同,这四个类别被选择为不属于同一个分区。

例如,这意味着我们可能想用例如 soc.religion.christian 替换其中一个,而不是选择 rec.sport.baseballrec.sport.hockey 。在这里,我决定使用类别足球.宗教.基督教科学.空间谈话.政治.中东,以及娱乐.体育.棒球

选择类别后,他们的文档被分成训练集和测试集,同时跟踪哪些文档属于哪个类别,以便以后更容易判断模型的性能。

在 Python 中,我们可以使用 sklearn 来获取数据:

按类别组织培训和测试数据

基本上,我们正在做的是创建两个字典,每个字典有 4 个关键字(即 4 个类别)。每个键包含属于该类别的所有文档作为其值,其中一个字典包含训练文档,另一个包含测试文档。此外,参数remove=('headers', 'footers', 'quotes')从文档中移除元数据,如页眉、页脚和引用,以防止我们的模型过度适应它们的

生成向量

现在我们有了数据,让我们重新审视我们的任务。请记住,我们首先要弄清楚我们的文档以及它们的上下文是如何相互关联的。

我们希望能够衡量文档在语义上的相似程度

换句话说,我们想要做的是将我们的文本文档转换成数字的、矢量化的形式,稍后聚类算法可以使用这种形式将相似的文档分组在一起。

Doc2vec

产生这种载体的一种算法是 doc2vec [1]。在 Gidi Shperber 的文章中可以找到对这个概念的很好的介绍。本质上,doc2vec 使用神经网络方法来创建可变长度文本片段的向量表示,例如句子、段落或文档。这些矢量表示的优点在于,它们捕捉了输入文本的语义,即含义。这意味着在向量空间中,意义或上下文相似的文本比不一定相关的文本彼此更接近。

Doc2vec 建立在另一种叫做 word2vec 的算法之上[2]。正如您可能已经从名称中猜到的那样,word2vec 的功能与 doc2vec 非常相似,除了我们得到的不是文档向量,而是单词向量。例如,这意味着像“fast”和“quick”这样的词在向量空间中比“London”彼此更接近。不仅如此,这些向量表示还可以用来执行简单的向量运算。例如,vector("King") - vector("Man") + vector("Woman")产生与“Queen”的矢量表示最相似的矢量。

关于 word2vec 的更深入的介绍,我推荐看看这篇由 Kung-Hsiang,Huang (Steeve) 撰写的文章

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示向量空间中单词之间的关系— TensorFlow

培养

现在我们对 doc2vec 的作用有了一个概念,让我们看看如何在我们的数据上训练一个 doc2vec 模型。下面的实现很大程度上受到了这个教程的启发,我强烈推荐你去看看。

首先,我们需要稍微调整一下原始数据,为训练做准备。

组织和预处理培训和测试文档

同样,我们使用字典来跟踪哪些文档属于哪个类别。为了训练 doc2vec 模型,训练文档需要采用 TaggedDocument 的形式,这基本上意味着每个文档接收一个惟一的 id,由变量offset提供。

此外,函数tokenize()将文档从一个字符串转换成由文档单词组成的字符串列表。它还允许选择停用词以及超过一定长度的词进行删除。

停用词通常是对一段文本没有上下文意义的常用词,因此会被删除。你会注意到,在这里,我选择不删除任何停用词,因为这样做性能似乎会稍微好一点。

通常,停用词的移除高度依赖于手头的任务,并且找出要移除的停用词(如果有的话)并不总是简单明了的。

我们最后得到的是以下变量:

  • train_corpus:培训就绪文档列表
  • cat_dict_test_clean:包含按类别组织的标记化测试文档

请注意,只有实际用于培训的文档才需要标记。

准备好培训文档后,我们现在可以开始培训我们的模型了。

训练模型

我们首先创建一个 doc2vec 对象,它将作为我们的模型,并用不同的超参数值初始化它。

epochs的值决定了训练过程中使用训练语料的次数。vector_size决定了生成的文档向量有多大。此外,任何出现频率低于min_count的单词都将被丢弃。在不涉及太多细节的情况下,window在训练中用于确定在检查给定单词的上下文时要包含多少个单词。更多信息请参见第 2.2 节。[1]的。

当从头开始训练这样的模型时,这些参数的最佳值通过称为 超参数调整 的过程找到。

我在这里使用的价值观绝不是最佳的,也不是一成不变的。请随意使用不同的超参数集来试验训练不同的模型。

然后我们构建词汇表,它基本上是一个字典,包含训练语料库中所有唯一单词的出现次数。最后,对模型进行训练。

我们现在可以从测试集中推断出未知文档的新向量,并使用它们来评估我们的模型。这就是跟踪我们的文档属于哪个类别的用处。

推断测试文档的文档向量,并组织它们以保存到文件中

我们在inferred_vectors_test中按类别保存这些向量。同时,我们初始化另一个字典metadata,它将每个类别映射到一个整数,该整数对应于该类别的推断向量的数量。如果这看起来很奇怪,一会儿就会明白了。这两个变量现在可以用来创建两个文件,如下所示:

将向量和元数据写入文件

两个文件中的第一个文件doc2vec_20Newsgroups_vectors.csv,每行包含一个推断的文档向量,用制表符分隔的值表示,向量按类别排序。

第二个文件doc2vec_20Newsgroups_vectors_metadata.csv,每行包含第一个文件中相应向量的类别。这可能看起来像这样:

talk.politics.mideast
talk.politics.mideast
.
.
.
talk.politics.mideast
rec.sport.baseball
rec.sport.baseball
.
.
.
rec.sport.baseball
sci.space
sci.space
.
.
.
sci.space
soc.religion.christian
soc.religion.christian
.
.
.
soc.religion.christian

形象化

那么我们为什么要把向量和它们的元数据保存到文件中呢?好了,我们现在可以使用这两个文件,使用 TensorFlow 的投影工具来可视化我们文档之间的相似之处。在投影仪工具中,您可以选择不同的降维方法,即 t-SNE、PCA 和自定义轴标记,来表示 2D 或 3D 空间中的矢量。

投影仪尝试对数据点进行聚类,以便相似的点彼此更接近。每种方法都将表示数据点之间的关系,也就是说,以不同的方式分配数据点。例如,一种方法将更侧重于表示各个点之间的局部相似性,而另一种方法可能侧重于保持数据集的整体结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用 2D t-SNE 图可视化文档向量

除了看起来非常酷之外,我们可以用这些可视化来判断矢量的质量。通过搜索元数据文件中每个向量的类别名称,我们可以看到图上每个点属于哪个类别。

然而,你会注意到,你可能有很多点位于中间的某个地方,并不真正属于任何集群。一个原因可能是你选择的降维方法;特别是对于 t-SNE,使用的参数值对数据点的分布有很大的影响。

此外,不能忽视的事实是,一些文件可能只是在上下文中含糊不清。例如,来自一个类别的特定文档可能使用大量在来自另一个类别的文档中大量使用的术语,因此它们的向量彼此之间可能比它们自己类别的向量更相似。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多次显示相同的数据点分布,突出显示每个类别的点

你可以通过点击这个链接,使用上面例子中使用的矢量和元数据自己尝试投影仪。

为了从数字上检查文档之间的关系,我们可以通过使用similarity_unseen_docs()函数来计算它们的推断向量之间的余弦距离。

这个函数将我们刚刚训练的 doc2vec 模型和要比较的两个文档作为其参数。作为文档相似性的度量,该函数返回一个介于 0 和 1 之间的值,该值越大,文档越相似。

如果我们想要比较单个文档,这是非常有用的,但是如果我们需要评估我们的模型的性能,我们将不得不扩展它,不仅包括单个文档,还包括我们数据集的一部分。

评估我们的模型

直观上,人们会期望属于同一类别的文档比属于其他类别的文档彼此更相似。这正是我们用来判断模型的标准。一个好的模型应该为同一类别的文档给出比跨类别文档更高的相似性值。因此,在深入了解代码的本质之前,让我们先来看看如何构建比较。

我们要做的第一件事是为所有类别创建文档对集。更具体地说,给定我们的四个类别,我们用 C₁来表示,…,C₄,其中每个类别是一组文档,我们得到以下类别对:

  • (C₁、C₁)、(C₁、C₂)、(C₁、C₃)、(C₁、C₄)
  • (C₂、C₂)、(C₂、C₃)、(C₂、C₄)
  • (C₃、C₃),(C₃、C₄)
  • (c₄c₄)

注意,当测量余弦相似性时,像(such)和(such)这样的对是等价的,因此为了避免冗余,只考虑两个组合中的一个。

对(Ca,Cb)对应于包含类别 a 中所有文档的集合和包含类别 b 中所有文档的集合的笛卡尔积。更正式地说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,对于每个文档对,我们计算文档的相似度。对于每个类别对,这会产生一个介于 0 和 1 之间的值的矩阵(每个文档对一个值)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可能的相似度矩阵假设有两类 a b 分别包含 m 文档。

因为我们使用这些矩阵来判断两个类别中的文档总体上有多相似,所以将一个矩阵中的所有值浓缩成一个值作为相似性的度量无疑会使我们的工作容易得多。因此,我们将对每个矩阵做的是将矩阵中的所有值相加,得到一个值,我们称之为相似度总计*,然后将这个值除以矩阵中的元素总数,得到一个平均相似度值。*

请记住,我们判断我们的模型不是根据它告诉我们来自相同类别的文档有多相似,而是根据这些相同类别的文档彼此之间比来自其他类别的文档有多相似。因此,我们真正追求的价值不仅仅是(C₃,C₃)的平均相似度(T30)有多高,而是相对于(C₁,C₃),(C₂,C₃)和(C₃,C₄).)的平均相似度有多高

因此给定我们的四个类别,这留给我们每个类别四个平均相似度*;一个用于同类文档,三个用于跨类文档。*

下面是我们要为每个类别做的事情。使用每个类别的四个平均相似度值,我们将计算跨类别平均相似度和同类别平均相似度之间的平均相似度差异。更正式地说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算类别 3 的平均相似性差异。s()表示两个类别的余弦相似性。请注意 j=3 是如何被跳过的,因为由此产生的减法是多余的。

较高的平均差异告诉我们,该模型能够识别某个类别的文档与其他类别的文档更加不同。当然,如果一个类别的文档确实与另一个类别的文档相似,情况可能并不总是如此。例如,这在诸如 comp.os.ms-windows.misccomp.windows.x 的类别中可能比在comp . OS . ms-windows . miscsoc.religion.christian 中更容易识别。

评估结果可总结如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示的平均相似度是同类文档的平均相似度。一个好的模型应该是给出高的平均差和平均相似度 的模型。

以如此紧凑的形式表示结果使得用不同的超参数训练多个模型并比较它们的性能更加有效。

现在,让我们来看看如何对此进行编码。首先,我们创建一个字典,将文档对列表映射到它们所属的类别对。考虑到结果对的数量很大,我们需要限制这个数量,以便在合理的时间内执行我们的评估。为此,我们从每个字典条目中随机抽取 500 个文档对,并计算每个文档对的余弦相似度。

注意 500 是任意选择。理想情况下,样本越大,表示越准确。

这就产生了类似于我们之前看到的相似矩阵。最后,我们将这些矩阵作为列表保存在一个新的字典中,每个列表都被映射到它所代表的类别对。

生成相似性矩阵

下一步是使用这些相似性值来计算我们上面讨论的紧凑表示。我们首先检查所有的类别对。如果我们找到一个相同类别的配对,我们保存它的平均相似度,以备以后计算平均差异时使用。对于跨类别对,我们简单地将它们的平均相似度保存在一个列表中。

最后一步是使用平均相似度列表和之前保存的同类平均相似度计算平均差异。这个数字,加上同类的平均相似度,作为模型描述这个类别的一个度量。然后对每个类别重复这一过程。

摘要

所以可能需要消化很多东西。以下是我们在本文中讨论的所有内容的总结:

  • 我们看了一下 doc2vec 这是一种常用于生成文本文档的向量表示的方法。
  • 我们看到了如何使用 Gensim 在 Python 中准备数据和训练 doc2vec 模型。
  • 我们看到了使用 TensorFlow 的投影仪来可视化我们的矢量是多么有用。
  • 最后,我们讨论了一种评估 doc2vec 模型的可能方法,它允许对多个模型进行有效的比较。

谢谢你留下来!希望听到您的反馈,并回答您的任何问题。

参考

[1] Q. V. Le 和 T. Mikolov,句子和文档的分布式表示(2014)
【2】t . miko lov,K. Chen,G. Corrado 和 J. Dean,向量空间中单词表示的有效估计,【2013】

利用迁移学习从声音中识别情感

原文:https://towardsdatascience.com/detecting-emotions-from-voice-clips-f1f7cc5d4827?source=collection_archive---------22-----------------------

使用迁移学习训练神经网络从语音剪辑中识别情绪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个快乐的人的声音片段的声谱图

在经典情景喜剧《生活大爆炸》中题为“情感检测自动化”的一集里,霍华德设法获得了一个设备,可以帮助谢尔顿(他很难读懂别人的情感暗示)通过将设备指向周围的人来理解他们的感受…

人类不仅倾向于用口语来传达信息,还会用音调、肢体语言和表情来传达信息。同样的信息以两种不同的方式说出来,可能会有非常不同的含义。因此,牢记这一点,我考虑着手一个项目,利用音调、响度和各种其他因素来识别语音剪辑中的情绪,以确定说话者的感受。

这篇文章基本上是一个简短但完整的教程,它解释了如何训练一个神经网络来预测一个人的情绪。该过程将分为 3 个步骤:

  1. 理解数据
  2. 数据预处理
  3. 训练神经网络

我们将需要以下库。fastai
2。numpy
3。matplotlib
4。天秤座
5。pytorch

您还需要一个 jupyter 笔记本电脑环境。

理解数据

我们将一起使用两个数据集来训练神经网络:

RAVDESS 数据集

RAVDESS 数据集是 24 个演员用 8 种不同的情绪(中性、平静、快乐、悲伤、愤怒、恐惧、厌恶、惊讶)说同样的两句台词的音频和视频剪辑的集合。在本教程中,我们将只使用音频剪辑。您可以从这里的获取数据集。

TESS 数据集

TESS 数据集是两个女人表达 7 种不同情绪(愤怒、厌恶、恐惧、快乐、惊喜、悲伤和中性)的音频剪辑的集合。你可以从这里获取数据集。

我们将声音剪辑转换成图形格式,然后将两个数据集合并成一个,然后我们将把它分成 8 个不同的文件夹,每个文件夹对应 RAVDESS 数据集部分中提到的一种情绪(我们将把惊讶和惊喜合并成一个组件)。

数据预处理

我们将把声音剪辑转换成图形数据,这样它就可以用于神经网络的训练。为此,请查看下面的代码:

上面的笔记本显示了如何将声音文件转换为图形数据,以便神经网络可以解释它。我们正在使用名为 librosa 的库来做这件事。我们正在用 MEL 标度将声音数据转换成频谱图,因为这个标度的设计是为了使它更容易解释。这个笔记本包含应用于一个声音文件的代码。包含将初始数据集转换为最终输入数据的全部代码的笔记本可以在这里找到。

因此,在运行上面笔记本中给出的每个声音文件的代码,然后根据需要划分文件后,你应该有 8 个单独的文件夹,分别标有相应的情绪。每个文件夹应该包含所有声音剪辑的图形输出,这些声音剪辑表达了文件夹所标注的情感。

训练神经网络

我们现在将开始训练神经网络,通过观察声音片段产生的频谱来识别情绪。我们将使用 fastai 库训练神经网络。我们将使用一个预训练的 CNN ( resnet34),然后在我们的数据上训练它。
我们将要做的如下:

1.制作具有适当数据扩充的数据加载器,以输入到神经网络。每幅图像的大小为 432×288。

2.我们将使用在 imagenet 数据集上预先训练的神经网络(resnet34)。然后,我们将通过适当的裁剪将我们的图像缩小到 144 乘 144 的大小,然后在该数据集上训练我们的神经网络。

3.然后,我们将在尺寸为 288×288 的图像上再次训练神经网络。

4.然后,我们将分析神经网络在验证集上的性能。

5.瞧啊。训练过程将会完成,你将拥有一个可以从声音片段中识别情绪的神经网络。

开始训练吧!

在上面的部分中,我们已经使用我们的数据创建了一个数据加载器。我们对图像进行了适当的变换,以减少过度拟合,并将其缩小到 144 乘 144 的大小。我们还将其分为验证集和训练集,并根据文件夹名称标记数据。如您所见,数据有 8 个类别,因此这是一个简单的影像数据集分类问题。

在上面的部分中,我们使用了一个预训练的神经网络,然后在大小为 144×144 的图像上训练它来识别情绪。在训练结束时,我们的准确率达到了 80.1 %。
现在我们有了一个神经网络,它非常擅长通过查看 144×144 大小的图像来识别情绪。因此,现在我们将使用相同的神经网络,并训练它通过查看 288×288 大小的图像来识别情绪(它应该已经很擅长了)。

在上面的部分中,我们在 288×288 大小的图像上训练神经网络(我们已经在 144×144 大小的图像上训练过)。瞧,瞧!它现在可以从声音片段中识别情绪,而不管语音的内容如何,准确率为 83.1 %(在验证集上)。
在下一节中,我们将使用混淆矩阵分析神经网络的结果。

上面的部分包含了我们数据集的混淆矩阵。

完整的培训用笔记本可以在这里找到,从预处理到培训的所有笔记本都可以在这里找到。

感谢你阅读这篇文章,希望你喜欢!

引文

RAVDESS: living stone SR,Russo FA (2018)瑞尔森情感语音和歌曲视听数据库(rav dess):北美英语中一组动态、多模态的面部和声音表情。PLoS ONE 13(5): e0196391。https://doi.org/10.1371/journal.pone.0196391

多伦多情感演讲集(苔丝): 皮乔拉-富勒,m .凯思琳;杜普斯,凯特,2020,《多伦多情感演讲集(TESS)》,https://doi.org/10.5683/SP2/E8H2MF,学者门户网站 Dataverse,V1

使用 JavaScript 检测人脸特征并应用滤镜

原文:https://towardsdatascience.com/detecting-face-features-and-applying-filters-with-javascript-34a2081daebb?source=collection_archive---------67-----------------------

使用 JavaScript 构建类似 Snapchat 的过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从应用程序中截取—背景照片由 Théo rqlUnsplash 上拍摄

几天前我发表了一篇关于“用 Python 检测面部特征”的文章,我在 Twitter上收到了很多关于如何用 JavaScript 做这件事的问题。今天我们将回答这个问题,我们将添加一些额外的东西,比如用蜘蛛侠滤镜或者经典的狗滤镜来遮盖你的脸。参与这个项目非常有趣,我希望你会喜欢。

本文将涵盖两个主要主题:

  • 人脸特征识别
  • 添加过滤器

如何检测面部特征?

类似于 DLib 的工作方式,对于 JavaScript,我们有一个名为 clmtrackr 的库,它将完成检测人脸在图像上的位置的繁重工作,并且还将识别人脸特征,如鼻子、嘴、眼睛等。

该库提供了一些通用模型,这些模型已经过预训练,可以按照如下特征编号使用:

点地图

当我们用这个库处理一个图像时,它将为地图上的每个点返回一个数组,其中每个点由它在xy轴上的位置来标识。当我们构建过滤器时,这将变得非常重要。你可能已经猜到了,如果我们想要画一些东西来代替人的鼻子,我们可以使用鼻子的中心点62

不过,说够了,让我们开始研究一些很酷的东西吧!

我们在建造什么?

在本文中,我们将利用clmtrackr来识别视频流中的人脸(在我们的例子中是网络摄像头或摄像机),并应用可以通过屏幕上的下拉菜单选择的自定义过滤器。这是 codepen 上的应用程序演示(请确保您在浏览器中允许应用程序访问相机,否则它将无法工作):

厉害!它可能不完美,但看起来很神奇!

让我们分解代码并解释我们正在做什么。

基本代码结构

为了构建应用程序,我们使用了 p5.js 库,这是一个 JavaScript 库,主要用于处理 canvas,非常适合我们的用例。P5JS 不是你传统的 UI 库,它使用事件来定义什么时候构建 UI,什么时候更新 UI。类似于一些游戏引擎。

我想介绍 p5 的 3 个主要事件:

  • preload:在库加载之后,构建任何 UI 或在屏幕上绘制任何东西之前执行。这使得加载资产变得非常完美。
  • setup:也是在preload之后执行一次,我们在这里准备一切并构建初始 UI
  • draw:循环调用的函数,每次系统需要渲染屏幕时执行。

事先装好

根据定义,我们将使用preload事件来加载我们将在后面的代码中使用的图像,如下所示:

function preload() {
    // Spiderman Mask Filter asset
    imgSpidermanMask = loadImage("https://i.ibb.co/9HB2sSv/spiderman-mask-1.png");

    // Dog Face Filter assets
    imgDogEarRight = loadImage("https://i.ibb.co/bFJf33z/dog-ear-right.png");
    imgDogEarLeft = loadImage("https://i.ibb.co/dggwZ1q/dog-ear-left.png");
    imgDogNose = loadImage("https://i.ibb.co/PWYGkw1/dog-nose.png");
}

很简单。如您所料,p5 中的函数loadImage将加载图像并使其作为 P5 图像对象可用。

设置

这里的事情变得更有趣了,因为它是我们加载 UI 的地方。我们将把在这个事件中执行的代码分成 4 个部分

创建画布

因为我们希望我们的代码具有响应性,所以我们的画布将具有动态大小,该大小将根据窗口大小并使用 4:3 的纵横比来计算。在代码中使用这样的纵横比并不理想,但是我们会做一些假设,以保持代码简洁,便于演示。在我们知道画布的尺寸后,我们可以用 P5 函数createCanvas创建一个,如下所示。

const maxWidth = Math.min(windowWidth, windowHeight);
pixelDensity(1);
outputWidth = maxWidth;
outputHeight = maxWidth * 0.75; // 4:3createCanvas(outputWidth, outputHeight);

捕获视频流

在我们的画布工作后,我们需要从网络摄像头或摄像机捕捉视频流,并将其放入画布,幸运的是 P5 通过videoCapture函数可以很容易地做到这一点。

// webcam capture
videoInput = createCapture(VIDEO);
videoInput.size(outputWidth, outputHeight);
videoInput.hide();

构建过滤器选择器

我们的应用程序很棒,可以为多个过滤器提供选项,所以我们需要建立一种方法来选择我们想要激活的过滤器。同样…我们可以在这里变得非常有趣,然而,为了简单起见,我们将使用一个简单的下拉菜单,我们可以使用 P5 createSelect()函数来创建它。

// select filter
const sel = createSelect();
const selectList = ['Spiderman Mask', 'Dog Filter']; // list of filters
sel.option('Select Filter', -1); // Default no filter
for (let i = 0; i < selectList.length; i++)
{
    sel.option(selectList[i], i);
}
sel.changed(applyFilter);

创建图像跟踪器

图像跟踪器是一个可以附加到视频馈送的对象,它将为每一帧识别所有的脸及其特征。对于给定的视频源,跟踪器需要设置一次。

// tracker
faceTracker = new clm.tracker();
faceTracker.init();
faceTracker.start(videoInput.elt);

绘制视频和滤镜

现在一切都设置好了,我们需要从 P5 更新我们的draw事件,将视频源输出到画布,并应用任何选中的过滤器。在我们的例子中,draw函数将非常简单,将复杂性推到每个过滤器定义中。

function draw() {
  image(videoInput, 0, 0, outputWidth, outputHeight); // render video from webcam // apply filter based on choice
  switch(selected)
  {
    case '-1': break;
    case '0': drawSpidermanMask(); break;
    case '1': drawDogFace(); break;
  }
}

建立蜘蛛侠面具过滤器

蜘蛛侠面具滤镜

构建过滤器可能是一项简单或非常复杂的任务。这将取决于过滤器应该做什么。对于蜘蛛侠的面具,我们只需要将蜘蛛侠的面具图像放在屏幕的中央。为此,我们首先通过使用faceTraker.getCurrentPosition()来确保我们的 faceTracker 对象确实检测到了人脸。

一旦我们检测到我们的面部,我们使用 P5 来使用面部点 62 渲染图像,面部点 62 是作为图像中心的鼻子的中心,并且具有如下表示面部大小的宽度和高度。

const positions = faceTracker.getCurrentPosition();
if (positions !== false)
{
    push();
    const wx = Math.abs(positions[13][0] - positions[1][0]) * 1.2; // The width is given by the face width, based on the geometry
    const wy = Math.abs(positions[7][1] - Math.min(positions[16][1], positions[20][1])) * 1.2; // The height is given by the distance from nose to chin, times 2
    translate(-wx/2, -wy/2);
    image(imgSpidermanMask, positions[62][0], positions[62][1], wx, wy); // Show the mask at the center of the face
    pop();
}

很酷吧?

现在狗过滤器以同样的方式工作,但是使用三张图片而不是一张,每只耳朵一张,鼻子一张。我不会用更多相同的代码来烦你,但是如果你想检查它,回顾一下 codepen ,它包含了演示的完整代码。

结论

在 JavaScript 库的帮助下,识别面部特征并开始构建自己的过滤器是非常容易的。不过,还有一些我们在本教程中没有涉及到的注意事项。比如脸不直对着镜头会怎么样?我们如何扭曲我们的过滤器,使它们符合面部的曲率?或者,如果我想添加 3d 对象而不是 2d 滤镜,该怎么办?

我知道你们中的很多人会用它来做一些很酷的东西,我很想听听你们做了什么,如果你们也能和我分享你们的例子。你可以在推特上找到我。

感谢阅读!

用 Python 检测人脸特征

原文:https://towardsdatascience.com/detecting-face-features-with-python-30385aee4a8e?source=collection_archive---------3-----------------------

计算机视觉

使用 OpenCV 和 DLib 识别人脸并提取最多 6 个面部特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者的形象

今天我们将学习如何使用图像来检测人脸并提取面部特征,如眼睛、鼻子、嘴巴等。我们可以做许多令人难以置信的事情,将这些信息作为预处理步骤,如捕捉人脸以标记照片中的人(手动或通过机器学习),创建效果以“增强”我们的图像(类似于 Snapchat 等应用程序中的那些),对人脸进行情感分析等等。

过去,我们已经介绍过如何使用 OpenCV 来检测图像中的形状,但今天我们将通过引入 DLib 和从图像中提取人脸特征来将它提升到一个新的水平。

[## 帮助您开始学习计算机视觉的基本 OpenCV 函数

了解常见的 OpenCV 函数及其应用,帮助您开始学习计算机视觉。

towardsdatascience.com](/essential-opencv-functions-to-get-you-started-into-computer-vision-743df932e60)

Dlib 是一个先进的机器学习库,旨在解决复杂的现实世界问题。这个库是使用 C++编程语言创建的,它可以与 C/C++、Python 和 Java 一起工作。

值得注意的是,本教程可能需要对 OpenCV 库有一些了解,比如如何处理图像、打开相机、图像处理和一些小技巧。

它是如何工作的?

我们的脸有几个可以被识别的特征,像我们的眼睛、嘴巴、鼻子等等。当我们使用 DLib 算法来检测这些特征时,我们实际上获得了围绕每个特征的点的地图。

这张由 67 个点(称为地标点)组成的地图可以识别以下特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点地图

  • 颌点= 0–16
  • 右眉点数= 17–21
  • 左眉点数= 22–26
  • 鼻点= 27–35°
  • 右眼点数= 36–41
  • 左眼点数= 42–47
  • 嘴部点数= 48–60
  • 嘴唇点数= 61–67

现在我们已经知道了一些我们计划如何提取特性,让我们开始编码吧。

安装要求

像往常一样,本文将提供带有代码的示例,我将一步一步地指导您实现一个完整的人脸特征识别示例。但是在我们开始之前,您需要启动一个新的 Python 项目并安装 3 个不同的库:

  • opencv-python
  • dlib

如果你像我一样使用pipenv,你可以用下面的命令安装它们:

pipenv install opencv-python, dlib

如果你在 Mac 和某些版本的 Linux 上工作,你可能会在安装 dlib 时遇到一些问题,如果你在安装过程中遇到编译错误,请确保检查你正在使用的 CMake 库版本。在 Mac 中,要确保您有 CMake 可用并且版本正确,您可以运行:

brew install cmake

对于其他操作系统,请在线查看具体支持。

步骤 1:加载并显示图像

我们将从小处着手,构建代码,直到我们有一个完整的工作示例。

通常我喜欢使用绘图来渲染图像,但是因为我们在帖子的后面准备了一些很酷的东西,我们将做一些不同的事情,我们将创建一个窗口来显示我们的工作结果。

让我们直接进入代码

import cv2# read the image
img = cv2.imread("face.jpg")# show the image
cv2.imshow(winname="Face", mat=img)# Wait for a key press to exit
cv2.waitKey(delay=0)# Close all windows
cv2.destroyAllWindows()

很简单,对吧?我们只是用imread加载图像,然后告诉 OpenCV 在winname中显示图像,这将打开窗口并给它一个标题。

之后,我们需要暂停执行,因为当脚本停止时窗口会被破坏,所以我们使用cv2.waitKey按住窗口直到按下一个键,之后,我们破坏窗口并退出脚本。

如果您使用代码并将名为face.jpg的图像添加到代码目录中,您应该会得到如下所示的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

原象

第二步:面部识别

到目前为止,我们还没有对图像做任何事情,除了将它显示在一个窗口中,相当无聊,但是现在我们将开始编码好的东西,我们将从识别图像中哪里有人脸开始。

为此,我们将使用名为get_frontal_face_detector()的 Dlib 函数,相当直观。不过有一个警告,这个函数只适用于灰度图像,所以我们必须先用 OpenCV 来实现。

get_frontal_face_detector()将返回一个detector,这是一个我们可以用来检索人脸信息的函数。每个面都是一个对象,包含可以找到图像的点。

但是让我们更好地在代码上看到它:

import cv2
import dlib# Load the detector
detector = dlib.get_frontal_face_detector()# read the image
img = cv2.imread("face.jpg")# Convert image into grayscale
gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarks
faces = detector(gray)for face in faces:
    x1 = face.left() # left point
    y1 = face.top() # top point
    x2 = face.right() # right point
    y2 = face.bottom() # bottom point
    # Draw a rectangle
    cv2.rectangle(img=img, pt1=(x1, y1), pt2=(x2, y2), color=(0, 255, 0), thickness=4)# show the image
cv2.imshow(winname="Face", mat=img)# Wait for a key press to exit
cv2.waitKey(delay=0)# Close all windows
cv2.destroyAllWindows()

上面的代码将从图像中检索所有的面,并在每个面上呈现一个矩形,生成如下所示的图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

到目前为止,我们在寻找人脸方面做得很好,但我们仍然需要一些工作来提取所有的特征(标志)。接下来让我们继续。

第三步:识别面部特征

你喜欢魔术吗?到目前为止,DLib 的工作方式非常神奇,只用几行代码我们就可以完成很多工作,现在我们有了一个全新的问题,它会继续这么简单吗?

简短的回答是肯定的!原来 DLib 提供了一个名为shape_predictor()的函数,它将为我们完成所有的魔法,但有一个警告,它需要一个预先训练好的模型才能工作。

有几个型号可以与shape_predictor一起工作,我正在使用的型号可以在这里下载,但也可以尝试其他型号。

让我们看看新代码现在是什么样子

import cv2
import dlib# Load the detector
detector = dlib.get_frontal_face_detector()# Load the predictor
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# read the image
img = cv2.imread("face.jpg")# Convert image into grayscale
gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarks
faces = detector(gray)for face in faces:
    x1 = face.left() # left point
    y1 = face.top() # top point
    x2 = face.right() # right point
    y2 = face.bottom() # bottom point # Look for the landmarks
    landmarks = predictor(image=gray, box=face)
    x = landmarks.part(27).x
    y = landmarks.part(27).y # Draw a circle
    cv2.circle(img=img, center=(x, y), radius=5, color=(0, 255, 0), thickness=-1)# show the image
cv2.imshow(winname="Face", mat=img)# Wait for a key press to exit
cv2.waitKey(delay=0)# Close all windows
cv2.destroyAllWindows()

像以前一样,我们总是建立在相同的代码上,现在对每张脸使用我们的预测函数来找到界标。现在我仍然在做一些奇怪的事情,比如 27 号在那里做什么?

landmarks = predictor(image=gray, box=face)
x = landmarks.part(27).x
y = landmarks.part(27).y

我们的预测函数将返回一个对象,该对象包含所有 68 个点,根据我们之前看到的图表,这些点符合一张脸,如果您注意它,点 27 正好在两眼之间,因此如果计算正确,您应该会在脸的两眼之间看到一个绿点,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们越来越接近了,现在让我们渲染所有的点,而不仅仅是一个点:

import cv2
import numpy as np
import dlib# Load the detector
detector = dlib.get_frontal_face_detector()# Load the predictor
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# read the image
img = cv2.imread("face.jpg")# Convert image into grayscale
gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarks
faces = detector(gray)
for face in faces:
    x1 = face.left() # left point
    y1 = face.top() # top point
    x2 = face.right() # right point
    y2 = face.bottom() # bottom point # Create landmark object
    landmarks = predictor(image=gray, box=face) # Loop through all the points
    for n in range(0, 68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y # Draw a circle
        cv2.circle(img=img, center=(x, y), radius=3, color=(0, 255, 0), thickness=-1)# show the image
cv2.imshow(winname="Face", mat=img)# Delay between every fram
cv2.waitKey(delay=0)# Close all windows
cv2.destroyAllWindows()

Tada!魔力:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是如果你对所有的点都不感兴趣呢?嗯……你实际上可以调整你的range间隔来获得上面词汇表中指定的任何特性,就像我在这里做的那样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太棒了,但我们能做些更酷的吗?

步骤 4:实时检测

是的,你没看错!是的,这可能就是你所想的!下一步是连接我们的网络摄像头,从您的视频流中进行实时地标识别。

你可以通过相机或使用视频文件遍历视频帧,在你的脸上进行实时面部标志检测。参考下面的代码,如果你想使用自己的摄像头,但对于视频文件,请确保将数字 0 改为视频路径。

如果您想结束窗口,请按键盘上的 ESC 键:

import cv2
import dlib

# Load the detector
detector = dlib.get_frontal_face_detector()

# Load the predictor
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# read the image
cap = cv2.VideoCapture(0)

while True:
    _, frame = cap.read()
    # Convert image into grayscale
    gray = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2GRAY)

    # Use detector to find landmarks
    faces = detector(gray)

    for face in faces:
        x1 = face.left()  # left point
        y1 = face.top()  # top point
        x2 = face.right()  # right point
        y2 = face.bottom()  # bottom point

        # Create landmark object
        landmarks = predictor(image=gray, box=face)

        # Loop through all the points
        for n in range(0, 68):
            x = landmarks.part(n).x
            y = landmarks.part(n).y

            # Draw a circle
            cv2.circle(img=frame, center=(x, y), radius=3, color=(0, 255, 0), thickness=-1)

    # show the image
    cv2.imshow(winname="Face", mat=frame)

    # Exit when escape is pressed
    if cv2.waitKey(delay=1) == 27:
        break

# When everything done, release the video capture and video write objects
cap.release()

# Close all windows
cv2.destroyAllWindows()

最后的结果在这里:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据原始视频创建的 GIF,我必须剪切帧以使 GIF 具有合适的大小。

即使在光线较弱的情况下,结果也相当准确,尽管上面的图像有一些误差,但光线较好的情况下效果很好。

结论

OpenCV 和 DLib 是强大的库,简化了 ML 和计算机视觉的工作。今天我们只触及最基本的内容,还有很多东西要向他们学习。

非常感谢你的阅读!

检测有代码和无代码的假新闻

原文:https://towardsdatascience.com/detecting-fake-news-with-and-without-code-dd330ed449d9?source=collection_archive---------1-----------------------

使用 Python 和其他工具比较不同的 NLP 技术和方法来检测假新闻。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Héizel Vázquez 插图

这些推文到底是真是假?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他们确实是。7 月 15 日(昨天当我写这篇文章时),Twitter 出现了一个重大问题,大账户被黑客攻击,要求比特币捐款,承诺将汇款金额翻倍。因此,即使这些推文是真实的,它们也包含了虚假信息。

该公司在推特上写道:

这不是第一次发生这种情况,也可能不是最后一次。但是,我们能防止这种情况吗?我们能阻止这一切发生吗?

问题是

问题不仅仅是黑客,进入账户,发送虚假信息。这里更大的问题是我们所说的“假新闻”。假新闻是那些虚假的新闻故事:故事本身是捏造的,没有可证实的事实、来源或引用。

当某人(或类似于机器人的东西)冒充某人或可靠来源传播虚假信息时,也可以被认为是假新闻。在大多数情况下,制造这种虚假信息的人有一个议程,可以是政治的、经济的或改变行为或对某个话题的想法。

现在假新闻的来源数不胜数,大多来自编程好的机器人,它们乐此不疲(它们是机器呵呵),全天候持续传播虚假信息。

引言中的推文只是这个问题的基本例子,但在过去 5 年中更严肃的研究表明,虚假信息的传播与选举、关于不同主题的流行观点或感受之间有很大的相关性。

这个问题是真实的,而且很难解决,因为机器人正在变得更好,正在欺骗我们。要一直检测信息的真假并不容易,因此我们需要更好的系统来帮助我们了解假新闻的模式,以改善我们的社交媒体和沟通,并防止世界陷入混乱。

目的

在这篇短文中,我将解释几种使用从不同文章中收集的数据来检测假新闻的方法。但是相同的技术可以应用于不同的场景。

我会用两种方式来做:

  • 对于编码人员和专家,我将解释加载、清理和分析数据的 Python 代码。然后我们会做一些机器学习模型来执行一个分类任务(假的还是假的)
  • 对于非技术人员,我将在 Analyttica 的一个名为 TreasureHunt LEAPS 的系统中使用点击模式,这将允许我们做几乎所有我们用 Python 做的事情,但不需要编程,并且自动查看生成的代码。注意:你点击的 LEAPS 的链接会把你从我的推荐中引导到我的网站,这是一个免费的平台,但是如果你也分享你的链接,你可以赢得积分!

数据

数据来自 Kaggle,你可以在这里下载:

[## 真假新闻数据集

新闻分类

www.kaggle.com](https://www.kaggle.com/clmentbisaillon/fake-and-real-news-dataset)

有两个文件,一个是真实新闻,一个是虚假新闻(都是英文的),共有 23481 条“虚假”推文和 21417 条“真实”文章。

所有数据和代码都可以在这个 GitHub repo 中找到:

[## FavioVazquez/假新闻

假新闻检测。在 GitHub 上创建一个帐户,为 FavioVazquez/假新闻的发展做出贡献。

github.com](https://github.com/FavioVazquez/fake-news)

用 Python 解决问题

数据读取和连接:

首先,我们将数据加载到 Python 中:

fake = pd.read_csv("data/Fake.csv")
true = pd.read_csv("data/True.csv")

然后我们添加一个标志来跟踪假的和真的:

fake['target'] = 'fake'
true['target'] = 'true'

现在让我们连接数据帧:

data = pd.concat([fake, true]).reset_index(drop = True)

我们将打乱数据以防止偏差:

from sklearn.utils import shuffle
data = shuffle(data)
data = data.reset_index(drop=True)

数据清理

删除日期(我们不会将它用于分析):

data.drop(["date"],axis=1,inplace=True)

删除标题(我们将只使用文本):

data.drop(["title"],axis=1,inplace=True)

将文本转换为小写:

data['text'] = data['text'].apply(lambda x: x.lower())

删除标点符号:

import stringdef punctuation_removal(text):
    all_list = [char for char in text if char not in string.punctuation]
    clean_str = ''.join(all_list)
    return clean_strdata['text'] = data['text'].apply(punctuation_removal)

删除停用词:

import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stop = stopwords.words('english')data['text'] = data['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))

数据探索

每个主题有多少篇文章?

print(data.groupby(['subject'])['text'].count())
data.groupby(['subject'])['text'].count().plot(kind="bar")
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有多少假货和真货?

print(data.groupby([‘target’])[‘text’].count())
data.groupby([‘target’])[‘text’].count().plot(kind=”bar”)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假新闻的词云:

from wordcloud import WordCloudfake_data = data[data["target"] == "fake"]
all_words = ' '.join([text for text in fake_data.text])wordcloud = WordCloud(width= 800, height= 500,
                          max_font_size = 110,
                          collocations = False).generate(all_words)plt.figure(figsize=(10,7))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

真实新闻的文字云:

from wordcloud import WordCloudreal_data = data[data[“target”] == “true”]
all_words = ‘ ‘.join([text for text in fake_data.text])wordcloud = WordCloud(width= 800, height= 500, max_font_size = 110,
 collocations = False).generate(all_words)plt.figure(figsize=(10,7))
plt.imshow(wordcloud, interpolation=’bilinear’)
plt.axis(“off”)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最常用词功能:

# Most frequent words counter (Code adapted from [https://www.kaggle.com/rodolfoluna/fake-news-detector](https://www.kaggle.com/rodolfoluna/fake-news-detector))   
from nltk import tokenizetoken_space = tokenize.WhitespaceTokenizer()def counter(text, column_text, quantity):
    all_words = ' '.join([text for text in text[column_text]])
    token_phrase = token_space.tokenize(all_words)
    frequency = nltk.FreqDist(token_phrase)
    df_frequency = pd.DataFrame({"Word": list(frequency.keys()),
                                   "Frequency": list(frequency.values())})
    df_frequency = df_frequency.nlargest(columns = "Frequency", n = quantity)
    plt.figure(figsize=(12,8))
    ax = sns.barplot(data = df_frequency, x = "Word", y = "Frequency", color = 'blue')
    ax.set(ylabel = "Count")
    plt.xticks(rotation='vertical')
    plt.show()

假新闻中出现频率最高的词:

counter(data[data[“target”] == “fake”], “text”, 20)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

真实新闻中最常见的词:

counter(data[data[“target”] == “true”], “text”, 20)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

建模

建模过程将包括对存储在“文本”列中的语料库进行矢量化,然后应用 TF-IDF ,最后是分类机器学习算法。相当标准的文本分析和自然语言处理。

对于建模,我们有这个函数来绘制模型的混淆矩阵:

# Function to plot the confusion matrix (code from [https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html](https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html))
from sklearn import metrics
import itertoolsdef plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i, j],
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

拆分数据:

X_train,X_test,y_train,y_test = train_test_split(data['text'], data.target, test_size=0.2, random_state=42)

逻辑回归:

# Vectorizing and applying TF-IDF
from sklearn.linear_model import LogisticRegressionpipe = Pipeline([('vect', CountVectorizer()),
                 ('tfidf', TfidfTransformer()),
                 ('model', LogisticRegression())])# Fitting the model
model = pipe.fit(X_train, y_train)# Accuracy
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

我得到了 98.76%的准确率。混乱矩阵:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决策树分类器:

from sklearn.tree import DecisionTreeClassifier# Vectorizing and applying TF-IDF
pipe = Pipeline([('vect', CountVectorizer()),
                 ('tfidf', TfidfTransformer()),
                 ('model', DecisionTreeClassifier(criterion= 'entropy',
                                           max_depth = 20, 
                                           splitter='best', 
                                           random_state=42))])
# Fitting the model
model = pipe.fit(X_train, y_train)# Accuracy
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

我得到了 99.71 %的准确率。混乱矩阵:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机森林分类器:

from sklearn.ensemble import RandomForestClassifierpipe = Pipeline([('vect', CountVectorizer()),
                 ('tfidf', TfidfTransformer()),
                 ('model', RandomForestClassifier(n_estimators=50, criterion="entropy"))])model = pipe.fit(X_train, y_train)
prediction = model.predict(X_test)
print("accuracy: {}%".format(round(accuracy_score(y_test, prediction)*100,2)))

我得到了 98.98 %的准确率。混乱矩阵:

cm = metrics.confusion_matrix(y_test, prediction)
plot_confusion_matrix(cm, classes=['Fake', 'Real'])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不用编码解决问题

我们有一个很好的 Python 模型。现在是时候不用编码做同样的事情(或者尽可能多的事情)了。同样,我们将为此使用一个名为 LEAPS 的系统。有很多事情要做,我也不想复制 15 张截图来说明怎么做。所以我只放最重要的部分。

重要提示:为了能够使用某些函数,您需要选择数据集的至少一列。如果你想了解更多关于如何使用平台查看他们的免费课程 这里

以下是如何做到这一点:

  • 创建一个免费帐户
  • 创建新项目
  • 上传数据:您必须分别上传每个数据集,然后将“fake.csv”重命名为 fake,将“true.csv”重命名为 true。在平台中这是一个简单的过程。
  • 在假数据集和真数据集中创建一个名为“target”的列。对于假的,它应该是一个常量值 0 ,对于真的,它应该是一个常量值 **1。**进入功能- >数据管理- >列操作- >生成常量列(Py)。注意:要执行此操作,您必须选择数据集中的所有列。创建列后,您必须将其重命名为“目标”。
  • 追加两个表,并用真假 tweets 创建一个完整的表。确保在执行追加之前选择所有列。你可以在函数->数据管理->表操作->追加表中找到追加操作。将新表重命名为“All”。注意:您必须从两个数据集中选择所有列来执行追加表操作。
  • 删除“日期”和“标题”列。首先选择它们,然后进入功能->数据管理->列操作->删除列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 最后一步创建了一个新表,在我的例子中命名为“Table_4”。我们将暂时在那张桌子上工作。现在,我们将把列“text”全部转换为小写。为此,我们选择列,然后进入函数->文本分析->文本预处理->小写。你应该有这个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 我们现在将删除标点符号。要做到这一点,进入功能->文本分析->文本预处理->删除标点符号。你应该会看到这个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 让我们创建一个语料库来进行下一步工作。要做到这一点,进入功能->文本分析->文本预处理->建立语料库。让我们也将最后一列重命名为“语料库”。
  • 最后,让我们删除停用词(在“语料库”列)。要做到这一点,进入功能->文本分析->文本预处理->删除单词。这将删除基于一些 Python 和 R 库的单词,但是您可以在这里定义更多要删除的单词。这是你现在应该有的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 让我们从 Python 部分复制一些图表和统计数据。第一:每科多少篇?我们必须选择“主题”列,然后转到函数->数据可视化->分布图->按组绘制密度图(Py)。这是我能得到的最相似的图表。结果是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 现在让我们看看一个图表中有多少“假”和“真”的文章。为此,请转到函数->数据可视化->分布图->直方图。这是我得到的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 让我们现在建立单词云。为此,我必须首先再次分离“假”和“真”文章的数据。要做到这一点(选择“目标”列),进入功能->数据管理->数据采样/子集->过滤分类。我为“假的”创建了一个名为“Fake_Clean”的表,然后为“真的”创建了一个名为“True_Clean”的表。然后我为两个语料库(语料库的复数)都创建了单词 cloud。要创建词云,请进入功能->文本分析->信息检索->词云,选择“语料库”栏。注:最后我按类用了云这个词,选了“目标”作为类。结果是一样的。

这是我从“假”文章中得到的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是“真实”的文章:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

非常类似于 Python 的结果。

  • 然后我画出了“假”和“真”文章中最常见的词。为此,请进入功能->文本分析->信息检索->常用术语。对于我得到的“真实”文章:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于我得到的“假”文章:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再次非常类似于我们在 Python 部分得到的。

  • 对于 ML 部分,让我们从随机森林分类器开始。我进入函数->文本分析->文本分类->随机森林分类(Py)配置(选择“目标”和“语料库”变量):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将标记化,然后使用 TF-IDF 作为加权度量。这是结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您将获得一个新列,其中包含您的模型的结果。很简单。如果您想获得 Python 或其他地方的指标,现在可以下载带有模型的最终数据集。同样的过程也可用于其他型号,如:

  • 决策树分类
  • SVM 分类
  • 高斯朴素贝叶斯分类

还有更多!您甚至可以将这些模型与比较文本分类模型进行比较。此外,您可以测试其他模型,如情感分析、文本聚类、Word2Vec 等等。

结论

文本分析和自然语言处理可以用来解决假新闻这个非常重要的问题。我们已经看到了它们对人们的观点以及这个世界思考或看待一个话题的方式所能产生的巨大影响。

我们使用样本数据建立了一个机器学习模型来检测虚假文章,但这个过程与检测虚假推文或类似的事情非常相似。你首先需要收集数据,如果你对如何用 twitter 做这件事感兴趣,我去年写了一篇文章:

[## 使用 Spark、Optimus 和 Twint 在几分钟内使用 NLP 分析推文

社交媒体是研究人们交流和行为方式的黄金,在这篇文章中,我将向你展示…

towardsdatascience.com](/analyzing-tweets-with-nlp-in-minutes-with-spark-optimus-and-twint-a0c96084995f)

我们还看到,用 Python 构建模型很简单,如果你知道如何编码,我认为我们都应该学习,但如果你不知道,像 TreasureHunt LEAPS 这样的平台可以帮助你不费吹灰之力就解决问题,而且还是免费的!您甚至可以与他人分享您解决的问题和内置代码,进行协作、学习等等

感谢您阅读本文,希望它能对您当前的工作或调查以及对数据科学的理解有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值