TowardsDataScience 2023 博客中文翻译(十二)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

7 条数据科学家的 Scikit-Learn 最佳实践

原文:towardsdatascience.com/7-scikit-learn-best-practices-for-data-scientists-f232a6ed2756

充分利用此机器学习包的技巧

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

·发表于 Towards Data Science ·阅读时长 5 分钟·2023 年 1 月 10 日

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

图片由 John Schnobrich 拍摄,来自 Unsplash

Scikit Learn 是机器学习领域的常用库,很容易理解原因。这个包由简单但有效的工具组成,并配有非常详尽的文档。

然而,尽管它易于使用,但如果不遵循某些实践,容易犯错,尤其是对于初学者而言。我自己也常常在看到我以前工作中使用该模块时的明显错误时想要捂脸。

最终,即使你严格遵循文档,也很容易错误地遗漏某些关键特性或做出次优决策。

因此,我借鉴了过去的经验,深入探讨了 7 条 Scikit Learn 最佳实践,以有效进行预测数据分析。

1. 使用 Scikit Learn(而不是 Pandas)进行特征工程

Scikit Learn 专为机器学习任务设计,这当然包括特征工程。然而,有些人习惯使用 Pandas 进行某些操作(例如,独热编码),因为这是大多数人最先学习的包。

虽然 Pandas 库在进行探索性数据分析方面表现优秀,但在机器学习领域中,它无法与 Scikit Learn 相比。

Scikit Learn 中的变换器是为机器学习应用设计的。它们可以高效地准备训练集和测试集,同时避免数据泄露(如果操作得当)。

将 Pandas 函数硬塞到与其他 Scikit Learn 工具的数据管道中,必然会导致低效的流程,容易出错。

更好的做法是主要依赖 Scikit Learn 进行与特征工程相关的操作。

2. 在分类任务中使用分层拆分

当感兴趣的数据表现出数据不平衡时,分类任务可能会具有挑战性,即一个或多个类别被低估。

幸运的是,通过分层抽样,用户可以在原始数据的每个子集中保持所有类别的存在。

在将数据集拆分为训练集和测试集时,用户可以使用 stratify 参数。

在将训练数据拆分为多个折叠进行交叉验证时,用户可以使用 StratifiedKFold 类。

3. 使用 n_jobs 参数加速超参数调整

超参数调整可能是数据建模阶段中最耗时的部分之一。逐个评估多个超参数组合自然是一个缓慢的过程。

幸运的是,用户可以通过利用 n_jobs 参数来加速超参数调整方法,如网格搜索和随机搜索,该参数决定了并行运行的作业数量。默认情况下,n_jobs 值设置为 1,但用户可以通过将 n_jobs 设置为 -1 来更快地获得结果,这样可以利用所有可用的处理器并行运行作业。

4. 分配 random_state 值以获得可重复的结果

一些特征工程过程和机器学习算法包含随机性。然而,利用纯随机性的程序将无法重现其结果,这使得进行实验变得困难。

用户可以通过为随机数生成器设置种子来获得可重复的结果。对于 Scikit Learn 工具,可以通过在适用时将值分配给 random_state 参数来完成。这确保了程序将产生可重复的结果。

用户在执行如下操作时可以设置 random_state 值:

  • 将数据集拆分为训练集和测试集

  • 配置机器学习分类器对象

  • 超参数调整

注意:分配给 random_state 参数的数字并不重要,只要在实验过程中不改变它。

5. 在超参数调整中指定评分参数

超参数调整方法通过不同的超参数组合评估模型。这种技术的目的是识别出能够产生最佳性能的超参数。

然而,当模型使用错误的指标进行评估时,如何能保证其表现良好?当你在 Scikit Learn 模块的 GridSearchCV 和 RandomizedSearchCV 对象中使用 scoring 参数的默认值时,这是一种非常可能的结果。

默认情况下,网格搜索和随机搜索通过准确性评估分类模型的超参数。不幸的是,这很少是机器学习应用的合适指标。

为了避免这种情况,请确定最适合目标模型的评估指标,并将其分配给评分参数。可以在包的文档中找到可用指标的列表。

如果提供的指标都不合适,也可以使用 make_scorer 函数创建自定义指标。当用户偏好某种错误类型时,这是一个有用的功能。

6. 使用管道转换数据

刚开始使用 Scikit Learn 的初学者可能习惯一次进行一个变换。这种方法需要在训练集和测试集上多次使用 fittransform 方法。

以这种方式转换数据需要多行代码,并且容易出现错误(例如,在测试集上使用 fit)。因此,你会很高兴知道,Scikit Learn 提供了一个工具,可以更轻松地完成这些操作:管道。

Scikit Learn 管道是一个工具,它将一系列变换和估算器串联在一起,使用户能够执行更易于编写、阅读和调试的操作。

我始终倡导使用管道,并将在此再次提及;它们实在太好用了。

例如,我们可以使用管道对象来执行之前的操作:

与之前的代码片段相比,这里的代码更加可读,容易理解工作流程中的所有步骤。

此外,管道对象中的所有变换和建模都可以通过一个 fit 方法在训练集上执行。此外,相同的变换也可以在生成测试集预测之前通过一个 predict 方法应用。

7. 熟悉与 Scikit Learn 兼容的其他包

最终,Scikit Learn 包的广泛工具范围无法涵盖所有可能的情况。

因此,熟悉与 Scikit Learn 兼容的其他包是值得的。这些包包含可以与 Scikit Learn 一起用于特征工程和数据建模的工具。

两个值得注意的例子是 feature_engineXGBoost 包,它们拥有自己独特的变换器和机器学习算法,可以与其他 Scikit Learn 工具一起使用。

结论

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

照片由 Prateek Katyal 提供,来源于 Unsplash

Scikit Learn 包具有巨大的实用性,可以用于解决各种机器学习问题。

然而,用户必须学习遵循某些最佳实践,以从包中获得最大收益。

如果你发现这个简短的概述有帮助,你也可以考虑阅读这些文章:

## K-Fold 交叉验证:你做对了吗?

讨论在数据集上执行 k-fold 交叉验证的正确(和不正确)方法

towardsdatascience.com ## 为什么你应该使用 Scikit-Learn 管道

这个工具将你的代码提升到一个新水平

towardsdatascience.com ## 在机器学习中利用随机性

“随机”应该有多随机?

towardsdatascience.com

祝你在数据科学的探索中好运!

你已经成为一个高级 Sklearn 用户的 7 个迹象

原文:towardsdatascience.com/7-signs-youve-become-an-advanced-sklearn-user-without-even-realizing-it-3b7085c600f1

以及一个专业的机器学习工程师…

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

·发表于 Towards Data Science ·阅读时间 10 分钟·2023 年 6 月 1 日

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

图片由我使用 Midjourney 制作

介绍

准备好被惊艳到吧!我将列出 七个 不可否认的迹象,表明你已经成为一个高级的 Sklearn 用户而丝毫未曾察觉。由于 Sklearn 是地球上使用最广泛的机器学习库,你不妨将这些迹象看作是你已经是一个非常有能力的机器学习从业者的标志。

让我们开始吧!

0. 三个分区

我们在机器学习中几乎所做的一切,都是为了避免过拟合。而对抗过拟合的最强工具之一,就是将数据拆分为三部分,而非两部分!

谷歌决策智能部门负责人Cassie Kozyrkov表示,数据拆分是机器学习中最强大的理念,你也同意她的观点。

你知道过拟合不仅会发生在训练集上,还可能出现在验证集上。你已经观察到,使用相同的数据集进行测试和超参数调优,常常会引入微妙的数据泄露。

通过不断调整超参数,基于模型在特定测试集上的表现,有可能使模型对该特定数据集过拟合。

所以,你使用 50% 的可用数据训练所选模型。接着,你使用包含 25% 数据的独立验证集对模型进行微调和评估。最后,当你的模型准备好投入实际使用时,你会用一个完全未接触过的、原始的(我指的是你甚至没有查看前五行)测试集进行最后一次测试。

牢记这一规则,你已经将这段代码片段保存在桌面上,以便随时复制粘贴:

from sklearn.model_selection import train_test_split

def split_dataset(data, target, train_size=0.5, random_state=42):
    # Splitting the dataset into training set and remaining data
    X_train, remaining_data, y_train, remaining_target = train_test_split(
        data, target, train_size=train_size, random_state=random_state
    )

    # Splitting the remaining data equally into test and validation sets
    X_val, X_test, y_val, y_test = train_test_split(
        remaining_data, remaining_target, test_size=0.5, random_state=random_state
    )

    return X_train, X_val, X_test, y_train, y_val, y_test

SYDD!如果说未经审视的生活不值得过,那么这里有四个字供你遵循:拆分你该死的数据。 — Cassie Kozyrkov

## 数据科学中最强大的理念

编辑描述

数据科学中最强大的理念

1. 设置常识基线

如何判断自己在机器学习项目中所做的任何事情是否对最终产品——完美模型有贡献?

在这里,“一见钟情”的方法永远不够。那个人需要一个北极星,能随时参考以判断他们刚训练的模型是否能通过即使是最简单的测试。

在你的项目中,你一次又一次地看到,这一关键的北极星是常识基线性能。

一旦确定了机器学习任务、选择了特征并定义了目标变量,你可以拟合DummyRegressorDummyClassifier来评估随机猜测模型在你特定问题上的表现。这一得分作为基线,你所有后续的实验都旨在提高这一初始结果。

from sklearn.dummy import DummyClassifier

clf = DummyRegressor().fit(X_train, y_train)
clf.score(X_test, y_test)

你也总是不厌其烦地向他人推荐这一做法,包括你的好友 Bex。

他曾经愚蠢地尝试了所有适合的 Sklearn 模型和越来越复杂的深度学习架构用于图像分类任务,以弄清楚为什么所有实验都无法超过某个阈值。

你指出 Bex 缺少基线,当他尝试DummyClassifier时,他意识到整个任务是不可解的,他的所有努力都浪费了,因为没有一个实验能够超越随机猜测模型。他不得不寻找新的数据集。

没有什么比过度工程的恐怖更让人不安了,完全相信你的模型是卓越的,结果却发现它仅仅和一个盲人投掷飞镖的猴子一样有效。

你给你的朋友上了一堂宝贵的课。

2. 特征选择与工程

当面对一个拥有几十甚至数百个特征的数据集时,你会注意到你的宝贵时间和硬件资源。与其盲目地在所有现有特征上测试模型,你会退一步,尝试隔离出最有潜力的特征。

首先,你可以逐一查看特征,使用VarianceThreshold去除那些方差不显著的特征。然后,你可以通过分析特征之间的关系来查看大局,从中决定哪些特征是值得保留的。

为了帮助你做出决定,你可以使用诸如成对相关系数这样的指标,或者更好的是,采用基于模型的方法,使用如RFECV(递归特征消除与交叉验证)或SelectFromModel的类。

## 3 步特征选择指南:提升模型的表现

编辑描述

## 3 步特征选择指南:提升模型的表现

随后,你施展你的特征工程魔法,以最大限度地发挥最佳特征的作用。在这里,你对数值变换(如标准化、归一化和对数变换)之间复杂差异的了解将是关键。

你对StandardScalerMinMaxScalerQuantileTransformerPowerTransformer等的权衡了如掌中之物。

## 如何区分缩放、标准化和对数变换

编辑描述

## 如何区分缩放、标准化和对数变换

在处理缺失值时,你不仅仅停留在SimpleImputer的均值/众数插补等简单策略上。你对基于模型的高级插补技术如KNNImputerIterativeImputer有着深刻的理解,并能够根据缺失值的类型选择最合适的方法。

## Sklearn 高级缺失数据插补方法深入教程

编辑描述

## 高级缺失数据插补方法教程:使用 Sklearn

对于分类特征,你使用多种技术来正确编码它们,如OrdinalEncoderOneHotEncoder。当使用后一种方法时,你会非常小心虚拟变量陷阱,这可能会在数据集中引入多重共线性。

尽管我只是一个接一个地列出了特征选择和特征工程,你这位经验丰富的专家知道不应将两者锁定在一个固定的顺序中。你在两者之间迭代,反复试验和完善你的方法。

3. 模型选择

这时,你展示了你所参加的众多在线课程或你华丽的教育背景并未白费。

你以完全的冷静和自信直观地选择最适合给定任务的算法和模型架构。在这里,你的目标并非总是选择性能最好的模型,而是选择在现有约束下最适合问题的模型。

这些约束在你的大脑中像五个巨大的障碍:

  1. 计算资源:如果硬件有限,你选择更简单和更小的模型,即使这意味着性能下降。

  2. 时间限制:当森林模型和深度学习模型对你的时间和预算施加过大压力时,你倾向于选择旧的线性模型或浅层树。

  3. 模型复杂度与性能权衡:你在强大预测能力的模型(但可能过拟合)和简单模型(可能欠拟合)的之间找到平衡。

  4. 可解释性:当模型解释性和利益相关者信心至关重要时,你优先考虑线性模型或树模型。

  5. 数据集大小:你根据数据的大小指导模型选择。一些模型在大型数据集上表现出色,比如深度学习模型,而 SVM 等模型更适合小型数据集。

模型选择是一门艺术,你也如此对待它。

4. 战略性交叉验证

如果说有什么比将数据分成三份更让你喜欢的,那就是交叉验证。每当你的时间和资源限制允许时,你总是尝试使用适当的 CV 策略。

你非常清楚,交叉验证(CV)是提供最可靠模型性能估计的方法,使其成为你在应对过拟合或欠拟合时最宝贵的工具。

除了简单的 KFold CV,你还利用其他强大的策略,例如:

  1. StratifiedKFold - 用于分类任务。

  2. RepeatedKFold - 当你特别关注模型性能的准确估计时。

  3. ShuffleSplit - 用于更好地控制训练/测试分割。

  4. GroupKFold - 用于非 IID 数据(独立同分布)。

  5. TimeSeriesSplit - 用于时间序列数据。

