機器學習入門系列(2)--如何構建一個完整的機器學習項目,第三篇!

該系列的前兩篇文章:

  • 機器學習入門系列(2)--如何構建一個完整的機器學習項目(一)
  • 機器學習數據集的獲取和測試集的構建方法

分別介紹了確定項目終極目標、選擇損失函數、獲取數據以及構建測試集,接下來在進入選擇演算法和訓練模型之前,一個很重要的步驟就是特徵工程,它包括了對數據的預處理、特徵提取、特徵分析以及特徵構建等幾個步驟,可以說能否訓練一個好的模型,除了選擇合適的演算法,準備好數據也是非常關鍵的!

由於篇幅問題,所以這篇文章先介紹如何處理缺失值和圖片數據擴充的問題,下一篇文章會介紹處理異常值和類別不平衡的問題。


3 特徵工程

何為特徵工程呢?顧名思義,就是對原始數據進行一系列工程處理,將其提煉為特徵,作為輸入供演算法和模型使用。

本質上講,特徵工程是一個表示和展現數據的過程;實際工作中,特徵工程的目的是去除原始數據中的雜質和冗餘,設計更高效的特徵以刻畫求解的問題與預測模型之間的關係。

特徵工程的重要性有以下幾點:

  1. 特徵越好,靈活性越強。好的特徵的靈活性在於它允許你選擇不複雜的模型,同時運行速度也更快,也更容易和維護。
  2. 特徵越好,構建的模型越簡單。好的特徵可以在參數不是最優的情況,依然得到很好的性能,減少調參的工作量和時間,也就可以大大降低模型複雜度。
  3. 特徵越好,模型的性能越出色。特徵工程的目的本來就是為了提升模型的性能。

3.1 數據預處理

首先需要對數據進行預處理,一般常用的兩種數據類型:

  1. 結構化數據。結構化數據可以看作是關係型資料庫的一張表,每列都有清晰的定義,包含了數值型和類別型兩種基本類型;每一行數據表示一個樣本的信息。
  2. 非結構化數據。主要是文本、圖像、音頻和視頻數據,其包含的信息無法用一個簡單的數值表示,也沒有清晰的類別定義,並且每個數據的大小互不相同。

這裡主要介紹結構化數據和圖像數據兩種數據的數據預處理方法。

3.1.1 處理缺失值

數據的缺失主要包括記錄的缺失和記錄中某個欄位信息的缺失,兩者都會造成分析結果的不準確。

缺失值產生的原因

  • 信息暫時無法獲取,或者獲取信息的代價太大。
  • 信息被遺漏,人為的輸入遺漏或者數據採集設備的遺漏。
  • 屬性不存在,在某些情況下,缺失值並不意味著數據有錯誤,對一些對象來說某些屬性值是不存在的,如未婚者的配偶姓名、兒童的固定收入等。

缺失值的影響

  • 數據挖掘建模將丟失大量的有用信息。
  • 數據挖掘模型所表現出的不確定性更加顯著,模型中蘊含的規律更難把握。
  • 包含空值的數據會使建模過程陷入混亂,導致不可靠的輸出。

缺失值的處理方法

  1. 直接使用含有缺失值的特徵:當僅有少量樣本缺失該特徵的時候可以嘗試使用;
  2. 刪除含有缺失值的特徵:這個方法一般適用於大多數樣本都缺少該特徵,且僅包含少量有效值是有效的;
  3. 插值補全缺失值

最常使用的還是第三種插值補全缺失值的做法,這種做法又可以有多種補全方法。

  1. 均值/中位數/眾數補全

如果樣本屬性的距離是可度量的,則使用該屬性有效值的平均值來補全;

如果樣本屬性的距離不可度量,則可以採用眾數或者中位數來補全。

2. 同類均值/中位數/眾數補全

對樣本進行分類後,根據同類其他樣本該屬性的均值補全缺失值,當然同第一種方法類似,如果均值不可行,可以嘗試眾數或者中位數等統計數據來補全。

3. 固定值補全

利用固定的數值補全缺失的屬性值。

4. 建模預測

利用機器學習方法,將缺失屬性作為預測目標進行預測,具體為將樣本根據是否缺少該屬性分為訓練集和測試集,然後採用如回歸、決策樹等機器學習演算法訓練模型,再利用訓練得到的模型預測測試集中樣本的該屬性的數值。

這個方法根本的缺陷是如果其他屬性和缺失屬性無關,則預測的結果毫無意義;但是若預測結果相當準確,則說明這個缺失屬性是沒必要納入數據集中的;一般的情況是介於兩者之間。

5. 高維映射

將屬性映射到高維空間,採用獨熱碼編碼(one-hot)技術。將包含 K 個離散取值範圍的屬性值擴展為 K+1 個屬性值,若該屬性值缺失,則擴展後的第 K+1 個屬性值置為 1。

這種做法是最精確的做法,保留了所有的信息,也未添加任何額外信息,若預處理時把所有的變數都這樣處理,會大大增加數據的維度。這樣做的好處是完整保留了原始數據的全部信息、不用考慮缺失值;缺點是計算量大大提升,且只有在樣本量非常大的時候效果才好

6. 多重插補

多重插補認為待插補的值是隨機的,實踐上通常是估計出待插補的值,再加上不同的雜訊,形成多組可選插補值,根據某種選擇依據,選取最合適的插補值。

7. 壓縮感知和矩陣補全

