机械网站模板(River)

用于流式数据的机器学习的 "sklearn"Alexandra Amidon -6分钟阅读图片来源:UnboxScience at Pixabay传统的机器学习算法,如线性回归和xgboost,以 "批处理 "模式运行。也就是说,他们使用一个完整的数据集一次性地拟合一个模型。用新的数据更新该模型需要用新的数据和旧的数据从头开始拟合一个全新的模型。在许多应用中,这可能是困难的或不可能的它要求所有的数据都能装入内存,这并不总是可能的。模型本身重新训练的速度会很慢。为模型检索旧的数据可能是一个很大的挑战,特别是在连续产生数据的应用中。存储历史数据需要数据存储基础设施具有快速返回全部历史数据的能力。另外,模型可以在 "在线 "或 "流 "模式下被训练。在这种情况下,数据被视为一个流或项目序列,被逐一传递给一个模型。渐进式学习、持续式学习和流式学习是 "在线学习 "的首选术语,因为搜索 "在线学习 "基本上都指向教育网站。增量学习是许多用例的理想选择,例如在大型数据集上拟合模型、垃圾邮件过滤、推荐系统和物联网应用。介绍RiverRiver是一个新的python库,用于在流数据环境下渐进的训练机器学习模型。它为不同的在线学习任务提供最先进的学习算法、数据转换方法和性能指标。它是融合了creme和scikit-multiflow库的最佳部分的产物,这两个库的建立都有相同的目标。"为社区提供工具,推动流式机器学习的发展,并促进其在现实世界中的应用。”River是一个开源的软件包,由一个庞大的从业者和研究人员社区维护。源代码可以在Github上找到。River中的算法类型River为回归、分类和聚类任务提供了一系列的增量学习算法。可用的模型类型包括朴素贝叶斯、树集合模型、分解机、线性模型等等。关于已实现算法的完整列表,请参见API参考。River还提供了漂移检测算法。当输入数据和目标变量之间的关系发生变化时,就会出现概念漂移。River提供了处理不平衡数据集和异常检测的方法。最后,River提供了模型度量和数据预处理方法,这些方法已经被重构以处理增量更新。增量学习算法有什么不同?为了转换数据和增量训练模型,大多数学习算法和数据转换方法必须重构以处理更新。首先,考虑如何将一个特征比例化,使其具有零均值和单位方差。在批量设置中,这很简单:计算平均值和标准差,从每个值中减去平均值,然后将结果除以标准差。这种方法需要完整的数据集,不能随着新数据的到来而更新。在流媒体环境中,特征缩放是使用运行统计学来完成的,这种数据结构允许均值和标准差被递增更新。对于增量训练模型,一个常见的学习算法是随机梯度下降(SGD)。SGD是一种用于训练神经网络的流行算法,有几个变种。它也可以用来训练其他模型,如线性回归。SGD的核心思想是,在每个训练步骤中,模型参数权重按照梯度的相反方向调整,梯度是用该步骤中的模型预测误差计算出来的。River API所有的模型都能够从数据中学习并进行预测。河流中的模型可以灵活地从单一实例中学习。只要有新的数据到来,模型就可以快速更新。 learn_one(x, y) 给出一个包含输入特征x和目标值y的新观察,更新模型的内部状态。 predict_one(分类、回归、聚类)返回模型对单个观测值的预测值。 predict_proba_one(分类)返回模型对单个观测的预测概率。 score_one(异常检测)返回单个观察值的离群值。 transform_one对一个输入观测值进行转换为了演示API的使用,请看下面的例子。在这个例子中,一个线性LogisticRegression模型和ROCAUC模型评分对象被实例化了。然后,对于数据集中的每个观测值,模型用predict_proba_one进行预测,并通过将观测值x和标签y传递给learn_one方法来更新其权重。最后,它用真实的y值和预测的y_pred值更新模型评分对象metric.update。from river import linear_model
from river import metrics
model = linear_model.LogisticRegression()
metric = metrics.ROCAUC()

for x, y in dataset:
y_pred = model.predict_proba_one(x)
model.learn_one(x, y)
metric.update(y, y_pred)
print("ROCAUC:", metric)
>> ROCAUC: 0.893565字典数据结构River希望数据观察结果以python字典的形式呈现。字典中的键代表特征名称。import datetime
x = {'moment': datetime.datetime(2016, 4, 1, 0, 0, 7),
'clouds': 75,
'description': 'light rain',
'temperature': 6.54,
'wind': 9.3}字典数据结构有几个优点。字典是灵活的,不是类型化的。因此,它们可以处理稀疏的数据和数据流中可能出现的新特征。 字典数据是轻量级的,不需要像numpy.ndarray或pandas.DataFrame这样 复杂的数据结构所需的开销。这使得它更容易在流媒体环境下快速处理单个观察结果。River扩展了原生的Python字典结构,允许更有效的数据操作。River中的流模块提供了几个处理流数据的实用程序,包括将数据加载到预期的字典格式。例如,stream.iter_csv方法允许你将一个CSV文件加载到流数据结构中。在下面的例子中,"加载 "的 data_stream 实际上是一个 python 生成器,它在 CSV 文件上迭代并解析每个值。整个数据集不是一次性从磁盘上读取的,而是一次一个样本的读取。from river import stream
data_stream = stream.iter_csv(
dataset_path,
converters={
'bikes': int,
'clouds': int,
'humidity': int,
'pressure': float,
'temperature': float,
'wind': float
},
parse_dates={'moment': '%Y-%m-%d %H:%M:%S'},
target='bikes' )