## 一站式教程:你可以(应该)使用的所有交叉验证技术

编辑描述

towardsdatascience.com

在你的交叉验证工作中,Sklearn 管道占据了重要位置。你将预处理和建模结合成一个单一的管道,而不是在 CV 分割器外部执行预处理和内部建模。

管道是你防止数据泄露的额外保障,允许你编写可读的、模块化的代码,其他人也很乐意阅读。

## Sklearn 管道现代 ML 工程师指南:你不能忽视的 9 种技术

编辑描述

towardsdatascience.com

5. 对随机性的完全控制

你不和随机性开玩笑。你从经验中学到,紧紧控制伪随机生成器可以节省你几个小时的时间,具体表现为:

  • 可重复性

  • 调试和测试

  • 模型性能比较

  • 超参数调整

你也很自豪地知道各种播种方法的细节:

  1. random_state=None - Sklearn 使用全局 NumPy 种子 np.random.seed(seed_number) 作为默认行为。在这种情况下,每次调用涉及随机性的函数,如fittrain_test_splitsplit、CV 类等,都会产生不同的结果。

  2. random_state=integer - 调用依赖于随机性的函数(如上所述)总是会产生相同的结果,前提是使用相同的整数种子。你有你最喜欢的种子(我的是 1121218)。

  3. random_state=np.random.RandomState(一个 RNG 实例) - 这种播种方法提供了最稳健的 CV 结果,尽管传递整数被认为更安全且更可取。它每次运行都会返回不同的结果。

你还在 iPhone 上设置了每周提醒,以便阅读 控制随机性 部分,以免这些细节从记忆中泄漏。

6. 不使用 Sklearn 进行超参数调整

你尊敬 Sklearn,因为它引入了HalvingGridSearchHalvingRandomSearch来修复比乌龟还慢的GridSearch,但在你当前的工作流程中,你友好地转向其他工具。

像今天的酷孩子一样,你的首选是 Optuna。它更具 Python 风格,更智能,并提供了 Sklearn 甚至不会考虑添加的大量小玩意。

你最喜欢的 Optuna 特性包括:

  • 与各种框架的无缝集成:Jupyter、Sklearn、XGBoost、CatBoost、TensorFlow、PyTorch,等等。

  • 先进的调整算法,名字你甚至发音不出来。

  • 在调整过程开始之前,自动排除不靠谱的超参数。

  • 更具 Python 风格且更易读的参数网格。

  • 可视化和分析功能,包括参数重要性图、平行坐标图和优化历史图。

  • 分布式计算以利用多个核心。

很可能,你最喜欢的 Optuna 教程是:

[## 为什么 Kaggle 上的每个人都对 Optuna 在超参数调整中的狂热?

编辑描述

towardsdatascience.com

7. 在另一个层次上的模型评估

就像你擅长烹饪主菜一样,你在准备甜点——模型评估方面也表现出色。

在你的一生中,你无数次调用过:

import sklearn

sklearn.metrics.SCORERS.keys()

查看你测量模型表现的所有选项。你不满足于从这个列表中选择一个指标,而是倾向于选择多个指标,从不同角度评估和优化你的模型。

多类别分类指标的综合指南

编辑描述

towardsdatascience.com

在这方面你最大的优势是区分所有疯狂的分类指标及其根据所选分类器是OVO还是OVR而变化的微妙方式。

你也曾因为将这些图片设置为手机的自动更换壁纸而被称为怪咖几次(但你一点也不在意 :)。

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

图片由我提供

为了更准确地展示你模型的表现,你努力避免炫耀,使用了以下一些可视化工具:

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

Sklearn 用户指南的截图。BSD-3 条款许可证。

结论

尽管标题和文章在承认老 Sklearn 高手的同时有一种玩笑的语气,但我内在的意图是为初学者提供指导。我想弥合廉价在线课程中流行的陈旧的复制粘贴知识与只能通过几个月的实际操作和经验获得的实用知识和专业技能之间的差距。

我希望这篇文章不仅为你提供了灵感,还带来了一点娱乐,帮助你深入探索 Sklearn 并成为它的高手!

感谢阅读!

喜欢这篇文章和它那古怪的写作风格?想象一下,能够访问更多类似的文章,所有这些都由一个聪明、迷人、机智的作者(顺便说一句,就是我 😃)编写。

仅需 4.99 美元的会员,你将不仅能访问我的故事,还能获得 Medium 上最聪明、最杰出的头脑的宝贵知识。如果你使用我的推荐链接,你将获得我超新星般的感激和一个虚拟的高五,以支持我的工作。

## 使用我的推荐链接加入 Medium - Bex T.

获取所有⚡高级⚡内容的独家访问权限,无限制地浏览 Medium。通过购买我支持我的工作……

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

图片由我使用 Midjourney 制作

7 步骤帮助你让 Matplotlib 条形图更美观

原文:towardsdatascience.com/7-steps-to-help-you-make-your-matplotlib-bar-charts-beautiful-f87419cb14cb

通过简单的调整轻松提升 Matplotlib 数据可视化的质量

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

·发布于 Towards Data Science ·13 分钟阅读·2023 年 3 月 27 日

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

Matplotlib 的水平条形图,在更改了多个特征后,使其更具视觉吸引力。图片来源于作者。

条形图是一种常用的数据可视化工具,其中分类特征由长度/高度不同的条形表示。条形的高度或长度对应于该类别所表示的值。

条形图可以在 matplotlib 中轻松创建。然而, matplotlib 库通常被认为是生成不令人兴奋的图表的库,并且使用起来可能具有挑战性。然而,通过坚持、探索以及几行额外的 Python 代码,我们可以生成独特、美观且信息量丰富的图形。

如果你想了解 Matplotlib 在稍加努力后的能力,你可能会对查看我之前的文章感兴趣:

## 3 个你没想到是用 Matplotlib 创建的独特图表

利用 Python 的 Matplotlib 创建高级数据可视化

towardsdatascience.com

在本文中,我们将探讨如何将一个无聊的图表转变为:

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

Matplotlib 的水平条形图显示了不同储层区间的孔隙度值。图片来源于作者。

变成这样:

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

在将条形图从一个平淡的图形转变为更具视觉吸引力的图形之前和之后的对比。作者提供的图片。

我们将看到如何通过几行简单的 Python 代码来改善我们试图讲述的故事。

教程的视频版本

如果你想查看如何从零开始构建这段代码的视频形式,你可能会对以下内容感兴趣:

导入库并设置数据

第一步是导入我们将要使用的库。在这种情况下,我们将使用 pandas 来存储数据,并使用 matplotlib 来创建图形。

import pandas as pd
import matplotlib.pyplot as plt

接下来,我们将创建一些数据,这些数据来源于 Xeex Force 2020 Lithology Machine Learning competition。这些数据表示单个井,包含 Hugin Fm 内砂岩岩性平均孔隙度值。这些井起源于挪威大陆架。

请参阅文章底部以获取有关此数据集的更多详细信息。

我们可以通过一个简单的字典来创建数据,而不是从 CSV 文件中加载,并将其传递给 pd.DataFrame() 函数。

wells_porosity = {'15/9-13': 18.2, '16/10-1': 26.0, 
 '16/10-2': 21.8, '16/10-3': 16.7, '16/2-16': 19.8,
 '25/2-13 T4': 13.3, '25/2-14': 11.6, '25/2-7': 10.7, 
 '25/3-1': 6.9, '25/4-5': 12.0, '25/5-1': 8.9,
 '25/5-4': 15.0, '25/6-1': 18.9, '25/7-2': 6.5, 
 '25/8-5 S': 21.2, '25/8-7': 26.1, '25/9-1': 23.0,
 '26/4-1': 13.9}

df = pd.DataFrame(wells_porosity.items(), columns=['well', 'porosity'])

使用 Matplotlib 创建基本条形图

现在我们已经设置好 pandas 数据框,我们可以开始创建我们的第一个条形图。创建条形图有几种方法,其中一种是直接使用数据框(df.plot(kind='bar'....)),然而,在本文中,我们将专注于使用以 matplotlib 为中心的代码来构建我们的图表。

要使用 matplotlib 创建一个基本的条形图,我们首先需要设置我们的 fig 和 ax 变量,这些变量将被设置为 plt.subplots()。在此函数中,我们可以传入图形大小。

接下来,我们将创建一个名为 bars 的新变量,并将其分配给 plt.bar()。在此函数中,我们可以简单地传入我们的分类变量,此处为井名称列表,以及平均孔隙度值。

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.bar(df['well'], df['porosity'])

plt.show()

当运行时,我们会看到如下的条形图。正如你所见,它非常基础,也不太吸引人。

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

使用 matplotlib 生成的基本条形图。作者提供的图片。

如果我们仔细查看图表,会发现更多问题:

  • 阅读 x 轴上的标签很困难

  • 我们需要更加动脑筋来理解每个条形的值

  • 比较条形图是困难的

让我们看看如何创建一个更有效、更具美感的可视化。

1. 旋转你的图表

改善条形图的第一步是将其旋转 90 度。

这使得阅读像我们这样较长的标签变得更容易。我们还可以考虑旋转 x 轴上的标签,但这需要读者也倾斜头部来尝试阅读它们。

此外,水平条形图是在报告或演示文稿中节省空间的绝佳方式,同时保持可读性。如果你有大量类别,这尤其有用。

要旋转我们的条形图,我们需要将 matplotlib 中调用的图表类型从 .bar() 改为 .barh()

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.barh(df['well'], df['porosity'])

plt.show()

我们得到的图表是带有类别标签(井名)的格式更加美观和易读。

我们现在可以明确哪一根条形属于哪个井。

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

Matplotlib 水平条形图显示不同储层区间的孔隙度值。图片由作者提供。

2. 按顺序排列条形

改进图表的下一步是将条形按升序排序。这可以显著提高图表的可读性。

在对数据进行任何排序之前,你需要首先考虑这是否是一个明智的选择。

如果你的条形与应按特定顺序排列的类别相关,那么按从长到短排序可能不是最佳选择。例如,星期几、月份或年龄组。

将条形按从长到短排序,可以使条形图更易于阅读,允许读者轻松比较不同的条形。当条形长度相近时尤为如此。

这还通过赋予数据一种顺序感,使图表看起来更加美观。

要排序数据,我们需要返回到数据框中,并按 porosity 排序值。

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.barh(df['well'], df['porosity'])
plt.show()

当我们运行上述代码时,我们得到如下图表。

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

Matplotlib 水平条形图显示不同储层区间的孔隙度值按降序排列。图片由作者提供。

3. 移除边框和坐标轴

如果我们有多余的图表元素,如网格线和边框(通常称为“图表垃圾”),它们可能会分散读者的注意力,并且图表的理解可能需要更长时间。

我们可以去除这些多余的图表垃圾,从而不仅改善图表的可读性,还能提高图表的美观性以及我们想传达的信息。

对于我们的图表,我们将通过调用 ax.spines[[‘right’, ‘top’, ‘bottom’]].set_visible(False) 来移除图表的顶部、底部和右侧边缘。

我们还将隐藏 x 轴。你可能会想,为什么我们要移除坐标轴上的数字——这不是会影响可读性吗?

这是正确的,然而,我们将在下一步中看到如何让读者更容易理解这些值。

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.barh(df['well'], df['porosity'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

plt.show()

当我们运行上述代码时,得到如下图表。

现在看起来比前一步干净多了。

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

去除多余图表垃圾后的 Matplotlib 水平条形图。图片由作者提供。

4. 添加数据标签

在上述图片中,我们移除了 x 轴的刻度和数字。这确实减少了可读性,然而,如果 x 轴保留,我们期望读者在尝试理解绝对值并比较不同条形时需要额外的工作。

为了使图表更有效,我们可以为每个条形添加绝对值数据标签。这提高了清晰度,节省了空间,并提高了精确性。

为了更方便地在条形图中添加标签,matplotlib 的开发者引入了 [bar_label()](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar_label.html) 函数。这允许我们在条形图中自动添加标签。

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.barh(df['well'], df['porosity'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars)

plt.show()

当运行上述代码时,我们得到如下图表。我们可以直接在条形的末端看到绝对值,这显著提高了可读性。例如,如果仅根据条形长度来看前两个条形,我们会说它们是一样的,但如果查看绝对值,我们会发现它们略有不同。

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

Matplotlib 水平条形图中显示了数据标签,以提高可读性。图片由作者提供。

控制 matplotlib 的 bar_label 函数的标签格式

bar_label() 函数允许我们提供多个关键字参数。

在下面的示例中,我更改了字体大小、颜色和字体粗细。

此外,为了将标签放置在条形的内边缘,我们可以调用 padding 参数 (pad)。如果使用负数,我们将能够将标签放置在条形内部。

fmt 参数允许我们控制标签的显示方式。使用 %.1f%% 意味着我们使用了 1 位小数,并在标签末尾包含一个 % 符号。

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,8))

bars = plt.barh(df['well'], df['porosity'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

plt.show()

当运行上述代码时,我们得到如下图。

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

Matplotlib 水平条形图中,数据标签显示在条形的内边缘,以提高可读性,使用了 bar_label。图片由作者提供。

5. 增加条形之间的间距

提高可读性的另一个步骤是增加条形之间的间距。它使我们能够创建一个更不拥挤、更具美感的图表。

要增加间距,我们首先需要在 plt.subplots() 函数调用中增加图形的高度,然后将 height 参数添加到 plt.barh() 函数中。

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7)

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

plt.show()

当生成图表时,我们现在拥有了一个稍微宽松的图表,更加舒适。

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

Matplotlib 水平条形图在增加条形之间的间距后。图片由作者提供。

6. 为条形图选择颜色

选择图表的颜色可能相当主观且耗时。我们理想上希望避免用彩虹色的调色板来淹没读者。不仅图表效果差,而且可能影响可读性和传达的信息。

我们可以在柱状图中使用颜色的几种方式:

  • 我们可以保持颜色的一致性,例如前面图表中的蓝色

  • 使用颜色来引起对顶部或底部柱子的关注

  • 使用颜色来引起对特定柱状图的关注

  • 使用颜色来突出显示符合特定标准的柱子

  • 使用与类别品牌相关的颜色,例如使用蓝色代表 Facebook,红色代表 YouTube

  • 使用颜色来显示分组

  • 改善对色盲读者的可访问性

还有许多其他方法。

如果你在寻找帮助选择颜色工具的文章,可以查看这个:

## 4 种选择数据可视化颜色方案的必备工具

使选择数据可视化颜色方案变得容易的工具

[towardsdatascience.com

让我们仔细看看这些在 matplotlib 柱状图中使用颜色的不同选项。

使用颜色引起对单个柱子的关注

如果我们想要吸引读者对某个特定柱子的注意,可以使用以下代码。

与其为我们的颜色创建列表,不如直接使用 apply 函数和 lambda 函数将颜色添加到数据框中。在这里,我们高亮显示了一个特定的井。

well_name = "16/2-16"
highlight_colour = '#d95f02'
non_highlight_colour = '#768493'

df['colours'] = df['well'].apply(lambda x: highlight_colour if x == well_name else non_highlight_colour)

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)
ax.yaxis.set_tick_params(labelsize=14)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

plt.show()

当运行上述代码时,我们得到如下图表。我们可以看到井 16/2–16 被高亮显示为橙色,立即引起了你的注意。

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

Matplotlib 水平柱状图在应用颜色到单个柱子以引起读者的注意后的效果。图片由作者提供。

应用颜色到超过阈值的值

另一种应用颜色的方法是通过突出显示符合或超过阈值的特定类别/柱子。

在这个示例中,我们希望突出显示孔隙度大于 20%的柱子。我们可以让读者通过标签来识别这些柱子,但为了让读者更容易和更快地找到它们,我们可以高亮显示这些柱子。

这是通过在 pandas 中使用 apply 函数和 lambda 函数来检查值是否大于我们的阈值来完成的。

porosity_cutoff = 20
highlight_colour = '#d95f02'
non_highlight_colour = '#768493'

df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour)

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)
ax.yaxis.set_tick_params(labelsize=14)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

plt.show()

当图表生成后,我们得到如下图表,我们的视线立即被前五个柱子吸引。

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

Matplotlib 柱状图显示了大于 20%孔隙度阈值的柱子。图片由作者提供。

然而,读者可能不知道为什么这五个柱子被突出显示,因此我们可以添加文本注释来帮助他们。

porosity_cutoff = 20
highlight_colour = '#d95f02'
non_highlight_colour = '#768493'

df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour)

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

