天天看點

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

許多自然語言處理都涉及機器學習,是以了解機器學習的一些基本工具和技術是有益處的。有些工具已經在前幾章中讨論過,有些還沒有,但這裡我們會讨論所有這些工具。

D.1 資料選擇和避免偏見

資料選擇和特征工程會帶來偏見的風險(用人類的話來說)。一旦我們把自己的偏見融入算法中,通過選擇一組特定的特征,模型就會适應這些偏見并産生帶有偏差的結果。如果我們足夠幸運能在投入生産之前發現這種偏見,那麼也需要投入大量的工作來消除這種偏見。例如,必須重新建構和重新訓練整個流水線,以便能夠充分利用分詞器的新詞彙表。我們必須重新開始。

一個例子是著名的Word2vec模型的資料和特征選擇。Word2vec是針對大量的新聞報道進行訓練的,從這個語料庫中選擇了大約100萬個n-gram作為這個模型的詞彙表(特征)。它産生了一個使資料科學家和語言學家興奮的模型,後者能夠對詞向量(如“king − man + woman = queen”)進行數學運算。但随着研究的深入,在模型中也出現了更多有問題的關系。

例如,對于“醫生 − 父親 + 母親 = 護士”這個表達式,“護士”的答案并不是人們希望的無偏見和合乎邏輯的結果。性别偏見在不經意間被訓練到模型中。類似的種族、宗教甚至地理區域偏見在原始的Word2vec模型中普遍存在。谷歌公司的研究人員無意制造這些偏見,偏見存在于資料中,即他們訓練Word2vec使用的谷歌新聞語料庫中詞使用統計的資料。

許多新聞報道隻是帶有文化偏見,因為它們是由記者撰寫的,目的是讓讀者開心。這些記者描寫的是一個存在制度偏見和現實生活中人們對待事件的偏見的世界。谷歌新聞中的詞使用統計資料僅僅反映的是,在母親當中當護士的數目要比當醫生的多得多,同時在父親當中當醫生的數目比當護士的多得多。Word2vec模型隻是為我們提供了一個視窗,讓我們了解我們建立的世界。

幸運的是,像Word2vec這樣的模型不需要标記訓練資料。是以,我們可以自由選擇任何喜歡的文本來訓練模型。我們可以選擇一個更平衡的、更能代表大家希望模型做出的信念和推理的資料集。當其他人躲在算法背後說他們隻是按照模型做事時,我們可以與他們分享自己的資料集,這些資料集更公平地代表了一個社會,在這個社會裡,我們渴望為每個人提供平等的機會。

當訓練和測試模型時,大家可以依靠自己天生的公正感來幫助決定一個模型何時可以做出影響使用者生活的預測。如果得到的模型以我們希望的方式對待所有使用者,那麼我們可以在晚上睡個好覺。它還可以幫助密切關注那些與大家不同的使用者的需求,特别是那些通常處于社會不利地位的使用者。如果需要更正式的理由來證明自己的行為,大家還可以學習更多關于統計學、哲學、倫理學、心理學、行為經濟學和人類學的知識,來增強大家在本書中學到的計算機科學技能。

作為一名自然語言處理實踐者和機器學習工程師,大家有機會訓練出比人類做得更好的機器。老闆和同僚不會告訴大家應該在訓練集中添加或删除哪些文本,大家自己有能力影響塑造整體社群和社會的機器的行為。

我們已經為大家提供了一些關于如何組裝一個帶有更少偏見和更公平的資料集的想法。現在,我們将展示如何使得到的模型與無偏見資料相拟合,以便它們在現實世界中精确和有用。

D.2 模型拟合程度

對于所有機器學習模型,一個主要的挑戰是克服模型過度優異的表現。什麼是“過度優異”呢?在處理所有模型中的樣本資料時,給定的算法都可以很好地在給定資料集中找到模式。但是考慮到我們已經知道訓練集中所有給定樣本的标簽(如果不知道其标簽表明它不在訓練集中),是以算法在訓練樣本的上述預測結果不會特别有用。我們真正的目的是利用這些訓練樣本來建構一個有泛化能力的模型,能夠為一個新樣本打上正确标簽。盡管該樣本與訓練集的樣本類似,但是它是訓練集以外的樣本。在訓練集之外新樣本上的預測性能就是我們想優化的目标。

