【機械学習】ウェブサービスでぜひ取り入れたい機械学習※非エンジニア向け※

　
ABテストなるものを、ここに訪れている方なら良く知っていることでしょう。

この記事ではABテストでは解決できない悩みを解決する方法を、
バンディッドアルゴリズムという機械学習の一分野を中心に、
こまけぇこたぁいいんだよ！さっさとやり方教えろよ！メリットは何があんだよ！って方向けにまとめていきたいと思います。

デザイナーさんがこれ見て、いいじゃんやってよ！ってエンジニアさんに投げかけることを目標としています。

かなり詳しくここで書かれているので、詳しく知りたい方はこちらに
[バンディットアルゴリズム入門と実践  Slide Share](http://www.slideshare.net/greenmidori83/ss-28443892)
#バンディッドアルゴリズムとは

ざっくり言ってしまえば、
ある一定の期間で一番お金を稼ぎたいよ！
って人のためのアルゴリズムです。

もう少し具体的な例で見てみましょうか
#バンディッドアルゴリズムの使いどころ
![スロット.jpg](https://qiita-image-store.s3.amazonaws.com/0/146642/2f57617f-5c9c-85c6-78ca-c563eb8a5693.jpeg)

あなたは3万円持って大好きなカジノに来ました。
スロットに目がないあなたは、カジノに来るやいなやスロット台の前にきます。
それはもうすごいスピードで。マカオ！って感じですね。

そこであなたは2台のスロットの前で考えるわけです。
『さて今日はどうやって勝ってやろうかな』と。

いろいろな作戦があると思いますが、
ここでABテストとバンディッドアルゴリズムの違いについて言及していきます。

#ABテストの思考
あなたはこう考えます。
1万円はとりあえず投資しよう、残りの2万円を良かったほうにつぎ込もう。

この方法のデメリットについて考えます
<dl>
<dt>**デメリット**</dt>
<dd>本当に1万円で判断してよかったの…？じつは設定がいいのはもうひとつのほうだったのでは…という悩みが出てくる。</dd>
</dl>

スロットをやる人ならとても共感できる悩みですよね！こっちにしよう！って決めた後で隣に他の人が座ってバンバン出された日には…！

その悩みを解決するのがバンディッドアルゴリズムです。

#バンディッドアルゴリズムの思考
あなたはこう考えます。
良いスロットに投資して行こうと。

それができれば苦労しねぇよ！って思いますよね。
バンディッドアルゴリズムはその理想にできる限り近づけようと考えたものです。
それでは早速実践方法について話していきましょう。

#取り扱う問題
今回は自社サイトで良く行うABテストを行った事例に対し、バンディッドアルゴリズムを適用していきたいと思います。

スロットの例をwebサイトのABテストに置き換えると

- スロットを回す=パターンのいずれかがユーザーに表示される
- スロットを回す回数=アクセス数
- 当たり=CV(コンバージョン)

ということができます。

#弊社サイトについて

弊社サイトは
【引越ししたい人】が、【数々の業者の中から】、【さくっとお好みの業者に申し込めるサイト】です。
![d1348-916-600355-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/146642/72cbb388-5c61-6d9b-0d29-89b01e8bdf41.jpeg)

そのページの中の1つに、引越し業者毎の概算見積もり金額が一斉に表示される【リストページ】と呼ばれるページがあります。
『あぁ！素敵！たった一度の情報入力だけで、電話することなく複数の引越し業者の見積もり金額がわかるのね！』

ここで問題なのはユーザさんにとって興味のある情報は金額だけじゃなく、口コミとか、特典とかかもしれませんよね。
やっぱり大手が良いわ！ってユーザさんもいるかもしれませんし、
地元密着型の業者さんがいいなぁってユーザさんもいることでしょう。

業者と見積もりの一覧をどう表示するのが良いんだ…⇒良しABテストだ！
と思うのは自然な流れだと思います。弊社でもよく改善のためのABテストをしています。
今回はABテストの結果に対して、バンディッドアルゴリズムをもし使っていたら～というお話をしていきます。

#対決方法
ABテストの結果はあるので、そのときにバンディッドアルゴリズムを使っていたらという実験をして見ましょう。
評価は純粋に売上で勝負をつけましょう。ここで売上は次であらわせます。

$売上=CV数*ARPPU$

CVはコンバージョン数(ネットで予約までしてくれたユーザ数)
ARPPUはコンバージョンしてくれたユーザあたりの売上とします。

CV数は
$CV数=UU数\times CVR$
とあらわされ

CVR(コンバージョンレート：コンバージョンする確率)はABテスト時のその1日1日の値を使います。

問題を簡単にするために、
ARPPUはどちらの方法でも一定の値で計算します。
ということは単純にCV数で勝負がつきますね。

そしてUU数、CVRも同条件とすれば、あれ？なにで勝負つくの？全部一緒じゃんって感じになりますが、
ユーザをAパターンBパターンにどのように振り分けていくか、ということが肝だということがわかります。

#実装方法
実装なんて大層なものではないですが、バンディッドアルゴリズムでやってみたらどうなってたの？
という疑問に対して、結果を次のように導いてみました。

まずユーザに対しAパターンを表示する確率を定義します。

```math
ユーザにAパターンを表示させる確率=\frac{\exp(\frac{rA}{tau})}{\exp(\frac{rA}{tau}) + \exp(\frac{rB}{tau})}
```

```math
tau=定数\\
rA=AパターンのCVR\\
exp(x)=exp^{x}
```

これはsoftmax法という方法です。
ここでrA,rBは1日ごとに初日から前日までのCVRの合算値(実践値)を用いました。

$tau$は焼きなまし法を用いて始めは高く、10000とかに設定して最後のほうは0.01とかになるように調整します。
いろいろためしましたが、1次式(直線)ではたぶんうまくいきません。

$CV数=UU数×rA×AパターンのCVR+UU数×rB×BパターンのCVR$
とざっくり計算することによりCV数の優劣をつけました。

#結果
データを公開できないので残念ですが、
ある一定の期間でCV数を２％改善することができました。
２％改善というとそれってやる意味あんの？って感じがしますが、
売上で言うと8万円くらいあがりました。
うん微妙ですね。
ただやればやるほど積み上がっていくものなので塵積もってやつですよ。

#所感
一定の期間と決まっているのであればバンディッドアルゴリズムは断然ありだと思います。
そもそも目的が収益を最大化することに特化しているので。

あと$tau$をちゃんと設定してあげれば、バンディッドアルゴリズムが負けることはなかなかないですし、
悪い選択肢を良い選択肢だと誤認することもなかなかなさそうです。
とりあえず導入してみるメリットはあるかなーという感じです。

導入するコストもそんなにかからないですしね。
パターンを捨てるまでに時間はかかるので、
クリエイティブを保持している期間に応じてクリエイティブ料を払ってるならちょっとまずいですけど、

じっくりとABテストまわしたいけど、その間に損したくないって思ってる方は是非。