階實(shí)踐)
Weka系列寫到第五篇前四篇我們一直在Explorer里打轉(zhuǎn)。Explorer是真好用選數(shù)據(jù)、選算法、點(diǎn)一下Start就出結(jié)果但用上幾輪你一定會(huì)遇到兩個(gè)問題一是這些操作過程沒有地方保存想復(fù)現(xiàn)某次實(shí)驗(yàn)結(jié)果只能靠截圖、靠筆記、靠記憶二是數(shù)據(jù)量稍微大一點(diǎn)Explorer加載起來就像拖著一塊鐵板頁(yè)面轉(zhuǎn)圈轉(zhuǎn)到讓人懷疑人生。今天要聊的KnowledgeFlow就是專門解決這兩類問題而存在的。它把從讀數(shù)據(jù)、洗數(shù)據(jù)、跑算法到看結(jié)果整條鏈路搬到一張畫布上用節(jié)點(diǎn)和連線把流程搭出來執(zhí)行一次就能把整條實(shí)驗(yàn)路徑完整固化下來?yè)Q數(shù)據(jù)、改參數(shù)、換算法都可以直接在流程上改。這篇文章適合剛把Explorer摸熟、想往正經(jīng)實(shí)驗(yàn)管理方向走的人也適合每天要反復(fù)跑模型、需要批量處理數(shù)據(jù)的人。1. Explorer很好用但這兩個(gè)場(chǎng)景它確實(shí)頂不住1.1 你只能記住“你點(diǎn)過什么”記不住“你為什么要這樣點(diǎn)”Explorer界面的操作邏輯是一次性的打開某個(gè)數(shù)據(jù)集、選某個(gè)過濾器、換某個(gè)分類器、點(diǎn)Start、看結(jié)果全部過程中產(chǎn)生的操作路徑只有你自己知道。一旦你關(guān)掉Weka下次再想用同樣的參數(shù)組合只能重新在界面里一步一步點(diǎn)。更麻煩的是當(dāng)你要做對(duì)照實(shí)驗(yàn)——同一個(gè)數(shù)據(jù)集跑J48和NaiveBayes或者對(duì)比歸一化前后效果你得手動(dòng)切換、重新加載、重新點(diǎn)Start稍不留神就忘了某個(gè)參數(shù)改過沒有。KnowledgeFlow的思路完全不同。它把所有環(huán)節(jié)畫成一張流程圖讀數(shù)據(jù)的節(jié)點(diǎn)、做清洗的節(jié)點(diǎn)、跑分類的節(jié)點(diǎn)、看結(jié)果的節(jié)點(diǎn)一目了然。你搭好一次流程后以后每次打開布局文件就是把上一次的實(shí)驗(yàn)環(huán)境原封不動(dòng)恢復(fù)出來。連數(shù)據(jù)路徑、算法參數(shù)、評(píng)估方式都在里面。對(duì)需要寫實(shí)驗(yàn)報(bào)告、做復(fù)盤、跑周期性模型的人來說這種可復(fù)現(xiàn)的流程記錄價(jià)值相當(dāng)大。1.2 數(shù)據(jù)太大Explorer會(huì)直接卡給你看Explorer打開數(shù)據(jù)集的邏輯是全量載入內(nèi)存數(shù)據(jù)一多等待時(shí)間就會(huì)很難受。而且很多時(shí)候你只是想快速驗(yàn)證一條處理鏈路并不想反復(fù)把同一份大數(shù)據(jù)文件讀進(jìn)內(nèi)存。KnowledgeFlow明顯更輕盈它對(duì)流程中每個(gè)節(jié)點(diǎn)做了更靈活的調(diào)度你可以只讓數(shù)據(jù)流經(jīng)某條分支也可以在需要時(shí)才觸發(fā)某些節(jié)點(diǎn)執(zhí)行。如果你面對(duì)的是幾十MB甚至GB級(jí)別的數(shù)據(jù)Explorer幾乎是一種折磨而KnowledgeFlow至少給了你一個(gè)結(jié)構(gòu)化的思路一次讀取多個(gè)下游節(jié)點(diǎn)復(fù)用同一份數(shù)據(jù)也可以配合Weka支持的增量學(xué)習(xí)能力對(duì)超大數(shù)據(jù)集做流式處理。這一點(diǎn)后面我會(huì)專門展開講。2. KnowledgeFlow的界面和五個(gè)核心概念2.1 左側(cè)的節(jié)點(diǎn)庫(kù)先認(rèn)識(shí)八類節(jié)點(diǎn)在GUI Chooser里啟動(dòng)KnowledgeFlow會(huì)看到一個(gè)空白畫布左側(cè)是一棵可展開的樹里面把節(jié)點(diǎn)按功能分類。第一次打開的人容易被密密麻麻的節(jié)點(diǎn)嚇到其實(shí)核心就八類節(jié)點(diǎn)分類作用常見節(jié)點(diǎn)DataSources讀取數(shù)據(jù)作為流程起點(diǎn)ArffLoader、CsvLoader、DatabaseLoaderDataSinks把數(shù)據(jù)或結(jié)果寫出ArffSaver、CsvSaverFilters數(shù)據(jù)預(yù)處理Normalize、Standardize、Remove、ReplaceMissingValuesClassifiers分類模型J48、NaiveBayes、ZeroRClusterers聚類模型SimpleKMeans、EMEvaluators評(píng)估模型效果ClassifierPerformanceEvaluator、CrossValidationEvaluatorVisualization可視化數(shù)據(jù)與結(jié)果DataVisualizer、ScatterPlot、TextViewer、AttributeSummarizerTools輔助工具數(shù)據(jù)轉(zhuǎn)換節(jié)點(diǎn)、訓(xùn)練測(cè)試集切分節(jié)點(diǎn)等我的建議是先從DataSources、Classifiers、Evaluators、Visualization這四類入手搭通一條最簡(jiǎn)單的流程后再慢慢加Filters和Tools。KnowledgeFlow里的節(jié)點(diǎn)很多但絕大多數(shù)是同一個(gè)思想在不同場(chǎng)景下的變體核心邏輯是一樣的。2.2 連線不只是“連上去”還得分清連接類型知識(shí)流和普通畫圖軟件最大的不同在于連接線是有語(yǔ)義的。你把一個(gè)節(jié)點(diǎn)的輸出拖到另一個(gè)節(jié)點(diǎn)的輸入時(shí)Weka會(huì)彈窗讓你選擇“這個(gè)連接到底在傳什么類型的數(shù)據(jù)”。比如ArffLoader輸出的是DataSet而J48需要的是TrainingSet和TestSet。數(shù)據(jù)源節(jié)點(diǎn)到J48的連線實(shí)際上是在往它的某個(gè)輸入端口灌數(shù)據(jù)。所以這條規(guī)則要記牢連線的價(jià)值不只是畫一條線而是明確“上游輸出什么、下游接收什么”。常見的連接類型包括DataSet、TrainingSet、TestSet、BatchClassifier、Performance成set等。如果兩個(gè)端口之間的類型不匹配連線根本拉不上去或者連接后下游節(jié)點(diǎn)不執(zhí)行。很多新手卡在“為什么我連了線還是不出結(jié)果”八成就是端口類型沒選對(duì)。2.3 執(zhí)行控制與狀態(tài)展示Restart、Play、StepKnowledgeFlow頂部工具欄提供了Restart、Stop、Play、Step這幾個(gè)執(zhí)行控制按鈕它們的邏輯和播放器有點(diǎn)像Restart把整條流程重置到初始狀態(tài)所有節(jié)點(diǎn)的歷史執(zhí)行結(jié)果清空數(shù)據(jù)源會(huì)重新讀取。改動(dòng)了流程結(jié)構(gòu)或參數(shù)后建議都先Restart再Play避免下游節(jié)點(diǎn)拿舊數(shù)據(jù)做新計(jì)算。Play從當(dāng)前狀態(tài)開始執(zhí)行所有沒有正確結(jié)果的節(jié)點(diǎn)。正常情況下點(diǎn)一次Play整條鏈路會(huì)陸續(xù)跑完。Step一步一步執(zhí)行。每一步會(huì)只執(zhí)行一個(gè)節(jié)點(diǎn)適合排查某個(gè)具體環(huán)節(jié)的問題。Stop終止當(dāng)前正在執(zhí)行的節(jié)點(diǎn)。界面上并不總是能明顯看出某個(gè)節(jié)點(diǎn)跑沒跑完最直觀的判斷方式是看右下角日志面板。每條日志會(huì)寫明哪個(gè)節(jié)點(diǎn)開始執(zhí)行、耗時(shí)多少、有沒有報(bào)錯(cuò)。我后來幾乎不看圖標(biāo)顏色只看日志因?yàn)椴煌琖eka版本里節(jié)點(diǎn)狀態(tài)的樣式不完全一樣日志才是統(tǒng)一可靠的依據(jù)。3. 搭一條最簡(jiǎn)單的分類流水線Iris全流程走查3.1 需要的節(jié)點(diǎn)清單和為什么這么選紙上談兵沒有意義我們直接動(dòng)手搭一條最經(jīng)典的分類流水線。我用的是Weka自帶的iris數(shù)據(jù)集它小、干凈、類別少適合驗(yàn)證流程。需要拖進(jìn)畫布的節(jié)點(diǎn)如下兩個(gè)ArffLoader一個(gè)讀訓(xùn)練集一個(gè)讀測(cè)試集。實(shí)際使用中你可以把同一個(gè)arff文件分別指給兩個(gè)Loader也可以一個(gè)用train.arff一個(gè)用test.arff。一個(gè)J48分類器決策樹算法參數(shù)少跑得快用來驗(yàn)證KnowledgeFlow的連線邏輯非常合適。一個(gè)ClassifierPerformanceEvaluator負(fù)責(zé)把分類器的預(yù)測(cè)結(jié)果做成評(píng)估報(bào)告。一個(gè)TextViewer展示評(píng)估報(bào)告文本。一個(gè)DataVisualizer可視化訓(xùn)練集的數(shù)據(jù)結(jié)構(gòu)幫助我們驗(yàn)證數(shù)據(jù)有沒有被正確讀取。這套組合是最小可用配置兩個(gè)數(shù)據(jù)源負(fù)責(zé)喂數(shù)據(jù)分類器負(fù)責(zé)建模評(píng)估器負(fù)責(zé)算指標(biāo)兩個(gè)顯示節(jié)點(diǎn)負(fù)責(zé)把結(jié)果攤開看。3.2 一條條連線怎么連訓(xùn)練集、測(cè)試集、batchClassifier節(jié)點(diǎn)拖進(jìn)來之后連線才是重點(diǎn)。下面按實(shí)際連接順序走一遍首先把第一個(gè)ArffLoader的輸出端口DataSet拖到J48的輸入端口上此時(shí)會(huì)彈出選擇連接類型的對(duì)話框。這里要選TrainingSet意思是“這份數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)”。同樣第二個(gè)ArffLoader的輸出端口拖到J48的另一個(gè)輸入端口選擇TestSet。這里特別提醒J48如果只連了TrainingSet沒有連TestSet運(yùn)行后只會(huì)得到在訓(xùn)練集上評(píng)估的結(jié)果不能用來衡量真實(shí)泛化能力。很多人第一次跑通后看到準(zhǔn)確率接近100%還特別高興其實(shí)就是把TestSet漏了。然后把J48的輸出端口拖到ClassifierPerformanceEvaluator的輸入端口連接類型選擇BatchClassifier或?qū)?yīng)的分類器輸出類型。J48作為基分類器執(zhí)行完會(huì)輸出一個(gè)寫好的模型對(duì)象給評(píng)估器。最后把ClassifierPerformanceEvaluator的輸出端口Text拖到TextViewer的輸入端口Text并讓第一個(gè)或第二個(gè)ArffLoader的輸出端口直接拖到DataVisualizer的輸入端口用于展示數(shù)據(jù)分布。DataVisualizer是可以直接接收DataSet的連接時(shí)選對(duì)應(yīng)端口即可。注意這個(gè)可視化分支和訓(xùn)練測(cè)試分支是并行的互不影響。3.3 運(yùn)行與驗(yàn)證TextViewer里看到的結(jié)果長(zhǎng)什么樣連線完畢先點(diǎn)Restart再點(diǎn)Play等待右下角日志不再滾動(dòng)。然后右鍵點(diǎn)擊TextViewer選擇“Show”打開窗口。正常情況下你能看到分類器信息J48構(gòu)建出的決策樹結(jié)構(gòu)。評(píng)估摘要Correctly Classified Instances的數(shù)目和百分比?;煜仃嚸總€(gè)類別哪些樣本被分對(duì)、哪些被分錯(cuò)。我一般先做三件事確認(rèn)流程正確第一看評(píng)估摘要里的實(shí)例條數(shù)是不是和測(cè)試集大小一致第二看決策樹是否生成第三看DataVisualizer里的點(diǎn)是否明顯分簇。如果這三項(xiàng)都對(duì)說明整條流水線已經(jīng)通了后面往里面加處理步驟就只是習(xí)慣問題。DataVisualizer的使用也很簡(jiǎn)單打開后點(diǎn)右上角一欄下拉框選擇兩個(gè)屬性作為橫縱坐標(biāo)再點(diǎn)更新就能看到數(shù)據(jù)點(diǎn)的分布。還有一個(gè)實(shí)用的選項(xiàng)是“Colour”下拉框選擇類屬性后不同類別的點(diǎn)會(huì)用不同顏色顯示分簇效果一目了然。做完這個(gè)實(shí)驗(yàn)?zāi)憔蜁?huì)明白為什么iris數(shù)據(jù)集是機(jī)器學(xué)習(xí)入門必備也明白KnowledgeFlow比Explorer好在哪所有環(huán)節(jié)都能同時(shí)放在眼前。3.4 參數(shù)改動(dòng)的“熱折騰”改了J48參數(shù)要不要重來場(chǎng)景你跑通之后想改J48的參數(shù)比如從默認(rèn)置信度改為更保守的置信度。在KnowledgeFlow里修改J48的參數(shù)后并不是只重跑J48就行所有下游節(jié)點(diǎn)其實(shí)都依賴它的輸出最穩(wěn)妥的做法是先Restart把整條流程置為初始狀態(tài)再Play。為什么不能只重跑J48因?yàn)镃lassifierPerformanceEvaluator和TextViewer可能仍保留上一次執(zhí)行的輸出結(jié)果界面顯示的會(huì)舊數(shù)據(jù)。KnowledgeFlow不像Explorer那樣每次點(diǎn)Start都是一次全新計(jì)算它的節(jié)點(diǎn)有“當(dāng)前結(jié)果”的概念舊結(jié)果不會(huì)自動(dòng)清掉。所以我在實(shí)踐里養(yǎng)成了一個(gè)習(xí)慣任何一次參數(shù)修改后都只使用“Restart Play”這一組組合不做局部執(zhí)行。這樣可以避免把舊結(jié)果當(dāng)新結(jié)果看。4. 過濾器、分支和增量學(xué)習(xí)讓流水線干更復(fù)雜的活4.1 過濾器節(jié)點(diǎn)把Normalize單獨(dú)拉出來接在數(shù)據(jù)源后面Explorer里使用過濾器是在預(yù)處理面板里操作的而在KnowledgeFlow中過濾器就是一個(gè)獨(dú)立節(jié)點(diǎn)。它接收DataSet輸出處理后的DataSet完全符合“數(shù)據(jù)流”的思想。舉個(gè)例子你想比較iris數(shù)據(jù)不做歸一化和做歸一化后的J48準(zhǔn)確率。那么大致的畫布結(jié)構(gòu)是ArffLoader1 → J48的TrainingSetArffLoader1 → Normalize → J48的TrainingSet等等這里有個(gè)容易犯糊涂的地方一個(gè)J48節(jié)點(diǎn)只有兩個(gè)輸入端口TrainingSet和TestSet不能同時(shí)接收兩份不同的訓(xùn)練數(shù)據(jù)并自動(dòng)做對(duì)比。正確做法是再拖一個(gè)J48實(shí)例一個(gè)接原始數(shù)據(jù)一個(gè)接歸一化后的數(shù)據(jù)。也就是說一份ArffLoader輸出可以分成兩支一支直接去J48一支先經(jīng)過Normalize再去另一個(gè)J48。這恰恰是KnowledgeFlow的優(yōu)勢(shì)原始數(shù)據(jù)可以被多個(gè)下游節(jié)點(diǎn)復(fù)用你不需要為每個(gè)實(shí)驗(yàn)重新加載文件。畫布上可以看到數(shù)據(jù)源出來了多條線分而治之互不干擾。4.2 一個(gè)數(shù)據(jù)源拖出多個(gè)分支同時(shí)看多種結(jié)果在實(shí)際項(xiàng)目中很多人會(huì)把同一個(gè)數(shù)據(jù)源同時(shí)接到分類器、評(píng)估器、可視化器和保存節(jié)點(diǎn)上構(gòu)成一個(gè)多路輸出的并行結(jié)構(gòu)。KnowledgeFlow對(duì)這類結(jié)構(gòu)支持得相當(dāng)好因?yàn)槊總€(gè)節(jié)點(diǎn)的輸出端口可以同時(shí)拉出多根連線數(shù)據(jù)并不會(huì)被“復(fù)制消耗”。舉個(gè)例子ArffLoader1 → J48 → ClassifierPerformanceEvaluator → TextViewerArffLoader1 → DataVisualizerArffLoader1 → ArffSaver同樣是讀取一份數(shù)據(jù)既可以訓(xùn)練模型、查看評(píng)估報(bào)告又可以可視化數(shù)據(jù)分布還可以把原始數(shù)據(jù)保存到另一個(gè)文件。整個(gè)流程只讀一次數(shù)據(jù)非常節(jié)省時(shí)間。這里補(bǔ)充一個(gè)實(shí)用技巧如果畫布上節(jié)點(diǎn)太多太亂可以按住鼠標(biāo)左鍵框選多個(gè)節(jié)點(diǎn)拖動(dòng)調(diào)整位置。連線會(huì)跟著節(jié)點(diǎn)走不會(huì)斷掉。如果數(shù)據(jù)源輸出連了很多條了后續(xù)還想要一條新分支直接從源節(jié)點(diǎn)的輸出端口再拉一根線出去就行不用從頭再來。4.3 超大數(shù)據(jù)集與增量評(píng)估NaiveBayesUpdateable使用場(chǎng)景回到文章開頭提到的痛點(diǎn)數(shù)據(jù)太大Explorer卡死。KnowledgeFlow對(duì)這個(gè)問題的解法之一是增量學(xué)習(xí)。所謂增量學(xué)習(xí)就是算法不用一次性看到全部數(shù)據(jù)而是來一條學(xué)一條邊讀邊更新模型。Weka里有一批帶“Updateable”后綴的分類器比如NaiveBayesUpdateable。用KnowledgeFlow跑增量學(xué)習(xí)的流程和普通分類流程有區(qū)別關(guān)鍵點(diǎn)在于要使用IncrementalClassifierEvaluator來評(píng)估。它和普通評(píng)估器的差別是普通評(píng)估器要拿到整個(gè)測(cè)試集才能算指標(biāo)增量評(píng)估器則是接收一個(gè)實(shí)例實(shí)例、更新一個(gè)模型不斷累計(jì)指標(biāo)。連接方式稍復(fù)雜但基本思路是一樣的數(shù)據(jù)源不斷產(chǎn)生實(shí)例分類器不斷學(xué)習(xí)評(píng)估器持續(xù)跟蹤效果。這種情況對(duì)大數(shù)據(jù)集特別有價(jià)值。你不再需要一個(gè)超大文件一次性在內(nèi)存里展開數(shù)據(jù)源可以逐條喂給算法。當(dāng)然要真正處理超出內(nèi)存的數(shù)據(jù)量仍需配合硬件和JVM內(nèi)存設(shè)置。Weka的啟動(dòng)方式里可以在啟動(dòng)腳本中為JVM分配更多堆內(nèi)存。例如java -Xmx4g -jar weka.jar這個(gè)命令會(huì)以4GB堆內(nèi)存啟動(dòng)Weka界面。如果數(shù)據(jù)達(dá)到幾十GB那已經(jīng)超出Weka單機(jī)處理的舒適區(qū)應(yīng)該考慮抽樣或者分布式方案不能用Weka硬扛。KnowledgeFlow的增量機(jī)制可以緩解內(nèi)存壓力但不是萬能的。5. 我在實(shí)際項(xiàng)目里踩過的KnowledgeFlow坑5.1 連線沒連對(duì)節(jié)點(diǎn)就是不執(zhí)行trainingSet和dataset的區(qū)別我第一次跑通KnowledgeFlow用了很久卡的最狠的一次是J48節(jié)點(diǎn)接到了ArffLoader的輸出畫布上連線清清楚楚但點(diǎn)擊Play之后J48毫無反應(yīng)。后來才明白我把連接類型選成了Dataset而不是TrainingSet。J48作為一個(gè)分類器在啟動(dòng)訓(xùn)練前必須拿到TrainingSet如果只拿到一個(gè)普通Dataset它不知道應(yīng)該用這份數(shù)據(jù)做什么。這個(gè)坑在官方文檔里提過但新手第一次接觸端口類型時(shí)很容易忽略。每當(dāng)節(jié)點(diǎn)不執(zhí)行先右鍵點(diǎn)開節(jié)點(diǎn)查看輸入端口是否都滿足再檢查連接類型。這是排查KnowledgeFlow問題時(shí)的第一反應(yīng)而不是去懷疑軟件出了bug。5.2 保存布局后數(shù)據(jù)路徑失效.kf文件只記路徑不搬數(shù)據(jù)KnowledgeFlow的布局文件后綴是.kf里面保存了節(jié)點(diǎn)的位置、參數(shù)和連接關(guān)系以及數(shù)據(jù)源的讀取路徑。問題在于如果你把.kf文件拷貝到另一臺(tái)電腦或者把a(bǔ)rff文件挪了位置打開布局后ArffLoader往往找不到數(shù)據(jù)。解決辦法很樸素把布局文件和所有使用的arff數(shù)據(jù)集放到同一個(gè)目錄里并保持相對(duì)路徑一致。舉例來說如果布局文件名叫“實(shí)驗(yàn)1.kf”和“train.arff”“test.arff”放在一個(gè)文件夾打開布局后通常能正常加載。如果打開后發(fā)現(xiàn)讀取節(jié)點(diǎn)報(bào)錯(cuò)優(yōu)先打開ArffLoader的屬性窗口重新選擇數(shù)據(jù)文件路徑再Restart執(zhí)行。另一個(gè)相關(guān)的坑如果你在團(tuán)隊(duì)里共享布局文件同事那邊的Weka版本不一致某些節(jié)點(diǎn)的默認(rèn)參數(shù)可能有差異導(dǎo)致結(jié)果不完全一致。所以做嚴(yán)肅實(shí)驗(yàn)記錄時(shí)除了保存.kf布局最好把每個(gè)關(guān)鍵節(jié)點(diǎn)的參數(shù)用截圖或文字記錄下來避免只依賴布局文件。5.3 過濾一遍等于只改這一路分支上的數(shù)據(jù)不是全局生效很多新手以為在流程里接了一個(gè)Normalize節(jié)點(diǎn)就相當(dāng)于“全局把數(shù)據(jù)清洗了”后面所有節(jié)點(diǎn)都會(huì)自動(dòng)應(yīng)用歸一化。但KnowledgeFlow沒有這種全局狀態(tài)它的數(shù)據(jù)是嚴(yán)格沿著連線流動(dòng)的。你從ArffLoader拉出一根線接到Normalize那只有沿著Normalize繼續(xù)走的分支會(huì)拿到歸一化數(shù)據(jù)你如果另有分支直接從ArffLoader接到某個(gè)分類器那條路的數(shù)據(jù)仍然是原始數(shù)據(jù)。這個(gè)設(shè)計(jì)初看讓人不太習(xí)慣但它非常符合真實(shí)數(shù)據(jù)管道的思想每個(gè)環(huán)節(jié)的數(shù)據(jù)是否被處理過看的是它的上游鏈路而不是整個(gè)流程里有沒有某個(gè)過濾器節(jié)點(diǎn)。我在實(shí)際項(xiàng)目里就遇到過這種問題以為所有節(jié)點(diǎn)都統(tǒng)一用了歸一化數(shù)據(jù)結(jié)果后來發(fā)現(xiàn)只有一個(gè)分支做了歸一化另一個(gè)分支用的是原始數(shù)據(jù)模型對(duì)比結(jié)論完全偏離了。所以在復(fù)雜流程里要針對(duì)每個(gè)模型節(jié)點(diǎn)自問一句它連的到底是原始分支還是處理后的分支5.4 日志和狀態(tài)顏色判斷“卡住”還是“正在跑”KnowledgeFlow執(zhí)行的時(shí)候如果數(shù)據(jù)量很大某些節(jié)點(diǎn)會(huì)持續(xù)一段時(shí)間。新手容易把正在執(zhí)行的流程誤判為卡死不停點(diǎn)Stop或者關(guān)閉界面。我一般這么判斷看右下角日志面板如果每隔一小段時(shí)間就有新日志滾動(dòng)出來說明流程還在跑如果長(zhǎng)時(shí)間沒有新日志并且沒有任何節(jié)點(diǎn)處于執(zhí)行中的狀態(tài)才有可能真的卡住了。還有一個(gè)小經(jīng)驗(yàn)在跑大數(shù)據(jù)集或復(fù)雜參數(shù)時(shí)先把Weka的日志級(jí)別調(diào)高讓日志面板輸出更多執(zhí)行信息排查起來省力很多。日志里出現(xiàn)報(bào)錯(cuò)信息時(shí)不要只看最后的報(bào)錯(cuò)往上翻幾行找到是哪個(gè)節(jié)點(diǎn)先出錯(cuò)通常問題就出在那個(gè)節(jié)點(diǎn)的上游。5.5 實(shí)驗(yàn)管理的小習(xí)慣執(zhí)行完立刻另存布局最后分享一個(gè)我在實(shí)際工作中養(yǎng)成的習(xí)慣每次跑完一通流程確定結(jié)果正確后立刻將布局“另存為”一個(gè)帶日期和實(shí)驗(yàn)?zāi)康牡?kf文件。文件名起得像實(shí)驗(yàn)記錄一樣比如“iris-對(duì)比歸一化-0503.kf”。這樣即使過了幾個(gè)月也能快速知道這個(gè)布局是為了驗(yàn)證什么跑的、用的什么數(shù)據(jù)、連接結(jié)構(gòu)是什么。我見過不少人在Explorer里隨機(jī)點(diǎn)了一堆操作后因?yàn)闆]保存跑了很久的實(shí)驗(yàn)結(jié)果只能拿截圖交差。KnowledgeFlow的本質(zhì)優(yōu)勢(shì)就是讓實(shí)驗(yàn)流程變得可以固化、可以復(fù)現(xiàn)、可以交接。如果只是把Explorer的操作習(xí)慣搬到KnowledgeFlow上那反而浪費(fèi)了這個(gè)工具的設(shè)計(jì)初衷。如果你的實(shí)驗(yàn)越來越復(fù)雜下一步可以嘗試把流程里重復(fù)出現(xiàn)的分支封裝成子流程或者用Weka的KnowledgeFlow配合命令行批量執(zhí)行再做進(jìn)一步的自動(dòng)化。到那個(gè)時(shí)候你已經(jīng)不是在“用工具”而是在“搭實(shí)驗(yàn)系統(tǒng)”了。