我們稱能夠完美描述(并預測)訓練樣本的模型“過拟合”(overfit)(如圖D-1所示)。這樣的模型将很難或沒有能力描述新資料。它不是一個通用的模型,當給出一個不在訓練集中的樣本時,很難相信它會做得很好。

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

圖D-1 訓練樣本上的過拟合現象

相反,如果我們的模型在訓練樣本上做出了許多錯誤的預測,并且在新樣本上也做得很差,則稱它“欠拟合”(underfit)(如圖D-2所示)。在現實世界中,這兩種模型都對預測作用不大。是以,下面看看哪些技術能夠檢測出上述兩種拟合問題,更重要的是,我們還會給出一些避免上述問題的方法。

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

圖D-2 訓練樣本上的欠拟合現象

D.3 資料集劃分

在機器學習實踐中,如果資料是黃金,那麼标注資料就是raritanium(某遊戲裡的一種珍貴資源)。我們的第一直覺可能是擷取帶标注資料并把它們全部傳遞給模型。更多的訓練資料會産生更有彈性的模型,對吧?但這使我們沒有辦法測試這個模型,隻能心中希望它在現實世界中能産生好的結果。這顯然是不切實際的。解決方案是将帶标注的資料拆分為兩個資料集,有時是3個資料集:一個訓練集、一個驗證集,在某些情況下還有一個測試集。

訓練集是顯而易見的。在一輪訓練中,驗證集是我們保留的對模型隐藏的一小部分帶标注資料。在驗證集上獲得良好性能是驗證經過訓練的模型在訓練集之外的新資料上表現良好的第一步。大家經常會看到将一個給定的标注資料集按照訓練與驗證比80%/20%或70%/30%進行劃分。測試集類似于驗證集,也是帶标注訓練資料的子集,用于測試模型并度量性能。但是這個測試集與驗證集有什麼不同呢?在組成上,它們其實沒有任何不同,差別在于使用它們的方法。

在訓練集上對模型進行訓練時,會有若幹次疊代,疊代過程中會有不同的超參數。我們選擇的最終模型将是在驗證集上執行得最好的模型。但是這裡有一個問題,我們如何知道自己沒有優化一個僅僅是高度拟合驗證集的模型?我們沒有辦法驗證該模型在其他資料上的性能是否良好。這就是我們的老闆或論文的讀者最感興趣的地方——該模型在他們的資料上的效果到底如何?

是以,如果有足夠的資料,需要将标注資料集的第三部分作為測試集。這将使我們的讀者(或老闆)更有信心,确信模型在訓練和調優過程中在從未看到的資料上也可以獲得很好的效果。一旦根據驗證集性能選擇了經過訓練的模型,并且不再訓練或調整模型,那麼就可以對測試集中的每個樣本進行預測(推理)。假如模型在第三部分資料上表現良好,那麼它就有不錯的泛化性。為了得到這種具有高可信度的模型驗證,大家經常會看到資料集按照60%/20%/20%的訓練/驗證/測試比進行劃分的情形。

提示 在對資料集進行訓練集、驗證集和測試集的劃分之前,對資料集進行重新排序是非常重要的。我們希望每個資料子集都是能代表“真實世界”的樣本,并且它們需要與期望看到的每個标簽的比大緻相同。如果訓練集有25%的正向樣本和75%的負向樣本,那麼同樣也希望測試集和驗證集也有25%的正向樣本和75%的負向樣本。如果原始資料集的前面都是負向樣本,并且在将資料集劃分為50%/50%比的訓練集/測試集前沒有打亂資料,那麼在訓練集中将得到100%的負向樣本,而在測試集中将得到50%的負向樣本。這種情況下,模型永遠不能從資料集中的正向樣本中學習。

D.4 交叉拟合訓練

