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


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

本文為數據茶水間群友原創,經授權在本公眾號發表。

關於作者:JunLiang,一個熱愛挖掘的數據從業者,勤學好問、動手達人,期待與大家一起交流探討機器學習相關內容~

0x00 前言

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

那特征工程是什么?

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

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

 

 

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

之前文章已經介紹了聚合特征構造、轉換特征構造、笛卡爾乘積特征構造和遺傳編程特征構造,接下來將介紹怎么使用GBDT進行特征構造以及使用聚類進行特征構造。

0x01 GBDT特征構造

1.原理

GBDT 是一種常用的非線性模型,基於集成學習中 boosting 的思想,由於GBDT本身可以發現多種有區分性的特征以及特征組合,決策樹的路徑可以直接作為 LR 輸入特征使用,省去了人工尋找特征、特征組合的步驟。所以可以將 GBDT 的葉子結點輸出,作為LR的輸入,如圖所示:

 

 

這種通過 GBDT 生成LR特征的方式(GBDT+LR),業界已有實踐(Facebook,Kaggle-2014),且效果不錯,是非常值得嘗試的思路。

2.關鍵點

1)采用ensemble決策樹而非單顆樹

一棵樹的表達能力很弱,不足以表達多個有區分性的特征組合,多棵樹的表達能力更強一些。GBDT 每棵樹都在學習前面棵樹尚存的不足,迭代多少次就會生成多少顆樹。按 paper 以及 Kaggle 競賽中的 GBDT+LR 融合方式,多棵樹正好滿足 LR 每條訓練樣本可以通過 GBDT 映射成多個特征的需求。

2)采用 GBDT 而非 RF

RF 也是多棵樹,但從效果上有實踐證明不如 GBDT。且 GBDT 前面的樹,特征分裂主要體現對多數樣本有區分度的特征;后面的樹,主要體現的是經過前 N 顆樹,殘差仍然較大的少數樣本。優先選用在整體上有區分度的特征,再選用針對少數樣本有區分度的特征,思路更加合理,這應該也是用 GBDT 的原因。

3.實現代碼

import numpy as np
import random
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, roc_auc_score

# 生成隨機數據
np.random.seed(10)
X, Y = make_classification(n_samples=1000, n_features=30)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=233, test_size=0.4)

# 訓練GBDT模型
gbdt = GradientBoostingClassifier(n_estimators=10)
gbdt.fit(X_train, Y_train)
# 對GBDT預測結果進行onehot編碼
onehot = OneHotEncoder()
onehot.fit(gbdt.apply(X_train)[:, :, 0])
# 訓練LR模型
lr = LogisticRegression()
lr.fit(onehot.transform(gbdt.apply(X_train)[:, :, 0]), Y_train)
# 測試集預測
Y_pred = lr.predict_proba(onehot.transform(gbdt.apply(X_test)[:, :, 0]))[:, 1]

fpr, tpr, _ = roc_curve(Y_test, Y_pred)
auc = roc_auc_score(Y_test, Y_pred)
print('GradientBoosting + LogisticRegression: ', auc)

4.方案改進

在廣告推薦中,廣告 ID 是一個易被忽略的重要特征。采用 GBDT-LR 的方案可將其很好的利用起來。一般而言,ID 取值多且呈現長尾分布,常用作法是對一些大廣告(曝光充分,樣本充足)建立專屬 GBDT,其它構建共用 GBDT。

 

 

5.優缺點

  • 優點:GBDT 可以自動進行特征組合和離散化,LR 可以有效利用海量 id 類離散特征,保持信息的完整性。
  • 缺點:LR 預測的時候需要等待 GBDT 的輸出,一方面 GBDT在線預測慢於單 LR,另一方面 GBDT 目前不支持在線算法,只能以離線方式進行更新。

0x02 聚類特征構造

1.聚類算法介紹

俗話說:“物以類聚,人以群分”,在自然科學和社會科學中,存在着大量的分類問題。所謂類,通俗地說,就是指相似元素的集合。

聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離等。

