Monthly Archives: 2月 2017

2017-02-27

AkaNeユーザーペルソナ予測について

こんにちは、CTO室のA.Zです。最近、AkaNeの配信最適化の解析プロジェクトに参加しています。
今回、一部の最適化方法、ユーザーペルソナ(性別・年齢)予測について話したいと思います。

背景

AkaNeで、もっと広告配信効率化するため、ユーザーの特徴(性別・年齢)を分析し、
効果が高いユーザーに広告配信できることが今回のプロジェクトの目的です。

ユーザーペルソナ(性別・年齢)予測について

ユーザーペルソナ(年齢・性別)の予測というのは様々なユーザー行動履歴から、ユーザーの年齢・性別を予測することです。
利用する行動履歴データは以下のデータです。

  • ページアクセス履歴
    どんなサイトにアクセスするか、いつアクセスするか、ブラウザー情報何なのかなど
  • その他のアクションデータ

予測するユーザーペルソナの内容は以下の表のとおりです。

ユーザーペルソナ類 カテゴリ
性別 男性

女性

 年齢  25歳以下

25歳-35歳

35歳-45歳

45歳以上

上記のデータから、ユーザーのペルソナを予測するために、今回ランダム フォレストという機械学習アルゴリズムを使っています。
ランダム フォレストは複数の決定木から構成され(フォレスト)、各決定木で利用されるデータはランダムでデータセットからサンプリングされます。

 

ランダム フォレスト手法の詳細については下記の論文が元にになっています。

L. Breiman. Random forests. Machine learning, 45(1):5–32,2001.

ランダム フォレストを選定した理由は以下です。

  • 今回の予測、完全に0,1の予測(Hard Classification)ではなく、確率のような予測(Fuzzy Classification)が要件です。
    ランダム フォレストは、複数決定木からの「vote数/決定木数」値を利用することで、この要件はクリアーすることができます。
  • ランダム フォレストはデータノイズに対して、強いです。
    こちらはノイズ 除去のコストを削減することができます。
  • ランダム フォレストは様々なデータの種類(数値、カテゴリなど)が対応することができます。
    今回使っているデータはカテゴリデータが多いため、ランダム フォレストだと、そのまま利用することができます。

今回のプロジェクトでは、データ量が大きいため、分散処理のフレームワーク Apache Sparkを利用しています。

ランダム フォレスト手法もSpark MLlibが提供しているアルゴリズムを利用しています。

続いて、今回見つかった一つの問題はアクションデータの価値が高いですが、利用できるデータが少ない(全ユーザーの約10%)です。
アクセス履歴とアクションデータが一緒に学習すると、サンプリングする時にアクションデータがあまり抽出されませんでした。
その結果、アクションデータに対して、学習は不十分でした。

こちらの問題を解決するために、学習プロセスと予測プロセスは二つに分けます。

 アクセス履歴のみのモデル

こちらのモデルはアクセス履歴のみ持っているユーザーに適用します。だいたい90%ユーザーの予測はこちらモデルを利用しています。

学習プロセスは以下の図のとおりです。


予測プロセスは以下の図のとおりです。

アクセス履歴+アクションデータのモデル

こちらのモデルはアクションデータを持つユーザーに適用します。アクセス履歴のデータはユーザーのベース情報になっていますので、全ユーザーはアクセス履歴のデータが必ず持っています。

具体的なプロセスはそれぞれアクセス履歴のモデルとアクションデータのモデルを作成し、そして、作成したモデルを利用し、正解データを予測します。予測した正解データの結果をさらにロジスティック回帰のモデルに流して、各モデル(アクセスモデル、アクションモデル)の重みを計算します。

具体的な学習プロセスは以下の図のとおりです。

具体的な予測プロセスは以下の図のとおりです


結果と考察

上記のアプローチで、予測した性別情報を利用することで、中立サイト(ユーザーペルソナの偏りがほとんとないサイト)のeCPM(広告1000回表示またはアクセス1000ページビューあたりの収益額)は12.6%改善することができました。性別と年齢の情報を組み合わせると、もっと改善できるのではないかと思います。

また、今回のアプローチではコンテンツ解析の手法を使っていません。コンテンツ解析手法を使うと、もっと改善できるのではないかと思います。

今後、コンテンツ解析やもっと高度な機械学習の手法を利用して、精度や効果を改善していきたいと思います。

2017-02-23

LINE BOTを試してみる

はじめまして。GMOアドマーケティングのKKです。

