XGBoostやパラメータチューニングの仕方に関する調査

【目次】
・XGBoostとは
・XGBoostで用いるパラメータ一覧
・XGBoostのパラメータチューニング
・参考文献

XGBoostとは

XGBoost (eXtreme Gradient Boosting) は勾配ブースティングアルゴリズムの先進的な実装例で、データサイエンスのコンペであるKaggleで話題となっていた手法です。

ブースティングアルゴリズムとは、弱識別器(weak learners)の集団を直列的に結合することで、予測における正確性を高めようとするアルゴリズムです。任意のt時点において、モデルの予測は以前のt-1時点での結果に基づき重み付けがなされます。正しく予測されたデータに対しては、重みを小さくし、誤って予測されたデータに対しては重みを大きくします。後で学習する識別器ほど、誤ったデータに集中して学習を進めることになります。

以下はブースティングのイメージ図です。
スクリーンショット 2016-04-24 18.40.38

STEP1では全ての学習データに対して、等しい重み付けで学習を行い、決定境界を引きます。これを弱学習器による学習と言います。このケースでは毒キノコを2つ当てており、キノコを5つ当てています。
STEP2ではSTEP1で正しく識別されたデータの重みが下げられ、誤って識別されたデータの重みが上げられています。高く重み付けがなされたデータは決定境界で正しく識別されていますが、他のデータは誤って分類されています。
STEP3においてもSTEP2と同様の傾向があります。このような弱学習器による処理を繰り返すことで識別性能を高めていきます。

最終的にはこのような決定境界を引くことができるような識別器を求めていきます。
スクリーンショット 2016-04-24 18.55.53

勾配ブースティングの勾配とは、ブースティングアルゴリズムにおけるパラメータ推定での最適化手法が勾配降下法に従っているという意味での勾配です。以上が勾配ブースティングモデルの簡素な説明です。

XGBoostで用いるパラメータ一覧

XGBoostで用いるパラメータに関して、大きく分けて3つあります。

    1.全体パラメータ・・・XGBoost全体を司る。
    2.ブースターパラメータ・・・各ステップでツリーなどのブースティングを司る。
    3.学習タスクパラメータ・・・最適化タスクを司る。

以下、3つのパラメータについて、「パラメータ名」・「デフォルトの値」・「役割」・「引数」を表にしています。

1.全体パラメータ

パラメータ名 デフォルトの値 役割 引数
booster gbtree 実行するモデルのタイプをツリーモデルか線形モデルのどちらかを指定できる。 gbtree: ツリーモデル
gblinear: 線形モデル
silent 0 モデルの実行結果を出力するかどうかを決めることができる。モデルを理解する上で、0のままにしておく方が良いとされている。 0:出力結果を表示する。
1:出力結果を表示しない。
nthread not set 並列処理のためのコア数などを指定できる。フルコアで実行したい場合は何も指定しなければ自動的にフルコアになる。

2.ブースターパラメータ

パラメータ名 デフォルトの値 役割 引数
eta 0.3 学習率を調整できる。
小さくすることで、モデルの頑健性を高めることができる。
0.01〜0.2の値になることが多いらしい。
min_child_weigh 1 子ノードにおいて観察されるデータの重み付けの合計値の最小の値で、過学習を避けるために用いられる。
高い値にすることで特定のサンプルに観察されるような傾向を学習することを避けられる。ただし、高くし過ぎるとフィッティングが悪くなる。
max_depth 6 木の深さの最大値
過学習を制御するために用いられる。
高いと過学習しやすくなる。
3〜10の値になることが多いらしい。
max_leaf_nodes 木の終端ノードの最大値
max_depthの代わりに用いる
n本を指定したら、n^2個の枝を生み出す。これが指定された場合は、max_depthは無効化される。
gamma 0 分割が、損失関数の減少に繋がる場合にのみノードの分割を行う。
モデルをより保守的にする。
値は損失関数に応じて大きく変わり、チューニングが必要である。
max_delta_step 0 各木のウェイトの推定に制約をかけることができる。
0の場合は制約なしで、正数値を取るとモデルがより保守的になる。
通常は必要とされないが、不均衡データの分類の際に用いる。
subsample 1 各木においてランダムに抽出される標本の割合
小さくすることで、過学習を避けることができるが保守的なモデルとなる。
0.5〜1の値になることが多いらしい。
colsample_bytree 1 各木においてランダムに抽出される列の割合 0.5〜1の値になることが多いらしい。
colsample_bylevel 1 各レベル単位での、分割における列のsubsample比率
subsampleとcolsample_bytreeで十分なので、あまり使わないが、探索してみるのも良いかもしれない。
lambda 1 重みに関するL2正則化項
多くのデータサイエンティストは使わないが、過学習を避けるためには用いられるべき。
alpha 0 重みに関するL1正則化項
高次元の場合に用いるらしい。
scale_pos_weight 1 不均衡データの際に、0以上の値を取ることで、収束を早めることができる。

