常規機器學習演算法如何處理多標籤問題

  • 2021 年 3 月 23 日
  • AI

什麼是多標籤分類:

讓我們看一下下面的圖片。

如果我問您該影像是否包含房屋怎麼辦?該選項將為YESNO

考慮另一種情況,我們要同時回答多個問題:

這就是一個典型的多標籤分類問題,標籤存在多個不同的類型。

首先要搞清楚多標籤分類和多分類問題的區別,二者的形式很類似,容易混淆,看下圖:

例如,上面的這部電影,這部電影被評為「 U / A」(意思是「針對12歲以下兒童需要父母陪同觀看」),還有其他類型,例如「 A」(僅限成人)或「 U」(無限制),但是每部電影一定只能是這三種類型中的一種(簡單來說每一行的樣本的標籤必然是只有一個1,其它都是0的形式),其標籤轉化為具體的機器學習演算法的輸出大概長這樣:

[UA,0,0],

[0,A,0],

[0,0,U]

這是多分類問題,當然常見的lgb或者tf這類的都能夠支援 1,3,2,1。。。這樣的不需要onehot的原始的多分類標籤的形式,也能夠支援onehot轉化之後的形式,這個問題不大,就是一個簡單的轉換而已。

但是考慮電影的類型,一部電影可以是「comedy」和「romance」兩種類型,喜劇是電影在悲劇、喜劇、中性劇下的標籤,浪漫則是在「驚悚」,「科幻」,「記錄」。。。等判定標準下的另外一種標籤。這意味著每部電影存在多個不同類型的標籤,而多分類則是存在同一個類型的多標籤。

簡單來說,二分類和多分類都屬於多標籤分類的特例,當標籤的「類型」僅僅為一的時候,多標籤分類問題退化為多分類問題,當單一類型的標籤的取值僅為0或者1的時候,多分類問題退化為二分類問題

我們可以看一下下面的一個例子:

這裡的y就是一個典型的多標籤的情況,如果是多分類,則y的每一行必定僅存在一個1,如果是多標籤,則每一行可以有0個或者多個1。

和時間序列的多步預測一樣,lr和gbdt這類常見的機器學習演算法和介面難以直接處理這樣的輸出形式,因此我們需要使用不同的策略來間接使用機器學習演算法

