機(jī)器學(xué)習(xí)模型有強(qiáng)大而復(fù)雜的數(shù)學(xué)結(jié)構(gòu)。了解其錯(cuò)綜復(fù)雜的工作原理是模型開(kāi)發(fā)的一個(gè)重要方面。模型可視化對(duì)于獲得見(jiàn)解、做出明智的決策和有效傳達(dá)結(jié)果至關(guān)重要。
在本文中,我們將深入探討機(jī)器學(xué)習(xí)可視化的藝術(shù),探索幫助我們理解復(fù)雜數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)的各種技術(shù)。文末,還提供了一個(gè)可視化示例的實(shí)踐代碼。
什么是機(jī)器學(xué)習(xí)中的可視化?
機(jī)器學(xué)習(xí)可視化(簡(jiǎn)稱ML可視化)一般是指通過(guò)圖形或交互方式表示機(jī)器學(xué)習(xí)模型、數(shù)據(jù)及其關(guān)系的過(guò)程。目標(biāo)是使理解模型的復(fù)雜算法和數(shù)據(jù)模式更容易,使技術(shù)和非技術(shù)利益相關(guān)者更容易理解它。
可視化彌合了機(jī)器學(xué)習(xí)模型神秘的內(nèi)部運(yùn)作與我們通過(guò)視覺(jué)理解模式之間的差距。
通過(guò)可視化 ML 模型主要有如下作用:
模型結(jié)構(gòu)可視化:常見(jiàn)的模型類型,如決策樹(shù)、支持向量機(jī)或深度神經(jīng)網(wǎng)絡(luò),通常由許多計(jì)算和交互層組成,人類很難掌握這些計(jì)算和交互。通過(guò)可視化,我們可以更輕松地查看數(shù)據(jù)如何流經(jīng)模型以及轉(zhuǎn)換發(fā)生的位置。
可視化性能指標(biāo):一旦我們訓(xùn)練了一個(gè)模型,我們就需要評(píng)估它的性能??梢暬瘻?zhǔn)確性、精確度、召回率和 F1 分?jǐn)?shù)等指標(biāo)有助于我們了解模型的表現(xiàn)以及需要改進(jìn)的地方。
比較模型分析:在處理多個(gè)模型或算法時(shí),結(jié)構(gòu)或性能差異的可視化使我們能夠?yàn)樘囟ㄈ蝿?wù)選擇最佳模型或算法。
特征重要性:了解哪些特征對(duì)模型的預(yù)測(cè)影響最大至關(guān)重要。特征重要性圖等可視化技術(shù)可以輕松識(shí)別驅(qū)動(dòng)模型結(jié)果的關(guān)鍵因素。
可解釋性:由于其復(fù)雜性,ML模型對(duì)人類創(chuàng)建者來(lái)說(shuō)通常是“黑匣子”,因此很難解釋他們的決定??梢暬梢躁U明特定特征如何影響輸出或模型預(yù)測(cè)的魯棒性。
利于溝通:可視化是一種通用語(yǔ)言,用于簡(jiǎn)單直觀地傳達(dá)復(fù)雜的想法。它們對(duì)于與管理層和其他非技術(shù)利益相關(guān)者有效共享信息至關(guān)重要。
模型結(jié)構(gòu)可視化
了解數(shù)據(jù)如何流經(jīng)模型對(duì)于了解機(jī)器學(xué)習(xí)模型如何將輸入特征轉(zhuǎn)換為其輸出至關(guān)重要。
決策樹(shù)可視化
決策樹(shù)具有大多數(shù)人都熟悉的類似流程圖的結(jié)構(gòu)。每個(gè)內(nèi)部節(jié)點(diǎn)都表示基于特定功能值的決策。節(jié)點(diǎn)中的每個(gè)分支都表示該決策的結(jié)果。葉節(jié)點(diǎn)表示模型的輸出。
這種結(jié)構(gòu)的可視化提供了決策過(guò)程的直接表示,使數(shù)據(jù)科學(xué)家和業(yè)務(wù)利益相關(guān)者能夠理解模型所學(xué)習(xí)的決策規(guī)則。
在訓(xùn)練過(guò)程中,決策樹(shù)根據(jù)特定標(biāo)準(zhǔn)(通常是基尼雜質(zhì)或信息增益)識(shí)別最能分離分支中樣本的特征。換句話說(shuō),它決定了最具辨別性的特征。
可視化決策樹(shù)(或它們的集合,如隨機(jī)森林或梯度增強(qiáng)樹(shù))涉及其整體結(jié)構(gòu)的圖形渲染,清晰直觀地顯示每個(gè)節(jié)點(diǎn)的拆分和決策。樹(shù)的深度和寬度以及葉子節(jié)點(diǎn)一目了然。此外,決策樹(shù)可視化有助于識(shí)別關(guān)鍵特征,這些特征是導(dǎo)致準(zhǔn)確預(yù)測(cè)的最具辨別性的屬性。
準(zhǔn)確預(yù)測(cè)的路徑可以歸納為四個(gè)步驟:
功能清晰:決策樹(shù)可視化就像剝開(kāi)復(fù)雜性層,以揭示關(guān)鍵功能。這類似于查看決策流程圖,其中每個(gè)分支表示一個(gè)特征,每個(gè)決策節(jié)點(diǎn)都包含我們數(shù)據(jù)的關(guān)鍵方面。
判別屬性:決策樹(shù)可視化的美妙之處在于它能夠突出顯示最具判別性的特征。這些因素會(huì)嚴(yán)重影響結(jié)果,指導(dǎo)模型進(jìn)行預(yù)測(cè)。通過(guò)可視化樹(shù),我們可以精確定位這些特征,從而了解驅(qū)動(dòng)模型決策的核心因素。
通往精確度的路徑:決策樹(shù)上的每條路徑都是通往精確度的旅程??梢暬故玖藢?dǎo)致特定預(yù)測(cè)的決策序列。這是理解我們的模型用來(lái)得出特定結(jié)論的邏輯和標(biāo)準(zhǔn)的黃金。
復(fù)雜中的簡(jiǎn)單:盡管機(jī)器學(xué)習(xí)算法很復(fù)雜,但決策樹(shù)可視化具有簡(jiǎn)單性。它將復(fù)雜的數(shù)學(xué)計(jì)算轉(zhuǎn)換為直觀的表示形式,使技術(shù)和非技術(shù)利益相關(guān)者都可以訪問(wèn)。
機(jī)器學(xué)習(xí)中的決策樹(shù)可視化示例:在 Iris 數(shù)據(jù)集上訓(xùn)練的決策樹(shù)分類器 |來(lái)源:作者
上圖顯示了在著名的 Iris 數(shù)據(jù)集上訓(xùn)練的決策樹(shù)分類器的結(jié)構(gòu)。該數(shù)據(jù)集由150 個(gè)鳶尾花樣本組成,每個(gè)樣本屬于以下三個(gè)物種之一:setosa、versicolor 或 virginica。每個(gè)樣品有四個(gè)特征:萼片長(zhǎng)度、萼片寬度、花瓣長(zhǎng)度和花瓣寬度。
從決策樹(shù)可視化中,我們可以了解模型如何對(duì)花朵進(jìn)行分類:
根節(jié)點(diǎn):在根節(jié)點(diǎn)處,模型確定花瓣長(zhǎng)度是否為 2.45 厘米或更小。如果是這樣,它將花歸類為 setosa。否則,它將移動(dòng)到下一個(gè)內(nèi)部節(jié)點(diǎn)。
基于花瓣長(zhǎng)度的第二次分割:如果花瓣長(zhǎng)度大于 2.45 厘米,則樹(shù)再次使用此功能做出決定。決定標(biāo)準(zhǔn)是花瓣長(zhǎng)度是否小于或等于 4.75 厘米。
根據(jù)花瓣寬度進(jìn)行分割:如果花瓣長(zhǎng)度小于或等于 4.75 厘米,則模型接下來(lái)會(huì)考慮花瓣寬度并確定它是否高于 1.65 厘米。如果是這樣,它將花歸類為弗吉尼亞。否則,模型的輸出是多色的。
根據(jù)萼片長(zhǎng)度進(jìn)行分割:如果花瓣長(zhǎng)度大于 4.75 厘米,則模型在訓(xùn)練期間確定萼片長(zhǎng)度最適合區(qū)分花色和維吉尼亞。如果萼片長(zhǎng)度大于 6.05 厘米,則將花歸類為弗吉尼亞花。否則,模型的輸出是多色的。
可視化捕獲了這種分層決策過(guò)程,并以一種比簡(jiǎn)單的決策規(guī)則列表更易于理解的方式表示它。
集成模型可視化
隨機(jī)森林、AdaBoost、梯度提升和裝袋等集成方法將多個(gè)更簡(jiǎn)單的模型(稱為基礎(chǔ)模型)合并到一個(gè)更大、更準(zhǔn)確的模型中。例如,隨機(jī)森林分類器包含許多決策樹(shù)。在調(diào)試和評(píng)估集成時(shí),了解組成模型的貢獻(xiàn)和復(fù)雜的相互作用至關(guān)重要。
可視化集成模型的一種方法是創(chuàng)建一個(gè)圖表,顯示基本模型如何為集成模型的輸出做出貢獻(xiàn)。一種常見(jiàn)的方法是繪制基礎(chǔ)模型的決策邊界(也稱為曲面),突出顯示它們對(duì)特征空間不同部分的影響。通過(guò)研究這些決策邊界如何重疊,我們可以了解基礎(chǔ)模型如何產(chǎn)生集合的集體預(yù)測(cè)能力。
集成模型可視化示例:各個(gè)分類器如何通過(guò)調(diào)整其決策邊界來(lái)適應(yīng)不同的數(shù)據(jù)分布。較暗的區(qū)域表示更高的置信度,即模型對(duì)其預(yù)測(cè)的置信度更高。較輕的區(qū)域表示置信度較低的區(qū)域 |源
集成模型可視化還可以幫助用戶更好地理解分配給集成中每個(gè)基本模型的權(quán)重。通常,基礎(chǔ)模型對(duì)特征空間的某些區(qū)域有很強(qiáng)的影響,而對(duì)其他區(qū)域的影響很小。但是,也可能存在從未對(duì)集成輸出做出重大貢獻(xiàn)的基本模型。識(shí)別權(quán)重特別低或特別高的基本模型有助于使集成模型更加穩(wěn)健并提高其泛化性。
直觀地構(gòu)建模型
Visual ML 是一種使用低代碼或無(wú)代碼平臺(tái)設(shè)計(jì)機(jī)器學(xué)習(xí)模型的方法。它使用戶能夠通過(guò)用戶友好的可視化界面創(chuàng)建和修改復(fù)雜的機(jī)器學(xué)習(xí)過(guò)程、模型和結(jié)果。Visual ML 不是追溯生成模型結(jié)構(gòu)可視化,而是將它們置于 ML 工作流的核心。
簡(jiǎn)而言之,Visual ML 平臺(tái)提供拖放式模型構(gòu)建工作流程,允許各種背景的用戶輕松創(chuàng)建 ML 模型。它們彌合了算法的抽象世界與我們通過(guò)視覺(jué)掌握模式和關(guān)系的天生能力之間的差距。
這些平臺(tái)可以節(jié)省我們的時(shí)間,并幫助我們快速構(gòu)建模型原型。由于可以在幾分鐘內(nèi)創(chuàng)建模型,因此訓(xùn)練和比較不同的模型配置很容易。然后,可以進(jìn)一步優(yōu)化性能最佳的模型,也許可以使用更以代碼為中心的方法。
數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師可以利用 Visual ML 工具創(chuàng)建:
1實(shí)驗(yàn)原型
2?MLOps 管道
3為生產(chǎn)生成最佳的 ML 代碼
4擴(kuò)展現(xiàn)有 ML 模型代碼庫(kù)以獲得更大的示例
如何在沒(méi)有代碼的情況下創(chuàng)建 ML/DL 模型的示例。這種類型的界面是敏捷的,可以詳細(xì)了解模型的工作原理 |源
Visual ML 工具的示例包括 TensorFlow 的 Neural Network Playground 和 KNIME,后者是一個(gè)完全圍繞 Visual ML 和無(wú)代碼概念構(gòu)建的開(kāi)源數(shù)據(jù)科學(xué)平臺(tái)。
可視化機(jī)器學(xué)習(xí)模型性能
在許多情況下,我們不太關(guān)心模型在內(nèi)部是如何工作的,而是有興趣了解它的性能。對(duì)于哪種樣品是可靠的?它經(jīng)常在哪里得出錯(cuò)誤的結(jié)論?我們應(yīng)該選擇模型 A 還是模型 B?
在本節(jié)中,我們將介紹機(jī)器學(xué)習(xí)可視化效果,這些可視化效果有助于我們更好地了解模型的性能。
?混淆矩陣
混淆矩陣是評(píng)估分類模型性能的基本工具?;煜仃噷⒛P偷念A(yù)測(cè)與基本事實(shí)進(jìn)行比較,清楚地顯示模型錯(cuò)誤分類了哪種樣本,或者它難以區(qū)分類別。
對(duì)于二元分類器,混淆矩陣只有四個(gè)字段:真陽(yáng)性、假陽(yáng)性、假陰性和真陰性:
?
? | ?模型預(yù)測(cè):0 | ?模型預(yù)測(cè):1 |
?真值:0 | ?真陰性 | ?誤報(bào) |
?真值:1 | ?假陰性 | ?真陽(yáng)性 |
?
有了這些信息,就可以直接計(jì)算精度、召回率、F1 分?jǐn)?shù)和準(zhǔn)確性等基本指標(biāo)。
多類模型的混淆矩陣遵循相同的一般思路。對(duì)角線元素表示正確分類的實(shí)例(即,模型的輸出與真實(shí)值匹配),而非對(duì)角線元素表示錯(cuò)誤分類。
下面是一個(gè)小片段,用于為 sci-kit-learn 分類器生成混淆矩陣:
?
?
import matplotlib.pyplot as plt from sklearn.datasets import make_classification from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay from sklearn.model_selection import train_test_split from sklearn.svm import SVC # generate some sample data X, y = make_classification(n_samples=1000, n_features=10, n_informative=6, n_redundant = 2, n_repeated = 2, n_classes = 6, n_clusters_per_class=1, random_state = 42 ) # split the data into train and test set X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0) # initialize and train a classifier clf = SVC(random_state=0) clf.fit(X_train, y_train) # get the model’s prediction for the test set predictions = clf.predict(X_test) # using the model’s prediction and the true value, # create a confusion matrix cm = confusion_matrix(y_test, predictions, labels=clf.classes_) # use the built-in visualization function to generate a plot disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=clf.classes_) disp.plot() plt.show()
模型性能可視化示例:6×6 混淆矩陣 |來(lái)源:作者
?
?
讓我們看一下輸出。如前所述,對(duì)角線中的元素表示真實(shí)的類,對(duì)角線外的元素表示模型混淆類的情況,因此得名“混淆矩陣”。
以下是該圖的三個(gè)關(guān)鍵要點(diǎn):
對(duì)角線:理想情況下,矩陣的主對(duì)角線應(yīng)填充最高數(shù)字。這些數(shù)字表示模型正確預(yù)測(cè)類的實(shí)例,與真實(shí)類一致。看起來(lái)我們的模型在這里做得很好!
非對(duì)角線條目:主對(duì)角線外的數(shù)字同樣重要。它們揭示了模型出錯(cuò)的情況。例如,如果查看第 5 行與第 3 列相交的單元格,您會(huì)看到有 5 種情況,其中真正的類是“5”,但模型預(yù)測(cè)的類是“3”。也許我們應(yīng)該看看受影響的樣本,以更好地了解這里發(fā)生了什么!
一目了然地分析性能:通過(guò)檢查非對(duì)角線條目,您可以立即看到它們非常低??偟膩?lái)說(shuō),分類器似乎做得很好。您還會(huì)注意到,我們每個(gè)類別的樣本數(shù)量大致相同。在許多現(xiàn)實(shí)世界的場(chǎng)景中,情況并非如此。然后,生成第二個(gè)混淆矩陣,顯示正確分類的可能性(而不是樣本的絕對(duì)數(shù)量)可能會(huì)有所幫助。
顏色漸變和百分比注釋等視覺(jué)增強(qiáng)功能使混淆矩陣更加直觀且易于解釋。樣式類似于熱圖的混淆矩陣會(huì)引起對(duì)錯(cuò)誤率高的類的注意,從而指導(dǎo)進(jìn)一步的模型開(kāi)發(fā)。
混淆矩陣還可以幫助非技術(shù)利益相關(guān)者掌握模型的優(yōu)勢(shì)和劣勢(shì),促進(jìn)討論在使用模型預(yù)測(cè)進(jìn)行關(guān)鍵決策時(shí)是否需要額外的數(shù)據(jù)或預(yù)防措施。
可視化聚類分析
聚類分析根據(jù)特定特征對(duì)相似的數(shù)據(jù)點(diǎn)進(jìn)行分組??梢暬@些聚類可以揭示數(shù)據(jù)中的模式、趨勢(shì)和關(guān)系。
散點(diǎn)圖中每個(gè)點(diǎn)根據(jù)其聚類分配進(jìn)行著色,是可視化聚類分析結(jié)果的標(biāo)準(zhǔn)方法。聚類邊界及其在要素空間中的分布清晰可見(jiàn)。成對(duì)圖或平行坐標(biāo)有助于了解多個(gè)要素之間的關(guān)系。
可視化聚類分析示例:由 k 均值聚類生成的兩個(gè)不同數(shù)據(jù)聚類。您可以看到,在這兩種情況下,模型找到的聚類(顏色編碼)都與數(shù)據(jù)中的實(shí)際聚類不匹配 |源
一種流行的聚類算法 k-means 從選擇稱為質(zhì)心的起點(diǎn)開(kāi)始。一種簡(jiǎn)單的方法是從數(shù)據(jù)集中隨機(jī)選取 k 個(gè)樣本。
一旦建立了這些初始質(zhì)心,k-means 將在兩個(gè)步驟之間交替:
1它將每個(gè)樣本與最近的質(zhì)心相關(guān)聯(lián),從而創(chuàng)建由與同一質(zhì)心關(guān)聯(lián)的樣本組成的聚類。
2它通過(guò)對(duì)聚類中所有樣本的值求平均值來(lái)重新校準(zhǔn)質(zhì)心。
隨著此過(guò)程的繼續(xù),質(zhì)心會(huì)移動(dòng),并且點(diǎn)與聚類的關(guān)聯(lián)會(huì)迭代細(xì)化。一旦新舊質(zhì)心之間的差值低于設(shè)定的閾值,則表示穩(wěn)定,k-means 結(jié)束。
結(jié)果是一組質(zhì)心和聚類,您可以在如上圖所示的圖中可視化它們。
對(duì)于較大的數(shù)據(jù)集,可以使用 t-SNE(t 分布的隨機(jī)鄰域嵌入)或 UMAP(均勻流形近似和投影)來(lái)減少維度,同時(shí)保留聚類結(jié)構(gòu)。這些技術(shù)有助于有效地可視化高維數(shù)據(jù)。
t-SNE 獲取復(fù)雜的高維數(shù)據(jù),并將其轉(zhuǎn)換為低維表示。該算法首先為每個(gè)數(shù)據(jù)點(diǎn)分配一個(gè)低維空間中的位置。然后,它查看原始數(shù)據(jù),并考慮其相鄰點(diǎn),決定每個(gè)點(diǎn)在這個(gè)新空間中的實(shí)際位置。在高維空間中相似的點(diǎn)在新空間中被拉得更近,而那些不同的點(diǎn)被推開(kāi)。
重復(fù)此過(guò)程,直到點(diǎn)找到其完美位置。最終結(jié)果是一個(gè)聚類表示,其中相似的數(shù)據(jù)點(diǎn)形成組,使我們能夠看到隱藏在高維混沌中的模式和關(guān)系。這就像一首交響樂(lè),每個(gè)音符都能找到它和諧的位置,創(chuàng)造出一個(gè)美麗的數(shù)據(jù)組合。
t-SNE 算法從低維空間中的高維數(shù)據(jù)創(chuàng)建聚類 |源
UMAP也試圖在高維空間中尋找星團(tuán),但采用了不同的方法。以下是UMAP的工作原理:
鄰居查找:UMAP 首先識(shí)別每個(gè)數(shù)據(jù)點(diǎn)的鄰居。它確定在原始高維空間中哪些點(diǎn)彼此靠近。
模糊簡(jiǎn)單集構(gòu)造:想象一下在這些相鄰點(diǎn)之間創(chuàng)建一個(gè)連接網(wǎng)絡(luò)。UMAP 根據(jù)點(diǎn)的相關(guān)或相似程度對(duì)這些連接的強(qiáng)度進(jìn)行建模。
低維布局:在確定它們的接近度后,UMAP在低維空間中仔細(xì)排列數(shù)據(jù)點(diǎn)。在這個(gè)新空間中,在高維空間中緊密相連的點(diǎn)被緊密地放置在一起。
優(yōu)化:UMAP旨在找到較低維度的最佳表示形式。它最小化了原始高維空間和新的低維空間中的距離差異。
聚類:UMAP使用聚類算法對(duì)相似的數(shù)據(jù)點(diǎn)進(jìn)行分組。想象一下,將相似顏色的彈珠聚集在一起——這使我們能夠更清楚地看到圖案和結(jié)構(gòu)。
比較模型分析
比較不同的模型性能指標(biāo)對(duì)于確定哪種機(jī)器學(xué)習(xí)模型最適合任務(wù)至關(guān)重要。無(wú)論是在機(jī)器學(xué)習(xí)項(xiàng)目的實(shí)驗(yàn)階段,還是在重新訓(xùn)練生產(chǎn)模型時(shí),通常都需要可視化來(lái)將復(fù)雜的數(shù)值結(jié)果轉(zhuǎn)化為可操作的見(jiàn)解。
因此,模型性能指標(biāo)的可視化,如ROC曲線和校準(zhǔn)圖,是每個(gè)數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師都應(yīng)該在其工具箱中擁有的工具。它們是理解和傳達(dá)機(jī)器學(xué)習(xí)模型有效性的基礎(chǔ)。
模型分析示例:使用 ROC 曲線和 ROC-AUC 指標(biāo)比較三個(gè)不同的模型?
?ROC 曲線
在分析機(jī)器學(xué)習(xí)分類器和比較 ML 模型性能時(shí),受試者工作特征曲線(簡(jiǎn)稱 ROC 曲線)至關(guān)重要。
ROC 曲線將模型的真陽(yáng)性率與其假陽(yáng)性率作為截止閾值的函數(shù)進(jìn)行對(duì)比。它描述了我們總是必須做出的真陽(yáng)性和假陽(yáng)性之間的權(quán)衡,并提供了對(duì)模型判別力的洞察。
靠近左上角的曲線表示卓越的性能:該模型實(shí)現(xiàn)了較高的真陽(yáng)性率,同時(shí)保持了較低的誤報(bào)率。比較 ROC 曲線有助于我們選擇最佳模型。
以下是 ROC 曲線工作原理的分步說(shuō)明:
在二元分類中,我們感興趣的是預(yù)測(cè)兩種可能的結(jié)果之一,通常標(biāo)記為陽(yáng)性(例如,存在疾?。┖完幮裕ɡ?,沒(méi)有疾?。?。
請(qǐng)記住,我們可以通過(guò)選擇一個(gè)類作為正結(jié)果并將所有其他類指定為負(fù)結(jié)果,將任何分類問(wèn)題轉(zhuǎn)換為二元問(wèn)題。因此,ROC曲線對(duì)于多類或多標(biāo)簽分類問(wèn)題仍然有幫助。
ROC 曲線的軸代表兩個(gè)指標(biāo):
真陽(yáng)性率(靈敏度):模型正確識(shí)別的實(shí)際陽(yáng)性病例的比例。
假陽(yáng)性率:實(shí)際陰性病例被錯(cuò)誤識(shí)別為陽(yáng)性的比例。
機(jī)器學(xué)習(xí)分類器通常輸出樣本屬于正類的可能性。例如,邏輯回歸模型輸出的值介于 0 和 1 之間,這些值可以解釋為似然。
作為數(shù)據(jù)科學(xué)家,我們有責(zé)任選擇閾值,高于該閾值,我們分配正面標(biāo)簽。ROC 曲線向我們展示了該選擇對(duì)分類器性能的影響。
如果我們將閾值設(shè)置為 0,則所有樣本都將分配給陽(yáng)性類,誤報(bào)率為 1。因此,在任何 ROC 曲線圖的右上角,您將看到曲線在 (1, 1) 處結(jié)束。
如果我們將閾值設(shè)置為 1,則不會(huì)將任何樣本分配給正類。但是,由于在這種情況下,我們永遠(yuǎn)不會(huì)錯(cuò)誤地將負(fù)樣本分配給正類,因此誤報(bào)率將為 0。您可能已經(jīng)猜到了,這就是我們?cè)?ROC 曲線圖的左下角看到的:曲線總是從 (0, 0) 開(kāi)始。
通過(guò)更改將樣本分類為陽(yáng)性的閾值來(lái)繪制這些點(diǎn)之間的曲線。由此產(chǎn)生的曲線(ROC 曲線)反映了真陽(yáng)性率和假陽(yáng)性率如何隨著該閾值的變化而相互變化。
但是我們從中學(xué)到了什么?
ROC 曲線顯示了我們必須在靈敏度(真陽(yáng)性率)和特異性(1 – 假陽(yáng)性率)之間做出的權(quán)衡。用更通俗的術(shù)語(yǔ)來(lái)說(shuō),我們可以找到所有陽(yáng)性樣本(高靈敏度),或者確保我們的分類器識(shí)別為陽(yáng)性的所有樣本實(shí)際上都屬于陽(yáng)性類別(高特異性)。
考慮一個(gè)可以完美區(qū)分正樣本和負(fù)樣本的分類器:它的真陽(yáng)性率始終為 1,其假陽(yáng)性率始終為 0,與我們選擇的閾值無(wú)關(guān)。它的 ROC 曲線將從 (0,0) 直線向上射到 (0,1),然后類似于 (0,1) 和 (1,1) 之間的直線。
因此,ROC曲線越接近圖的左側(cè)邊界,然后是頂部邊界,模型的判別性就越強(qiáng),就越能滿足敏感性和特異性目標(biāo)。
為了比較不同的模型,我們通常不直接使用曲線,而是計(jì)算曲線下的面積。這量化了模型區(qū)分正類和負(fù)類的整體能力。
這個(gè)所謂的 ROC-AUC(ROC 曲線下的面積)可以取 0 到 1 之間的值,值越高表示性能越好。事實(shí)上,我們的完美分類器將達(dá)到正好 1 的 ROC-AUC。
使用 ROC-AUC 指標(biāo)時(shí),必須記住基線不是 0,而是 0.5——完全隨機(jī)分類器的 ROC-AUC。如果我們使用 np.random.rand() 作為分類器,則生成的 ROC 曲線將是一條從 (0,0) 到 (1,1) 的對(duì)角線。
比較模型分析示例:隨機(jī)分類器的 ROC 曲線是對(duì)角線的,因此 ROC-AUC 為 0.5。以黃色顯示的實(shí)際 ML 分類器的 ROC 曲線始終位于該線上方,ROC-AUC 為 0.78 |源
使用 scikit-learn 生成 ROC 曲線和計(jì)算 ROC-AUC 非常簡(jiǎn)單。只需在模型訓(xùn)練腳本中編寫幾行代碼,即可為每個(gè)訓(xùn)練運(yùn)行創(chuàng)建此評(píng)估數(shù)據(jù)。使用 ML 實(shí)驗(yàn)跟蹤工具記錄 ROC-AUC 和 ROC 曲線圖時(shí),您可以稍后比較不同的模型版本。
實(shí)驗(yàn)記錄
在可視化、比較和調(diào)試模型時(shí),有條不紊地記錄所有實(shí)驗(yàn)非常有用。
?
?
計(jì)算和記錄 ROC-AUC from sklearn.metrics import roc_auc_score clf.fit(x_train, y_train) y_test_pred = clf.predict_proba(x_test) auc = roc_auc_score(y_test, y_test_pred[:, 1]) # optional: log to an experiment-tracker like neptune.ai neptune_logger.run["roc_auc_score"].append(auc) 創(chuàng)建和記錄 ROC 圖 from scikitplot.metrics import plot_roc import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(16, 12)) plot_roc(y_test, y_test_pred, ax=ax) # optional: log to an experiment tracker like neptune.ai from neptune.types import File neptune_logger.run["roc_curve"].upload(File.as_html(fig))
?
?
?校準(zhǔn)曲線
雖然機(jī)器學(xué)習(xí)分類器通常為每個(gè)類輸出介于 0 和 1 之間的值,但這些值并不代表統(tǒng)計(jì)意義上的可能性或置信度。在許多情況下,這完全沒(méi)問(wèn)題,因?yàn)槲覀冎粚?duì)獲得正確的標(biāo)簽感興趣。
但是,如果我們想報(bào)告置信水平以及分類結(jié)果,我們必須確保我們的分類器經(jīng)過(guò)校準(zhǔn)。校準(zhǔn)曲線是了解分類器校準(zhǔn)情況的有用視覺(jué)輔助工具。我們還可以使用它們來(lái)比較不同的模型或檢查我們重新校準(zhǔn)模型的嘗試是否成功。
讓我們?cè)俅慰紤]輸出介于 0 和 1 之間的值的模型的情況。如果我們選擇一個(gè)閾值,比如 0.5,我們可以將其轉(zhuǎn)換為二元分類器,其中模型輸出較高值的所有樣本都分配給正類(反之亦然)。
校準(zhǔn)曲線根據(jù)模型的輸出繪制“正分?jǐn)?shù)”?!罢?jǐn)?shù)”是給定模型輸出的樣本實(shí)際屬于正類的條件概率(P(樣本屬于正類|模型的輸出介于 0 和 1 之間))。
這聽(tīng)起來(lái)是不是太抽象了?讓我們看一個(gè)例子:
校準(zhǔn)曲線示例:比較不同型號(hào) | 來(lái)源:作者
首先,看一下對(duì)角線。它代表了一個(gè)完美校準(zhǔn)的分類器:模型的輸出介于 0 和 1 之間,恰好是樣本屬于正類的概率。例如,如果模型輸出 0.5,則樣本屬于正類或負(fù)類的幾率為 50:50。如果模型對(duì)樣本輸出 0.2,則該樣本屬于正類的可能性只有 20%。
接下來(lái),考慮樸素貝葉斯分類器的校準(zhǔn)曲線:您會(huì)看到,即使此模型輸出 0,樣本也有大約 10% 的幾率為正。如果模型輸出 0.8,則樣本仍有 50% 的可能性屬于負(fù)類。因此,分類器的輸出不能反映其置信度。
計(jì)算“正數(shù)的分?jǐn)?shù)”遠(yuǎn)非易事。我們需要根據(jù)模型的輸出創(chuàng)建條柱,由于模型值范圍內(nèi)的樣本分布通常不是均勻的,因此這很復(fù)雜。例如,邏輯回歸分類器通常將接近 0 或 1 的值分配給許多樣本,但很少輸出接近 0.5 的值。您可以在 scikit-learn 文檔中找到有關(guān)此主題的更深入討論。在那里,您還可以深入了解重新校準(zhǔn)模型的可能方法,這超出了本文的范圍。
就我們的目的而言,我們已經(jīng)了解了校準(zhǔn)曲線如何以易于掌握的方式可視化復(fù)雜的模型行為。通過(guò)快速瀏覽圖,我們可以看到模型是否經(jīng)過(guò)良好校準(zhǔn)以及哪個(gè)模型最接近理想。
可視化超參數(shù)優(yōu)化
超參數(shù)優(yōu)化是開(kāi)發(fā)機(jī)器學(xué)習(xí)模型的關(guān)鍵步驟。目的是選擇超參數(shù)的最佳配置——超參數(shù)的通用名稱,不是模型從數(shù)據(jù)中學(xué)習(xí)的,而是由其人類創(chuàng)建者預(yù)定義的??梢暬梢詭椭鷶?shù)據(jù)科學(xué)家了解不同超參數(shù)對(duì)模型性能和屬性的影響。
找到超參數(shù)的最佳配置本身就是一項(xiàng)技能,遠(yuǎn)遠(yuǎn)超出了我們將在這里重點(diǎn)關(guān)注的機(jī)器學(xué)習(xí)可視化方面。要了解有關(guān)超參數(shù)優(yōu)化的更多信息,我推薦這篇由前 Amazon AI 研究人員撰寫的關(guān)于提高 ML 模型性能的文章。
系統(tǒng)超參數(shù)優(yōu)化的常用方法是創(chuàng)建可能的參數(shù)組合列表,并為每個(gè)參數(shù)組合訓(xùn)練一個(gè)模型。這通常稱為“網(wǎng)格搜索”。
例如,如果您正在訓(xùn)練支持向量機(jī) (SVM),您可能希望嘗試參數(shù) C(正則化參數(shù))和 gamma(核系數(shù))的不同值:
?
?
import numpy as np C_range = np.logspace(-2, 10, 13) gamma_range = np.logspace(-9, 3, 13) param_grid = {“gamma”: gamma_range, “C”: C_range}
?
?
使用 scikit-learn 的 GridSearchCV,您可以為每個(gè)可能的組合(使用交叉驗(yàn)證策略)訓(xùn)練模型,并找到與評(píng)估指標(biāo)相關(guān)的最佳組合:
?
?
from sklearn.model_selection import GridSearchCV, grid = GridSearchCV(SVC(), param_grid=param_grid, scoring=’accuracy’) grid.fit(X, y)
?
?
網(wǎng)格搜索結(jié)束后,可以檢查結(jié)果:
?
?
print( "The best parameters are %s with a score of %0.2f" % (grid.best_params_, grid.best_score_) )
?
?
但我們通常不僅對(duì)找到最佳模型感興趣,還想了解其參數(shù)的影響。例如,如果一個(gè)參數(shù)不影響模型的性能,我們就不需要浪費(fèi)時(shí)間和金錢來(lái)嘗試更多不同的值。另一方面,如果我們看到隨著參數(shù)值的增加,模型的性能變得更好,我們可能希望為這個(gè)參數(shù)嘗試更高的值。
下面是我們剛剛執(zhí)行的網(wǎng)格搜索的可視化效果:
網(wǎng)格搜索可視化示例:使用不同值的 gamma 和 C 進(jìn)行 SVM 分類器訓(xùn)練如何在測(cè)試集上執(zhí)行 |源
從圖中可以看出,伽馬的值對(duì)支持向量機(jī)的性能影響很大。如果伽瑪設(shè)置得太高,則支持向量的影響半徑很小,即使通過(guò) C 進(jìn)行大量正則化,也可能導(dǎo)致過(guò)度擬合。在這種情況下,任何支持向量的影響區(qū)域都跨越整個(gè)訓(xùn)練集,使模型類似于線性模型,使用超平面來(lái)分隔不同類別的密集區(qū)域。
最佳模型位于 C 和 gamma 的對(duì)角線上,如第二個(gè)繪圖面板所示。通過(guò)調(diào)整 gamma(較低的值表示更平滑的模型)和增加 C(較高的值表示更強(qiáng)調(diào)正確的分類),我們可以遍歷這條對(duì)角線以獲得性能良好的模型。
即使從這個(gè)簡(jiǎn)單的示例中,您也可以看到可視化對(duì)于深入了解模型性能差異的根本原因有多么有用。這就是為什么許多機(jī)器學(xué)習(xí)實(shí)驗(yàn)跟蹤工具使數(shù)據(jù)科學(xué)家能夠創(chuàng)建不同類型的可視化來(lái)比較模型版本的原因。
特征重要性可視化
特征重要性可視化提供了一種清晰直觀的方式來(lái)掌握模型決策過(guò)程中每個(gè)特征的貢獻(xiàn)。在許多應(yīng)用中,了解哪些特征會(huì)顯著影響預(yù)測(cè)至關(guān)重要。
從機(jī)器學(xué)習(xí)模型中提取有關(guān)特征重要性的見(jiàn)解有很多不同的方法。從廣義上講,我們可以將它們分為兩類:
某些類型的模型(如決策樹(shù)和隨機(jī)森林)本身包含特征重要性信息作為其模型結(jié)構(gòu)的一部分。我們需要做的就是提取和可視化它。
目前使用的大多數(shù)機(jī)器學(xué)習(xí)模型都無(wú)法提供開(kāi)箱即用的特征重要性信息。我們必須使用統(tǒng)計(jì)技術(shù)和算法方法來(lái)揭示它們的每個(gè)輸入特征對(duì)模型最終輸出的重要性。
在下文中,我們將查看每個(gè)類別的一個(gè)示例:隨機(jī)森林模型的雜質(zhì)平均減少方法和與模型無(wú)關(guān)的 LIME 可解釋性方法。您可能想要研究的其他方法包括排列重要性、SHAP 和積分梯度。
就本文而言,我們不太關(guān)心如何獲取特征重要性數(shù)據(jù),而是關(guān)心其可視化。為此,條形圖是結(jié)構(gòu)化數(shù)據(jù)的首選,每個(gè)條形的長(zhǎng)度表示要素的重要性。熱圖顯然是圖像的最愛(ài),而對(duì)于文本數(shù)據(jù),突出顯示最重要的單詞或短語(yǔ)是典型的。
在業(yè)務(wù)環(huán)境中,特征重要性可視化是利益相關(guān)者溝通的寶貴工具。它提供了一個(gè)直截了當(dāng)?shù)臄⑹?,展示了主要影響預(yù)測(cè)的因素。這種透明度增強(qiáng)了決策能力,并可以培養(yǎng)對(duì)模型結(jié)果的信任。
使用雜質(zhì)平均減少法進(jìn)行特征重要性可視化示例 |來(lái)源:作者
雜質(zhì)平均減少法進(jìn)行特征重要性評(píng)估
雜質(zhì)(不純度)的平均減少量是衡量每個(gè)特征對(duì)決策樹(shù)性能的貢獻(xiàn)的指標(biāo)。要理解這一點(diǎn),我們首先需要了解“雜質(zhì)”在這種情況下的含義。
我們先打個(gè)比方:
假設(shè)我們有一個(gè)水果籃,里面有蘋果、梨和橙子。當(dāng)水果片放在籃子里時(shí),它們被徹底混合,我們可以說(shuō)這套水果的雜質(zhì)很高。
現(xiàn)在,我們的任務(wù)是按種類對(duì)它們進(jìn)行分類。如果我們把所有的蘋果都放進(jìn)一個(gè)碗里,把橘子放在托盤上,把梨放在籃子里,我們就會(huì)剩下三套純度完美的蘋果。
但轉(zhuǎn)折點(diǎn)來(lái)了:我們?cè)谧鰶Q定時(shí)看不到果實(shí)。對(duì)于每塊水果,我們都會(huì)被告知它的顏色、直徑和重量。然后,我們需要決定它應(yīng)該去哪里。因此,這三個(gè)屬性是我們的特點(diǎn)。
水果塊的重量和直徑將非常相似。它們對(duì)我們進(jìn)行分類沒(méi)有多大幫助——或者換一種說(shuō)法,它們對(duì)減少雜質(zhì)沒(méi)有幫助。
但是顏色會(huì)有所幫助。我們可能仍然難以區(qū)分綠色或黃色的蘋果和綠色或黃色的梨,但如果我們得知顏色是紅色或橙色,我們就可以自信地做出決定。因此,“顏色”將給我們帶來(lái)最大的雜質(zhì)平均減少。
現(xiàn)在,讓我們?cè)跊Q策樹(shù)和隨機(jī)森林的上下文中使用這個(gè)類比:
在構(gòu)建決策樹(shù)時(shí),我們希望每個(gè)節(jié)點(diǎn)在目標(biāo)變量方面盡可能純粹。用更通俗的術(shù)語(yǔ)來(lái)說(shuō),在為我們的樹(shù)創(chuàng)建新節(jié)點(diǎn)時(shí),我們的目標(biāo)是找到最能將到達(dá)節(jié)點(diǎn)的樣本分成兩個(gè)不同集的特征,以便具有相同標(biāo)簽的樣本位于同一集合中。(有關(guān)完整的數(shù)學(xué)詳細(xì)信息,請(qǐng)參閱 scikit-learn 文檔)。
決策樹(shù)中的每個(gè)節(jié)點(diǎn)都減少了雜質(zhì)——粗略地說(shuō),它有助于按目標(biāo)標(biāo)簽對(duì)訓(xùn)練樣本進(jìn)行排序。假設(shè)一個(gè)特征是樹(shù)中許多節(jié)點(diǎn)的決策標(biāo)準(zhǔn),并且它可以有效地干凈地劃分樣本。在這種情況下,它將負(fù)責(zé)決策樹(shù)總體上實(shí)現(xiàn)的雜質(zhì)減少的很大一部分。這就是為什么查看一個(gè)特征所負(fù)責(zé)的“雜質(zhì)平均減少”是衡量特征重要性的一個(gè)很好的指標(biāo)。
嗚,這真是太復(fù)雜了!
幸運(yùn)的是,可視化并不難閱讀。我們可以清楚地識(shí)別模型的主要驅(qū)動(dòng)因素,并在特征選擇中使用這些信息。將模型的輸入空間減少到最關(guān)鍵的特征可以降低其復(fù)雜性,并可以防止過(guò)度擬合。
此外,了解特征重要性有助于數(shù)據(jù)準(zhǔn)備。重要性較低的要素可能是移除或合并的候選要素,從而簡(jiǎn)化了輸入數(shù)據(jù)預(yù)處理。
不過(guò),在我們繼續(xù)之前,我想提一下一個(gè)重要的警告。由于節(jié)點(diǎn)的雜質(zhì)減少是在訓(xùn)練期間確定的,因此使用訓(xùn)練數(shù)據(jù)集,“雜質(zhì)的平均減少”不一定轉(zhuǎn)化為以前看不見(jiàn)的測(cè)試數(shù)據(jù):
假設(shè)我們的訓(xùn)練樣本已編號(hào),此編號(hào)是模型的輸入特征。然后,如果我們的決策樹(shù)足夠復(fù)雜,它可以只知道哪個(gè)樣本具有哪個(gè)標(biāo)簽(例如,“水果 1 是橙子”、“水果 2 是蘋果”......數(shù)字特征的雜質(zhì)平均減少將是巨大的,它將在我們的可視化中作為一個(gè)非常重要的特征出現(xiàn),盡管在將我們的模型應(yīng)用于以前從未見(jiàn)過(guò)的數(shù)據(jù)時(shí),它完全沒(méi)有用。
局部可解釋模型無(wú)關(guān)解釋 (LIME)
局部可解釋性方法旨在闡明模型在特定實(shí)例中的行為。(與此相反的是全局可解釋性,即檢查模型在其整個(gè)特征空間中的行為。
局部可解釋模型不可知解釋 (LIME) 和產(chǎn)生重要特征的示例 |來(lái)源:作者
最古老且仍然廣泛使用的技術(shù)之一是 LIME(本地可解釋模型不可知解釋)。為了揭示每個(gè)輸入特征對(duì)模型預(yù)測(cè)的貢獻(xiàn),需要擬合一個(gè)線性模型,該模型近似于模型在特征空間特定區(qū)域的行為。粗略地說(shuō),線性模型的系數(shù)反映了輸入要素的重要性。結(jié)果可以可視化為特征重要性圖,突出顯示對(duì)特定預(yù)測(cè)最有影響力的特征。
局部可解釋性技術(shù)可以從復(fù)雜的算法中提取直觀的見(jiàn)解。這些結(jié)果的可視化可以支持與業(yè)務(wù)利益相關(guān)者的討論,或者成為與領(lǐng)域?qū)<医徊鏅z查模型學(xué)習(xí)行為的基礎(chǔ)。它們提供實(shí)用的、可操作的見(jiàn)解,增強(qiáng)對(duì)模型復(fù)雜內(nèi)部運(yùn)作的信任,并且可以成為促進(jìn)機(jī)器學(xué)習(xí)采用的重要工具。
如何在機(jī)器學(xué)習(xí)中采用模型可視化?
在本節(jié)中,我將分享有關(guān)將模型可視化無(wú)縫集成到日常數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)例程中的技巧。
1. 從明確的目標(biāo)開(kāi)始
在深入研究模型可視化之前,請(qǐng)確定一個(gè)明確的目的。問(wèn)問(wèn)自己,“我打算通過(guò)可視化實(shí)現(xiàn)哪些具體目標(biāo)?
您是否正在尋求...
...提高模型性能?
...增強(qiáng)可解釋性?
...更好地將結(jié)果傳達(dá)給利益相關(guān)者?
定義目標(biāo)將提供有效可視化所需的方向。
2. 選擇合適的可視化效果
始終采用自上而下的方法。這意味著您從非常抽象的級(jí)別開(kāi)始,然后更深入地探索以獲得更多見(jiàn)解。
例如,如果您正在尋求提高模型的性能,請(qǐng)確保首先從簡(jiǎn)單的方法開(kāi)始,例如使用簡(jiǎn)單的折線圖繪制模型的精度和損失。
假設(shè)您的模型過(guò)擬合。然后,您可以使用特征重要性技術(shù)根據(jù)特征對(duì)模型性能的貢獻(xiàn)對(duì)特征進(jìn)行排名。您可以繪制這些特征重要性分?jǐn)?shù),以可視化模型中最具影響力的特征。重要性較高的特征可能指向過(guò)擬合和信息泄露。
同樣,您可以為相關(guān)要素創(chuàng)建部分依賴關(guān)系圖。PDP 顯示目標(biāo)變量的預(yù)測(cè)如何隨著特定特征的變化而變化,同時(shí)保持其他特征不變。您必須查找曲線中的不穩(wěn)定行為或劇烈波動(dòng),這可能表明由于該特征而導(dǎo)致的過(guò)度擬合。
3. 選擇合適的工具
選擇正確的工具取決于手頭的任務(wù)和工具提供的功能。Python 提供了大量庫(kù),如 Matplotlib、Seaborn 和 Plotly,用于創(chuàng)建靜態(tài)和交互式可視化。特定于框架的工具(例如用于 TensorFlow 的 TensorBoard 和用于 scikit-learn 的 scikit-plot)對(duì)于特定于模型的可視化非常有價(jià)值。
4. 迭代和改進(jìn)
請(qǐng)記住,模型可視化是一個(gè)迭代過(guò)程。根據(jù)團(tuán)隊(duì)和利益相關(guān)者的反饋不斷優(yōu)化可視化效果。最終目標(biāo)是使您的模型透明、可解釋且可供所有利益相關(guān)者訪問(wèn)。他們的意見(jiàn)和不斷變化的項(xiàng)目要求可能意味著您需要重新考慮和調(diào)整您的方法。
將模型可視化整合到您的日常數(shù)據(jù)科學(xué)或機(jī)器學(xué)習(xí)實(shí)踐中,使您能夠清晰、自信地做出數(shù)據(jù)驅(qū)動(dòng)的決策。無(wú)論您是數(shù)據(jù)科學(xué)家、領(lǐng)域?qū)<疫€是決策者,將模型可視化作為常規(guī)實(shí)踐都是充分利用機(jī)器學(xué)習(xí)項(xiàng)目潛力的關(guān)鍵一步。
總結(jié)
有效的機(jī)器學(xué)習(xí)模型可視化是任何數(shù)據(jù)科學(xué)家不可或缺的工具。它使從業(yè)者能夠獲得洞察力,做出明智的決策,并透明地傳達(dá)結(jié)果。
在本文中,我們介紹了大量有關(guān)如何可視化機(jī)器學(xué)習(xí)模型的信息。總而言之,以下是一些關(guān)鍵要點(diǎn):
機(jī)器學(xué)習(xí)中可視化的目的:
可視化簡(jiǎn)化了復(fù)雜的 ML 模型結(jié)構(gòu)和數(shù)據(jù)模式,以便更好地理解。
交互式可視化和 Visual ML 工具使用戶能夠與數(shù)據(jù)和模型進(jìn)行動(dòng)態(tài)交互。他們可以調(diào)整參數(shù),放大細(xì)節(jié),并更好地了解ML系統(tǒng)。
可視化有助于做出明智的決策和有效的結(jié)果溝通。
機(jī)器學(xué)習(xí)可視化的類型:
模型結(jié)構(gòu)可視化可幫助數(shù)據(jù)科學(xué)家、AI 研究人員和業(yè)務(wù)利益相關(guān)者了解復(fù)雜的算法和數(shù)據(jù)流。
通過(guò)模型性能可視化,可以深入了解單個(gè)模型和模型集成的性能特征。
用于比較模型分析的可視化可幫助從業(yè)者選擇性能最佳的模型或驗(yàn)證新模型版本是否是一種改進(jìn)。
特征重要性可視化揭示了每個(gè)輸入特征對(duì)模型輸出的影響。
模型可視化的實(shí)踐:
從明確的目標(biāo)和簡(jiǎn)單的可視化開(kāi)始。
選擇適合您需求且目標(biāo)受眾可以使用的適當(dāng)可視化方法。
選擇合適的工具和庫(kù),幫助您高效地制作準(zhǔn)確的可視化效果。
持續(xù)聽(tīng)取反饋,并根據(jù)利益相關(guān)者的需求調(diào)整可視化效果。
審核編輯:黃飛
?
評(píng)論
查看更多