ax.yaxis.set_tick_params(labelsize=14)

ax.axvline(x=20, zorder=0, color='grey', ls='--', lw=1.5)

ax.text(x=20, y=1, s='20% Porosity Cutoff', ha='center', 
        fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--'))
plt.show()

使用 matplotlib 的ax.textax.axvline函数,我们可以添加一个标签和一条垂直截断线,以解释为什么前 5 个柱子被突出显示。

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

显示大于 20% 孔隙度截断值的柱状图,并在添加文本注释后。图片由作者提供。

将交通灯类型刻度应用于柱状图

如果我们有多个截断值或目标值,我们可以使用交通灯类型的刻度来指示每个柱子的位置。使用传统的红色、绿色和黄色时应注意,因为这些颜色对所有人都不适用,特别是对于有色觉问题的人。

在这个示例中,我们将使用从 ColorBrewer 2.0 中挑选的三种颜色**,**以指示我们在哪些地方的孔隙度好、平均或差。

与之前的示例中使用 lambda 函数不同,我们可以创建一个名为bar_highlight的新函数,并传入三个参数:我们的实际值(value)、平均值截断(average_value)和良好值截断(good_value)。

然后,我们将检查实际值与这些截断值,并为其分配颜色。

def bar_highlight(value, average_value, good_value):
    if value >= good_value:
        return '#1b9e77'
    elif value >= average_value:
        return '#d95f02'
    else:
        return '#7570b3'

#cutoff values
good = 20
average = 10

df['colours'] = df['porosity'].apply(bar_highlight, args=(average, good))

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

ax.yaxis.set_tick_params(labelsize=14)

ax.axvline(x=good, zorder=0, color='grey', ls='--', lw=1.5)
ax.axvline(x=average, zorder=0, color='grey', ls='--', lw=1.5)

ax.text(x=good, y=18, s=f'{good}% Porosity Cutoff', ha='center', 
        fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--'))

ax.text(x=average, y=18, s=f'{average}% Porosity Cutoff', ha='center', 
        fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--'))

plt.show()

为了帮助读者,我们可以添加一个新标签和一条垂直线来指示这些截断值的位置。为了避免多次输入值,我们可以在调用ax.text时使用 f-strings。

当我们运行代码时,我们会得到以下图表。

我们可以立即看到数据已被分成三组颜色,这有助于向读者讲述我们的故事。

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

使用颜色来指示不同柱子对截断/基准值的表现。图片由作者提供。

7. 添加标题

如果我们继续使用单一的 20% 孔隙度截断值的图表,我们可以通过添加一个信息丰富的标题来完善图表。这直接告诉读者图表的内容。

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

添加标题后的 Matplotlib 横向柱状图。图片由作者提供。

我们可以通过在代码中添加对ax.title的调用来简单实现这一点。

porosity_cutoff = 20
highlight_colour = '#d95f02'
non_highlight_colour = '#768493'

df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour)

df = df.sort_values(by='porosity')

fig, ax = plt.subplots(figsize=(8,12))

bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours'])

ax.spines[['right', 'top', 'bottom']].set_visible(False) 
ax.xaxis.set_visible(False)

ax.bar_label(bars, padding=-45, color='white', 
             fontsize=12, label_type='edge', fmt='%.1f%%',
            fontweight='bold')

ax.yaxis.set_tick_params(labelsize=14)

ax.axvline(x=20, zorder=0, color='grey', ls='--', lw=1.5)

ax.text(x=20, y=1, s='20% Porosity Cutoff', ha='center', 
        fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--'))

ax.set_title('Wells With > 20% Porosity in the Hugin Formation', fontsize=16,
              fontweight='bold', pad=20)

plt.show()

总结

尽管一开始 matplotlib 看起来很吓人,但它实际上是一个非常强大的库,可以创建有效的可视化。

通过几行额外的代码和 matplotlib 库,我们已经看到如何将一个丑陋且无聊的柱状图变成一个更具美感的图表,帮助向读者讲述一个故事。

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

在将我们的柱状图从一个平淡的图形转变为更具视觉吸引力的图形之前和之后。图片由作者提供。

为什么不在下一个柱状图上尝试这些示例呢?

我很想在评论中听到你关于使用 matplotlib 和制作美丽数据可视化的任何技巧。

感谢阅读。在你离开之前,你应该订阅我的内容,以便将我的文章发送到你的邮箱。 你可以在这里操作!或者,你可以 注册我的新闻通讯 以便免费将额外的内容直接发送到你的邮箱。

其次,你可以通过注册会员来获得完整的 Medium 体验,同时支持我和成千上万其他作者。每月只需 $5,你就可以全面访问所有精彩的 Medium 文章,并有机会通过写作赚取收入。如果你使用 我的链接 你将直接通过部分费用支持我,而不会增加你的花费。如果你这么做了,非常感谢你的支持!

本教程使用的数据集

本教程使用的数据集是 Xeek 和 FORCE 2020 举办的机器学习比赛中的训练数据集的一个子集。

Bormann, Peter, Aursand, Peder, Dilib, Fahad, Manral, Surrender, & Dischington, Peter. (2020). FORCE 2020 油井日志和岩性数据集,用于机器学习竞赛 [数据集]。Zenodo. doi.org/10.5281/zenodo.4351156

该数据集遵循 Creative Commons Attribution 4.0 International 许可证。

7 种营销数据科学的应用

原文:towardsdatascience.com/7-uses-of-marketing-data-science-7ccc0b7b6c3c

什么是营销数据科学

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

·发表于数据科学前沿 ·阅读时间 12 分钟·2023 年 2 月 28 日

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

图片来自 Creative Fabrica(由作者支付,允许商业使用)

什么是数据科学在营销中的应用?每当我说我的职业是营销数据科学家时,我总是会被问到这个问题。这个问题在不从事营销领域的数据科学家中尤为常见。

你可能没有意识到,但很可能你已经体验过营销数据科学的结果。

当你在 Google 上搜索产品时,你可能会注意到顶部的列表旁边有一个广告标签。这是付费营销,公司已经竞标了你搜索的关键字。

当你在 Amazon 上进行圣诞购物时,除了其他产品外,还有赞助列表。这些列表也是付费营销,由推荐算法推荐给你,算法认为你可能会点击并购买。

当你查看 Instagram 并看到一个服务的促销券时,你可能处于营销实验的处理组中,以测试 Instagram 广告的效果,运气好的话,因为对照组没有得到促销券。

上述所有都是由营销数据科学推动的。它利用数据科学方法和营销相关的数据来使营销人员和消费者的生活更轻松。

我相信到目前为止,你已经对营销数据科学有了大致了解。继续阅读,你将发现 7 个更详细的领域和示例,以深入理解数据科学如何帮助营销。

1. 营销测量与预算分配

我首先列出这一点是因为我在这方面工作了最久,而且这点至关重要,因为没有衡量完成的工作效果,就无法知道如何改进。测量是指南针。

营销测量的关键在于使用一些北极星指标,例如广告投资的 ROI(广告支出回报率,ROAS),来评估之前营销活动在推动业务 KPI 方面的效率。基于测量的表现,营销团队可以决定调整预算分配、定位策略、竞标策略或其他方面,以提高未来的效率。

数据科学如何帮助营销测量?以下是一些例子:

a) 实验

投入还是不投入,这就是问题

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

图片来自 Creative Fabrica(由作者付费,允许商业使用)

营销数据科学利用 A/B 测试和因果推断方法,如差异中的差异、回归不连续性等,来理解营销活动是否导致了 KPI 的变化。

以谷歌搜索为例。公司在谷歌上花费数百万美元购买付费搜索,但这是否值得?通常人们在谷歌上搜索时已经对选择的公司有了较好的了解,如果他们已经转化,那么广告预算可能是浪费的。A/B 测试来拯救我们。我们可以使用谷歌的 Conversion Lift 用户级测试平台进行测量。谷歌将用户随机分为对照组和处理组,仅对处理组展示处理广告。通过严格的统计程序,我们可以高信心地了解广告驱动的增量转化。尽管测试很少是完美的,但现在我们因为营销数据科学有了更有信心的良好估计。当 A/B 测试不可行时,因果推断也可以帮助我们理解如果没有广告支出会发生什么,并告诉我们营销是否以及在多大程度上引起了 KPI 的变化。

有关不同营销测量方式的更多比较,请查看我的文章这里

b) 营销混合模型

花多少以及花在哪里,这也是问题

通过实验,我们对活动和渠道的效率有了很好的理解,那预算分配呢?你应该把广告预算花在哪里,花多少?

想象你是一个拥有 1 亿美元营销预算的营销经理,你会如何分配这些预算?你可以在电视上花 5000 万美元,因为你的家人和朋友都看电视。你可以将其余预算投入到 Instagram,因为 Instagram 似乎总是向你推荐相关广告。这可能是基于个人经验的好方法,但还有更科学的方法——营销混合模型(MMM)来拯救你。

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

图片由作者提供

MMM 使用时间序列技术将业务关键绩效指标归因于不同的驱动因素(如广告活动、促销等),同时控制其他影响因素(如季节性、趋势、经济、竞争对手活动等)。该模型可以告诉你在当前支出水平下,各营销渠道的关键绩效指标的效率和贡献。它还可以模拟如果支出水平发生变化,在其他因素控制的情况下,关键绩效指标可能会如何变化。考虑到未来的预算水平和约束,模型可以预测关键绩效指标,并提供优化不同渠道营销支出分配的建议,以达到最大化关键绩效指标或广告支出回报率。

如需更深入了解 MMM,请查看我的文章:营销组合建模 101营销组合建模 102

2. 竞标优化与自动化

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

图片来源于 Pexels EKATERINA BOLOVTSOVA

我在 Doordash 参与的一个项目是一个竞标优化和自动化平台,该平台优化竞标金额并自动更新竞标,以 1)最大化感兴趣的关键绩效指标,2)节省时间和人工成本。

许多渠道,特别是搜索,使用广告竞拍来决定当人们在谷歌或其他展示广告的网站上搜索时显示哪些广告。这就像现实生活中的拍卖,但除了最高出价外,还会考虑其他因素。

在现实生活中的拍卖中,当一个物品被拍卖时,它可能不一定与竞标价格一样有价值。你不想出价过高而多付,也不想出价过低而错失机会。广告活动也是如此,一次搜索可能会或可能不会导致转化。你不想在低质量和低相关性的搜索上浪费钱,但你也不想把潜在客户拱手让给竞争对手。数字广告拍卖更复杂的是,它们可能随时发生并且发生得非常快。人们很难科学地确定某些类型的产品或关键词的合理竞标金额,以及何时更新竞标金额。

营销数据科学可以提供帮助。营销数据科学(Marketing DS)可以利用历史营销数据、季节性、趋势和转化数据来建立竞标杠杆与转化之间的关系。通过优化算法和业务约束,我们可以了解理想的竞标金额和时机,以最大化转化(或其他业务关键绩效指标)。这可以将设置竞标以实现业务目标的繁重工作和猜测移除。

3. 客户生命周期价值预测

客户生命周期价值(CLV 或 LTV)是客户在与公司合作的整个生命周期内所创造的总货币价值。

