人工智能领域:推荐系统

这个智能推荐使用的也是深度学习框架tensorflow,在前面的文章中我们已经对tensorflow 以及机器学习 和 深度学习做了一个详细的介绍。下面我们就直接来分析 智能推荐这个功能的具体需求。

核心: 为什么在抖音刷的时候停不下来,因为他推的都符合你的爱好兴趣,审美。这是推荐系统的核心。

怎么知道用户喜欢什么?

传统做法: 根据用户行为点赞、收藏、评论、关注、转发、评论。都融合在推荐算法中

存在缺陷: 这种做法看似合理实际存在问题从神经网络流程来看,这种做法实际也是属于线性的,

举一例子:容易局限在一小范围内,就是纯靠这些数据比如你只给一个视频点赞了,比如舞蹈类,

就玩命给你推舞蹈类的最后就局限在这一个范围。但是抖音平台也好,快手平台也好,他的内容是

极其丰富的,会引起用户的审美疲劳,理论他不知是只喜欢这一个分类,他可能还喜欢别的,比如体育类的等等。那你为怎么不给他推啊?因为你是被这个线性的数据给限制了。

所以我们基于深度学习,深度学习基于神经网络架构,神经网络由神经元组成的。

机器学习有两大类问题:

分类问题: 图像识别(给特征他告诉你属于哪一类别的)

预测问题: 推荐系统也叫回归问题(给他特征,他给你预测可能发生的结果,比如预测房价趋势,市场就业率等)

我们要预测的是这个人可能喜欢的视频:首先我们必须要有一个特征,特征需要和结果存在因果关系。 我们选择完播率。 为什么要选择完播率 两个原因 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)

这样我们就做好了一个需要收费的功能;

你可能感兴趣的:(机器学习,人工智能)