為了下個項目的質量!每個數據科學家都應該學會這兩種工具
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
使用機器學習模型越久,就越能意識到,正確了解模型當下的運行目的及效果有多重要。在實踐中,即便是在最佳情況下,跟蹤模型的運行情況(尤其是在測試各種模型參數組合時)都十分繁瑣。大多數情況下,我都會構建自己的工具來調試和分析機器學習模型。
最近,在為MAFAT的多普勒脈沖雷達分類挑戰設計各種模型的時候,我發覺自己手動構建模型調試工具就是在浪費時間,而搭建集成(組合大多數分類策略的機器學習模型,搭對了就會帶來極大效用)時尤為繁瑣。
創建集成的問題就是,各種模型及分類都需要讓策略奏效。這就意味著要訓練更多的模型、進行更多的分析、了解更多關于整體精度及模型性能的參數。同樣,這就要求我花更多的時間創建自己的調試工具和策略。
為了更好地利用時間和資源,我決定使用一系列可用的在線工具來調試和分析機器學習模型。測試了幾個工具后,我成功縮減了清單:開發或改進機器學習模型時,每個數據科學家都應考慮這兩個超贊的工具。
Weights & Biases

Weights &Biases圖表跟蹤驗證集內各種具有不同參數的模型的性能。Y軸表示精度,X軸表示訓練回合數。
Weights & Biases(W&B)是一家總部位于舊金山的公司,提供一系列能無縫融入現有或新項目的深度學習及機器學習工具。它主要是跟蹤項目中模型變化的實時性能,簡直太管用了。
我在做項目時,常常就追蹤問題手足無措:何時進行了哪些更改?這些更改對項目的各種評估指標是否產生了正面或負面影響?而W&B能用以多種方式存儲并可視化這些評估指標,其中最有效的就是圖表和表格:


模型數據存儲在可導出表格中,以便在W&B網站上進行排序和評估。
如你所見,折線圖表示在訓練期間使用不同指標跟蹤各種模型的性能。這樣便能進行無縫并排比較,以檢查過擬合或檢查驗證集上表現最佳的模型等。
W&B如何與項目關聯?
在W&B網站上創建賬戶后,必須在本地環境下安裝并登錄到個人頁面。
- !pip install --upgrade wandb
- !wandb login <Your login code>
深度學習或者機器學習工具不同,情況也可能不同。我用Keras,但其它項目的文檔會更清晰,也易于執行:
- #Import the package
- import wandb
- from wandb.keras import WandbCallback#Initialize the W&B object
- wandb.init(project="tester")#Link the model with W&B’stracking metrics
- model.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和Toyota Research這樣的大公司定期使用它,稱贊它是靈活且有效用的項目工具。
Uber的Manifold
圖源:unsplash
我正在項目中創建集成。一個集成是不同算法的集合,每個算法就同一數據進行訓練并提供預測。集成的優勢在于,它提供了一系列不同的策略來尋找解決方案,并利用多數票使所有模型的分類民主化。這很有用,因為盡管單個模型可以很好地預測部分數據,但它可能會在其他部分不知所措。
在機器學習中,“集成就是數字力量”。為了讓集成表現良好,組成集成的各個模型必須能進行多樣化預測。多樣化預測,即不能所有模型都對某數據進行一模一樣的預測;它們應該能對不同數據進行準確預測。然而這也帶來了問題:你怎么知道集成進行的是多樣化預測呢?看看交通科技巨頭Uber的Manifold吧。
Uber的Manifold是個開源長期項目,旨在為機器學習提供調試的可視化工具(模型是什么樣子的都無所謂)。通俗地講,Manifold讓你能看見哪個模型在數據子集中表現不佳、哪些特性導致了表現不佳。
集成能幫大忙。它創建了一個Widget輸出,在Notebook就能交互以進行快速分析。注意,該工具目前僅在經典的Jupyter Notebook電腦上可用。它在Jupyter Lab或Google的Colab上不能運行。
Manifold使用k均值聚類——一種鄰近分組技術,將預測數據分為性能相似的片段。想象一下,這是將數據分成相似的子類,然后沿著每個分段繪制模型,其中模型越靠左,則在該分段上表現越好。隨機生成的示例中可以看到這一點:

上述例子中有三個模型,輸入數據被分成四段。把對數損失(log-loss)作為性能指標,可以看到model_1在segment_0上的表現不佳,而model_2在segment_2上的表現不佳。線的形狀表示性能分布,線的高度表示對數損失下的相對數據點計數。例如,在segment_1的model_1上,對數損失為1.5,點的均值低,但十分密集。
Manifold還提供了功能歸因視圖:

功能歸因視圖強調每個片段的功能分布。在上面的示例中,數據組0包含聚類2和3,將其與包含聚類0和1的數據組1進行比較。x軸是特征值,而y軸是原因的強度。Feature_0高亮顯示這些差異,而Feature_1高亮顯示特征值的直方圖。
那么,如何把Manifold融入項目?
Manifold還處在早期研發階段,還得繼續調bug。但是,這不該妨礙你在項目中使用它。就個人情況來說,我需要弄幾個安裝包才能在Jupyter Notebook上運行它。
- !jupyter nbextension install --py --sys-prefix widgetsnbextension
- !jupyter nbextension enable --py --sys-prefix widgetsnbextension
- !pip install mlvis!jupyter nbextension install --py --symlink --sys-prefix mlvis
- !jupyter nbextension enable --py --sys-prefix mlvis
僅僅安裝nbextention包是不夠的,我還必須啟用這些軟件包。可以在這里導入一些demo工具:
- from mlvis import Manifold
- import sys, json, mathfrom random import uniform
要使用Manifold框架,數據需要分成三組特定格式。第一組是所有必須在字典列表中的x值:
- #Example of x-values
- x = [
- {'feature_0': 21, 'feature_1': 'B'},
- {'feature_0': 36, 'feature_1': 'A'}
- ]
第二組是不同的模型預測,它必須是列表的列表,每個列表都是不同模型的預測:
- #Example of model predictions
- yPred = [
- [{'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}]
- ]
最后一組是ground truth值或實際正確的y值,它們在列表值中:
- #Example of ground truth
- yTrue = [
- 'true', 'false'
- ]
數據一旦采用這種格式,值就可以輸入到Manifold對象中,操作進行Widget,有些類似于上面的例子:
- Manifold(props={'data': {
- 'x': x,
- 'yPred': yPred,
- 'yTrue': yTrue
- }})
然后使用Manifold就能直觀地評估不同模型對相同數據的表現了。這對于構建集成非常有幫助,因為它使我能夠了解哪些模型在哪里執行,哪些數據集群是模型最難分類的。Manifold同樣幫我評估了集成中每個模型的預測多樣性,使我能構建一個更強大、能分類一系列不同輸入數據的設備。
圖源:unsplash
對我來說,上述兩種工具真的是越來越有用了。它們可以幫我應對這一挑戰并切實改善設備的性能,希望讀者也能用這些工具來創建更好的模型。