本文转载自公众号“读芯术”(ID:AI_Discovery)。
使用机器学习模型越久,就越能意识到,正确了解模型当下的运行目的及效果有多重要。在实践中,即便是在最佳情况下,跟踪模型的运行情况(尤其是在测试各种模型参数组合时)都十分繁琐。大多数情况下,我都会构建自己的工具来调试和分析机器学习模型。
最近,在为MAFAT的多普勒脉冲雷达分类挑战设计各种模型的时候,我发觉自己手动构建模型调试工具就是在浪费时间,而搭建集成(组合大多数分类策略的机器学习模型,搭对了就会带来极大效用)时尤为繁琐。
创建集成的问题就是,各种模型及分类都需要让策略奏效。这就意味着要训练更多的模型、进行更多的分析、了解更多关于整体精度及模型性能的参数。同样,这就要求我花更多的时间创建自己的调试工具和策略。
为了更好地利用时间和资源,我决定使用一系列可用的在线工具来调试和分析机器学习模型。测试了几个工具后,我成功缩减了清单:开发或改进机器学习模型时,每个数据科学家都应考虑这两个超赞的工具。
Weights & Biases
Weights &Biases图表跟踪验证集内各种具有不同参数的模型的性能。Y轴表示精度,X轴表示训练回合数。
Weights & Biases(W&B)是一家总部位于旧金山的公司,提供一系列能无缝融入现有或新项目的深度学习及机器学习工具。它主要是跟踪项目中模型变化的实时性能,简直太管用了。
我在做项目时,常常就追踪问题手足无措:何时进行了哪些更改?这些更改对项目的各种评估指标是否产生了正面或负面影响?而W&B能用以多种方式存储并可视化这些评估指标,其中最有效的就是图表和表格:
模型数据存储在可导出表格中,以便在W&B网站上进行排序和评估。
如你所见,折线图表示在训练期间使用不同指标跟踪各种模型的性能。这样便能进行无缝并排比较,以检查过拟合或检查验证集上表现最佳的模型等。
W&B如何与项目关联?
在W&B网站上创建账户后,必须在本地环境下安装并登录到个人页面。
- !pip install --upgrade wandb
- !wandb login <Your login code>
深度学习或者机器学习工具不同,情况也可能不同。我用Keras,但其它项目的文档会更清晰,也易于执行:
- #Import the package
- import wandb
- from wandb.keras import WandbCallback#Initialize the W&B object
- wandb.init(project="tester")#Link the model with W&B’stracking metrics
- model.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 Manifold
- import sys, json, mathfrom random import uniform
要使用Manifold框架,数据需要分成三组特定格式。第一组是所有必须在字典列表中的x值:
- #Example of x-values
- x = [
- {'feature_0': 21, 'feature_1': 'B'},
- {'feature_0': 36, 'feature_1': 'A'}
- ]
第二组是不同的模型预测,它必须是列表的列表,每个列表都是不同模型的预测:
- #Example of model predictions
- yPred = [
- [{'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 truth
- yTrue = [
- 'true', 'false'
- ]
数据一旦采用这种格式,值就可以输入到Manifold对象中,操作进行Widget,有些类似于上面的例子:
- Manifold(props={'data': {
- 'x': x,
- 'yPred': yPred,
- 'yTrue': yTrue
- }})
然后使用Manifold就能直观地评估不同模型对相同数据的表现了。这对于构建集成非常有帮助,因为它使我能够了解哪些模型在哪里执行,哪些数据集群是模型最难分类的。Manifold同样帮我评估了集成中每个模型的预测多样性,使我能构建一个更强大、能分类一系列不同输入数据的设备。
图源:unsplash
对我来说,上述两种工具真的是越来越有用了。它们可以帮我应对这一挑战并切实改善设备的性能,希望读者也能用这些工具来创建更好的模型。