作者: admin

  • 🎬 电影推荐的魔法:探索ALS算法在MovieLens数据集上的应用

    在这个信息爆炸的时代,我们每天都面临着海量的选择。想象一下,你打开了一个视频网站,却不知道该看什么好?这时候,一个贴心的电影推荐系统就显得尤为重要了。今天,让我们一起揭开电影推荐系统的神秘面纱,看看数据科学家们是如何运用ALS(交替最小二乘法)算法来实现个性化推荐的。

    🧙‍♂️ ALS算法:推荐系统的”魔法棒”

    首先,让我们来认识一下今天的主角——ALS算法。想象一下,如果推荐系统是一位魔法师,那么ALS算法就是他手中的魔法棒。这个算法的全名是Alternating Least Squares,听起来很高大上,但其实它的工作原理并不难理解。

    假设我们有一个巨大的用户-电影评分矩阵,就像是一张魔法地图。但这张地图上有很多空白区域,因为不是每个用户都看过所有的电影。ALS算法的任务就是要填补这些空白,预测用户可能会给未看过的电影打多少分。

    它是怎么做到的呢?简单来说,ALS算法假设每个用户和每部电影都可以用一组数字(我们称之为”潜在因子”)来表示。比如,一个用户可能喜欢动作片(因子1)和浪漫喜剧(因子2),而讨厌恐怖片(因子3)。同样,一部电影也可以用这些因子来描述它的特点。ALS算法就是通过不断调整这些因子,使得预测的评分尽可能接近实际的评分。

    🎭 MovieLens数据集:我们的”演员阵容”

    在这个实验中,我们使用的是著名的MovieLens数据集。这个数据集就像是我们的”演员阵容”,包含了大量用户对电影的真实评分。具体来说,我们使用的是MovieLens 100k数据集,包含了约10万条评分数据。

    让我们来看看这个数据集的”剧本”:

    +------+-------+------+---------+
    |UserId|MovieId|Rating|Timestamp|
    +------+-------+------+---------+
    |   196|    242|   3.0|881250949|
    |   186|    302|   3.0|891717742|
    |    22|    377|   1.0|878887116|
    |   244|     51|   2.0|880606923|
    |   166|    346|   1.0|886397596|
    +------+-------+------+---------+

    这里,每一行代表一个用户对一部电影的评分。UserId是用户的唯一标识,MovieId是电影的唯一标识,Rating是用户给这部电影的评分(1-5分),Timestamp是评分的时间戳。

    🎬 准备开机:数据预处理

    在开始我们的”电影推荐大戏”之前,我们需要做一些准备工作。首先,我们需要将数据集分成训练集和测试集。这就像是在拍电影前先排练一遍,确保一切就绪。

    train, test = spark_random_split(data, ratio=0.75, seed=123)
    print ("N train", train.cache().count())
    print ("N test", test.cache().count())

    这段代码将数据集随机分成了两部分:75%的数据用于训练,25%的数据用于测试。这样做的目的是为了后续评估我们的模型性能。

    🎥 Action!训练ALS模型

    现在,让我们开始训练我们的ALS模型。这就像是开始拍摄我们的”电影推荐大片”了!

    als = ALS(
        rank=10,
        maxIter=15,
        implicitPrefs=False,
        regParam=0.05,
        coldStartStrategy='drop',
        nonnegative=False,
        seed=42,
        **header
    )
    
    with Timer() as train_time:
        model = als.fit(train)
    
    print("Took {} seconds for training.".format(train_time.interval))

    这里,我们设置了一些超参数:

    1. rank=10:这意味着我们用10个潜在因子来描述每个用户和电影。你可以把它想象成我们用10种不同的特征来描述一个人的电影偏好。
    2. maxIter=15:这是算法最多迭代的次数。就像是我们最多拍15条片段,然后选择最好的一条。
    3. implicitPrefs=False:这表示我们使用的是显式反馈(即用户明确给出的评分),而不是隐式反馈(比如观看时长)。
    4. regParam=0.05:这是正则化参数,用来防止模型过拟合。就像是给演员一些即兴发挥的空间,但又不能偏离剧本太远。
    5. coldStartStrategy='drop':这意味着我们会丢弃那些在训练集中没有出现过的用户或电影。就像是我们只关注主演,不考虑群众演员。

    训练完成后,我们得到了一个能够预测用户对电影评分的模型。接下来,我们就可以用这个模型来给用户推荐电影了!

    🍿 推荐时间到!

    现在,让我们用我们训练好的模型来为用户推荐电影。但是等等,我们不能推荐用户已经看过的电影,对吧?那样就太无聊了!所以,我们需要先排除用户已经看过的电影。

    users = train.select(COL_USER).distinct()
    items = train.select(COL_ITEM).distinct()
    user_item = users.crossJoin(items)
    dfs_pred = model.transform(user_item)
    
    dfs_pred_exclude_train = dfs_pred.alias("pred").join(
        train.alias("train"),
        (dfs_pred[COL_USER] == train[COL_USER]) & (dfs_pred[COL_ITEM] == train[COL_ITEM]),
        how='outer'
    )
    
    top_all = dfs_pred_exclude_train.filter(dfs_pred_exclude_train[f"train.{COL_RATING}"].isNull()) \
        .select('pred.' + COL_USER, 'pred.' + COL_ITEM, 'pred.' + "prediction")

    这段代码看起来有点复杂,但别担心,让我来解释一下:

    1. 首先,我们获取所有的用户和电影。
    2. 然后,我们做了一个”交叉连接”,得到所有可能的用户-电影组合。
    3. 接着,我们用模型预测这些组合的评分。
    4. 最后,我们排除了用户已经看过的电影,只保留未看过的电影的预测评分。

    这就像是我们为每个观众定制了一份专属的电影菜单,里面只有他们没看过的新电影!

    🏆 模型评估:我们的”电影”有多成功?

    好了,我们的”电影推荐大片”拍摄完成了。但是,它到底表现如何呢?我们需要一些指标来评估我们的模型性能。这就像是电影上映后看票房和口碑一样。

    首先,我们来看看推荐系统的常用评估指标:

    print("Model:\tALS",
          "Top K:\t%d" % rank_eval.k,
          "MAP:\t%f" % rank_eval.map_at_k(),
          "NDCG:\t%f" % rank_eval.ndcg_at_k(),
          "Precision@K:\t%f" % rank_eval.precision_at_k(),
          "Recall@K:\t%f" % rank_eval.recall_at_k(), sep='\n')

    这里的几个指标,让我们一一解释:

    1. MAP (Mean Average Precision):这个指标衡量的是推荐的准确性和排序质量。值越高越好。
    2. NDCG (Normalized Discounted Cumulative Gain):这个指标考虑了推荐项的位置,排在前面的推荐项权重更大。值越高越好。
    3. Precision@K:在前K个推荐中,有多少比例是用户真正喜欢的。
    4. Recall@K:在用户所有喜欢的项目中,有多少比例被包含在了前K个推荐中。

    接下来,我们还可以看看模型在评分预测方面的表现:

    print("Model:\tALS rating prediction",
          "RMSE:\t%f" % rating_eval.rmse(),
          "MAE:\t%f" % rating_eval.mae(),
          "Explained variance:\t%f" % rating_eval.exp_var(),
          "R squared:\t%f" % rating_eval.rsquared(), sep='\n')

    这里的指标包括:

    1. RMSE (Root Mean Square Error):预测评分与实际评分的平均差距。越小越好。
    2. MAE (Mean Absolute Error):预测评分与实际评分的平均绝对差。越小越好。
    3. Explained variance:模型解释的方差比例。越接近1越好。
    4. R squared:决定系数,表示模型的拟合优度。越接近1越好。

    🎭 结语:推荐系统的未来

    我们的ALS模型在MovieLens数据集上取得了不错的成绩,但这只是推荐系统的冰山一角。在实际应用中,还有很多因素需要考虑,比如用户的实时反馈、季节性趋势、热门事件等。

    推荐系统就像是一个永不停歇的导演,不断学习用户的喜好,为每个人导演一部专属的”电影人生”。随着深度学习、强化学习等新技术的发展,未来的推荐系统将会更加智能,更加个性化。

    也许有一天,推荐系统不仅能告诉你”看什么”,还能根据你的心情和当下的情境,告诉你”什么时候看”、”和谁一起看”,甚至为你量身定制一部前所未有的新电影!

    让我们一起期待推荐系统的未来,也许下一秒,它就会为你推荐一部改变人生的好电影呢!

    参考文献:

    1. Koren, Y., Bell, R., & Volinsky, C. (2009). Matrix factorization techniques for recommender systems. Computer, 42(8), 30-37.
    2. Harper, F. M., & Konstan, J. A. (2015). The movielens datasets: History and context. Acm transactions on interactive intelligent systems (tiis), 5(4), 1-19.
    3. Hu, Y., Koren, Y., & Volinsky, C. (2008). Collaborative filtering for implicit feedback datasets. In 2008 Eighth IEEE International Conference on Data Mining (pp. 263-272). IEEE.
    4. Rendle, S., Krichene, W., Zhang, L., & Anderson, J. (2020). Neural collaborative filtering vs. matrix factorization revisited. In Fourteenth ACM Conference on Recommender Systems (pp. 240-248).
    5. Smith, B., & Linden, G. (2017). Two decades of recommender systems at Amazon. com. IEEE Internet Computing, 21(3), 12-18.
  • iText2KG:利用大语言模型构建增量知识图谱的新方法

    🌍 引言

    在现代信息时代,数据以无结构的形式广泛存在,导致大量潜在的信息无法得到有效利用。知识图谱(KG)的自动构建对于将这些数据结构化、便于访问至关重要。这不仅使用户能够更有效地搜索信息,还能促进洞察、推理和推断。然而,传统的自然语言处理(NLP)方法,如命名实体识别和关系提取,虽然在信息检索中扮演着重要角色,但仍面临诸多挑战,比如依赖预定义的实体类别和需要监督学习的局限性。

    随着大型语言模型(LLM)的崛起,尤其是其在零样本或少样本学习中的应用,KG的构建迎来了新的机遇。然而,未解决的语义重复实体和关系仍然是一个挑战,导致图谱不一致,并需要大量后处理。为此,我们提出了一种名为 iText2KG 的方法,旨在利用LLM的强大能力,构建一致的知识图谱,且无需后处理。

    📚 相关工作

    现有的LLM基础知识图谱构建方法通常可分为三类:基于本体的、微调的和零样本或少样本学习方法。不同的研究展示了使用LLM进行知识图谱构建的潜力,但许多方法依赖于特定主题的知识或预定义的本体,限制了它们的通用性。因此,如何在各种应用场景中有效构建知识图谱,是一个亟待解决的问题。

    🔍 增量文本转知识图谱

    🎯 问题表述

    我们将知识图谱定义为 \mathcal{G} = (\mathcal{E}, \mathcal{R}),其中 \mathcal{E} 表示节点集合,\mathcal{R} 表示边集合。为了确保图谱的唯一性和一致性,我们设定了两个约束条件:每个实体和关系都必须描述一个语义上独特的概念,并且集合中的每个元素都不应重复。

    🌟 提出的方法

    iText2KG 方法由四个模块组成:文档提炼器、增量实体提取器、增量关系提取器和图谱整合器。这些模块在KG构建过程中各自发挥着独特的作用,特别是实体提取和关系提取任务的分离,有助于提高性能。

    1. 模块1 – 文档提炼器:该模块利用LLMs将输入文档重写为语义块,依据预定义的架构或蓝图提取特定的信息。
    2. 模块2 – 增量实体提取器:通过遍历所有语义块,提取全局文档实体并确保每个实体语义唯一。
    3. 模块3 – 增量关系提取器:利用全局文档实体和语义块提取全局文档关系,确保提取的关系与上下文一致。
    4. 模块4 – 图谱整合器:将全局实体和关系输入到Neo4j中,构建知识图谱并可视化。

    🔬 实验

    我们在多种场景下测试了iText2KG方法,包括将科学论文、网站和简历转换为知识图谱。我们采用了GPT-4作为实验基础,因为其在KG构建和推理任务中的优异表现。实验结果显示,iText2KG在一致性和精确性方面优于基线方法。

    📊 评估指标

    我们提出了一系列评估指标来量化模型的表现,包括:

    • 架构一致性:评估重写文本的内容是否与输入架构匹配。
    • 信息一致性:评估重写文本的语义与原始报告的一致性。
    • 三元组提取精度:评估提取的三元组与相应文本的一致性。
    • 实体/关系解析的误发现率:评估未解析的实体或关系在总提取实体或关系中的比例。

    🚀 结论

    通过这一系列研究,我们的iText2KG方法成功地构建了一个灵活且高效的知识图谱构建框架。其零样本学习的能力使其在没有大量监督学习的情况下,依然能够在多种应用场景中表现出色。未来的研究将聚焦于提升实体和关系匹配的精确度,进一步优化知识图谱的构建过程。


    参考文献

    1. Carta, S., et al. Iterative zero-shot LLM prompting for knowledge graph construction. arXiv preprint arXiv:2307.01128 (2023).
    2. Ding, L., et al. Automated construction of theme-specific knowledge graphs. arXiv preprint arXiv:2404.19146 (2024).
    3. Eberendu, A.C., et al. Unstructured data: an overview of the data of big data. International Journal of Computer Trends and Technology 38(1), 46–50 (2016).
    4. Hu, Y., et al. LLM-Tikg: Threat intelligence knowledge graph construction utilizing large language model. Available at SSRN 4671345 (2023).
    5. Zhu, Y., et al. LLMs for knowledge graph construction and reasoning: Recent capabilities and future opportunities. arXiv preprint arXiv:2305.13168 (2023).

    以上是关于iText2KG方法的综合概述,希望能够帮助读者更好地理解这一创新的知识图谱构建技术。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 5855 | UV: 2992
Last updated: 2025-06-20 07:09:20
沪ICP备2024052574号-1