【推荐系统】TensorFlow复现论文DeepCrossing特征交叉网络结构

简介: 【推荐系统】TensorFlow复现论文DeepCrossing特征交叉网络结构

一、导包

from collections import namedtuple # 使用具名元组
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tqdm import tqdm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler,LabelEncoder
import pandas as pd
import numpy as np

二、读取数据

"""读取数据"""
data = pd.read_csv('./data/criteo_sample.txt')

三、获取分类特征和数值特征

"""获取分类特征和数值特征"""
columns = data.columns.values
dense_features = [feat for feat in columns if 'I' in feat]
sparse_features = [feat for feat in columns if 'C' in feat]

四、数据处理

"""数据处理"""
def data_process(data, dense_features, sparse_features):
    # 将数值特征的空值位置填补为0
    data[dense_features] = data[dense_features].fillna(0.0)
    # 调整分布
    for f in dense_features:
        data[f] = data[f].apply(lambda x: np.log(x+1) if x > -1 else -1)
    # 将分类特征进行编码,由于原数据中的类别都是字符串,所以要使用LabelEncoder编码成数值
    data[sparse_features]=data[sparse_features].fillna("0") # 将类别特征进行填补,使用字符串
    for f in sparse_features:
        le = LabelEncoder()
        data[f]=le.fit_transform(data[f])
    return data[dense_features + sparse_features]
train_data = data_process(data, dense_features, sparse_features)
train_data['label'] = data['label']
train_data # (200,40)

五、使用具名元组为特征做标记

"""使用具名元组为特征做标记"""
SparseFeat = namedtuple('SparseFeat', ['name', 'vocabulary_size', 'embedding_dim'])
DenseFeat = namedtuple('DenseFeat', ['name', 'dimension'])
dnn_features_columns = [SparseFeat(name=feat, vocabulary_size=data[feat].nunique(), embedding_dim = 4) for feat in sparse_features] + [DenseFeat(name=feat, dimension=1) for feat in dense_features]
dnn_features_columns

六、构建模型

6.1 构建输入层

"""构建输入层"""
def build_input_layers(dnn_features_columns):
    dense_input_dict, sparse_input_dict = {}, {}
    for f in dnn_features_columns:
        if isinstance(f, SparseFeat):
            sparse_input_dict[f.name] = Input(shape=(1, ), name=f.name)
        elif isinstance(f, DenseFeat):
            dense_input_dict[f.name] = Input(shape=(f.dimension, ), name=f.name)
    return dense_input_dict, sparse_input_dict

6.2 将类别特征进行embedding

"""将类别特征进行embedding"""
def build_embedding_layers(dnn_features_columns, input_layers_dict, is_linear):
    embedding_layer_dict = {}
    # 将sparse特征筛选出来
    sparse_feature_columns = list(filter(lambda x: isinstance(x,SparseFeat), dnn_features_columns)) if dnn_features_columns else []
    # 如果是用于线性部分的embedding层,其维度为1,否则维度就是自己定义的embedding维度
    if is_linear:
        for f in sparse_feature_columns:
            embedding_layer_dict[f.name] = Embedding(f.vocabulary_size + 1, 1, name='1d_emb_' + f.name)
    else:
        for f in sparse_feature_columns:
            embedding_layer_dict[f.name] = Embedding(f.vocabulary_size + 1, f.embedding_dim, name='kd_emb_' + f.name)
    return embedding_layer_dict

6.3 将所有的sparse特征embedding进行拼接

"""将所有的sparse特征embedding进行拼接"""
def concat_embedding_list(dnn_features_columns, input_layer_dict, embedding_layer_dict, flatten=False):
    # 筛选sparse特征
    sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_features_columns))
    embedding_list = []
    for f in sparse_feature_columns:
        _input = input_layer_dict[f.name]
        _embed = embedding_layer_dict[f.name]
        embed = _embed(_input)
        if flatten:
            embed = Flatten()(embed)
        embedding_list.append(embed)
    return embedding_list