另一個劃分訓練集/測試集的方法是交叉驗證或者k折交叉驗證(如圖D-3所示)。交叉驗證背後的概念和我們剛讨論過的資料劃分非常相似,但是它允許使用所有的帶标記資料集進行訓練。這個過程将訓練集劃分為k等分,或者說k折。然後通過将k − 1份資料作為訓練集訓練模型并在第k份資料上進行驗證。之後将第一次嘗試中用作訓練的k − 1份資料中的一份資料作為驗證集,剩下的k − 1份資料成為新訓練集,進行重新訓練。

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

圖D-3 k折交叉驗證

該技術對于分析模型的結構和尋找對各個驗證資料性能表現良好的超參數具有重要價值。一旦選擇了超參數,還需要選擇表現最好的經過訓練的模型,是以很容易受到上一節所表述的偏見的影響,是以,在此過程中仍然建議保留一份測試集。

這種方法還提供了關于模型可靠性的一些新資訊。我們可以計算一個P值,表示模型發現的輸入特征和輸出預測之間的關系的可能性在統計上是顯著的,而不是随機選擇的結果。如果訓練集确實是真實世界的代表性樣本,那麼這将是一個非常重要的新資訊。

這種對模型有額外信心的代價是,需要k倍的訓練時間來進行k折的交叉驗證。是以,如果想要得到關于問題的90%的答案,通常可以簡單地做1折交叉驗證。這個驗證方法與我們之前做的訓練集/驗證集劃分方法完全相同。我們不會對模型這個對真實世界的動态描述的可靠性有100%的信心,但是如果它在測試集中表現良好,也可以非常自信地認為它是預測目标變量的有用模型。是以通過這種實用方法得到的機器學習模型對大多數商業應用來說都是有意義的。

D.5 抑制模型

在model.fit()中,梯度下降過分熱衷于追求降低模型中可能出現的誤差。這可能導緻過拟合,即學到的模型在訓練集上效果很好,但是在新的未見樣本集(測試集)上卻效果很差。是以,我們可能希望“保留”對模型的控制。以下是3種方法:

  • 正則化;
  • 随機dropout;
  • 批歸一化。

D.5.1 正則化

在所有機器學習模型中,最終都會出現過拟合。幸運的是,有幾種工具可以解決這個問題。第一個是正則化,它是對每個訓練步驟的學習參數的懲罰。它通常但不總是參數本身的一個因子。其中,L1範數和L2範數是最常見的做法。

L1正則化:

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

L1是所有參數(權重)的絕對值與某個λ(超參數)乘積的和,通常是0到1之間的一個小浮點數。這個和應用于權重的更新——其思想是,較大的權重會産生較大的懲罰,是以鼓勵模型使用更多的、均勻的權重……

L2正則化:

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

類似地,L2是一種權重懲罰,但定義略有不同。這種情況下,它是權重的平方與某個λ乘積的和,這個λ值是一個要在訓練前選擇的單獨超參數。

D.5.2 dropout

在神經網絡中,dropout是另一個解決過拟合的辦法——乍一看似乎很神奇。dropout的概念是,在神經網絡的任何一層,我們都會在訓練的時候,按一定比例關閉通過這一層的信号。注意,這隻發生在訓練期間,而不是推理期間。在所有訓練過程中,網絡層中一部分神經元子集都會被“忽略”,這些輸出值被顯式地設定為零。因為它們對預測結果沒有輸入,是以在反向傳播步驟中不會進行權重更新。在下一個訓練步驟中,将選擇層中不同權重的子集,并将其他權重歸零。

一個在任何時間都有20%處于關閉狀态的大腦的網絡該如何學習呢?其思想是,沒有一個特定的權重路徑可以完全定義資料的特定屬性。該模型必須泛化其内部結構,以便該模型通過神經元的多條路徑都能夠處理資料。

被關閉的信号的百分比被定義為超參數,因為它是一個介于0和1之間的浮點數。在實踐中,從0.1到0.5的dropout通常是最優的,當然,這是依賴模型的。在推理過程中,dropout會被忽略,進而充分利用訓練後的權值對新資料進行處理。

