TowardsDataScience 博客中文翻译 2020(五百二十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

分析可能影响冠状病毒传播的因素

原文:https://towardsdatascience.com/identifying-factors-that-leads-to-increased-infection-cases-with-correlation-analysis-e49d75eebbb5?source=collection_archive---------41-----------------------

使用 Python 创建和分析相关性矩阵的分步指南

本文将通过这个过程来执行一个简单的相关性分析。我们将使用冠状病毒感染数据以及我们认为可能影响感染病例的其他关键因素来分析 Python 上各因素之间的相关性。

虽然有其他方法也可以揭示因素之间的关系,但相关矩阵是筛选高度相关因素进行分析的最简单工具之一。但是,它也有自己的局限性。因此,重要的是要注意,分析的结果不是过程的结束,而是进一步探索和验证因素之间关系的起点。

了解数据集

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

数据集的前 20 行数据(总共 213 行)

我们将使用的数据集包含 Worldometer [1]按国家(截至 2020 年 4 月 17 日)报告的冠状病毒病例。“空白”单元格表示数据不可用。如果你想要一个更新的版本,请随时用最新的数据更新专栏。您可以在此处获得初始数据集:

https://gist . githubusercontent . com/Coronavirus-20/ecbb 27016122 e 91 ab4 a 273195d 89 b 0d 9/raw/B3 ce 86 ddfa 4a 93391 DD 1a 08400277 bea 51 a5 f 386/Coronavirus _ 17 apr . CSV

从数据集来看,我们假设有几个因素可能会影响冠状病毒数据点,如下所示:

  1. 同POPULATION密度(每公里):全国平均每平方公里人口密度(资料来源:Worldometer,2020 年)
  2. 平均值。风速(米/秒):距地面 10 米处的平均风速*(来源:GlobalWindAtlas,2019)*
  3. 平均值。全年温度。(c .):以摄氏度记录的年平均温度*(资料来源:Mitchell,T.D .,Carter,T.R .,Jones,P.D .,Hulme,m .,New,m .,2003 年:欧洲和全球月气候综合高分辨率网格:观测记录(1901-2000 年))*
  4. 平均值。年降水量(毫米/年。):以毫米为单位的平均年降水量*(资料来源:世界银行,2014)* —最初,我们希望找到*%相对湿度*数据,但由于数据相对有限,因此我们必须使用降水量,因为它与湿度高度相关
  5. %Pop。高收入:日收入超过 50 美元的人口比例*(资料来源:皮尤研究中心,2011 年)*
  6. %Pop。中上收入:日收入 20.01-50 美元的人口比例*(资料来源:皮尤研究中心,2011 年)*
  7. %Pop。中等收入:日收入 10.01-20 美元的人口比例*(资料来源:皮尤研究中心,2011 年)*
  8. %Pop。低收入:日收入 2.01-10 美元的人口比例*(资料来源:皮尤研究中心,2011 年)*
  9. %Pop。穷人:日收入≤2 美元的人口比例*(资料来源:皮尤研究中心,2011 年)*
  10. %Pop。年龄≤ 14 岁:2017 年年龄≤ 14 岁的人口比例*(资料来源:世界银行,2017)*
  11. %Pop。15-64 岁:2017 年 15-65 岁人口的百分比*(资料来源:世界银行,2017)*
  12. %Pop。年龄≥ 65 岁:2017 年年龄≥ 65 岁人口的百分比*(资料来源:世界银行,2017)*
  13. 当前锁定状态(Y/N):如果在撰写本文时在该国的任何地区实施了任何类型的锁定,则值为“是”

正如你所看到的,有些数据可能有点太旧了,有些是全国或年度平均值的形式。这是因为这些因素的许多开源详细数据是不可用的。尽管如此,我们仍将利用这些数据来了解现阶段的总体数据趋势。如果可以得出任何有意义的见解,我们总是可以将我们的方法集中在更细粒度的相关因素上。

用 Python 分析数据

既然我们已经准备好了数据集,我们将开始在 Python 上分析相关矩阵。首先,我们需要导入以下库。

**import** pandas as pd
**import** seaborn as sns

然后,我们导入数据集。在这里,我们可以直接从存储库中导入数据集,或者您也可以保存文件并使用’ read_csv ‘或’ read_excel '在本地导入数据集(如果您已经以 excel 格式保存)。

# Import the datasetdf = pd.read_csv(r'*FILE_PATH*\*FILE_NAME.csv*') # Data Previewdf.tail()

Python 上呈现的示例数据如下:

Country/Region              Infected  ...  %Pop. Age >=65  \
0                    World   2250709  ...             NaN   
1                      USA    710021  ...            15.4   
2                    Spain    190839  ...            19.4   
3                    Italy    172434  ...              23   
4                   France    147969  ...            19.7   
..                     ...       ...  ...             ...   
208            South Sudan         4  ...            3.4    
209               Anguilla         3  ...             NaN   
210  Caribbean Netherlands         3  ...             NaN   
211  Saint Pierre Miquelon         1  ...             NaN   
212                  Yemen         1  ...            2.9Current Lockdown Status (Y/N)  
0                              NaN  
1                                Y  
2                                Y  
3                                Y  
4                                Y  
..                             ...  
208                              N  
209                              N  
210                              N  
211                              N  
212                              N

正如您所看到的,有些记录包含“NaN”数据,这是因为缺少源级别的数据。然后,我们将不得不替换这些“NaN ”,以便我们可以继续分析数据集。

df_fill = df.fillna("")

这样,我们将用空白或“0”替换“NaN”。现在,清理完数据后,我们将直接进入数据分析。既然我们的目标是找到可能影响总感染病例或死亡率的因素,那么为什么不尝试相关图来查看每个因素之间的关系。

绘制相关矩阵

规则 1:相关性≠因果关系。相关性并不意味着因果关系,即使这两个因素之间有很高的相关性。因此,在建立因果联系之前,我们必须对这些因素之间的关系进行更多的研究。

首先,为了绘制因素之间的相关性,我们必须确保所有的值都是数字,以便我们可以计算相关系数。锁定状态等分类数据以“Y”或“N”格式列出。我们需要将它们转换成数字格式。通过因式分解,我们可以将“Y”和“N”分别转换为类似“0”和“1”的值。

df_num = df_fill.apply(lambda x: pd.factorize(x)[0])+ 1

你会注意到我在末尾加了+1。这是因为我不想将某个类别转换为“0”。我希望它从“1”开始。虽然这不会影响相关性分析,但是当我们在列之间进行操作时,这是很有用的。您不会希望在划分两列时发现某些值被“0”所除。

接下来,我们将绘制每个因素之间的相关性。在这里,我们将使用’ seaborn '软件包以热图的形式绘制相关性。

corr = df_num.corr()ax = sns.heatmap(corr,vmin=-1, vmax=1, center=0,cmap=sns.diverging_palette(20, 220, n=200),square=True)ax.set_xticklabels(ax.get_xticklabels(),rotation=45,horizontalalignment='right');

瞧,我们现在得到了数据集的相关矩阵。

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

相关矩阵的每个网格都填充有不同的蓝色阴影(代表因素之间的正相关程度)和红色阴影(代表因素之间的负相关程度)

如果文本都被塞满了,或者图形太小而没有意义,你可能不得不用“ figsize 值来调整图形大小,并重新运行上面的相关代码。

sns.set(rc={'figure.figsize':(15,15)})

相关性分析

在这里,我们将从相关矩阵中筛选出因素并形成假设。有许多网格和区域是非常相关的。而其中一些是提供冗余信息的密切相关的因素(例如“测试阳性”与“活动病例”、“感染病例”与“死亡”等。),还有其他几个现阶段略显牵强,无关紧要的(例如。当前锁定状态与%Pop。年龄≥ 65 ','平均。风速(米/秒)与流行。密度(每平方公里)等。).因此,我们寻找介于这两个极端之间的高度相关的因素是很重要的。这些通常是我们可以形成假设来进一步证明因果关系的。一些假设如下:

答:“平均风速”与“感染病例”:这两个因素之间的相关性是相当深蓝的。虽然没有直接信息表明这两个因素之间的直接关系,但这种关系可能值得进一步探讨。据报道,来自被感染患者的病毒飞沫可以传播并感染附近的其他病原体。(更新:最近有报道称在空气污染颗粒上发现了病毒株[6])。风速可能会影响这些水滴的飞行距离,反之亦然。

如果观察下面的地图,美国东海岸中部高度受影响地区的平均风速似乎高于西海岸[2]。这似乎与编写本报告时迄今为止发现的病例分布情况有关。

当然,也可能有其他气候因素影响风或空气,这也可能与报告的病例数量相关。例如,有数据表明高湿度可以减缓流感的传播[3]。与相对湿度(%)数据最接近的数据是相关矩阵中的年平均降水量数据。

因此,我们需要找到更精细的数据,然后才能分析和确定感染病例上升与更高风速(或任何气候因素)之间的因果联系。

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

2015 年全年地面以上 10 米处的全球平均风速[2] —颜色越红表示该区域的平均风速越高。你可以看到美国东海岸、英国、冰岛和地中海大部分是红色或黄色的。

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

更新:约翰·霍普斯金大学发布的截至 2020 年 4 月 24 日的全球报告病例地图[5]

B. ‘%Pop。高收入’& '%Pop。“中上收入”与感染数据:这两个相关性呈浅红色。事实上,与感染数据相比,高收入和中高收入人群大多为红色。当您将这一部分与其余三个收入部分一起看时,低收入和贫困部分似乎比中上收入及以上部分与案件数量和活跃案件数量更呈正相关(尽管略有正相关)。

关于人口统计学和报告病例之间关系的假设并不新鲜。有数据表明,富人可能有更多的机会来抵御病毒。例如,与可能在一线工作的低收入阶层相比,上层阶级确实可以在家工作,并且在封锁期间可以维持相对较高的收入[4]。

因此,这些相关数据是我们理解不同收入阶层如何受到流行病影响的起点。如果因果关系完全成立,那么这应该是世界各国政府在这些艰难时期提供援助和支持以帮助那些需要帮助的人的首要任务之一。

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

最高收入人群与报告病例总数、死亡人数和活跃病例数呈负相关(基于 2020 年 4 月 17 日的报告病例[1])

C .其他值得注意的关系:从这个相关矩阵中我们还可以探索出很多东西。

  1. ‘砰’的一声。“密度(每平方公里)”与“感染病例”:这一点可能并不令人惊讶。我们知道这种病毒通过密切接触传播。但是,这一点可以与’ Avg '结合使用。风速(m/s)”来建立预测感染病例的模型,因为这两个因素与“感染病例”高度相关。
  2. ’%波普。“年龄≥65”与“严重病例”:这一个可能有点棘手,因为相关系数似乎只有轻微的正相关。这并不一定说明大部分重症患者年龄在 65 岁及以上(切记:相关≠因果)。事实上,甚至有一些关于这种冠状病毒对不同年龄组患者免疫系统的影响的报告,并导致其过度活跃(也称为“细胞因子风暴”)。因此,我们不能仅由此得出因果关系。然而,这条相关信息确实表明,“老年公民比例较高的国家可能面临严重病例的风险”的可能性相当小。
  3. “当前封锁状态”与感染数据:许多人会惊讶为什么封锁状态与感染病例正相关。在这里,我们见证了游泳者的身体错觉。由于许多国家在其领土内遇到感染病例后实施封锁,因此封锁数据往往与该特定区域的感染报告流行率相关。因此,我们可以相当肯定,在这种情况下,案件的数量导致封锁,而不是相反。

含义

随着封锁的最后期限越来越近,许多人担心感染病例可能会激增,第二波感染会再次出现。因此,至关重要的是,要有一个计划来处理解除封锁前可能发生的情况。

想象一下,如果上述相关性确实有直接的因果联系。然后,我们将不得不重新思考我们应对流行病的方式,尤其是在封锁后。

  1. 如果风速确实与感染率有因果关系,那么 6 英尺的社交距离。(1.83 米)可能还不够。对于有风的地方,我们可能需要保持更远的距离,以避免感染。季节性也可能影响感染率,因为春季(大约 3-4 月)或热带地区即将开始的雨季风速可能较高。如果这是真的,与北半球或南半球的国家相比,赤道附近的国家在今年下半年遏制病毒的形势可能会更加严峻。
  2. 如果确实有很大一部分感染者来自低收入阶层,那么世界各国政府早就应该开始规划和推出计划,在不同国家解除封锁之前,提前系统地援助穷人。这种援助可能以不同的形式出现,可以减轻他们可能面临的经济和工作保障问题。

当然,戴上口罩,保持距离,防止与面部(尤其是鼻子和眼睛等软组织)的任何接触,不仅重要,而且是在这个可怕的时刻拯救你所爱的人的必要条件。然而,探索其他见解对一般预防措施也是有用的,特别是如果你曾经处于这样一个几乎没有防护设备的位置。

下一步是什么?

鉴于这些只是相关性数据,真正的工作将从这里开始。我们需要对这些因素之间的关系进行更多的研究,以证明(或否定)这些假设,然后才能得出关于因果关系的公正结论。

除了研究之外,我们可能还需要更新数据集,以更好地反映当前的情况(更新:污染数据集也可能被添加,因为有报告称在污染颗粒上发现了病毒株[6])。今后,我们可以以时间序列的形式收集数据,以便更好地分析趋势。在这种情况下,城市或月度数据也可能是有用的,因为我们将能够避免使用大面积平均数据的问题,这可能会导致错误。然后,我们可以使用收集到的精确数据,使用相关矩阵或预测能力评分(PPS) 进行重新分析,这可能会产生新的见解。

此外,对于某个区域,可以基于所述因素训练简单的预测模型。预测某个地区未来病例数的线性回归模型示例可以写成如下形式:

感染病例(第 N+1 天)~平均值。风速(过去 1 周——或潜伏期)+人口密度+当前活跃病例

这样我们也可以测试这些因素的假设是否成立。如果测试集上的预测准确性很差,那么我们可能必须改变回归模型中的因子(或找到新的因子)。

最后,我希望这篇文章已经帮助您不仅为这个数据集,而且为您可能有的任何自定义数据集创建了简单的相关矩阵。注意安全!

参考

[1]: Worldometer。(2020 年 4 月 17 日)。各国冠状病毒报告病例。https://www.worldometers.info/coronavirus/

[2]:格拉西、维罗内西、申克尔、佩尔、纽科姆、沃尔克温、马丁、胡尔尼。(2015).使用开源 GIS 数据绘制全球风能潜力图

【3】:风大。外部温度会影响冠状病毒/新冠肺炎吗?https://www . windy . com/articles/does-outside-temperature-influence-the-spreading-of-coronavirus-新冠肺炎-11519?13.762,100.532,5

【4】:石英。冠状病毒预防对富人来说更容易获得。https://qz . com/1818862/coronavirus-prevention-is-more-accessible-for-the-rich/

更新:

[5]:约翰·霍普斯金大学。约翰·霍普金斯大学(JHU)系统科学与工程中心(CSSE)的新冠肺炎仪表板。https://gisanddata . maps . ArcGIS . com/apps/ops dashboard/index . html #/BDA 7594740 FD 40299423467 b48e 9 ECF 6

[6]以色列时报。意大利科学家在空气污染颗粒上发现冠状病毒https://www . timesofisrael . com/scientists-in-Italy-find-coronavirus-on-air-pollution-particles/

未来历史学生注意:在撰写本文时,冠状病毒感染已超过 200 万例。政府正在加紧实施和延长封锁,以延缓感染的激增。医务人员和设施都很紧张。世界各地的各种研究实验室正在加速疫苗项目,这些项目仍处于试验阶段,可能需要几个月的时间。继续战斗!

识别假新闻:骗子数据集及其局限性

原文:https://towardsdatascience.com/identifying-fake-news-the-liar-dataset-713eca8af6ac?source=collection_archive---------36-----------------------

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

马克斯·穆塞尔曼在 Unsplash 上拍摄的照片

我正在进入 Metis 数据科学训练营的最后阶段,只剩下一个项目了。我做的前三个项目如下:

这一次,我的目标是通过对 2017 年骗子假新闻数据集应用分类技术、基本自然语言处理(NLP)和话题建模来确定哪条新闻是假的。

TL;博士:

  • 从骗子数据集中检索并设计了四个特征,对其中三个应用了主题建模
  • 骗子数据集缺少时间特征;还有重要的空白演讲者工作和从属关系
  • 随机森林和朴素贝叶斯都显示出过度拟合数据的趋势
  • 接下来的步骤是补充额外的数据集;适用不同型号;使用更高级的 NLP 工具;或者进一步设计特征

一.背景

Statista 提供以下关于美国人口的信息:

  • 超过一半的人声称经常在脸书或推特等网站上看到假新闻
  • 超过四分之一的人很少相信他们在社交媒体上看到的新闻
  • 14%的人说他们故意在网上分享虚假的政治新闻

正如 Statista 所说,这是“令人担忧的”。因此,我们的目标如下:

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

二。检索数据

骗子数据集由威廉杨于 2017 年 7 月出版。他又从 PolitiFact 的 API 中检索数据。这个网站收集了美国“发言人”的陈述,并给他们分配了一个从“真实”到“裤子着火”的真实值。杨主要检索了 2007 年至 2016 年期间的陈述。

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

来自 PolitiFact 的事实核查示例

数据集预先分为训练、验证和测试文件。出于我们的目的,我们将按如下方式使用这些文件:

  • **训练数据集:**使用 80/20 分割,对我们的模型进行 5 重交叉验证
  • **验证数据集:**评估我们的模型结果并选择我们的模型
  • **测试数据集:**判断最终模型

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

骗子数据集中的 tsv 文件列表

LIAR 数据集具有以下特征:

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

骗子数据集中的要素列表

然后,我放弃了以下功能:

a)真实信用记录

在附带的论文中,杨利用说话人真值的总计数来分类他的数据。我发现这有问题,因为这基本上包括了未来知识,这是一个大禁忌,尤其是因为数据集不包括报表的日期。这样的时间信息需要包含在每个语句中,以便我们进行适当的时间序列分析。

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

不,我们不是算命的;我们看不到未来,也不应该用未来的知识来做预测。(胡尔基·奥莰·塔巴克在 Unsplash 上拍摄)

这是非常不幸的,因为从直觉上来说,一个说话者之前的陈述的真实历史很可能是一个很好的预测者,可以预测这个说话者接下来的陈述是否是真实的。但是我们将不得不将就。

b)发言人姓名

