龙空技术网

Shein数字化奇妙之法系列-2 推荐系统中的推荐模型

数字现代化战略 93

前言:

今天我们对“random walk算法”大致比较注重,你们都想要了解一些“random walk算法”的相关资讯。那么小编同时在网络上搜集了一些对于“random walk算法””的相关知识,希望朋友们能喜欢,朋友们快快来了解一下吧!

要在个性化推荐算法上获得竞争优势,关键是拥有海量的用户数据与强大的算法实力。但数据与算法本身的作用依然有限,真正发挥推荐系统价值还需要人工智能与业务团队的密切配合,需要对用户与场景的深入理解,需要不断学习与优化,以让推荐结果真正与用户需求与体验相契合。个性化推荐需要人与技术的有机结合,需要培养敏锐的用户洞察力与数据思维,需要构建一支跨领域的人才队伍,需要执行以技术驱动业务,以业务导向技术的发展战略。

在推荐模型算法训练的过程中,需要不断优化模型,调整模型参数和模型结构,同时优化推荐策略与结合业务场景,最终达到提高推荐准确率与用户转化效果的目的。还需要避免过度依赖单一算法或数据源,可以采用模型融合等技术整合多种推荐算法的结果,以提高推荐的多样性与准确性。

个性化推荐算法需要大量用户数据进行训练,才能更准确地理解用户偏好并进行推理。训练部分主要包含:

1. 收集用户浏览与行为数据:收集用户在Shein平台的浏览历史、收藏、购买等交互数据,为模型提供输入与监督。

2. 构建用户特征:根据用户的数据构建用户的特征向量,包含用户的年龄、性别、地域特征以及用户的兴趣标签等。

3. 构建商品特征:根据商品信息构建商品的特征向量,包含商品的品类、价格、品牌、产地等特征。

4. 训练推荐模型:将用户特征、商品特征、用户交互数据输入推荐模型,通过机器学习训练模型参数,学习用户对商品的偏好。常用的模型有协同过滤模型、内容推荐模型等。

具体的代码示例:

python

# 收集用户浏览数据

user_actions = collect_user_actions()

# 构建用户特征

user_features = build_user_features(user_actions)

# 构建商品特征

item_features = build_item_features(item_metadata)

# 定义推荐模型

model = RecommendationModel()

# 训练模型

for user_id, user_feature in user_features.items():

for action in user_actions[user_id]:

model.train(user_feature, item_features[action.item_id], action.action_type)

# 测试模型

for user_id in random_users:

rec_items = model.recommend(user_features[user_id], k=10)

我们今天具体探讨如何定义推荐模型:

第一部分: 常用的推荐模型

在个性化推荐系统中,推荐模型是将用户特征、商品特征与用户行为数据转化为推荐结果的关键组件。常用的推荐模型主要包含:

模型1. 协同过滤模型:基于用户之间的相似度或商品之间的相似度进行推荐。如用户-用户CF模型、商品-商品CF模型以及更高级的矩阵分解等。

模型2. 内容推荐模型:基于商品的特征信息进行推荐,主要用于商品信息结构化的场景。如基于文本的推荐、图像推荐等。

模型3. 混合推荐模型:整合协同过滤模型与内容推荐模型的结果,以发挥各自的优势,提高推荐效果。

模型1:协同过滤推荐模型示例:

python

class UserCFRecommender:

def __init__(self):

self.user_sim_matrix = None

def train(self, user_features, item_features, user_actions):

# 计算用户之间的相似度矩阵

self.user_sim_matrix = compute_user_similarity(user_features)

def recommend(self, user_id, k):

# 找到与当前用户最相似的k个用户

sim_users = find_k_similar_users(self.user_sim_matrix, user_id, k)

# 取出相似用户对商品的行为数据

actions = get_user_actions(sim_users)

# 统计各商品的推荐度

rec_scores = defaultdict(int)

for action in actions:

if action.item_id not in rec_items[user_id]:

rec_scores[action.item_id] += sim_users[action.user_id]

# 返回推荐度最高的k个商品

return sorted(rec_scores.items(), key=lambda x: x[1], reverse=True)[:k]

该模型主要包含:

1. train方法:训练用户相似度矩阵,记录用户之间的相似性。

2. recommend方法:找到与当前用户最相似的k个用户,统计这k个用户对商品的行为数据,得出各商品的推荐度,返回推荐度最高的k个商品。

3. user_sim_matrix:记录用户之间相似度的矩阵,是模型的关键参数。

在实际应用中,Shein需要不断优化模型,调整sim_matrix的计算方式与k的大小,优化推荐策略与结合业务场景,最终达到提高推荐准确率与用户转化效果的目的。Shein还可以采用更复杂的模型来进一步提高推荐质量,但模型的作用仍需与数据、业务场景与人工智能相结合,最终指向用户需求与体验。

模型2 推荐模型示例

基于商品内容信息进行推荐,主要用于商品信息结构化的场景。一个简单的内容推荐模型示例如下:

python

class ContentRecommender:

def __init__(self):

self.item_profiles = None # 商品特征矩阵

def train(self, item_features):

# 构建商品特征矩阵

self.item_profiles = np.array(list(item_features.values()))

def recommend(self, user_id, k):

# 取得用户喜欢的商品

liked_items = get_user_liked_items(user_id)

# 取出用户喜欢商品的特征

liked_item_profiles = self.item_profiles[liked_items]

# 计算所有商品与用户喜欢商品的相似度

sim_scores = self.item_profiles.dot(liked_item_profiles.T)

# 对相似度排序并取前k个商品

top_k = np.argsort(-sim_scores, axis=0)[:k]

# 返回相似度最高的k个商品

return [self.item_features[i] for i in top_k]

该模型主要包含:

1. train方法:构建商品特征矩阵,记录所有商品的特征向量。

2. recommend方法:找到用户喜欢的商品,取出这些商品的特征,计算所有商品与喜欢商品的相似度,返回相似度最高的k个商品。

3. item_profiles:记录商品特征矩阵,是模型的关键参数。

该模型的缺点是无法处理新商品的推荐,因为新商品的特征向量还未构建。Shein可以通过模型融合的方式,将内容推荐模型与协同过滤模型的结果结合,既利用商品特征进行精确推荐,又能处理新商品推荐,以发挥二者的优势。

内容推荐模型能较好捕捉商品特征带来的推荐信号,但其作用还是依赖大量商品特征与用户行为数据,以及人工对数据与模型的不断优化。Shein需要在数据与算法之间持续学习,需要培养敏锐的用户洞察力与数据思维,需要让研发与业务部门紧密协作,以让推荐系统结果真正符合用户需求。技术终将更新,理解用户与把握业务才是推荐系统价值的源泉。

模型3 混合推荐模型

是将协同过滤模型与内容推荐模型的结果整合,以发挥各自的优势,提高推荐效果。一个简单的混合推荐模型示例如下:

python

class HybridRecommender:

def __init__(self):

self.user_cf_rec = UserCFRecommender()

self.content_rec = ContentRecommender()

def train(self, user_features, item_features, user_actions):

self.user_cf_rec.train(user_features, item_features, user_actions)

self.content_rec.train(item_features)

def recommend(self, user_id, k):

# 获取两个模型的推荐结果

user_cf_rec_items = self.user_cf_rec.recommend(user_id, k)

content_rec_items = self.content_rec.recommend(user_id, k)

# 融合两个推荐结果

fusion_rec = merge_recommendation(user_cf_rec_items, content_rec_items)

# 返回融合后的推荐结果

return fusion_rec[:k]

该模型主要包含:

1. user_cf_rec:协同过滤推荐模型,提供基于用户行为的推荐结果。

2. content_rec:内容推荐模型,提供基于商品特征的推荐结果。

3. recommend方法:分别获取两个模型的推荐结果,通过merge_recommendation方法融合两个结果,返回融合后的推荐商品。

4. merge_recommendation方法:负责具体的结果融合策略,可以基于相似度,基于排名等进行结果融合。

该模型能发挥协同过滤模型与内容推荐模型的优势,通过模型融合手段提高推荐效果。但其作用仍依赖大量数据与算法,以及人工对数据与模型的不断优化。Shein需要培养敏锐的用户洞察力与数据思维,需要让研发与运营部门紧密协作,持续学习与提高,最终达到理解用户与把握业务的目的。

3个模型(协同过滤、内容推荐和混合推荐)的推荐结果示例:

OK,这里提供3个模型(协同过滤,内容推荐和混合推荐)的推荐结果正确示例:

1. 协同过滤模型

用户ID: 1001

商品ID: 231

推荐度: 0.83

2. 内容推荐模型

用户ID: 1001

商品ID: 982

相似度: 0.88

3. 混合推荐模型

用户ID: 1001

商品推荐:

商品ID: 231

综合得分: 0.57 (0.83 * 0.6 + 0 * 0.4)

商品ID: 982

综合得分: 0.352 (0 * 0.6 + 0.88 * 0.4)

计算步骤:

1) 协同过滤模型商品231推荐度:0.83

2) 内容推荐模型商品982相似度:0.88

3) 权重:协同过滤模型为0.6,内容推荐模型为0.4

4) 商品231: 0.83 * 0.6 + 0 * 0.4 = 0.57

5) 商品982: 0 * 0.6 + 0.88 * 0.4 = 0.352

其中,当某模型的推荐结果为0时,权重也变为0,仅参与相似度不为0的模型计算。

综上,混合推荐模型的计算思路是:

如果协同过滤结果>0 且 内容推荐结果>0:

综合得分 = 协同过滤结果 * 权重1 + 内容推荐结果 * 权重2

如果协同过滤结果=0:

综合得分 = 0 * 权重1 + 内容推荐结果 * 权重2

如果内容推荐结果=0:

综合得分 = 协同过滤结果 * 权重1 + 0 * 权重2

其中权重1和权重2为各模型的权重比例,根据模型效果调整。

这是一个比较简单但重要的例子,阐明了混合推荐模型的基本计算思路与过程。但实际产品中的推荐计算会复杂得多,需要基于更丰富的算法、数据与特征实现。

更加复杂的例子:包含10个单模型的混合推荐模型

这个高度复杂的示例利用10个不同模型获得的推荐结果进行融合,涉及更加丰富的数据与算法,可以产生更加准确的推荐。但也带来更高的实现难度与挑战:

1) 需要获得更加丰富的用户与商品数据作为输入

2) 需要深入理解各模型原理与产出,理解不同模型的优劣势

3) 需要设计有效的模型融合方案与动态权重调整机制

4) 需要对大量模型产出进行管理、 Evaluation与优化

5) 需要更强大的技术实力与跨领域的人才支持这些模型的开发与优化

用户ID: 1001

推荐商品:

商品ID: 231

综合得分: 0.827 (0.6*0.1 + 0.8*0.15 + 0.7*0.05 + 0.5*0.1 + 0.75*0.05 + 0.65*0.05

+ 0.9*0.1 + 0*0.1 + 0.85*0.2 + 0.95*0.15 )

商品ID: 982

综合得分: 0.701 (0.5*0.1 + 0*0.15 + 0.9*0.05 + 0.8*0.1 + 0.65*0.05+ 0.7*0.05

+ 0*0.1 + 0.75*0.1 + 0.92*0.2 + 0.88*0.15)

1) 10个单模型:

A) 协同过滤模型: 商品231推荐度0.6,商品982推荐度0.5

B) 物品属性模型:商品231相似度0.8,商品982相似度0

C) 用户兴趣模型1:商品231相似度0.7,商品982相似度0.9

D) 时间因子模型1:商品231相似度0.5,商品982相似度0.8

E) 地域因子模型:商品231相似度0.75,商品982相似度0.65

F) 上下文模型:商品231相似度0.65,商品982相似度0.7

G) 社交模型:商品231相似度0.9,商品982相似度0

H) 竞品模型:商品231相似度0,商品982相似度0.75

I) 生命周期模型:商品231相似度0.85,商品982相似度0.92

J) 用户兴趣模型2:商品231相似度0.95,商品982相似度0.88

2) 10个模型权重:

A: 0.1 B: 0.15 C: 0.05 D: 0.1

E: 0.05 F: 0.05 G: 0.1 H: 0.1

I: 0.2 J: 0.15

3) 商品231:

0.6 * 0.1 + 0.8 * 0.15 + 0.7 * 0.05 + 0.5 * 0.1 + 0.75* 0.05 + 0.65 * 0.05

+ 0.9 * 0.1 + 0 * 0.1 + 0.85 * 0.2 + 0.95 * 0.15 = 0.827