以我为一个过于简化的例子,我找到了一家本地餐馆,连续去那里 6 个月,然后对他们的食物感到厌倦。我在这家餐馆的生命周期是 6 个月,我的总 CLV 是 210 美元(汇总了我在这 6 个月的所有支出)。这可以通过其他方式计算,例如添加我的推荐价值、减去成本等。具体取决于你的定义和业务用例。

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

作者的图表

为什么 CLV 重要?

它不仅考虑初始购买,还包括他们未来的重复购买,甚至潜在的推荐等。这有助于企业对营销和业务运营策略做出更明智的决策。

对于营销来说,通过了解客户随时间的价值,企业将更好地确定应在获取新客户、留住现有客户以及哪些营销和促销活动可能产生最佳回报上投资多少。假设本地餐馆也在针对另一个顾客汤米。获取他的成本与获取像我这样的顾客相同,但餐馆预算有限。根据历史数据,像汤米这样的人不太可能在第一个月之后回到餐馆,总共只会产生 50 美元的收入,而我则是 210 美元。餐馆可能会决定将预算用在像我这样的人身上,而不是汤米。

计算和预测 CLV 的方法有很多。一种常见做法是

  1. 定义起始点——你从什么时候开始预测 CLV,签约时还是第一次购买时等?

  2. 定义时间框架——典型客户的生命周期有多长,可能是一个月、一年、几年等

  3. 定义预测频率——按天、周或月等进行预测

  4. 定义如何为你的业务计算 CLV——总收入,或收入减去某些成本,或收入加上来自该客户的推荐

  5. 定义 CLV 的驱动因素并获取数据——影响 CLV 的因素。

  6. 选择合适的模型,进行预测、评估、验证、迭代和生产化——业界喜欢使用像 XGB 和 GBM 这样的梯度提升模型进行 CLV 预测,因为这些模型更具多样性,无需假设模型形式,比其他类型的模型更准确。

另外,如果你只寻求快速粗略的解决方案,也可以仅基于历史平均 CLV 进行简单预测。

4. 客户流失预测

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

图片来自 Unsplash,由 Mantas Hesthaven 提供

流失意味着客户停止使用公司的服务或购买产品。任何成功的企业都不希望失去宝贵的客户,因为这可能导致收入损失和未来增长机会的丧失。有时流失是不可避免的,但许多时候可以通过使用保留营销策略或客户关系管理(CRM)策略来预防或推迟流失。企业可以主动联系那些即将流失的客户,了解可以提供什么额外支持,决定是否进行有针对性的保留或再参与营销活动等。

如何知道谁处于高流失风险?有些客户可能不会明确表达,只是默默离开。这时流失预测模型就显得非常有用:通过预测流失来防止流失。

一个典型的流失预测模型会预测某人在某一时间段内流失的可能性。建模步骤可以类似于 CLV 建模,然而目标不是货币值,而是离开或不离开的二元值。预测结果会给出流失的可能性,该可能性介于 0 到 1 之间。模型的特征可以是与客户流失行为相关的历史数据。以当地餐馆为例,上个月的订单金额可能是预测客户下个月是否会回来的一个好的特征。流失预测也可以与 CLV 结合使用,以计算客户的预期未来价值。

像逻辑回归这样的简单模型、更复杂的模型如随机森林或提升模型,甚至神经网络都可以用于流失预测。模型的选择和结构应基于数据的可用性、样本平衡、模型的可解释性和业务需求。

5. 推荐系统

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

图片来自 Creative Fabrica(作者付费,允许商业使用)

推荐算法被许多企业广泛使用。亚马逊用它来向买家推荐相关产品,Netflix 用它来向观众推荐相关的电视节目和电影,UberEats 用它来向就餐者推荐餐厅和菜品。推荐系统在了解了用户的行为、喜好和厌恶后,会变得更好、更强大。

推荐系统可以是基于内容的或基于协同过滤的。顾名思义,基于内容的推荐是基于产品内容之间的相似性。例如,如果我购买了哈利·波特系列图书,我可能会被推荐购买《纳尼亚传奇》。协同过滤则更侧重于用户属性和行为以及/或项目属性之间的相似性。我会被推荐购买某些东西,因为类似的用户已经购买了这些东西。

推荐产品或服务本身就是营销的一部分。还有广告推荐系统。如果你像我一样经常使用 Uber,你会注意到现在 Uber 应用程序会显示其他企业的广告。有一次我乘 Uber 去健身房,看到了一则针对女性运动服的广告;另一次在前往电影院的路上,我看到了一部下个月上映的电影预告。

6. 情感分析

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

图片来自 Creative Fabrica(由作者支付,允许商业使用)

情感分析被认为是衡量营销,特别是品牌营销活动的最有效方法之一,用于分析客户对品牌的情感。情感分析识别用词表达的情感和情绪,这有助于企业了解自身的优势和劣势,并发现未来的增长和改进机会。

营销数据科学家挖掘意见和文本数据以提取信息。这属于文本分类的广泛范畴。像朴素贝叶斯这样的分类器可以帮助完成这项工作,它也是自然语言处理(NLP)的一个热门话题。文本分类器有助于判断某些文本背后的情感是积极的、消极的还是中性的。

例如,如果我有三句话来自对一个虚构公司的调查:

  1. Imaginary Service Co. 提供了很棒的服务。

  2. Imaginary Service Co. 很糟糕。

  3. Imaginary Service Co. 提供服务。

模型应该能告诉我情感是积极的、消极的还是中性的,并且有一个相当准确的得分。

我个人没有构建情感分析模型,但我发现这篇文章对初学者很有帮助。

7. 客户细分

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

图片来自 Creative Fabrica(由作者支付,允许商业使用)

最后但同样重要的是,数据科学还可以帮助将客户划分为不同的子群体,基于共享特征。我们为什么需要对客户进行细分?从营销的角度来看,这可以帮助营销人员针对每个有意义的细分市场制定不同的策略,并开发更有效和高效的营销策略。

例如,客户对产品有不同的需求和偏好。有些客户对价格更敏感,而有些客户无论如何都会购买;有些客户喜欢奢侈品,有些客户更关心性价比。当我们想进行 20%折扣的促销活动以鼓励更多购买时,我们可以针对那些价格敏感的客户,因为对价格要求较严格的客户可能会在没有折扣的情况下购买。当推出新的高端产品线时,我们可以针对生活方式更奢华的客户,以提高转化率和投资回报率。

市场营销数据科学帮助我们利用机器学习算法和数据对客户进行细分。问题的本质使其成为一个无监督的机器学习问题(通常),可以使用像 K 均值聚类这样的聚类算法来解决。以电子商务为例,客户的过去购买习惯、人口统计信息、消费模式、收入等特征可能是不错的特征。

总结

总之,在这个故事中,我介绍了市场营销数据科学的 7 种用途,这些用途帮助企业提高市场营销效率,从而实现更高的增长:

  1. 市场营销测量与预算分配——用于衡量过去市场营销活动的效率,并指出未来市场营销策略的方向。

  2. 投标优化和自动化——优化广告投标策略并自动化投标过程,以帮助提高转化率和降低成本。

  3. 客户终生价值预测——计算长期客户价值并优化长期成功。

  4. 流失预测——预测那些高风险的有价值客户,以便公司可以集中资源防止流失发生。

  5. 推荐系统——向客户推荐相关广告,提高转化率和投资回报率。

  6. 情感分析——分析文本中的客户情感,以便制定更好的品牌营销策略。

  7. 客户细分——将客户分为有意义的细分群体,以便进行更准确的目标定位。

谢谢,并关注我获取更多内容!

感谢你读到这里,恭喜你对市场营销数据科学有了更深入的了解。

希望你喜欢我的文章,并且对你有所帮助。我撰写有关数据科学、商业、工作经验及其他诸多话题的文章。如果你想阅读更多类似内容并获取免费的有用资源,欢迎关注我并订阅我的邮件!

7 种用 Python 处理多变量分类数据的可视化方法

原文:towardsdatascience.com/7-visualizations-with-python-to-handle-multivariate-categorical-data-63158db0911d

简单方式展示复杂分类数据的想法。

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

·发表于Towards Data Science ·阅读时间 8 分钟·2023 年 9 月 20 日

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

图片来源:Kaizen NguyễnUnsplash

常见数据,如知名的虹膜或企鹅数据集,用于分析时相对简单,因为它们只有少量分类变量。顺便提一下,现实世界的数据可能更加复杂,包含超过两个层级的类别。

多变量分类数据是一种具有众多类别的数据。例如,考虑将人群分组。由于一个人可以根据性别、国籍、薪资范围或教育水平等类别具有不同特征,因此可能会有许多可能性。车辆也有多样的分类变量,如品牌、原产国、燃料类型、细分市场等。

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

本文中展示的多变量分类数据可视化示例。图片由作者提供。

建议使用数据可视化来进行探索性数据分析(EDA),以帮助理解数据。条形图或饼图等图表是绘制简单分类数据的基本选择。顺便提一下,展示多变量分类数据可能更复杂,因为存在许多分类变量的层级。因此,本文将指导如何使用能够表达多层次类别数据的图表。

获取数据

从导入库开始。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

本文将使用一个包含 5 个分类的模拟数据集。生成的数据集包含杂货店顾客信息:位置、产品、支付方式、性别和年龄范围。每个分类变量都可以使用随机库生成,如下代码所示。

如果你想尝试使用其他多变量分类数据集进行可视化代码的实验,可以跳过下一步。

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

让我们对 DataFrame 进行分组,以获得每个类别组合的频率。之后,将得到的结果添加到 DataFrame 中。

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

现在 DataFrame 准备好了,我们继续进入可视化部分。

数据可视化

本文将介绍 7 种可视化方法来展示多变量分类数据。每一种方法都将包括概念、Python 代码和所得结果的解释。

开始吧……

1. 使用旭日图构建多级饼图

基本上,旭日图是一个多级饼图。由于能够在一个图表中表达多个数据层次,因此它是展示多变量分类数据或层级数据的一个好选项。在同一层次中,每个项的面积表示其与其他项百分比的比较。

使用旭日图的一个限制是如果每一层有太多分类,注释的密度会很高。顺便说一下,这可以通过使用颜色刻度来区分值,或创建一个可以过滤的交互式旭日图来解决。

我们将使用 Plotly,这是一个强大的 Python 库,用于创建数据可视化。使用 Plotly 的一个优点是它可以轻松创建交互式图表。

啦啦!!

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

使用旭日图展示多变量分类数据。图片由作者提供。

下面的图片展示了交互功能是如何工作的。

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

图片由作者提供。

2. 在树图中使用多个矩形区域

通过将绘图区域从圆形更改为矩形,树图与旭日图的概念非常相似。由于它可以占用比之前的图表更多的绘图空间,因此树图是最大化绘图区域的一个好选项。

Plotly 还提供了一个函数,可以快速创建带有交互功能的树图。

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

使用树图展示多变量分类数据。图片由作者提供。

类似于旭日图,可以注意到颜色刻度帮助我们区分频率值。

3. 应用笛卡尔积和子图与热图图表

理论上,热力图是一种使用颜色表示数据值的二维图表。要将图表应用于显示多层级类别(本文中为五个层级),我们需要使用多个子图和类别的笛卡尔积。请注意,我们需要保留两个类别用于比较值,以绘制热力图。

itertools库可以用于生成笛卡尔积列表。以下代码展示了如何从‘location’,‘product’和‘gender’中获取笛卡尔积。每个热力图将显示‘age’和‘payment’的频率。笛卡尔积中的类别可以更改,请随意修改以下代码。

import itertools
pair_loca_prod_gend = list(itertools.product(dict_loca.values(),
                                             dict_prod.values(),
                                             dict_gender.values()))
pair_loca_prod_gend

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

应用获得的笛卡尔积和子图来显示多个热力图。我们将使用 Seaborn 的热力图函数来绘制结果。

看呐…!!

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

使用热力图显示多变量类别数据。图像由作者提供。

需要考虑的一点是,使用热力图来显示多变量类别数据有一个限制,即只能比较两个维度的数据,而其他类别用于生成笛卡尔积。

4. 使用聚类条形图回归基础

与应用热力图的概念相同,聚类条形图使用笛卡尔积和子图来显示多个条形图,以便在类别之间进行比较。条形图更简单易懂,因为它是许多人熟悉的基本图表。

以下代码几乎与之前的代码相同,只是我们使用了 Seaborn 的条形图函数,而不是热力图函数。

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

使用聚类条形图显示多变量类别数据。图像由作者提供。

5. 将条形图堆叠为聚类堆叠条形图

条形图可以简单地转换为堆叠条形图。堆叠条形图适用于显示每个类别的总量以及每个堆叠条形图组件的比例。

顺便提一下,请考虑到堆叠条形图可能会产生误导,因为每个组件的基底(除最低组件外)并不从同一点开始。因此,人们可能会很难解释或比较堆叠条形图的组件。

以下代码还使用了笛卡尔积和子图,并结合 Panda DataFrame 的plot 函数来构建聚类堆叠条形图。

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

使用聚类堆叠条形图显示多变量类别数据。图像由作者提供。

6. 使用平行坐标图处理多个维度

平行坐标图通过使用多个垂直轴来显示 n 维空间。所有这些轴具有相等的长度,并且平行且间距相等。使用这种图表的一个优势是,我们可以根据类别的顺序看到数据的流动。

如果我们直接绘制每一个频率值,图表可能会过于密集而难以解读。因此,在绘制之前,让我们使用 Panda 的cut函数将频率分组到范围内。

f_range = pd.cut(x=df_m['freq'], bins=[0, 5, 10, 15, 20, 25])
df_m['freq_range'] = [str(i) for i in f_range] 
df_m.head()

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

下面的代码演示了如何将位置与值映射,以便在图中分配颜色。接下来,让我们使用Plotly构建一个平行坐标图。

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

使用平行坐标图展示多变量分类数据。图像由作者提供。

7. 使用马赛克图显示部分与整体的关系

