Fun-Rec项目中的推荐系统特征工程实践
fun-rec 项目地址: https://gitcode.com/gh_mirrors/fu/fun-rec
特征工程概述
在推荐系统中,特征工程是构建高效模型的关键环节。本文将详细介绍如何在Fun-Rec项目中构建推荐系统的特征工程,包括特征提取、监督学习数据集的构建以及特征优化技巧。
原始数据特征分析
在开始特征工程之前,我们需要充分理解原始数据中可用的特征:
-
文章自身特征:
category_id
:文章类型标识created_at_ts
:文章创建时间戳,反映时效性words_count
:文章字数,反映阅读难度
-
内容嵌入特征:
- 文章内容Embedding(可用于相似度计算)
- Word2Vec等词嵌入特征
-
用户设备特征:
- 用户设备信息(可用于用户画像构建)
监督学习数据集构建
数据集构建思路
- 基于召回结果构建三元组形式的数据集:
(user_id, item_id, label)
- 正样本:用户实际点击的文章
- 负样本:召回但未被点击的文章
负采样策略
由于正负样本比例极度不平衡,我们需要进行负采样:
- 仅对负样本进行下采样
- 保证采样后所有用户和文章仍然存在
- 采样比例可人工控制(默认0.1%)
- 采样后更新用户召回文章列表
def neg_sample_recall_data(recall_items_df, sample_rate=0.001):
pos_data = recall_items_df[recall_items_df['label']==1]
neg_data = recall_items_df[recall_items_df['label']==0]
# 分组采样函数
def neg_sample_func(group_df):
sample_num = max(int(len(group_df)*sample_rate), 1)
return group_df.sample(n=sample_num)
# 对用户和文章分别采样
neg_data_user_sample = neg_data.groupby('user_id').apply(neg_sample_func)
neg_data_item_sample = neg_data.groupby('sim_item').apply(neg_sample_func)
# 合并并去重
neg_data_new = neg_data_user_sample.append(neg_data_item_sample).drop_duplicates()
return pd.concat([pos_data, neg_data_new])
特征构建方法
用户历史行为特征
基于用户历史点击行为构建以下特征:
-
相似性特征:
- 候选item与最后N次点击的相似度(Embedding内积)
- 相似度的统计特征(最大、最小、均值)
-
字数差异特征:
- 候选item与历史点击文章的字数差
-
时间差特征:
- 候选item与历史点击文章的时间差
-
用户-物品相似性特征:
- 用户Embedding与候选item Embedding的相似度
def create_feature(users_id, recall_list, click_hist_df, articles_info, articles_emb, N=5):
all_user_feas = []
for user_id in users_id:
# 获取用户最后N次点击
hist_items = click_hist_df[click_hist_df['user_id']==user_id]['click_article_id'][-N:]
for article_id, score, label in recall_list[user_id]:
# 计算与历史点击的相似度
sim_scores = [cosine_similarity(articles_emb[article_id],
articles_emb[h_item]) for h_item in hist_items]
# 构建特征向量
features = {
'user_id': user_id,
'article_id': article_id,
'sim_max': max(sim_scores),
'sim_mean': np.mean(sim_scores),
'words_diff': abs(articles_info[article_id]['words_count'] -
articles_info[hist_items[-1]]['words_count']),
'time_diff': articles_info[article_id]['created_at_ts'] -
articles_info[hist_items[-1]]['created_at_ts']
}
all_user_feas.append(features)
return pd.DataFrame(all_user_feas)
特征优化技巧
内存优化
处理大规模数据时,内存优化至关重要:
def reduce_mem(df):
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
for col in df.columns:
col_type = df[col].dtypes
if col_type in numerics:
c_min, c_max = df[col].min(), df[col].max()
if str(col_type)[:3] == 'int':
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
# 其他类型判断...
else:
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16)
# 其他类型判断...
return df
Word2Vec特征提取
使用Word2Vec提取文章序列特征:
from gensim.models import Word2Vec
def train_item_word2vec(click_df, embed_size=64):
# 转换文章ID为字符串
click_df['click_article_id'] = click_df['click_article_id'].astype(str)
# 按用户分组构建句子
docs = click_df.groupby('user_id')['click_article_id'].apply(list).tolist()
# 训练Word2Vec模型
w2v = Word2Vec(docs, size=embed_size, window=5, min_count=1, workers=4)
# 保存嵌入向量
return {k: w2v[k] for k in w2v.wv.vocab}
总结
本文详细介绍了Fun-Rec项目中推荐系统特征工程的实践方法,包括:
- 监督学习数据集的构建方法
- 基于用户历史行为的特征提取
- 负采样策略的实现
- 内存优化技巧
- Word2Vec特征提取方法
这些技术可以帮助构建更高效的推荐模型,在实际应用中需要根据具体业务场景调整特征组合和参数设置。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考