自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于關(guān)系型深度學習的自助機器學習 原創(chuàng)

發(fā)布于 2024-11-4 08:10
瀏覽
0收藏

本文將探討直接在關(guān)系數(shù)據(jù)庫上執(zhí)行機器學習的新方法——關(guān)系型深度學習。

基于關(guān)系型深度學習的自助機器學習-AI.x社區(qū)

本文示例項目數(shù)據(jù)集的關(guān)系模式(作者提供圖片)

在本文中,我們將深入探討一種有趣的深度學習(DL)新方法,稱為關(guān)系型深度學習(RDL)。我們還將通過在一家電子商務公司的真實數(shù)據(jù)庫(不是數(shù)據(jù)集!)上做一些RDL來獲得一些實踐經(jīng)驗。

簡介

在現(xiàn)實世界中,我們通常有一個關(guān)系數(shù)據(jù)庫,我們想在這個數(shù)據(jù)庫上運行一些機器學習任務。但是,有時候數(shù)據(jù)庫需要高度規(guī)范化;這意味著,大量耗時的特征工程和粒度損失,因為我們必須進行大量的聚合操作。更重要的是,我們可以構(gòu)建無數(shù)種可能的特征組合,每種組合都可能產(chǎn)生良好的性能(【文獻2】)。這意味著,我們可能會在數(shù)據(jù)庫表格中留下一些與ML任務相關(guān)的信息。

這類似于計算機視覺的早期,在深度神經(jīng)網(wǎng)絡出現(xiàn)之前,特征工程任務是基于像素值形式手工完成的。如今,模型直接使用原始像素,而不再依賴于這個中間環(huán)節(jié)。

關(guān)系型深度學習

關(guān)系型深度學習(RDL)承諾用表格形式學習實現(xiàn)同樣的事情。也就是說,它消除了通過直接在關(guān)系數(shù)據(jù)庫上學習來構(gòu)建特征矩陣的額外步驟。RDL通過將數(shù)據(jù)庫及其關(guān)系轉(zhuǎn)換為圖來實現(xiàn)這一點;其中,表中的一行成為節(jié)點,表之間的關(guān)系成為邊,行值作為節(jié)點特征存儲在節(jié)點內(nèi)。

在本文中,我們將使用??Kaggle的電子商務數(shù)據(jù)集??,該數(shù)據(jù)集包含有關(guān)星形模式中電子商務平臺的交易數(shù)據(jù),其中包含一個核心事實表(交易)和一些維度表。完整的代碼可以在??鏈接??處的筆記本文件中找到。

在本文中,我們將使用??relbench??庫來執(zhí)行RDL。在relbench中,我們必須做的第一件事是指定關(guān)系數(shù)據(jù)庫的模式。下面給出一個示例,說明我們?nèi)绾螌?shù)據(jù)庫中的“事務”表執(zhí)行此操作。我們將表作為pandas數(shù)據(jù)幀給出,并指定主鍵和時間戳列。主鍵列用于唯一標識實體。時間戳確保我們只能在預測未來交易時從過去的交易中學習。在這種構(gòu)圖中,這意味著信息只能從時間戳較低的節(jié)點(即過去)流向時間戳較高的節(jié)點。此外,我們指定關(guān)系中存在的外鍵。在這種情況下,事務表具有列“customer_key”,該列是指向“customer_dim”表的外鍵。

tables['transactions'] = Table(
df=pd.DataFrame(t),
pkey_col='t_id',
fkey_col_to_pkey_table={
'customer_key': 'customers',
'item_key': 'products',
'store_key': 'stores'
},
time_col='date'
)

其余的表需要以相同的方式定義。請注意,如果你已經(jīng)有了數(shù)據(jù)庫模式,這也可以通過自動化的方式實現(xiàn)。由于數(shù)據(jù)集來自Kaggle,所以我需要手動創(chuàng)建模式。我們還需要將日期列轉(zhuǎn)換為實際的pandas日期時間對象,并刪除任何NaN值。

class EcommerceDataBase(Dataset):
#創(chuàng)建你自己的數(shù)據(jù)集的示例:??https://github.com/snap-stanford/relbench/blob/main/tutorials/custom_dataset.ipynb?

val_timestamp = pd.Timestamp(year=2018, month=1, day=1)
test_timestamp = pd.Timestamp(year=2020, month=1, day=1)

def make_db(self) -> Database:

tables = {}