Keras提供了一種非常簡單的實作方法,可以在本書的示例和代碼清單D-1中看到。

代碼清單D-1 Keras中的dropout層會減少過拟合

>>> from keras.models import Sequential
>>> from keras.layers import Dropout, LSTM, Flatten, Dense 
>>> num_neurons = 20 
>>> maxlen = 100
>>> embedding_dims = 300
>>> model = Sequential() 
>>> model.add(LSTM(num_neurons, return_sequences=True,
...                input_shape=(maxlen, embedding_dims)))
>>> model.add(Dropout(.2))   
>>> model.add(Flatten())
>>> model.add(Dense(1, activation='sigmoid'))      

D.5.3 批歸一化

神經網絡中一個稱為批歸一化的新概念可以幫助對模型進行标準化和泛化。批歸一化的思想是,與輸入資料非常相似,每個網絡層的輸出應該歸一化為0到1之間的值。關于如何、為什麼、什麼時候這樣做是有益的,以及在什麼條件下應該使用它,仍然存在一些争議。我們希望大家自己去對這個研究方向進行探索。

但是Keras的BatchNormalization層提供了一個簡單的實作方法,如代碼清單D-2所示。

代碼清單D-2 歸一化BatchNormalization

>>> from keras.models import Sequential
>>> from keras.layers import Activation, Dropout, LSTM, Flatten, Dense
>>> from keras.layers.normalization import BatchNormalization
>>> model = Sequential()
>>> model.add(Dense(64, input_dim=14))
>>> model.add(BatchNormalization())
>>> model.add(Activation('sigmoid'))
>>> model.add(Dense(64, input_dim=14))
>>> model.add(BatchNormalization())
>>> model.add(Activation('sigmoid'))
>>> model.add(Dense(1, activation='sigmoid'))      

D.6 非均衡訓練集

機器學習模型的好壞取決于提供給它們的資料。隻有當樣本中涵蓋了希望在預測階段的所有情況時,擁有大量的資料才有幫助,并且資料集涵蓋每種情況僅僅一次是不夠的。想象一下我們正試圖預測一副圖像到底是一隻狗還是一隻貓。這時我們手裡有一個訓練集,裡面包含20 000張貓的照片,但是狗的照片隻有200張。如果要在這個資料集中訓練一個模型,那麼這個模型很可能隻是簡單地學會将任何給定的圖像都預測為一隻貓,而不管輸入是什麼。從模型的角度來說,這個結果還可以接受,對不對?我的意思是,對99%的訓練樣本的預測結果都是正确的。當然,這個觀點實際完全站不住腳,這個模型毫無價值。但是,完全超出了特定模型的範圍之外,造成這種失敗的最可能原因是非均衡訓練集。

模型可能會非常關注訓練集,其原因很簡單,來自标記資料中過采樣類的信号會壓倒來自欠采樣類的信号。權重将更經常地由主類信号的誤差進行更新,而來自小類的信号将被忽視。獲得每個類的絕對均勻表示并不重要,因為模型自己能夠克服一些噪聲。這裡的目标隻是讓類的比例達到均衡水準。

與任何機器學習任務一樣,第一步是長時間、仔細地檢視資料,了解一些細節,并對資料實際表示的内容進行一些粗略的統計。不僅要知道有多少資料,還要知道有多少種類的資料。

那麼,如果事情從一開始就沒有特别之處,大家會怎麼做呢?如果目标是使類的表示均勻(确實如此),則有3個主要方法可供選擇:過采樣、欠采樣和資料增強。

D.6.1 過采樣

過采樣是一種重複采樣來自一個或多個欠表示類的樣本的技術。我們以先前的狗/貓分類示例為例(隻有200隻狗,有20 000隻貓)。我們可以簡單地重複100次已有的200張狗的圖像,最終得到40 000個樣本,其中一半是狗,一半是貓。

這是一個極端的例子,是以會導緻自身固有的問題。這個網絡很可能會很好地識别出這200隻特定的狗,而不能很好地推廣到其他不在訓練集中的狗。但是,在不那麼極端不平衡的情況下,過采樣技術肯定有助于平衡訓練集。

D.6.2 欠采樣

欠采樣是同一枚硬币的反面。在這裡,就是從過度表示的類中删除部分樣本。在上面的貓/狗示例中,我們将随機删除19 800張貓的圖檔,這樣就會剩下400個樣本,其中一半是狗,一半是貓。當然,這樣做本身也有一個突出的問題,就是我們抛棄了絕大多數的資料,而隻在一個不那麼寬泛的資料基礎上進行研究。上述例子中這樣的極端做法并不理想,但是如果欠表示類本身包含大量的樣本,那麼上述極端做法可能是一個很好的解決方案。當然,擁有這麼多資料絕對是太奢侈了。

D.6.3 資料增強

資料增強有點兒棘手,但在适當的情況下它可以給我們帶來幫助。增強的意思是生成新的資料,或者從現有資料的擾動中生成,或者重新生成。AffNIST就是這樣一個例子。著名的MNIST資料集由一組手寫的0~9數字組成(如圖D-4所示)。AffNIST在保留原始标簽的同時,以各種方式對每個數字進行傾斜、旋轉和縮放。

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

圖D-4 最左側列中的條目是原始MNIST中的樣本,其他列都是經仿射

轉換後包含在affNIST中的資料(圖檔經“affNIST”授權)

這種特别的做法的目的并不是平衡訓練集,而是使像卷積神經網絡一樣的網絡對以其他方式編寫的新資料更具彈性,但這裡資料增強的概念仍然适用。

不過,大家必須小心,添加不能真正代表待模組化型資料的資料有可能弊大于利。假設資料集是之前的200隻狗和20 000隻貓組成的圖檔集。我們進一步假設這些圖像都是在理想條件下拍攝的高分辨率彩色圖像。現在,給19 000名幼稚園教師一盒蠟筆并不一定能得到想要的增強資料。是以,考慮一下增強的資料會對模型産生什麼樣的影響。答案并不是在任何時候都清晰無比,是以如果一定要沿着這條路徑走下去的話,在驗證模型時請記住模型的影響這一點,并努力圍繞其邊緣進行測試,以確定沒有無意中引入意外的行為。

最後,再說一件可能價值最小的事情,但這的确是事實:如果資料集“不完整”,那麼首先應該考慮回到原來的資料源中尋找額外的資料。這種做法并不總是可行,但至少應該把它當作一種選擇。

D.7 性能名額

任何機器學習流水線中最重要的部分都是性能名額。如果不知道學到的機器學習模型運作得有多好,就無法讓它變得更好。當啟動機器學習流水線時,要做的第一件事是在任何sklearn機器學習模型上設定一個性能度量方法,例如“.score()”。然後我們建構一個完全随機的分類/回歸流水線,并在最後計算性能分數。這使我們能夠對流水線進行增量式改進,進而逐漸提高分數,以便更接近最終的目标。這也是讓老闆和同僚确信大家走在正确的軌道上的好方法。

D.7.1 分類的衡量名額

對分類器而言,我們希望它做對兩件事:一是用類标簽标記真正屬于該類的對象,二是不用這個标簽去标記不屬于此類的對象。這兩件事對應得到的正确計數值分别稱為真陽(true positive)和真陰(true negative)。如果有一個numpy數組包含模型分類或預測的所有結果,那麼就可以計算出正确的預測結果,如代碼清單D-3所示。

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

代碼清單D-4 計算模型得到的錯誤結果

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

有時,這4個數合并成一個4 × 4矩陣,稱為誤差矩陣或混淆矩陣。代碼清單D-5給出了混淆矩陣中預測值和真實值的樣子。

代碼清單D-5 混淆矩陣

>>> confusion = [[true_positives, false_positives],
...              [false_negatives, true_negatives]]
>>> confusion
[[4, 3], [1, 2]]
>>> import pandas as pd
>>> confusion = pd.DataFrame(confusion, columns=[1, 0], index=[1, 0])
>>> confusion.index.name = r'pred \ truth'
>>> confusion
              1   0
