import pandas as pd
import numpy as np
import pickle
import re
def
load_data()
:#讀取user資料
users_title=
['userid'
,'gender'
,'age'
,'jobid'
,'zip-code'
] users=pd.read_csv(
'./ml-1m/users.dat'
,sep=
'::'
,header=
none
,names=users_title,engine=
'python'
) users=users.
filter
(regex=
'userid|gender|age|jobid'
)#去掉zip-code
#filter過濾列表中的元素,並且返回⼀個由所有符合要求的元素所構成的列表,符合要求即函式對映到該元素時返回值為true.這個filter類似於⼀個for迴圈,但它是⼀個內建函式,並且更快。
users_orig=users.values
#改變類別資料——性別&年齡
gender_map=
users[
'gender'
]=users[
'gender'].
map(gender_map)
age_map=
users[
'age'
]=users[
'age'].
map(age_map)
#讀取movie資料
movies_title =
['movieid'
,'title'
,'genres'
] movies = pd.read_csv(
'./ml-1m/movies.dat'
, sep=
'::'
, header=
none
, names=movies_title, engine =
'python'
) movies_orig = movies.values
#將title中的年份去掉
pattern = re.
compile
(r'^(.*)\((\d+)\)$'
) title_map =
movies[
'title'
]= movies[
'title'].
map(title_map)
#將電影的分類轉化為數字字典
genres_set=
set(
)for val in movies[
'genres'].
str.split(
'|')
: genres_set.update(val)
genres_set.add('')
#空白填充為'',統一長度所需,為神經網路模型訓練提供便利
genres2int=
#將電影型別轉成等長數字列表,長度是18
genres_map =
for key in genres_map:
for cnt in
range
(max
(genres2int.values())
-len
(genres_map[key]))
: genres_map[key]
.insert(
len(genres_map[key]
)+ cnt,genres2int['']
)
movies[
'genres'
]= movies[
'genres'].
map(genres_map)
#電影title轉數字字典
title_set =
set(
)for val in movies[
'title'].
str.split():
title_set.update(val)
title_set.add('')
title2int =
#將電影title轉成等長數字列表,長度是15
title_count =
15 title_map =
for key in title_map:
for cnt in
range
(title_count -
len(title_map[key]))
: title_map[key]
.insert(
len(title_map[key]
)+ cnt,title2int['']
)
movies[
'title'
]= movies[
'title'].
map(title_map)
#讀取評分資料集
ratings_title =
['userid'
,'movieid'
,'ratings'
,'timestamps'
] ratings = pd.read_csv(
'./ml-1m/ratings.dat'
, sep=
'::'
, header=
none
, names=ratings_title, engine =
'python'
) ratings = ratings.
filter
(regex=
'userid|movieid|ratings'
)#合併三個表
data = pd.merge(pd.merge(ratings, users)
, movies)
#將資料分成x和y兩張表
target_fields =
['ratings'
] features_pd, targets_pd = data.drop(target_fields, axis=1)
, data[target_fields]
features = features_pd.values
targets_values = targets_pd.values
return title_count, title_set, genres2int, features, targets_values, ratings, users, movies, data, movies_orig, users_orig
title_count, title_set, genres2int, features, targets_values, ratings, users, movies, data, movies_orig, users_orig = load_data(
)#pickle儲存到本地後可以快速載入
pickle.dump(
(title_count, title_set, genres2int, features, targets_values, ratings, users, movies, data, movies_orig, users_orig)
,open
('preprocess.p'
,'wb'
))
users.head(
)
userid
gender
agejobid01
00101
21516
2316
15341
2745
1620
movies.head(
)
movieid
title
genres01
[2194, 4563, 2402, 2402, 2402, 2402, 2402, 240...
[16, 18, 5, 13, 13, 13, 13, 13, 13, 13, 13, 13...12
[2558, 2402, 2402, 2402, 2402, 2402, 2402, 240...
[10, 18, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13...23
[1335, 4290, 3288, 2402, 2402, 2402, 2402, 240...
[5, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13...34
[2423, 5164, 3171, 2402, 2402, 2402, 2402, 240...
[5, 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13...45
[4573, 2552, 1568, 2808, 2806, 1319, 2402, 240...
[5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13...
movies.values[
0]
array([1,
list([2194, 4563, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402, 2402]),
list([16, 18, 5, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13])],
dtype=object)
個性化推薦系統
基於協同過濾的推薦大體包括 基於專案的協同過濾 item basedcf 基於使用者的協同過濾 user basedcf 基於模型的協同過濾演算法 1 3 基於專案的協同過濾 item basedcf 首先根據不同使用者歷史購買商品的評分資訊計算出各專案之間的相似度,構建各專案之間的相似度矩陣 再找...
推薦系統概述 個性化推薦
1.從乙個例子出發 兩名使用者都在某電商 購買了a b兩種產品。當他們產生購買這個動作的時候,兩名使用者之間的相似度便被計算了出來。其中一名使用者除了購買了產品a和b,還購買了c產品,此時推薦系統會根據兩名使用者之間的相似度會為另一名使用者推薦專案c。2.應用現狀 推薦系統可以說是無處不在了,比如 ...
個性化推薦技術
如果說過去的十年是搜尋技術大行其道的十年,那麼個性化推薦技術將成為未來十年中最重要的革新之一。目前幾乎所有大型的電子商務系統,如amazon cdnow netflix等,都不同程度地使用了各種形式的推薦系統。而近來以 發現 為核心的 正開始在網際網路上嶄露頭角,比如側重於 推薦的八寶盒,側重於圖書...