自訓練和半監督學習介紹

2021-02-13 磐創AI

作者 | Doug Steen 

編譯 | VK 

來源 | Towards Data Science

當涉及到機器學習分類任務時,用於訓練算法的數據越多越好。在監督學習中,這些數據必須根據目標類進行標記,否則,這些算法將無法學習獨立變量和目標變量之間的關係。但是,在構建用於分類的大型標記數據集時,會出現兩個問題:

「標記數據可能很耗時」。假設我們有1000000張狗圖像,我們想將它們輸入到分類算法中,目的是預測每個圖像是否包含波士頓狗。如果我們想將所有這些圖像用於監督分類任務,我們需要一個人查看每個圖像並確定是否存在波士頓狗。「標記數據可能很昂貴」。原因一:要想讓人費盡心思去搜100萬張狗狗照片,我們可能得掏錢。

那麼,這些未標記的數據可以用在分類算法中嗎?

這就是半監督學習的用武之地。在半監督方法中,我們可以在少量的標記數據上訓練分類器,然後使用該分類器對未標記的數據進行預測。

由於這些預測可能比隨機猜測更好,未標記的數據預測可以作為「偽標籤」在隨後的分類器迭代中採用。雖然半監督學習有很多種風格,但這種特殊的技術稱為自訓練。

自訓練

在概念層面上,自訓練的工作原理如下:

「步驟1」:將標記的數據實例拆分為訓練集和測試集。然後,對標記的訓練數據訓練一個分類算法。

「步驟2」:使用經過訓練的分類器來預測所有未標記數據實例的類標籤。在這些預測的類標籤中,正確率最高的被認為是「偽標籤」。

(第2步的幾個變化:a)所有預測的標籤可以同時作為「偽標籤」使用,而不考慮概率;或者b)「偽標籤」數據可以通過預測的置信度進行加權。)

「步驟3」:將「偽標記」數據與正確標記的訓練數據連接起來。在組合的「偽標記」和正確標記訓練數據上重新訓練分類器。

「步驟4」:使用經過訓練的分類器來預測已標記的測試數據實例的類標籤。使用你選擇的度量來評估分類器性能。

(可以重複步驟1到4,直到步驟2中的預測類標籤不再滿足特定的概率閾值,或者直到沒有更多未標記的數據保留。)

好的,明白了嗎?很好!讓我們通過一個例子解釋。

示例:使用自訓練改進分類器

為了演示自訓練,我使用Python和「surgical_deepnet」 數據集,可以在Kaggle上找到:https://www.kaggle.com/omnamahshivai/surgical-dataset-binary-classification

此數據集用於二分類,包含14.6k+手術的數據。這些屬性是bmi、年齡等各種測量值,而目標變量complexing則記錄患者是否因手術而出現併發症。顯然,能夠準確地預測患者是否會因手術而出現併發症,這對醫療保健和保險供應商都是最有利的。

「導入庫」

對於本教程,我將導入numpy、pandas和matplotlib。我還將使用sklearn中的LogisticRegression分類器,以及用於模型評估的f1_score和plot_confusion_matrix 函數

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import f1_score
from sklearn.metrics import plot_confusion_matrix

「加載數據」

# 加載數據

df = pd.read_csv('surgical_deepnet.csv')
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14635 entries, 0 to 14634
Data columns (total 25 columns):
bmi                    14635 non-null float64
Age                    14635 non-null float64
asa_status             14635 non-null int64
baseline_cancer        14635 non-null int64
baseline_charlson      14635 non-null int64
baseline_cvd           14635 non-null int64
baseline_dementia      14635 non-null int64
baseline_diabetes      14635 non-null int64
baseline_digestive     14635 non-null int64
baseline_osteoart      14635 non-null int64
baseline_psych         14635 non-null int64
baseline_pulmonary     14635 non-null int64
ahrq_ccs               14635 non-null int64
ccsComplicationRate    14635 non-null float64
ccsMort30Rate          14635 non-null float64
complication_rsi       14635 non-null float64
dow                    14635 non-null int64
gender                 14635 non-null int64
hour                   14635 non-null float64
month                  14635 non-null int64
moonphase              14635 non-null int64
mort30                 14635 non-null int64
mortality_rsi          14635 non-null float64
race                   14635 non-null int64
complication           14635 non-null int64
dtypes: float64(7), int64(18)
memory usage: 2.8 MB