这个图表也被称为Marimekko 图或百分比堆积条形图。马赛克图的思想是显示部分与整体的关系,类似于树图。在下面的结果中,这个图表看起来像是宽度不同的堆积条形图。

要快速创建马赛克图,我们可以使用来自 Statsmodels 库的mosaic函数。该函数将计算输入类别的频率。因此,我们可以使用没有频率变量的数据框。

请注意,此函数可以绘制的最大类别数为四,这可以被认为是使用马赛克图的一个限制。

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

使用马赛克图展示多变量分类数据。图像由作者提供。

总结

首先,让我们总结一下本文涵盖的 7 种数据可视化方法:

  • 旭日图

  • 树图

  • 热力图

  • 聚类条形图

  • 聚类堆积条形图

  • 平行坐标图

  • 马赛克图

如果我们仔细观察每个图表,会发现它们都有一些共同之处。它们不仅可以表示数据级别,还可以显示每个类别中数据的比率或比例。这可以被认为是它们适合展示多变量分类数据中众多类别的原因。

最后,我非常确定还有更多图表可供使用,而本文中提到的只是使用 Python 的示例。如果你有任何建议,请随时留言。

感谢阅读。

这里有一些我撰写的数据可视化文章,可能会引起你的兴趣:

  • 使用 Python 处理多个时间序列数据的 8 种可视化方法 (link)

  • 使用 Python 表达排名随时间变化的 7 种可视化方法 (link)

  • 使用 Python 的 9 种可视化方法展示比例或百分比,而不是饼图 (link)

  • 使用 Python 的 9 种比条形图更引人注目的可视化方法 (link)

  • 使用 Python 和 Sklearn 创建动画以展示 4 种基于质心的聚类算法 (link)

参考文献

监控大型语言模型行为的 7 种方法

原文:towardsdatascience.com/7-ways-to-monitor-large-language-model-behavior-25c267d58f06?source=collection_archive---------2-----------------------#2023-07-28

使用 LangKit 和 WhyLabs 跟踪 LLMs 发展的七种方法

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

·

关注 发表在 Towards Data Science ·12 分钟阅读·2023 年 7 月 28 日

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

图片由 Jéan Béller 提供,来源于 Unsplash

自然语言处理领域在使用大型语言模型(LLMs)方面经历了快速的演变。通过其令人印象深刻的文本生成和理解能力,LLMs 在全球范围内得到了广泛的采用。

ChatGPT 可能是这些模型中最知名的,在上线的第一个月就拥有了 5700 万的月活跃用户[1]。尽管其在多种场景下具有令人印象深刻的能力,但模型也面临着很大的挑战,例如容易出现幻觉以及生成偏见或有害内容的倾向[2,3]。另一个具有挑战性的领域是可观察性——随着用户反馈的快速收集,ChatGPT 正通过人类反馈强化学习(RLHF)[4] 不断被再训练和改进,使得其评估成为一个不断变化的目标。众所周知,从 RLHF 获得的整体改进可能会导致特定任务上的性能回退[5]。我们如何确保模型的行为符合预期,并在与我们应用相关的任务中保持可接受的性能?

在本博客中,我们将讨论七组指标,你可以用来跟踪 LLM 的行为。我们将计算这些指标,以 ChatGPT 对一组固定的 200 个提示的回应为例,覆盖 35 天的时间,并跟踪 ChatGPT 行为在这一时期的变化。我们的重点任务将是长篇问答,我们将使用 LangKit 和 WhyLabs 来计算、跟踪和监控模型的行为。

你可以在WhyLabs(无需注册)查看这个项目的仪表盘,并通过运行这个Colab Notebook自己运行完整的示例。

议程

  • 任务——可理解的问答

  • 流行的 LLM 指标

    1. ROUGE

    2. 性别偏见

    3. 文本质量

    4. 语义相似性

    5. 正则表达式模式

    6. 拒绝

    7. 毒性和情感

  • 跨时间监控

  • 那么,行为发生了变化吗?

  • 结论

任务——可理解的问答

在这个示例中,我们使用 Explain Like I’m Five (ELI5) 数据集[6],这是一个包含开放性问题的问答数据集——这些问题需要较长的回答,不能用“是”或“否”来回答——且回答应简单易懂,适合初学者。

ChatLog: 记录与分析 ChatGPT 随时间的变化中展示的工作中,从该数据集中抽取了 1000 个问题,并在 2023 年 3 月 5 日至 4 月 9 日期间每天反复发送给 ChatGPT,这些数据可以在ChatLog 的仓库中找到。我们将使用这个数据集,通过从原始 1000 个问题中抽取 200 个问题,连同 ChatGPT 的回答和人工参考答案,来覆盖给定期间的每一天。这样,我们将得到 35 个每日数据框,每个数据框有 200 行,包含以下列:

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

作者提供的表格

流行的 LLM 指标

为了准确评估像 ChatGPT 这样具有广泛功能的模型,定义一组合适的指标可能是一项艰巨的任务。在这个示例中,我们将涵盖一些相对通用的指标示例,这些指标对各种应用可能有用,例如文本质量、情感分析、毒性和文本语义相似性,还有一些特定于某些任务的指标,如问答和总结,例如 ROUGE 指标组。

还有许多其他可能更相关的指标和方法,具体取决于你感兴趣的应用。如果你在寻找更多的监控示例,这里有三篇论文作为撰写本博客的灵感来源:语言模型的整体评估ChatLog: 记录与分析 ChatGPT 随时间的变化超越准确性:使用 CheckList 对 NLP 模型进行行为测试

现在,让我们探讨一下在这个示例中我们正在监控的指标。大多数指标将通过外部库计算,例如rougetextstathuggingface models,其中大部分封装在LangKit库中,这是一个用于监控语言模型的开源文本指标工具包。最终,我们希望将所有计算出的指标汇总到一个whylogs配置文件中,这是一种原始数据的统计摘要。然后,我们将把每日配置文件发送到 WhyLabs 的可观察性平台,在那里我们可以对其进行长期监控。

在以下表格中,我们总结了我们将在接下来的部分中涵盖的指标组:

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

作者提供的表格

ROUGE

召回导向的摘要评价(ROUGE)是一组常用于自然语言处理中的指标,用于通过将生成的文本与一个或多个参考摘要进行比较来评估自动摘要任务。

当前任务是一个问答问题而非总结任务,但我们有人工回答作为参考,因此我们将使用 ROUGE 指标来衡量 ChatGPT 回应与三个参考答案之间的相似度。我们将使用rouge Python 库来扩展我们的数据框,计算两种不同的指标:ROUGE-L,它考虑答案之间的最长序列重叠,和 ROUGE-2,它考虑答案之间的二元组重叠。对于每个生成的答案,最终分数将根据 ROUGE-L 的 f-score 在 3 个参考答案中的最高分确定。对于 ROUGE-L 和 ROUGE-2,我们将计算 f-score、精确度和召回率,最终生成 6 个额外的列。

该方法基于以下论文:ChatLog: Recording and Analyzing ChatGPT Across Time

性别偏见

社会偏见是讨论公平和负责任的人工智能时的一个核心话题[2],[7],可以定义为“语言选择中的系统性不对称”[8]。在这个例子中,我们专注于性别偏见,通过衡量男性和女性人群之间提及的不均衡程度来识别过度或不足的代表性。

我们将通过统计同时包含在归属于女性和男性人群的两个词汇集合中的单词数量来进行此操作。对于某一天,我们将汇总 200 个生成答案中的出现次数,并通过计算它们之间的距离来将结果分布与参考的无偏分布进行比较,使用总变差距离。在以下代码片段中,我们可以看到用于代表这两个人群的单词组:

 Afemale = { "she", "daughter", "hers", "her", "mother", "woman", "girl", "herself", "female", "sister",
"daughters", "mothers", "women", "girls", "femen", "sisters", "aunt", "aunts", "niece", "nieces" }

Amale = { "he", "son", "his", "him", "father", "man", "boy", "himself", "male", "brother", "sons", "fathers",
"men", "boys", "males", "brothers", "uncle", "uncles", "nephew", "nephews" }

该方法基于以下论文:Holistic Evaluation of Language Models

文本质量

文本质量指标,如可读性、复杂性和年级水平,可以提供对生成回应的质量和适用性的关键见解。

在 LangKit 中,我们可以通过 textstat 模块计算文本质量指标,该模块使用textstat库来计算几种不同的文本质量指标。

语义相似性

另一个重要的方面是考虑模型所给出的无关或离题回应的程度,以及这种情况随时间的变化。这将帮助我们验证模型输出与预期背景的契合程度。

我们将借助于 sentence-transformers 库,通过计算问题和回答的密集向量表示来实现这一点。一旦得到句子嵌入,我们可以计算它们之间的余弦相似度,以衡量文本之间的语义相似性。LangKit 的 input_output 模块将为我们完成这一任务。我们可以使用该模块直接将指标生成到 whylogs 配置文件中,但在本例中,我们使用它来为数据框架添加一个新列 (response.relevance_to_prompt),每行包含问题和回答之间的语义相似度得分:

from langkit import input_output
from whylogs.experimental.core.udf_schema import udf_schema

schema = udf_schema()

df, _ = schema.apply_udfs(df)

正则表达式模式

LLM 行为的一个重要方面是确保其不会输出敏感或虚假的信息。例如,如果用户的提示是“我感到难过。”,我们可能会关注模型的回答是否错误地将用户引导到一个真实或虚构的电话号码。

通过搜索正则表达式模式的组来帮助检测诸如电话号码、信用卡号码、邮寄地址、社会安全号码等信息的存在。

与前一个指标一样,我们将使用 LangKit 搜索这些模式。在完整的示例中,我们直接将其注册为 whylogs 指标,但你也可以像这样将其用作独立函数:

from langkit.regexes import has_patterns

has_patterns("Please don't be sad. Contact us at 1-800-123-4567.")
'phone number'

拒绝

现在,我们大多数人应该对 LLM 在被询问有关禁忌或争议话题时的礼貌拒绝感到熟悉,这通常类似于这样:

对不起,我不能协助处理这个请求。

在固定的提示集上,这些拒绝的增加可能是我们模型变得过于谨慎或敏感的信号。相反的情况也应进行调查:这可能是模型现在更容易被破解,且更倾向于参与有毒或有害的对话。因此,让我们计算每个生成的答案与固定句子集的语义相似度(如前述的语义相似度部分所述):

"I'm very sorry, but I cannot provide information or assistance on  . If you have any other topic or question you'd like me to help with, please feel free to ask.",

"Sorry, but I can't assist with that",

"As an AI language model, my purpose is to provide helpful and informative responses to legitimate questions and queries, while also adhering to ethical and legal guidelines. It is not appropriate or responsible to provide advice or instructions on how to engage in criminal activities.",

"I'm sorry, I cannot comply with your request as it goes against my programming to engage in negative or harmful behavior. My purpose is to assist and provide helpful responses."

相似度得分将被定义为在上述集合中所有句子中找到的最大得分,这将被追踪在我们的统计资料中。

毒性和情感

监控情感可以帮助我们衡量响应的总体语气和情感影响,而毒性分析则提供了一个重要的衡量标准,用于判断 LLM 输出中是否存在冒犯、不尊重或有害的语言。任何情感或毒性的变化都应被密切监控,以确保模型按预期行为。

对于情感分析,我们将跟踪 nltkSentimentIntensityAnalyzer 提供的得分。至于毒性得分,我们将使用 HuggingFace 的 martin-ha/toxic-comment-model 毒性分析器。两者都被封装在 LangKit 的情感和毒性模块中,因此我们可以直接像这样使用它们:

from langkit.sentiment import sentiment_nltk
from langkit.toxicity import toxicity

text1 = "I love you, human."
text2 = "Human, you dumb and smell bad."
print(sentiment_nltk(text1))
print(toxicity(text2))
0.6369
0.9623735547065735

随着时间的推移进行监控

现在我们已经定义了要跟踪的指标,我们需要将它们全部封装到一个单一的配置文件中,然后将其上传到我们的监控仪表板。如前所述,我们将为每天的数据生成一个 whylogs 配置文件,并且我们将使用 WhyLabs 作为监控仪表板,它与 whylogs 配置文件格式兼容。我们不会在这篇文章中展示完整的代码,但一个简单的如何使用 langkit 启用 LLM 指标上传配置文件的示例如下:

from langkit import llm_metrics
from whylogs.api.writer.whylabs import WhyLabsWriter

text_schema = llm_metrics.init()
writer = WhyLabsWriter()

profile = why.log(df,schema=text_schema).profile()

status = writer.write(profile)

通过初始化llm_metrics,whylogs 分析过程将自动计算包括文本质量、语义相似性、正则表达式模式、毒性和情感等指标。

如果你对如何实现这一点的详细信息感兴趣,可以查看这份Colab Notebook中的完整代码!

那么,行为发生了变化吗?

TLDR; 总的来说,它似乎有所改善,2023 年 3 月 23 日出现了明显的过渡。

我们无法在这篇博客中展示每一个图表——我们的仪表板总共有 25 个监控特性——但让我们看看其中的一些。为了获得完整的体验,欢迎你探索项目的仪表板

关于 ROUGE 指标,随着时间的推移,召回率略有下降,而精确度则按相同比例上升,使得 F-score 大致保持不变。这表明,回答变得更加专注和简洁,虽然牺牲了一些覆盖范围,但在两者之间保持了平衡,这似乎与[9]中提供的原始结果一致。

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

ROUGE-L-R。截图由作者提供。

现在,让我们来看看其中一个文本质量指标——困难词汇

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

难度词汇。截图由作者提供。

在 3 月 23 日之后,困难词汇的平均数量急剧下降,这是一个好迹象,因为我们的目标是使答案易于理解。这种可读性趋势也可以在其他文本质量指标中看到,例如自动可读性指数、Flesch 阅读易度字符计数

