機器學習 | 特征工程
特征工程指的是把原始數據轉變為模型的訓練數據的過程,它的目的就是獲取更好的訓練數據特征,使得機器學習模型逼近這個上限。
簡單來說就是算法的前期處理階段,經過特征工程處理后的數據是無法直接通過肉眼辨別處理的好換,只有通過算法的結果反推特征工程處理的好壞,如果模型任何效果不好,任何一個模型的效果都不好,八成是特征工程不好,需要重新做特征工程。
需要什么樣的數據
一般公司內部做機器學習的數據源:
用戶行為日志數據:記錄的用戶在系統上所有操作所留下來的日志行為數據
業務數據:商品/物品的信息、用戶/會員的信息……
第三方數據:爬蟲數據、購買的數據、合作方的數據……
數據如何存儲
一般情況下,用于后期模型創建的數據都是存在在本地磁盤、關系型數據庫或者一些相關的分布式數據存儲平臺的。
本地磁盤MySQL、Oracle、Hbase、HDFS、Hive。
數據清洗
數據清洗(datacleaning)是在機器學習過程中一個不可缺少的環節,其數據的清洗結果直接關系到模型效果以及最終的結論。
數據清洗的步驟:
預處理
在數據預處理過程主要考慮兩個方面,如下:
選擇數據處理工具:關系型數據庫或者Python查看數據的元數據以及數據特征:一是查看元數據,包括字段解釋、數據來源等一切可以描述數據的信息;
另外是抽取一部分數據,通過人工查看的方式,對數據本身做一個比較直觀的了解,并且初步發現一些問題,為之后的數據處理做準備。
數據清洗–格式內容錯誤數據清洗
一般情況下,數據是由用戶/訪客產生的,也就有很大的可能性存在格式和內容上不一致的情況,所以在進行模型構建之前需要先進行數據的格式內容清洗操作。格式內容問題主要有以下幾類:
- 時間、日期、數值、半全角等顯示格式不一致:直接將數據轉換為一類格式即可,該問題一般出現在多個數據源整合的情況下。
- 內容中有不該存在的字符:最典型的就是在頭部、中間、尾部的空格等問題,這種情況下,需要以半自動校驗加半人工方式來找出問題,并去除不需要的字符。
- 內容與該字段應有的內容不符:比如姓名寫成了性別、身份證號寫成手機號等問題。
數據清洗–邏輯錯誤清洗
主要是通過簡單的邏輯推理發現數據中的問題數據,防止分析結果走偏,主要包? 含以下幾個步驟:
- 數據去重,去除/替換不合理的值
- 去除/重構不可靠的字段值(修改矛盾的內容)
數據清洗–去除不需要的數據
一般情況下,我們會盡可能多的收集數據,但是不是所有的字段數據都是可以應? 用到模型構建過程的,也不是說將所有的字段屬性都放到構建模型中,最終模型? 的效果就一定會好,實際上來講,字段屬性越多,模型的構建就會越慢,所以有? 時候可以考慮將不要的字段進行刪除操作。在進行該過程的時候,要注意備份原? 始數據。
數據清洗–關聯性驗證
如果數據有多個來源,那么有必要進行關聯性驗證,該過程常應用到多數據源合? 并的過程中,通過驗證數據之間的關聯性來選擇比較正確的特征屬性,比如:汽? 車的線下購買信息和電話客服問卷信息,兩者之間可以通過姓名和手機號進行關? 聯操作,匹配兩者之間的車輛信息是否是同一輛,如果不是,那么就需要進行數? 據調整。
數據不平衡
在實際應用中,數據往往分布得非常不均勻,也就是會出現“長尾現象”,即絕? 大多數的數據在一個范圍/屬于一個類別,而在另外一個范圍或者另外一個類別? 中,只有很少的一部分數據。那么這個時候直接使用機器學習可能效果會不太少,? 所以這個時候需要我們進行一系列的轉換操作。
- 設置損失函數的權重,使得少數類別數據判斷錯誤的損失大于多數類別數據判斷 錯誤的損失,即當我們的少數類別數據預測錯誤的時候,會產生一個比較大的損? 失值,從而導致模型參數往讓少數類別數據預測準確的方向偏。可以通過scikit-? learn中的class_weight參數來設置權重。
- 下采樣/欠采樣(under sampling):從多數類中隨機抽取樣本從而減少多數類別 樣本數據,使數據達到平衡的方式。
- 集成下采樣/欠采樣:采用普通的下采樣方式會導致信息丟失,所以一般采用集 成學習和下采樣結合的方式來解決這個問題;主要有兩種方式:
EasyEnsemble:
采用不放回的數據抽取方式抽取多數類別樣本數據,然后將抽取出來的數據和少數類別? 數據組合訓練一個模型;多次進行這樣的操作,從而構建多個模型,然后使用多個模型? 共同決策/預測。
BalanceCascade:
利用Boosting這種增量思想來訓練模型;先通過下采樣產生訓練集,然后使用? Adaboost算法訓練一個分類器;然后使用該分類器多對所有的大眾樣本數據進行預測,? 并將預測正確的樣本從大眾樣本數據中刪除;重復迭代上述兩個操作,直到大眾樣本數? 據量等于小眾樣本數據量。
- Edited Nearest Neighbor(ENN):對于多數類別樣本數據而言,如果這個樣本 的大部分k近鄰樣本都和自身類別不一樣,那我們就將其刪除,然后使用刪除后? 的數據訓練模型。
- Repeated Edited Nearest Neighbor(RENN):對于多數類別樣本數據而言, 如果這個樣本的大部分k近鄰樣本都和自身類別不一樣,那我們就將其刪除;重? 復性的進行上述的刪除操作,直到數據集無法再被刪除后,使用此時的數據集據? 訓練模型
- Tomek Link Removal:如果兩個不同類別的樣本,它們的最近鄰都是對方,也 就是A的最近鄰是B,B的最近鄰也是A,那么A、B就是Tomek Link。將所有? Tomek Link中多數類別的樣本刪除。然后使用刪除后的樣本來訓練模型
- 過采樣/上采樣(Over Sampling):和欠采樣采用同樣的原理,通過抽樣來增加 少數樣本的數目,從而達到數據平衡的目的。一種簡單的方式就是通過有放回抽? 樣,不斷的從少數類別樣本數據中抽取樣本,然后使用抽取樣本+原始數據組成? 訓練數據集來訓練模型;不過該方式比較容易導致過擬合,一般抽樣樣本不要超過50%。
過采樣/上采樣(Over Sampling):因為在上采樣過程中,是進行是隨機有放回? 的抽樣,所以最終模型中,數據其實是相當于存在一定的重復數據,為了防止這? 個重復數據導致的問題,我們可以加入一定的隨機性,也就是說:在抽取數據后,? 對數據的各個維度可以進行隨機的小范圍變動,eg: (1,2,3) –> (1.01, 1.99, 3);? 通過該方式可以相對比較容易的降低上采樣導致的過擬合問題。
特征轉化
特征轉換主要指將原始數據中的字段數據進行轉換操作,從而得到適合進行算法型構建的輸入數據(數值型數據),在這個過程中主要包括但不限于以下幾種數據的處理:
- 文本數據轉換為數值型數據
- 缺省值填充
- 定性特征屬性啞編碼
- 定量特征屬性二值化
- 特征標準化與歸一化
1.? 文本數據轉換為數值型數據
第一步:分詞
定義:通過某種技術將連續的文本分隔成更具有語言語義學上意義的詞。這個過? 程就叫做分詞
方法:
按照文本/單詞特征進行劃分:對于英文文檔,可以基于空格進行單詞劃分。
詞典匹配:匹配方式可以從左到右,從右到左。對于匹配中遇到的多種分段可能性,? 通常會選取分隔出來詞的數目最小的。
基于統計的方法:隱馬爾可夫模型(HMM)、最大熵模型(ME),估計相鄰漢字? 之間的關聯性,進而實現切分
基于深度學習:神經網絡抽取特征、聯合建模
Jieba分詞:
定義:中文分詞模塊
原理:
- 字符串匹配:把漢字串與詞典中的詞條進行匹配,識別出一個詞
- 理解分詞法:通過分詞子系統、句法語義子系統、總控部分來模擬人對句子的理解。
- 統計分詞法:建立大規模語料庫,通過隱馬爾可夫模型或其他模型訓練,進行分詞
第二步:轉換
常用方法:詞袋法(BOW/TF)、TF-IDF、HashTF、Word2Vec
- 詞袋法(Bag of words, BOW)是最早應用于NLP和IR領域的一種文本處理模型, 該模型忽略文本的語法和語序,用一組無序的單詞(words)來表達一段文字或者? 一個文檔,詞袋法中使用單詞在文檔中出現的次數(頻數)來表示文檔
- 詞集法(Set of words, SOW)是詞袋法的一種變種,應用的比較多,和詞袋法的 原理一樣,是以文檔中的單詞來表示文檔的一種的模型,區別在于:詞袋法使用? 的是單詞的頻數,而在詞集法中使用的是單詞是否出現,如果出現賦值為1,否? 則為0。
- TF-IDF:在詞袋法或者詞集法中,使用的是單詞的詞頻或者是否存在來進行表示文檔特征, 但是不同的單詞在不同文檔中出現的次數不同,而且有些單詞僅僅在某一些文檔? 中出現(eg:專業名稱等等),也就是說不同單詞對于文本而言具有不同的重要性,? 那么,如何評估一個單詞對于一個文本的重要性呢?
單詞的重要性隨著它在文本中出現的次數成正比增加,也就是單詞的出現次數越多,? 該單詞對于文本的重要性就越高。? 同時單詞的重要性會隨著在語料庫中出現的頻率成反比下降,也就是單詞在語料庫
中出現的頻率越高,表示該單詞越常見,也就是該單詞對于文本的重要性越低。
2.?缺省值填充
主要步驟:
- 確定缺省值范圍
- 去除不需要的字段
- 填充缺省值內容、
- 重新獲取數據
重點是填充缺省值內容的填充。
在進行確定缺省值范圍的時候,對每個字段都計算其缺失比例,然后按照缺失比例和字段重要性分別指定不同的策略。
在進行去除不需要的字段的時候,需要注意的是:刪除操作最好不要直接操作與 原始數據上,最好的是抽取部分數據進行刪除字段后的模型構建,查看模型效果,? 如果效果不錯,那么再到全量數據上進行刪除字段操作。總而言之:該過程簡單? 但是必須慎用,不過一般效果不錯,刪除一些丟失率高以及重要性低的數據可以? 降低模型的訓練復雜度,同時又不會降低模型的效果。
填充缺省值內容是一個比較重要的過程,也是我們常用的一種缺省值解決方案, 一般采用下面幾種方式進行數據的填充:
- 以業務知識或經驗推測填充缺省值 以同一字段指標的計算結果(均值、中位數、眾數等)填充缺省值
- 以不同字段指標的計算結果來推測性的填充缺省值,比如通過身份證號碼計算年齡、 通過收貨地址來推測家庭住址、通過訪問的IP地址來推測家庭/公司/學校的家庭住址? 等等
如果某些指標非常重要,但是缺失率有比較高,而且通過其它字段沒法比較精準 的計算出指標值的情況下,那么就需要和數據產生方(業務人員、數據收集人員? 等)溝通協商,是否可以通過其它的渠道獲取相關的數據,也就是進行重新獲取? 數據的操作。
4. 啞編碼
啞編碼(OneHotEncoder):對于定性的數據(也就是分類的數據),可以采用N位? 的狀態寄存器來對N個狀態進行編碼,每個狀態都有一個獨立的寄存器位,并且? 在任意狀態下只有一位有效;是一種常用的將特征數字化的方式。
比如有一個特征屬性:[‘male’,’female’],那么male使用向量[1,0]表示,female使用[0,1]表示。
本文由 @SincerityY 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
- 目前還沒評論,等你發揮!