4) 商品982:

0.5 * 0.1 + 0 * 0.15 + 0.9 * 0.05 + 0.8 * 0.1 + 0.65 * 0.05 + 0.7 * 0.05

+ 0 * 0.1 + 0.75 * 0.1 + 0.92 * 0.2 + 0.88 * 0.15 = 0.701

50个单模型的超大规模混合推荐系统的考虑:

1) 50个单模型:

包含基于协同过滤,内容推荐,社交网络,生命周期,上下文,时间序列等的大量算法模型。每个模型会产生一个推荐结果作为输入。

2) 50个模型权重:

每个模型权重在0到1之间,总和为1。权重根据历史效果、算法本身性能、场景特征等综合评估动态调整。

这个超大规模的混合推荐模型可以最大限度地利用各种算法与数据的优势,综合产生最准确的推荐结果。但其复杂度也极高:

1) 需要海量丰富的数据与算力作为支撑

2) 需要深入理解几十种不同推荐算法与模型,熟练掌握其优缺点

3) 模型融合与权重设置的难度成倍增加,需要极强的统计与优化能力

4) 需要大规模的计算资源与模型训练环境

5) 需要具备极强的跨领域知识与技能的人才团队共同设计、开发与优化

这需要推荐技术与商业领域的深度融合,需要具备系统思维的人才,需要不断推动跨学科与跨领域的学习与合作。

要实现一个超大规模的高性能推荐系统,算法与技术虽重要,但更关键的是人才与思维模式。需要构建一个既具备技术深度又具备商业敏锐度的跨领域人才队伍,需要培养一种同时聚焦细节与把握全局的思维,需要推动理性分析与丰富直觉的相互促进。

训练20个单模型的详细信息

要实现这20个模型的训练与应用,Shein需要:

1) 收集海量用户数据、商品数据、评论数据、互动数据等作为输入

2) 深入理解各个推荐算法与模型的工作原理

3) 具备雄厚的编程能力、机器学习与深度学习知识,可以独立开发复杂的推荐模型

4) 拥有强大的计算环境,可以支持大规模机器学习模型的训练

5) 人才团队在相关领域有丰富的实践经验,熟练掌握模型开发、调优与落地

模型的详细信息与训练代码:

1) 协同过滤模型:

- 数据:用户-商品评分矩阵

- 算法:基于物品的协同过滤算法ItemCF

- 模型:物品之间的相似度矩阵及推荐列表

- 训练代码:

python

from sklearn.metrics.pairwise import pairwise_distances

user_item_matrix = pd.read_csv('../data/user_item_matrix.csv')

item_similarity = 1 - pairwise_distances(user_item_matrix, metric='cosine')

item_list = item_similarity.argsort()[:, ::-1]

2) 词向量相似度模型:

- 数据:商品描述文本

- 算法:Word2Vec词向量训练方法

- 模型:每个商品的词向量

- 训练代码:

python

from gensim.models import Word2Vec

item_desc = pd.read_csv('../data/item_desc.csv')

model = Word2Vec(item_desc, size=200, window=5, min_count=5, workers=4)

model.save('word2vec_model.model')

3) RNN情感分析模型:

- 数据:商品评论文本

- 算法:LSTM神经网络

- 模型:LSTM分类模型

- 训练代码:

python

import keras

from keras.models import Sequential

from keras.layers import Dense, LSTM, Embedding

comments = pd.read_csv('../data/comments.csv')

model = Sequential()

model.add(Embedding(10000, 8, input_length=100))

model.add(LSTM(100))

model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

model.fit(comments, epochs=10, batch_size=64)

4) 基于规则的生命周期模型:

- 数据:用户购买记录、浏览记录

- 算法:设定购买周期阈值及重复购买率阈值

- 模型:无

- 训练:无须训练,直接根据规则设定获得推荐结果

5) Matrix Factorization模型:

- 数据:用户-商品评分矩阵

- 算法:SVD矩阵分解

- 模型:用户特征矩阵、商品特征矩阵

- 训练代码:

python

from sklearn.decomposition import SVD

user_item_matrix = pd.read_csv('../data/user_item_matrix.csv')

svd = SVD(n_components=12, random_state=1)

user_matrix = svd.fit_transform(user_item_matrix)

