noHup - criteo
type: channel
link: http://chris.nohup.cc/tag/criteo/
items: TensorFlow 2.0实战Deep&Cross
items: TensorFlow 2.0实战DeepFM

TensorFlow 2.0实战Deep&Cross
type: item
date: 2020-05-31T11:56:00+00:00
description: Overview1. 加载并处理数据2. 建模训练2.1 输入层2.2 Cross网络2.3 Deep网络2.4 输出层2.5 模型编译2.6 训练模型 Overview 之前的文章，我们记录了如何用TensorFlow 2.0中的Keras模块实现DeepFM算法，TensorFlow 2.0实战DeepFM。本文继续用TensorFlow 2.0来实现另一个常见的深度学习推荐算法Deep&Cross。 1. 加载并处理数据 依然沿用之前的1,000,000条criteo数据。 import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder, MinMaxScaler import tensorflow as tf from tensorflow.keras import regularizers from tensorflow.keras.layers import * from tensorflow.keras.models import Model from tensorflow.keras.utils import plot_model import tensorflow.keras.backend as K from tensorflow.keras.callbacks import TensorBoard import matplotlib.pyplot as plt %matplotlib inline data = pd.read_csv('criteo/criteo_sampled_data.csv', sep='\t', header=None) data.head() label = ['label'] dense_features = ['I' + str(i) for i in range(1, 14)] sparse_features = ['C' + str(i) for i in range(1, 27)] name_list = label + dense_features + sparse_features data.columns = name_list 处理连续型特征： # 数值型特征空值填0 data[dense_features] = data[dense_features].fillna(0) # 数值型特征归一化 scaler = MinMaxScaler(feature_range=(0, 1)) data[dense_features] = scaler.fit_transform(data[dense_features]) 处理稀疏类别特征： data[sparse_features] = data[sparse_features].fillna("-1") for feat in sparse_features: lbe = LabelEncoder() data[feat] = lbe.fit_transform(data[feat]) 2. 建模训练 我们先来看看DCN算法的架构图： 2.1 输入层 # 稠密特征 dense_inputs = [] for fea in dense_features: _input = Input([1], name=fea) dense_inputs.append(_input) dense_inputs 输出13个稠密特征的张量： [<tf.Tensor 'I1:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I2:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I3:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I4:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I5:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I6:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I7:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I8:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I9:0' shape=(None, 1) dtype=float32>, <tf.Tensor 'I10:0' shape=(None, 1) dtype=float32>, <tf…

TensorFlow 2.0实战DeepFM
type: item
date: 2020-05-29T13:39:00+00:00
description: Overview1. 准备数据2. 加载并处理数据2.1 处理连续型特征2.2 处理稀疏类别特征3. 建模训练3.1 处理一阶特征3.2 二阶特征3.3 DNN层3.4 合并输出层3.5 编译模型 Overview 推荐系统最核心的部分在于排序算法，也就是我们说的CTR预估问题。这部分算法在最近几年发展迅速，我们这篇文章，希望用经典的criteo数据集，和TensorFlow 2.0中的Keras模块，来演示一下DeepFM是怎么做CTR预估的。 1. 准备数据 在这里下载criteo数据集：Download Kaggle Display Advertising Challenge Dataset。 或者直接在终端下载,然后解压： mkdir criteo cd criteo wget https://s3-eu-west-1.amazonaws.com/kaggle-display-advertising-challenge-dataset/dac.tar.gz tar -zxvf dac.tar.gz 这个数据集，训练集40,000,000行，从readme.txt中可以知道数值型特征的有13个，类别型特征有26个，特征名称未提供，样本按时间排序。测试集6,000,000行，不含label。解压后，可以看到训练集是11.1G，测试集是1.46G。当前这个单机是打不开的。那我们就读取1,000,000条训练集好了。 head -n 1000000 train.txt > criteo_sampled_data.csv cd .. 2. 加载并处理数据 首先把抽样过的数据加载到内存： import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder, MinMaxScaler import tensorflow as tf from tensorflow.keras import regularizers from tensorflow.keras.layers import * from tensorflow.keras.models import Model from tensorflow.keras.utils import plot_model import tensorflow.keras.backend as K from tensorflow.keras.callbacks import TensorBoard import matplotlib.pyplot as plt %matplotlib inline data = pd.read_csv('criteo/criteo_sampled_data.csv', sep='\t', header=None) data.head() 我们给数据加上列名： label = ['label'] dense_features = ['I' + str(i) for i in range(1, 14)] sparse_features = ['C' + str(i) for i in range(1, 27)] name_list = label + dense_features + sparse_features data.columns = name_list data.head() 2.1 处理连续型特征 # 数值型特征空值填0 data[dense_features] = data[dense_features].fillna(0) # 数值型特征归一化 scaler = MinMaxScaler(feature_range=(0, 1)) data[dense_features] = scaler.fit_transform(data[dense_features]) 2.2 处理稀疏类别特征 data[sparse_features] = data[sparse_features].fillna("-1") for feat in sparse_features: lbe = LabelEncoder() data[feat] = lbe.fit_transform(data[feat]) 3. 建模训练 这个部分就是DeepFM模型的精髓所在。算法原理如图所示。 DeepFM模型是对Wide&Deep模型的改进。左边FM层和右边DNN层共享了Embedding层。 3.1 处理一阶特征 首先，数值型特征可以直接变成tensorflow.keras.layers.Input单元。 dense_inputs = [] for fea in dense_fe…