Python 流式数据的机器学习(三)

部署运行你感兴趣的模型镜像

原文:annas-archive.org/md5/8b1f81528aade41a4df56df5f294e177

译者:飞龙

协议:CC BY-NC-SA 4.0

第十一章:第十一章:灾难性遗忘

在前两章中,我们开始探讨在线机器学习和处理流数据的许多辅助任务。第九章 讨论了漂移检测和解决方案,第十章 讨论了在流环境中的特征转换和缩放。当前章节介绍了辅助任务列表中的第三个也是最后一个主题,即灾难性遗忘。

灾难性遗忘,也称为灾难性干扰,是机器学习模型在更新后忘记他们所学内容的一种趋势,错误地重新学习正确学习的老旧倾向,因为新数据中学习了新的倾向。

由于在这本书中你已经看到了许多在线模型的例子,你会明白模型的持续更新会带来学习出错的大风险。在关于漂移和漂移检测的章节中已经简要提到,模型学习出错也可以被视为性能退化的真实风险。

然而,漂移通常用于指出独立变量(数据漂移)或独立变量与依赖变量之间的关系(概念漂移)中的漂移。由于灾难性遗忘实际上是模型系数内部的问题,我们实际上不能将灾难性遗忘视为漂移的一部分。

机器学习模型,尤其是在线机器学习模型,通常以相对黑盒的方式使用,这意味着我们关注它们的输出,但并不一定花很多时间查看内部机制。当检测到错误学习到的模式时,这就会成为一个问题。因此,机器学习可解释性也与灾难性遗忘的主题相关,并将被涵盖。

本章将介绍机器学习模型错误更新的问题,我们称之为灾难性遗忘或灾难性推理,以下章节将涵盖:

  • 定义灾难性遗忘

  • 灾难性遗忘的检测

  • 模型可解释性 versus 灾难性遗忘

技术要求

你可以在以下链接的 GitHub 上找到这本书的所有代码:github.com/PacktPublishing/Machine-Learning-for-Streaming-Data-with-Python。如果你还不熟悉 Git 和 GitHub,下载笔记本和代码示例的最简单方法是以下步骤:

  1. 前往存储库的链接。

  2. 点击绿色 代码 按钮。

  3. 选择 下载 ZIP

当你下载 ZIP 文件后,你可以在本地环境中解压它,然后你可以通过你偏好的 Python 编辑器访问代码。

Python 环境

要跟随这本书的内容,你可以下载仓库中的代码,并使用你喜欢的 Python 编辑器执行它。

如果你还不熟悉 Python 环境,我建议你查看 Anaconda(www.anaconda.com/products/individual),它包含了 Jupyter Notebook 和 JupyterLab,这两个都是执行笔记本的绝佳选择。它还包含了 Spyder 和 VS Code,用于编辑脚本和程序。

如果你安装 Python 或相关程序有困难,你可以查看 Google Colab(colab.research.google.com/)或 Kaggle Notebooks(www.kaggle.com/code),这两个都允许你免费在线笔记本中运行 Python 代码,无需任何设置。

注意

书中的代码通常使用 Colab 和 Kaggle Notebooks,Python 版本为 3.7.13,你可以设置自己的环境来模拟这种情况。

引入灾难性遗忘

灾难性遗忘最初被定义为在(深度)神经网络上发生的问题。深度神经网络是一组非常复杂的机器学习模型,由于它们的极端复杂性,能够学习非常复杂的模式。当然,只有在有足够数据的情况下才会是这样。

神经网络已经被研究了几十年。它们过去在数学上很有趣,但由于计算能力的缺乏,实际上无法执行。当前计算能力的进步使得神经网络能够获得它们目前所观察到的普及度。

神经网络的复杂性也使得它们对灾难性遗忘问题很敏感。从高角度来看,神经网络的学习方式是通过多次更新系数,并且在每次更新时,模型应该更好地拟合数据。一个神经网络参数的示意图概述如下:

![图 11.1 – 神经网络中系数数量的示意图

![img/B18335_11_1.jpg]

图 11.1 – 神经网络中系数数量的示意图

在这个示意图中,你可以看到即使是对于一个非常小的神经网络,也有许多系数。节点数量越多,需要估计的参数数量就越大。当与传统统计方法进行比较时,你可以看到进行如此多次遍历的想法相对不同,并且与传统统计学中常见的那些问题不同。

灾难性遗忘就是这样一个问题。它在 1989 年的一项研究中首次被观察到,其中进行了一个实验。这个实验训练神经网络进行加法任务(从 1 + 1 = 2 到 1 + 9 = 10)。测试了一种顺序方法,其中模型首先学习第一个任务,然后在第一个任务掌握后添加一个新任务。

这个实验以及其他实验的结论是,在第一个任务学习之后添加新任务将干扰原始学习模型。他们观察到,新信息需要学习,这种干扰就会越大。最后,他们发现这个问题只发生在顺序学习中。如果你同时学习所有任务,实际上并没有发生再学习,所以遗忘实际上是不会发生的。

对于关于在线学习神经网络中灾难性遗忘的更详细、更科学的资源,我建议查看这里提供的两个链接:

现在我们来看看灾难性遗忘是如何影响在线模型的。

在线模型中的灾难性遗忘

尽管灾难性遗忘最初被识别为神经网络的问题,你可以想象在线机器学习也有持续再学习的相同问题。因此,灾难性遗忘的问题,或者说灾难性推理的问题,也是存在的,并且需要被掌握。

如果模型在每一个新的数据点上更新,预计系数会随时间变化。然而,由于现代机器学习算法非常复杂,具有大量的系数或树,密切关注它们是一项相当困难的任务。

在一个理想的世界里,最有益的目标可能是尽量避免在机器学习中出现任何错误的学习。做到这一点的一种方法是通过密切关注模型性能并实施严格的版本控制系统,以确保即使模型错误地学习任何内容,也不会在生产系统中部署。我们将很快讨论这个话题。

另一种可能的解决方案是与漂移检测方法一起工作,正如你在第九章中看到的。当你密切关注你的模型性能、数据分布以及其他 KPI 和描述性统计时,你应该能够很快地发现问题,这将允许你迅速干预。

作为管理灾难性遗忘的第三个工具,你将在本章中看到更多关于模型可解释性的工具。灾难性遗忘的一个问题是模型过于像一个黑盒。使用模型可解释性领域的工具将帮助你窥视那些黑盒模型。这将允许你基于业务逻辑而不是技术逻辑来检测灾难性遗忘和灾难性推理。将业务逻辑和技术逻辑结合起来,将是一个强大的组合,以预防灾难性遗忘。

检测灾难性遗忘

在本章中,我们将探讨两种不同的方法,您可以使用这些方法来检测灾难性遗忘。第一种方法是实现一个系统,可以在模型学习到新内容后立即检测到问题。为此,我们将分多个步骤实现一个 Python 示例:

  1. 开发一个带有在线学习的模型训练循环。

  2. 向此模型添加直接评估。

  3. 向此模型添加长期评估。

  4. 添加一个系统以避免错误学习时的模型更新。

使用 Python 检测灾难性遗忘

为了处理这个例子,让我们首先实现一个在线回归模型,就像你在本书前面已经看到的那样:

  1. 要做到这一点,我们首先需要生成一些数据。本例中生成数据的代码如下所示:

代码块 11-1

import random
X = [
     1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 
     6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10
]
y = [
     x + random.random() for x in X[:15]] + 
    [x * 2 + random.random() for x in X[15:]
]

如果你看这个代码,你可以看到模式中发生了一个变化。在前 15 个观测值中,y 被定义为 x + random.randint(),这意味着与 x 相同的值,但有一些随机变化。在第 15 个观测值之后,这种变化改变并变为 x * 2 + random.randint,这意味着 x 的两倍加上一些额外的随机变化。这个例子将完美地展示模型如何随着时间更新。

  1. 现在让我们快速绘制这些数据,以便更好地了解这种变化实际上看起来是什么样子。这可以通过以下代码实现:

代码块 11-2

import matplotlib.pyplot as plt
plt.scatter(X, y)

生成的图表如下所示:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_2.jpg

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_2.jpg

图 11.2 – 前一个代码块生成的散点图

第一条线性趋势在 x = 1 到 x = 5 之间明显成立,但从 x = 6 开始,有一个不同且更陡峭的函数继续到 x = 10。

  1. 在本例中,我们将使用 River,因此需要将数据格式化为正确格式。到现在为止,你应该已经掌握了 River 库的数据格式,但如果需要,可以参考以下代码:

代码块 11-3

X_dict = [{'X': x} for x in X]
for X_i, y_i in zip(X_dict, y):
  print(X_i, y_i)

此代码块的结果应该类似于以下内容:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_3.jpg

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_3.jpg

图 11.3 – 前一个代码块生成的输出

  1. 现在,让我们将 River 库中的 KNNRegressor 函数添加到这个循环中,并在每个新的数据点处使用 learn_one 方法更新模型。这是通过以下代码完成的:

代码块 11-4

!pip install river
from river.neighbors import KNNRegressor
my_knn = KNNRegressor(window_size=3)
X_dict = [{'X': x} for x in X]
for X_i, y_i in zip(X_dict, y):
  my_knn.learn_one(X_i, y_i)
  1. 我们可以计算这个模型的最终训练误差,以大致了解我们应该期望多少误差。以下代码正是这样做的:

代码块 11-4

preds = []
for X_i in X_dict:
  preds.append(my_knn.predict_one(X_i))
sum_absolute_error = 0
for pred, real in zip(preds, y):
  sum_absolute_error += abs(pred - real)
mean_absolute_error = sum_absolute_error / len(preds)
print(mean_absolute_error)

在当前示例中,这计算出一个平均绝对误差为 10。

  1. 现在,让我们更详细地看看模型的逐步学习质量。我们可以通过使用持续评估来实现这一点。这意味着每次我们学习时,我们都会评估模型:

代码块 11-5

my_knn = KNNRegressor(window_size=3)
X_dict = [{'X': x} for x in X]
step_by_step_error = []
for i in range(len(X_dict)):
  my_knn.learn_one(X_dict[i], y[i])
  abs_error = abs(my_knn.predict_one(X_dict[i]) - y[i])
  step_by_step_error.append(abs_error)
  1. 以下代码将绘制这些误差随时间的变化,以查看模型是如何学习的:

代码块 11-6

plt.plot(step_by_step_error)

以下图是此代码的结果:

![Figure 11.4 – 上述代码块产生的图

![img/B18335_11_4.jpg]

图 11.4 – 上述代码块产生的图

有趣的是,模型似乎每次我们看到 x 的新值时都会获得满分,然后当相同的 x 值再次出现时,我们再次获得满分,但第三次,我们有一个更大的误差!

  1. 与最终误差进行比较将非常棒,这个最终误差不是逐步计算的,而是通过以下代码一次性计算的:

代码块 11-7

preds = []
for X_i in X_dict:
  preds.append(my_knn.predict_one(X_i))
all_errors = []
for pred, real in zip(preds, y):
  all_errors.append(abs(pred - real))
plt.plot(step_by_step_error)
plt.plot(all_errors)
plt.show()

以下代码块的结果如下所示:

![Figure 11.5 – 上述代码块产生的图

![img/B18335_11_5.jpg]

图 11.5 – 上述代码块产生的图

你可以清楚地观察到,当逐步评估模型时,每个数据点的误差似乎并不太大。然而,当最终评估时,你会发现模型实际上已经忘记了最初的数据点!这是一个很好的例子,说明了灾难性遗忘如何在实践中被观察到。

  1. 作为最后一步,让我们在模型循环中添加一个小型评估,帮助你意识到模型已经忘记了你的第一个分数:

代码块 11-8

my_knn = KNNRegressor(window_size=3)
X_dict = [{'X': x} for x in X]
step_by_step_error = []
for i in range(len(X_dict)):
  my_knn.learn_one(X_dict[i], y[i])
  abs_error = abs(my_knn.predict_one(X_dict[i]) - y[i])
  step_by_step_error.append(abs_error)
  all_errors_recomputed = []
  for j in range(i):
    orig_error = step_by_step_error[j]
    after_error = abs(my_knn.predict_one(X_dict[j]) - y[j])
    if after_error > orig_error:
      print(f'At learning step {i}, data point {j} was partly forgotten')

在这个代码块中,制定了一条规则,当误差大于原始误差时立即检测到遗忘。当然,这是一个非常严重的检测机制,你可以想象用其他方法来替代这个方法。例如,这可以是一个百分比变化或一个绝对数值,不能超过。这完全取决于你的业务案例。

既然你已经看到了使用基于模型性能的警报机制来检测灾难性遗忘的方法,那么让我们继续本章的下一部分,你将看到如何使用模型可解释性来检测灾难性遗忘。

模型可解释性与灾难性遗忘

查看模型性能通常是一个跟踪模型的好方法,它肯定会帮助你检测到模型中某个地方出现了错误。通常,这将足够作为一个警报机制,并帮助你管理生产中的模型。

然而,如果你想确切地了解出了什么问题,你需要更深入地挖掘你的模型。仅仅查看性能更像是一种黑盒方法,而我们可以提取诸如树、系数、变量重要性等东西,以了解模型内部实际发生了什么变化。

没有一种适合所有情况的深入模型研究方法。所有模型类别都有自己特定的方法来拟合数据,因此对它们的拟合检查将强烈依赖于模型本身。然而,在本节的剩余部分,我们将探讨机器学习中的两种非常常见的结构:具有系数的线性模型和树。

使用线性系数解释模型

在这个第一个例子中,我们将对一些样本数据建立线性回归,并提取模型的系数来解释它们:

  1. 你可以使用以下代码创建此示例的数据:

代码块 11-9

import pandas as pd
ice_cream_sales = [10, 9, 8, 7, 6, 5, 4, 3, 2 , 1]
degrees_celsius = [30, 25, 20, 19, 18, 17, 15, 13, 10, 5]
price  = [2,2, 3, 3, 4, 4, 5, 5, 6, 6]
data = pd.DataFrame({
    'ice_cream_sales': ice_cream_sales,
    'degrees_celsius': degrees_celsius,
    'price': price
})
data

数据以数据框格式在此显示:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_6.jpg

图 11.6 – 前一个代码块生成的图表

  1. 让我们创建两个散点图,以更好地了解冰淇淋销量与温度和价格(在这个虚构的例子中)的关系。以下代码显示了如何创建第一个散点图:

代码块 11-10

plt.scatter(data['degrees_celsius'], data['ice_cream_sales'])

这导致以下图表:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_7.jpg

图 11.7 – 前一个代码块生成的图表

  1. 第二个散点图可以创建如下:

代码块 11-11

plt.scatter(data['price'], data['ice_cream_sales'])

这导致以下图表:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_8.jpg

图 11.8 – 前一个代码块生成的图表

你可以清楚地看到,当温度较高时,销售额也较高,而当温度较低时,销售额较低。此外,高价与低销量相关,低价与高销量相关。

  1. 这些是冰淇淋销量中的两个逻辑上可解释的因素,但这还不是模型。让我们使用LinearRegression函数来模拟这种直接的线性关系:

代码块 11-12

from sklearn.linear_model import LinearRegression
my_lr = LinearRegression()
my_lr.fit(X = data[['degrees_celsius', 'price']], y = data['ice_cream_sales'])
  1. 我们可以如下评估此模型的(样本内)拟合度:

代码块 11-13

from sklearn.metrics import r2_score
r2_score(data['ice_cream_sales'], my_lr.predict(data[['degrees_celsius', 'price']]))

此模型产生一个训练 R2 分数为 0.98,这意味着模型与训练数据拟合得非常好。

  1. 我们现在处于需要比仅仅查看性能更深入地了解模型的步骤。在线性回归中,我们需要查看系数来解释它们拟合的内容。系数在以下代码中提取:

代码块 11-14

pd.DataFrame({'variable': ['degrees_celsius', 'price'], 'coefficient': my_lr.coef_})

这给出了以下输出:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_9.jpg

图 11.9 – 前一个代码块生成的系数

你可以这样解释:

  • 在恒定价格下,每增加一度摄氏度将使冰淇淋销量增加 0.15。

  • 在恒定温度下,每增加一欧元的价格将使冰淇淋销量减少 1.3。

使用树状图解释模型

当查看系数对于线性模型来说很棒时,一些模型没有任何系数。这类模型的例子基本上是任何使用树的模型。树有节点,这些节点基于是/否问题进行分割。虽然您不能从树中提取系数,但优势是您可以简单地打印出整个树作为图形!我们将在下一个示例中查看这一点:

  1. 要开始,我们需要在之前使用的数据上拟合一个 DecisionTreeRegressor 函数,使用以下代码:

代码块 11-15

from sklearn.tree import DecisionTreeRegressor
my_dt = DecisionTreeRegressor()
my_dt.fit(X = data[['degrees_celsius', 'price']], y = data['ice_cream_sales'])
  1. 为了得到模型是否拟合的一般概念,让我们在训练集上计算一个 R2 分数,就像我们之前做的那样:

代码块 11-16

r2_score(data['ice_cream_sales'], my_dt.predict(data[['degrees_celsius', 'price']]))

结果是 1.0,这意味着决策树在训练数据上获得了完美的拟合。没有任何保证这将在样本外泛化,但这对于解释模型来说不一定是问题。

  1. 要将树提取为图像,您只需使用这里的代码:

代码块 11-17

import sklearn
plt.figure(figsize=(15,15))
sklearn.tree.plot_tree(my_dt)
plt.show()

这将打印出整个树,并让您深入了解预测是如何做出的:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_10.jpg

图 11.10 – 前一个代码块生成的树状图

使用变量重要性解释模型

作为解释模型的第三种和最后一种方法,您可以查看变量重要性。再次强调,这并不是所有机器学习模型都适用的。然而,对于相当复杂的模型来说,查看所有树状图和变量重要性估计通常是一个很好的替代方案。

让我们从之前构建的决策树模型中提取变量重要性。这可以通过以下代码完成:

代码块 11-18

pd.DataFrame({'variable': ['degrees_celsius', 'price'], 'importance': my_dt.feature_importances_})

生成的数据框如下所示:

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/B18335_11_11.jpg

图 11.11 – 重要性值

这告诉我们,决策树比价格更使用了摄氏度作为预测变量。

摘要

在本章中,您已经看到了灾难性遗忘如何导致模型性能不佳,尤其是在数据以序列方式到达时。特别是当首先学习一个趋势,然后跟随第二个趋势时,忘记第一个趋势的风险是真实的,需要得到控制。

虽然没有一劳永逸的解决方案来处理这些问题,但有许多事情可以做到,以避免不良模型进入生产系统。您已经看到了如何实现连续评估指标,以及您将能够检测到一些趋势已经被遗忘。

基于性能的指标非常适合检测问题,但无法告诉你模型内部究竟发生了什么具体错误。你已经看到了三种模型解释的方法,这些方法可以帮助你进一步深入到大多数模型中。通过从模型中提取模型学习到的趋势或关系,你可以确定这是否对应于已知的业务逻辑或常识。

在本书的下一章和最后一章中,我们将总结所介绍的不同主题,并考虑在处理在线模型和流数据时需要牢记的一些最佳实践。

进一步阅读

第十二章:第十二章:结论和最佳实践

在本书的各章节中,你已经了解了流数据机器学习的领域,主要使用在线模型。在本章的最后,是对本书前十一章所看到的所有内容的回顾性概述。

本章将涵盖以下内容:

  • 需要牢记的最佳实践

  • 学习旅程的下一步

  • 最佳实践

实践总是与理论不同。在这本书中,你已经看到了很多理论知识。在本章的最后部分,你将看到一些在将理论应用于实际案例时始终需要牢记的最佳实践:

  1. 清洁数据/数据质量

数据质量和数据理解问题在大多数公司中是日常问题。有句著名的话说道:“垃圾输入,垃圾输出”,这意味着当你对垃圾数据进行机器学习时,你的输出也将是无用的。对于任何新业务案例,都需要进行彻底的数据探索,以便你能够识别潜在的问题。数据质量流程通常需要,但尚未实施。尽管数据科学家的工作范围不包括这些,但你仍然可以就这些流程的必要性和附加价值提出建议。

  1. 业务需求优先于技术需求

许多数据科学家有数学、统计学或编程背景,并且通常有运营思维。在业务案例中经常出现的问题是,技术人员开始做技术上最好的事情,并开始偏离业务项目定义的路线。虽然这非常可以理解,但始终牢记公司为何投资于特定技术非常重要,因为 99%的情况下,这是为了投资回报。在技术工作中,重要的是要记住你的技术主题是否有助于公司实现其目标,因为在不利的案例中,你可能会迅速失去资金。

  1. 业务指标是项目成功的关键

帮助公司实现目标往往还不够。你还必须能够向公司的领导证明,你确实在为他们赚钱或实现他们的目标。为了证明这一点,指标是你的最佳朋友。只要你在项目开始时以及整个过程中定义了项目的关键绩效指标,你就可以确保项目持续获得支持,让你能够从事尖端技术的工作。

  1. 保持兼容性,将公司指南作为自己的指南

长期成功的项目最终将根据贵公司的最佳实践进行评估。如果你想确保你的工作对公司有长期的相关性,你需要确保记住公司总体上在做什么,并确保你所做的是与之兼容的。允许与整体架构不兼容就是为自己设置失败。

  1. 技术指标对于避免问题非常有效

当项目变得庞大时,可能难以全面了解生产环境中正在运行的所有内容。同样,当使用业务指标时,你可以设置技术指标,帮助你快速轻松地了解你所拥有的一切以及它们的运行情况。随着项目的扩大,监控将变得更加重要,但实施起来也会更加困难。因此,最佳实践是在尽可能早的时候实施监控。

  1. 不要重复造轮子

许多数据科学家和机器学习工程师是技术爱好者,我们有自己关于如何实现某些功能的想法和愿景。然而,有一点需要注意,那就是避免重复造轮子。当解决方案已经存在,无论是公司内部还是外部,通常很有用,可以调查是否可以重用它们,而不是通过再次开发完全相同的功能来“重复造轮子”。

下一节将指导你在流式分析领域进一步扩展你的知识和技能。

进一步学习

本书的主要重点是为你提供进入流式分析领域的必要工具,并相对快速地转向数据科学在线机器学习算法。

如果你想在流式分析方面更进一步,通常有两个方向可以开始你的旅程:深度优先或广度优先。

深度优先的方法包括比当前书籍所涵盖的更深入地研究在线机器学习。尽管你现在应该已经对在线机器学习有了坚实的基础,但总有更多东西可以学习。以下是一些有用的资源:

广度优先的方法会建议你首先关注辅助领域,以便全面掌握架构主题、数据工程、代码效率等方面。以下资源可能有助于你在这一方向上的探索:

  • 研究云架构并获得最受欢迎的认证:

  • 提高你的编码技能:

    • Codewars、HackerRank 以及其他编程竞赛工具。

    • 开源贡献

  • 学习新的工具和环境:

    • 在 PySpark 中学习机器学习。

    • 在 R 中学习机器学习。

    • 在 Julia 中学习机器学习。

    • Databricks。

    • Dataiku。

    • AWS SageMaker。

两个方向之间的重点有很大的不同。在你旅程的终点,你可能想要考虑你对两个方向的见解。对你来说最相关的方向将始终取决于你的个人目标。

摘要

在本章的最后,你看到了一系列最佳实践,这些实践将帮助你成功且高效地将这一理论应用于实践。最后,你看到了两条你可能想要在继续你的流分析学和在线模型学习之旅时遵循的学习路径。

就这样,我们来到了这本书的结尾。我希望这本书对你有所帮助,并且你在实际应用这些主题时能够取得成功。撰写关于这个主题的文章是一种乐趣,我相信它很快就会受到广泛关注。它将是数据科学和机器学习未来趋势中值得关注的话题之一。当然,你可以随时关注出版商和我,在线获取即将发布的关于流处理、数据科学以及更多相关主题的新材料。

https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-stm-dt-py/img/Image87364.jpg

Packt.com

)

订阅我们的在线数字图书馆,全面访问超过 7,000 本书籍和视频,以及领先的工具,帮助您规划个人发展并推进您的职业生涯。更多信息,请访问我们的网站。

第十三章:为什么订阅?

  • 通过来自超过 4,000 位行业专业人士的实用电子书和视频,节省学习时间,更多时间编码

  • 通过为您量身定制的 Skill Plans 提高您的学习效果

  • 每月免费获得一本电子书或视频

  • 完全可搜索,便于快速访问关键信息

  • 复制粘贴、打印和收藏内容

您知道 Packt 为每本书都提供电子书版本,包括 PDF 和 ePub 文件吗?您可以在packt.com升级到电子书版本,并且作为印刷书客户,您有权获得电子书副本的折扣。有关更多信息,请联系我们customercare@packtpub.com

www.packt.com网站上,您还可以阅读一系列免费的技术文章,订阅各种免费通讯,并享受 Packt 书籍和电子书的独家折扣和优惠。

您可能还会喜欢的其他书籍

如果您喜欢这本书,您可能对 Packt 的其他书籍也感兴趣:

https://packt.link/9781789809718

Azure Databricks 食谱

Phani Raj, Vinod Jaiswal

ISBN: 9781789809718

  • 从各种 Azure 资源和文件格式中读取和写入数据

  • 使用 Delta Tables 和 Azure Synapse Analytics 构建现代数据仓库

  • 探索作业、阶段和任务,并了解 Spark 懒加载是如何工作的

  • 处理并发事务并在 Delta 表中学习性能优化

  • 学习 Databricks SQL 并在 Databricks SQL 中创建实时仪表板

  • 通过 CI/CD 管道集成 Azure DevOps 进行版本控制、部署和生产化解决方案

  • 了解如何使用 RBAC 和 ACLs 来限制数据访问

  • 为近实时数据分析构建端到端数据处理管道

https://packt.link/9781800209848

人工智能基础设施研讨会

Bas Geerdink, Anand N.S., Kunal Gera, Gareth Dwyer

ISBN: 9781800209848

  • 掌握人工智能的基础知识

  • 了解数据存储和架构在 AI 应用中的重要性

  • 使用开源工具构建数据存储和工作流程管理系统

  • 使用 Docker 等工具容器化您的 AI 应用程序

  • 发现常用的数据存储解决方案和适用于 Amazon Web Services (AWS)的 AI 最佳实践

  • 使用 AWS CLI 和 AWS SDK 执行常见的数据任务

Packt 正在寻找像您这样的作者

如果你有兴趣成为 Packt 的作者,请访问authors.packtpub.com并今天申请。我们已与成千上万的开发者和技术专业人士合作,就像你一样,帮助他们将见解分享给全球科技社区。你可以提交一个一般性申请,申请我们正在招募作者的特定热门话题,或者提交你自己的想法。

分享你的想法

现在你已经完成了《使用 Python 进行流数据机器学习》,我们非常想听听你的想法!如果你在亚马逊购买了这本书,请点击此处直接进入该书的亚马逊评论页面,分享你的反馈或在该购买网站上留下评论。

你的评论对我们和科技社区都非常重要,它将帮助我们确保我们提供的是高质量的内容。

你可能还会喜欢的其他书籍

你可能还会喜欢的其他书籍

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)》的技术资源,聚焦于电力系统中低碳经济调度问题,结合N-1安全准则与分布鲁棒机会约束(DRCC)方法,提升调度模型在不确定性环境下的鲁棒性和可行性。该资源提供了完整的Matlab代码实现,涵盖建模、优化求解及仿真分析全过程,适用于复杂电力系统调度场景的科研复现与算法验证。文中还列举了大量相关领域的研究主题与代码资源,涉及智能优化算法、机器学习、电力系统管理、路径规划等多个方向,展示了广泛的科研应用支持能力。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源调度、智能电网相关工作的工程师。; 使用场景及目标:①复现高水平期刊(如EI/SCI)关于低碳经济调度的研究成果;②深入理解N-1安全约束与分布鲁棒优化在电力调度中的建模方法;③开展含新能源接入的电力系统不确定性优化研究;④为科研项目、论文撰写或工程应用提供可运行的算法原型和技术支撑。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与案例数据,按照目录顺序逐步学习,并重点理解DRCC建模思想与Matlab/YALMIP/CPLEX等工具的集成使用方式,同时可参考文中列出的同类研究方向拓展研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值