pred \ truth 
1             4   1 
0             3   2      

在混淆矩陣中,我們希望對角線(左上角和右下角)上的數字較大,希望對角線外的數字(左上角和左下角)較小。然而,正向類和負向類的順序是任意的,是以有時可能會看到這個表的數字被調換了位置。請始終标記好混淆矩陣的列和下标。有時可能會聽到統計學家把這個矩陣稱為分類器列聯表,但如果堅持使用“混淆矩陣”這個名字的話,就可以避免混淆。

對于機器學習分類問題,有兩種有用的方法可以将這4種計數值中的一些名額組合成一個性能名額:正确率(precision)和召回率(recall)。資訊檢索(搜尋引擎)和語義搜尋就是此分類問題的例子,因為那裡的目标是将文檔分為(和輸入查詢)比對或不比對兩類。第2章中,我們學習過詞幹還原和詞形歸并如何能夠提高召回率,但同時降低了正确率。

正确率度量的是模型在檢測所感興趣類的所有對象(稱為正向類)的能力,是以它也被稱為正向預測值(positive predictive value)。由于真陽是預測正确的正向類樣本數目,而假陽是錯誤地标記為正向類的負向類樣本數目,是以可以按照代碼清單D-6所示來計算正确率。

代碼清單D-6 正确率

>>> precision = true_positives / (true_positives + false_positives)
>>> precision
0.571...      

上述例子中的混淆矩陣給出了約57%的正确率,因為在所有預測為正向類的樣本中有約57%是正确的。

召回率和正确率類似,它也被稱為靈敏度、真陽率或查全率。因為資料集中的樣本總數是真陽(true positive)和假陰(false negative)的和,是以可以計算召回率,即檢測到的預測正确的正向類樣本占所有樣本的百分比,代碼如代碼清單D-7所示。

代碼清單D-7 召回率

>>> recall = true_positives / (true_positives + false_negatives)
>>> recall
0.8      

這就是說上面例子中得到的模型檢測到了資料集中80%的正向類樣本。

D.7.2 回歸的衡量名額

用于機器學習回歸問題的兩個最常見的性能評價名額是均方根誤差(RMSE)和皮爾遜相關系數(R2)。事實證明,分類問題背後實際上是回歸問題。是以,如果類标簽已經轉換為數字(就像我們在上一節中所做的那樣),就可以在其上使用回歸度量方法。下面的代碼示例将複用上一節的那些預測值和真實值。RMSE對于大多數問題是最有用的,因為它給出的是預測值與真實值可能的相差程度。RMSE給出的是誤差的标準偏差,如代碼清單D-8所示。

代碼清單D-8 均方根誤差(RMSE)

>>> y_true = np.array([0, 0, 0, 1, 1, 1, 1, 1, 1, 1])
>>> y_pred = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0, 0])
>>> rmse = np.sqrt((y_true - y_pred) ** 2) / len(y_true))
>>> rmse
0.632...      

皮爾遜相關系數是回歸函數的另一個常見性能名額。sklearn子產品預設将其作為.score()函數附加到大多數模型上。如果大家不清楚這些名額如何計算的話,那麼應該手動計算一下找找感覺。相關系數的計算參見代碼清單D-9。

代碼清單D-9 相關系數

>>> corr = pd.DataFrame([y_true, y_pred]).T.corr()
>>> corr[0][1]
0.218...
>>> np.mean((y_pred - np.mean(y_pred)) * (y_true - np.mean(y_true))) /
...     np.std(y_pred) / np.std(y_true)
0.218...      

由此可見我們的樣本預測值與真實值的相關度隻有28%。

D.8 專業技巧