item_matrix = svd.components_

6) 基于内容的推荐:

- 数据:商品描述文本、商品类别

- 算法:TF-IDF,TextRank关键词提取

- 模型:关键词 - 商品映射

- 训练代码:

python

from sklearn.feature_extraction.text import TfidfVectorizer

item_desc = pd.read_csv('../data/item_desc.csv')

tfidf = TfidfVectorizer()

keywords = tfidf.fit_transform(item_desc)

keywords = tfidf.get_feature_names()

7) 知识图谱推荐:

- 数据:商品关系知识图谱

- 算法:Random Walk算法

- 模型:知识图谱

- 训练:构建商品类别、品牌、功能等节点及关系,随机游走获得推荐结果

8) AES与CNN融合推荐:

- 数据:商品图片

- 算法:AutoEncoder与CNN

- 模型:AES模型、CNN模型、融合模型

- 训练代码:

python

from keras.models import Model

from keras.layers import Input, Dense, Convolution2D, MaxPooling2D, Flatten

# AutoEncoder模型

inputs = Input(shape=(784,))

encoded = Dense(128, activation='relu')(inputs)

decoded = Dense(784, activation='sigmoid')(encoded)

autoencoder = Model(inputs, decoded)

# CNN模型

input_img = Input(shape=(28, 28, 1))

x = Convolution2D(32, 3, 3, activation='relu', padding='same')(input_img)

x = MaxPooling2D((2, 2), padding='same')(x)

x = Convolution2D(32, 3, 3, activation='relu', padding='same')(x)

encoded = MaxPooling2D((2, 2), padding='same')(x)

x = Flatten()(encoded)

x = Dense(128, activation='relu')(x)

# 融合模型

concatenated = keras.layers.concatenate([encoded, x])

output = Dense(10, activation='softmax')(concatenated)

model = Model(inputs=[input_img, inputs], outputs=output)

continues to supplement the details and training codes of 8 models:

9) xgboost机器学习推荐:

- 数据:用户特征、商品特征、用户-商品交互特征

- 算法:xgboost机器学习

- 模型:xgboost模型

- 训练代码:

python

import xgboost as xgb

# 用户特征

user_features = pd.read_csv('../data/user_features.csv')

# 商品特征

item_features = pd.read_csv('../data/item_features.csv')

# 用户-商品交互特征

interaction_features = pd.read_csv('../data/interaction_features.csv')

# 训练集与测试集

split = int(0.8*len(interaction_features))

x_train, x_val, y_train, y_val = train_test_split(interaction_features, target, test_size=0.2, random_state=1)

# 模型训练

xgb_model = xgb.XGBClassifier().fit(x_train, y_train)

# 预测得分

preds = xgb_model.predict_proba(x_val)[:,1]

10) 神经网络推荐:

- 数据:用户特征、商品特征、历史交互

- 算法:Wide&Deep神经网络

- 模型:Wide&Deep模型

- 训练代码:

python

# 用户特征

user_features = pd.read_csv('../data/user_features.csv')

# 商品特征

item_features = pd.read_csv('../data/item_features.csv')

# 历史交互

train_data = pd.read_csv('../data/train_data.csv')

# 构建Wide部分

wide_columns = user_features.columns + item_features.columns

wide = Input(shape=(len(wide_columns),))

# 构建Deep部分

deep_columns = train_data.columns

deep = Input(shape=(len(deep_columns),))

# Wide部分

wide_out = Dense(256, activation='relu')(wide)

wide_out = Dense(128, activation='relu')(wide_out)

# Deep部分

deep_out = Dense(256, activation='relu')(deep)

deep_out = Dense(128, activation='relu')(deep_out)

# 连接Wide和Deep

both = keras.layers.concatenate([wide_out, deep_out])

both = Dense(256, activation='relu')(both)

both = Dense(1, activation='sigmoid')(both)

# 构建Wide&Deep模型

model = Model(inputs=[wide, deep], outputs=both)

11) LSTM序列推荐:

- 数据:用户行为序列数据

- 算法:LSTM神经网络

- 模型:LSTM序列模型

- 训练代码:

python

from keras.models import Sequential

from keras.layers import Dense, LSTM

# 用户行为序列

user_seqs = pd.read_csv('../data/user_seqs.csv')

