St_Hakky’s blog

心理学/人事/就活/留学/データサイエンス/バイオインフォマティクス/日頃思ったことについて書きます。

Rで協調フィルタリングをやってみた

こんにちは。

実際のレコメンドシステムでは、こういったパッケージを利用するのではなく、独自アルゴリズムなどを開発して自社パッケージとして持っておくのが普通かなぁと思う。

んだけど、PoC(Proof of Concept)の段階、つまりレコメンドを実業務に導入する前の手間では、パッケージを使うのが手っ取り早いなぁと思うので、今回はパッケージを使っていく。

○Rのパッケージ:recommenderlab

このパッケージでは、「レーティングの予測」と「Top-Nリストの生成」の2種類のレコメンデーション機能を持っている。独自アルゴリズムを実装する際のコストも比較的小さく済むなど、拡張性に優れている。これらに興味がある場合や、Top-Nリストの生成についての興味がある場合は、以下の論文が参考になる。

Hahsler, Michael. "recommenderlab: A Framework for Developing and Testing Recommendation Algorithms." Southern Methodist University (2011).

○recommenderlabのインストールとパッケージの読み込み

普通にCRANから落としてこれるので、以下のコマンドを叩けば基本的には大丈夫。

# パッケージのインストール
install.packages("recommenderlab")

# パッケージの読み込み
library(recommenderlab)

○データの取得

■recommenderlabに用意されているサンプルデータ

今回使用するデータは、recommenderlabの中にあるデータセットである。recommenderlabには3つのデータセットが用意されている。

[工事中]

■recommenderlabの各種便利メソッドを使うためのデータ整形法

[工事中]

■データのロードと概要把握

今回は、MovieLenseというデータを用いて解析を行う

# dataのload
data(MovieLense)

# dataの確認
# 出力 : 943 x 1664 rating matrix of class ‘realRatingMatrix’ with 99392 ratings.
print(MovieLense)

# データのクラスの確認
# 出力:"realRatingMatrix"
class(MovieLense)

# "realRatingMatrix"のままではデータの中身が見れない。
# R汎用データ型の「data.frame」に変換してから出力。
head(as(MovieLense, "data.frame"))

f:id:St_Hakky:20170211183616p:plain

→こんなデータセットになっている。どうやらuser, item, ratingのカラムがあって、それぞれ値があることがわかる。user 1は、Toy Storyが好きな様子笑

ちなみに、ユーザーがすべての映画に評価をつけていることはないので、評価がついていない映画に対するratingはどうなっているかというと、

# 今度は「matrix」に変換して出力
as(MovieLense, "matrix")[100:110, 1:4]

f:id:St_Hakky:20170211184208p:plain

と、こんな感じでNAが入っているんだなぁってことがわかる。結構スパースだなぁ。ってか当たり前か。

次はデータの全体像を俯瞰するために、可視化させてみる。今回のデータのクラスである"realRatingMatrix"には、image関数がデータの特徴を俯瞰するために用意されている。

image(MovieLense, main="Raw Ratings")

f:id:St_Hakky:20170211184537j:plain


ユーザーを軸に、ユーザーごとのrating件数とratingの平均の傾向を確認する。今回のデータのクラスの"realRatingMatrix"には、rowCounts関数とrowMeans関数が用意されているので、これを使う。

# userごとのrating件数について
summary(rowCounts(MovieLense))

f:id:St_Hakky:20170211185007p:plain

# histgramを書いてみる
hist(rowCounts(MovieLense))

f:id:St_Hakky:20170211185708j:plain

→まぁ当然っちゃ当然みたいな結果だけど、それにしても結構みんなratingつけてるな笑

# userごとのrating平均について
summanry(rowMeans(MovieLense))

f:id:St_Hakky:20170211185112p:plain

# 同じくhistgram
hist(rowMeans(MovieLense))

f:id:St_Hakky:20170211185830j:plain

→結構4近いところで集中はあれど、って感じですな。

これらの結果から、全体的な傾向としては同じでも、人によって幾ばくかのレーティングバイアスがあることがわかるので、正規化を行う。center法をここでは使う。

summary(rowMeans(normalize(MovieLense, method="center")))

f:id:St_Hakky:20170211190432p:plain

# histgramも書いてみる
hist(rowMeans(normalize(MovieLense, method="center")))

f:id:St_Hakky:20170211190526j:plain

ふむ。だいたい正規化できたかなーと。

○レコメンデーションアルゴリズムの適用

■"realRatingMatrix"で使えるアルゴリズム

ここで、今回のデータ型である"realRatingMatrix"では、どんなアルゴリズムが適用可能なのかをみる。そのためには以下のコマンドを叩けば良い。

recommenderRegistry$get_entries(dataType = "realRatingMatrix")

ぶっちゃけここに出てくる内容を眺めるのは割と苦痛なのと、分かりにくいので、以下の表が参考になるかと。

