Fun-Rec项目中的推荐系统特征工程实践

Fun-Rec项目中的推荐系统特征工程实践

fun-rec fun-rec 项目地址: https://gitcode.com/gh_mirrors/fu/fun-rec

特征工程概述

在推荐系统中,特征工程是构建高效模型的关键环节。本文将详细介绍如何在Fun-Rec项目中构建推荐系统的特征工程,包括特征提取、监督学习数据集的构建以及特征优化技巧。

原始数据特征分析

在开始特征工程之前,我们需要充分理解原始数据中可用的特征:

  1. 文章自身特征

    • category_id:文章类型标识
    • created_at_ts:文章创建时间戳,反映时效性
    • words_count:文章字数,反映阅读难度
  2. 内容嵌入特征

    • 文章内容Embedding(可用于相似度计算)
    • Word2Vec等词嵌入特征
  3. 用户设备特征

    • 用户设备信息(可用于用户画像构建)

监督学习数据集构建

数据集构建思路

  1. 基于召回结果构建三元组形式的数据集:(user_id, item_id, label)
  2. 正样本:用户实际点击的文章
  3. 负样本:召回但未被点击的文章

负采样策略

由于正负样本比例极度不平衡,我们需要进行负采样:

  1. 仅对负样本进行下采样
  2. 保证采样后所有用户和文章仍然存在
  3. 采样比例可人工控制(默认0.1%)
  4. 采样后更新用户召回文章列表
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])

特征构建方法

用户历史行为特征

基于用户历史点击行为构建以下特征:

  1. 相似性特征

    • 候选item与最后N次点击的相似度(Embedding内积)
    • 相似度的统计特征(最大、最小、均值)
  2. 字数差异特征

    • 候选item与历史点击文章的字数差
  3. 时间差特征

    • 候选item与历史点击文章的时间差
  4. 用户-物品相似性特征

    • 用户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项目中推荐系统特征工程的实践方法,包括:

  1. 监督学习数据集的构建方法
  2. 基于用户历史行为的特征提取
  3. 负采样策略的实现
  4. 内存优化技巧
  5. Word2Vec特征提取方法

这些技术可以帮助构建更高效的推荐模型,在实际应用中需要根据具体业务场景调整特征组合和参数设置。

fun-rec fun-rec 项目地址: https://gitcode.com/gh_mirrors/fu/fun-rec

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

解岭芝Madeline

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

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

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

打赏作者

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

抵扣说明:

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

余额充值