天天看點

資料挖掘實戰之天池精準醫療大賽(5)——特征工程1Part 4-1 : 特征工程

Part 4-1 : 特征工程

現在開始資料挖掘中最玄妙也是最重要的部分:特征工程(Feature Engineering)。

初學機器學習,一般隻是對此概念及相關内涵有所了解,此處試圖以實踐性的角度,詳細闡述特征工程。引用一句老掉牙的話,資料和特征決定了機器學習的上限,而模型和算法隻是逼近這個上限而已。

好特征即使使用一般的模型,也能得到很好的效果!好特征的靈活性在于它允許你可以選擇不複雜的模型,同時,運作速度也更快,也更容易了解和維護。好的特征,即使參數不是最優解,模型性能也能表現很好,是以,不需要太多時間去尋找最優參數,大大的降低了模型的複雜度,使模型趨向簡單。模型的性能包括模型的效果,執行的效率及模型的可解釋性。特征工程的最終目的就是提升模型的性能。

許多課程中将前述part-3的資料分析與預處理合并為特征工程,無論如何,整體的思路和流程是這樣的,我們要将原始資料處理成格式化的矩陣喂給模型,前面part-3将資料整理得漂亮了一些,接下來特征工程是為了将“資料”變為“特征”。說到“資料”,它還是一些有意義的數值,有含義,有量綱,而“特征"則可以認為僅僅是一些數字了,模型需要有用的特征來分類和預測,但是它并不了解它是否有含義,在這個精準醫療的比賽中,可以看到大佬們創造出了各種各樣的特征提高了模型的準确度,這些特征大多很”奇葩“,但是隻要是有用的,我們就要使用,學習構造這樣的特征的一套理論。

這一部分中,我們首先介紹特征工程那一套理論,包括一些有效的方法、一套實踐起來比較有效的流程,然後貼出鄙人比賽的代碼作為示例,并看一下一些大佬的特征的樣子拓寬思路。這一部分會引用許多網上的内容,文中會給出幾個連結供詳細學習~

1)特征工程的流程

推薦知乎上這一回答,也可看對應的博文:

特征工程到底是什麼? - 城東的回答 - 知乎

https://www.zhihu.com/question/29316149/answer/110159647

另外知乎上一些其他人的回答也不錯往下翻。建議結合大佬們的了解閱讀,多看一些加深了解。大佬們的基本架構就是這樣的:

預處理:  無量綱化,對定量特征二值化,對定性特征啞編碼,資料變換

特征選擇: Filter(過濾)、Wrapper(包裹)、Embedded(嵌入)

降維:     主成分分析法(PCA)、線性判别分析法(LDA)

下面,對這三部分結合資料分别談一下個人的經驗和思路。part-3中反複引用的一本不錯的書,書中将特征工程歸到資料預處理一部分,對應于資料變換和資料規約兩節,其具體内容也大同小異。

本人認為,特征工程基本分為兩部分:特征構造(特征生成)和特征選擇(特征提取)。 遵循上面的架構,首先是 特征構造,差別于資料的預處理,這部分可以歸納為“資料”的 “編碼化”、“無量綱化”。

① 無量綱化:資料的标準歸一化,對于後續的訓練速度和模型的準确性有很大作用,不再贅述(基礎知識就不啰嗦了),都可以用sklearn包實作,選擇合适的方法也是一門學問。

② 編碼:分為二值化編碼,以及著名的獨熱(one-hot)編碼又稱啞編碼。處理的對象是我們上遊工作流程得到的DF對象,字段内容一般是,非數值型(文本)、離散數值、連續型數值。此中設計到不少實踐性很強的内容,略述如下。

非數值型的特征此處要進行處理了,模型不能識别非數字的東西,此處一般指的是文字型字段。例如性别{‘男’,‘女’},可以設定為{‘男’:0,‘女’:1},這不是二值化處理。需要說明的是,對于性别這一類的在DataFrame對象中可以用map函數進行處理,十分友善,具體可見下面的代碼。除了文字型字段,若是離散的、大小無意義的數字的字段,也需獨熱處理。在面對大量獨熱編碼時,一個一個用map函數十分不便,而用sklearn上的OneHotEncoder() 會将DF對象變為數組,無法後續處理,也不便于觀察特征的名字(當然你可以把這一步放到最後),同樣sklearn的無量綱化操作也是這樣,破壞美麗的DF資料結構。

此處,需要傳授一些人生經驗,不要聽信sklearn那些預處理工具。無量綱化直接用pandas自帶的統計量進行計算,啞編碼用pd.get_dummies(),十分友善。

對于連續值的編碼,即離散化處理,連續值本來直接送給模型就很好,如果有必要簡化、編碼,可以将連續值分段,再參考獨熱編碼。比如年齡字段可以這樣處理,但是本題沒有這麼做;具體的年齡數值很有用處,年齡的相關性極大,但是又不能說50歲就是25歲的2倍,編碼處理也許也有幫助。

③ 特征構造