customers = load_csv_to_db(BASE_DIR + '/customer_dim.csv').drop(columns=['contact_no', 'nid']).rename(columns={'coustomer_key': 'customer_key'})
stores = load_csv_to_db(BASE_DIR + '/store_dim.csv').drop(columns=['upazila'])
products = load_csv_to_db(BASE_DIR + '/item_dim.csv')
transactions = load_csv_to_db(BASE_DIR + '/fact_table.csv').rename(columns={'coustomer_key': 'customer_key'})
times = load_csv_to_db(BASE_DIR + '/time_dim.csv')

t = transactions.merge(times[['time_key', 'date']], on='time_key').drop(columns=['payment_key', 'time_key', 'unit'])
t['date'] = pd.to_datetime(t.date)
t = t.reset_index().rename(columns={'index': 't_id'})
t['quantity'] = t.quantity.astype(int)
t['unit_price'] = t.unit_price.astype(float)
products['unit_price'] = products.unit_price.astype(float)
t['total_price'] = t.total_price.astype(float)

print(t.isna().sum(axis=0))
print(products.isna().sum(axis=0))
print(stores.isna().sum(axis=0))
print(customers.isna().sum(axis=0))

tables['products'] = Table(
df=pd.DataFrame(products),
pkey_col='item_key',
fkey_col_to_pkey_table={},
time_col=None
)

tables['customers'] = Table(
df=pd.DataFrame(customers),
pkey_col='customer_key',
fkey_col_to_pkey_table={},
time_col=None
)

tables['transactions'] = Table(
df=pd.DataFrame(t),
pkey_col='t_id',
fkey_col_to_pkey_table={
'customer_key': 'customers',
'item_key': 'products',
'store_key': 'stores'
},
time_col='date'
)

tables['stores'] = Table(
df=pd.DataFrame(stores),
pkey_col='store_key',
fkey_col_to_pkey_table={}
)

return Database(tables)

至關(guān)重要的是,作者引入了訓練表的概念。這個訓練表基本上定義了ML任務。這里的想法是,我們想預測數(shù)據(jù)庫中某個實體的未來狀態(tài)(即未來值)。我們通過指定一個表來實現(xiàn)這一點,其中每一行都有一個時間戳、實體的標識符和我們想要預測的一些值。id用于指定實體,時間戳指定我們需要預測實體的時間點。這也將限制可用于推斷此實體值的數(shù)據(jù)(即僅過去的數(shù)據(jù))。值本身就是我們想要預測的(即真實數(shù)據(jù)值)。

就我們而言,我們有一個與客戶互動的在線平臺。我們希望預測客戶在未來30天內(nèi)的收入。我們可以使用DuckDB執(zhí)行的SQL語句創(chuàng)建訓練表。這是RDL的一大優(yōu)勢,因為我們可以僅使用SQL創(chuàng)建任何類型的ML任務。例如,我們可以定義一個查詢來選擇未來30天內(nèi)買家的購買數(shù)量,以進行流失預測。

df = duckdb.sql(f"""
select
timestamp,
customer_key,
sum(total_price) as revenue
from
timestamp_df t
left join
transactions ta
on
ta.date <= t.timestamp + INTERVAL '{self.timedelta}'
and ta.date > t.timestamp
group by timestamp, customer_key
""").df().dropna()

結(jié)果將是一個數(shù)據(jù)庫表格,其中seller_id是我們想要預測的實體的關(guān)鍵字,收入是目標,時間戳是我們需要進行預測的時間(即我們只能使用到目前為止的數(shù)據(jù)進行預測)。

基于關(guān)系型深度學習的自助機器學習-AI.x社區(qū)

訓練表(作者提供圖片)

下面是創(chuàng)建“customer_venue”任務的完整代碼。

class CustomerRevenueTask(EntityTask):
# 自定義任務示例:??https://github.com/snap-stanford/relbench/blob/main/tutorials/custom_task.ipynb??


task_type = TaskType.REGRESSION
entity_col = "customer_key"
entity_table = "customers"
time_col = "timestamp"
target_col = "revenue"
timedelta = pd.Timedelta(days=30) # 我們想要預測未來的收入。
metrics = [r2, mae]
num_eval_timestamps = 40

def make_table(self, db: Database, timestamps: "pd.Series[pd.Timestamp]") -> Table:

timestamp_df = pd.DataFrame({"timestamp": timestamps})

transactions = db.table_dict["transactions"].df