在说谎者数据集中有 2910 个独特的说话者。我放弃了这一点,因为新的发言者一直在出现,所以将发言者作为一个功能包括在内的价值有限,除非同一发言者将来会发表声明。

当然,某些“发言人”很可能会继续发表声明,尤其是高调的政治家和政府官员;然而,我觉得从长远来看,让预测更一般化会更有价值。

三。分析数据

a)真值偏向“真”和“基本真”

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

这种分布适用于每一个主题,如下面 20 个最常见的主题所示。

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

b)议长的从属关系大多是共和党、民主党或没有

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

还有 19 个附属机构。

c)发言人职位减少,但超过四分之一的发言人职位是空白的

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

这份前几名的样本可以让我们了解这些工作有多不同。

d)主题似乎是最重要的特征

我使用 scikit-learn 的默认随机森林分类器的特征重要性得出了这个推论。

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

深粉色条代表主题特征,浅粉色条代表来自其他列的特征。注意暗粉色是多么的普遍。

四。特征选择

a)目标特征:标签(真值)

我为我的模型考虑了两种类型的目标:

  • 原 6 个真值:‘真’、‘大部分-真’、‘半真’、‘大部分-假’、‘假’和’裤子-火’。
  • **二进制‘真’和‘假’值:**我把‘真’和‘大部分是真’归入‘真’,其余归入‘假’。这是基于 PolitiFact 的对真实值的描述,其中将“真实”和“基本真实”归类为准确的陈述,而其他的则在不同程度上不准确。

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

最初的 6 个真值以及我如何分组为二进制目标。图片来自 PolitiFact (权限待定)。

b)主题和演讲者工作

我考虑了以下方法:

  • 使用全部 141 个主题全部 1185 个扬声器工作岗位
  • 使用 20 或 50 个最常见的科目或工作
  • 使用 20 或 50 个最重要的主题或工作(由默认随机森林的功能重要性决定)

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

过滤 20 个最常见的主题,并将其余主题归入“其他”的示例

c)陈述、上下文和演讲者工作

我想看看我是否可以使用主题建模来做以下事情:

  • 推断每条语句的主题(又名主语)。
  • 将上下文和说话者工作分组,以便处理更少的维度(对于 2,910 个不同的说话者有 1,185 个不同的说话者工作,对于 10,240 个陈述有 3,970 个不同的上下文)。

下图说明了这种方法。

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

我考虑了以下主题建模方法:

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

不同的主题建模技术呈现的主题似乎没有明显的差异;而且,在陈述的情况下,产生的主题看起来与说谎者数据集的实际主题非常相似,说明了主题/主题的不同计数。正如后面将要看到的,这些主题对不同模型的性能也没有明显的影响。

最后,我决定采用斯坦福大学的手套单词嵌入法产生的 300 个特征。

c)说话者从属关系

我使用最初的 21 个发言者的从属关系作为类别。

下面的图表总结了我的方法。

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

动词 (verb 的缩写)型号选择和性能

我考虑了以下模型:

  • 随机森林(20 次迭代的超参数随机搜索)
  • 多项式朴素贝叶斯(超参数网格搜索)

最佳执行模型是随机森林。但是它在训练数据集上的 f1 分数是 0.58,从训练和评估数据集的混淆矩阵来判断,它似乎也严重过度拟合:

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

与训练数据集相比,评估数据集的精度极低,这表明过度拟合。

不管我上面选择的特征、目标和模型的组合如何,这种过度拟合的趋势都适用。

不及物动词观察

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

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

模型表现不佳可能有几个原因:

  • 缺少日期意味着缺少历史信息。
  • 普遍存在遗漏发言人工作和从属关系,这意味着这些特征对于确定哪条新闻是假的可能不是很有用。
  • 骗子数据集中的一些文章来自错误的数据集 (PolitiFact 的 Flip-o-Meter,而不是它的 Truth-o-Meter),但却标有真值。结果,那些数据点对于训练模型是没有用的,因为它们被错误地标记了。

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

这篇 PolitiFact 文章出现在骗子数据集(5919.json)中,被标记为“虚假”,尽管它实际上是在谈论米特罗姆尼如何在堕胎问题上转变立场,而不是一条具体的新闻(虚假或其他)

此外, Gosh 和 Shah 在 2019 年的一篇论文中指出:

“[骗子]数据集…被认为很难对进行分类,因为缺乏可供验证的来源或知识库”

七。进一步的工作和学习要点

显然,骗子数据集不足以确定一条新闻是否是假的。未来的工作可包括以下内容:

  • 补充其他假新闻数据集或 API 的。就这一点而言,PolitiFact 不再有自己的 API,而是许多利用谷歌事实检查 API 的事实检查者之一。根据初步检查,LIAR 数据集中可用的语句与从事实检查 API 检索的 PolitiFact 中的语句几乎没有重叠。
  • 进一步设计功能;例如通过聚类由手套嵌入生成的 300 个特征,或者专注于识别假新闻的来源,而不是或者除此之外,识别一条新闻是否是假的。
  • 应用不同的模型,例如梯度推进或递归神经网络。
  • 使用更高级的 NLP 工具,例如词性分析或谷歌的 BERT 模型。

该项目强调了使用高质量数据的重要性。我也学到了很多关于无数形式的主题建模的知识。当我完成最后的数据科学训练营项目时,我会牢记这些经验教训。

利用 R(程序设计)识别欺诈性招聘广告

原文:https://towardsdatascience.com/identifying-fraudulent-job-advertisements-using-r-programming-230daa20aec7?source=collection_archive---------45-----------------------

欺诈分析简单介绍

背景

在线招聘欺诈(ORF)是一种恶意行为,旨在通过欺诈性招聘广告造成隐私损失、经济损失或损害利益相关方的声誉。

分析任务的目的是从数据中识别欺诈性招聘广告,确定欺诈的关键指标,并就未来如何识别欺诈性招聘广告提出建议。

资料组

我们将使用就业骗局爱琴海数据集(EMSCAD),可以在http://icsdweb.aegean.gr/emscad下载。此页面提供了数据收集方式的描述和数据字典。

该数据集包含 17,880 个现实生活中的招聘广告。数据集中的变量包括:

方法学

首先,重要的是理解如何利用数据集来区分欺诈性和非欺诈性广告,因为这将决定将采用的分析方法的类型。作为二进制字段“欺诈性”的响应变量是我们试图预测的,其中 t =“是”,f =“否”。

了解数据集以选择分析方法

我们有一组未分类的变量,本质上是 HTML 字符串——好处、公司简介、描述和要求。文本数据需要的分析类型是情感&情感分析或频率分析。

有 11 个分类或因素变量——位置、公司徽标、行业、职能、工资范围、部门、所需教育、所需经验、就业类型、远程办公和问题,这些变量将被输入到机器学习算法中,如梯度推进机(GBM)、分布式随机森林(DRF)和广义线性模型(GLMNET ),以确定可用于区分欺诈性和非欺诈性广告的最佳预测值。

由于将使用两种分析方法—一种用于字符串变量,另一种用于因子变量,因此将有如下两组输出:

  • HTML 变量:情绪、情感和词频图
  • 名义变量和二元变量:顶级预测值、系数

一些变量对任何信息都没有贡献,因此,它们被排除在分析之外。这些包括标题和不平衡,因为标题是标识信息,不平衡用于包括和排除记录以平衡数据集。

数据 ETL

在建模之前,必须执行一些步骤来清理数据集。下面的流程图显示了为建模准备数据集所执行的步骤。

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

图 1:数据 ETL 流程图

结果

输出—文本分析

单词云

为每一个 HTML 字符串——公司简介、工作描述、要求和福利——创建了单词云。

下面的单词云表示非欺诈性广告(左)和欺诈性广告(右)的公司简介。

  • 非欺诈性广告强调工作生活的平衡(“家庭”、“生活”、“关怀”)和公司文化(“团队”、“体验”)
  • 欺诈性广告在很大程度上忽略了公司简介,强调金钱上的好处(“手机”、“金钱”、“成本”)

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

图 2.1:公司广告——非欺诈性

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

图 2.2:公司广告——欺诈

下面的单词云表示非欺诈性广告(左)和欺诈性广告(右)的职位描述。

  • 非欺诈性广告强调公司产品(“天然气”、“石油”、“运营”)
  • 欺诈性广告强调金钱价值(“金钱”、“财务上”、“折扣”),非欺诈性广告强调公司产品(“天然气”、“石油”、“运营”)

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

图 3.1:职位描述——非欺诈性广告

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

图 3.2:职位描述:欺诈性广告

下面是工作要求的词汇云——左边是非欺诈性的,右边是欺诈性的。

  • 非欺诈性广告强调多年的经验、技能、学位资格和项目导向
  • 欺诈性广告在较低程度上强调上述属性,非欺诈性广告强调多年的经验、技能、学位资格和项目导向

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

图 4.1:工作要求——非欺诈性广告

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

图 4.2:工作要求——欺诈性广告

最后,下面的单词云是基于对工作福利的测试。

  • 非欺诈性广告强调诸如“病假”、“工作时间”和“假期”等福利
  • 欺诈性广告似乎提供金钱上的好处,如住宿、假期、食物、有竞争力的薪水、签证和食物等。

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

图 5.1:工作福利——非欺诈性广告

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

图 5.2:工作福利——欺诈性广告

情感分析

另一种分析文本的方法是通过情感分析,这是与文本中的每个单词相关联的情感类型(积极或消极)。

例如,看看下面的非欺诈性和欺诈性招聘广告的情感类别,我们可以看到,非欺诈性广告(左)的比例更大,是积极的(“喜悦”、“惊喜”),而欺诈性广告(右)的比例则相反。

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

图 6:情感情绪分析:非欺诈性广告与欺诈性广告

我们也可以看看这些广告的极性,即倾向于特定的情感类别,积极的或消极的。与欺诈性广告相比,非欺诈性广告的正面比例更高。

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

图 7:非欺诈性广告与欺诈性广告的情感(极性)分析

如文本情感的词云和条形图的例子所示,我们可以看到文本信息在预测某些行为方面非常有用。下一个合乎逻辑的步骤是根据广告的情绪/极性将这些广告标记为正面或负面,并将这些信息作为二进制变量引入机器学习模型进行预测,以确定这些变量对预测的重要性。

例如,您将创建四个变量:工作要求、描述、福利和公司简介。对于每个变量,每个广告将被分配一个“0”或“1”来表示“积极”或“消极”情绪。

现在,让我们继续利用模型中的数字变量来预测哪些广告是欺诈性的和非欺诈性的。

机器学习模型

概观

运行多种不同类型的模型,然后选择一种或多种模型的组合,这种方法不仅可以为您提供最高的准确性,还可以提供有意义的结果,这些结果可以很容易地向业务利益相关者解释,并有可能被他们接受。

对于这个问题,我运行了三种类型的模型:

  • 分布式随机森林 ( DRF ):本质上是一个随机森林,它是一个分类树的集合,但是在 h2o 服务器上并行运行,因此有了分布式这个词。
  • 梯度推进机 ( GBM ):和随机森林一样,也是由一群树组成的分类方法。不同之处在于,随机森林用于构建深度独立的树(即,每棵树都是在数据的随机子集上的随机变量集上运行的,即“bagging”方法),而 GBM 则构建了大量浅、弱、依赖、连续的树。在这种方法中,每棵树都从先前的树中学习,并试图通过减少误差量和增加由预测变量解释的响应变量的变化量来对其进行改进。
  • 广义线性模型 ( GLM ):广义线性模型只是线性模型的扩展,可以在非正态分布的因变量上运行。由于这是一个分类问题,使用的链接函数用于逻辑回归。逻辑回归算法的输出是 logits 中预测值的系数,其中预测值变量的一个单位变化会导致对数概率的系数值变化。这些对数可以转换成比值比,以提供更有意义的信息。
  • 为了计算比值比,我们需要对每个系数进行指数运算,将其提升到 e 的幂,即 e^b

现在您对三种类型的模型有了一些了解,让我们比较一下它们的模型精度。

方法学

使用随机种子将数据集分为训练集(数据集的 80%)和测试集(数据集的 20%),目标是在训练集上训练模型,并在测试集上测试其准确性。

使用以下参数运行 GBM,其中树的最大深度被设置为 4 (4 级)、小学习率和五重交叉验证。

交叉验证 是一种在我们将训练模型应用于测试集之前,用来验证我们的训练模型的技术。通过指定五个折叠,这意味着我们构建五个不同的模型,其中每个模型在四个部分上被训练,在第五部分上被测试。因此,第一个模型在第 1、2、3 和 4 部分进行训练,在第 5 部分进行测试。第二个模型在第 1、3、4 和 5 部分进行训练,在第 2 部分进行测试,依此类推。

这种方法被称为 k 倍交叉验证,使我们对所用建模方法的性能更有信心。当我们创建五个不同的模型时,我们在五个不同的/看不见的数据集上测试它。如果我们只测试模型一次,例如,在我们的测试集上,那么我们只有一个单一的评估,这可能是一个有偏见的结果。

gbm_model <-h2o.gbm(y=y_dv, x=x_iv, training_frame = model_train.h2o, 
                    ntrees =500, max_depth = 4, distribution="bernoulli", #for 0-1 outcomes
                    learn_rate = 0.01, seed = 1234, nfolds = 5, keep_cross_validation_predictions = TRUE)

为了衡量模型的准确性,我使用了 ROC-AUC 指标。 ROC 或接收器操作特性是一条概率曲线,而 **AUC,**曲线下面积是对类别之间分离程度的度量。在我们的例子中,AUC 是给定模型区分非欺诈性广告和欺诈性广告的准确度。AUC 越高,模型对广告的分类就越准确。

fpr <- h2o.fpr( h2o.performance(gbm_model, newdata=model_test.h2o) )[['fpr']]
tpr <- h2o.tpr( h2o.performance(gbm_model, newdata=model_test.h2o) )[['tpr']]
ggplot( data.table(fpr = fpr, tpr = tpr), aes(fpr, tpr) ) + 
  geom_line() + theme_bw() + ggtitle( sprintf('AUC: %f', gbm.auc) )

AUC 由测试模型准确性的几个指标组成,它们是:

  • 真实肯定(TP):被正确预测为欺诈的欺诈广告
  • 真实否定(TN):被正确预测为非欺诈性的非欺诈性广告
  • 误报(FP):非欺诈性广告被错误地预测为欺诈性广告
  • 假阴性(FN):被错误预测为非欺诈性的欺诈性广告

然后可以将这些指标结合起来计算灵敏度和特异性。

敏感度是衡量欺诈性广告被正确分类的比例。

敏感度=计数(TP) /总和(计数(TP) +计数(FP))

特异性是对非欺诈性广告被正确识别的比例的度量。

特异性=计数(FP)/总和(计数(TP) +计数(FP)

当确定哪种测量对您的分析更重要时,问自己这样一个问题:对您来说,识别正确分类的阳性(灵敏度更重要)还是阴性(特异性更重要)的数量更重要。在我们的例子中,我们想要一个具有更高敏感度的模型,因为我们对正确区分欺诈性广告更感兴趣。

所有这些指标都可以在一个 混淆矩阵 中进行总结,该表比较了正确和错误预测的案例数与欺诈性和非欺诈性案例的实际数量。该信息可用于补充我们对 ROC 和 AUC 指标的理解。

ROC-AUC 度量的另一个方面是用于确定广告是欺诈性还是非欺诈性的 阈值 。为了确定使 TPs 阳性数量最大化的最佳阈值 t,我们可以使用 ROC 曲线,其中我们在 y 轴上绘制 TPR(真阳性率),在 x 轴上绘制 FPR(假阳性率)。

AUC 允许对模型进行比较,我们可以在测试集上比较它们的 ROC 曲线以获得模型准确性,如下面的模型输出所示。

模型输出

模型精度比较

下表显示了 DRF 产生的模型在测试集上具有最高的 AUC 0.962。所有三个模型都具有高 AUC 值(> 0.5 或随机预测)。

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

图 9:广告欺诈分类的 AUC 曲线

然而,让我们以 GLM 模型为例,通过查看下面的混淆矩阵,更深入地了解这个 AUC 在将广告正确分类为欺诈广告方面意味着什么。

测试集上 GLM 的混淆矩阵表明错误分类欺诈案例的错误率为 8.15%。该模型的灵敏度为 327/(327+29) = 92%,非常好。

现在,让我们看看模型的剩余输出,更具体地说,在对欺诈性和非欺诈性广告进行分类时,最重要的预测因素是什么。

最重要的预测因素

分类问题中的变量重要性等级告诉我们,相对于在该模式中使用的所有其他预测器,预测器变量可以多准确地将欺诈性广告分类为非欺诈性广告。

对于(a) GBM 和(b) DRF 来说,在将招聘广告分类为欺诈性或非欺诈性方面,前三个变量——地点、公司标志和行业——是相同的。这也适用于认为最不重要的远程办公变量

现在,让我们绘制数据集,以更好地了解欺诈性和非欺诈性广告的顶级预测因素是如何变化的。

让我们看看最上面的变量,位置,我们可以看到,来自美国和澳大利亚的欺诈性广告比非欺诈性广告的比例更高,如带圆圈的条形所示。

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

图 10:各国欺诈性广告与非欺诈性广告的频率

欺诈性广告比非欺诈性广告在招聘广告中不显示公司标志的比例更高。

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

图 11:欺诈性广告与非欺诈性广告的出现频率(按广告中是否出现公司标志划分)

了解模型系数

现在,让我们尝试从数字上理解预测变量和广告分类之间的关系。

如下表所示,突出显示的预测器最能区分欺诈性广告和非欺诈性广告。

  • 进入模型的 767 个变量中,只有 48 个具有非零系数(显示了顶部预测值)
  • 概率越大,广告欺诈的几率就越高

结论和下一步措施

现在,您已经很好地理解了在分类问题中使用文本和数字预测器,同时使用文本分析工具和机器学习分类算法。

那么,接下来我们能做什么?

  • 应该结合使用文本分析和预测模型来将招聘广告分为欺诈性和非欺诈性招聘广告
  • 为了提高文本分析的准确性,可以引入以下方法:
  • N-grams 建模:查看同时出现的单词组合,以识别模式
  • 寻找大写和标点符号的趋势
  • 在强调的文本中寻找趋势(粗体、斜体)
  • 寻找所用 HTML 标签类型的趋势(原始文本列表与列表元素中的列表文本)

预测模型精度可以通过以下方式提高:

  • 使用更大的数据集
  • 将数据集分为三部分:训练集、测试集和验证集
  • 将工资范围分解为数字变量:最低和最高
  • 去除相互关联的变量(即使用独立性卡方检验)
  • 将位置分为国家、州和城市
  • 通过对行业和功能类别进行分组来减少变量数量
  • 扩展数据集以包括在线行为,即广告被点击的次数、IP 位置、广告上传的时间等。

关于所有用于生成结果的代码,请参见我的 GitHub 库—【https://github.com/shedoesdatascience/fraudanalytics

利用层次聚类识别新闻报道中的隐藏趋势

原文:https://towardsdatascience.com/identifying-hidden-trends-in-news-stories-using-hierarchical-clustering-b6297df795af?source=collection_archive---------44-----------------------

了解如何使用称为凝聚聚类的通用层次聚类算法在最近的新闻文章中查找新的主题聚类

作为数据科学家,新闻报道的文本分析从学习和实践的角度来看都非常重要,因为它为我们提供了大量的数据语料库来训练文本分类、情感分析、命名实体识别等。模特。

总的来说,这些模型中的大多数都是在历史新闻语料库上训练的,该语料库使用了过去 1-3 年的新闻报道数据。这在平时很有效,但是,在新冠肺炎疫情,这给我们带来了严重的问题,因为新闻报道现在有更快的周转周期。

解决这个问题的一种方法是对在短时间内收集的新闻故事运行文本聚类算法,并在它们开始过多影响我们的预训练情绪分析模型之前识别新兴趋势。

例如,自从 Covid 疫情开始以来,我们开始看到情绪分析模型的性能下降。我们通过运行文本聚类和主题模型来缓解这一问题,并发现一个新的主题/聚类正在围绕一些令牌出现,如“工资保护计划”、“锁定”、“口罩”、“疫苗”、“空降”。我们不断保存来自这些“新”聚类的数据,直到我们有足够的数据点来重新训练我们的监督模型。

新闻 API

你可以从 Specrom Analytics 的媒体监控数据库获得最近的(<24 h) news articles in structured format by accessing a 公共新闻数据 API )公开数据。你必须在 Algorithmia 注册一个免费账户。当你注册的时候,你每个月会得到 10,000 点积分,这对于一个月 500 次 API 调用来说足够了。

