基于相关型深度学习的自助机器学习
基于相关型深度学习的自助机器学习
译文 精选 作者: 朱先忠 在本文中,咱们将深化讨论一种幽默的深度学习(DL)新方法,称为相关型深度学习(RDL)。咱们还将经过在一家电子商务公司的实在数据库(不是数据集!)上做一些RDL来取得一些通常阅历。本文将讨论间接在相关数据库上口头机器学习的新方法——相关型深度学习。
本文示例名目数据集的相关形式(作者提供图片)
在本文中,咱们将深化讨论一种幽默的深度学习(DL)新方法,称为相关型深度学习(RDL)。咱们还将经过在一家电子商务公司的实在数据库(不是数据集!)上做一些RDL来取得一些通常阅历。
简介
无理想环球中,咱们通常有一个相关数据库,咱们想在这个数据库上运转一些机器学习义务。然而,有时刻数据库须要高度规范化;这象征着,少量耗时的特色工程和粒度损失,由于咱们必定启动少量的聚合操作。更关键的是,咱们可以构建有数种或者的特色组合,每种组合都或者发生良好的功能(【文献2】)。这象征着,咱们或者会在数据库表格中留下一些与ML义务相关的消息。
这相似于计算机视觉的早期,在深度神经网络出现之前,特色工程义务是基于像素值方式手工成功的。如今,模型间接经常使用原始像素,而不再依赖于这个两边环节。
相关型深度学习
相关型深度学习(RDL)承诺用表格方式学习成功雷同的事件。也就是说,它消弭了经过间接在相关数据库上学习来构建特色矩阵的额外步骤。RDL经过将数据库及其相关转换为图来成功这一点;其中,表中的一行成为节点,表之间的相关成为边,行值作为节点特色存储在节点内。
Kaggle的电子商务数据集 ,该数据集蕴含无关星形形式中电子商务平台的买卖数据,其中蕴含一个外围理想表(买卖)和一些维度表。完整的代码可以在 链接 处的笔记本文件中找到。
库来口头RDL。在relbench中,咱们必定做的第一件事是指定相关数据库的形式。上方给出一个示例,说明咱们如何对数据库中的“事务”表口头此操作。咱们将表作为pandas数据帧给出,并指定主键和期间戳列。主键列用于惟一标识实体。期间戳确保咱们只能在预测未来买卖时从过去的买卖中学习。在这种构图中,这象征着消息只能从期间戳较低的节点(即过去)流向期间戳较高的节点。此外,咱们指定相关中存在的外键。在这种状况下,事务表具备列“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')
class EcommerceDataBase(Dataset):#创立你自己的数据集的示例:= pd.Timestamp(year=2018, month=1, day=1)test_timestamp = pd.Timestamp(year=2020, month=1, day=1)def make_db(self) ->).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>
至关关键的是,作者引入了训练表的概念。这个训练表基本上定义了ML义务。这里的想法是,咱们想预测数据库中某个实体的未来形态(即未来值)。咱们经过指定一个表来成功这一点,其中每一行都有一个期间戳、实体的标识符和咱们想要预测的一些值。id用于指定实体,期间戳指定咱们须要预测实体的期间点。这也将限度可用于推断此实体值的数据(即仅过去的数据)。值自身就是咱们想要预测的(即实在数据值)。
就咱们而言,咱们有一个与客户互动的在线平台。咱们宿愿预测客户在未来30天内的支出。咱们可以经常使用DuckDB口头的SQL语句创立训练表。这是RDL的一大长处,由于咱们可以仅经常使用SQL创立任何类型的ML义务。例如,咱们可以定义一个查问来选用未来30天内买家的购置数量,以启动散失预测。
df = duckdb.sql(f"""selecttimestamp,customer_key,sum(total_price) as revenuefromtimestamp_df tleft jointransactions taonta.date <= t.timestamp + INTERVAL '{self.timedelta}'and ta.date > t.timestampgroup by timestamp, customer_key""").df().dropna()
结果将是一个数据库表格,其中seller_id是咱们想要预测的实体的关键字,支出是指标,期间戳是咱们须要启动预测的期间(即咱们只能经常使用到目前为止的数据启动预测)。
上方是创立“customer_venue”义务的完整代码。
class CustomerRevenueTask(EntityTask):# 自定义义务示例:= TaskType.REGRESSIONentity_col = "customer_key"entity_table = "customers"time_col = "timestamp"target_col = "revenue"timedelta = pd.Timedelta(days=30) # 咱们想要预测未来的支出。metrics = [r2, mae]num_eval_timestamps = 40def make_table(self, db:>
至此,咱们曾经成功了大局部上班。其他的上班流程都是相似的,独立于机器学习义务。我能够从relbench提供的 示例笔记本文件
例如,咱们须要对节点特色启动编码。在这里,咱们可以经常使用GloVe嵌入(【译者注】一般网文中翻译为“手套嵌入”)来编码一切文本特色,如产品形容和产品称号。
from typing import List, Optionalfrom sentence_transformers import SentenceTransformerfrom torch import Tensorclass 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))
之后,咱们可以将这些转换运行于咱们的数据并构建图表。
from torch_frame.config.text_embedder import TextEmbedderConfigfrom relbench.modeling.graph import make_pkey_fkey_graphtext_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 typestext_embedder_cfg=text_embedder_cfg,# our chosen text encodercache_dir=os.path.join(root_dir, f"rel-ecomm_materialized_cache"),# store materialized graph for convenience)
其他的代码将从规范层构建GNN(图神经网络),对循环训练启动编码,并启动一些评价。为了便捷起见,我将把这段代码从本文中删除,由于它十分规范,在各个义务中都是一样的。你可以在链接处检查对应的笔记本文件。
训练结果(作者提供图片)
因此,咱们可以训练这个GNN,使其r2到达0.3左右,MAE到达500。这象征着,它预测卖家在未来30天的支出,平均误差为+-500美元。当然,咱们不知道这是好是坏,兴许经过经典机器学习和特色工程的联合,咱们可以获取80%的r2。
论断
相关型深度学习是一种幽默的机器学习新方法,特意是当咱们有一个复杂的相关形式时,手动特色工程太费劲了。它使咱们能够仅经常使用SQL定义ML义务,这关于那些不深化钻研数据迷信但仅了解一些SQL的人来说尤其有用。这也象征着,咱们可以极速迭代,并对不同的义务启动少量试验。
同时,这种方法也存在自己的疑问,例如训练GNN和从相关形式构建图存在不少艰巨。此外,还有一个疑问是,RDL在功能方面能在多大水平上与经典ML模型竞争。过去,咱们曾经看到,在表格预测疑问上,XGboost等模型已被证实比神经网络更好。
参考文献
【1】Robinson,Joshua等人,《RelBench:相关数据库深度学习的基准》,arXiv,2024,。
【2】Fey、Matthias等人,《相关深度学习:相关数据库上的图示意学习》,arXiv预印本arXiv:2312.04615(2023)。
【3】Schlichtkrull,Michael等人。《用图卷积网络建模相关数据》,语义网:第15届国内会议,2018年ESWC,希腊克里特岛伊拉克利翁,2018年6月3日至7日,会议记载#15。施普林格国内出版社,2018年。
译者引见
朱先忠,社区编辑,专家博客、讲师,潍坊一所高校计算机老师,自在编程界老兵一枚。
Self-Service ML with Relational Deep Learning