資料變換,明顯也使得資料無量綱,需要注意的是資料變換的本質上是什麼呢?沒錯,實際上就是構造新特征。sklearn裡實作了PolynomialFeatures 以及 FunctionTransformer,一個是多項式特征,一個是函數變換。

特征組合,基本利用簡單的四則運算,但是一般基于對問題專業知識的了解,對現有幾個字段加以組合生成新的特征。

這個表格非常明了:

資料挖掘實戰之天池精準醫療大賽(5)——特征工程1Part 4-1 : 特征工程

此處對特征構造總結一下。編碼(數值規約)是對字段内容(離散型、文本)的特征化,而資料變換則是創造新的特征,方法除了多項式的,函數變換的,四則運算也是最基本的手段。此時,我們得到的‘資料’更像是一些高維的‘特征’了,也許我們隻有40個字段,經過這個階段的處理可以有1000個特征(因為各種函數變換,你想有多少特征都可以)。這就是這一階段的目的,但是沒有特征篩選的支撐這一工作也毫無意義,喂過多的特征會使模型準确性下降。下面我們認識一下特征選擇。

特征選擇的方法各種資料上說了一大堆,一般分為過濾、包裹、嵌入,鄙人根據自己了解,作如下分類:

① 基于名額的篩選:

大佬的文章中介紹了方差選擇法(VarianceThreshold)、相關系數法(pearsonr)、卡方檢驗法(chi2)和互資訊法(MINE),輔助使用SelectKBest()工具依據每個特征的名額選出K個最佳特征,相關系數隻能評價線性關系,而卡方檢驗和互資訊可以找到更多有用的特征,鄙人在比賽中輔助使用了互資訊和相關系數,并沒有完整的應用流程,還需在實踐中加強。

有時間鄙人會擴充一下這部分的内容,在此先略過。。

② 基于模型的篩選:

特征遞歸消除: RFE(estimator, n_features_to_select, step, estimator_params, verbose)

嵌入式方法,使用SelectFromModel(),模型一般是L1正則化的邏輯回歸模型及基于樹的模型如GBDT、RF,具體使用參考大佬的文章中的例子,更多的還是自己親自在實踐中使用。

要注意SelectFromModel(LogisticRegression(penalty="l1", C=0.1))這樣的是不穩定的,這裡向大家推薦sklearn.linear_model的兩個方法:

随機lasso回歸  RandomizedLasso(alpha='aic', scaling=.5, sample_fraction=.75,

                 n_resampling=200, selection_threshold=.25,

                 fit_intercept=True, verbose=False, normalize=True, precompute='auto',

                 max_iter=500, eps=np.finfo(np.float).eps, random_state=None,

                 n_jobs=1, pre_dispatch='3*n_jobs', memory=None)

随機邏輯回歸   RandomizedLogisticRegression(C=1, scaling=.5, sample_fraction=.75,

                 n_resampling=200, selection_threshold=.25, tol=1e-3,

                 fit_intercept=True, verbose=False,  normalize=True,

                 random_state=None,  n_jobs=1, pre_dispatch='3*n_jobs',  memory=None)

原型是這樣的,相當于線性模型的內建算法,可以穩定的選出重要的模型,具體使用不妨查查資料、看看源碼。另外,火熱的深度學習也可以用來篩選特征,有興趣的可以去查查~

③ 降維:當特征選擇完成後,可以直接訓練模型了,但是可能由于特征矩陣過大,導緻計算量大,訓練時間長的問題,是以降低特征矩陣次元也是必不可少的。L1的正則也是一種降維。PCA是為了讓映射後的樣本具有最大的發散性;而LDA是為了讓映射後的樣本有最好的分類性能。與篩選不同的是,篩選是舍棄掉某些特征、保留一些特征,而降維後,留下的次元已不再是原來的任一特征,類似于特征之間作了複雜的變換和函數運算,是以降維的過程是新特征生成。但是将降維歸到特征選擇中,大概因為這一般是調用模型前的最後一步了,一般還是認為這是在篩選特征而不是構造特征。

總結如下:(加上随機lasso)

資料挖掘實戰之天池精準醫療大賽(5)——特征工程1Part 4-1 : 特征工程
資料挖掘實戰之天池精準醫療大賽(5)——特征工程1Part 4-1 : 特征工程

特征工程流程歸納:

無量綱化(标準歸一化)→  編碼 →  特征構造 → 特征篩選 →  降維(如果次元大)

實際上,特征構造和特征選擇是反複疊代的關系。上面知乎的回答中的有一位大佬是這樣總結的:

資料挖掘實戰之天池精準醫療大賽(5)——特征工程1Part 4-1 : 特征工程

還是知乎那個問題裡,資料分析jacky 的回答也不錯,理論很系統,執行個體也很豐富,建議翻到下面看一下。他将流程歸納為資料處理、特征選擇、次元壓縮。

特征工程到底是什麼? - 資料分析jacky的回答 - 知乎

https://www.zhihu.com/question/29316149/answer/252391239

好了,特征工程的流程的理論部分就是這樣了,給出了許多連結,還是多看看,本文就不搬運了。下面一節會貼出大賽的特征工程的代碼供交流學習進步。

繼續閱讀