代码可直接运行
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, Flatten, Dense, concatenate
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import Callback
from sklearn.metrics import roc_auc_score
# 生成示例数据
num_users = 100
num_items = 20
# 用户ID
user_ids = np.arange(num_users)
# 物品ID
item_ids = np.arange(num_items)
# 用户喜欢的内容类型(0表示军事,1表示明星)
user_preferences = np.random.choice([0, 1], size=num_users)
# 生成用户-物品交互数据
interactions = []
labels = []
for user_id in user_ids:
preference = user_preferences[user_id]
for item_id in item_ids:
if (preference == 0 and item_id < 10) or (preference == 1 and item_id >= 10):
interactions.append([user_id, item_id])
labels.append(1) # 用户喜欢该物品
else:
interactions.append([user_id, item_id])
labels.append(0) # 用户不喜欢该物品
interactions = np.array(interactions)
labels = np.array(labels)
# 打乱数据
indices = np.arange(len(labels))
np.random.shuffle(indices)
interactions = interactions[indices]
labels = labels[indices]
# 构建模型
user_input = Input(shape=(1,), name='user_input')
item_input = Input(shape=(1,), name='item_input')
user_embedding = Embedding(input_dim=num_users, output_dim=8, name='user_embedding')(user_input)
item_embedding = Embedding(input_dim=num_items, output_dim=8, name='item_embedding')(item_input)
user_vecs = Flatten()(user_embedding)
item_vecs = Flatten()(item_embedding)
concat = concatenate([user_vecs, item_vecs])
dense = Dense(128, activation='relu')(concat)
output = Dense(1, activation='sigmoid')(dense)
model = Model(inputs=[user_input, item_input], outputs=output)
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=[tf.keras.metrics.AUC(name='auc')])
# 自定义回调函数计算GAUC
class GAUCCallback(Callback):
def __init__(self, interactions, labels):
super().__init__()
self.interactions = interactions
self.labels = labels
def on_epoch_end(self, epoch, logs=None):
preds = self.model.predict([self.interactions[:, 0], self.interactions[:, 1]], verbose=0)
user_ids = np.unique(self.interactions[:, 0])
user_auc = []
for user_id in user_ids:
user_interactions = self.interactions[self.interactions[:, 0] == user_id]
user_labels = self.labels[self.interactions[:, 0] == user_id]
user_preds = preds[self.interactions[:, 0] == user_id]
if len(np.unique(user_labels)) > 1:
user_auc.append(roc_auc_score(user_labels, user_preds))
gauc = np.mean(user_auc)
print(f"Epoch {epoch + 1} GAUC: {gauc:.4f}")
# 训练模型并计算GAUC
gauc_callback = GAUCCallback(interactions, labels)
model.fit([interactions[:, 0], interactions[:, 1]], labels, epochs=10, batch_size=32, validation_split=0.2, callbacks=[gauc_callback])