文章目录

  • 提出动机
  • 解决方案
  • 结构
  • 作用
  • 优缺点
  • tf2实现

提出动机

解决方案

结构


作用

优缺点


tf2实现

# coding:utf-8
# @Time: 2022/1/4 3:26 下午
# @File: ctr_FNN.py
'''
FNN
'''
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import Model
from tensorflow.keras import optimizers
from tensorflow.keras import metrics
from keras.utils import plot_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import yamlfrom tools import *class FM(Model):def __init__(self, k, w_reg=1e-4, v_reg=1e-4):super(FM, self).__init__()self.k = kself.w_reg = w_regself.v_reg = v_regdef build(self, input_shape):self.b = self.add_weight(name='b', shape=(1,), initializer=tf.zeros_initializer(), trainable=True)self.w = self.add_weight(name='w', shape=(input_shape[-1], 1), initializer=tf.random_normal_initializer(), trainable=True, regularizer=tf.keras.regularizers.l2(self.w_reg))self.v = self.add_weight(name='v', shape=(input_shape[-1], self.k), initializer=tf.random_normal_initializer(), trainable=True, regularizer=tf.keras.regularizers.l2(self.v_reg))def call(self, inputs):# 线性部分linear_part = tf.matmul(inputs, self.w) + self.b  # (batchsize, 1)# 内积项inter_cross1 = tf.square(inputs @ self.v)  # (batchsize, k)inter_cross2 = tf.matmul(tf.pow(inputs, 2), tf.pow(self.v, 2))  # (batchsize, k)cross_part = 0.5 * tf.reduce_sum(inter_cross1 - inter_cross2, axis=1, keepdims=True)  # (batchsize, 1)return tf.sigmoid(linear_part + cross_part)class DNN(Model):def __init__(self, hidden_units=[256, 128, 64], output_dim=1, activation='relu', droup_out=0.):super(DNN, self).__init__()self.dnn = tf.keras.Sequential()for hidden in hidden_units:self.dnn.add(layers.Dense(hidden))self.dnn.add(layers.BatchNormalization())self.dnn.add(layers.Activation(activation))self.dnn.add(layers.Dropout(droup_out))self.dnn.add(layers.Dense(output_dim, activation=None))def call(self, inputs, training=None, mask=None):output = self.dnn(inputs)return tf.nn.sigmoid(output)def train1(train_X, test_X, val_X, train_y, test_y, val_y):model = FM(k=4, w_reg=1e-4, v_reg=1e-4)# optimizer = optimizers.SGD(0.01)adam = optimizers.Adam(lr=config['train']['adam_lr'], beta_1=0.95, beta_2=0.96)train_dataset = tf.data.Dataset.from_tensor_slices((train_X, train_y))train_dataset = train_dataset.batch(2000).prefetch(tf.data.experimental.AUTOTUNE)model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['accuracy'])model.fit(train_dataset, epochs=3)# 评估fm_pre = model(test_X)fm_pre = [1 if x > 0.5 else 0 for x in fm_pre]# 获取FM训练得到的隐向量v = model.variables[2]  # [None, onehot_dim, k]print('FM隐向量提取完成')X_train = tf.cast(tf.expand_dims(train_X, -1), tf.float32)  # [None, onehot_dim, 1]X_train = tf.reshape(tf.multiply(X_train, v), shape=(-1, v.shape[0] * v.shape[1]))  # [None, onehot_dim*k]hidden_units = [256, 128, 64]model = DNN(hidden_units, 1, 'relu')optimizer = optimizers.SGD(0.0001)train_dataset = tf.data.Dataset.from_tensor_slices((X_train, train_y))train_dataset = train_dataset.batch(2000).prefetch(tf.data.experimental.AUTOTUNE)model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])model.fit(train_dataset, epochs=3)# 评估X_test = tf.cast(tf.expand_dims(test_X, -1), tf.float32)X_test = tf.reshape(tf.multiply(X_test, v), shape=(-1, v.shape[0] * v.shape[1]))fnn_pre = model(X_test)fnn_pre = [1 if x > 0.5 else 0 for x in fnn_pre]print("FM Accuracy: ", accuracy_score(test_y, fm_pre))print("FNN Accuracy: ", accuracy_score(test_y, fnn_pre))def train2(train_X, test_X, val_X, train_y, test_y, val_y):'''   预训练FM   '''fm_modle = FM(k=8, w_reg=1e-4, v_reg=1e-4)adam = optimizers.Adam(lr=config['train']['adam_lr'], beta_1=0.95, beta_2=0.96,)fm_modle.compile(optimizer=adam,loss='binary_crossentropy',metrics=[metrics.AUC(), metrics.Precision(), metrics.Recall()])fm_modle.fit(train_X, train_y,# validation_data=(val_X.values, val_y),batch_size=config['train']['batch_size'],epochs=config['train']['epochs'],verbose=1,)fm_pre = fm_modle(test_X)fm_pre = [1 if x > 0.5 else 0 for x in fm_pre]'''   获取FM训练得到的隐向量   '''v = fm_modle.variables[2]  # [None, onehot_dim, k]print('FM隐向量提取完成')'''   隐向量代替随机初始化的权重   '''train_X = tf.cast(tf.expand_dims(train_X, -1), tf.float32)  # 隐向量是3维的,新增一维,[None, onehot_dim, 1]train_X = tf.reshape(tf.multiply(train_X, v), shape=(-1, v.shape[0] * v.shape[1]))  # [None, onehot_dim*k]val_X = tf.cast(tf.expand_dims(val_X, -1), tf.float32)val_X = tf.reshape(tf.multiply(val_X, v), shape=(-1, v.shape[0] * v.shape[1]))test_X = tf.cast(tf.expand_dims(test_X, -1), tf.float32)test_X = tf.reshape(tf.multiply(test_X, v), shape=(-1, v.shape[0] * v.shape[1]))dnn_model = DNN(hidden_units=[256, 128, 64],output_dim=1,activation='relu',droup_out=0.)dnn_model.compile(optimizer=adam,loss='binary_crossentropy',metrics=[metrics.AUC(), metrics.Precision(), metrics.Recall()])dnn_model.fit(train_X, train_y,validation_data=(val_X, val_y),batch_size=config['train']['batch_size'],epochs=config['train']['epochs'],verbose=1,)fnn_pre = dnn_model(test_X)fnn_pre = [1 if x > 0.5 else 0 for x in fnn_pre]print("FM Accuracy: ", accuracy_score(test_y, fm_pre))print("FNN Accuracy: ", accuracy_score(test_y, fnn_pre))if __name__ == '__main__':with open('config.yaml', 'r') as f:config = yaml.Loader(f).get_data()data = pd.read_csv('../../data/criteo_sampled_data_OK.csv')data_X = data.iloc[:, 1:]data_y = data['label'].values# I1-I13:总共 13 列数值型特征# C1-C26:共有 26 列类别型特征dense_features = ['I' + str(i) for i in range(1, 14)]sparse_features = ['C' + str(i) for i in range(1, 27)]tmp_X, test_X, tmp_y, test_y = train_test_split(data_X, data_y, test_size=0.2, random_state=42, stratify=data_y)train_X, val_X, train_y, val_y = train_test_split(tmp_X, tmp_y, test_size=0.1, random_state=42, stratify=tmp_y)# train1(train_X.values, test_X.values, val_X.values, train_y, test_y, val_y)train2(train_X.values, test_X.values, val_X.values, train_y, test_y, val_y)
Epoch 1/3
216/216 [==============================] - 0s 2ms/step - loss: 2346847.0000 - auc: 0.5002 - precision: 0.2566 - recall: 0.2780
Epoch 2/3
216/216 [==============================] - 0s 2ms/step - loss: 175712.9844 - auc: 0.5054 - precision: 0.2640 - recall: 0.2782
Epoch 3/3
216/216 [==============================] - 0s 2ms/step - loss: 179549.7969 - auc: 0.5041 - precision: 0.2623 - recall: 0.2710
FM隐向量提取完成
Epoch 1/3
216/216 [==============================] - 4s 17ms/step - loss: 0.5714 - auc_1: 0.5523 - precision_1: 0.2538 - recall_1: 0.0149 - val_loss: 0.5682 - val_auc_1: 0.5561 - val_precision_1: 0.4211 - val_recall_1: 6.5009e-04
Epoch 2/3
216/216 [==============================] - 3s 16ms/step - loss: 0.5601 - auc_1: 0.5813 - precision_1: 0.5414 - recall_1: 6.5010e-04 - val_loss: 0.5622 - val_auc_1: 0.5736 - val_precision_1: 0.6571 - val_recall_1: 0.0019
Epoch 3/3
216/216 [==============================] - 3s 16ms/step - loss: 0.5585 - auc_1: 0.5894 - precision_1: 0.5833 - recall_1: 0.0015 - val_loss: 0.5612 - val_auc_1: 0.5808 - val_precision_1: 0.4896 - val_recall_1: 0.0038
FM Accuracy:  0.5665833333333333
FNN Accuracy:  0.743875