數據集中的屬性都是數值型的,沒有缺失值。由於我這裡的重點不是數據清理,所以我將繼續對數據進行劃分。

「數據劃分」

為了測試自訓練的效果,我需要將數據分成三部分:訓練集、測試集和未標記集。我將按以下比例拆分數據:

對於未標記集,我將簡單地放棄目標變量complexing,並假裝它從未存在過。

所以,在這個病例中,我們認為74%的手術病例沒有關於併發症的信息。我這樣做是為了模擬這樣一個事實:在實際的分類問題中,可用的大部分數據可能沒有類標籤。然而,如果我們有一小部分數據的類標籤(在本例中為1%),那麼可以使用半監督學習技術從未標記的數據中得出結論。

下面,我隨機化數據,生成索引來劃分數據,然後創建測試、訓練和未標記的劃分。然後我檢查各個集的大小,確保一切都按計劃進行。

X_train dimensions: (146, 24)
y_train dimensions: (146,)

X_test dimensions: (3659, 24)
y_test dimensions: (3659,)

X_unlabeled dimensions: (10830, 24)

「類分布」

多數類的樣本數((併發症))是少數類(併發症)的兩倍多。在這樣一個不平衡的類的情況下,我想準確度可能不是最佳的評估指標。

選擇F1分數作為分類指標來判斷分類器的有效性。F1分數對類別不平衡的影響比準確度更為穩健,當類別近似平衡時,這一點更為合適。F1得分計算如下:

其中precision是預測正例中正確預測的比例,recall是真實正例中正確預測的比例。

「初始分類器(監督)」

為了使半監督學習的結果更真實,我首先使用標記的訓練數據訓練一個簡單的Logistic回歸分類器,並對測試數據集進行預測。

Train f1 Score: 0.5846153846153846
Test f1 Score: 0.5002908667830134

分類器的F1分數為0.5。混淆矩陣告訴我們,分類器可以很好地預測沒有併發症的手術,準確率為86%。然而,分類器更難正確識別有併發症的手術,準確率只有47%。

「預測概率」

對於自訓練算法,我們需要知道Logistic回歸分類器預測的概率。幸運的是,sklearn提供了.predict_proba()方法,它允許我們查看屬於任一類的預測的概率。如下所示,在二元分類問題中,每個預測的總概率總和為1.0。

array([[0.93931367, 0.06068633],
       [0.2327203 , 0.7672797 ],
       [0.93931367, 0.06068633],
       ...,
       [0.61940353, 0.38059647],
       [0.41240068, 0.58759932],
       [0.24306008, 0.75693992]])

「自訓練分類器(半監督)」

既然我們知道了如何使用sklearn獲得預測概率,我們可以繼續編碼自訓練分類器。以下是簡要概述:

「第1步」:首先,在標記的訓練數據上訓練Logistic回歸分類器。

「第2步」:接下來,使用分類器預測所有未標記數據的標籤,以及這些預測的概率。在這種情況下,我只對概率大於99%的預測採用「偽標籤」。

「第3步」:將「偽標記」數據與標記的訓練數據連接起來,並在連接的數據上重新訓練分類器。

「第4步」:使用訓練好的分類器對標記的測試數據進行預測,並對分類器進行評估。

重複步驟1到4,直到沒有更多的預測具有大於99%的概率,或者沒有未標記的數據保留。

下面的代碼使用while循環在Python中實現這些步驟。