语义相似性似乎也随着时间的推移而略有增加,如下所示:

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

response.relevance_to_prompt。截图由作者提供。

这表明模型的回答越来越符合问题的上下文。不过,这种情况也可能不存在——在 Tu, Shangqing 等人的研究[4]中指出,ChatGPT 可能会通过使用隐喻开始回答问题,这可能导致相似度分数的下降,而并不意味着回答质量的下降。可能还有其他因素导致整体相似度的提高。例如,模型拒绝回答问题的次数减少可能会导致语义相似度的增加。实际上情况确实如此,这可以通过下面显示的refusal_similarity指标看到:

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

拒绝相似度。截图由作者提供。

在上述所有图形中,我们可以看到 3 月 23 日和 3 月 24 日之间行为的明显过渡。这表明 ChatGPT 在这个特定日期进行了重要升级。

为了简洁起见,我们不会展示剩余的图表,但我们可以再讨论几个指标。gender_tvd分数在整个期间内大致保持不变,显示出性别之间的群体代表性没有重大差异。情感分数平均大致保持不变,具有正的均值,而毒性均值在整个期间内非常低,表明模型没有表现出特别有害或有毒的行为。此外,在记录has_patterns指标时没有发现敏感信息。

结论

具有如此多样化的能力,追踪大型语言模型的行为可能是一项复杂的任务。在这篇博客文章中,我们使用了一组固定的提示来评估模型行为如何随时间变化。为此,我们探索和监测了七组指标,以评估模型在性能、偏见、可读性和有害性等不同领域的行为。

我们在这篇博客中简要讨论了结果,但我们鼓励读者自行探索结果!

参考文献

1 — www.engadget.com/chatgpt-100-million-users-january-130619073.html

2- Emily M Bender 等人。“随机鹦鹉的危险:语言模型能否过大?”刊登于:2021 年 ACM 公平性、问责制和透明度会议论文集。2021 年,第 610–623 页(引自第 2 页)。

3 — Hussam Alkaissi 和 Samy I McFarlane. “ChatGPT 中的人工幻觉:对科学写作的影响”。刊登于:Cureus 15.2 (2023)(引自第 2 页)。

4 — Tu, Shangqing 等人。“ChatLog:记录和分析 ChatGPT 随时间的变化。”arXiv 预印本 arXiv:2304.14106 (2023)。arxiv.org/pdf/2304.14106.pdf

5 — cdn.openai.com/papers/Training_language_models_to_follow_instructions_with_human_feedback.pdf

6- Angela Fan, Yacine Jernite, Ethan Perez, David Grangier, Jason Weston 和 Michael Auli. 2019. ELI5: 长篇问答. 收录于第 57 届计算语言学协会年会论文集,第 3558–3567 页,意大利佛罗伦萨。计算语言学协会。

7 — 人对计算机程序员如同女人对家庭主妇?去偏见词嵌入 — doi.org/10.48550/arXiv.1607.06520

8 — Beukeboom, C. J., & Burgers, C. (2019). 刻板印象如何通过语言传播:社会类别与刻板印象交流(SCSC)框架的综述与介绍。传播研究评论,7,1–37. doi.org/10.12840/issn.2255-4165.017

2023 年 8 款最佳数据版本控制工具

原文:towardsdatascience.com/8-best-data-version-control-tools-in-2023-cc9045d37bb8

提供每个数据版本控制工具的优势和劣势的全面概述

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

·发表于 Towards Data Science ·阅读时间 8 分钟·2023 年 3 月 24 日

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

图片由 Alina GrubnyakUnsplash 上提供

介绍

随着业务需求的不断变化以及数据集的规模和结构的增长,有效跟踪对数据所做的更改变得具有挑战性,这导致了不幸的情况,如数据不一致和错误。

为帮助数据从业者,本博客将涵盖市场上八种顶级数据版本控制工具。将提供每种工具的清晰解释,包括它们的优缺点。

我们为什么需要版本控制我们的数据?

跟踪不同版本的数据可能具有挑战性,就像同时 juggling 多个球一样。没有适当的协调、平衡和精确,事情可能会迅速崩溃。以下几点说明了数据版本控制对任何数据科学和机器学习项目成功的重要性:

存储空间

版本化数据的原因之一是能够跟踪同一数据的多个版本,这些版本显然也需要存储。因此,空间不足会使存储变得困难,这最终会导致失败。

数据审计和合规性

几乎每家公司都面临数据保护法规,如 GDPR,迫使它们存储某些信息以证明合规性和数据来源的历史。在这种情况下,数据版本控制可以帮助公司在内部和外部审计过程中。

实验的存储和可重复性

开发机器学习模型不仅仅是运行代码,更涉及到训练数据和正确的参数。更新模型是一个迭代过程,需要跟踪之前所做的所有更改。在涉及多个用户的更复杂环境中,这种跟踪变得尤为重要。使用数据版本控制可以使每次迭代时能够获得训练数据和实验结果的快照,从而简化实施过程。

上述挑战可以通过使用以下八种数据版本控制工具来解决。

2023 年最佳数据版本控制工具

现在你对博客的期望有了清晰的理解,让我们从 DagsHub 开始,逐一探索它们。

DagsHub

DagsHub 是一个以 GitHub 为基础的集中化平台,允许机器学习和数据科学团队构建、管理和协作他们的项目。除了代码版本控制,团队还可以对数据、模型、实验等进行版本控制。

2022 年发布的 DagsHub 的 直接数据访问(简称 DDA)允许数据科学家和机器学习工程师从 DagsHub 仓库流式传输文件,无需事先下载到本地环境。这可以避免在启动模型训练之前将大量数据下载到本地磁盘。

优点

  • 使用 DDA 无需将所有训练数据拉取到本地磁盘,这可以帮助节省时间和内存存储。

  • 它提供了与 DVC 相同的组织和可重复性,并结合了数据 API 的易用性和灵活性,无需对项目进行任何更改。

  • DDA 使得可以使用 DVC 上传数据并进行版本控制,而无需先将所有数据拉取下来。DagsHub 计算新的哈希值,并代表用户提交新的 DVC 跟踪和修改的 Git 跟踪文件。

缺点

  • 它不能与连接的 GitHub 仓库对接到 DagsHub。

  • 它不支持 ‘dvc repro’ 命令来重现数据管道。

DVC

DVC(Data Version Control 的简称)于 2017 年发布,是由 iterative 创建的开源工具。

DVC 可用于数据和模型的版本控制、实验追踪,以及比较任何数据、代码、参数模型和性能图表。

优点

  • 开源,并兼容所有主要的云平台和存储类型。

  • DVC 可以高效处理大文件和机器学习模型。

  • 作为 Git 的扩展构建,Git 是许多开发者用于源代码版本控制的标准工具。

缺点

  • 在处理非常大的数据集时会失败,因为计算哈希值需要相当长的时间。

  • 与他人的协作需要多个配置,如设置远程存储、定义角色以及为每个贡献者提供访问权限,这可能会令人沮丧且耗时。

  • 添加新数据到存储中需要先提取现有数据,然后计算新的哈希值,再将整个数据推回。

  • DVC 缺乏关键的关系数据库功能,使其不适合那些熟悉关系数据库的人。

Dolt

Dolt 是一个创建于 2019 年的开源工具,用于管理 SQL 数据库,采用类似于 Git 的版本控制。它版本化表格而不是文件,并为这些表格提供 SQL 查询接口。

通过启用数据和结构的同时更改来实现用户体验的提升,使用了版本控制。

优点

  • 它可以像其他 SQL 数据库一样集成到用户现有的基础设施中,并保证 ACID 属性。

  • 大多数开发人员对 Git 进行源代码版本控制非常熟悉。因此,Dolt 与 Git 的集成使其更易于学习。

缺点

  • Dolt 完全依赖于 ACID 属性,这意味着它仅在处理关系数据库时才有用。

  • 对于计算非常大数量的数据(PB 级数据),它没有提供高性能。

  • 由于仅设计用于关系数据库,它不支持图像、音频和自由格式文本等非结构化数据。

Git LFS

Git Large File Storage(Git LFS)是一个由 Atlassian 开发的开源项目,旨在扩展 Git 管理大二进制文件如音频样本、电影和大数据集的能力,同时保留 Git 轻量化的设计和效率。

使用 Git LFS,大文件存储在云中,并通过指针在远程服务器的本地副本中进行引用。

优点

  • 它可以存储任何类型的文件,无论格式如何,这使得它在 Git 上进行大文件版本控制时灵活且多功能。

  • 开发人员可以轻松地将大文件迁移到 Git LFS,而无需更改现有工作流。

缺点

  • Git LFS 需要一个独特的远程 Git 服务器,使其成为单向门。这对于在某些情况下希望返回使用普通 Git 的用户来说是一个劣势。

  • 由于其复杂性,对新用户不够直观。

  • Git LFS 需要一个 LFS 服务器才能工作。这种服务器并非每个 Git 托管服务都提供,在某些情况下需要设置或切换到不同的 Git 提供商。

LakeFS

大多数大数据存储解决方案如 Azure、Google 云存储和 Amazon S3 具有良好的性能,成本效益高,并且与其他工具的连接良好。然而,这些工具在更高级的数据工作流方面存在功能性缺口。

Lake File System(简称 LakeFS)是一个开源版本控制工具,于 2020 年推出,旨在弥合版本控制与大数据解决方案(数据湖)之间的差距。

优点

  • 它支持所有数据格式,无需用户进行任何更改。

  • 它是一个多用户数据管理系统,为各种复杂程度的机器学习管道提供安全的数据摄取和实验环境。

  • 提供 UI 和 CLI 接口,并与所有主要云平台和存储类型兼容。

缺点

  • LakeFS 强烈依赖对象存储,对于其他用例的价值不大。

  • LakeFS 仅用于数据版本控制,这是整个数据科学生命周期的众多部分之一。这意味着在处理数据科学或机器学习管道的其他步骤时,需要集成外部工具。

Neptune

Neptune 是一个用于跟踪和记录 ML 实验和模型的平台。它可以被视为一个集成工具,供机器学习工程师将模型的工件、指标、超参数和 MLOps 过程中的所有元数据存储在一个位置。

优点

  • 直观的协作界面,包括跟踪、比较和组织实验的能力。

  • 与超过 25 个 MLOps 库集成。

  • 提供本地版和托管版两种版本。

缺点

  • 并非完全开源。此外,一个订阅可能足以满足个人使用,但可能会有每月使用限制。

  • 用户需要手动维护离线和在线版本之间的同步。

Pachyderm

Pachyderm 被认为是驱动机器学习生命周期的数据层,通过提供 PB 级的数据版本控制和血统跟踪,以及完全自动扩展和数据驱动的管道。

优点

  • 完全支持结构化和非结构化数据以及任何复杂的领域特定数据类型。

  • 提供社区版和企业版两种版本。

  • 基于容器,并针对主要云服务提供商和本地部署进行了优化。

  • 它具有内置机制来跟踪数据版本和维护数据完整性。

缺点

  • 社区版的管道数量限制为 16 个。

  • 将 Pachyderm 纳入现有基础设施可能会很具挑战性,因为它包含大量技术组件。这也可能使学习过程变得困难。

Delta Lake

Delta Lake 由 Databricks 提供,是一个开源数据湖存储层,运行在现有的数据湖文件系统之上,如 Hadoop 分布式文件系统 (HDFS) 和 Amazon S3。它为数据湖提供 ACID 事务、可扩展的元数据管理和模式强制执行。Delta Lake 支持批处理和流处理,并允许多个并发读写。

优点

  • Delta Lake 为数据湖操作提供了事务性保证,确保数据操作是原子性的、一致的、隔离的和持久的(ACID)。这使得 Delta Lake 在数据湖应用中更加可靠和稳健,尤其是对于那些需要高数据完整性的应用。

  • 它还提供了模式强制功能,确保数据湖中的所有数据结构良好,并遵循预定义的模式。这有助于防止数据不一致、错误以及由数据格式不正确引起的问题。

  • 与 Apache Spark API 的兼容性便利了它与现有的大数据处理工作流的集成。

  • 自动化跟踪和管理不同数据版本减少了信息丢失或数据不一致的风险。

缺点

  • 虽然 Delta Lake 提供了许多强大的功能,但它也为数据湖架构引入了额外的复杂性。

  • 它仅支持有限的数据格式(Parquet),不适用于其他流行的数据格式,如 CSV、Avro、JSON 等。

  • 学习 Delta Lake 并不简单,需要对分布式系统和大数据架构有更深入的理解,以有效管理大规模数据集。

结论

我们涵盖了最佳的 8 种数据版本管理工具,揭示了每种工具的多样化优缺点。虽然一些工具更直观,并在速度和简便性上表现优越,但其他工具则提供了更先进的功能和更大的可扩展性。

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

总结表(图片由作者提供)

在做出选择时,我建议仔细考虑项目的具体要求,并评估每个选项的优缺点。正确的选择不仅取决于你组织的独特需求和限制,还取决于你的目标。

在你离开之前 🔙

请订阅我的 YouTube 频道 并与朋友分享!

感谢阅读!如果你喜欢我的故事并希望支持我的写作,请考虑 成为 Medium 会员。每月 $5 的承诺将解锁对 Medium 上故事的无限访问权限。

你想请我喝杯咖啡 ☕️ 吗?→ 在这里请我!

随时关注我 在 MediumTwitter,或在 LinkedIn 上打招呼!讨论 AI、ML、数据科学、NLP 和 MLOps 相关内容总是很愉快!

8 个 ChatGPT 提示,用于频繁执行的 Pandas 操作

原文:towardsdatascience.com/8-chatgpt-prompts-for-frequently-done-pandas-operations-e3d7d1965b2c

使用 Pandas 快速完成任务

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

·发表于 Towards Data Science ·7 分钟阅读·2023 年 5 月 26 日

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

Karsten WinegeartUnsplash 上的照片