CTR --- FNN原理,及tf2实现相关推荐

  1. CTR预估系列(一)-FNN论文笔记

    1 论文摘要及介绍 在推荐系统或者广告系统中,CTR.CVR预估至关重要.不同于视觉和音频领域连续的原始特征,这些任务场景的输入特征大多数是多类型的离散特征, 且特征之间相互依赖的先验知识很少.常用的 ...

  2. java aes ctr_AES CBC和CTR加解密实例

    http://www.metsky.com/archives/585.html 2012 AES(Advanced Encryption Standard,高级加密标准) 又叫Rijndael加密法, ...

  3. 初学者奇怪的迷惑点:CTR模式,做实验的时候nonce的取值为啥啊固定?

    在看大家写的ctr代码的时候,我突然陷入了 nonce怎么取值的问题. 我的疑惑:ctr的nonce是随机数,那么解密的时候不就,解不了密了吗,然后查看相关代码,发现大家写的都是取了一个固定值,然后我 ...

  4. 推荐系统之CTR预估-FNN模型解析

    原论文:Deep learning over multi-field categorical data 地址:https://arxiv.org/pdf/1601.02376.pdf 一.问题由来 基 ...

  5. ctr 平滑_CTR平滑的原理,包懂!!!附代码

    为什么需要平滑? 某个物品CTR(click-Through-Rate)定义为"物品被点击的概率".CTR是某个物品在其他条件保持不变下自身的属性.但是概率我们不好确定,能确定的是 ...

  6. CTR模型:FNN模型

    1. 简介 FNN 模型是2016年提出的,基于传统机器学习模型,如LR,FM等,的CTR预测方案被称为基于浅层模型的方案. 优点是模型简单,预测性能较好,可解释性强.缺点是,很难自动提取高阶组合特征 ...

  7. java ctr_分组密码_计数器(CTR)模式_原理及java实现

    一.原理: CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流.最终的密文分组是通过将计数器加密得 ...

  8. CTR --- NFM论文阅读笔记,及tf2复现

    文章目录 提出动机 结构 特征交叉池化层 特点 工程化结构 tf2实现 提出动机 结构 特征交叉池化层 特点 工程化结构 tf2实现 # coding:utf-8 # @Email: wangguis ...

  9. CTR --- DIEN论文阅读笔记,及tf2复现

    文章目录 前言 DIN和DIEN的总体思路 DIN对兴趣建模的缺点 DIEN对兴趣建模的思路 结构 行为序列层(Behavior Layer) 兴趣抽取层(Interest Extractor Lay ...

最新文章

  1. go基础语法:切片的定义
  2. C++4种类型转换操作符
  3. H3C 以太网集线器
  4. linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动
  5. Windows句柄和指针的区别
  6. 纺织名词术语(针织品部分)---疵点
  7. 面试题:之字形顺序打印二叉树
  8. CentOS安装jdk
  9. 从设计心理学理解交互设计的原则
  10. 闲聊人工智能产品经理(AIPM)—人工智能产品经理的行业理解
  11. win10网页找不到服务器dns,win10系统浏览网页提示“找不到服务器或dns错误”的解决方法...
  12. Java项目:毕业设计管理系统(java+SSM+jsp+mysql+maven)
  13. 微信小程序选择地址填写详细地址定位地点
  14. win11 安装Ubuntu加可视化桌面(最新保姆级教程)
  15. npm登录:忘记了用户名和密码,通过邮箱找回流程
  16. 提供一个xftp7的下载地址
  17. Google更新AIY套件包:门槛更低,适合初级玩家!
  18. 【计算机考研408】中断处理流程
  19. HIVE 内存溢出常见问题
  20. Java基础代码入门练习题(你也来试试?)

热门文章

  1. 拆字在线版-扌斥字在纟戋片反
  2. matlab 三分之一倍频程,三分之一倍频程谱
  3. 网络安全防御体系常用的安全设备
  4. javaweb-day03-7(基础加强-泛型)
  5. ThinkPad E450 拆机换电池
  6. 《​社会很单纯,复杂的是人-雾满拦江》
  7. App渗透中常见的加密与解密。
  8. 电商运营从哪些方面做数据分析?
  9. VS2013打包Windows程序部署教程
  10. 英语钻石法则(七)——【听-问答-复述故事】