機(jī)器學(xué)習(xí) | 特征工程

0 評(píng)論 6716 瀏覽 46 收藏 16 分鐘

特征工程指的是把原始數(shù)據(jù)轉(zhuǎn)變?yōu)槟P偷挠?xùn)練數(shù)據(jù)的過程,它的目的就是獲取更好的訓(xùn)練數(shù)據(jù)特征,使得機(jī)器學(xué)習(xí)模型逼近這個(gè)上限。

簡(jiǎn)單來(lái)說就是算法的前期處理階段,經(jīng)過特征工程處理后的數(shù)據(jù)是無(wú)法直接通過肉眼辨別處理的好換,只有通過算法的結(jié)果反推特征工程處理的好壞,如果模型任何效果不好,任何一個(gè)模型的效果都不好,八成是特征工程不好,需要重新做特征工程。

需要什么樣的數(shù)據(jù)

一般公司內(nèi)部做機(jī)器學(xué)習(xí)的數(shù)據(jù)源:

用戶行為日志數(shù)據(jù):記錄的用戶在系統(tǒng)上所有操作所留下來(lái)的日志行為數(shù)據(jù)

業(yè)務(wù)數(shù)據(jù):商品/物品的信息、用戶/會(huì)員的信息……

第三方數(shù)據(jù):爬蟲數(shù)據(jù)、購(gòu)買的數(shù)據(jù)、合作方的數(shù)據(jù)……

數(shù)據(jù)如何存儲(chǔ)

一般情況下,用于后期模型創(chuàng)建的數(shù)據(jù)都是存在在本地磁盤、關(guān)系型數(shù)據(jù)庫(kù)或者一些相關(guān)的分布式數(shù)據(jù)存儲(chǔ)平臺(tái)的。

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

數(shù)據(jù)清洗

數(shù)據(jù)清洗(datacleaning)是在機(jī)器學(xué)習(xí)過程中一個(gè)不可缺少的環(huán)節(jié),其數(shù)據(jù)的清洗結(jié)果直接關(guān)系到模型效果以及最終的結(jié)論。

數(shù)據(jù)清洗的步驟:

預(yù)處理

在數(shù)據(jù)預(yù)處理過程主要考慮兩個(gè)方面,如下:

選擇數(shù)據(jù)處理工具:關(guān)系型數(shù)據(jù)庫(kù)或者Python查看數(shù)據(jù)的元數(shù)據(jù)以及數(shù)據(jù)特征:一是查看元數(shù)據(jù),包括字段解釋、數(shù)據(jù)來(lái)源等一切可以描述數(shù)據(jù)的信息;

另外是抽取一部分?jǐn)?shù)據(jù),通過人工查看的方式,對(duì)數(shù)據(jù)本身做一個(gè)比較直觀的了解,并且初步發(fā)現(xiàn)一些問題,為之后的數(shù)據(jù)處理做準(zhǔn)備。

數(shù)據(jù)清洗–格式內(nèi)容錯(cuò)誤數(shù)據(jù)清洗

一般情況下,數(shù)據(jù)是由用戶/訪客產(chǎn)生的,也就有很大的可能性存在格式和內(nèi)容上不一致的情況,所以在進(jìn)行模型構(gòu)建之前需要先進(jìn)行數(shù)據(jù)的格式內(nèi)容清洗操作。格式內(nèi)容問題主要有以下幾類:

  1. 時(shí)間、日期、數(shù)值、半全角等顯示格式不一致:直接將數(shù)據(jù)轉(zhuǎn)換為一類格式即可,該問題一般出現(xiàn)在多個(gè)數(shù)據(jù)源整合的情況下。
  2. 內(nèi)容中有不該存在的字符:最典型的就是在頭部、中間、尾部的空格等問題,這種情況下,需要以半自動(dòng)校驗(yàn)加半人工方式來(lái)找出問題,并去除不需要的字符。
  3. 內(nèi)容與該字段應(yīng)有的內(nèi)容不符:比如姓名寫成了性別、身份證號(hào)寫成手機(jī)號(hào)等問題。

數(shù)據(jù)清洗–邏輯錯(cuò)誤清洗