下面舉一個簡單的例子:(這裡的例子是多輸出問題,多輸出問題包括了多標籤分類和多標籤回歸,除此之外,子任務如果既存在離散的分類型輸出和連續的回歸型輸出則我們統稱為多輸出問題,多目標學習可以應用到多輸出問題中,但是注意,多目標學習和多輸出問題是一個交集的關係,當多目標學習中的多個目標對應不同的數據集時,此時問題不再是多輸出問題,僅僅在多目標學習中的多個目標對應的是同一個數據集的時候,才是多輸出問題

X y1:性別 y2:年齡 y3:收入

用戶1的各種特徵 男 25歲 30萬

用戶2的各種特徵 女 35歲 40萬

任務是根據特徵X,預測這個用戶的性別、年齡和收入

策略1、轉化為多個子問題

問題1:二分類問題,預測性別為男或女

X y1:性別

用戶1的各種特徵 男

用戶2的各種特徵 女

問題2:回歸問題,預測用戶的年齡

X y2:年齡

用戶1的各種特徵 25歲

用戶2的各種特徵 35歲

問題3:回歸問題,預測用戶的收入

X y3:收入

用戶1的各種特徵 30萬

用戶2的各種特徵 40萬

訓練的時候針對每一個子問題分別建立一個模型,預測的時候三個模型分別輸出預測結果,本質上就是多標籤問題轉化為多個單標籤的子問題。

這種問題的處理方法很簡單,我們可以把標籤y進行循環,每次取一列出來作為單標籤子問題的標籤,後續的步驟就和常規的分類或回歸問題的處理方式一樣了,不需要再寫更多程式碼。

這種方法雖然簡單,但是最大的缺點就是沒有考慮標籤之間的相關性,例如用戶是男性,職業為程式設計師,年齡為30歲,工作地點是上海,則其收入大概率會為30萬。從而導致分類的精度降低;

策略2、轉化為多個相關的子問題

這種策略更進一步,本質上和機器學習演算法處理時間序列多步預測的迭代策略一致。

例如上圖是一個4標籤分類問題,我們可以這麼轉換:

這種方法的精度往往會更高並且不會有什麼標籤泄露的問題因為不同類型的標籤本來就沒什麼關係;

和時間序列預測中的迭代法一樣,這種方式的處理也存在缺陷:

1、誤差累計的問題,如果模型1的精度很差,則後續的預測會引入誤差,從而使得後面的模型的精度越來越差;

2、多標籤問題獨有的缺陷,我們並不知道多個子任務之間的順序關係(時序問題的順序關係是自然就有的,t時刻的預測結果必然作為t+1時刻的輸入特徵),這涉及到對不同類型的標籤的預測的先後順序需要進行窮舉,在多標籤問題中如果標籤的類型數量很多,則效率很低,但是如果選擇了不好的預測順序,則最終的模型的精度差異可能很大,除非不同類型的標籤之間的相關性很低,但是如果相關性很低則其實使用策略1就夠了。

這種實現也很簡單,和策略一基本一樣,只不過沒法並行了,因為後續的模型需要在前一個模型的預測結果作為特徵入模之後才可以訓練。

策略3、將多標籤轉化為多分類問題

這種方法也非常的簡單直觀,例如:

我們發現x1和x4的多標籤情況是一樣的,x3和x5的多標籤情況也是一樣的,則我們可以把x1和x4的標籤轉化為單標籤1,其它如法炮製,如下圖:

這種方法也比較簡單,但是也存在著巨大的缺陷,當我們的未來數據集中存在不同的組合情況的時候,

例如測試集有一個樣本的多標籤是[1,1,0,0],則模型無法正確預測,因為我們的訓練標籤里壓根就沒有這種多標籤的情況。這和labelencoder在test數據集出現沒有encode過的類別的問題是一樣的,並且嚴格來說,這種方式是將一個n維(n是多標籤的類型)的問題降維到1維的問題上,最終的效果好壞其實不好確定的,另外對於多輸出(即存在離散的標籤類型和連續的標籤類型的問題),這種方法就沒法使用了。

策略4、展平

策略4僅僅適用於多標籤分類的問題,思路很簡單,假設有一個樣本的多標籤為:

X 【1,A】

則我們進行展平後為:

X [1]

X [A]

需要注意的是,1和A必須是同一個語義空間下的標籤,例如醫療里的一些問題:

患者A [糖尿病,腎結石,癌症]

患者B [胃潰瘍,腸道炎]

這是一種比較特殊的多標籤問題,即多個標籤實際上屬於同一種類型,也是比較常見的問題,例如電影的類型為「浪漫」,「驚悚」,浪漫和驚悚是同一個語義空間下的定義,即二者是同一種類型。

這種情況下,我們可以進行展平,轉化為常規的多分類問題。

策略5、換nn

神經網路靈活的構造使其可以適用於上述所有類型的問題,例如對於最棘手的多輸出問題,標籤中既有離散又有連續類型的標籤,則我們可以在輸出層分別接一個softmax和一個linear的任務層,然後設置好樣本和標籤的形式,使用tf.keras或者torch的框架可以很簡單的寫出來;


同時多標籤分類的另一個需要注意的比較麻煩的問題:

當標籤空間很大時,多標籤分類往往會出現分類器過擬合和欠擬合的問題,尤其是在問題轉換方法中。解決此問題的一種眾所周知的方法是將問題分解為帶有較小標籤子集的子問題,以提高泛化品質。

當標籤空間很大的時候,某些標籤類型下的樣本可能非常的稀少,此時策略1,2,3在這種類型的標籤下學習出來的模型效果會很差(nn的結構雖然可以自然地適配多輸出問題,但是某一個輸出層對應的標籤的數量非常的不平衡,比如某一個分類輸出層幾乎全是0,很少有1,則模型的整體性能也會受到影響,多目標學習的任務之一也是致力於解決這種問題,通過多個目標同時優化來提高在某個任務上的泛化性能),這個時候,我們要做的事情就是進行簡單的標籤聚類,從而將很多標籤問題轉化為不多標籤問題。

策略6、基於圖

這種策略和策略4比較類似,但是比策略4更進一步,策略4僅僅是對多標籤進行簡單的label encoder(處理方法很簡單,把多標籤變成字元串,例如[0,1,2]變成”0,1,2″然後label encoder即可)基於圖的方式也很簡單,假設某個樣本的標籤為[男,程式設計師,上海](性別,職業,工作城市三種類型的標籤),則我們將「男」,「前端」,「上海」當作3個獨立的同質的節點,如果有10個樣本都是這樣的多標籤情況,則「男」,「前端」,「上海」這三個標籤的權重互為10(無向圖),然後使用louvain,infomap,walktrap之類圖聚類演算法對多標籤進行聚類,假設「男」,「前端」,「上海」和「女」,「前端」,「北京」以及「男」,「演算法」,「上海」在同一個社區里,則我們統一打標為「一線碼農」。

這種方式的主要的好處在於,從圖的角度考慮了標籤之間的關聯性質,壞處在於:

1、太糙,標籤聚類本身就喪失了很多細節的資訊了,圖聚類演算法本身也基於不同的假設存在著一定的誤差;

2、對於多輸出問題,有離散和連續標籤的問題,難以使用,例如收入這樣的連續特徵,可能每個人的收入都不一樣。

策略7、專家法

人工打標,例如欺詐問題里,可能把薅羊毛劃分為個體欺詐者,把狂薅羊毛、團伙盜刷、團伙身份盜用等劃分為團體欺詐者。

這種方式依賴人類先驗知識,沒啥好說的。

策略6和策略7,本質上已經把問題轉化為另一個問題了,因為你的預測結果其實比較難轉化到原來的標籤上,比如前面說的「一線碼農」的定義,即使預測出這個類別,也很難直接轉化為「女」,「前端」,「北京」這樣的標籤上,除非我們針對「一線碼農」的數據再訓練一個多標籤分類的模型。

策略8、多標籤的embedding

這種思路就更風騷了。。我真是服了,多標籤還有這種多做法,煩死了。

比如「女」,「前端」,「北京」經過graph embedding之後會得到3個節點向量,進行簡單相加得到這個用戶的標籤的embedding,然後我們構建一個回歸器,用X來預測embedding的結果,得到預測數據集的embedding向量,然後用faiss之類的工具來找最近鄰得到預測用戶的多標籤預測結果。


沒了,後面估計要研究研究多目標學習了,參考自:

scikit-multilearn | Multi-label classification package for Pythonscikit.ml

Solving Multi-Label Classification problems (Case studies included)www.analyticsvidhya.com圖標