如果你想对运动中的数据进行机器学习怎么办?如果你希望在实时数据上训练机器学习模型怎么办?在线机器学习,也被称为增量机器学习,是一种用运动中的数据执行机器学习的方法。与实时在线机器学习相比,在这篇文章中,我们将看看如何利用流数据来完成最先进的机器学习任务。我们还将讨论一个python库,River,以及它在在线机器学习上的实现。 我们将讨论以下概述的要点。
目录
- 批量学习与在线学习
- 用于在线机器学习的Python库
- 使用River的流学习
让我们从了解批量学习和在线学习之间的区别开始讨论。
批量学习与在线学习
批量学习方法无法进行渐进式学习。他们通常从整个训练集建立模型,然后投入生产。如果我们想让批量学习算法在新数据到来时学习,我们必须在完整的训练集和新数据上从头开始建立一个新模型。离线学习是另一个术语。如果数据量很大,在整个数据集上进行训练可能在计算机资源(CPU、RAM、存储、磁盘I/O等)方面很昂贵。
如果我们的系统不需要对快速变化的数据做出反应,那么批量学习方法可能就足够了。如果我们不需要太频繁地更新我们的模型,我们可以利用批量学习策略。换句话说,训练、评估和测试的整个过程都是相当基本和不复杂的,而且它经常比在线技术产生更好的结果。对于知识图谱的嵌入项目,我已经创建了批量学习算法。在未来,我希望为这些项目创建一个在线方法,以适应不断变化的知识图谱。

在在线学习中,训练是在小组中进行的,或者通过不断地输入到达的数据,以递增的方式进行。每个学习阶段都是快速和廉价的,允许系统在新数据到来时学习。
连续接收数据的机器学习系统(如股票价格),必须迅速适应变化或自主地从在线学习中受益。如果你只有有限的计算资源,这也是一个聪明的选择:在线学习系统在学习了新的数据实例后,不再需要它们,所以你可以把它们扔掉(除非你希望能够 "重放 "数据)。这可以帮助你节省大量的空间。在线学习在上图中被描绘出来。
在线学习方法也可用于训练系统,这些数据集太大,无法装入一台机器的主内存(这也被称为核外学习)。该算法加载一部分数据,在该数据上执行训练步骤,然后继续这个过程,直到它在所有的数据上运行。
学习率是在线学习的一个重要特征。学习率是你希望你的机器学习适应新数据集的速度。一个具有快速学习率的系统会迅速忘记它所学到的东西。一个学习率低的系统更类似于批量学习。
在线学习系统的一个重要缺点是,如果它被输入了不正确的数据,系统将表现不佳,而用户将立即看到这种影响。因此,实施适当的过滤器以确保输入的数据具有良好的质量是至关重要的。此外,密切监测机器学习系统的运作也很关键。
用于在线机器学习的Python库
为了执行在线机器学习,有许多框架可用,其中有几个。
Scikit-Multiflow
Scikit-multi-flow(也被称为skmultiflow)是一个基于Python的机器学习库,支持多输出/多标签和流数据。Scikit-multiflow使得创建和执行实验,以及增强流学习算法变得简单。它有许多用于分类、回归、概念漂移检测和异常检测的方法。scikit-multiflow与Jupyter Notebooks兼容,旨在与Python的数值和科学库NumPy和SciPy一起工作。
Jubatus
日本电报电话公司和首选基础设施创建了Jubatus,这是一个开源的在线机器学习和分布式计算系统。它具有分类、推荐、回归、异常检测和图形挖掘功能。支持许多客户端语言,包括C++、Java、Ruby和Python。迭代参数混合法被用于分布式机器学习。
Creme框架
通过Creme,我们可以使用不同的方法,也就是不断地学习数据流。因此,模型每次只处理一个观察结果,并可以在飞行中修改。这使得我们能够从大的数据集中学习,这些数据集太大,无法装入主存储器。在新数据不断到来的情况下,在线机器学习效果很好。它在各种应用中表现出色,包括时间序列预测、垃圾邮件过滤、推荐系统、CTR预测和物联网。
本文重点介绍River库,它结合了scikit-multiflow和creme库,为在流数据上执行在线机器学习提供了功能。那么,让我们仔细看看River和它的实现。
河流
River是一个用于持续学习和动态数据流的机器学习库。对于各种流学习的挑战,它包括许多最先进的学习方法、数据生成器/转换器、性能指标和评估器。它是结合Python中两个最流行的流学习包的结果。Creme和scikit-multiflow。
在河里,机器学习模型是专门的混合函数的扩展类,根据学习工作的不同而不同,如分类、回归、聚类等。这就保持了库的兼容性,使其更容易扩展/修改当前的模型以及创建与river兼容的新模型。
学习和预测是所有预测模型的两个主要功能。学习一方法用于学习(更新模型的内部状态)。而 predict one(分类、回归和聚类)。 *predict proba one* (分类),和 score one(异常检测)算法根据学习目标提供预测。值得注意的是,河中包括转化器,它是有状态的对象,使用转化一方法来转换一个输入。
让我们来实现河流。
River提供了一个类似于Scikit-learn的API,也被称为流媒体或在线机器学习的Scikit-learn。它是为流媒体数据设计的,支持几乎所有的ML估计器和转化器。
让我们来看看如何使用河流来创建一个简单的文本分类器模型,可以将文本的情绪归类为正面(1)或负面(-1)。这篇文章中使用的数据集取自这个Kaggle资源库,其中包含与各自情感相关的文本字符串。为了将我们的文本转换为特征,我们将使用BagOfWords() 作为我们的转换器或矢量器,并使用Naive BayesMultinomialNB 作为我们的机器学习估计器。
在安装河道时,确保你使用的是最新版本的NumPy包:
pip install -U numpy
pip install river
import river
from river.naive_bayes import MultinomialNB
from river.feature_extraction import BagOfWords,TFIDF
from river.compose import Pipeline
import pandas as pd
在数据方面,我们将只是利用一个包含文本和我们场景中的标签(正或负)的图元列表。然而,也可以从流媒体引擎或CSV文件中摄取数据。如果你使用的是著名的Pandas包,你必须将CSV文件转换为字典或图元列表。
df = pd.read_csv("/content/stock_data.csv")
# Convert to Format
df.to_dict()
# Convert to Tuple
data = df.to_records(index=False)
data

