机器学习项目(五) 电影推荐系统(一)

电影推荐系统

1.推荐系统简介
2.电影数据处理
3.简单电影推荐
4.基于内容电影推荐
5.协同过滤
6.总结

一、推荐系统简介

推荐系统的商业应用

推荐系统能找到你喜欢的 帮助你决策 然后发现新的事物
从商家的角度来说 推荐系统可以提供个性化的服务 提高用户的信任度 对推出商品的粘性 进而增加商家的营收

推荐系统就是联系用户和信息之间的关系

一方面帮助用户发现对自己有价值的信息
另一方面可以让信息展现到对其感兴趣的用户面前
从而实现了信息消费者和信息生产者的双赢

个性推荐化系统主要场景

电子商务:淘宝
电影视频推荐
音乐电台推荐:物品种类丰富 音乐种类丰富 物品重用率高
社交网络:抖音
个性化阅读
个性化广告:帮助商家找到可能对其感兴趣的用户
分为:

  1. 上下文广告 根据用户正在浏览的相关内容 投放相关的广告
  2. 搜索广告 通过分析用户在当前会话中搜索的记录 然后判断用户搜索的目的 进行投放 投放和用户目的相关的广告
  3. 个性化展示的广告 根据用户的兴趣 根据不同的用户 投放不同的广告

长尾理论

长尾理论
将庞大的长尾商品量 * 相当小的单向长尾商品的销售量
获得的收益 比较可观
所以 个性化的推荐也可以带来公司业务的增长

推荐系统的定义

1997年,Resnick和Varian提出:“它是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助用户完成购买过程”
推荐系统

三个重要的模块

1.用户建模
2.推荐对象建模模块
3.推荐算法

推荐系统项目的一般流程

流程

二、电影数据处理

数据预处理

内容:特征信息
大小:样本数目(行) 特征数目(列)
质量:缺失值 异常值

import pandas as pd
import numpy as np

md = pd.read_csv('data/movies_metadata.csv')
print(md.head())

md.shape
# (45466, 24)  样本数目 特征数目


# 检验数据的安全性 数据规范问题
from ast import literal_eval
md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(lambda x:[i['name'] for i in x] if isinstance(x, list) else [])
md.head()

# 查看缺失值情况
md.isnull().any()

md.loc[md['imdb_id'].isnull() == True]

md['imdb_id'] = md['imdb_id'].fillna('tt0000000')
md['imdb_id'].isnull().any()
# 查看每列的数值数目
md.count()

# 数据可视化
# 分类型简单推荐-不同类型的数目
# 根据不同类型电影观看的人数 判断该类型电影的流行程度 进而可以查看哪些电影是最热门的

genre_set = set()   #设置空集合
# 将电影类别名放入集合
for x in md['genres']:
    for y in range(0,len(x)-1):
        print(x[y])
        genre_set.update(x)
genre_set.discard('')  #删除''字符

genre_set

#对各种电影风格genre,进行one-hot编码
genre_df = pd.DataFrame()  # 创建空的数据框
for genre in genre_set:
    #如果一个值中包含特定内容,则编码为1,否则编码为0
    genre_df[genre] = md['genres'].str.contains(genre).map(lambda x:1 if x else 0)

md['year'] = pd.to_datetime(md['release_date'], errors='coerce').apply(lambda x: str(x).split('-')[0] if x != np.nan else np.nan)

genre_df['year']=md['year']

#将genre_df按year分组,计算每组之和。groupby之后,year列通过默认参数as_index=True自动转化为df.index
genre_by_year = genre_df.groupby('year').sum()
# 进行排序操作  False降序 True升序
genresum_by_year = genre_by_year.sum().sort_values(ascending=False)

import matplotlib.pyplot as plt
import seaborn as sns

#计算每个风格genre的电影总数目,并降序排列,再可视化
fig = plt.figure(figsize=(15,11))   #设置画图框的大小
ax = plt.subplot(1,1,1)     #设置框的位置
ax = genresum_by_year.plot.bar()
plt.xticks(rotation=60) # x轴的标签 转换60度
plt.title('Film genre by year', fontsize=18)    #设置标题的字体大小,标题名
plt.xlabel('count', fontsize=18)    #X轴名及轴名大小
plt.ylabel('genre', fontsize=18)    #y轴名及轴名大小
plt.show()  #可以用查看数据画的图。
#保存图片
fig.savefig('film genre by year.png',dpi=600)

#筛选出电影风格TOP8
genre_by_year = genre_by_year[['Drama','Comedy','Thriller','Romance',
                               'Adventure','Crime', 'Science Fiction',
                               'Horror']].loc[:,:]
year_min = md['year'].min()   #最小年份
year_max = md['year'].max()   #最大年份

year_min

# 电影数目随时间的变化趋势
fig = plt.figure(figsize=(20,20))
ax1 = plt.subplot(1,1,1)
plt.plot(genre_by_year)
plt.xlabel('Year', fontsize=30)  # fontsize 字体大小
plt.ylabel('Film count', fontsize=30)
plt.title('Film count by year', fontsize=30)
plt.xticks(range(0,150,10))  #横坐标每隔10年一个刻度
#设置表格用什么字体
font = {
    'family' : 'SimHei'
}

import matplotlib

matplotlib.rc('font', **font)
plt.legend(['Drama(戏剧类)','Comedy(喜剧类)','Thriller(惊悚类)','Romance(浪漫类)',
                               'Adventure(Adventure)','Crime(犯罪类)', 'Science Fiction(科幻类)',
                               'Horror(惊恐类)'], loc='best',ncol=2) #设置说明标签
fig.savefig('film count by year.png',dpi=200)

# 平均投票数
# 提取用户id 标题title 上映时间year popularity
popular_data=pd.DataFrame()
popular_data['id']=md['id']
popular_data['title']=md['title']
popular_data['year']=md['year']
popular_data['popularity']=md['popularity']
popular_data.head()

# vote_average 平均分
popular_data=pd.DataFrame()
popular_data['id']=md['id']
popular_data['title']=md['title']
popular_data['year']=md['year']
popular_data['vote_average']=md['vote_average']
popular_data.head()

# 基于平均分 进行排序  降序
popular_data.sort_values(by='vote_average',ascending=False).head(10)
在这里插入代码片

film genre by year
film genre by year
film count by year
film count by year

发布了110 篇原创文章 · 获赞 3 · 访问量 4058

猜你喜欢

转载自blog.csdn.net/qq_33357094/article/details/105642286