model = Sequential()

model.add(LSTM(128, input_shape=(10, 1)))

model.add(Dense(32, activation='relu'))

model.add(Dense(1))

model.compile(loss='mse', optimizer='adam')

model.fit(user_seqs, epochs=50, batch_size=32)

12) BERT推荐:

- 数据:评论文本

- 算法:BERT pré-trained model

- 模型:BERT模型

- 训练代码:

python

from transformers import BertTokenizer, TFBertForSequenceClassification

# BERT分词器

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 评论文本

comments = pd.read_csv('../data/comments.csv')

# 分词

input_ids = []

attention_masks = []

for text in comments:

inputs = tokenizer.encode_plus(

text,

max_length=128,

padding="max_length",

truncation=True,

return_attention_mask=True,

return_tensors='tf'

)

input_ids.append(inputs['input_ids'])

attention_masks.append(inputs['attention_mask'])

# 构建BERT模型

model = TFBertForSequenceClassification.from_pretrained(

'bert-base-uncased',

num_labels = 2

)

model.fit(

input_ids = input_ids,

attention_mask= attention_masks,

epochs = 2

)

13) DIN推荐:

- 数据:用户行为日志、商品描述、类别

- 算法:Deep Interest Network

- 模型:DIN模型

- 训练代码:

python

from keras.layers import Input, Dense, Embedding, MaxPooling1D, Flatten

from keras.models import Model

# 用户行为序列

user_seqs = pd.read_csv('../data/user_seqs.csv')

# 商品描述

item_desc = pd.read_csv('../data/item_desc.csv')

# 商品类别

item_cate = pd.read_csv('../data/item_cate.csv')

# 构建用户兴趣模型

user_input = Input(shape=(10,))

user_vec = Dense(8)(user_input)

# 构建商品模型

item_desc_input = Input(shape=(50,))

item_desc_vec = Embedding(10000, 8)(item_desc_input)

item_desc_vec = flatten(MaxPooling1D(5)(item_desc_vec))

item_cate_input = Input(shape=(10,))

item_cate_vec = Embedding(1000, 8)(item_cate_input)

item_cate_vec = flatten(MaxPooling1D(5)(item_cate_vec))

item_vec = keras.layers.concatenate([item_desc_vec, item_cate_vec])

# 兴趣点积模型

interests = keras.layers.dot([user_vec, item_vec], axes=-1)

# DIN模型

model = Model(inputs=[user_input, item_desc_input, item_cate_input], outputs=interests)

model.compile(optimizer='adam', loss='binary_crossentropy')

model.fit([user_seqs, item_desc, item_cate], epochs=10)

14) CTR预估:

- 数据:用户特征、广告特征、历史 CTR

- 算法:logistic回归、FM、FFM 、DeepFM等

- 模型:CTR预估模型

- 训练代码:以DeepFM为例

python

from deepctr.models import DeepFM

from deepctr.feature_column import SparseFeat, DenseFeat, get_feature_names

# 用户特征

user_features = pd.read_csv('../data/user_features.csv')

# 广告特征

ad_features = pd.read_csv('../data/ad_features.csv')

# 标签

train_label = pd.read_csv('../data/train_label.csv')

# 构造特征

user_feature_columns = [SparseFeat('user_id', user_features['user_id'], 8),

SparseFeat('age', user_features['age'], 3),

SparseFeat('gender', user_features['gender'], 2)]

ad_feature_columns = [SparseFeat('ad_id', ad_features['ad_id'], 8),

SparseFeat('product_id', ad_features['product_id'], 3),

DenseFeat('price', 1)]

# 构建DeepFM模型

model = DeepFM({"user": user_feature_columns, "ad": ad_feature_columns}, final_activation='sigmoid')

# 模型训练

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['auc'])

model.fit({**user_features, **ad_features}, train_label, epochs=10, batch_size=256,)

15) Knowledge Graph推荐:

- 数据:知识图谱数据

- 算法:TransE, TransH, TransR, RESCAL等知识图谱嵌入算法

- 模型:知识图谱嵌入模型

- 训练代码:以TransE为例

python

import torch

import torch.nn as nn

# 实体与关系映射

ent2id = {}

rel2id = {}

# 训练数据

triples = []

# TransE模型