6.4 构建残差块

"""构建残差块"""
class ResidualBlock(Layer):
    def __init__(self, units):
        super(ResidualBlock, self).__init__()
        self.units = units
    def build(self, input_shape):
        out_dim = input_shape[-1]
        self.dnn1 = Dense(self.units, activation='relu')
        self.dnn2 = Dense(out_dim, activation='relu')
    def call(self, inputs):
        x = inputs
        x = self.dnn1(x)
        x = self.dnn2(x)
        x = Activation('relu')(x + inputs)
        return x

6.5 构建输出层

"""构建输出层"""
def get_dnn_logits(dnn_inputs, block_nums=3):
    dnn_out = dnn_inputs
    for i in range(block_nums):
        dnn_out = ResidualBlock(64)(dnn_out)
    dnn_logits = Dense(1, activation='sigmoid')(dnn_out)
    return dnn_logits

6.6 构建模型

"""构建模型"""
def DeepCrossing(dnn_features_columns):
    # 1.构建输入层
    dense_input_dic, sparse_input_dic = build_input_layers(dnn_features_columns)
    input_layers = list(dense_input_dic.values()) + list(sparse_input_dic.values())
    # 2.将类别特征进行embedding
    embedding_layer_dict = build_embedding_layers(dnn_features_columns, sparse_input_dic, is_linear=False)
    # 3.将数值型特征拼接在一起
    dense_dnn_list = list(dense_input_dic.values())
    dense_dnn_inputs = Concatenate(axis=1)(dense_dnn_list)
    # 4.将类别Embedding向量进行Flatten
    sparse_dnn_list = concat_embedding_list(dnn_features_columns, sparse_input_dic, embedding_layer_dict, flatten=True)
    sparse_dnn_inputs = Concatenate(axis=1)(sparse_dnn_list)
    # 6.将数值特征和类别特征进行拼接
    dnn_inputs = Concatenate(axis=1)([dense_dnn_inputs, sparse_dnn_inputs])
    # 7.将所有特征输入到残差模块中
    output_layer = get_dnn_logits(dnn_inputs, block_nums=3)
    # 8.构建模型
    model = Model(input_layers, output_layer)
    return model

七、训练模型

7.1 构建模型

history = DeepCrossing(dnn_features_columns)
history.summary()

7.2 编译模型

history.compile(optimizer='adam',
               loss='binary_crossentropy',
               metrics=['binary_crossentropy', tf.keras.metrics.AUC(name='auc')])

7.3 准备输入数据

train_model_input = {name: data[name] for name in dense_features + sparse_features}

7.4 模型训练

history.fit(train_model_input,
           train_data['label'].values,
           batch_size=64,
           epochs=5,
           validation_split=0.2)


目录
相关文章
|
2月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
92 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
4天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
21 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
8天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
27 3
|
20天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
65 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
108 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
1月前
|
机器学习/深度学习 SQL 数据采集
基于tensorflow、CNN网络识别花卉的种类(图像识别)
基于tensorflow、CNN网络识别花卉的种类(图像识别)
25 1
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
55 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
102 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
自然语言处理 C# 开发者
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
41 1
|
3月前
|
机器学习/深度学习 算法 TensorFlow
深入探索强化学习与深度学习的融合:使用TensorFlow框架实现深度Q网络算法及高效调试技巧
【8月更文挑战第31天】强化学习是机器学习的重要分支,尤其在深度学习的推动下,能够解决更为复杂的问题。深度Q网络(DQN)结合了深度学习与强化学习的优势,通过神经网络逼近动作价值函数,在多种任务中表现出色。本文探讨了使用TensorFlow实现DQN算法的方法及其调试技巧。DQN通过神经网络学习不同状态下采取动作的预期回报Q(s,a),处理高维状态空间。
52 1

热门文章

最新文章