接下来,我们将构建一个包括两个阶段的管道:一个用于将文本转换为特征的转换器/矢量器和一个估计器。
# Build Pipeline
pipe_nb = Pipeline(('vectorizer',BagOfWords(lowercase=True)),('nb',MultinomialNB()))
# Specify Steps
pipe_nb.steps
因为数据是一次一个的,所以我们必须在训练过程中使用管道的.learn one(x,y)方法一次一个的去适应我们的模型。我们可以通过使用for循环迭代我们的数据来模拟这个过程。[注意,t是crème中的.fit one(x,y)]
# Train
for text,label in data:
pipe_nb = pipe_nb.learn_one(text,label)
现在让我们用predict_one和两类的概率来检查预测结果。
# Make a Prediction
test = 'Mr AAP is going to have to stop hanging out by the pool if he is to make 435 by close. All she needs is one fat finger buyer'
pred = pipe_nb.predict_one(test)
# Prediction Prob
proba_ = pipe_nb.predict_proba_one(test)
print('Predicted test sentence as',pred,' and probability of classes for test as',proba_)
输出:

我们可以采用河中的函数来确定我们模型的可靠性和性能。准确度指标和分类报告可以从子模块的指标中使用。
# Update the Model on the test data & Check Accuracy
metric = river.metrics.Accuracy()
for text,label in data:
y_pred_before = pipe_nb.predict_one(text)
metric = metric.update(label,y_pred_before)
# Has already learnt the pattern
pipe_nb = pipe_nb.learn_one(text,label)
print(metric)
输出结果:
准确率:90.07%
最后的话
通过这篇文章,我们看到了批处理学习和流学习(在线学习)之间的根本区别,也看到了这两种技术的局限性,以及其中一种是如何取代另一种的。后来,我们看到了一些流行的框架和库,它们主要用于处理和模拟流数据。最后,我们看到了该领域最流行的库的实践实现,名为River。我鼓励你访问官方文件,以了解当你在处理连续或流式数据时如何做以及可以做什么。