Algorithm 概要
RANDOM アイテムをランダムに選んで、レコメンド
POPULAR 購入ユーザー数に基づいて人気度が高いアイテムをユーザーにレコメンド
UBCF ユーザーベース協調フィルタリング
IBCF イテムベース協調フィルタリング
PCA 次元削減手法の代表例である、主成分分析
SVD Singular Value Decompositionという、次元削減手法の代表的なものの一つ
アルゴリズムの実行の流れ

アルゴリズムを実行するには、大きく分けて以下の二つの処理が必要。

1. レコメンダーの作成
→訓練データを使ってレコメンダーを作成する
2. レコメンデーションの予測
→ユーザーへのTop-Nリストを作成したり、ユーザーへの未レーティングアイテムのレーティングを予測したりする。

■UBCFを適用してみる

とりあえず、MovieLenseのユーザー900人のデータを使ってレコメンダーモデルを構築する。

# methodはUBCF。パラメータは調整できるが、ひとまずデフォルトで攻める。
r <- Recommender(MovieLense[1:900], method="UBCF")

構築したレコメンダーを使って、901番目〜910番目のユーザーのレーティングを予測してみる。

# 構築したレコメンダーを使って、901番目〜910番目のユーザーのレーティングを予測
p <- predict(r, MovieLense[901:910], type="ratings")

# 結果の出力
print(as(p, "matrix")[1:10, 1:5])

以下が結果の図(一部)。
f:id:St_Hakky:20170211194614p:plain

結果は一部だけ表示されているが、以下の元のデータの中身と結果を比較すると、レーティング済みの映画は予測対象外となっていて、レーティングされていないところは、予測値が入っている。

f:id:St_Hakky:20170211194959p:plain

(→これは元のデータ)

アルゴリズムの評価

レーティングの予測結果としては、Netflix Prizeにも使われていたRMSEが有名。なので、今回もこれを使う。

今回は、8割を学習に使い、2割を評価用に使う。

# splitを使って、評価データを作成
# train=0.8で、8割のデータを使うとしている
# given=15で、残り2割の評価データのうち、15件を予測用評価データとして使うことを示し、その他のデータは予測誤差計算用評価データとして利用することを示す。
e <- evaluationScheme(MovieLense, method="split", train=0.8, given=15)

今回は、UBCFとRANDOMを比較してみる。

# 学習
r.ubcf <- Recommender(getData(e, "train"),method="UBCF")
r.random <- Recommender(getData(e, "train"),method="RANDOM")

# 予測用評価データとレコメンダーを使って、レーティング予測を実施
p.ubcf <- predict(r.ubcf, getData(e, "known"), type="ratings")
p.random <- predict(r.random, getData(e, "known"), type="ratings")

# 予測誤差計算用評価データを使って、予測用評価データより計算された、それぞれの誤差を計算
e <- rbind(calcPredictionAccuracy(p.ubcf, getData(e, "unknown")), calcPredictionAccuracy(p.random, getData(e, "unknown")))

# 結果を出力
rownames(e) <- c("UBCF", "RONDOM")
print(e)

f:id:St_Hakky:20170211200930p:plain

とまぁこんな感じで、UBCFの方が小さくなっていることがわかる。

今日は以上!!!!

Rでアソシエーション分析:アプリオリアルゴリズム編

こんにちは。

○arulesを使ってアソシエーション分析

■arules関係のパッケージ

以下のサイトにまとまっている。

lyle.smu.edu

■インストールと読み込み
# “arules”のインストール
install.packages("arules")

# ライブラリの読み込み
library(arules)
■データの読み込みと中身の確認

今回は、arulesパッケージ付属のサンプルデータセット「Groceries」を使う。

# データの読み込み
data(Groceries)

# 型を確認
class(Groceries)

# 中身を上5件出力
inspect(head(Groceries))

# 基本統計量の出力
summary(Groceries)

# 相対出現頻度によるヒストグラムを出力
itemFrequencyPlot(Groceries, support=0.06, cex.names=1.0)

以下の図は、相対出現頻度によるヒストグラムを出力をした結果である。

f:id:St_Hakky:20170207173730j:plain

■ちょっとここで脱線:arulesのデータ型ってどんな風になってんの?笑

[工事中]

アプリオリアルゴリズムの適用
# アプリオリアルゴリズムの実行
rules <- apriori(Groceries, parameter=list(support=0.005, confidence=0.01))
■結果の出力・可視化

arulesVizパッケージを結果の可視化には使います。

# パッケージのロード
library(arulesViz)

散布図の出力をする。

# 散布図

plot(rules)

f:id:St_Hakky:20170207191952j:plain

バブルチャートも出力して見る。

# アソシエーションルールのバブルチャート

plot(rules, method="grouped", control=list(k=10))

f:id:St_Hakky:20170207192319j:plain

グラフで表示して見る。

# アソシエーションルールをグラフで書く

plot(rules_high_lift, method="graph", control=list(type="items"), interactive=TRUE)

f:id:St_Hakky:20170207193222j:plain

