機器學習 | 特徵工程

AIBigbull2050發表於2019-08-22

特徵工程指的是把原始資料轉變為模型的訓練資料的過程,它的目的就是獲取更好的訓練資料特徵,使得機器學習模型逼近這個上限。

簡單來說就是演算法的前期處理階段,經過特徵工程處理後的資料是無法直接透過肉眼辨別處理的好換,只有透過演算法的結果反推特徵工程處理的好壞,如果模型任何效果不好,任何一個模型的效果都不好,八成是特徵工程不好,需要重新做特徵工程。

需要什麼樣的資料

一般公司內部做機器學習的資料來源:

使用者行為日誌資料:記錄的使用者在系統上所有操作所留下來的日誌行為資料

業務資料:商品/物品的資訊、使用者/會員的資訊……

第三方資料:爬蟲資料、購買的資料、合作方的資料……

資料如何儲存

一般情況下,用於後期模型建立的資料都是存在在本地磁碟、關係型資料庫或者一些相關的分散式資料儲存平臺的。

本地磁碟MySQL、Oracle、Hbase、HDFS、Hive。

資料清洗

資料清洗(datacleaning)是在機器學習過程中一個不可缺少的環節,其資料的清洗結果直接關係到模型效果以及最終的結論。

資料清洗的步驟:

預處理

在資料預處理過程主要考慮兩個方面,如下:

選擇資料處理工具:關係型資料庫或者Python檢視資料的後設資料以及資料特徵:一是檢視後設資料,包括欄位解釋、資料來源等一切可以描述資料的資訊;

另外是抽取一部分資料,透過人工檢視的方式,對資料本身做一個比較直觀的瞭解,並且初步發現一些問題,為之後的資料處理做準備。

資料清洗–格式內容錯誤資料清洗

一般情況下,資料是由使用者/訪客產生的,也就有很大的可能性存在格式和內容上不一致的情況,所以在進行模型構建之前需要先進行資料的格式內容清洗操作。格式內容問題主要有以下幾類:

  1. 時間、日期、數值、半全形等顯示格式不一致:直接將資料轉換為一類格式即可,該問題一般出現在多個資料來源整合的情況下。
  2. 內容中有不該存在的字元:最典型的就是在頭部、中間、尾部的空格等問題,這種情況下,需要以半自動校驗加半人工方式來找出問題,並去除不需要的字元。
  3. 內容與該欄位應有的內容不符:比如姓名寫成了性別、身份證號寫成手機號等問題。

資料清洗–邏輯錯誤清洗

主要是透過簡單的邏輯推理發現資料中的問題資料,防止分析結果走偏,主要包  含以下幾個步驟:

  1. 資料去重,去除/替換不合理的值
  2. 去除/重構不可靠的欄位值(修改矛盾的內容)

資料清洗–去除不需要的資料

一般情況下,我們會盡可能多的收集資料,但是不是所有的欄位資料都是可以應  用到模型構建過程的,也不是說將所有的欄位屬性都放到構建模型中,最終模型  的效果就一定會好,實際上來講,欄位屬性越多,模型的構建就會越慢,所以有  時候可以考慮將不要的欄位進行刪除操作。在進行該過程的時候,要注意備份原  始資料。

資料清洗–關聯性驗證

如果資料有多個來源,那麼有必要進行關聯性驗證,該過程常應用到多資料來源合  並的過程中,透過驗證資料之間的關聯性來選擇比較正確的特徵屬性,比如:汽  車的線下購買資訊和電話客服問卷資訊,兩者之間可以透過姓名和手機號進行關  聯操作,匹配兩者之間的車輛資訊是否是同一輛,如果不是,那麼就需要進行數  據調整。

資料不平衡