常用的距離算法:

 

 

2.聚類算法構造特征流程

  • Step 1:從預處理后的特征集中選擇一個或多個特征;當只選擇一個數值型特征時,聚類算法構造特征相當於使用聚類算法進行特征分箱,詳情可參考特征工程系列:特征預處理(上)中的《數值型特征特征分箱(數據離散化)》。
  • Step 2:選擇適合聚類算法對已選擇的特征進行聚類,並輸出聚類類標結果;
  • Step 3:對聚類類標結果進行編碼;類似 sklearn 這種機器學習庫,一般聚類類標結果為一個數值,但實際上這個數值並沒有大小之分,所以一般需要進行特征編碼,詳情可參看特征工程系列:特征預處理(下)中的《分類特征(類別特征)編碼》。

3.程序實現

使用 k-mean 算法對用戶興趣愛好進行聚類

import pandas as pd
import jieba
import numpy as np
from mitie import total_word_feature_extractor
from sklearn.cluster import KMeans
from sklearn.preprocessing import OneHotEncoder
# 構造特征集
hobby = [
'健身', '電影', '音樂', '讀書', '歷史',
'籃球', '羽毛球', '足球',
]
df = pd.DataFrame({'興趣': hobby})
display(df.head(20))
# 輸出:
興趣
0 健身
1 電影
2 音樂
3 讀書
4 歷史
5 籃球
6 羽毛球
7 足球

# 加載Embedding模型
mitie_model_filename = 'total_word_feature_extractor_zh.dat'
twfe = total_word_feature_extractor(mitie_model_filename)

# 把詞語轉換成embedding向量
embeding_array = np.array(list(df['興趣'].apply(
lambda w: twfe.get_feature_vector(w))))

# k-mean距離
kmeans = KMeans(n_clusters=2, random_state=0).fit(embeding_array)
kmean_label = kmeans.labels_
print('kmeans.labels_:{}'.format(kmean_label))
# 輸出:kmeans.labels_:[1 1 1 1 1 0 0 0]
kmean_label = kmean_label.reshape(-1, 1)
print('kmean_label shape={}'.format(kmean_label.shape))
# 輸出:kmean_label shape=(8, 1)

# 特征編碼
enc = OneHotEncoder()
onehot_code = enc.fit_transform(kmean_label)
print(onehot_code.toarray())
# 輸出:
[[0. 1.]
[0. 1.]
[0. 1.]
[0. 1.]
[0. 1.]
[1. 0.]
[1. 0.]
[1. 0.]]

0x0FF 總結

  1. GBDT 算法的特點可以用來發掘有區分度的特征、特征組合,減少特征工程中人力成本,且業界現在已有實踐,GBDT+LR、GBDT+FM 等都是值得嘗試的思路。不同場景,GBDT 融合 LR/FM 的思路可能會略有不同,可以多種角度嘗試。

  2. 聚類算法在特征構造中的應用有不少,例如:

  • 利用聚類算法對文本聚類,使用聚類類標結果作為輸入特征;
  • 利用聚類算法對單個數值特征進行聚類,相當於使用聚類算法進行特征分箱;
  • 利用聚類算法對R、F、M數據進行聚類,類似RFM模型,然后再使用代表衡量客戶價值的聚類類標結果作為輸入特征;

預告:下一篇文章將介紹時間特征構造以及時間序列特征構造。

參考文獻

  • 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
  • https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12
  • https://gplearn.readthedocs.io/en/stable/examples.html#symbolic-classifier
  • 利用 gplearn 進行特征工程. https://bigquant.com/community/t/topic/120709
  • Practical Lessons from Predicting Clicks on Ads at Facebook. https://pdfs.semanticscholar.org/daf9/ed5dc6c6bad5367d7fd8561527da30e9b8dd.pdf
  • Feature Tools:可自動構造機器學習特征的Python庫. https://www.jiqizhixin.com/articles/2018-06-21-2
  • 各種聚類算法的系統介紹和比較. https://blog.csdn.net/abc200941410128/article/details/78541273


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM