gpt4 book ai didi

optimization - 如何优化 LightFM 的超参数?

转载 作者:行者123 更新时间:2023-12-03 16:25:06 26 4
gpt4 key购买 nike

我在我的数据集上使用了 LightFM 推荐库,它给出了下图中的结果。

Poor results after some epochs

NUM_THREADS = 4
NUM_COMPONENTS = 30
NUM_EPOCHS = 5
ITEM_ALPHA = 1e-6
LEARNING_RATE = 0.005
LEARNING_SCHEDULE = 'adagrad'
RANDOM_SEED = 29031994

warp_model = LightFM(loss='warp',
learning_rate=LEARNING_RATE,
learning_schedule=LEARNING_SCHEDULE,
item_alpha=ITEM_ALPHA,
no_components=NUM_COMPONENTS,
random_state=RANDOM_SEED)

bpr_model = LightFM(loss='bpr',
learning_rate=LEARNING_RATE,
learning_schedule=LEARNING_SCHEDULE,
item_alpha=ITEM_ALPHA,
no_components=NUM_COMPONENTS,
random_state=RANDOM_SEED)

我的特征的形状如下:

Item and user features shapes

如何优化超参数以提高曲线下面积 (AUC) 分数?

最佳答案

您可以在 sklearn docs 中找到有关超参数优化的一般指南。

一种可用于优化 LightFM 模型的简单但有效的技术是 random search 。粗略地说,它包括以下步骤:

  • 将您的数据拆分为训练集、验证集和测试集。
  • 为您想要优化的每个超参数定义一个分布。例如,如果您要优化学习率,则可以使用均值为 0.05 的指数分布;如果您正在优化损失函数,您可以从 ['warp', 'bpr', 'warp-kos'] 统一采样。
  • 在优化的每次迭代中,对所有超参数进行采样,并使用它们在训练数据上拟合模型。在验证集上评估模型的性能。
  • 执行一系列优化步骤后,选择验证性能最佳的一个。

  • 要衡量最终模型的性能,您应该使用测试集:只需在测试集上评估最佳验证模型。

    以下脚本说明了这一点:

    import itertools

    import numpy as np

    from lightfm import LightFM
    from lightfm.evaluation import auc_score


    def sample_hyperparameters():
    """
    Yield possible hyperparameter choices.
    """

    while True:
    yield {
    "no_components": np.random.randint(16, 64),
    "learning_schedule": np.random.choice(["adagrad", "adadelta"]),
    "loss": np.random.choice(["bpr", "warp", "warp-kos"]),
    "learning_rate": np.random.exponential(0.05),
    "item_alpha": np.random.exponential(1e-8),
    "user_alpha": np.random.exponential(1e-8),
    "max_sampled": np.random.randint(5, 15),
    "num_epochs": np.random.randint(5, 50),
    }


    def random_search(train, test, num_samples=10, num_threads=1):
    """
    Sample random hyperparameters, fit a LightFM model, and evaluate it
    on the test set.

    Parameters
    ----------

    train: np.float32 coo_matrix of shape [n_users, n_items]
    Training data.
    test: np.float32 coo_matrix of shape [n_users, n_items]
    Test data.
    num_samples: int, optional
    Number of hyperparameter choices to evaluate.


    Returns
    -------

    generator of (auc_score, hyperparameter dict, fitted model)

    """

    for hyperparams in itertools.islice(sample_hyperparameters(), num_samples):
    num_epochs = hyperparams.pop("num_epochs")

    model = LightFM(**hyperparams)
    model.fit(train, epochs=num_epochs, num_threads=num_threads)

    score = auc_score(model, test, train_interactions=train, num_threads=num_threads).mean()

    hyperparams["num_epochs"] = num_epochs

    yield (score, hyperparams, model)


    if __name__ == "__main__":
    from lightfm.datasets import fetch_movielens

    data = fetch_movielens()
    train = data["train"]
    test = data["test"]

    (score, hyperparams, model) = max(random_search(train, test, num_threads=2), key=lambda x: x[0])

    print("Best score {} at {}".format(score, hyperparams))

    关于optimization - 如何优化 LightFM 的超参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896816/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com