Rasa 模型评估【6】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
本文是全系列中第1 / 10篇:Rasa 聊天机器人
- Rasa 模型评估【6】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 消息和语音通道【5】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 架构【4】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 命令行界面【3】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 教程【2】-Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 云存储【10】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 安装【1】-Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- 在Docker上运行Rasa【9】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 运行服务【8】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
- Rasa 验证数据【7】—Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽
模型评估
注意:
如果你希望调整NLU模型的超参数,请查看本教程。
NLU模型评估
机器学习中的标准技术是将一些数据作为测试集分开。你可以使用以下方法将NLU训练数据拆分为训练集和测试集:
[code lang=text]
rasa data split nlu
[/code]
如果你已经这样做了,你可以使用此命令查看你的NLU模型预测测试用例的情况:
[code lang=text]
rasa test nlu -u test_set.md –model models/nlu-20180323-145833.tar.gz
[/code]
如果你不想创建单独的测试集,可以使用交叉验证来估计模型的泛化能力。为此,请添加参数--cross-validation
:
[code lang=text]
rasa test nlu -u data/nlu.md –config config.yml –cross-validation
[/code]
该命名的完整参数列表如下:
[code lang=text]
用法: 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])
[/code]
比较NLU管道
通过将多个管道配置(或包含它们的文件夹)传递给CLI,Rasa将在管道之间进行比较检查。
[code lang=text]
$ rasa test nlu –config pretrained_embeddings_spacy.yml supervised_embeddings.yml
–nlu data/nlu.md –runs 3 –percentages 0 25 50 70 90
[/code]
上例中的命令将根据你的数据创建一个训练/测试划分,然后多次训练每个管道,其中分别从训练集中排除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”的比较:
提取结果 | 简单标签(得分) | BILOU标签(得分) |
---|---|---|
[near Alexanderplatz](loc) [tonight](time) |
loc loc time (3) | B-loc L-loc U-time (3) |
[[near](loc) [Alexanderplatz](loc) [tonight](time) |
loc loc time (3) | U-loc U-loc U-time (1) |
near [Alexanderplatz](loc) [tonight](time) |
O loc time (2) | O U-loc U-time (1) |
[near](loc) Alexanderplatz [tonight](time) |
loc O time (2) | U-loc O U-time (1) |
[near Alexanderplatz tonight](loc) |
loc loc loc (2) | B-loc I-loc L-loc (1) |
评估Core模型
你可以使用评估命令在一组测试故事中评估训练模型:
[code lang=text]
rasa test core –stories test_stories.md –out results
[/code]
这会将失败的故事打印到results/failed_stories.md
。如果至少有一个操作被错误预测,我们会将任何故事视为失败。
此外,这会将混淆矩阵保存到名为results/story_confmat.pdf
的文件中。对于你域中的每个操作,混淆矩阵会显示操作的正确预测频率以及预测错误操作的频率。
该命令的完整选项列表如下:
[code lang=text]
用法: 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)
[/code]
比较策略
要选择特定的策略配置,或选择特定策略的超参数,你需要衡量Rasa Core泛化以前从未见过的对话的程度。特别是在项目的开始阶段,你没有很多真正的对话来用来训练你的机器人,所以你不想划分一些用作测试集。
Rasa Core有一些脚本可帮助你选择和微调策略配置。只要你愿意,你就可以在完整数据集上训练最终配置。要做到这一点,首先必须针对不同的策略训练模型。创建两个(或更多)配置文件,包括要比较的策略(每个只包含一个策略),然后使用训练命令的compare
模式训练模型:
[code lang=text]
$ 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
[/code]
对于提供的每个策略配置,Rasa Core将进行多次训练,每次分别将0,5,25,50,70和95%的训练故事排除在训练数据之外。这是多次运行完成的,以确保一致的结果。
上面的命令运行完成后,你可以使用评估命令在compare
模式下来评估刚训练的模型:
[code lang=text]
$ rasa test core -m comparison_models –stories stories_folder
–out comparison_results –evaluate-model-directory
[/code]
这将评估训练集上的每个模型,并绘制一些图表以显示哪个策略表现最佳。通过在整个故事集上评估,你可以衡量Rasa Core对预测故事的预测效果。
如果你不确定要比较哪些策略,我们建议你尝试使用EmbeddingPolicy
和KerasPolicy
来查看哪种策略更适合你。
注意:
这个训练过程可能需要很长时间,所以我们建议让它在后台运行,不能中断
端到端评估
Rasa允许你端到端地评估对话,运行测试对话并确保NLU和Core都能做出正确的预测。
为此,你需要一些端到端格式的故事,其中包括NLU输出和原始文本。比如:
[code lang=text]
## end-to-end story 1
* greet: hello
– utter_ask_howcanhelp
* inform: show me [chinese](cuisine) restaurants
– utter_ask_location
* inform: in [Paris](location)
– utter_ask_price
[/code]
如果你将端到端故事保存为名为e2e_stories.md
的文件,则可以通过运行以下命令指定文件评估你的模型:
[code lang=text]
$ rasa test –stories e2e_stories.md –e2e
[/code]
*注意:
确保models
的模型文件是组合Core和NLU模型。如果它不包含NLU模型,Core将使用默认的RegexInterpreter
。
Rasa 英文网站:https://rasa.com/
Rasa 中文官方文档,聊天机器人,上下文管理,多伦对话,意图识别,填槽,中文聊天机器人开发必备手册:
http://rasachatbot.com/
磐创AI-中文聊天机器人
http://panchuangai.com/
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2019/08/31/rasa_evaluating_models/