特徵工程系列:自動化特徵構造

特徵工程系列:自動化特徵構造

原創: JunLiang 木東居士  今天

0x00 前言

數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。由此可見,特徵工程在機器學習中佔有相當重要的地位。在實際應用當中,可以說特徵工程是機器學習成功的關鍵。

那特徵工程是什麼?

特徵工程是利用數據領域的相關知識來創建能夠使機器學習算法達到最佳性能的特徵的過程。

特徵工程又包含了 Data PreProcessing(數據預處理)、Feature Extraction(特徵提取)、Feature Selection(特徵選擇)和 Feature construction(特徵構造)等子問題,本章內容主要討論特徵構造的方法。

創造新的特徵是一件十分困難的事情,需要豐富的專業知識和大量的時間。機器學習應用的本質基本上就是特徵工程。
——Andrew Ng

0x01 自動化特徵構造介紹

目前,很多機器學習項目的模型選擇開始轉向自動化,而特徵工程仍然主要以人工爲主。自動化特徵工程旨在通過從數據集中自動創建候選特徵,且從中選擇若干最佳特徵進行訓練的一種方式。自動化特徵工程工具包有 Feature Tools 和 tsfresh 等,以下以 Feature Tools 爲例進行說明。

Feature Tools 是執行自動化功能工程的框架。它擅長將時態和關係數據集轉換爲機器學習的特徵矩陣。

  • 項目地址:https://docs.featuretools.com/

  • 代碼地址:https://github.com/WillKoehrsen/automated-feature-engineering/blob/master/walk_through/Automated_Feature_Engineering.ipynb

Feature Tools 使用一種稱爲深度特徵合成(Deep Feature Synthesis,DFS)的算法,該算法遍歷通過關係數據庫的模式描述的關係路徑,深度特徵合成疊加多個轉換和聚合操作,這在特徵工具的詞庫中被稱爲特徵基元,以便通過分佈在多張表內的數據來構造新的特徵。與機器學習中的大多數方法一樣,這是建立在簡單概念基礎之上的複雜方法。

0x02實體和實體集

特徵工具的前兩個概念的是「實體」和「實體集」。一個實體就是一張表(或是 Pandas 中的一個 DataFrame(數據框))。一個實體集是一組表以及它們之間的關聯。將一個實體集看成另一種 Python 數據結構,並帶有自己的方法和屬性。

0x03表的關聯

考慮兩張表之間「關聯」的最好方法是類比父子之間的關聯。這是一種一對多的關聯:每個父親可以有多個兒子。對錶來說,每個父親對應一張父表中的一行,但是子表中可能有多行對應於同一張父表中的多個兒子。

例如,在我們的數據集中,clients 數據框是 loans 數據框的一張父表。每個客戶只對應 clients 表中的一行,但是可能對應 loans 表中的多行。同樣,loans 表是 payments 表的一張父表,因爲每項貸款可以有多項支付。父親通過共享變量與兒子相關聯。當我們執行聚合操作的時候,我們根據父變量對子表進行分組,並計算每個父親的兒子的統計量。

0x04特徵基元

  • 聚合:根據父與子(一對多)的關聯完成的操作,也就是根據父親分組並計算兒子的統計量。一個例子就是根據 client_id 對 loan 表分組並找到每個客戶的最大貸款額。

  • 轉換:對一張表中一或多列完成的操作。一個例子就是取一張表中兩列之間的差值或者取一列的絕對值。

在特徵工具中單獨使用這些基元或者疊加使用這些基元可以構造新的特徵。以下是特徵工具中一些特徵基元的列表,也可以自定義特徵基元。

0x05深度特徵合成

深度特徵只是疊加多個基元構造的一個特徵,而 dfs 只是構造這些特徵的過程的名稱。深度特徵的深度是構造這個特徵所需的基元數量。