昨年からChatBotが流行っていて、Botを使用したAWARDSも開催されていることから期待感が伺えます。
ただ、自身で実装するのは少し大変です。
そこで、各社が提供しているAPIを使用して簡単なモノであればすぐに実装できる環境が用意されています。

今回は基本的なオウム返しをしてくれるものから、簡単な会話を行えるBotを開発していきます。

前提

Pythonインストール済み
djangoインストール済み
HerokuToolbeltインストール済み
Herokuアカウント取得済み

LINEが提供するサービスでMessaging APIを使用していきます。
同じようなAPIでFacebookが提供しているモノもありますが、LINEの方がドキュメントがわかりやすいので、こちらを採用しました。

Messaging APIの役割

msgapi-figure1

LINE BOT作成には下記が必要
・LINE Businessアカウント + LINEの個人アカウント(Businessアカウント取得のため)
・サーバー
・SSL証明書

とりあえず、無料枠でも使えるDeveloper Trialアカウントで行なっていきます。
ビジネスアカウントをまだ持ってない方はこちら
https://business.line.me/ja/services/bot
この段階で基本設定も終えておくと楽です。

Messaging APIの申込みが完了すると、LINE@MANAGERへアクセスできます

LINE MANAGER

Message APIは多様な言語(php,python,goなど)に対応していますが、今回はpythonを使っていきます。理由としては、chatbotは自然言語処理などと相性がいいので、そういった処理が得意なライブラリがpythonは豊富なためです。

Pythonのみでwebアプリケーションを作成するのは少し大変なので、フレームワークであるDjangoを使用していきます。
Pythonは3系、Djangoは1.10.5の環境で構築しています。

サーバーも自身で用意するのは面倒なので、デフォルトでhttps通信が可能なHerokuを使用していきます。
「LINE BOT API の呼び出しにはServer IP Whitelistに接続元IPの指定が必要」だったのですが、Optionalになったので、下記の設定はいらなくなりました。

アドオン(Fixie)を追加して対応してあげます。
$ heroku addons:create fixie:tricycle

まず、最初に任意のディレクトリにDjangoプロジェクトを作成します。

動作するかの確認

次にDjangoアプリケーションを作成していきます。

構成は下記のようになります(イメージ)
※requirements.txt(Herokuに必要)などは適宜追加してください
.
├── LICENSE.txt
├── Procfile
├── README.md
├── chatbot
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
├── bot
│   ├── __init__.py
│   ├── __pycache__
│   ├── create_answer.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   └── views.py
├── db.sqlite3
├── django.log
├── manage.py
├── requirements.txt
└── runtime.txt

以下のコードはメッセージをオウム返しにします。
※雑談APIなどを使うと会話が行えます(引数のtextをAPIで返す)

Herokuにログイン後デプロイしていきます

ブラウザで開いたurlをコピーして、LINE developersにアクセスしてWebhook URLに
https://xxxxxxxxx.herokuapp.com/callback
の形で貼り付けます。
※少し前まではhttps://xxxxxxxxx.herokuapp.com:443/callbackみたいにポート番号まで指定する必要があったんですが、今はいらなくなりました
同ページにあるQRコードを読み込んで、友達追加後、メッセを送ってあげれば反応が帰ってきます

完成(雑談API組み込み済み)

screenshot_20170217-163024_720

ここに機械学習などを組み込こんでみたり、スクレイピングでリクエストに応じたコンテンツを表示することも可能です。
例えば、ユーザーからのリクエスト(テキスト)を解析して、対話行為のような抽象的な表現に置き換えて、対話行為を推定します。
対話行為を推定するには、属性抽出※を行ったりする必要があります。
※対話行為をカテゴライズし、値を示す
ex)ユーザー:新宿辺りで音楽イベントを探して → SCRAPING(localtion=新宿,event=音楽)
この情報から、音楽イベント情報を提供しているサイトなどからデータを持ってきてその値をレスポンスとして表示する

flow-chart

TIPS
下記の写真のように、CarouselやConfirmのようなオプションも充実しているので、アイデア次第で面白いことができそうです。

msgapi-figure3

まとめ
今回はChatBotを実装する上で、必要な環境の構築と実際に会話が返ってくるサンプルを作成しました。
APIの使用方法にフォーカスしたので、大したものはできていませんが、上記の抜粋コードから取得したリクエストとレスポンスををいかに加工するかが重要項目です。
これからの展望が楽しみなChatBotの紹介でした。

Category: Bot