3.学習タスクパラメータ

パラメータ名 デフォルトの値 役割 引数
objective reg:linear 最小化させるべき損失関数を指定する。 binary:logistic→2項分類で確率を返す。
multi:softmax→多項分類でクラスの値を返す。
(num_classでクラス数の指定が必要)
multi:softprob→softmaxと同じだが、確率を返す。
eval_metric according to objective 検証を行うためのデータの評価指標 rmse – root mean square error
mae – mean absolute error
logloss – negative log-likelihood
error – Binary classification error rate (0.5 threshold)
merror – Multiclass classification error rate
mlogloss – Multiclass logloss
auc: Area under the curve
seed 0 ランダムなシード番号。
再現可能なデータを生み出すために、あるいはパラメータチューニングの際に用いる。

 

 

XGBoostのパラメータチューニング

複数のパラメータからなるXGBoostのチューニングは非常に複雑で、理想的なパラメータについてはケースバイケースで何とも言えないそうです。

参考文献のブログにパラメータチューニングの一般的アプローチについて触れられていたので、紹介します。

    1.相対的に高い学習率を選択する。
    一般的な学習率0.1はうまくいくが、ケースによっては0.05から0.3の間でもうまくいく。学習率を求めるために、クロスバリデーションによって最適な木の数を決定する。
    2.木に関するパラメータをチューニングする。
    固定された学習率や木の数のもとで、max_depth, min_child_weight, gamma, subsample, colsample_bytreeをチューニングする。
    3.正則化パラメータをチューニングする。
    lambda, alphaなどのパラメータをチューニングすることで、モデルの複雑さを減らし、パフォーマンスを高める。
    4.学習率を下げ、最適なパラメータを決定する。

具体的な実行に関するPythonスクリプトはこちらのGithubで紹介されています。(iPython)
Analytics_Vidhya/Articles/Parameter_Tuning_XGBoost_with_Example/XGBoost models.ipynb
この方法に従って、自社で抱えているモデルのチューニングにチャレンジしてみようと思います。

参考文献

Quick Introduction to Boosting Algorithms in Machine Learning
Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python
Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
勾配ブースティングについてざっくりと説明する
xgboost のパラメータ
OS X で XGBoost & xgboost4j をビルドする手順 2016-03-07 版

GensimのHDP(Hierarchical Dirichlet Process)をクラシック音楽情報に対して試してみる

HDP(Hierarchical Dirichlet Process)いわゆる階層ディリクレ過程を実行できるモデルがPythonのGensimライブラリにあるという情報から、あまり実行例も見当たらないので、チャレンジしてみました。

HDP(Hierarchical Dirichlet Process)

HDP(Hierarchical Dirichlet Process)は文書集合全体のトピック数と文書ごとのトピック数の推定を行うことができる手法で、中華料理店フランチャイズという仕組みを用いています。通常のLDAなどでは、分析者が任意のトピック数を決める必要がありましたが、与えられたデータからその数を推定するため、その必要がないというのがHDPを使うことの利点であると思われます。

実行までの流れ

ざっくりですが、
・コーパスの準備・文書の分かち書き(名詞のみ)
・HDPの実行
という流れです。

ちなみに実行環境は
MacBook Pro
OS X Yosemite 10.10.5
2.6 GHz Intel Core i5
メモリ8GBです。

コーパスの準備

今回は、以前手に入れた某辞典サイトのクラシック音楽情報1800件のテキストデータ(1行に1件分の文字列が入っているデータで16MBくらい)があるので、それをコーパスとして使います。参考情報として挙げているブログの助けを借りて、文書単位でMeCabにより形態素解析で分かち書きした結果から、意味を持ちやすい品詞として、「名詞」に該当するもののみを結果として返す以下のPythonスクリプトを用いました。結果はtmep.txtとして出力されます。もっと良いやり方があると思いますが、目的は達成できると思います。ちなみに、MeCab Neologd(ネオログディー)という、固有名詞などに強いシステム辞書を活用してみたかったので、その利用を前提として書いています。MeCab Neologd(ネオログディー)のインストール関連の情報は参考情報にありますので、チャレンジしてみてください。(OSXかUbuntuの方が進めやすいと思います。)

