Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

VK作者磐创AI团队出品出品奇予纪编辑

Rasa 聊天机器人专栏(下)

模型评估

NLU模型评估

机器学习中的标准技术是将一些数据作为测试集分开。你可以使用以下方法将NLU训练数据拆分为训练集和测试集:

rasa data split nlu
如果你已经这样做了,你可以使用此命令查看你的NLU模型预测测试用例的情况:
rasa test nlu -u test_set.md --model models/nlu-20180323-145833.tar.gz
如果你不想创建单独的测试集,可以使用交叉验证来估计模型的泛化能力。为此,请添加参数--cross-validation
rasa test nlu -u data/nlu.md --config config.yml --cross-validation
该命名的完整参数列表如下:
用法: rasa test nlu [-h] [-v] [-vv] [--quiet] [-m MODEL]  [-u NLU] [--out OUT]
                     [--report [REPORT]] [--successes [SUCCESSES]]
                     [--errors ERRORS] [--histogram HISTOGRAM]
                     [--confmat CONFMAT] [-c CONFIG [CONFIG ...]]
                     [--cross-validation] [-f FOLDS] [-r RUNS]
                     [-p PERCENTAGES [PERCENTAGES ...]]

可选参数:
 -h, --help     显示帮助消息并退出。
 -m MODEL, --model MODEL
                已训练的Rasa模型的路径。如果目录指定,它将使用目录中的最新的模型。(默认:None)
  -u NLU, --nlu NLU     包含你的NLU模型的文件或是文件夹(默认: data)
 --out OUT     在评估期间创建的任何文件的输出路径。(默认:results)
 --report [REPORT]
                用于保存意图/实体度量报告的输出路径。(默认:None)
 --successes [SUCCESSES]
                保存成功预测的输出路径。(默认:None)
 --errors ERRORS
                保存模型错误的输出路径。(默认:errors.json)
 --histogram HISTOGRAM
                置信直方图的输出路径。(默认:hist.png)
 --confmat CONFMAT
                混淆矩阵图的输出路径。(默认:confmat.png)
 -c CONFIG [CONFIG ...], --config CONFIG [CONFIG ...]
                模型配置文件。如果传递单个文件并选择交叉验证模式,交叉验证执行,如果传递多个配置或配置的文件夹,模型将直接被训练和比较。(默认:None)

Python日志选项:
 -v, --verbose  详细输出。将日志记录级别设置为INFO。(默认:None)
 -vv, --debug   打印大量的调试语句。设置日志记录级别为 DEBUG。(默认:None)
 --quiet        将日志记录级别设置为WARNING。(默认:None) 

交叉验证:
 --cross-validation
                打开交叉验证模式。任何提供的模型将被忽略。(默认值:False)
-f FOLDS, --folds FOLDS
                交叉验证折叠数。(默认值:10)

比较模式:
-r RUNS, --runs RUNS
                要进行的比较运行次数。(默认值:3)
-p PERCENTAGES [PERCENTAGES ...], --percentages PERCENTAGES [PERCENTAGES ...]    
                在比较期间排除的训练数据的百分比。(默认:[0,25,50,75])

比较NLU管道

通过将多个管道配置(或包含它们的文件夹)传递给CLI,Rasa将在管道之间进行比较检查。

$ rasa test nlu --config pretrained_embeddings_spacy.yml supervised_embeddings.yml
  --nlu data/nlu.md --runs 3 --percentages 0 25 50 70 90

上例中的命令将根据你的数据创建一个训练/测试划分,然后多次训练每个管道,其中分别从训练集中排除0,25,50,70和90%的意图数据,然后在测试集上评估模型,并记录每个排除百分比的f1-score。该过程运行三次(即总共有3个测试集),然后使用f1-score的平均值和标准偏差绘制图表。

f1-score图表、所有训练/测试集、训练模型、分类和错误报告将保存到名为nlu_comparison_results的文件夹中。

意图分类

评估命令将为你的模型生成报告,混淆矩阵和置信度直方图。

该报告记录每个意图和实体的精确度,召回率和f1度量,并提供总体平均值。你可以使用--report参数将这些报告另存为JSON文件。

混淆矩阵向你显示哪些意图被误认为是其他意图;任何错误预测的样本都会被记录并保存到名为errors.json的文件中,以便于调试。

命令生成的直方图允许你可视化所有预测的置信度分布,其中正确和错误预测的大小分别由蓝色和红色条显示。提高训练数据的质量会使蓝色直方图条向右移动,红色直方图条移动到图的左侧。

注意:只有在测试集上评估模型时,才会创建混淆矩阵。在交叉验证模式下,将不会生成混淆矩阵。

警告:如果你的任何实体被错误地注释,你的评估可能会失败。一个常见问题是实体无法在标记内停止或启动。例如,如果你有一个name实体的示例,如  [Brian](name)'s house,这仅在你的标记器将Brian's分成多个标记时才有效。在这种情况下,空格标记器不起作用。

实体提取

CRFEntityExtractor是你使用自己的数据训练的唯一实体提取器,因此是唯一将被评估的实体提取器。如果你使用spaCy或预训练实体提取器,Rasa NLU将不会在评估中包含这些。

Rasa NLU将报告训练过的CRFEntityExtractor识别的每种实体类型的召回率,精确率和f1度量。

实体评分

