Liz's Blog

Python學習筆記#19:機器學習之Recommender Systems實作篇

| Comments

Recommender Systems(建議系統)這章講師提供基礎版及進階版的練習,基礎版像是建議類似特定項目的物件,進階版則運用更多線性代數及SciPy來運作。因此,我先暫時跳過進階版的練習啦~

Udemy
課程名稱:Python for Data Science and Machine Learning Bootcamp
講師:Jose Portilla

1.載入套件

import pandas as pd
import numpy as np

2.載入電影評價資料集

#建立欄位名稱
columns_names = ['user_id','item_id','rating','timestamp']

#載入電影評價資料集
df = pd.read_csv('u.data',sep='\t',names=columns_names)
df.head()

#載入電影名稱資料集
movie_titles = pd.read_csv('Movie_Id_Titles')
movie_titles.head()

#利用pandas中的merge把兩個資料集結合在一起
df = pd.merge(df,movie_titles,on='item_id')
df.head()

3.載入視覺化套件,並進行資料探索

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

#依照電影名稱的平均評價來做排名(由大到小)
df.groupby('title')['rating'].mean().sort_values(ascending=False).head()

#依照電影名稱的評價數量來做排名(由大到小)
df.groupby('title')['rating'].count().sort_values(ascending=False).head()

#將電影名稱的平均評價結果轉成data frame
ratings = pd.DataFrame(df.groupby('title')['rating'].mean())
ratings.head()

#新增評價數量欄位到剛剛建立的平均評價data frame
ratings['num of ratings'] = pd.DataFrame(df.groupby('title')['rating'].count())
ratings.head()

#用直方圖將評價數量畫出。如預期,評價數量逐漸下降(從100後趨勢平緩)
ratings['num of ratings'].hist(bins=70)

#利用直方圖畫出評價區間,大多若在2.5-4。
ratings['rating'].hist(bins=70)

#利用seaborn的jointplot看評價及評價數量的分佈
sns.jointplot(x='rating',y='num of ratings',data=ratings,alpha=0.5)

4.建立樞紐分析表

#建立樞紐分析表,包含user_id、電影名稱及電影評價(大多數會看到NaN,因為大多數人沒看到大多數電影)
moviemat = df.pivot_table(index='user_id',columns='title',values='rating')
moviemat.head()

#最多評價的前十名電影
ratings.sort_values('num of ratings',ascending=False).head(10)

5.找出和Star Wars相關的電影

#從剛剛建立的樞紐分析表中選出兩部電影,一個是科幻電影Star Wars,一個是喜劇Liar Liar
starwars_user_ratings = moviemat['Star Wars (1977)']
liarliar_user_ratings = moviemat['Liar Liar (1997)']

starwars_user_ratings.head()

#利用corrwith來建立與Star Wars相關的其他電影
similar_to_starwars = moviemat.corrwith(starwars_user_ratings)

#將與Star Wars相關的電影轉成data frame,且去除NaN的資料
corr_starwars = pd.DataFrame(similar_to_starwars,columns=['Correlation'])
corr_starwars.dropna(inplace=True)
corr_starwars.head()

#依照最相關開始排列
corr_starwars.sort_values('Correlation',ascending=False).head(10)

#除了與Star Wars的相關度,也加上其他電影的評價數,因為有些電影評價可能只有非常少數,
corr_starwars = corr_starwars.join(ratings['num of ratings'])
corr_starwars.head()

#避免太多人看過Star Wars,但少數電影只有非常少數的人給過評價,而給出錯誤的推薦,因此限定評價數要超過100個
corr_starwars[corr_starwars['num of ratings']>100].sort_values('Correlation',ascending=False).head()

6.找出和Liar Liar相關的電影

similar_to_liarliar = moviemat.corrwith(liarliar_user_ratings)
corr_liarliar = pd.DataFrame(similar_to_liarliar,columns=['Correlation'])
corr_liarliar.dropna(inplace=True)
corr_liarliar = corr_liarliar.join(ratings['num of ratings'])
corr_liarliar[corr_liarliar['num of ratings']>100].sort_values('Correlation',ascending=False).head()

Comments

comments powered by Disqus