こちらのスクリプトをターミナルで実行します。(解析するディレクトリ下で実施しています。)

HDPの実行

以下のPythonスクリプトで実行しています。

HDPの結果について

topic_detail.csvの結果を見たところ、トピックの数が150個もあって、「本当にトピックの数を自動で決めれているのかなぁ」と不安に思ったのですが、実際に各文書に割り当てられているトピックの数は、先ほど出力したtopic_for_corpus.csvで見ると60個でした。そのため、今回、HDPに従って決まったトピック数は60ということになります。さらに不安に思ったので、Stack Over Flowで調べていたんですが、トピックは150個出るけど確率が割り振られていないはずと回答されていました。( Hierarchical Dirichlet Process Gensim topic number independent of corpus size

出現頻度の高い上位10のトピックは以下の通りです。

加えて、トピックごとに文書に割り当てられた数を集計してみましたが、topic0が圧倒的に多く、コーパスの特性上、含まれやすい情報がここに集まっているのではないかと思います。幅広いテーマを抽出できるかと期待していたのですが、やたらと個別具体的な「トゥーランドット」や「ワーグナー」や「カルメン」などがトピックの上位単語に上がってきています。実行方法を間違えているかもしれないし、パラメータチューニングなどをもっと頑張れば、幅広いトピックを得ることができるかもしれないので、今後の課題としたいです。

スクリーンショット 2016-04-10 18.23.37

参考情報

・トピックモデルについて
machine_learning_python/topic.md at master · poiuiop/machine_learning_python · GitHub

・HDP関連
 models.hdpmodel – Hierarchical Dirichlet Process
Online Variational Inference for the Hierarchical Dirichlet Process

・MeCab関連
mecab-ipadic-NEologd : Neologism dictionary for MeCab
形態素解析器 MeCab の新語・固有表現辞書 mecab-ipadic-NEologd のご紹介
テキストマイニングの前処理。名詞抽出、ストップワード除去、珍しい単語の除去

・Python関連
データ分析をやりたいエンジニアにおすすめ!Pythonの入門スライド13選

Word2Vecでクラシックの楽曲情報をコーパスとして類似度を出してみる

あの手この手を使って手に入れた、およそ1800曲に及ぶクラシック音楽の楽曲情報(テキスト)をもとに
、PythonのGensimライブラリーのWord2Vecを使って、任意の単語に関する類似単語を出力してみたいと思います。

まずは、手に入れたコーパスを作業フォルダに置いて、MeCabによる分かち書きを行います。
(最後の引数-bは、処理する文書のサイズが大きい際に調整します。)

後はGensimパッケージを読み込んで、

Word2Vecを計算させるだけです。

(引数のsizeは特徴ベクトルの次元数です。)

早速、トランペットについて、所与のコーパスにおける類似単語を見てみたいと思います。(類似度が最も高い単語の上位10位の結果を返しています。)

惜しいですね。
願わくば、コルネットが一番目に来てほしかったです。オケの編成上、どうしてもトロンボーンが一緒の文書で出やすいのだと思います。

続いては、ピアノです。こちらもオルガン・チェンバロは非常に近い楽器だと思うのですが、一番目がヴァイオリンというのはデータ上仕方がないのかもしれません。

続いて、ヴァイオリンですが、ヴィオラ・チェロは良いと思うのですが、ピアノやチェンバロなどが上位に来ています。

続いて、クレッシェンドですが、似たような意味はあまり観察されていません。ただし、「クライマックス」・「アルペッジョ」などと似たようなシチュエーションで登場しそうな表現な気がします。

最後に、アレグロですが、こちらは速さの序列に関しては守られていないようです。やはりコーパス次第ですかね。
プレスト > アレグレット > モデラート > アンダンテ > アダージョ > ラルゴ
この序列が守られるようなWord2Vecの実践例などがあると面白いですが。

仕事でWord2Vecを使うシーンがあるとしたら、広告文のアイデアを助けたり、語彙力の弱い人の補助的なツールとして使えるかもしれませんが、実用レベルはまだまだ遠い気がします。

おまけ

左手に関しては、最も類似した単語が「右手」という結果になっています。

参考文献

models.word2vec – Deep learning with word2vec

岩波データサイエンス Vol.2 岩波データサイエンス刊行委員会 編

iPython notebookチャレンジ(カイ二乗検定)

IPython データサイエンスクックブック』の第7章のレシピ7.4を写経して、jupyterのdownload asでhtmlをはき出し、そのままブログに貼り付けてみました。色とかおかしいところがあるので、出力方法に関しては今後色々と調べなくてはなりません。ただ、実際に触ってみて、ユーザーインターフェースに関してRとの著しい乖離はない印象です。ここでは扱いませんが、ランダムフォレストを用いた重要な回帰特徴量などもRに比べてコードの長さも遜色ありませんでした。iPython jupyterはRからPythonへ手を広げるハードルを下げてくれる良い環境だと思いました。
以下では、Datasets used in the IPython Cookbook, the definitive guide to high-performance scientific computing and data science in Pythonのtennisという、テニス大会と選手に関するデータをもとに、ロジャー・フェデラーのエースと得点との関係を扱っています。手法としては相関係数の計算と、カイ二乗検定を行っています。








In [1]:
#NumPy,pandas,SciPy.stats,matplotlibをインポートする。
import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
#ロジャー・フェデラーのデータを読み込む。カレントディレクトリにデータを置いておきましょう。
player = 'Roger Federer'
filename = "data/{name}.csv".format(
                       name=player.replace(' ', '-'))
df = pd.read_csv(filename)
In [31]:
#データを確認する。
print("Number of columns: " + str(len(df.columns)))
df[df.columns[:8]].tail()
Number of columns: 70
Out[31]:
year tournament start date type surface draw atp points atp ranking
1174 2012 Australian Open, Australia 16.01.2012 GS Outdoor: Hard Draw: 128 720 3
1175 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1176 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1177 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
1178 2012 Doha, Qatar 02.01.2012 250 Outdoor: Hard Draw: 32 90 3
In [4]:
#全ポイントに占める特典の割合とエースの割合だけを表示する。
npoints = df['player1 total points total']
points = df['player1 total points won'] / npoints
aces = df['player1 aces'] / npoints
In [5]:
plt.plot(points, aces, '.')
plt.xlabel('% of points won')
plt.ylabel('% of aces')
plt.xlim(0., 1.)
plt.ylim(0.)
Out[5]:
(0.0, 0.16)
In [6]:
#二つの列だけを持つDataFrameオブジェクトを新しく作る。
df_bis = pd.DataFrame({'points': points,
                      'aces': aces}).dropna()
df_bis.tail()
Out[6]:
aces points
1173 0.024390 0.585366
1174 0.039855 0.471014
1175 0.046512 0.639535
1176 0.020202 0.606061
1177 0.069364 0.531792
In [7]:
#ピアソン相関係数を計算する。
df_bis.corr()
Out[7]:
aces points
aces 1.000000 0.255457
points 0.255457 1.000000
In [9]:
#変数の二値化
df_bis['result'] = df_bis['points'] > df_bis['points'].median()
df_bis['manyaces'] = df_bis['aces'] > df_bis['aces'].median()
In [10]:
#それぞれの可能性の頻度からなる分割表を作る。
pd.crosstab(df_bis['result'], df_bis['manyaces'])
Out[10]:
manyaces False True
result
False 300 214
True 214 299
In [11]:
#カイ二乗検定の統計値とp値の計算(2番目の数値がp値)
st.chi2_contingency(_)
Out[11]:
(27.809858855369555,
 1.3384233799633629e-07,
 1,
 array([[ 257.25024343,  256.74975657],
        [ 256.74975657,  256.25024343]]))
In [ ]:
 

RstanでCVRの前後比較をするためのコード

目的

データサイエンス界隈の方がP値での意思決定に警鐘を鳴らしている昨今、施策実施に関するCVRの前後比較をχ2乗検定のP値を用いるのではなく、ベイズ統計学によるアプローチにチャレンジしてみたいと思いました。『基礎からのベイズ統計学』の8章で取り上げられていた比率データに対してのベイズ統計学的アプローチをもとに、stanを用いて事後分布から意思決定をするための進め方を紹介します。

進め方

・データの整形
・stanコード作成
・rstanでの引数の指定
・rでの可視化

データの特徴

Webマーケティング界隈では大変に多用するデータだと思いますが、実験を行ったユーザーに対しての開封・非開封、これまで通りのユーザーの開封・非開封の自然数からなるデータです。

スクリーンショット 2016-03-13 22.30.16

stanコード

stanコードは
・dataブロック
・parametersブロック
・transformed parametersブロック(今回は不使用)
・modelブロック
・generated quantitiesブロック
からなります。
今回は自然数のデータであることから、ディリクレ分布を事前分布に設定するために、parametersブロックにおいてsimplexを指定しています。(教科書の比率データのものをそのまま使っています。)
modelは二項データしか出てこないので、二項分布を用いています。generated quantitiesブロックでは各々の比率、比率の差、比率の差が0を超える確率・0.01を超える確率、リスク比、リスク比が1を超える確率、オッズ比などを出力するようにしています。

rコード

以下は、stanをrで実行し、ggplot2などで可視化するためのコードが記されています。

推定結果&可視化

今回の例では、実験を行ったユーザーのCVRの差が0以上の確率(delta_over)が1.0なので、ほぼ確実に差があると言えそうです。0.01以上差がある確率も1.0なので1%以上は差があると言えそうです。リスク比(RR)に関しては2.47と実験しない場合と比べて2.47倍程度CVを高めています。オッズ比(OR)は2.63とあるので、実験によるCV増大効果が2.63倍あると考えることができます。χ2乗検定では、二つの集団が独立かどうかを検定していますが、ベイズ統計学に従えば、「1%を超える確率」を算出することが容易なので、ディレクターなどに説明する際は圧倒的に理解を得られそうな気がします。

posterior_distribution_2

参考文献

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門
rstanでちょこちょこ

ディープラーニングの基礎まとめ

【目次】
・ディープラーニングとは
・ディープラーニングでできること
・ディープラーニング実行のためのライブラリ
・参考文献

ディープラーニングとは

階層の深いニューラルネットワークを利用したアルゴリズムの総称。
様々なアルゴリズムが存在する。

  • Convolution Neural Network(CNN)
  • 畳み込み層とプーリング層と呼ばれる層を持つニューラルネットワークの総称
    CNNは画像認識に良く利用され、畳み込み層やプーリング層が画像における局所的な情報の抽象化や位置の不変性を持たせる役割を担っています。人間の視野の構造にも近いとされているらしいです。

      畳み込み層
      前の層の中で近くにあるノード同士の集合が、次の層のノードと接続するような構造を持つ層のこと。画像の局所的な部分の特徴を様々な方法で浮き立たせる役割を果たす。

    スクリーンショット 2016-03-05 15.28.10

      プーリング層
      前の層のノードの局所的な部分をまとめあげる処理のこと。局所的な部分の最大化を取る処理は「最大プーリング」と呼ばれる。プーリング層の役目は位置変更への感度を下げることで、小さな平行移動に対する不変性を持たせることにあります。

    スクリーンショット 2016-03-05 15.36.42

  • AutoEncoder
  • 入力層(画像データなどの特徴量)と出力層(判別したいカテゴリなど)が同一のサイズのノードを持つ層となるニューラルネットワークを利用したアルゴリズム。利用する隠れ層は一般的に、入力層や出力層よりも小さいものにするそうです。隠れ層は1層である必要性はなく、複数置くこともできます。AutoEncoderの役割としては、入力層と出力層の値がなるべく同じ値を出力しながら、欠損を極力少なくして、情報を圧縮することです。その結果として、データをよく表す特徴を獲得したり(なんだか主成分分析的なものを感じますね。)、深いネットワークを解く際の初期値を手にいれることができます。圧縮することで、深い階層のネットワークでもうまく計算できるということになります。

    スクリーンショット 2016-03-05 15.57.52

  • Recurrent Neural Network(RNN)
  • 先ほど挙げたCNNやAutoEncoderの前提となるデータは固定長と呼ばれ、つまり画素数などのピクセルが一定のものを値としてとります。しかしながら、画像のデータ以外は固定長データではないものが多いので、扱うことができません。実際、音声の長さやテキストの文字数はデータによってバラバラです。そこで、可変長のデータを扱えるようにしたものが、Recurrent Neural Network(RNN)です。音声認識処理や自然言語処理で利用されているそうです。
    RNNの特徴は、Recurrent(再帰)の字面の通り、隠れ層において再帰的な構造を持つことで前の状態を再び使いながら計算を行うことです。どうして再帰によって可変長が扱えるようになるのかは、理解が追いついていないですが、同じデータの長さでなくても、隠れ層で得た知見を活かせるという仕組みのようです。

    スクリーンショット 2016-03-05 16.34.49

    ディープラーニングでできること

  • 画像認識
  • 不適切なコンテンツ検知
    画像の意味分析
    画像のキャプション
    CLOUD VISION API
    Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話

  • 音声認識
  • iOSのSiriなどに活用されている。従来の手法である隠れマルコフを利用した場合はエラー率が25.8%であったのに対して、ディープラーニングでは16%のエラー率に改善されているそうです。

    CRMのデータとかアクセスログデータにおいての活用に関心がありますが、数は少ないものの、活用している企業はあるようです。ディープラーニングとアクセス解析の事例はググっても出てこなかったのは残念です。
    (基礎調査)Deep Learning は、ビジネス や 産業の現場で どこまで使われているのか?

    ディープラーニング実行のためのライブラリ

    実行するためのライブラリですが、非常に多くのものが用意されているようです。私はTensorFlowやChainerやTheano・Caffe・Pylearn2くらいしか目にしかことはなかったです。インストールも簡単ですし、Pythonを用いるという観点からはChainerが一番興味があります。

    ・TensorFlow
    ・Chainer
    ・Theano
    ・Pylearn2
    ・PyBrain
    ・nolearn
    ・Cuda-convnet2
    ・Torch7
    ・deeplearning4j
    ・Caffe
    ・DeepDream

    ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換) – Over&Out その後

    参考文献

    初めてのディープラーニング –オープンソース”Caffe”による演習付き

    機械学習プロフェッショナルシリーズ輪読会 #2 Chapter 5 「自己符号化器」 資料

    OS X YosemiteへのTensorFlowのインストールと簡易な分類モデルの実行

    遅ればせながらTensorFlowをインストールしてみようと思います。
    環境はOSX Yosemite version 10.10.5です。

    まずは、こちらのサイトにあるように、ターミナル(Windowsでいうところのコマンドプロンプト)にて、
    以下のコードを実行します。(前提として、Python2.7とpipが入っているものとします。)

    こちらを実行すれば、インストールされます。

    次に、画像を格納しておくためのディレクトリを作成します。
    同じくターミナルにて以下のコードを実行します。

    次に、こちらのgithubより、MNISTの画像を取得するコードをコピーします。

    コピーしたものを、先ほどのターミナル上で表示されているvimにて、
    i
    を押してからペーストし、Escを押してコマンドモードに移り、
    :wq
    を入力することで上書きしてファイルを閉じます。
    詳しくはvimコマンド一覧をご覧ください。

    そして、ターミナル上でpythonを開き、以下のコードを実行します。

    そうすることで、フォルダが作られデータが格納されていることが確認できると思います。
    だいたい11MBくらいのボリュームです。元の画像は手書き文字で、28×28ピクセルの画素だそうです。

    さて、このデータに対する機械学習による分類の実行ですが、
    TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築」こちらで紹介されているコードを丸々引用させていただきます。これの初級者用のロジスティック回帰モデルのものを扱います。(試行回数を1000回から50000回に変更しています。)

    こちらを実行したところ、

    ****MNISTデータ読み込み****
    Extracting MNIST_data/train-images-idx3-ubyte.gz
    Extracting MNIST_data/train-labels-idx1-ubyte.gz
    Extracting MNIST_data/t10k-images-idx3-ubyte.gz
    Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
    ****Start Tutorial****
    ****init****
    ****50000回学習と結果表示****
    0.914

    と試行回数を50000まで増やしても、Qiita初級者向けモデルの1000回試行の0.91と比べてあまり良くなりませんでした。
    紹介されていたQiitaの上級者向けモデルでは0.992まで持って行っていましたので、上級版もチャレンジしてみたいですね。
    勉強しないとここらへんの改良はできないので、今後学習していこうと思います。

    RのChannelAttributionパッケージでマルコフ連鎖モデルのアトリビューション分析にチャレンジ

    【目次】
    ・アトリビューションモデルとは
    ・アトリビューションモデルにおける評価の種類
    ・均等配分モデルと数理モデル
    ・ChannelAttributionパッケージについて
    ・Rでの実行
    ・実行結果
    ・参考文献

    アトリビューションモデルとは

    コンバージョンに至った広告の貢献度を、コンバージョンした経路のタッチポイントにどのように割り振るかを決めるルール。直接コンバージョンに至らなかったが、コンバージョンに繋がる働きをした広告の評価ができるモデルです。

    アトリビューションモデルにおける評価の種類

    Googleアナリティクスに載っていたアトリビューションモデルの種類です。一例なので、これが全てだとは言えないです。

  • 終点アトリビューションモデル
  •  コンバージョンに繋がった最後の経路を評価

  • 最後の間接クリックアトリビューションモデル
  •  コンバージョンに至る経路の直前の経路を評価

  • 起点アトリビューションモデル
  •  最初に関わった経路を評価

  • 線形アトリビューションモデル
  •  コンバージョンに至るまでに関わった経路を均等に評価

  • 減衰アトリビューションモデル
  •  コンバージョンした際に、時間的に最も近いものを評価

  • 接点ベースアトリビューションモデル
  •  起点と終点それぞれに40%ずつ評価、残りの20%は中間点に対して均等に評価

    均等配分モデルと数理モデル

  • 均等配分モデル
  •  コンバージョンに至るまでに関わった経路を均等に評価。数学に明るくなくても実行でき、集計が比較的簡単かつ解釈から施策までが容易とされる。一方で、恣意的な判断が入り込みやすかったり、各広告が独立であるという過程があるため、任意の広告のIMPが変化したときに他の広告への影響が加味できないなど欠点も多い。他の評価方法との比較のためのベンチマークとして用いられる。

  • 数理モデル
  • マルコフ連鎖モデル
     ユーザーの2点間の行動のみに基づいて分析を行う。
     例えば、広告の経路が10通りある場合、広告1を踏んだユーザーは確率p11で広告1を次に触れる、確率p12で広告2を次に触れるというような確率で広告の接触確率が決まるモデルとなる。確率から接触したページの価値を計算することで、評価が可能となる。複雑怪奇なユーザー行動を2点間のデータに落とし込むことで、分析する際の情報量を制限することができる。

    ChannelAttributionパッケージについて

    Package ‘ChannelAttribution’
    ※Rのバージョンが古いとインストールできません。3.2以上にしましょう。

    今回はRのChannelAttributionパッケージを用いて、マルコフ連鎖モデルを実践してみます。
    このChannelAttributionパッケージにはデータセットがついているため、その用意されたデータを用います。

    実際、このようなデータを元に分析を進めます。
    customer_journey_data

    内訳としては以下の通りです。
    ・コンバージョンに至ったパス
    ・コンバージョン数
    ・コンバージョン価値(価値に関してはサイトによって異なってくると思います。)
    ・コンバージョンに至らなかったパスの数(計算上使っていないようです。除外しても結果が変わらなかったので。)

    Rでの実行

    実行結果

    ぱっと見ですが、alphaやtheta以外では均等配分モデルとマルコフ連鎖モデルに大きな差はなさそうです。データにもよるとは思いますが。自社のデータで実行して、違いがあるか見てみたいですね。

    こちらはコンバージョン数で評価したもの
    total_conversions

    こちらはコンバージョン価値で評価したもの
    total_value

    参考文献

    Markov model for the online multichannel attribution problem

    アトリビューション モデルの概要

    マルコフ連鎖モデルによるアトリビューション分析(インターネット広告への応用)

    Attribution models—数理モデリング入門

    マルコフ連鎖を説明してみる。

    LDA(潜在的ディリクレ配分法)まとめ 手法の概要と試行まで

    【目次】
    ・トピックモデルとは
    ・トピックモデルの歴史
    ・トピックモデルでできること
    ・トピックモデルを理解するために必要な知識
    ・トピックモデルの手法について
    ・トピックモデルの実行方法について(R言語)
    ・トピックモデルの評価方法について
    ・Correlated Topic Models (CTM)について
    ・PAM:Pachinko Allocation Modelについて
    ・Relational Topic Models(RTM)について
    ・参考文献

    トピックモデルとは

    ・一つの文書に複数の潜在的なトピック(話題・分野・文体・著者など)、文書ごとのトピック分布、トピックごとの単語分布を仮定して、テキストからトピックを推定するモデル。文書に限らず、様々な離散データに隠された潜在的なトピックを推定するベイジアンモデル。幅広いドメインでの離散データで有効とされている。

    トピックモデルの歴史

    1998年:pLSA(probabilistic Latent Semantic Analysis)
    2003年:LDA(Latent Dirichlet Allocation)
    2004年〜:拡張モデル
    2007年〜:大規模データのための高速化

    トピックモデルでできること

    ・人を介することなく、大量の文書集合から話題になっているトピックを抽出できる。
    ・文書データだけでなく、画像処理、推薦システム、ソーシャルネットワーク解析、バイオインフォマティクス、音楽情報処理などにも応用されている。
    ・確率過程を用いて、ノイズを取り除き、本質的な情報を抽出できる。

    トピックモデルを理解するために必要な知識

    ・確率
     -確率分布
      -ベルヌーイ分布
      -カテゴリ分布
      -ベータ分布・ガンマ分布
      -ディリクレ分布
    ・ラグランジュ未定乗数法
    ・ユニグラム
     -BOW(Bag of words)
     -ユニグラムモデル
    ・混合ユニグラムモデル
    ・混合モデル
    ・EMアルゴリズム
    ・最尤推定
    ・ベイズの定理
     -ベイズ推定
      -ベイズ予測分布
      -ハイパーパラメータ推定
      -モデル選択
      -変分ベイズ推定
      -ギブスサンプリング

    トピックモデルの手法について

    推定方法としては以下の三つが提案されている。
    ・最尤推定
    ・変分ベイズ推定
    ・ギブスサンプリング

  • ギブスサンプリングによる方法
  • 一部のパラメータを積分消去して、トピック集合の事後分布を推定

    文書集合とトピック集合の同時分布を導出

    単語ごとにトピックをサンプリングする

    サンプリングされたトピックからトピック分布と単語分布を推定

    周辺同時尤度を最大化させるハイパーパラメータαとβを推定する

    ※LDAのギブスサンプリングはLDAが共役性に基づいたモデリングであるため効率的な計算が可能とされる。

    ハイパーパラメータを適切にデータから学習すれば、MAP推定・変分ベイズ推定・ギブスサンプリングの性能の差は大きく出ないという研究結果があるらしい。(なお、MAP推定だと、クロスバリデーションを行い、尤度を最大化させるハイパーパラメータを見つけなければならない。)

    トピックモデルの実行方法について(R言語)

    以下のパッケージで実行可能だが、新しい手法などにはまだ対応していない。
    lda(CRANのPDF
    topicmodels(CRANのPDF

    以下はtopicmodelsパッケージの実行コードであるが、BOW形式のデータがあれば、実行はすぐにできる。
    ただし、パープレキシティなどを計算しながら、ハイパーパラメータのチューニングをする必要がある。

    時間があれば、ソースコードを見て自分で書けるようにしたい。
    ちなみに、HDP-LDAはPythonのgensimに用意されているようです。(gensimへのリンク)

    トピックモデルの評価方法について

  • パープレキシティ(Perplexity)
  • -確率モデルの性能を評価する尺度として、テストデータを用いて計算する。
    -負の対数尤度から計算できる。
    -低いパープレキシティはテストデータを高い精度で予測できる良い確率モデルであることを示す。
    -全ての語彙が一葉の確率で出現するモデルのパープレキシティは語彙数Vになり、性能が悪いと考えることができる。
    -このパープレキシティが小さくなるようなトピック数やパラメータの設定が必要。

    Correlated Topic Models (CTM)について

    トピックモデルは 「各トピック k の間には相関がない」という前提のもとに成り立つ手法ですが、本当にトピック間に相関はないのでしょうか。「本当は相関のあるトピック」を無理やり「相関のないトピック」に分割している可能性が高いので、相関を加味したモデルが必要です。そこで、トピックの生成割合を決める際に、トピック間の相関を持つように多次元の正規分布を用います。ただし、その代わりに共役的な分布を持たないため、従来のギブスサンプリングではサンプリングが非効率になることから変分ベイズを用いる必要があります。

    PAM:Pachinko Allocation Modelについて

    CTMは各トピックが同じレベルにあるため、トピック間の階層構造を表すことができません。
    自動車にとっての、セダンやトラック、あるいはお酒にとってのワインやビールのようにトピックに関しても階層構造があることは想像に難くありません。トピック間の関係・相関を一般的に表現するモデルで、トピック間の階層構造を基本として、パチンコ玉が落ちるように単語を生成します。パチンコ玉が落ちるというのは、向きが一方行の有向かつ非巡回ノードが連想されます。分布に関しても共役なので、ギブスサンプリングでサンプリングが可能です。
    2016/04/24の段階ではまだGensimでモデルの開発はなされていないようです。
    Pachinko Allocation Model
    ちなみに、論文はこちらです。
    Pachinko Allocation: DAG-Structured Mixture Models of Topic Correlations

    Relational Topic Models(RTM)について

    文書の中身だけでなく、文書間のリンクの生成過程も同時に確率モデル化する手法。論文や特許データに対して活用できる。過去の購買行動に応じた、顧客のセグメント解析や商品のレコメンデーションに活用できるかもしれない。

    参考文献

    トピックモデル (機械学習プロフェッショナルシリーズ)
    トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ)
    Tokyo Webmining 46th 『トピックモデルことはじめ』
    machine_learning_python/topic.md

    統計数理研究所 H24年度公開講座 「確率的トピックモデル」サポートページ

    Rのleafletパッケージを使って蒙古タンメン中本をプロットしてみた

    Rのleafletパッケージで蒙古タンメン中本の店舗をマッピングしました。
    中本の全店舗地図は未だ観察できていないので、中本信者の方には嬉しい情報かもしれません。
    元となるデータは中本のホームページから収集し、GoogleMapのAPIで住所から緯度・経度を求めました。

    Rに読み込ませるデータはこんな感じになりました。
    中本データセット

    コードはこんな感じです。如何に簡単かがおわかりいただけると思います。

    参考情報

    embed R leaflet map in wordpress