機器學習設計模式-如何呈現需要被預測的問題
在資料呈現的章節我們著眼於資料呈現的設計模式,這些模式對ML模型輸入的各種呈現方式進行了整理。本文著眼於不同類型的ML問題,並分析模型架構如何因問題而異。input和output types是影響模型架構的兩個關鍵因素。例如,監督式ML問題的output可能會根據所解決的問題是classification還是regression而有所不同。針對特定類型的input data存在特殊的neural network:用於images、speech、text和其他具有spatiotemporal correlation的資料的convolutional layers,用於sequential data的recurrent layer等。大量文件圍繞特殊技術出現,例如max pooling、attention等這些類型的layers。此外,還針對常見問題設計了特殊類別的解決方案,例如recommendations(例如matrix factorization)或time-series forecasting(例如 ARIMA)。最後,一組更簡單的模型和常見的idioms可用於解決更複雜的問題,例如,text生成通常涉及classification model,其輸出使用beam search algorithm進行後置處理。
為了聚焦我們的討論,我們將忽略與專業ML領域相關的模式和idioms。相反,我們將專注於regression和classification,並檢查僅在這兩種類型的 ML 模型中具有問題呈現的模式。
Reframing 設計模式採用直觀上是regression問題的解決方案,並將其視為classification問題。Multilabel設計模式處理training example可以屬於多個class的情況。Cascade設計模式解決了將ML問題分解為一系列ML 問題的情況。 Ensemble 設計模式通過訓練多個模型並結合它們的responses來解決問題。Netural Class設計模式著眼於如何處理專家意見不一致的情況。Reblancing設計模式推薦了處理高度偏斜(Highly skewed)或不平衡資料的方法。
設計模式五:Reframing
Reframing設計模式是指改變ML問題output的呈現。 例如,我們可以將一些直觀的regression problem作為classification problem(反之亦然)。
問題
建立ML solution的第一步是framing problem。這是一個supervised learning problem嗎?還是unsupervised呢?有哪些特點?如果是監督式學習,labels是什麼?多少error是可以接受的?當然,這些問題的答案必須結合training data、手頭的任務和成功指標來考慮。
例如,假設我們想建立一個ML模型來預測特定位置未來的降雨量。從廣義上講,這是regression還是classification?由於我們正在嘗試預測降雨量(例如,0.3 cm),因此將其視為time-series forcasting問題是有道理的:鑑於當前和歷史氣候和天氣模式,我們應該期望多少降雨量在接下來的 15 分鐘內在特定區域?或者,因為labels(降雨量)是一個real number,我們可以建立一個regression model。當我們開始開發和訓練我們的模型時,我們發現天氣預報比聽起來更難。我們預測的降雨量全部都偏離,因為對於同一組特徵,有時會下雨 0.3 cm,有時會下雨 0.5 cm。我們應該做些什麼來改進我們的預測?我們需要為我們的網路添加更多layer嗎?或者製造更多的feature?也許更多的資料會有所幫助?也許我們需要不同的loss function?任何這些調整也許都可以改進我們的模型。但是regression是我們提出這個任務的唯一方法嗎?也許我們可以以提高我們的task performance的方式重新reframe我們的ML目標。
解決方案
這裡的核心問題是降雨是機率性的。 對於同一組feature,有時會下雨 0.3 cm,有時會下雨 0.5 cm。 然而,即使regression能夠學習兩個可能的數字,它也僅限於能預測一個數字而已。 我們可以將目標重新定義為classification problem,而不是將預測降雨量作為regression task。 有不同的方法可以實現這一點。 一種方法是對discrete probability distribution進行建模,如下圖所示。 我們不是將降雨量預測為real value輸出,而是將輸出建模為multiclass,給出接下來 15 分鐘的降雨量在一定降雨量範圍內的機率。
regression方式和這種重新定義成classification方式都可以預測接下來 15 分鐘的降雨量。然而,classification方式允許模型擷取不同數量降雨的機率分佈,而不必選擇資料分佈的平均值。以這種方式對分佈進行建模是有利的,因為降雨量不會是常態分佈(典型鐘形曲線),而是遵循 Tweedie distribution,這使得points at zero佔優勢。實際上,這就是 Google Research 論文中採用的方法,該論文使用 512-way categorical distribution預測特定位置的降雨率。對分佈建模可能有利的其他原因是當distribution是bimodal的,或者甚至是常態分佈但variance是很大時。
reframe problem的另一個原因是當目標在其他類型的模型中表現更好時。例如,假設我們正在嘗試為vidoe建立一個推薦系統。建立這個問題的一種方式是作為預測用戶是否可能觀看某個vidoe的classification problem。然而,這種框架可以導致推薦系統優先考慮click bait。將其重新建構為預測video的fraction(將要被觀看的)的regression problem應該會更好。
為何它是有效的
在構建ML解決方案時,改變context並重reframe problem的任務會有所幫助。我們沒有學習single real number,而是將預測目標放寬為discrete probalility distribution。由於bucketing,我們損失了一點預測的準確度,但獲得了完整PDF(probability density function)的expressiveness。分類模型提供的discretized predictions比更嚴格的回歸模型更擅長學習複雜的目標。
這種分類框架的另一個優點是我們獲得了預測值的後驗(posterior)概率分佈,這提供了更細微的資訊。例如,假設學習到的分佈是bimodal的。通過將分類建模為discrete probability distribution,該模型能夠擷取預測的bimodal structure,如下圖所示。而如果只預測numeric value,則這個資訊將會lost掉。根據use case的不同,這可以使task更容易學習並且更具優勢.
擷取不確定性
讓我們回到出生資料集和預測嬰兒體重的任務。 由於嬰兒體重是一個real value,直覺上這是一個regression problem。 但是,請注意,對於特定的一input入,weight_pounds(label)可以採用許多不同的value。 我們看到,對於一組特定的input values(38 週時 25 歲的母親所生的男嬰),嬰兒的體重分佈大致遵循以約 7.5 磅為中心的常態分佈。
但是,我們可以注意分佈的寬度,即使分佈的峰值為 7.5 磅,然而某些嬰兒小於 6.5 磅或大於 8.5 磅的可能性非常大(實際上為 33%)! 這種分佈的寬度表明預測嬰兒體重問題有著不可減少的誤差。 事實上,如果我們將這個問題定義為regression problem,我們可以在這個問題上獲得的最佳root mean square error如下圖中所見分佈的standard deviation。
如果我們將此視為regression problem,我們必須將預測結果聲明為 7.5 +/-1.0(或任何STD deviation)。 然而,分佈的寬度會因input的不同組合而異,因此learning width本身就是另一個ML問題。 比如第36週,同齡媽媽的STD deviation是1.16磅。 Quantiles regression,稍後會介紹,它試圖以非參數方式做到這一點。
通過reframing problem,我們將模型訓練為multiclass classification,該模型學習特定的training example的discrete probability distribution。 這些discretized predictions在擷取不確定性方面更加的靈活,並且比regression model能夠更好地接近複雜目標。 在inference時,模型預測與這些潛在outputs相對應的一組概率。 也就是說,我們獲得了一個discrete PDF,給出了任何特定權重(weight)的相對可能性。 當然,這裡必須小心,classification model可能未經校準(例如模型是overly confident 和錯誤)。
改變目標
在某些情況下,將classification任務reframe為regression可能是有效益的。例如,假設我們有一個大型電影資料庫,用戶評分範圍從 1 到 5,用於用戶觀看和評分的所有電影。我們的任務是建立一個ML模型,用於向我們的用戶提供推薦。
我們將其視為classification任務,我們可以考慮建立一個模型,該模型將 user_id 作為input,以及該用戶之前的電影觀看次數和評分,並預測我們的資料庫中接下來要推薦的電影。但是,我們可以將此問題reframe為regression。我們的模型可以進行multitask learning,而不是模型中有與我們資料庫電影相對應的categroical output,模型可以學習以下用戶的許多關鍵characteristices(例如收入、客戶群等)可能會觀看的特定電影。
Reframe成regression task,該模型現在預測特定電影的user-space 的資料呈現。為了提供推薦服務,我們選擇最接近用戶已知characteristics的電影集。通過這種方式,我們將得到一組相似於該user的user觀看過的電影,而不是像classification中那樣提供用戶喜歡電影的概率模型。
通過將推薦電影的classification problem重新定義為user characteristics的regression,我們能夠簡單的調整我們的推薦模型以推薦熱門電影,而無需每次都訓練單獨的classification model。
當資料的呈現是數字時,這具有直觀的解釋,這種類型的模型方法也很有用;例如,可以使用緯度和經度對代替市區預測。假設我們想預測哪個城市將經歷下一次病毒爆發,或者台北市哪個區域的房地產價格將飆升。預測緯度和經度並選擇離該位置最近的區域可能更容易,而不是預測區域本身。
取捨與替代方案
Fraem problem的方法很少只會有一種,了解特定implementation的任何取捨或替代方案是有幫助的。 例如,將regression的輸出值bucketizing是一種將問題reframing為classification task的方法。 另一種方法是multitask learning,它使用多個預測頭將兩種task(classification和regression)組合到一個模型中。 對於任何reframing technique,了解data limitations 或引入label bias的風險都很重要。
Bucketized outputs
將regression任務reframing為classification的典型方法是bucketize output value。 例如,如果我們的模型用於指出嬰兒出生時可能需要重症監護的時機,使用下表中的類別就足夠了。
我們的regression model現在變成了multiclass classification。直觀的說,預測四種可能的分類情況中的一種要比從連續real numbers中預測single vlue更容易,就像預測 is_underweight 的二進制 0 與 1 而不是四個單獨的類別 high_weight 與 avg_weight 更容易與 low_weight 與 very_low_weight 。通過使用categorical outputs,我們的模型不會因為任意接近actual output value而受到激勵,因為我們實際上已經將output label更改為一個range 的value而不是single real value。
在Notebook中,我們訓練了regression model和multiclass model。regression model在validation set上的 RMSE 為 1.3,而classification model的準確率為 67%。比較這兩個模型很困難,因為一個評估指標是 RMSE,另一個是準確性。最後,設計決策應該由use case決定。如果醫療決策是基於bucketed values,那麼我們的模型應該是使用這些buclets的分類。但是,如果需要更精確地預測嬰兒體重,哪麼使用回歸模型是有更效的。
擷取不確定性的其他方式
還有其他方法可以擷取regression中的不確定性。 一個簡單的方法是進行分位數回歸。 例如,我們可以估計需要預測的條件的第 10、20、30、到第 90 個百分位數,而不是僅預測平均值。 分位數回歸是線性回歸的擴展。 另一方面,Reframing可以處理更複雜的ML模型。
另一種更複雜的方式是使用像 TensorFlow Probability 這樣的framework來進行回歸。 但是,我們必須明確地對output的distribution進行建模。 例如,如果期望的output圍繞依賴於input的均值常態分佈,則模型的output layer將是:
tfp . layers . DistributionLambda ( lambda t : tfd . Normal ( loc = t , scale = 1 ))
另一方面,如果我們知道variance隨著均值而增加,我們或許可以使用 lambda function對其進行建模。 另一方面,Reframing不需要我們對posterior distribution進行建模。
重點:
在訓練任何ML模型時,資料是關鍵。 更複雜的關係通常需要更多的training data example才能找到那些難以捉摸的模式。 考慮到這一點,重要的是要考慮如何比較regression或classification模型的資料要求。 classification task的一個通用經驗法則是,每個label category的模型特徵數量應該是模型特徵數量的 10 倍。 對於回歸模型,經驗法則是模型feature數量的 50 倍。 當然,這些數字只是粗略的,並不精確。 然而,直覺是regression task通常需要更多的training example。 此外,這種對大量資料的需求只會隨著任務的複雜性而增加。 因此,在考慮使用的模型類型或在分類的情況下,label category的數量時,可能存在資料限制。
預測的精確度
當我們考慮將regression模型reframe為multiclass classification時,output label的 bins 寬度決定了分類模型的精度。 在我們的嬰兒體重範例中,如果我們需要從discrete probability density function中獲得更精確的資訊,我們將需要增加分類模型的 bin 數量。 下圖顯示了discrete probability distribution在 4-ways或 10-ways分類中的樣子。
PDF 的尖度將task的精度表示為regression。 更清晰的 PDF 表示output distribution的standard deviation更小,而更寬的 PDF 表示更大的standard deviation,因此variance更大。 對於非常尖銳的density function,最好一定要使用regression model(如下圖)
限制預測的範圍
Reframe problem的另一個原因是必須限制預測輸出的範圍。 例如,假設regression problem的實際輸出值在 [3, 20] 範圍內。 如果我們訓練一個regression model,其中output layer是一個linear activation function,那麼模型預測總是有可能落在這個範圍之外。 限制輸出範圍的一種方法是reframe problem。 將最後一層的activation function設為 sigmoid function,使其在 [0,1] 範圍內,並讓最後一層將這些值縮放到所需範圍:
我們可以驗證該模型現在發出 [3, 20] 範圍內的數字。 由於output是 sigmoid,因此模型實際上永遠不會達到範圍的最小值和最大值,只會非常接近它。 當我們用一些隨機資料訓練上述模型時,我們得到了 [3.03, 19.99] 範圍內的值。
Label的偏誤
像matrix factorization這樣的推薦系統可以在神經網路的context中reframe,既可以作為regression也可以作為classification。這種context變化的一個優點是,構建為regression或classification模型的神經網路可以在matrix factorization中學習到的用戶user和item embedding之外包含更多的附加功能。所以它可以是一個有吸引力的選擇。
然而,在reframe problem時考慮target label的性質很重要。例如,我們將推薦模型reframe為classification task,該任務預測用戶點擊某個video縮圖的可能性。這似乎是一個合理的reframing,因為我們的目標是提供用戶的選擇和觀看的內容。不過需要注意。這種label的變化實際上並不符合我們的prediction task。通過針對user click進行優化,我們的模型會在不經意間promote click bait,而實際上並未向user推薦使用內容。
相反,一個更有效的label是video觀看時間,將我們的recommendation模型 reframe為regression。或者我們可以修改classification objective來預測user觀看至少一半時間的video的可能性。通常有不止一種合適的方法,在制定解決方案時全面考量問題很重要。
Multitask learning
Reframing的一種替代方是multitask learning。 不試圖在regression或classification之間做出選擇,而是兩者兼具。 一般來說,multitask learning是指任何一種ML model,其中優化了一個以上的loss function。 這可以通過許多不同的方法實現,但神經網路中multitask learning的兩種最常見形式是通過hard parameter sharing和soft parameter sharing。
Parameter sharing是指神經網路的參數在不同的output task之間共享,例如regression和classification。 當模型的hidden layer在所有output task之間共享時,就產生了hard parameter sharing。 在soft parameter sharing中,每個label都有自己的神經網路,有自己的參數,通過某種形式的正則化(regularization)鼓勵不同模型的參數相似。 下圖顯示了hard parameter sharing和soft parameter sharing的典型架構。
上圖中,我們的模型可以有兩個起始:一個是regression output,另一個則是classification output。 例如,此篇文章使用 softmax probabilities的classification output和regression output來訓練computer vision模型來預測邊界框。 他們表明,與針對classification和localization(定位)task分別訓練網路的相關工作相比,這種方式有著更好的效能。 這個想法是通過parameter sharing,同時學習task,來自兩個loss function的gradient updatest傳送兩種output並產生generalizable mode。
設計模式六:Multilabel
Multilabel設計模式指的是我們可以為給特定的training exampleeo給予多個label的問題。 對於神經網路,這種設計需要更改模型的final output layer中使用的activation function,並選擇我們的Application將如何解析model output。 我們需要注意,這與multiclass problem不同,在multiclass classification problem中,從一組 (大於 1) 個可能的class中為單一個example分配了一個label。 我們還可能還會聽說Multilabel設計模式被稱為multilabel、multiclassification,因為它關乎從一組多個可能的class中選擇多個label。 在討論這種模式時,我們將主要關注的會是神經網路。
問題
通常,模型預測任務涉及將單一classification應用於特定的training example。 這個預測由 的N 個( N 大於 1)possible classes決定。在這種情況下,通常使用 softmax 作為output layer的activation function。 使用 softmax,我們模型的輸出是一個 N-element array其中所有value的總和為 1。每個vlaue表示特定training example與這個training example的index的class相關聯的概率。
例如,如果我們的模型將圖片分類為貓、狗或兔子,對於特定圖片,softmax output可能是這樣的:[. 88, .04, .08]。這意味著我們的模型預測圖q片為是貓的可能性為 88%,是狗的可能性為 4%,是兔子的可能性為 8%。因為在這種情況下每張圖片只能有”一個可能的label”,所以我們可以採用 argmax(最高概率的index)來確定我們模型的預測類別。不太常見的情況是每個training example都可以分配多個label,這就是該模式所解決的問題。
Multilabel設計模式適用於在所有資料模式上訓練的模型。對於圖像分類,在較早的貓、狗、兔子範例中,我們可以改為使用訓練圖像,每個圖像中有著多種動物,因此可以有多個label。對於text model,我們可以想像一些場景,其中text可以被標記為多個label。以 BigQuery 上的 Stack Overflow 問題資料集為例,我們可以建立一個模型來預測與特定問題相關的label。例如,問題“如何plot pandas Dataframes?”可以標記為“Python”、“pandas”和“visualization”。另一個multilabel text classification example是識別惡毒評論的模型。對於這個模型,我們可能想用多個惡毒label來標記評論。因此,評論可以被標記為“hateful”和“obscene”。
這種設計模式也適用於tabular datasets。想像一個醫療資料集,每個患者都有不同的身體特徵,如身高、體重、年齡、血壓等。該資料可用於預測多種情況的存在。例如,患者可能同時顯示出患心臟病和糖尿病的風險。
解決方案
建立可以為特定training example分配多個label模型的方法是在我們的final output layer中使用 sigmoid activation function。與生成所有value總和為 1 的array(如softmax )不同,sigmoid array中的每個single value都是 0 到 1 之間的浮點數。 也就是說,在實現multilabel設計模式時,我們的label需要是多個hot encoded。 multi-hot array的長度與我們模型中的classes數量相對應,這個label array中的每個output將是一個 sigmoid value。
在上述圖像範例的基礎上,假設我們的training dataset包含具有不止一種動物的圖像。包含貓和狗但不包含兔子的圖像的 sigmoid 輸出可能如下所示:[. 93, .87, .11]。這個輸出意味著模型有 93% 的信心圖片包含一隻貓,87% 的信心它包含一隻狗,11% 的信心它包含一隻兔子。使用 Keras Sequential API 的具有 sigmoid output的 28 × 28 pixel image的模型可能如下所示:
這邊的sigmoid model與 softmax 範例之間output的主要區別在於,softmax array保證包含三個總和為 1 的value,而 sigmoid output將包含三個value,每個value都在 0 和 1 之間。
Sigmoid與Softmax 的不同之處
Sigmoid 是一種非線性、連續而且是 differentiable activation function,它採用 ML 模型前一層中每個神經元的output,並將這些output的value壓縮在 0 和 1 之間。下圖顯示sigmoid function的樣子。
sigmoid 將single value作為input並輸出singel input,而 softmax 將一個array value作為input並將其轉換為一個總和為 1 的probabilities array。 softmax function的input可以是 N 個 sigmoid 的output . 在每個樣本只能有一個label的multiclass problem中,使用 softmax 作為最後一個layer以獲取probability distribution。 在multilabel模式中,output array的總和不為 1 是可以接受的,因為我們正在評估每個單獨label的概率。 以下是範例為sigmoid 和 softmax output array:
sigmoid = [. 8, .9, .2, .5]
softmax = [. 7, .1, .15, .05]
取捨與替代方案
在遵循Multilabel設計模式和使用 sigmoid output時,需要考慮幾種特殊情況。 接下來,我們將探討如何建立具有兩種可能label classes的模型、如何理解 sigmoid result以及Multilabel模型的其他重要考量因素。
Sigmoid output 模型的兩種classes
有兩種類型的模型,其中output可以屬於兩種可能的類別(classes):
- 每一個training example只能被assign給一個class. 這同時也稱為二元分類(binary classification)而這也是一mutliclass capssification的特別型態。
- 有一些training example 可以同時有著兩種classes. 這種就稱為multiclassification.
下圖顯示出這些classification的不同之處。
第一種情況(binary classification)的獨特之處在於它是唯一一種我們會考慮使用 sigmoid 作為activation function的singel-label classification。 對於幾乎所有其他multiclass classification(例如,將text 分類為五個可能分類為其中一種),我們將使用 softmax。 然而,當我們只有兩個class時,softmax 就是多餘的。 以預測特定交易是否欺詐的模型為例。 如果我們在這個例中使用了 softmax 輸出,那麼欺詐性模型預測可能如下所示:
[,03, .97]
在這個範例中,第一個index對應“非欺詐”,第二個索引對應“欺詐”。 這是多餘的,因為我們也可以用single scalar vlaue來呈現,因此使用 sigmoid output。 相同的預測可以簡單地表示為 0.97。 因為每個input只能分配一個class,所以我們可以從這個 0.97 的output推斷出該模型預測了 97% 的欺詐機率和 3% 的非欺詐機率。
因此,對於二元分類模型,最好使用具有 sigmoid activation function的output為 1。 具有singel output node的模型也更有效率,因為它們的可訓練參數更少,而且訓練速度可能更快。 以下是二元分類模型的output layer的樣子:
keras.layers.Dense( 1, activation =’ sigmoid’)
對於training example可能屬於兩個可能的類別並適合multilabel設計模式的第二種情況,我們是用 sigmoid,這次使用two-element output:
keras.layers.Dense( 2, activation =’ sigmoid’)
我們應該使用哪一個Loss function
現在我們知道什麼時候在我們的模型中使用 sigmoid 作為activation function,我們應該如何選擇使用哪個loss function? 對於我們的模型具有one-element output的binary classification情況,使用binary cross-entropy loss。 在 Keras 中,我們在compile模型時提供了一個loss function:
model.compile( loss =’ binary_crossentropy’, optimizer =’ adam’, metrics =[‘ accuracy’])
我們還對具有 sigmoid output的multilabel模型使用inary cross-entropy loss。 這是因為,如下圖所示,具有三個classes的multilabel問題本質上是三個較小的binary classification問題。
解析Sigmoid的結果
要為具有 softmax output的模型提取predicted label,我們可以簡單地採用output array的 argmax(最大value index)來得到predicted class。 解析 sigmoid output不是很直覺。 我們需要評估output layer中每個class的概率,並考慮我們use case的probability threshold,而不是採用預測概率最高的class。 這兩種選擇在很大程度上取決於我們模型的end user application。
註解
通過threshold,指的是我們對確認input屬於特定class感到滿意的概率。 例如,如果我們正在建立一個模型來對圖片中的不同類型的動物進行分類,即使模型只有 80% 的可信度該圖片包含貓,我們也可能會說一張圖像有一隻貓。 或者,如果我們正在建立一個進行醫療系統預測的模型,我們可能希望該模型在確認特定醫療狀況存在與否之前接近 99% 的可信度。 雖然threshold是我們需要為任何class的classification model考慮的事情,但它與multilabel設計模式尤其相關,因為我們需要為每個class確定threshold,並且它們可能是不同的。
來看一個具體的例子,我們使用 BigQuery 中的 Stack Overflow 資料集並使用它來建立一個模型,該模型根據標題預測與 Stack Overflow 問題相關聯的tag。 我們將我們的資料集限制為僅包含五個tag的問題:
我們模型的output layer如下:
keras.layers.Dense( 5, activation =’ sigmoid’)
讓我們來看看 Stack Overflow 的問題“What is the definition of a non-trainable parameter?” 作為input example。 假設我們的output indices與查詢中的tag順序相對應,該問題的output可能如下所示:
[.96, .81, .03, .09, .68]
我們的模型有 96% 的把握將此問題標記為 Keras,81% 的把握將其標記為 TensorFlow。在評估model predictions時,我們需要 iterate output array中的每個element,並確定我們希望如何向end use顯示這些結果。如果 81% 是我們所有tag的threshold,我們將顯示與此問題相關的 Keras 和 TensorFlow。或者,也許我們希望鼓勵user 盡可能多加tag,並且我們希望顯示預測可信度高於 50% 的任何tag的選項。
對於像這樣的例子,目標主要是建議可能的tag,而不是強調讓tag完全正確,一個典型的經驗法則是使用 n_specific_tag / n_total_examples 作為每個class的threshold。n_specific_tag 是資料集中具有一個tag的example數量(例如,“pandas”),n_total_examples 是資料集中所有標籤的example總數。這確保模型用根據某個tag在training dataset中的出現來猜測它的效能要好。
如我們所見,multilabel模型在我們如何解析預測方面提供了更大的靈活性,並要求我們仔細考慮每個class的output。
重點:
想要更精確的threshold,我們可以考慮使用 S-Cut 或優化模型的 F-measure。 校準每個標籤tag的概率通常也有幫助,尤其是當有數千個tag並且我們想考量其中的前 K 個時(這在"search"和"ranking"的問題中很常見)。
資料集的考量
在處理single-label classification tasks時,我們可以通過針對每個class的相對等量的training example來確保我們的資料集是平衡的。對於multilabel設計模式,建立平衡的資料集更需要下功夫。以 Stack Overflow 資料集為例,可能會有很多問題同時標記為 TensorFlow 和 Keras。但也會有一些與 TensorFlow 無關的關於 Keras 的問題。相的,我們可能會看到有關繪製帶有 matplotlib 和 pandas tag的資料問題,以及有關帶有 pandas 和 scikit-learn tag的preprocessing的問題。為了讓我們的模型了解每個tag的獨特之處,我們需要確保訓training dataset由每個tag的不同組合來組成。如果我們資料集中的大多數 matplotlib 問題也被標記為pandas,則模型將無法自行學習對 matplotlib 進行分類。為了解決這個問題,可以考慮我們模型中可能存在著tag之間的不同關係連結,並計算屬於每個重疊tag組合的training example的數量。
在探索資料集中tag之間的關係時,我們也可能會遇到hierachical labels。 ImageNet 是圖像分類資料集,包含數以千計已經有tag的image,通常用作圖像模型transfering learning的起始。 ImageNet 中使用的所有albel都是hierarchical,這意味著所有image至少有一個tag,並且許多image具有更多特定的tag,這些tag是層次結構的一部分。以下 ImageNet 中一個tag層次結構的範例:
animal → invertebrate → arthropod → arachnid → spider
根據資料集的大小和性質,有兩種處理hierarchy labels的常用作法:
- 使用flat方法並將每個label放在同一個output array中,而不考慮層次結構,確保每個“leaf node” label都有足夠的example。
- 使用Cascade設計模式。 建立一個模型來識別更higher-level labels。 基於high-levle classification,將example發送到各種特定的模型以執行更具體的分類任務。 例如,我們可能有一個初始模型,將圖像標記為“植物”、“動物”或“人”。 根據第一個模型應用的label,我們會將圖像發送到不同的模型,以使用更精細的label。
Flat方法比使用 Cascade 設計模式更直接,因為它只需要一個模型。 但是,這可能會導致模型失去有關更多detailed label classes的資訊,因為在我們的資料集中自然會有更多具有更higher-level labels的training example。
Inputs with overlapping labels
Multilabel設計模式在input data偶爾有overlapping labels的情況下也很有用。 讓我們以一個對目錄中的服飾項目進行分類的圖像模型為例。 如果我們有多人abeling training dataset中的每張image,一個labeler可能會將裙子的image標記為“長裙”,而另一個labeler將其識別為“百褶裙”。 兩者都是正確的。 但是,如果我們在此資料上建立multiclass classification模型,將具有不同label的同一種的image的多個example傳遞給model,我們可能會遇到模型在進行預測時對相似圖像進行不同label的情況。 理想情況下,我們想要一個模型,將這個image標記為“長裙”和“百褶裙”,如下圖所示,而不是有時只預測這些label中的一個。
Multilabel設計模式通過允許我們將兩個overlapping label與image相關聯來解決這個問題。 在overlapping labels的情況下,我們有多個labeler評估training dataset中的每個image,我們可以選擇我們希望labeler分配給特定image的最大label數量,然後在模型訓練中使用最常用的label與image的相關聯。 “最常選擇的label”的threshold將取決於我們的prediction task和我們擁有的人工labeler的數量。 例如,如果我們有 5 個labeler評估每張圖片,並且每張圖片有 20 個可能的label,我們可能會鼓勵labeler為每個圖片提供 3 個label。 從每張圖片的 15 個label“投票”list中,我們可以從labeler中選擇 2 到 3 個投票最多的。 在評估這個模型時,我們需要注意模型為每個label返回的平均預測可信度,並使用它來iterate改進我們的dataset和label quality。
One versus Rest
另一種處理Multilabel classification的技術是訓練多個binary classifiers而不是一個Multilabel model。 這種方法稱為 one versus rest 。 在 Stack Overflow 範例中,我們想要將問題標記為 TensorFlow、Python 和 Pandas,我們將為這三個tag中的每一個使用一個單獨的classifiers:Python與否、TensorFlow與否,等等。 然後我們會選擇一個可信度threshold,並使用來自高於某個threshold的每個binary classifier的tag來標記原始input question。
one versus rest 的好處是我們可以將它與只能進行binary classification的模型架構一起使用,例如 SVM。 它也可能有助於處理rare categories,因為模型一次只對每個input執行一項classification task,並且可以應用Rebalancing design pattern。 這種方法的缺點是增加了訓練許多不同classifiers的複雜性,要求我們以一種從這些模型中的每一個來產生prediction的方式建立我們的Application,而不是只有一個Application。
總而言之,當我們的資料屬於以下任何classification scenarios時,請使用multilabel設計模式:
- 一個Single training example可以與mutually exclusive labels相關聯。
- 一個Single training example可以有許多hierarchical labels.
- Labeler以不同的方式describe同一個item,每一個interpretation都是準確的。
在進行multilabel模型時,確保overlapping labels的組合在我們的資料集中有良好的呈現,並考慮我們願意為模型中每個可能的label接受的threshold。 使用 sigmoid output layer是建立可以處理multilabel classification的模型的最常用方法。 此外,sigmoid output還可以應用於binary classification作業,training example只能是有兩個possible label中的其中一個。
設計模式七:Ensembles
Ensembles 設計模式是ML中的技術,它組合多個ML模型並aggregate它們的結果以進行預測。 Ensembles可以是提高效能和產生比任何單一模型都更好的預測的有效手段。
問題
假設我們已經訓練了我們的嬰兒體重預測模型,設計了特殊功能並為我們的神經網路加上了額外的layer,以便我們的training set上的誤差幾乎為零。然而,當我們希望在醫院的嬰兒生產中使用我們的模型或評估在保持test set上的效能時,而模型的預測都是錯誤的。發生了什麼甚麼事呢?而且,更重要的是,我們如何修復它?
沒有任何ML模型是完美的。為了更好的理解我們的模型在哪裡以及如何出錯,ML 模型的錯誤可以分解為三個部分:irreducible error、bias引起的error和variance 引起的error。irreducible error是由資料集中的noise、問題的框架或不良的training example(如measurement errors或confounding factors)導致的模型中的inherent error。顧名思義,我們對irreducible error是無能為力的。
另外兩個,bias和variance,被稱為redicible error,這是我們可以影響模型效能的地方。簡單來說,bias是模型無法充分了解模型feature和labels之間的關係,而variance則是模型無法概括新的、未見過的example。具有 high bais的模型過度簡化了關係,被稱為underfit。具有high variance的模型對training example 則是learn too much,被稱為ovrtfit。當然,任何 ML 模型的目標都是low bias和low variance,但實際上,兩者都很難實現。這被稱為bias-varnace trade-off。增加模型複雜度會降低bias但會增加variance,而降低模型複雜度會降低variance但會引入更多bias。
這篇文章建議我們,當使用現代ML技術(例如具有high capacity的大型神經網路)時,這種方式僅在一定程度上有效。 在觀察到的實驗中,存在一個“interpolation threshold”,超過這個thresshold,very high capacity的模型能夠實現zero training error以及對未知資料的low error。 當然,我們需要更大的資料集以避免在high capacity模型上overfitting。
有沒有辦法減輕這種在small-and medium-scale problems上的bias-varnace trade-off呢?
解決方案
Ensemble方法是meta-algorithms,它結合了多種ML模型作為一種減少bias與variance兩者或其中之一並提高模型效能的技術。 一般來說,這個想法是組合多個模型來提高ML結果。 通過建立具有不同歸納bias的多個模型並aggregate它們的output,我們希望得到一個效能更好的模型。 我們將討論一些常用的集成方法,包括 bagging、boosting 和 stacking。
Bagging
1075 / 5000
Translation results
Bagging(bootstrap aggregating 的縮寫)是一種parallel ensemble方法,用於解決ML模型中的High varaince問題。 bagging 的 bootstrap 部分是指用於訓練ensemble member的資料集。具體來說,如果有 k 個子模型,則有 k 個單獨的資料集用於訓練ensemble的每個子模型。每個資料集都是通過從原始訓練資料集中隨機抽樣建立的。這意味著 k 個資料集中的任何一個都很可能會損失一些training example,但任何資料集都可能有重複的training example。Aggregation發生在多個multiple ensemble members的output上 — — 要嘛是regression task的平均值,要不就是classification的majority vote。 bagging ensemble方法的一個很好的例子是rnadom forest:在整個訓練資料的隨機採樣subset上訓練多個決策樹,然後aggregate每個tree的結果以產生預測,如下圖所示。
一般的ML library具有bagging方法的實現。 例如,要在 scikit-learn 中實現Randdom Forest regression來從出生資料集預測嬰兒體重:
在Bagging中看到的model averaging是減少model varaince的一種有力而可靠的方法。 正如我們將看到的,不同的ensemble方法以不同的方式組合多個子模型,有時使用不同的模型、不同的演算法,甚至不同的objective function。 對於Bagging,模型和演算法是相同的。 例如,對於random forest,子模型都是short decision trees。
Boosting
Boosting 是另一種ensemble技術。然而,與 bagging 不同的是,boosting 最終構建了一個比單一個member model capacity更大的ensemble模型。出於這個原因,boosting 提供了比起減少variance更有效的來減少bias的方法。 boosting 背後的想法是iterative構建一個模型集合,其中每個連續模型都專注於學習前一個模型出錯的examples。簡單來說,boosting interatily改進了一系列weak learners,採用加權平均最終產生一個stoonger learner。
在 boosting 過程開始時,選擇了一個簡單的基礎模型 f_0。對於regression task,基本模型可能只是平均目標值:f_0 = np.mean( Y_train)。對於第一個interation step,residuals delta_1 是通過單獨的模型量測和近似的模型。這個residual model可以是任何東西,但通常它不是很複雜;我們經常使用像決策樹這樣的weak learner。然後將residual model提供的近似值加到當前預測中,並繼續該過程。
經過多次iterations,residuals趨於零,預測在對原始training dataset建模時變得越來越好。在下圖 中,資料集每個element的residuals隨著每次連續iteration而減少。
一些比較知名的boosting algoritms是 AdaBoost、Gradient Boosting Machines 和 XGBoost,它們在ML框架(如 scikit-learn 或 TensorFlow)中具有易於使用的implementation。 scikit-learn 中的implementation也很簡單:
Stacking
Stacking 是一種ensemble method,它將一組模型的outputs組合起來進行預測。 初始模型通常具有不同的model type,在完整的training dataset上訓練完成。 然後,使用初始模型輸出作為feature來訓練secondary meta-modle。 第二個meta-model學習如何最好地結合初始模型的結果以減少training error,並且可以是任何類型的ML模型。
為了implement 一個stacking ensemble,我們首先在training dataset上訓練ensemble的所有member。 下面的code call function fit_model,這個function將模型和training dataset 的inputs X_train 和label Y_train 作為參數。 這樣,member是一個list,其中包含我們ensemble中所有經過訓練的模型。
這些submodel作為單獨的input被合併到一個更大的stacking ensemble模型中。 由於這些input model是與secondary ensemble model一起訓練的,我們fix這些input model的權重。 這可以通過將ensemble member models的 layer.trainable 設定為 False 來達成:
我們使用 Keras functional API 建立將component拼接在一起的ensemble model:
在這個例子中,secondary model是一個具有兩個hidden layer的dense神經網路。 通過training,這個網路學習如何在進行預測時最佳的結合ensemble members的result.
為何它是有效的
Model averaging methods如bagging work,因為通常構成ensemble model的單一模型不會在test set上都出現相同的錯誤。 理想情況下,每個單獨的模型都有一個隨機的偏差,所以當它們的結果被平均時,隨機誤差會抵消,預測更接近正確的答案。
Boosting 效果很好,因為模型會根據每個iteration step的residuals受到越來越多的punish。 在每次iteration中,都鼓勵ensemble model在進行那些難以預測的examples方面變得越來越好。 Stacking 之所以有效,是因為它結合了 bagging 和 boosting 的優點。 secondary model可以被認為是model averaging的更複雜版本。
Bagging
更準確的說,假設我們已經訓練了 k 個神經網路回歸模型並將它們的結果平均後來建立一個ensemble model。 如果每個模型在每個example上都有錯誤:error_i,其中 error_i 是從具有varaince: var 與covariance: cov 的zero-mean multivariate normal distribution中得出的,那麼ensemble predictor將有一個error:
ensemble_error = 1./ k * np.sum([ error_1, error_2, error_3,…, error_k])
如果error: error_i 是完全相關,使得 cov = var,則ensemble model的square error減少為 var。 在這種情況下,model averaging根本沒有幫助。 在另一個極端狀況,如果error: error_i 完全不相關,則 cov = 0 並且ensemble model的mean square error為 var/k。 因此,預期的square error隨著ensemble中模型的數量 呈k 線性下降。 總而言之,平均而言,ensemble的效能至少與ensemble中的任何單個模型一樣好。 此外,如果ensemble中的模型產生獨立的error(例如,cov = 0),那麼ensemble的效能會明顯更好。 最終,bagging 成功的關鍵是模型的多樣性。
這也解釋了為什麼 Bagging 對於更穩定的learner 如 KNN(k-nearest neighbors)、naive Bayes、線性模型或支援向量機 (SVM)通常不太有效,因為training set的大小通過boostrapping 減少了。 即使使用相同的training data,由於random weight initialization或random min-batch selection或不同的hyperparameters,因上述這些因素神經網路可以達成多種解決方案,並且建立的模型其error都是獨立。 因此,model averaging甚至可以使在同一個training set上訓練的神經網路都是有benefit的。 事實上,修正神經網路 high variance的一種推薦解決方案是訓練多個模型並aggregate它們的預測。
Boosting
boosting 演算法通過iteration 改善模型來減少預測誤差。 每個新的weak learner通過對每個步驟的residuals delta_i 進行建模來修正前一個prediction的error。 最終預測是基於learner和每個連續weak learner的輸出之和,如下圖 所示。
因此,由此產生的ensemble model變得越來越複雜,比其任何一個member都具有更大的capacity。 這也解釋了為什麼 boosting 特別適合處理high bias。 bias與模型underfit的趨勢有關。 通過反復聚焦難以預測的examples,boosting 有效地減少了結果模型的bias
Stacking
Stacking可以被認為是simple model averaging的延伸,我們在training dataset上訓練 k 個模型來完成,然後對結果進行平均以確定預測。 simple model averaging類似於bagging,但是ensemble中的模型可以是不同的type,而對於bagging,模型是相同的type。 我們可以修改average step以採用weighted average,例如,給予我們ensemble中的一個模型比其他模型更多的權重,如下圖所示。
我們可以將stacking視為model averaging的進階版,其中我們不取平均值或加權平均值,而是在model 1 and 2 的output上訓練第二個ML模型,來學習如何最好的將result與我們ensemble中的模型組合起來進行預測如下圖 所示。 這提供了與bagging技術一樣減少variance的所有效益,但也控制了high bias。
取捨與替代方案
Ensemble方法在現代機器學習中變得十分流行,並且在贏得眾所周知的挑戰方面發揮了重要作用,也許最引人注目的是 Netflix prize。 還有很多理論證據支持在這些現實世界的挑戰中取得的成功。
增加training與design的時間
Ensemble學習的一個缺點是它增加了training和design時間。例如,對於stacked ensemble model,選擇ensemble member models可能需要它自己的專業水準並提出自己的問題:最好reuse相同的架構還是鼓勵多樣性(diversity)?如果我們確實使用不同的架構,我們應該使用哪些架構?有多少?我們現在正在開發 k 個模型,而不是開發單一 ML 模型(這本身就可能就很耗工)。我們在模型開發中引入了額外的overhead,更不用說維護、inference複雜性和resource usage,如果ensemble模型要投入生產。隨著ensemble中模型數量的增加,這很快就會變得不切實際。
通用的ML library,如 scikit-learn 和 TensorFlow,為許多常見的bagging和boosting方法提供了易於使用的implementation,如random forest、AdaBoost、gradient boosting和 XGBoost。但是,我們應該小心考量與ensemble方法相關會增加overhead是否值得使用。始終將準確性和resource usage與線性或 DNN model進行比較。distilling一組神經網路通常可以降低複雜性並提高效能。
Dropout as bagging
dropout 提供了強大而有效的替代方案。 Dropout 在深度學習中被稱為正則化技術,但也可以把它想成跟bagging很相近。 神經網路中的 Dropout 隨機地(以規定的概率)“turns off”網路的每個min-batch訓練的神經元,本質上是評估一個由指數級多個神經網路組成的bagged ensemble。 雖然是這樣,訓練一個帶有 dropout 的神經網路與 bagging 並不完全相同。 有兩個顯著差異。 首先,在 bagging 的情況下,模型是獨立的,而在使用 dropout 訓練時,模型共享參數。 其次,在bagging中,模型被訓練以在各自的training上convergence。 然而,當使用 dropout 進行訓練時,ensemble member模型只會針對單個training step進行訓練,因為在訓練循環的每次iteration中都會丟棄不同的node。
減少模型的可解釋性(interpretability)
要記住的另一點是模型的可解釋性。 在深度學習中,已經有效地解釋為什麼我們的模型做出它所做的預測可能很困難。 這個問題與ensemble modles複雜化。 例如,考慮decision tree與random forest。 decision最終會學習每個feature的boundary values,這些boundary value指引single instance進行模型的最終預測。 因此,很容易解釋為什麼decision tree會做出它所做的預測。 random forest是許多decision tree的集合,失去了這種局部可解釋性。
對需要預測的問題選擇對的工具
bias-variance的trade-off也很重要。 一些ensemble技術比其他ensemble技術更擅長解決bais或variance(如下表)。 特別是,boosting 適用於解決high bias,而 bagging 可用於修正high variance。 話雖如此,正如我們在“Bagging”一節中看到的,將兩個具有高度相關error的模型結合起來對降低variance無濟於事。 簡單來說,對我們的問題使用錯誤的ensemble方法不一定會提高效能; 它只會增加不必要的overhead。
其他的ensemble方式
我們已經討論了ML中一些更常見的ensemble技術。 前面討論的並不是ML的全部,並且有適合這些廣泛類別的不同演算法。 還有其他ensemble技術,包括許多結合 Bayesian方法或結合神經架構搜索和強化式學習的技術,如Google的 AdaNet 或 AutoML 技術。 簡而言之,Ensemble 設計模式包含結合多個ML模型以提高整體模型效能的技術,並且在解決High bias或High variance等常見訓練問題時特別有效。
設計模式 8 : Cascade
Cascade設計模式解決了將ML問題分解為一連串ML問題的狀況。 這種Cascade通常需要仔細設計 ML experiment。
問題
如果我們需要在正常和異常活動中預測一個value,會發生什麼呢?該模型將學會忽略異常的活動,因為它很少見。如果異常活動也與異常值相關聯,那麼可訓練性就會受到影響。
例如,假設我們正在嘗試訓練一個模型來預測客戶退貨的可能性。如果我們訓練單一模型,那麼經銷商的退貨行為將丟失,因為有數百萬的消費大眾(和零售交易)而可能只有幾千個經銷商而已。我們並不會真正知道購買商品的當下是消費大眾還是經銷商。但是,通過監控市場,我們已經確定從我們這裡購買的商品何時被轉售,因此我們的training dataset有一個label,將購買label轉為由經銷商來標記。
解決此問題的一種方法是在訓練模型時增加經銷商的權重。這是不是最好的,因為我們需要盡可能正確地獲取更常見的消費大眾購買狀況。我們不想用消費大眾的較低準確度來換取經銷商的較高準確度。然而,消費大眾和經銷商的行為非常不同。例如,雖然消費大眾在一周左右的時間內退回商品,但經銷商只有在無法出售商品時才會退貨,因此退貨可能會在幾個月後進行。對於消費大眾和經銷商的退貨可能性,庫存的邏輯決策對於這兩類購買者而言是不同的。因此,有必要盡可能準確地獲得這兩個種類的狀況。簡單的增加經銷商的權重是行不通的。 解決此問題的一種直觀方法是使用 Cascade 設計模式。我們將問題分為四個部分: 預測特定交易是否由經銷商進行
- 預測特定交易是否由經銷商進行
- Training一種向一般消費大眾銷售的模型
- Training 第二個針對經銷商的模型
- 在正式環境中,結合上述三個獨立模型的output來預測購買的每件商品的退貨可能性以及交易是由經銷商進行的概率
這允許根據買家類型對可能被退回的商品做出不同決定的可能性,並確保第 2 步和第 3 步中的模型在其training data的segment上盡可能準確。這些模型中的每一個都相對容易訓練。第一個只是一個classifier,如果異常活動非常罕見,我們可以使用Rebalancing pattern來解決它。接下來的兩個模型本質上是在training dataset不同部分上訓練的classification model。這種組合是確定性的,因為我們根據活動是否屬於經銷商來選擇要用哪一個模型。
問題出現在預測過程中。在預測時,我們沒有真正的label,只有第一個分類模型的輸出。根據第一個模型的輸出,我們必須確定我們使用了兩個銷售模型中的哪一個。問題是我們正在對label進行訓練,但在inference time時,我們將不得不根據預測做出決定。並且預測會有錯誤。因此,將需要第二個和第三個模型對他們在訓練期間可能從未見過的資料進行預測。
作為一個極端的例子,假設經銷商提供的地址總是在城市的工業區,而消費大眾是住在任何地方。如果第一個(分類)模型出錯並且消費大眾被錯誤的識別為經銷商,則使用的退貨預測模型將不會在其vocabulary中包含客戶居住的社區。
我們如何訓練一串模型,其中一個模型的output是下一個模型的input或決定後面要用哪種模型?
解決方案
任何ML問題,其中一個模型的output是下一個模型的input或決定後續決定用哪一種模型的方式,稱為Cascade。 在訓練一串的 ML 模型時必須特別小心。 例如,有時涉及異常情況的ML問題可以通過將其視為四個ML問題的cascade來解決:
- 用於識別情況的分類模型
- 一種在異常情況下訓練的模型
- 在一般情況下訓練的單獨模型
- 將兩個獨立模型的output組合起來的模型,因為output是兩個輸出的概率組合
第一眼來看,這似乎是 Ensemble 設計模式的一個特例,但由於進行cascade時需要特殊的experiment design,因此被單獨考慮量。
例如,假設為了估計在車站存放租賃自行車的成本,我們希望預測舊金山自行車租車和還車站之間的距離。換句話說,該模型的目標是預測我們將自行車運回租賃地點所需的距離,例如租賃開始的時間、自行車的租賃地點、租賃者是否是月租者與否,等等。問題在於,超過四小時的租賃涉及與較短的租賃是截然不同的租戶行為,並且stocking 演算法需要兩種output(租賃超過四小時的概率和自行車需要運回的可能距離)。然而,只有極少一部分租賃行為會是這樣的狀況。
解決這個問題的一種方法是訓練一個classification model,首先根據trips是 長途還是一般時間來對trips進行分類(以下是在GCP BigQuery中的範例):
根據租賃的實際持續時間將training dataset簡單地分為兩部分並訓練接下來的兩個模型,一個是長期租賃,另一個是一般租賃,這種做法可能很直覺。 問題是剛才討論的分類模型會出現errors。 事實上,在舊金山自行車資料的held-out portion上來評估模型後模型的準確率只有 75% 左右(如下圖)。 鑑於此,在資料的完美分割上訓練模型是非常非常困難的。
相反,在訓練這個分類模型之後,我們需要使用這個模型的預測來為下一組模型建立training dataset。 例如,我們可以為模型建立training dataset,使用以下方法預測一班租賃的距離:
然後,我們應該使用這個dataset來train model來預測距離:
最後,我們的evaluation、prediction等應該考量到我們需要使用三個訓練好的模型,而不僅僅是一個。這就所謂Cascade設計模式。
在實作中,很難保持 Cascade 工作流程的簡單化。與其單獨訓練模型,不如使用workflow Pipeline pattern自動執行整個工作流程,如下圖所示。關鍵是確保每次進行experiment時都根據上游模型的預測為兩個下游模型建立training dataset。
儘管我們導入了Cascade模式作為在正常和異常活動期間預測的一種方式,但Cascade模式的解決方案能夠解決更多一般的狀況。Pipeline framework允許我們處理任何可以將ML問題分解為一連串(或Cascade)ML 問題的情況。每當ML模型的output需要作為另一個模型的input時,第二個模型需要根據第一個模型的預測進行訓練。在所有這些情況下,一個正式的pipeline experimentation framework將是有幫助的。
Kubeflow Pipelines 提供了這樣一個框架。 因為它是使用container的,所以底層ML模型和glue code幾乎可以用任何programming或scripting language編寫。 在這裡,我們將使用 BigQuery client Library將上述 BigQuery SQL model包到 Python functions中。 我們可以使用 TensorFlow 或 scikit-learn 甚至 R 來實現各個component。 使用 Kubeflow Pipelines 的pipeline code可以非常簡單地如下呈現:
整個pipeline可以submit來運作,並且使用pipeline framework 運作不同的experiment tracked。
每當我們將鏈接 ML 模型時,強烈建議使用pipeline-experiment framework。 這樣的framework將確保在修改上游模型時重新訓練下游模型,並且我們擁有所有先前訓練運作的歷史記錄。
取捨與替代方案
與本blog中介紹的許多設計模式不同,不要過度使用 Cascade 設計模式,Cascade 不一定是best practices。 它為我們的ML workflow增加了相當多的複雜性,而這實際上可能會導致效能低下。 需要注意的是,pipeline-experiment framework絕對是best practices,但盡可能將pipeline限制為單u一ML問題((ingest, preprocessing, data validation, transformation, training, evaluation, and deployment)。 避免在 Cascade 模式中在同一pipeline中使用多個ML模型。
確定性的Inputs
拆分 ML 問題通常是一個糟糕的主意,因為 ML 模型可以或應該學習多個因素的組合。 例如:
- 如果可以從input中決定性地知道一個條件(假日購物與一般日購物),我們應該將這個condition作為另一個input添加到模型中。
- 如果condition只涉及一個input中的極端值(一些客戶住在附近而不是遠處,需要從資料中學習近/遠的定義),我們可以使用Mixed Input Representation來處理它。
Cascade設計模式解決了一個不常見的場景,我們沒有categorical input,需要從多個input中學習極端值。
單一模型
假設我們試圖了解客戶的購買傾向。 我們可能認為我們需要為經常比價的客戶和不常比價的客戶建立不同的模型。 我們無法實際知道誰進行比價或誰沒有,但我們可以根據客戶訪問次數、商品在購物車中的時間等進行有根據的猜測。 這個問題不需要 Cascade 設計模式,因為它很常見(很大一部分客戶會比價),ML模型應該能夠在訓練過程中隱含的學習它。 對於常見場景,我們會訓練單一模型。
內部的ㄧ致性
當我們需要在多個模型的預測之間保持內部一致性時,需要 Cascade。需要注意,我們正在嘗試做的不僅僅是預測異常活動。考慮到也會有一些經銷商活動,我們正在嘗試預測returns。如果任務只是預測銷售是否由經銷商進行,我們將使用Rebalancing pattern。使用 Cascade 的原因是imblanaced label output需要作為後續模型的input。
同樣,假設我們訓練模型來預測客戶購買傾向的原因是提供打折優惠。我們是否提供折扣優惠以及折扣金額,通常取決於該客戶是否進行比價。有鑑於此,我們需要兩個模型(比價者模型和購買傾向模型)之間的內部一致性。在這種情況下,可能需要Cascade設計模式。
預先訓練的模型
當我們希望重用預先訓練模型的output作為我們模型的input時,也需要Cascade。 例如,假設我們正在建立一個模型來檢測建築物的授權者,以便我們可以自動打開大門。 我們模型的輸入之一可能是車輛的牌照。 我們可能會發現使用OCR模型的output更簡單,而不是直接在我們的模型中使用完美的照片。 我們必須認識到 OCR 系統會出現錯誤,因此我們不應使用完美的車牌資訊來訓練我們的模型。 相反,我們應該在 OCR 系統的實際output上訓練模型。 因為不同的 OCR 模型會有不同的表現並有不同的錯誤,所以如果我們改變我們的 OCR 系統的供應商,就有必要重新訓練模型。
重點
使用預先訓練模型作為pipeline第一步的常見場景是使用object-detection模型,然後使用fine-grained image classification model。 例如,object-detection模型可能會找到圖片中的所有手提包,中間步驟可能會將圖像裁剪到檢測到的object的bounding boxes,隨後的模型可能會識別手提包的類型。 建議使用Cascade,以便在object-detection模型更新時(例如使用新版本的 API)可以重新訓練整個pipeline。
Reframing而不是Cascade
在我們的範例問題中,我們試圖預測貨品被退回的可能性,因此這是一個分類問題。 假設我們希望預測每小時的銷售額。 大多數時候,我們只為一般消費大眾提供服務,但偶爾(可能一年幾次),我們也會有大採購的客戶。 將regression問題重新定義為不同銷售額的分類問題可能是更好的方法。 儘管這將涉及為每個銷售額bucket訓練分類模型,但它避免了正確地進行零售與批發分類的需要。
回歸(Regression)是很少見的情況
當某些value比其他value更常見時執行regression時,Cascade設計模式會有幫助。 例如,我們可能想根據衛星圖片預測降雨量。 可能是在 99% 的pixel上沒有下雨。 在這種情況下,建立一個stacked classification modle,然後建立一個regression會很有幫助:
- 預測是否會下雨。
- 對於模型預測不太可能下雨的pixel,預測降雨量為零。
- 訓練regression模型以預測模型預測可能下雨的pixel的降雨量。
認識到classification model並不完美至關重要,因此必須在classification model預測可能會下雨的pixel上訓練regression model.
設計模式9 : Neutral Class
在許多classification情況下,建立一個netural class可能有幫助。 例如,不是訓練一個輸出事件概率的binary classifier,而是訓練一個output是 Yes、No 和 Maybe 不相交概率的三類classifier。 不相交(disjoint)在這裡意味著類別不重疊。 例如,一個訓練模式只能屬於一個類別(class),因此 Yes 和 Maybe 之間沒有重疊。 在這種情況下,Maybe 是neutral。
問題
假設我們正在嘗試建立一個模型,為止痛藥提供用藥指示。 有兩種選擇,ibuprofen和對acetaminophen,在我們的歷史資料集中,對acetaminophen傾向於優先用於有胃病風險的病患,而ibuprofen傾向於優先用於有肝損傷風險的病患。 除此之外,事情往往是相當隨機的。 有些醫生預設會使用對acetaminophen,有些則使用ibuprofen。 在這樣的資料集上訓練binary classifier會導致準確率變差,因為模型基本上需要讓任意的狀況都正確的。
解決方案
假設一個不同的場景。若Application(有著醫生處方的電腦紀錄)也詢問他們是否可以接受替代的止痛藥。如果醫生開了acetaminophen,Application會詢問醫生,如果患者的家中中已有ibuprofen,是否可以使用。
根據第二個問題的答案,我們有一個中立的類別。處方可能仍寫“acetaminophen”,但記錄顯示醫生對這名患者持中立態度。請注意,這從根本上要求我們適當地設計資料收集 — — 事後我們無法製造一個中立的類別。我們必須正確設計ML問題。在這種情況下,正確的設計首先從我們如何提出問題開始。如果我們只有一個歷史資料集,我們就需要使用labeling service。我們可以要求人工驗證醫生的原始選擇,並回答替代止痛藥是否可接受的問題。
為何它是有效的
我們可以通過模擬synthetic dataset所涉及的作業方式來探索其作業機制。 然後,我們將證明在具有marginal cases的現實世界中也會發生類似的事情。
Synthetic data
讓我們建立一個長度為 N 的synthetic dataset,其中 10% 的資料代表有黃疸病史的病患。 由於他們有肝損傷的風險,他們的正確處方是ibuprofen:
另外 10% 的資料將代表有胃潰瘍病史的病患; 由於他們有胃損傷的風險,他們的正確處方是acetaminophen:
其餘的病患將被任意分配給任一種藥物。 這種隨機分配會導致僅在兩個類別上訓練的模型的整體準確度較低。 事實上,我們可以計算準確率的上限。 因為 80% 的training example都有random labels,所以模型能做的最好的事情就是猜對一半。 因此,這個training example的subset的準確度將為 40%。 剩下的 20% 的training examples具有systematic labels,理想的模型會學習到這一點,因此我們預計整體準確率最多可以達到 60%。
事實上,使用 scikit-learn 訓練模型如下,我們得到了 0.56 的準確率:
如果我們建立三個類別,並將所有隨機分配的處方放入該類別中,我們就會如預期的那樣獲得完美 (100%) 的準確度。 synthetic data的目的是說明,在作業中存在隨機分配的情況下,Neutral Class 設計模式可以幫助我們避免因任意的labeled data而失去模型準確性。
真實世界的狀況
在真實世界中,事情可能不像synthetic dataset中那樣完全隨機,但任意分配範例仍然成立。 例如,嬰兒出生一分鐘後,嬰兒會被分配一個“Apgar score”,一個介於 1 到 10 之間的數字,其中 10 表示嬰兒已經完美地完成了分娩過程。
使用一個模型,這個模型經過訓練可以預測嬰兒是否會健康地度過分娩過程,或者是否需要立即醫療檢查:
我們將 Apgar score 的threshold設定為 9,並將 Apgar score為 9 或 10 的嬰兒視為是健康的,將 Apgar score為 8 或更低的嬰兒視為需要醫療檢查。 當在出生資料集上training並在held-out data上評估時,此binary classification model的準確度為 0.56。
然而,分配 Apgar score涉及許多相對主觀的評估,並且給嬰兒分配 8 分或是 9 分通常歸結成醫生偏好的問題。 這樣的嬰兒既不是完全健康的,也不需要醫療干預。 如果我們建立一個中立的類別來保存這些“邊緣(marginal)”分數怎麼辦? 這需要建立三個類別,Apgar score為 10 分定義為健康,分數為 8 到 9 分定義為中性,較低的分數定義為需要注意:
這個模型在held-out evaluation dataset上實現了 0.79 的準確率,遠高於使用兩個類別的 0.56。
取捨與替代方案
Neutral Class 設計模式是在ML問題開始時要記住的模式。 收集正確的資料,我們可以避免很多棘手的問題。 在以下幾種情況下,使用一個Neutral Class會有所幫助。
當人類專家之間是有爭議時
Neutral Class有助於處理人類專家之間的分歧。 假設我們有人類標籤員,我們向他們展示患者病史並詢問他們會開什麼藥。 在某些情況下,我們可能對對acetaminophen有明確的訊息,在其他情況下可能對ibuprofen有明確的信號,以及剩餘大量處於人類之間爭論的情況。 Neutral Class提供了一種處理此類情況的方法。
在人工標記的情況下(與實際醫生行為的歷史資料集不同,病患僅由一名醫生看過),每個模式都由多名專家標記出來。 因此,我們先驗的知道人類不同意哪些情況。 簡單地丟掉這些有爭議情況並簡單地訓練一個binary classifier似乎要簡單得多。 畢竟,模型在neutral caees上做什麼並不重要。 但這有兩個問題:
- 錯誤的可信度往往會影響人類專家對模型的接受程度。 與在人類專家會選擇替代方案的情況下錯誤且自信的模型相比,output一個neutral的模型通常更容易被專家接受。
- 如果我們正在訓練一個Cascade model,那麼下游模型將對neutral classes極其敏感。 如果我們繼續改進這個模型,下游模型可能會從每個版本會發生巨大變化。
另一種替代方法是使用人類標記者之間的協議作為訓練期間模式的權重。 因此,如果 5 位專家同意一個診斷,則訓練模式的權重為 1,而如果專家分為 3 到 2,則模式的權重可能僅為 0.6。 這允許我們訓練一個binary classifier,但在“確定”的情況下過度使用分類器。 這種方法的缺點是,當模型輸出的概率為 0.5 時,不清楚是因為這反映了training data不足的情況,還是人類專家意見不一致的情況。 使用Neutral class來攫取有爭議的area使我們能夠消除這兩種情況的歧義。
客戶滿意度
試圖預測客戶滿意度的模型也需要neutral class。 如果training dataset包含客戶按 1 到 10 的等級對他們的體驗進行評分的問卷回應,將評級分為三類可能會有所幫助:1 到 4 為差,8 到 10 為好,5 到 7 為 中性的。 相反,如果我們嘗試通過將threshold設置為 6 來訓練binary classifier,則模型將花費太多effort試圖使neutral的回應達到正確。
作為改進Embedding的一種方式
假設我們正在為飛機航班建立定價模型,並希望預測客戶是否會以特定價格購買。為此,我們可以查看航班購買和在放在購物車之後又移除的歷史交易。但是,假設我們的許多交易還包括由旅行社購買的商品 — — 這些人已經簽訂了票價合約,因此他們的票價實際上並不是動態的。換句話說,他們不是支付當前顯示的價格。
我們可以刪除所有的非動態購買,只針對根據顯示的價格決定購買或不購買的客戶來訓練模型。然而,這樣的模型會遺漏旅行社在不同時間感興趣的目的地的所有資訊 — — 這將影響機場和旅館的embedded方式。在不影響定價決策的同時保留該資訊的一種方法是對這些交易使用neutral class。
Neutral class的Regraming
假設我們正在訓練一個自動交易系統,該系統根據證券價格是上漲還是下跌來進行交易。 由於股市波動以及新資訊反映在股票價格中的速度,嘗試在預測的小幅上漲和下跌時進行交易,隨著時間的推移可能會導致高交易成本和低利潤。
在這種情況下,我們需要想我們的最終目標是甚麼。 ML 模型的最終目標不是預測股票是上漲還是下跌。 我們將無法購買我們預測會上漲的所有股票,也無法出售我們沒有持有的股票。
更好的策略可能是為未來 6 個月內最有可能上漲超過 10% 的 20隻股票購買看漲期權,並為接下來最有可能下跌超過 5% 的股票購買看跌期權 6個月。 然後,解決方案是建立一個由三個類別組成的training dataset:
- 上漲超過 10% 的股票 — — 看漲期權。
- 下跌超過 5% 的股票 — — 看跌期權。
- 其餘股票屬於中性類別。
我們現在可以用這三個類別訓練一個分類模型,並從我們的模型中選擇最有把握的預測,而不是訓練一個關於股票會上漲多少的回歸模型。
設計模式10 : 再平衡(Rebalancing)
Rebalancing 設計模式提供了各種方法來處理既有不平衡的資料集。 意思是一個label佔據著大部分的資料集,而其他label的例子要少得多。 這種設計模式不能解決資料集缺乏對特定人群或現實環境的表示的情況。 像這樣的情況通常只能通過額外的資料收集來解決。 再平衡設計模式主要解決如何使用特定類別或類別很少的example的資料集來建立模型。
問題
當ML模型為資料集中的每個label class提供相似數量的example時,它們的學習效果最好。 然而,許多真實世界的問題並沒有那麼巧妙的平衡。 以欺詐偵測為例,我們正在建立一個模型來識別欺詐性信用卡交易。 欺詐交易比常規交易少得多,因此可用於訓練模型的欺詐案例資料較少。 對於其他問題也是如此,例如偵測某人是否會拖欠貸款、識別有缺陷的產品、根據醫學圖片預測疾病的存在、過濾垃圾郵件、標記軟體應用程序中的錯誤日誌等等。
不平衡資料集適用於多種類型的模型,包括binary classification、multiclass classification、multilabel classification和regression。在regression案例中,不平衡資料集是指異常值遠高於或低於資料集的中位數的資料。
具有不平衡label classes的訓練模型的一個常見陷阱是依賴misleading的模型評估準確度。如果我們訓練欺詐偵測模型並且只有 5% 的資料集包含欺詐交易,那麼我們的模型很可能會訓練到 95% 的準確度,而無需對資料集或底層模型架構進行任何修改。雖然這個 95% 的準確率數字在技術上是正確的,但模型很有可能會猜測每個example的多數類別(在本例中為非欺詐)。因此,它沒有學習如何將少數類別與我們資料集中的其他example區分開來。
為了避免過度依賴這個misleading的準確度,檢查模型的confusion matrix以查看每個類別的準確度。在不平衡資料集上訓練的表現不佳的模型的confusion matrix通常類似於下圖 。
在這個example中,模型有 95%正確預測了多數類別,但僅在 12% 正確預測了少數類別。 通常,高效能模型的confusion matrix在少數類別的百分比接近 100。
解決方案
首先,由於準確性可能會在不平衡資料集上產生misleading,因此在構建模型時選擇合適的評估指標很重要。 然後,我們可以採用各種技術來處理資料集和模型級別的既有不平衡資料集。 Downsampling改變了我們底層資料集的平衡,而加權改變了我們的模型處理某些類別的方式。 Upsampling複製了我們少數類別的樣本,並且通常涉及應用增強(augmentations)來產生額外的samples。 我們還將研究reframing問題的方法:將其更改為regression task、分析每個example的模型error values或clustering。
選擇評估指標
對於欺詐偵測範例中的不平衡資料集,最好使用precision、recall或 F-measure等指標來全面了解我們的模型的執行情況。 Precision衡量模型做出的所有正確預測中positive classification的百分比。 相反,Recall衡量模型正確識別的actual positive examples的比例。 這兩個指標之間的最大區別在於用於計算它們的分母。 在precision中,分母是我們的模型做出的positive class預測的總數。 而在recall中,它是我們資料集中存在的actual positive class的數量。
一個完美的模型應該同時具有 1.0 的precision 和recall,但在現實中,這兩種衡量標準往往相互矛盾。 F-measure 是一個範圍從 0 到 1 的度量,它同時考慮了precision和recall。 計算公式如下:
2 * (precision * recall ) / (precision + recall)
讓我們回到欺詐偵測例子,來看這些指標在實踐中是如何發揮作用的。 在這個例子中,假設我們的text set總共包含 1,000 個exmples,其中 50 個應該被標記為欺詐交易。 對於這些example,我們的模型正確預測了 930/950 個非欺詐範例和 15/50 個欺詐範例,如下圖.
在這種情況下,我們模型的precision為 15/35 (42%),recall為 15/50 (30%),F-measure 為 35%。與precision 945/1000 (94.5%) 相比這些在擷取我們的模型無法正確識別欺詐交易方面做得更好。因此,對於在不平衡資料集上訓練的模型,應該要選accuracy以外的指標。事實上,在優化這些指標時,準確率甚至可能會下降,但這沒關係,因為在這種情況下,precision、recall和 F-score是模型效能的更好指標。
在評估在不平衡資料集上訓練的模型時,我們需要在計算成功指標時使用unsampled data。這意味著無論我們如何根據我們將在下面概述的解決方案修改我們的training dataset,我們都應該保持test set不變,以便它提供原始資料集的accurate representation。換句話說,我們的test set應該與原始資料集具有大致相同的類別平衡。對於上面的example,這將是 5% 的欺詐/95% 的非欺詐。
如果我們正在尋找一個衡量模型在所有thresholds上的表現的指標,average precision-recall是一個比 ROC curve(AUC) 用於模型評估的資訊量更大的指標。這是因為average precision-recall更強調模型從分配給positive class的總數中得到了多少次預測。這給予positive class更多的權重,這對於不平衡的y 資料集很重要。另一方面,AUC 平等對待兩個類別,並且對模型改進不太敏感,這在資料不平衡的情況下不是最佳的。
Downsampling
Downsampling是一種通過更改底層資料集而不是模型來處理不平衡資料集的解決方案。通過Downsampling,我們減少了模型訓練期間使用的多數類別的示例數量。為了了解它是如何作業的,讓我們來看看 Kaggle 上的synthe欺詐偵測資料集。 dataset中的每個example都包含有關交易的各種資訊,包括交易類型、交易金額以及交易發生前後的賬戶餘額。該資料集包含 630 萬個example,其中只有 8,000 個是欺詐交易。這僅佔整個資料集的 0.1%。
雖然大型資料集通常可以提高模型識別模式的能力,但當資料嚴重不平衡時,它就沒那麼有用了。如果我們在整個資料集(630 萬行)上訓練模型而不進行任何修改,由於模型每次隨機猜測非欺詐類別,我們很可能會看到 99.9% 的misleading準確率。我們可以通過從資料集中刪除大部分多數類別來解決這個問題。我們將收集所有 8,000 個欺詐example,並將它們放在一邊以便在訓練模型時使用。然後,我們將從非欺詐交易中提取少量隨機樣本。然後,我們將結合我們的 8,000 個欺詐example,重新整理資料,並使用這個新的、較小的資料集來訓練模型。下面是我們如何用 Pandas 實現這一點:
經過上面的作業之後,我們的資料集將包含 25% 的欺詐交易,比原始資料集更加平衡,少數類別中只有 0.1%。 值得嘗試downsampling時使用的精確平衡。 在這裡,我們使用了 25/75 的分別,但不同的問題可能需要更接近 50/50 的分別才能獲得良好的精確度。
Downsampling通常與 Ensemble 模式結合,會遵循以下步驟:
- Downsampling多數類別並使用少數類的所有instance。
- 訓練模型並將其加到Ensemble中。
- Repeat
在inference過程中,取ensemble model的median output。 我們在這裡討論一個classification example,但downsampling也可以應用在我們預測value的regression model。 在這種情況下,隨機抽取多數類別樣本將更細緻,因為我們資料中的多數“類別”包括的是range of values而不是single label。
權重類別
處理不平衡資料集的另一種方法是更改我們的模型賦予每個類別example的權重(weight)。這個術語“權重”與我們的模型於訓練期間學習的權重weight(或parameters)是不同的用法,我們無法手動設置權重。通過加權類別,我們告訴我們的模型在訓練期間處理更重要的特定標籤類別。我們希望我們的模型為少數類別的example分配更多的權重。模型應該給予某些example的確切重要性是取決於我們,並且是我們可以試驗的parameters。
在 Keras 中,我們可以在使用 fit() 訓練模型時將 class_weights 參數傳遞給模型。參數 class_weights 是一個字典,將每個類別mapping到 Keras 應該分配給該類別example的權重。但是我們應該如何確定每個類別的確切權重?Class weight values應與我們資料集中每個class的平衡相關。例如,如果少數類別只佔資料集的 0.1%,一個合理的結論是我們的模型應該以比多數類別多 1000 倍的權重來處理來自該類別的example。實際上,通常將每個類別的權重值除以 2,以便example的平均權重為 1.0。因此,給定一個包含 0.1% value代表少數類別的dataset,我們可以使用以下code計算類別權重:
然後我們將這個weight在訓練我們模型的期間傳送進去:
Output Layer Bias
與分配類別權重相結合,使用bias初始化模型的輸出層以解決資料集的不平衡也很有幫助。 為什麼我們要手動設置輸出層的初始偏差(bias)? 當我們有不平衡的資料集時,設置output bais將有助於我們的模型更快地收斂(converge)。 這是因為經過訓練的模型的最後一個layer的偏差平均會輸出資料極中少數example與多數example之比的log。 通過設置bias,模型已經從“correct” value開始,而不必通過gradient descent 來找到它。 預設情況下,Keras 使用零偏差。 這對應於我們想要用於完美平衡資料集的bias,其中 log(1/1) = 0。要在考慮我們的資料集平衡的同時計算正確的bias,我們要使用:
bias = log( num_minority_examples / num_majority_examples)
Upsampling
處理不平衡資料集的另一種常用技術是upsampling。通過upsampling,我們通過複製少數類別example和產生額外的synthetic examples來overrepresent少數類別。這通常與對多數類別進行downsampling結合完成。這種結合downsampling和upsampling的方法是在 2002 年提出的,被稱為Synthetic Minority Over-Sampling(SMOTE)技術。 SMOTE 提供了一種演算法,該演算法通過分析資料集中少數類別的example的feature space來建立這些synthetic example,然後使用nearest neighbors approach在這個feature space內產生相似的example。根據我們選擇一次考量多少相似的data point(也稱為nearest neighbors的數量),SMOTE 方法在這些points之間隨機產生一個新的少數類別exampe。
讓我們看一下 Pima Indian Diabetes Dataset,看它是如何在High level上作業的。該資料集的 34% 包含糖尿病患者的example,因此我們將它視為我們的少數類別。下表顯示了兩個少數類別example的sunset of columns。
基於資料集中這兩個實際examples的新的synthetic example可能類似於下表 ,通過每個column values之間的midpoint計算。
SMOTE 技術主要是指tabular data,但類似的邏輯也可以應用於image dataset。 例如,如果我們正在建立一個模型來區分孟加拉貓和暹羅貓,並且只有 10% 的資料集包含孟加拉貓的image,我們可以使用 Keras ImageDataGenerator class通過image augmentation在我們的資料集中生成孟加拉貓的額外的 variations。 使用一些參數,該類別將通過rotating、cropping、adjusting brightness等方式生成同一個image的multiple variations。
取捨與替代方案
還有一些其他替代解決方案可用於建立既有不平衡資料集的模型,包括reframing問題和處理異常偵測案例。 我們還將探討不平衡資料集的幾個重要考量因素:整體資料集大小、不同問題類型的最佳模型架構,以及解釋少數類別預測。
Reframing 與 Cascade
Reframing問題是處理不平衡資料集的另一種方法。 首先,我們可能會考慮利用reframing設計模式部分中描述的技術將問題從classification轉成reression,反之亦然,並訓練一個 cascade model。 例如,假設我們有一個regression problem,其中大部分training data都在某個範圍內,只有一些異常值。 假設我們關心是預測離群值(outlier value),我們可以通過將大部分資料放入一個bucket中並將異常值放入另一個bucket來將其轉換為classification problem。 想像一下,我們正在使用 BigQuery 出生率資料集建立一個模型來預測嬰兒體重。 使用 pandas,我們可以建立嬰兒體重資料樣本的直方圖,來查看體重資料的分佈:
然後會產生以下直方圖
如果我們計算整個資料集中體重 3 磅的嬰兒數量,大約有 96,000(資料的 06%)。 體重 12 磅的嬰兒僅佔資料集的 0.05%。 為了在整個範圍內獲得良好的regression performance,我們可以將downsampling與 Reframing 和 Cascade 設計模式結合起來。 首先,我們將資料分成三個部分分別為“體重不足”、“平均”和“超重”。 我們可以使用以下BQ Query來做到這一點:
接著就會產生以下表格
由於這只是Demo,我們將從每個類別中取 100,000 個example,以便在更新的平衡資料集上訓練模型:
我們可以將該查詢的結果存到另一個table,有了一個更平衡的資料集,我們現在可以訓練一個分類模型來將嬰兒標記為“體重不足”、“平均”或“超重”:
另一種方法是使用Cascade pattern,為每個類別訓練三個獨立的regression model。 然後,我們可以通過向初始分類模型傳遞一個example並使用該分類的結果來決定將example發送到哪個regression model進行數值預測,從而使用我們的multidesign pattern solution。
異常偵測
有兩種方法可以處理不平衡資料集的regression model:
- 將模型的預測誤差當作single。
- 對incoming data進行cluster並比較每個new data point 與現有cluster的距離。
為了更好的了解每個解決方案,假設我們正在根據sensor收集的資料訓練模型,以預測未來的溫度。在這種情況下,我們需要模型output是一value。
對於第一種方法 — — 使用誤差當作single— — 在訓練模型後,我們將模型的預測值與當前時間點的actual current value進行比較。如果預測值和actual current value之間存在顯著差異,我們可以將incoming data point標記為異常。當然,有良好的準確性訓練的模型需要有著足夠的歷史資料,依靠其quality進行未來的預測。這種方法的主要警告是,它要求我們有現成的新資料,以便我們可以將incoming data與模型的預測進行比較。因此,它最適合處理涉及streaming或time-series data的問題。
在第二種方法中 — — Clustering data — — 我們首先使用Clustering演算法建立模型,Clustering演算法是一種將資料組織成cluster的建模技術。cluster是一種非監督學習方法,這意味著它在沒有truth lable的情況下在資料集中尋找模式。一種常見的Clustering演算法是 k-means,我們可以使用 BigQuery ML 來實現。下面展示如何使用三個feature在 BigQuery 出生率資料集上訓練 k-means 模型:
產生的模型會將我們的資料分為四組。 建立模型後,我們就可以對新資料產生預測並查看該預測與現有clusters的distance。 如果distance很大,我們可以將data point標記為異常。 為了在我們的模型上產生cluster prediction,我們可以運行以下查詢,將資料集中的虛構average example傳遞給它:
下表的查詢結果向我們展示了這個data point與模型產生的cluster(稱為centroids)之間的距離。
從短距離 (. 29) 可以看出,這個example顯然適合centroid_id 4。 我們可以向模型發送離群值、權重不足的example時得到的結果進行比較,如下表所示。
在這邊,這個example與每個centroid之間的距離非常大。 然後,我們可以使用這些遠距離值來推斷該data point可能是異常的。 如果我們事先不知道data的label,這種unsupervised clustering approach是特別有效的。 一旦我們對足夠多的example生成了cluster prediciton,我們就可以使用預測的cluster作為label建立一個監督式學習模型。
可用的少數類別example的數量
雖然我們第一個欺詐偵測example中的少數別僅佔資料的 0.1%,但資料集足夠大,我們仍有 8,000 個欺詐data point可供使用。 對於少數類別example更少的資料集,downsampling可能會使產生的資料集太小,模型無法從中學習。 沒有固定的規則來確定有多少example太少而無法使用downsampling,因為這在很大程度上取決於我們的問題和模型架構。 一般的經驗法則是,如果我們只有數百個少數類別的example,我們可能需要考慮downsampling以外的解決方案來處理資料集的不平衡。 還值得注意的是,刪除我們的多數類別的一個subset自然影響會丟失了存放在這些example中的一些資訊。 這可能會略微降低我們的模型識別多數類別的能力,但通常downsampling的好處仍然大於此。
結合不同的技術
可以結合上述downsampling和類別權重技術以得到最佳結果。為此,我們首先對資料進行downsampling,直到找到適合我們的use case的平衡點。然後,根據再平衡資料集的label ratios,使用加權類別部分中描述的方法將新的權重傳送給我們的模型。當我們遇到異常偵測問題並且最care少數類別的預測時,將這些方法結合起來會很有效。例如,如果我們正在建立欺詐偵測模型,我們可能更關心我們的模型會label成“欺詐”的交易,而不是它標記為“非欺詐”的交易。此外,正如 SMOTE 所提到的,從少數類別產生synetic examples的方法通常與從少數類別中刪除隨機樣本相結合。
Downsampling也經常與 Ensemble 設計模式結合使用。使用這種方法,我們不是完全刪除我們多數類別的隨機樣本,而是使用它的不同subset來訓練多個模型,然後集成這些模型。為了說明這一點,假設我們有一個包含 100 個少數類別example和 1,000 個多數example的資料集。我們沒有從我們的多數類別中刪除 900 個example以完美平衡資料集,而是將多數example隨機分成 10 個groups,每組 100 個example。然後我們將訓練 10 個classifier,每個classifier都有來自少數類別的相同 100 個example和來自多數類別的 100 個不同的隨機選擇的value。下圖中所示的bagging技術適用於這種方法。
除了結合這些data-centric的方法之外,我們還可以根據我們的use case調整classifier的threshold以優化precision或recall。如果我們更關心我們的模型在做出positive class prediction時是否正確,我們將為我們的recall來優化我們的prediction threshold。這適用於我們想要避免false positive的任何情況。或者,如果即使我們可能弄錯了而錯過潛在的positive classification的代價更高,我們會針對recall來優化我們的model。
選擇一個模型架構
根據我們的預測作業,在使用再平衡設計模式解決問題時需要考慮不同的模型架構。 如果我們正在處理tabular data並建立用於異常偵測的分類模型,研究顯示decision tree modle在這些類型的作業上表現良好。 基於tree的模型也適用於涉及小型資料集和不平衡資料集的問題。 XGBoost、scikit-learn 和 TensorFlow 都有實現decision tree modle的方法。 我們可以使用以下code在 XGBoost 中執行binary classifier:
我們可以在這些框架中的每一個中使用downsampling和類別權重,以使用再平衡設計模式進一步優化我們的模型。 例如,要向上面的 XGBClassifier 添加weighted classes,我們將加上一個 scale_pos_weight 參數,該參數基於我們資料集中類別的平衡計算。
如果我們要檢測time-series data的異常,Long short-term memory(LSTM) 模型可以很好地識別序列中存在的模式。 Clustering modle也是具有不平衡類別的tabular data的一種選擇。 對於具有image input的不平衡資料集,請使用具有downsampling、weighted classes、upsampling或這些技術組合的深度學習架構。 然而,對於text data,產生synthetic data就不那麼簡單了,最好依靠downsampling和weighted classes。
無論我們使用哪種資料模式,嘗試不同的模型架構以檢查哪種模式在我們的不平衡資料上表現最佳是比較好的方法。
可解釋性(explainability)的重要
在建立模型以標記資料中的罕見事件(例如異常)時,了解我們的模型如何進行預測尤為重要。這既可以驗證模型是否正在獲取正確的信號以進行預測,也可以幫助向最終用戶解釋模型的行為。有一些工具可以幫助我們解釋模型和解釋預測,包括開源框架 SHAP、what-if tool和 Google Cloud 上的Explainable AI。
模型解釋可以採用多種形式,其中一種稱為attribution values。Attribution values告訴我們模型中的每個feature對模型預測的影響程度。Positive attribution values意味著特定feature將我們模型的預測推高,negative attribution values意味著該特徵將我們模型的預測推低。attribution 的絕對值越高,它對我們模型預測的影響就越大。在image和text modle中,attribution 可以顯示最能代表模型預測的pixel或words。對於tabular modle,attributions為每個feature提供values,表明其對模型預測的整體影響。
在 Kaggle 的synthetic 詐欺偵測資料庫上訓練 TensorFlow 模型並將其部署到 Google Cloud 上的Explainable AI之後,讓我們看一下instance-level attribution的一些example。在下圖中,我們看到了我們的模型正確識別為欺詐的兩個example交易,以及它們的feature attribution。
在模型預測欺詐概率為 99% 的第一個example中,交易發生前原始賬戶的舊餘額是欺詐的最大指標。在第二個example中,我們的模型對欺詐的預測有 89% 的信心,交易金額被確定為欺詐的最大信號。然而,原始賬戶的餘額使我們的模型對其欺詐預測的信心降低,並解釋了為什麼預測信心略低 10 個百分點。
Explantions對於任何類型的ML模型都很重要,但我們可以看到它們對遵循 再平衡設計模式的模型特別有用。在處理不平衡資料時,重要的是要超越模型的準確性和誤差指標,以驗證它是否在我們的資料中提取有意義的信號。
總結
本文通過模型架構和模型輸出的視角來研究了表示預測作業的不同方式。考量如何應用模型可以指導我們決定要建立的模型類型,以及如何格式化output以進行預測。考慮到這一點,我們從Reframing設計模式開始,該模式探索將我們的問題從regression task轉變為classification task(反之亦然),以提高模型的質量。我們可以通過重新格式化資料中的label columns來實現此目的。接下來我們探討了Multilabel設計模式,它解決了模型的input可以與多個albel相關聯的情況。要處理這種情況,需要具有binary cross entropy loss的output上使用 sigmoid activation。
Reframing 和 Multilabel 模式側重於格式化模型output,而 Ensemble 設計模式則解決模型架構問題,並包括用於組合多個模型以改進單個模型的ML結果的各種方法。具體來說,Ensemble 模式包括 bagging、boosting 和 stacking — — 用於將多個模型聚合到一個 ML 系統中的所有不同技術。Cascade設計模式也是一種model-level approach,涉及將ML問題分解為幾個較小的問題。與Ensemble模型不同,Cascade模式需要來自初始模型的output作為下游模型的input。由於Cascade模型會建立它的複雜性,我們應該只在initial classification label不同且同等重要的場景中使用它們。
接下來,我們探討了 Neutral Class 設計模式,它解決了output level的problem respresentation。這種模式通過添加第三個“neutral” calss來改良bainry classifier。在我們想要擷取不屬於任何不同binary categories的任意或極端程度較低的分類時,這是有用的。最後,再平衡設計模式為我們的既有不平衡資料集的情況提供解決方案。這種模式建議使用downsampling、weighted classess或特定的reframing技術來解決具有不平衡標籤類的資料集。本篇與上一篇重點介紹建立ML問題的初始步驟,特別是formatting input data、model architecture選項和modle output representation。下一篇,我們將介紹ML workflow的下一步 — — training model的設計模式。