class TransE(nn.Module):

def __init__(self, ent_tot, rel_tot, dim=100):

super(TransE, self).__init__()

self.ent_emb = nn.Embedding(ent_tot, dim)

self.rel_emb = nn.Embedding(rel_tot, dim)

def forward(self, e1, r, e2):

e1_emb = self.ent_emb(e1)

r_emb = self.rel_emb(r)

e2_emb = self.ent_emb(e2)

return torch.norm(e1_emb + r_emb - e2_emb, p=2, dim=1)

# 训练TransE

model = TransE(len(ent2id), len(rel2id))

optimizer = torch.optim.Adam(model.parameters())

for epoch in range(100):

total_loss = 0

for e1, r, e2 in triples:

e1, r, e2 = e1.cuda(), r.cuda(), e2.cuda()

loss = model(e1, r, e2)

total_loss += loss.mean()

optimizer.zero_grad()

loss.backward()

optimizer.step()

16) VAE推荐:

- 数据:用户-商品交互矩阵

- 算法:变分自动编码器VAE

- 模型:VAE模型

- 训练代码:

python

import torch

import torch.nn as nn

# 训练数据

user_item_matrix = torch.tensor(np.array(pd.read_csv('../data/user_item_matrix.csv')))

# VAE模型

class VAE(nn.Module):

def __init__(self, input_dim, latent_dim):

super(VAE, self).__init__()

self.Encoder = nn.Sequential(nn.Linear(input_dim, 500), nn.ReLU(),

nn.Linear(500, latent_dim*2))

self.Decoder = nn.Sequential(nn.Linear(latent_dim, 500), nn.ReLU(),

nn.Linear(500, input_dim))

def reparameterize(self, mu, logvar):

std = torch.exp(0.5*logvar)

eps = torch.randn_like(std)

return mu + eps*std

def forward(self, x):

mu, logvar = self.Encoder(x).chunk(2, dim=1)

z = self.reparameterize(mu, logvar)

recon_x = self.Decoder(z)

return recon_x, mu, logvar

# VAE模型训练

model = VAE(user_item_matrix.shape[1], 100)

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

for epoch in range(100):

recon_x, mu, logvar = model(user_item_matrix)

recons_loss = F.binary_cross_entropy(recon_x, user_item_matrix, reduction='sum')

kld_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())

loss = recons_loss + kld_loss

optimizer.zero_grad()

loss.backward()

optimizer.step()

对上述16个模型进行测试,需要考虑以下几个方面:

1) 测试数据:根据模型所需数据格式准备测试数据,如用户特征、商品特征、用户行为日志、评论文本等。测试数据要从总体数据中随机抽取,并确保训练集与测试集完全隔离。

2) 准确率指标:对于分类模型(如情感分析)计算 precision、recall、F1 score;对于推荐模型计算召回率、精确率等。选取合适的评价指标以全面评估模型效果。

3) 查看掉点:观察模型对哪些样本的预测效果较差,分析 model 在什么样的数据或什么样的场景下表现不佳,此可为后续提高模型效果提供方向。

4) Error 分析:分析模型错误预测的样本,找出错误预测的根本原因,分为数据错误、算法错误和模型本身错误三种情况。根据错误分析结果提出改进措施。

5) 模型融合:对多个模型的预测结果进行加权融合,可获得更优的综合效果。模型融合可避免单一模型的过拟合问题,融合后的推荐效果通常优于任单一模型。

6) 用户 satisfaction: 对推荐结果满意度评价,是评价推荐系统最终效果的重要指标。满意度评价需要设置推荐结果展示的试验环境,让用户对不同模型或不同策略的推荐结果进行评级。

7) A/B test:在真实业务环境下,将新模型与现有模型同时上线,对两种模型推荐结果的关键指标(如点击率、销售额等)进行A/B test,选择效果更优的模型投入使用。这是评价推荐算法效果最为可靠的方式。

综上,测试推荐系统涉及 数据、指标选取、模型融合、用户满意度等多个层面。Shein 应建立系统的测试体系,不断检验模型及系统的效果,及时发现存在的问题并进行修复,最终达到发挥算法与模型最大效能的目的。

这其中,A/B测试是评估新推荐算法效果最可靠的方式之一,下一次探索A/B test

标签: #random walk算法