例如,MEAN(payments.payment_amount)列是深度爲 1 的特徵,因爲它是使用單個聚合操作構造的。LAST(loans(MEAN(payments.payment_amount))是一個深度爲 2 的特徵,它是由兩個疊加的聚合操作構造的:MEAN 列之上的 LAST(最近的)列。這表示每個客戶最近的貸款平均支付額。

0x06實現程序

加載數據

import pandas as pd
import numpy as np
import featuretools as ft
import warnings
warnings.filterwarnings('ignore')

# 加載數據
clients = pd.read_csv('data/clients.csv', parse_dates = ['joined'])
loans = pd.read_csv('data/loans.csv', parse_dates = ['loan_start', 'loan_end'])
payments = pd.read_csv('data/payments.csv', parse_dates = ['payment_date'])

clients 數據:

loans 數據:

payments 數據:

創建實體和實體集

# 創建一個空的實體集
es = ft.EntitySet(id = 'clients')

#clients指定索引爲client_id,時間索引爲joined
es = es.entity_from_dataframe(entity_id = 'clients', dataframe = clients, 
                              index = 'client_id', time_index = 'joined')

# payments建議一個索引payment_id,指定missed是一個類別特性,時間索引爲payment_date。
es = es.entity_from_dataframe(entity_id = 'payments', 
                              dataframe = payments,
                              variable_types = {'missed': ft.variable_types.Categorical},
                              make_index = True,
                              index = 'payment_id',
                              time_index = 'payment_date')
# loans指定索引爲loan_id,repaid是一個類別特性,時間索引爲loan_start
es = es.entity_from_dataframe(entity_id = 'loans', dataframe = loans, 
                              variable_types = {'repaid': ft.variable_types.Categorical},
                              index = 'loan_id', 
                              time_index = 'loan_start')

添加實體關係

# 通過client_id 關聯clients和loans實體
r_client_previous = ft.Relationship(es['clients']['client_id'],
                                    es['loans']['client_id'])
es = es.add_relationship(r_client_previous)

# 通過loan_id 關聯payments和loans實體
r_payments = ft.Relationship(es['loans']['loan_id'],
                             es['payments']['loan_id'])
es = es.add_relationship(r_payments)

聚合特徵,指定聚合和轉換函數生成新特徵

 

# 聚合特徵,通過指定聚合agg_primitives和轉換trans_primitives生成新特徵
features, feature_names = ft.dfs(entityset = es, target_entity = 'clients', 
                                 agg_primitives = ['mean', 'max', 'percent_true', 'last'],
                                 trans_primitives = ['years', 'month', 'subtract', 'divide'])

聚合特徵,並生成新特徵

除了手動指定聚合和轉換特徵基元之外,我們還可以讓 featuretools 自動生成許多新功能。我們通過進行相同的 ft.dfs 函數調用來完成此操作,但不傳入任何基元。我們只需設置 max_depth 參數, featuretools 將自動嘗試許多特徵基元的所有組合到有序深度。

​​​​​​​​​​​​​​

#聚合特徵,並生成新特徵
features, feature_names = ft.dfs(entityset = es, target_entity = 'clients')

0x0FF 總結

1.特徵構造

特徵構造是一個非常耗時的過程,因爲每個新的特徵通常需要幾步才能構造,特別是當使用多張表的信息時。我們可以將特徵構造的操作分爲兩類:“轉換”和“聚合”。

很多機器學習比賽都是直接給出了訓練集(特徵+類標),我們可以對給出的特徵進行“轉換”操作,構造更多的特徵。而在實際的工作中,很多時候我們都沒有現成的特徵,需要自己進行“聚合”操作從多個原始數據表中構造出模型所需要的特徵。

例如,用戶行爲數據表中每條記錄爲某個用戶的一次瀏覽行爲或一次點擊行爲,我們需要通過“聚合”操作構造出用戶的行爲特徵(如:用戶最近一次瀏覽的時長、用戶最近一次登錄的點擊次數等特徵),然後再使用“轉換”操作來構造更多特徵,最後再使用這些特徵訓練模型。

2.特徵選擇

經過各種方法構造特徵,我們收穫了大量特徵,但同時帶來了另一個問題:特徵太多了。儘管在擬合一個模型之前很難說哪些特徵是重要的,但很可能不是所有這些特徵都與我們想要訓練的模型的任務相關。此外,擁有太多特徵可能會導致模型性能不佳,因爲較無益的特徵會淹沒那些更重要的特徵。

特徵過多問題以維度災難著稱。隨着特徵數量的上升(數據維度增長),模型越來越難以學習特徵與目標之間的映射關係。事實上,讓模型表現良好所需的數據量與特徵數量成指數關係。

至於如何進行特徵選擇,詳情可參看《特徵工程系列:特徵篩選的原理與實現(上)》《特徵工程系列:特徵篩選的原理與實現(下)》

3.自動構造特徵

即使是具有相當領域知識的人,在製作新功能時也會受到想象力的限制(更不用說時間)了。自動化特徵工程不受這些因素的限制(而是受到計算時間的限制),併爲特徵創建提供了良好的起點。

這個過程不會完全消除人類對特徵工程的貢獻,因爲人類仍然可以使用領域知識和機器學習專業知識來選擇最重要的特徵或從自動深度特徵合成建議的那些構建新特徵。

參考文獻

[1] https://machinelearning-notes.readthedocs.io/zh_CN/latest/feature/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E2%80%94%E2%80%94%E6%97%B6%E9%97%B4.html
[2] https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12
[3] https://gplearn.readthedocs.io/en/stable/examples.html#symbolic-classifier
[4] 利用 gplearn 進行特徵工程. https://bigquant.com/community/t/topic/120709
[5] Practical Lessons from Predicting Clicks on Ads at Facebook. https://pdfs.semanticscholar.org/daf9/ed5dc6c6bad5367d7fd8561527da30e9b8dd.pdf
[6] Feature Tools:可自動構造機器學習特徵的Python庫. https://www.jiqizhixin.com/articles/2018-06-21-2
[7] 各種聚類算法的系統介紹和比較. https://blog.csdn.net/abc200941410128/article/details/78541273

特徵工程系列文章

特徵工程系列:數據清洗

特徵工程系列:特徵篩選的原理與實現(上)

特徵工程系列:特徵篩選的原理與實現(下)

特徵工程系列:特徵預處理(上)

特徵工程系列:特徵預處理(下)

特徵工程系列:特徵構造之概覽篇

特徵工程系列:聚合特徵構造以及轉換特徵構造

特徵工程系列:笛卡爾乘積特徵構造以及遺傳編程特徵構造

特徵工程系列:GBDT特徵構造以及聚類特徵構造

特徵工程系列:時間特徵構造以及時間序列特徵構造

特徵工程系列:空間特徵構造以及文本特徵構造

熱門文章

直戳淚點!數據從業者權威嘲諷指南!

AI研發工程師成長指南

數據分析師做成了提數工程師,該如何破局?

算法工程師應該具備哪些工程能力

數據團隊思考:如何優雅地啓動一個數據項目!

數據團隊思考:數據驅動業務,比技術更重要的是思維的轉變

閱讀 698

 在看5

寫下你的留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章