Rasa 聊天機器人專欄(下)

磐創AI發表於2020-02-13

模型評估

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”的比較:

Rasa 聊天機器人專欄(下)

評估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來檢視哪種策略更適合你。

注意:這個訓練過程可能需要很長時間,所以我們建議讓它在後臺執行,不能中斷

相關文章