机器学习图解:增量学习
原文:
towardsdatascience.com/machine-learning-illustrated-incremental-machine-learning-4d73747dc60c
模型如何随着时间学习新信息,同时保持和建立在之前的知识基础上
·发布于数据科学前沿 ·阅读时间 7 分钟·2023 年 9 月 15 日
–
欢迎回到《图解机器学习》系列。如果你阅读了系列中的其他文章,你会知道套路。我们将一个(听起来很枯燥)的机器学习概念通过图示化的方式变得有趣!这篇文章将介绍一个名为增量学习的概念,在这个概念中,机器学习模型会随着时间的推移学习新信息,同时保持和建立在之前的知识基础上。但在深入之前,让我们先讨论一下今天的模型构建过程是什么样的。
在构建模型时,我们通常遵循一种称为静态学习的过程。在这个过程中,我们使用最新可用的数据来训练模型。在训练过程中,我们会调整和优化模型。一旦对其性能感到满意,我们就会部署它。这个模型会在生产中使用一段时间。然后我们会注意到模型的性能随着时间的推移变得越来越差。这时,我们会丢弃现有的模型,并使用最新的数据重新构建一个新的模型。我们反复执行这个过程。
让我们用一个具体的例子来说明这一点。考虑以下假设场景。我们在 2023 年 1 月底开始构建一个欺诈检测模型。这个模型用于检测信用卡交易是否欺诈。我们使用过去一年(2022 年 1 月到 2022 年 12 月)的所有信用卡交易数据来训练我们的模型,并用本月(2023 年 1 月)的交易数据来测试模型。
到下个月底,我们发现模型在面对新数据时表现不佳。因此我们构建了另一个模型,但这次使用过去一年的数据(2022 年 2 月到 2023 年 1 月)进行训练,然后用当前月份的数据(2023 年 2 月)进行测试。所有超出这些训练和测试周期的数据都被丢弃。
下个月,我们再次注意到模型性能在面对新数据时表现不佳。于是,我们再次使用过去一年的数据构建了一个新模型。
每当我们发现模型性能下降时,我们会重复这个过程。这不一定是在 1 个月后。也可能是在 3 个月、6 个月甚至一年后。
那我们为什么要这样批量处理数据呢?
3 个主要原因。
-
概念漂移:随着时间的推移,我们会看到一种叫做概念漂移的现象,这意味着我们试图预测的内容会随时间变化,使用较旧的数据有时可能会适得其反。
-
内存限制:我们的训练集越大,占用的内存就越多。因此,我们尝试限制输入到模型中的数据量。
-
时间限制:与第二个原因类似,我们的训练数据越大,模型训练所需的时间就越长。(尽管这通常对我们构建的大多数模型来说不是一个大问题。可能会出现问题的地方是自然语言处理模型。)
但如果我们不想丢弃所有旧模型和数据呢? 丢弃旧模型意味着浪费了旧模型迄今为止积累的所有知识。理想情况下,我们希望找到一种方法来保留之前的知识,同时逐步添加来自新数据的信息。我们希望保留这种“制度性知识”,因为它对适应缓慢变化或重复出现的模式至关重要。
这正是增量学习所做的事情。
在增量学习中,模型逐步学习和增强其知识,而不会忘记以前获得的信息。它随着数据的增长而变得更加完善。
为了说明这一点,我们回到我们的欺诈模型示例。我们以与静态学习相同的方式开始。我们使用去年数据构建模型,但当下个月获得新数据时,我们不是从头开始构建新模型,而是将本月的新数据添加到现有模型中。然后我们在 2 个月、3 个月等时重复这个过程。所以这里我们实际上不是在构建新模型,而是在构建相同模型的新版本。
这可能是个好事,因为 a) 这是一种高效利用资源的方式,因为更少的数据存储 = 节省更多内存。每次迭代使用的内存更少,从而降低成本。 b) 这对动态数据很有用,现实世界中的大多数数据都是动态的,因为我们可以在获取新数据时持续更新预测,而不是每次都重新构建一个新模型。 c) 训练过程在更小的数据部分上进行,因此速度更快。
欺诈检测实际上是增量学习如何有益的一个很好的例子,以万事达卡的实时欺诈检测系统为例。每次交易时,万事达卡的系统会检查 100 多个变量(如交易大小、位置和商户类型)以评估欺诈的可能性。(来源:DataCamp)该系统使用增量学习来适应欺诈活动模式的变化。在像金融欺诈这样的动态环境中,欺诈者不断调整他们的方法,概念漂移的挑战非常显著。因此,我们的模型必须迅速适应,以保持其性能并有效打击欺诈者及其不断变化的策略。
好消息是——增量学习已经被内置到我们一些最喜欢的模型中,比如 XGBoost 和 CatBoost。实现起来非常简单!
我在之前的文章中解释了 XGBoost 和 CatBoost 背后的数学细节。
让我们在真实数据上测试静态学习和增量学习,以比较性能。
我们将使用这个信用卡欺诈数据集(CC0)来构建模型。在进行一些特征清理和选择后,我们得到了如下数据集:
其中is_fraud是我们的目标(y)列。
让我们从静态学习开始。我们构建了相同的 12 个 XGBoost 模型……
model = xgb.XGBClassifier(scale_pos_weight=10).fit(X_train, y_train)
…在接下来的 12 个一年期训练周期中:
在每次迭代或训练周期结束时,我们将训练日期提前一个月。然后,我们在接下来的一个月测试周期中测试每个模型,这些测试周期从其对应的训练周期结束时开始:
然后我们记录了 12 个 AUC 分数:
roc_auc_score(y_test, model.predict_proba(X_test)[:,1])
我们记录这些分数,以便与我们从增量模型中获得的分数进行比较。记住,我们的 AUC 分数越高,模型的表现越好。
现在我们进入增量学习模型。我们从在与静态学习相同的一年期间训练第一个模型开始。这是我们的基准模型。 但对于接下来的 11 个模型,我们逐步将新月份的数据输入到已有的模型中。
因此,我们每次都从上次结束的地方继续训练模型。
这个模型看起来基本与之前相同,只是有一个小变化。
model = xgb.XGBClassifier(scale_pos_weight=10).fit(X_train, y_train, xgb_model=model)
在这里,我们使用参数xgb_model
在当前构建的 xgboost 模型中声明之前的模型。通过保留之前训练的模型,训练过程变得更快、更高效,因为模型不需要每次都从头开始学习。
然后我们使用与静态模型相同的 12 个月测试期来测试 12 个模型…
…并记录 AUC 分数:
roc_auc_score(y_test, model.predict_proba(X_test)[:,1])
现在是有趣的部分,我们来比较这两种过程的性能。在记录的 11 个 AUC 分数中(因为第一个分数是相同的,因为我们使用了相同的训练和测试数据),增量学习在 11 次迭代中的 7 次中取得了更好的 AUC 分数!
尽管如此,仍然有一些警告:
-
增量学习面临过拟合的风险,因为它依赖于连续的数据流。风险在于,它可能会根据最近的数据过度调整其参数,这些数据可能无法准确代表整体分布。相比之下,状态学习可以考虑整个分布。
-
尽管增量学习可以处理不断变化的数据,但数据趋势的突变可能会带来挑战。因此,对于变化过于剧烈的数据,增量学习可能不适用。
-
增量学习面临一种现象,称为灾难性遗忘,即在学习新数据时旧知识会丧失,并且很难确定具体丢失了什么信息。
虽然有一些需要考虑的因素,但通过优化模型的每个版本,将这种方法集成到模型中是有益的。我们可以通过调整参数或改进特征选择来进一步提升结果。
以上就是关于增量学习的所有内容!一如既往,如果你有任何评论/问题/顾虑,请告诉我,也可以通过LinkedIn与我联系,或通过shreya.statistics@gmail.com给我发邮件。
除非另有说明,所有图片均由作者提供。
机器学习的可视化:用 SHAP 揭开黑箱模型的面纱
原文:
towardsdatascience.com/machine-learning-illustrated-opening-black-box-models-with-shap-9e92d0400680
如何使用 SHAP 解释和解读任何机器学习模型
·发表于 Towards Data Science ·10 分钟阅读·2023 年 5 月 8 日
–
Shapley Values 是经济学中合作博弈论的一个概念,它根据每个参与者对博弈的贡献为每个玩家分配一个价值。在机器学习领域,这一概念被适配成了 SHAP(SHapley Additive exPlanations)框架,这是一种有效的模型解释技术。
如果你有兴趣深入了解 Shapley Values,我强烈推荐阅读我之前的文章以了解 Shapley Values 背后的数学和直觉。尽管它已被修改以适应机器学习的需求,但理解其基本原理仍然是有帮助的。
Shapley Values 是博弈论中广泛使用的概念,它提供了一种公平的方式来分配总收益。
SHAP 框架类似于 Shapley 值,因为它计算了特征在一个游戏(即机器学习模型)中的单独影响。然而,机器学习模型是非合作性的游戏,这意味着特征之间不一定像在合作游戏中那样相互作用。相反,每个特征独立地贡献于模型的输出。虽然 Shapley 值公式可以使用,但由于参与者和联盟的数量众多,它可能在计算上非常昂贵且不准确。为了解决这个问题,研究人员开发了替代方法,如蒙特卡洛方法和基于核的方法。在本文中,我们将深入探讨蒙特卡洛方法。
让我们用一个例子来设置。假设我们有一个数据集,包含 20,640 栋加州房屋的价格。
from sklearn.datasets import fetch_california_housing
import pandas as pd
# load dataset
housing = fetch_california_housing()
X, y = housing.data, housing.target
X = pd.DataFrame(X, columns=housing.feature_names)
# feature dataset
X = X.drop(['Population', 'AveBedrms', 'AveOccup'], axis=1)
我们将使用特征MedInc, HouseAge, AveRooms, Latitude, 和 Longitude(X)……
…预测房价(y)。注意:房价以$100,000 为单位表示。
我们将建立一个模型。这可以是任何模型,但我们将使用 XGBoost(阅读我的上一篇文章以了解 XGBoost 背后的数学)。按照标准步骤——将数据分为训练集和测试集,并用训练集训练模型。
# split data into train and test
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# train an XGBoost model
from xgboost import XGBRegressor
model = xgb.XGBRegressor(objective='reg:squarederror', random_state=4)
model.fit(X_train, y_train)
然后使用这个模型对测试集进行预测。
y_pred = model.predict(X_test)
让我们进一步分解。我们想要测试集中第一个样本(或房子)的预测房价。所以对于第一个样本,这些特征值是……
X_test.iloc[0,]
MedInc 4.151800
HouseAge 22.000000
AveRooms 5.663073
Latitude 32.580000
Longitude -117.050000
…预测的房价是:
y_pred[0]
> 1.596
XGBoost 做出的预测显得神秘,因为它是一个黑箱模型,所以我们看不到箱子内部发生了什么。为了更深入地了解预测值是如何得出的,我们需要理解两点:
-
特征对预测房价的影响是正面还是负面?(例如,更高的MedInc值是否导致预测房价的增加?)
-
这些影响的程度是多少?(例如,MedInc对预测房价的影响是否比AveRooms更大?)
为了回答这些问题并确定每个特征对 1.596 这一房价预测的贡献,我们可以依赖特征的 SHAP 值。
让我们通过以下步骤来计算对 1.596 这一预测的MedInc 的 SHAP 值:
第 0 步:计算预期的预测房价
预期的预测房价不过是所有预测值的平均值。即:
y_pred.mean()
> 2.07
所以,2.07 作为预期的预测房价。我们现在尝试弄清楚为什么预测值 1.596 与预期的 2.07 有偏差。0.476(2.07–1.596)的差异来自哪里?
特征的 SHAP 值衡量了该特征对模型预测值偏离/接近期望预测值的贡献程度。
步骤 1:获取特征的随机排列
我们从这个特征的排列开始…
…在随机重排后,我们得到这个:
我们在这里关注MedInc,所以让我们突出显示MedInc以及其右边的任何特征。
步骤 2:从数据集中选择一个随机样本
我们回到我们的测试数据集,从中选择一个随机样本:
步骤 3:形成两个新样本
这些样本将部分来源于原始样本…
…以及我们在步骤 2 中刚刚提取的新样本:
我们创建的第一个样本,称为 x1,将拥有原始样本中的所有相同值,除了MedInc右边的特征。对于MedInc右边的特征,我们从新样本中获取。
我们创建的第二个样本,称为 x2,将拥有原始样本中的所有值,除了MedInc右边的特征和 MedInc。
从中我们可以看到,这些样本完全一样,除了一个关键的地方——它们在MedInc值上有所不同,这是我们关注的特征。
步骤 4:使用新样本进行预测,并找出预测值的差异
现在我们将这些样本输入到模型中,并获取它们的预测值。
我们找到这些值之间的差异:
由于 x1 和 x2 之间的唯一区别是MedInc的值,这个区别表示当MedInc的值发生变化时预测的变化。
步骤 5:重复步骤 1–4 几次,然后计算差异的平均值
我们现在要做的就是重复上述过程,并计算步骤 4 中找到的所有差异值的平均值。
假设我们将这个过程重复 1000 次(这个数字可能会根据模型和数据集的复杂性而有所不同)。在对结果取平均后,我们得到了一个值为0.22。
这个 0.22 表示MedInc在第一个样本中的 SHAP 值,这意味着MedInc对将期望预测值 2.07 调整到我们预测值 1.596 的贡献为+0.22。
我们可以对其他特征——HouseAge, AveRooms, Latitude, 和 Longitude 应用相同的过程,以找到它们的 SHAP 值。
现在我们了解了 SHAP 的基本计算,我们可以通过可视化来应用它。为了可视化它们,我们将使用 Python 的shap库中的Explainer并输入我们的模型。
import shap
explainer = shap.Explainer(model)
shap_values = explainer(X_test)
这将为测试集中每个样本的所有特征(MedInc、房龄、平均房间数、纬度和经度)提供 SHAP 值。利用这些 SHAP 值,我们开始绘图。
1. 瀑布图
这个图帮助我们逐个可视化数据中每个样本的 SHAP 值。让我们可视化第一个样本的 SHAP 值。
# visualize the SHAP values of the first sample
shap.plots.waterfall(shap_values[0])
请注意,预期的预测值 E[f(X)] = 2.07,这是第 0 步计算的值,而第一个房子的预测房价 f(X) = 1.596 是我们对第一个样本的预测。
注意到MedInc的 SHAP 值为+0.22(我们在第 5 步中看到),经度的 SHAP 值为-2.35,等等。如果我们将所有上述 SHAP 值加到 2.07 中,并从中减去,我们得到第一个房子的预测值 1.596。
忽略符号,经度的 SHAP 值的大小为 2.35,大于其他特征的值。这意味着经度对这一特定预测的影响最大。
就像我们可视化第一个样本的 SHAP 值一样,我们也可以可视化第二个样本的 SHAP 值。
# visualize the SHAP values of the second sample
shap.plots.waterfall(shap_values[0])
比较我们测试数据中第一个和第二个房子的 SHAP 值,我们观察到显著差异。在第一个房子中,经度对预测价格的影响最大,而在第二个房子中,MedInc的影响最为显著。
注意:这些 SHAP 值的差异突出了每个特征对模型输出的独特贡献。理解这些贡献对于建立对模型决策过程的信任至关重要,并确保模型不会存在偏见或歧视。
2. 力图
另一种可视化上述内容的方法是力图。
shap.plots.force(shap_values[0])
3. 平均 SHAP 图
要确定哪些特征通常对我们模型的预测最重要,我们可以使用所有观测值的平均 SHAP 值的条形图。取绝对值的平均值可以确保正负值不会相互抵消。
shap.plots.bar(shap_values)
每个特征都有一个对应的条形,高度表示平均 SHAP 值。例如,在我们的图中,平均 SHAP 值最大的特征是纬度,这表明它对我们模型的预测影响最大。这些信息可以帮助我们了解哪些特征对模型的决策过程至关重要。
4. 蜂群图
蜜蜂图是一种有用的可视化工具,用于检查每个特征的所有 SHAP 值。y 轴按特征将 SHAP 值分组,点的颜色表示相应的特征值。通常,较红的点代表较高的特征值。
蜜蜂图可以帮助识别特征与模型预测之间的重要关系。在这个图中,特征按其平均 SHAP 值排序。
shap.plots.beeswarm(shap_values)
通过检查蜜蜂图中的 SHAP 值,我们可以开始理解特征与预测房价之间关系的性质。例如,对于MedInc,我们观察到 SHAP 值随着特征值的增加而增加。这表明较高的MedInc值有助于提高预测的房价。
相比之下,对于Latitude和Longitude,我们注意到相反的趋势,即更高的特征值会导致较低的 SHAP 值。这一观察表明较高的Latitude和Longitude值与较低的预测房价相关联。
5. 依赖图
为了更深入地理解各个特征与其相应的 SHAP 值之间的关系,我们可以创建依赖图。依赖图是一个散点图,展示了单个特征的 SHAP 值与特征值之间的关系。
shap.plots.scatter(shap_values[:,"MedInc"])
shap.plots.scatter(shap_values[:,"Latitude"])
通过分析依赖图,我们可以确认在蜜蜂图中所做的观察。例如,当我们为MedInc创建一个依赖图时,我们观察到MedInc值与 SHAP 值之间存在正相关关系。换句话说,更高的MedInc值会导致预测的房价更高。
总体而言,依赖图提供了对单个特征与预测房价之间复杂关系的更详细理解。
总之,SHAP 值让我们窥探了每个特征如何贡献于模型输出。这些见解可以通过可视化进一步增强。我们可以利用 SHAP 做出更明智的特征选择、模型改进决策,并最终在机器学习应用中实现更好的性能。
一如既往,感谢你让我参与到你的机器学习旅程中。你可以通过邮件联系我,邮箱是shreya.statistics@gmail.com,或者在LinkedIn上与我联系,提出你的意见、问题和建议!
非欧几里得空间中的机器学习
原文:
towardsdatascience.com/machine-learning-in-a-non-euclidean-space-99b0a776e92e
图片来源:Greg Rosenke 在 Unsplash
第一章:为什么你应该学习非欧几里得机器学习
·发表于 Towards Data Science ·阅读时间 10 分钟·2023 年 6 月 16 日
–
“我们的舒适和熟悉的欧几里得空间及其线性结构是否总是适合机器学习?近期研究对此提出了不同的看法:并非总是必要,有时甚至有害,这一点在一系列令人兴奋的工作中得到了证明。自从两年前提出双曲表示法用于层次数据以来,取得了重大进展,产生了非欧几里得空间表示的新思想、新算法和模型,以及对非欧几里得机器学习基本功能的新视角。” 作者 Fred Sala、 Ines Chami、 Adva Wolf、 Albert Gu、 Beliz Gunel 和 Chris Ré, 2019
你将在本文中学到什么。
-
扭曲度量了在将数据表示为另一个空间时距离保留的效果。
-
对于某些数据,欧几里得空间会产生较高的扭曲,因此使用像球面或双曲空间这样的非欧几里得空间。
-
黎曼几何工具如流形和黎曼度量被用于非欧几里得机器学习。
-
流形是局部上欧几里得的曲面。
-
指数映射和对数映射用于从流形到其切空间的转换。
-
黎曼度量允许在流形上计算最短距离。
在继续阅读本系列关于应用于机器学习(ML)的非欧几里得几何之前,我必须回答一个重要的问题。是否值得深入了解非欧几里得 ML?
为了回答这个问题,我开始研究非欧几里得 ML。我很快找到了一些资源,第一个是来自斯坦福的,以上引用就是摘自其中。作者认为,机器学习的设计采用了某种几何,即欧几里得几何,这更多是传统或便利的选择,而非理性思考的结果。
到目前为止,选择欧几里得几何似乎并不是一个大问题。但作者通过引用 Bronstein 等人在其开创性几何深度学习描述中引起了我们的注意。
“[m]许多科学领域研究具有非欧几里得空间基础结构的数据。” Bronstein et al.
当我继续阅读文章时,我遇到了一个我不熟悉的方面:空间平坦性的概念。
“我们选择了使用欧几里得空间,其固有的属性中最关键的之一就是平坦性。” Fred Sala, Ines Chami, Adva Wolf, Albert Gu, Beliz Gunel 和 Chris Ré, 2019
斯坦福文章的作者提到了平坦性的影响。以下是提出的三点,你应该阅读我们的系列文章以获得更多直观的理解:
-
更好的表示 — 他们认为欧几里得空间不适合某些数据集,例如可以用树描述的层次数据集。
-
释放模型的全部潜力 — 他们认为,为了推动模型性能的界限,我们可以通过将数据所在的空间从欧几里得几何转变为非欧几里得几何来改进。
-
更灵活的操作 — 他们认为非欧几里得空间中的操作更加灵活,所需维度更少。作者在文章中后面解释了这一点。我们将尽量在我们的 Medium 系列中简化这一点。
将非平坦实体表示到平面空间中
选择合适的几何非常重要,依赖于输入数据。下面,我们展示了一个非欧几里得数据的例子,这些数据被“强迫”适应于二维欧几里得空间。这是我们众所周知的球形地球被压缩成平面。然而,这种转换伴随着不可忽视的扭曲。所谓扭曲是指从原始空间[地球 — 球体]到数据表示的空间[地图 — 平面],距离没有被保留。
例如,下图中的墨西哥在实际情况中几乎与格林兰(右)具有相同的表面,但在实际投影中(左)看起来要小得多。
资源: 作者提供。请注意,世界地图(左)使用的是我们球面星球的墨卡托投影。墨卡托地图由公式 (x, y) = λ, log tan(π/4 + φ/2) 定义。改编自 维基百科.
表示地球的方式有很多种,这些方式都涉及一定程度的扭曲。
资源: 全球投影,带有扭曲。来自作者,改编自维基百科。
例如,在著名的墨卡托投影中,自然观察到扭曲。格林兰问题展示了从球面表示转到平面表示时信息的丢失。这种投影不是面积保持的,这是在这种情况下期望的核心属性。实际上,格林兰的面积约为 220 万平方公里,比南美洲(面积约 1780 万平方公里)看起来要大。这种墨卡托投影保持角度但不保持面积,因此使其不完美。
现在,其他数据集也被迫位于欧几里得空间中,我们观察到扭曲。这是图形的情况:在欧几里得空间中,我们不能在低扭曲或信息丢失的情况下嵌入大类图形。
扭曲有几个更严格的数学定义。从本质上讲,我们希望扭曲能够通过评估距离保持的好坏来衡量嵌入的质量。这里,我们定义如下:
扭曲 ~ AVG {图形距离 / 嵌入距离 }
例子。
在下图中,我们可以通过庞加莱型不等式证明,我们不能将两个循环(方形,圆形)嵌入到欧几里得空间中而不扭曲。注意,扭曲为 1 是完美的扭曲——图形距离完全匹配嵌入空间距离。任何与 1 不同的扭曲意味着我们没有保持图形距离。
资源: 作者提供。长度为 4 的循环的最佳嵌入[左],以及 3-star K(1,3)的最佳嵌入[右]。改编自 Octavian Ganea 在苏黎世联邦理工学院的讲座。
在上面的方形中,对角线上的两个对立节点在图形距离上有 2 的距离。然而,欧几里得嵌入中的最短路径距离为√2。
这个扭曲的概念非常重要,因为欧几里得几何不允许对图形数据进行理想的“投影”。特别地,对于层次图形数据,为了最小化扭曲,一种解决方案是使用双曲空间。
注意。我们将在下一章中深入了解这个非欧几里得空间的例子。
在非欧几里得空间中表示数据
很难理解我们如何用除了Rn以外的方式表示数据。而且,我们如何摆脱我们非常熟悉的欧几里得距离来比较两个向量表示?
一种解决方案由黎曼几何中的流形描述。流形是看起来像Rn 但仅在局部。 这意味着我们可以在局部使用向量来表示我们的数据点。但仅在局部!
资源:在流形 M [深灰色] 上的一个点 x 处的切空间 [浅灰色,TxM] 和它的切向量 v。流形中的向量 x 可以在欧几里得切空间中局部表示。来自 维基百科
相似性或距离的概念在机器学习中至关重要。如果我们在构建一个 NLP 模型,我们希望在表示文本输入的嵌入空间中保留语义上的相似性。换句话说,我们希望语义相似的两个词在欧几里得空间中也相似,即欧几里得距离低。同样,语义不相似的两个词在欧几里得空间中应当距离较远,即欧几里得距离高。
因此,当逃避欧几里得几何时,需要有一个等效的方法。这种方法由黎曼度量来描述。黎曼度量使我们能够在非欧几里得空间中比较两个实体,并保留这种直观的距离概念。
👀 我记得了。
现在,我们需要记住,在这个非欧几里得框架中,我们可以对数据表示进行局部操作,并且我们有一个度量来测量距离。因此,我们具备了在非欧几里得空间中进行机器学习的能力。
🙌🏻 为什么我要在非欧几里得空间中学习更多关于机器学习的知识?
到目前为止,我们知道没有天才欧几里得的机器学习实际上是有意义的。确实存在一些项目,它们用不同的几何框架来解决我们传统的机器学习问题。
现在,一个自然的问题出现了:值得花时间了解这个领域的存在吗?
这是一个相当令人畏惧的空间,涉及复杂的数学。但我的朋友 Aniss Medbouhi,KTH 的 ML 博士研究员,将帮助我们克服这个空间固有的复杂性。
我之所以对这个空间不太信服的另一个原因是,我读到它主要适用于可以用树描述的层次数据。乍一看,这似乎与我每天处理的数据无关。
然而,下面的摘要给了我们一些相关数据集的概念:
“然而,最近的研究表明,嵌入复杂网络的适当等距空间不是平坦的欧几里得空间,而是负曲率的双曲空间。我们提出了一个新概念,利用这些最新的见解,建议在双曲空间中学习图的神经嵌入。我们提供了实验证据,表明在其自然几何中嵌入图显著改善了在多个真实世界公共数据集上的下游任务表现。” Chamberlain 等
“然而,虽然复杂的符号数据集通常表现出潜在的层级结构,最先进的方法通常在欧几里得向量空间中学习嵌入,而这并未考虑到这一特性。为此,我们引入了一种新的方法,通过将其嵌入双曲空间——或更准确地说,嵌入到 n 维庞加莱球体中——来学习符号数据的层级表示。” Nickel 和 Kiela
上述数据集列举如下,由Chamberlain 等提供:
(1) Karate: 扎卡里(Zachary)的空手道俱乐部包含 34 个顶点,分为两个派系。[4]
(2) Polbooks: 关于美国政治的书籍网络,这些书籍是在 2004 年总统选举前后出版,并由在线书商 Amazon.com 出售。书籍之间的边表示相同买家的频繁共同购买。
(3) Football: 2000 年秋季常规赛期间,Division IA 大学之间的美国橄榄球比赛网络。[2]
(4) Adjnoun: 查尔斯·狄更斯(Charles Dickens)小说《大卫·科波菲尔(David Copperfield)》中常见形容词和名词的邻接网络。[3]
(5) Polblogs: 记录于 2005 年的美国政治博客之间的超链接网络。[1]
此外,在生物学中,我们找到以下参考数据集:
- 生物学:诸如蛋白质等进化数据。[5]
资源:扎卡里的空手道俱乐部中 34 个人的社会关系网络表示。根据事件[4],该人群被分为两个部分。改编自维基百科。
最后,NLP 数据,即文本数据,是另一种类型的层级数据。因此,许多领域可能从理解非欧几里得机器学习的进展中受益。
现在我们知道如何更好地表示某些数据集,将其与机器学习联系起来是关键。任何下游机器学习任务都需要首先摄取数据。大量时间花在清理基础数据和准确表示数据上。数据表示的质量至关重要,因为它直接影响模型的性能。例如,在自然语言处理(NLP)中,我建议我的学生专注于提供良好嵌入的架构,例如上下文嵌入。关于改进嵌入的研究非常广泛,从浅层神经网络(fasttext, word2vec)到深层神经网络和变换器(sentence-transformers, BERT, RoBERTa, XLM)。然而,也值得注意的是,数据表示与手头的任务紧密相关,研究显示对于某些任务,某些浅层神经网络比深层神经网络提供更好的结果。
结论
在本文中,我们看到可以利用非欧几里得几何来解决特定于球面数据和层次数据集(如图)的现有问题。将这些数据集嵌入到欧几里得空间中,代价是扭曲,这种扭曲无法保留从原始空间到嵌入空间的距离。这种扭曲在我们地球的表示中很直观,我们有多种方式表示我们的地球,其中一些方式无法保留期望的核心属性,例如面积保持。对于图来说,核心属性需要被保留,扭曲基础空间可能导致下游机器学习任务的性能较差。
在下一章中,我们将学习更多关于球面几何和双曲几何的知识。我们将更多关注后者,并提供如何在这样的空间中更好地嵌入层次数据的直观理解。
与贡献者联系。
KTH 皇家技术学院的机器学习博士研究员。
Linkedin. www.linkedin.com/in/aniss-medbouhi/
微软的数据科学家和 EPITA 巴黎的讲师。
Linkedin. www.linkedin.com/in/mastafa-foufa/
[1] Lada A. Adamic 和 Natalie Glance. 政治博客圈和 2004 年美国选举。《第三届国际链接发现研讨会会议录》——LinkKDD ’05, 页 36–43, 2005。
[2] Michelle Girvan 和 Mark E. J. Newman. 社会和生物网络中的社区结构。在《国家科学院学报》会议录中,99:7821–7826, 2002。
[3] Mark E. J. Newman. 使用矩阵特征向量发现网络中的社区结构。《物理评论 E》——统计学、非线性和软物质物理,74(3):1–19, 2006。
[4] Wayne W. Zachary. 小组中的冲突和分裂的信息流模型。《人类学研究杂志》,33:452–473, 1977。
[5] AlQuraishi, Mohammed. “ProteinNet: 一个标准化的蛋白质结构机器学习数据集。” BMC 生物信息学 20.1 (2019): 1–10.
三步掌握机器学习:如何高效学习
原文:
towardsdatascience.com/machine-learning-in-three-steps-how-to-efficiently-learn-it-aefcf423a9e1
优先考虑预测建模的核心要点,避免让自己不堪重负
·发表于 Towards Data Science ·阅读时间 21 分钟·2023 年 3 月 3 日
–
我观察到两种极端的方法,数据科学家在学习机器学习算法时通常会采用其中一种。第一种方法涉及学习所有的细节,并从头开始实现算法,以获得真正的掌握。另一方面,第二种方法则认为计算机会“自动学习”,从而使个人学习算法变得不必要。这使得一些人仅仅依赖于如 lazypredict 这样的工具。
在学习机器学习算法时,采取两种极端方法之间的折中方式是现实的。然而,问题依然是,从哪里开始呢?在这篇文章中,我将把机器学习算法分为三类,并提供我个人的意见,告诉你应该从什么开始,以及哪些可以跳过。
机器学习算法的复杂性
初学机器学习可能会因为众多可用的算法而感到不知所措。线性回归、支持向量机(SVM)、梯度下降、梯度提升、决策树、LASSO、岭回归、网格搜索等等,这些都是在提问时会想到的算法。
在监督学习领域,这些算法服务于不同的目的,并具有不同的目标。本文将仅讨论监督学习。
为了更好地理解各种技术,按其目标和复杂性级别进行分类可能会有所帮助。通过将这些算法组织成不同的类别和复杂性级别,可以简化这些概念,使其更易于理解。这种方法可以大大提升对机器学习的理解,并帮助识别适合特定任务或目标的最佳技术。
当学生深入机器学习领域时,可能会因其复杂性而感到沮丧。然而,在实践之前并不需要学习或熟悉所有的算法。机器学习领域的不同职位可能需要不同水平的熟练度,缺乏某些方面的知识也是可以接受的。例如,数据科学家、数据分析师、数据工程师和机器学习研究人员对其工作角色的要求各不相同。
对整体过程有广泛的理解可以使机器学习从业者在时间紧迫的情况下跳过某些技术细节,同时仍能全面理解过程。
照片由 Julio Wolf 提供,见Unsplash
1. 机器学习算法的细分
1.1 模型、训练和调优
“机器学习算法”的范围相当广泛,可以分为三种主要类型的算法:
-
(1) 机器学习模型,旨在接收输入数据并随后生成预测,如线性回归、SVM、决策树、KNN 等。在 scikit-learn 库中,这些也被称为“估计器”。
-
(2) 模型训练/拟合算法,用于创建或优化模型,也即为特定数据集寻找模型的参数。不同的机器学习模型有其特定的训练算法。虽然梯度下降是训练基于数学函数模型的最著名方法,但其他机器学习模型可以使用不同的技术进行训练,我们将在本文后续部分深入探讨这些技术。
-
(3) 超参数调优,包括寻找机器学习模型的最佳超参数。与训练过程不同,超参数调优过程通常不依赖于机器学习模型。网格搜索是这个任务中一种流行且常用的方法,尽管还有其他替代方法,我们将在本文后续部分深入探讨。
1.2 机器学习模型的三种类别
第一个方面涉及能够接收数据并根据这些数据生成预测的模型。这些模型可以分为三类:
-
基于距离的模型,包括 K 近邻、线性判别分析和二次判别分析。
-
基于决策树的模型,如单棵决策树(用于分类或回归)、随机森林和梯度提升决策树。
-
基于数学函数的模型,也称为参数模型,是假设输入和输出之间存在特定函数形式的模型。它们可以进一步分为线性模型,如 OLS 回归、SVM(具有线性内核)、岭回归和 LASSO,以及非线性模型,如具有非线性内核的 SVM 和神经网络。
1.3 元模型和集成方法
在机器学习中,元模型是一个结合多个单独模型预测以进行更准确预测的模型。它也被称为“堆叠模型”或“超级学习器”。组成元模型的单独模型可以是不同类型的或使用不同算法的,它们的预测通过加权平均或其他技术进行组合。
元模型的目标是通过减少单个模型中可能存在的方差和偏差,提高预测的整体准确性和鲁棒性。它还可以通过捕捉数据中的复杂模式来帮助克服单个模型的局限性。
创建元模型的一个常见方法是使用集成方法,如自助采样、提升或堆叠。
-
自助采样(Bagging),或称自助聚合,是一种在机器学习中用于通过组合在数据集的不同样本上训练的多个模型来减少模型方差的技术。自助采样的想法是生成多个模型,每个模型使用数据的一个子集,然后将它们组合起来,创建一个更强健且不易过拟合的模型。
-
提升:提升是另一种集成方法,它结合多个弱模型来创建一个强模型。与自助采样不同,提升依次训练模型。每个新模型在由先前模型错误分类的数据上进行训练,最终预测通过聚合所有模型的预测来得出。
-
堆叠:堆叠,或称堆叠泛化,是一种元模型集成方法,涉及训练多个基础模型,并使用它们的预测作为更高级模型的输入。高级模型学习如何组合基础模型的预测以进行最终预测。
-
随机森林:它是对自助采样(bagging)的扩展,增加了一层额外的随机性。除了随机抽样数据外,随机森林还会随机选择每次分裂时的特征子集。这有助于减少过拟合,并增加集成中模型的多样性。
集成方法最常应用于决策树,而不是像线性回归这样的线性模型。这是因为决策树比线性模型更容易过拟合,而集成方法通过结合多个模型来帮助减少过拟合。
决策树具有高方差和低偏差,这意味着它们容易对训练数据进行过拟合,从而导致在新数据上的表现较差。集成方法通过聚合多个决策树的预测来解决这个问题,从而得到一个更强健和准确的模型。
另一方面,线性模型如线性回归具有低方差和高偏差,这意味着它们不容易过拟合,但可能会欠拟合训练数据。由于这些模型已经具有低方差,因此集成方法对线性模型的效果不如对决策树的效果明显,因为集成方法在这方面的收益不大。
然而,仍然有一些情况可以将集成方法应用于线性模型。例如,袋装技术中使用的自助聚合技术可以应用于任何类型的模型,包括线性回归。在这种情况下,袋装算法会对训练数据进行采样,并在自助样本上拟合多个线性回归模型,从而得到一个更稳定且更强健的模型。然而,值得注意的是,得到的模型仍然是线性回归模型,而不是一个元模型。
总体而言,尽管集成方法最常用于决策树,但在某些情况下它们也可以与线性模型一起使用。然而,重要的是要记住每种模型的优缺点,并选择适合当前问题的方法。
1.4 机器学习算法概述
下图提供了分类为 3 类的各种机器学习算法的总结。本文的后续部分将更深入地探讨每一类。
机器学习算法概述 — 图片由作者提供
2. 机器学习模型
在这一部分,我们将更详细地观察三种机器学习模型的家族。以下是有关的更详细的计划。
(1) 基于距离的模型
-
基于实例的模型:KNN
-
贝叶斯分类器:LDA,QDA
(2) 基于决策树的模型
(3) 基于数学函数的模型
-
线性模型
-
核方法模型,如核 SVM 或核岭回归
-
神经网络
-
深度学习模型
2.1 基于实例的模型
第一类机器学习模型是基于距离的模型。这些模型使用数据点之间的距离来进行预测。
最简单且最具代表性的模型是 K-最近邻(KNN)。它计算新数据点与数据集中所有现有数据点之间的距离。然后选择 K 个最近邻,并将新数据点分配给 K 个邻居中最常见的类别。
在考察 k-最近邻(KNN)算法时,可以注意到在训练阶段没有显式构建模型。在 KNN 中,新的观察值的预测是通过在训练集中找到 k 个最近邻居,并计算它们目标值的平均值或多数投票来完成的。
与其他在训练过程中拟合模型的算法不同,KNN 存储整个训练数据集,只计算新观察值与现有数据集之间的距离来进行预测。因此,KNN 可以被视为一种“懒惰学习”算法,因为它在训练阶段不会主动构建模型,而是将决策过程推迟到推理时。
因此,推理/测试阶段可能会很慢。需要注意的是,可以使用更高效的算法,如 k-d 树。
2.2 贝叶斯分类器
线性判别分析(LDA)和二次判别分析(QDA)是基于距离的模型,它们使用马氏距离进行预测。马氏距离是一种测量点与分布之间距离的方法,考虑了变量之间的相关性。
线性判别分析(LDA)假设不同类别的方差相同,而二次判别分析(QDA)假设每个类别的方差不同。这意味着 LDA 假设所有类别的协方差矩阵相同,而 QDA 允许每个类别拥有自己的协方差矩阵。
2.3 基于决策树的模型
第二类机器学习模型是基于决策树的模型。它们也可以称为基于规则的模型,这意味着模型生成一组规则,用于解释它如何得出决策或预测。
决策树的每个分支代表一个规则或条件,用于确定接下来跟随的数据子集。这些规则通常以简单的 if-then 语句的形式存在,例如“如果变量 X 的值大于 5,则跟随左分支,否则跟随右分支。”
决策树的最终叶节点表示基于输入变量的值和导致该预测的规则,目标变量的预测类别或值。
决策树的一个优点是它们易于解释和理解,因为规则可以以清晰直观的方式进行可视化和解释。这使得它们在向非技术利益相关者解释预测或决策背后的原因时非常有用。
然而,决策树也容易过拟合,这发生在模型变得过于复杂并过于紧密地拟合训练数据,从而对新数据的泛化能力差。为了解决这个问题,通常将集成方法应用于决策树。
2.4 基于数学函数的模型
第三类机器学习模型是基于数学函数的模型。这些模型使用数学函数来建模输入变量和目标变量之间的关系。线性模型,例如普通最小二乘(OLS)回归和具有线性核的支持向量机(SVM)、岭回归和 LASSO,假设输入变量和目标变量之间的关系是线性的。非线性模型,例如具有非线性核的 SVM 和神经网络,可以建模输入变量和目标变量之间更复杂的关系。
对于基于数学函数的模型,例如线性回归或逻辑回归,我们必须定义损失函数。损失函数衡量模型的预测与实际数据的匹配程度。目标是通过调整模型的参数来最小化损失函数。
相对而言,对于基于非数学函数的模型,例如 KNN 或决策树,我们不需要定义损失函数。相反,我们使用不同的方法,比如在 KNN 的情况下寻找最近邻,或者在决策树的情况下根据特征值递归地划分数据。
在基于数学函数的模型中,定义适当的损失函数至关重要,因为它决定了模型解决的优化问题。根据具体问题的不同,可以使用不同的损失函数,例如回归问题的均方误差或二分类问题的交叉熵。
值得注意的是,所有线性模型,例如普通最小二乘(OLS)、LASSO、岭回归和具有线性核的支持向量机(SVM),都可以写成线性方程 y = wX + b 的形式。然而,这些模型之间的区别在于用于估计模型参数 w 和 b 的最优值的成本函数。
因此,虽然所有这些模型可以写成相同数学函数的形式,但重要的是要注意成本函数的选择决定了模型的行为和性能。因此,更准确地说,这些模型应该被视为具有不同成本函数的不同模型,而不是相同模型的不同成本函数。
非线性模型是解决复杂机器学习问题的强大工具,而这些问题无法通过线性模型得到充分解决。在实践中,主要有两种方法:核技巧和神经网络。
核技巧是一种有效地实现特征映射的方法,而无需显式计算变换后的特征。相反,它涉及定义一个核函数,用于计算变换特征空间中输入样本对之间的相似性。通过使用核函数,我们可以隐式地将输入数据映射到高维空间,在那里数据可以更容易地被分离和建模。
从这个意义上说,卷积部分可以被看作是一种特征工程,其中模型能够创建出更适合当前任务的新特征。这与传统的特征工程形成对比,后者是人工专家基于领域知识和直觉手动创建新特征。
创建非线性模型的另一种方法是通过使用神经网络。它们由一层层互联的节点或“神经元”组成,每个节点对其输入执行简单的数学操作,并将结果传递给下一层。
神经网络强大的关键在于它们学习输入和输出之间复杂的非线性关系的能力。这是通过在训练过程中调整神经元之间连接的权重来实现的,基于预测输出和实际输出之间的误差。
2.5 深度学习模型
深度学习专注于通过多层次的层次结构学习数据表示。由于在计算机视觉、自然语言处理和语音识别等广泛应用中的成功,它近年来变得越来越受欢迎。虽然深度学习模型由于其大量的参数和层次结构可以被认为是复杂的,但确实深度学习的一部分也涉及特征工程。
深度学习模型的一个例子是卷积神经网络(CNN)。在其核心,CNN 将一系列滤波器应用于输入图像,每个滤波器寻找特定的特征,如边缘或角落。网络的后续层则利用这些提取的特征来对输入图像进行分类。
从这个角度来看,像 CNN 这样的深度学习模型可以被认为是特征工程和可训练模型的结合。模型的特征工程方面涉及设计网络的架构以从输入数据中提取有用的特征,而可训练模型则涉及优化网络的参数以适应数据并进行准确的预测。
3. 模型训练/拟合
训练机器学习模型的过程是通过向模型展示一组标记示例来教会模型进行预测或决策。这些标记示例,也称为训练数据,由输入特征和输出标签的对组成。
在训练过程中,机器学习模型学习识别输入特征及其对应输出标签中的模式。模型使用特定的算法从训练数据中学习,并调整其内部参数,以提高预测或分类新数据的能力。
一旦模型在标记示例上训练完成,它就可以用于对新的、未见过的数据进行预测或决策。这个过程称为推断或测试。
不同的机器学习模型有不同的训练算法。以下是不同机器学习模型使用的一些训练算法的例子。
3.1 基于距离的模型训练
K-最近邻(KNN):KNN 是一种非参数算法,不需要显式的训练。相反,它存储整个训练数据集,并通过基于某种距离度量找到训练数据集中 K 个最接近的实例来预测新实例的标签。然后,预测基于 K 个最近邻的多数投票。
线性判别分析(LDA)是一种用于分类任务的监督学习算法。LDA 建模每个类别的输入特征分布,并利用这些信息找到一个线性组合的输入特征,最大化类别之间的分离。生成的线性判别函数随后可以用来对新实例进行分类。
LDA 的训练过程涉及估计每个类别的输入特征的均值和协方差矩阵。这些估计值然后用来计算类内散布矩阵和类间散布矩阵,这些矩阵用于推导线性判别函数。线性判别函数的数量等于类别数减一。
3.2 基于决策树的模型训练
至于决策树,它们使用一种称为递归划分的不同方法进行训练。
递归划分是一种自顶向下的过程,从整个数据集开始,根据一系列规则或条件将其划分为子集。这个划分过程在每个子集上递归重复,直到满足停止准则,通常是当子集变得过小或进一步划分无法改善模型性能时。
划分规则基于数据集的特征或属性,算法在每一步选择提供模型性能最显著提升的特征。划分过程生成树状结构,其中内部节点代表划分条件,叶子节点代表最终预测结果。
在训练过程中,决策树可以使用各种度量标准进行评估,如信息增益或基尼不纯度,以确定最佳的划分标准。一旦树训练完成,可以通过根据输入特征从根节点到适当叶节点的路径来对新的、未见过的数据进行预测。
3.3 基于数学函数的模型训练
基于数学函数的模型,也称为参数模型,是假设输入与输出之间存在特定函数形式的模型。
用于优化数学函数模型参数的最基本算法是梯度下降。梯度下降是一种迭代优化算法,从参数值的初始猜测开始,然后根据损失函数对参数的梯度更新参数。这个过程持续进行,直到算法收敛到损失函数的最小值。
对于非凸函数,通常使用随机梯度下降(SGD)代替梯度下降。SGD 在每次迭代中随机抽样数据的一个子集来计算梯度,这使得它比梯度下降更快、更高效。
在神经网络中,反向传播用于计算损失函数相对于参数的梯度。反向传播本质上是将微积分的链式法则应用于神经网络表示的复合函数。它允许对网络的每一层有效地计算梯度,这是训练深度神经网络所必需的。
对于深度学习模型,通常使用更高级的优化技术来提高性能。这些技术包括如动量,它帮助算法避免陷入局部最小值,以及自适应学习率方法,它在训练过程中自动调整学习率,以提高收敛速度和稳定性。
总的来说,梯度下降是优化基于数学函数的模型参数的基本算法。对于非凸函数,通常使用随机梯度下降。反向传播用于计算神经网络中的梯度,而更高级的技术常用于深度学习模型。
4. 模型调优
机器学习的第三个方面涉及通过使用网格搜索来优化模型的超参数。超参数是模型的设置或配置,这些设置在训练过程中不会被学习,而必须手动指定。
超参数的例子包括学习率、神经网络中的隐藏层数量和正则化强度。通过使用网格搜索,评估多个超参数组合,以确定模型的最佳配置。
网格搜索是一种用于优化机器学习模型超参数的流行技术。然而,它并不是唯一的方法,还有其他几种替代方案可以用来微调模型的参数。一些最受欢迎的网格搜索替代方法包括:
-
随机化网格搜索:与网格搜索不同,随机搜索涉及从预定义范围中随机抽样超参数,从而更高效地探索参数空间。
-
贝叶斯优化:贝叶斯优化使用概率模型通过迭代评估模型的性能和更新超参数的概率分布来寻找最佳的超参数组合。
-
遗传算法:遗传算法模拟自然选择的过程,通过生成潜在解决方案的种群,评估它们的性能,并选择最适合的个体进行繁殖,从而找到最佳的超参数组合。
-
基于梯度的优化:基于梯度的优化涉及使用梯度迭代调整超参数,旨在最大化模型的性能。
-
基于集成的优化:基于集成的优化涉及将多个具有不同超参数的模型结合起来,以创建一个更稳健、更准确的最终模型。
每种替代方案都有其优缺点,最佳方法可能取决于所解决的具体问题、参数空间的大小以及可用的计算资源。
5. 帮助你有效学习机器学习的技巧
现在我们对不同类别的机器学习算法有了大致了解,让我们探索一下创建有效预测模型所需学习的内容。
5.1 算法是否太难以学习?
让我们从一些初看起来可能显得复杂的算法开始,这可能会让你认为机器学习是一个具有挑战性的领域。然而,通过将过程分解为三个阶段(模型、拟合和调优),你将能够获得更清晰的理解。
例如,学习支持向量机(SVM)对有志于数据科学的学生来说可能令人畏惧,因为存在大量技术术语,如最优超平面、无约束最小化、对偶性(原始和对偶形式)、拉格朗日乘数、Karush-Kuhn-Tucker 条件、二次规划等。然而,重要的是要理解 SVM 只是一个线性模型,就像 OLS 回归一样,其方程为 y = wX+b。
虽然上述各种技术用于通过不同方法优化 SVM,但至关重要的是不要被技术细节所困扰,而要专注于 SVM 作为线性模型的基本概念。
如果你有兴趣进一步探讨这个观点,我将会撰写一篇相关的文章。请在评论中告知我。
5.2 理解模型
我们讨论了三种类型的机器学习算法——模型、拟合算法和调优算法。在我看来,有志于数据科学的学生应优先理解模型,而不是其他两个步骤。
从这个角度来看,机器学习模型被分类为三种主要类型,有助于理解它们的功能:
-
基于距离的模型:在这种类型中,KNN 不被视为一个适当的模型,因为新观察的距离是直接计算的。在 LDA 或 QDA 中,距离是计算到一个分布的。
-
基于决策树的模型:决策树遵循 if-else 规则,并形成一组用于决策的规则。
-
基于数学函数的模型:它们可能不容易理解。然而,这些函数通常很简单。
一旦你对模型的工作原理有了深入理解,模型的拟合和调优可以通过现有的包来完成:对于拟合,流行的 scikit-learn 库提供了model.fit
方法,而对于调优,像 Optuna 这样的工具提供了有效的研究优化技术,使用study.optimize
。通过专注于理解模型本身,未来的数据科学家可以更好地为成功做好准备。
对于某些单独的模型,如果你采用这种方法,你可以提高对它们的理解。我会写单独的文章,但这里有一些示例:
-
多项式回归是线性回归,在将特征提高到不同的幂之后。
-
线性回归、岭回归、LASSO 和 SVR 是相同的模型,只是基础的成本函数不同。
-
线性回归、逻辑回归和支持向量机(SVM)是相同的模型,只是基础的成本函数不同。在这里你可能会注意到,线性回归是回归器,而逻辑回归和 SVM 是分类器。嗯,查看 SGDClassifier 的文档或看看这篇关于SGDClassifier的文章吧。
这些十大最常见却令人困惑的机器学习模型名称说明了理解模型并不总是直观的。
5.3 可视化模型
可视化可以是理解模型的一个极其有用的工具。在处理机器学习模型时,使用简单的数据集创建可视化可以帮助说明模型是如何创建的以及它们是如何工作的。
这里是我写的一些文章,你可以在下面找到链接。这些文章涵盖了线性回归的可视化,这也适用于岭回归、LASSO 和 SVM,以及神经网络。此外,还有一篇关于在 Excel 中实现 KNN 的文章。
另一种方法是在 Excel 中实现这些模型,因为它可以提供一种直观的方式来查看数据和模型的输出。
-
线性回归的可视化
-
决策树回归器的可视化
-
敬请关注,我会发布更多内容!
线性回归的可视化 — 图片由作者提供
不同特征尺度下的 K 最近邻回归器——图片来源于作者
5.4 使用 Excel 理解拟合过程
理解拟合过程起初可能会感到困难。然而,如果你想学习,就需要从对模型如何工作的扎实理解开始。在这方面,Microsoft Excel 是一个特别有帮助的工具。
Excel 是一个广泛使用的电子表格程序,可以用来可视化和操作数据。在机器学习的背景下,它可以用来演示简单模型如线性回归的拟合过程。通过使用 Excel,你可以逐步看到算法的实际实现。
需要记住的一点是,Excel 不是进行机器学习的最有效工具。尽管它可以用来理解简单数据集的拟合过程。
使用 Excel 理解拟合过程对机器学习初学者来说是一个有用的工具。它提供了一种简单且可访问的方式来可视化算法并查看其工作原理。
我已经写了几篇关于线性回归、逻辑回归和神经网络的梯度下降文章。你可以通过以下链接访问这些文章。
-
Excel 中的K-最近邻
-
在 Excel 中进行梯度下降的线性回归
-
在 Excel 中进行梯度下降的逻辑回归
-
从零开始在 Excel 中创建神经网络分类器
-
Excel 中的决策树回归器
-
在 Excel 中实现 KNN
-
从零开始在 Excel 中实现 K 均值算法
-
敬请关注,更多文章即将发布!
此外,如果你希望获得相应的 Excel/Google 表格文件,请通过以下链接支持我:ko-fi.com/s/4ddca6dff1
。
使用 Excel 进行机器学习算法——图片来源于作者
5.5 使用简单数据集进行测试
为了全面理解机器学习算法,从零开始实现它们可以是一个有效的方法。然而,这种方法可能会非常耗时,并且需要较高的技术水平。另一种方法是使用现有的包或库来创建和可视化模型的输出,特别是使用简单的数据集。
利用这些包,你可以轻松地实验不同的参数并测试各种机器学习算法。这种方法有助于你理解算法的内部工作原理,同时也能快速评估它们在特定数据集上的有效性。
通过使用这样的数据集,可以轻松地可视化模型的输入和输出。这反过来允许我们更深入地了解模型如何进行预测。此外,通过更改超参数和模型的其他方面,我们还可以可视化它们对模型预测的影响。
这种方法可以帮助初学者入门机器学习,并对不同算法的工作原理有更好的理解。这是获得实际经验和实验不同模型的绝佳方式,而无需在实现上花费太多时间。
6. 结论
总之,机器学习可以是一个复杂的领域,特别是对于有志成为数据科学家的人员。然而,理解三种主要的机器学习算法——模型、拟合算法和调优算法——并根据它们的目标和复杂性对它们进行分类,可以帮助提供它们工作原理的整体理解。通过优先理解模型、可视化它们,并在像 Excel 这样的工具中实现它们,我们可以揭示拟合和调优过程的神秘面纱。
持续学习机器学习的不同方面,例如分类与回归、处理缺失值和变量重要性,对于不断加深我们对这一领域的理解至关重要。如果你想了解更多,请查看这篇文章:监督机器学习算法概述。
我写关于机器学习和数据科学的文章,并尝试以清晰的方式简化复杂概念。请通过下面的链接关注我,获取我的文章的全部访问权限:medium.com/@kezhanshi/membership
机器学习并非你所需的一切:关于签名检测的案例研究
机器学习不应成为你处理所有任务的首选解决方案。像我在签名检测中一样考虑 KISS 原则。
·
关注 发表在 Towards Data Science ·6 min read·2023 年 12 月 21 日
–
图片由作者提供
在这篇文章中,我展示了一个案例研究,说明机器学习不应成为你处理所有任务的首选解决方案。更简单的技术也可能取得良好的结果,而且更容易实施。
案例研究:签名检测
想象一下我们有一堆合同,需要知道它们是否已签名。这个场景涉及签名检测——可靠地识别特定位置是否出现签名——假设你已经知道签名应该大致位于哪里(例如,东南方向)。在古代,这个任务是通过二值化图像并计算区域内的黑色像素来完成的。如果存在签名,黑色像素计数会超过阈值。但在 2023 年,我们如何以不同的方式完成这个任务呢?
机器学习方法
我们将使用 GroundingDino,这是一个最先进的零-shot 目标检测模型。模型的输入是图像与提示的结合,而输出则是表示潜在位置的矩形及其相关的置信度分数。虽然这乍一看似乎是一个理想的解决方案,但仍然存在一些值得考虑的限制。让我们尝试用三个不同的提示:‘signature’,‘handwriting’ 和 ‘scribble’。
提示结果分别为‘signature’,‘handwriting’ 和 ‘scribble’。图像由作者提供。
你可以看到结果严重依赖于提示,更不用说在 CPU 上结果出现前大约需要 30 秒。这是因为这是一个基础模型,经过大量类别的训练,不仅仅是签名。我们可以做些什么来使其更准确和快速呢?我们可以使用 Autodistill (教程),它使用 Grounding DINO 训练 YOLOv8 模型。有效地使用基础模型来训练一个更轻量的监督模型。工作流程是收集大量签名文档数据集,然后找到一个好的提示以获取标记数据,最终在其上训练一个 YOLOv8 模型。
你可以想象这需要大量的时间和精力。但是还有其他办法吗?
替代方法:OpenCV
OpenCV 是一个开源计算机视觉库,提供了广泛的功能用于实时图像和视频处理、分析和理解,使用优化算法。
OpenCV 中的 connectedComponentsWithStats
函数用于标记和分析图像区域(连通组件),基于其像素连接性,并额外计算每个标记区域的各种统计信息,如面积和边界框尺寸。
为了更易于理解,我创建了这张图。它是签名区域的裁剪图像。每个连通像素的岛屿都有一种颜色,代表一个单独的连通组件(或:标签)。
图像由作者提供。
了解上述内容后,让我们深入探讨这种计算机视觉方法背后的直觉。这里的关键思想是:我们能否识别出构成签名的标签?
在普通的、一般的文档上运行这个函数会产生数百甚至数千个唯一的标签,适用于:
-
每个字母(因为它没有连接到其他字母)
-
更大的东西,比如签名和徽标
-
更小的东西,比如微小的噪点和点
为了筛选掉不相关的标签,我们可以取所有标签的中位数区域,这将是单个字符的大小(假设图像中包含的字母多于噪声),作为最小阈值。任何低于此阈值的区域都可以被过滤掉。我们还可以设置一个最大阈值,假设签名不会占据超过字母 x 倍的区域。剩下的就是实际的签名候选项。但徽标呢?它们可能与签名大小相同,但签名通常在字母之间有很多空白。通过黑色像素比例过滤器,我可以将这些徽标筛选掉。剩下的标签应该是实际的签名。
将上述内容转化为代码结果如下:
def find_signature_bounding_boxes(image):
# Start measuring time
start_time = time.time()
if image is None:
raise ValueError("Could not open or find the image")
# Binarize the image using Otsu's thresholding method
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Threshold the image using Otsu's method
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# Find connected components
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image, connectivity=8, ltype=cv2.CV_32S)
# Calculate median area of components
areas = stats[1:, cv2.CC_STAT_AREA] # Exclude background
median_area = np.median(areas)
print('median_area: ' + str(median_area))
median_character_width = int(math.sqrt(median_area))
print('median_character_width: ' + str(median_character_width))
# Define area thresholds
min_area_threshold = median_area * 4
max_area_threshold = median_area * 50
# Filter components based on area thresholds
possible_signatures = []
for i in range(1, num_labels): # Exclude background
area = stats[i, cv2.CC_STAT_AREA]
if min_area_threshold < area < max_area_threshold:
left = stats[i, cv2.CC_STAT_LEFT]
top = stats[i, cv2.CC_STAT_TOP]
width = stats[i, cv2.CC_STAT_WIDTH]
height = stats[i, cv2.CC_STAT_HEIGHT]
print('Found candidate with area: ' + str(area))
#filter horizontal lines
if height < median_character_width * 5 and width > median_character_width*30:
print(' -> candidate is horizontal line with width, height: ' + str(width) + ',' + str(height))
continue
#filter vertical lines
if width < median_character_width * 5 and height > median_character_width*30:
print(' -> candidate is vertical line with width, height: ' + str(width) + ',' + str(height))
continue
#filter on a ratio of black pixels (logos for example have a higher ratio)for now guestimate is 0.3
roi = binary_image[top:top+height, left:left+width]
num_black_pixels = cv2.countNonZero(roi) # Calculate the number of black pixels in the ROI
total_pixels = width * height # Calculate the total number of pixels in the ROI
ratio = num_black_pixels / total_pixels # Calculate and return the ratio of black pixels
print(' -> candidate has black pixel ratio: ' + str(ratio))
if ratio > 0.30:
print(' -> candidate has too high black pixel ratio: ' )
continue
possible_signatures.append((left, top, width, height))
print('Nr of signatures found before merging: ' + str(len(possible_signatures)))
possible_signatures = merge_nearby_rectangles(possible_signatures, nearness=median_character_width*4)
# End measuring time
end_time = time.time()
print(f"Function took {end_time - start_time:.2f} seconds to process the image.")
return possible_signatures
def merge_nearby_rectangles(rectangles, nearness):
def is_near(rect1, rect2):
left1, top1, width1, height1 = rect1
left2, top2, width2, height2 = rect2
right1, bottom1 = left1 + width1, top1 + height1
right2, bottom2 = left2 + width2, top2 + height2
return not (right1 < left2 - nearness or left1 > right2 + nearness or
bottom1 < top2 - nearness or top1 > bottom2 + nearness)
def merge(rect1, rect2):
left1, top1, width1, height1 = rect1
left2, top2, width2, height2 = rect2
right1, bottom1 = left1 + width1, top1 + height1
right2, bottom2 = left2 + width2, top2 + height2
min_left = min(left1, left2)
min_top = min(top1, top2)
max_right = max(right1, right2)
max_bottom = max(bottom1, bottom2)
return (min_left, min_top, max_right - min_left, max_bottom - min_top)
merged = []
while rectangles:
current = rectangles.pop(0)
has_merged = False
for i, other in enumerate(merged):
if is_near(current, other):
merged[i] = merge(current, other)
has_merged = True
break
if not has_merged:
for i in range(len(rectangles) - 1, -1, -1):
if is_near(current, rectangles[i]):
current = merge(current, rectangles.pop(i))
if not has_merged:
merged.append(current)
return merged
我只花费了原本需要的一小部分时间来实现机器学习方法。除了节省时间之外,它的效果非常好。它能处理高分辨率和低分辨率扫描。该方法的其他优点是它能很容易地集成到现有的 C++或 Python 代码中,并且运行速度极快。当然,参数可以进一步调整,为此我邀请你打开我的共享 colab 笔记本自行尝试。如果你愿意在线试用,可以尝试我的Huggingface 演示。
图片由作者提供。
结论
面对技术挑战时,不要立刻进入“机器学习模式”,要对其他更简单的技术保持开放。虽然机器学习令人兴奋并开辟了许多新可能,但并不是每个任务都需要它。在选择适合你挑战的方法时,考虑开发时间、部署难易程度、准确性权衡和处理速度等因素是很重要的。
机器学习变得直观
ML:你需要知道的所有内容,没有任何复杂的数学
·
关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 7 月 5 日
–
你可能认为的 ML…(照片由 Justin Cheigh 在丹麦比隆拍摄)
什么是机器学习?
当然,像 ChatGPT 这样的模型背后的实际理论确实非常复杂,但机器学习(ML)背后的基本直觉是,嗯,很直观!那么,什么是 ML?
机器学习允许计算机通过数据进行学习。
但这意味着什么呢?计算机如何使用数据?计算机学习意味着什么?首先,谁在乎?让我们从最后一个问题开始。
现在,数据无处不在。因此,使用像机器学习这样的工具变得越来越重要,因为它可以在没有明确编程的情况下帮助发现数据中的有意义模式!换句话说,通过利用机器学习,我们能够将通用算法成功地应用于各种问题。
机器学习有几个主要类别,其中主要类型包括有监督学习(SL)、无监督学习(UL)和强化学习(RL)。今天我将只描述有监督学习,但在后续的帖子中,我希望能更详细地讲解无监督学习和强化学习。
1 分钟 SL 速跑
看,我明白你可能不想读完整篇文章。在这一部分,我将教你最基础的知识(对很多人来说,这就是你需要了解的全部内容!),然后再深入后面的部分。
有监督学习涉及如何使用不同的特征来预测某个标签。
设想一下,你试图找出一种方法来预测钻石的价格,使用的特征包括克拉、切工、净度等。这里的目标是学习一个函数,该函数以特定钻石的特征作为输入,并输出相应的价格。
就像人类通过例子学习一样,在这种情况下,计算机也会如此。为了能够学习预测规则,这个机器学习代理需要“标记示例”,包括钻石的特征和价格。监督的存在是因为你得到了标签(价格)。实际上,需要考虑的是你的标记示例是否真实,因为有监督学习的一个假设是标记示例是“真实情况”。
好的,现在我们已经了解了最基本的内容,我们可以更深入地探讨整个数据科学/机器学习流程。
问题设置
让我们用一个非常贴近的例子,这个例子来源于这本教科书。假设你被困在一个只有一种稀有水果“贾斯廷蜜瓜”的岛上。尽管你从未吃过贾斯廷蜜瓜,但你吃过很多其他水果,并且你知道你不想吃已经坏掉的水果。你还知道通常通过查看水果的颜色和坚实度可以判断水果是否变坏,因此你推测这对于贾斯廷蜜瓜也适用。
在机器学习术语中,你使用了之前的行业知识来确定两个特征(颜色、坚实度),你认为这将准确预测标签(贾斯廷蜜瓜是否变坏)。
但你怎么知道什么颜色和什么坚实度对应于水果变坏呢?谁知道呢?你只需要尝试。在机器学习术语中,我们需要数据。更具体地说,我们需要一个包含真实贾斯廷蜜瓜及其相关标签的标记数据集。
数据收集/处理
所以你花了接下来几天吃蜜瓜,并记录了颜色、硬度以及蜜瓜是否变坏。经过几天痛苦的吃坏掉的蜜瓜后,你得到了以下标注的数据集:
每一行代表一个特定的蜜瓜,每一列代表相应蜜瓜的特征/标签值。但请注意,我们有的是文字,因为特征是分类的而不是数值的。
实际上,我们需要数字以便计算机处理。有多种技术可以将分类特征转换为数值特征,从独热编码到嵌入以及其他方法。
我们可以做的最简单的事情是将“Label”列转换为“Good”列,如果蜜瓜好则为 1,如果坏则为 0。现在,假设有某种方法将颜色和硬度转换为一个从-10 到 10 的尺度,使其合理。作为额外的挑战,考虑将像颜色这样的分类特征放到这样一个尺度上的假设。经过这种预处理后,我们的数据集可能看起来像这样:
我们现在有了一个标注的数据集,这意味着我们可以使用监督学习算法。我们的算法需要是分类算法,因为我们预测的是一个类别,即好(1)或坏(0)。分类算法与回归算法相对,后者预测的是连续值,比如钻石的价格。
探索性数据分析
但使用什么算法呢?有多种监督分类算法,从基本的逻辑回归到一些复杂的深度学习算法。首先,让我们通过进行一些探索性数据分析(EDA)来查看我们的数据:
上面的图像是特征空间的图示;我们有两个特征,我们只是将每个例子放到一个坐标图上,两个轴分别是这两个特征。此外,如果相关的蜜瓜是好的,我们将点标记为紫色,如果是坏的,则标记为黄色。显然,通过稍微进行一些 EDA,就可以找到一个明显的答案!
我们可能应该将红圈内的所有点分类为优质瓜,而红圈外的点分类为劣质瓜。直观上,这样做是合理的!例如,你不想要一个坚硬如石的瓜,但也不希望它过于软绵绵。你想要的是介于两者之间的瓜,颜色的情况也可能类似。
我们确定我们希望的决策边界是一个圆,但这只是基于初步的数据可视化。我们如何系统地确定这一点?这在更大的问题中尤为相关,答案也不那么简单。想象一下数百个特征。在任何合理的方式中,都无法可视化 100 维特征空间。
我们学到了什么?
第一步是定义你的模型。分类模型有很多种。由于每种模型都有自己的假设,因此做出一个好的选择非常重要。为了强调这一点,我将从一个非常糟糕的选择开始。
一个直观的想法是通过权衡每个因素来进行预测:
Justin Cheigh 使用 Embed Fun 提供的公式
例如,假设我们的参数 w1 和 w2 分别为 2 和 1。还假设我们的输入 Justin Melon 是 Color = 4,Firmness = 6 的瓜。那么我们的预测 Good = (2 x 4) + (1 x 6) = 14。
我们的分类(14)甚至不是有效选项(0 或 1)之一。这是因为这实际上是一个回归算法。事实上,它是最简单的回归算法的简单案例:线性回归。
那么,让我们将其转化为分类算法。一个简单的方法是:使用线性回归,并在输出高于偏置项 b 时分类为 1。实际上,我们可以通过在模型中添加一个常数项来简化,使得当输出高于 0 时分类为 1。
在数学中,设 PRED = w1 * Color + w2 * Firmness + b。然后我们得到:
Justin Cheigh 使用 Embed Fun 提供的公式
这当然更好,因为我们至少在执行分类,但让我们绘制 PRED 在 x 轴上的图和分类在 y 轴上的图:
这有点极端。PRED 的轻微变化可能会完全改变分类。一种解决方案是让我们模型的输出表示 Justin-Melon 是好瓜的概率,我们可以通过平滑曲线来实现:
这是一条 sigmoid 曲线(或 logistic 曲线)。所以,与其使用 PRED 并应用这段分段激活(PRED ≥ 0 时为好),我们可以应用这个 sigmoid 激活函数来获得如上所示的平滑曲线。总体来说,我们的 logistic 模型看起来是这样的:
Justin Cheigh 使用 Embed Fun 提供的公式
在这里,sigma 代表的是 sigmoid 激活函数。很好,所以我们有了我们的模型,我们只需要找出哪些权重和偏差是最好的!这个过程被称为训练。
模型训练
很好,所以我们需要做的就是找出哪些权重和偏差是最好的!但这说起来容易做起来难。有无数种可能性,而“最好”到底意味着什么呢?
我们从后一个问题开始:什么是最好的?这里有一种简单而强大的方法:最优的权重是那些在我们的训练集上获得最高准确率的权重。
因此,我们只需要找出一个能够最大化准确率的算法。然而,从数学上来说,最小化某些东西更容易。换句话说,我们更倾向于定义一个损失函数,而不是一个值函数,其中较低的损失更好。虽然人们通常使用类似二元交叉熵的东西来计算(分类)损失,但我们将使用一个简单的例子:最小化错误分类的点数。
为此,我们使用一个被称为梯度下降的算法。从一个非常高的层次来看,梯度下降就像是一个视力不佳的滑雪者试图下山。一个好的损失函数的重要特性(而我们的粗糙损失函数实际上缺乏这种特性)是平滑性。如果你绘制我们的参数空间(参数值和相应的损失在同一图上),图像将看起来像一座山。
所以,我们首先从随机参数开始,因此我们很可能从一个糟糕的损失开始。就像一个滑雪者试图尽快下山一样,算法在各个方向上查找,试图找到最陡的路径(即如何调整参数以最大程度地降低损失)。但是,滑雪者的视力不佳,所以他们只能在每个方向上看一点。我们迭代这个过程,直到我们到达山底(敏锐的观察者可能会注意到我们实际上可能会到达局部最小值)。此时,我们得到的参数就是我们的训练参数。
一旦你训练了你的逻辑回归模型,你会发现你的性能仍然很差,准确率只有大约 60%(勉强比猜测好一点!)。这是因为我们违反了模型的一个假设。逻辑回归在数学上只能输出一个线性决策边界,但从我们的 EDA 中我们知道,决策边界应该是圆形的!
有了这个理念,你尝试了不同的、更复杂的模型,结果得到一个准确率达到 95%的模型!现在你有了一个完全训练好的分类器,能够区分好的 Justin-Melons 和不好的 Justin-Melons,你终于可以吃到你想要的所有美味水果了!
结论
让我们退后一步。大约在 10 分钟内,你学到了很多关于机器学习的知识,包括基本的监督学习流程。那么,接下来是什么呢?
好吧,那得由你来决定!对于一些人来说,这篇文章足以让他们对机器学习有一个高层次的了解。而对其他人来说,这篇文章可能会留下很多未解的问题。这很好!也许这种好奇心会促使你进一步探讨这个话题。
例如,在数据收集步骤中,我们假设你会连续几天吃大量的瓜果,而没有真正考虑任何特定的特征。这是没有意义的。如果你吃了一种绿色糊状的Justin-Melon并且让你感到剧烈不适,你可能会避开这种瓜果。在现实中,你会通过经验来学习,不断更新你的信念。这个框架更类似于强化学习。
那么如果你知道一种不好的Justin-Melon可能会立即致命,并且没有确定性就尝试它太过风险呢?没有这些标签,你无法进行监督学习。但也许还有一种方法可以在没有标签的情况下获得洞察。这个框架更类似于无监督学习。
在接下来的博客文章中,我希望能类比地扩展强化学习和无监督学习。
感谢阅读!
机器学习必读:秋季专题
·
跟随 发表在 Towards Data Science ·作为 Newsletter 发送 ·阅读时间 3 分钟 ·Oct 5, 2023
–
理解当前机器学习的现状并不容易:一方面,即使在该领域工作了一段时间,掌握基础概念和方法也需要时间。另一方面,新的工具和模型不断涌现,更新速度迅猛。作为机器学习学习者应该怎么办?
我们倾向于采取一种平衡、渐进的方法——这种方法认识到没有一个人可以掌握所有的知识,但是持续、稳定地消化信息的方法可以帮助你在该领域站稳脚跟。
我们本周的亮点选择反映了这一信念:我们挑选了一些精心制作的文章,涵盖了基础话题和前沿话题,初学者和经验丰富的专业人士都能从中受益。让我们深入了解一下。
-
SHAP 与 ALE 在特征交互中的对比:理解冲突结果理解模型预测是数据专业人员工作的核心,但这一过程很少是直接的。Valerie Carey的最新文章集中讨论了一个特别棘手的情况,即两个可解释性工具——SHAP 和 ALE——产生冲突结果,并探讨了如何超越这些困惑时刻。
-
AI 的奥林匹克:机器学习系统的基准测试借鉴首位突破 4 分钟英里障碍的运动员,Matthew Stewart, PhD提供了机器学习基准测试的全景概述,并探讨了这些基准如何促进创新和提高性能:“一个设计良好的基准可以引导整个社区向突破性的进展迈进,重新定义一个领域。”
-
DINO——计算机视觉的基础模型如果你喜欢深入探讨某个话题,不要错过Sascha Kirch的系列文章,这些文章逐一解析和背景化有影响力的机器学习论文。在最近的一篇文章中,Sascha 带我们深入了解了 DINO,这是一种基于视觉变换器(ViT)开创性能力的基础模型。
-
探索 GEMBA:一种基于 LLM 的新型翻译质量评估指标机器翻译技术并不新颖,但 LLM 的兴起为提升现有工具和工作流程带来了新可能。Dr. Varshita Sher的最新文章向我们介绍了 GEMBA,这是一种利用 GPT 模型评估机器翻译文本质量的新指标。
-
机器学习插图:增量学习
对于视觉学习者,特别是那些刚踏入这一领域的人,Shreya Rao的面向初学者的增量学习指南解答了一个关键问题:模型如何维护和构建现有知识?
本周想要拓展其他话题吗?希望如此——以下是一些最近的亮点:
-
如果你觉得在繁忙的日程中抽时间去探索新话题和扩展技能很困难,不妨看看Zijing Zhu为数据科学家制定的形成健康持续学习习惯的指南。
-
弥合现有对话 AI 工具与现实世界用户界面系统之间的差距是一个真正的挑战;Janna Lipenkova的深度解析提供了一份详细的路线图,帮助你实现目标。
-
一个功能性、实用的 AI 伦理工具包会是什么样子?Malak Sadek 分享了她最近主持的一次以设计为导向的研讨会中的有益见解。
-
对于以市场营销和业务为重点的数据科学家,Damian Gil概述了几种高级客户细分技术(包括一种依赖 LLMs 力量的技术),这些技术可以帮助你生成有价值的见解。
-
各国政府正在尝试对 AI 工具进行监管。Viggy Balagopalakrishnan 反思了这些尝试的不足之处,并倡导一种更为务实、基于机制的方法。
感谢你支持我们作者的工作!如果你喜欢在 TDS 上阅读的文章,考虑成为 Medium 会员——这将解锁我们整个档案(以及 Medium 上的其他每一篇文章)。
多输出数据集上的机器学习:快速指南
如何在多输出数据集上以最小编码工作量训练和验证机器学习模型
·
关注 发布于 Towards Data Science ·6 min read·2023 年 3 月 10 日
–
图片由 Victor Barrios 提供,来源于 Unsplash
介绍
大家熟悉的标准机器学习任务包括分类(二分类和多分类)和回归。在这些情况下,我们尝试预测一个目标列。在多输出情况下,有多个目标列,我们希望训练一个能够同时预测所有目标列的模型。我们识别出三种多输出任务:
-
多标签:多标签是一个分类任务,将每个样本标记为m个标签,标签来自n_classes个可能的类别,其中m的范围是 0 到n_classes。这可以被视为预测样本的非互斥属性。例如,对文本文件相关话题的预测。该文件可能涉及宗教、政治、金融或教育中的一个、多个或所有话题类别。
-
多类-多输出:多类-多输出(也称为多任务分类)是一个分类任务,其中每个样本都有一组非二元属性标签。属性的数量和每个属性的类别数量都大于 2。这不仅是对多标签分类任务的泛化(多标签分类任务只考虑二元属性),也是对多类分类任务的泛化(多类分类任务只考虑一个属性)。例如,对一组水果图像的“水果类型”和“颜色”属性进行分类。属性“水果类型”可能的类别有:苹果、梨和橙子。属性“颜色”可能的类别有:绿色、红色、黄色和橙色。每个样本是一张水果的图像,对两个属性都会输出一个标签,每个标签都是对应属性的可能类别之一。
-
多输出回归:多输出回归预测每个样本的多个数值属性。每个属性是一个数值变量,每个样本需要预测的属性数量>=2。例如,使用在某个位置获得的数据预测风速和风向(以度为单位)。每个样本是从一个位置获得的数据,对每个样本会输出风速和风向。
在这个故事中,我们将解释ATOM库如何帮助你加快多输出数据集的管道。从数据预处理到模型训练、验证和结果分析。ATOM 是一个开源 Python 包,旨在帮助数据科学家探索机器学习管道。
注意:这个故事专注于使用 ATOM 处理多输出数据集。库的基础知识教学不在本故事范围之内。如果你想了解库的简单介绍,请阅读这篇文章。
数据预处理
在atom中初始化多输出数据集的过程与其他任务非常相似,但有一点需要注意:你必须使用关键字参数y
指定目标列。
atom = ATOMClassifier(X, y=y, verbose=2, random_state=1)
如果不提供y=
,atom 会认为第二个参数是测试集,就像你用atom = ATOMClassifier(train, test)
进行初始化一样,这会导致列不匹配异常。
你还可以提供一系列列名或位置来指定 X
中的目标列。例如,要指定最后 3 列作为目标,请使用:
atom = ATOMClassifier(X, y=(-3, -2, -1), verbose=2, random_state=1)
在所有情况下,打印 self.y
现在返回的是 DataFrame
类型的目标,而不是 Series
类型。
对于多标签任务,目标列可能看起来像这样。
0 [politics]
1 [religion, finance]
2 [politics, finance, education]
3 []
4 [finance]
5 [finance, religion]
6 [finance]
7 [religion, finance]
8 [education]
9 [finance, religion, politics]
Name: target, dtype: object
模型不能直接处理变量数量的目标类。使用
使用 clean 方法为每个样本的每个类分配一个二进制输出。正类用 1 表示,负类用 0 表示。因此,它可与运行 n_classes 个二元分类任务相比较。
atom.clean()
在我们的示例中,目标(atom.y
)被转换为:
education finance politics religion
0 0 0 1 0
1 0 1 0 1
2 1 1 1 0
3 0 0 0 0
4 0 1 0 0
5 0 1 0 1
6 0 1 0 0
7 0 1 0 1
8 1 0 0 0
9 0 1 1 1
模型训练和验证
一些模型对多输出任务有原生支持。这意味着
原始估计器用于直接对所有
目标列。
然而,大多数模型没有对多输出任务的集成支持。ATOM 仍然使使用它们成为可能,通过将估计器包装在一个能够处理多个目标列的元估计器中。这是自动完成的,无需额外的代码或用户的先验知识。
对于多标签任务,默认使用的元估计器是:
对于多类多输出和多输出回归任务,
默认的元估计器分别是:
multioutput
属性包含了元估计器对象。更改该属性:
属性的值使用自定义对象。无论是类还是实例,只要
原估计器是第一个参数的情况。比如,要更改回归模型的元估计器,使用:
from sklearn.multioutput import RegressorChain
atom.multioutput = RegressorChain
要检查哪些模型对多输出数据集有原生支持,哪些没有,使用:
atom.available_model()[["acronym", "model", "native_multioutput"]]
现在,你可以正常训练模型。
atom.run(models=["LDA", "RF"], metric="f1")
并检查估计器。
一些模型,如 MultiLayer Perceptron,对多标签任务有原生支持,但对多类多输出任务没有。因此,它们的 native_multioutput
标记为 False,但如果你有一个多标签任务,这些模型不一定需要一个多输出元估计器。在这种情况下,使用 atom 的 multioutput
属性告诉 atom 不使用任何多输出包装器。
atom.multioutput = None
# MLP won't use a meta-estimator wrapper now
atom.run(models=["MLP"])
注意: sklearn 度量不支持多类-多输出分类任务。ATOM 计算这种任务的度量方法是对每个目标列的得分取平均值。
结果分析
具有多输出估算器的模型可以正常调用分析方法和绘图。在绘图中使用target
参数以指定使用哪个目标列。
atom.plot_roc(target=2)
当target
参数还指定了类别时,使用格式(列,类别)。
atom.plot_probabilities(models="MLP", target=(2, 1))
with atom.canvas(figsize=(900, 600)):
atom.plot_calibration(target=0)
atom.plot_calibration(target=1)
结论
我们已经展示了如何轻松使用 ATOM 包,以便快速探索多输出数据集上的机器学习管道。点击这里查看多输出回归任务的完整示例,点击这里查看多标签分类示例。
关于 ATOM 的更多信息,请查看该包的文档。如有错误或功能请求,请随时在GitHub上提交问题或发送电子邮件给我。
相关故事:
-
towardsdatascience.com/atom-a-python-package-for-fast-exploration-of-machine-learning-pipelines-653956a16e7b
-
towardsdatascience.com/how-to-test-multiple-machine-learning-pipelines-with-just-a-few-lines-of-python-1a16cb4686d
-
towardsdatascience.com/from-raw-data-to-web-app-deployment-with-atom-and-streamlit-d8df381aa19f
-
towardsdatascience.com/exploration-of-deep-learning-pipelines-made-easy-e1cf649892bc
-
towardsdatascience.com/deep-feature-synthesis-vs-genetic-feature-generation-6ba4d05a6ca5
-
towardsdatascience.com/from-raw-text-to-model-prediction-in-under-30-lines-of-python-32133d853407
-
towardsdatascience.com/how-to-make-40-interactive-plots-to-analyze-your-machine-learning-pipeline-ee718afd7bc2
参考文献:
- 本故事中的所有绘图均由作者创建。
机器学习编排与 MLOps
·
关注 发布于 数据科学前沿 · 5 分钟阅读 · 2023 年 6 月 5 日
–
图片由 Mark Williams 提供,来源于 Unsplash
我听到过我合作过的 ML 工程师说“机器学习操作(MLOps)的主要部分只是数据工程”。有一篇博客文章将实际百分比定为98%。这显然是夸张的说法,但我认为这个观点是正确的。然而,MLOps 的含义仍在变化。虽然有很多组件和变动的部分可以被认为是 MLOps 的一部分,Cristiano Breuel 的这个定义足够好,适合我在这篇文章中讨论的内容:
ML Ops 是一组结合了机器学习、DevOps 和数据工程的实践,旨在可靠且高效地部署和维护生产中的 ML 系统。
作者改编自原始图像由 CM Beuel 提供
我想补充的是,一个“好”的 ML 系统是:
解决业务需求并有效交付的系统。MLOps 团队的关注点应该始终放在解决业务需求上。
像大多数基于工作流(或管道)的系统一样,MLOps 系统需要一个协调器。在这个上下文中,它可以被称为机器学习协调器(或现在的 MLOx)。MLOx 的工作就是一个协调器的工作,即一个可以在非常具体的时间表上管理和协调复杂工作流和过程的机制。在 MLOps 和许多其他 ML 相关系统中,常用的一个协调器是Apache Airflow,其他包括 Dagster、Prefect、Flyte、Mage等。本文将重点关注 Airflow。
我喜欢把 MLOx 想象成类似于电影导演(或管弦乐队的指挥,但那可能会让人困惑,因为我们会讨论指挥管弦乐队)。导演有一个剧本,他们依据这个剧本来指导各种过程,以交付最终产品——电影。在 MLOx 的上下文中,工作流就相当于剧本。协调器的角色是确保工作流中的各种过程按计划、按正确的顺序执行,并妥善处理故障。
然而,Airflow 给这个类比带来了复杂性。Airflow 还具有计算能力,因为它可以利用运行环境来执行任何 Python 代码(类似于 Dagster、Prefect 等)。作为一个可扩展的开源工具,它更像是一个演员兼导演,其中一个 Airflow 任务可以像导演在电影中扮演角色一样成为工作流的一个重要部分。使用 Airflow,你可以将数据加载到内存中,进行一些处理,然后将数据传递到下一个任务。通过这种方式,Airflow 可以作为 MLOps 工具,也可以作为协调器。它可以直接执行所需的机器学习操作,或者仅仅作为协调器,实例化 TensorFlow 集群上的进程或启动 Spark 作业等。
简而言之,MLOx 是一个利用机器学习工具进行操作的协调器。
ZenML 定义的 MLOx 如下:
协调器是任何 MLOps 堆栈中的关键组件,因为它负责运行你的机器学习管道。为此,协调器提供了一个环境,以便执行管道的各个步骤。它还确保只有在所有输入(即管道之前步骤的输出)都可用时,管道的步骤才会被执行。
由作者改编自 原始图像 CM Beuel
使 Airflow 特别适合作为 MLOx 的特点包括:
-
DAGs(有向无环图):DAGs 是机器学习工作流的可视化表示。DAGs 使得查看任务之间的依赖关系以及跟踪工作流进度变得更加容易。
-
调度:Airflow 可以用来定期调度机器学习工作流。这有助于确保机器学习模型始终保持最新,并及时用于预测。
-
监控:Airflow 提供了多种工具来监控机器学习工作流。这些工具可以用于跟踪机器学习模型的性能,并识别潜在的问题。
想想“Airflow 和”,而不是“Airflow 或”
我发现当人们决定选择 ML 工具时,一个复杂的问题是寻找一个能够完成所有工作的工具,包括协调。某些一体化工具包括一个基本的工作流调度器以满足最低要求,但它的能力可能远不如 Airflow。一旦你的 MLOx 需求超出了包含的协调器的能力,你就需要引入一个更强大的协调器,重新进行调度工作,并且可能还需要重写大量代码。
另一个问题是我看到有人将 Airflow 与做着截然不同事情的 ML 工具进行比较,有些工具的名称恰好以“flow”结尾,比如 MLFlow 或 Kubeflow。MLFlow 主要用于实验跟踪,与 Airflow 的操作方式完全不同。Airflow 只是广泛 MLOps 工具空间中的另一个组件,从模型注册到实验跟踪到专门的模型训练平台。MLOps 涵盖了有效 ML 工作流管理所需的许多组件。
一些进入 MLOps 的人来自更具实验性的 数据科学 环境,并且没有 Dev Ops 和 数据工程 带来的更严格要求的经验。数据科学家以更随意的方式工作,而 MLOps 则需要结构化的方法。要实现端到端的 MLOps 管道,需要一种系统化、可重复的方法来处理数据、提取特征、训练模型和部署模型。Airflow 经常用于编排像这样的结构化过程,可能需要对那些习惯于更灵活的数据科学方法的人进行一些学习。然而,如果你计划扩展你的 MLOps 能力,应该从一开始就使用正确的工具。
使用 Airflow 作为 MLOx 的最终考虑是许多组织已经拥有一个正在进行某种数据编排工作的 Airflow 实现。如果已经有人知道如何管理 Airflow 基础设施,并且能够帮助创建和运行 DAG,你就拥有了启动和运行 MLOx 所需的一切。加上像 gusty 和 Astro SDK 这样的自动 DAG 生成工具,或者来自 ZenML 和 Metaflow 的机器学习专用 DAG 生成器,让你可以在不需要深入了解 Airflow 的情况下获得一个可用的 MLOx。
结论
机器学习编排,也称为 MLOx,是 MLOps 的一个重要组成部分。它需要一个全面且适应性强的解决方案。Apache Airflow 是一个强大的编排工具,能够实现无缝的工作流管理和执行。通过涵盖编排者和 MLOps 工具的角色,Airflow 使组织能够高效地部署和维护机器学习模型。随着 MLOps 领域的不断发展,采用像 Airflow 这样的工具对于最大化生产力和释放机器学习的真正潜力变得至关重要。
机器学习技巧、与 ChatGPT 的学习以及其他近期必读书单
·
关注 发表在 Towards Data Science · 以 新闻通讯 发送 · 3 分钟阅读 · 2023 年 8 月 31 日
–
随着八月的结束,我们许多读者即将重返学校(无论是大学、培训班还是在线学习),而其他人则在摆脱夏季的悠闲节奏。现在正是为你下一阶段的数据科学学习之旅做好准备的最佳时机。
如果你重新关注数据和机器学习相关的话题,你将大有收获:我们许多作者在过去一个月里显然并没有减缓步伐,实际上,他们正全力以赴地撰写一些迄今为止最强的文章。为了迎接新的一月(并向上一个月作出适当的告别),我们收集了八月份最受欢迎的文章,供你浏览、收藏——我们希望——深入阅读。享受吧!
我们最受欢迎的文章
群体智慧可能并不总是无懈可击,但你不会错过本月 TDS 的任何伟大作品——在我们发布的数百篇文章中,这些是与我们(极其)精明的读者产生共鸣的文章。
-
**130 个精心策划的机器学习技巧和资源(3 年收录)**这是一个巨大的实用小知识汇编,由 Bex T. 精心编排。
-
如果我可以重新开始,我会如何通过 ChatGPT 学习数据科学来自 Natassha Selvaraj,这是一个借助某个聊天机器人的实用数据科学学习路线图。
-
如何使用大型语言模型与 PDF 和图像文件对话——附代码
对于任何希望获得 LLM 实践经验的人,Zoumana Keita的教程是一个顶级选择。
-
图卷积网络:GNNs 介绍
如果你想阅读一篇理论与实践完美结合的文章,不妨看看 Maxime Labonne 关于 GNNs 的易读入门。
-
掌握蒙特卡洛方法:如何通过模拟改进你的机器学习模型证明了即便是长篇精心制作的文章也永远不会显得过长,Sydney Nye对蒙特卡洛模拟的深入探讨——她的 TDS 首篇文章!—在我们的读者中引起了极大的轰动。
图片由 Mike Petrucci 提供,来源于 Unsplash
话题引发者
我们喜欢那些能引发热烈讨论的文章——或者为现有对话增添有趣的角度。以下是最近三篇在这方面表现突出的帖子。
-
**决策科学是否悄然成为了新的数据科学?**如果你一直在好奇决策科学家在做什么以及这一角色如何与传统数据分析师有所不同,不要错过Matt Chapman的见解(以及它引发的许多热烈评论)。
-
**机器学习工程师——他们到底做什么?**感谢Stephanie Kirmer关于 MLEs 的帖子,我们有机会看到关于职位名称和描述演变的另一场精彩讨论——以及在这个案例中,职位描述如何有时反映出我们需要直接面对的偏见和紧张。
-
你的数据(终于)在云端了。现在,别再表现得像在本地部署近年来数据基础设施的迅速演变使得许多团队在云端和本地部署之间的某个地方停滞不前。幸运的是,Barr Moses提供了关于如何迈向更高效未来的深刻见解。
我们最新的一批新作者
每个月,我们都很高兴看到一群新的作者加入 TDS,他们将自己独特的声音、知识和经验分享给我们的社区。如果你在寻找新的作家进行探索和关注,可以浏览我们最新加入的作者的作品,包括Jonathan Apple、Jarom Hulet、Sergey Vilov、David Rubio、Sydney Nye、Rüdiger Buchkremer, PhD、Michal Szudejko、Wanming Huang、John Lenehan、François Porcher、Tingsong Ou、Le Nguyen、Suyang Li、Ida Johnsson, PhD、Michael Segner、Radmila M.、Chen Margalit、Pratik Aher、Gabriel L. Sena、Stan Pugsley、Caroline Arnold、Jeff Braun、Gianpi Colonna、Jaroslaw Drapala、Ahmad Albarqawi、Mateusz Praski、Julie Zhang、Joseph George Lewis、Thao Vu、Stefan Berkner、Ryan Shrott、Mary M、Eric Zhù、Stefan Suwelack、Maham Haroon、Jeff Chou、Berkan Zorlubas、Mariano Kamp、Douglas Blank, PhD、Gamze Zorlubas、Fatih Demirci、Jerry Qu,以及Daniel Frees。
感谢您支持我们作者的工作!如果您喜欢在 TDS 上阅读的文章,考虑成为 Medium 会员——这将解锁我们整个档案库(以及 Medium 上的其他所有帖子)。
直到下一个 Variable,
TDS 编辑团队
专家模型的机器学习:入门指南
原文:
towardsdatascience.com/machine-learning-with-expert-models-a-primer-6c74585f223f
数十年前的理念如何使得今天训练极其庞大的神经网络成为可能
·发表于 Towards Data Science ·9 分钟阅读·2023 年 9 月 5 日
–
(Pexels)
专家模型是机器学习中最有用的发明之一,但它们往往未能获得应有的关注。事实上,专家建模不仅使我们能够训练出“极其庞大”的神经网络(稍后会详细讲述),它们还使我们能够构建出更像人脑的模型,即不同区域专门处理不同类型的输入。
在这篇文章中,我们将探讨专家建模的关键创新,这些创新最终导致了如 Switch Transformer 和 Expert Choice Routing 算法这样的最新突破。但首先让我们回顾一下所有这一切的起点: “专家混合模型”。
专家混合模型(1991)
1991 年的原始 MoE 模型。图片来源:Jabocs et al 1991, Adaptive Mixtures of Local Experts。
专家混合模型(MoE)的理念可以追溯到三十多年前,源于 1991 年由人工智能奠基人Geoffrey Hinton共同撰写的论文。MoE 的核心思想是通过结合多个“专家”E 来建模输出“y”,每个专家的权重由“门控网络”G 控制:
在这个上下文中,专家可以是任何类型的模型,但通常选择的是多层神经网络,门控网络是
其中 W 是一个可学习的矩阵,用于将训练样本分配给专家。因此,训练 MoE 模型的学习目标有两个方面:
-
专家将学习处理他们所得到的输出,生成最佳输出(即预测),并且
-
门控网络将学习“路由”正确的训练样本到正确的专家,通过联合学习路由矩阵 W。
为什么要这样做?为什么有效?从高层次来看,使用这种方法有三个主要动机:
首先,MoE 由于模型的稀疏性允许将神经网络扩展到非常大的规模,即使整体模型很大,由于存在高度专业化的专家,对于任何给定的训练样本,只需执行少量计算。这种方法与标准的“密集型”神经网络形成对比,在标准模型中,每个输入样本都需要每一个神经元。
其次,MoE 允许更好的模型泛化,降低过拟合风险,因为每个单独的专家可以是一个相对较小的神经网络,但通过添加更多专家,我们仍然能实现强大的整体模型性能。类似于提升方法,这是一种将大量相对较弱的学习器结合成一个强大的学习器的方法。
第三,MoE 更接近我们大脑的工作方式:任何给定的输入只会激活我们大脑中的某些区域,不同区域处理触觉、视觉、听觉、嗅觉、味觉、方向感等。这些区域都可以看作是“专家”。
简而言之,MoE 使我们不再需要对每个输入激活每一个神经元。MoE 模型稀疏、高度灵活且极其强大。
极其庞大的神经网络(2017)
快进 26 年到影响深远的论文 “极其庞大的神经网络”,同样来自 Hinton 的团队(这次在 Google Brain)。在这项工作中,作者将 MoE 推向极限,展示了一个具有千名专家的 60 亿参数 MoE 模型。为了构建如此庞大的 MoE 模型,作者引入了几种建模技巧,包括:
噪声 top-k 门控。 Top-k 门控意味着对于每个训练样本,我们只计算 top k 专家的输出(由门控确定),忽略其他所有专家。主要动机是节省计算成本:例如,如果我们有 20 个专家并应用 k=5 的 top-k 门控,我们可以将模型训练的总计算成本减少一个数量级的 4 倍!
“噪声”意味着我们在门控值中添加可调的高斯随机噪声。作者发现这有助于负载均衡,即确保整批数据不会全部发送到单一专家。
辅助损失。 作者将两个辅助(正则化)损失项添加到模型的损失函数中,即“负载均衡损失”和“专家多样性损失”,每个都有其自身可调的正则化参数:
-
负载均衡损失与每个专家接收的训练样本数量的变异系数成正比。增加这个损失可以提高计算性能,因为它防止了“专家瓶颈”的出现,即所有训练样本必须通过一个专家。(一个细节是每个专家的训练样本数量不可微分——因此作者使用了这个数量的平滑近似值。)
-
专家多样性损失与专家重要性的变异系数成正比,其中专家重要性定义为该专家的门值之和。增加这个损失可以促使模型平等地利用所有专家,而不是简单地将所有训练样本发送给一个学习所有内容的专家,这在训练 MoE 模型中是一个常见问题,也是一个局部最小值。
尽管这两个损失项相似,作者发现当同时添加负载均衡损失和专家多样性损失,并且两个损失项的正则化参数为 0.1 时,整体性能最佳。
定制化并行性。 作者展示了大型 MoE 模型如何从数据并行和模型并行的定制组合中受益:特别是,我们可以允许专家分布在不同的机器上,因为我们不需要它们之间的通信,同时使用数据并行性来增加批处理大小。这种并行形式使我们能够大幅扩展 MoE 模型:在他们的实验中,作者将模型扩展到 60 亿参数,配备数千个专家。
使用他们的大规模 MoE 模型,作者在 Billion-words 语言建模基准上建立了新的 SOTA(最先进技术)。
Switch Transformers (2022)
使用 Switch Transformer 进行 7 倍更快的训练。图片来源:Fedus et al 2022
虽然“极大规模神经网络”展示了 top-k 门控在 MoE 模型中的有效性,Switch Transformers同样由 Google 提出,通过构建 k=1 的 MoE Transformer 模型将其推向了极限,即每个训练样本仅被发送到一个专家。作者称之为“硬路由”,与标准 MoE 模型中的“软路由”形成对比,在标准 MoE 模型中,来自多个专家的输出被汇聚。
实际上,硬路由(k=1)意味着我们可以拥有多个专家,数量 N 可以为任何数值,并且计算复杂度保持不变:模型容量按 O(1)扩展!唯一的折衷是我们需要大量的内存来存储所有专家。然而,由于我们不要求专家之间的通信,这些内存可以分布在一个大型机器集群中。
此外,作者还介绍了许多实用的建模技巧,包括:
-
精确投射:这意味着我们在机器之间传送权重时使用 BF16(16 位brain float),但在计算门控值时将其转换为 FP32(32 位浮点精度)。这一技巧减少了通信开销,因为我们只需传输 16 位而非 32 位,同时确保了 softmax 计算的稳定性(16 位下不稳定)。
-
激进的专家丢弃:作者发现,通过在专家模块中应用 0.4 的激进丢弃,同时在模型架构的其他部分保持 0.1 的丢弃率,可以提高模型性能。原因是专家容易过拟合,因为它们仅看到一部分数据,因此需要更强的正则化。
-
缩放的专家初始化:作者发现,当将专家层的初始化缩小 10 倍时,训练稳定性显著提高。
最终,作者基于 Google 的 T5 语言模型构建了一个 Switch Transformer,并在相同计算资源下实现了 7 倍的预训练速度提升,这强有力地展示了通过将基于硬路由的 MoE 与 Transformer 模型结合所能带来的建模改进。
专家选择路由(2022)
标准的令牌选择路由(左)与新的专家选择路由算法(右)相比。请注意,在专家选择路由中,一个令牌可以同时路由到多个专家。图像来源:Zhou et al 2022
近期在专家建模领域的突破之一是“专家选择路由”,这是 Google 的又一创新。
训练 MoE 模型的问题在于专家通常由于“赢家通吃”效应而未被充分利用,其中一个随机接收到前几个训练样本的专家迅速变得比其他专家更优秀并主导门控。到目前为止,标准做法是添加辅助损失,以促使模型平等利用所有专家(如 Hinton 工作中的专家多样性损失)。然而,添加辅助损失带来了调整其正则化参数相对于实际损失的难题:太小,则模型行为无变化;太大,则风险使所有专家相同(另一个局部最小值)。
“专家选择路由”的关键思想简单却强大:让专家在批次中选择其最优的 k 个训练样本,而不是让训练样本选择其最优的 k 个专家。这有几个优点:
-
它保证了负载均衡和专家利用率的完美一致(每个专家总是在每个批次中接收相同数量的训练样本),
-
并非每个训练样本都有相同数量的专家,有些可能被分配给 1 位专家,有些则分配给所有专家。这是一种期望的特性:不同的训练样本对模型而言难度不同,因此可能需要不同数量的专家。
-
不需要调整的额外辅助损失。
从数学上讲,专家选择路由替代了标准的门控函数。
与
也就是说,与 e 维向量不同,门控 G 现在是一个维度为 e(专家数量)乘以 n(令牌数量)的矩阵。为什么是令牌?作者将专家选择路由考虑在 NLP 问题的背景下,因此每个训练样本只是 n 个可能令牌的序列。
到目前为止,这些理论(实际上就是将 G 从向量转换为矩阵),但它在实践中表现如何?作者展示了他们可以在一半的训练时间内达到与Switch Transformer相同的性能,并且在相同的计算成本下,在 GLUE 和 SuperGLUE 基准测试的 11 项任务上超越了Switch Transformer。
专家选择路由击败了Switch Transformer,这证明了至少对于 NLP 问题而言,“专家选择”优于“令牌选择”。
摘要
简要回顾:
-
MoE 模型中的关键思想是将输出 y 建模为专家的加权和,其中每个专家本身就是一个小型神经网络,权重由 G(x) = softmax(Wx)决定,其中 W 是一个可学习的矩阵。
-
top-k 门控意味着我们忽略所有专家,只关注前 k 个。这节省了大量计算成本,并且是专家建模中的一个重要突破。
-
MoE 模型经常陷入局部最小值,即所有训练样本都被送往单个专家。解决方法是向模型的损失函数中添加“专家多样性损失”。
-
Switch Transformers将 MoE 的概念与Transformer模型结合,并展示了这种组合可以将 T5 语言模型的训练速度提高 7 倍。这里的一个关键创新是“硬路由”,即 k=1 的 top-k 路由。
-
专家选择路由用专家选择训练样本的概念取代了训练样本选择专家的概念。这允许更好的训练稳定性而无需引入额外的辅助损失。
这仅仅是冰山一角。事实上,受到Hinton“极大规模”MoE 模型、Switch Transformer和新专家选择路由算法成功的启发,专家建模领域涌现了大量新的论文。
关于 MoE 模型的研究论文集,其中“专家选择”论文用红色突出显示,来源:ConnectedPapers。
专家建模是一个令人兴奋的领域,经过数十年的发展,我们才刚刚开始看到它对现代机器学习应用的影响。请关注这个领域——新的突破无疑在即!
机器学习的公众认知问题
为什么公众的机器学习素养需要成为数据科学的优先事项,以及我们能为此做些什么。
·
关注 发表在 Towards Data Science ·10 分钟阅读·2023 年 9 月 2 日
–
最近我在听一个播客,里面有一些聪明、深思熟虑的普通人(我不会透露他们的名字,以示礼貌),讨论 AI 如何在医疗保健中使用。我已经有些担忧,因为他们使用了“AI”这个术语,我发现这常常意味着同时包括了所有和没有任何意义。但我继续听下去,他们讨论了如何将 AI 工具(实际上只是机器学习)融入医疗实践。这些工具包括根据症状建议诊断,以及根据患者的生命体征和病情调整药物剂量,这些看起来很有前景且实际。
然而,在接下来的瞬间,我有些震惊,因为一位发言者(一位医学博士)说(我概括一下)“似乎 AI 在数学方面变差了”。这一点不仅在整个播客中萦绕于我,整个周末都未曾离开。
当受过教育、聪明的普通人对机器学习感到如此困惑和误解时,我们就有了问题。(我会避免使用“AI”这个术语,因为我真的相信它比解释更多地混淆了我们的意义。在这个背景下,这些人讨论的是机器学习和使用它的产品,即使他们对此并不知晓。)
在这位医生的例子中,他可能是在谈到大型语言模型(LLMs)时提到数学。他不知为何认为一个被训练以复杂方式排列单词以响应提示的模型也应该能够进行数学计算。它在这方面并不擅长(因为它并没有被训练来做这些!),他的所有机器学习的印象都被这一现实所玷污。
与这种误解相反,数据科学家知道 LLMs 只是更广泛机器学习领域的一小部分。许多其他算法和模型在数学计算方面表现出色,因为那是它们的具体目的。(正如一个朋友说的,当我告诉他这个故事时,“机器学习模型本质上就是数学!”)然而,这段话的开头是问题所在——数据科学家知道这一点,但公众普遍并不知晓。
…数据科学家明白 LLMs 只是更广泛机器学习领域的一小部分。
我可以花整篇文章讨论语言模型与其他形式的机器学习之间的区别,但这并不是我今天真正感兴趣的。相反,我想探讨一下为什么我们需要关注普通人缺乏这些信息,以及可能的影响。
为什么我们应该关心普通人是否了解机器学习?
作为一名转行的数据科学家,我非常关注人们如何与数据科学和机器学习互动。我对此有个人的哲学:如果你的机器学习在某种程度上没有惠及人们或我们周围的世界,那它真的不重要。我认为人类努力的目的需要是改善他人的生活,这同样适用于机器学习。
然而,即使你不认同这种观点,我认为你仍然应该关心大众是否理解机器学习的基本概念。如果人们缺乏这种理解,宝贵的、值得信赖的工具的采纳可能会停滞不前。
我的论点大致如下:
-
人们天生不准备理解和互动机器学习。
-
没有理解这些工具,一些人可能会避免或不信任它们。
-
更糟糕的是,一些人可能因为误导信息而滥用这些工具,从而导致不利的结果。
-
经历了滥用的负面后果后,人们可能会变得不愿意采纳未来可能改善他们生活和社区的机器学习工具。
机器学习的效果依赖于使用者能否最大限度地发挥其功能。我经常看到和听到像我开头提到的轶事一样的例子,人们对机器学习的理解充满了极端的误解,并在这个错误的基础上建立了思维框架。这导致了他们对机器学习的整个认知图谱都是不正确的。
这对数据科学领域的意义在于,我们在构建越来越先进的机器学习中的所有工作,其可能性并不受限于我们能获得多少 GPU,而是受限于我们解释我们所构建的内容和教育公众有关其意义及如何使用的能力。
…我们在建设更先进机器学习服务中的工作,其可能性并不受我们能获得多少 GPU 的限制,而是受限于我们解释所构建内容的能力。
人们天生并不准备理解机器学习。
我最近读了一篇文章,题为 “Why Johnny Can’t Prompt”(Zamfirescu-Pereira, Wong, Hartmann, 和 Yang, 2023 年 4 月)。这让我对非数据科学家如何看待和处理生成式 AI,特别是广义上的机器学习,有了很多思考。
我可能会另写一篇文章来详细讨论这个话题,但对于这个论点来说,有价值的一点是:人们倾向于将他们与其他人互动的既有框架应用于与机器学习系统的互动中,从而导致效果不佳和用户挫败感。
人们倾向于将他们与其他人互动的既有框架应用于与机器学习系统的互动中,从而导致效果不佳和用户挫败感。
现在,我不认为这是不可修复的。我实际上认为人类总是需要学习如何使用新工具,我们绝对可以做到。想想我们如何逐渐学会使用电脑和智能手机。最开始并不明显如何操作或如何让自己被面前的设备“理解”。
这主要是通过时间的推移、设备设计的改进使其更直观(例如,技术迎合我们现有的需求)和教育来解决的。当我年轻时,年长或技术水平较低的人可以在当地社区学院接受免费或低费用的计算机课程。目标不是学习编程,而是有效地使用计算机,因为它们是极其有用的工具。
我认为这个过程同样适用于机器学习,但有一些不同之处。首先,很多机器学习对我们来说是抽象的,或者它被包装在一个拟人化的界面中(例如,LLM 聊天机器人)。许多机器学习模型的结果进入我们的生活中而我们没有意识到,例如搜索结果个性化,或者基于对我们需求预测的应用程序提醒,仅举几例。在生成性 AI 的情况下,很多机器学习隐藏在对话型聊天机器人背后,我们自然倾向于像与任何人类对话伙伴一样与其互动。然而,正如我之前提到的文章中的作者所描述的,这是一种错误。在目前,LLM 的最佳结果不是通过“像对人一样”与其对话来实现的。
有些人不会使用他们不理解的东西。
这种现实产生了一些我们需要注意的条件。首先,许多人不会接受机器学习完全有益且简单的说法。许多人对新一代生成性 AI 感到惊恐而非兴奋。对于许多人来说,这是一种合理的反应。一方面,我们有很多文化参考和曝光教会我们,“过于聪明”的计算机是危险的,我们应该对此保持警惕。
人们对个人电脑也有这种感觉。一些人担心它们可能具有的能力和力量,或对自己理解和使用它们的实际能力感到紧张。社区学院的计算机课程让犹豫不决的人对计算机的概念有了舒适的接受。不幸的是,我没有看到数据科学领域对公众的不确定成员采取同样的关怀。
采用新技术总是充满挑战的,这不是因为人们不聪明或不好奇,而是出于对潜在风险的真实担忧。承认这些担忧并展示防止负面结果的承诺可以提高公众对机器学习的信任度。
其他人会误用和滥用他们不理解的东西。
另一方面,很多人已经全身心投入与机器学习,特别是 LLMs 的互动中。人们在各种行业和娱乐中使用它。炒作和媒体报道提高了对 LLM 技术及其潜力的认识,几乎每个有电脑的公司都在尝试将 AI 纳入他们的业务战略中。
然而,这种兴奋也有负面的一面。当人们开始使用机器学习,如 LLMs 时,他们开始注意到问题以及技术未能达到过高期望的方式。也许聊天机器人没有理解你的问题,或模型的预测并不总是准确,但最终用户期待机器不会犯错。他们为什么会有这种期望?因为他们对机器学习的了解来自流行文化和炒作。我们数据科学家没有花时间解释哪些期望是合理的,哪些仍然是科幻材料。
在误用他们不了解的工具之后,人们将害怕将来使用新的工具。
那么,当我们在机器学习解决方案中对普通用户过度承诺而未能兑现时,会发生什么呢?在很多情况下,我们将会失望和幻灭的用户,他们本可能成为新技术的伟大倡导者。他们会更不愿意尝试下一个版本,或将来使用机器学习,因为他们已经尝试过并受到了伤害。
想想这个例子:使用 ChatGPT 获取简报引文的律师。 当这个故事出来时,数据科学界对这位律师进行了抨击。“谁会这么做?难道他们不知道不能依赖 ChatGPT 的准确性吗?”
我实际上对这位律师感到相当遗憾,即使这些后果是由于相当大的马虎造成的。ChatGPT 的承诺对很多公众而言似乎几乎是魔法般的,媒体对其近乎奇迹般能力的描述进一步助长了这种观念。很多人首次了解到 ChatGPT 会“撒谎”是通过阅读这个案例。
这些误解源于对大型语言模型(LLMs)的拟人化,假设它们具有类似人类的推理和真伪判断能力。实际上,ChatGPT 是一个非常复杂的模型,它根据你给出的提示将单词排列在一起。它经过训练,能够生成非常易于理解的语言。但 ChatGPT 没有“真相”或“谎言”的概念。它没有内部嵌入来表示某事是否准确。因此,当新闻谈论 ChatGPT 撒谎或“产生幻觉”时,这有些误导。
然而,重要的是,我们现在有一群人看到了这个消息,更不用说涉及的律师,他们对从 ChatGPT 中获得的任何信息是否可靠感到焦虑。这个情境并没有帮助他们理解 LLM 的概念,也确实没有帮助实现将机器学习应用于有益的更广泛目标。有人因为缺乏对模型工作原理的了解而受到了伤害,其他人对此嗤之以鼻,而现在我们制造了更多的怀疑者,他们将来可能会避免使用至少一些形式的机器学习。
所有这些都指向相同的问题——当技术缺乏适当的公众教育时,我们就把公众教育的任务留给了不可靠和有偏见的来源,这些来源的优先级与公众利益不一致。只需问问任何公共卫生专业人员,看看他们如何努力提高疫苗接种率。机器学习如果我们不能在公众教育方面走在前面,可能会沿着相同的不幸道路发展。
我们可以做些什么来解决这个问题?
作为数据科学的从业者,我们如何弥合技术专长与公众意识之间的差距?作为一名前教育工作者,我对此非常关注。公众是否真正理解机器学习能为我们做些什么是很重要的,因为我们有机会用它做很多有益的事情。
我认为我们可以做的一件事是将更多的时间和精力投入到公众教育中。现在,我并不是说街上的每个人都需要学习反向传播或编码器架构的教程。(这就像说人们需要研究微芯片才能成为有效的计算机用户一样。)但我确实认为,人们需要了解一些机器学习的基本要素,以便成为信息技术的知情用户,包括目前技术的伦理、风险和局限性。作为一个领域,数据科学需要了解一个人需要掌握哪些信息才能成为成功且有效的机器学习用户,并且我们如何能够分享这些信息。
如果我们没有看到如此戏剧性的转变,LLM(大型语言模型)正快速普及到公众手中,我们或许可以对此稍作等待。基本的预测模型结果通常由数据科学专业人员进行中介,即模型的输入经过精心设计,结果也以深思熟虑的方式呈现。然而,对于 LLM 聊天机器人来说,这种情况并不成立。人们可以输入任何他们想要的内容,没有人控制返回的结果。用户需要更多的知识来负责任地生成和消费这些信息。
其次,我认为数据科学作为一个领域,需要对机器学习的实际能力以及它能够做什么进行更多的发声和坚持反对过度炒作和夸大其词。我发现这种情况大多数存在于吸引眼球的媒体中,甚至一些理论上更可信的新闻报道中。不要误解我,机器学习确实令人惊叹,并且它可以做出令人难以置信的事情!然而,它并不完美,我们不应该让任何人假装它是完美的,而不进行反对。
忽视这个问题,我们可能会阻碍机器学习的进步——不仅仅是技术上的进步(尽管国会未能理解机器学习可能会产生这样的效果),还包括其在实际生活中的应用进步。我不希望看到这项技术的巨大潜力因为我们没有帮助公众做好准备而被边缘化或缩小。
查看更多我的作品请访问 www.stephaniekirmer.com。
魔法:聚会竞技场:用概率获胜
原文:
towardsdatascience.com/magic-the-gathering-arena-winning-with-probability-b71f363e0ce2
如何利用概率和 Excel 赢得锦标赛
·发表在Towards Data Science ·7 分钟阅读·2023 年 5 月 9 日
–
作者: Edward Krueger 数据科学家、讲师及 Erin Oefelein 数据科学家,Taxwell 创始人。
作为数据科学家,我们被这个问题吸引,因为我们发现这是一个迷人的例子,展示了看似简单的规则如何导致相当复杂的情况,且需要仔细分析。
虽然在数据科学中已经有大量关于常见分布(例如正态分布)的研究,但现实生活中的问题通常需要不那么常见的分布,有时甚至是没有名称的分布:经验法则和天真的事件概率计算,而没有深入了解分布。在本文中,我们将探讨一个需要使用负二项分布的问题,但实际上会做一些调整以适应我们问题的特殊性。
许多游戏和锦标赛有复杂的规则。为什么?它们利用我们的心理学使游戏更有趣、上瘾,并且通过让我们赢的机会看起来比实际情况高,从而使组织者获得更多收益。当粉丝、玩家或赌徒相信他们能赢时,这是最吸引人的。如果你认为自己的机会比实际情况更好,这种效果最为显著。
在本文中,我们展示了一个来自 MTG Arena 游戏的锦标赛并计算获胜的几率。当讨论这个锦标赛时,通常认为在对战平衡的情况下,玩家平均会赢得 3 到 4 场比赛,而粗略的计算会严重高估获胜的几率。我们将进行数学计算,并展示如何使用 Excel 计算几率——将结果适配到其他统计软件应该是直接的。
摄影作品来自 Ryan Quintal 在 Unsplash
《魔法风暴竞技场》(MTGA) 十项全能由十个不同的赛事组成,持续一个月。每个赛事的入场费为 2,000 金币或 400 宝石。赛事可以是单局对决(Best-Of-One,单场比赛)或三局两胜(Best-Of-Three,三场比赛)。在本文中,我们探讨与单局对决(BO1)MTGA 赛事相关的预期结果。为了获得代币,BO1 游戏要求玩家在遭遇 3 次失败之前赢得 7 场 BO1 比赛。根据这些参数:
-
参加赛事时获得代币的概率是多少?
-
玩家需要参加多少场赛事才能赢得代币? 换句话说,平均而言,玩家需要参加多少场赛事才能赢得 7 次比赛,在遭遇 3 次失败之前,这样才能获得代币?
MTG 是一个运气和技能并存的游戏。尽管运气会引入变化,高技能的玩家通常会赢得更多的比赛。在数学领域,运气通过概率概念来量化。
概率描述了随机过程中的不确定性,其范围从 0 到 1。值为 0 表示事件 不会发生,而值为 1 表示事件 会发生。我们使用随机变量的概念来描述重复随机过程,随机变量表示在指定范围内的重复随机过程的输出。随机变量的概率分布是一个统计函数,描述了这些输出在随机变量上的分布。
摄影作品来自 Giorgio Trovato 在 Unsplash
概率分布将离散或连续随机变量从函数输入映射到实数输出。根据我们 MTG 问题的参数,我们知道负二项分布建模了我们 MTG 问题中固有的随机过程。负二项分布建模了具有以下属性的重复随机过程:
-
该过程包括重复的试验,每次试验都是独立的,即每次(x)试验的结果不影响其他试验的结果。
-
实验将持续进行,直到观察到某个预定事件(r)。这个预定事件通常被称为“成功”,然而,值得注意的是,它不一定是积极的结果!
-
每次试验只有两种可能的结果,成功(r)或失败(f),其中成功的概率(p)在每次试验中相同。
负二项分布描述了一个离散随机变量,因此由称为概率质量函数或 PMF 的概率分布类型建模,PMF 专门用于建模离散概率分布。负二项分布的 PMF,其中随机变量 X 表示第 r 次成功发生的试验(r-1),定义为:
由作者给出的方程
每个变量定义如下:
-
x:在负二项实验中产生 r 次成功的试验次数
-
r:负二项实验中的“成功”次数
-
p:任何给定个体试验中的成功概率
-
q:任何给定个体试验中的失败概率(等于 1-p)
或者,负二项分布可以用随机变量 Y 来定义,Y 代表在第 r 次成功之前发生的失败次数(y)。注意,这种替代形式在统计上是显著的,因为 Y = X - r。转换得 Y + r = X。
由作者给出的方程
那么 PMF 为什么重要?它重要的原因在于,它输出了离散随机变量在某个特定值下的概率。为了理解离散随机变量在某个特定值或更小值下的概率,我们使用累积分布函数或 CDF,这就是随机变量 X 小于或等于 x 的概率。
负二项分布的 PMF 相关变量所取的值决定了负二项分布的确切形状。这个形状由两个(2)参数特征,即停机参数 r和成功概率 p。因此,我们说负二项分布具有 (r, p) 分布。
记住,我们的目标是建模一个问题,其中玩家必须赢得 7 场 BO1 比赛,才能承受 3 次失败。实际上,玩家不能赢得超过 7 次,但为了用负二项分布来建模,我们将允许 8、9、10 次胜利。这不会影响我们的结果,因为我们将计算在事件中有 7 次胜利的概率,作为在模型中有超过 6 次胜利的概率。
重要的是玩家失败的次数。这是一个重要的区分,因为这决定了我们的停止参数 r。 当玩家遭遇 3 次失败时,尝试结束。换句话说,我们要计算的是玩家在遭遇 3 次失败之前赢得至少 7 次的概率。因为任何超过 7 次的胜利都是可以接受的,只要失败次数少于 3 次,我们将使用累计分布函数来建模这个问题。
幸运的是,像这样的建模问题使用计算机软件更为简便。Excel 提供了 NEGBINOM.DIST 函数,它需要以下输入:
-
Number_f: “失败”的次数
-
Number_s: “成功”的次数 -> 停止参数
-
Probability_s: 成功的概率
-
Cumulative: 取值为 TRUE,表示 CDF 问题,或 FALSE,表示 PMF 问题
这些参数按以下顺序设置:
- NEGBINOM.DIST(Number_f, Number_s, Probability_s, Cumulative)
我们可以定义获得代币的概率以及在不同游戏胜率水平下获得代币的预期尝试次数(在我们的负二项方程中称为 p):
作者绘图
要获得代币,玩家必须在输掉 3 场比赛之前至少赢得 7 场比赛。因此,每个事件包含的游戏次数可多可少,直到输掉 3 场比赛或赢得 7 场比赛。
那么我们是如何计算的呢?我们通过将以下内容插入 Excel 中的 NEGBINOM.DIST 方程来计算获得代币的概率以及预期事件次数:
1 — NEGBINOM.DIST(Number_f=6, Number_s=3, Probability_s=1-game win rate, Cumulative=TRUE)
-
Number_f: 请记住,CDF 表示随机变量 Y 小于或等于指定值 y 的概率,数学上表示为 P(Y <= y)。要找到赢得 7 场比赛的概率,我们可以先找到其补集的概率:未 赢得 7 场比赛的概率。数学上,这就是 P(Y < 7) = P(Y <= 6),这是在 6 处计算的 CDF。然后,我们可以将赢得 7 场比赛的概率计算为 P(Y=7) = 1 — P(Y<7) = 1 — P(Y<=6)。
Number_s: 停止参数, 等于 3 次失败
我们将“成功”定义为失败。因此,我们将定义**“成功次数或停止参数”**的第二个参数设为 3。
- Probability_s: 1 — 游戏胜率
因为我们定义了“成功”为玩家失败的概率,我们将使用游戏胜率的逆作为成功的概率的参数,等于 1 — 游戏胜率。
- Cumulative: 设为 TRUE,因为这个问题被定义为 CDF
因此,要在 50% 的尝试中获得代币,玩家必须拥有至少 71.36% 的游戏胜率。
结论
对于任何涉及随机性的游戏,扎实的概率知识都会派上用场。在这里,我们展示了如何应用概率概念来正确计算在不同条件下获胜的几率。了解所有可能的结果及每个结果发生的概率,有助于做出更明智的决策,并希望能帮助你获得胜利。
来源:
维护你的特征库的质量
图片由作者提供
特征库的基本概念以及如何和为什么你应该监控它们的一些提示
·
关注 发表在 Towards Data Science ·5 分钟阅读·2023 年 3 月 30 日
–
自 2017 年 Uber 首次介绍这一概念以来,特征库作为一种支持数据科学家和机器学习工程师定义、发现和访问高质量数据的工具,已经稳步获得了越来越多的关注。
图表由作者提供
从特征工程到特征库
在机器学习项目中,原始数据被收集、清理、格式化并以数学方式转换为称为“特征”的数据。特征在模型生命周期的许多不同阶段是必需的,包括实验、模型训练和模型服务,以从部署在生产管道中的模型中获取预测。
一旦特征被计算出来,我们可以开始通过尝试不同的建模技术和特征集来开发我们的模型。
当模型被训练时,它们会自动发现特征数据中的模式,将这些模式以数学方式编码,然后使用这些信息做出明智的预测。
当模型最终确定后,它会被部署到生产环境中,消耗特征数据以重新训练和生成预测。模型预测通常是批量生成的,或在某些情况下是实时生成的。
特征存储基础
特征存储可以被认为是一个预计算特征的中央存储。这个数据存储服务于机器学习项目中的每一个步骤。
作者提供的图表
作者提供的图表
组织利用特征存储来简化数据和机器学习生命周期中的一些事情。
集中数据
-
特征存储提供了一个一站式商店,存储了从不同来源收集并存储在中央位置的数据。
-
如果没有特征存储,机器学习项目的原始数据通常需要从公司内多个不同的数据源收集,甚至来自供应商或第三方。这意味着数据科学家必须识别并访问多个数据源。
清理数据
-
在将个人可识别信息(PII)或机器学习工作流中不需要的敏感数据存储到特征存储之前,可以将其移除。
-
如果没有特征存储,数据科学家将不得不在不需要敏感数据的情况下访问敏感数据或创建自己的方法来去除敏感数据。
在模型之间共享特征
-
相同的特征通常可以在不同的用例中的多个模型中使用。特征存储计算这些特征一次,并使其在所有机器学习项目中可用。数据科学家可以随着时间的推移向这个特征库中添加更多特征,以建立一个供其他团队重复使用的特征库。
-
如果没有特征存储,许多相同的特征计算将被重新编写到不同的模型和管道中。这迫使数据科学家执行浪费的重复工作,以重新计算可能已经存在于类似管道中的特征,并且使得维护特征计算的一致性变得困难。
提供统一的特征接口
-
特征存储的一部分是对数据本身的标准化推理和共享的特征编码器,帮助在在线和离线应用中强制执行一致的结果。
-
如果没有特征存储,不同的代码或转换可能导致模型中出现稍微意外或错误的结果。这通常表现为在线和离线特征偏差。
减少特征延迟
-
在线特征存储提供预计算的特征,以支持以低延迟提供实时预测。
-
如果没有特征存储,特征将在推断请求时需要计算,这会导致在请求时需要额外的计算——最终影响应用延迟。
导航特征版本控制
-
特征存储对数据应用版本控制。时间旅行数据快照允许对模型进行时间点分析,或找出数据错误的根本原因。
-
如果没有特征存储,追踪某一时刻特征的确切状态或值可能会很困难。这会使得调试和实验变得具有挑战性,甚至不可能。
特征存储的类型
一般来说,特征存储要么作为独立的第三方工具提供,要么作为更广泛的云服务的一部分提供。大多数使用特征存储的 Arize 客户使用像 Tecton 这样的专用工具,但希望在开源解决方案上构建的团队有几个选项(即 Feast、Feathr)。此外,云服务也可以作为现有堆栈的简便附加功能提供。
第三方工具示例:
-
Feast(开源)
-
Feathr(开源)
-
Tecton
-
Hopsworks
云工具示例
-
Databricks 特征存储
-
SageMaker 特征存储
维护特征存储的质量
特征存储可能会静默失败。当模型崩溃或产生较差结果时,根本原因通常追溯到数据本身。许多常见的机器学习问题可以通过对数据应用正确的监控和质量检查来解决。
如果数据集中在一个特征存储中,维护起来可能更容易。通过对特征存储应用数据质量监控,实践者可以在数据问题影响模型性能之前自动捕捉到这些问题。
有几种常见的数据问题,监控可以带来重大差异(完全披露:我在 Arize 工作,Arize 提供监控工具,但这些最佳实践来源于我的实际经验,同样适用于内部或其他地方构建的监控平台)。
数据质量监控可以捕捉到如缺失值、数据格式变化或意外值(数据基数变化)等问题。ML 可观察性平台可以用来自动检测并警报这些类型的数据质量问题,这些问题在特征数据中很常见。
此示例显示了针对模型特征的%-empty 度量的触发数据质量监控(图像作者提供)
数据漂移监控可以捕捉到由于时间自然变化引起的统计分布偏移。漂移可以通过 PSI、KL 散度等指标来测量。机器学习可观测性平台可以用来自动检测和警报特征数据中常见的统计漂移类型。
此示例展示了生产和训练数据分布之间的预测漂移(图像由作者提供)
此外,通过排查离线和在线特征计算及代码的数据一致性,还可以识别训练-服务偏差。
结论
随着特征存储逐渐进入主流,团队正在制定最佳实践,以增强其在机器学习工作流中的集成。一个关键关注点是管理上游数据质量问题。通过实施数据质量监控和数据漂移检测,团队可以有效地维护其特征存储,同时主动预防模型性能退化。
使用 Seaborn 制作嵌套条形图
原文:
towardsdatascience.com/make-a-nested-bar-chart-with-seaborn-9a9988e30dca
我 快速成功的数据科学
大学足球投票的准确性基准测试
·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 10 月 19 日
–
嵌套条形图示例(作者提供)
嵌套条形图是一种可视化方法,用于比较类别中的多个测量值。其中一个测量值代表次要或背景测量,例如目标或之前的值。主要测量值代表实际或当前值。
次要测量通常以减少的容量呈现,从而为主要测量提供背景。将较宽且较暗的主要条形图放在较窄且较浅的次要条形图上面,能够生成一个美观且紧凑的图表。这也解释了为什么这种图形有时被称为口红条形图。
口红图片由 Onder Ortel 在 Unsplash 上提供
当然,为了使其正常工作,主要的条形图应该永远不要比次要的条形图更长。因此,你将需要使用嵌套条形图来绘制每个类别中递减值的示例,例如房价下降或由于新疫苗导致的疾病率下降。
在这个快速成功的数据科学项目中,我们将查看著名的美联社大学足球前 25 名投票在每个赛季开始时挑选 25 支最佳美国大学足球队的表现。由于赛季前挑选的球队数量不能超过排名中的最终球队数量,这是一种很好的嵌套条形图应用。
AP 大学足球前 25 名投票
AP 每年 8 月或 9 月发布他们的赛季前投票,并在整个赛季中每周更新一次。全国范围内超过 60 位知名体育作家和广播员会为最佳球队投票。
他们首先创建了一个列表,列出了他们认为的 25 支最佳球队(从 133 支球队中选出),并给每支球队分配了投票数,给予最佳球队最多 25 分。然后,AP 将这些投票结合起来,按降序对球队进行排名。在碗赛季和大学橄榄球季后赛结束后,它会发布一份最终排名。
你可以在 AP 网站以及Sports Illustrated、NCAA和Sports Reference等体育网站上找到这些投票结果。为了方便起见,我已经将过去 20 年(2002–2022)的季前赛和最终排名整理成 CSV 文件,并存储在这个Gist中。
代码
以下代码的灵感来自 Oscar Leo 最近关于口红图的文章:
一种数据可视化,当数值越低越好
towardsdatascience.com
在这篇文章中,我们将基于 Oscar 的 Python 代码,设置颜色调色板,一个吸引人的 seaborn 样式,以及一个绘制不同宽度和透明度的水平条形图的函数,这些都是制作嵌套条形图所必需的。我们将调整一些代码,并添加更多代码以加载和准备数据,并进行最终展示。
导入库并设置样式
对于这个项目,我们需要使用 matplotlib 和 seaborn 进行绘图,使用 pandas 进行数据加载和准备。你可以通过搜索*install *找到每个库的当前安装说明。
对于颜色调色板,我选择了 Oscar Leo 文章中推荐的Color Hunt site上的“足球”绿色和棕色。
Seaborn 提供了一个设置运行配置样式参数的方法,这些参数会自动应用于每个图形。如果你希望制作多个具有相同参数的图形,或者想通过将这些细节抽象到另一个单元格或位置来“简化”你的绘图代码,这个功能会很有帮助。显然,如果你使用的是 seaborn 的默认绘图参数,你不需要这些代码。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# Set up a color palette of grass greens and pigskin browns:
BACKGROUND_COLOR = '#B5CB99'
TEXT_COLOR = '#FCE09B'
BAR_COLOR = '#B2533E'
LEGEND_COLOR = '#186F65'
# Create a dictionary of display parameters favorable for nested bars:
sns.set(style='white', rc={
'axes.facecolor': BACKGROUND_COLOR,
'figure.facecolor': BACKGROUND_COLOR,
'text.color': TEXT_COLOR,
'axes.spines.left': False,
'axes.spines.bottom': False,
'axes.spines.right': False,
'axes.spines.top': False
})
加载数据
以下代码使用 pandas 的read_csv()
方法从 gist 中加载 CSV 格式的投票数据,然后显示前三行以进行质量控制。
# Load AP Top 25 College poll data:
df = pd.read_csv('https://bit.ly/45yEPtI')
df.head(3)
注:由于我们将比较球队名称,因此最好检查它们是否在各个排名中一致。在这种情况下,一些排名在球队名称后面附上了球队的战绩。这是一个小问题,我已经清理过了,但如果你想在未来扩展这个项目,你应该注意这一点。
准备绘制前 25 结果的数据
我们将从查看季前排名中进入赛季结束时的最终排名的球队数量开始。为此,我们将依赖 Python 的 set
数据类型。
就像在经典数学中一样,set
只能包含唯一值(无重复),并且你可以使用内置函数找到两个集合的交集。这意味着我们可以提取季前排名和最终排名之间共享的项(球队)。
# Initialize a list to store the intersection results:
top_25 = []
# Get unique years from the DataFrame:
unique_years = df['Year'].unique()
# Loop through each year and find the intersection of Final and Preseason Teams:
for year in unique_years:
year_data = df[df['Year'] == year]
# Make sets of the final and preseason teams:
final_teams = set(year_data[year_data['Poll'] == 'Final']['Team'])
preseason_teams = set(year_data[year_data['Poll'] == 'Preseason']['Team'])
# Find the set intersections for each year and append to the top_25 list:
intersection = final_teams.intersection(preseason_teams)
num_right = len(intersection)
top_25.append({'Year': year, 'Finishers': num_right})
# Create a new DataFrame from the list:
df_25 = pd.DataFrame(top_25)
# Add columns for the number of ranked teams and percent predicted correctly:
df_25['Top 25'] = 25
df_25['Pct Right'] = df_25['Finishers'] / df_25['Top 25']
df_25['Pct Right'] = df_25['Pct Right'].apply(lambda x: f'{x:.0%}')
print(df_25)
定义绘制条形图的函数
以下代码定义了一个函数,该函数调用 seaborn 的 barplot()
方法。其参数让你可以控制生成嵌套条形图时使用的参数。例如,你需要坐标轴对象(ax_obj
)以便在同一图中叠加条形,width
使主条比副条宽,以及 alpha
调整每个条形的透明度,使主条更暗。
def add_bars(ax_obj, x, y, width, alpha, label):
"""Plot a seaborn horizontal bar chart (credit Oscar Leo)."""
sns.barplot(ax=ax_obj, x=x, y=y,
label=label,
width=width,
alpha=alpha,
color=BAR_COLOR,
edgecolor=TEXT_COLOR,
orient="h")
绘制前 25 的嵌套条形图
在接下来的代码中,我们设置了一个图形,然后调用 add_bars()
函数两次,调整参数,来生成主条和副条。label
参数用于图例中。
为了使显示更加信息化,我们将使用 bar_label()
方法添加关于季前预测准确率的文本。我们将填充文本到左侧,以确保文本在视觉上与正确的条形相关联。
# Make the display, calling add_bars() twice to nest the bars:
fig, ax = plt.subplots(figsize=(8, 9))
ax.set_title('Number of Teams Starting AND Finishing in \
AP Top 25 College Football Poll', color='k', fontsize=13, weight='bold')
# Plot bars for total number of teams (secondary measure):
add_bars(ax_obj=ax,
x=df_25['Top 25'],
y=df_25['Year'],
width=0.55,
alpha=0.6,
label='Teams in Preseason Poll')
# Plot bars for teams that started AND finished in the Top 25 (primary measure):
add_bars(ax_obj=ax,
x=df_25['Finishers'],
y=df_25['Year'],
width=0.7,
alpha=1,
label='Teams in Preseason AND Final Polls')
# Add informative text stating percent correct:
ax.bar_label(ax.containers[1],
labels=df_25['Pct Right'] + ' correct',
padding=-70)
# Assign a custom x-axis label and legend:
ax.set_xlabel('Number of Teams')
ax.legend(bbox_to_anchor=(1.0, -0.085), facecolor=LEGEND_COLOR);
显示进入最终排名的季前球队数量的嵌套条形图(作者)
在过去 20 年中排名前 500 的球队中,有 313 支季前被选中的球队进入了最终名单,成功率约为 63%。
这算是一个好结果吗?我不太确定。美国大学橄榄球被多个强大程序主宰,这些程序通常出现在最终排名中,因此挑选这些球队相对容易且可靠。然而,一个有趣的观察是,自 2011 年以来,成功率呈下降趋势。
自 2011 年以来预测结果的一般下降趋势(作者)
这个趋势可能是巧合,也可能是多个因素的结果,包括游戏规则的变化、会议调整、NIL(名称、图像和肖像)支付的引入以及转会门户的开放。
准备绘制前 4 结果的数据
从 2014 年开始,全国大学体育协会(NCAA)采用了四队淘汰赛来决定第一级橄榄球碗分区的国家冠军。让我们重新审视之前的代码,选择前 4 名球队,以查看排名对最终冠军的选择效果如何。这里有个剧透:季前赛排名在过去 20 年中只正确选择了 2 次最终冠军,成功率仅为 10%!
# Filter the original DataFrame to teams ranked 4 or better:
df_4 = df[(df['Rank'] <= 4)].copy()
# Initialize a list to store the intersection results:
top_4 = []
# Loop through each year and find the intersection of Final and Preseason Teams:
for year in unique_years:
year_data = df_4[df_4['Year'] == year]
# Make sets of the final and preseason teams:
final_teams = set(year_data[year_data['Poll'] == 'Final']['Team'])
preseason_teams = set(year_data[year_data['Poll'] == 'Preseason']['Team'])
# Find the set intersections for each year and append to the top_4 list:
intersection = final_teams.intersection(preseason_teams)
num_right = len(intersection)
top_4.append({'Year': year, 'Finishers': num_right})
# Create a new DataFrame from the list:
df_final_4 = pd.DataFrame(top_4)
# Add columns for the number of ranked teams and percent predicted correctly:
df_final_4['Top 4'] = 4
df_final_4['Pct Right'] = (df_final_4['Finishers'] / df_final_4['Top 4'])
df_final_4['Pct Right'] = df_final_4['Pct Right'].apply('{:.0%}'.format)
print(df_final_4)
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 10))
ax.set_title('Number of Teams Starting AND Finishing in \
Top 4 of AP College Football Poll', color='k', fontsize=14, weight='bold')
add_bars(ax_obj=ax,
x=df_final_4['Top 4'],
y=df_final_4['Year'],
width=0.55,
alpha=0.6,
label='Top 4')
add_bars(ax_obj=ax,
x=df_final_4['Finishers'],
y=df_final_4['Year'],
width=0.7,
alpha=1,
label='Finishers')
ax.bar_label(ax.containers[1],
labels=df_final_4['Pct Right'] + ' correct',
padding=3)
ax.set_xticks(range(5))
ax.set_xlabel('Number of Correct Final Four Predictions',
fontdict={'size': 16});
这里需要注意的一点是,这次我们必须将条形标签填充到右侧。问题在于 2010 年和 2013 年没有任何季前赛球队进入最终排名。如果我们像之前的显示那样将标签填充到左侧,注释将“掉出边缘”,并覆盖 y 轴值。正如你可以想象的那样,短条和长条的组合不适合注释嵌套条形图。
团队在 AP 大学橄榄球排名中开始和结束于前 4 名的嵌套条形图(作者提供)
在过去 20 年中,80 支进入前 4 名的球队中,季前赛排名大约识别了 42%。在 2011 年和 2020 年中,它准确地预测了 4 中的 3 个。在 2010 年和 2013 年中,它的预测全都错误。
总结
嵌套条形图是一种干净且紧凑的方式,用于比较一个测量值始终低于另一个测量值的分类数据。通过包含条形标签来提供额外信息,你可以轻松将这些图表转化为有吸引力的信息图,传达意义和信息。
谢谢!
感谢阅读,未来请关注我更多的快速成功数据科学项目。
使用 Seaborn 制作打卡图
原文:
towardsdatascience.com/make-a-punchcard-plot-with-seaborn-ee8097bee4e1
快速识别周期性趋势
·发布在 Towards Data Science ·阅读时间 6 分钟·2023 年 9 月 17 日
–
带有时间卡的打卡钟(图像由 Hennie Stander 提供,来源于 UnSplash)
打卡图,也称为表格气泡图,是一种用于突出数据中周期性趋势的可视化类型。它以一个固定的矩阵或网格格式显示数据,通常由一周的天数与一天的小时构成。圆圈代表行和列交点的数据点,其大小传达数据值。颜色可以用来包含额外的信息。
表格气泡图(图像由作者提供)
“打卡”这个名字暗指过去工人用来记录上下班时间的“时间卡”。
要构建打卡图,你需要时间戳数据。在这个快速成功数据科学项目中,我们将使用 Kaggle 数据集来跟踪在华盛顿特区租借自行车的时间。
数据集
Kaggle 上的华盛顿特区自行车共享数据集包含了 2011 年和 2012 年在华盛顿特区Capital bikeshare system租借自行车的每小时和每日数据[1]。这些数据在 CC0 1.0 许可证下发布。有关数据集内容的详细信息,请访问readme 文件。
为了方便,我已经将这些数据下载到一个公共的 Gist。
安装库
除了 Python,你还需要 pandas 数据分析库和 seaborn 绘图库。你可以通过以下命令安装它们:
conda install pandas seaborn
或
pip install pandas seaborn
代码
以下注释代码是在 JupyterLab 中编写的,并由单元描述。
导入库和加载数据
在导入 matplotlib 和 seaborn 以进行绘图以及 pandas 以进行数据分析后,我们将把租赁数据的 CSV 文件读入 pandas DataFrame,只保留季节、工作日、小时和数量(租赁次数)这几列。
工作日以数字形式存储(以 0 代表星期日)。为了便于阅读,我们将这些数字映射到星期的名称,并创建一个新的列,称为“Day”来保存这些名称。此外,为了提高可读性,我们将“hrs”和“cnt”列重命名,将“Hours”大写,以便用于图例标签。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
# Load the data:
df = pd.read_csv('https://bit.ly/3raML6h',
usecols=['season', 'weekday', 'hr', 'cnt'])
# Define a dictionary to map numerical values to day names
day_mapping = {0: 'Sunday', 1: 'Monday',
2: 'Tuesday', 3: 'Wednesday',
4: 'Thursday', 5: 'Friday',
6: 'Saturday'}
# Map weekday numbers to names and create a new column:
df['Day'] = df['weekday'].map(day_mapping)
df = df.rename(columns={'hr': 'Hour', 'cnt': 'count'})
df.head(3)
创建夏季月份的数据框
对于这个分析,我们将重点关注夏季,这将提供关于自行车娱乐和商务使用的良好示例。数据集中季节用数字标记,夏季标记为 2。
首先,我们将创建一个仅包含夏季数据的新 DataFrame,然后使用 pandas 的 groupby()
和 sum()
方法按天和小时汇总租赁数据。由于一天有 7 天,每天有 24 小时,因此这个新 DataFrame 将包含 168 行。
# Create a new DataFrame for the summer season:
df_summer = (df[(df['season'] == 2)].copy()
.groupby(['Day', 'Hour'])['count']
.sum().reset_index())
制作打卡图
为了制作打卡图,我们将使用 seaborn 的 scatterplot()
方法。圆形标记的大小由“count”列控制。你可以调整 sizes
和 figsize
参数,以找到视觉上令人满意的组合。
虽然我们可以将小时转换为 datetime,以便“10”变为“10:00”,但我觉得这样会使 x 轴显得拥挤,而没有太大价值。
此外,星期几是按字母顺序绘制的。我更喜欢这样,因为它将周末的天数分组在一起,而不是在图的顶部和底部分开显示。它还将星期五和星期一相邻绘制,这有助于轻松比较工作周开始和结束时的行为。
fig, ax = plt.subplots(figsize=(8, 5))
ax = sns.scatterplot(data=df_summer,
x='Hour',
y='Day',
size='count',
color='k',
alpha=0.7,
sizes=(1, 300))
ax.legend(loc='right',
shadow=True,
bbox_to_anchor=(1.2, 0.8),
ncol=1)
ax.set_xticks(range(24))
ax.set_xticklabels(list(range(24)))
ax.set_title('Washington D.C. Summer Bike Share Rentals (2011-12)');
# Optional code to add a grid:
# sns.set_style('whitegrid')
# ax.grid(True)
# Optional code to save figure as an image:
# plt.savefig('file_name.png', bbox_inches='tight', dpi=600)
初始打卡图(作者)
这是一个看起来很酷的图,有几个容易区分的模式。首先,周末的租赁行为与工作周明显不同。其次,工作日的变化很小。星期五和星期一,这两个相邻的日子,显示出非常相似的趋势。第三,工作周期间的早晚高峰时段非常明显。
我们可以通过突出显示如高峰时段和周末等事件,使这个图更容易阅读。
突出显示高峰时段
根据互联网的说法,华盛顿特区的高峰时段是早上 6:00 到 9:00 和晚上 4:00 到 7:00。为了突出这些时段,在之前的代码中,将 scatterplot()
方法的 alpha
参数提高到 1
,然后添加以下代码到底部并重新运行。
# Add shading for rush hour:
ax.text(x=6, y=0.6, s='Rush Hour', c='firebrick')
ax.axvspan(xmin=6, xmax=9, facecolor='red', alpha=0.3)
ax.text(x=16, y=0.6, s='Rush Hour', c='firebrick')
ax.axvspan(xmin=16, xmax=19, facecolor='red', alpha=0.3);
突出显示高峰时段的打卡图(作者)
突出显示周末
为了突出显示周末的天数,添加下面的代码并重新绘制图形。
# Add shading for weekend:
ax.axhspan(ymin='Sunday', ymax='Saturday', fc='grey', alpha=0.3)
ax.text(x=1, y=2.6, s='Weekend', c='k');
高亮显示高峰时段和周末的打卡图(作者)
尽管这个图表很有用,但很难判断哪些天的租赁率最高和最低。为了检查这一点,我们可以为夏季制作一个新的数据框,只聚合日期。
# Create a new dataframe for summer season:
df_summer_days = (df[(df['season'] == 2)].copy()
.groupby(['Day'])['count'].sum().reset_index())
df_summer_days = df_summer_days.sort_values('count')
print(df_summer_days)
现在我们可以定量判断不同日期之间的差异。
sns.barplot(data=df_summer_days, x='Day', y='count', color='grey');
夏季自行车租赁总数与星期几(作者)
解释和使用数据
在打卡图中一个有趣的观察是,下午高峰时段的自行车租赁量多于早晨高峰时段。这些额外的骑行者可能代表了外出办事或休闲骑行的人群。
在工作周内,进行自行车维护的最佳时间是上午 9:00 到下午 4:00,这时通勤者都在工作。为了增加收入,你需要分析在非高峰时段降低租金,以激励自行车使用。
从“夏季日”数据框中,我们可以看到自行车在星期六的租赁量最多,而星期天则有所下降。这提供了一个机会,通过促销或降价来增加星期天的自行车使用量。同样,工作周内的自行车租赁量稳步上升,再次提示我们需要在周初激励租赁。
总结
打卡图是一种有趣的数据可视化方式。就像传统的时间卡可以让你监控员工的工作习惯一样,打卡图帮助你一眼识别周期性趋势。
在这个项目中,我们使用了 seaborn 的scatterplot()
方法来制作打卡图。seaborn 的一个优点是它建立在 matplotlib 之上,可以利用 matplotlib 的高级自定义选项。在这种情况下,我们通过使用阴影和文本注释来强调重要的时间段,如周末和高峰时段,从而协助数据分析过程。
引用
- Fanaee-T, Hadi, 和 Gama, Joao, “事件标记结合集成检测器和背景知识”,《人工智能进展》(2013): 页码 1–15,Springer Berlin Heidelberg,doi:10.1007/s13748–013–0040–3。
谢谢!
感谢阅读,请关注我,未来将有更多快速成功数据科学项目发布。