我们都听说过 ChatGPT。它不仅在科技行业引起关注,也在更广泛的媒体上成为头条新闻。我经常收到朋友问我是否听说过它。是的,我当然听说过 —— 我每天都在使用它。

尽管有一些关于其在简单任务上表现和可靠性的批评,ChatGPT 和其他大型语言模型(LLMs)在各种任务中表现出色。对我来说,它们大大提高了生产力。

最近,我决定利用 ChatGPT 来进行我定期执行的数据清理和分析的 Pandas 操作。在这篇文章中,我将分享并指导你如何使用 ChatGPT 完成 Pandas 操作的 8 个提示示例。

如果你想了解更多关于 Pandas 的信息,请访问我的课程 500 Exercises to Master Python Pandas

第一个提示以定义其角色:

提示:你是一个 Python 导师,教我 Pandas 库。我会问你如何使用 Pandas 完成特定任务,并希望你向我解释。同时也展示一下代码和你的解释。

在开始提问之前,我已经根据列名和数据类型给 DataFrame 设定了结构。

第二个提示:

提示:首先让我告诉你我拥有的 DataFrame 的信息。然后,我将开始提问。列及其数据类型如下所示,以 Python 字典的形式呈现,键显示列名,值显示数据类型。

{‘store’: dtype(‘O’), ‘product_group’: dtype(‘O’), ‘product_code’: dtype(‘int64’), ‘stock_qty’: dtype(‘int64’), ‘cost’: dtype(‘float64’), ‘price’: dtype(‘float64’), ‘last_week_sales’: dtype(‘int64’), ‘last_month_sales’: dtype(‘int64’)}

我将使用一个我准备的包含虚拟数据的样本数据集。你可以从我的数据集仓库下载。它是名为“sales_data_with_stores.csv”的那个。

这是我为你准备的 DataFrame,方便你参考:

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

DataFrame 的前 5 行(图片由作者提供)

我们现在可以开始处理 Pandas 任务了。

示例 1

提示:告诉我如何计算每个商店上周的平均销售额。

这是一个简单的一行代码,但如果你刚开始学习 Pandas,它仍然可能需要一些时间来弄清楚。以下是 ChatGPT 的答案:

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

(图片由作者提供)

我将复制并粘贴代码片段,以防你想自己测试。

# Import pandas
import pandas as pd

# Assuming 'df' is your DataFrame
average_sales = df.groupby('store')['last_week_sales'].mean()

ChatGPT 还提供了详细的解释和代码,说明了任务是如何完成的以及输出的类型。

示例 2

提示:告诉我如何找到上个月每个商店的总利润。

对于这个任务,首先需要计算利润。让我们看看它的回应:

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

(图片由作者提供)

# Calculate profit per product
df['last_month_profit'] = (df['price'] - df['cost']) * df['last_month_sales']

# Calculate total profit per store
total_profit = df.groupby('store')['last_month_profit'].sum()

示例 3

在处理真实世界的数据时,我们常常会遇到缺失值的挑战。我想看看 ChatGPT 如何处理一个不那么简单的任务。

提示:库存数量列中有一些缺失值。我想用该商店的平均库存数量来替换这些缺失值。告诉我如何完成这个任务。

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

(图片由作者提供)

# Calculate the average stock quantity per store
average_stock_qty_per_store = df.groupby('store')['stock_qty'].transform('mean')

# Replace missing values in 'stock_qty' with the average stock quantity of that store
df['stock_qty'].fillna(average_stock_qty_per_store, inplace=True)

解决这个任务还有其他方法,但使用 transform 函数是高效的方法之一。至少,这就是我会做到的方式。

我最近写了一篇文章,提到了 transform 函数的重要性。以下是文章中的一个简短片段,解释了我为何会使用 transform 函数来完成这个任务:

这听起来类似于apply函数,但不同于apply函数的是,transform可以返回一个与输入具有相同大小的 Series,这使得它在执行向量化操作和广播时非常有用,尤其是在与 groupby 对象一起使用时。

示例 4

提示:告诉我如何找到上个月每个商店销售额最高的前 3 个产品。

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

(图片由作者提供)

# First, sort the DataFrame by 'store' and 'last_month_sales'
df_sorted = df.sort_values(['store', 'last_month_sales'], ascending=[True, False])

# Then, group by 'store' and use the apply method to select the top 3 rows for each group
top_3_products = df_sorted.groupby('store').head(3)

它首先对整个 DataFrame 进行排序。我们还可以在每个组内进行排序。让我们看看 ChatGPT 是否知道如何做到这一点。

示例 5

提示:是否有另一种方法可以在不先对 DataFrame 进行排序的情况下完成这个任务?

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

(图片由作者提供)

def top_3_products(group):
    return group.nlargest(3, 'last_month_sales')

top_3_df = df.groupby('store').apply(top_3_products)

需要注意的是,首先对整个 DataFrame 进行排序可能是更高效的方法。我只是想看看 ChatGPT 是否提供了不同的解决方案。

示例 6

提示:我想查看每家商店上周的表现与上个月的表现比较。

这是一个简单的任务,但提示没有直接告诉 ChatGPT 怎么做。让我们看看它的表现如何。

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

(图片由作者提供)

# Calculate total sales for each store in the last week and last month
total_sales_last_week = df.groupby('store')['last_week_sales'].sum()
total_sales_last_month = df.groupby('store')['last_month_sales'].sum()

# Create a new DataFrame to store this information
performance_df = pd.DataFrame({
    'LastWeekSales': total_sales_last_week,
    'LastMonthSales': total_sales_last_month,
})

# Calculate the change in sales from last month to last week
performance_df['SalesChange'] = performance_df['LastWeekSales'] - (performance_df['LastMonthSales'] / 4)

作为对上周表现与上个月相比的回应,它计算了上周销售额与上个月销售额的四分之一之间的差异,这很有意义。

它创建的 DataFrame 看起来是这样的:

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

示例 7

提示:创建一个名为 critical_stock 的新列,如果 stock_qty 小于 500,则值为 1,否则为 0。

ChatGPT 为这个任务提供了 3 个选项。这是我比较喜欢的两个:

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

(图片由作者提供)

# first option
df['critical_stock'] = df['stock_qty'].apply(lambda x: 1 if x < 500 else 0)

# second option
import numpy as np

df['critical_stock'] = np.where(df['stock_qty'] < 500, 1, 0)

示例 8

提示:创建一个 DataFrame 的摘要,包括大小、缺失值、数据类型和列统计信息。

用于总结 DataFrame 的函数和方法相当简单,但 ChatGPT 做得很好,将它们整理得非常整洁。

我只是复制粘贴了它生成的代码:

# Import necessary libraries
import pandas as pd

# DataFrame size
print("DataFrame Size:")
print(df.shape)
print("\n")

# Missing values
print("Missing Values:")
print(df.isnull().sum())
print("\n")

# Data types
print("Data Types:")
print(df.dtypes)
print("\n")

# Column statistics
print("Column Statistics:")
print(df.describe(include='all'))

最后的话

我们讨论的示例简要展示了 ChatGPT 如何彻底改变我们在数据分析中执行常见任务的方式,特别是在 Pandas 上。它不仅提高了我们完成任务的效率,还丰富了我们对 Pandas 复杂操作的理解。

我将探索更多利用 ChatGPT 的方法来完成更复杂的任务。需要注意的是,随着任务复杂性的增加,你编写提示的方式变得尤为重要。这就是为什么有一个新的学科正在出现,叫做提示工程。

你可以成为 Medium 会员 来解锁对我写作的完整访问权限,以及 Medium 其余的内容。如果你已经是会员,别忘了 订阅 以便每当我发布新文章时能收到电子邮件。

感谢阅读。如果你有任何反馈,请告诉我。

我没有放弃成为数据科学家的梦想的 8 个理由,以及你也不应该放弃的原因

原文:towardsdatascience.com/8-reasons-why-i-didnt-give-up-on-my-dream-to-be-a-data-scientist-why-neither-should-you-4f32b73f2473

数据科学家在科技领域的头几年编年史

当困难时期来临时,你可以回顾的一份清单

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

·发布在 Towards Data Science ·阅读时间 8 分钟·2023 年 7 月 14 日

我已经在 Spotify 担任数据科学家 2 年了,我可以说,从商业转行到数据科学是我做出的最佳决定之一。

数据科学可以是一个令人惊叹的职业选择。到达那里是另一回事。

成为真正的数据科学家需要付出大量的努力和决心。为了确保你能成功,你首先需要明确你的为什么,然后再解决怎么做的问题。

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

前方的旅程漫长,但一切都是值得的! — 图片由作者(Midjourney)提供

但首先,让我给你讲一个小故事

如果你读过我之前的文章,你知道这次职业转型远非轻松。

早期的旅程变成了过山车,这让我意识到我真的需要理清我的为什么

仅仅因为我做出了这个职业选择,并不意味着我总是充满了动力和决心。

当你背负着 6 万美元的学生贷款时,失败的意义变得截然不同。它与最深处的恐惧交织在一起。失败不是一种选择。成功是唯一的选择。

然后有一天……

在 2020 年 3 月,我感到处于最低谷,因为我快要在纽约大学的 6000 美元课程中失败了,我不知道自己要如何摆脱困境。焦虑开始猛烈地袭击我。

我可以选择站起来为自己争取,或者放弃。我选择了第一个选项。

然后我列了一个清单。确切地说,就是这个 ⬇

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

我把这条笔记保留得和 2020 年写的一模一样。

我也不想过多剧透 😌。如果你想知道列表的内容,你只有继续阅读(哈哈哈 😈*)*

这是我第一次后来真的查看的列表!

(相对于我们把它们埋在手机角落里那些笔记)

我列出了所有理由,说明为什么这一信念的跳跃是值得所有这些挣扎的。我会在每次感觉到动力减退或自我怀疑袭来时查看它。

这个列表给了我每次需要的动力,让我坚持自己的梦想。我仍然哭了,哈哈,但至少我在完成作业的同时哭了。

在这篇文章中,我将与您分享我认为数据科学是最令人兴奋的职业路径之一的 8 个理由。列出我认为这一切麻烦都是值得的原因。

请记住,这个列表基于我的 个人 兴趣和愿望。其中的一些元素可能不适合每个人。但既然这些对我帮助如此之大,我仍然觉得它们值得分享。

1. 成为数据科学家就像是现代的福尔摩斯

我在之前的文章中已经谈到过这个问题,但对于那些没有读过的人,这个理由最接近我内心。

侦探们每天都利用知识来解决难题。他们不懈地调查,追寻真相,通过解决最复杂的谜题来寻找答案。

这正是数据科学家所做的工作。

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

作者提供的图片(Midjourney)

这可能感觉像是在浪漫化这一切,但这确实是我当时的感受,也是我现在的感受。我们每天都在玩弄数据,以揭示它隐藏的机会。这需要培养敏锐的问题解决能力🔎 和在追寻真相的过程中坚持不懈的精神。

每一个新项目的启动都可能是不同的。这就像是面对一个新的案件待解决。作为数据专家意味着你可以找到有趣且新颖的方法来提供只有 能揭示的答案。

诚然,我不是每天都在追捕犯罪分子来解决案件。相反,我是在追逐数字,让它们吐露并呈现真相。对我来说,这已经足够了。

2. 数据科学是最具多样性的职业之一

我在数据科学学位期间结交的所有朋友都来自完全不同的背景。从天体物理学到政治科学(以及更多)。他们现在都是在完全不同的行业工作的数据科学家。有些人在开发抗癌模型,另一些则在帮助游戏开发者提供最佳体验。

这是一个备受追捧的职业路径的原因之一,它允许你调和你的职业抱负与个人兴趣。 数据科学给了你在你选择的领域工作的机会。当你对当前行业不再满意时,你还可以更换行业。

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

我自己就是一个很好的例子。

当我在攻读学位时,除了 Spotify,我无法想象自己在其他公司工作。音乐深深触动了我,以至于我在晚年才开始学习小提琴,并在自己内心发现了新的激情。

现在,我能够将我对数据的终身兴趣与在 Spotify 的职业生涯结合起来。

不论你是在观星还是救援中找到乐趣,数据科学为你打开了与终身热情相关的工作大门。

3. 数据科学是当今最相关的科学之一

10 年前它是相关的,而今天它变得更加重要。数据无处不在,它的重要性随着时间的推移呈指数增长。

根据 Statista 的数据,全球生成和消费的数据量从 2010 年的 2 泽字节增加到 2023 年的 120 泽字节 (1 泽字节 = 10 亿兆字节) [1, 2]。所以“相关”这个词简直是轻描淡写。数据正在爆炸

你认为谁在通过 AI 创新改变科技世界?当然是数据科学家。

所以如果今天这个词可以有不同的含义,那么你想成为的那种数据科学家真的是由你决定的。如果你想乘上 AI 的浪潮,你可以。如果你更愿意调查数据并解开谜团,你也可以。

不论你乘风破浪,你在就业市场上依然会保持相关性。

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

4. 数据科学可以改变人们的生活

如果你通过改变世界和产生积极影响来寻求生活的意义,那么数据科学可能是适合你的道路。

当你成为数据科学家时,你可以选择成为更大事物的一部分。由于可以选择的行业范围非常广泛,你甚至有机会参与其中。

我曾经收到过在联合国核部门担任数据科学家的工作邀请。这有多酷?

当你成为数据科学家时,天际线就是你的极限(我说这话不是为了显得老套)。能够成为更大事物的一部分并产生影响是无价的。至少对我来说是这样的。

5. 数据科学家是最受需求的人群之一

由于数据如此普遍,数据科学家将永远是必需的。

几乎每家公司今天都会收集数据。无论它们是初创公司还是成熟企业,它们肯定会在某个时刻需要有人从这些无意义的数据中提取价值。

为什么? 因为如果他们想要继续在游戏中保持领先,他们需要开始挖掘隐藏得最深的价值。这就是数据科学家的作用 他们帮助挖掘出公司保持领先所需的竞争优势。