以上!

MacへのRstanのインストール

以下の本を読んでいます。

この本では、OSがwindows対象なので、Macとの差分を書いて行こうかと。あと、余力があればPythonでstanを用いた場合のコードとかも書いていく。

インストール方法は、すぐに廃れてしまいますが、以下のような感じで行うというのをメモ。

○Prerequisites

・R version 3.0.2 or later
→Rの3.2.0以下のバージョンでは、一部動作しないらしいので、3.2.0以上を入れるのが良さそう。

・Toolchain
C++ compiler and GNU-compatible versionをインストールする必要があります。これは、Xcodeをインストールしていればおっけー。

○RStanのインストール

以下のコマンドを叩くだけです。

# note: omit the 's' in 'https' if you cannot handle https downloads
install.packages("rstan", repos = "https://cloud.r-project.org/", dependencies=TRUE)

もし失敗したら、こっちを試してください。

install.packages("rstan", type = "source")

○確認

インストールが終了したら、Rを再起動して、以下のコマンドからstanが実行できているかを確認しましょう。

fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , '
    return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
' )
fx( 2L, 5 ) # should be 10

10が帰ってきたら、正常にインストールされていると思います。

インストールできました。早速使っていくか。

○参考サイト

github.com

Mac上にAtomでLatex環境を整えて論文を書く

こんにちは。私も世に言う博士前期課程でして、論文を書く身分ですので、環境を整えようと思った次第です。

最近は非エンジニア相手でなければ、なんでもAtomで済むことが多いので、latexもそうするかぁと思って、そうしようと思いました。

そして、タイトルにあるような内容を書こうと思ったら、以下のサイトを見つけました。

qiita.com

神か。

上に従って環境を整えたら、以下のコマンドを叩く。

・ただのコンパイル

latexmk sample.tex

コンパイルしてPDFで閲覧

latexmk -pv sample.tex

・監視(自動更新)

latexmk -pvc sample.tex

・中間生成ファイルを削除

latexmk -C sample.tex






そして一言。








名も知らぬ誰か様。とっても、とってもありがとう。









これに従って環境を整えました。



さて、論文でも書きます。


○補足情報

みんなhomebrew-caskって知ってるか? - Qiita
Macのセッティングが楽チンに!『Homebrew Cask』でソフトを簡単インストール | ライフハッカー[日本版]
macOS Sierra に Homebrew と Cask をクリーンインストールする - 時と場合によりけり
定期的に自動でコミットさせるスクリプト - Qiita
シェルスクリプト入門 書き方のまとめ | Memo on the Web

コンピューターで「脳」がつくれるか を読んだ

こんにちは。最近研究室にあった本で気になっていた本を読んでみたので、その感想でも書きます。

○読んだ本

「コンピューターで「脳」がつくれるか」という、以下の本を読みました。

○本の対象読者とざっくりとした内容

この本は、ある程度予想はしていたのですが、基本的に内容としては深く入りすぎず、全体像をさらうイメージの本でした。なので、想定の読者としては、

・数式なんてわからぬ。見たくも無い。
・でも、人工知能とか機械学習、Deeplearningって何だ?わけわからんけど、一通り知っておきたい。

的な人かと思います。マジで「人工知能ってニュースでよくみるけど、よくわからん」みたいな人にはオススメです。

一応、この本の立ち位置的には汎用AI(強いAI)は作れるのかという観点で話が進んでいますが、特化型AI(弱いAI)の方も引き合いで出てきますし、Deeplearningの話もされていて、かつ脳の話も出てくるので、普通に人工知能ってなに?みたいなことをさらうにはいい本だと思います。

対象読者として100パーセント引っかからないと思うのは、

・「人工知能などに何らかの形で従事している人」
・「機械学習やDeepLearningなんて普通に知っとるわタコ

みたいな人は、1680円+税をドブに捨てるようなものですので、絶対に読まなくていいでしょう笑。人生は限られていますので笑。

しかし、「あんまり統計や数学がわからない人が、人工知能系や機械学習に詳しく無い人がどう言った形で人工知能を学び、イメージするのか」をイメージできる本でもあるので、その意味で、全然知らない人に人工知能機械学習を説明するための参考になる本だと思います。

特に、誤差逆伝搬がなぜ層がDeepになるとうまくいかないか、とかは「あーこういう説明の仕方もあるのかぁ」となりました。

○読んだ感想とメモ

汎用人工知能の研究などは僕は普段追いかけていないので、その部分周りの話とか、いつも聞いてよくわからないなぁってなってた脳の話とかは結構整理できてよかった。

■メモ
・モラベックのパラドックス:「コンピュータにとっては(AI)、人間には難しいことほど簡単で、人間には簡単なものほど難しい」という逆転現象のこと
・汎用AIの研究:Hierarchical Temporal Memory/PredNed/BESOM

2時間もかからずに読めたので、まぁ休日にコーヒー片手に読むのには良かったですね。

それでは。