为了评估实体提取,我们应用一种简单的基于标签的方法。我们不考虑BILOU标记,而只考虑每个标记的实体类型标记。对于像“near Alexanderplatz”这样的位置实体,我们期望标记为LOC LOC而不是基于BILOU的B-LOC L-LOC。我们的方法在评估时更宽松,因为它奖励部分提取并且不惩罚实体的分裂。例如,鉴于上述实体“near Alexanderplatz”和提取“Alexanderplatz”的系统,我们的方法奖励“Alexanderplatz”的提取并惩罚遗漏输出的“near”单词。然而,基于BILOU的方法将此标记为完全失败,因为它期望“Alexanderplatz”作为最后一个标记被标记为实体(L-LOC)而不是单个标记实体(U-LOC)。另请注意,“near”和“Alexanderplatz”的分割提取将在我们的方法上获得满分,在基于BILOU的方法上获得零分。

以下是这两个评分机制对于短语“near Alexanderplatz tonight”的比较:

评估Core模型

你可以使用评估命令在一组测试故事中评估训练模型:

 rasa test core --stories test_stories.md --out results
这会将失败的故事打印到results/failed_stories.md。如果至少有一个操作被错误预测,我们会将任何故事视为失败。
此外,这会将混淆矩阵保存到名为results/story_confmat.pdf的文件中。对于你域中的每个操作,混淆矩阵会显示操作的正确预测频率以及预测错误操作的频率。
该命令的完整选项列表如下:
用法: rasa test core [-h] [-v] [-vv] [--quiet] [-m MODEL [MODEL ...]]
                      [-s STORIES] [--max-stories MAX_STORIES] [--out OUT]
                      [--e2e] [--endpoints ENDPOINTS]
                      [--fail-on-prediction-errors] [--url URL]
                      [--evaluate-model-directory]

可选参数:
 -h, --help     显示帮助消息并退出。

-m MODEL [MODEL ...], --model MODEL [MODEL ...]
                预训练模型的路径。如果是'tar.gz'文件m将使用该模型文件。如果是目录,将使用该目录中的最新模型。(例外:' --   validate-model-directory'标志已设置)。如果提供了多个'tar.gz'文件,那么所有这些文件模型将被比较。(默认:[None])

-s STORIES, --stories STORIES
                包含测试故事的文件或文件夹。(默认:data)
--max-stories MAX_STORIES
                要测试的最大故事数。(默认:None)
--out OUT       在评估期间创建的任何文件的输出路径。(默认:result)
--e2e, --end-to-end   
                对联合操作和意图预测进行端到端评估。需要端到端的故事文件式。(默认值:False)
--endpoints ENDPOINTS
                连接器的配置文件为yml文件。(默认:None)
--fail-on-prediction-errors
                如果预测错误,会抛出异常。这可以用来在测试期间验证故事。
                (default: False)
--url URL       如果提供,则从URL下载故事文件并训练就可以了。通过发送GET请求到提供的URL获取数据。(默认:None)
--evaluate-model-directory
                 通过`rasa train core --config <config-1> <config-2>`设置评估已训练的模型。所有在提供的目录中模型被评估和互相比较。(默认值:False)

Python日志选项:
 -v, --verbose  详细输出。将日志记录级别设置为INFO。(默认:None)
 -vv, --debug   打印大量的调试语句。设置日志记录级别为 DEBUG。(默认:None)
 --quiet        将日志记录级别设置为WARNING。(默认:None) 

比较策略

要选择特定的策略配置,或选择特定策略的超参数,你需要衡量Rasa Core泛化以前从未见过的对话的程度。特别是在项目的开始阶段,你没有很多真正的对话来用来训练你的机器人,所以你不想划分一些用作测试集。

Rasa Core有一些脚本可帮助你选择和微调策略配置。只要你愿意,你就可以在完整数据集上训练最终配置。要做到这一点,首先必须针对不同的策略训练模型。创建两个(或更多)配置文件,包括要比较的策略(每个只包含一个策略),然后使用训练命令的compare模式训练模型:

$ rasa train core -c config_1.yml config_2.yml \
  -d domain.yml -s stories_folder --out comparison_models --runs 3 \
  --percentages 0 5 25 50 70 95

对于提供的每个策略配置,Rasa Core将进行多次训练,每次分别将0,5,25,50,70和95%的训练故事排除在训练数据之外。这是多次运行完成的,以确保一致的结果。

上面的命令运行完成后,你可以使用评估命令在compare模式下来评估刚训练的模型:

$ rasa test core -m comparison_models --stories stories_folder
--out comparison_results --evaluate-model-directory

这将评估训练集上的每个模型,并绘制一些图表以显示哪个策略表现最佳。通过在整个故事集上评估,你可以衡量Rasa Core对预测故事的预测效果。

如果你不确定要比较哪些策略,我们建议你尝试使用EmbeddingPolicyKerasPolicy来查看哪种策略更适合你。

注意:这个训练过程可能需要很长时间,所以我们建议让它在后台运行,不能中断

专业用户独享

本文为机器之心深度精选内容,专业认证后即可阅读全文
开启专业认证
工程聊天机器人
2
相关数据
混淆矩阵技术

混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。矩阵的每一行表示预测类中的实例,而每一列表示实际类中的实例(反之亦然)。 这个名字源于这样一个事实,即很容易看出系统是否混淆了两个类。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

数据库技术

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

模型选择技术

模型选择是从给定数据的一组候选模型中选择统计模型的任务。对于具有类似预测或解释力的候选模型,最简单的模型最有可能是最佳选择(奥卡姆剃刀)。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

暂无评论
暂无评论~