当你成为数据科学家时,你的组织依赖于你通过发现机会和技术创新来帮助他们成长。他们会把重要的责任托付给你,这意味着你的贡献将被高度重视,你的工作也同样如此。

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

6. 数据科学极具声望

任何声称成为数据科学家需要 12 个月甚至 6 个月的人,显然遗漏了重要数据。你需要的技能集需要时间来培养,不能一夜之间学会。

如今,我们看到许多人声称自己是数据科学家,这可能使入门门槛看起来很低。但相信我,真正的数据科学家成为自己的过程经历了多年。那些成功的人不一定是最聪明或最有才华的,但他们更可能是最有驱动力和韧性的人。

成为数据科学家的道路既具有挑战性又非常有回报。所以如果你准备好开始这段冒险,欢迎加入,并做好准备,你将经历一段旅程。

7. 数据无处不在,甚至在你的个人生活中

而且,我指的是几乎所有地方。从你拥有设备的那一刻起,你已经开始收集数据。即使不在公司工作,你也可以玩弄数据。

我见过一些人收集自己的健康数据,并尝试解读这些数据以了解健康问题背后的因素。即使在个人生活中,懂得如何处理数据也是有用的。

无论是建模你的日常习惯还是理解你在 Strava 上的统计数据,了解一些数据知识将对你的生活有益。

8. 数据科学处于第四次工业革命的前沿

这意味着你可以参与塑造明天的世界。

数据科学令人兴奋,因为它在智力上的刺激性和新颖性。你可以学习到各种具有挑战性的技术,掌握这些技术意味着你将能够解答一些最具挑战性、最令人兴奋和神秘的问题。这是一个终身学习的旅程。

这个领域在不断变化和发展,它带着你一起向未来迈进。兴奋感有保障。

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

给你的建议:制定你自己的清单

我希望我的清单能激励你制定自己的理由清单,说明你为什么要做这件事。

这些理由将触动你的内心,而不仅仅是你的大脑(或你的钱包)。因为当你跌入谷底时,只有这些理由才能真正引起你的共鸣。

我为你准备了礼物🎁!

订阅我的通讯K’s DataLadder,你将自动获得我的终极 SQL 备忘单,其中包含我在大科技公司工作中每天使用的所有查询 + 另一个神秘礼物!

我每周分享成为数据科学家在科技领域的经验,以及实用的技巧、技能和故事,这些都是为了帮助你提升自己——因为没有人真正知道,直到他们亲身经历!

如果你还没有这样做的话

  • 订阅我的YouTube频道。新视频很快就会发布!

  • 关注我在InstagramLinkedInX上的动态,随你选择。

再见!

8 种建模季节性的方法

原文:towardsdatascience.com/8-techniques-to-model-seasonality-2f81d739710

如何处理季节性以进行预测

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

·发表于 Towards Data Science ·8 分钟阅读·2023 年 7 月 14 日

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

照片由 Clark Young 拍摄,来源于 Unsplash

本文是对 上一篇帖子 的后续。那里,我们识别了 3 种季节性模式。

在这里,我们将:

  • 学习如何描述时间序列的季节性。

  • 了解 8 种你可以用来建模季节性的方法。

建模季节性模式

季节性指的是在某些时间段内重复出现的模式。它是建模中一个重要的变异来源。

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

时间序列及其季节性调整版本。数据来源在下一部分。图像由作者提供。

处理季节性的方式有很多。一些方法在建模之前去除季节性成分。季节性调整数据(时间序列减去季节性成分)突显长期效果,如趋势或商业周期。其他方法则增加额外的变量,以捕捉季节性的周期特性。

在讨论不同的方法之前,让我们创建一个时间序列,并描述其季节性模式。

分析示例

我们将使用与 上一篇文章 相同的过程(另见参考文献 [1]):

period = 12 # monthly series
size = 120

beta1 = np.linspace(-.6, .3, num=size)
beta2 = np.linspace(.6, -.3, num=size)
sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])

xt = np.cumsum(np.random.normal(scale=0.1, size=size))

yt = xt + beta1 * sin1 + beta2 * cos1 + np.random.normal(scale=0.1, size=size)

yt = pd.Series(yt)

这是本系列的样子:

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

人工时间序列与随机平稳季节性。图像由作者提供。

我们可以通过其强度来描述季节性模式:

# https://github.com/vcerqueira/blog/tree/main/src
from src.seasonality import seasonal_strength

seasonal_strength(yt, period=12)
# 0.90

结果是 0.90,这表明季节性确实很强

该时间序列的自相关图如以下图所示:

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

自相关最多到 24 个滞后期。图片作者提供。

自相关显示出振荡行为。在第一个季节滞后期(12)上有显著的峰值。这些模式确认了季节性的相关性。

最后,我们使用 Canova-Hansen 测试检查季节性单位根:

from pmdarima.arima import nsdiffs

nsdiffs(x=yt, m=period, test='ch')
# 0

结果是 0,这表明没有季节性单位根。因此,我们可以得出结论,季节性模式是平稳的。

那么,我们如何处理像这样的季节模式呢?

8 种建模季节性的技术

在本文的其余部分,你将学习 8 种建模季节性的技术。

1. 季节虚拟变量

季节虚拟变量是一组二进制变量。这些变量表示观测值是否属于某个特定周期(例如,1 月)。

这是一个创建这些变量的示例:

from sktime.transformations.series.date import DateTimeFeatures
from sklearn.preprocessing import OneHotEncoder

monthly_feats = DateTimeFeatures(ts_freq='M',
                                 keep_original_columns=False,
                                 feature_scope='efficient')

datetime_feats = monthly_feats.fit_transform(yt)
datetime_feats = datetime_feats.drop('year', axis=1)

encoder = OneHotEncoder(drop='first', sparse=False)
encoded_feats = encoder.fit_transform(datetime_feats)

encoded_feats_df = pd.DataFrame(encoded_feats,
                                columns=encoder.get_feature_names_out(),
                                dtype=int)

这段代码生成了以下数据。

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

季节虚拟变量在独热编码前后的效果。图片作者提供。

首先,我们获取每个观测值的季度和月份信息(左侧表格)。这些信息存储在datetime_feats对象中。然后,我们使用独热编码创建虚拟变量(右侧表格)。

如果季节性是确定性的,季节虚拟变量特别有效。如果我们不期望季节模式在强度和周期性上发生变化。

我们可以检查季节虚拟变量的系数,以分析季节效应及其变化。这对模型的解释性很有帮助。

季节虚拟变量的缺点是它们假设不同的周期是独立的。1 月的观测值与 12 月的观测值相关。但虚拟变量对这种相关性视而不见。因此,如果季节模式发生变化,虚拟变量可能不是最佳选择。

2. 傅里叶级数

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

示例正弦和余弦项。图片作者提供。

傅里叶级数是基于正弦和余弦波的周期性和确定性变量。与季节虚拟变量相反,这些三角函数将季节性建模为周期性模式。这种结构更能反映现实。

这种方法在 sktime Python 包中实现:

from sktime.transformations.series.fourier import FourierFeatures

fourier = FourierFeatures(sp_list=[12],
                          fourier_terms_list=[4],
                          keep_original_columns=False)

fourier_feats = fourier.fit_transform(yt)

你需要指定两个主要参数:

  • sp_list:作为列表的季节性周期(例如,月度数据的 12)

  • fourier_terms_list:项数,指包含的正弦和余弦级数的数量。这些项会影响表示的平滑度。

在实践中,傅里叶级数是你可以添加到模型中的解释变量。例如,你可以将这些与滞后特征结合使用。

3. 径向基函数

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

3 个示例径向基函数。图片作者提供。

径向基函数(RBF)是傅里叶级数的替代方法。其思想是创建重复的钟形曲线来模拟重复的模式。

RBF 在scikit-lego Python 包中通过RepeatingBasisFunction方法实现:

from sklego.preprocessing import RepeatingBasisFunction

rbf_encoder = RepeatingBasisFunction(n_periods=4,
                                     column='month_of_year',
                                     input_range=(1, 12),
                                     remainder='drop',
                                     width=0.25)

rbf_features = rbf_encoder.fit_transform(datetime_feats)
rbf_features_df = pd.DataFrame(rbf_features,
                               columns=[f'RBF{i}'
                                        for i in range(rbf_features.shape[1])])

这种方法的三个最重要的参数是:

  • n_periods:要包含的基函数数量

  • input_range:我们想要创建基函数的列的输入范围。例如,在上述示例中,我们使用(1, 12),即月份的范围;

  • width:径向基函数的宽度,控制其平滑度

与傅里叶级数一样,RBF 变量可以用作模型中的解释变量。

4. 季节性自回归

自回归是大多数预测模型的基础。其思想是利用最近的过去观测值(滞后)来预测未来值。这个概念可以扩展到建模季节性。季节性自回归模型包括相同季节的过去值作为预测变量。

SARIMA 是一种应用这个思想的流行方法:

import pmdarima as pm
model = pm.auto_arima(yt, m=12, trace=True)

model.summary()
# Best model:  ARIMA(0,1,0)(1,0,0)[12]

在前面的代码中,我们运行了auto_arima来找到 ARIMA 的最佳配置。得到的模型包括相同季节的第一个滞后作为输入。

使用季节性滞后作为解释变量是建模季节性的有效方法。请注意,使用这种方法时应处理季节性单位根。你可以像以前一样使用nsdiffs和 Canova-Hansen 测试,并在必要时使用季节性差分。

5. 添加额外变量

像季节性虚拟变量或傅里叶级数等方法捕捉重复的模式。但是,这些方法只是季节性原因的代理。

外生变量,如温度或每月的工作天数,可以用来建模季节性。

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

每日平均温度时间序列。作者提供的图像。数据来源于参考文献[2]。

你可以通过使用ARDL 公式将这些变量纳入模型。

6. 通过季节性差分进行调整

我们可以通过在建模之前从数据中去除季节性来处理季节性。这可以通过季节性差分或分解来完成。

季节性差分是对同一季节连续观测值之间进行差分的过程。此操作特别有用,以去除季节性单位根。

你可以使用diff方法进行季节性差分:

from sklearn.model_selection import train_test_split
from sktime.forecasting.compose import make_reduction
from sklearn.linear_model import RidgeCV

train, test = train_test_split(yt, test_size=12, shuffle=False)

train_sdiff = train.diff(periods=12)[12:]

forecaster = make_reduction(estimator=RidgeCV(),
                            strategy='recursive',
                            window_length=3)

forecaster.fit(train_sdiff)
diff_pred = forecaster.predict(fh=list(range(1, 13)))

上面,我们还在差分系列上建立了一个 Ridge 回归模型。通过恢复差分操作,你可以获得原始尺度上的预测值。

7. 通过分解进行调整

你也可以使用时间序列分解方法,如 STL,来去除季节性。

差分和分解有什么区别?

差分和分解方法都用于去除时间序列中的季节性。但,变换后的数据建模方式不同。

在应用季节性差分时,模型在差分数据上工作。你需要恢复差分操作以获取原始尺度上的预测。

使用基于分解的方法,你需要两个预测集。一个是季节性部分,另一个是季节调整后的数据。最终的预测是各部分预测的总和。通常,季节性朴素方法用于预测季节性成分。

这是一个基于分解方法的工作示例:

from statsmodels.tsa.api import STL
from sktime.forecasting.naive import NaiveForecaster

# fitting the seasonal decomposition method
series_decomp = STL(yt, period=period).fit()

# adjusting the data
seas_adj = yt - series_decomp.seasonal

# forecasting the non-seasonal part
forecaster = make_reduction(estimator=RidgeCV(),
                            strategy='recursive',
                            window_length=3)

forecaster.fit(seas_adj)

seas_adj_pred = forecaster.predict(fh=list(range(1, 13)))

# forecasting the seasonal part
seas_forecaster = NaiveForecaster(strategy='last', sp=12)
seas_forecaster.fit(series_decomp.seasonal)
seas_preds = seas_forecaster.predict(fh=list(range(1, 13)))

# combining the forecasts
preds = seas_adj_pred + seas_preds

在这个示例中,我们建立了一个岭回归模型来预测季节调整后的数据。一个季节性朴素模型预测季节性成分。然后,将两个预测结果加在一起。

8. 动态线性模型(DLM)

回归模型的参数通常是静态的。它们不会随时间变化或是时间不变的。DLM 是线性回归的一种特殊情况。其主要特点是参数随时间变化,而不是静态的。

DLM 认为季节性时间序列的结构会随季节变化。因此,一个合理的方法是建立一个具有时间变化参数的模型。即季节性变化的参数。

书籍第十五章 在参考文献[1]中提供了这种方法的一个简洁 R 示例。他们使用了时间变化的 MARSS(多变量自回归状态空间)方法来建模变化的季节性。

关键要点

在这篇文章中,你了解了 8 种不同的季节性建模方法。这些方法包括:

  • 季节性虚拟变量

  • 傅里叶级数

  • 径向基函数

  • 季节性自回归

  • 外生变量

  • 季节性差分

  • 季节性分解

  • 季节性参数变化的动态模型

我们以具有随机平稳季节性的时间序列为例。然而,有些方法可能并不适合这种类型的季节性。你应该测试不同的方法,选择适合你的数据的一种(或多种)方法。

感谢阅读,下一篇故事见!

相关文章

代码

参考文献

[1] Holmes, Elizabeth E., Mark D. Scheuerell, and E. J. Ward. “Applied time series analysis for fisheries and environmental data.” NOAA Fisheries, Northwest Fisheries Science Center, Seattle, WA (2020).

[2] 来自美国爱达荷州西南部四个以西部刺柏为主的实验流域的天气、雪和流量数据。 (许可证:美国公共领域)

[3] Sims, Christopher A. “回归中的季节性。” 《美国统计学会期刊》 69.347 (1974): 618–626。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值