在實際應用中,資料往往分佈得非常不均勻,也就是會出現“長尾現象”,即絕  大多數的資料在一個範圍/屬於一個類別,而在另外一個範圍或者另外一個類別  中,只有很少的一部分資料。那麼這個時候直接使用機器學習可能效果會不太少,  所以這個時候需要我們進行一系列的轉換操作。

  1. 設定損失函式的權重,使得少數類別資料判斷錯誤的損失大於多數類別資料判斷 錯誤的損失,即當我們的少數類別資料預測錯誤的時候,會產生一個比較大的損  失值,從而導致模型引數往讓少數類別資料預測準確的方向偏。可以透過scikit-  learn中的class_weight引數來設定權重。
  2. 下采樣/欠取樣(under sampling):從多數類中隨機抽取樣本從而減少多數類別 樣本資料,使資料達到平衡的方式。
  3. 整合下采樣/欠取樣:採用普通的下采樣方式會導致資訊丟失,所以一般採用集 成學習和下采樣結合的方式來解決這個問題;主要有兩種方式:

EasyEnsemble:

採用不放回的資料抽取方式抽取多數類別樣本資料,然後將抽取出來的資料和少數類別  資料組合訓練一個模型;多次進行這樣的操作,從而構建多個模型,然後使用多個模型  共同決策/預測。

BalanceCascade:

利用Boosting這種增量思想來訓練模型;先透過下采樣產生訓練集,然後使用  Adaboost演算法訓練一個分類器;然後使用該分類器多對所有的大眾樣本資料進行預測,  並將預測正確的樣本從大眾樣本資料中刪除;重複迭代上述兩個操作,直到大眾樣本數  據量等於小眾樣本資料量。

  1. Edited Nearest Neighbor(ENN):對於多數類別樣本資料而言,如果這個樣本 的大部分k近鄰樣本都和自身類別不一樣,那我們就將其刪除,然後使用刪除後  的資料訓練模型。
  2. Repeated Edited Nearest Neighbor(RENN):對於多數類別樣本資料而言, 如果這個樣本的大部分k近鄰樣本都和自身類別不一樣,那我們就將其刪除;重  復性的進行上述的刪除操作,直到資料集無法再被刪除後,使用此時的資料集據  訓練模型
  3. Tomek Link Removal:如果兩個不同類別的樣本,它們的最近鄰都是對方,也 就是A的最近鄰是B,B的最近鄰也是A,那麼A、B就是Tomek Link。將所有  Tomek Link中多數類別的樣本刪除。然後使用刪除後的樣本來訓練模型
  4. 過取樣/上取樣(Over Sampling):和欠取樣採用同樣的原理,透過抽樣來增加 少數樣本的數目,從而達到資料平衡的目的。一種簡單的方式就是透過有放回抽  樣,不斷的從少數類別樣本資料中抽取樣本,然後使用抽取樣本+原始資料組成  訓練資料集來訓練模型;不過該方式比較容易導致過擬合,一般抽樣樣本不要超過50%。

過取樣/上取樣(Over Sampling):因為在上取樣過程中,是進行是隨機有放回  的抽樣,所以最終模型中,資料其實是相當於存在一定的重複資料,為了防止這  個重複資料導致的問題,我們可以加入一定的隨機性,也就是說:在抽取資料後,  對資料的各個維度可以進行隨機的小範圍變動,eg: (1,2,3) –> (1.01, 1.99, 3);  透過該方式可以相對比較容易的降低上取樣導致的過擬合問題。

特徵轉化

特徵轉換主要指將原始資料中的欄位資料進行轉換操作,從而得到適合進行演算法型構建的輸入資料(數值型資料),在這個過程中主要包括但不限於以下幾種資料的處理:

  1. 文字資料轉換為數值型資料
  2. 預設值填充
  3. 定性特徵屬性啞編碼
  4. 定量特徵屬性二值化
  5. 特徵標準化與歸一化

1.  文字資料轉換為數值型資料

第一步:分詞

定義:透過某種技術將連續的文字分隔成更具有語言語義學上意義的詞。這個過  程就叫做分詞

方法:

按照文字/單詞特徵進行劃分:對於英文文件,可以基於空格進行單詞劃分。

詞典匹配:匹配 方式可以從左到右,從右到左。對於匹配中遇到的多種分段可能性,  通常會選取分隔出來詞的數目最小的。

基於統計的方法:隱馬爾可夫模型(HMM)、最大熵模型(ME),估計相鄰漢字  之間的關聯性,進而實現切分