df = duckdb.sql(f"""
select
timestamp,
customer_key,
sum(total_price) as revenue
from
timestamp_df t
left join
transactions ta
on
ta.date <= t.timestamp + INTERVAL '{self.timedelta}'
and ta.date > t.timestamp
group by timestamp, customer_key
""").df().dropna()

print(df)

return Table(
df=df,
fkey_col_to_pkey_table={self.entity_col: self.entity_table},
pkey_col=None,
time_col=self.time_col,
)

至此,我們已經(jīng)完成了大部分工作。其余的工作流程都是類似的,獨立于機器學習任務。我能夠從relbench提供的??示例筆記本文件??中復制大部分代碼。

例如,我們需要對節(jié)點特征進行編碼。在這里,我們可以使用GloVe嵌入(【譯者注】個別網(wǎng)文中翻譯為“手套嵌入”)來編碼所有文本特征,如產(chǎn)品描述和產(chǎn)品名稱。

from typing import List, Optional
from sentence_transformers import SentenceTransformer
from torch import Tensor


class GloveTextEmbedding:
def __init__(self, device: Optional[torch.device
] = None):
self.model = SentenceTransformer(
"sentence-transformers/average_word_embeddings_glove.6B.300d",
device=device,
)

def __call__(self, sentences: List[str]) -> Tensor:
return torch.from_numpy(self.model.encode(sentences))

之后,我們可以將這些轉(zhuǎn)換應用于我們的數(shù)據(jù)并構(gòu)建圖表。

from torch_frame.config.text_embedder import TextEmbedderConfig
from relbench.modeling.graph import make_pkey_fkey_graph

text_embedder_cfg = TextEmbedderConfig(
text_embedder=GloveTextEmbedding(device=device), batch_size=256
)

data, col_stats_dict = make_pkey_fkey_graph(
db,
col_to_stype_dict=col_to_stype_dict,  # speficied column types
text_embedder_cfg=text_embedder_cfg,  # our chosen text encoder
cache_dir=os.path.join(
root_dir, f"rel-ecomm_materialized_cache"
),  # store materialized graph for convenience
)

其余的代碼將從標準層構(gòu)建GNN(圖神經(jīng)網(wǎng)絡),對循環(huán)訓練進行編碼,并進行一些評估。為了簡單起見,我將把這段代碼從本文中刪除,因為它非常標準,在各個任務中都是一樣的。你可以在鏈接https://github.com/LaurinBrechter/GraphTheory/tree/main/rdl處查看對應的筆記本文件。

基于關(guān)系型深度學習的自助機器學習-AI.x社區(qū)

訓練結(jié)果(作者提供圖片)

因此,我們可以訓練這個GNN,使其r2達到0.3左右,MAE達到500。這意味著,它預測賣家在未來30天的收入,平均誤差為+-500美元。當然,我們不知道這是好是壞,也許通過經(jīng)典機器學習和特征工程的結(jié)合,我們可以得到80%的r2。

結(jié)論

關(guān)系型深度學習是一種有趣的機器學習新方法,特別是當我們有一個復雜的關(guān)系模式時,手動特征工程太費力了。它使我們能夠僅使用SQL定義ML任務,這對于那些不深入研究數(shù)據(jù)科學但僅了解一些SQL的人來說尤其有用。這也意味著,我們可以快速迭代,并對不同的任務進行大量實驗。

同時,這種方法也存在自己的問題,例如訓練GNN和從關(guān)系模式構(gòu)建圖存在不少困難。此外,還有一個問題是,RDL在性能方面能在多大程度上與經(jīng)典ML模型競爭。過去,我們已經(jīng)看到,在表格預測問題上,XGboost等模型已被證明比神經(jīng)網(wǎng)絡更好。

參考文獻

【1】Robinson,Joshua等人,《RelBench:關(guān)系數(shù)據(jù)庫深度學習的基準》,arXiv,2024,https://arxiv.org/abs/2407.20060。

【2】Fey、Matthias等人,《關(guān)系深度學習:關(guān)系數(shù)據(jù)庫上的圖表示學習》,arXiv預印本arXiv:2312.04615(2023)。

【3】Schlichtkrull,Michael等人。《用圖卷積網(wǎng)絡建模關(guān)系數(shù)據(jù)》,語義網(wǎng):第15屆國際會議,2018年ESWC,希臘克里特島伊拉克利翁,2018年6月3日至7日,會議記錄#15。施普林格國際出版社,2018年。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。

原文標題:??Self-Service ML with Relational Deep Learning??,作者:Laurin Brechter

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關(guān)推薦