您使用机器学习模型的时间越长,您就越会意识到正确理解模型在做什么以及它的表现有多重要。实际上,即使在最好的情况下,跟踪模型的性能也可能很乏味,尤其是在测试模型参数的各种组合时。大多数情况下,我构建自己的工具来调试和分析机器学习模型。最近,在为MAFAT的多普勒脉冲雷达分类挑战设计各种模型时,我发现自己通过手动构建模型调试工具浪费时间,构建集成(结合大多数分类策略的机器学习模型,正确的将带来很大的实用性)尤其繁琐。创建集成的问题在于,该策略需要各种模型和分类才能发挥作用。这意味着训练更多的模型,进行更多的分析,并了解更多关于整体准确性和模型性能的参数。同样,这需要我花更多时间创建自己的调试工具和策略。为了更好地利用时间和资源,我决定使用一系列可用的在线工具来调试和分析机器学习模型。在测试了一些工具之后,我设法缩小了我的列表:这是每个数据科学家在开发或改进机器学习模型时都应该考虑的两个很棒的工具。权重和偏差权重和偏差图表跟踪验证集中具有不同参数的各种模型的性能。Y轴代表准确率,X轴代表训练轮数。Weights&Biases(W&B)是一家位于旧金山的公司,提供一系列深度学习和机器学习工具,可无缝融入现有或新项目。它主要是关于跟踪项目中模型更改的实时性能,并且效果很好。当我在做一个项目时,当涉及到跟踪时,我常常不知所措:什么时候发生了什么变化?这些变化是否对项目的各种指标产生了积极或消极的影响?W&B可以通过多种方式存储和可视化这些指标,其中最有效的是图表和表格:使用W&B工具跟踪和可视化的样本模型数据,用于对各种指标进行并排比较,存储在可导出的表格中,用于排序和W&B网站上的评估。如您所见,折线图表示在训练期间使用不同指标跟踪的各种模型的性能。这允许无缝并排比较以检查过度拟合或检查验证集上性能最佳的模型等。W&B与项目有何关联?在W&B网站创建账号后,必须在本地安装环境,登录个人页面。!pipinstall--upgradewandb!wandblogin根据深度学习或机器学习工具的不同,情况可能会有所不同。我使用Keras,但其他项目的文档将更清晰且更易于执行:#Importthepackageimportwandbfromwandb.kerasimportWandbCallback#InitializetheW&Bobjectwandb.init(project="tester")#LinkthemodelwithW&B'strackingmetricsmodel.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和ToyotaResearch这样的大公司经常使用它,称赞它是一种灵活有用的项目工具。Uber的Manifold图片来源:unsplash我正在一个项目中创建集成。集成是不同算法的集合,每个算法都对相同的数据进行训练并提供预测。集成的优势在于它提供了一系列不同的策略来寻找解决方案,并使用多数投票来使所有模型的分类民主化。这很有用,因为虽然单个模型可以很好地预测数据的某些部分,但它可能在其他部分不堪重负。在机器学习中,“集成就是数字力量”。为了使整体表现良好,构成整体的各个模型必须能够做出不同的预测。多样化的预测,即并非所有模型都可以对某些数据做出完全相同的预测;他们应该能够对不同的数据做出准确的预测。然而,这也带来了一个问题:你怎么知道合奏正在做出不同的预测?看看交通技术巨头Uber的Manifold就知道了。Uber的Manifold是一个开源的长期项目,旨在为调试机器学习提供可视化工具(模型长什么样并不重要)。通俗地说,Manifold允许您查看哪个模型在数据子集上表现不佳,以及哪些特征导致性能不佳。集成可以提供很多帮助。它创建了一个Widget输出,可以在Notebook中与之交互以进行快速分析。请注意,此工具目前仅适用于经典JupyterNotebook计算机。它不在JupyterLab或Google的Colab上运行。Manifold使用k-means聚类——一种邻近分组技术,将预测数据分成具有相似性能的部分。想象一下,将数据分成相似的子类,然后沿着每个部分绘制模型,模型越靠左,它在该部分上的表现就越好。这可以在随机生成的例子中看到:在上面的例子中有三个模型,输入数据被分成四个部分。以对数损失(log-loss)作为性能指标,我们可以看到model_1在segment_0上表现不佳,而model_2在segment_2上表现不佳。线的形状代表性能分布,线的高度代表对数损失下的相对数据点数。例如,在segment_1的model_1上,logloss为1.5,点的均值较低,但非常密集。Manifold还提供了功能属性视图:功能属性视图强调每个片段的功能分布。在上面的示例中,数据集0包含聚类2和3,将其与包含聚类0和1的数据集1进行比较。x轴是特征值,y轴是原因的强度。Feature_0突出显示这些差异,而Feature_1突出显示特征值的直方图。那么,如何将Manifold集成到项目中呢?Manifold还处于早期开发阶段,bug还需要调试。但是,这不应阻止您在项目中使用它。就个人而言,我需要安装几个包才能在JupyterNotebook上运行它。!jupyternbextensioninstall--py--sys-prefixwidgetsnbextension!jupyternbextensionenable--py--sys-prefixwidgetsnbextension!pipinstallmlvis!jupyternbextensioninstall--py--symlink--sys-prefixxmlvis!jupyternbextensionenable--py--sys-prefixmlvis只安装nbextension包是的还不够,我还必须启用这些包。这里可以导入一些demo工具:frommlvisimportManifoldimportsys,json,mathfromrandomimportuniform要使用Manifold框架,需要将数据分成三种特定的格式。第一组是必须在字典列表中的所有x值:#Exampleofx-valuesx=[{'feature_0':21,'feature_1':'B'},{'feature_0':36,'feature_1':'A'}]第二组是不同的模型预测,它必须是列表的列表,每个列表是不同模型的预测:#ExampleofmodelpredictionsyPred=[[{'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}]]最后一组是groundtruth值或者实际正确的y值,在列表值中:#ExampleofgroundtruthyTrue=['true','false']一旦数据是这种格式,就可以将值输入到Manifold对象中,作为一个Widget进行操作,有点类似于上面的例子:Manifold(props={'data':{'x':x,'yPred':yPred,'yTrue':yTrue}})然后使用Manifold直观地评估不同模型在相同数据上的性能。这对构建集成非常有帮助,因为它让我可以看到哪些模型在何处执行以及哪些数据集群是模型最难分类的。Manifold还帮助我评估了集成中每个模型的预测多样性,使我能够构建一个更强大的设备,可以对一系列不同的输入数据进行分类。来源:unsplash对我来说,以上两个工具真的是越来越好用了。它们帮助我应对了这一挑战并实际提高了我设备的性能,我希望读者也能使用这些工具来创建更好的模型。