壓縮感知通過利用信號本身所具有的稀疏性,從部分觀測樣本中回復原信號。壓縮感知分為感知測量和重構恢復兩個階段。

  • 感知測量:此階段對原始信號進行處理以獲得稀疏樣本表示。常用的手段是傅里葉變換、小波變換、字典學習、稀疏編碼等
  • 重構恢復:此階段基於稀疏性從少量觀測中恢復原信號。這是壓縮感知的核心

矩陣補全可以查看知乎上的問題--

矩陣補全(matrix completion)的經典演算法有哪些?目前比較流行的演算法是什麼??

www.zhihu.com
圖標

8. 手動補全

除了手動補全方法,其他插值補全方法只是將未知值補以我們的主觀估計值,不一定完全符合客觀事實。在許多情況下,根據對所在領域的理解,手動對缺失值進行插補的效果會更好。但這種方法需要對問題領域有很高的認識和理解,要求比較高,如果缺失數據較多,會比較費時費力。

9. 最近鄰補全

尋找與該樣本最接近的樣本,使用其該屬性數值來補全。

3.1.2 圖片數據擴充

對於圖片數據,最常遇到的問題就是訓練數據不足的問題。

一個模型所能獲取的信息一般來源於兩個方面,一個是訓練數據包含的信息;另一個就是模型的形成過程中(包括構造、學習、推理等),人們提供的先驗信息。

而如果訓練數據不足,那麼模型可以獲取的信息就比較少,需要提供更多的先驗信息保證模型的效果。先驗信息一般作用來兩個方面,

第一是模型,如採用特定的內在結構(比如深度學習的不同網路結構)、條件假設或添加其他約束條件(深度學習中體現在損失函數加入不同正則項);

第二就是數據,即根據先驗知識來調整、變換或者拓展訓練數據,讓其展現出更多的、更有用的信息。

對於圖像數據,如果訓練數據不足,導致的後果就是模型過擬合問題,即模型在訓練樣本上的效果不錯,但在測試集上的泛化效果很糟糕。過擬合的解決方法可以分為兩類:

  1. 基於模型的方法:主要是採用降低過擬合風險的措施,如簡化模型(從卷積神經網路變成邏輯回歸演算法)、添加約束項以縮小假設空間(如 L1、L2等正則化方法)、集成學習、Dropout方法(深度學習常用方法)等;
  2. 基於數據的方法:主要就是數據擴充(Data Augmentation),即根據一些先驗知識,在保持特點信息的前提下,對原始數據進行適當變換以達到擴充數據集的效果。具體做法有多種,在保持圖像類別不變的前提下,可以對每張圖片做如下變換處理。
  • 一定程度內的隨機旋轉、平移、縮放、裁剪、填充、左右翻轉等,這些變換對應著同一個目標在不同角度的觀察結果;
  • 對圖像中的元素添加雜訊擾動,如椒鹽雜訊、高斯白雜訊等;
  • 顏色變換。比如在圖像的 RGB 顏色空間進行主成分分析,得到 3 個主成分的特徵向量p1,p2,p3以及對應的特徵值λ1,λ2,λ3,然後在每個像素的 RGB 值上添加增量[p1,p2,p3]*[a1λ1,a2λ2,a3λ3],其中a1,a2,a3都是均值為 0, 方差較小的高斯分布隨機數;
  • 改變圖像的亮度、清晰度、對比度、銳度等。

上述數據擴充方法是在圖像空間進行變換的,也可以選擇先對圖像進行特徵提取,然後在圖像的特徵空間進行變換,利用一些通用的數據擴充或者上採樣方法,例如 SMOTE(Synthetic Minority Over-sampling Technique)。

此外,最近幾年一直比較熱門的 GAN,生成對抗網路,它的其中一個應用就是生成圖片數據,也可以應用於數據擴充。

最後,還有一種方法可以不需要擴充數據,利用遷移學習的做法,也是如今非常常用的一個方法,微調(Finetuning),即借用在大數據集(如 ImageNet)上預訓練好的模型,然後在自己的小數據集上進行微調,這是一種簡單的遷移學習,同時也可以快速訓練一個效果不錯的針對目標類別的新模型。


小結

數據特徵缺失和圖片數據的不足都是機器學習任務中非常常見的問題,因此需要好好掌握如何處理缺失值,以及擴充圖片數據的方法。


參考:

  • 《百面機器學習》第一章 特徵工程
  • 機器學習之特徵工程
  • [數據預處理(方法總結)]
  • Python數據分析(三)——數據預處理
  • Python數據分析(二)——數據探索
  • 【Python數據分析基礎】: 異常值檢測和處理

歡迎關注我的微信公眾號--機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!

往期精彩推薦

學習筆記

  • 機器學習入門系列(1)--機器學習概覽
  • [GAN學習系列] 初識GAN
  • [GAN學習系列2] GAN的起源
  • [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)

數學學習筆記

  • 程序員的數學筆記1--進位轉換
  • 程序員的數學筆記2--餘數
  • 程序員的數學筆記3--迭代法

Github項目 & 資源教程推薦

  • [Github 項目推薦] 一個更好閱讀和查找論文的網站
  • [資源分享] TensorFlow 官方中文版教程來了
  • 必讀的AI和深度學習博客
  • [教程]一份簡單易懂的 TensorFlow 教程
  • [資源]推薦一些Python書籍和教程,入門和進階的都有!

推薦閱讀:

相关文章