主要是通過簡(jiǎn)單的邏輯推理發(fā)現(xiàn)數(shù)據(jù)中的問題數(shù)據(jù),防止分析結(jié)果走偏,主要包? 含以下幾個(gè)步驟:

  1. 數(shù)據(jù)去重,去除/替換不合理的值
  2. 去除/重構(gòu)不可靠的字段值(修改矛盾的內(nèi)容)

數(shù)據(jù)清洗–去除不需要的數(shù)據(jù)

一般情況下,我們會(huì)盡可能多的收集數(shù)據(jù),但是不是所有的字段數(shù)據(jù)都是可以應(yīng)? 用到模型構(gòu)建過程的,也不是說將所有的字段屬性都放到構(gòu)建模型中,最終模型? 的效果就一定會(huì)好,實(shí)際上來(lái)講,字段屬性越多,模型的構(gòu)建就會(huì)越慢,所以有? 時(shí)候可以考慮將不要的字段進(jìn)行刪除操作。在進(jìn)行該過程的時(shí)候,要注意備份原? 始數(shù)據(jù)。

數(shù)據(jù)清洗–關(guān)聯(lián)性驗(yàn)證

如果數(shù)據(jù)有多個(gè)來(lái)源,那么有必要進(jìn)行關(guān)聯(lián)性驗(yàn)證,該過程常應(yīng)用到多數(shù)據(jù)源合? 并的過程中,通過驗(yàn)證數(shù)據(jù)之間的關(guān)聯(lián)性來(lái)選擇比較正確的特征屬性,比如:汽? 車的線下購(gòu)買信息和電話客服問卷信息,兩者之間可以通過姓名和手機(jī)號(hào)進(jìn)行關(guān)? 聯(lián)操作,匹配兩者之間的車輛信息是否是同一輛,如果不是,那么就需要進(jìn)行數(shù)? 據(jù)調(diào)整。

數(shù)據(jù)不平衡

在實(shí)際應(yīng)用中,數(shù)據(jù)往往分布得非常不均勻,也就是會(huì)出現(xiàn)“長(zhǎng)尾現(xiàn)象”,即絕? 大多數(shù)的數(shù)據(jù)在一個(gè)范圍/屬于一個(gè)類別,而在另外一個(gè)范圍或者另外一個(gè)類別? 中,只有很少的一部分?jǐn)?shù)據(jù)。那么這個(gè)時(shí)候直接使用機(jī)器學(xué)習(xí)可能效果會(huì)不太少,? 所以這個(gè)時(shí)候需要我們進(jìn)行一系列的轉(zhuǎn)換操作。

  1. 設(shè)置損失函數(shù)的權(quán)重,使得少數(shù)類別數(shù)據(jù)判斷錯(cuò)誤的損失大于多數(shù)類別數(shù)據(jù)判斷 錯(cuò)誤的損失,即當(dāng)我們的少數(shù)類別數(shù)據(jù)預(yù)測(cè)錯(cuò)誤的時(shí)候,會(huì)產(chǎn)生一個(gè)比較大的損? 失值,從而導(dǎo)致模型參數(shù)往讓少數(shù)類別數(shù)據(jù)預(yù)測(cè)準(zhǔn)確的方向偏??梢酝ㄟ^scikit-? learn中的class_weight參數(shù)來(lái)設(shè)置權(quán)重。
  2. 下采樣/欠采樣(under sampling):從多數(shù)類中隨機(jī)抽取樣本從而減少多數(shù)類別 樣本數(shù)據(jù),使數(shù)據(jù)達(dá)到平衡的方式。
  3. 集成下采樣/欠采樣:采用普通的下采樣方式會(huì)導(dǎo)致信息丟失,所以一般采用集 成學(xué)習(xí)和下采樣結(jié)合的方式來(lái)解決這個(gè)問題;主要有兩種方式:

EasyEnsemble:

采用不放回的數(shù)據(jù)抽取方式抽取多數(shù)類別樣本數(shù)據(jù),然后將抽取出來(lái)的數(shù)據(jù)和少數(shù)類別? 數(shù)據(jù)組合訓(xùn)練一個(gè)模型;多次進(jìn)行這樣的操作,從而構(gòu)建多個(gè)模型,然后使用多個(gè)模型? 共同決策/預(yù)測(cè)。

