使用River Python的在线机器学习
在线机器学习是机器学习的一种类型,在这种学习中,数据会按顺序出现。在每一步,模型都会被更新,直到我们拥有一个更准确、更强大的模型。
数据是运动的,随着时间的推移不断变化。当我们有流式数据时,它最适合,我们想一次处理一个数据样本。
这与传统或离线机器学习不同,在传统机器学习中,数据集在本地可用,我们从整个数据集中学习后在最后生成一个模型。在离线机器学习中,我们所有的数据集通常都是本地可用的。
下面我们展示一下在线和离线机器学习的区别。

在本教程中,我们将使用[River Python]来建立我们的模型并模拟流式数据。这将是一个文本分类模型,将给定的输入文本分类为软件或硬件相关。
前提条件
读者必须具备以下条件。
- 在你的机器上安装了[Python]。
- 对[Python]有良好的理解。
- 对[机器学习模型]有良好的了解。
- 如何使用[谷歌Colab]或[Jupyter笔记本]。在本教程中,我们将使用Google Colab。
注意:为了使你能够轻松地跟上,请使用Google Colab。
简介
如前所述,我们将使用[River Python]来建立我们的模型。由于以下原因,[River Python]是最适合的。
- 它有增量的功能。这个库可以在每次观察后更新,因此可以用来处理流数据。
- 它是自适应的。由于我们处理的是随时间不断变化的流式数据,我们需要一个健壮的库,可以在变化的环境下工作。
- 它是通用的。River Python被用于分类、聚类和回归。既有监督又有无监督的机器学习。
- 高效&易于使用。在处理流媒体数据时非常高效,它也很简单,容易使用,初学者可以轻松掌握。
在在线机器学习中,模型使用实时数据进行训练,每次只进行一次观察。然后我们在每个新数据到来时更新我们的模型,随着时间的推移增加模型的准确性。
输入的数据被不断用来改善当前模型的知识。随着我们进一步训练模型,它变得更加适应和稳健。
河流Python的安装
由于我们使用的是谷歌Colab,所以我们使用以下命令来安装river。
!pip install river
导入River
为了使用River,我们把它导入到我们的机器中。
import river
检查方法和属性
River Python有各种在线机器学习的方法和属性。要列出所有可用的方法,请使用以下命令。
dir(river)
这是一个River方法和属性的列表。
['__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'__version__',
'anomaly',
'base',
'cluster',
'compat',
'compose',
'datasets',
'drift',
'dummy',
'ensemble',
'evaluate',
'expert',
'facto',
'feature_extraction',
'feature_selection',
'imblearn',
'linear_model',
'meta',
'metrics',
'multiclass',
'multioutput',
'naive_bayes',
'neighbors',
'neural_net',
'optim',
'preprocessing',
'proba',
'reco',
'stats',
'stream',
'synth',
'time_series',
'tree',
'utils']
我们将使用的一些方法如下。
-
naive_bayes- 这是我们将用来建立文本分类模型的算法。 -
preprocessing- 它将被用于处理我们的数据集,用于训练我们的模型。 -
metrics- 它被用来计算我们模型的准确度分数。 -
stream- 它被用来模拟我们的数据集是流式数据。 -
anomaly- 用来检测我们模型中的错误和异常情况。 -
compose- 用来建立一个管道,以实现机器学习工作流程的自动化。
这些方法在本教程中会有很大帮助。
加载机器学习包
要加载我们的机器学习包,请使用以下命令。
import MultinomialNB from river.naive_bayes
import BagOfWords,TFIDF from river.feature_extraction
我们已经导入了以下包。
MultinomialNB
这是一种用于文本分类的Naive Bayes方法。它包含了在建立我们的模型时有用的算法。
词袋(BagOfWords
它用于在我们的数据集中提取各种特征。特征是作为我们模型输入的独立变量。
它还将我们的文本输入转换为更易于机器阅读的向量。BagOfWords的工作与离线机器学习中的CountVectorizer 相同。
在离线机器学习中,CountVectorizer ,根据整个文本中出现的每个词的频率,将给定的文本转换成一个向量。当我们有了文本,并希望将该文本转换为矢量以进一步进行文本分析时,这很有帮助。
CountVectorizer 它还用于非常基本的预处理,如去除标点符号,并将所有单词转换为小写。
在本教程中,我们将处理在线机器学习,因此,我们用BagOfWords 替换CountVectorizer ,其功能相同。
TFIDF
TDIDF是术语频率-反向文档频率的缩写。它显示了单词在给定文件中的相关程度,并给出了单词的重要性。
这是通过测量单词在特定文档中出现的频率来完成的。如果一个词在一个文件中频繁出现,而在其他文件中不频繁出现,这意味着这个词与所有文件中出现的词相比,更具有相关性和分类能力。
获得相关的方法和属性
为了使用前面所说的方法,我们需要将它们添加到我们的程序中。
要做到这一点,我们使用下面的Python函数。
def get_all_attributes(package):
subpackages = []
submodules = []
for i in dir(package):
if str(i) not in ["__all__", "__builtins__", "__cached__", "__doc__", "__file__", "__loader__", "__name__", "__package__", "__path__", "__pdoc__", "__spec__", "__version__"]:
subpackages.append(i)
res = [j for j in dir(eval("river.{}".format(i)))]
submodules.append(res)
df = pd.DataFrame(submodules)
df = df.T
df.columns = subpackages
res_df = df.dropna()
return res_df
我们把这个函数命名为get_all_attributes ,以获得建立我们的模型所需的所有属性和方法。
该函数在包中循环,并删除了以下内容。__all__,__builtins__,__cached__,__doc__,__file__,__loader__,__name__,__package__,__path__,__pdoc__,__spec__ 和__version__ 。
我们删除它们,因为它们不用于建立我们的模型。
列表中剩余的子包和子模块使用subpackages.append() 方法添加。
然后我们使用pd.DataFrame(submodules) 方法将这些子包和子模块添加到我们的数据框架中。这个数据框架将被用来训练我们的模型。现在,数据框架将拥有所有的子包和子模块。
上面的函数删除了不必要的方法、包和属性,如图所示。
dir(river)
剩下的方法和属性的输出如图所示。
['anomaly',
'base',
'cluster',
'compat',
'compose',
'datasets',
'drift',
'dummy',
'ensemble',
'evaluate',
'expert',
'facto',
'feature_extraction',
'feature_selection',
'imblearn',
'linear_model',
'meta',
'metrics',
'multiclass',
'multioutput',
'naive_bayes',
'neighbors',
'neural_net',
'optim',
'preprocessing',
'proba',
'reco',
'stats',
'stream',
'synth',
'time_series',
'tree',
'utils']
要将这些方法和属性添加到我们的程序中,请使用下面的命令。这将使它们在建立我们的模型时可以使用。
river_df = get_all_attributes(river)
要看这些方法和属性是否被添加,请使用这个命令。
river_df
输出如图所示。


模拟流式数据
为了使用River Python,我们需要流式数据。流式数据是随着时间的推移而递增的,而且是一次一个。为了模拟流式数据,我们用我们的数据集作为一个元组的列表,如图所示。
我们将有两个数据列表。一个训练列表和一个测试列表。
训练列表
data = [("my python program is runnning","software"),
("I tried to run this program, but it has bugs","software"),
("I need a new machine","hardware"),
("the flashdisk is broken","hardware"),
("We need to test our code","software"),
("programming concepts and testing","software"),
("Electrical device","hardware"),
("device drives","hardware"),
("The generator is broken","hardware"),
("im buidling a REST API","software"),
("design the best API so far","software"),
("they need more electrical wiring","hardware"),
("my code has errors","software"),
("i found some program test faulty","software"),
("i broke the car handle","hardware"),
("i tested the user interface code","software")]
这包含一个文本列表,这些文本被标记为hardware 或software 相关。它们将被用来逐一训练模型。
测试列表
test_data = [('he writes programs daily','software'),
('my disk is broken','hardware'),
("program mantainance","software"),
('The drive is full','hardware')]
这个测试数据将被用来测试我们的模型和衡量模型的性能。
建立管道
机器学习管道是用来自动化机器学习模型的工作流程的。
机器学习管道是由连续的步骤组成的。这些步骤涉及数据提取、预处理、模型训练和部署。
让我们导入管道。
from river.compose import Pipeline
我们的管道将有两个阶段。
- BagOfWords。它用于特征提取和将文本输入转换为向量。
- MultinomialNB:在建立模型时使用Naive Bayes算法。
让我们来初始化这两个阶段。
管线阶段初始化
为了初始化我们的管道,使用这个代码段。
pipe_nb = Pipeline(('vectorizer',BagOfWords(lowercase=True)),('nb',MultinomialNB()))
这将初始化我们的两个阶段;BagOfWords 为vectorizer ,MultinomialNB 为nb 。我们还通过设置lowercase=True ,将我们的文本改为小写。
管线的可视化
为了使初始化的管道可视化,使用这个命令。
pipe_nb
其输出结果如图所示。

获取管道步骤
要获得管道的步骤,使用以下命令。在本教程中,我们有两个步骤。
pipe_nb.steps
输出。
OrderedDict([('vectorizer',
BagOfWords (
on=None
strip_accents=True
lowercase=True
preprocessor=None
tokenizer=<built-in method findall of re.Pattern object at 0x7fa35529de00>
ngram_range=(1, 1)
)),
('nb',
MultinomialNB (
alpha=1.
))])
建立我们的模型
由于我们要处理的是流式数据,我们必须一次一次地从我们的数据中学习,以模拟流式数据。
我们的数据是以图元列表的形式存在的,所以我们可以通过使用for 循环来迭代我们的数据,从而一次一次地学习它。这将确保我们训练出一个模型来给我们的循环中的每个实例提供时间,然后再进入下一个实例,就像我们在处理流式的实时数据一样。
循环浏览我们的数据集
for text,label in data:
pipe_nb = pipe_nb.learn_one(text,label)
当循环通过我们的数据集时,我们使用learn_one() 方法从我们给定的元组列表中一次学习一个。learn_one() 将从第一个text 和label ,根据我们的数据集,这是"my python program is running", "software" 。
它将存储所学的知识,并在下一个数据到来时使用它。由于该模型会记住随着时间推移获得的知识,它将能够适应数据集的变化。
随着时间的推移,该模型将比我们开始训练时更准确,因为它将积累知识。
进行预测
在在线机器学习中,模型不会等到最后才做出预测。它将预测这个实例,并在下一个数据到来时继续训练。
pipe_nb.predict_one("I built an API")
我们使用predict_one ,根据这个实例进行预测。
输出结果显示。
'software'
这是真的,因为我们的文本与software 有关。
预测概率
为了得到上述分类的概率,使用这个命令。
pipe_nb.predict_proba_one("I built an API")
我们使用predict_proba_one() 的方法来得到这个实例的预测概率。
其输出结果如图所示。
{'software': 0.732646964375691, 'hardware': 0.2673530356243093}
这表明该文本被分类为software 的概率大于hardware 。它们的概率分别为0.7326 和0.2673 。
在线机器学习是一个连续的过程,因为我们使用的是不断产生的实时数据。
让我们再做一次预测。
其他预测
pipe_nb.predict_one("the hard drive in the computer is damaged")
的预测输出。
'software'
这给出了一个错误的预测,因为它还处于学习过程的早期。但随着我们继续使用我们的数据集进行训练,模型将获得更多的知识,它将在作出未来的预测时使用。
目的是让学习模型适应新的数据而不忘记现有的知识。
在训练阶段的开始,模型的准确率较低,但随着时间的推移,准确率会增加。让我们来计算一下这个例子中的模型准确率。
模型的准确性
我们需要得到我们的模型在这个实例中的准确性。我们使用river.metrics.Accuracy() 方法来计算精度。
我们循环浏览我们的数据集,得到我们想要计算准确率的实例,并在使用metric.update 进行预测后,用准确率分数更新我们的模型。
metric = river.metrics.Accuracy()
for text,label in test_data:
y_pred_before = pipe_nb.predict_one(text)
metric = metric.update(label,y_pred_before)
pipe_nb = pipe_nb.learn_one(text,label)
要获得准确率分数,请使用以下命令。
metric
输出如图所示。
Accuracy: 75.00%
作为第一个预测,这对我们的模型来说是一个很好的准确性。这表明我们的模型有75%的机会做出准确的预测。
随着我们继续训练,我们的模型将从数据集中学习并存储知识。然后,它将使用这些积累的知识来提高预测时的准确率,这是任何模型的目标。
总结
在本教程中,我们已经了解了在线机器学习。我们首先说明了在线和离线机器学习的区别,这让我们对这种模型有了很好的工作知识。
然后我们探索了River Python,这是一个可以处理流式数据的好库。River Python有各种方法和属性,对建立我们的机器学习模型很重要。
然后我们应用了一个机器学习管道,从数据处理、特征提取到建立模型的工作流程都是自动化的。我们使用Naive Bayes算法建立了我们的模型。
我们最后用我们训练好的模型进行预测,同时检查模型的准确性。准确率越高,我们的模型越好。我们的模型应该能够将一个给定的文本分类为硬件或软件相关。