/var/log/messages

Jul 19, 2018 - 2 minute read - Comments - Python MachineLearning

仕事で始める機械学習 (1)

7.3 MovieLens のデータの傾向を見る、という節を云々してる記録が残っていたので以下に控えを列挙します。

まず、以下を実行しています。

import pandas as pd

u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code']
users = pd.read_csv('ml-100k/u.user', sep='|', names=u_cols)
users.head()

読み込んでいるファイルの中身を確認してみました。

!head ml-100k/u.user
1|24|M|technician|85711
2|53|F|other|94043
3|23|M|writer|32067
4|24|M|technician|43537
5|33|F|other|15213
6|42|M|executive|98101
7|57|M|administrator|91344
8|36|M|administrator|05201
9|29|M|student|01002
10|53|M|lawyer|90703

pandas 便利ですね。次は u.data を読み込んでいます。

r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp']
ratings = pd.read_csv('ml-100k/u.data', sep='\t', names=r_cols)
ratings['date'] = pd.to_datetime(ratings['unix_timestamp'], unit='s')
ratings.head()

u.data は以下な形になっています。

!head ml-100k/u.data
196        242        3        881250949
186        302        3        891717742
22        377        1        878887116
244        51        2        880606923
166        346        1        886397596
298        474        4        884182806
115        265        2        881171488
253        465        5        891628467
305        451        3        886324817
6        86        3        883603013

date という列を追加して人間サマが見易い形式にしていますね。 で、最後に映画情報を入力しています。

m_cols = ['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url']
movies = pd.read_csv('ml-100k/u.item', sep='|', names=m_cols, usecols=range(5), encoding="latin1")
movies.head()

こちらもファイルの中身確認。

!head ml-100k/u.item
1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0
3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0
4|Get Shorty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Get%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0
5|Copycat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0
6|Shanghai Triad (Yao a yao yao dao waipo qiao) (1995)|01-Jan-1995||http://us.imdb.com/Title?Yao+a+yao+yao+dao+waipo+qiao+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0
7|Twelve Monkeys (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Twelve%20Monkeys%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0
8|Babe (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Babe%20(1995)|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0
9|Dead Man Walking (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dead%20Man%20Walking%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0
10|Richard III (1995)|22-Jan-1996||http://us.imdb.com/M/title-exact?Richard%20III%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0

先頭からいつつまでの列のみを使っている模様。で、movies と ratings を merge して、merge したものと users をさらに merge しています。movie_rating の中身が見れるかな。

movie_rating.head()

おなじ名前の column で merge する、という理解にしときます。で、このあたりから確認しないと、な式が出てきますね。とりあえず

movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]})

は title 列で groupby して rating 列のサイズと算術平均を movie_stats に格納しているのかな。で、raging の mean の値順で sort してる模様。

movie_stats.sort_values(by=[('rating', 'mean')], ascending=False).head()

ただ、これだと小さい size も含まれるので何らかのフィルタを通したい、と。

atleast_100 = movie_stats['rating']['size'] >= 100

rating, size な列の値が 100 以上かどうか、という boolean な配列? リスト? ができるのか。そして以下のようにすると

movie_stats[atleast_100]

atleast_100 が True な要素を抜き出せる模様。それを sort_values しているのが以下なのか。

movie_stats[atleast_100].sort_values(by=[('rating', 'mean')], ascending=False)[:15]

次に評価回数の分布を見ています。lens はユーザ毎の映画の評価、になっているので user_id のカウントを取ればユーザ毎の評価回数が分かるのか。

lens.groupby('user_id').size()

並び替えをしてヒストグラムを描画しています。

from matplotlib import pyplot as plt
plt.style.use('ggplot')

lens.groupby('user_id').size().sort_values(ascending=False).hist()

plt.xlabel('rating size')
plt.ylabel('count of rating')

グラフがコピペできず。

週末

台風らしいので 7.4 節をたいふうソンで云々な方向なのかどうか。

Jasper Recommendation 取得実装について

comments powered by Disqus