要获取您的 API 密钥,请转到仪表板,然后单击我的 API 密钥,如下所示。

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

Algorithmia 拥有所有流行软件语言的客户端库,所以让我们通过在 bash 或命令行上键入下面的文本来获得 python 客户端。

pip install algorithmia`

每个 LatestNewsAPI 调用最多给我们 100 个结果,所以如果我们想要获取 1000 个新闻故事,我们将不得不分页大约 10 次,这对于本教程中的集群演示来说应该足够了。除了为文章的主要内容和标题指定关键字查询之外,API 本身还允许您按主题进行过滤。您还可以通过域名地址列表指定过滤,因为该数据库目前索引了超过 60,000 个新闻源。

然而,在这种情况下,我只通过在主题中指定“业务”来过滤它。

clean_response_list = []
for i in range(1,11):
    print("fetching page ", str(i))
    input = {
  "domains": "",
  "topic": "business",
  "q": "",
  "qInTitle": "",
  "page": str(i),
        "content": "true"
    }
    client = Algorithmia.client(YOUR_ALGO_KEY)
    algo = client.algo('specrom/LatestNewsAPI/0.1.4')
    response_dict = algo.pipe(input).result
    #print("Total results found: ", response_dict["totalResults"])
    clean_response_list = clean_response_list + response_dict["Article"]
len(clean_response_list) 

让我们将结果加载到一个熊猫数据框架中,并创建一个单词云来查看前 1000 个新闻故事中单词的初始分布。

import numpy as np
import pandas as pd
df = pd.DataFrame(clean_response_list)
df.head()from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
import seaborn as sns
wordcloud_generated_bywd = WordCloud(stopwords = set(STOPWORDS),background_color="white").generate(' '.join(df['content']))
# Generate plot
plt.imshow(wordcloud_generated_bywd)
plt.axis("off")
plt.show()

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

来自 specrom News API 的 1000 个新闻故事的词云

让我们使用 tf-idf 向量对文档进行矢量化,并通过奇异向量分解来降低维度。关于如何预处理文本的完整讨论请参考之前的博客文章。

from sklearn.feature_extraction.text import TfidfVectorizertfidf_transformer = TfidfVectorizer(stop_words=’english’, 
ngram_range=(1, 3),max_df=0.99, min_df = 0.01, lowercase=True, max_features=2500)X_train_text = tfidf_transformer.fit_transform(df[“content”])
df_dtm = pd.DataFrame(X_train_text.toarray(), columns=tfidf_transformer.get_feature_names())
#df_dtm.head()
from sklearn.decomposition import TruncatedSVDsvd = TruncatedSVD(n_components=50, algorithm='randomized', n_iter=5, random_state=None, tol=0.0)
x_svd = svd.fit_transform(X_train_text)
#len(x_svd)

此时,我们已经准备好使用凝聚聚类来创建文本聚类。所有文本聚类算法的一个问题是需要预先指定文本聚类的数量作为超参数。有经验方法可用,如 k 均值聚类的“肘方法”,但它们需要太多的计算资源,无法每天运行。

然而,凝聚聚类非常快,它允许我们通过新闻数据迭代大量可能的聚类值,并以相当低的成本检查聚类成员数量的增长。

from sklearn.cluster import AgglomerativeClusteringcluster_list = range(2,10)
def get_optimum_ag_clusters(input_array, cluster_list):
    return_list = []
    for cluster_n in cluster_list:
        temp_dict = {}
        AG = AgglomerativeClustering(n_clusters=cluster_n, affinity='euclidean', memory=None, connectivity=None, compute_full_tree=True,linkage='ward', pooling_func='deprecated')
        pred_labels = AG.fit_predict(input_array)
        valcount_series = pd.Series(pred_labels).value_counts()
        temp_dict["cluster_n"] = cluster_n
        temp_dict["cluster_values"] = valcount_series.tolist()
        return_list.append(temp_dict)
    return return_list#return_list = get_optimum_ag_clusters(X_train_text.toarray(), cluster_list)
return_list = get_optimum_ag_clusters(x_svd, cluster_list)return_list
# Output
[{'cluster_n': 2, 'cluster_values': [788, 212]},
 {'cluster_n': 3, 'cluster_values': [774, 212, 14]},
 {'cluster_n': 4, 'cluster_values': [774, 199, 14, 13]},
 {'cluster_n': 5, 'cluster_values': [761, 199, 14, 13, 13]},
 {'cluster_n': 6, 'cluster_values': [751, 199, 14, 13, 13, 10]},
 {'cluster_n': 7, 'cluster_values': [730, 199, 21, 14, 13, 13, 10]},
 {'cluster_n': 8, 'cluster_values': [718, 199, 21, 14, 13, 13, 12, 10]},
 {'cluster_n': 9, 'cluster_values': [607, 199, 111, 21, 14, 13, 13, 12, 10]}]

我们不一定对这里确定的最大集群感兴趣;这可能会被我们通过现有的文本分析渠道或经验已经知道的东西所主导。更有趣的是,当天隐藏的新闻故事可能会在多个渠道受到关注。

让我们打印 6 个 n_clusters 的每个集群的顶部术语。

AG = AgglomerativeClustering(n_clusters=6, affinity='euclidean', memory=None, connectivity=None, compute_full_tree=True,linkage='ward', pooling_func='deprecated')
#y_km = AG.fit_predict(X_train_text.toarray())
y_km = AG.fit_predict(x_svd)df_dtm["cluster_name"] = y_km
df_dtm.head()cluster_list = len(df_dtm['cluster_name'].unique())
for cluster_number in range(cluster_list):
    print("*"*20)
    print("Cluster %d: " % cluster_number)
    df_cl = df_dtm[df_dtm['cluster_name'] == cluster_number]
    df_cl = df_cl.drop(columns = 'cluster_name')
    print("Total documents in cluster: ", len(df_cl))
    print()
    df_sum = df_cl.agg(['sum'])
    df_sum = df_sum.transpose()
    df_sum_transpose_sort_descending= df_sum.sort_values(by = 'sum', ascending = False)
    df_sum_transpose_sort_descending.index.name = 'words'
    df_sum_transpose_sort_descending.reset_index(inplace=True)
    print(','.join(df_sum_transpose_sort_descending.words.iloc[:20].tolist()))

最上面的两个集群代表了关于新冠肺炎困境和全球经济影响的可预测新闻。然而,其他集群似乎有一个有趣的关键字组合,如下所示:

Cluster 2: 
Total documents in cluster:  14

huawei,networks,5g,british,britain,nikkei,5g networks,japan,nikkei said,tokyo,wireless,suppliers,british government,equipment,citing,citing sources,potential alternative suppliers,alternative suppliers,nec corp,potential alternative
********************
Cluster 4: 
Total documents in cluster:  13

trader,joe,trader joe,petition,products,josé trader,trader josé,trader josé trader,josé,food,ethnic,san,process,chain,ethnic sounding,sounding,racist,labeled,retail giant,signed online petition
********************
Cluster 5: 
Total documents in cluster:  10

freitas,congressional,state del,del,richmond,convention,gop,paperwork time,paperwork,republicans,state,campaign,house,spanberger,won,va,nick,marquee,picked,write

因此,看起来集群 2 正在与华为讨论一些与 5G 相关的问题,这些问题与英国政府有关。我们可以过滤我们的数据框架以查看集群 2 中的成员,我们可以立即看到这是一个新兴的新闻趋势,它是由几天前的一篇路透社文章引发的,当时他们报道了英国政府要求日本在 5G 无线网络上替代华为。

集群 4 是关于 Trader Joe 的品牌被认为是种族主义的,这产生了大量关于该品牌的负面报道。

确定新的集群后,您可以运行名称实体关系模型来确定集群中的顶级实体,运行情感分析来查看其影响,并检查新闻传播流,以确定集群是否会在未来几天作为企业社交监听应用的一部分进行扩展。

在过去的几个月里,我们使用相同的技术发现了许多有趣的新兴话题,这使得我们的文本分类和社交听力模型对于我们今天所处的快速变化的世界更加强大。

使用医疗保健数据的 SHAP 值识别高危人群。

原文:https://towardsdatascience.com/identifying-high-risk-groups-using-shap-values-on-healthcare-data-e3e7198f30f6?source=collection_archive---------16-----------------------

了解如何使用 shap 值进行更好的聚类。

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

动机

机器学习在过去几年取得了相当大的进展,这主要归功于我们可以获得的大量数据和可以从数据中提取一些结构和意义的复杂算法。一方面,这些复杂的模型提供了最先进的结果,但另一方面,它们也是一种难以理解和解释的谜。从法律和医疗保健的角度来看,模型的可解释性非常重要,因为它可以增加医疗保健中人工智能的信任和采用。

例如,在医疗保健行业,预测患者何时死亡可能是有用的,但更重要的是,了解我们的模型输出可以帮助我们识别那些具有任何不良结果高风险的聚类集(具有相似属性的患者)。这最终将导致在早期阶段更好和适当的干预。

模型可解释性

有相当多的方法可以帮助我们理解模型的结果。然而,我将讨论 SHAP 价值观,以及如何用它们来解释全球和地方层面的模型。

得体的附加解释(SHAP)

Shap 值基本上给出了每个特征对我们最终预测的平均贡献。它帮助我们更直观地分析和解释我们的模型。为了更好地理解什么是 shap 值以及它们是如何计算的,本文有一些非常好的内容https://medium . com/@ Gabriel Tseng/interpreting-complex-models-with-shap-values-1c 187 db 6 EC 83

通过 shap 值,我们可以了解我们的模型在微观层面上为每个预测做了什么,这可以帮助我们确定哪些特征对我们的最终预测有多大贡献。

在这里,我们将使用 shap 值来创建聚类,看看它们是否有助于识别心脏病风险较高的患者。

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

通过聚类识别高危患者

正如你从上面的管道中看到的,这篇文章的目的首先是将 XGboost 这样的复杂模型拟合到数据中,然后使用 SHAP 库获得数据中每个例子的 SHAP 值,然后对它们进行聚类,以找到可以导致早期干预或更好地治疗患者的模式。本例的数据集由许多预测患者是否患有心脏病的特征组成。

为什么我们使用 SHAP 值进行聚类?

使用 shap 值进行聚类的优点是所有要素的 shap 值都在相同的范围内(二进制 xgboost 的对数概率)。这有助于我们生成有意义的集群。这里的目标是聚集那些具有相同预测心脏病风险的 shap 值。

#importing the required dependencies.
import pandas as pd
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pylab as pl
import shap
shap.initjs()

让我们导入数据集并将其分成训练集和测试集。

# loading the data set
data = pd.read_csv("D:/RnD/heart.csv")
#Seperating the target from the features
X = data.drop("target", axis  = 1)
#setting y as the target variable
y = data.target
#Splitting the dataset into train and test
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 100)

接下来,我们训练一个 Xgboost 模型用于分类。这里的重点不是获得一个高度精确的模型,而是我想向您展示 shap 值如何用于聚类。

model = XGBClassifier(objective = "binary:logistic")
model.fit(X_train,y_train)

好了,我们已经训练好了模型,现在我们可以使用 SHAP 库来获得模型的 shap 值。下面的代码块首先在训练好的模型上使用 Tree explainer 方法创建一个 Explainer 对象。然后使用 explainer 对象来获取测试数据的 shap 值。

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

使用肘方法来决定有多少个分类适合我们的数据。

#convert shap_values array to dataframe
s = pd.DataFrame(shap_values, columns = X_test.columns)
#Use Elbow method to decide the optimal number of clusters
sse = []
for k in range(2,15):
    kmeans = KMeans(n_clusters = k)
    #fit the k-means model on the shap values
    kmeans.fit(s)
    #appent the error of each iteration
    sse.append(kmeans.inertia_)

pl.plot(range(2,15), sse)
pl.title("Elbow Curve")
pl.show()

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

x 轴=聚类数,y 轴=错误率(sse)

我在这里选择 6 作为期望的集群数。接下来,我们再次将 K-Means 模型拟合到测试集的 shap 值,聚类数为 6。

kmeans = KMeans(n_clusters = 7, random_state = 100).fit(s)
#selecting cluster centres
centroids = kmeans.cluster_centers_

现在,我们为每个患者(数据点)映射基于其训练分配给它的聚类。

patient = pd.DataFrame(X_test.index)
cluster_no = pd.DataFrame(kmeans.labels_)
df= pd.DataFrame()#Concatenating the patient ids with the assigned cluster lablesdf = pd.concat([patient,cluster_no], axis =1)
df.columns = ["patient", "cluster no"]

基于我们之前训练的 xgboost 模型的学习,我们现在将为剩余的测试数据生成预测并评估它们。

y_pred = model.predict(X_test)
y_pred = pd.DataFrame(y_pred, index= X_test.index, columns = ["target"])df = df.set_index("patient")
cluster_df = pd.concat([df, y_pred], axis = 1)

用它们各自的患者 id(索引)对聚类进行分组,以识别具有较高疾病检测百分比的聚类。

group = (100 * cluster_df[cluster_df["target"]==1].groupby(by = ["cluster no","target"]).size()/len(df.index))
group = group.reset_index(level = 1, drop = True)
group = pd.DataFrame(group, columns  = ["Disease Percentage"])
group

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

疾病百分比

从图中,我们可以看到,我们的聚类中的疾病百分比有所不同。注意:这里没有显示没有疾病的集群。

我们从这些星团中发现了什么吗?

所以让我们试着推理一下,我们是否能从已经生成的集群中得到一些东西。下图包含心脏病检测的百分比以及每个聚类的每个特征的平均值。为了简洁起见,我对值进行了四舍五入。

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

使用 shap 值的聚类分析

cp =胸彩——从上表可以明显看出,cp 越高,患心脏病的几率越大

restecg =静息心电图结果——心脏病发病率较高的聚类往往具有较高的 restecg 平均值

具有较高 thalach 平均值的聚类具有较高的心脏病检测百分比。

我们所做的推理帮助我们识别数据中的模式,我们现在可以寻找可能的干预措施或解决方案来帮助预防心脏病。

下一步是什么?

到目前为止,本笔记本中描述的方法有些天真。例如,仅从肘方法中选择聚类的数量不是一个很好的主意,我们还需要看看其他一些措施来解释该算法如何很好地对我们的数据进行聚类。剪影分数就是这样一种测量方法,它可以帮助定义我们对数据进行聚类的程度。

事实仍然是,有许多聚类指标可以帮助我们了解我们的聚类的拟合度,但这都是相对于我们认为好的指标而言的。此处进一步解释https://www . research gate . net/post/How _ can _ we _ say _ that _ a _ clustering _ quality _ measure _ is _ good

“问题是,我们不能真的说什么聚类质量度量是好的还是不好的。“好的集群”的概念是相对的,是一个观点的问题。这同样适用于质量措施。这取决于你想评价什么。”

因此,从这里得出的结论是,我们需要测试不同的集群,并决定哪个指标可以很好地适应我们的问题,并有效地解释我们所拥有的集群。

参考资料:

[1]https://shap.readthedocs.io/en/latest/

[2]https://github.com/slundberg/shap

[3]https://www.youtube.com/watch?v=vA_czRcCpvQ

[4]数据来源:https://archive.ics.uci.edu/ml/datasets/Heart+Disease

鉴定新冠肺炎冠状病毒的潜在小分子抑制剂

原文:https://towardsdatascience.com/identifying-potential-small-molecule-inhibitors-of-the-covid-19-coronavirus-a2bcf8574cfc?source=collection_archive---------22-----------------------

请注意,文章中的所有评论纯属实验性质,不应作为医疗建议。它不应被视为支持特定治疗的医学建议或证据。如果你认为自己可能感染了新冠肺炎病毒,你应该联系卫生官员并接受检测。

2019 年 12 月,世界在中国武汉发现了一种新型冠状病毒。快进 3 个月,病毒已经感染了超过 10 万人,数千人已经死亡。虽然从长远来看,疫苗可能是我们战胜这种疾病的最佳选择,但这似乎需要一年半以上的时间,现在必须取得突破。

我无法接触到实验室、病人或活的病人样本,但互联网上有大量的开放数据。我将尝试写一系列文章,利用现有数据回答有关病毒的问题,收集见解,也许还有可能用于抗击新冠肺炎的策略。

因为新药的发现、安全性测试和批准需要很多年,所以一个好的策略是努力找到一种已经被批准的、对病毒有一定疗效的药物。让我们进行一次模拟药物筛选。

我们的第一步是去蛋白质数据库,在那里你可以找到许多分子的 3D 分子结构,包括新冠肺炎的成分。

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

【https://www.rcsb.org/

通过滚动资源,我们可以看到他们已经结晶了主要的蛋白酶,这是药物发现的高产目标。实际上有几个版本,但我们选择这一个,因为它的分辨率最高,为 1.31 埃。这意味着我们可以看到和利用更多的分子信息。

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

https://www.rcsb.org/

我们现在去 pharmit 网站,它允许我们在浏览器中进行虚拟筛选。

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

http://pharmit.csb.pitt.edu/

我们进入目标结构的 PDB,这里是 5R82。注意,配体有两种选择,DMS 或 RZS。这正是用来稳定蛋白质,以帮助结晶和解析其结构。我们将使用 RZS,因为它只与蛋白质中的一个位点结合,而 DMS 与多个位点结合,这使得在这个平台上进行药物筛选变得容易得多。

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

http://pharmit.csb.pitt.edu/

然后我们点击提交,得到下面的设置。带有配体的蛋白质(屏幕中间右侧)。

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

http://pharmit.csb.pitt.edu/

小组的药效团部分是我们最感兴趣的。通过打开和关闭区域,我们规定了任何药物在试图适应这种蛋白质时必须满足的分子相互作用。在我看来,我们需要一种符合尽可能多标准的药物。这最大化了它在现实中被束缚的可能性。所以我们把它们都打开。

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

http://pharmit.csb.pitt.edu/

现在我们准备进行药物筛选。我们转到左上方的选项卡,通过单击向下箭头来查找合适的库。

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

【http://pharmit.csb.pitt.edu/

我们获得了许多药物库的列表,并单击贡献的库以获得更多选项。

我从天然产物库开始,它包含 2029 个天然产物结构。令人震惊的是,当所有的约束都被激活时,有些东西是合适的。不幸的是,这种分子没有名字。

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

http://pharmit.csb.pitt.edu/

不要气馁,我把结构画出来,发现它是这个分子。

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

https://chem-space.com/search

经过进一步研究,我发现它与依普黄酮结构非常相似,依普黄酮是一种用于预防绝经后妇女骨质疏松症的异黄酮。奇怪的发现,不知道是怎么回事。

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

https://pubchem.ncbi.nlm.nih.gov/compound/3747

然后,我改变了思路,查看了 DrugBankApproved-2019 库。当所有的限制都设定好了,没有药物能够适合结合位置。

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

http://pharmit.csb.pitt.edu/

我开始一个接一个地放松每一个限制。我不想放松任何不必要的,因为我觉得这将增加假阳性的可能性。

  1. 在位置(10.13,0.25,25.74)放松氢供体导致发现 38 种药物。这些药物通过 RMSD 进行排名,这是一种适合度的衡量标准,RMSD 越低,适合度越好。

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

http://pharmit.csb.pitt.edu/

排名最高的药物是 RMSD = 0.304 的 Stendra。这是一种用于治疗勃起功能障碍的 PDE5 抑制剂。这很可能是假阳性。问题是我不知道 RMSD 有多好。我只知道越低越好。

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

http://zinc15.docking.org/substances/

第二种是氨来沙诺(RMSD = 0.309),这是一种用于治疗口腔溃疡的抗炎药物。可能是假阳性。我也看到一些讨论,像布洛芬这样的消炎药可能会恶化新冠肺炎的进程,所以也许最好远离。

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

【http://zinc15.docking.org/substances/ 号

2.放松位置(12.01,0.43,24.32)的氢受体限制导致发现 21 种药物。

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

【http://pharmit.csb.pitt.edu/

排名最高的药物是 RMSD = 0.373 的利匹韦林。这是一种用于治疗 HIV 患者的非核苷类逆转录酶抑制剂(NNRTI)。虽然抗病毒药物的问世令人兴奋,但我们希望药物针对蛋白酶而不是逆转录酶。此外,RMSD 高于前 2 种药物。

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

http://zinc15.docking.org/substances/

排名第二的药物是 Intelence (RMSD = 0.389),这是另一种针对 HIV 的 NNRTI。

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

http://zinc15.docking.org/substances/

3.放松位置(11.7,-0.68,23.61)的芳香限制导致仅发现 1 种药物。

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

http://pharmit.csb.pitt.edu/

这种药物是乙酰唑胺(RMSD = 0.564),是一种碳酸酐酶抑制剂,可导致利尿,用于青光眼和癫痫。不太可能是什么。

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

http://zinc15.docking.org/substances/

4.放松(14.12,-1.82,20.58)处的氢受体约束,得到了 16 种可能的药物。

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

http://pharmit.csb.pitt.edu/

从一开始,我就非常兴奋,因为排名第一的药物的 RMSD = 0.159,几乎是之前最佳拟合的一半。

这种药物原来是阿巴卡韦,这是另一种艾滋病毒 NNRTI 像前两种艾滋病毒药物。我承认,如果它是一种蛋白酶抑制剂,我会开心得多。

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

http://zinc15.docking.org/substances/

排名第二的药物仍然是乙酰唑胺。

5.放松(11.7,-0.68,23.61)处的疏水约束导致发现 1 种药物。

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

http://pharmit.csb.pitt.edu/

这种药物也是乙酰唑胺。

6.放松位置(9,-0.27,27.08)的疏水限制导致发现 60 种药物。

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

http://pharmit.csb.pitt.edu/

排名第一的选择是头孢吡肟(RMSD = 0.192),这是第四代头孢菌素抗生素。作为一般规则,当你有一个纯粹的病毒感染,抗生素不应给予。这对你没有任何好处。在这项荟萃分析中,与其他β-内酰胺类药物相比,使用头孢吡肟治疗的患者死亡率升高。或许不值得追求。

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

【http://zinc15.docking.org/substances/

排名第二的药物是 copanlisib (RMSD = 0.278),一种用于治疗滤泡性淋巴瘤的 PI3K 抑制剂…我们可能不应该对新冠肺炎患者进行化疗。

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

http://zinc15.docking.org/substances/

总的来说,我能够模拟针对新冠肺炎主蛋白酶结合位点的药物筛选。筛选出来的一些更有趣的药物是 NNRTI HIV 药物,特别是阿巴卡韦、利匹维林和因特林。我也对头孢菌素抗生素头孢吡肟和乙酰唑胺很感兴趣。

我对 NNRTIs 的效果并不太乐观,因为之前对另一种冠状病毒 SARS 的研究发现,它们在抑制生长方面并不十分有效。也就是说,阿巴卡韦在所有测试的药物中表现出最强的适应性。

值得强调的是,结合并不等同于抑制。即使结合得最好的分子,如果作用于错误的位点,也可能对蛋白质没有什么影响。

这项工作的一个限制是所有药物测试的结合位点的选择。这受到用于稳定蛋白质晶体结构的配体 RZS 的限制。如果用 DMS 代替 RZS 作为配体,这些药物将会针对不同的位点进行测试,也许会发现更有生物学意义的位点和不同的结果。

此外,新冠肺炎蛋白酶可能不是模拟药物筛选的最佳结构。用于附着宿主细胞的刺突蛋白可能是更好的选择。

同样,药物模拟软件可能有缺陷。选择它是因为它的易用性,但也许其他的会导致更准确的发现。我打算在未来探索其他潜在的模拟软件。

希望这篇文章能教会你一些东西,激励你去对抗新冠肺炎。你不在实验室工作,并不意味着你不能做出贡献。拥有一台电脑和一些好奇心是你所需要的。

请在下面的评论中指出任何明显的错误,这样我们都可以学习。也欢迎分享任何想法、见解和改进建议。

请注意,文章中的所有评论纯属实验性质,不应作为医疗建议。它不应被视为支持特定治疗的医学建议或证据。如果你认为自己可能感染了新冠肺炎病毒,你应该联系卫生官员并接受检测。

用 Colab 鉴定蛋白质-配体相互作用

原文:https://towardsdatascience.com/identifying-protein-ligand-interactions-with-colab-2cfd26ed469a?source=collection_archive---------33-----------------------

设置自动停靠 Vina

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

由作者渲染

“我们迫切需要公开、快速地分享我们的方法、模型和结果,以测试发现、确保重现性、测试显著性、消除死角并加速发现。新冠肺炎应用的数据共享将有助于连接全球生物分子模拟社区的科学家,并改善模拟、实验和临床数据与研究人员之间的联系和沟通。”

关于共享新冠肺炎生物分子模拟数据的社区信函[1]。

我下面介绍的是至少两篇致力于计算分子生物化学中使用的虚拟筛选技术的文章中的第一篇。从广义上讲,它包括对蛋白质和一组候选药物之间的相互作用进行大规模探索。预测这样一个系统之间的相互作用是一个非常困难的问题,没有唯一的解决方法。虚拟筛选的第一步是一种称为对接的计算技术,其中一种分子(可能是一种药物,但不是必须的)反复与受体蛋白接触,并通过例如遗传算法选择具有最佳能量的构型。一般来说,这项技术的结果应该谨慎对待,并与实验室结果进行对比。当以这种方式进行时,可以获得这些系统中相互作用的良好指示,这改进了结果的解释。这篇文章将致力于这第一步。在另一个时间,我将回顾如何大规模地进行这项工作,然后应用分类机器学习算法,该算法受到了 [Kadioglu O,Saeed M,Johannes Greten H&efforth t .](http://Kadioglu O, Saeed M, Johannes Greten H & Efferth T. Identification of novel compounds against three targets of SARS CoV-2 coronavirus by combined virtual screening and supervised machine learning. [Submitted]. Bull World Health Organ. E-pub: 21 March 2020. doi: http://dx.doi.org/10.2471/BLT.20.255943)的最新工作的启发,他们在这些工作中进行了探索,以找到攻击 SARS-CoV2 病毒的候选药物[2]。

auto dock Vina【3】是一款流行的分子对接软件,用于预测分子是如何被蛋白质托管的。在这里,通过几个步骤,我将向您展示如何在 Google Colaboratory 或 Colab 中安装。你可以输入每个代码片段,或者去底部给出的 GitHub 链接。此外,您可以进入 Autodock 站点获取更多信息,并下载[4]。如果你不耐烦,向下滚动到底部查看分子,并打开 Colab 笔记本,看看它是如何工作的,并与小部件交互。

  1. 下载并安装 vina

为了将 vina 安装到 Colab笔记本中,我们首先要!wget 下载链接:**

下载并解压缩文件后,auto dock _ vina _ 1 _ 1 _ 2 _ Linux _ x86目录创建完成。 vina 可执行文件在子目录 bin 中:

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

图一。Vina 目录。图片作者。

我们可以给 vina 程序起一个别名,这样使用起来更方便。如果我们想改变目录并从那里调用 vina 这是很有用的:

现在我们可以调用 vina 作为 linux 命令(这里你可以使用!vina%vina )从笔记本单元格中的任意目录。例如,我们可以尝试帮助(查看选项)😗*

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

图二。帮助选项显示 vina 程序的用法。图片作者。

这个输出除了给出 vina 的基本用法外,还说明程序运行 OK。如上图所示, vina 接收输入主要是两种类型的文件,受体和配体。配体是一种化合物,它通过与靶蛋白(受体)上的位点结合形成所谓的复合物。在本教程中,我们将研究程序教程中给出的蛋白质和配体的对接。下一个需要的信息是搜索空间,其中被定义为一个以 center_xcenter_ycenter_z 和 sides size_xsize_ysize_z 为中心的盒子,单位为埃。这个盒子是配体将被探测的地方,改变它的位置,方向和可能改变其他自由度。因此,期望具有可发生结合的活性位点的先前信息,以相应地定义盒子,否则,我们可以进行盲对接,其中盒子具有整个受体的大小,但是计算成本较高。后来,我展示了一个小工具来从 Colab 构建这样一个盒子。

2。下载教程和 pdbqt 文件

蛋白质通常以蛋白质数据库 (pdb)文件格式表示,其中包含原子位置的三维结构等信息。这里我们将从http://vina.scripps.edu/tutorial.htmlvina 教程中获取所需文件,

我们必须使用 unzip 进行解压缩,以获得配体和蛋白质 pdb 文件以及"配体 _ 实验. pdb" 文件,该文件是通过实验手段获得的“真实”坐标文件,并且 vina 预测必须尽可能类似于该结构才能被认为是可接受的,

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

图片作者。图片作者。

蛋白质和配体文件必须用 autodock tools 进行预处理,这是一个允许操纵结构和编写 pdbqt 文件的 GUI,但在这里我将从https://bcrf . biochem . wisc . edu/all-tutorials/tutorials-materials-molecular-graphics/66-2/获得之前准备好的文件

我们将在 vina_tutorial 目录中工作,因此我们必须将这些文件移动到那里,重命名为" protein.pdbqt" 和" ligand.pdbqt" ,如下所示:

我们将目录更改为 vina_tutorial ,在这里我们将完成余下的练习:

3。配置文件

当我们在图 2 中看到来自 vina 的帮助时,我们注意到配置文件选项,其中所有选项都可以放在一个脚本中。我们可以使用 cat 命令来编写这个文件:

**我想强调一下这个文件中的一些内容。在第 3 行和第 4 行,受体和配体被清楚地设置为相应 pdbqt 文件的名称。在第 6 行中,最佳构型中配体的 out 结构保存在一个“all . pdbqt”文件中。最后,从第 8 行到第 14 行,探索框的中心和大小被定义为包围搜索区域。通常,这个框是使用 autodock tools GUI 定义的,但是也可以使用其他流行的查看器来构建它。在接下来的内容中,我将展示如何在浏览器中查看分子,以及如何生成用于对接过程的框。

4。为浏览器可视化安装 py3d mol

我认为 Py3Dmol 是在 Jupyter 或 Colab 笔记本的浏览器中可视化分子的最佳选择之一。为了使用它,我们可以用 pip 安装,导入:

下面是我写的一些函数,用来查看分子、构建盒子并制作一个小部件,以便交互式地更改盒子设置:

函数 visbox2py3Dmol 对象添加一个盒子,其中心在 bxibyibzi ,大小为 bxfbyfbzf 。在图 3 中,我们可以看到如何构建盒子。为了更好地可视化,显示了两幅图像。左图显示了 py3dmol 的默认屏幕(x-y 平面位于屏幕上),右图显示了垂直旋转 90 度后的同一屏幕(z-y 平面位于屏幕上)。在这种情况下,只是为了说明如何操作盒子,蛋白质附近的配体被封闭在盒子中。

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

图 3。盒子里的分子。中心位置由前三个值 bxi、byi 和 bzi 确定,而框尺寸由后三个值 bxf、byf 和 bzf 定义。左图:长方体在 x-y 平面上移动。右图:我们可以从左到右看到 z. Image 按作者的变化。

一旦您对该框的设置满意,这些值将用于配置文件中的 center_xcenter_ycenter_zsize_xsize_ysize_z

5。运行 vina

现在我们已经有了蛋白质和配体文件,并且盒子已经设置好了,我们只需调用 vina 来读取" c onf.txt" 文件。使用虚拟机的 2 个 CPU 需要几分钟时间(遗憾的是这个软件不能在 GPU 上运行):

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

图 4。维娜在科拉布跑步。图片作者。

6。将 pdbqt 文件转换为 pdb

最后,可以使用软件 openbabel 将 pdbqt 文件转换成标准格式 pdb:

这里是两个分子,蛋白质和配体,在" all.pdbqt" 文件中的一个输出配置中,我们可以看到配体正确地位于蛋白质的“空腔”中。

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

图 5。蛋白质承载的配体。图片作者。

7。结论。Colab 是一个允许分子对接过程有序进行的工具。尽管计算能力不是最充足的,但是可以转换成 Jupyter 笔记本,在本地运行或者在另一个云服务平台上运行。此外,能够在浏览器中直接可视化也很有用,可以进一步开发以识别化学相互作用,如氢键。我们将看到当机器学习被应用时它是如何工作的。

8。链接到笔记本https://github . com/napoles-uach/covid 19 MX/blob/master/VINA _ auto dock _ vis . ipynb

9。鸣谢:我要感谢 Jaime Adame Gallegos 博士(@donadame)的善意评论。

10。参考文献。

**[1] Rommie E. Amaro,Adrian J. Mulholland,化学杂志。Inf。模型。 2020 年【https://doi.org/10.1021/acs.jcim.0c00319 **

[2] [Kadioglu O,Saeed M,Johannes Greten H&efforth t .通过组合虚拟筛选和监督机器学习识别针对 SARS CoV-2 冠状病毒三个靶标的新化合物。[已提交]。公牛世界健康器官。电子酒吧:2020 年 3 月 21 日。doi:http://dx . doi . org/10.2471/BLT . 20.255943](http://Kadioglu O, Saeed M, Johannes Greten H & Efferth T. Identification of novel compounds against three targets of SARS CoV-2 coronavirus by combined virtual screening and supervised machine learning. [Submitted]. Bull World Health Organ. E-pub: 21 March 2020. doi: http://dx.doi.org/10.2471/BLT.20.255943)

[3[o . Trott,A. J. Olson,AutoDock Vina:用新的评分函数、高效优化和多线程提高对接的速度和精度,计算化学杂志 31(2010)455–461](http://O. Trott, A. J. Olson, AutoDock Vina: improving the speed and accuracy of docking with a new scoring function, efficient optimization and multithreading, Journal of Computational Chemistry 31 (2010) 455-461)

http://vina.scripps.edu/index.html

用高斯混合模型识别餐馆热点

原文:https://towardsdatascience.com/identifying-restaurant-hotspots-with-a-gaussian-mixture-model-2a840ab0c782?source=collection_archive---------29-----------------------

使用 GMM 识别加拿大多伦多的直观餐馆集群(使用 Python 代码)

聚类算法(如 GMMs)是帮助识别数据模式的有用工具。它们使我们能够识别数据集中的子群,从而提高您的理解或增强预测模型。在本文中,在 GMM 的帮助下,我们将尝试使用位置数据来识别多伦多的餐馆集群。目标是找到在地理上有意义,但在其他特征(如餐馆评级)方面具有不同特征的聚类。将讨论关键的代码片段,您可以在 GitHub 上找到完整项目。

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

来源:图一图二图三

什么是 GMM

如前所述,GMM 是一种聚类算法。这意味着它可用于根据要素对数据集中的元素进行分组。例如,假设我们有一个客户收入和年龄的数据集。聚类算法可以识别 4 个组:年老的高收入者、年老的低收入者、年轻的高收入者和年轻的低收入者。这 4 个群体可能具有非常不同的特征/行为。我们不会深入 GMM 如何创建这些集群的细节,因为那里有大量好的资源【1】【2】。重要的是,为什么我们将使用 GMM,而不是其他聚类算法,如 K-means。

对于我们的问题,GMM 最重要的优点是它在聚类方差和协方差方面更灵活。首先,更大的方差灵活性意味着 GMM 可以更好地识别方差不相等的聚类。换句话说,当我们既有密集的集群又有分散的集群时,它会给出更好的结果。我们可以在下面的图 1 中看到这一点,我们将 K-means 和 GMM 应用于一些测试数据。这里,每个点的颜色由相关算法分配的聚类决定。在这种情况下,GMM 星团似乎更合适。

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

图 1:不同方差集群的聚类算法比较

其次,更大的协方差灵活性意味着我们可以识别更细长/椭圆形的集群。相比之下,K-means 只能真正识别球形簇。我们可以在图 2 中看到这一点,这里 GMM 集群更为合适。当我们将 GMM 应用到我们的餐馆数据集时,我们将看到为什么 GMM 的这些属性很重要。最终,它会让我们发现更多有趣的星团。

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

图 2:非球形集群上的集群算法比较

资料组

为了训练 GMM,我们将使用 Yelp 开放数据集【3】。这个数据集包含了 Yelp 网站上关于餐馆的大量信息。我们对它进行了预处理,这样我们就有了多伦多每家餐馆的名称、纬度和经度。我们还包括评论的数量(review_count)和餐馆的评级(stars ),这些将在以后用于分析聚类。其他特征,如餐馆的邻居和类别,都被排除在外。我们用下面的代码读取数据集,我们可以在表 1 中看到一个例子。

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

表 1:餐馆数据集示例

在图 3 中,我们用纬度和经度标出了所有的餐馆。每个点代表一家餐馆,总共有 7148 家餐馆。这个想法是,餐馆的位置可能会告诉我们一些关于它的事情。例如,某些位置的餐馆可能具有较高的评级。因此,我们也许可以在一个试图预测餐馆评级的模型中使用位置。然而,仅仅输入原始的纬度和经度数据可能不会给我们带来好的结果——尤其是当您使用线性模型时。这意味着我们必须对纬度和经度特性执行某种形式的特性工程。

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

图 3:使用餐馆纬度和经度的散点图

从某些方面来说,考虑到我们周围有餐馆,这已经做到了。换句话说,餐馆已经基于它们的纬度和经度被分组为集群(即,邻居)。问题是多伦多有 71 个不同的社区,这需要估计很多系数。你也许可以根据某些街区的特点将它们组合在一起,但这需要多伦多餐馆领域的知识。我们将尝试另一种方法,使用 GMM 对餐馆进行分组。

安装 GMM

在下面 Python 函数的第一部分,我们训练 GMM。GMM 的一个问题是它们可能收敛于局部最优点。为了避免这种情况,我们将“n_init”参数设置为 5。这将随机初始化和训练 5 个 GMM,最后,我们将最好的模型作为我们的最终模型。我们使用这个模型获得每个餐馆的标签/预测。然后,如图 3 所示,我们绘制了餐馆,只是这次我们根据 GMM 标签分配了一种颜色。

您可能已经注意到这个函数有一个参数——集群的数量。这被认为是 GMM 的超参数,是我们必须选择的。如果我们决定太多的聚类,模型将会使数据过拟合。这意味着我们将识别出没有意义的集群,或者将更适合放在一起的集群分割开来。如果我们决定的太少,模型可能会使数据不足。这意味着我们可能会错过一些重要的集群。问题是我们如何决定集群的数量?

有几种不同的方法可以帮助确定适当的集群数量。这些包括使用轮廓分数或模型 BIC 值【4】。这些只是有用的指南,并不一定会给你最好的集群数量。由于我们只使用 2 个特征来训练我们的 GMM,我们可以很容易地将结果可视化,并了解聚类是否合适。例如,如图 5 所示,我们使用上面的 Python 函数来绘制具有 5 个聚类的 GMM 的结果。

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

图 5:使用 5 个聚类的 GMM 标签散点图

GMM 发现了一些有趣的集群。例如,蓝色集群似乎非常密集,附近有许多餐馆。红色的长串看起来像是一条路。在图 6 中,我们看到分别使用 4 个和 6 个集群的类似曲线。在这两种情况下,我们看到 GMM 识别出了与图 5 中相似的集群。所以,让我们继续讨论 5 个集群。我们可以进一步分析它们,以更好地了解它们是否合适。

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

图 6:使用备选聚类数的 GMM 标签散点图

分析集群

如果我们看看多伦多的地图,就能更好地理解这些集群。我们使用下面的代码来做到这一点。首先,我们从一个有 5 个簇的 GMM 中得到标签。然后我们创建一个以多伦多为中心的叶子地图。最后,我们将每个点叠加在地图上。像以前一样,每个点的颜色由其标签决定。我们可以在图 7 中看到这个过程的结果。

看看地图,集群开始变得更有意义了。蓝色和绿色集群位于多伦多港周围更密集的城区。这些集群被一条高速公路大致分开,这似乎是划分餐馆群的一种非常自然的方式。黄色和橙色的集群不太密集,它们由更多郊区的餐馆组成。长长的红色星团特别有趣。几乎所有这些点都落在央街。快速搜索发现,这其实是多伦多最著名的街道。考虑到这一点,将这些餐馆归入自己的一组是有意义的。

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

图 7:覆盖在多伦多地图上的 GMM 星团

这些集群并不完美。有一些流氓红点可能有意义的蓝色集群的一部分。同样,在高速公路的右侧有一些蓝色的点,它们可能属于绿色集群。在很大程度上,GMM 已经确定了在地理上有意义的集群。我们可以预期它们具有不同的特征,但事实并非如此。

我们可以通过考虑餐馆的评论和评级来调查其特点。在表 2 中,我们可以看到每个聚类中餐馆的平均评论数。我们看到,蓝色集群中的评论数量往往更高。事实上,平均评论数量是黄色和橙色集群的两倍多。这可能是有道理的,因为我们可以预期在一个密集地区的餐馆会有更多的顾客。

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

表 2:集群审查和评级分析

我们还可以看到平均评级和至少拥有 4 星评级的餐厅的百分比(%高评级)。绿色聚类中的餐馆平均评级最高,并且它们拥有最大比例的高评级餐馆。也许这是多伦多的一个更高档的地区?此外,在评级方面,两个郊区集群(黄色和橙色)往往差别很大。

这只是我们可以用来比较集群的两个特征。我们可以永远继续分析它们。最终,集群的适当性取决于您想用它们做什么。总的想法是,也许在一些微调之后,您可以用它的聚类来标记每个餐馆,并在您的分析或模型中的一个特征中使用它。您也可以使用这些集群作为相似地理标签的起点。

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

参考

[1] 科里·马克林 (2019),混合模型聚类算法讲解(2019),https://towards data science . com/Gaussian-Mixture-Models-d 13 a5 e 915 c8e

[3] 里布·尼雷克,高斯混合模型(2020),https://towardsdatascience . com/Gaussian-Mixture-Models-GMM-6 e 95 CBC 38 E6 e

[3] Yelp,Yelp 开放数据集(2019),https://www.yelp.com/dataset

[4] Vincenzo Lavorini ,高斯混合模型聚类:如何选择分量数(2018),https://towards data science . com/Gaussian-Mixture-Model-clusterization-how-to-select-the-number-of-components-clusters-553 bef 45 F6 e 4

识别 Soundcloud.com 的非法毒品卖家

原文:https://towardsdatascience.com/identifying-sellers-of-illicit-narcotics-on-soundcloud-com-3ca0bece4307?source=collection_archive---------48-----------------------

识别网上毒贩的自动化框架

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

来自像素的图像

介绍

许多网上药品销售发生在暗网市场——隐藏在暗网上销售非法商品的平台。然而,在 Instagram 和 Snapchat 等地方,这些商品的销售开始从暗网过渡到表面网。

卖家将利用这些平台发布他们产品的图片,并建立销售。然后,客户将付款并提供送货地点。定位这些帐户可能很困难,尤其是在 Snapchat 的情况下,因为你必须将他们添加为好友才能查看他们的内容。

然而,这些卖家正在网络上宣传他们的 Instagram 和 Snapchat 个人资料。这种情况发生在流行的在线音乐流媒体网站 Soundcloud 的评论区。下面是一个评论的截图,可识别的信息被编辑,广告大麻,可卡因和迷幻药。

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

图片来自音云

建立一个自动化框架来收集 Soundcloud 评论并提取 Snapchat 和 Instagram 上销售毒品的个人资料,有助于提高这一新领域执法工作的有效性。

结构

该框架是用 Python 开发的,包括两个组件:web 抓取和帐户提取。网络爬虫抓取 Soundcloud.com 并下载流行歌曲的评论。然后,这些评论被输入账户提取组件,该组件识别广告销售毒品的评论,并提取 Instagram 和 Snapchat 账户。

刮网器

web scraper 从 Soundcloud 上的当前热门曲目中抓取评论,并将其存储在 csv 文件中。这一管道概述如下。

首先,Selenium 库用于访问 Soundcloud 图表页面。

driver = webdriver.Chrome()
driver.get("[https://soundcloud.com/discover/sets/charts-top:all-music:us](https://soundcloud.com/discover/sets/charts-top:all-music:us)")
time.sleep(5)

然后选择当前的顶部轨道。

driver.find_element_by_xpath('//*[[@id](http://twitter.com/id)="content"]/div/div/div[2]/div[1]/div/div[2]/ul/li[1]/div/div[3]/a[2]').click()

因为 Soundcloud 对评论使用动态加载,所以需要先滚动到页面底部,直到不能再加载评论为止。

last_height = driver.execute_script("return document.body.scrollHeight")while True: driver.execute_script("window.scrollTo(0,               document.body.scrollHeight);") time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:
 break
 last_height = new_height

评论是由班级选择的。

comments = driver.find_elements_by_class_name('commentItem__read')

然后从评论中提取文本和用户名,并分别存储在 commentTextListcommentUserList 中。

for comment in comments:
  commentText
  comment.find_element_by_xpath('.//div[1]/div/span/p').text
  commentUser =  comment.find_element_by_xpath('.//div[1]/span/a').text
  commentTextList.append(commentText)
  commentUserList.append(commentUser)

commentTextList 和 commentUserList 然后被转换成 Pandas 数据帧并导出到 csv。

df['User'] = commentUserList
df['commentText'] = commentTextListdf.to_csv('scrape.csv')

账户提取

账户提取组件搜索抓取的评论以识别毒品卖家并提取他们的 Instagram 和 Snapchat 账户。这一管道概述如下。

首先,使用 read_csv 加载注释。

df = pd.read_csv("scrape.csv")

为了识别销售毒品的广告账户的评论,使用了关键词列表。所选的关键词通常出现在这些评论中。在这个领域之外也经常使用的关键字,如“芽”,被排除在外。

keywordList = ['carts', 'pills', 'shrooms', 'lsd', 'acid']

然后在评论中搜索与关键词匹配的内容。如果找到匹配,该注释将被添加到列表 foundComments 中。

for ind in df.index:
  if any(ext in df['commentText'][ind] for ext in keywordList):
  foundComments.append(df['commentText'][ind])

如果评论包括 snapchat 或 Instagram 帐户,帐户名称几乎总是以 snap、Snapchat、insta 或 instagram 开头。为了捕捉这些不区分大小写的单词,注释被转换为小写。在某些情况下,评论中会使用表情符号。这些都是用 Demoji 库剥离出来的。然后,评论被转换成向量,一系列 if 语句被用来识别帐户在哪个平台上以及帐户名称是什么。如果找到一个账户,账户名称被添加到列表用户名列表,平台被添加到列表平台列表

for comment in foundComments:
  cleanComment = demoji.replace(comment)
  cleanComment = cleanComment.lower()
  commentVector = cleanComment.split()
  if 'insta' in commentVector:
    next_word = commentVector[commentVector.index('insta') + 1]
    usernameList.append(next_word)
    platformList.append('instagram')
 if 'instagram' in commentVector:
    next_word = commentVector[commentVector.index('instagram') + 1]
    usernameList.append(next_word)
    platformList.append('instagram')
 if 'snap' in commentVector:
    next_word = commentVector[commentVector.index('snap') + 1]
    usernameList.append(next_word)
    platformList.append('snapchat')
 if 'snapchat' in commentVector:
    next_word = commentVector[commentVector.index('snapchat') + 1]
    usernameList.append(next_word)
    platformList.append('snapchat')

然后创建一个新的 pandas 数据框架,并添加两个列表。然后将数据帧导出为 csv 文件。

df2 = pd.DataFrame()
df2['username'] = usernameList
df2['platform'] = platformList
df2.to_csv('accounts.csv')

讨论

麻醉品销售从现场销售转向网上销售给执法部门带来了新的问题。这一框架可以帮助确定在线分销商,以便进一步调查,并改善这一领域的执法工作。

虽然这种实现只抓取了 Soundcloud 上的顶级音轨,但该框架可以扩展到从多个页面收集评论,从而大大提高其效率。此外,这个框架可以适用于 Soundcloud 之外的其他平台。

关键字词典也可以改进,以包括更多的术语和识别句子结构。提取 Snapchat 和 Instagram 用户名的算法也可以改进,以处理使用其他句子结构的评论。

利用潜在狄利克雷分配识别 Soundcloud.com 非法毒品卖家

原文:https://towardsdatascience.com/identifying-sellers-of-illicit-narcotics-on-soundcloud-com-using-latent-dirichlet-allocation-cae0a66deb67?source=collection_archive---------66-----------------------

基于 PyCaret 的 Soundcloud.com 评论主题建模

介绍

之前,我开发了一个框架,用于识别 Soundcloud.com 上非法毒品广告的卖家。这个框架通过一个简单的关键词搜索来搜集评论,并识别出为药物做广告的评论。虽然这个框架由于注释的相似结构做得很好,但我想通过使用潜在的 Dirichlet 分配来尝试改进这个框架。

潜在狄利克雷分配(LDA)是用于学习文本的抽象主题的自然语言处理(NLP)模型,也称为主题建模。LDA 会将文档按主题分类,允许我们对评论进行分类,并找到宣传毒品销售的评论。

数据

该模型中使用的数据是以前收集的,用于 Tableau 中的分析。当时 Soundcloud 上排名前三的歌都是刮出来的:Playboi Carti 的@MEH,Baby Jesus 的 Find My Way,Lil Mosey 的 Blueberry Faygo。该数据集有 17048 条评论,其特征为评论药物。特征评论是刮掉的评论的文本,特征是药物包含用于广告毒品销售的帖子的 1 和用于其他帖子的 0。关于数据收集的更多信息可参见此处

模型实现

为了开发 LDA 模型,使用了一个名为 PyCaret 的 python 库。PyCaret 有很多机器学习算法的模块,但是使用的是 NLP 模块。更多关于 PyCaret 的信息可以在这里找到。

首先,PyCaret nlp 模块和 Pandas 被导入。

from pycaret.nlp import *
import pandas as pd

然后将数据集读入熊猫数据帧。

data = pd.read_csv('ldaData.csv')

读入数据后,运行 PyCaret 设置函数。这个函数初始化 PyCaret 环境。会话 id 123 用于轻松再现环境。

dataSetup = setup(data = data, target = 'comment', session_id = 123)

制作 LDA 模型时,必须传递主题数。由于该模型的目标是将销售毒品的广告准确分类到一个主题中,PyCaret 的模型调整与 isDrugs 功能结合使用,以确定最佳主题数量。最佳主题数为 32 个,准确率为 98.9%。

tuned_classification = tune_model(model = 'lda', supervised_target = 'isDrugs')

然后使用 32 个主题创建了 LDA 模型。

lda = create_model('lda', num_topics = 32)

然后将模型分配给数据。

lda_results = assign_model(lda)

宣传毒品销售的评论被归类为话题 30。一些不相关的评论被分类到主题 30 中,但是这些评论通常可以通过过滤来过滤掉,其中特征 Perc_Dominant_Topic 大于 18% *。*我们可以看到这个话题中使用熊猫的一些评论。Snapchat 或 Instagram 用户名已被审查。

lda_results.loc[(lda_results['Dominant_Topic'] == 'Topic 30') & (lda_results['Perc_Dominant_Topic'] > 0.18)]

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

然后为主题 30 绘制频率图。

plot_model(lda, plot = 'frequency', topic_num = 'Topic 30')

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

话题 30 也可以被可视化为单词云。

plot_model(lda, plot = 'wordcloud', topic_num = 'Topic 30')

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

讨论

LDA 似乎是一个很有前途的工具,可以用来识别 Soundcloud 上非法毒品广告的卖家。虽然该模型的性能相当不错,但额外的模型调整可以提高性能。这种模式也可以实现到原始框架中(可以在这里看到),并添加一个图形用户界面供执法部门使用。

用隐马尔可夫模型识别开放离子通道的数量

原文:https://towardsdatascience.com/identifying-the-number-of-open-ion-channels-with-hidden-markov-models-334fab86fc85?source=collection_archive---------34-----------------------

一篇关于我们如何差点赢得“利物浦大学—离子交换”Kaggle 竞赛的报道

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

2020 年 4 月 6 日编辑:我们已经发布了我们的代码!

2 月 24 日, Kaggle利物浦大学合作发布了一项新的“研究”竞赛,奖金高达 25000 美元。在这场比赛中,我们获得了与离子通道数据相对应的电信号,我们的目标是创建一种算法,可以自动识别每个时间点打开的通道数量。最初,比赛以一种奇特的“二次加权科恩卡帕评分(QWK)”开始,但这导致了发布后不久近乎完美的结果,这使得 me 不愿加入。过了一段时间,竞争指标变成了更合理的宏观 F1 分数,之后很明显我们离完美的解决方案还很远。我决定加入是因为几个原因:

  • 这是时间序列数据。
  • 这只是一个单一的时间序列,这使我们能够更专注于预处理和建模,而不是功能工程。
  • 数据集相当小,在训练集中总共有 500 万个测量值,在测试集中有 200 万个测量值。所需的总存储空间约为 125 MB。

我有幸与我曾有机会共事过的两个最聪明的人合作:卡沃兹德米最终,我们成功获得了第三名和 5,000 美元奖金,并在 2600 多个团队中脱颖而出。 第一名和第二名设法在比赛快结束时在私人测试数据中发现了一个漏洞,我们没有发现(只是在知道它的存在之后)。换句话说,我们有了最佳无泄漏解决方案!最后,我们能够在很短的时间内自己找到这个漏洞,这让我们更加沮丧…

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

这篇博文将提供我们解决方案的详细概述,并提供我们提出解决方案所需的见解。以下是目录:

介绍

问题陈述

离子通道是成孔膜蛋白,存在于动物和植物中,允许离子通过通道孔。它们对学习和记忆进行编码,帮助对抗感染,发出疼痛信号,刺激肌肉收缩。这些离子通道可以通过膜片钳技术进行记录和分析,以推断疾病的某些特性。

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

来自维基百科的离子通道示意图。

组织者这样描述这个挑战:“当离子通道打开时,它们传递电流。检测这些状态变化的现有方法既慢又费力。人类必须监督分析,这除了乏味之外,还会带来相当大的偏差。这些困难限制了可用于研究的离子通道电流分析的容量。科学家希望该技术能够在原始数据中快速自动检测离子通道电流事件。在过去的 20 年里,分析电池中电数据的技术没有发生重大变化。如果我们更好地了解离子通道活动,这项研究可能会影响许多与细胞健康和迁移相关的领域。从人类疾病到气候变化如何影响植物,更快地检测离子通道可以大大加快解决重大世界问题。”

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

当离子通道打开时,我们可以清楚地看到电流的增加。

了解数据和竞争指标

提供给我们的数据相当简单,这是这场比赛的好处之一。数据只包含三列:

  • 时间戳
  • 每个时间戳的安培值(电流)。这些值是在 10 千赫的采样频率下测量的。
  • 该时间戳对应的开放通道数(仅针对训练数据提供)。

训练数据集包含 500 万行,而测试数据集包含 200 万行。竞赛的目标是在这 200 万行上最大化宏观 F1 分数。特定类别的 F1 分数被定义为精确度和召回率的调和平均值:

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

“宏” F1 简单来说就是每个班级的平均 F1 分数。因此,如果我们有 K 类,我们将计算 K F1 分数,然后取这些 K 分数的平均值。如果我们检查提供的数据,我们已经可以得出一些有趣的事情…

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

提供的原始数据(训练和测试)

首先,通过检查训练数据中的开放通道,我们可以看到数据由批量 500K 测量值组成。我们也可以在电信号中批量看到这些转换。在测试集中,我们可以找到 100K 的批次。而且,事实证明,训练集中 500K 的批次实际上由 5x 100K 的批次组成。

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

训练由多批 500K 组成。摘自Chris Deotte的【一个特征模型】

通过更多地检查训练集中的开放频道,我们可以在训练集中找到五个不同的组:

  • 开放信道等于 0 或 1 的组。有许多 0 和一些 1。(类别 1)
  • 开放信道等于 0 或 1 的群。很多 1,很少 0。(类别 2)
  • 等于 0,1,2,3 的一组开放通道。(第三类)
  • 等于 0,1,2,3,4,5 的一组开放通道。(第四类)
  • 等于 0,1,2,3,4,5,6,7,8,9,10 的一组开放通道。(类别 5)
  • 令人惊讶的是,测试数据包含许多看起来非常类似于类别 1 的数据,但在电信号中有一些尖峰,这些尖峰没有出现在列车数据中。因此,我们将这些分类为单独的类别**(类别 6)**

当将这种洞察力与竞争指标相结合时,很明显具有多达 10 个开放频道 (类别 5) *的组将对宏观 F1 平均值产生最大影响。*它有 5 个独特的类别(6、7、8、9、10),没有出现在其他组中,因此,这组数据对我们的宏观 F1 分数的贡献超过 50%。在比赛过程中, Waylon Wu 通过打探发现公共 LB 由前 30%(或 600000)的测试值组成,而私有 LB 由剩下的 70% (1400000)组成。

预处理

预处理 I:消除漂移

我们注意到,在训练信号的开始和结束以及测试信号的不同位置都存在奇怪的漂移…我们注意到两种类型的漂移:曲线漂移(例如,在训练信号的结束)和线性漂移(例如,在训练信号的开始,时间=50 左右)。

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

来自信号的两个子样本说明了两种类型的漂移。

最后,事实证明“线性”漂移根本不是线性的,而实际上只是“弯曲”漂移的一小部分(例如,我们的弯曲漂移的前半部分看起来也是线性的)。比赛开始后不久, Eunho LeeMarkus F 发现比赛组织者通过使用频率非常低的(周期值为 1.000.000)的正弦函数,在数据中引入了人为噪声。 Chris Deotte 将来自两个独立分析的见解捆绑在一起,以执行最干净的漂移消除,并从中制作一个数据集,该数据集可被所有其他竞争对手使用(感谢 Chris!).我们的新数据现在看起来如下:

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

漂移消除后的数据

我们可以注意到,从时间=360 到时间=390,有些事情仍然在出错。我们决定不为此费心,因为这样的异常在测试集中不存在,并且我们从我们的训练集中删除了这个数据。

预处理 II:线性变换

通过检查数据,很明显列车信号和开放频道的数量是高度相关的。事实上,对电信号应用线性变换,然后对结果值进行舍入,已经表现得相当好了。

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

电信号和开放通道的数量密切相关。

我们决定学习每类数据的线性变换,将电信号值最好地映射到开放通道的数量,这使得在未来的步骤中更容易分析。转换相当简单,我们学习了以下函数的两个不同参数(1D 线性回归):

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

1D 线性回归,以更好地将电信号(x)与其各自的开放通道数对齐。o 是偏移量,s 是线性回归的斜率。

我们的斜率对于每个类别都是相同的(0.8107),并且偏移取决于类别(对于类别 2、3、4 和 6 是 2.221318;类别 5 为 4.4288541,类别 1 为 2.180783)

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

对齐的数据。请注意,电信号现在已经非常好地对应于各个开放通道的数量。对信号值进行舍入已经会产生强基线。

我们提供了一个包含 python 代码的笔记本来说明这一点。

预处理三:电力线干扰消除

正如我在上一节中提到的,舍入我们对齐的电信号值将会产生一个强基线。不幸的是,它不会产生一个完美的分数…这是由于噪音存在于我们的数据集中(幸运的是,否则这将是一个相当微不足道的挑战)!我们可以通过简单地计算以下等式来检查这种噪声:

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

下面是我们的训练集的前 10000 个噪声值的图:

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

我们训练集的前 10000 个噪音值

虽然可能很难用肉眼看到,但在我们的噪声中存在某种波形。如果我们取一个大小为 50 的居中窗口的移动平均线,这就变得更加清楚了:

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

我们 10000 个噪声值的移动平均值(大小为 50 的居中窗口)。

我们可以清楚地看到平均每 200 个值就有一个波峰。以 10 kHz 的采样频率测得的周期约为 200 的周期性信号对应于 50 Hz 的频率。原来英国的交流电(比赛是利物浦大学的)频率是 50 Hz!为了从我们的噪声中消除这种模式,我们决定在每批 100000 个噪声值上拟合一个正弦函数(为此,您可以使用 scipy.optimize )。虽然信号处理技术,如带通和带阻滤波器也可以做到这一点,但我们用简单的正弦函数可以得到更好的结果。结果还表明,正弦函数中有多个分量(即多个正弦波具有不同的振幅、相位和频率)效果最佳。

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

10000 个噪声值和相应的拟合正弦函数。

同样,我们提供了一个笔记本来用 python 代码演示这一点。

类别 5 =类别 4 +类别 4

看起来我们的噪声去除技术对所有类别都很有效,除了一个类别……类别 5 中的数据有一些独特之处,使其区别于其他所有类别。通过做一些实验,我们注意到我们可以通过将类别 4 中的两个随机批次相加,很好地模拟类别 5 中的数据。

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

通过将两批类别 4 相加,生成类别 5 的合成数据。

通过这种假设,我们也可以假设 5 类噪声是两个正弦函数的叠加。此外,这种见解允许对例如神经网络有用的数据扩充。

事实证明,这一见解实际上也是漏洞。我们没有追求这条途径足够长的时间,但私人测试数据正好是两个类别 4 批次的总和,其中一个可以在训练集中找到…比赛结束后,我的队友 Zidmie, 在大约 30 分钟的寻找中发现了这个漏洞 (将我们的私人得分提高到 0.95430)。令人沮丧的是,由于一个漏洞,我们在 30 分钟内改进的模型比我们两个月的工作都多。后来他发现了整个泄密: y_test[570000:5800000] = predict(X_test[5700000:5800000] - X_train[4000000:4100000]) + y_train[4000000:4100000] 。因为你现在预测的是第 4 类数据(最多 5 个通道),所以任务变得容易多了。

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

再现#1 和#2 使用的泄漏。#1 从 X_test 中提取 X_train,而#2 从 X_test 中提取 y_train。提取 X_train 比 y_train 好,因为你也把噪音降低了一半!

建模

隐马尔可夫模型:单通道数据

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

这个迷因太适合不使用它了。最后,事实证明,私有测试数据的泄露是真正的赢家(也许我应该创造一个新的迷因……)。

序列状态空间模型,如隐马尔可夫模型,在很长一段时间内是这类问题的最新技术。只是在最近,深度学习的变体才被提出来(例如竞赛组织者提出的本文),因为这些变体通常对漂移之类的事情更加鲁棒。由于我们正在预处理我们的数据以消除所有的伪像,我们决定采用隐马尔可夫模型作为我们这次比赛的建模技术。

有很多关于隐马尔可夫模型的精彩介绍,所以我在这里就不再赘述了。我们需要知道的是,每个隐马尔可夫模型都有不同的参数:

  • 隐藏状态的数量(= K)
  • 初始化概率(大小为 K 的向量)
  • 一个转移矩阵(K×K 矩阵)
  • 排放概率。每个隐藏状态都发出一定的可观测值。这些发射可以具有不同的分布,例如离散发射的多项分布和连续发射的高斯分布(我们将在这里使用,因为我们的电信号是连续的)。

简而言之,开放通道(隐藏变量)遵循特定的马尔可夫过程,并以由转移矩阵确定的特定概率从一个值转移到另一个值。当马尔可夫过程处于某个隐藏/潜在状态时,会发出一个可观测值,这里就是电信号。

作为一个例子,我们将关注具有二元响应变量(开放通道= 0 或 1)的类别 2,并假设我们的马尔可夫模型具有 2 个隐藏状态。当打开通道的数量等于 0 时为隐藏状态,当它等于 1 时为一个隐藏状态。通过查看我们的训练数据(即,计算从一个状态到另一个状态的转换,并查看与一定数量的开放通道相对应的信号值),我们可以很容易地估计转换矩阵和发射分布:

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

第二类训练数据的估计高斯分布和转移概率。

这意味着,例如,如果开放通道的数量等于 1,信号值也将大约为 1(有一点差异)。下一个值将以 93.6%的概率等于 1,或者以 6.4%的概率等于 0。如上所述,这些参数可以通过使用训练数据来估计,但是也可以通过应用鲍姆-韦尔奇算法来估计。该算法是期望最大化算法的一个特例,期望最大化算法是一个无监督算法(不需要交叉验证,允许更快的迭代)。简而言之(也是简单化的方式),它会基于其初始参数进行预测,然后使用这些预测来更新参数,直到收敛。一旦学习了参数,我们就可以通过应用两种算法中的一种来执行推理:

  • 维特比算法——将返回最可能的序列
  • 前向-后向算法(或最大后验概率)——返回 TxK 概率矩阵 P,其中P[t][k]将是在时间t处于隐藏状态k的概率。

初始实验已经表明,前向-后向算法比维特比算法工作得稍好(尽管较慢)。注意,这些算法也用于 Baum-Welch 算法。在 Python 中应用所有这些算法的一个很棒的库是 hmmlearn

让我们在类别 2 的预处理数据上拟合一个双态 HMM:

创建具有两个隐藏状态的隐藏马尔可夫模型,我们基于我们的训练数据估计我们的发射分布和转移矩阵的参数。“长度=[100000]*10”来自于类别 2 有 2 批数据的事实。每批长度为 500K,同样由 5 批 100K 组成。因此,我们总共有 10 个长度为 100000 的序列。

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

我们脚本的输出。hmmlearn 库执行 Baum-Welch 算法 5 次迭代以适应我们的参数,之后它收敛。这类数据的 F1 分数等于 0.9961

因此,通过使用这个相当简单的方法,我们已经可以在我们的数据类别 2 上获得 0.9961 的 F1 分数。应该注意的是,我们的数据的类别 1 和类别 2 是最简单的,具有近乎完美的性能。F1 分数随着开放频道的最大数量而迅速下降。例如,我们无法在数据的类别 5 上达到 0.9 的 F1 分数。请看这本笔记本,了解更详细的例子。

“隐”隐马尔可夫模型

当阅读组织者发表的一篇论文时,可以清楚地看到,尽管开放频道的数量遵循马尔可夫过程,但它们又是由隐马尔可夫模型生成的。:

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

地面真相(开放通道)由马尔可夫过程产生,这可以是合成的(这是该比赛的情况)或真实的(因为假设真实离子通道遵循马尔可夫过程)。这个地面真相然后通过膜片钳放大器播放并记录下来,这产生了我们的带噪声(电信号)的可观测数据。图取自主办方的一篇论文。

这个隐马尔可夫模型由比唯一的开放信道值的数量更多的隐藏状态组成。这是 Markus F 在比赛中指出的

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

左边是“香草”HMM,右边是 2 层或隐马尔可夫模型。

一个简单的方法是在我们的 2 层模型中忽略中间层(y(t))。因此,我们有一个隐藏马尔可夫过程,其隐藏状态的数量大于唯一开放通道的数量。让我们将这一观点应用到我们的类别 2 数据中。我们将在 HMM 中使用 4 个隐藏状态(我们已经用其他数字进行了实验,但是 4 个效果最好)。前两个隐藏状态将对应于开放通道的数量等于 1 时,随后的两个隐藏状态对应于开放通道为 0 时。估计初始转移矩阵现在变得更加困难,因为我们不能从我们的训练数据中直接估计它,我们手动调整了转移矩阵。

为了适合 4 状态 HMM,我们手动初始化转移矩阵,并对不同的隐藏状态重复使用我们的均值和协方差。

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

我们脚本的输出。请注意,hmmlearn 在迭代过程中打印的负对数似然比具有两个隐藏状态的对数似然大一倍。

可以注意到,我们现在获得了 0.9972 的 F1 分数,与仅使用 2 个隐藏状态相比,这大约增加了 0.001。这种改善非常显著,尤其是考虑到随着开放频道数量的增加,这种改善甚至会增加更多。F1 分数 0.001 的差距就是一枚银牌和一枚金牌的差距。通过引入更多的隐藏状态或调整初始转移矩阵,F1 可能会得到更大的改进,但较小的转移矩阵有几个优点,这将在后面更加清楚。在这本笔记本中可以找到这方面的 Python 代码。关于我们如何手动调整转换矩阵的更多信息,我们建议读者查阅这本笔记本。

将隐马尔可夫模型扩展到 K 信道

看起来我们可以非常精确地对我们数据的类别 1 和类别 2 建模,这两个类别有多达 1 个开放通道。现在的问题(25,000 美元)是,我们是否可以将这种方法应用于我们的具有一个以上公开渠道的数据的其他类别。事实证明,这远不是一个微不足道的情况…设计一个大型的初始转移矩阵,并确定哪些隐藏状态对应于哪些数量的开放通道是困难和昂贵的(我们的搜索空间实际上是无限大的)。

因此,我们假设当一批数据中的最大开放通道数等于K时,我们正在处理K个独立的二元马尔可夫过程。此外,这些马尔可夫过程中的每一个都具有与我们的第二类数据非常相似的参数。让几个独立的隐藏过程产生一个可观察变量非常适合阶乘隐马尔可夫模型。不幸的是,我们没有在 Python 中找到一个好的库(有 factorialHMM ,这是一个很棒的包,但我们在比赛期间没有让它足够快地工作,还有 Pyro.ai ,但学习曲线非常陡峭(至少对我来说)。

由于没有可用的实现,我们意识到自己实现这一点将是一个困难而漫长的过程。因此,我们决定在独立流程方面“突破”,将用于模拟多达 1 个开放通道数据的较小转换矩阵转换为较大的转换矩阵。我们新的大型马尔可夫过程中的每个隐藏状态对应于独立过程中隐藏状态的可能组合。顺序无关紧要(即(0,2)(这意味着 1 个进程处于隐藏状态 0,另一个处于隐藏状态 2)与(2,0)相同)。这种构造是递归完成的,如下所示:

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

为了对两个独立的过程建模,我们首先将 4 个隐藏状态扩展到 16 个隐藏状态,这 16 个隐藏状态捕获了隐藏状态的所有可能组合。之后,我们将相似的状态组合在一起(用相同的颜色标记)。然后,我们可以通过将新的 10x10 矩阵扩展为 40x40,并将其还原为 20x20(以此类推)来进一步继续模型 3 流程。马尔可夫链中所有状态之间都有转移(我只是没有全部画出来)。

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

扩展 4x4 转换矩阵以模拟独立流程。

在每次迭代中,我们首先扩展我们的转移矩阵。如果初始转移矩阵是 N×N,那么我们新扩展的矩阵将是 N * K×N * K,它捕获了我们的 N 个初始状态与 K 个新的可能状态的所有可能的相互作用。当有两个独立的进程时,一个例子是进程 1 处于隐藏状态 0,进程 2 处于隐藏状态 1。在此扩展之后,我们将相似的状态分组在一起(例如我们图中的绿色单元)。使用我们的示例,进程 1 处于隐藏状态 0,进程 2 处于隐藏状态 1,相当于进程 1 处于隐藏状态 1,进程 2 处于隐藏状态 0。在这个过程之后,我们新生成的矩阵的维数将是 C×C,其中 C 等于来自 K 个可能状态中的 P 个独立过程的重复组合的数量。作为一个例子,对于 4 个隐藏状态和 3 个独立进程,C 将等于 20(Comb _ with _ repeation(4,3)= Comb(4+3–1,3) = 20)。

下面是实现这一点的 Python 代码:

应该注意的是,这种算法实现起来并不那么简单,当进程数等于 10 时,一个简单(但可读性更好)的实现估计需要几周的运行时间。这一实施已经花费了大约 2 分钟来生成包含 10 个流程的转换矩阵,初始矩阵为 4x4,对于 5x5 矩阵来说已经花费了更长的时间(因此我们仍然使用 4x4)。

在隐马尔可夫模型中引入记忆

我们自己实现了向前向后算法,这给了我们很大的自由度。我们对算法的普通实现尝试了许多不同的调整,但导致最显著改进的是内存的引入。当在向后传递中计算时间步长t的概率时,我们使用向前传递的时间步长t的计算概率:

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

计算后向概率(betas)。Psig 是我们的发射概率,Ptran 是我们的跃迁概率,c 是系数(越高,前向概率的影响越大)。

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

计算我们的未来概率。

总的来说,我们执行三遍。一次向前传递,其中我们在下一次向后传递中使用 alphas,最后一次向前传递使用我们新计算的 betas。我们的 Psig 计算如下:

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

计算我们的 Psig 使用平均值为 0 的高斯分布和可以调整的 sigma。这导致|状态|概率。

我们的适应函数,用于向前和向后传递。对于反向传递,我们只是转置了转移矩阵并反转了信号。

在这里可以找到这种定制的向前向后算法的工作示例。

后处理

后处理后验概率

在我们的向前向后算法之后,我们剩下一个TxK,它具有每个可能的隐藏状态和每个时间步长的概率。由于我们有多个对应于相同开放通道值的隐藏状态,我们需要另一个后处理步骤来将这些概率转换为预测。作为第一步,我们用我们的K状态取每个时间步中我们的K概率的点积,这与加权和相同,因此得到连续的值Y。然后我们决定学习每一类和每一类数据的阈值。如果Y落在两个阈值之间,那么它被分配到相应的类。

为了确定这些阈值,我们使用了某种无人监管的技术。首先,我们过滤掉接近其舍入值的信号(因为这些信号中不存在大量噪声),并使用其舍入值作为标签。然后,我们确定这些舍入值的分布,并选择阈值,以便产生类似的分布。

请使用我们的后处理代码检查此笔记本。

一点混合

这个 HMM 的许多变体已经在这个比赛的过程中被制造。我的队友 Zidmie 在他的脚本中使用了一个计数器,他最终是 342(所以 342 个不同的脚本只由他自己编写)。在整个比赛过程中,我们不断提高我们的简历和公众 LB 分数。通常,连续版本之间的差异比 CV 分数的差异要大得多,这意味着新版本所做的改变并不都是正确的。因此,我们将前向-后向算法的不同输出混合在一起(通过使用它们的计算概率)。这给了我们一些边际增长。

结束语

我对我们的最终结果感到非常自豪。我认为这个解决方案相当优雅,因为它不是你在 Kaggle 上经常看到的 1001 个不同模型的典型集合,而且它在不到一个小时内运行。我们也从未使用竞赛组织者的代码来创建额外的数据或对数据生成过程进行逆向工程。最后,我有点失望地掉了两个位置,因为一个漏洞被其他车队发现了,而不是我们。尽管如此,我在这次比赛中学到了很多,因为我以前从未使用过隐马尔可夫模型,并且认识了两个伟大而聪明的人!

请关注这个页面,因为在接下来的几天里,它可能会收到一些小的更新。此外,我们正在努力发布我们的代码!

再次感谢 Kha VoZidmie 在这次比赛中有很多乐趣!

**致谢:**作者感谢 Marco Gorelli 的建设性反馈。

来源

[## 利物浦大学-离子交换

确定每个时间点打开的通道数量

www.kaggle.com](https://www.kaggle.com/c/liverpool-ion-switching/overview) [## 离子通道

离子通道是成孔膜蛋白,允许离子通过通道孔。他们的功能…

en.wikipedia.org](https://en.wikipedia.org/wiki/Ion_channel) [## Deep-Channel 使用深度神经网络从膜片钳数据中检测单分子事件

努曼·切利克等人提出了一种深度学习模型,可以在嘈杂的环境中自动检测单分子事件

www.nature.com](https://www.nature.com/articles/s42003-019-0729-3) [## 阶乘隐马尔可夫模型

神经信息处理系统电子会议录

papers.nips.cc](https://papers.nips.cc/paper/1144-factorial-hidden-markov-models) [## hmmlearn/hmmlearn

hmmlearn 是一组用于隐马尔可夫模型的无监督学习和推理的算法。对于受监督的…

github.com](https://github.com/hmmlearn/hmmlearn)

确定欧洲电视网歌唱比赛中的投票群体

原文:https://towardsdatascience.com/identifying-voting-blocs-in-the-eurovision-song-contest-4792065fc337?source=collection_archive---------33-----------------------

长期以来,欧洲电视网歌曲大赛一直被指责为政治投票。像希腊和塞浦路斯或者瑞典和丹麦这样的投票配对是众所周知的,但是这种偏见会更深吗?我们能在竞赛中识别整个投票集团吗?

比赛确实试图通过使用公正的陪审团分发每个国家一半的分数来抵消政治投票,但是,自 2014 年以来,欧洲电视歌曲大赛一直在发布每个国家的电视投票排名。现在这个数据集已经增长,我们有一个独特的机会来确定欧洲电视网欧洲观众的民族偏见。

在我们开始之前,我们需要一个数据集。很多相关数据可以在这里找到。然而,它缺少了几年的电视投票,所以请查看我的 Github 库中我使用的数据,并查看我为这篇文章创建的代码。

有了数据,我可以带您完成我决定使用的预处理步骤:

  • **一个国家的积分值除以该国当年获得的总积分。**无论歌曲质量如何,投票集团中的国家都会投票给对方。因此,在一个国家的歌曲整体排名很差的年份,他们的投票集团将在他们的分数中占很大比例。
  • **分值 12 和 10 分别更改为 10 和 9。**这将移除排名第一和第二的权重。
  • 仅使用来自决赛的数据。
  • 在决赛中没有得分的国家被除名。

我通过平均每个国家每年的得分比例,将数据汇编成一个 2D 矩阵。一个国家因为没有资格进入决赛而不能得分的年份被忽略了。

矩阵可以被视为所有国家之间的加权双向网络。这让我们使用 Louvain 方法进行社区检测,将所有国家划分为投票团体。当这些块被排列在一起时,我们会得到这样的热图:

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

我们可以看到几个方形的高活性区域。这些区域是不同的投票区。把这个翻译到欧洲地图上,我们得到这个:

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

欧洲电视网歌唱比赛的投票区。所有国家都适合。

一般来说,投票集团反映了地理和文化边界,例如,俄罗斯在东欧集团或前南斯拉夫国家的影响。然而,随着我们向西移动,这些集团变得更大,更不明确。

该表为我们提供了更多关于投票集团的详细信息:

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

并非所有的投票群体都是平等的。“北欧”集团的地区偏见虽然高于所有国家的平均水平,但远低于其他地区。

“不对称”度量告诉我们给出和接收的反射点如何。“非对称性”为 0 意味着一个国家从另一个国家得到的分数是相同的。高度不对称的集团是投票集团的不良例子。如果我们看看伊比利亚/德国集团的地理位置,它不是一个强大的投票集团就不足为奇了。

这凸显了试图将所有国家纳入集团的问题。一些国家有非常高的不对称度。他们不给给他们积分的国家积分。通过迫使这些国家加入投票集团,我们给聚类增加了很多噪音,这反过来又给我们发现的集团增加了很多不确定性。

为了解决这个问题,我重复了制作第一张热图的所有步骤,但这次我删除了 15 个最不对称的国家。

有趣的是,五大和澳大利亚就在这 15 个国家中。这些国家不需要通过半决赛来获得决赛资格。这可能告诉我们,投票集团中的国家更有可能通过半决赛。

移除不对称国家后,我们得到的热图如下所示:

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

这些集群似乎比以前更加明确,我们的指标也证实了这一点:

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

这相当程度上更新了地图:

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

欧洲电视网歌唱比赛的投票区。不对称国家被移除。

所以,我们找到了投票团!我对比赛中地域偏见的程度感到非常惊讶。不可否认,各国获得的很大一部分分数来自他们的投票集团。但是,它的作用大到足以影响获奖歌曲吗?看一下过去 6 届欧洲电视网的获奖歌曲列表。

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

总的来说,我们看到了来自自己阵营的强烈支持。此外,(忽略巴尔干),获奖歌曲确实设法在其他投票集团中排名很高。但是,很难说所有的集团都同意这首获奖歌曲。

投票集团是欧洲电视网投票系统的自然产物,尽管看起来很难阻止投票集团,但将它们的影响最小化是可能的。目前,各国给最多人投票的宋 12 分,给第二名 10 分。这给了每个国家投票的前 2 首歌曲额外的权重,这是一个可以在投票群体中利用的因素。我重新创建了以前的表格,但这次 12 点选票减少到了 10 点,10 点减少到了 9 点。

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

标准偏差从平均值 1.49 降至 1.11,偏差降至最低。我找不到在比赛中引入 12 分制的理由。然而,无论是直觉上还是显而易见的,这似乎清楚地表明,它允许偏见被进一步利用。也许这种改变不值得。仅仅是为了娱乐。毕竟是歌唱比赛。

作为结束语,我认为值得一提的是,法官投票似乎更少偏见。它远非完美,但令人欣慰的是,专业人士比公众更客观。

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

鉴别野生蘑菇

原文:https://towardsdatascience.com/identifying-wild-mushrooms-what-to-forage-what-to-avoid-79242d14346c?source=collection_archive---------39-----------------------

吃什么,避免什么?Python 分类项目

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

来源:Pixabay

近年来,蘑菇作为一种超级食物越来越受欢迎,人们也越来越了解它对健康的巨大益处。蘑菇过去通常被视为传统食物,现在被广泛消费,并被认为具有治疗和保健功能。随着越来越多的人对此感兴趣,在野外寻找蘑菇的人数可能会增加,我想知道是否可以很容易地识别出可食用或有毒的蘑菇,以及这看起来像什么。

数据

该项目中使用的原始数据集来自 UCI 机器学习知识库。该数据集包括来自 23 种蘑菇的 8,124 个蘑菇样本的分类特征。

评估的目标变量是“可食用”或“有毒”的等级区分,并且从一开始就基本平衡。

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

目标变量,用 Seaborn 绘制。

解释变量涵盖了每个观察到的蘑菇结构的一系列描述性和视觉特征——例如,菌盖颜色、气味、环数和菌柄形状。我的数据集中最初有 21 个解释变量,都是分类变量。下面是 Seaborn 绘制的一些功能可视化(一键编码前):

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

我还利用 EDA 来可视化数据集的特性和类之间的关系。有明确的实例显示明显的分离:

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

建模

在通过 EDA 对我的数据集有了一些了解之后,我开始研究建模。应该注意的是,我的数据集从一开始就基本上是干净的——但是仍然有几个地方需要清理。为建模而预处理我的数据的主要领域有:

  • 所有二进制分类特征被编码为 0 和 1 值(包括目标)。
  • 由于所有值都相同,并且不会对模型产生影响,因此删除了面纱类型特征。
  • 一键编码应用于所有非二进制或序数/数字的特征。
  • 应用于数据集的训练/测试分割。

那么我运行了哪些模型呢?

我运行了基线虚拟分类器(预测多数类)、逻辑回归、KNN、决策树和随机森林分类器。我利用网格搜索来调整每个(不包括基线模型)的超参数。我的最佳评估者和他们的测试分数如下所示:

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

我的分类模型在数据集上的表现都非常好!这绝对让我感到惊讶…但我稍后会详细介绍这一点。

关于我的模型的一些想法——逻辑回归,它有 99%的分数通常是一个很好的选择。然而,鉴于该模型预测了一些假阴性(在这种情况下可能是致命的),我会说其他 3 个模型表现完美,因此更适合对蘑菇进行分类。

特征重要性和结论

由于我的模型表现得如此之好,我很清楚它们能够识别出对食用蘑菇和有毒蘑菇的分类有很大影响的特定特征。这正是我所希望的!

我从我的决策树分类器和随机森林分类器中探索了特征的重要性,并在下面绘制了前 10 个特征。有一些重叠和一些变化,如图所示…你也可以看到,气味 n,代表无,被两个模型选为最重要的。

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

随机森林分类器的特征重要性。

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

决策树分类器的特征重要性。

最后,几个简单的规则来鉴别毒蘑菇…

我能够利用从我的特性重要性分析和 EDA 中学到的东西,整理出一个简单的列表。也就是说,我不是专家,这个列表不应该在现实世界中应用——但是我能够得出一些结论,这些结论值得在这个项目中分享。

  1. 气味:如果蘑菇有气味,特别是气味不好闻,很可能有毒。

**2。鳃大小:**如果鳃很窄,很可能有毒。

**3。孢子印颜色:**白色、红色、‘巧克力’都有可能有毒。

**4。淤青:**如果蘑菇没有淤青,很可能有毒。

5。戒指上方的茎面:如果呈丝状,很可能有毒。

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

来源:Pixabay

最后的想法和下一步

为了扩大这个项目,也许选择一个“最终”模型,我想看看是否有类似的数据可用于未来的分析。通过这种方式,我可以进一步测试我的模型,也许还能发现一些在现实世界中最有效的方法。一些模型在我的数据集上表现完美,因此值得怀疑数据集是否受到损害,因此,在另一个数据集上测试我的模型可以提供进一步的验证。

此外,将我的结论与图像分类结合使用也是一个有价值的实验。

如果你对这个项目背后的代码感兴趣——查看我的 Github:https://Github . com/AlisonSalerno/Classification-model-project

IEEE-CIS 欺诈检测

原文:https://towardsdatascience.com/ieee-cis-fraud-detection-by-lightgbm-b8956a8e4b53?source=collection_archive---------39-----------------------

机器学习算法有助于确定哪些交易可能是欺诈性的。

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

布莱克·维斯在 Unsplash 上的照片

在这项工作中,我们将对在线交易是否欺诈进行分类。它是一个二进制目标,名为:isFraud。我们很多人都遇到过这样的情况,一笔交易未经我们的考虑就被取消了。有一个更好的算法,只取消欺诈交易,而不只是导致在商店里尴尬。虽然目前经常令人尴尬,但这个系统每年确实为消费者节省了数百万美元。

该数据集由 Vesta 的真实世界电子商务交易提供,包括从国家到收件人电子邮件域的广泛功能。利用这个数据集,我们将 Lightgbm 算法应用于一个具有挑战性的大型 e 级数据集。提高欺诈交易警告的有效性将为许多人省去误报的麻烦。如果您想了解 PySpark 的实现,请阅读下一篇文章。

但是我们如何分析这类问题呢?

数据

第一步是下载数据集。这里使用的训练集有两个部分。一个是 train _ transcation,另一个是 train_identity。

train_identity = pd.read_csv(‘../input/ieee-fraud-detection/train_identity.csv’)train_transaction = pd.read_csv(‘../input/ieee-fraud-detection/train_transaction.csv’)

我将在名为“TransactionID”的列上合并这两个数据帧。但并不是所有的交易都有相应的身份信息。

train_transaction_identity = train_transaction.merge(train_identity, on=’TransactionID’,how=’left’ )

数据集包含几个特征,下面我只提到其中的几个。

  • TransactionDT :给定参考日期时间的 timedelta(不是实际时间戳)
  • 交易金额:美元交易支付金额(部分为其他货币兑换)。
  • card1 — card6 :支付卡信息,如卡的类型。
  • 地址:地址

如果您想更好地了解特性,请查看数据源链接。

如下图所示,内存使用量超过 1.9+ GB。我们可以在不丢失任何数据的情况下减少内存使用。

train_transaction_identity.info()

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

首先,我发现了不同类型的特性,包括对象、浮点和整数。通过使用。在熊猫图书馆,你可以找到内存使用的大小。大部分被 float64 占据。我已经将这些列从 float64 更改为 float32。如您所见,内存使用量减少了近 50%。

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

数据探索

大多数交易不是欺诈,所以在这种情况下,我们有不平衡的数据。机器学习算法无法在不平衡的数据集上正常工作。下面写的一段代码显示只有 3.5%是欺诈性的。

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

它们是处理不平衡数据集的几种方法,如过采样和欠采样。好在 Lightgbm 可以帮你解决这个事情。默认情况下,模型认为数据集是平衡的。因此,在您的情况下,我们需要将参数更改为:

is_unbalance = True

通过这样做,“不平衡”模式使用目标值来自动调整与输入数据中的类别频率成反比的权重。

移除多余的功能

如果我们看每一列,我们可以看到,如果我们有很多丢失的值。

(np.sum(pd.isnull(train_transaction_identity)).sort_values(ascending=**False**)/len(train_transaction_identity))*100

下图显示,我们有大约 99%的缺失值的特征。这些列不会给我们的模型增加任何值。所以我们可以删除它们而不会丢失太多数据。

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

在所有特性中,我已经删除了丢失值超过 30%的列。下面写的代码是为了去掉这些不重要的特性。

分类特征

分类数据是只需要有限数量的可能值的数据。机器学习算法不能直接处理分类数据,要使用它们,必须先将类别转换成数字,然后才能对它们应用学习算法。

有几种技术可以应用,包括 OneHotEncoder,替换值。在这里,我使用 Pandas get_dummy 函数将分类变量转换为虚拟/指示变量。

train_dummy = pd.get_dummies(train_transaction_identity, drop_first=**True**)

处理缺失值

有几种方法可以处理缺失值,如插补、删除。默认情况下,Lightgbm 有一个选项来处理这个问题。它在分割查找过程中忽略丢失的值,然后将它们分配给损失减少最多的那一侧。如果你不想使用选项和应用其他技术,你将需要它的参数为:

use_missing=false

特征缩放

在创建机器学习模型之前的数据预处理期间,特征缩放是机器学习算法中最重要的步骤之一。大多数情况下,您的数据集将包含在量级、单位和范围方面差异很大的要素。但对于大多数机器学习来说,使用未缩放的特征会产生一个问题。

例如,线性回归等机器学习方法和使用梯度下降作为优化算法的神经网络需要对数据集进行缩放。当我们使用像 K-means 和 SVM 这样受特征范围影响最大的距离算法时,也会出现类似的问题。原因是他们使用数据点之间的距离来确定它们的相似性。

幸运的是,我们不需要担心它的功能扩展。基于树的算法对特征的规模相当不敏感。

模型评估

我用了 25%的数据进行验证,其余的用于训练。这里涉及到很多超参数。因此,你的工作就像一个建筑师,寻找最佳值,以最大限度地提高准确性。

有几种技术非常有用,包括 GridSearchCV 和 RandomizedSearchCV。

如您所见,这里涉及到许多参数,但如果您想了解每个参数是什么,请查看此链接

结论

正如我们在下面可以看到的,我们已经获得了训练数据的 AUC 几乎为 98%,验证数据集的 AUC 为 94%。大约花了 5 分钟。您可以增加“增强迭代次数”以获得更好的训练/验证数据集 AUC。您可以考虑这一点,或者更改其他参数来权衡准确性和速度。

您将能够在 CPU 上运行 Lightgbm。为此,您只需设置以下参数“设备类型”:“GPU”

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

本文使用的所有代码都可以从我的 GitHub 中访问。我期待听到反馈或问题。

如果历史重演,傅立叶变换是一把钥匙

原文:https://towardsdatascience.com/if-history-repeats-itself-fourier-transform-is-a-key-a593ddfa246e?source=collection_archive---------52-----------------------

仅仅使用傅立叶变换就可以清理你的数据并预测新的数据吗?答案是肯定的,可能。

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

图片由乔恩·泰森https://unsplash.com/@jontyson拍摄

我的教授在高中时常说的一句话是**“历史会重演”**。这句话的意思显然与这样一个事实有关,即我们应该以史为鉴,从而能够不犯我们过去犯过的同样的错误。

现在我们来谈谈科学。如果你有一个时间序列,那么你就有(最好)很长一段时间的数据。让我们假设一下历史确实会重演。这将意味着,通过简单地复制信号,您将扩展您的数据,从而获得两倍长的数据集。我知道你在想什么,你是对的,我在愚弄你。事实上,我在这几行中主要提到的是 傅里叶变换 ,即每个周期信号都可以被视为正弦和余弦之和。获得每个频率的幅度和相位,就有了信号,可以很容易地扩展它。

我有一个好消息和一个坏消息要告诉你。坏消息是你不能假装你的数据是周期性的,除非你知道由于某种奇怪的原因它们确实是周期性的。好消息是,有时你的数据确实呈现半周期模式,在这种情况下,傅立叶变换值得一试。

我知道,我说了很多,让我们从实践开始。

设置:

已经使用的语言是 Python,具有已经使用的以下库:

数据集:

让我们以波兰电力负荷为例,看看 2008 年至 2016 年的数据:

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

这是原始数据

每一年的时间步长非常容易区分,如果我们把它缩小,每个月和每个星期也是如此。

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

很有周期性,是吧?

在这些情况下,傅立叶变换这样的简单方法可能是一种选择。事实上,它可以应用的想法是,我们的信号实际上是周期性的,但它似乎不是周期性的,因为噪声、一般线性趋势或其他不必要的影响使我们的信号不稳定。让我们继续前进!

春季大扫除:

该信号具有线性趋势,并且其平均值不为 0。这可能会干扰傅立叶频谱,通常我们不希望线性趋势被视为傅立叶频谱的“长频率成分”。使用神奇的 scipy 库,信号已被消除趋势和转移,以便将其平均值设置为 0。

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

线性增长的信号消失了。加上数据现在有 0 均值。

好了,我们准备好了。

培训/验证/测试:

借用机器学习术语,数据集分为三部分:

  • **训练集:**应用傅立叶变换的地方(从 2008 年到 2014 年)
  • 验证集:最适合模型的地方(2015)
  • **测试集:**其中揭示模型的优良性。(2016)

如果你是一个 ML 专家,请不要把这个术语看得太重,因为它和你所知道的不太相符。无意冒犯。名字就是名字。😃

算法:

当然,如果你天真地应用傅立叶变换,你不能期望得到好的结果,这就是为什么算法稍微(我希望)复杂一些。

Divide et impera(训练集)

傅立叶变换意味着数据是静止的,但生活是变化的,爱情故事也是结束的

这就是为什么训练集的每一年都必须单独进行。每一年都会给出它的傅立叶变换。

平均傅立叶变换(F)是通过每个傅立叶变换的和除以 7(在训练集上有 7 年)获得的。

消除干扰(验证集)

现在让我们考虑验证集信号(2015 年负载)。其思想是使用训练集的傅立叶变换,将其转换回来,并将重建的信号与验证集的信号进行比较。傅立叶逆变换当然是通过使用 numpy FFT 算法获得的。

问题是,由于 numpy FFT 算法非常出色,它能够非常好地再现信号,甚至可能太好了。事实上,我们希望噪声不在重构信号中。但是什么是真正的噪音呢?

你知道没人能回答这个问题,但是一个安全的警告是,误差(原始信号(即 2015 年负载)和重建信号之间的差异)必须最有可能与信号不相关。当然,另一方面,如果我们有一个 0 信号,它与原始信号不相关,但它没有预测能力。简而言之,这就是我们想要的模型:

  • 原始信号和重建信号之间可接受的低 RMSE:如果 RMSE 太高,预测就不起作用。
  • 误差与原始信号之间的低相关性:如果相关性太高,我们的模型会过度拟合数据,并且在测试期间会出现令人不愉快的意外。

为了做到这一点,我们调用一个名为 threshold 的魔法向导。阈值是 0 和 1 之间的某个值,将乘以训练集(F)的平均谱的最高值。所有小于 t * max(F)的频率都被设置为 0,然后信号被转换回原始空间,RMSE 和相关值都已经被计算出来。最佳阈值是具有最低 RMSE 和尽可能最低相关性的阈值。

测试预测(测试集)

这种经过滤波的傅立叶频谱已被用于预测 2016 年负荷的前 10 至 90 天,结果实际上令人惊讶。

该模型略微过拟合,但 RMSE 仍然低得可以接受,误差部分是由于统计误差波动,从 C 为< 0.60 这一事实可以看出。此外,预测实际上在一周的前几天非常好,而周末似乎更难赶上(伙计们,拜托,别喝太多了!)

结论:

许多数据科学挑战是时间序列挑战(例如全球气候报告、股票市场分析、太阳周期预测等。).当然,还有更强有力的方法来处理时间序列(RNN、阿玛、ARIMA、萨里玛等)。)并对它们进行预测。尽管如此,正如我希望我在这篇报道中所展示的那样,有时很好地利用简单的数学概念仍然可以产生非常好的结果。作为简单的数学概念,它们还能让你完全控制正在发生的事情,并且可以根据你自己的调查进行调整。

顺便说一句,我真的不知道历史是否会重演,但我确实认为我们应该以不同的形式、不同的心态和不同的精神重新生活一些时刻。正如马克·吐温曾经说过的:

“历史不会重演,但它经常押韵”

如果你喜欢这篇文章,你想知道更多关于机器学习的知识,或者你只是想问我一些你可以问的问题:

A.在 Linkedin 上关注我,我在那里发布我所有的故事
B .订阅我的 简讯 。这会让你了解新的故事,并给你机会发短信给我,让我收到你所有的更正或疑问。
C .成为 推荐会员 ,这样你就不会有任何“本月最大故事数”,你可以阅读我(以及数千名其他机器学习和数据科学顶级作家)写的任何关于最新可用技术的文章。

再见:)

如果让我重新开始学习数据科学,我会怎么做?

原文:https://towardsdatascience.com/if-i-had-to-start-learning-data-science-again-how-would-i-do-it-78a72b80fd93?source=collection_archive---------1-----------------------

几天前,我开始思考,如果我必须从头开始学习机器学习和数据科学,我会从哪里开始?有趣的是,我想象的道路与我开始时实际走的完全不同。

我知道我们都以不同的方式学习。有些人更喜欢视频,有些人只需要书就可以了,很多人需要付费才能感受到更多的压力。没关系,重要的是学习并享受它。

因此,从我自己的角度来说,如果我必须重新开始学习数据科学,我知道如何才能学得更好,所以我设计了这条道路。

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

正如你将会看到的,我最喜欢的学习方法是从简单到复杂逐渐进行。这意味着从实际例子开始,然后转向更抽象的概念。

Kaggle 微课

我知道从这里开始可能会很奇怪,许多人更愿意从最基础和数学视频开始,以充分理解每个 ML 模型背后发生的事情。但是从我的角度来看,从一些实际和具体的东西开始有助于对整个画面有一个更好的看法。

此外,这些微型课程每门大约需要 4 个小时才能完成,因此提前实现这些小目标会增加额外的动力。

Kaggle 微课:Python

如果你熟悉 Python,你可以跳过这一部分。在这里,您将学习基本的 Python 概念,这将帮助您开始学习数据科学。将会有很多关于 Python 的事情仍然是一个谜。但是随着我们的进步,你会在实践中学会的。

链接:https://www.kaggle.com/learn/python

价格:免费

Kaggle 微课:熊猫

Pandas 将为我们提供用 Python 操作数据的技能。我认为一个 4 小时的微型课程和实际例子足以让你对可以做的事情有一个概念。

链接:【https://www.kaggle.com/learn/pandas

价格:免费

Kaggle 微课:数据可视化

数据可视化可能是最被低估的技能之一,但却是最重要的技能之一。它将使您能够完全理解您将使用的数据。

链接:【https://www.kaggle.com/learn/data-visualization

价格:免费

Kaggle 微课:机器学习入门

这是激动人心的部分开始了。你将学习基本但非常重要的概念,以开始训练机器学习模型。这些概念对于理解它们是至关重要的。

链接:【https://www.kaggle.com/learn/intro-to-machine-learning】T2

免费

Kaggle 微课:中级机器学习

这是对前一个的补充,但这里您将第一次使用分类变量,并处理数据中的空字段。

链接:【https://www.kaggle.com/learn/intermediate-machine-learning】

价格:免费

让我们在这里停一会儿。应该清楚的是,这 5 个微型课程不会是一个线性的过程,你可能需要在它们之间来来回回地更新概念。当您在 Pandas one 中工作时,您可能需要返回 Python 课程以记住您所学的一些内容,或者进入 Pandas 文档以理解您在机器学习入门课程中看到的新功能。所有这些都很好,真正的学习将在这里发生。

现在,如果您意识到前 5 门课程将为您提供进行探索性数据分析(EDA)和创建基线模型的必要技能,以后您将能够对其进行改进。所以现在是时候从简单的卡格尔比赛开始,并把你学到的东西付诸实践了。

卡格尔游乐场竞赛:泰坦尼克号

在这里,你将把你在入门课程中学到的东西付诸实践。也许刚开始会有点吓人,但没关系这不是为了在排行榜上第一,这是为了学习。在本次竞赛中,您将了解这些类型问题的分类和相关指标,如精确度、召回率和准确度。

链接:https://www.kaggle.com/c/titanic

卡格尔游乐场竞赛:房价

在本次竞赛中,您将应用回归模型并了解相关指标,如 RMSE。

链接:https://www.kaggle.com/c/home-data-for-ml-course

到目前为止,您已经有了很多实践经验,并且您会觉得您可以解决很多问题,但是您可能还没有完全理解您所使用的每个分类和回归算法背后发生的事情。所以这就是我们必须研究我们所学内容的基础的地方。

许多课程都是从这里开始的,但至少在我从事过一些实际工作后,我能更好地吸收这些信息。

书:从零开始的数据科学

在这一点上,我们将暂时脱离 pandas、scikit-learn 和其他 Python 库,以实际的方式了解这些算法“背后”发生了什么。

这本书读起来非常友好,它提供了每个主题的 Python 示例,并且没有太多繁重的数学,这是这个阶段的基础。我们想要理解算法的原理,但是从实践的角度来看,我们不想因为阅读大量密集的数学符号而失去动力。

链接:亚马逊

价格:26 美元左右

如果你已经做到这一步,我会说你很有能力从事数据科学工作,并且理解解决方案背后的基本原则。因此,我在此邀请您继续参与更复杂的 Kaggle 竞赛,参与论坛并探索您在其他参与者解决方案中发现的新方法。

在线课程:吴恩达的机器学习

在这里,我们将看到许多我们已经学到的东西,但我们将看到该领域的一位领导者对此的解释,他的方法将更加数学化,因此这将是更好地理解我们的模型的一种方式。

**链接:【https://www.coursera.org/learn/machine-learning **

价格:无证书免费——有证书 79 美元

书:统计学习的要素

现在繁重的数学部分开始了。想象一下,如果我们从这里开始,这将一直是一条上坡路,我们可能会更容易放弃。

链接:亚马逊

价格:$60,在斯坦福页面有官方免费版本。

在线课程:吴恩达深度学习

到那时,你可能已经阅读了深度学习的相关内容,并尝试了一些模型。但在这里,我们将学习什么是神经网络的基础,它们如何工作,并学习实现和应用现有的不同架构。

链接:https://www.deeplearning.ai/deep-learning-specialization/

价格:49 美元/月

在这一点上,这很大程度上取决于你自己的兴趣,你可以专注于回归和时间序列问题,或者更深入地进行深度学习。

我想告诉你,我推出了一个数据科学问答游戏,通常会在面试中出现问题和答案。前往datasciencetrivia.com了解更多相关信息。

【santiviquez.com】原载于

最后,对 ReLU 工作原理的直观解释

原文:https://towardsdatascience.com/if-rectified-linear-units-are-linear-how-do-they-add-nonlinearity-40247d3e4792?source=collection_archive---------8-----------------------

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

来源: Pixabay

分段线性函数如何增加非线性

几乎所有使用过神经网络的人都用过 ReLU 函数。这是激活功能的现代标准,但是关于它是如何工作的还有一些问题。神经网络需要非线性来处理非线性问题,通常唯一可以注入非线性的地方是激活函数。然而,尽管严格地说,ReLU 在数学上不是线性函数,但它是由两个线性函数(分段线性)组成的。那么,直观地说,ReLU 如何保持并超越真正非线性的曲线函数的性能呢?

首先,重要的是要充分理解为什么需要在神经网络中加入非线性。在标准的神经网络中,每一层都将前一层乘以一组权重,并添加一个偏差。为了将长度为 m 的向量转换为长度为 n 的向量,权重采用了一个 n 乘以 m 矩阵(乘以一个 m 乘以一个矩阵,或者一个向量)的形式。

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

由作者创建。

即使在输入通过网络的几层之后,所应用的变换也是纯线性的;也就是说,只通过乘以一个系数并加上一个偏差来允许自由移动。因此,网络将只能解决不能被严格线性函数的有限运动所分离的问题。由于支配神经网络应用的许多复杂问题,线性神经网络的有限能力根本没有用武之地。

作为一个更严格的必要性的证明,普适近似定理需要非线性激活函数才能有效。本质上,该定理指出,在一些条件下,任何连续函数 f 都可以用具有一个隐藏层和足够数量单元的神经网络来建模。要求之一是激活函数必须具有某种形式的非线性。概括地说,为了处理非线性问题,网络中必须存在某种非线性。这是足够直观的理解。

ReLU 已经成为神经网络世界的宠儿激活函数。整流线性单元的简称,它是一个分段线性函数,对于 x 的所有负值定义为 0,否则等于 a × x ,其中 a 为可学习参数。

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

用德斯莫斯画的。

这种分段线性函数如何给网络增加非线性,这可能看起来不直观。毕竟还是线性的。虽然它显然不是完全线性的,但非线性的数学定义并不令人满意或直观。与激活函数宝座的其他竞争者相比——soft max、sigmoid 和 tanh——ReLU 缺乏干净的曲线,相反似乎只是线性函数的兄弟。然而,ReLU 成功的关键在于它如何解决环空问题:

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

每个神经网络有三个隐藏层,每层有三个单元。唯一的区别是激活功能。学习率:0.03,正规化:L2。由作者创建。

tanh 是一个平滑的曲线函数,它在圆的周围画出一个干净的包络线(而 linear 完全失败),而 ReLU 画出一个六边形,有几个尖角。其实这就是 ReLU 的优势所在:可以在某一点弯曲线性函数,到一定程度。结合前一层的偏差和权重,ReLU 可以在任何位置以任何角度弯曲。

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

用德斯莫斯画的。

这些小弯曲构成了近似法的基础。任何关系或函数都可以通过将许多 ReLU 函数聚合在一起来粗略估计,这发生在神经元在下一层中被折叠和组合的时候。这已经在数学上得到证明,例如,用正弦波或指数函数,很像低阶泰勒级数如何拟合函数。

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

酷似乙状结肠。用德斯莫斯画的。

人们可能倾向于指出,ReLUs 不能外推;也就是说,拟合为类似于-4< x4 的正弦波的一系列 ReLUs 将不能在这些界限之外继续正弦波的 x 的值。然而,重要的是要记住,神经网络的目标不是外推,而是概括。例如,考虑一个基于浴室数量和卧室数量来预测房价的模型。如果模型很难将该模式应用到浴室数量的负值或卧室数量超过 500 的负值,这并不重要,因为这不是模型的目标。(你可以在这里阅读更多关于一般化 vs 外推。)

ReLU 功能的强大不在于它本身,而在于一整支 ReLU 大军。这就是为什么在神经网络中使用几个 ReLUs 不会产生令人满意的结果;相反,必须有大量的 ReLU 激活,以允许网络构建一个完整的点地图。在多维空间中,校正的线性单元沿着类边界组合形成复杂的多面体。

ReLU 工作得如此好的原因在于:当有足够多的 ReLU 时,它们可以近似任何函数,就像其他激活函数一样,如 sigmoid 或 tanh,就像堆叠数百个乐高积木一样,而没有缺点。平滑曲线函数有几个问题是 ReLU 不会出现的,其中之一是计算导数或变化率,即梯度下降背后的驱动力,ReLU 比任何其他平滑曲线函数都要便宜得多。

另一个是 sigmoid 和其他曲线有一个消失梯度的问题;因为对于更大的绝对值 x ,sigmoid 函数的导数逐渐变缓。因为输入的分布可能在训练期间较早地偏离 0,所以导数将非常小,以至于没有有用的信息可以反向传播来更新权重。这通常是神经网络训练中的一个主要问题。

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

用德斯莫斯画的。

另一方面,ReLU 函数的导数很简单;它是输入所在直线的斜率。它将可靠地返回有用的梯度,尽管x= 0 {x0 }有时可能会导致“死神经元问题”,但总体而言,ReLU 仍然表现出不仅比曲线函数(sigmoid,tanh)更强大,而且比试图解决死神经元问题的 ReLU 变体(如 Leaky ReLU)更强大。

ReLU 设计用于大量工作;在大容量的情况下,它近似得很好,并且在近似得很好的情况下,它的表现与任何其他激活功能一样好,没有缺点。

如果你喜欢这个,

你可能也会喜欢我关于深度学习的一些其他文章。

[## 批量规范化:深度学习的最大突破

它是如何工作的——又是如何如此有效的?

towardsdatascience.com](/batch-normalization-the-greatest-breakthrough-in-deep-learning-77e64909d81d) [## 每个人的 GANs

革命性人工智能概念的直观解释

medium.com](https://medium.com/analytics-vidhya/gans-for-everyone-an-intuitive-explanation-of-the-revolutionary-concept-2f962c858b95)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值