其他分享
首页 > 其他分享> > 用TensorFlow实现深度推荐模型

用TensorFlow实现深度推荐模型

作者:互联网

利用TensorFlow的Keras接口实现Embedding+MLP结构,内容源于王喆老师在极客时间上开设的深度学习推荐系统课程。

第一步:导入TensorFlow包,并定义训练数据的路径。


import tensorflow as tf

TRAIN_DATA_URL = "file:///F:/ReferenceMaterials/SparrowRecSys-master/src/main/resources/webroot/sampledata/modelSamples.csv"
samples_file_path = tf.keras.utils.get_file("modelSamples.csv", TRAIN_DATA_URL)

第二步:利用TensorFlow自带的CSV接口载入训练数据,需要注意两个参数,batch_size指定训练过程中一次输入多少训练数据进行梯度下降;label_name指定数据集中的标签列。加载完训练数据后,把它们切分成训练集和测试集。

def get_dataset(file_path):
    dataset = tf.data.experimental.make_csv_dataset(
        file_path,
        batch_size=12,
        label_name='label',
        na_value="?",
        num_epochs=1,
        ignore_errors=True)
    return dataset


# sample dataset size 110830/12(batch_size) = 9235
raw_samples_data = get_dataset(samples_file_path)

test_dataset = raw_samples_data.take(1000)
train_dataset = raw_samples_data.skip(1000)

第三步:载入类别型特征。这里主要利用的类别特征有三种:movieId, userId和genre,在载入genre类特征时,采用tf.feature_column.categorical_column_with_vocabulary_list方法把字符串型特征转换成one-hot型特征,转换过程中需要用到词表genre_vocab,里面包含了所有的genre类别。在转换movieId和userId特征时,用到了tf.feature_column.categorical_column_with_identity方法把ID转换成one-hot型特征,该方法不用词表,直接把ID值对应的维度置为1,剩余维度全为0。为了把稀疏的one-hot特征转换成稠密的Embedding向量,需要在one-hot特征外包裹一层Embedding,该操作使用tf.feature_column.embedding_column(movie_col, 10)方法完成,将movie one-hot向量映射到10维的Embedding上。

genre_vocab = ['Film-Noir', 'Action', 'Adventure', 'Horror', 'Romance', 'War', 'Comedy', 'Western', 'Documentary', 'Sci-Fi', 'Drama', 'Thriller', 'Crime', 'Fantasy', 'Animation', 'IMAX', 'Mystery', 'Children', 'Musical']

GENRE_FEATURES = {
    'userGenre1': genre_vocab,
    'userGenre2': genre_vocab,
    'userGenre3': genre_vocab,
    'userGenre4': genre_vocab,
    'userGenre5': genre_vocab,
    'movieGenre1': genre_vocab,
    'movieGenre2': genre_vocab,
    'movieGenre3': genre_vocab
}

categorical_columns = []
for feature, vocab in GENRE_FEATURES.items():
    cat_col = tf.feature_column.categorical_column_with_vocabulary_list(
        key=feature, vocabulary_list=vocab)
    emb_col = tf.feature_column.embedding_column(cat_col, 10)
    categorical_columns.append(emb_col)

movie_col = tf.feature_column.categorical_column_with_identity(key='movieId', num_buckets=1001)
movie_emb_col = tf.feature_column.embedding_column(movie_col, 10)
categorical_columns.append(movie_emb_col)

user_col = tf.feature_column.categorical_column_with_identity(key='userId', num_buckets=30001)
user_emb_col = tf.feature_column.embedding_column(user_col, 10)
categorical_columns.append(user_emb_col)

第四步:处理数值型特征,直接把特征值输入到MLP内,然后把特征逐个声明为tf.feature_column.numeric_column。

numerical_columns = [tf.feature_column.numeric_column('releaseYear'),
                     tf.feature_column.numeric_column('movieRatingCount'),
                     tf.feature_column.numeric_column('movieAvgRating'),
                     tf.feature_column.numeric_column('movieRatingStddev'),
                     tf.feature_column.numeric_column('userRatingCount'),
                     tf.feature_column.numeric_column('userAvgRating'),
                     tf.feature_column.numeric_column('userRatingStddev')]

第五步:定义模型结构。直接用DenseFeature把类别型Embedding特征和数值型特征连接在一起形成稠密特征向量,然后依次经过两层128维的全连接层,最后通过sigmoid函数输出神经元最终产生的预估值。

preprocessing_layer = tf.keras.layers.DenseFeatures(numerical_columns + categorical_columns)

model = tf.keras.Sequential([
    preprocessing_layer,
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])

第六步:定义模型训练相关的参数。需要设置模型的损失函数,梯度反向传播的优化方法,模型评估所用的指标。损失函数使用了二分类交叉熵,优化方法使用Adam,评估指标使用准确率accuracy。

model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])

第七步:模型训练与评估。TensorFlow模型的训练需调用fit函数,然后用evaluate函数在测试集上进行评估。参数epochs代表模型训练的轮数,一轮代表使用所有训练数据训练一次。

model.fit(train_dataset, epochs=10)

test_loss, test_accuracy = model.evaluate(test_dataset)

print('\n\nTest Loss {}, Test Accuracy {}'.format(test_loss, test_accuracy)

 

标签:vocab,column,模型,feature,genre,深度,tf,TensorFlow,col
来源: https://blog.csdn.net/qq_41561912/article/details/114207112