BalanceCascade:

利用Boosting這種增量思想來(lái)訓(xùn)練模型;先通過下采樣產(chǎn)生訓(xùn)練集,然后使用? Adaboost算法訓(xùn)練一個(gè)分類器;然后使用該分類器多對(duì)所有的大眾樣本數(shù)據(jù)進(jìn)行預(yù)測(cè),? 并將預(yù)測(cè)正確的樣本從大眾樣本數(shù)據(jù)中刪除;重復(fù)迭代上述兩個(gè)操作,直到大眾樣本數(shù)? 據(jù)量等于小眾樣本數(shù)據(jù)量。

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

過采樣/上采樣(Over Sampling):因?yàn)樵谏喜蓸舆^程中,是進(jìn)行是隨機(jī)有放回? 的抽樣,所以最終模型中,數(shù)據(jù)其實(shí)是相當(dāng)于存在一定的重復(fù)數(shù)據(jù),為了防止這? 個(gè)重復(fù)數(shù)據(jù)導(dǎo)致的問題,我們可以加入一定的隨機(jī)性,也就是說:在抽取數(shù)據(jù)后,? 對(duì)數(shù)據(jù)的各個(gè)維度可以進(jìn)行隨機(jī)的小范圍變動(dòng),eg: (1,2,3) –> (1.01, 1.99, 3);? 通過該方式可以相對(duì)比較容易的降低上采樣導(dǎo)致的過擬合問題。

特征轉(zhuǎn)化

特征轉(zhuǎn)換主要指將原始數(shù)據(jù)中的字段數(shù)據(jù)進(jìn)行轉(zhuǎn)換操作,從而得到適合進(jìn)行算法型構(gòu)建的輸入數(shù)據(jù)(數(shù)值型數(shù)據(jù)),在這個(gè)過程中主要包括但不限于以下幾種數(shù)據(jù)的處理:

  1. 文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)
  2. 缺省值填充
  3. 定性特征屬性啞編碼
  4. 定量特征屬性二值化
  5. 特征標(biāo)準(zhǔn)化與歸一化

1.? 文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)

第一步:分詞

定義:通過某種技術(shù)將連續(xù)的文本分隔成更具有語(yǔ)言語(yǔ)義學(xué)上意義的詞。這個(gè)過? 程就叫做分詞

方法:

按照文本/單詞特征進(jìn)行劃分:對(duì)于英文文檔,可以基于空格進(jìn)行單詞劃分。

詞典匹配:匹配方式可以從左到右,從右到左。對(duì)于匹配中遇到的多種分段可能性,? 通常會(huì)選取分隔出來(lái)詞的數(shù)目最小的。

基于統(tǒng)計(jì)的方法:隱馬爾可夫模型(HMM)、最大熵模型(ME),估計(jì)相鄰漢字? 之間的關(guān)聯(lián)性,進(jìn)而實(shí)現(xiàn)切分

基于深度學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)抽取特征、聯(lián)合建模

Jieba分詞:

定義:中文分詞模塊

原理:

  1. 字符串匹配:把漢字串與詞典中的詞條進(jìn)行匹配,識(shí)別出一個(gè)詞
  2. 理解分詞法:通過分詞子系統(tǒng)、句法語(yǔ)義子系統(tǒng)、總控部分來(lái)模擬人對(duì)句子的理解。
  3. 統(tǒng)計(jì)分詞法:建立大規(guī)模語(yǔ)料庫(kù),通過隱馬爾可夫模型或其他模型訓(xùn)練,進(jìn)行分詞

