学习强化学习的最佳资源
原文:
towardsdatascience.com/best-free-courses-and-resources-to-learn-reinforcement-learning-ed6633608cb2
探索一些最佳的(大多数免费)教程、课程、书籍等,涉及这个不断发展的领域
·发表于Towards Data Science ·18 分钟阅读·2023 年 1 月 12 日
–
学习机器人 — [作者提供的图像,生成自Midjourney AI]
介绍
强化学习(RL)是一种人工智能方法论,在这种方法中,智能体学习与其环境互动,以最大化从环境中获得的奖励信号的期望值。与监督学习不同,后者中智能体会获得标记的例子并根据输入预测输出,RL 涉及智能体主动在其环境中采取行动,并以奖励或惩罚的形式接收反馈。这些反馈用于调整智能体的行为,并随着时间的推移提高其表现。
强化学习已被应用于广泛的领域,包括机器人技术、自然语言处理和金融。在游戏行业中,强化学习被用于开发高级游戏代理,例如**AlphaGo [1]**算法,该算法在围棋比赛中击败了人类冠军。在医疗行业中,强化学习被用于优化慢性病患者的治疗计划,例如糖尿病。强化学习还被应用于机器人领域,使机器人能够学习并适应新的环境和任务。
迷宫机器人 — [由作者提供的图像,生成自Midjourney AI]
最近在强化学习领域最具标志性的突破之一是 chatGPT [2] 的开发,由 OpenAI 提供,这是一种能够与人类进行智能对话的自然语言处理系统。chatGPT 在大量人类对话数据集上进行了训练,可以生成连贯且符合上下文的用户输入响应。该系统展示了强化学习在改进自然语言处理系统和创造更具人性化的 AI 助手方面的潜力。
随着强化学习的不断进步并在各个领域产生影响,专业人士和研究人员对该技术的深刻理解变得越来越重要。如果你对学习强化学习感兴趣,你很幸运!在线上有多种资源可以帮助你入门并在这一激动人心的领域中变得熟练。在这篇博客文章中,我们将突出一些最佳的、主要免费的学习强化学习资源,包括教程、课程、书籍等。无论你是初学者还是经验丰富的从业者,这些资源都会适合你。
在这篇文章中,我们将首先介绍互联网上最佳的 在线课程、讲座和教程,然后介绍该领域最好的和最受欢迎的 书籍 和 教科书。最后,我们还将包括一些有用的额外资源和 GitHub 仓库。
在线课程
虽然有很多关于该主题的课程可供选择,但我们精心挑选了一些最全面且高质量的免费课程。这些课程涵盖了强化学习从基础到高级概念的广泛主题,由领域专家授课。无论你是初学者还是经验丰富的从业者,这些课程都能满足你的需求。继续阅读,发现一些学习强化学习的顶级在线课程吧!请注意,这不是一个详尽的清单,而是一个精选的高度推荐课程列表。
1 - 强化学习专业化课程 — 由 Coursera 提供
来自 强化学习专业化课程 网站的照片,由 Coursera 提供— [来源]
Coursera 上的强化学习专业课程,由阿尔伯塔大学及阿尔伯塔机器智能研究所提供,是一个全面的项目,旨在教授强化学习的基础。该专业课程包括三门课程和一个顶点项目,涵盖了强化学习的广泛主题,包括 RL 基础、基于价值的方法、策略梯度方法、基于模型的 RL、深度 RL 等。在课程中,你将有机会通过实践编程作业和最终项目来应用所学内容。课程由在强化学习领域的经验丰富的讲师和学者授课,包含讲座、阅读和互动练习。这一专业课程适合具有机器学习或相关领域背景的学生,也是任何希望深入理解 RL 的人的极好资源。
虽然技术上并非完全免费,但如果你负担不起,可以申请 Coursera 的财政援助来免除课程费用。然而,考虑到内容质量和材料,这绝对是值得的。
课程链接:
掌握强化学习的概念。实现一个完整的 RL 解决方案,并了解如何应用 AI 工具来……
2 - 2021 年强化学习讲座系列 — 由 DeepMind 与 UCL 联合呈现
来源:DeepMind 官方网页,由 DeepMind 提供 — [来源]
“强化学习讲座系列”是由 DeepMind 和 UCL 呈现的一系列关于强化学习的讲座。该课程涵盖了强化学习领域的广泛主题,包括马尔可夫决策过程和动态规划等基础概念,以及更高级的技术,如基于模型和无模型学习、离策略、基于价值/策略的算法、函数逼近和深度 RL。讲座由 DeepMind 和 UCL 的知名学者和研究人员提供,旨在帮助研究人员和从业者了解强化学习的最新发展和应用。课程在线提供,任何对这一激动人心且迅速发展的领域感兴趣的人都可以参加。
DeepMind 与 UCL 强化学习讲座系列 — 强化学习简介
课程链接:
该系列由 DeepMind 研究人员授课,与伦敦大学学院(UCL)合作创建,旨在提供…
www.deepmind.com](https://www.deepmind.com/learning-resources/reinforcement-learning-lecture-series-2021?source=post_page-----ed6633608cb2--------------------------------)
2018 年也有这个系列的旧版本,可以在这里找到。
3 - 斯坦福 CS234:强化学习 — 2019 冬季
斯坦福大学的 CS234 强化学习课程是对强化学习的全面研究,由 Emma Brunskill 教授授课。该课程涵盖了强化学习的广泛主题,包括基础概念如 MDP 和蒙特卡洛方法,以及更高级的技术如时间差分学习和深度强化学习。课程设计面向有机器学习背景的学生,旨在教授最新的强化学习技术和应用。课程通过一系列的视频讲座提供,可以通过提供的链接在 YouTube 上观看。
课程链接:www.youtube.com/playlist?list=PLoROMvodv4rOSOPzutgyCTapiGlY2Nd8u
4 - 与 David Silver 的强化学习介绍
图片来源于《与 David Silver 的强化学习介绍》 — [来源]
《与大卫·西尔弗的强化学习简介》课程是对强化学习领域的全面介绍,由大卫·西尔弗教授讲授。西尔弗是强化学习和人工智能领域的领先研究者,并且在 AlphaGo 的开发中发挥了关键作用,AlphaGo 是第一个在围棋中战胜职业人类玩家的计算机程序。他还是一些关键研究论文的作者,如深度 Q 学习和 DDPG 算法。课程涵盖了强化学习的基本概念和技术,包括动态规划、蒙特卡洛方法和时序差分学习。它还涉及更高级的主题,如探索-利用权衡、函数逼近和深度强化学习。总体而言,这门课程为强化学习提供了坚实的基础,适合任何对这个激动人心和快速发展的人工智能领域感兴趣的人。
课程链接:
这门经典的 10 部分课程由强化学习(RL)先驱大卫·西尔弗讲授,录制于 2015 年……
www.deepmind.com](https://www.deepmind.com/learning-resources/introduction-to-reinforcement-learning-with-david-silver?source=post_page-----ed6633608cb2--------------------------------)
5 - UC Berkeley CS 285: 深度强化学习 — 2021 年秋季
UC Berkeley CS 285 深度强化学习课程是一个研究生级别的课程,涵盖了强化学习领域,重点是深度学习技术。该课程由 Sergey Levine 教授讲授,旨在为具有扎实机器学习背景并希望了解强化学习最新技术和应用的学生设计。课程涵盖了广泛的主题,包括马尔可夫决策过程和时序差分学习等基础概念,以及深度 Q 学习和策略梯度方法等高级技术。该课程通过一系列视频讲座提供,视频可通过提供的链接在 YouTube 上观看。
课程链接:www.youtube.com/playlist?list=PL_iWQOsE6TfXxKgI1GgyV1B_Xa0DxE5eH
此外,还有一系列旧的 2020 年秋季课程 在这里。
6 - 深度强化学习训练营 — 加州大学伯克利分校
来自 深度强化学习训练营 — 加州大学伯克利分校 官方网站的照片— [来源]
深度强化学习训练营是一个为期两天的密集课程,由该领域的领先研究人员教授。课程涵盖了广泛的主题,包括基于价值的方法、策略梯度算法、基于模型的强化学习、探索与不确定性,以及深度强化学习在现实世界中的应用。课程结合了讲座和实践练习,为学员提供了了解最新技术并将其应用于现实问题的机会。课程旨在为具有机器学习和/或强化学习背景的研究人员和从业者设计,适合那些希望深入理解该领域并在人工智能这一激动人心的领域中推进研究或职业发展的人士。
链接到课程:
[## 深度强化学习训练营 - 讲座
讲座
7 - HuggingFace 的深度强化学习课程
来自 HuggingFace 的照片 深度强化学习课程官方网站 由西蒙·托马斯提供— [来源]
Hugging Face 的深度强化学习课程是一种深入且互动的学习体验,涵盖了深度强化学习中最重要的主题。课程分为多个单元,涉及该领域的各个方面,如 Q 学习算法、策略梯度以及探索、多智能体强化学习和元学习等高级主题。每个单元包括视频讲座、互动编码教程和测验,帮助学习者理解和应用这些概念。
该课程还包括实践项目,使学习者能够将所学知识应用于现实问题。这些项目包括创建一个 RL 代理来玩游戏,训练一个 RL 代理在虚拟环境中导航,以及构建一个 RL 代理来下棋。这些项目为学习者提供了动手操作 RL 模型的机会,并帮助他们理解使用这些模型的挑战和复杂性。
该课程还包括了强化学习的理论基础的讲解,提供了对数学概念和算法的理解。课程旨在对不同背景和经验水平的人群开放,从初学者到经验丰富的从业者。课程由深度强化学习领域的研究员和专家 Simon Thomas 讲授,课程内容会定期更新,以跟上领域的最新进展。
课程链接:
Simoninithomas.github.io [## 深度强化学习课程
深度强化学习课程是一个免费的课程,内容涵盖从初学者到专家的深度强化学习。
Simoninithomas.github.io Hugging Face Deep Reinforcement Learning Course [## 欢迎来到🤗 深度强化学习课程 - Hugging Face 课程
欢迎来到人工智能中最迷人的话题:深度强化学习。这个课程将教你…
Hugging Face Deep Reinforcement Learning Course GitHub - huggingface/deep-rl-class [## GitHub - huggingface/deep-rl-class:该仓库包含了 Hugging Face 深度强化学习课程的教学大纲…
本仓库包含了深度强化学习课程的 mdx 文件和笔记本。网站在这里…
GitHub - huggingface/deep-rl-class
8 - Pieter Abbeel 的讲座
Pieter Abbeel 是一位著名的计算机科学家和机器人专家,目前在加州大学伯克利分校担任教授。他以在机器人领域的研究而闻名,特别是在强化学习、从示范学习和机器人操控方面。他在机器人抓取和操控领域做出了显著贡献,开发了让机器人通过反复试验学习抓取和操控物体的算法。
他也是 apprenticeship learning 领域的先驱,这使得机器人可以从人类示范中学习。他已发表了超过 150 篇论文,其中许多可以在他的个人网站上找到,还在 YouTube 上有一系列视频讲座。他还参与了机器人和机器学习开源软件的开发,并且是流行的开源软件库OpenAI Gym的共同作者,该库在强化学习领域被广泛使用。
他在 YouTube 上的在线讲座是强化学习领域中可用的高质量资料之一。
他的“深度 RL 基础——讲座系列”在他自己的 YouTube 频道上:
他的 CS188 人工智能 UC Berkeley 讲座,2013 年春季:
9 - Spinning Up in Deep RL by OpenAI
图片来源于 Spinning Up in Deep RL 官方网页 由OpenAI提供—— [SOURCE]
Spinning Up in Deep RL 是由 OpenAI 开发和维护的资源。它是一个旨在学习深度强化学习(RL)及其应用的资源。该网站提供了对 RL 及其算法的全面介绍,并包括有关如何实施和运行 RL 实验的教程和指南。网站还包括一些资源,如论文、视频和代码示例,以帮助用户了解 RL。
该网站基于 OpenAI Baselines 软件库,这是一个用 Python 实现的 RL 算法库,支持 PyTorch 和 TensorFlow。该库包括了 DQN、PPO、A2C 和 TRPO 等流行的 RL 算法实现。网站提供了如何使用该库来训练 RL 智能体和运行实验的详细说明和代码示例。
该网站旨在适合不同经验水平的人,并提供了逐步指南以开始学习 RL。网站分为多个部分,包括 RL 介绍、如何使用库的教程以及关于高级主题如多智能体 RL、探索和元学习的部分。网站还提供了一组 Jupyter 笔记本,用户可以运行和修改这些笔记本,从而实验不同的 RL 算法和环境。
网站链接:
[## 欢迎来到 Spinning Up in Deep RL! - Spinning Up 文档
编辑描述
10 - Phil Tabor 的 RL 课程
Phil Tabor 是一位机器学习工程师和教育者,专注于强化学习领域。他以实际的教学方法而闻名,特别注重该领域的动手实践。他在 Udemy 上创建了多个关于机器学习和人工智能的课程,重点是强化学习。他还拥有一个 YouTube 频道 “Machine Learning with Phil”,在这个频道上他上传了关于各种强化学习主题的视频,如 Q 学习、策略梯度以及更多高级主题。他还上传了代码跟随视频,帮助学习者理解概念并应用它们。
他对该领域的实践性方法使其与其他现有内容大相径庭。除了在 Udemy 上的付费课程外,他还在 YouTube 频道 上提供了大量免费内容,这些内容与付费课程的质量相差无几。
YouTube 频道: www.youtube.com/@MachineLearningwithPhil
Udemy: www.udemy.com/user/phil-tabor/
书籍
关于强化学习已经出版了大量优秀书籍,但以下是五本最受欢迎和最全面的书籍:
1. Richard Sutton 和 Andrew Barto, “强化学习:导论(第二版) — 最推荐*
强化学习:导论(第二版),由 Richard Sutton 和 Andrew Barto 编著,是任何对强化学习领域感兴趣的人必备的资源。这本书对强化学习的基本概念和算法提供了全面的介绍,使其成为学生、研究人员和从业者的基本资源。第二版包括了关于该领域最近发展的新章节和对现有材料的更新,使其更加当前和相关。
这本书从强化学习的基本概念介绍开始,概述了强化学习问题以及该领域的历史和它与心理学、神经科学和控制理论等其他领域的关系。然后深入探讨了该领域的基础算法和概念,包括多臂赌博机、马尔科夫决策过程、动态规划和蒙特卡洛方法。
这本书还涵盖了高级主题,如时间差学习、规划与函数逼近器学习,以及强化学习中的探索与利用。附加章节讨论了强化学习在各种领域的应用,包括机器人技术、游戏玩法和医疗保健。
该书还包括关于深度强化学习、政策梯度方法和逆强化学习等领域最新发展的章节。最后几章讨论了该领域的挑战和未来,包括安全性和可靠性、多智能体强化学习以及强化学习在人工通用智能中的作用。
书籍章节:
-
强化学习问题
-
多臂赌博机
-
有限马尔可夫决策过程
-
动态规划
-
蒙特卡洛方法
-
时间差分学习
-
资格追踪
-
用表格方法规划和学习
-
在政策下的行动价值近似
-
在政策外的行动价值近似
-
政策近似
-
心理学
-
神经科学
-
应用和案例研究
-
展望
2. Mykel J. Kochenderfer,“不确定性决策:理论与应用”
不确定性决策:理论与应用,由 Mykel J. Kochenderfer 编著,是关于在不确定性下进行决策的全面指南,重点介绍了强化学习。本书涵盖了决策理论、马尔可夫决策过程和强化学习算法的基本概念,为读者在这些领域提供了坚实的基础。
该书还深入探讨了诸如不确定性规划、安全强化学习以及在现实应用中使用决策方法等高级主题。作者用例子和练习来清晰而简洁地解释概念,帮助读者理解和应用材料。
该书面向广泛的受众,包括人工智能、运筹学和控制系统领域的研究人员和实践者。它还适合这些领域的高年级本科生和研究生。本书全面介绍了在不确定性下进行决策的理论和应用,特别是强化学习,是任何对这一领域感兴趣的人的重要资源。
书籍章节:
-
引言
-
概率模型
-
决策问题
-
顺序问题
-
模型不确定性
-
状态不确定性
-
合作决策制定
-
概率监视视频搜索
-
语音应用的动态模型
-
优化空中碰撞规避
-
持续监视的多智能体规划
-
与人类集成自动化
3. Phil Winder,“强化学习”
Phil Winder 的《强化学习》是对机器学习领域中最令人兴奋和快速发展的领域之一的深入研究。该书全面介绍了强化学习的理论和实践,涵盖了理解和使用这一强大技术所需的广泛主题。
这本书从马尔可夫决策过程的基本概念开始,这些概念构成了强化学习的数学基础。接着,它深入探讨了 Q 学习,这是一种用于在给定环境中找到最优动作价值函数的流行算法。书中还涉及了策略梯度,这是一类允许直接优化策略而不是价值函数的算法。此外,还涵盖了深度强化学习的最新进展以及如何将其应用于解决复杂问题。
这本书还包含了大量的实际示例和练习,帮助读者将概念应用于现实问题中。这本书非常适合机器学习从业者、研究人员和希望理解并从事强化学习的学生。它提供了一个清晰而易于理解的入门介绍,使其成为任何希望开始强化学习或深化对这一强大技术理解的人的重要资源。
书籍章节:
-
为什么选择强化学习?
-
马尔可夫决策过程、动态规划和蒙特卡罗方法
-
时间差分学习、Q 学习和 n 步算法
-
深度 Q 网络
-
策略梯度方法
-
超越策略梯度
-
使用熵方法学习所有可能的策略
-
改善代理学习的方式
-
实用强化学习
-
操作性强化学习
-
结论与未来
4. Alexander Zai 和 Brandon Brown,《深度强化学习实战》**
Alexander Zai 和 Brandon Brown 的《深度强化学习实战》是一本深入指导读者使用深度强化学习构建智能系统的指南。该书首先介绍了强化学习的基本概念和算法,包括 Q 学习和策略梯度。随后,书中涵盖了更高级的话题,如演员-评论家方法和深度 Q 网络(DQN),这些方法用于提高强化学习算法的性能。
本书的一个关键特点是强调动手实例和练习。在整本书中,作者提供了代码片段和示例项目,展示了如何在实践中实现强化学习算法。这些示例和练习旨在帮助读者理解材料并将其应用于自己的项目。
除了涵盖强化学习的基础知识外,本书还介绍了该领域的最新进展,如双重 DQN、优先重放和 A3C。这些技术用于提高强化学习算法的性能并使其更高效。本书适合有一定机器学习和深度学习经验的读者,但不需要有强化学习的先前经验。作者提供了全面且易于理解的领域介绍,使其成为初学者和有经验的从业者的理想选择。
书籍章节:
-
什么是强化学习
-
强化学习问题建模:马尔可夫决策过程
-
预测最佳状态和动作:深度 Q 网络
-
学习选择最佳策略:策略梯度方法
-
使用演员-评论家方法解决更复杂的问题
-
替代优化方法:进化算法
-
分布式 DQN:全面了解
-
基于好奇心的探索
-
多智能体强化学习
-
可解释的强化学习:注意力和关系模型
-
结论:回顾与未来路线图
5. Maxim Lapan, “深度强化学习实战”
Maxim Lapan 的《深度强化学习实战》是对理解和实现深度强化学习(DRL)技术的流行指南的更新版。本书旨在为读者提供对 DRL 背后关键概念和技术的扎实理解,并装备他们建立和训练自己的 DRL 模型所需的实践技能。
本书涵盖了广泛的主题,包括强化学习的基础知识及其与神经网络的联系、高级 DRL 算法如 Q-Learning、SARSA 和 DDPG,以及 DRL 在现实世界应用中的使用,如机器人技术、游戏和自动驾驶汽车。此外,本书还包括实际示例和动手练习,让读者能够将书中所涵盖的概念和技术应用于实际问题。
《深度强化学习实战》以其对理论和实践的关注,是任何希望深入了解 DRL 并开始构建自己 DRL 模型的人的完美指南。
书籍章节:
-
什么是强化学习?
-
OpenAI Gym
-
使用 PyTorch 的深度学习
-
交叉熵方法
-
表格学习与贝尔曼方程
-
深度 Q 网络
-
高级强化学习库
-
DQN 扩展
-
加速 RL 的方法
-
使用 RL 进行股票交易
-
策略梯度 — 一种替代方案
-
演员-评论家方法
-
异步优势演员-评论家
-
使用强化学习训练聊天机器人
-
TextWorld 环境
-
Web Navigation
-
连续动作空间
-
强化学习在机器人技术中的应用
-
信任区域 — PPO, TRPO, ACKTR 和 SAC
-
强化学习中的黑箱优化
-
高级探索
-
超越无模型 — 想象力
-
AlphaGo Zero
-
强化学习在离散优化中的应用
-
多智能体强化学习
附加:其他有用的资源
Python 中的最佳强化学习工具
这篇来自 neptune.ai 的文章概述了在 Python 中使用的流行强化学习工具和库,帮助读者决定哪些工具最适合他们的特定用例。它涵盖了各种流行的 RL 库,如 TensorFlow、PyTorch 和 OpenAI Baselines,以及其他工具,如 OpenAI Gym 和 RL Toolbox。文章还涉及了如可视化工具、模型管理工具和实验跟踪工具等对 RL 有用的其他主题。博客文章组织良好,易于跟随。它包括代码示例和每个工具的相关文档链接,使其成为任何希望开始使用 Python 进行 RL 的人的有用资源。
[## Python 中的最佳强化学习工具,你实际想尝试的 - neptune.ai
目前,深度强化学习(RL)是数据科学界最热门的话题之一。这个快速…
neptune.ai](https://neptune.ai/blog/the-best-tools-for-reinforcement-learning-in-python?source=post_page-----ed6633608cb2--------------------------------)
awesome-deep-rl
这个 GitHub 仓库是一个针对深度强化学习(RL)的精选资源列表,包含了关于深度 RL 的论文、教程、视频和其他各种主题的资源,如 Q-learning、策略梯度、探索、元学习等。它还包括流行的 RL 库和框架的链接,如 TensorFlow、PyTorch 和 OpenAI Baselines,以及其他对 RL 有用的工具和资源。该仓库组织良好,易于浏览,使其成为任何对深度 RL 感兴趣的人的有用资源。
[## GitHub - kengz/awesome-deep-rl: 一个精选的深度强化学习资源列表。
这是一个精选的深度强化学习资源列表。 - GitHub - kengz/awesome-deep-rl: 一个精选的…
github.com](https://github.com/kengz/awesome-deep-rl?source=post_page-----ed6633608cb2--------------------------------#tutorials)
金融领域的深度强化学习精彩资源
本文概述了深度强化学习(RL)在金融领域的应用。文章包括一个精心策划的资源列表,供深入学习金融中的 RL,包括论文、视频和教程。文章讨论了 RL 在金融中的潜在应用,如投资组合管理、算法交易和风险管理。还突出了一些使用 RL 在金融中面临的挑战和局限性,如数据不足和评估 RL 模型性能的困难。
一个精心策划的金融深度强化学习策略与工具列表
参考文献
[1] — Silver, D., Huang, A., Maddison, C. et al. 利用深度神经网络和树搜索掌握围棋游戏。Nature 529, 484–489 (2016). doi.org/10.1038/nature16961
[2] — openai.com/blog/chatgpt/
Python 开发的最佳实践
原文:
towardsdatascience.com/best-practices-for-python-development-bf74c2880f87
设置和使用专业的 Python 仓库
·发表于Towards Data Science ·8 分钟阅读·2023 年 2 月 8 日
–
图片由Christina @ wocintechchat.com拍摄,发布于Unsplash
本文的目标是分享 Python 开发的最佳实践——特别是如何设置、使用和管理 Github 仓库,遵循专业的行业标准。我们将讨论有用的工具,以保持代码整洁且无错误,展示如何设置仓库并包括之前介绍的用于自动 CI(持续集成)检查的工具——最后将所有这些结合在一个示例项目中。请注意,我并不声称这个列表是完整的或唯一的方法。然而,我希望分享我作为软件工程师的专业经验,并确认许多大型软件公司遵循类似的模式。
话虽如此,让我们直接进入重点——希望你觉得这个有用!你可以在这里找到这篇文章的完整代码,并在我们进行时跟随操作。
使用的工具
在本节中,我们将介绍本文使用的工具。
poetry
Poetry 是一个很棒的工具来管理 Python 版本和依赖关系。它使得控制和修复 Python 版本,以及集中管理依赖关系变得简单。在所有这些方法中,我推荐使用 poetry。我在另一篇文章中写了更详细的介绍,但在这里会总结要点。
Poetry 的依赖管理核心是pyproject.toml
文件。对于我们的项目,它如下所示:
[tool.poetry]
name = "Sample Python Project"
version = "0.1.0"
description = "Sample Python repository"
authors = ["hermanmichaels <hrmnmichaels@gmail.com>"]
[tool.poetry.dependencies]
python = "3.10"
matplotlib = "3.5.1"
mypy = "0.910"
numpy = "1.22.3"
pytest = "7.1.2"
black = "22.3.0"
flake8 = "4.0.1"
isort = "⁵.10.1"
我们可以看到一个定义并公开某些项目属性的标题,接着是一段定义所需依赖的文字。
作为“用户”,我们只需在终端中执行 poetry install
,poetry 将自动创建一个安装了所有依赖项的 Python 环境。然后我们可以通过 poetry shell
进入这个环境。
开发者在添加新依赖后,运行 poetry update
。这将生成或更新 poetry.lock
文件,你可以将其视为上述指定依赖项的二进制表示。这个文件也需要被添加到仓库中——而上述安装要求的过程实际上使用了这个文件。
isort
PEP 8,Python 的风格指南,也定义了 如何排序导入。建议创建以下几组:
-
标准库导入(例如
os
、sys
) -
相关的第三方导入(例如
numpy
) -
本地、项目特定的导入(例如,项目的不同文件)
在这些组内,导入应按字母顺序排序。
isort 是一个工具,它消除了我们记住和执行这些操作的必要性。方便的是,isort 和接下来章节中介绍的大多数工具都与 poetry 很好地配合使用,我们甚至在 pyproject.toml
文件中设置了它们的配置。对于我们的用例,我们设置了以下内容:
[tool.isort]
profile = "black"
py_version = 310
multi_line_output = 3
除了 Python 版本,我们告诉 isort 我们将使用格式化工具 black(见下一节),并定义如何处理过长的导入行,参考 re-formatted。
black
black 是一个 Python 代码格式化工具。运行它会根据特定的约定格式化代码。通过让所有开发者使用它,我们强制执行一种特定的、统一的代码风格。考虑一下行缩进、函数后的空行数量等。
设置也由 poetry 管理,我们简单设置:
[tool.black]
line-length = 80
target_version = ["py310"]
即最大行长度为 80,以及目标 Python 版本。
flake8
flake8 是一个代码检查工具。代码检查工具和代码格式化工具密切相关,然而,检查工具检查特定风格和指南的遵循情况,但不进行格式化。flake8 做了几件事,其中之一是检查是否符合前述的 PEP 8 标准。
mypy
mypy 是一个用于 Python 的静态类型检查器。正如你(很可能)知道的那样,Python 是一种 动态类型语言,意味着变量类型是在运行时推断的(与 C++等语言相对)。这种灵活性我们都喜欢,但也有缺点,比如更高的出错概率,没有编译器或类似的东西作为第一道防线。因此,近年来许多努力实际上都集中在使 Python 中的类型检查更严格。 mypy
就是这样的一个类型检查器,它会检查你的代码,看你是否正确使用了变量。大部分工作是自动的,不过你也可以通过注解使某些类型显式(这对于函数参数和返回类型的可见性是推荐的)。
我们可以如下注解函数参数和返回类型:
def foo(x: int, y: int) -> int:
return x + y
如果我们尝试使用错误的参数调用函数,mypy
会提出警告,例如:
foo("a", "b")
我们在单独的 mypy.ini
文件中管理 mypy
设置。这主要是因为一些外部依赖不能进行类型检查,我们需要将它们排除在检查之外(尽管我们可以修复一些)。
pytest
单元测试对任何稍微专业的软件项目都是必不可少的,并且推荐所有人使用。我们将使用 pytest,这是许多 Python 开发者的首选。我在另一篇文章中写了一个 更详细的介绍,有一些后续内容,所以如果你不熟悉它的话,可以参考那里(或者当然是其他任何优秀的教程!)。
单元测试帮助我们发现错误,从而保持代码质量在高水平。
Github Actions
Github Actions 允许自动化和运行仓库中的某些步骤——所有这些都是为了持续集成的精神。通过它们,我们可以创建在特定事件(如拉取请求(PRs))下运行的工作流。我们将在这里使用的工作流实际上是上述介绍的工具的积累——即每当有 PR 打开时,它会运行格式化、检查、类型检查和单元测试等操作,我们期望在合并之前所有这些都能通过——从而保护我们的主分支不被提交任何不干净或有缺陷的代码!
对于这个主题,我想参考我之前的一篇 文章 来进行介绍。
配置仓库
本文不会介绍版本控制系统或从头设置 Github 仓库。相反,期望读者有一些基本知识,我建议参考任何其他教程,例如 官方 Github 教程。这里我们只讨论 Git 中的设置,基本上任何专业的软件仓库都会有这些设置。
从广义上讲,这只有一个:保护主分支。我们不希望任何人未经检查就推送到这里,特别是需要两件事:其他开发者的审批和我们建立的 CI 测试的通过。为此,请转到你的代码库,选择“设置”,然后选择“分支”:
作者截图
然后为你的主分支添加分支保护规则,并启用:
-
合并前要求进行拉取请求
-
需要审批(然后你可以选择必要的审批数量)
-
在合并之前要求状态检查通过
综合起来
这介绍了所有需要的主题。现在我们将把它们结合起来,设置一个示例代码库,并展示每个开发者应遵循的工作流。
示例项目
我们的示例项目将有一个utils
文件夹,包含math_utils.py
和一个相关的单元测试文件(math_utils_test.py
)。在math_utils
中,我们将重新实现一个幂函数以示范:
import numpy.typing as npt
def exponentiate(base: int, exponent: npt.NDArray) -> npt.NDArray:
return base**exponent
因此,exponentiate(2, [1, 2, 3])
将返回[2, 4, 8]
。
我们在测试文件中测试函数的正确性:
import numpy as np
import numpy.typing as npt
import pytest
from utils.math_utils import exponentiate
@pytest.mark.parametrize(
"base, exponent, expected",
[
(2, np.zeros(3), np.ones(3)),
(2, np.linspace(1, 4, 4), np.asarray([2, 4, 8, 16])),
],
)
def test_exponentiate(base: int, exponent: npt.NDArray, expected: npt.NDArray) -> None:
assert np.allclose(exponentiate(base, exponent), expected)
在我们的主文件(main.py
)中,我们将使用它生成前 10 个 2 的幂,并使用matplotlib
绘制:
import matplotlib.pyplot as plt
import numpy as np
from utils.math_utils import exponentiate
def main() -> None:
x = np.linspace(0, 10, 10)
y = exponentiate(2, x)
plt.plot(x, y, "ro")
plt.savefig("plot.png")
if __name__ == "__main__":
main()
这个项目的pyproject.toml
文件如下:
[tool.poetry]
name = "Sample Python Project"
version = "0.1.0"
description = "Sample Python repository"
authors = ["hermanmichaels <hrmnmichaels@gmail.com>"]
[tool.poetry.dependencies]
python = "3.10"
matplotlib = "3.5.1"
mypy = "0.910"
numpy = "1.22.3"
pytest = "7.1.2"
black = "22.3.0"
flake8 = "4.0.1"
isort = "⁵.10.1"
[tool.poetry.dev-dependencies]
[tool.black]
line-length = 80
target_version = ["py310"]
[tool.isort]
profile = "black"
py_version = 310
multi_line_output = 3
此外,我们将matplotlib
排除在 mypy 检查之外,以防止错误,通过生成以下mypy.ini
文件:
[mypy]
python_version = 3.10
[mypy-matplotlib.*]
ignore_missing_imports = True
ignore_errors = True
Github 工作流
然后我们定义以下 Github Actions 工作流:
name: Sample CI Check
on:
pull_request:
branches: [main]
push:
branches: [main]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10.0
uses: actions/setup-python@v3
with:
python-version: "3.10.0"
- name: Install poetry dependencies
run: |
curl -sSL https://install.python-poetry.org | python3 -
poetry install
- name: Sort imports with isort
run: poetry run python -m isort .
- name: Format with black
run: poetry run python -m black .
- name: Lint with flake8
run: poetry run python -m flake8 .
- name: Check types with mypy
run: poetry run python -m mypy .
- name: Run unit tests
run: poetry run python -m py.test
因此,这个工作流在每个新的 PR 和每个合并到主分支的 PR 时运行。
它包括以下步骤:
-
它检查出代码库。
-
它安装了 Python 3.10。
-
它安装了 poetry,并安装了我们的依赖项。
-
然后它运行我们安装的所有检查(注意
poetry run X
与通过poetry shell
进入诗歌环境后执行X
是相同的)。特别地,包括:通过 isort 排序导入,使用 black 格式化代码,使用 flake8 进行 lint 检查,使用 mypy 检查类型,以及运行 pytest。
本地开发者工作流
现在我们描述每个开发者应偶尔执行的工作流,尤其是在提交 PR 之前(对“工作流”的过度使用表示歉意——在上面的部分中表示 Github 概念的分组步骤,而这里仅仅描述开发者执行的步骤列表)。
实质上,我们不想依赖 CI 来发现所有错误,而是尽可能将 PR 推送为“干净”的:这意味着在推送之前,在本地运行 CI 上运行的所有步骤。这通过以下方式实现:
-
运行 isort 以排序导入:
isort .
-
运行 black 以格式化代码:
black .
-
运行 flake8 检查代码:
python -m flake8
-
运行 mypy 进行类型检查:
mypy .
(注意第一次运行可能需要相当长的时间) -
运行所有单元测试:
python -m pytest
结论
在这篇文章中,我们介绍了一些有用的工具,帮助管理、组织和保持 Python 代码的良好状态,并符合专业标准。接着,我们展示了如何设置一个 Git 仓库进行版本控制和代码共享,特别是如何在 CI 中使用之前介绍的工具:即运行某些检查以防止任何不干净或有缺陷的提交到主分支。最后,我们展示了开发人员如何先在本地运行所有这些工具,以最小化 CI 失败的风险。
我希望这篇文章对你未来的私人和专业项目有所帮助。如果你或你的公司正在使用一些很棒的工具,或者觉得我遗漏了什么,请告诉我。感谢阅读!
提示工程的最佳实践
从 Andrew Ng 的新课程中学到的知识和想法
·
阅读 发表在Towards Data Science · 8 分钟阅读·2023 年 5 月 1 日
–
深度学习人工智能最近推出了一个新的ChatGPT 提示工程师课程,由 Isa Fulford 和 Andrew Ng 主讲。这是一个免费的 1.5 小时短期课程,这个课程非常棒。在本文中,我将讨论以下两个部分:
-
第一部分:课程总结
-
第二部分:我对提示工程最佳实践的想法,包括🦜🔗LangChain和各种OpenAI 技巧和窍门。
第一部分:课程总结
该课程包括三个部分:两个提示原则、一个迭代开发过程,以及包括总结、推理、转换、扩展和构建聊天机器人的能力。
1. 两个原则
原则 1:编写清晰且具体的指令
- 策略 1: 使用分隔符,如
py, “““, < >,* `*<tag> </tag>*`*to clearly indicate distinct parts of the input*. This will help better organize your input and avoid prompt injections. In this example, the
分隔符用于指示我们希望总结的文本。
text = f"""
You should express what you want a model to do by \
providing instructions that are as clear and \
specific as you can possibly make them. \
This will guide the model towards the desired output, \
and reduce the chances of receiving irrelevant \
or incorrect responses. Don't confuse writing a \
clear prompt with writing a short prompt. \
In many cases, longer prompts provide more clarity \
and context for the model, which can lead to \
more detailed and relevant outputs.
"""
prompt = f"""
Summarize the text delimited by triple backticks \
into a single sentence.
```{text}```py
"""
- 策略 2: 请求结构化输出。 例如,我们可以要求输出为 JSON 格式,稍后我们可以轻松地将其读取为 Python 中的列表或字典。
- 策略 3: 检查条件是否满足。 我们可以在提示中首先检查假设。考虑边界条件以及模型应该如何处理它们也可能是有帮助的。在这个例子中,文本没有包含指示,我们给出了写“未提供步骤”的指示。
- 策略 4: 少量示例提示。 我们提供成功完成任务的示例,然后要求模型执行该任务。
原则 2: 给模型时间“思考”
- 策略 1: 指定完成任务所需的步骤,并要求以特定格式输出。 有时候,模型或人类直接得出答案很困难。对于复杂任务,逐步指示通常很有帮助。类似于人类工作方式,我们可以要求模型在提供最终答案之前进行一系列相关推理。
- 策略 2: 指导模型在得出结论之前先解决自己的方案。
2. 迭代提示开发
迭代提示开发过程非常类似于我们编写代码的方式。我们尝试一些方法,如果不成功,我们会改进并重试:
-
尝试一些方法
-
分析结果与预期不符的地方
-
澄清指示,给出更多思考时间
-
用一批示例来改进提示
-
重复
在课程示例中,Andrew 演示了如何从产品资料表生成营销文案。他逐步发现并解决了这三个问题,每一步都用改进的提示。
-
问题 1: 文本太长 -> 解决方案:“使用最多 50 个词”。
-
问题 2. 文本关注错误的细节 -> 解决方案:添加预期受众“描述旨在为家具零售商提供…”
-
问题 3. 描述需要一个维度表 -> 解决方案:
“将所有内容格式化为 HTML”
3. 能力
- 总结:许多人使用大型语言模型来总结文本。你可以指定提示,以特定的重点(例如价格和价值)来总结文本:
prompt = f"""
Your task is to generate a short summary of a product \
review from an ecommerce site to give feedback to the \
pricing deparmtment, responsible for determining the \
price of the product.
Summarize the review below, delimited by triple
backticks, in at most 30 words, and focusing on any aspects \
that are relevant to the price and perceived value.
Review: ```{prod_review}```py
"""
当然,你可以编写一个 for 循环来总结多个文本:
reviews = [review_1, review_2, review_3, review_4]
for i in range(len(reviews)):
prompt = f"""
Your task is to generate a short summary of a product \
review from an ecommerce site.
Summarize the review below, delimited by triple \
backticks in at most 20 words.
Review: ```{reviews[i]}```py
"""
response = get_completion(prompt)
print(i, response, "\n")
- 推断: 你可以使用大型语言模型来推断情感、推断情绪、提取产品名称、提取公司名称、推断主题等。你不再需要为特定任务训练模型,大型语言模型可以在没有训练的情况下为你推断所有这些内容。
- **转换中:**大型语言模型可以进行文本转换任务,如语言翻译、拼写和语法检查、语气调整以及格式转换。
- **扩展中:**大型语言模型可以生成定制的客户服务电子邮件,适合每位客户的审查:
- **构建聊天机器人:**我非常感激他们选择使用Panel来构建一个聊天机器人!
Panel 聊天机器人
我写了几篇关于 Panel 的博客文章和 Panel 聊天机器人。请查看我之前关于这个主题的博客文章:
构建问答 PDF 聊天机器人:LangChain + OpenAI + Panel + HuggingFace
如何制作 AI 图像编辑聊天机器人:Stable Diffusion InstructPix2Pix 在 Panel 应用中
如何使用 Docker 将 Panel 应用部署到 Hugging Face
ChatGPT 和 DALL·E 2 在 Panel 应用中
如何将 Panel 可视化仪表板部署到 GitHub Pages
第二部分:我的思考
这是一个很棒的课程,介绍了 ChatGPT 提示工程的许多最佳实践和能力。我特别喜欢其中的两个指导原则。还有许多其他有趣的问题,例如如何处理长令牌、如何将 LLMs 与其他工具配合使用、如何处理速率限制、如何流式传输完成等。基于这门令人惊艳的课程,我想在两个思考领域进行扩展:一个是 LangChain,另一个是 OpenAI 的技巧和窍门。
1. 🦜🔗 LangChain
✨ **是否在开始写清晰具体的指导时遇到困难?**LangChain 提供许多提示模板供您使用。您不必每次都从头编写指导。
✨ **您希望获得比纯文本更结构化的信息吗?**LangChain 提供输出解析器,帮助结构化语言模型的响应。
✨ 你的文本超出令牌限制吗? 例如,如果你想总结或询问一本 500 页的书。你该怎么办?使用map_reduce
、refine
、map-rerank
,LangChain 允许你将文本分成多个批次并逐个处理:
-
map_reduce
:它将文本分成多个批次,将每个批次和问题分别输入 LLM,根据每个批次的回答得出最终答案。 -
refine
:它将文本分成多个批次,将第一个批次输入 LLM,然后将回答和第二个批次一起输入 LLM。通过遍历所有批次来优化回答。 -
map-rerank
:它将文本分成多个批次,将每个批次输入 LLM,返回回答问题的完整程度评分,并根据每个批次中高分的回答得出最终答案。
✨ 你想保留聊天历史记录吗? LangChain 通过提供几种处理聊天历史记录的选项来解决这个问题——保留所有对话、保留最新的 k 次对话、总结对话,以及上述选项的组合。
✨ 你想将 LLM 与另一个 LLM 或其他工具一起使用吗? LangChain 可以将各种 LLM 链在一起,并与一系列工具(如 Google 搜索、Python REPL 等)一起使用。
✨ 你想让提示自动生成提示,即自动 GPT 吗? LangChain 在“西部世界”模拟、Camel、BabyAGI 和 AutoGPT 上有实现。查看我之前的博客文章 4 种你需要了解的自主 AI 代理。
要了解 LangChain 的工作原理,请查看我之前的博客文章和我的视频。
2. OpenAI 技巧与窍门
OpenAI Cookbook 提供了许多有用的技巧和窍门供我们使用。
✨ 如何避免速率限制错误? 你可以通过指数退避策略重试。查看这里的示例。
使用指数退避策略重试是指在遇到速率限制错误时进行短时间的休眠,然后重试未成功的请求。如果请求仍未成功,休眠时间将增加并重复该过程。此过程将持续直到请求成功或达到最大重试次数。
✨ 如何在速率限制下最大化批处理的吞吐量? 在处理大量批数据时,两种方法:1) 主动添加请求之间的延迟,2) 通过传递字符串列表来批处理请求。查看这里的示例。
✨ 如何流式传输完成结果? 只需设置stream=True
即可流式传输完成结果。查看这里的示例。
默认情况下,当您请求来自 OpenAI 的完成时,整个完成内容会在发送回一个单独的响应之前生成。如果您生成的完成内容较长,等待响应可能需要几秒钟时间。为了更快地获得响应,您可以在生成过程中‘流式传输’完成内容。这样您可以在完成内容完全生成之前开始打印或处理完成内容的开头部分。
结论
本文中,我总结了 ChatGPT Prompt Engineering for Developers 课程的内容。此外,我还分享了关于提示工程最佳实践的想法,包括使用🦜🔗LangChain 以及来自 OpenAI 的一些技巧。希望本文对您有所帮助!如果您还有其他提示工程的最佳实践,欢迎分享。
照片由Eric Krull提供,来自Unsplash
. . .
作者:Sophia Yang,2023 年 4 月 30 日
Sophia Yang 是一位高级数据科学家。欢迎关注我的LinkedIn、Twitter和YouTube,加入 DS/ML读书俱乐部 ❤️
如何利用 ChatGPT 更快地学习数据科学,即使你已经很先进
原文:
towardsdatascience.com/best-use-chatgpt-learn-data-science-easy-beginner-b10299c49c4c
讨论数据科学在 AI 驱动的未来中的相关性,并提供逐步指南,说明如何利用 AI 工具有效学习数据科学
·发表于Towards Data Science ·阅读时间 10 分钟·2023 年 7 月 1 日
–
图片来源:作者
目录
• 数据科学还会有意义吗?
• 为什么要利用 AI 学习数据科学?
• 如何通过 AI 实际学习数据科学
-
第 1 步:制定路线图
-
第 2 步:将 ChatGPT 设计为我的导师
-
第 3 步:制定学习计划
-
第 4 步:尝试使用高级工具如 AutoGPT
-
第 5 步:做项目
-
初学者项目概述
-
高级从业者项目概述
• 结论
一切在短时间内发生了变化。AI 工具,如 ChatGPT 和 GPT-4,正在接管并完全改变教育和学习技术技能的方式。我觉得我需要写这篇文章来讨论一些重要的问题:
-
在人工智能的新纪元中,学习数据科学仍然重要吗?
-
如果是的话,利用现有的新技术学习这些技能的最佳方式是什么?如果我现在必须重新开始,我该怎么做?
-
数据科学的未来是什么样的?
数据科学还会有意义吗?
随着 AI 的不断发展,数据科学家会变得过时,还是他们的角色会比以往任何时候都更重要?
从个人的角度来看,我仍然觉得我对客户的价值要比单纯的 AI 大,而且我能够借助这些新工具(至少)将工作产出翻倍。现在,我觉得 AI 不会取代我的工作,但从现实来看,未来比以往任何时候都更不确定。
在你对工作消失感到恐惧之前,让我们看一下以下场景:在某个未来,你经营的公司让 AI 为你做分析工作。
你希望谁来运行 AI、提示它并监督它?你希望由一个有数据科学或软件工程背景的人来监督这些程序,还是希望由一个没有培训的人来做?
图片由 作者 提供
我认为答案非常明显。你会希望由一个有经验和数据处理知识的人来管理这些 AI 系统。
短期内,这种情况希望是理论上的。但这确实让我对这些技能的一些方面具有韧性充满信心。
即使未来数据科学家的工作变得更少涉及实际编码,我仍然认为从这个领域中获得的技能在与 AI 高度集成的世界中会非常有用。AI 扎根于数据科学,在某种程度上,我们比其他职业更融入这个系统。
此外,AI 仍然会出现幻觉,我们将需要尽可能多的有良好知识的人来监督它并充当反馈回路。
虽然我对数据科学家的未来工作不确定,但有一件事我很确定:数据、分析和 AI 将会在未来成为我们生活中更重要的一部分。你不觉得学会这些领域的人也将更有相对成功的机会吗?
为什么你应该利用 AI 来学习数据科学?
如果我不认为学习数据科学仍然值得,这篇文章就到此为止。明确来说,我仍然认为这绝对值得。但说实话,单纯学习数据科学已经不够了。你还需要学习如何使用新的 AI 工具。
有趣的是,学习数据科学和这些 AI 工具比单独学习数据科学要容易。让我来解释一下。
恰好,你正好在一个完美的时机来同时学习这两个领域。
图片由 作者 提供
如果你通过利用现有的新 AI 工具来学习数据科学,你将获得双重好处:
-
从数据领域和 AI 一起学习,你会获得更加个性化和迭代的教育体验。
-
同时你也可以提升在 AI 工具方面的技能。
如果我的计算正确,你可以付出一半的工作量获得双倍的好处。
如果使用 AI 工具的能力能帮助你找到工作并做得更好,那么知道如何使用它们总比忽视它们要好。在过去三个月里,我感觉自己学到的数据科学知识比过去三年加起来还多。我将大部分归因于使用 ChatGPT。
图片来自 作者
那么,你如何做到这一点呢?你如何利用 AI 学习数据科学?
如何实际利用 AI 学习数据科学
如果我必须重新开始并且这些工具都可用的话,这正是我会做的。
第 1 步:制定路线图
我会制定一个路线图。你可以通过查看其他课程或与 ChatGPT 对话来完成。你可以直接要求它根据你的学习目标制定一个数据科学学习路线图。
图片来自 作者
如果你没有学习目标,你也可以让它为你创建一个列表,然后你可以找到你喜欢的选项。
如果你想了解更多关于制定教育路线图的信息,查看这篇文章,其中我更深入地探讨了这个主题。
第 2 步:设计 ChatGPT 成为我的导师
我会设计 ChatGPT 成为我的导师。你可以用 GPT-4 创建角色,这可能是我最喜欢的功能。你可以使用这样的提示:
在这种情况下,你是世界上最好的数据科学老师之一。请以能帮助我最好地理解该领域的方式回答我的数据科学问题。请使用许多现实世界或实际的例子,并提供相关的练习题。
第 3 步:制定学习计划
我几乎肯定有偏见,但我认为免费的课程或付费课程,比如我的,仍然是构建学习结构的好选择。当你学习课程时,你可以请你的 ChatGPT 导师给你示例、扩展话题并提供练习题。
第 4 步:尝试像 AutoGPT 这样的高级工具
如果你在 AI 领域稍有进阶,你可以使用像 AutoGPT 这样的工具为你生成课程大纲。我可能会尝试这样做,看看结果如何。如果我这样做,我会在 我的 GitHub上分享。我还 在我的播客中采访了 GPT-4,在其中更深入地探讨了 GPT-4 的内容。
第 5 步:做项目
如果你已经对编码感到舒适,你可以跳过到做项目的阶段。我个人通过与 ChatGPT 一起做项目学到了很多。我为 房地产 Kaggle 挑战赛 做了这个。
如果这是你的第一个项目,只要求它做事情是可以的,但随着进展,你会希望更加有意图和互动地使用它。
让我们比较一下初学者与高级从业者在项目学习上的方法。
初学者项目步骤
初学者项目步骤的一个例子可能如下所示:
-
你给 ChatGPT 提供数据的行和列信息。
-
你要求它创建样板代码以探索数据中的空值、异常值和正态性。
-
你询问它应该对这些数据提出哪些问题。
-
你要求它清理数据并为你构建模型,以对因变量进行预测。
虽然它可能看起来在为你完成所有工作,但你仍然需要在你的环境中运行这个项目。你还在过程中进行提示和问题解决。
没有保证它会像复制别人项目时那样有效,所以我觉得这对于参与是一种很好的学习中间地带。
高级从业者的项目步骤
现在,让我们想象一下更高级的从业者将如何使用这些:
1. 你可以遵循生成样板代码的相同步骤,但这应该有所扩展。因此,你可能想要更多地进行数据的动手探索和假设测试。也许,选择一个或两个你希望通过数据和描述性统计分析的问题,并开始分析它们。
图片由 作者 提供
2. 对于做过一些项目的人,我建议自己生成部分代码。比如,你在 plotly 中制作了一个简单的条形图。你可以将它提供给 ChatGPT,要求其重新格式化、更改颜色或比例等。
图片由 作者 提供
通过这样做,你可以迅速迭代可视化,并实时查看代码的不同调整如何改变图表。这种即时反馈对学习非常有帮助。
图片由 作者 提供
3. 我也认为复习这些变化并查看它们是如何产生的很重要。如果你不理解某些内容,可以立即向 ChatGPT 询问其所做的事情。
4. 更高级的从业者还应更加关注数据工程和生产代码的管道。这些仍然需要你相当亲自操作。我发现 ChatGPT 能在一定程度上帮助我,但我仍需要自己进行大量的调试。
5. 在这之后,你可能想让 AI 运行一些算法并进行参数调优。说实话,我认为这将是数据科学中自动化最快的部分。我认为对于普通从业者,参数调优的回报会递减,但可能对顶级 Kagglers 不会。
你应该将时间集中在特征工程和特征创建上。这也是 AI 模型可以帮助但无法完全掌握的内容。在你获得一些不错的模型后,看看你可以添加哪些数据、创建哪些特征,或进行哪些转换以提高结果。
在这个拥有先进人工智能工具的世界中,我认为比以往任何时候都更重要的是做项目。你需要构建东西并分享你的工作。幸运的是,借助这些 AI 工具,这变得比以往任何时候都更容易。制作一个 web 应用变得更简单。与以前未曾使用过的新包合作变得更容易。
图片由 作者 提供
我强烈建议你在数据科学工作中创造现实世界的影响和有形的成果。这将成为与他人使用这些工具学习和构建时的区分新方式。
结论
世界在变化,数据科学也是如此。你准备好迎接挑战并通过你的项目产生现实世界的影响了吗?
我之前提到过,我认为我们工作的方式正在改变。我认为这是一个所有领域,包括数据科学,都充满不确定的时代。
另一方面,我认为数据科学是技术和问题解决技能的绝佳结合,能够很好地适应几乎任何新领域或世界。
我在我的播客中详细讨论了 我认为数据科学是最接近纯创业的领域之一。我认为在一个被人工智能改变的世界里,我们需要尽可能地利用这种创业精神。
直到下次,祝你在数据科学之旅中好运!
如果你喜欢这篇文章,记得在 Medium 上关注我,获取更多类似内容,或者 通过电子邮件订阅我。你还可以将这篇文章分享给你感兴趣的数据科学网络!
如果你喜欢关于数据科学、机器学习和人工智能的有趣且富有信息的视频,查看我的 YouTube 频道,我在这里提供评论、教程和其他教育视频。
要获取我内容创作和数据科学行业额外学习资源的每周更新,注册我的新闻通讯 the Data Dribble!
另外,考虑通过 注册会员 支持我和其他数千名作家。
[## 使用我的推荐链接加入 Medium - Ken Jee
作为 Medium 会员,你的会员费用的一部分会分给你阅读的作家,而且你可以全面访问每一篇故事…
Beta 分布:贝叶斯标定的基石
原文:
towardsdatascience.com/beta-distributions-a-cornerstone-of-bayesian-calibration-801f96e21498
探索 Beta 分布在贝叶斯推断中的多样性
·发表于 Towards Data Science ·阅读时间约 9 分钟·2023 年 10 月 28 日
–
图片由 Google DeepMind 提供,来源于 Unsplash
嗨,大家好!
分布乍看起来可能并不是一个复杂的概念,但它们在数据分析和统计领域中却非常强大和基础。这样想:如果你收集了 50 件不同尺码和颜色的衬衫,你将创建一个颜色分布,一个尺码分布,甚至可能还有一个“这件衬衫有多让你烦”分布(当然这是开玩笑)。重点是,只要你有一个可以测量的类别,就有一个分布等待被探索。
那么,什么是分布呢?本质上,它是一种展示某个类别如何在概率或可能性范围内分布的方式。你可以从你拥有的数据或你对特定主题的了解来搞清楚这一点。你可能听说过像正态分布、偏斜分布、长尾分布等术语——这些术语描述了数据点的形态。
今天我想谈谈 Beta 分布,特别是它在贝叶斯标定中的应用。贝叶斯标定是一种通过新数据更新贝叶斯推断的方法,以找到模型参数的最佳拟合值。它考虑了关于这些参数的先验信息和给定这些参数时观察到的数据的可能性。
在我们深入探讨贝塔分布的贝叶斯校准之前,让我们先了解一些技术细节。掌握了这些基础知识后,我们将通过一个有趣的场景来探讨贝叶斯校准与贝塔分布。
贝塔分布
贝塔分布,记作 Beta(α, β),是一个由两个参数定义的概率分布。其概率密度函数(pdf)表达如下:
作者提供的图像
在这个方程中,α和β代表超参数,重要的是要注意它们必须始终大于 0。此外,本文将专注于整数值。
在我们开始之前,让我们添加一个视觉辅助工具,查看一系列不同的贝塔分布概率密度函数(PDF),其α和β从 0.5 到 50 不等。
作者提供的图像
现在我们对贝塔分布有了一个清晰的了解,让我们进入一个具体的场景。
我们的场景
我们虚构的公司 MM 制造业,以生产精密权重而闻名。他们的系统一流,确保大多数产品的校准几乎完美。然而,最近出现了一个不寻常的问题——客户对权重不完美的投诉激增。对此,MM 制造业引入了一个额外的人为验证层,以确保每个发货给客户的权重都完美无瑕。
但为了分析实际生产权重的趋势,他们要求数据科学团队分析遇到这些不规则权重的可能性,更重要的是监测这些情况的分布,以便获得改善性能的洞察。幸运的是,所有的权重都在传送带上记录了其准确值。
数据科学团队的方法根植于贝叶斯校准。每个月,他们都会更新一个贝塔分布概率密度函数(pdf)以评估权重的异常情况及其随时间的变化。为此,他们使用传送带上的数据,作为观察值来最终确定后验分布。他们还需要建立一个先验分布,这可以基于历史数据、领域知识,或一个非特定的、非信息性的分布。
对于可观察数据或似然估计中的贝塔分布的α(α)和β(β)值,他们采用以下策略:
α = 正确校准的权重数量 + 1(确保α > 0)
β = 校准错误的权重数量 + 1(确保β > 0)
至于他们选择的先验,他们最初选择一个无信息量的先验,表示为 Beta(1,1)(如下图所示的均匀分布),这最小化了先验对后验的影响,并主要依赖于观察数据。
作者提供的图片
可能值得稍微偏离一下,说明先验在此背景下的作用
先验的作用
在贝叶斯推断的领域,先验是你可以融入你观点的地方——虽然不是你的意见,而是你在先前观察的基础上形成的知情观点。它有各种形式,从高度信息量的到完全无信息量的,它在塑造后验分布中扮演了关键角色。
在我们的贝叶斯校准过程中,后验分布受似然和先验的比例影响。
后验分布 ∝ 似然 × 先验
此外,Beta 分布作为贝叶斯推断中许多分布的 共轭先验。这意味着,如果你处理像 伯努利、二项分布、负二项分布 和 几何分布 这样的分布,对于似然函数,结果的后验也将属于 Beta 分布家族。在我们的案例中,异常权重的似然分布基于类似于二项分布的成功失败场景。
现在,让我们探索先验的选项,考虑分布的性质:
无信息量先验
无信息量先验对后验的影响最小,适用于你对分布的外观几乎没有信息的情况。在 Beta 分布中,无信息量先验的例子包括:
-
Beta(0.5, 0.5) 或 Jeffreys 先验
-
Beta(1, 1) 或均匀先验。
当你希望似然成为主导因素,而先验的影响较小时,这种选择是理想的。
轻度信息量先验
轻度信息量先验向后验传达了一些信息。在 Beta 分布中,轻度信息量先验的选项包括 Beta(2, 2) 和 Beta(1, 2)。
这些先验基于部分知识对后验提供了一定的提示。
信息量先验
当你拥有大量关于分布的信息,并希望基于新的观察进行细微调整时,信息量先验发挥作用。在 Beta 分布的背景下,信息量先验可以是 Beta(10, 10) 和 Beta(20, 2) 等较大值。这些先验在塑造后验方面具有更大的权重。
在更好地理解不同类型的先验及其作用后,让我们回到特定场景,将 MM Manufacturing 的异常重量映射到可观察的后验分布中。
Python 实现
所以让我们使用 Beta 分布先验和贝叶斯校准进行一些异常检测,以便更清晰地理解这一概念。
首先,为了模拟输送带产生的重量,我们将为下面两个场景各生成 500 个数据点的合成数据。
场景 1:第一次贝叶斯校准
对于第一次校准,我们使用了一个非信息先验,记作 Beta(1,1)。我们定义了似然 Beta(α, β),其中 α 和 β 为:
α = 正确校准的重量 + 1(因为 α 应该大于 0)
β = 错误校准的重量 + 1(同样,为了没有事件,β > 0)
我们还生成了合成数据,其中如果重量在 4.85 到 5.15 之间(含)则视为正确校准的 5 磅重量,如果重量超出这些值则视为校准不正确。
我们最初生成了 10% 异常值的数据。
import random
import matplotlib.pyplot as plt
from scipy.stats import beta
# Simulated data: 500 observations with 90% normal weight and 10% anomalous weights
np.random.seed(42)
normal_instances = [random.uniform(4.85, 5.15) for i in range(450)]
anomalous_instances_1 = [random.uniform(3, 4.85) for i in range(25)]
anomalous_instances_2 = [random.uniform(5.15, 6) for i in range(25)]
data = np.concatenate((normal_instances, anomalous_instances_1, anomalous_instances_2))
# Initial prior belief using a Beta distribution (uninformative uniform prior)
prior_alpha = 1
prior_beta = 1
# Beta Distribution as inferred by Observed data
likelihood_alpha = len(data[(data >= 4.85) & (data <= 5.15)]) + 1
likelihood_beta = len(data) - likelihood_alpha + 1
# Calculate posterior parameters based on observed data and prior
posterior_alpha = prior_alpha + likelihood_alpha
posterior_beta = prior_beta + likelihood_beta
# Plot the prior, likelihood and posterior Beta distributions
x = np.linspace(0, 1, 1000)
prior_distribution = beta.pdf(x, prior_alpha, prior_beta)
likelihood_distribution = beta.pdf(x, likelihood_alpha, likelihood_beta)
posterior_distribution = beta.pdf(x, posterior_alpha, posterior_beta)
plt.plot(x, prior_distribution, label='Prior Distribution')
plt.plot(x, likelihood_distribution, label='Likelihood Distribution')
plt.plot(x, posterior_distribution, label='Posterior Distribution')
plt.title('Bayesian Calibration for Anomalous Weight Detection')
plt.xlabel('Anomaly Probability')
plt.ylabel('Probability Density')
plt.legend()
plt.show()
如预期的那样,我们的后验几乎完全像似然一样,因此这次校准并不多。这也显示了均匀先验对后验的影响。
图片来源:作者
下个月我们有更多数据,现在我们的先验是上个月的后验,类似地,我们可能获得了一些内部系统的信息,并相应地调整了先验。
场景 2:贝叶斯校准更新
假设 MM Manufacturing 关注并对系统进行了某些更改,现在只有 6% 的重量是异常的。现在我们有了更具信息量的先验,基于我们之前的数据的后验。
# Simulated data: 500 observations with 94% normal weight and 6% anomalous weights
np.random.seed(42)
normal_instances = [random.uniform(4.85, 5.15) for i in range(470)]
anomalous_instances_1 = [random.uniform(3, 4.85) for i in range(15)]
anomalous_instances_2 = [random.uniform(5.15, 6) for i in range(15)]
data = np.concatenate((normal_instances, anomalous_instances_1, anomalous_instances_2))
# Initial prior belief about normal behavior using a Beta distribution
prior_alpha = posterior_alpha
prior_beta = posterior_beta
# Beta Distribution as inferred by Observed data
likelihood_alpha = len(data[(data >= 4.85) & (data <= 5.15)]) + 1
likelihood_beta = len(data) - likelihood_alpha + 1
# Calculate posterior parameters based on observed data and prior
posterior_alpha = prior_alpha + likelihood_alpha
posterior_beta = prior_beta + likelihood_beta
# Plot the prior, likelihood and posterior Beta distributions
x = np.linspace(0, 1, 1000)
prior_distribution = beta.pdf(x, prior_alpha, prior_beta)
likelihood_distribution = beta.pdf(x, likelihood_alpha, likelihood_beta)
posterior_distribution = beta.pdf(x, posterior_alpha, posterior_beta)
plt.plot(x, prior_distribution, label='Prior Distribution')
plt.plot(x, likelihood_distribution, label='Likelihood Distribution')
plt.plot(x, posterior_distribution, label='Posterior Distribution')
plt.title('Bayesian Calibration for Anomalous Weight Detection')
plt.xlabel('Anomaly Probability')
plt.ylabel('Probability Density')
plt.legend()
plt.show()
这次我们看到了先验对后验的影响以及分布的定义程度。先验、后验和似然之间的关系在这里更为清晰可见。
图片来源:作者
考虑到上述两种场景,很明显,这些结果的多样性可以被用来获取系统性能的洞察,进行比较以观察改进,并在广泛的时间范围内改进数据校准。
Beta 分布的吸引力在于其在定义各种分布中的适应性和多功能性,而贝叶斯校准的优势在于其灵活地接纳和整合复杂模型参数的能力。
让我们讨论一些其他应用。
其他应用
关于贝塔分布的讨论如果不提及其广泛的应用将是不完整的。它不仅仅用于贝叶斯推断和校准领域,如我们在成功-失败情境中所看到的。贝塔分布在 A/B 测试中也发挥着重要作用,它帮助建模不同网页或应用版本的转换率——这一情境类似于成功和失败,只是处于不同的背景中。
此外,贝塔分布在风险分析中也可以发挥作用,其中概率方法对于估计项目成功的可能性非常有帮助。
总结
总之,贝塔分布,特别是当应用于贝叶斯校准的背景下,是一个极其有价值且优雅的概念。它在处理模型的复杂性方面表现出色,同时提供了一种直观的决策方法。此外,它的相关性扩展到各个行业的广泛应用,在这些应用中,它在获得对系统校准过程中的性能的宝贵洞察方面发挥了关键作用。
贝塔分布不仅是一个理论概念;它是数据科学家工具箱中的一个实用而宝贵的资产。理解它的应用和适应性为增强决策和改善系统性能开辟了新的视角。随着你在数据科学领域的深入探索,请记住贝塔分布在处理复杂模型和在各个行业中获得宝贵洞察方面的重要性。
一种可视化贝塔分布的酷炫方式
贝塔分布依赖于两个参数。
mathlets.org](https://mathlets.org/mathlets/beta-distribution/?source=post_page-----801f96e21498--------------------------------)
不要忘记阅读我其他一些引人入胜的文章!
选择通往显著结果的路径
towardsdatascience.com ## 探索反事实洞察:从相关性到因果性的数据分析
在数据科学中使用反事实进行知情决策
towardsdatascience.com
欢迎在评论中分享你的想法。
大规模生产自主驾驶中的 BEV 感知
原文:
towardsdatascience.com/bev-perception-in-mass-production-autonomous-driving-c6e3f1e46ae0
小鹏汽车的 XNet 配方
·发表于数据科学前沿 ·阅读时间 9 分钟·2023 年 6 月 19 日
–
本博客文章基于在 2023 年 CVPR 于温哥华举行的端到端自主驾驶研讨会上的邀请演讲,演讲题为“中国大规模生产自主驾驶的实践”。主旨演讲的录音可以在这里找到。
BEV(鸟瞰视角)感知在过去几年中取得了巨大进展。它直接感知自主驾驶车辆周围的环境。BEV 感知可以被看作是一个端到端感知系统,也是实现端到端自主驾驶系统的重要一步。我们将端到端自主驾驶系统定义为完全可微分的管道,这些管道以原始传感器数据作为输入,输出高层次的驾驶计划或低层次的控制动作。
[## CVPR 2023 自主驾驶研讨会 | OpenDriveLab
我们很自豪地宣布今年与我们的合作伙伴共同推出四个全新挑战 - 以视觉为中心…
自主驾驶社区见证了采用端到端算法框架的方法的快速增长。我们将从基本原理讨论端到端方法的必要性。然后,我们将回顾将 BEV 感知算法部署到大规模生产车辆的努力,以小鹏的 BEV 感知架构 XNet 为例。最后,我们将对 BEV 感知的未来进行头脑风暴,以实现完全端到端的自主驾驶。
端到端系统的必要性
在解决任何工程问题时,通常需要使用分而治之的方法来快速找到实际解决方案。这种策略涉及将大问题拆解成较小的、相对明确的组件,这些组件可以独立解决。虽然这种方法有助于快速交付完整产品,但也增加了被困在局部最优解的风险。为了达到全局最优解,所有组件必须以端到端的方式一起优化。
分而治之与端到端的性能增长曲线(图表由作者制作)
80-20 法则强化了这样一个概念:80%的期望性能可以通过仅 20%的总努力来实现。使用分而治之的方法的优势在于它允许开发者用最小的努力快速工作。然而,这种方法的缺点是它通常会在 80%的标记处导致性能天花板。为了克服性能限制并摆脱局部最优,开发者必须将某些组件一起优化,这也是开发端到端解决方案的第一步。这个过程必须重复几次,不断打破性能天花板,直到实现一个完整的端到端解决方案。最终形成的曲线可能会呈现为一系列的 S 形曲线,直到接近全局最优解。一个朝着端到端解决方案努力的例子是 BEV 感知算法的开发。
感知 2.0:端到端感知
在传统的自动驾驶堆栈中,2D 图像被送入感知模块以生成 2D 结果。然后使用传感器融合来推理来自多个摄像头的 2D 结果,并将这些结果提升为 3D。生成的 3D 对象随后被发送到下游组件,如预测和规划。
BEV 感知本质上是端到端感知(图像由作者制作)
然而,传感器融合步骤需要大量的手工规则来融合来自多个摄像头流的感知结果。每个摄像头只能感知要观察对象的一部分,因此结合获得的信息需要仔细调整融合逻辑。我们本质上是在通过工程师的头脑进行反向传播。此外,开发和维护这些规则会造成一系列复杂问题,导致在复杂的城市环境中出现许多问题。
为了克服这个挑战,我们可以应用鸟瞰图(BEV)感知模型,它允许我们在 BEV 空间中直接感知环境。BEV 感知堆栈将两个独立的组件结合成一个单一的解决方案,从而消除了脆弱的人为制定逻辑。BEV 感知本质上是一个端到端感知解决方案。这标志着朝着端到端自动驾驶系统迈出的关键一步。
XNet: Xpeng Motors 的 BEV 感知堆栈
Xpeng 的 BEV 感知架构代号为 XNet。它首次公开介绍是在 2022 年 Xpeng 1024 科技日 上。下方的可视化图展示了车载 XNet 感知架构的实际运行情况。中间的红色车辆代表自动驾驶车辆在环形交叉路口导航。周围的静态环境完全由车载感知系统检测,无需使用高清地图。我们可以观察到 XNet 精确地检测了车辆周围的各种动态和静态物体。
Xpeng AI 团队在两年前(2021 年初)开始对 XNet 架构进行实验,并经过多次迭代后达到了现在的形式。我们利用卷积神经网络(CNN)主干生成图像特征,同时通过变换器结构将多摄像头特征转置到 BEV 空间。具体而言,使用了交叉注意力模块。来自多个过去帧的 BEV 特征随后与自我姿态——在空间和时间上——融合,以解码融合特征中的动态和静态元素。
XNet 结果与架构
以视觉为中心的 BEV 感知架构提高了大规模部署自动驾驶解决方案的性价比,减少了对更昂贵硬件组件的需求。准确的 3D 检测和速度展现了冗余的新维度,减少了对激光雷达和雷达的依赖。此外,实时 3D 可感知环境减少了对高清地图的依赖。这两种能力都显著地有助于更可靠且具有成本效益的自动驾驶解决方案。
XNet 的挑战
将这样的神经网络部署到生产车辆上存在多个挑战。首先,训练 XNet 需要数百万个多摄像头视频片段。这些片段涉及约十亿个需要标注的物体。根据当前的标注效率,大约需要2,000 人年来完成标注。不幸的是,这意味着对于 Xpeng 约 1000 人的内部标注团队来说,这项任务需要大约两年才能完成,这是不可接受的。从模型训练的角度来看,使用一台机器训练这样的网络将需要接近一年。此外,在 NVIDIA Orin 平台上未经优化地部署这样的网络将消耗一个芯片的 122%计算能力。
所有这些问题都对成功训练和部署如此复杂且庞大的模型提出了挑战。
自动标注
为了提高标注效率,我们开发了一个高效的自动标注系统。这个离线传感器融合堆栈将效率提升了多达 45,000 倍,使我们能够在 17 天内完成原本需要 200 人年才能完成的标注任务。
自动标注系统显著提升标注效率
以上是基于激光雷达的自动标注系统,我们还开发了一个完全依赖视觉传感器的系统。这使我们能够标注没有激光雷达的客户车队获得的片段。这是数据闭环的关键部分,并增强了自我进化感知系统的发展。
大规模训练
我们从两个角度优化了 XNet 的训练管道。首先,我们应用了混合精度训练和操作优化技术,以简化单节点上的训练过程,将训练时间缩短了 10 倍。接下来,我们与阿里云合作,建立了一个计算能力为 600 PFLOPS 的 GPU 集群,使我们能够将训练从单机扩展到多机。虽然这一过程并不简单,因为我们需要仔细调整训练程序以实现接近线性的性能扩展,但它进一步减少了训练时间。总体而言,我们将 XNet 的训练时间从 276 天减少到仅 11 小时。请注意,随着我们将更多数据加入训练过程,训练时间自然会增加,这需要额外的优化。因此,扩展优化仍然是一个持续而关键的工作。
XNet 大规模并行训练管道的优化
在 Orin 上的高效部署
我们注意到,如果没有任何优化,在 Nvidia Orin 芯片上运行 XNet 需要使用芯片计算能力的 122%。通过分析开头展示的分析图,我们观察到变换器模块消耗了大部分的运行时间。这是可以理解的,因为在 Orin 芯片的初始设计阶段,变换器模块并没有得到足够的关注。因此,我们需要重新设计变换器模块和注意力机制以支持 Orin 平台,从而实现了 3 倍的加速。
在 Orin 平台上对基于变换器的 XNet 进行极致优化
为了进一步优化,我们通过剪枝优化了网络,结果实现了额外的 2.6 倍加速。最后,通过在 GPU 和 DLA 之间进行负载均衡,我们实现了进一步的 1.7 倍加速。
通过这些优化技术,我们将 XNet 的 GPU 利用率从 122%降低到仅 9%。这使我们能够在 Orin 平台上探索新的架构可能性。
自我进化数据引擎
通过实施 XNet 架构,我们现在可以启动数据驱动的迭代以提升模型性能。为此,我们首先在汽车上识别角落案例,然后向客户车队部署可配置触发器以收集相关图像。随后,我们根据自然语言的简短描述或图像本身从收集的数据中检索图像。在此过程中,我们利用大型语言模型的最新进展来提高数据集策划和注释的效率。
数据引擎有助于提高 XNet 性能
通过 XNet 架构和数据引擎,我们创建了一个可扩展且自我演化的感知系统。
未来展望
最新发布的 Xpeng Highway NGP 2.0 统一了高速公路和城市驾驶解决方案,让用户可以在不同城市放置一个定位点,从头到尾享受流畅的体验。这种统一是通过 XNet 实现的,XNet 为所有场景的统一堆栈提供了坚实的基础。最终目标是实现点对点用户体验的端到端自动驾驶。
为了使自动驾驶系统具备端到端可微分性,另一个关键缺失的部分是基于机器学习的规划堆栈。基于学习的规划解决方案大致可以分为模仿学习或强化学习方法。大型语言模型(LLMs)的最新进展也为这一重要主题的发展带来了巨大潜力。以下的Github repo是端到端自动驾驶新兴领域相关工作的实时集合。
[## GitHub - OpenDriveLab/End-to-end-Autonomous-Driving: 所有你需要的端到端自动驾驶资源
所有你需要的端到端自动驾驶资源。通过贡献于 OpenDriveLab/End-to-end-Autonomous-Driving 的发展…
github.com](https://github.com/OpenDriveLab/End-to-end-Autonomous-Driving?source=post_page-----c6e3f1e46ae0--------------------------------)
重点总结
-
分而治之能够以 20%的努力达到 80%的性能。端到端方法旨在突破 80%的性能上限,但可能需要更大的成本。
-
XNet 是一个端到端的感知系统,是迈向端到端全栈解决方案的重要一步。根据 80-20 法则,它需要显著的工程投入(80%)。
-
XNet 所需的大量注释需要自动注释,因为人工注释不可行。自动标签系统可以提高 45000 倍的效率。
-
大规模训练需要优化单机训练,并从一台机器扩展到多台机器。
-
在 Nvidia Orin 平台上部署 XNet 需要重构变压器模块。
参考资料
- 针对在中国部署大规模生产自动驾驶所面临的独特挑战,请参阅以下链接。这也是在 CVPR 2023 上的邀请讲座的一部分。
以及 Xpeng 对这些问题的回答
medium.com](https://medium.com/@patrickllgc/challenges-of-mass-production-autonomous-driving-in-china-407c7e2dc5d8?source=post_page-----c6e3f1e46ae0--------------------------------)
- 一项关于基于 Transformer 的 BEV 感知算法的学术研究回顾。
- Xpeng 1024 科技日 2022:
www.youtube.com/watch?v=0dEoctcK09Q
注意在模型评估中数据的不可靠性:一个关于 Flan-T5 的 LLM 提示选择案例研究
除非你清理测试数据,否则你可能会为你的 LLM 选择次优提示(或通过模型评估做出其他次优选择)。
·
关注 发布于 Towards Data Science ·10 min 阅读·2023 年 6 月 16 日
–
版权:Arthur Osipyan, Unsplash
作者:Chris Mauck, Jonas Mueller
可靠的模型评估是 MLops 和 LLMops 的核心,指导关键决策,例如选择哪个模型或提示(以及是否部署)。在本文中,我们使用Google Research的 FLAN-T5 LLM 对各种提示进行测试,以将文本分类为礼貌或不礼貌。在提示候选中,我们发现基于观察到的测试准确性表现最好的提示往往实际上比其他提示候选更差。对测试数据的仔细审查揭示了这是由于不可靠的注释所致。在实际应用中,除非你清理你的测试数据以确保其可靠性,否则你可能会为你的 LLM 选择次优提示(或做出其他由模型评估指导的次优选择)。
选择优秀的提示对于确保大型语言模型的准确响应至关重要。
虽然噪声注释在训练数据中的危害已经得到了充分的描述,但本文展示了它们在测试数据中常被忽视的后果。
我目前是Cleanlab的一名数据科学家,我很高兴分享高质量测试数据的重要性(以及如何确保高质量测试数据),以确保最佳的 LLM 提示选择。
概述
你可以在这里下载数据。
本文研究了斯坦福礼貌数据集的二分类变体(使用CC BY 4.0 许可证),该数据集中的文本短语被标记为礼貌或不礼貌。我们使用包含 700 个短语的固定测试数据集来评估模型。
数据集快照,显示了文本和真实的礼貌标签。
评估分类模型“好坏”的标准做法是通过测量其对未在训练期间见过的样本的预测准确性来进行,这些样本通常被称为“测试”、“评估”或“验证”数据。这提供了一个数值指标来衡量模型 A 相对于模型 B 的优劣——如果模型 A 表现出更高的测试准确率,我们估计它是更好的模型,并会选择部署它而不是模型 B。除了模型选择之外,类似的决策框架也可以应用于其他选择,例如使用超参数设置 A 或 B、提示 A 或 B、特征集 A 或 B 等。
常见问题在现实世界的测试数据中,某些示例由于人为注释错误、数据处理错误、传感器噪声等原因具有错误标签。在这种情况下,测试准确度成为评估模型 A 和模型 B 之间相对性能不太可靠的指标。让我们举一个非常简单的例子来说明这一点。想象一下,你的测试数据集中有两个不礼貌文本示例,但你不知道它们被错误地标记为礼貌。例如,在我们的斯坦福礼貌数据集中,我们看到一个实际的人类注释者错误地将这段文本“你在这里疯了吗?到底发生了什么?”标记为礼貌,而语言显然是激动的。现在你的工作是选择最好的模型来分类这些示例。模型 A 说这两个示例都是不礼貌,而模型 B 说这两个示例都是礼貌。基于这些(错误的)标签,模型 A 得分为 0%,而模型 B 得分为 100% — 你选择了模型 B 来部署!但等等,哪个模型才实际上更强大?
虽然这些含义微不足道,许多人知道现实世界数据充满标记错误,但人们往往只关注其训练数据中的嘈杂标签,却忘记仔细筛选其测试数据,尽管后者指导了重要决策。通过真实数据,本文说明了高质量测试数据对指导 LLM 提示选择的重要性,并演示了通过算法技术轻松提高数据质量的一种方式。
观察到的测试准确度与清洁测试准确度
这里我们考虑由同一组文本示例构成的两个可能的测试集,只有在某些示例(约 30%)的标签上有所不同。代表您用来评估准确性的典型数据,一个版本的标签来源于每个示例的单个注释(人类评分者),我们将计算在该版本上模型预测的准确率作为观察到的测试准确度。同一测试集的第二个更清洁版本具有通过多个人类评分者达成一致共识而建立的高质量标签。我们将在更干净的版本上测量的准确性称为清洁测试准确度。因此,清洁测试准确度更接近您关心的内容(实际模型部署性能),但观察到的测试准确度是大多数应用中您只能观察到的 —— 除非您先清理您的测试数据!
下面是两个测试示例,单个人类注释者误标示例,但许多人类注释者组同意正确标记。
从单个注释者收集的橙色注释成本更低,但常常是错误的。从多个注释者收集的蓝色注释成本更高,但通常更准确。
在现实项目中,您通常无法获得这样的“干净”标签,因此您只能测量观察测试准确性。如果您根据这个度量来做出诸如使用哪个 LLM 或提示的关键决策,请务必首先验证标签的质量。否则,我们发现您可能会做出错误的决定,如在选择礼貌分类提示时观察到的那样。
噪声评估数据的影响
作为分类文本礼貌的预测模型,自然而然地使用预训练的大型语言模型(LLM)是合理的。在这里,我们特别使用数据科学家最喜爱的开源 FLAN-T5 模型。要让这个 LLM 准确预测文本的礼貌,我们必须提供恰到好处的提示。提示工程可能非常敏感,小的改变会极大地影响准确性!
下面显示的 Prompt A 和 Prompt B(高亮文本)是两个不同的逻辑链式提示示例,可以附加在任何文本样本前面,以使 LLM 对其礼貌进行分类。这些提示结合了少样本和指令提示(稍后详细介绍),提供示例、正确的响应和鼓励 LLM 解释其推理的理由。这两个提示唯一的区别是实际上在引起 LLM 回应的高亮文本。少样本示例和推理保持不变。
逻辑链式提示为模型提供了每个文本示例为什么正确的推理。
决定哪个提示更好的自然方法是基于它们的观察测试准确性。当用于提示 FLAN-T5 LLM 时,我们可以看到 Prompt A 生成的分类在原始测试集上比 Prompt B 的观察测试准确性更高。所以显然我们应该部署我们的 LLM 与 Prompt A,对吗?不要那么快!
当我们评估每个提示的干净测试准确性时,我们发现 Prompt B 实际上比 Prompt A 好得多(高出 4.5 个百分点)。由于干净测试准确性更接近我们实际关心的真实表现,如果我们仅仅依赖于原始测试数据而不检查其标签质量,我们将会做出错误的决定!
使用观察到的准确性,您会选择 Prompt A 更好。在干净的测试集上评估时,Prompt B 实际上是更好的提示。
这只是统计波动吗?
McNemar 检验是一种评估 ML 准确性报告差异统计显著性的方法。当我们应用此检验评估 Prompt A 与 B 在 700 个文本示例中的清洁测试准确性的 4.5%差异时,差异具有高度统计显著性(p 值 = 0.007,X² = 7.086)。因此,所有证据表明 Prompt B 是一个意义深远的更好选择——我们不应未能通过仔细审计原始测试数据而未选择它!
这是一个偶然结果,还是仅仅发生在这两个提示上?
让我们看看其他类型的提示,以了解结果是否只是我们一对思维链提示的巧合。
指令提示
这种类型的提示仅向 LLM 提供一个指令,说明它需要对给定的文本示例做什么。考虑以下我们可能想要选择的这种提示对。
少量样本提示
这种类型的提示使用两个指令,一个前缀和一个后缀,还包括两个(预先选择的)文本示例,以向 LLM 提供所需的输入-输出映射的清晰演示。考虑以下我们可能想要选择的这种提示对。
模板化提示
这种类型的提示使用两个指令,一个可选的前缀和一个后缀,以及多选格式,以便模型作为多项选择答案进行分类,而不是直接以预测的类别进行响应。考虑以下我们可能想要选择的这种提示对。
各种类型提示的结果
除了思维链外,我们还评估了相同 FLAN-T5 LLM 在这三种额外类型提示下的分类性能。绘制所有这些提示下的观察测试准确性与清洁测试准确性,我们看到许多提示对存在相同的上述问题,即依赖于观察测试准确性导致选择实际更差的提示。
作为一个提示工程师,使用可用的测试数据,你会选择左上角的灰色 A 提示(最高观察准确性),然而最佳提示实际上是右上角的灰色 B(最高清洁准确性)。
基于观察测试准确性,你会倾向于选择每种类型提示中的“A”提示而不是“B”提示。然而,每种提示类型的更好提示实际上是提示 B(具有更高的清洁测试准确性)。这些提示对突显了验证测试数据质量的必要性,否则由于数据问题如噪声注释,你可能会做出次优决策。
所有 A 提示看起来由于其更高的观测准确度而表现更好,但在基于真实数据测试时,所有 B 提示在客观上表现更好。
在这个图示中,你还可以看到所有 A 提示的观测准确度被圈了起来,这意味着它们的准确度比 B 提示更高。类似地,所有 B 提示的清理准确度也被圈了起来,这意味着它们的准确度比 A 提示更高。就像本文开头的简单示例一样,你可能倾向于选择所有 A 提示,但实际上 B 提示的表现要好得多。
改进可用测试数据以获得更可靠的评估
希望你能明白高质量评估数据的重要性。让我们来看几个修正可用测试数据的方法。
手动修正
确保测试数据质量的最简单方法是手动检查!确保逐一查看每个示例,验证其标签是否正确。根据测试集的大小,这可能可行也可能不可行。如果测试集相对较小(约 100 个示例),你可以查看它们并进行必要的修正。如果测试集较大(1000+示例),手动完成这一任务将过于耗时且心理负担过重。我们的测试集相当大,所以我们不会使用这种方法!
算法修正
评估你的可用(可能有噪声的)测试集的另一种方法是使用以数据为中心的 AI 算法来诊断可以修正的问题,以获得更可靠的同一数据集版本(无需收集许多额外的人类注释)。在这里,我们使用 Confident Learning 算法(通过开源的cleanlab包)来检查我们的测试数据,这些算法自动估计哪些示例可能被错误标记。然后我们仅检查这些自动检测的标签问题,并根据需要修正其标签,以产生更高质量的测试数据集版本。我们将对这个版本的测试数据集进行的模型准确度测量称为CL 测试准确度。
所有 B 提示的 CL 测试准确度都更高。通过 CL 我们纠正了原始测试数据,现在可以信任我们的模型和提示决策。
使用这个新的 CL 纠正测试集进行模型评估,我们发现之前的所有 B 提示现在准确度正确地高于 A 提示。这意味着我们可以信任基于 CL 纠正测试集做出的决策,比基于原始噪声测试数据做出的决策更可靠。
当然,Confident Learning 并不能神奇地识别数据集中所有的错误。这个算法检测标签错误的效果将依赖于基线 ML 模型的合理预测,即便如此,某些系统性引入的错误仍然无法被检测到(例如,如果我们完全交换两个类别的定义)。有关 Confident Learning 在何种数学假设下被证明有效的详细列表,请参考 Northcutt 等人原始论文。对于许多现实世界的文本/图像/音频/表格数据集,这个算法至少提供了一种有效的方法,将有限的数据审查资源集中在大数据集中最可疑的例子上。
你不总是需要花费时间/资源来创建一个“完美”的评估集——使用像 Confident Learning 这样的算法来诊断和修正你现有测试集中的潜在问题,可以提供高质量的数据,以确保最佳的提示和模型选择。
除非另有说明,否则所有图像均为作者提供。
超越准确性:在长期用户留存中拥抱偶然性和新颖性的推荐
推荐系统
对促成良好推荐和长期用户留存的因素进行考察
·发布于 Towards Data Science ·阅读时间 10 分钟·2023 年 6 月 26 日
–
作者使用 DALL-E 创作
在咖啡店建立的信任纽带
你正坐在咖啡店里,品味着你最喜欢的咖啡变体(当然是卡布奇诺),并与朋友聊天。随着谈话的进行,话题转到你们都非常入迷的最新热门电视剧上。共享的兴奋感建立了一种信任纽带,以至于你的朋友热切地转向你,问道:“我接下来该看什么?你有什么推荐吗?”
在那一刻,你成为了他们娱乐体验的策展人。你感到一种责任感,要保持他们的信任并提供能够吸引他们的建议。此外,你也很兴奋有机会将他们引导到一个他们之前没有探索过的稍微新颖的类型或情节。
但是,在考虑给朋友提供完美推荐时,哪些因素会影响你的决策过程?
什么是一个好的推荐?
照片由 Thibault Penin 提供,来源于 Unsplash
首先,你利用对朋友口味和兴趣的理解。你回忆起他们对复杂情节和黑暗幽默的喜好;此外,你知道他们喜欢像“福尔摩斯”这样的犯罪剧和“黑镜”这样的心理惊悚片。掌握了这些信息后,你在脑海中浏览你的电视节目库。
为了保险起见?
你很想推荐一系列几乎相同的节目,只是有些许变化,涵盖了犯罪和惊悚。你还考虑到其他口味相似的人如何喜欢这些节目,以缩小选择范围。毕竟,他们几乎肯定会喜欢这一组;这是安全且简单的选择。然而,你考虑到单纯依赖他们过去的最爱可能会限制他们接触到新颖和多样化的内容,并不特别想依赖安全且简单的选择。
你想起了一个最近的科幻系列,它巧妙地融合了神秘、冒险和超自然悬念。尽管它偏离了他们的典型类型,但你相信它会提供一种令人耳目一新的叙事变化。
长尾问题、反馈循环与过滤泡沫
推荐系统旨在大规模复制这一过程。通过分析大量关于个人偏好、行为和过去经验的数据,这些系统力求生成体现人类决策复杂性的个性化推荐。
然而,传统上,推荐系统主要 — 如果不是唯一 — 关注于保守并依赖那些能确保满意的推荐(至少在短期内)。
其中一种方法是优先考虑流行或主流内容。因此,这些流行内容会获得更多曝光和互动(流行偏见),从而创建一个强化其显著性的反馈循环。不幸的是,这往往导致较少人知晓或小众的内容难以获得可见性和到达目标观众(长尾问题)。
作者提供的照片
实际上,近年来有很多文献研究推荐系统中的“公平性”。例如,在“音乐推荐系统中的公平性:一个以利益相关者为中心的小型综述”中,Karlijn Dinnissen 和 Christine Bauer 探讨了音乐推荐系统中的公平性问题;他们从多个利益相关者的角度分析了性别公平性和流行偏见,例如流行偏见对艺术家代表性的影响。
在这篇文章“公平性问题:音乐推荐算法是否重视多样性?”中,Julie Knibbe 分享道:
作为前流媒体平台的产品总监,我经常收到类似“流媒体服务是否选择推广热门艺术家而非独立艺术家和小众音乐?”的问题。直观上,人们认为在这些大平台上,“富者愈富”。
在文章后面,克尼贝也呼应了迪宁森和鲍尔的观点:
“在音乐推荐的背景下 […] 公平通常以曝光或关注来定义。流媒体服务也是一个双向市场,这意味着**“公平和公正的待遇”必须适用于流媒体服务的用户和艺术家。**
两个来源都强调了推荐系统公平性的双重性质,强调了对用户和内容创作者进行“公平和公正待遇”的重要性。
理想的结果是什么样的?
自然地,内容的分布中存在固有的不平衡。人类经验的丰富性部分在于其网络复杂性;某些内容能引起更广泛的观众共鸣,而其他内容则在小众群体中建立联系,形成一种丰富性和个性化的感觉。目标不是为了追求均匀分布而人为地推广不太受欢迎的内容,而是将小众内容呈现给真正相关且能够欣赏内容创作者工作的个体,从而最大程度地减少错失有意义的连接的机会。
行业对此有什么看法?
2020 年,Spotify 的研究团队发布了一篇题为“Spotify 上的算法对消费多样性的影响”的文章。在他们的研究中,他们探讨了听取多样性与用户结果之间的关系。
他们的目标是回答这些问题:“多样性如何与重要的用户结果相关?那些听取多样化内容的用户是否比听取单一内容的用户更满意?”
研究人员发现,“听取多样化内容的用户比听取较少多样化内容的用户更不容易流失,多10-20 个百分点 […] 听取多样化内容与 用户转化和留存相关。”
此外,根据朱莉·克尼贝的说法:
“TikTok 的推荐算法最近被 MIT 技术评论提到为前 10 名 […]。他们的创新之处不在于算法本身——而在于他们优化的指标,比其他因素更重视多样性。”
因此,平台上可发现性的属性与用户留存之间存在联系。换句话说,当推荐变得可预测时,用户可能会寻找那些提供更大“新鲜感”的平台,从而逃离过滤气泡的局限。
那么,推荐系统如何模仿你在为朋友策划完美建议时所使用的深思熟虑和直觉呢?
向多样性指标的转变
在文章“多样性、偶然性、新颖性和覆盖率:推荐系统中超越准确性的目标的调查与实证分析”中,作者马里乌斯·卡明斯卡斯和德里克·布里奇强调:
“对推荐系统的研究传统上集中于准确性[…]然而,已经认识到其他推荐质量——如推荐列表的多样性和是否包含新颖项目——可能对推荐系统的整体质量产生重大影响。因此[…]推荐系统研究的重点已转向包括更广泛的‘超越准确性’目标”
这些“超越准确性”的目标是什么?
多样性
试图通过文献了解推荐系统中的‘多样性’是非常艰难的,因为每篇文章都提出了独特的定义。多样性可以在个体层面或全球层面进行衡量**。** 我们将讨论三种概念化多样性的方法,以便为朋友提供节目推荐。
预测多样性
预测多样性指的是在给定集合中推荐的多样化程度。当你向朋友推荐一组节目时,预测多样性评估这些推荐在类型、主题或其他相关因素上彼此的差异程度。
更高的预测多样性表明推荐集合中的选项范围更广,为你的朋友提供了更丰富且可能更有价值的观看体验。
其中一种衡量方式是使用内部列表多样性(ILD),即推荐项目之间的平均配对不相似度。给定推荐项目列表,ILD 定义如下:
用户多样性
在为朋友提供节目推荐的背景下,用户多样性考察的是你曾经给予该特定朋友的所有推荐的平均多样性。它考虑了随着时间推移建议给他们的内容的广度和多样性,涵盖的类型、主题或其他相关因素。
你还可以通过分析每个朋友推荐集内项目嵌入的平均不相似度来评估用户多样性。
全球多样性
另一方面,全球多样性超越了具体的朋友,评估你给任何朋友的所有推荐的平均多样性。
有时,这被称为拥挤度——这是对推荐均匀性或推荐挤压的反映。
用于分析全球多样性的几个指标包括基尼指数和熵。
基尼指数,源自收入不平等测量领域,可用于评估推荐系统中推荐分布的公平性和平衡性。较低的基尼指数表明分布更为公平,推荐均匀分布,促进更大的多样性和更多内容的曝光。另一方面,较高的基尼指数则表明推荐集中于少数流行项目,可能限制了小众内容的可见度,并减少了推荐的多样性。
熵是衡量推荐过程信息量的指标。它量化了推荐分布中的不确定性或随机性水平。与基尼指数类似,当推荐分布均匀时,熵值最佳,这意味着每个项目都有相等的被推荐的概率。这表明推荐集是平衡且多样化的。较高的熵值表明推荐系统更具变化和不可预测性,而较低的熵值则表明推荐集更集中和可预测。
覆盖率
覆盖率定义为算法能够生成的可能推荐的部分/比例。换句话说,推荐的覆盖范围有多好。
例如,考虑一个拥有广泛音乐库的音乐流媒体平台,这些歌曲涵盖了各种流派、艺术家和年代。推荐算法的覆盖率将表明在向用户推荐歌曲时,它能多有效地覆盖整个音乐目录。
缺点:这个指标将一次推荐的项目视为与推荐了数千次的项目相同。
新颖性
新颖性是用于衡量推荐项目的新颖性或原创性的指标。它包括两个方面:用户依赖性新颖性和用户独立性新颖性。用户依赖性新颖性衡量推荐对用户而言有多么不同或陌生,表示存在新的和未探索的内容。然而,现在越来越多地以用户独立的方式来指代项目的新颖性。
为了估计新颖性,一种常见的方法是考虑项目的受欢迎程度,测量为项目稀有度。这种方法将项目的新颖性与其受欢迎程度反向相关,认识到较不受欢迎的项目往往因其偏离主流或广为人知的选择而被认为更具新颖性。通过整合这种观点,新颖性指标提供了有关推荐项目中创新和多样性水平的洞察,从而提供了更丰富和探索性的推荐体验。
意外性(惊喜)
推荐系统中的惊喜衡量的是基于用户历史互动的推荐项目的意外程度。一种量化惊喜的方法是计算推荐项目与用户过去互动的余弦相似度。较高的相似度表示惊喜较少,而较低的相似度则表示推荐中的惊喜较大。
可发现性
在推荐系统中,可发现性可以理解为用户容易遇到和找到模型建议的推荐内容。这类似于推荐内容在用户界面或平台中的可见性和可访问性。
它使用递减排名折扣函数来量化,该函数对推荐列表顶部的推荐赋予更高的重要性,并随着排名位置的下降逐渐减少其权重。
偶然性
推荐系统中的偶然性包括两个关键方面:意外性和相关性。
偶然性指的是愉快的惊喜发生或发现有趣和意外的推荐。为了量化偶然性,它使用以下公式按每用户和每项目计算:
通过将意外性和相关性相乘,偶然性指标结合了令人愉快的惊喜和适切性。它量化了推荐既意外又相关的程度,为推荐过程中的偶然体验提供了衡量标准。
跨用户和推荐项目的整体偶然性可以计算为:
结论
随着行业的发展,越来越重视改进推荐算法,以提供涵盖用户所有偏好的推荐,包括更丰富的个性化、意外性和新颖性。此外,优化这些维度平衡的推荐系统也与提高用户保留率和用户体验相关。最终,目标是创建不仅满足用户已知偏好的推荐系统,还能通过新鲜、多样和个人相关的推荐来惊喜和取悦用户,从而促进长期的参与和满意度。
参考文献
超越准确性:探索机器学习模型全面评估的异域指标
·
关注 发布于 Towards Data Science ·12 min read·2023 年 4 月 27 日
–
机器学习无疑已成为当今数据驱动世界中的强大工具,但我们真的充分利用了它的全部潜力吗?传统的评估指标如准确性、精确度和召回率长期以来一直备受关注,但在衡量模型的实际影响时,还有许多其他因素需要考虑。在本文中,我们将探讨那些较少为人知的、非常规的评估指标,这些指标正在重塑我们评估机器学习模型的方式。从公平性、隐私和校准,到能源消耗、数据消耗,甚至心理和行为测试,这些创新的评估技术将改变你对模型性能的看法,并为机器学习提供一种更负责任、更全面的方法。
图片来源:pexels.com
公平性
即使机器学习模型的数学定义本身不一定包含不公平或偏见的元素,训练出的模型也可能不公平,这取决于输入数据的质量或训练过程。基于偏见数据学习的模型不仅可能导致不公平和不准确的预测,还可能严重不利于某些子群体,从而导致不公平性。
换句话说,模型的公平性概念描述了模型在数据的某些子群体上可能表现不同的问题。这个问题在涉及到由性别、年龄、种族或宗教信仰等因素定义的人口统计组时尤为重要。随着机器学习在社会中的应用越来越广泛,这个问题受到了更多的关注和研究 [1, 2, 3, 4, 5]。量化机器学习中的公平性仍然存在争议。一些有趣的公平性测量方式包括:
人口统计公平性:该指标检查预测类别在不同人口统计组中是否均匀分布。其公式如下:
其中 A 是一个受保护属性(例如种族或性别),Y 是目标变量(例如批准或拒绝),Ŷ 是对 Y 的预测值。人口统计公平性是一个需要实现的条件,即预测与受保护属性在统计上独立。
统计公平差异:该指标测量不同人口统计组之间的正分类率是否相等。公式如下:
差异影响:计算受保护组的正分类率与另一个组的正分类率的比率。
值为 1 表示两个组的正分类率相同,表明公平性。值大于 1 表示* A=0组的正分类率较高,而值小于 1 则表明 A=1*组的正分类率较高。
然而,需要注意的是,差异影响是一个有限的公平性衡量标准,不应孤立使用。例如,如果某一组在训练数据中代表性不足,则可能有理由提高该组的正分类率。此外,差异影响没有考虑其他因素,如假阳性和假阴性率,这些可能提供更全面的公平性视角。
这些只是用于量化机器学习中公平性的一些指标。需要注意的是,公平性是一个复杂的问题,这些指标不应孤立使用。相反,它们应该在特定问题和期望结果的背景下进行考虑。
校准
如[6, 7]中定义的那样,误校准的概念表示算法返回的置信水平(或概率)与实际表现之间的期望差异。
换句话说,校准测量回答了以下问题:算法对其自身预测的置信度是否正确?
在潜在危险的决策问题中,如疾病检测或蘑菇识别,促进良好校准模型是重要的。
校准测量的重要性在于,必须清楚了解算法对其预测的置信水平。一个校准良好的算法会产生准确反映预测正确可能性的置信水平。相反,一个校准不良的算法会过高或过低估计其预测的置信度,从而导致不正确或不可靠的结果。
在决策错误后果可能严重的应用中,拥有一个良好校准的算法至关重要。疾病的误诊可能导致错误的医疗处理和对患者的伤害。类似地,蘑菇的误识别可能会导致严重的健康后果。在这些情况下,良好校准的模型可以帮助确保根据可靠的预测做出正确的决策。
可以使用期望校准误差(ECE)来计算:该分数测量平均预测概率与在预测概率区间中的准确度(即正样本的比例)之间的差异。ECE 的公式如下:
其中M是区间的数量,Bm是第m个区间中的样本集合,n是测试数据中的样本总数,accm是第m个区间的准确度,confm是第m个区间的平均预测概率。
方差
方差本身可以作为一个次要的目标度量。我们希望最小化算法性能的变异性。它可以通过标准差 σ来简单计算。它也可以定义为收敛速率:当重新训练 n 次时,算法有多少次收敛到一个令人满意的解决方案?将这些计算作为次要目标度量并不是在排名模型时考虑分数的误差条,而是基于方差对模型进行排名,或者至少通过给予更稳定的候选模型来打破平局。
机器学习模型性能的方差是一个重要的次要目标度量,不应被忽视。算法性能的变异性可能导致不可靠和不一致的结果。最小化这种变异性对于确保模型的稳定性和鲁棒性至关重要。
有几种方法可以测量机器学习模型的方差。一种常见的方法是计算模型在多次运行或折叠中的平均分数的标准差。这提供了性能在平均值周围的分布度量,并表明在不同情况下性能可能的变化程度。
模型平均分数的标准差公式为:
其中 n 是运行或折叠的次数,xi 是模型在第 i 次运行或折叠中的性能分数,x̄(x 平均值)是所有运行或折叠中的平均性能分数。
可解释性和解释能力
可解释性和解释能力是机器学习中相关但不同的概念。
可解释性指的是人类理解模型预测原因的程度。它指的是理解模型内部工作原理及其如何做出决策的能力。
解释能力是指提供人类可理解的模型决策过程解释的能力。它关注于以易于理解的形式向人类展示预测背后的原因,例如,通过特征重要性、决策树等方式。
总结来说,可解释性侧重于模型本身的透明度,而解释能力则关注于将模型行为传达给人类观众。
[8] 提出了关于可解释性的广泛调查。他们强调了可解释性在某方面极其宝贵,但另一方面却难以定义。另一种自动解释算法的方法是敏感性分析 [9]。敏感性分析是一种确定模型或系统的输入变量变化如何影响输出或感兴趣结果的技术。
隐私
隐私应在候选算法为生成模型、建模潜在机密数据的情况下进行衡量。在这种情况下,目标是使用生成模型创建足够接近实际数据的人工数据,以便在实际应用中使用,但又不至于泄露私人信息。一个准确计算这个的指标是对抗准确度 [10]。这是它的定义:
其中指标函数1在其参数为真时取值 1,否则取值 0,T和S分别是真实数据和合成数据。
基本上这是一个 1 最近邻分类器的准确度,但我们追求的分数不是 1(完美分类准确度),而是 0.5。确实,完美分数意味着每个生成的数据点在真实数据中有其最近邻,这意味着两个分布过于接近。0 的分数意味着两个分布过于不同,因此效用低。因此,0.5 的分数,即每个数据点的最近邻可以是虚假或真实的概率相同,保证了良好的隐私。
这种方法的一个限制是需要适当的距离度量。这也是一个优点,因为它意味着该方法是通用的,可以通过选择合适的距离度量应用于不同领域。
时间和内存消耗
简单而有用的次要目标指标是模型的时间、内存和能源消耗。有两种主要方法来考虑这些:限制资源和跟踪资源使用。
训练和推理时间、模型的大小、过程中的内存使用甚至能源消耗都是可以通过设计进行限制或测量的变量。
方法的代码行数或字符数也可以作为简洁性和实用性的指标。然而,显然,这个指标很容易被通过调用外部包来欺骗,可能需要人工审查。
解决任务的最简单模型是更可取的,因为它们对环境更友好、成本更低、可以部署在较弱的设备上,并且更易于解释。
生产相同结果但时间更短的模型更为理想,因为这减少了所需的计算资源,并且可以节省成本。这在当前的生态危机背景下尤为重要,因为减少计算中的能源消耗可以对降低技术的碳足迹产生显著影响。此外,更快训练和预测的模型更具可扩展性,可以实时应用,进一步提升其效用。因此,优化时间消耗是开发高效且环保的机器学习模型的关键因素。
数据消耗
数据消耗,或者说机器学习算法所需的训练数据量,在比较不同模型时是另一个关键指标。正如俗语所说,“数据是新石油”,但并非每种情况都允许使用大规模数据集。在许多实际应用中,收集足够的标记数据可能耗时、昂贵,甚至是不可能的。因此,追踪和限制数据消耗是模型评估的一个重要方面。
监控数据消耗可以帮助识别在有限数据下表现良好的算法,使其更适合数据稀缺或更快速部署的场景。另一方面,限制可用训练数据的数量可以鼓励开发能够更高效地从较小样本中学习的模型。这通常称为少样本学习。这就是元学习技术如 k-shot n-way 方法发挥作用的地方。在这种方法中,模型被训练以仅使用每个类别 n 中的有限数量的示例k来快速适应新任务。
通过有意限制数据消耗,元学习促进了能够从较小数据集中更好地泛化的模型的发展,从而提高了它们在各种情况下的效用和适应性。
以人为本的方法
除了前面讨论的定量评估指标之外,在评估机器学习模型时,考虑更多“人”的评估技术至关重要。这些方法强调定性方面和主观解释,为评估过程增添了人文色彩。例如,在文本生成图像算法中,对生成的图像进行手动评估可以帮助确定结果在视觉上是否吸引人、连贯和相关性是否适当。类似地,大型语言模型可以接受心理或行为测试,评估者根据连贯性、移情和伦理考虑等因素评价模型的响应。这些以人为中心的评估方法可以揭示出纯数值指标可能忽视的见解,从而更全面地理解模型的优势和劣势。通过将这些面向人的技术融入我们的评估工具箱,我们可以确保我们的机器学习模型不仅在解决问题时有效,而且能够与复杂多面的人类体验和期望相 resonant。
遵循这一思路,一个明显的例子是如何测试生成式预训练转换器(GPT),即著名的大型语言模型,使用心理学测试,高中测试和数学测试。
结论
总之,评估机器学习模型远远超出了传统的准确性指标。通过采用整体方法,我们可以更好地理解模型性能的各个维度及其对现实世界的影响。通过探索如公平性、隐私、能源消耗、校准、时间、内存和数据消耗等非常规指标,我们可以推动开发更负责任、高效和适应性强的模型,解决我们今天面临的各种挑战。
认识到没有一刀切的解决方案对于机器学习至关重要。通过扩展我们的评估标准并揭示这些鲜为人知的指标,我们可以促进该领域的创新,确保我们的模型不仅表现良好,还符合伦理考虑和实际限制。在我们继续推动机器学习的边界时,让我们努力创造既能解决复杂问题,又以负责任、公平和关注我们生活的世界的方式解决问题的模型。
感谢您的阅读!
参考文献
[1] Philipp Benz, Chaoning Zhang, Adil Karjauv, 和 In So Kweon。鲁棒性可能与公平性相悖:关于类别精度的实证研究。2020. URL arxiv.org/abs/2010.13365
。
[2] Mariya I. Vasileva。机器学习算法的黑暗面:它们如何以及为什么会利用偏见,以及如何追求算法公平性。在第 26 届 ACM SIGKDD 知识发现与数据挖掘会议,虚拟会议,加州,美国。ACM,2020. URL doi.org/10.1145/3394486.3411068
。
[3] Alexandra Chouldechova 和 Aaron Roth。机器学习中的公平性前沿。2018. URL arxiv.org/abs/1810.08810
。
[4] Irene Y. Chen, Fredrik D. Johansson, 和 David A. Sontag。为什么我的分类器具有歧视性? 在 2018 年神经信息处理系统(NeurIPS),加拿大蒙特利尔。URL proceedings.neurips.cc/paper/2018/hash/1f1baa5b8edac74eb4eaa329f14a0361-Abstract.html
。
[5] Ludovico Boratto, Gianni Fenu, 和 Mirko Marras。上采样与正则化在推荐系统中对提供者公平性的相互作用。用户模型。用户适应。互动,2021. URL doi.org/10.1007/s11257–021–09294–8
。
[6] Mahdi Pakdaman Naeini, Gregory F. Cooper, 和 Milos Hauskrecht。使用贝叶斯分箱获得良好校准的概率。在《第二十九届美国人工智能会议论文集》,2015 年,德克萨斯州奥斯汀,美国。URL www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/view/9667
。
[7] Chuan Guo, Geoff Pleiss, Yu Sun 和 Kilian Q. Weinberger. 现代神经网络的校准问题。发表于第 34 届国际机器学习会议(ICML 2017),澳大利亚悉尼,PMLR 2017 年第 70 卷。URL proceedings.mlr.press/v70/guo17a.html
。
[8] Diogo V. Carvalho, Eduardo M. Pereira 和 Jaime S. Cardoso. 机器学习可解释性:方法与指标综述。MDPI Electronics,2019. URL www.mdpi.com/2079–9292/8/8/832/pdf
。
[9] Bertrand Iooss, Vincent Chabridon 和 Vincent Thouvenot. 基于方差的重要性度量用于机器学习模型可解释性。发表于 2022 年会议录。URL hal.archives-ouvertes.fr/hal-03741384
。
[10] Andrew Yale, Saloni Dash, Ritik Dutta, Isabelle Guyon, Adrien Pavao 和 Kristin P. Bennett. 隐私保护的合成健康数据。发表于第 27 届欧洲人工神经网络研讨会(ESANN)2019,比利时布鲁日。URL www.elen.ucl.ac.be/Proceedings/esann/esannpdf/es2019–29.pdf
。
[11] OpenAI. GPT-4 技术报告。 2023. URL doi.org/10.48550/arXiv.2303.08774
。
[12] Kadir Uludag 和 Jiao Tong. 测试 ChatGPT 在心理学中的创造力:与 ChatGPT 的访谈。预印本,2023。
[13] Xingxuan Li, Yutong Li, Linlin Liu, Lidong Bing 和 Shafiq R. Joty. GPT-3 是心理变态者吗?从心理学角度评估大型语言模型。2022. URL doi.org/10.48550/arXiv.2212.10529
。
[14] Joost de Winter. ChatGPT 能否通过高中英语语言理解考试? 预印本,2023。
[15] Simon Frieder, Luca Pinchetti, Ryan-Rhys Griffiths, Tommaso Salvatori, Thomas Lukasiewicz, Philipp Christian Petersen, Alexis Chevalier 和 Julius Berner. ChatGPT 的数学能力。URL doi.org/10.48550/arXiv.2301.13867
。
超越条形图:桑基图、圆形打包和网络图中的数据
非传统可视化:何时使用及何时不使用它们的力量
·发表于Towards Data Science ·12 分钟阅读·2023 年 8 月 26 日
–
由Firmbee.com提供的照片,发布在Unsplash上
你好!
如果你已经深入探讨了数据分析的世界,你可能对条形图、折线图、散点图和饼图等图表的力量非常熟悉。这些可视化不仅使数据更易于理解,还提升了对不同受众的洞察力——无论是利益相关者、客户,还是你自己,寻求从数据中获取见解。然而,在数据复杂性要求更精细和引人入胜的展示时,有些情况就需要更复杂和吸引人的展示方式。
想象一下这样的场景:你正扮演着我们虚构公司 MM Awesome Data Inc.的一名初级数据科学家。管理层正在努力将新的数据源整合到现有的数据框架中,他们确实需要理解全貌。虽然饼图可能满足部分需求,但想象一下呈现一个流程图,如引人注目的桑基图或动态流图的影响和魅力。
本文围绕这样的场景展开。在广阔的数据可视化领域中,有一些隐藏的瑰宝常常被忽视。鉴于我们无法在一篇文章中讨论所有这些精彩的可视化方法,我们将在这里重点介绍其中的三个。所以,让我们深入探讨一下吧。
桑基图
让我们首先探索一下迷人的桑基图世界。
桑基图是一种非常酷的方式来可视化数据流动。它们提供了一种独特的方式来查看事物如何从一个阶段转移到另一个阶段。想象一下了解一个产品从诞生到最终结果的过程,或不同类别如何汇聚或分离。桑基图在这些方面表现得最为出色。
然而,值得一提的是,这些图表最适合用于跟踪流动的场景,比如我们提到的例子。在其他情况下,它们可能不是最佳选择。所以,让我们深入探索,揭开它们的魔力吧!
图片作者
在我们进入代码并探讨我们刚刚看到的图表的实际实现之前,让我们讨论一下使用案例。
适合桑基图的场景
如果你的情况属于以下任何类别,桑基图是一个很棒的选择:
-
数据流分析: 这涉及到展示各种资源、数量或一般数据的分布、转化和过渡。它们有助于突出系统中的主要贡献者、路径和损失。
-
识别资源瓶颈: 桑基图是评估资源利用效率的宝贵工具。它们在识别瓶颈和建议优化区域方面表现出色。
不适合桑基图的场景
尽管桑基图是强大的工具,但在某些情况下它们可能不是最佳选择:
-
数值精度: 桑基图优先考虑流动的定性和相对表示。如果需要精确的数值,其他可视化方法可能更为合适。
-
处理大量数据: 如果你的数据集涉及多个节点和连接,桑基图可能会迅速变得杂乱且难以解读。为克服这一问题,可以考虑简化数据或探索网络图或层次图等替代可视化方法。
类似使用案例的替代可视化
从我的经验来看,我发现流图、平行坐标图和流程图与桑基图有类似的目的。此外,一些人可能会认为网络图与桑基图的功能很相似。
现在我们对何时使用桑基图以及何时考虑其他选项有了更清晰的认识,让我们深入探讨一下这个令人印象深刻的可视化背后的代码吧!
深入探讨桑基图的 Python 实现
现在让我们把注意力转向将桑基图变为现实的 Python 代码。
我的目标是创建一个功能全面的桑基图,使其能够轻松适应各种复杂程度。
以下示例深入分析了组织的数据管道。它追踪了数据从源头到最终转化为产品或报告的过程。需要注意的是,这里使用的数据完全是合成的。因此,虽然此可视化作为制作引人注目的 Sankey 图的优秀指南,但建议不要推断出超出其制作迷人视觉效果的教学价值。
我使用了 holoview 进行演示,而 holoview 特别有趣的是它生成基于 HTML 的 交互式图表 的能力。这绝对是一个值得探索的功能。
import holoviews as hv
from holoviews import opts, dim
hv.extension('bokeh')
# Define the data for the Sankey diagram
data = {
('Sensors', 'Collection'): 20,
('External Sources', 'Collection'): 25,
('Databases', 'Collection'): 10,
('Surveys/polls', 'Collection'): 20,
('Internal Sources', 'Collection'): 25,
('Collection', 'Preprocessing'): 70,
('Collection', 'Storage'): 30,
('Preprocessing', 'Storage'): 20,
('Preprocessing', 'Transformation'): 40,
('Preprocessing', 'Analysis'): 10,
('Storage', 'Transformation'): 40,
('Storage', 'Archives'): 10,
('Transformation', 'Analysis'): 20,
('Transformation', 'Product'): 60,
('Analysis', 'Insights'): 10,
('Analysis', 'Reporting'): 20,
}
# Define a dimension for the data
value_dim = hv.Dimension('Percentage', unit='%')
# Create a Sankey diagram using Holoviews and configure options
sankey_diagram = hv.Sankey(data, ['From', 'To'], vdims = [value_dim]).opts(
# edge specs
edge_color = dim('From').str(),
edge_line_color = dim('To').str(),
edge_alpha = 0.6,
edge_line_width = 1,
# node specs
node_line_color = 'gray',
node_alpha = 0.9,
node_width = 20,
node_line_width = 1,
# title, font and figure specs
title = 'End-to-End Data Pipeline: From Source to Product',
fontsize = {'title': 20},
cmap = 'BuPu',
bgcolor = 'lavender',
label_position = 'right',
width = 900,
height = 700,
iterations = 2,
)
# Display the Sankey diagram
hv.output(widget_location='bottom')
# displaying plot
sankey_diagram
圆形打包
圆形打包为传统的树形图提供了一种时尚的变体,老实说,这种方法非常赏心悦目。此技巧涉及将圆圈嵌套在圆圈中以展示层次数据,虽然你可以深入到所需的任何层次,但我必须承认,经过两到三层后,事情可能会变得相当复杂——当然,除非你考虑的是一个覆盖整个墙面的可视化!
当你希望展示数据集中的层次和比例时,圆形打包是理想选择。
作者提供的图片
现在,让我们探索一些圆形打包真正能发挥作用的场景:
适合圆形打包的场景
在考虑圆形打包的适用场景时,值得注意的是,它本质上可以充当简单条形图的角色。然而,在这些场景中,条形图确实更好用。让我们揭示圆形打包真正发挥最佳作用的场景:
-
**层次数据:**圆形打包是展示最多 2 到 3 级层次结构的绝佳选择。它能够非常美丽地展示类别或组之间的嵌套关系。
-
**比例表示:**当目标是展示每个层次级别中的比例时,圆形打包表现优异。每个圆圈的面积直接对应于它所代表的值,提供了一种简单的方式来比较相对大小。
不适合圆形打包的场景
-
**空间限制:**如果你的可视化空间有限,圆形打包可能会变得杂乱且难以解读——尤其是在处理多个层次或小数据点值时,这在某种程度上也在插图中有所体现。在这种情况下,像树形图或条形图这样的替代方案可能会提供更清晰的见解。
-
**精确值:**就像 sankey 图一样,这种表示方式对于精确的定量值效果不佳。即使有注释,从圆圈中估计精确值也可能是直观且复杂的。
-
比较多个集合: 这点延续了前一点,当目标涉及将多个层级结构并排比较时,圆形打包可能会导致混淆。虽然它可以提供一个概览,但得出有意义的结论可能会很困难。在这些情况下,条形图、折线图或分组条形图可能更合适。
类似使用场景的替代可视化方法
根据使用情况,分组条形图、树图、树形图甚至饼图都可以作为圆形打包图的替代方案。
现在我们已经讨论了使用场景,让我们深入代码:
深入探讨圆形打包的 Python 实现
对于圆形打包的实际实现,我选择了使用由Jerome Lecomte开发的 circlify 包,该包可以在GitHub上轻松获取。让我们探讨一下我如何使用这个包展示圆形打包。
在这个插图中,我以一个特定的场景作为例子。这个例子和合成数据围绕在某个学期中,各个领域如机器学习、大数据和数据可视化中注册的数据科学课程的学生人数展开。这个场景只有 3 层,但你可以观察到,即使在第三层级,圆形打包也变得有些难以解释,因此我不得不对代码做几次手动调整以保持视觉清晰度。
尽管存在挑战,这种表示法仍然是一种非常酷的可视化,我个人觉得它非常容易理解。
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import circlify as circ
import matplotlib as mpl
import numpy as np
cmap = mpl.colormaps['rainbow']
# data for 1000 students enrolled in various data science courses normalized to 1
data = [
{'id' : 'Machine Learning', 'datum': 0.5, 'level': 1, 'children' : [
{'id': 'Supervised Learning', 'datum': 0.2, 'level': 2, 'children' : [
{'id': 'Classification', 'datum': 0.1, 'level': 3},
{'id': 'Regression', 'datum': 0.1, 'level': 3},
]},
{'id': 'Unupervised Learning', 'datum':0.2, 'level': 2, 'children' : [
{'id': 'Dimension Reduction', 'datum':0.1, 'level': 3},
{'id': 'Clustering', 'datum':0.1, 'level': 3},
]},
{'id': 'Reinforcement Learning', 'datum': 0.1 , 'level': 2}
]},
{'id' : 'Data Visualization', 'datum': 0.3, 'level': 1,'children' : [
{'id': 'Matplotlib', 'datum': 0.1, 'level': 2},
{'id': 'Plotly', 'datum': 0.1, 'level': 2},
{'id': 'ggplot2', 'datum': 0.1, 'level': 2}
]},
{'id' : 'Big Data', 'datum': 0.2, 'level': 1, 'children' : [
{'id': 'Hadoop', 'datum': 0.1, 'level': 2},
{'id': 'Spark', 'datum': 0.1, 'level': 2}
]}
]
filtered_data = [item for item in data if isinstance(item, dict) and 'datum' in item]
circles = circ.circlify(filtered_data, show_enclosure=True)
fig, ax = plt.subplots(figsize = (18, 18))
value_color = 'white'
label_color = 'black'
num_colors = len(circles)
for i, circle in enumerate(circles):
circle_patch = Circle((circle.x, circle.y),
circle.r, fill=True,
color=cmap(i / num_colors),
linewidth=2, alpha = 0.9)
ax.add_patch(circle_patch)
try:
level = circle.ex["level"]
if level == 1:
label_y = circle.y + circle.ex["datum"]
label_y_val = label_y - 0.1
elif level == 3:
label_y = circle.y
label_y_val = label_y - 0.05
else:
label_y = circle.y - circle.ex["datum"]
label_y_val = label_y - 0.07
label = circle.ex["id"]
ax.text(circle.x, label_y, label,
ha = 'center', va = 'top',
fontsize = int(18/level)+2,
color = label_color)
value = str(int(circle.ex["datum"]*1000)) + ' students'
ax.text(circle.x, label_y_val, value,
ha = 'center', va = 'center',
fontsize = int(20/level)+2,
color = value_color)
except:
label = 'Data Science Courses'
ax.text(circle.x, circle.y - 0.7, label,
ha = 'center', va = 'top',
fontsize = 22,
color = label_color)
value = '1000 students'
ax.text(circle.x, circle.y - 0.85, value,
ha = 'center', va = 'top',
fontsize = 22,
color = value_color)
ax.set_aspect('equal', adjustable='datalim')
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.gca().set_axis_off()
fig.patch.set_facecolor('black')
fig.patch.set_alpha(0.9)
plt.title("Enrollment of Students in Data Science Courses this Semester", fontsize=30, color = 'White')
plt.savefig('ds_circularpack.png', bbox_inches='tight')
plt.show()
网络图
网络图提供了一种强大的方式来直观地描绘实体之间的关系——这些实体被称为节点,以及连接它们的关系——称为边。
网络图的应用范围非常广泛,以至于一个帖子无法完全捕捉它们的潜力。此外,当处理网络图时,事情往往变得相当复杂。
本质上,网络图在数据关系不是从点 A 到点 B 的简单路径时非常有用。每当出现复杂连接的网络时,网络图作为一种有用的可视化工具,可以以直观的方式揭示复杂的关系。
作者提供的图片
所以首先让我们看看网络图的使用场景
最适合网络图的场景
尽管网络图在许多场景中非常有用,但有一些例子如下。
-
社会网络分析: 它们可以用来可视化各种实体之间的关系,例如社会连接、通信网络或协作网络。
-
影响力和中心性: 当你想要分析网络中节点的影响力或中心性时,节点属性可以帮助突出基于特定特征的关键实体。
-
社区集群: 网络图可以帮助识别数据集中的集群或社区。节点属性可以用来标记和区分不同的集群。
-
识别依赖关系: 在实体代表任务或过程,边表示依赖关系的场景中,节点属性可以提供有关每个任务的持续时间、资源、状态或依赖项的信息。
不适合网络图的场景
尽管网络图功能强大,但它们可能不是每种情况的最佳选择。以下是一些网络图表现不佳的情况:
-
简单层级: 如果数据涉及明确的层级和简单的父子关系,其他可视化方法如层次树状图可能提供更直接的表示。
-
数值精度: 和我们之前的两个可视化一样,这不是用于传达数据精度的表示,尽管你可以将数据添加到你的图中,但它比一些更合适的可视化方法需要更高的审慎。
-
许多节点和边: 大型和复杂的网络可能会变得杂乱且难以解释。如果数据集有太多节点和边,表示数据的一个子集将是更好的选择。
类似用例的替代可视化
一些相关但并不完全相同的可视化方法包括层次树状图,它们在更顺序的层级关系中提供了更大的清晰度。蜂巢图是另一种可行的替代方案,特别适用于数据中某些类型的关系。此外,和弦图可以优雅地模拟 networkx 的circular_layout
可视化中的圆形布局。
深入了解网络图的 Python 实现
对于网络图可视化,我的目标是模拟一个社会网络分析场景,使用合成生成的数据。这个设置包括 20 位影响者,每位都专注于时尚、健身和科技等不同领域。这些影响者拥有不同数量的追随者和互动水平。
在图形表示中,边表示影响者之间的连接。相同领域的连接用深灰色阴影表示,而不同领域之间的连接用深橙色阴影表示。目标是评估关注度最高的影响者的行为,并可能从他们与同行的互动中获得洞察。
需要注意的是,代码本身不会产生任何洞察,因为连接是随机分配的,网络的密度选择也是精准的。
我在这里使用了 networkx 包,并投入了一些精力来优化布局和注释,以确保对一部分简单场景具有更广泛的适应性。
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.patches as mpatches
import random
cmap = mpl.colormaps['Wistia']
# Create a graph
G = nx.Graph()
# Add nodes with attributes
influencers = [
(1, {'label': 'John', 'niche': 'Fashion', 'followers': 10000, 'engagement': 8.7}),
(2, {'label': 'Anna', 'niche': 'Technology', 'followers': 20000, 'engagement': 6.2}),
(3, {'label': 'Jane', 'niche': 'Fitness', 'followers': 15000, 'engagement': 7.5}),
(4, {'label': 'Kai', 'niche': 'Fashion', 'followers': 18000, 'engagement': 9.1}),
(5, {'label': 'Ellio', 'niche': 'Technology', 'followers': 12000, 'engagement': 5.8}),
(6, {'label': 'Cillian', 'niche': 'Fitness', 'followers': 13000, 'engagement': 8.9}),
(7, {'label': 'Vivian', 'niche': 'Technology', 'followers': 17000, 'engagement': 6.3}),
(8, {'label': 'Alex', 'niche': 'Fashion', 'followers': 14000, 'engagement': 7.1}),
(9, {'label': 'Hannah', 'niche': 'Fitness', 'followers': 9000, 'engagement': 5.9}),
(10, {'label': 'Emma', 'niche': 'Technology', 'followers': 11000, 'engagement': 5.0}),
(11, {'label': 'Daniel', 'niche': 'Fashion', 'followers': 19000, 'engagement': 8.7}),
(12, {'label': 'Danielle', 'niche': 'Technology', 'followers': 8000, 'engagement': 6.2}),
(13, {'label': 'Milo', 'niche': 'Fitness', 'followers': 12000, 'engagement': 7.5}),
(14, {'label': 'Mina', 'niche': 'Fashion', 'followers': 21000, 'engagement': 9.1}),
(15, {'label': 'Alina', 'niche': 'Technology', 'followers': 10000, 'engagement': 8.8}),
(16, {'label': 'Ali', 'niche': 'Fitness', 'followers': 16000, 'engagement': 6.1}),
(17, {'label': 'Sarah', 'niche': 'Fashion', 'followers': 13000, 'engagement': 7.2}),
(18, {'label': 'Mary', 'niche': 'Fashion', 'followers': 9000, 'engagement': 6.9}),
(19, {'label': 'Dimitri', 'niche': 'Technology', 'followers': 15000, 'engagement': 8.5}),
(20, {'label': 'Ari', 'niche': 'Fitness', 'followers': 18000, 'engagement': 5.5}),
]
G.add_nodes_from(influencers)
# In absence of actual connection we generate random connections
# i.e. about density percent of actual connections depending on wanted density
density = 0.3
all_possible_connections = [(node1, node2) for node1 in G.nodes for node2 in G.nodes if node1 != node2]
num_connections = int(density * len(all_possible_connections))
random_connections = random.sample(all_possible_connections, num_connections)
# Add edges (interactions) with colors
interactions = []
edge_colors = []
for edge in random_connections:
node1, node2 = edge
# the influencers are connected to other influencers either in same niche or different niche
# we want to visually see that
color = 'darkgray' if G.nodes[node1]['niche'] == G.nodes[node2]['niche'] else 'darkorange'
edge_colors.append(color)
interactions.append((node1, node2))
G.add_edges_from(interactions)
# Extract node attributes
node_labels = {node: f"{data['label']}\nFollowers: {data['followers']}\nEngagement: {data['engagement']}" for node, data in G.nodes(data=True)}
node_sizes = [data['followers'] for _, data in G.nodes(data=True)]
node_niches = [data['niche'] for _, data in G.nodes(data=True)]
# Create a mapping from niche names to numerical values
niche_to_num = {niche: i for i, niche in enumerate(set(node_niches))}
node_colors = [niche_to_num[niche] for niche in node_niches]
fig = plt.figure(figsize=(20, 20))
layout = nx.circular_layout(G)
nx.draw(G,
alpha = 0.6,
pos = layout,
labels = node_labels,
node_size = node_sizes,
node_color = node_colors,
cmap = cmap,
font_color = 'black',
font_size = 10,
font_weight = 'bold',
with_labels = True,
edge_color = edge_colors,
width = 3)
fig.patch.set_facecolor('yellowgreen')
fig.patch.set_alpha(0.1)
plt.title("Social Media Influencer Network", fontsize=30)
legend_handles = [mpatches.Patch(color = cmap(i / (len(niche_to_num) - 1)),
label = niche) for niche, i in niche_to_num.items()]
plt.legend(handles = legend_handles,
title = 'Niche',
bbox_to_anchor = (1, 1),
loc = 'upper right',
fontsize = 16)
plt.savefig('sni-network.png', bbox_inches = 'tight')
plt.show()
总结
当我们接近故事的结尾时,我真诚地希望你从这些可视化中获得了宝贵的见解,并且现在对它们的最佳应用场景有了更清晰的了解。
随时分享你的想法,并提出你遇到过的或想了解更多的其他可视化类型。