推荐系统学习笔记之NFM模型

模型简介

NFM(Neural Factorization Machines)是2017年由新加坡国立大学的何向南教授等人在SIGIR会议上提出的一个模型,是传统FM模型的改良,目的是为了解决FM模型因只能交叉到二阶,且是线性模型从而在真实生活场景中复杂且具有规律的数据上表现不佳的问题。

模型结构与分析

模型结构如图所示,NFM是FM模型与DNN的融合,同时发挥了FM模型的低阶特征的交互能力与DNN的高阶特征学习能力和非线性拟合能力
在这里插入图片描述

Input层

如图所示,这一层输入的是稀疏(sparse)的,经过ont-hot编码的向量

Embedding层

该层的作用是将稀疏向量转换成稠密的的向量并作为下一层的输入

B-Interaction 层

该层是这个模型的创新点,相当于一个pooling层,其原理是将多个输入向量两两之间(k维)的对应维度相乘(但不相加),输出多个仍是k维的,交叉后的向量,再对这些向量取和,得到输出向量
在这里插入图片描述

隐藏层(Hidden Layers)

该层是由多层全连接的神经网络组成,用以学习更高阶的组合特征,由于上一层的FM已经学习到了一定特征,所以需要的隐藏层更少,模型更浅,训练和调参更容易

预测层(Prediction Score)

结构为最后一层的结果直接过一个隐藏层,数学形式如下
在这里插入图片描述

模型搭建及训练

数据集

来源:kaggle(Display Advertising Challenge)

代码

import warnings
warnings.filterwarnings("ignore")
import itertools
import pandas as pd
import numpy as np
from tqdm import tqdm
from collections import namedtuple

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import *

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import  MinMaxScaler, LabelEncoder

from utils import SparseFeat, DenseFeat, VarLenSparseFeat


# 简单处理特征,包括填充缺失值,数值处理,类别编码
def data_process(data_df, dense_features, sparse_features):
    data_df[dense_features] = data_df[dense_features].fillna(0.0)
    for f in dense_features:
        data_df[f] = data_df[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
        
    data_df[sparse_features] = data_df[sparse_features].fillna("-1")
    for f in sparse_features:
        lbe = LabelEncoder()
        data_df[f] = lbe.fit_transform(data_df[f])
    
    return data_df[dense_features + sparse_features]


def build_input_layers(feature_columns):
    # 构建Input层字典,并以dense和sparse两类字典的形式返回
    dense_input_dict, sparse_input_dict = {
   }, {
   }

    for fc in feature_columns:
        if isinstance(fc, SparseFeat):
            sparse_input_dict[fc.name] = Input(shape=(1, ), name=fc.name)
        elif isinstance(fc, DenseFeat):
            dense_input_dict[fc.name] = Input(shape=(fc.dimension, ), name
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值