为了下个项目的质量!每个数据科学家都应该学会这两种工具

aiwozhiai 2020-10-06

使用机器学习模型越久,就越能意识到,正确了解模型当下的运行目的及效果有多重要。在实践中,即便是在最佳情况下,跟踪模型的运行情况(尤其是在测试各种模型参数组合时)都十分繁琐。大多数情况下,我都会构建自己的工具来调试和分析机器学习模型。

最近,在为MAFAT的多普勒脉冲雷达分类挑战设计各种模型的时候,我发觉自己手动构建模型调试工具就是在浪费时间,而搭建集成(组合大多数分类策略的机器学习模型,搭对了就会带来极大效用)时尤为繁琐。

创建集成的问题就是,各种模型及分类都需要让策略奏效。这就意味着要训练更多的模型、进行更多的分析、了解更多关于整体精度及模型性能的参数。同样,这就要求我花更多的时间创建自己的调试工具和策略。

为了更好地利用时间和资源,我决定使用一系列可用的在线工具来调试和分析机器学习模型。测试了几个工具后,我成功缩减了清单:开发或改进机器学习模型时,每个数据科学家都应考虑这两个超赞的工具。

为了下个项目的质量!每个数据科学家都应该学会这两种工具

Weights & Biases

为了下个项目的质量!每个数据科学家都应该学会这两种工具

Weights &Biases图表跟踪验证集内各种具有不同参数的模型的性能。Y轴表示精度,X轴表示训练回合数。

Weights & Biases(W&B)是一家总部位于旧金山的公司,提供一系列能无缝融入现有或新项目的深度学习及机器学习工具。它主要是跟踪项目中模型变化的实时性能,简直太管用了。

我在做项目时,常常就追踪问题手足无措:何时进行了哪些更改?这些更改对项目的各种评估指标是否产生了正面或负面影响?而W&B能用以多种方式存储并可视化这些评估指标,其中最有效的就是图表和表格:

为了下个项目的质量!每个数据科学家都应该学会这两种工具

用W&B工具跟踪和可视化各种指标以进行并排比较的示例

为了下个项目的质量!每个数据科学家都应该学会这两种工具

模型数据存储在可导出表格中,以便在W&B网站上进行排序和评估。

如你所见,折线图表示在训练期间使用不同指标跟踪各种模型的性能。这样便能进行无缝并排比较,以检查过拟合或检查验证集上表现最佳的模型等。

W&B如何与项目关联?

在W&B网站上创建账户后,必须在本地环境下安装并登录到个人页面。

!pip install --upgrade wandb!wandb login

深度学习或者机器学习工具不同,情况也可能不同。我用Keras,但其它项目的文档会更清晰,也易于执行:

#Import the packageimport wandbfrom wandb.keras import WandbCallback#Initialize the W&B objectwandb.init(project="tester")#Link the model with W&B’stracking metricsmodel.fit(X_train, y_train, validationData=(X_test, y_test) epochs=config.epochs, callbacks=[WandbCallback()])model.save(os.path.join(wandb.run.dir,"model.h5"))

训练模型时,W&B帐户会实时跟踪和更新进度,在账户内能轻松分析和评估模型的性能。在这里,你可以选择创建报告,提供更专业、更易理解的结果视图,可以在其中覆盖文本和其他视觉效果。

W&B十分有助于跟踪模型的性能,在更改参数并尝试各种技术时更是如此。实际上,这个说法绝不夸张。它确实能帮上大忙:OpenAI和Toyota Research这样的大公司定期使用它,称赞它是灵活且有效用的项目工具。

为了下个项目的质量!每个数据科学家都应该学会这两种工具

Uber的Manifold

为了下个项目的质量!每个数据科学家都应该学会这两种工具

图源:unsplash

我正在项目中创建集成。一个集成是不同算法的集合,每个算法就同一数据进行训练并提供预测。集成的优势在于,它提供了一系列不同的策略来寻找解决方案,并利用多数票使所有模型的分类民主化。这很有用,因为尽管单个模型可以很好地预测部分数据,但它可能会在其他部分不知所措。

在机器学习中,“集成就是数字力量”。为了让集成表现良好,组成集成的各个模型必须能进行多样化预测。多样化预测,即不能所有模型都对某数据进行一模一样的预测;它们应该能对不同数据进行准确预测。然而这也带来了问题:你怎么知道集成进行的是多样化预测呢?看看交通科技巨头Uber的Manifold吧。

Uber的Manifold是个开源长期项目,旨在为机器学习提供调试的可视化工具(模型是什么样子的都无所谓)。通俗地讲,Manifold让你能看见哪个模型在数据子集中表现不佳、哪些特性导致了表现不佳。

集成能帮大忙。它创建了一个Widget输出,在Notebook就能交互以进行快速分析。注意,该工具目前仅在经典的Jupyter Notebook电脑上可用。它在Jupyter Lab或Google的Colab上不能运行。

Manifold使用k均值聚类——一种邻近分组技术,将预测数据分为性能相似的片段。想象一下,这是将数据分成相似的子类,然后沿着每个分段绘制模型,其中模型越靠左,则在该分段上表现越好。随机生成的示例中可以看到这一点:

为了下个项目的质量!每个数据科学家都应该学会这两种工具

上述例子中有三个模型,输入数据被分成四段。把对数损失(log-loss)作为性能指标,可以看到model_1在segment_0上的表现不佳,而model_2在segment_2上的表现不佳。线的形状表示性能分布,线的高度表示对数损失下的相对数据点计数。例如,在segment_1的model_1上,对数损失为1.5,点的均值低,但十分密集。

Manifold还提供了功能归因视图:

为了下个项目的质量!每个数据科学家都应该学会这两种工具

功能归因视图强调每个片段的功能分布。在上面的示例中,数据组0包含聚类2和3,将其与包含聚类0和1的数据组1进行比较。x轴是特征值,而y轴是原因的强度。Feature_0高亮显示这些差异,而Feature_1高亮显示特征值的直方图。

那么,如何把Manifold融入项目?

Manifold还处在早期研发阶段,还得继续调bug。但是,这不该妨碍你在项目中使用它。就个人情况来说,我需要弄几个安装包才能在Jupyter Notebook上运行它。

!jupyter nbextension install --py --sys-prefix widgetsnbextension!jupyter nbextension enable --py --sys-prefix widgetsnbextension!pip install mlvis!jupyter nbextension install --py --symlink --sys-prefix mlvis!jupyter nbextension enable --py --sys-prefix mlvis

仅仅安装nbextention包是不够的,我还必须启用这些软件包。可以在这里导入一些demo工具:

from mlvis import Manifoldimport sys, json, mathfrom random import uniform

要使用Manifold框架,数据需要分成三组特定格式。第一组是所有必须在字典列表中的x值:

#Example of x-valuesx = [ {'feature_0': 21, 'feature_1': 'B'}, {'feature_0': 36, 'feature_1': 'A'}]

第二组是不同的模型预测,它必须是列表的列表,每个列表都是不同模型的预测:

#Example of model predictionsyPred = [ [{'false': 0.1, 'true': 0.9}, {'false':0.8, 'true': 0.2}], [{'false': 0.3, 'true': 0.7}, {'false':0.9, 'true': 0.1}], [{'false': 0.6, 'true': 0.4}, {'false':0.4, 'true': 0.6}]]

最后一组是ground truth值或实际正确的y值,它们在列表值中:

#Example of ground truthyTrue = [ 'true', 'false']

数据一旦采用这种格式,值就可以输入到Manifold对象中,操作进行Widget,有些类似于上面的例子:

Manifold(props={'data': { 'x': x, 'yPred': yPred, 'yTrue': yTrue}})

然后使用Manifold就能直观地评估不同模型对相同数据的表现了。这对于构建集成非常有帮助,因为它使我能够了解哪些模型在哪里执行,哪些数据集群是模型最难分类的。Manifold同样帮我评估了集成中每个模型的预测多样性,使我能构建一个更强大、能分类一系列不同输入数据的设备。

为了下个项目的质量!每个数据科学家都应该学会这两种工具

相关推荐