推荐系统学习笔记-deep crossing

由来

2016年由微软提出, 完整的解决了特征工程、稀疏向量稠密化, 多层神经网络进行优化目标拟合等一系列深度学习在推荐系统的应用问题。 这个模型涉及到的技术比较基础,在传统神经网络的基础上加入了embedding, 残差连接等思想, 且结构比较简单。
DeepCrossing模型应用场景是微软搜索引擎Bing中的搜索广告推荐, 用户在输入搜索词之后, 搜索引擎除了返回相关结果, 还返回与搜索词相关的广告,Deep Crossing的优化目标就是预测对于某一广告, 用户是否会点击, 依然是点击率预测的一个问题。

要解决的问题

离散类(类别)特征编码后过于稀疏, 不利于直接输入神经网络训练, 需要解决稀疏特征向量稠密化的问题
如何解决特征自动交叉组合的问题
如何在输出层中达成问题设定的优化目标

模型结构

在这里插入图片描述
在这里插入图片描述

Embedding层

本层主要作用是降维。使用的是一个单层神经网路,具有如下形式

在这里插入图片描述

针对每个类别的特征都有一个Embedding操作,但是如果由于高维基数特征太大了,对于目标相关部分排序较低的进行衍生构造。也能降低Embedding部分的参数数量提高训练速度例如,CampaignID十分巨大,但对于点击率排序后10000以外的使用衍生特征来处理,最后一个编号为10000,且添加衍生为将所有ID对应的历史点击率组合成10001维的稠密矩阵,各个元素分别为对应ID的历史CTR,最后一个元素为剩余ID的平均CTR。通过降维引入衍生特征的方式,可以有效的减少高基数特征带来的参数量剧增问题。

其中,每个特征的维度压缩到256维,如果小于256维则直接连接到Stacking层。

Stacking层

主要是将Embedding部分的各个特征的向量进行拼接,小于256维度或者数值型特征不需要Embedding的直接拼接
得到

在这里插入图片描述

的拼接向量。

Residual Layers

首先是残差单元结构为:

在这里插入图片描述
这个残差模块与ResNet的不同是没有使用卷积操作,而是ReLu与线性部分的前向传播加(element-wise add)上输入再经过ReLu得到输出。
在这里插入图片描述
作者通过各种类型各种大小的实验发现,DeepCrossing具有很好的鲁棒性,推测可能是因为残差结构能起到类似于正则的效果,残差结构能更敏感的捕获输入输出之间的信息差 ,引入特征的交叉和非线性。

残差网络解决的问题:

  • 网络深度增加后,过拟合,通过残差网络的短路操作,起到正则化的作用,减少过拟合;
  • 网络深度增加后,梯度消失,所以使用ReLu激活函数,且短路操作相当于将上上层的梯度传递到下层,收敛更快。
  • 原结构使用了五个残差块,每个残差块的维度是512,512,256,128,64。

Scoring Layer

计算得分,即目标函数(objective function)的应用层。

在这里插入图片描述
二分类使用Sigmoid函数,多分类使用softmax函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于GroupLens的Book-Crossing数据集的Python书籍推荐系统的示例代码: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics.pairwise import cosine_similarity # 加载数据集 ratings = pd.read_csv('BX-Book-Ratings.csv', delimiter=';', error_bad_lines=False, encoding="latin-1") books = pd.read_csv('BX-Books.csv', delimiter=';', error_bad_lines=False, encoding="latin-1") users = pd.read_csv('BX-Users.csv', delimiter=';', error_bad_lines=False, encoding="latin-1") # 过滤掉评分次数少于50次的书籍 book_ratings_count = pd.DataFrame(ratings.groupby('ISBN')['Book-Rating'].count()) book_ratings_count = book_ratings_count[book_ratings_count['Book-Rating'] >= 50] book_ratings_count.reset_index(inplace=True) # 合并数据集 ratings = pd.merge(ratings, book_ratings_count, on='ISBN', how='inner') ratings.drop('Book-Rating_y', axis=1, inplace=True) ratings.rename(columns={'Book-Rating_x': 'Book-Rating'}, inplace=True) # 过滤掉评分次数少于50次的用户 user_ratings_count = pd.DataFrame(ratings.groupby('User-ID')['Book-Rating'].count()) user_ratings_count = user_ratings_count[user_ratings_count['Book-Rating'] >= 50] user_ratings_count.reset_index(inplace=True) # 合并数据集 ratings = pd.merge(ratings, user_ratings_count, on='User-ID', how='inner') ratings.drop('Book-Rating_y', axis=1, inplace=True) ratings.rename(columns={'Book-Rating_x': 'Book-Rating'}, inplace=True) # 构建评分矩阵 ratings_matrix = ratings.pivot_table(index='User-ID', columns='ISBN', values='Book-Rating') # 填充缺失值 ratings_matrix.fillna(0, inplace=True) # 计算相似度矩阵 cosine_sim = cosine_similarity(ratings_matrix) # 定义函数:获取相似的书籍 def get_similar_books(book_title, cosine_sim=cosine_sim): idx = books[books['Book-Title'] == book_title].index[0] sim_scores = list(enumerate(cosine_sim[idx])) sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True) sim_scores = sim_scores[1:11] book_indices = [i[0] for i in sim_scores] return books['Book-Title'].iloc[book_indices] # 测试 book_title = 'The Da Vinci Code' print('对于书籍:', book_title, '的推荐如下:') print(get_similar_books(book_title)) ``` 这个示例代码使用了基于内容的推荐算法,通过计算书籍的相似度来进行推荐。具体实现中,首先加载了Book-Crossing数据集,并过滤掉了评分次数过少的书籍和用户。然后,构建了评分矩阵,并计算了相似度矩阵。最后,定义了一个函数,通过输入书籍名称,返回相似度最高的10本书籍。 需要注意的是,这个示例代码只是一个基础的框架,实际使用时需要根据具体业务需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值