概述
有這么一句話在業(yè)界廣泛流傳:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限而已。因此這一步可能比實(shí)際上使用的模型和算法更重要,而且會占開發(fā)一個機(jī)器學(xué)習(xí)模型80%-90%的時間,是最耗時的環(huán)節(jié)。
那么到底什么是特征工程?特征工程是將原始數(shù)據(jù)轉(zhuǎn)化特征的過程,特征要能更好地表示潛在問題并提高預(yù)測模型在未知數(shù)據(jù)上的準(zhǔn)確率。
「特征處理是困難的、耗時的且需要專家知識。『實(shí)用化的機(jī)器學(xué)習(xí)』基本上就是特征工程。」
—— 吳恩達(dá)
下面主要介紹特征工程一般流程和技術(shù)點(diǎn)。本文基于預(yù)測場景介紹,其它場景基本通用。
通用術(shù)語
屬性
用來進(jìn)行預(yù)測的變量。在數(shù)據(jù)集中,一般列表示屬性值。在Andrew Ngdeeplearning.ai 的課程上用行表示屬性值。屬性也被稱為:
- 特征
- 預(yù)測因子
- 獨(dú)立變量
- 輸入
標(biāo)簽
用來進(jìn)行預(yù)測的結(jié)果。在數(shù)據(jù)集中,一般最后一列表示標(biāo)簽值。在Andrew Ng的deeplearning.ai 課程上用行表示標(biāo)簽值。標(biāo)簽也被稱為:
- 結(jié)果
- 目標(biāo)
- 響應(yīng)
- 輸出
實(shí)例
實(shí)例是屬性和標(biāo)簽的一個實(shí)例值。在數(shù)據(jù)集中,一般一行表示一個實(shí)例。在Andrew Ng的deeplearning.ai 課程上用列表示實(shí)例。
一般流程
一般流程包括數(shù)據(jù)預(yù)處理、特征降維、特征構(gòu)造和特征選擇等幾部分,下面先聊聊數(shù)據(jù)預(yù)處理。
數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理包括特征值映射、缺失值處理、異常值處理和特征值轉(zhuǎn)換等
特征值映射
數(shù)值類型無需映射,字符串類型需要通過one-hot編碼映射,具體參考google機(jī)器學(xué)習(xí)教程章節(jié)https://developers.google.com/machine-learning/crash-course/representation/feature-engineering?hl=zh-cn
pandas示例:
pd.get_dummies(all_df)
缺失值處理
缺失值處理也叫做缺失值插補(bǔ)(imputation)。以下是兩種簡單的處理方式:
- 最簡單的方法,用該屬性的平均值來代替缺失值。可以用pandas的fillna函數(shù)。
pandas示例:pd.fillna("平均值") - 如果數(shù)據(jù)實(shí)例過多的時候,可以刪除實(shí)例??梢杂胮andas的dropna函數(shù)。
pandas示例:pd.dropna(columns="列名") - 預(yù)測插補(bǔ)
- 更多請見 http://www.itdecent.cn/p/0127b187a7c2
異常值處理
異常值指明顯離群的點(diǎn),一般將等同缺失值一樣處理??捎靡韵路绞綑z測:
- 將一組數(shù)據(jù)按照百分位進(jìn)行劃分。如四分位、五分位和十分位等。
- 可以用python probplot的畫分位數(shù)圖(quantile-quantile,Q-Q),檢測異常點(diǎn)
- 更多請見 http://www.itdecent.cn/p/0127b187a7c2
特征值轉(zhuǎn)換
一般有以下三種方式
- 標(biāo)準(zhǔn)化,Z-Score,公式為:(X-mean)/std 計算時對每個屬性/每列分別進(jìn)行。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩陣 pre.StandardScaler().fit_transform(X) - 歸一化,常用的方法是將屬性縮放到一個指定的最大和最小值(通常是1-0)之間。公式為:(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩陣 pre.MinMaxScaler().fit_transform(X) - 正則化,Normalization主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩陣 pre.Normalizer().fit_transform(X) - 具體參考http://www.cnblogs.com/charlotte77/p/5622325.html