核心: 为什么在抖音刷的时候停不下来,因为他推的都符合你的爱好兴趣,审美。这是推荐系统的核心。
怎么知道用户喜欢什么?
传统做法: 根据用户行为点赞、收藏、评论、关注、转发、评论。都融合在推荐算法中
存在缺陷: 这种做法看似合理实际存在问题从神经网络流程来看,这种做法实际也是属于线性的,
举一例子:容易局限在一小范围内,就是纯靠这些数据比如你只给一个视频点赞了,比如舞蹈类,
就玩命给你推舞蹈类的最后就局限在这一个范围。但是抖音平台也好,快手平台也好,他的内容是
极其丰富的,会引起用户的审美疲劳,理论他不知是只喜欢这一个分类,他可能还喜欢别的,比如体育类的等等。那你为怎么不给他推啊?因为你是被这个线性的数据给限制了。
所以我们基于深度学习,深度学习基于神经网络架构,神经网络由神经元组成的。
机器学习有两大类问题:
分类问题: 图像识别(给特征他告诉你属于哪一类别的)
预测问题: 推荐系统也叫回归问题(给他特征,他给你预测可能发生的结果,比如预测房价趋势,市场就业率等)
我们要预测的是这个人可能喜欢的视频:首先我们必须要有一个特征,特征需要和结果存在因果关系。 我们选择完播率。 为什么要选择完播率 两个原因 1输入特征要和结果存在因果关系 2其他指标也有因果关系但是他很容易被刷,但是完播率很难被刷,必须从头看到尾,这个指标权重比较大。
最后我们和预测结果和现有的数据进行对比在偏差不大的情况下,我们即为数据合格。(存在偏差是一定的因为,概率学)
import pandas as pd import numpy as np import tensorflow as tf from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder # 读取数据 data = pd.read_csv("./data.csv") #print(data) # 数据转换 user_index = data[data.columns[0]] video_index = data.columns data = data.reset_index(drop=True) data[data.columns[0]] = data.index.astype('int') # 设置阈值 scaler = 10 # 向量化操作 df_long = pd.melt(data, id_vars=[data.columns[0]], ignore_index=True, var_name='video_id', value_name='rate').dropna() df_long.columns = ['user_id', 'video_id', 'rating'] df_long['rating'] = df_long['rating'] / scaler # replace the user_id to user by match user_index df_long['user_id'] = df_long['user_id'].apply(lambda x: user_index[x]) print(df_long) # 打标签 dataset = df_long # Encode the user and movie IDs user_encoder = LabelEncoder() video_encoder = LabelEncoder() dataset['user_id'] = user_encoder.fit_transform(dataset['user_id']) dataset['video_id'] = video_encoder.fit_transform(dataset['video_id']) train = dataset # Model hyperparameters num_users = len(dataset['user_id'].unique()) num_countries = len(dataset['video_id'].unique()) # 训练 embedding_dim = 64 # Create the NCF model inputs_user = tf.keras.layers.Input(shape=(1,)) inputs_video = tf.keras.layers.Input(shape=(1,)) embedding_user = tf.keras.layers.Embedding(num_users, embedding_dim)(inputs_user) embedding_video = tf.keras.layers.Embedding(num_countries, embedding_dim)(inputs_video) # Merge the embeddings using concatenation, you can also try other merging methods like dot product or multiplication merged = tf.keras.layers.Concatenate()([embedding_user, embedding_video]) merged = tf.keras.layers.Flatten()(merged) # Add fully connected layers dense = tf.keras.layers.Dense(64, activation='relu')(merged) dense = tf.keras.layers.Dense(32, activation='relu')(dense) output = tf.keras.layers.Dense(1, activation='sigmoid')(dense) # Compile the model model = tf.keras.Model(inputs=[inputs_user, inputs_video], outputs=output) model.compile(optimizer='adam', loss='mse', metrics=['mae']) model.fit( [train['user_id'].values, train['video_id'].values], train['rating'].values, batch_size=64, epochs=100, verbose=0, # validation_split=0.1, ) # 输出训练结果 result_df = {} for user_i in range(1, 10): user = f'User{user_i}' result_df[user] = {} for video_i in range(1, 7): video = f'Video {video_i}' pred_user_id = user_encoder.transform([user]) pred_video_id = video_encoder.transform([video]) result = model.predict(x=[pred_user_id, pred_video_id], verbose=0) result_df[user][video] = result[0][0] result_df = pd.DataFrame(result_df).T result_df *= scaler print(result_df)