第二步:轉(zhuǎn)換

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

  • 詞袋法(Bag of words, BOW)是最早應(yīng)用于NLP和IR領(lǐng)域的一種文本處理模型, 該模型忽略文本的語(yǔ)法和語(yǔ)序,用一組無(wú)序的單詞(words)來(lái)表達(dá)一段文字或者? 一個(gè)文檔,詞袋法中使用單詞在文檔中出現(xiàn)的次數(shù)(頻數(shù))來(lái)表示文檔
  • 詞集法(Set of words, SOW)是詞袋法的一種變種,應(yīng)用的比較多,和詞袋法的 原理一樣,是以文檔中的單詞來(lái)表示文檔的一種的模型,區(qū)別在于:詞袋法使用? 的是單詞的頻數(shù),而在詞集法中使用的是單詞是否出現(xiàn),如果出現(xiàn)賦值為1,否? 則為0。
  • TF-IDF:在詞袋法或者詞集法中,使用的是單詞的詞頻或者是否存在來(lái)進(jìn)行表示文檔特征, 但是不同的單詞在不同文檔中出現(xiàn)的次數(shù)不同,而且有些單詞僅僅在某一些文檔? 中出現(xiàn)(eg:專業(yè)名稱等等),也就是說不同單詞對(duì)于文本而言具有不同的重要性,? 那么,如何評(píng)估一個(gè)單詞對(duì)于一個(gè)文本的重要性呢?

單詞的重要性隨著它在文本中出現(xiàn)的次數(shù)成正比增加,也就是單詞的出現(xiàn)次數(shù)越多,? 該單詞對(duì)于文本的重要性就越高。? 同時(shí)單詞的重要性會(huì)隨著在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降,也就是單詞在語(yǔ)料庫(kù)

中出現(xiàn)的頻率越高,表示該單詞越常見,也就是該單詞對(duì)于文本的重要性越低。

2.?缺省值填充

主要步驟:

  • 確定缺省值范圍
  • 去除不需要的字段
  • 填充缺省值內(nèi)容、
  • 重新獲取數(shù)據(jù)

重點(diǎn)是填充缺省值內(nèi)容的填充。

在進(jìn)行確定缺省值范圍的時(shí)候,對(duì)每個(gè)字段都計(jì)算其缺失比例,然后按照缺失比例和字段重要性分別指定不同的策略。

在進(jìn)行去除不需要的字段的時(shí)候,需要注意的是:刪除操作最好不要直接操作與 原始數(shù)據(jù)上,最好的是抽取部分?jǐn)?shù)據(jù)進(jìn)行刪除字段后的模型構(gòu)建,查看模型效果,? 如果效果不錯(cuò),那么再到全量數(shù)據(jù)上進(jìn)行刪除字段操作??偠灾涸撨^程簡(jiǎn)單? 但是必須慎用,不過一般效果不錯(cuò),刪除一些丟失率高以及重要性低的數(shù)據(jù)可以? 降低模型的訓(xùn)練復(fù)雜度,同時(shí)又不會(huì)降低模型的效果。

填充缺省值內(nèi)容是一個(gè)比較重要的過程,也是我們常用的一種缺省值解決方案, 一般采用下面幾種方式進(jìn)行數(shù)據(jù)的填充:

  1. 以業(yè)務(wù)知識(shí)或經(jīng)驗(yàn)推測(cè)填充缺省值 以同一字段指標(biāo)的計(jì)算結(jié)果(均值、中位數(shù)、眾數(shù)等)填充缺省值
  2. 以不同字段指標(biāo)的計(jì)算結(jié)果來(lái)推測(cè)性的填充缺省值,比如通過身份證號(hào)碼計(jì)算年齡、 通過收貨地址來(lái)推測(cè)家庭住址、通過訪問的IP地址來(lái)推測(cè)家庭/公司/學(xué)校的家庭住址? 等等

如果某些指標(biāo)非常重要,但是缺失率有比較高,而且通過其它字段沒法比較精準(zhǔn) 的計(jì)算出指標(biāo)值的情況下,那么就需要和數(shù)據(jù)產(chǎn)生方(業(yè)務(wù)人員、數(shù)據(jù)收集人員? 等)溝通協(xié)商,是否可以通過其它的渠道獲取相關(guān)的數(shù)據(jù),也就是進(jìn)行重新獲取? 數(shù)據(jù)的操作。

4. 啞編碼

啞編碼(OneHotEncoder):對(duì)于定性的數(shù)據(jù)(也就是分類的數(shù)據(jù)),可以采用N位? 的狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有一個(gè)獨(dú)立的寄存器位,并且? 在任意狀態(tài)下只有一位有效;是一種常用的將特征數(shù)字化的方式。

比如有一個(gè)特征屬性:[‘male’,’female’],那么male使用向量[1,0]表示,female使用[0,1]表示。

 

本文由 @SincerityY 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!