for x, y in data_stream:
print(x, y)
break
>> ({'moment': datetime.datetime(2016, 4, 1, 0, 0, 7),
'station': 'metro-canal-du-midi',
'clouds': 75,
'description': 'light rain',
'humidity': 81,
'pressure': 1017.0,
'temperature': 6.54,
'wind': 9.3},
1)="来自River文档的代码示例。上面stream.iter_csv例子中使用的一些额外参数。converters参数指定了非字符串列的数据类型。如果没有在加载时指定数据类型,stream.iter_csv会假定所有数据都是字符串。 parse_dates表示解析日期的预期格式。 target指定哪个变量是目标,或y列。如果不包括在内,y将被返回为无。字典数据结构在像网络应用程序中是非常直观的。你可以简单地将一个JSON结构的有效载荷传递给模型,以进行预测或更新模型。import flask
app = flask.Flask(__name__)

@app.route('/', methods=['GET'])
def predict():
payload = flask.request.json
river_model = load_model()
return river_model.predict_proba_one(payload)

@app.route('/', methods=['POST'])
def learn():
payload = flask.request.json
river_model = load_model()
river_model.learn_one(payload['features'], payload['target'])
return {}, 201River文档中的代码示例。River管道管道是river的一个核心组成部分。与scikit-learn类似,管道将模型的各个步骤,包括数据转换和预处理,连成一个单一的序列。from river import compose
from river import linear_model
from river import preprocessing
from river import feature_extraction

model = compose.Pipeline(
preprocessing.StandardScaler(),
feature_extraction.PolynomialExtender(),
linear_model.LinearRegression()
)River用户指南中的代码示例(管道-River(riverml.xyz))。正如《使用管道的艺术》教程中所示,当特征预处理步骤变得复杂时,管道可以简化模型拟合代码。它使代码更具可读性,更不容易出错。需要注意的重要行为:当在管道上调用predict_one或predict_proba_one方法时,模型的无监督部分会被更新。无监督的部分包括特征缩放和其他转换。这与批量机器学习完全不同。像特征缩放这样的转换并不依赖于地面真实标签,所以这些可以在没有它的情况下被更新。当然,一个管道的Learn_one方法除了更新转换方法外,还更新监督部分。一个简单的例子下面的例子展示了如何在乳腺癌数据集上拟合一个逻辑回归模型。首先,一个标准的数据扩展器和逻辑回归模型被实例化了。逻辑回归模型被赋予一个学习率为0.01的随机梯度下降优化器,用于训练。然后,真实值和预测值的列表被初始化。然后,代码对数据集进行迭代;每个xi是一个字典对象。在for循环的每一步中,代码需要4个stesp。用新的观测值更新标度器,并对观测值进行标度。该模型利用按比例的观察结果进行预测。用新的观察和标签来更新模型。真实和预测的标签被存储在一个列表中。当for-loop结束时,将计算整体ROC AUC。from sklearn import datasets, metrics
from river import stream
from river import linear_model
from river import optim
from river import preprocessing

scaler = preprocessing.StandardScaler()
optimizer = optim.SGD(lr=0.01)
log_reg = linear_model.LogisticRegression(optimizer)

y_true = []
y_pred = []

for xi, yi in stream.iter_sklearn_dataset(datasets.load_breast_cancer(), shuffle=True, seed=42):

# Scale the features
xi_scaled = scaler.learn_one(xi).transform_one(xi)

# Test the current model on the new "unobserved" sample
yi_pred = log_reg.predict_proba_one(xi_scaled)
# Train the model with the new sample
log_reg.learn_one(xi_scaled, yi)

# Store the truth and the prediction
y_true.append(yi)
y_pred.append(yi_pred[True])

print(f'ROC AUC: {metrics.roc_auc_score(y_true, y_pred):.3f}')代码示例改编自River(riverml.xyz)文档这段代码可以被改进和简化。在下面的例子中,为同一任务训练了一个逻辑回归模型,但使用了管道和运行指标来减少步骤并增强可读性。from sklearn import datasets
from river import stream
from river import compose
from river import linear_model
from river import optim
from river import preprocessing
from river import metrics

model = compose.Pipeline(
preprocessing.StandardScaler(),
linear_model.LogisticRegression( optim.SGD(lr=0.01) )
)
metric = metrics.ROCAUC()

for xi, yi in stream.iter_sklearn_dataset(datasets.load_breast_cancer(), shuffle=True, seed=42):

# Test the current model on the new "unobserved" sample
yi_pred = model.predict_proba_one(xi)

# Update the running metric with the prediction and ground truth value
metric.update(yi, yi_pred)

# Train the model with the new sample
model.learn_one(xi, yi)

print(f'ROC AUC: {metric}')总结river是增量学习和持续学习的首选库。它提供了一系列的数据转换方法、学习算法和优化算法。它独特的数据结构非常适用于流媒体数据和网络应用的设置。(本文由闻数起舞翻译自文章《River: the Best Python Library for Online Machine Learning》,转载请注明出处,原文链接:https://towardsdatascience.com/river-the-best-python-library-for-online-machine-learning-56bf6f71a403)

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://kuaisubeian.cc/43814.html

kuaisubeian