人工智能领域:推荐系统
这个智能推荐使用的也是深度学习框架tensorflow,在前面的文章中我们已经对tensorflow 以及机器学习 和 深度学习做了一个详细的介绍。下面我们就直接来分析 智能推荐这个功能的具体需求。
核心: 为什么在抖音刷的时候停不下来,因为他推的都符合你的爱好兴趣,审美。这是推荐系统的核心。
怎么知道用户喜欢什么?
传统做法: 根据用户行为点赞、收藏、评论、关注、转发、评论。都融合在推荐算法中
存在缺陷: 这种做法看似合理实际存在问题从神经网络流程来看,这种做法实际也是属于线性的,
举一例子:容易局限在一小范围内,就是纯靠这些数据比如你只给一个视频点赞了,比如舞蹈类,
就玩命给你推舞蹈类的最后就局限在这一个范围。但是抖音平台也好,快手平台也好,他的内容是
极其丰富的,会引起用户的审美疲劳,理论他不知是只喜欢这一个分类,他可能还喜欢别的,比如体育类的等等。那你为怎么不给他推啊?因为你是被这个线性的数据给限制了。
所以我们基于深度学习,深度学习基于神经网络架构,神经网络由神经元组成的。
机器学习有两大类问题:
分类问题: 图像识别(给特征他告诉你属于哪一类别的)
预测问题: 推荐系统也叫回归问题(给他特征,他给你预测可能发生的结果,比如预测房价趋势,市场就业率等)
我们要预测的是这个人可能喜欢的视频:首先我们必须要有一个特征,特征需要和结果存在因果关系。 我们选择完播率。 为什么要选择完播率 两个原因 1输入特征要和结果存在因果关系 2其他指标也有因果关系但是他很容易被刷,但是完播率很难被刷,必须从头看到尾,这个指标权重比较大。
最后我们和预测结果和现有的数据进行对比在偏差不大的情况下,我们即为数据合格。(存在偏差是一定的因为,概率学)
代码最不值钱最廉价关键是理解:可以简单看一下代码。
import pandas as pd import numpy as npimport tensorflow as tffrom 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()result = model.predict(x=[pred_user_id, pred_video_id], verbose=0)result_df[user] = result[0][0] result_df = pd.DataFrame(result_df).T result_df *= scalerprint(result_df)