日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CTR模型】TensorFlow2.0 的 DCN(Deep Cross Network) 实现与实战(附代码+数据)

發(fā)布時間:2023/12/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CTR模型】TensorFlow2.0 的 DCN(Deep Cross Network) 实现与实战(附代码+数据) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CTR 系列文章:

  • 廣告點擊率(CTR)預測經(jīng)典模型 GBDT + LR 理解與實踐(附數(shù)據(jù) + 代碼)
  • CTR經(jīng)典模型串講:FM / FFM / 雙線性 FFM 相關推導與理解
  • CTR深度學習模型之 DeepFM 模型解讀
  • 【CTR模型】TensorFlow2.0 的 DeepFM 實現(xiàn)與實戰(zhàn)(附代碼+數(shù)據(jù))
  • CTR 模型之 Deep & Cross (DCN) 與 xDeepFM 解讀
  • 【CTR模型】TensorFlow2.0 的 DCN(Deep & Cross Network) 實現(xiàn)與實戰(zhàn)(附代碼+數(shù)據(jù))
  • 【CTR模型】TensorFlow2.0 的 xDeepFM 實現(xiàn)與實戰(zhàn)(附代碼+數(shù)據(jù))
  • 本篇文章講解 DCN(Deep & Cross Network) 的 tensorflow2.0 實現(xiàn),并使用 Criteo 數(shù)據(jù)集的子集加以實踐。如果在看本文時有所困惑,可以看看 DCN(Deep & Cross Network) 的相關理論:CTR 模型之 Deep & Cross (DCN) 與 xDeepFM 解讀。

    本文使用的數(shù)據(jù)下載地址于代碼獲取地址在文末獲取。

    首先了解一下 Criteo數(shù)據(jù)集,它由有39個特征,1個label列,其中以I開頭的為數(shù)值型特征,以C開頭的為類別特征:

    可以看到數(shù)據(jù)中有缺失值需要填充,并且類別變量需要進行類別編碼(onehot 編碼的任務交給模型),這部分預處理的代碼不詳細講了。

    為了方便后面建立模型,先將特征劃分為 dense 特征與 sparse 特征兩個類別:

    # 數(shù)值型 dense_feats = [f for f in cols if f[0] == "I"] # 類別型 sparse_feats = [f for f in cols if f[0] == "C"]

    Deep & Cross Network

    DCN網(wǎng)絡結構如下:

    構造模型輸入

    對于 dense 特征,按下面的代碼構造輸入:

    # 構造每個 dense 特征的輸入 dense_inputs = [] for f in dense_feats:_input = Input([1], name=f)dense_inputs.append(_input) # 將輸入拼接到一起 concat_dense_inputs = Concatenate(axis=1)(dense_inputs) # ?, 13

    對于 sparse 特征,按下面的代碼構造輸入:

    # 這里單獨對每一個 sparse 特征構造輸入, # 目的是方便后面構造二階組合特征 sparse_inputs = [] for f in sparse_feats:_input = Input([1], name=f)sparse_inputs.append(_input)# embedding size k = 8 # 對sparse特征進行embedding sparse_kd_embed = [] for _input in sparse_inputs:f = _input.name.split(':')[0]voc_size = total_data[f].nunique()_embed = Flatten()(Embedding(voc_size, k, embeddings_regularizer=tf.keras.regularizers.l2(0.7))(_input))sparse_kd_embed.append(_embed)# 將sparse特征拼接在一起 concat_sparse_inputs = Concatenate(axis=1)(sparse_kd_embed)

    然后將所有的 dense 輸入和 sparse 輸入拼接到一起:

    embed_inputs = Concatenate(axis=1)([concat_sparse_inputs, concat_dense_inputs])

    Cross Network

    終于來到最核心的 Cross 部分,其中第 l+1l + 1l+1 層的計算過程為:

    xl+1=x0xlTwl+bl+xlx_{l+1} =x_0x^T_lw_l + b_l + x_l xl+1?=x0?xlT?wl?+bl?+xl?
    此公式的實現(xiàn)代碼如下:

    def cross_layer(x0, xl):"""實現(xiàn)一層cross layer@param x0: 特征embeddings@param xl: 前一層的輸出結果"""# 1.獲取xl層的embedding sizeembed_dim = xl.shape[-1]# 2.初始化當前層的W和bw = tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01))b = tf.Variable(tf.zeros(shape=(embed_dim,)))# 3.計算feature crossing# 下面的reshape操作相當于將列向量轉換為行向量x1_T = tf.reshape(xl, [-1, 1, embed_dim])# 行向量與列向量的乘積結果是一個標量x_lw = tf.tensordot(x1_T, w, axes=1)cross = x0 * x_lw return cross + b + xl

    這個代碼的執(zhí)行結果是第 l+1l+1l+1 層的輸出,共分為三個步驟:

  • 獲取前一層的輸出結果的嵌入維度
  • 初始化本層的網(wǎng)絡參數(shù)
  • 進行特征交叉
  • 關鍵在于第三步,計算 x0xlTwlx_0x^T_lw_lx0?xlT?wl? 時,如果先計算 x0xTx_0x^Tx0?xT則會得到一個矩陣,為了優(yōu)化內存的使用,可以先計算 xlTwlx^T_lw_lxlT?wl? 得到標量,然后再與 x0x_0x0? 相乘得到 feature crossing。

    接下來可以利用循環(huán)構建多層 crossing layer:

    def build_cross_layer(x0, num_layer=3):"""構建多層cross layer@param x0: 所有特征的embeddings@param num_layers: cross net的層數(shù)"""# 初始化xl為x0xl = x0# 構建多層cross netfor i in range(num_layer):xl = cross_layer(x0, xl)return xl# cross net cross_layer_output = build_cross_layer(embed_inputs, 3)

    DNN 部分

    這部分好理解,直接上代碼吧:

    fc_layer = Dropout(0.5)(Dense(128, activation='relu')(embed_inputs)) fc_layer = Dropout(0.3)(Dense(128, activation='relu')(fc_layer)) fc_layer_output = Dropout(0.1)(Dense(128, activation='relu')(fc_layer))

    輸出部分

    代碼如下:

    stack_layer = Concatenate()([cross_layer_output, fc_layer_output]) output_layer = Dense(1, activation='sigmoid', use_bias=True)(stack_layer)

    完善模型

    model = Model(dense_inputs+sparse_inputs, output_layer) model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["binary_crossentropy", tf.keras.metrics.AUC(name='auc')])

    訓練模型

    train_data = total_data.loc[:500000-1] valid_data = total_data.loc[500000:]train_dense_x = [train_data[f].values for f in dense_feats] train_sparse_x = [train_data[f].values for f in sparse_feats] train_label = [train_data['label'].values]val_dense_x = [valid_data[f].values for f in dense_feats] val_sparse_x = [valid_data[f].values for f in sparse_feats] val_label = [valid_data['label'].values]model.fit(train_dense_x+train_sparse_x, train_label, epochs=5, batch_size=128,validation_data=(val_dense_x+val_sparse_x, val_label),)

    最后,本文的代碼鏈接在:https://github.com/zxxwin/tf2_DCN 。

    數(shù)據(jù)下載地址為:鏈接:https://pan.baidu.com/s/1Qy3yemu1LYVtj0Wn47myHQ 提取碼:pv7u

    參考文章:

    CTR預估模型:DeepFM/Deep&Cross/xDeepFM/AutoInt代碼實戰(zhàn)與講解

    NELSONZHAO/zhihu/ctr_models/DCN

    總結

    以上是生活随笔為你收集整理的【CTR模型】TensorFlow2.0 的 DCN(Deep Cross Network) 实现与实战(附代码+数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。