再現するように特徴ベクトルの値を決めることができれば、未評価の部分、例えばAliceがスタートレックを見たときの評価点の推定値をとして求めることができます。このように未評価部分を計算によって求め、その値が高いものを取り出すことによってレコメンデーションができるようになります。4作品=12点のうち7点がすでに埋まっているというそれなりに密(dense)なデータですが、人と作品の数が多くて実際の評価点が少ない疎(sparse)なデータに対しても特徴次元を低く抑えつつうまく学習することができれば、良い推定値を求めることができる可能性があります。Factorizationの基本的な考え方ですが、MFにはいくつかの発展形がありますのでそれを簡単に紹介しましょう。中に押し込めましたが、人または作品片方にしか依存しない性質、つまり評価が全体的に辛口/甘口な人であるとか、誰もが高い/低い評価を与える作品といったものがあるかもしれません。Factorizationです。するとと表されることになります。要素も全て非負にせよという制約を置くことができます。(NMF)といいます。特徴ベクトルの成分の中に不用意に大きな値があったとする→全ての要素が0以上のため後からマイナスの値で打ち消すことができない→最適化するにはどうしても慎重にならざるを得ないということで、罰則項による正則化に似た効果があるからではないかと、筆者個人としては解釈しています。(NMFについては過去に別の記事を書いていますので興味があればそちらもご参照ください。Factorizationこれまでの例は人と作品という2軸のみを考えていましたが、問題設定によってはより多くの軸があり得ます。配信広告という3軸で行われます。いう"3次元"行列(縦横に加え奥行がある)として表現されます。いう3つの特徴行列を考えることで、(5)式を拡張した以下のような"内積"によって推定値を得ることができます。Factorizationと呼ばれているようです。(NTF)といった拡張も可能です。(FM)さて、次はFMです。基本的なFMにおいては、表1のデータは次のような持ち方をします。MFに比べるとちょっとわかりにくいですね。入力の特徴ベクトルで、値の0/1はBoolean的な意味と思ってください。Alice(A)とタイタニック(TI)のところにフラグが立っているだけで、1という値の大きさに意味はありません。2人以上の人(AとB)や2つ以上の作品(TIとNH)に同時に1が立つこともありません。Machineの数式モデルは以下のように与えられます。例によってハイパーパラメータです。モデルの学習ができたとして、再びBobのタイタニックに対する評価値を推定してみましょう。Factorizationに一致するのです。Factorizationになります。MFで満足せずわざわざFMのようなモデルを新しく考えるかというと、フラグ以外の属性を加えるという拡張性があるからです。このセクションの初めに"最も基本的なFM"と書いたのはこのためです。再度FMの論文から例を拝借するとわかりやすくするために罫線を入れてあります。その人が評価を行った作品に対して1/評価件数が、Timeには2008年12月から数えて何ヵ月後に評価を行ったかが入っています。このような属性を追加することにより、例えば直近に行った評価の方により重みを置くとか、過去に評価したことのある作品の影響を評価推定値に反映させるといったことが可能になります。Bobが2010年6月にタイタニックを評価した場合の特徴ベクトルはとなるので、その評価予測値は(9)式よりとして求められます。この例で考えた項目に限らず、自分が使いたいと思った付帯属性を好きなだけモデルに加えて拡張していけるというのがFMの強みです。(FFM)では最後にFFMの説明をします。カラムをfield(日本語訳不明)と呼ばれるクラスに分け、同じBobを表現するベクトルであってもfieldごとに異なるものを用意し、内積をとる相手が属するクラスに応じて使い分けるということをします。(9)式の2次の部分のFFM版はとなります。(14)式に対応するFFM版の予測式はとなります。使い分けられています。]などに応用されています。Machinesは用意されているのですが、プログラムを自前で組むのはハードルが高いので、今回はSQLでお手軽に実行できるHivemallで試してみようと思います。Hivemallとは、トレジャーデータ株式会社の油井誠氏によって開発されている機械学習ライブラリで、SQL-likeなクエリを使ってプログラミングレスで学習から予測までの機械学習の一連の処理を実行することができるというものです。トレジャーデータサービス(TDS)を導入してログを格納していれば、そのデータに対して手軽に分析をかけることができます。Qiita)がありますのでそちらをご参照ください。information)が含まれていないようなので(2016/6/12現在)、今回は(12)のデータを使ったFMのやり方を示してみようと思います。以下の例では、データベースは全てfm_test_dbを使うものとします。次のようなCSVファイルを作ってトレジャーデータのobserved_dataテーブルにアップロードします。Uploadするのが一番楽です。(0)をダミーで指定しています。これを形式変換してobserved_featuresテーブルに保存します。observed_data"質的変数(値の大きさに意味のないもの)はcategorical_featuresに、量的変数はquantitative_featuresに渡し、concat_arrayで結合します。rescaleは変数を0-1の範囲に規格化したい場合に使用します。このコマンドを実行するとobserved_featuresテーブルには以下のようなデータが入ります。通常、機械学習ではデータセットを学習用データと検証用データに分け、学習の結果得られたモデルの精度の検証を行うのですが、今回は元データが7レコードしかないため全てを学習に使用します。検証用データを分ける方法については公式ドキュメントを参照してください。feature"train_fmに与えたオプションパラメータは次のような意味です:itersは学習の際のイテレーションの回数を指定します。maxには目的変数(現在の場合は映画に対する5段階評価)の値の範囲を指定しますが、学習後のモデルによる予測値が厳密にmin~maxの間に収まるというものではなく、学習のヒント程度とのことです。得られたfm_modelは以下のようになります。(9)式と比較すると、Wiがそれぞれのバイアス、Vifが特徴を表すベクトル(ここでは2次元)に対応していることがわかります。モデルの学習が済んだので、予測を行いましょう。予測用データとして、すでに学習用に使ったものも含めた3人×4作品の全12通りの組み合わせを用います。monthsには、2010年6月に評価を行うという想定で18を入れます。userId,movieId,n1,n2,n3,n4,months,timeA,TI,0.333333,0.333333,0.333333,0.000001,18,0A,NH,0.333333,0.333333,0.333333,0.000001,18,0A,SW,0.333333,0.333333,0.333333,0.000001,18,0A,ST,0.25,0.25,0.25,0.25,18,0B,TI,0.333333,0.000001,0.333333,0.333333,18,0B,NH,0.000001,0.333333,0.333333,0.333333,18,0B,SW,0.000001,0.000001,0.5,0.5,18,0B,ST,0.000001,0.000001,0.5,0.5,18,0C,TI,0.5,0.000001,0.5,0.000001,18,0C,NH,0.333333,0.333333,0.333333,0.000001,18,0C,SW,0.5,0.000001,0.5,0.000001,18,0C,ST,0.333333,0.000001,0.333333,0.333333,18,0これをto_be_predictedテーブルに格納したとして、先ほどと同じようにfeaturesに変換します。to_be_predicted"さらにこれをexplodeします。fv"features_to_be_predicted_explodedに格納されるデータのうちAlice×タイタニックのものを抜き出すと以下のようになります。これで準備が整いました。t1.rowid"これを(1)式のような行列で表現すると(1)式を再掲します。これらを比較すると、評価値があるところについてはその値がある程度再現されており、未評価部分も埋まっていることが見て取れます。これにより、例えばCharlieに対してレコメンドを行う際には、ノッティングヒルの恋人(約2.60)よりもスタートレック(約5.18)の方が高評価になりそうということがわかります。HivemallにはFFMも近いうちに実装予定(2016/6/12現在)とのことですので、利用可能になったら試してみたいと思います。Machinesのおはなし。3つ足を持つので成分表記としては"3次元行列"として書けるが一般座標変換の下でテンソルとしての変換性を有しない)が、細かいことを気にしたら負けです。Word2Vec)こんにちは!5日間インターンに参加させて頂いた中島です。昨...2018-01-05無料のeラーニング「Aidemy」をやってみて、ディープラーニングでひらがなを分類してみた。皆様新年あけましておめでとうございます。Are青山のアドテク会社。アドネットワークやDSPを開発・運用。サーバを止めてみたよ。インターン:実業務体験編インターンでCTR予測をしましたSearchArchiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。