MLR 模型可以用於點擊率CTR預估(二分類)。
可以先看一下原文下載地址 https://arxiv.org/pdf/1704.05194.pdf 。
數學模型寫成了如下形式:
文中,採用Softmax函數,採用sigmoid函數,同時,,那麼上式可以轉換成:
模型的損失函數爲包含三部分:交叉熵損失,L2正則化,L1正則化。
代碼部分如下:
import tensorflow as tf
from sklearn.metrics import roc_auc_score
from data import get_data
train_x,train_y,test_x,test_y = get_data()
import pandas as pd
x = tf.placeholder(tf.float32,shape=[None,108])
y = tf.placeholder(tf.float32,shape=[None])
m = 2
learning_rate = 0.3
# 計算Softmax部分
u = tf.Variable(tf.random_normal([108,m],0.0,0.5),name='u')
U = tf.matmul(x,u)
p1 = tf.nn.softmax(U)
# 計算sigmoid部分
w = tf.Variable(tf.random_normal([108,m],0.0,0.5),name='w')
W = tf.matmul(x,w)
p2 = tf.nn.sigmoid(W)
# 預測結果
pred = tf.reduce_sum(tf.multiply(p1,p2),1)
# 損失函數
cost1=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=y))
cost=tf.add_n([cost1])
# 訓練器,FtrlOptimizer作爲優化器,可以給我們的損失函數加上正則項:
train_op = tf.train.FtrlOptimizer(learning_rate).minimize(cost)
"""
tf.train.FtrlOptimizer
更新方法主要用於廣告點擊預測,廣告點擊預測通常千萬級別的維度,因此有巨量的稀疏權重.其主要特點是將接近0 的權重直接置0,
這樣計算時可以直接跳過,從而簡化計算.這個方法已經驗證過在股票數據上較有效。
"""
result = []
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(0, 10000):
f_dict = {x: train_x, y: train_y}
_, cost_, predict_ = sess.run([train_op, cost, pred], feed_dict=f_dict)
auc = roc_auc_score(train_y, predict_)
if epoch % 100 == 0:
f_dict = {x: test_x, y: test_y}
_, cost_, predict_test = sess.run([train_op, cost, pred], feed_dict=f_dict)
test_auc = roc_auc_score(test_y, predict_test)
print("%d cost:%f,train_auc:%f,test_auc:%f" % (epoch, cost_, auc, test_auc))
result.append([epoch,auc,test_auc])