Iteration 0
Train f1: 0.5846153846153846
Test f1: 0.5002908667830134
Now predicting labels for unlabeled data...
42 high-probability predictions added to training data.
10788 unlabeled instances remaining.

Iteration 1
Train f1: 0.7627118644067796
Test f1: 0.5037463976945246
Now predicting labels for unlabeled data...
30 high-probability predictions added to training data.
10758 unlabeled instances remaining.

Iteration 2
Train f1: 0.8181818181818182
Test f1: 0.505431675242996
Now predicting labels for unlabeled data...
20 high-probability predictions added to training data.
10738 unlabeled instances remaining.

Iteration 3
Train f1: 0.847457627118644
Test f1: 0.5076835515082526
Now predicting labels for unlabeled data...
21 high-probability predictions added to training data.
10717 unlabeled instances remaining.

...
Iteration 44
Train f1: 0.9481216457960644
Test f1: 0.5259179265658748
Now predicting labels for unlabeled data...
0 high-probability predictions added to training data.
10079 unlabeled instances remaining.

自訓練算法經過44次迭代,就不能以99%的概率預測更多的未標記實例了。即使一開始有10,830個未標記的實例,在自訓練之後仍然有10,079個實例未標記(並且未被分類器使用)。

經過44次迭代,F1的分數從0.50提高到0.525!雖然這只是一個小的增長,但看起來自訓練已經改善了分類器在測試數據集上的性能。上圖的頂部面板顯示,這種改進大部分發生在算法的早期迭代中。同樣,底部面板顯示,添加到訓練數據中的大多數「偽標籤」都是在前20-30次迭代中出現的。

最後的混淆矩陣顯示有併發症的手術分類有所改善,但沒有併發症的手術分類略有下降。有了F1分數的提高,我認為這是一個可以接受的進步-可能更重要的是確定會導致併發症的手術病例(真正例),並且可能值得增加假正例率來達到這個結果。

「警告語」

所以你可能會想:用這麼多未標記的數據進行自訓練有風險嗎?答案當然是肯定的。請記住,儘管我們將「偽標記」數據與標記的訓練數據一起包含在內,但某些「偽標記」數據肯定會不正確。當足夠多的「偽標籤」不正確時,自訓練算法會強化糟糕的分類決策,而分類器的性能實際上會變得更糟。

可以使用分類器在訓練期間沒有看到的測試集,或者使用「偽標籤」預測的概率閾值,可以減輕這種風險。

原文連結:https://towardsdatascience.com/a-gentle-introduction-to-self-training-and-semi-supervised-learning-ceee73178b38