一旦掌握了基本知識,那麼下面這些簡單的技巧将有助于更快地建立良好的模型:

  • 使用資料集中的一個小的随機樣本子集來發現流水線的可能缺陷;.
  • 當準備将模型部署到生産環境中時,請使用所有的資料來訓練模型;
  • 首先應該嘗試自己最了解的方法,這個技巧也适用于特征提取和模型本身;
  • 在低維特征和目标上使用散點圖和散點矩陣,以確定沒有遺漏一些明顯的模式;
  • 繪制高維資料作為原始圖像,以發現特征的轉移**;
  • 當希望最大化向量對之間的差異時,可以嘗試對高維資料使用PCA(對NLP資料使用LSA);
  • 當希望在低維空間中進行回歸或者尋找比對的向量對時,可以使用非線性降維,如t-SNE;
  • 建構一個sklearn.Pipeline對象,以提高模型和特性提取器的可維護性和可複用性;
  • 使超參數的調優實作自動化,這樣模型就可以了解資料,大家就可以花時間學習機器學習。
超參數調優 超參數是所有那些确定流水線性能的值,包括模型類型及其配置方式等。超參數還可以是神經網絡中包含的神經元數和層數,或者是sklearn.linear_model.Ridge嶺回歸模型中的alpha值。超參數還包括控制所有預處理步驟的值,例如分詞類型、所有忽略的詞清單、TF-IDF詞彙表的最小和最大文檔頻率、是否使用詞形歸并、TF-IDF歸一化方法等。

超參數調優可能是一個十分緩慢的過程,因為每個實驗都需要訓練和驗證一個新模型。是以,在搜尋範圍廣泛的超參數時,我們需要将資料集減小到具有代表性的最小樣本集。當搜尋接近滿足需求的最終模型時,可以增加資料集的大小,以使用盡可能多的所需資料。

優化流水線的超參數是提高模型性能的方法。實作超參數調優自動化可以節省更多的時間來閱讀本書這樣的書籍,或者可視化和分析最後的結果。當然大家仍然可以通過直覺設定要嘗試的超參數範圍來指導調優。

提示 超參數調優最有效的算法是(從最好到最差):

(1)貝葉斯搜尋;

(2)遺傳算法;

(3)随機搜尋;

(4)多分辨率網格搜尋;

(5)網格搜尋。

但是無論如何,在大家進入夢鄉時工作的所有計算機搜尋算法,都比手動猜測一個個新參數好。

本文摘自《自然語言處理實戰 利用Python了解、分析和生成文》

自然語言處理實戰:機器學習常見工具與技術D.1 資料選擇和避免偏見D.2 模型拟合程度D.3 資料集劃分D.4 交叉拟合訓練D.5 抑制模型D.5.1 正則化D.5.2 dropoutD.5.3 批歸一化D.6 非均衡訓練集D.6.1 過采樣D.6.2 欠采樣D.6.3 資料增強D.7 性能名額D.7.1 分類的衡量名額D.7.2 回歸的衡量名額D.8 專業技巧

[美] 霍布森·萊恩,科爾·霍華德,漢納斯·馬克斯·哈普克 著,史亮,魯骁,唐可欣,王斌 譯

  • Python自然語言處理NLP入門到實戰
  • 兼具基礎理論與程式設計實戰,現代自然語言處理領域從業者的實用指南
  • 提供源代碼,小米AI實驗室NLP團隊獻譯

本書是介紹自然語言處理(NLP)和深度學習的實戰書。NLP已成為深度學習的核心應用領域,而深度學習是NLP研究和應用中的必要工具。本書分為3部分:第一部分介紹NLP基礎,包括分詞、TF-IDF向量化以及從詞頻向量到語義向量的轉換;第二部分講述深度學習,包含神經網絡、詞向量、卷積神經網絡(CNN)、循環神經網絡(RNN)、長短期記憶(LSTM)網絡、序列到序列模組化和注意力機制等基本的深度學習模型和方法;第三部分介紹實戰方面的内容,包括資訊提取、問答系統、人機對話等真實世界系統的模型建構、性能挑戰以及應對方法。

本書面向中進階Python開發人員,兼具基礎理論與程式設計實戰,是現代NLP領域從業者的實用參考書。

繼續閱讀