SAS ViyaによるFactorization Machineの基本的な使い方

SAS ViyaはAIプラットフォームを提供しています。デモもあるのですが、全体が英語なので利用するまでに躊躇してしまう人も多いかと思います。そこで、PythonでFactorization Machineの基本的な使い方を体験する流れを紹介します。

# 利用開始まで

まず SASの開発者サイトにアクセスします。開発者サイトは [https://developer.sas.com/home.html](https://developer.sas.com/home.html) です。

![Screenshot_ 2018-06-27 14.59.58.png](https://qiita-image-store.s3.amazonaws.com/0/197026/8acfe222-35ea-79bc-d098-77e42347902e.png)

そして、 [Get started with your SAS Viya Developer Trial](https://www.sas.com/en_us/trials/software/viya-developer/form.html) を押します。

![Screenshot_ 2018-06-27 15.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/197026/5a595a61-9133-90bc-9dfa-6ac5569e6909.png)


試すためには SAS Profile （SASプロファイル） というのが必要です。まず [Create one](https://login.sas.com/opensso/UI/Login?realm=/extweb&goto=https://www.sas.com/en_us/trials/software/viya-developer/form.html) をクリックします。

<img width="2970" alt="Screenshot_ 2018-06-27 15.04.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/197026/1ee63a5b-a81e-0e22-17c8-90deb0c58019.png">

SASプロファイルを登録するをクリックします。

![Screenshot_ 2018-06-27 15.05.26.png](https://qiita-image-store.s3.amazonaws.com/0/197026/ef1c48e1-5274-85b4-83b4-50519b28408f.png)


情報を入力します。

![Screenshot_ 2018-06-27 15.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/197026/b6167273-8309-eac3-6cb8-f3d9d88ecb9f.png)



フォームを送信するとメールが送られてきます。

![Screenshot_ 2018-06-27 15.06.23.png](https://qiita-image-store.s3.amazonaws.com/0/197026/89461c01-9991-1861-a09c-4bdb6b2fd8ae.png)


メールに書かれている **SASプロファイルをアクティベートする** をクリックします。

![Screenshot_ 2018-06-27 15.08.01.png](https://qiita-image-store.s3.amazonaws.com/0/197026/bb5ed70b-931a-f4c2-4d56-b04094bba800.png)


そしてパスワードを設定します。

![Screenshot_ 2018-06-27 15.08.34.png](https://qiita-image-store.s3.amazonaws.com/0/197026/5e631d6b-92df-949c-683d-f23ecbbea39b.png)


SASプロファイルがアクティベートされます。 **続ける** をクリックします。

![Screenshot_ 2018-06-27 15.09.03.png](https://qiita-image-store.s3.amazonaws.com/0/197026/8acd3639-0522-d3ba-7570-08fe31d3bf4c.png)


そうすると先ほどの SAS® Viya® Developer Trial の画面に戻ってきますので、 今度はSign In をクリックします。

![Screenshot_ 2018-06-27 15.09.43.png](https://qiita-image-store.s3.amazonaws.com/0/197026/d70b2da0-634a-3e99-2200-7de7b76b2001.png)

先ほど登録したSASプロファイルのID、パスワードでログインします。

![Screenshot_ 2018-06-27 15.10.15.png](https://qiita-image-store.s3.amazonaws.com/0/197026/064c9340-36fd-792f-9eb8-14da0d58c5dc.png)


ログインすると SAS® Viya® Developer Trial の画面に戻ってきますが、今回はプロファイルの内容が入力されているはずです。一番下にある Sign me upボタンをクリックします。

![Screenshot_ 2018-06-27 15.11.20.png](https://qiita-image-store.s3.amazonaws.com/0/197026/40903d65-8cd9-a359-5be4-881317f32db4.png)


これで SAS® Viya® Developer Trial の申し込みが終わりました。数分後にメールが送られてきます。

![Screenshot_ 2018-06-27 15.12.24.png](https://qiita-image-store.s3.amazonaws.com/0/197026/c0ac5de5-2f22-1c9a-a37c-ce7fed3363f1.png)


送られてきたメールにある **Log in to your Trial Portal** のリンクをクリックします。

<img width="1824" alt="Screenshot_ 2018-06-27 15.13.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/197026/186feb88-d04a-5fc4-2a3a-d5feb89ab0a3.png">


利用規約が表示されますので、問題なければAcceptボタンを押します。

![Screenshot_ 2018-06-27 15.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/197026/777cb262-975b-05f6-fd17-94f799d120fb.png)


そうするとログインフォームが出るので、先ほど登録したID、パスワードでログインします。

![Screenshot_ 2018-06-27 15.14.55.png](https://qiita-image-store.s3.amazonaws.com/0/197026/a855abd5-63f7-b96d-3f1f-4e499fb17713.png)


ログインすると Getting Started: SAS® Viya™ Developer Trial が表示されます。

![Screenshot_ 2018-06-27 15.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/197026/b06118e0-bcfb-1864-58c9-5ac897d57c97.png)



下の方にある Get started with Python, R, and SAS API via Jupyter Notebook をクリックします。

![Screenshot_ 2018-06-27 15.16.30.png](https://qiita-image-store.s3.amazonaws.com/0/197026/7b9c13ac-18fc-0825-2663-a390c06564ab.png)


さらに Start My Trial Now をクリックします。

<img width="2436" alt="Screenshot_ 2018-06-27 15.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/197026/5fe09c63-be6c-880b-c380-2ae0c25c9d24.png">


そうすると見慣れたJupyter Notebookの画面が出ます。Pythonフォルダの中にある FactorizationMachineViya.ipynb をクリックします。

![Screenshot_ 2018-06-27 15.16.57.png](https://qiita-image-store.s3.amazonaws.com/0/197026/48c4b49c-e513-73c8-c19d-6b9c559a9b34.png)

----

ここからは FactorizationMachineViya.ipynb に書かれている内容の意訳です。英語の後に日本語を参考として載せています。


# This demonstrates running a Factorization Machine in SAS Viya on the MovieLens movie reviews data set（このデモはSAS ViyaにてFactorization MachineをMovieLensの動画レビューデータセットを用いて実行します）

## Initiate CAS Session（CASセッションの初期化）

```python
from swat import *
from pprint import pprint
%matplotlib inline 
from matplotlib import pyplot as plt
import pandas as pd
import sys
from swat.render import render_html

cashost='localhost'
casport=5570
casauth='~/.authinfo'
sess = CAS(cashost, casport, authinfo=casauth, caslib="casuser")

```

## Load Data（データの読み込み）

```python
indata1 = 'movlens10k'
indata2 = 'movlens10k_user99'
if not sess.table.tableExists(table=indata1).exists:
    indata1 = sess.upload_file("../data/movlens10k.sas7bdat", casout={"name":indata1})
    indata2 = sess.upload_file("../data/movlens10k_user99.sas7bdat", casout={"name":indata2})
    
```

## Model and Score（モデルとスコア）

```python
sess.loadactionset(actionset="factmac")
sess.loadactionset(actionset="astore")

#/************************************************************************/
#/* Modeling:                                                            */
#/* The Factorization Machine will run with the following settings:      */ 
#/*   The optimization will stops after 20 iterations                    */
#/*   The model will have 5 factors                                      */
#/*   The optimization learning step is 0.15                             */
#/************************************************************************/
#/************************************************************************/
#/* モデリング:                                                            */
#/* Factorization Machineは以下の設定で実行されます:                          */ 
#/*   最適化を20回、反復して実行します                                        */
#/*   モデルには5つの要素があります                                           */
#/*   最適化学習ステップは0.15                                               */
#/************************************************************************/
movlens_train = sess.factmac.factmac(
  table={"name":"movlens10k"},
  inputs=[{'name':'user'},{'name':'item'}],
    nominals=[{'name':'user'},{'name':'item'}],
  target="rating",
  seed=12345,
  maxIter=30,
  nFactors=10,
  learnStep=0.15,
  id={"user", "item", "rating"},
  outModel={"name":"factors_out", "replace":True},
  savestate={"name":"fm_astore_model", "replace":True}
)


# Score using ASTORE（ASTOREを使ったスコア）
#/* Scoring the movlens dataset for user 99 based on the model developed */
#/* 開発されたモデルに基づいてユーザー99のMovielensデータセットをスコアリングします */

sess.astore.score(
  table={"name":"movlens10k_user99"},
  rstore={"name":"fm_astore_model"},
  out={"name":"movlens10k_user99_scored", "replace":True}
)

```


```python
factors = sess.CASTable('factors_out')
factors.head(40)

```

## Summary of scored table


```python
out = sess.summary(table="movlens10k_user99_scored")
out
```


```python
scores = sess.CASTable('movlens10k_user99_scored')
scores.head(40)
```

## View Model Information（モデル情報の表示）


```python
r = movlens_train
render_html(r)
```

## Plot predicted vs actual for user 99（予想されるプロットとユーザー99の実際のプロット）

```python
plot_tbl=sess.CASTable("movlens10k_user99_scored")
plot_tbl.where="rating>0.0"

allRows=20000  # Assuming max rows in reviews_user99_scored table is <= 20,000
               # reviews_user99_scoredテーブルは2万行以下と仮定します
plot_df=plot_tbl.fetch(to=allRows)['Fetch']

plt.figure()
plt.scatter(plot_df["rating"], plot_df["P_rating"])
plt.xlabel("Actual Rating")
plt.ylabel("Predicted Rating")
plt.title("Scored Ratings for User 99")
plt.show()
```

```python
plot_tbl.head(20)
```

----

ここまでの内容が FactorizationMachineViya.ipynb で書かれているデモになります。Jupyter Notebookなので、Webブラウザ上でコードを実行して結果を確認できます。ぜひSAS Viyaで体験してみてください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)