相關焦點

  • 自監督、半監督和有監督全涵蓋,四篇論文遍歷對比學習的研究進展
    其中,SimCLRv2 是在 SimCLR 的基礎上構建的一個半監督學習框架,作者給出的分析和實驗顯示,半監督學習(SimCLRv2)極大提升了自監督對比學習(SimCLR)的效果,在文章中的實驗條件下,SimCLRv2 僅使用 10% 的標記數據就獲得了超過監督學習的效果。
  • 「半監督學習系列」2. 半監督學習概述
    然而,遺憾的是,傳統的監督學習方法無法使用未標記的數據來訓練分類器。半監督學習很有吸引力,因為通過潛在地利用標記數據和非標記數據,它可以實現比監督學習更好的性能。從另一個角度來看,半監督學習使用更少的標記實例達到與監督學習相同的性能。這種方法減少了標註工作,從而降低了成本。我們後續將在第3、4、5、6章中介紹幾種計算模型。
  • 半監督學習入門基礎(一)
    SSL的目標是要比單獨使用有標記數據訓練的監督學習技術得到更好的結果。這是半監督學習系列文章的第1部分,對這個機器學習的重要子領域進行了簡要的介紹。區分半監督學習,監督學習和無監督學習整個數據集中可用於訓練的有標記數據的範圍區分了機器學習的這三個相關領域。
  • 比監督學習做的更好:半監督學習
    在這個我們對半監督學習的探索中,我們會有:半監督學習簡介。什麼是半監督學習,它與其他學習方法相比如何,半監督學習算法的框架/思維過程是什麼?算法:Semi-Supervised GANs。與傳統GANs的比較,過程的解釋,半監督GANs的性能。用例和機器學習的未來。為什么半監督學習會有如此大的需求,哪裡可以應用。
  • 監督學習/無監督學習/半監督學習
    監督學習:(數據有輸入有輸出),通過已有的一部分數據和輸出數據之間的相應關係,生成一個函數,將輸入映射到合適的輸出,在準確的說有監督學習就是訓練樣本中必須有標籤或者標記;無監督學習:(數據只有輸入),給定的訓練樣本中難以標註類別或者標註成本過高,這類沒有類別標註(未被標記)的訓練集建模模式稱為無監督學習
  • 如何使用半監督學習為結構化數據訓練出更好的深度學習模型
    本文將使用半監督學習來提高深度神經模型在低數據環境下應用於結構化數據時的性能。 本文最初發表於 Towards Data Science 博客,經原作者 Youness Mansar 授權,InfoQ 中文站翻譯並分享。
  • 手把手教你實現GAN半監督學習
    在正式介紹實現半監督學習之前,我在這裡首先介紹一下監督學習(supervised learning),半監督學習(semi-supervised learning)和無監督學習(unsupervised learning)的區別。監督學習是指在訓練集中包含訓練數據的標籤(label),比如類別標籤,位置標籤等等。
  • 半監督學習入門基礎(二):最基礎的3個概念
    >今天給大家介紹半監督學習中的3個最基礎的概念:一致性正則化,熵最小化和偽標籤,並介紹了兩個經典的半監督學習方法。半監督學習 (SSL) 是一種非常有趣的方法,用來解決機器學習中缺少標籤數據的問題。SSL利用未標記的數據和標記的數據集來學習任務。SSL的目標是得到比單獨使用標記數據訓練的監督學習模型更好的結果。這是關於半監督學習的系列文章的第2部分,詳細介紹了一些基本的SSL技術。
  • 監督學習,非監督學習,半監督學習三者的區別是什麼,舉出一個最有...
    參賽者,需要根據題目找出結構和規則,才能解題。(在沒有老師的情況下,學生自學的過程。學生在學習的過程中,自己對知識進行歸納、總結。無監督學習中,類似分類和回歸中的目標變量事先並不存在。要回答的問題是「從數據X中能發現什麼」。)半監督學習:家教,家教老師給學生講一兩道例題思路,然後給學生布置沒有答案的課後習題,讓學生課後自己完成。
  • 基於關係推理的自監督學習無標記訓練
    在這種情況下,使用新的數據集從頭開始訓練深度模型是一種選擇,但是使用預先訓練的深度模型時標記數據需要花費大量的時間和精力,這似乎不再有幫助。這就是自監督學習誕生的原因。這背後的想法很簡單,主要有兩個任務:代理任務:深度模型將從沒有注釋的未標記數據中學習可歸納的表示,然後能夠利用隱式信息自行生成監督信號。
  • 德克薩斯A&M大學在讀博士遊宇寧:自監督學習在圖卷積網絡中的研究...
    自監督學習是一種介於無監督和有監督學習之間的新範式,可以有效減少對大量帶注釋數據的需求。在數據訓練的過程中,生成帶有無噪聲標籤的數據集的成本很高,而無標籤的數據又一直在不斷產生。為了有效利用大量的無標籤數據,自監督學習通過設置合理的學習目標和定義前置任務,從數據本身中得到了監督信號。
  • 【源頭活水】淺談圖上的自監督學習——對比學習
    首先,介紹《Self-supervised Learning: Generative or Contrastive》,其內容覆蓋了CV、NLP、Graph三個方向自監督學習的成果。當筆者初識自監督學習時,通過他人的介紹,僅理解為了一種利用自身性質,標註更多標籤的一種手段,但隨著論文閱讀的增加,對自監督本質的理解越來越迷惑。個人理解,其實任意挖掘對象之間聯繫、探索不同對象共同本質的方法,都或多或少算是自監督學習的思想。
  • 《機器學習》筆記-半監督學習(13)
    記錄筆記,一方面,是對自己先前學習過程的總結和補充。 另一方面,相信這個系列學習過程的記錄,也能為像我一樣入門機器學習和深度學習同學作為學習參考。>讓學習器不依賴外界交互,自動地利用未標記樣本來提升學習性能,就是半監督學習(semi-supervised learning)。
  • 「文本增強+半監督學習」雙管齊下!
    本文從「文本增強」和「半監督學習」這兩個角度出發,談一談如何解決少樣本困境。正式介紹之前,我們首先需要思考什麼才是一種好的解決少樣本困境的方案?本文嘗試給出了三個層次的評價策略,我們希望採取相關數據增強或弱監督技術後:1. 在少樣本場景下,比起同等標註量的無增強監督學習模型,性能有較大幅度的提升2.
  • 監督學習、非監督學習和強化學習
    一板一眼的大兒子:監督學習他性格單純,做事踏實。但是很多事你必須先要和他解釋很多次,他才有足夠的判斷力作出決定。比如今天你帶他來到公園,為了讓他了解什麼是植物,你指著楊樹、柳樹、灌木叢和草地說:「看,這些都是植物」,然後指著汽車、房子和路燈說這些不是植物。
  • 從自監督學習主流方法、最新工作進展,看未來前景研究方向
    自監督學習在預訓練模型中的成功讓研究人員覺得非常興奮,同時也激發了更多的靈感。我們之前介紹的模型都是在專注如何尋找自監督信息,而自監督學習一定要脫離下遊的具體任務嗎?而自監督和半監督學習[16]也可以進行結合,對於無標記的數據進行自監督學習(旋轉預測),和對於有標記數據,在進行自監督學習的同時利用聯合訓練的想法進行有監督學習。
  • 使用半監督學習從研究到產品化的3個教訓
    半監督學習(SSL),一個結合了監督和非監督學習的子領域,在過去幾年中在深度學習研究社區中越來越受歡迎。很有可能,至少在短期內,SSL方法可能成為標籤密集型監督學習和未來數據高效建模之間的橋梁。半監督圖像分類的提升很難轉化為目標檢測的提升。我們在SSL方面的大部分進展都是在圖像分類性能方面進行的,並在目標檢測方面進行類似的改進,但我們發現很難在實踐中對它們進行適應。因此,在半監督目標檢測領域需要進行更多的工作和研究。什麼是半監督學習(SSL)?
  • 試試自監督學習
    接下來,讓我們一起看下,自監督學習到底有多厲害。自監督學習簡介在多數情況下,訓練神經網絡都應該從一個預訓練(pre-trained)模型開始,然後再對它進行微調。通過預訓練模型,可以比從頭開始訓練,節省1000倍的數據。
  • 語音處理中的自監督學習
    文章來自知乎,原文連結:https://zhuanlan.zhihu.com/p/152672250自監督學習也可以用在語音處理中。我們很容易收集到很多無標註的語音數據。把它用去噪自編碼器的方法去做預訓練,再在有標註的數據上微調。這便是自監督學習的核心精神。這一期,我們來講講所有自監督學習方法在語音處理上的應用。大概會有 24 個不同的方法。
  • BYOL:輕鬆進行自監督學習
    自監督學習在深度學習中,經常遇到的問題是沒有足夠的標記數據,而手工標記數據耗費大量時間且人工成本高昂。基於此,自我監督學習成為深度學習的研究熱點,旨在從未標記樣本中進行學習,以緩解數據標註困難的問題。子監督學習的目標很簡單,即訓練一個模型使得相似的樣本具有相似的表示,然而具體實現卻困難重重。