从数据到市场策略:利用行为分割
原文:
towardsdatascience.com/from-data-to-market-strategy-using-behavior-segmentation-d065da224262
如何为业务增长个性化你的产品
·发表于 Towards Data Science ·4 分钟阅读·2023 年 1 月 10 日
–
图片由 Belinda Fewings 提供,发布在 Unsplash
74%的客户在你的产品服务没有个性化时感到沮丧(来源 Forbes)。行为分割可以帮助解决这个问题。简单来说,行为分割就是了解客户行为——他们如何与您的产品或网站互动,他们的使用频率,他们花费多少,以及他们购买了哪些产品。
一旦你了解了客户行为,就可以个性化你的产品。这可以带来更高的客户满意度以及业务增长。在这篇博客中,你将看到如何利用行为分割从数据到市场策略的过程。
行为分割过程(作者提供的图像)
数据收集和特征创建
行为分割需要从各种来源收集数据,如网站导航数据、账单数据、产品购买数据等。数据越多,你就越能深入理解客户行为。
为了说明这一过程,让我们以一家电信公司为例。这里展示的是在客户层面创建的样本特征。它包含了人口统计信息、客户使用的服务以及账单信息。下图仅显示了 40 多个特征中的部分样本特征。
样本数据(作者提供的图像)
使用聚类进行分段
我们可以使用聚类算法创建分段,并将每个客户分配到一个分段。下面展示的是聚类算法的结果。显示了三种分段,分别用蓝色、红色和绿色表示。每个点对应一个客户。
使用聚类进行分段(图像由作者提供)
分段解释
那么这些分段意味着什么?雷达图可以帮助我们解释这些分段。
例如,绿色聚类包含了那些服务时间最长的客户,他们使用所有服务,如互联网服务、在线备份、技术支持和流媒体电影。
解释绿色聚类(图像由作者提供)
蓝色聚类是服务时间最短、所有服务使用程度适中的客户。
解释蓝色聚类(图像由作者提供)
红色聚类对应的是只有电话服务且没有数字互联网服务的客户。
解释红色聚类(图像由作者提供)
市场策略
一旦解释完分段,下一步就是制定市场策略。
绿色分段是数字互动客户。
一种市场策略可以是创建数字忠诚卡,并根据数字服务的使用情况奖励客户。这也将增加公司的收入。
蓝色分段是互动适中但服务时间较短的客户。
一种市场策略可以是提供折扣并将他们转化为长期合同。
红色分段是只有电话服务的基本客户。
一种市场策略可以是向他们介绍数字服务的优势,然后推销数字产品。
结论
行为分段可以帮助制定个性化的市场策略。在这篇博客中,你看到了开发这种个性化市场策略的过程。
数据源引用
本博客使用的数据集来自于这里提供的电信数据集。允许商业和非商业用途。
编辑描述
community.ibm.com](https://community.ibm.com/community/user/businessanalytics/blogs/steven-macko/2019/07/11/telco-customer-churn-1113?source=post_page-----d065da224262--------------------------------)
请通过我的推荐链接加入 Medium。
[## 通过我的推荐链接加入 Medium - Pranay Dave
阅读 Pranay Dave(以及 Medium 上的其他成千上万的作者)的每一个故事。你的会员费用直接支持……
请订阅以保持更新,每当我发布新故事时您将会知晓
## 每当 Pranay Dave 发布内容时,获取电子邮件通知
每当 Pranay Dave 发布内容时,您将收到一封电子邮件。通过注册,如果您还没有 Medium 账户,系统将为您创建一个……
进一步阅读
请查看我的相关博客。
如何有效利用细分市场实现商业增长
towardsdatascience.com
YouTube 频道
您也可以在我的 YouTube 频道观看有关行为细分的视频
网站
您可以访问我的网站,这是一个无代码平台,用于学习数据科学。https://experiencedatascience.com
从数据到营销策略,通过事务性细分
原文:
towardsdatascience.com/from-data-to-marketing-strategy-using-transactional-segmentation-640b527a677b
如何有效利用细分实现业务增长
·发布于 Towards Data Science ·阅读时间 5 分钟·2023 年 1 月 5 日
–
创建于 openai.com labs.openai.com/s/SpAZlVi8fVRXueTBoKdi9p0w
大公司拥有数百万客户。如果没有细分,很难制定营销策略或进行客户沟通,如电子邮件或新闻通讯。客户细分是企业优化营销和产品开发工作、以及更好服务客户的重要工具。
有多种方式来细分客户。在本博客中,我将重点介绍事务性客户细分,也称为 RFM(Recency, Frequency, Monetary)建模。
RFM 是
R = 最近一次购买 = 客户上次购买的时间
F = 频率 = 客户购买的频率
M = 金额 = 购买的金额
这里展示了使用事务性细分创建营销策略的过程。
事务性建模过程(图像由作者提供)
购买交易
为了演示事务性细分,我将以一个在线零售商为例。这里展示了零售交易的样本数据。
零售交易样本数据(图像由作者提供)
数据包含信息,如发票号码、购买的产品、购买的数量以及价格。
RFM 模型
RFM 计算是在客户层面进行的。发票日期可以用来计算最近一次购买,发票号码可以用来计算购买频率,总价可以用来计算金额值。
在 RFM 计算之后,数据将包含自上次购买以来的天数、按月计算的发票频率以及作为一个月所有购买总额的货币价值。
这里展示了一个 RFM 计算的示例数据。
针对每个客户的 RFM 计算(图片由作者提供)
聚类
RFM 计算针对每个客户进行,时间范围可以是每月、每年或业务所需的其他时间范围。使用 RFM 值,可以通过聚类算法对客户进行细分。
这里展示的是聚类算法的结果。每个点对应一个客户。点的颜色对应于细分市场。总共有 5 个细分市场,每个客户都被分配到一个细分市场中。
基于 RFM 数据的聚类(图片由作者提供)
分段解释
拥有一个美观的聚类可视化是很好的。然而,解释这些集群的含义同样重要。
可以帮助进行分段解释的可视化方法是平行坐标,如下所示。可以看到关于最近购买、购买频率和货币价值的垂直线。所有值都已标准化为 0 到 100 之间。最右侧的垂直线用于表示各个细分市场或集群。
使用平行坐标可视化进行解释(图片由作者提供)
营销策略
使用平行坐标可视化,我们可以解释每个集群并制定营销策略。这里展示的是每个集群或细分市场的可视化。
解释每个集群(图片由作者提供)
我们现在可以解释每个集群并制定策略。
集群 0
-
解释 — 最近未进行购买的客户
-
策略 — 提供优惠以促使他们回归购买
集群 1
-
解释 — 具有高货币价值的客户
-
策略 — 创建忠诚度计划,以便他们能够继续增加消费
集群 2
-
解释 — 最近未进行购买的客户
-
策略 — 提供优惠以促使他们回归购买
集群 3
-
解释 — 可能会流失的客户
-
策略 — 通过激动人心的优惠来留住他们
集群 4
-
解释 — 常客
-
策略 — 创建忠诚度计划,以保持他们定期购买
结论
在这篇博客中,你看到了如何从数据到创建营销策略以促进业务增长。使用 RFM 进行客户细分是一种非常有效的策略,可以通过聚类和解释可视化来实施。
数据源引用
博客中使用的数据源可以在这里找到
archive.ics.uci.edu/ml/datasets/online+retail
可以用于商业或非商业目的,引用格式如下
Daqing Chen, Sai Liang Sain 和 Kun Guo,在线零售行业的数据挖掘:基于 RFM 模型的数据挖掘客户细分案例研究,《数据库营销与客户战略管理杂志》,第 19 卷,第 3 期,第 197–208 页,2012(在线出版时间:2012 年 8 月 27 日。doi: 10.1057/dbm.2012.17)。
演示
您还可以在我的 YouTube 频道观看 RFM 建模的演示
请通过我的推荐链接加入 Medium。
[## 通过我的推荐链接加入 Medium - Pranay Dave
阅读 Pranay Dave 的每个故事(以及 Medium 上其他成千上万的作者的故事)。您的会员费直接支持…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership?source=post_page-----640b527a677b--------------------------------)
请订阅以便在我发布新故事时保持信息更新
[## 每当 Pranay Dave 发布新内容时,您将收到一封电子邮件。
每当 Pranay Dave 发布新内容时,您将收到一封电子邮件。通过注册,如果您还没有 Medium 账户,您将创建一个…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe?source=post_page-----640b527a677b--------------------------------)
额外资源
网站
您可以访问我的网站,这是一个无代码平台,用于学习数据科学。https://experiencedatascience.com
YouTube 频道
这是我的 YouTube 频道的链接
www.youtube.com/c/DataScienceDemonstrated
从数据仓库和数据湖到数据网格:企业数据架构指南
了解大型公司中的数据运作方式
·发布于 Towards Data Science ·19 min 阅读·2023 年 5 月 12 日
–
图片: Headway (Unsplash)
数据科学课程与现实世界中处理数据的现实之间存在脱节。
当我在半年前进入澳大利亚四大银行之一的第一个分析岗位时,我面临着一个复杂的数据环境,其特征为…
-
查找、访问和使用数据的挑战;
-
竞争的业务优先级将人们拉向不同的方向;
-
难以维护和升级的遗留系统;
-
对数据驱动洞察力有抵触的传统文化;
-
孤立的团队彼此之间没有沟通。
更新:我现在在 YouTube 上发布分析内容。
一段时间,我踏实地工作,接受了这样一个想法:也许这就是企业数据领域的现实。我相信,虽然我们的技术堆栈以非常快的速度发展,但用户体验最终会赶上…
我接受了数据科学培训,但实际上进行数据科学并非易事。在线课程并未为此做好准备。
但问题在这里。
经过一些挖掘,我意识到我的组织并不是唯一面临这些数据挑战的——这些挑战在整个行业中都是普遍存在的。
我们正处于技术创新的熔炉中,事物以惊人的速度发展。计算能力正在快速增长,机器学习应用已经无处不在,前沿的生成式 AI和AI 艺术正在颠覆各个行业,且没有停止的迹象,消费者的期望也在不断变化。
所有参与分析行业的人都在努力找到自己的立足点。我们都在一起跌跌撞撞地前行。快速失败,迅速前进。
这就是我撰写这篇文章的原因。
我想分享我的见解,并帮助像毕业生、新业务分析师和自学的数据科学家这样的专业人士快速了解企业级数据格局,并设定期望。
1. 数据是数字化的命脉
首先,让我们对数据在今天竞争激烈、节奏迅速的商业环境中扮演的关键角色达成一致。
各行各业的公司都在朝着数据驱动的决策方式迈进。
与此同时,消费者越来越期望超个性化的数字产品和服务,这些产品和服务利用像 AI 和机器学习这样的强大分析工具,这些工具在公司能掌握的所有优质数据上进行训练。
AI 和机器学习的世界如何与企业分析交汇。图片由作者提供
它使你能够按需观看个性化的电视节目(娱乐),订购食物并在一小时内送到(食品杂货与购物),以及在几分钟内获得预批准的抵押贷款(住房)。
这意味着一个前瞻性的数据堆栈对于生存和发展至关重要,因为数据是数字化的命脉。
正如英国数学家克莱夫·汉比在2006 年所说:
“数据是新的石油。”
IT 部门和数据平台不再是地下室里的“宅男”——它们现在是企业战略的核心部分。
数据现在是一个一流公民。
因为数据驱动一切。
所以不再废话,让我们深入探讨大型公司如何组织、处理和存储数据。
从我们的直升机俯瞰,你会看到景观被划分为操作数据和分析数据。
企业数据景观的 30,000 英尺视图。来源:Z. Dehghani 于MartinFowler.com,作者进行了修订
阅读我的解释 101,了解企业数据战略。
2. 操作(和事务)数据
操作数据通常以个别记录的形式出现,这些记录代表特定事件,例如销售、购买或客户互动,并且是企业依赖于其日常运营的信息。
操作数据存储在数据库中,并由微服务访问,微服务是帮助管理数据的小软件程序。数据不断更新,代表了业务的当前状态。
事务数据是一种重要的操作数据类型。银行中的事务示例包括:
-
银行账户之间的资金流动;
-
商品和服务的付款;
-
客户与我们某个渠道的互动,例如:分支机构或在线。
从应用程序中‘热出’的事务数据称为源数据,或记录系统(SOR)。源数据没有经过转换,它是……
-
数据科学家所偏好的数据格式;
-
进入数据湖的数据格式;
-
任何数据溯源的开始。
更多这些想法稍后会讲到。
称为**在线事务处理(OLTP)**系统的事务数据处理系统,必须快速处理许多事务。它们依赖于可以快速存储和检索数据的数据库,并通过实施称为ACID 语义的规则确保数据的准确性:
-
原子性 — 每个事务被视为一个单独的单位。我们不想把两个电汇或购买混在一起!
-
一致性 — 事务要么全部成功,要么全部失败。我购买的烤猪肉要么成功,要么失败!
-
隔离性 — 多个事务可以同时发生而不会互相干扰。这是可扩展性的核心原则。
-
持久性 — 即使系统关闭,数据变更也会被保存。丢失操作数据会使你的业务陷入困境。
OLTP 系统用于重要的业务应用程序,这些应用程序需要准确、快速且规模化地工作。
在银行业,OLTP 系统处理存款、取款、转账和余额查询,包括在线银行应用程序、信用卡和借记卡授权系统、支票处理器和在银行间转账的电汇系统。
正如你所见,OLTP 系统通常是企业与其客户之间的基本接口。
3. 分析数据
分析数据是公司运营或事务数据的时间(基于时间)和汇总(合并)视图。这提供了组织事实的汇总视图,旨在:
-
获得对过去业务表现的洞察(描述性和诊断分析);
-
为未来做出数据驱动的决策(预测和处方分析)。
从描述性分析到预测建模。作者提供的图片。
分析数据经常用于创建仪表板和报告(通常由数据分析师构建)和训练机器学习模型(数据科学家)。
查看我的逐步指南,了解如何训练回归和分类模型,使用 Python —— 当代数据科学的基本技能。
企业正朝着越来越强大的商业智能(BI)工具和无代码机器学习平台迈进,以努力实现数据和分析能力的民主化。
这个观点是,许多公司今天只拥有少量或孤岛的高级分析技能。游戏的改变者在于赋能全组织的 10,000 名非技术同事,提供合适的技能和工具,提升整体生产力,这超越了对一个 20 人数据科学团队进行微调的边际收益。(对不起,我的数据科学朋友们!)
所以关注数据民主化 —— 这现在是一个重要话题。
总体而言,分析处理不同于事务处理,因为前者专注于分析数据,而后者则专注于记录特定事件。
分析处理系统通常利用只读系统,这些系统存储大量的历史数据或业务指标。分析可以在某一时间点的数据快照上进行。
现在,让我们连接运营数据和分析数据之间的点。
操作数据通过数据管道转换为分析数据,这些管道通常由数据工程师构建。
这些“管道”通常是ETL 管道——涉及提取操作系统中的数据,转换以满足业务需求,并加载到数据仓库或数据湖中,以便分析。
ETL 管道连接操作数据存储和分析数据存储。图片由作者提供
阅读我的解释者 101 关于数据民主化。
4. 数据仓库与数据湖
整个分析数据层——企业存储其分析数据的地方——已分化为两种主要架构和技术栈:
-
数据仓库;
-
数据湖。
不同的用户可能在企业架构的不同阶段执行数据工作。
-
数据分析师通常在数据仓库中查询表格和聚合数据,以生成有效的仪表板、报告和可视化,这些业务用户和决策者会使用。
-
数据科学家通常在数据湖中工作,以探索在影子生产环境中的数据。这意味着在开发(即非生产)环境中对数据处理和建模进行原型设计,使用由数据工程师精心准备的实时(即生产)数据。一旦业务确认模型的价值,ML 工程师将其投入生产,以便模型可以在 24/7 运营团队(MLOps)的监督下为内部和外部客户提供服务。
数据仓库与数据湖。来源:Z. Dehghani 于 MartinFowler.com 由作者修订
对于那些新接触企业 IT 的人来说,你需要掌握两种主要的环境:
-
非生产环境,你可以在其中构建和尝试各种东西。变化代价低,破坏不会影响你的业务。也称为开发者环境。项目由组织的**资本支出(CapEx)**资助。
-
生产环境是你将最终完成并签署的应用程序、数据、管道和系统部署给真实客户的地方。你的工作现在是在线的。确保它很好,因为改变是昂贵的。生产环境——如口语中所称——是高度安全的封闭环境,由一个运维或运行团队负责,该团队的资金来自于组织的运营支出(OpEx)。我在这里写过有关资本支出与运营支出的更多内容。
简而言之,在非生产环境中构建东西,然后将其部署到生产环境中。明白了!
好的,让我们现在深入了解这两种数据架构的一些细节。
4.1 数据仓库
数据仓库是一种成熟的方式来存储结构化数据,采用关系模式,并且优化了读取操作——主要是 SQL 查询,用于支持 BI、报告和可视化。
数据仓库的一些特点:
-
历史分析:数据仓库几十年来一直是描述性分析的主力,提供了快速查询和连接大量历史数据的能力。
-
写时模式:数据仓库传统上采用写时模式的方法,其中表的结构或模式在前期就已定义。
一个常见的星型模式。图片由作者提供
-
数据建模:虽然数据分析师和数据科学家可以直接在分析数据存储中处理数据,但通常会创建数据模型来预先汇总数据,以便更容易生成报告、仪表板和交互式可视化。一个常见的数据模型——称为星型模式——基于包含你想要分析的数值的事实表(例如,某些与销售相关的金额),这些表与代表你想要测量的实体(例如客户或产品)的维度表相关——因此被称为关系型数据库。
-
快速查询:数据仓库中的数据可能会被汇总并加载到一个在线分析处理(OLAP)模型中,也称为立方体。来自事实表的数值(度量)会在一个或多个维度上预先汇总——例如,通过维度客户、产品和时间汇总的总收入(来自事实销售表)。从视觉上看,这就像是一个三维立方体中的三个维度的交集。从收益方面来看,OLAP/立方体模型捕捉了支持“钻取/上钻”分析的关系,查询速度很快,因为数据是预先汇总的。
“立方体”。度量(例如,销售)按时间、客户和产品维度进行汇总。图片由作者提供
- 文件类型:结构化数据文件包括可读格式如CSV和XLSX(Excel),以及优化格式如Avro、ORC和Parquet。关系数据库也可以存储半结构化数据,如JSON文件。
阅读我的Explainer 101关于数据仓库和数据建模。
4.2 数据湖
数据湖是存储大量基于文件的数据以支持数据科学和大规模分析数据处理场景的行业事实标准方法。
-
分布式计算与存储:数据湖使用分布式计算和分布式存储来处理和存储大量可能的非结构化数据。这意味着数据被存储和处理在可能数千台机器上,称为大数据集群。这种技术在 2010 年代兴起,由Apache Hadoop推动,这是一组开源大数据软件,使组织能够将大量数据分布到多台机器上(HDFS分布式存储)并对存储在这些机器上的表进行类似 SQL 的查询(Hive和Spark分布式计算)。Cloudera和Hortonworks等公司后来将 Apache 软件商业化,推出了简化全球组织入门和维护的软件包。
-
按需模式:数据湖使用按需模式,即只有在读取数据时才创建模式。这意味着数据可以批量存储在数据湖中,而不需要立即定义模式,从而允许在后续的特定用例中创建模式——这正是数据科学家进行建模所需的灵活性。
-
文件类型:数据湖是非结构化数据的家园——这包括像txt和doc这样的文本文件,像MP3和WAV这样的音频文件,像JPEG和PNG这样的图像文件,像MP4这样的视频文件,甚至包括整个 PDF 文件、社交媒体帖子、电子邮件、网页和传感器数据。数据湖(以及 NoSQL 数据库)也允许你按原样存储半结构化数据,如JSON和XML文件。
-
云计算:数据湖越来越多地托管在像Amazon Web Services、Microsoft Azure和Google Cloud这样的公共云提供商上。这种弹性和可扩展的基础设施使组织能够自动快速地调整计算和存储资源的变化需求,同时保持性能,并仅为实际使用的部分付费。有三种常见的云计算类型,它们在云提供商和客户端之间有不同的共享责任划分。最灵活的**基础设施即服务(IaaS)**允许你本质上租用数据中心中的空白空间。云提供商维护物理基础设施和互联网访问。相比之下,软件即服务(SaaS)模型中,客户端租用一个通过互联网运行的完全开发的软件解决方案(比如Microsoft Office)。对于企业数据,最受欢迎的云计算模型是中间地带的平台即服务(PaaS),其中提供商选择操作系统,客户端可以在其上构建数据架构和企业应用程序。
云计算类型与共享责任模型。作者提供的图片
- 实时分析与流处理:像Apache Kafka这样的技术使数据能够近乎实时地处理,作为持续的数据流,使公司能够解锁即时的洞察和趋势,或者对事件发生时采取立即响应的行动。例如,将及时的产品和服务推荐无缝地传递到客户的手机上,准确地在他们最可能受益的时间和地点——就像我的银行在我到达机场时为我提供旅行保险一样。或者考虑在客户即将向骗子转账时,能够实时主动地警告他们,从而保护他们的财务安全。这种大数据、快速低延迟计算和机器学习的全能融合是全球各行业超个性化服务的关键推动力。
阅读我的Explainer 101文章,了解云计算和企业生成式 AI。还可以查看我关于Azure Synapse & Fabric的文章——微软试图将数据仓库和大数据整合到一个平台下。
Ps…喜欢这个故事吗?当我发布类似的文章时,获取一份电子邮件。
数据网格与数据产品
架构师 Zhamek Dehghani 概述 了企业数据领域在三个代际中的演变——挑战、进展和失败:
第一代:专有的企业数据仓库和商业智能 平台;这些解决方案价格昂贵,导致公司积累了同样大量的技术债务 [以数千个不可维护的 ETL 作业的形式],以及只有少数专业人员理解的表格和报告,从而导致对业务的积极影响未得到充分发挥。
第二代:大数据生态系统,以数据湖作为灵丹妙药;复杂的大数据生态系统和由中央团队操作的长期批处理作业,创造了数据湖怪兽,这些怪兽最多只是支持了局部的研发分析;承诺过多而实现不足。
第三代(当前代)数据平台:与前一代类似,具有现代化的流式处理特点,支持实时数据可用性,架构统一批处理和流处理以进行数据转换,以及全面采用云管理服务来处理存储、数据管道执行引擎和机器学习平台。
当前的数据湖架构可以总结为:
-
集中式。所有分析数据都存储在一个地方,由一个没有数据领域知识的中央数据工程团队管理,这使得难以发挥数据的全部潜力或修复源头的数据质量问题。与去中心化架构相对,后者将数据摄取分散到整个业务团队。
-
与领域无关。一种力求服务所有人而不特别迎合任何人的架构。一个全能的平台。与领域驱动架构相对,后者中数据由不同的业务领域拥有。
-
单体。数据平台构建为一个难以更改和升级的大块。与模块化架构相对,后者允许调整和修改单个部分或微服务。
一个中央数据团队管理着一个单体的与领域无关的数据湖(还是数据怪兽?)。来源:数据网格架构(经许可)
问题很明显,某些解决方案似乎也已经显现。
进入 数据网格。
数据网格是 下一代 数据架构,它从单一的集中式数据团队转向去中心化的设计,其中数据由整个组织中最了解它的团队拥有和管理,这被称为领域驱动的拥有权。
重要的是,每个业务单元或领域都致力于注入产品思维,以创建高质量和可重用的数据产品——一个被数据的生产者视为产品的自包含和可访问的数据集——然后可以发布和分享给网格中其他领域和业务单元的消费者——这些被称为网格中的节点。
数据网格:各个业务单元共享精心构建的数据,符合‘产品标准’。来源:数据网格架构(已获许可)
数据网格使团队能够在更大的自主权和灵活性下独立工作,同时确保数据的一致性、可靠性和良好的治理。
这是我工作中的一个例子。
目前,我们客户的交易、产品、收入和负债数据都存放在我们集中式的数据湖中。(也包括我们的数据仓库。)
未来,随着我们在整个银行内联合能力和所有权,信用风险领域的自有数据工程师可以独立创建和管理他们的数据管道,而不依赖于一个远离业务并缺乏信用专业知识的集中式数据接收团队。
这个信用团队将自豪地构建和优化高质量、战略性和可重用的数据产品,这些产品可以分享给网格中的不同节点(业务领域),为抵押贷款团队提供可靠的信用信息,以便更好地决策批准住房贷款。
同样,这些数据产品也可以被消费者信用领域利用,开发机器学习模型,更好地了解我们的信用卡客户的行为,从而提供更好的服务并识别风险客户。
这些是利用数据产品在网格中发挥战略价值的例子。
网格的四个原则:领域所有权、数据即产品、自助平台、联合治理。来源:数据网格架构(已获许可)
数据网格培育了一种数据拥有和协作的文化,在这种文化中,数据被视为一级公民,并且进一步产品化,在团队和部门之间无缝共享,而不是在孤立团队为特定临时任务打造的经常重复的 ETL 管道中滞留。
数据网格促使组织从成本高昂且效率低下的基于项目的思维方式转向可扩展和前瞻性的基于产品的思维方式。
阅读我的Explainer 101文章,了解数据产品和数据网格。
6. 数据治理
数据治理就像一场大规模的谁是老板游戏,但针对数据。就像这个节目一样,有很多复杂的关系需要处理。
这涉及到确定谁负责哪些数据,谁可以访问数据,谁需要保护数据,以及有什么控制和监控措施来确保事情不会出错。
在我的工作场所,有 40,000 名员工,众多流程和竞争的优先事项,这使得维持秩序和确保每个人步调一致似乎是一项真正的挑战。
对于数据分析师、数据科学家和开发人员来说,数据治理可能像那个总是想知道你在干什么的烦人朋友。但对于组织,特别是那些受监管良好的组织,它们是绝对必要的。否则,这就像没有马戏团总指挥的马戏团——混乱、难以管理,并且非常危险。
数据治理组件。作者提供的图片
数据治理的一些核心考虑因素是:
数据隐私。这就像试图将你尴尬的童年照片藏起来不让世界看到。但对于企业来说,这比糟糕的发型严重得多。假设一家银行意外泄露了所有客户的财务信息。这将花费他们大量的现金,更重要的是,失去信任。
数据安全。你需要确保客户的数据不受外部威胁(如黑客)和内部威胁(如不良员工)的影响。这意味着要有强大的认证系统、容错的防火墙、坚不可摧的加密技术和全天候的网络安全监控。没有人愿意他们的数据被拍卖到黑暗网络上,落入罪犯之手。
数据质量。想象制作三明治——使用腐烂的食材,你会得到一顿糟糕的餐点。如果你的数据质量很差,你会得到没人愿意品尝的不可靠洞察。如果你处于受监管的行业,你最好确保你的三明治用的是新鲜的食材,否则你的数据可能无法满足合规要求。
维护有关数据在企业中流动的可靠信息——即数据血缘——对于确保数据质量和在出现问题时进行故障排除至关重要。
数据隐私、数据安全和/或数据质量薄弱意味着更多的数据风险。
这就是数据所有权的作用。谁来决定数据的使用和管理?谁承担了风险,以防出现问题?
在实践中,这有点像热土豆游戏,没人真正想长时间握住那个土豆。但总得有人负责,这样我们才能避免数据问题,并保持我们的土豆热乎、新鲜和安全。
向 mesh 的转变旨在:
-
提升全方位的数据质量(通过可重用的数据产品);
-
优化数据所有权(让适当的领域拥有他们的数据)。
-
简化数据血缘(告别分散的 ETL,转向集中化的数据湖)。
请参阅我的解释员 101文章,了解数据治理。
7. 最后的话
企业级数据领域常常令人困惑,技术债务的积累源于实验周期后的过度修正,类似于股市的波动。
尽管大型公司的故事各不相同,但它们有一些共同点。其中之一是有机扩展至一个庞大而令人畏惧的企业数据仓库,随后是热切接受一个集中式数据湖,旨在节省成本、集中专业知识并放大数据价值。
这种方法带来了全新的问题。因此我们再次回到了起点——这一次大幅度地向去中心化数据堆栈转变,将数据管理下放到最了解自己数据的团队。
呼!就像一群企鹅在不断变化的冰面上缓慢移动。
以个人背景为例,我所在的银行经历了本文中描述的所有数据架构时代。
我们花了几十年时间在数据仓库上。然后,我们开始了现在已经持续了 7 年的旅程,旨在建立一个战略数据湖,成为我们数据基础设施的基石。
长话短说,我们的数据仓库和数据湖现在依然存在,且以一种有些尴尬的方式共存。(这仍在持续改进中……)
我们已经开始了自己的旅程,将数据湖去中心化向网状架构。我们正在通过利用可重用数据产品的力量,破解我们数据领域的意大利面般复杂性。
目前,大公司专注于解决在其数据领域积累的几十年的技术债务。图片由作者提供
我很自豪地说,在澳大利亚的四大银行中,我们显然领先。这非常令人高兴,因为大型蓝筹公司通常不在技术创新的前沿。
像许多公司一样,我们面临着巨大的挑战,因为这些技术债务是数百个项目的副产品,由多年来进进出出的数千位同事推动。
我的在线数据科学课程——由公司慷慨赞助——教会了我如何处理数据和训练逻辑回归模型及梯度提升树,但对在大型组织中处理数据的现实准备不足。
在我第一天上班时,我以为会被直接提供一些美味的数据,然后立即开始模型训练。
希望我已经走得很远了,远离达宁-克鲁格曲线?来源:维基百科
就像福雷斯特·甘普发现的那样,生活并不像想象中那么简单。
通过尝试和失败——我亲身体验到,作为数据科学家,有许多技能决定了你的影响力,远超课程所能提供的——从业务参与到数据讲述,再到政治博弈和不断演变的企业数据环境中的所有复杂细节。
通过撰写这篇文章,我希望能让你避免一些我自己曾经遇到的绊脚石。
告诉我你是否在自己的旅程中也有类似的经历!
在 Twitter 和 YouTube 上找到我,在这里、在这里 和 在这里。
我的热门 AI、ML 和数据科学文章
-
AI 和机器学习:快速入门——在这里
-
机器学习与机制建模——在这里
-
数据科学:现代数据科学家所需的新技能——在这里
-
生成性 AI:大公司如何争相采用——在这里
-
ChatGPT & GPT-4: OpenAI 如何赢得 NLU 战争——在这里
-
生成性 AI 艺术:DALL-E、Midjourney 和 Stable Diffusion 解析——在这里
-
超越 ChatGPT:寻找真正智能的机器——在这里
-
现代企业数据战略解析——在这里
-
从数据仓库与数据湖到数据网格——在这里
-
从数据湖到数据网格:最新架构指南——在这里
-
Azure Synapse Analytics 实战:7 个用例解析——在这里
-
云计算 101:为您的业务利用云——在这里
-
数据仓库与数据建模 — 快速入门课程 — 这里
-
数据产品:为分析建立坚实的基础 — 这里
-
数据民主化:5 个‘数据为所有人’策略 — 这里
-
数据治理:分析师的 5 大常见痛点 — 这里
-
数据讲故事的力量 — 销售故事,而非数据 — 这里
-
数据分析简介:谷歌方法 — 这里
-
Power BI — 从数据建模到惊艳报告 — 这里
-
回归分析:使用 Python 预测房价 — 这里
-
分类:使用 Python 预测员工流失 — 这里
-
Python Jupyter 笔记本与 Dataiku DSS — 这里
-
流行的机器学习性能指标解释 — 这里
-
在 AWS 上构建 GenAI — 我的第一次体验 — 这里
-
数学建模与 COVID-19 的机器学习 — 这里
-
工作的未来:在人工智能时代你的职业安全吗 — 这里
从决策树到变换器:比较马其顿餐厅评论的情感分析模型
分析马其顿餐厅评论的机器学习技术
·
关注 发表在 Towards Data Science ·10 分钟阅读·2023 年 3 月 3 日
–
作者提供的图形
- 尽管自然语言处理的机器学习模型传统上集中于英语和西班牙语等流行语言,但较少使用的语言的发展则相对较少。然而,由于 COVID-19 大流行导致电子商务的兴起,即使是像马其顿语这样较少使用的语言也通过在线评论产生了大量数据。这为开发和训练马其顿语餐馆评论的情感分析机器学习模型提供了机会,这可以帮助企业更好地理解客户情感并改善服务。在这项研究中,我们解决了这一问题中出现的挑战,并探讨和比较了用于分析马其顿餐馆评论情感的各种情感分析模型,从经典的随机森林到现代的深度学习技术和变压器。
内容
-
挑战与数据预处理
-
创建向量嵌入
-
LASER 嵌入
-
多语言通用文本编码器
-
OpenAI Ada v2
-
-
机器学习模型
-
随机森林
-
XGBoost
-
支持向量机
-
深度学习
-
变压器
-
-
结果与讨论
-
未来工作
-
结论
数据预处理
-
语言是独特的人类交流工具,计算机在没有适当处理技术的情况下无法解释它。为了让机器分析和理解语言,我们需要以计算机可处理的方式表示复杂的语义和词汇信息。实现这一目标的一种流行方法是使用向量表示。近年来,除了特定语言的表示模型外,多语言模型也出现了。这些模型可以捕捉大量语言的文本语义上下文。
-
然而,对于使用西里尔字母的语言,额外的挑战是由于互联网用户经常使用拉丁字母表达自己,导致数据中混合了拉丁和西里尔文本。为了解决这一挑战,我使用了来自本地餐馆的大约 500 条评论的数据集,其中包含拉丁和西里尔字母。该数据集还包括一小部分英文评论,有助于评估在混合数据上的表现。此外,在线文本可能包含如表情符号等需要去除的符号。因此,数据预处理是进行任何文本嵌入之前的关键步骤。
import pandas as pd
import numpy as np
# load the dataset into a dataframe
df = pd.read_csv('/content/data.tsv', sep='\t')
# see the distribution of the sentiment classes
df['sentiment'].value_counts()
# -------
# 0 337
# 1 322
# Name: sentiment, dtype: int64
- 数据集包含正类和负类,分布几乎相等。为了去除表情符号,我使用了 Python 库
emoji
,它可以轻松去除表情符号和其他符号。
!pip install emoji
import emoji
clt = []
for comm in df['comment'].to_numpy():
clt.append(emoji.replace_emoji(comm, replace=""))
df['comment'] = clt
df.head()
- 对于西里尔和拉丁文本的问题,我将所有文本转换成其中一种,以便在两者上测试机器学习模型,以比较其性能。我使用了“cyrtranslit”库来完成这一任务。它支持大多数西里尔字母,如马其顿语、保加利亚语、乌克兰语等。
import cyrtranslit
latin = []
cyrillic = []
for comm in df['comment'].to_numpy():
latin.append(cyrtranslit.to_latin(comm, "mk"))
cyrillic.append(cyrtranslit.to_cyrillic(comm, "mk"))
df['comment_cyrillic'] = cyrillic
df['comment_latin'] = latin
df.head()
图 1. 转换后的输出
对于我使用的嵌入模型,通常不需要移除标点符号、停用词及其他文本清理。这些模型设计用来处理自然语言文本,包括标点符号,并且当文本保持完整时,通常能够更准确地捕捉句子的含义。这样文本的预处理就完成了。
向量嵌入
目前,没有大规模的马其顿语表示模型可用。然而,我们可以使用在马其顿语文本上训练的多语言模型。虽然有几个这样的模型可用,但对于这项任务,我发现 LASER 和 Multilingual Universal Sentence Encoder 是最合适的选择。
LASER
LASER(语言无关句子表示)是一种生成高质量多语言句子嵌入的语言无关方法。LASER 模型基于一个两阶段过程,其中第一阶段是预处理文本,包括分词、小写转换和应用 sentencepiece。这部分是特定语言的。第二阶段涉及将预处理后的输入文本映射到固定长度的嵌入,使用的是多层双向 LSTM。
LASER 已被证明在一系列基准数据集上优于其他流行的句子嵌入方法,如 fastText 和 InferSent。此外,LASER 模型是开源的且免费提供,方便所有人使用。
使用 LASER 创建嵌入是一个简单的过程:
!pip install laserembeddings
!python -m laserembeddings download-models
from laserembeddings import Laser
# create the embeddings
laser = Laser()
embeddings_c = laser.embed_sentences(df['comment_cyrillic'].to_numpy(),lang='mk')
embeddings_l = laser.embed_sentences(df['comment_latin'].to_numpy(),lang='mk')
# save the embeddings
np.save('/content/laser_multi_c.npy', embeddings_c)
np.save('/content/laser_multi_l.npy', embeddings_l)
多语言通用句子编码器
多语言通用句子编码器(MUSE)是一个预训练模型,用于生成句子嵌入,由 Facebook 开发。MUSE 旨在将多种语言的句子编码到一个共同的空间中。
该模型基于一个深度神经网络,使用编码器-解码器架构来学习句子与其对应的高维空间嵌入向量之间的映射。MUSE 在一个大规模的多语言语料库上进行训练,该语料库包括维基百科、新闻文章和网页文本。
!pip install tensorflow_text
import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
import tensorflow_text
# load the MUSE module
module_url = "https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3"
embed = hub.load(module_url)
sentences = df['comment_cyrillic'].to_numpy()
muse_c = embed(sentences)
muse_c = np.array(muse_c)
sentences = df['comment_latin'].to_numpy()
muse_l = embed(sentences)
muse_l = np.array(muse_l)
np.save('/content/muse_c.npy', muse_c)
np.save('/content/muse_l.npy', muse_l)
OpenAI Ada v2
在 2022 年底,OpenAI 宣布了他们全新的最先进嵌入模型 text-embedding-ada-002。由于该模型建立在 GPT-3 之上,它具有多语言处理能力。为了比较斯拉夫字母和拉丁字母评论之间的结果,我在这两个数据集上运行了该模型。
!pip install openai
import openai
openai.api_key = 'YOUR_KEY_HERE'
embeds_c = openai.Embedding.create(input = df['comment_cyrillic'].to_numpy().tolist(), model='text-embedding-ada-002')['data']
embeds_l = openai.Embedding.create(input = df['comment_latin'].to_numpy().tolist(), model='text-embedding-ada-002')['data']
full_arr_c = []
for e in embeds_c:
full_arr_c.append(e['embedding'])
full_arr_c = np.array(full_arr_c)
full_arr_l = []
for e in embeds_l:
full_arr_l.append(e['embedding'])
full_arr_l = np.array(full_arr_l)
np.save('/content/openai_ada_c.npy', full_arr_c)
np.save('/content/openai_ada_l.npy', full_arr_l)
机器学习模型
本节探讨了用于预测马其顿餐馆评论情感的各种机器学习模型。从传统机器学习模型到深度学习技术,我们将深入研究每种模型的优缺点,并比较它们在数据集上的表现。
在运行任何模型之前,应将数据按每种嵌入类型分为训练集和测试集。这可以通过sklearn
库轻松完成。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(embeddings_c, df['sentiment'], test_size=0.2, random_state=42)
随机森林
图 2. 随机森林分类的简化表示。构建了 100 棵决策树,结果通过对每棵决策树的结果进行多数投票来计算。(作者绘制)
随机森林是一种广泛使用的机器学习算法,它使用决策树的集成来分类数据点。该算法通过在完整数据集的子集和特征的随机子集上训练每棵决策树来工作。在推断过程中,每棵决策树生成情感的预测,最终输出通过对所有树的多数投票来获得。这种方法有助于防止过拟合,并能导致更稳健和准确的预测。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
rfc = RandomForestClassifier(n_estimators=100)
rfc.fit(X_train, y_train)
print(classification_report(y_test,rfc.predict(X_test)))
print(confusion_matrix(y_test,rfc.predict(X_test)))
XGBoost
图 3. 提升基算法的顺序过程。每棵后续决策树在前一棵树的残差(错误)上进行训练。(作者绘制)
XGBoost(极端梯度提升)是一种强大的集成方法,主要用于表格数据。与随机森林一样,XGBoost 也使用决策树来分类数据点,但采用不同的方法。XGBoost 不是一次训练所有树,而是以顺序方式训练每棵树,从前一棵树的错误中学习。这一过程称为提升,即将弱模型组合成一个更强的模型。尽管 XGBoost 主要在表格数据上产生出色的结果,但用向量嵌入测试它也很有趣。
from xgboost import XGBClassifier
from sklearn.metrics import classification_report, confusion_matrix
rfc = XGBClassifier(max_depth=15)
rfc.fit(X_train, y_train)
print(classification_report(y_test,rfc.predict(X_test)))
print(confusion_matrix(y_test,rfc.predict(X_test)))
支持向量机
图 4. 支持向量分类的简化表示。在具有 1024 个输入特征的情感分析中,超平面将是 1023 维的。(作者绘制)
支持向量机(SVM)是一种流行且强大的机器学习算法,用于分类和回归任务。它通过寻找将数据分成不同类别的最佳超平面,同时最大化类别之间的间隔来工作。SVM 特别适用于高维数据,并可以使用核函数处理非线性边界。
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
rfc = SVC()
rfc.fit(X_train, y_train)
print(classification_report(y_test,rfc.predict(X_test)))
print(confusion_matrix(y_test,rfc.predict(X_test)))
深度学习
图 5. 该问题中使用的神经网络的简化表示。(作者绘制)
深度学习是一种先进的机器学习方法,利用由多层神经元组成的人工神经网络。深度学习网络在文本和图像数据上表现出色。使用库 Keras 实现这些网络是一个简单的过程。
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
model = keras.Sequential()
model.add(keras.layers.Dense(256, activation='relu', input_shape=(1024,)))
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=11, validation_data=(X_test, y_test))
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test accuracy:', test_acc)
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred.round()))
print(confusion_matrix(y_test,y_pred.round()))
在这里,使用了具有两个隐藏层和一个整流线性单元(ReLU)激活函数的神经网络。输出层包含一个带有 sigmoid 激活函数的单一神经元,使得网络能够对正面或负面情感进行二分类预测。二元交叉熵损失函数与 sigmoid 激活函数配对,用于训练模型。此外,还使用了 Dropout 来帮助防止过拟合,并提高模型的泛化能力。我测试了各种不同的超参数,发现这种配置最适合这个问题。
使用以下函数我们可以可视化模型的训练过程。
import matplotlib.pyplot as plt
def plot_accuracy(history):
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
图 6. 示例训练输出
变换器
图 7. BERT 大型语言模型的预训练和微调过程。(来源:原始 BERT 论文)
微调变换器是自然语言处理中的一种流行技术,涉及调整预训练的变换器模型以适应特定任务。变换器,如 BERT、GPT-2 和 RoBERTa,经过大量文本数据的预训练,能够学习语言中的复杂模式和关系。然而,为了在特定任务上表现良好,如情感分析或文本分类,这些模型需要在任务特定的数据上进行微调。
对于这些类型的模型,我们之前创建的向量表示是不需要的,因为它们直接处理从文本中提取的标记。对于马其顿的情感分析任务,我使用了 bert-base-multilingual-uncased
,这是 BERT 模型的多语言版本。
HuggingFace 使得微调变换器变得非常简单。首先需要将数据加载到变换器数据集中。然后对文本进行标记化,最后训练模型。
from sklearn.model_selection import train_test_split
from datasets import load_dataset
from transformers import TrainingArguments, Trainer
from sklearn.metrics import classification_report, confusion_matrix
# create csv of train and test sets to be loaded by the dataset
df.rename(columns={"sentiment": "label"}, inplace=True)
train, test = train_test_split(df, test_size=0.2)
pd.DataFrame(train).to_csv('train.csv',index=False)
pd.DataFrame(test).to_csv('test.csv',index=False)
# load the dataset
dataset = load_dataset("csv", data_files={"train": "train.csv", "test": "test.csv"})
# tokenize the text
tokenizer = AutoTokenizer.from_pretrained('bert-base-multilingual-uncased')
encoded_dataset = dataset.map(lambda t: tokenizer(t['comment_cyrillic'], truncation=True), batched=True,load_from_cache_file=False)
# load the pretrained model
model = AutoModelForSequenceClassification.from_pretrained('bert-base-multilingual-uncased',num_labels =2)
# fine-tune the model
arg = TrainingArguments(
"mbert-sentiment-mk",
learning_rate=5e-5,
num_train_epochs=5,
per_device_eval_batch_size=8,
per_device_train_batch_size=8,
seed=42,
push_to_hub=True
)
trainer = Trainer(
model=model,
args=arg,
tokenizer=tokenizer,
train_dataset=encoded_dataset['train'],
eval_dataset=encoded_dataset['test']
)
trainer.train()
# get predictions
predictions = trainer.predict(encoded_dataset["test"])
preds = np.argmax(predictions.predictions, axis=-1)
# evaluate
print(classification_report(predictions.label_ids,preds))
print(confusion_matrix(predictions.label_ids,preds))
我们已经成功地对 BERT 进行了情感分析的微调。
结果与讨论
图 8. 所有模型的结果
对马其顿餐馆评论的情感分析结果令人鼓舞,多个模型达到了高精度和 F1 分数。实验表明,深度学习模型和变换器在表现上优于传统的机器学习模型,如随机森林和支持向量机,尽管差距不大。使用新的 OpenAI 嵌入的变换器和深度神经网络成功突破了 0.9 的准确率障碍。
OpenAI 嵌入模型 textembedding-ada-002
大幅提升了即使是经典机器学习模型的结果,尤其是在支持向量机上。在这项研究中,使用该嵌入在深度学习模型上对西里尔文本取得了最佳结果。
总的来说,拉丁文本的表现比西里尔文本差。虽然我最初假设这些模型的表现会更好,考虑到拉丁语中类似词汇的普遍性以及嵌入模型是基于这种数据训练的,但研究结果并未支持这一假设。
未来工作
在未来的工作中,收集更多数据以进一步训练和测试模型将非常有价值,特别是涵盖更多样化的评论主题和来源。此外,尝试将更多特征(如元数据(例如,评论者的年龄、性别、位置)或时间信息(例如,评论时间))纳入模型中,可能会提高其准确性。最后,将分析扩展到其他不那么常见的语言,并比较这些模型与马其顿评论训练的模型的表现,将是很有趣的。
结论
总结来说,本文展示了多种机器学习模型和嵌入技术在马其顿餐馆评论情感分析中的有效性。探讨并比较了几种经典的机器学习模型,如随机森林和支持向量机,以及现代深度学习技术,包括神经网络和变压器。结果表明,经过微调的变压器模型和使用最新 OpenAI 嵌入的深度学习模型表现优于其他方法,验证准确率高达 90%。
感谢阅读!
从 DICOM 头到 CSV 文件
DICOM 元数据 → CSV 数据集
·
关注 发表在 Towards Data Science ·7 min read·2023 年 1 月 17 日
–
将 DICOM 元数据转换为 CSV 文件。[作者提供的图像]
DICOM,即数字成像和通信医学,是医学图像的原生格式。DICOM 文件不仅包含像素数据,还将其存储为 DICOM 头。此类数据包括患者的年龄和体重、模态、图像维度等。在这篇文章中,我们将使用 PyDicom 包来构建一个 Python 函数,提取特定元数据以用于进一步的数据分析工作。
背景
如上所述,DICOM 文件包含元数据。这些数据对任何 DICOM 用户都很有用,从患者到医生以及成像系统的各种模态。此外,这些数据是数据科学家/分析师可以用来进行有益洞察的宝贵资源。
这项元数据的一个好处是它以标准化的方法表示,其中每个 DICOM 属性都有一个唯一的标签和关键字,以便用户以特定的值表示来获取信息。
让我们开始编写代码,并查看 DICOM 头部的示例…
让我们开始编写代码
我们将从一个简单的示例开始,读取 DICOM 文件以查看元数据表示。然后,我们会构建一个函数来提取数据。
互联网上有很多 DICOM 样本。你也可以使用自己的 DICOM 文件。对于这篇文章,我选择了一个包含 99 个胸部 CT 扫描切片的数据集。你可以在 Kaggle 上找到它(数据集,由 Kosarevsky Dmitry 提供。许可证:“数据库:开放数据库,内容:数据库内容”,DbCL v1.0)。我将数据集保存到我的 Drive 中,以便我可以通过 GoogleColab 方便地访问。
使用 PyDicom 读取 DICOM
在这个示例中,我们读取了第一个切片,并仅展示 DICOM 属性的一部分,因为完整的输出非常长。你可以参考这个 GitHub Gist 查看完整的输出。
# Install and import the package
!pip install pydicom
import pydicom
# Reading a DICOM file from a specific path
dcm_data = pydicom.dcmread('/content/drive/MyDrive/Datasets/Kaggle/DICOM/dicom_lung/000000.dcm')
dcm_data
Dataset.file_meta -------------------------------
(0002, 0000) File Meta Information Group Length UL: 196
(0002, 0001) File Meta Information Version OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID UI: CT Image Storage
(0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.14519.5.2.1.7085.2626.214140401149739061368142942055
(0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian
(0002, 0012) Implementation Class UID UI: 1.2.40.0.13.1.1.1
(0002, 0013) Implementation Version Name SH: 'dcm4che-1.4.35'
-------------------------------------------------
(0008, 0005) Specific Character Set CS: 'ISO_IR 100'
(0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL', 'CT_SOM5 SPI']
(0008, 0016) SOP Class UID UI: CT Image Storage
(0008, 0018) SOP Instance UID UI: 1.3.6.1.4.1.14519.5.2.1.7085.2626.214140401149739061368142942055
(0008, 0020) Study Date DA: '20100227'
(0008, 0021) Series Date DA: '20100227'
(0008, 0022) Acquisition Date DA: '20100227'
(0008, 0023) Content Date DA: '20100227'
(0008, 0030) Study Time TM: '161937.171'
(0008, 0031) Series Time TM: '162536.14'
(0008, 0032) Acquisition Time TM: '162203.028699'
...
PyDicom 封装了一个 DataSet 类,对于每个 DICOM 属性,它以标签作为 DataSet 的键,以数据元素作为值。下面的图片描述了 DataSet 和 DataElement 类的内容。
PyDicom DataSet 类的内容。[图片由作者提供]
PyDicom 包提供了许多方法和属性,可以与 DataSet 和 DataElement 类一起使用。我们不会深入讨论这些细节。如果你想了解更多,请参考之前的文章。
PyDicom… 超越像素数据!
[towardsdatascience.com
提取元数据
我们将依赖的主要思想是我们可以遍历特定文件夹中的 DICOM 文件。然后,我们将遍历每个文件中的所有属性,只提取事先指定的属性。我们将使用 DICOM 属性的关键字,因为这是最好的选择,因为:
-
每个 DICOM 属性都有其独特的关键字。
-
关键字比标签更好,因为它们是人类可读的。
有数十个属性可以表征 DICOM 文件。所以,你不能只读取所有属性。您需要只关注在工作中可能遇到的属性。为此,我强烈推荐这款优秀的DICOM 标准浏览器,该浏览器由Innolitics构建,您只需搜索您想了解的属性。确保您输入的关键词正确无误。
现在我们知道我们要做什么了,让我们提取一些 DICOM 元数据 😃
我们将需要 glob 包来操作 DICOM 文件的路径。此外,还需要 Pandas 包来从 pandas 数据框架中写入 CSV 文件。glob 模块会根据 Unix shell 使用的规则找到所有匹配指定模式的路径名,尽管结果以任意顺序返回。
唯一剩下的就是设置我们的 Python 环境,导入包并构建我们的函数。将添加函数文档,解释参数和函数输出。
dicom2csv() 函数。参考GitHub gist。
让我们试试上面的函数。首先,我们决定我们感兴趣的 DICOM 属性是什么。例如,我想从一系列胸部 CT 扫描中计算 DLP 指数。DLP 指数,剂量长度乘积是一种常用的指数,因为它能够显示出整体的剂量输出。它通常在现代设备的控制台上使用并表示,因为它能提前给出对有效剂量(ED)的粗略估计。
DLP 可以从 CTDIvol 计算出来,这是另一个 CT 指数,描述了所选 CT 运行条件下单张图像的平均剂量,单位为毫格(mGy)。剂量长度乘积(DLP)用于计算一系列扫描或完整检查的剂量,并由以下方程定义:
其中 i 用于每张图像对应的第 i 个 CTDIvol。对于 Li,我们将使用每两个连续图像之间的重建间隔,因为这实际上决定了对给定扫描长度对应的图像数。Slice Location 将帮助我们计算以毫米为单位的重建间隔。
因此,我们需要计算 DLP 的元数据是以毫格(mGy)表示的CTDIvol和每个轴向切片的以毫米表示的SliceLocation。让我们使用上面构建的函数来提取它们。
# Extract the SliceLocation and CTDIvol from DICOM files of Chest-CT
df = dicom2csv(extract = ['SliceLocation', 'CTDIvol'],
folder_path = '/content/drive/MyDrive/Datasets/Kaggle/DICOM/dicom_lung',
csv_file_name = 'data.csv',
return_dataframe = True)
注意,读取 DICOM 文件是任意的。所以,我们需要根据切片位置来对数据进行排序。
# Sort the data frame to get the slices in order
df.sort_values(by='SliceLocation', inplace=True, ignore_index=True)
df
SliceLocation CTDIvol
0 -288.0 8.550
1 -285.0 8.450
2 -282.0 8.250
3 -279.0 8.025
4 -276.0 7.850
.. ... ...
94 -6.0 12.450
95 -3.0 12.325
96 0.0 12.125
97 3.0 11.925
98 6.0 11.575
[99 rows x 2 columns]
从“SliceLocation”列的视角来看,重建间隔为 3.0 毫米,与切片厚度相同。您可以尝试以下行代码,以确保所有切片的重建间隔相同。
# Calculate the reconstruction interval from SliceLocation
[df['SliceLocation'][i+1] - df['SliceLocation'][i] for i in range(0,len(df)-1)]
回到 DLP 方程,Li 对所有切片都是相同的,为 0.3 cm。我们最终的步骤是将每个 CTDIvol 乘以 0.3,并将变量相加。
import numpy as np
# Calculating DPL = sum(CTDIvol * 0.3)
print('DLP = ',np.sum(df['CTDIvol'].values * 0.3), 'mGy*cm')
DLP = 239.90999999999994 mGy*cm
重要的是要记住,CTDIvol 或其衍生物 DLP,如在控制台上看到和在 DICOM 图像中输出的,不代表患者实际吸收的或有效的剂量。它们应被视为系统辐射输出的指数,用于比较目的。基于 DLP 计算的有效剂量仅为粗略估算。
DLP 计算只是从 DICOM 头部提取数据的一个单一示例,其用途非常广泛。我们构建的 Python 函数使处理指定的元数据变得容易。
结论
-
我们已经看到了如何使用 PyDicom 包读取 DICOM 文件,以及在分析工作中使用 DICOM 元数据的强大功能。
-
我们构建了一个函数,可以将 DICOM 头部的特定数据转换为 CSV 文件,以便进行进一步分析。
-
我们使用该函数计算了剂量长度乘积,这是 CT 模态剂量估算中常用的参数。
感谢阅读…
推荐
-
DICOM 元数据 — 大数据分析的有用资源:
这篇文章概述了通过结合患者访问和 DICOM 信息来表示数据的新方法,包括医学影像元数据的高级应用、辐射剂量分析、图像分割以及用于特征工程的深度学习,以丰富数据。
-
有关 DICOM 的更多细节,请参阅前一篇博客,什么是 DICOM?
-
从计算机断层扫描剂量指数计算 DLP,CTDIvol。
## CT 中有效剂量的简单计算器 (DLP -> Eff Dose):放射科技师指南
这里有一个简单的计算器,可以从 CT 检查的剂量长度乘积 (mGy cm) 计算有效剂量 (mSv)。
参考文献
[1] 99 个 CT 切片的数据集,dlwpt-volumetric-dicom-lung,Kaggle,Kosarevsky Dmitry,许可证:“数据库:开放数据库,内容:数据库内容”,DbCL v1.0。
[2] PyDicom 文档,用户指南,[访问时间:2022 年 12 月 25 日]
[3] PyDicom 文档,元素 VR 和 Python 类型,[访问时间:2022 年 12 月 25 日]
[4] PyDicom 文档,API 参考,[访问时间:2022 年 12 月 25 日]
[5] Innolitics,DICOM 标准浏览器,(2022),CTDIvol 属性,[访问日期 2023 年 10 月 1 日]
[6] I. A. Tsalafoutas 和 S. I. Metallidis,“一种从 CT DICOM 图像计算剂量长度乘积的方法,” BJR,第 84 卷,第 999 期,页码 236–243,2011 年 3 月,doi: 10.1259/bjr/37630380。
从乏味到惊艳:Matplotx 如何改善你的 Matplotlib 图表
简化使用 Matplotx 创建惊艳图表的过程
·发布于 Towards Data Science ·6 分钟阅读·2023 年 4 月 3 日
–
使用 matplotx 主题应用的 matplotlib 散点图示例。图片由作者提供。
Matplotib 是 Python 世界中最流行的数据可视化库之一。然而,多年来,它因创建乏味的图形和使用不便而声名狼藉。
正如我最新的文章所见,将基本的 matplotlib 图表转换成视觉上吸引人的图表确实需要几行代码。别误解我;我喜欢使用 matplotlib,因为它高度可定制,但有时我只想要一个时尚的图表,而不想过多麻烦。
这就是matplox 库的作用。通过两行代码——一个 import
语句和一个 with
语句——我们可以即时将基本的 matplotlib 图形转变为更具视觉吸引力的图形。
matplotx 库提供了一种简单的方法来即时美化你的 matplotlib 图形。这个库已经存在了一段时间。它的下载次数接近 60,000 次,并且平均每月 3,000 次下载(撰写本文时的数据)。
在这篇文章中,我们将看到如何使用这个库来为我们的 matplotlib 图形增添一些趣味。
安装 Matplotx
可以通过打开终端/命令提示符并运行以下命令,将 Matplotx 安装到你的 Python 环境中。
pip install matplotx
导入库和设置数据
在本文中,我们将通过导入两个常见的 Python 库开始:pandas 和 matplotlib。然后我们将导入 matplotx。
import pandas as pd
import matplotlib.pyplot as plt
import matplotx
一旦库被导入,我们可以从 CSV 文件中读取数据集。
在这个例子中,我使用了来自 Volve 数据集的一口井。有关此数据集的详细信息可以在文章底部找到。该数据集包含来自位于挪威大陆架上的 Volve Field 的一口井的系列井日志和岩石物理测量数据。
除了指定文件位置外,我们还需要将缺失数据值-999 转换为 NaN 值。这是通过使用na_values
参数完成的。
df = pd.read_csv('/well_log_data_volve.csv', na_values=-999)
df.head()
数据加载后,我们可以使用df.head()
查看 Dataframe 的头部。
显示 Volve Field 井日志测量的 Dataframe 头部。图片由作者提供。
使用 Matplotx 增强 Matplotlib 散点图
现在数据已经加载,我们将创建的第一个图表是散点图。这可以使用以下代码轻松创建。
plt.scatter(df['NPHI'], df['RHOB'], c=df['GR'])
plt.ylim(3,2)
plt.xlim(-0.15, 0.8)
plt.clim(0, 150)
plt.colorbar(label='GR')
plt.xlabel('NPHI (dec)')
plt.ylabel('RHOB (g/cc)')
plt.show()
当我们运行上述代码时,我们得到以下图表。
显示密度与中子孔隙度的基本 matplotlib 散点图。图片由作者提供。
尽管我们有一个可用的散点图,但它并没有从其他 matplotlib 散点图中脱颖而出。
使用 Matplotx 创建 Dracula 样式的 Matplotlib 散点图
要应用 matplotx 的样式,我们需要在 matplotlib 散点图代码之前添加一行代码。
使用 with 语句,我们调用plt.style.context
并传入matplotx.styles
,从这里我们可以选择许多可用的主题之一。
在这个例子中,我选择了 Dracula 主题——一个非常流行的主题,似乎出现在几乎每个应用中。
with plt.style.context(matplotx.styles.dracula):
plt.scatter(df['NPHI'], df['RHOB'], c=df['GR'])
plt.ylim(3,2)
plt.xlim(-0.15, 0.8)
plt.clim(0, 150)
plt.colorbar(label='GR')
plt.xlabel('NPHI (dec)')
plt.ylabel('RHOB (g/cc)')
plt.show()
在不更改之前的 matplotlib 代码的其他部分的情况下,我们可以运行它并得到以下图表。
应用流行的 Dracula 主题与 matplotx 之后的 Matplotlib 散点图。图片由作者提供。
使用 Matplotx 和 duftify 函数去除图表垃圾
在为读者创建图表时,通常需要去除图表垃圾,如网格线、边框等。这使读者能够专注于数据,而不是被其他元素分散注意力。
为了查看去除图表垃圾的影响,以下动画是由Darkhorse Analytics创建的。
通过提高数据-墨水比来使图表更有效的示例。www.darkhorseanalytics.com/blog/data-looks-better-naked
为了帮助我们去除像上面动画那样的图表垃圾,Matplotx 提供了一个很好的函数来帮助实现这一点。
要使用它,我们需要调用matplotx.styles.duftify
,然后传入我们想要使用的 matplotx 样式。
with plt.style.context(matplotx.styles.duftify(matplotx.styles.dracula)):
plt.scatter(df['NPHI'], df['RHOB'], c=df['GR'])
plt.ylim(3,2)
plt.xlim(-0.15, 0.8)
plt.clim(0, 150)
plt.colorbar(label='GR')
plt.xlabel('NPHI (dec)')
plt.ylabel('RHOB (g/cc)')
plt.show()
运行上述代码后,我们得到以下图表。
应用 matplotx 的 duftify 函数后的 Matplotlib 散点图。图片由作者提供。
我们可以看到图表和色条的边框已被移除。坐标轴的标签也已被淡化,这样你的眼睛立刻会专注于数据而不是额外的内容。
使用 Matplotx 的其他样式
matplotx 提供了许多其他样式,可以在项目的 GitHub 仓库上查看。
这里仅是一些可用样式的样本:
下面是一些来自 matplotx 的样式。图片来源于 matplotx GitHub 仓库。
使用这些样式时需要记住的一点是,如果图形上名称后面有额外的方括号中的文本,那么你需要确保在调用matplotx.styles
时添加这些文本。
例如,如果我们想使用东京之夜主题,我们将有三种样式可供选择:白天、夜晚和风暴。
东京之夜主题的三种样式。请注意方括号中的名称,可以用来访问该主题。图片来源于 matplotx GitHub 仓库。
从上面的描述来看,如果我们选择东京之夜(白天),那么我们需要在调用末尾添加方括号:matplotx.styles.tokyo_night['day']
with plt.style.context(matplotx.styles.tokyo_night['day']):
plt.scatter(df['NPHI'], df['RHOB'], c=df['GR'])
plt.ylim(3,2)
plt.xlim(-0.15, 0.8)
plt.clim(0, 150)
plt.colorbar(label='GR')
plt.xlabel('NPHI (dec)')
plt.ylabel('RHOB (g/cc)')
plt.show()
运行上述代码将生成以下所需样式的图表。
应用 matplotx 的东京之夜白天主题后的 Matplotlib 散点图。图片由作者提供。
将 Matplotx 应用于其他 Matplotlib 图表
我们还可以将 matplotx 样式应用到其他图表上,例如直方图。我们需要做的就是修改 matplotlib 绘图代码,以获得直方图。
with plt.style.context(matplotx.styles.pitaya_smoothie['dark']):
plt.hist(df['RHOB'], bins=50, alpha=0.8)
plt.xlim(2, 3)
plt.xlabel('RHOB (g/cc)')
plt.show()
当我们运行上述代码时,我们得到的直方图比我们常见的基本蓝色条形图要美观得多。
应用 matplotx 主题的直方图示例。图片由作者提供。
总结
尽管 Matplotlib 是一个强大的数据可视化库,但使用起来可能会比较麻烦,尤其是当你想创建令人惊叹的图形时。使用 matplotx,我们只需添加两行代码,即可瞬间将图表转变为更加出色的样子。它绝对是你在创建下一个图形时,想要快速添加一些风格时应该考虑的库。
感谢阅读。在你离开之前,你一定要订阅我的内容,将我的文章直接送入你的收件箱。 你可以在这里订阅!另外,你也可以 注册我的新闻通讯 ,以免费将额外内容直接送到你的收件箱。
其次,您可以通过注册会员,获得完整的 Medium 体验,并支持我和其他成千上万的作者。这只需每月$5,您就可以完全访问所有精彩的 Medium 文章,并有机会通过您的写作赚取收入。如果您使用 我的链接, 您将直接通过您的费用的一部分支持我,而不会增加额外的费用。如果您这样做,非常感谢您的支持!
本教程中使用的数据
本教程使用的数据是 Equinor 在 2018 年发布的 Volve 数据集的一个子集。数据集的完整详细信息,包括许可证,可以在下面的链接中找到。
[## Volve 数据集
Equinor 官方已经将北海油田的完整数据集提供用于研究、学习等…
Volve 数据许可证基于 CC BY 4.0 许可证。许可证协议的完整详细信息可以在此处找到:
从编码到嵌入
原文:
towardsdatascience.com/from-encodings-to-embeddings-5b59bceef094
概念与基础:从 SVD 到神经网络
·发表于 Towards Data Science ·16 分钟阅读·2023 年 9 月 7 日
–
版权: unsplash.com/
在本文中,我们将讨论数据表示和机器学习领域中的两个基本概念:编码和嵌入。本文的内容部分来源于我在斯坦福大学的 CS246 矿大数据集(MMDS)课程中的讲座。希望你觉得有用。
引言
所有机器学习(ML)方法都处理输入特征向量,几乎所有方法都要求输入特征是数值型的。从 ML 的角度来看,有四种类型的特征:
-
数值型(连续或离散):数值数据可以分为连续数据或离散数据。连续数据可以在一个范围内取任意值,而离散数据有明显的值。连续数值变量的例子是*
身高
,离散数值变量的例子是年龄
*。 -
分类数据(有序或无序):分类数据表示诸如眼睛颜色和家乡等特征。分类数据可以是有序的或无序的。在有序变量中,数据被分到按特定方式排序的类别中。例如*
技能水平
,其值为[初级
,中级
,高级
]。无序变量在其值之间没有顺序。例如*眼睛颜色
,其值为[黑色
,棕色
,蓝色
,绿色
]。 -
时间序列:时间序列是一个在一定时间段内以规则间隔收集的数字序列。这些数据按时间排序,与之前的变量不同。一个例子是*
美国多年房屋销售价格的平均值
*。 -
文本:任何文档都是文本数据,我们通常将其表示为“词袋”。
要将任何变量输入到 ML 模型中,我们必须将其转换为数值。编码和嵌入技术都可以实现这一点。
编码
编码是将原始数据(如文本、图像或音频)转换为结构化的数值格式,使计算机能够轻松处理。编码类别变量有两种方法:
1️⃣ 整数编码
2️⃣ 一热编码
3️⃣ 多热编码(这是对一热编码的扩展)
为了解释每种方法,我们通过以下示例来说明:
🎬 设想一个只有 4 部电影和 5 个特征的小型电影数据集。
图 1:电影数据集 — 图片由作者提供
正如我们所见,两个特征(发行年份、IMDB 评分)是数值型的,一个特征(标题)是文本型的,剩下的两个(提供者、IMDB 类型)是类别型的。让我们来看看编码方法如何应用于这些特征。
1️⃣ 整数编码:
这种方法为每个类别值分配一个整数。例如,如果 提供者 变量有四个不同的值 [Netflix, Prime Video, HBO Max, Hulu]
,我们分别将其分配整数 1、2、3 和 4:
Netflix -> 1, Prime Video -> 2, HBO Max -> 3, Hulu -> 4
这种方法的优点是提供了紧凑的表示。缺点是它暗示了不同类别之间的顺序,即
Netflix < Prime Video < HBO Max < Hulu.
因此,对于序数变量(例如 教育
取值为 ‘[文凭, 本科, 硕士, 博士]`),使用整数编码可能更有意义。然而,这仍然意味着值是均匀间隔的 🙊!! 显然,这并不理想,因此我们将转向下一种方法。
💻 在 Python 中,你可以使用各种库(如 scikit-learn 或 TensorFlow/Keras)执行整数编码。在这里,我们使用 scikit-learn 的 LabelEncoder
将类别标签编码为整数:
from sklearn.preprocessing import LabelEncoder
# Sample list of categorical labels
labels = ["netflix", "prime video", "hbo max", "hulu"]
# Initialize the LabelEncoder
label_encoder = LabelEncoder()
# Fit and transform the labels to integer values
integer_encoded = label_encoder.fit_transform(labels)
# Print the encoded labels
print(integer_encoded)
2️⃣ 一热编码:
这种方法首先应用整数编码,然后创建一个二进制向量来表示数值,例如,对于 提供者
变量,我们首先分配整数:Netflix -> 1, Prime Video -> 2, HBO Max -> 3, Hulu -> 4。然后我们为每个值创建一个长度为 4 的二进制向量,如下所示:
图 2:提供者变量的一热编码向量 — 图片由作者提供
如你所见,这种方法将特征向量的维度扩展到类别特征的取值数量 🙈!! 这可能迅速变得难以控制。
💻 在 Python 中,你可以使用像 scikit-learn 或 pandas 这样的库来执行一热编码。以下是使用 scikit-learn 的 OneHotEncoder
进行一热编码的方法:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# Sample categorical data (list of categories)
categories = ["netflix", "prime video", "hbo max", "hulu"]
# Initialize the OneHotEncoder
onehot_encoder = OneHotEncoder(sparse=False)
# Reshape the data into a 2D array (required for scikit-learn)
categories = np.array(categories).reshape(-1, 1)
# Fit and transform the categories into one-hot encoded vectors
onehot_encoded = onehot_encoder.fit_transform(categories)
# Print the one-hot encoded vectors
print(onehot_encoded)
接下来,我们也来看看这种方法的扩展。
3️⃣ 多热编码:
多热编码是对一热编码的扩展,当类别变量可以同时取多个值时。例如,有 28 种不同的 IMDB 类型,而一部电影可以同时属于多个类型,例如电影 *怪奇物语*
同时属于 剧情、奇幻、恐怖 类型。
图 3:IMDB 类型及其整数编码 — 图片由作者提供
将多热编码应用于电影类型,会得到 28 维的编码向量:
图 4:每部电影的类型的多热编码 — 作者提供的图片
我们可以明显看到,多热编码与 one-hot 编码有相同的缺点,即维度爆炸。
💻 我们可以使用 scikit-learn 或 pandas 在 Python 中实现多热编码。以下是使用 scikit-learn 的 MultiLabelBinarizer
进行操作的方法:
from sklearn.preprocessing import MultiLabelBinarizer
# Sample data: List of sets representing categories for each data point
data = [{'drama', 'fantasy', 'horror'}, {'comedy', 'animation', 'family'},\
{'sport'}, {'documentary'}, {'comedy', 'drama', 'biography'}]
unique_categories = ['action','comedy','short','western','drama','horror',\
'music','thriller','animation','adventure','family',\
'fantasy','sport','romance','crime','sci-fi','biography',\
'musical','mystery','history','documentary','film-noir',\
'news','game-show','reality-tv','war','talk-show','adult']
# Initialize the MultiLabelBinarizer
mlb = MultiLabelBinarizer(classes=sorted(unique_categories))
# Fit and transform the data into multi-hot encoded vectors
multi_hot_encoded = mlb.fit_transform(data)
# Print the multi-hot encoded vectors
print(multi_hot_encoded)
现在,将以上所有编码应用于电影数据集,会得到以下结果:
图 5:包含所有编码的电影数据集 — 作者提供的图片
如我们所见,在应用所有编码后,数据维度从 5 增加到 35 🙊!! 实际上,如果我们对 title
变量也进行多热编码,它将膨胀到数千或一百万!
📓要点是,对于具有大量值集的特征,one-hot 和 multi-hot 编码并不实用。在一个包含一百万个不同单词的文档语料库中,通过多热编码表示每个文档会生成如下向量:
-
高维:多热编码将生成 100 万维的向量!
-
稀疏:由于一个平均文档包含 500 个词,因此多热编码向量将会有 99.95% 的稀疏度
-
语义短缺:‘good’ 和 ‘great’ 的编码与 ‘good’ 和 ‘bad’ 的编码一样不同!
✏️ 简而言之,当类别数量较少时,使用 one-hot/multi-hot 编码;通常少于 15 个。对于类别数量以百万计的文本数据(每个单词作为一个类别),我们必须使用更高效的方法。
在本文的其余部分,我们将处理 计算词嵌入
的问题。通过这个例子,我们将研究几种基本的嵌入方法。
嵌入
为了解决上述问题,我们从高维稀疏向量转向短的稠密向量;这些向量被称为 嵌入。嵌入是将高维向量转换为低维空间的过程,并捕捉语义相似性。
“使用稠密且低维向量的一个好处是计算上的:大多数神经网络工具包与非常高维的稀疏向量兼容性差。” [5]
首先让我们来看一种非常简单的嵌入方法,称为 SVD。
奇异值分解 (SVD)
最简单的嵌入方法可能是 奇异值分解 (SVD),它将输入矩阵 A 分解为以下三个矩阵:
图 6:SVD 分解 — 作者提供的图片
U, V 分别是左奇异向量和右奇异向量。它们是列正交的,这意味着它们中的每一列的范数为 1,并且 U 中的每两列(以及 V 中的每两列)是正交的。用数学语言表示为
U 和 V 定义了一个 r 维子空间,因此将A投影到它们上面产生 r 维嵌入:
🗒 让我们一起看一个例子 🗒**:**
给定一个文档语料库,我们可以使用 SVD 来计算文档嵌入和词嵌入。步骤如下:
步骤 1:将其转换为词袋(BOW)向量,并获得词-文档矩阵。我们可以使用词频(tf),或使用 tf-idf 技术进行归一化。
图 7:词频矩阵 — 作者提供的图片
步骤 2:对词-文档矩阵应用 SVD,并选择一个值r < rank(A)。这将创建三个矩阵,每个矩阵的秩为 r。
图 8:矩阵 A 的 SVD 分解 — 作者提供的图片
步骤 3:计算文档的嵌入,如下所示
emb = [<doc, v1> , <doc, v2> , <doc, v3>]
下图显示了前两个点积。
图 9:第一个文档的嵌入 — 仅显示了两个点积操作 — 作者提供的图片
一旦我们计算了所有三个向量的点积,文档的嵌入就是:
图 10:第一个文档的嵌入 — 作者提供的图片
类似地,我们可以计算词(术语)嵌入为emb = [<term, u1> , <term, u2> , <term, u3>]。
图 11:第一个术语的词嵌入 — 作者提供的图片
我们可以证明,这些表示将相似的术语和文档分组在三维空间中。相关或具有相似上下文的术语和文档在这个降维空间中往往具有相似的表示。
💻 在 Python 中,我们使用 scikit-learn 将文档语料库转换为 tf-idf 矩阵,然后对其应用 SVD。以下是一个示例:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
import numpy as np
# Sample documents (corpus)
documents = [
"This is the first document.",
"This document is the second document.",
"And this is the third one.",
"Is this the first document?",
]
# Step 1: Apply TF-IDF
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
# Step 2: Perform SVD on TF-IDF matrix
n_components = 2 # Number of components (adjust as needed)
svd = TruncatedSVD(n_components=n_components)
svd_matrix = svd.fit_transform(tfidf_matrix)
# Print the TF-IDF matrix and SVD results
print("TF-IDF Matrix:")
print(tfidf_matrix.toarray())
print("\n")
print("SVD Matrix:")
print(svd_matrix)
总的来说,SVD 是一种简单且强大的技术,用于保持语义信息,但在实际数据集上并不实用。它计算量大,并且完全没有利用输入矩阵的稀疏性。让我们看看如何在另一种方法中避免这些缺陷。
神经网络作为嵌入器
🌟 目前最先进的嵌入器之一是神经网络(NN)。有许多神经网络技术可以计算词嵌入:Word2Vec、Glove、BERT、fastText 等。本文讨论了Word2Vec,该方法由托马斯·米科洛夫及其在谷歌的同事们开发,并在 2013 年至 2014 年间发表的一系列论文中介绍了该方法(论文)。
Word2Vec 是一种统计、自监督、与任务无关的方法。它有两种变体:连续词袋模型(CBOW)和 Skip Gram。这两种变体非常相似,都使用一个只有一层隐藏层且没有激活函数的浅层神经网络来学习词语表示。在本文中,我们研究 skip-gram 模型。
🔑 Word2Vec 的关键思想是具有相似上下文的词语具有相似的含义。一个词在某些其他词的上下文中出现得越频繁,它们的含义就越接近。一个词的上下文是它左边和右边的几个词。形式上,给定一个文档,我们设置一个窗口大小(例如,window_size = 2)。那么对于文档中的任何给定词(称为*目标
词),它左边的window_size
* 个词和右边的*window_size
* 个词就是它的上下文。例如:
图 12:目标词和上下文词(窗口大小 = 2) — 图片由作者提供
给定一个文档,我们可以从左到右滑动窗口,找到所有的*(目标词, 上下文词)* 对。考虑以下文档:
文档:“我读科幻书籍并喝橙汁”,
设窗口大小 = 2。那么 (目标词, 上下文词) 的集合如下图所示。图片中高亮的词是目标
词,框中的其他词是上下文
词。
图 13:在文档上滑动窗口以提取(目标词,上下文词) — 图片由作者提供
现在,我们知道了目标词和上下文词的含义,让我们看看 Word2vec 如何使用它们。Word2vec 是一个 2 层神经网络,它以目标词作为输入,并预测窗口中的所有上下文词。以下是窗口大小 = 2 的架构示意图:
图 14:窗口大小 = 2 的 skip-gram 架构 — 图片由作者提供
现在,我们可以猜测为什么这个架构被称为 skip-gram🙂… 这是因为它预测上下文中的所有词组,除了目标词,因为目标词是模型的输入,所以这个名字叫做 skip-gram。
现在,让我们专注于只预测一个上下文词,并深入细节。设V = 词汇表的大小和N = 嵌入维度,即唯一隐藏层的大小。则用于预测一个上下文词的架构是:
图 15:用于预测一个上下文词的 skip-gram 架构 — 图片由作者提供
🧬输入层是目标词的 one-hot 编码,即 w(t);由于我们在词汇表中有 V 个词,输入层是 V 维的。隐藏层是 N 维的,并生成嵌入。通常 N << V,例如在一个网页文档的语料库中,我们有数百万个词汇(V 级别为百万级),而 N 在 256 到 512 之间。隐藏层的目的是将词映射到一个更低的维度,同时保持不同词之间的分离。这个层不使用任何激活函数。原因是大多数激活函数涉及在一个区域“压缩”空间,而在另一个区域“扩展”空间,例如 sigmoid/tanh 会将所有值 < -1“压缩在一起”,所有值 >1 同样如此。RELU 会将所有值 <0“压缩在一起”,从而消除了代表能力的一半。如你所见,这实际上会 损害 分离质量,减少可用的“词映射空间”量。输出层是 V 维的,softmax 函数作用于此层,因此输出层中的每个神经元都是一个概率,所有神经元的总和为 1。输出层的第 j 个神经元,即 y_j,表示第 j 个词是上下文词的概率。我们可以看到,这里涉及两个权重矩阵:
给定网络的拓扑结构,如果 x 是输入,y 是输出,则
网络训练完成后,我们通过将其 one-hot 向量 x 与权重矩阵 W 相乘来获得词的嵌入。
🔁网络是如何训练的? 由于没有标签,我们将创建一个虚拟任务 😃!这个虚拟任务是:
📑虚拟任务:给定一个目标词,预测其上下文词
现在,有两个问题:1)如何生成训练数据,2)选择什么损失函数来训练网络?
🗒如何生成训练数据? 我们取我们的语料库 data = {d1, d2, ….},可能会收集到数百万篇文档、维基页面、博客文章等。然后,我们对所有文档进行分词,并建立词汇表。可用的分词方法有很多,例如 workpiece、BytePairEncoding (BPE)、k-gram。最简单的方法是 k-gram。如果你取 k=1 并按词进行分词(而不是按字符),那么 1-gram 相当于按空格分割句子!分词后,我们得到一个分词文档的列表。然后,我们在分词文档上滑动窗口,并将训练数据收集为 (target, context) 的对。请参见下面的示例:
图 16:从文档中收集训练数据 — 作者提供的图像
📈选择什么损失函数? 我们使用交叉熵损失函数。原因是我们针对目标-上下文对 (w_t, w_c) 进行训练,其中 w_t 是目标词,w_c 是上下文词。上下文词 w_c 表示给定目标词 w_t 的理想预测。注意 W_c 以独热编码表示,即在某个位置 j 的值为 1,其他位置为 0:
图 17:上下文词的独热编码 — 作者提供的图片
损失函数需要在相同位置 j 评估输出层,即 y_j。(记住 y 是一个概率分布;y_j 的理想值为 1)。交叉熵损失函数定义为
对于上述示例,
图 17:示例中的交叉熵损失 — 作者提供的图片
🔥训练神经网络:既然损失函数和训练数据已经明确,我们将训练网络以学习权重。我们希望找到使损失函数最小的 W 和 W′ 的值。我们通过反向传播运行并根据损失的导数更新参数来实现这一点。这就结束了 word2vec 算法。
📊词嵌入的结果: 下面,我们看到四个词 “man,” “woman,” “king,” “queen” 的向量表示示例,这些示例说明了 Word2Vec 如何捕捉语义。在 Word2Vec 的背景下,词之间的关系可以表示为向量运算。算法捕捉到像 “king — man + woman = queen” 这样的关系。这是因为“king”的向量表示减去“man”的向量表示再加上“woman”的向量表示,结果是一个非常接近“queen”的向量表示。
图 18:词嵌入捕捉语义 — 作者提供的图片
重要的是要注意,Word2Vec 是在大型文本语料库上训练的,学习到的嵌入质量取决于训练数据的数量和质量。此外,虽然 Word2Vec 可以捕捉许多语义关系,但它可能无法捕捉语言和意义的所有可能细微差别。之后还开发了其他词嵌入算法和模型,以进一步增强对词关系的理解。
物品-物品神经协同过滤
在本节中,我们将深入探讨通过神经网络学习嵌入的另一个示例。该网络建模了物品-物品协同过滤算法。我们将通过视频推荐的用例来研究这个网络。
🎥视频推荐用例:考虑一个视频推荐的用例,我们有 100 万个视频和 50 万名用户,这些用户观看了一些这些视频,我们的任务是向用户推荐视频。我们想用神经网络解决这个问题,因此我们将其表述为多类分类,每个视频就是一个类别。我们设计一个神经网络来学习视频的嵌入,使得相似的视频具有相似的嵌入。首先让我们构建训练数据,然后设计网络架构。
🗒构建训练数据: 给定包含用户观看视频的日志,我们按时间升序排列每个用户观看的视频。然后按固定比例将其分割。我们将第一次分割作为训练数据,第二次分割作为测试数据。请注意,如果我们的分割比例是 70-30,则每个用户的数据按这个比例进行分割。通过这种基于时间的分割,我们的任务隐式地变成了*‘预测用户接下来观看什么’*。
另一种分割方式是避免排序,随机保留每个用户的一些视频作为测试数据,使用其余的视频构建训练数据。然而,这种方法有泄露从训练到测试的信息的风险。
图 19:视频推荐训练-测试分割 — 图片由作者提供
数据分割后,我们将训练数据构建为(movie1, movie2)对,其中两个电影都由同一个用户观看。
图 20:构建训练数据和测试数据 — 图片由作者提供
然后,我们构建一个执行项目-项目协同过滤的神经网络,同时学习 3 维嵌入!!(三维虽然太小,但为了说明目的我们继续使用它。)
图 21:项目-项目神经协同过滤 — 图片来源于[1],由作者修改
对于训练数据中的每一对(m1, m2),我们在蓝色的输入层中输入 m1 的独热向量,并在黄色输入层中输入 m1 的特征向量(包含如类型、演员、导演、受欢迎程度等元数据)。m2 的独热向量将用于计算损失函数。我们希望模型学习 m1 和 m2 之间的关联。m1 和 m2 在训练数据中出现得越频繁,它们的嵌入就会越接近。
如何向用户推荐电影? 假设 Alice 观看了 m1、m4、m5。为了向她推荐电影,我们可以找到与 m1 具有相似嵌入的电影。对于任何电影 v,我们计算相似度分数为score= <emb(m1), emb(v)>。我们找到相似度分数最高的前 5 部电影,并推荐给 Alice。更好的推荐是对 m1、m4 和 m5 重复上述过程,并推荐这些集合的交集中的电影。
这部分内容结束了关于项目-项目协同过滤的讨论。如果你想深入了解神经协同过滤,请查看这篇论文。
概述
在这篇文章中,我们讨论了编码和嵌入方法。我们了解到,编码指的是将原始数据(如文本、图像或音频)转换为一种结构化格式的过程,以便计算机能够轻松处理。这种转换通常涉及降低数据的维度,同时保留其本质特征。另一方面,嵌入则是将数据点映射到一个低维空间,其中每个点由一个连续值的向量表示。嵌入旨在捕捉数据点之间的语义关系和相似性,使算法能够有效地学习模式并做出有意义的预测。编码和嵌入在各种应用中发挥着关键作用,从自然语言处理和计算机视觉到推荐系统和异常检测,提升了数据分析和机器学习任务的效率和有效性。
如果你有任何问题或建议,请随时联系我:
电子邮件:mina.ghashami@gmail.com
LinkedIn: www.linkedin.com/in/minaghashami/
参考文献
从 ETL 过渡到 ELT
云计算和分析工程如何促使从 ETL 到 ELT 的过渡
·发表于 Towards Data Science ·7 分钟阅读·2023 年 12 月 6 日
–
图片由 DALL-E 生成
ETL(提取-转换-加载)和 ELT(提取-加载-转换)是数据工程领域中常用的两个术语,特别是在数据摄取和转换的背景下。
虽然这些术语常常可以互换使用,但它们指的是略有不同的概念,并对数据管道的设计有不同的影响。
在这篇文章中,我们将澄清 ETL 和 ELT 过程的定义,概述两者之间的差异,并讨论它们对工程师和数据团队所提供的优缺点。
更重要的是,我将描述现代数据团队组成的近期变化如何影响 ETL 与 ELT 之间的竞争格局。
理解提取(Extract)、加载(Load)和转换(Transform)的独立性
比较 ETL 和 ELT 时,主要关注的点显然是数据管道中提取(Extract)、加载(Load)和转换(Transform)步骤的执行顺序。
目前,让我们忽略这个执行顺序,专注于实际的术语,并讨论每个步骤应该做什么。
提取:这一步指的是从持久化数据源中提取数据的过程。这个数据源可以是数据库、API 端点、文件,甚至是任何包含数据的事物,无论是结构化还是非结构化数据。
提取步骤从各种来源中提取数据 — 来源:作者
转换:在这一步骤中,管道需要对数据的结构或格式进行一些更改,以实现特定目标。转换可以是属性选择、记录修改(例如,将 'United Kingdom'
转换为 'UK'
)、数据验证、连接到另一个来源或任何更改输入原始数据格式的操作。
转换步骤对输入的原始数据执行多项转换 — 来源:作者
加载:加载步骤指的是将数据(无论是原始版本还是转换版本)复制到目标系统的过程。通常,目标系统是数据仓库(即用于分析目的的 OLAP 系统)或应用程序数据库(即 OLTP 系统)。
将数据加载到目标系统中 — 来源:作者
不可避免地,我们执行这三个步骤的顺序很重要。随着需要处理的数据量的增加,执行顺序非常重要。让我们讨论一下原因!
提取 转换 加载 (ETL)
ETL 代表提取-转换-加载,该术语本身指的是一个过程,其中数据提取步骤之后是转换步骤,最后是加载步骤。
提取 > 转换 > 加载 — 来源:作者
ETL 过程中的数据转换步骤发生在目标系统之外的阶段环境中,数据在加载到目标系统之前进行转换。
在 ETL 中,转换步骤发生在阶段环境/服务器中,转换后的数据然后被加载到目标系统中 — 来源:作者
提取 加载 转换 (ELT)
另一方面,ELT,代表提取-加载-转换,指的是一个过程,其中提取步骤之后是加载步骤,最终的数据转换步骤发生在最后。
提取 > 加载 > 转换 — 来源:作者
相比于 ETL,在 ELT 中不需要阶段环境/服务器,因为数据转换是在目标系统内进行的,该系统通常是托管在云端的数据仓库或数据湖。
在 ELT 中,转换步骤发生在目标系统内 — 来源:作者
如何在 ETL 和 ELT 之间做选择
ETL 和 ELT 各有利弊,鉴于它们通常用于不同的用例,您很可能会在日常工作中遇到这两者。
ETL 最适合用于数据存储在本地并需要在加载到目标数据库或数据仓库之前进行结构化的用例。因此,当涉及较小的数据量和/或需要执行复杂转换时,通常更倾向于使用 ETL 过程。
此外,由于 ETL 在加载步骤之前转换数据,因此敏感数据可以在加载之前被掩码、加密或完全删除。ETL 的这一方面可以帮助公司和团队更容易地强制执行和实施各种法规(如 GDPR)。
由于转换发生在中间(暂存)服务器上,因此需要额外的开销将转换后的数据移动到目标系统。此外,目标系统不会包含原始数据(即转换前的数据形式)。这意味着每当需要额外的转换时,我们必须再次提取原始数据。
另一方面,ELT 提供了比 ETL 更多的灵活性,因为后者历史上是为了结构化(关系型)数据而设计的。现代云架构和数据仓库使得 ELT 能够处理结构化和非结构化数据。
如前所述,ETL 应用于小规模的数据。ELT 提供了更快的转换速度,因为它不依赖于数据大小,通常根据需要进行。
另外,当数据在 ELT 过程中的转换之前被加载时,这意味着用户和系统仍然可以访问原始数据。这意味着如果在后续阶段需要更多的转换,我们已经在数据仓库中拥有可以随时访问的原始数据。唯一的缺点是需要额外的存储来存储这些原始数据,但考虑到存储成本不断下降,我认为这不是一个主要问题。
现在我们对 ETL 和 ELT 过程的技术影响有了充分的了解,让我提一个问题。当选择一个而不是另一个时,仅仅是技术实施的问题吗?
这不仅仅是关于何时进行转换
此外,数据领域一直在不断发展,数据角色也不例外。ETL 与 ELT 不仅仅关乎转换步骤发生的地点——它(还)关乎谁应该执行这些步骤。
转换步骤通常涉及某种业务逻辑。传统的 ETL 过程通常由数据仓库工程师执行(不确定现在是否仍然如此),这意味着这些人也负责制定业务逻辑。
另一方面,ELT 过程的演变是由于现代数据团队的性质和形成。EL(Extract-Load)步骤通常由数据工程师执行,而转换步骤则由所谓的分析工程师执行。
对我来说,这非常有意义。数据工程师是一个纯技术人员,关注效率、可扩展性、准备性和可用性(还有其他一百万件事)。另一方面,分析工程师仍然是技术人员,但对业务的理解更好。因此,让分析工程师负责数据转换更有意义,因为(通常)转换与业务价值相关。
现代云架构、数据堆栈(包括基于云的 OLAP 系统)以及团队组建使得 ELT 流程变得更加相关和有效。根据我的个人经验,我认为尽管 ETL 仍然相关且有用,但正在经历从 ETL 到 ELT 的转变。
现代数据堆栈和团队更倾向于 ELT 流程
尽管 ETL 并没有消亡,但在我看来,现代数据堆栈和技术更倾向于 ELT 流程。例如,让我们考虑一下 dbt(数据构建工具),它是数据领域中最热门的新增工具之一,并且已经成为分析师和工程师的事实上的转换工具。
通常,我们希望将来自外部或内部数据源的原始数据(即未应用任何转换的)引入数据仓库。然后在这些数据模型的基础上(在 dbt 中我们通常称之为阶段模型),我们构建额外的模型(中间模型和数据集市),这些模型是数据仓库内某些转换过程的结果。
在这样的工作流程中,因此在转换数据之前将数据加载到仓库中更有意义。这还使得可以随时访问原始数据,以便支持未来的用例。
如果你有兴趣深入了解 dbt 是如何工作的,以及不同组件如何协同工作以转换原始数据并构建有意义的数据模型以支持决策,我推荐阅读以下文章。
最后的思考
设计数据管道是一项具有挑战性的任务,在进行时,需要仔细考虑许多因素。在将数据从数据源导入数据仓库时,通常可以采用两种方法。
在本文中,我们讨论了 ETL 和 ELT 如何执行一系列步骤,以便将数据转换和加载(或加载和转换)到目标系统中。
根据组织的情况和具体用例,你可能需要选择其中一个。我希望本教程提供了你选择最佳和最有效的数据摄取和转换方法所需的所有细节。
从评估到启示:深入了解交叉验证中的样本外预测
通过折叠外预测揭示洞察和克服局限性。
·发表于 Towards Data Science ·6 分钟阅读·2023 年 6 月 28 日
–
理解交叉验证并将其应用于实际工作是每个数据科学家的必备技能。虽然交叉验证的主要目的是评估模型性能和微调超参数,但它还提供了额外的输出值得注意。通过获取和结合每个折叠的预测,我们可以生成整个训练集的模型预测,这通常被称为样本外预测或折叠外预测。
不应忽视这些预测,因为它们包含了关于建模方法和数据集本身的宝贵信息。通过深入探索这些预测,你可能会发现诸如模型为何无法按预期工作、如何提升特征工程、以及数据中是否存在固有的局限性等问题的答案。
总体方法很简单:调查模型在高置信度下却犯错误的样本。在本文中,我将展示这些预测如何帮助我在三个实际项目中。
查找数据局限性
我曾参与一个预测性维护项目,其目标是提前预测车辆故障。我探索的一种方法是训练一个二分类器。这是一种相对简单直接的方法。
在使用时间序列交叉验证进行训练后,我检查了样本外预测。具体而言,我关注了假阳性和假阴性,即模型难以学习的样本。这些错误预测并不总是由模型自身的缺陷引起的。也有可能是某些样本之间存在冲突,导致模型混淆。
我发现几个标记为故障的假阴性案例,模型很少将它们视为故障。这一观察引起了我的好奇心。经过进一步调查,我发现许多与这些假阴性样本几乎相同的准确负样本。
下面的图 1 通过数据可视化比较了假阴性和真阴性。我不会详细讲解。这个想法是基于欧几里得距离或马氏距离在原始数据空间中运行最近邻算法;我发现与这些假阴性样本非常接近的样本都是实际的真阴性。换句话说,这些故障实例被许多好的实例所包围。
图 1. 一个假阴性与一个真阴性的比较。(图像来源于作者)
我们现在面临数据集的一个典型限制:混淆样本。要么标签错误,要么我们需要更多信息(更多维度)来进行区分。还有可能的第三种方法:将整个空间转换到一个新的空间,在那里混淆样本可以更容易地区分?在这里行不通。首先,混淆发生在原始输入数据中。就像在图像分类数据集中,一张图像标记为狗,另一张几乎相同的图像标记为猫。其次,这种思维方式是以模型为中心的,通常会增加模型的复杂性。
在向客户提出这些问题后,他们确认了标签是正确的。然而,他们也承认一些看似运行良好的车辆可能会在没有任何前兆的情况下突然出现故障,这很难预测。我发现的假阴性样本完美地展示了这些意外故障。
通过对交叉验证中样本外预测的分析,我不仅对问题和数据有了更深刻的理解,还为客户提供了展示数据集局限性的具体例子。这对我和客户都是宝贵的见解。
启发性特征工程
在这个项目中,客户希望使用车辆的道路数据来分类某些事件,例如车辆本身的变道或前方车辆的加速和变道。数据主要是从不同声呐传感器收集的时间序列数据。一些关键的信息是周围物体的相对速度和自车与周围车辆及车道的距离(在 x 和 y 方向上的距离)。还有通过摄像机录制的事件,由标注人员进行标注。
在对前方车辆变道事件进行分类时,我遇到了几个有趣的情况:模型将事件标记为正在发生,但实际情况却不一致。从数据科学的角度来看,它们是具有非常高概率预测的假阳性。
为了向客户提供模型预测的可视化表示,我向他们展示了短动画,如图 2 所示。模型会错误地将前方车辆标记为‘换车道’的时间段大约是 19:59 到 20:02。
图 2. 事件检测的动画。 (图片由作者提供)
为了解决这个谜题,我观看了与这些实例相关的视频。结果发现道路在那些时刻是弯曲的!假设车道是直的,那么模型就是正确的。模型做出错误预测是因为它从未学习过车道可能是弯曲的。
数据中没有包含有关周围车辆与车道之间距离的信息。因此,模型被训练使用周围车辆到自身车辆的距离以及自身车辆到车道的距离来确定它们相对于车道的位置。为了修复这些情况,模型必须知道车道的曲率。与客户沟通后,我在数据集中发现了曲率信息,并基于几何公式构建了测量周围车辆和车道距离的显式特征。现在,模型性能提升,不会再产生这种误报。
纠正标签错误
在第三个示例中,我们旨在预测特定的机器测试结果(通过或失败),这可以被框定为一个二分类问题。
我开发了一个性能非常高的分类器,表明数据集应该有足够的相关信息来预测目标。为了改进模型并更好地理解数据集,让我们关注交叉验证中的样本外预测,其中模型会犯错误。假阳性和假阴性是值得深入探索的宝贵资源。
图 3. 混淆矩阵。 (图片由作者提供)
图 3 是一个阈值相对较高的混淆矩阵。这三个假阳性意味着模型会将它们标记为失败,但实际情况是它们是好的。我们可以像上述示例那样通过改进特征工程来修复它们,或者提出这个问题:如果给定的标签是错误的,而模型实际上是正确的呢?人们会犯错。就像其他列的值可能是异常值或缺失值一样,目标列本身也可能嘈杂并容易出现不准确。
我不能轻易地通过最近邻方法的证据来展示这三个样本是错误的,因为数据空间很稀疏。于是我与客户讨论了数据标注的问题。我们一致认为,用于确定测试结果的一些标准存在缺陷,并且一些样本的标签可能是错误的或未知的。经过清理后,这三个样本的标签得到了修正,模型性能得到了提升。
我们不能总是责怪数据质量。但请记住,这两个方面对于你的数据科学工作同样重要:改善模型和修正数据。不要把所有精力都放在建模上,假设所有提供的数据都是无误的。相反,关注这两个方面是至关重要的。来自交叉验证的样本外预测是发现数据问题的强大工具。
欲了解更多信息,labelerrors.com列出了流行基准数据集中的标签错误。
结论
交叉验证不仅仅提供一个评分,它还有多个用途。除了数值评估外,它还提供了从预测结果中提取有价值见解的机会。通过仔细分析成功的预测,我们可以更好地理解模型的优势,并识别出最具影响力的特征。同样,分析失败的预测可以揭示数据和模型的局限性,并激发潜在的改进思路。
我希望这个工具能在提升你的数据科学技能方面发挥重要作用。
如果你认为这篇文章值得点赞,我会非常开心。如果你喜欢,可以多点几次;谢谢!
时间序列的数据科学
查看列表6 个故事!
从 GeoJSON 到网络图:在 Python 中分析世界国家边界
利用 NetworkX 进行基于图的国家边界分析
·发布于 Towards Data Science ·阅读时间 7 分钟·2023 年 10 月 15 日
–
Maksim Shutov 在 Unsplash
Python 提供了广泛的库,使我们能够轻松快捷地解决各种研究领域的问题。地理空间数据分析和图论是 Python 提供强大实用库的两个研究领域。在这篇文章中,我们将对世界边界进行简单的分析,特别是探索哪些国家彼此接壤。我们将首先利用包含所有国家多边形的 GeoJSON 文件的信息。最终目标是创建一个使用 NetworkX 表示各种边界的图,并利用该图进行多种分析。
GeoJSON 数据导入:读取和加载全球国家数据
GeoJSON 文件能够表示各种地理区域,并广泛应用于地理分析和可视化。我们分析的初始阶段涉及读取 countries.geojson
文件,并使用 GeoPandas
将其转换为 GeoDataFrame
。该文件来源于以下 GitHub 仓库,包含了代表世界各国的多边形。
[## GitHub - datasets/geo-countries: 作为 GeoJSON 的国家多边形数据包
作为 GeoJSON 的国家多边形数据包。通过创建帐户来为 datasets/geo-countries 的开发做出贡献…
github.com](https://github.com/datasets/geo-countries/tree/master?source=post_page-----ab81b5a8ce5a--------------------------------)
包含全面国家信息的 GeoDataFrame(图片由作者创建)
如上所示,GeoDataFrame
包含以下列:
-
ADMIN
:表示地理区域的行政名称,如国家或地区名称。 -
ISO_A3
:代表 ISO 3166–1 alpha-3 国家代码,一个唯一识别国家的三字母代码。 -
ISO_A2
:表示 ISO 3166–1 alpha-2 国家代码,一个用于国家识别的两字母代码。 -
geometry
:此列包含定义地理区域形状的几何信息,表示为MULTIPOLYGON
数据。
你可以使用plot
方法可视化构成GeoDataFrame
的所有多边形,如下所示。
GeoDataFrame 的可视化表示(图片由作者创建)
计算多边形坐标:纬度和经度
geometry
列中的多边形属于shapely.geometry.multipolygon.MultiPolygon
类。这些对象包含各种属性,其中之一是centroid
属性。centroid
属性提供MULTIPOLYGON
的几何中心,并返回一个表示该中心的POINT
。
随后,我们可以使用此POINT
提取每个MULTIPOLYGON
的纬度和经度,并将结果存储在GeoDataFrame
中的两列中。我们进行此计算,因为稍后我们将使用这些纬度和经度值根据其实际地理位置在图中可视化节点。
创建国家边界网络图
现在是时候继续构建一个表示全球不同国家之间边界的图。在这个图中,节点将代表国家,而边将表示这些国家之间边界的存在。如果两个节点之间存在边界,图中将有一条连接它们的边;否则,将没有边。
函数create_country_network
处理GeoDataFrame
中的信息,并构建一个表示国家边界的Graph
。
最初,函数遍历GeoDataFrame
的每一行,每行对应一个国家。然后,为国家创建一个节点,并将纬度和经度作为属性添加到节点中。
如果几何体无效,它将使用buffer(0)
方法进行修正。此方法通过应用一个距离为零的小缓冲区操作来修复无效几何体。此操作解决了多边形表示中的自交或其他几何不规则性问题。
在创建节点之后,下一步是为网络添加相关的边。为此,我们遍历不同的国家,如果表示两个国家的多边形之间有交集,则意味着它们共享一个共同的边界,因此在它们的节点之间创建一条边。
可视化构建的国家边界网络
下一步是可视化创建的网络,其中节点代表全球的国家,而边表示它们之间存在边界。
函数 plot_country_network_on_map
负责处理图 G
的节点和边,并在地图上显示它们。
国家边界网络(图像由作者创建)
图中节点的位置是由国家的经纬度坐标确定的。此外,背景中放置了一张地图,以提供更清晰的创建网络的背景。这张地图是使用 GeoDataFrame
的 boundary
属性生成的。这个属性提供了表示国家几何边界的信息,帮助创建背景地图。
需要注意一个细节:在使用的 GeoJSON 文件中,有些岛屿被视为独立国家,即使它们在行政上属于某个国家。这就是为什么你可能会看到海域中有很多点。请记住,创建的图依赖于生成它的 GeoJSON 文件中的信息。如果我们使用不同的文件,生成的图将会不同。
探索见解:利用国家边界网络回答问题
我们创建的国家边界网络可以迅速帮助我们解决多个问题。下面,我们将概述通过处理网络提供的信息可以轻松得出的三种见解。然而,这个网络可以帮助我们解答的其他问题还有很多。
见解 1:检查选定国家的边界
在这一部分,我们将直观评估特定国家的邻国。
plot_country_borders
函数可以快速可视化特定国家的边界。这个函数生成一个包含所提供输入国家及其邻国的子图。接着,它会可视化这些国家,使得观察特定国家的邻国变得非常容易。在这个实例中,选择的国家是墨西哥,但我们可以很容易地调整输入以可视化其他国家。
墨西哥的国家边界网络(图像由作者创建)
从生成的图像中可以看出,墨西哥与三个国家接壤:美国、伯利兹和危地马拉。
见解 2:边界最多的前 10 个国家
在本节中,我们将分析哪些国家拥有最多的邻国并将结果显示在屏幕上。为此,我们实现了 calculate_top_border_countries
函数。该函数评估网络中每个节点的邻国数量,并仅显示邻国最多的节点(前 10 名)。
拥有最多边界的前 10 个国家(图像由作者创建)
我们必须重申,获得的结果依赖于初始的 GeoJSON 文件。在这种情况下,Siachen 冰川被编码为一个独立的国家,这就是为什么它被显示为与中国共享边界。
见解 3:探索最短的国家间路线
我们通过路线评估结束我们的分析。在这种情况下,我们将评估从起始国到目的国旅行时必须穿越的最小边界数量。
find_shortest_path_between_countries
函数计算从起始国到目的国的最短路径。然而,需要注意的是,这个函数仅提供可能的最短路径之一。这一限制源于它使用了 NetworkX
的 shortest_path
函数,由于算法的特性,它固有地找到单一的最短路径。
要访问两个点之间的所有可能路径,包括多个最短路径,可以选择其他选项。在 find_shortest_path_between_countries
函数的上下文中,可以探索诸如 all_shortest_paths
或 all_simple_paths
的选项。这些替代方案能够返回多个最短路径,而不仅仅是一个,具体取决于分析的要求。
我们使用该函数来查找西班牙和波兰之间的最短路径,分析结果显示,从西班牙到波兰旅行所需的最小边界穿越数量为 3。
从西班牙到波兰的最佳路线(图像由作者创建)
总结
Python 提供了大量跨领域的库,这些库可以无缝集成到任何数据科学项目中。在这个实例中,我们利用了专门用于几何数据分析和图形分析的库来创建一个表示世界边界的图形。随后,我们展示了如何利用这个图形快速回答问题,使得地理分析变得轻松自如。
感谢阅读。
Amanda Iglesias
从黑客到和谐:在推荐中构建产品规则
不要让启发式规则削弱你的机器学习,学会将它们结合起来
·
关注 发表在 Towards Data Science ·6 min read·2023 年 9 月 23 日
–
在当今的数据驱动环境中,推荐系统驱动了从社交媒体信息流到电子商务的所有内容。尽管很容易认为机器学习算法承担了所有的重任,但这只是故事的一半。现实世界中的系统通常依赖于机器学习和启发式规则的混合——通常被称为产品规则、业务规则或简单的黑客——以生成最相关的推荐。
例如:
-
你不能过于频繁地推荐来自同一艺术家的曲目;
-
你应该在信息流中包含订阅内容,但不要使其过于繁重;
-
如果用户已经对某一类别或作者表示不喜欢,相关内容应受到惩罚或甚至被过滤掉;
-
明确的内容不能被推荐——除非情况适当。
照片由 Cam Bradford 提供,发布在 Unsplash
规则有两种类型:硬规则和软规则。硬规则作为过滤器,禁止在特定上下文中推荐某些文档;不符合规定被视为产品缺陷。这些规则本身没有什么错误,但它们的数量应该受到限制。此外,它们应该尽可能早地应用于排名过程,最好是在候选生成阶段,甚至在索引构建过程中。另一方面,软规则更像是指导方针:你可以推荐这些项目,但最好不要推荐过多(或者相反,多推荐也可以)。拥有过多的软规则可能会使系统调试和开发变得非常具有挑战性。
规则是技术债务。
我发现系统中此类规则的数量通常依赖于团队内部的权力动态。产品经理通常发现通过规则表达约束很方便,而工程师通常不喜欢这些权宜之计。在我之前的团队中,我为我们能够将这些规则的数量保持在最低限度而感到自豪。
在我的职业生涯中,我经常遇到一个反复出现的模式。工程团队难以训练系统,以产生良好的推荐(无论是整体还是在特定方面)。产品团队随后转而使用他们最熟悉的方法——添加新规则。这些补丁在需要快速修复时是合理的,但后期很难去除。系统通常会保持这种补丁状态,直到进行重大重构,就像常规的技术债务一样。
故事的寓意——不要吝啬于聘请强大的工程师🙂
在一个理想的系统中,不应该有这样的规则;所有模糊的逻辑都应该由足够先进的模型处理。我梦想着有一天我们能达到这种技术状态(我有一个关于如何实现它的假设)。然而,就目前而言,这并不现实。因此,与其完全禁止这些规则,我将讨论一种允许某种组织并限制混乱的方法。
一种结构化的方法:重新排名框架
这个框架允许将机器学习模型与产品规则执行结合起来,帮助构建这些规则,同时避免完全混乱。然而,它是灵活的,不会过于限制,因此不能保证完全的秩序。在某种程度上,它只是描述规则的一种语言。在我看来,它相当方便。
在本讨论中,我们将重点关注排名的最终阶段,此时剩余文档不多——例如,从几十个到几百个——我们希望从中编制出最佳列表。这个阶段的有趣之处在于,我们不仅仅是在尽可能准确地评估每个文档在当前上下文中的表现,还在考虑这些文档之间的相互组合。这时,listwise 排名方法就发挥了作用(与用于学习排名的 listwise 学习不同,后者仅仅是损失函数依赖于查询中的所有文档,而排名函数并不依赖)。这种 listwise 方法的一个典型应用是提升结果的多样性。
下面是该方法的关键原则。
-
结果是通过迭代生成的,从第一个位置开始,直到最后一个位置。在每次迭代中,我们选择最合适的文档放入接下来的位置。这是大多数重新排序策略的工作原理,如著名的 DPP 用于多样化。对于非线性输出,可以按重要性对位置进行排序。
-
在每次迭代中,我们将所有剩余文档按值函数进行排序。这可以从简单的点击概率模型输出到更复杂的情况:各种模型输出(或多个模型)预测的不同事件、相似性组件(如与之前文档的相似性)以及手动加权等。值函数可以在每次迭代中重新计算,因此可以依赖于位置和最终输出中已有的文档。它必须具备计算效率。设计正确的值函数本身是一个丰富的话题;该框架既不限制也不简化这一方面。
-
乘积规则表示如下:在一个位置的子集X中,具有属性f的文档数量应当高于或低于某个阈值C。通常,X是一个起始位置的范围,例如 1 到 10(第一页)。属性f最好表示为某个特征的阈值规则,即**[feature(doc) > threshold]**。如有必要,这种格式可以推广到包含非二元属性的情况。
-
规则具有优先级。如果我们不能满足所有规则,我们将丢弃优先级最低的规则。更准确地说:如果在给定位置可以实现最高优先级的规则,它将被严格执行;否则,将不被执行。如果在这些条件下可以实现下一个最高优先级的规则,它将被执行;否则,我们将跳过它。依此类推。换句话说,我们选择实现规则的字典序最高的掩码。
这里有一些格式规则的示例:
-
整个输出中至少一半的文档应为订阅内容。然而,如果所有订阅文档已经被阅读,这条规则将变得不可行,并会被丢弃。
-
前 10 个位置中的低质量文档数量不应超过 2 个。
-
在位置 10 和 20 之间,应该至少有一个来自新类别的文档。
值得注意的是,像“前 10 个位置中必须至少有 5 个文档具有某种属性”这样的规则,可能会导致前 5 个位置被缺乏该属性的文档填充,然后是 5 个具有该属性的文档。为了使分布更均匀,你可以为中间范围添加规则:前 2 个位置中至少有 1 个,前 4 个位置中至少有 2 个,依此类推。
高效实现这个框架是一个很好的挑战,但完全可以做到。这是一个 Python 代码草图,展示了如何实现描述的重新排序框架。请记住,这个代码并没有优化效率,但应该能提供一个很好的起点。
def rerank(documents, count, rules, scorer):
result = []
while len(result) < count and len(documents) > 0:
position = len(result)
candidates = documents
for rule in rules:
filtered = [doc for doc in candidates if rule(position, doc)]
if len(filtered) > 0:
candidates = filtered
next_doc = max(candidates, key=lambda doc: scorer(position, doc))
result.append(next_doc)
documents.remove(next_doc)
scorer.update(position, next_doc)
for rule in rules:
rule.update(position, next_doc)
return result
最后,通过记录所有执行和丢弃的规则,可以大大提升系统的可调试性和可控性。
正如我们所见,目前‘无规则’推荐系统仍然更像是一个理想而非现实。但这并不意味着我们陷入了混乱。一个结构良好的规则管理框架可以提供所需的组织,同时不会抑制系统的潜力。
从线性代数到深度学习的 7 本书(2024 年冬季更新)
我最喜欢的七本机器学习书籍
·
关注 发布于 Towards Data Science · 12 分钟阅读 · 2023 年 11 月 17 日
–
图片由 Laura Kapfer 提供,来源于 Unsplash
在我 2019 年为Towards Data Science撰写的第一篇博客中,我介绍了五本我最喜欢的机器学习书籍——涵盖了从基础线性代数到现代深度学习的各个方面。
它们包括:
-
《线性代数的正确方法》 由 Sheldon Axler 著
-
《数学统计与数据分析》 由 John A. Rice 著
-
统计学习元素 由 Trevor Hastie 等人 编写。
-
神经网络与深度学习 由 Michael Nielsen 编写。
-
深度学习 由 Ian Goodfellow 等人 编写。
我最喜欢的机器学习书籍
[towardsdatascience.com
这五本书我认为真的非常棒,各有各的原因。例如统计学习元素就是当年我还是本科生时让我对数据科学产生兴趣的原因。事实上,这五本书多年来帮助我学到了很多东西,如果没有它们,我现在不会达到这个水平。
但是,它们只是我最喜欢的数据科学和机器学习书籍的一部分,我发现并从中学到了很多,这就是为什么我想写另一批我认为同样令人惊叹并值得加入到您(虚拟)书架上的七本书。对于每一本书,我都会告诉您为什么我认为它们如此出色,它们教会了我什么,以及如何阅读它们的一些建议。
此外,许多书籍最近进行了更新,因此我还将告诉您可以从新版本中期待什么,例如如果您已经了解了旧版本。
就像在我上一篇文章中一样,我选择的书籍在难度上有所不同,因此我将从专注于基础概念的书籍开始,并将在日后涉足先进机器学习文献领域。
准备开始吧…
统计学习导论 由 Trevor Hastie 等人 编写。
在我的原始博客文章中,我提到了书籍统计学习元素,被认为是一部经典作品,是有史以来最有影响力和令人惊叹的机器学习书籍之一。
尽管涵盖了许多相当高级的主题,但令人惊讶的是,它仍然相当易于理解,但通常假定读者具有扎实的数学基础,尤其是统计学方面。
因此,同一组作者还出版了统计学习导论,这是该书的更易接近版本,虽然仍然涵盖(大部分)相同的主题。不要误会,该书仍然在必要或有帮助的地方引入了数学和统计学的基本概念,但其主要重点是建立读者对机器学习中统计方法工作原理的直觉。
在我看来,这本书是学习数据科学和机器学习的绝佳之选。如果您刚开始学习数据科学,这绝对是必读之作。它也是世界各地一些最好的数据科学入门课程的基础。
我从这本书中学到的:我对机器学习的许多直觉来自阅读 ESL 和 ISL。没有其他书籍能如此出色地阐述这些概念。特别是对于许多更高级的概念,如交叉验证和支持向量机,最初可能很难掌握。
阅读这本书的建议:如果你对数据科学是新手,请从头到尾阅读这本书。各章之间相互关联,因此在继续之前,重要的是要掌握每一章的基础知识。如果你想接受挑战,可以同时阅读 ISLR 和对应的 ESL 章节。这将立即将你从仅仅理解一个主题提升到专家级别。
这本书还附带了一个完整的 R 库,因此你可以轻松练习所有的练习题,这是一个令人惊叹的教育资源。
最近版本的新内容:去年发布了这本书的更新第二版,包含了前一版没有的新章节。这些章节大多涉及深度学习、生存分析和多重测试等高级话题。
此外,今年还发布了另一个版本的书籍,这次是官方的 Python 版本,而原版如前所述依赖于 R。
随着数据收集的规模和范围在几乎所有领域持续增加,统计学习…
Hadley Wickham 等人著作的《R for Data Science》
说到 R,R for Data Science 是另一本宝贵的开源书籍。你可以学习数据科学的“整个游戏”——从数据摄取到数据清洗,再到训练模型和传达结果。
这本书不要求有任何编码或数据科学的先前知识,你可以通过这本书学习所有内容。与 ISLR(上述书籍)相比,《R for Data Science》的方法更具实用性。你会在每一章中找到大量代码。
这本书还介绍并大量依赖于 tidyverse,这是一个精心设计的 R 库集合,用于进行数据科学。所以如果你来自 Python 并希望学习如何在 R 中操作,它也是一本很棒的(也许是最好的?)指南。
我从这本书中学到的:这本书证明了 R 是一个用于数据科学的惊人语言,特别是在学习方面更是如此。这是一本极具实用性的实践指南,我从中学到了 tidyverse 的数据科学方法。它特别关注数据处理,这是其他书籍(如 ISLR)通常没有的。直到今天,我仍然依赖于这本书中获得的数据处理知识。
如何阅读这本书:你可以从头到尾阅读它,学到大量的新知识和技巧。如果你是数据科学的新手,我绝对推荐这样做。然而,这不是我第一本数据科学书籍,所以我采取了不同的方式。我按照自己的感觉阅读了各个章节。如果你已经有一些数据科学经验(例如,因为你来自 Python),你也可以这样做——选择一个你想深入了解的主题,阅读相应的章节来加深你的知识。每一部分都是相对独立的,所以你可以很容易地这样做。
新版本的变化:这本书的第二版于今年发布,所有代码示例都进行了重构。tidyverse 在过去几年里发展迅速,因此这本书也需要更新。
这是《R for Data Science》第二版的进行中的网站。这本书将教你如何进行……
r4ds.hadley.nz](https://r4ds.hadley.nz/?source=post_page-----8df2b706a0b1--------------------------------)
(我链接了这本书的第二版,它现在应该已经完成了,但你可以在这里找到原版第一版。)
《机器学习数学》 作者:Marc Peter Deisenroth 等
如果你在寻找一本全面学习机器学习所需数学的书籍,*《机器学习数学》*是一个很好的选择。
机器学习建立在多个数学子领域之上,包括线性代数、统计学、概率论和优化,仅列举主要的几个。因此,为了全面学习这些内容,你通常需要通过各种不同的教材。
这正是写这本书的动机——将机器学习中常用的所有数学知识整合到一本书中。
我从这本书中学到了什么:这是一本现代数学教材,因此在做相关课程时,我将其作为参考。尽管它不是我课程的主要教材,但它覆盖了一些相同的主题。因此,我能够阅读相关章节,这帮助我更好地理解了这些内容。书中包含了良好的解释,总是将其与机器学习概念相关联(不同于通用数学教材),并且包含了很好的可视化,这也帮助我掌握了这些概念。
如何阅读这本书:最好将这本书视为数学教材。如果你正在学习线性代数、概率论、统计学或数学密集型的机器学习课程,这本书可以作为一个很好的补充资源。选择与课程对口的章节,看看这本书是否像对我一样对你有帮助。
请使用 https://mml-book.com 连接到这个网站。Twitter:@mpd37,@AnalogAldo,@ChengSoonOng。我们写了一本关于…
《百页机器学习书》 by Andriy Burkov
首先,实际上不是 100 页,而是更多一点。但无论如何,书籍确实做到了它承诺的内容,那就是一本简明但全面的机器学习关键概念和方法概述。
因此,它可能不是一个从零开始学习数据科学的首选资源,也不是非常实用。它的目的是提供重要概念的简明描述,并介绍其背后的数学和理论。
因此,如果你需要深入但又快速地理解一个概念或方法,这是一个很好的参考。
我从这本书中学到的东西:对我来说,这本书有时候像是一种自我检查。我认为如果我能从其基本描述中理解一个概念,那我应该对这个主题有了很好的理解。我觉得这本书就是关于这个的。它并不是从头教你数据科学或者机器学习,但在心理上,你可以通过阅读书中的内容总结或者重新理解一个概念。
如何阅读这本书:这本书是关于机器学习概念的最佳简明总结之一,我建议你像我一样做,即使用这本书来检查你对某个主题或概念的理解。如果你理解了这个概念,那就很完美。如果没有,你可能需要回到另一本书(如 ISLR 或 ESL)中更详细地解释这个概念。
[## 《百页机器学习书》 by Andriy Burkov
关于机器学习的一百页知识总结。有监督和无监督学习,支持向量…
themlbook.com](http://themlbook.com/?source=post_page-----8df2b706a0b1--------------------------------)
《机器学习:概率视角》 by Kevin Murphy
这是一本比较高级的机器学习书籍之一。《机器学习:概率视角》采用了贝叶斯(即概率论的)视角,同时与传统的频率视角进行对比。
贝叶斯机器学习与众不同,因为它将先验知识和不确定性纳入学习过程中。其中一个显著优势是可以生成概率预测,而不是单一点估计。
该书涵盖了许多之前的书籍没有尝试解释的高级主题,比如高斯过程或变分推断。如果你想把你的机器学习知识提升到更高的水平,这是一本很好的书,你会学会从不同角度来看待它。
我从书中学到的:在大学时,我上过一门贝叶斯机器学习课程,这本书是其中的重要读物。例如,我学习了线性和逻辑回归的贝叶斯版本。书中还有一章关于期望最大化算法的精彩内容。直到今天,每当我需要从概率的角度理解方法时,我总会回到这本书。
如何阅读这本书:这仍然是一本经典教材,所以你很可能会在课程中遇到它。但即使在课堂外,你也可以使用这本书对许多其他书籍(如 ESL)教授的机器学习方法获得不同的视角,还有许多只有在概率框架下才能真正理解的方法。如果这是你第一次学习贝叶斯机器学习,我建议你先阅读导言,以真正理解这个主题为何如此有用。
获奖者,2013 年国际贝叶斯分析学会颁发的德格鲁特奖,1104 页,8 x 9 英寸,300 色……
mitpress.mit.edu](https://mitpress.mit.edu/9780262018029/machine-learning/?source=post_page-----8df2b706a0b1--------------------------------)
新版本中的新内容:作者凯文·墨菲正在编写另外两本机器学习书籍。其中一本是 概率机器学习:导论,主要关注深度学习,还有一本更高级的版本,标题为 概率机器学习:高级主题。
使用 Python 的深度学习 作者:弗朗索瓦·肖莱
使用 Python 的深度学习 是一本很棒的书,如果你想理解(不仅仅是学习)神经网络及其如何使用 Python 实现。
这本书由弗朗索瓦·肖莱编写,他是 Keras 的创建者,这是一个基于 TensorFlow 的深度学习框架。肖莱是一位杰出的作者,这不仅仅是我的看法。他在阐释深度学习中各种概念的机制以及它们如何结合在一起形成目前席卷全球的领域(比如 ChatGPT)方面做得非常出色。
我从书中学到的:这本书完全是关于如何从基础原理开始思考深度学习。我主要用这本书来学习 Keras,但我发现自己还反复阅读了书中的许多其他部分(例如卷积神经网络、最佳实践等)。即使在我遇到这本书时,已经了解了大部分主题,但它们实在太有价值了,因此极大地加深了我对深度学习的理解。
如何阅读这本书:如果你刚开始深度学习,这可能是又一本从头到尾阅读的书,因为弗朗索瓦是一个出色的作者,他在阐述概念时做得非常出色。如果你已经有一些深度学习经验,你也可以选择一章来增强对特定主题的理解。
第二版中的新内容:本书的第二版于今年早些时候发布。深度学习发展迅速,因此书籍需要进行更新。它还包含了新的章节和主题。例如,它包括了最新语言模型和文本生成技术的新内容。此外,Keras 也随着年份的推移发生了变化,所以书籍也进行了相应调整。
本书的上一版电子书副本包含在内,无需额外费用。它将自动添加到…
(还有一本非常相似的书,名为使用 PyTorch 进行深度学习,它涵盖了很多相同的内容,但重点放在 PyTorch 上,而不是 TensorFlow/Keras。)
强化学习导论,作者:理查德·萨顿和安德鲁·巴托
诚然,这本书在这里可能有些格格不入,但绝对值得一读。强化学习(RL)是一个非常迷人的领域,它是以上书籍教授的机器学习的一种极好的补充。
如果你对此不太熟悉,强化学习是人工智能领域中关注自主代理和决策制定的领域,旨在通过与真实或模拟世界的交互来学习。
这本书是全球强化学习课程的标准教材,因此如果你想学习强化学习,它绝对是最佳选择之一。尽管具备机器学习知识对于理解强化学习至关重要,因为它在其中扮演着核心角色,所以可以把这本书看作是“锦上添花”。
从这本书中学到的东西:很多。这本书也是我大学课程的一部分。事实上,我在大学的课程项目是关于蒙特卡洛树搜索,我的硕士论文则是关于情境臂的。这两种方法在书中都有很好的解释。它们是非常有趣和强大的强化学习方法。
如何阅读这本书:这本书可能又是一本从头到尾阅读的书,因为各章节非常相互关联。重要的是,在阅读这本书之前,你可能需要对机器学习甚至深度学习有很好的理解,因为很多强化学习的概念是在它们的基础上建立的。
目前还没有新版本的书,但如果你问我,现在正是更新的时候。在过去几年中,该领域发生了很多变化,驱动了一些最先进的语言模型(例如通过强化学习从人类反馈中学习或 RLHF)。我肯定会第一个读到那本书。
[## 强化学习:一种介绍 | MIT Press 电子书 | IEEE Xplore
强化学习是人工智能中最活跃的研究领域之一,是一种计算方法…
ieeexplore.ieee.org](https://ieeexplore.ieee.org/book/6267343?source=post_page-----8df2b706a0b1--------------------------------)
总结
这七本书,加上我原始博客文章中的五本,都是这个领域中最好的书籍,我可以自信地说,因为我花了(而且现在还在花)很多时间整理我的(虚拟)书架。最棒的部分?大多数都可以免费在线获取。
我真的很感激这个领域如此开放,并且能够自由、轻松地获取知识。我认为这一点并没有被充分地说出来,有时候甚至被视为理所当然,但这不应该这样。
如果有一个最后的建议——我一直都是使用多个信息源学习同一概念的忠实粉丝。不同的书籍(或课程、视频和教程)都会以稍微不同的方式来教授一个主题。就像有多位老师一样,总会有一位能让你豁然开朗,一旦这种情况发生,你也会理解其他人在说什么。我认为通过这样做你能获得非常深刻的理解。
非常感谢你的阅读。我真诚希望你喜欢这篇文章,并且觉得这些书籍对你有用,不论你处于学习的哪个阶段。
如果你有任何想法或问题,请随时在评论中或在LinkedIn上联系我。