基於深度學習:神經網路抽取特徵、聯合建模

Jieba分詞:

定義:中文分詞模組

原理:

  1. 字串匹配:把漢字串與詞典中的詞條進行匹配,識別出一個詞
  2. 理解分詞法:透過分詞子系統、句法語義子系統、總控部分來模擬人對句子的理解。
  3. 統計分詞法:建立大規模語料庫,透過隱馬爾可夫模型或其他模型訓練,進行分詞

第二步:轉換

常用方法:詞袋法(BOW/TF)、TF-IDF、HashTF、Word2Vec

  • 詞袋法(Bag of words, BOW)是最早應用於NLP和IR領域的一種文字處理模型, 該模型忽略文字的語法和語序,用一組無序的單詞(words)來表達一段文字或者  一個文件,詞袋法中使用單詞在文件中出現的次數(頻數)來表示文件
  • 詞集法(Set of words, SOW)是詞袋法的一種變種,應用的比較多,和詞袋法的 原理一樣,是以文件中的單詞來表示文件的一種的模型,區別在於:詞袋法使用  的是單詞的頻數,而在詞集法中使用的是單詞是否出現,如果出現賦值為1,否  則為0。
  • TF-IDF:在詞袋法或者詞集法中,使用的是單詞的詞頻或者是否存在來進行表示文件特徵, 但是不同的單詞在不同文件中出現的次數不同,而且有些單詞僅僅在某一些文件  中出現(eg:專業名稱等等),也就是說不同單詞對於文字而言具有不同的重要性,  那麼,如何評估一個單詞對於一個文字的重要性呢?

單詞的重要性隨著它在文字中出現的次數成正比增加,也就是單詞的出現次數越多,  該單詞對於文字的重要性就越高。  同時單詞的重要性會隨著在語料庫中出現的頻率成反比下降,也就是單詞在語料庫

中出現的頻率越高,表示該單詞越常見,也就是該單詞對於文字的重要性越低。

2. 預設值填充

主要步驟:

  • 確定預設值範圍
  • 去除不需要的欄位
  • 填充預設值內容、
  • 重新獲取資料

重點是填充預設值內容的填充。

在進行確定預設值範圍的時候,對每個欄位都計算其缺失比例,然後按照缺失比例和欄位重要性分別指定不同的策略。

在進行去除不需要的欄位的時候,需要注意的是:刪除操作最好不要直接操作與 原始資料上,最好的是抽取部分資料進行刪除欄位後的模型構建,檢視模型效果,  如果效果不錯,那麼再到全量資料上進行刪除欄位操作。總而言之:該過程簡單  但是必須慎用,不過一般效果不錯,刪除一些丟失率高以及重要性低的資料可以  降低模型的訓練複雜度,同時又不會降低模型的效果。

填充預設值內容是一個比較重要的過程,也是我們常用的一種預設值解決方案, 一般採用下面幾種方式進行資料的填充:

  1. 以業務知識或經驗推測填充預設值 以同一欄位指標的計算結果(均值、中位數、眾數等)填充預設值
  2. 以不同欄位指標的計算結果來推測性的填充預設值,比如透過身份證號碼計算年齡、 透過收貨地址來推測家庭住址、透過訪問的IP地址來推測家庭/公司/學校的家庭住址  等等

如果某些指標非常重要,但是缺失率有比較高,而且透過其它欄位沒法比較精準 的計算出指標值的情況下,那麼就需要和資料產生方(業務人員、資料收集人員  等)溝通協商,是否可以透過其它的渠道獲取相關的資料,也就是進行重新獲取  資料的操作。

4. 啞編碼

啞編碼(OneHotEncoder):對於定性的資料(也就是分類的資料),可以採用N位  的狀態暫存器來對N個狀態進行編碼,每個狀態都有一個獨立的暫存器位,並且  在任意狀態下只有一位有效;是一種常用的將特徵數字化的方式。

比如有一個特徵屬性:[‘male’,’female’],那麼male使用向量[1,0]表示,female使用[0,1]表示。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2654526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章