2013年07月04日

失敗の備忘録…最新の年月の値の取得

とあるリコメンドロジックを作っていた際に、出力レコードが0になっていた。
テストでは正常に出力されていたのだが、どうしてだろう?と思い調べてみると…。

会員のステータスを月ごとに持っていると仮定する。
(例)
月 ID 状態
4月 1 A
5月 1 B
6月 1 A

SPSS Modelerでモデルを作成するときに、分析者側のオーダーとしては、

1. 7月の状態を計算し
 (→ 7月 1 B なるものを計算し)

2. 以下、モデルの付与を行う

という処理を想定していたのだが、システム側は、1. と 2. を独立のものと考えていたようで、2. → 1. の順番で実行されてしまった。
つまり、7月分のレコードがないので、出力レコードが 0 だった。。。というわけである。

ここで、今後の対策を兼ねて、いろいろ検討してみると、
・月が切り替わるタイミングで施策を実行する場合、当月のファイルを作成できない場合どうなるのか?
という問題も残る。

そのあたりの分岐の仕組みもバッチ化すると、場合分けの条件が増えてしまう。

解決方法としては、シンプルに、最新の状態(最新の年月)を持ってくるのがよさそうだ。

→ max値を取得し、条件抽出する。

2013年06月28日

バッチでモデルの自動更新

IBM SPSS Modeler(旧Clementine)を使って
1. モデルを毎日更新し
2. その出力結果をアウトプットしたい

ここで一度モデルを作り、ずっとそのモデルを使い続けるなら簡単なのですが、モデルを毎日更新する場合、どうするのか?

方法として二つ考えられます。

[やり方 1]
モデルノードを使わずに、すべてノードやスクリプトだけで完結する。
この場合、モデルノードの置換する面倒さはいりませんが、あまり複雑なモデルは作成できません。

[やり方 2]
Modelerに用意されているモデルノードを使い、スクリプトで制御をする。

例として時系列の需要予測を毎日行うと仮定します。

スクリプトの書き方として、

batファイルの書き方

D:\SPSS\Modeler\14.2\bin\clemb.exe -stream D:\test\時系列\時系列.str -script 時系列.txt -log log.txt -execute


スクリプトファイルの書き方

# モデルの実行

execute '時系列'


 

# 作成したモデルをパレットに挿入

insert model ARIMA at 950 110


 

# モデルの前のノードとモデルをリンクさせる

connect A to ARIMA


 

# モデルとモデルの後のノードをリンクさせる

connect ARIMA to B



いたって簡単にバッチ化することができます。

2013年06月26日

一般化ブースト回帰モデル

r で gbm を使ってみた。
gbm: 一般化ブースト回帰モデル (Generalized Boosted Regression Models)

計算時間はそれなりにかかるが、安定して高い精度が出せそう。

同じデータでランダムフォレスト(Random Forest)も使ってみたが、どちらもそれなりに時間はかかるし、精度も同じくらいだった。
パラメータ云々で多少の差はあるんだろう。

Rのオススメパッケージの一つになりそう。

2013年06月15日

Amazon.com - Employee Access Challenge

KDD CUP 2013もほぼ終了ということで、次のお題を探していたら、面白いのを見つけた。

Amazon.com - Employee Access Challenge
https://www.kaggle.com/c/amazon-employee-access-challenge

特徴量(説明変数)は、
・RESOURCE
・MGR_ID
・ROLE_ROLLUP_1
・ROLE_ROLLUP_2
・ROLE_DEPTNAME
・ROLE_TITLE
・ROLE_FAMILY_DESC
・ROLE_FAMILY
・ROLE_CODE
の9個。

目的変数は、ACTIONの1 or 0を予測するというもの。

一見単純そうですが、上記のカテゴリ変数を1,0にフラグ化する場合、
・RESOURCE → 7518
・MGR_ID → 4243
・ROLE_ROLLUP_1 → 128
・ROLE_ROLLUP_2 → 177
・ROLE_DEPTNAME → 449
・ROLE_TITLE → 343
・ROLE_FAMILY_DESC → 2358
・ROLE_FAMILY → 67
・ROLE_CODE → 343

と、いっきに 15,626変数を作成することができます。
しかも、ほとんど0しか入っていないというデータです。

この辺りどう工夫していくのかが、難しいところでもあり、
面白いところでもありますね。

評価基準としては、area under the ROC curveを採用しています。
http://en.wikipedia.org/wiki/Receiver_operating_characteristic

ちなみに、ベンチマークとして、randomのスコアが0.50000。
K-Nearest-Neighbors (k=1)のスコアが0.63083でした。

2013年06月12日

overflow in 8 bit arithmetic

overflow in 8 bit arithmetic

IBM SPSS Modeler(旧称 Clementine)を使い、Netezzaに処理をさせているときに発生したエラー。

う〜ん、なんだろうと思いましたが、調べてみると、エラーの原因は
"変数の桁あふれ"
が原因でした。

Aという変数が3桁(例えば、300)
Bという変数が3桁(例えば、400)
の箱に入っているとして、
A×Bを実行すると答えは、120000となり箱に入りません。

通常は、Modelerの中(ローカル)の中で処理をさせるので、発生しないエラーですが、
SQLプッシュバックでデータベース側に処理させる場合に発生してしまいます。

対処方法としては、キャストをして回避できます。
SPSS Modelerとしては、変数作成ノードを使わずに、入力ノードの部分に、下記の様にSQLで書きます。

例)
select
  A,
  B,
  A*B::BIGINT
from hogehoge

2013年06月11日

アナリティックス・カンファレンス 2013

『アナリティックス・カンファレンス 2013』に行ってきました。
統数研の樋口先生の講演が面白かったです。

以下、講義のメモ
----------------------------------------
・確率論は順問題を扱い、統計学は逆問題を扱う。

・ビッグデータの定義
 3v: 量(volume)、種類(variety)、頻度(velocity)
 5v: 3vに加え、価値(value)、情報の正確さ(信憑性)(veracity)

・価値密度
 価値密度 = 価値総量 / データ総量
 データ量が増え、価値密度が薄くなってきている

・cvr = (a+b)/(A+B)
 A:ターゲットの総量
 a:アクション(購買)数
 B:興味のない集団の人数
 b:アクション(購買)数

2013年06月06日

IBM SPSS Modeler サーバのメモリサイズ変更

最近、巨大なモデルを作成することが増えてきたのだが、メモリ不足で処理が停止することが頻発してきた。

ということで、IBM SPSS Modelerのメモリサイズを変更した。

クライアント側の設定は簡単で、
ツール→オプション→システム・オプション→最大メモリー
でメモリの値を増やすことができる。

サーバ側の設定は、
・ファイル名:jvm.cfg
 options, "-Xmx???m"

・ファイル名:options.cfg
 memory_usage, ???
 modelling_memory_limit_percentage, ??
 allow_modelling_memory_override, Y

この辺りのを設定をいじれば、使用するメモリを増やすことができました。

2013年06月05日

IBM SPSS Modeler、データソースが異なるテーブルの結合

IBM SPSS Modeler(旧称 Clementine)を利用して、データベース(Netezza)は同じなのだが、データソースが異なるテーブルを結合しようとしたら、結合ノードが紫色にならなかった。

つまり、データベース側で処理を行うのではなく、ローカルに持ってきての処理となっている。
(SQLプッシュバックが行われていない。)

同じデータベース上にあるんだから、それくらいなんとか頑張って欲しいものだが…。

データベースをどう設計するかとか、あまり分析者が立ち入らない場合が多く、データベース管理者的に管理がしやすい設計と分析者が分析しやすい設計って微妙に異なるんだなぁと改めて認識した今日この頃。

2013年05月30日

KDD CUP 2013 Trac1 に参加して感じたこと

KDD CUP 2013 のTrac1に参加しているが、Scoreが0.968まで上がってきた。

通常の業務をやりつつ、KDDに参加しつつってこともあり、あまり時間をさけないのが残念なのだが、効率的にモデリングをしたり、変数を作ったりすることで、なんとなく解ってきたことがある。

以下、そのまとめ。

今回、テキストのデータがあるので、それを使った方が良いだろうとは思う。
しかし、LDAなどでトピックを抽出し、距離(近さ)を計算し、そのまま投入するだけでは対して精度は上がらなかった。

むしろ、ネットワークの問題と考え、ネットワークの構造をうまく変数として与えることができれば、精度が大幅に上昇した。

次にモデルに注力した方が良いのか、うまい変数作りに注力した方が良いのか?
もちろん、両方大切である。

両方大切なので、あまりに偏った分析設計をすると、時間が足りなくなってしまう。
そこで、以下のようにすれば良いのでは?と。

最初は、モデルを固定せずに、できるだけ数多くのモデル(決定木、ニューラル、SVM、ロジスティック回帰)にチャレンジした方が良い。
この時に、あまりパラメータチューニングをガリガリ行うのではなく、簡単なモデル(チューニング)であたりを付けていく感じ。

その中で、筋の良いモデルとそうでないモデルが見えてくるので、だんだんと要らないモデルを落としていく。

上記の作業を行いつつ、変数を追加していくのだが、精度の凸凹は、変数を追加しても大きく変わることはほとんどない。
新たな変数を追加したところで、そのベースからの上昇率は、どのモデルも似たり寄ったり。

この辺りで、決定木とかも単にCHAIDだけではなく、C5.0とか、流行りのrandom forestなど複数の木を試してみる。
また、不要なモデルを削除し、そして、また、変数を追加しということを繰り返していく。

最終段階に入ってくると、深い構造を作っていく必要があるのだが、boostingやbaggingといったオプションで繰り返しモデルを作っていくと、相当時間がかかる。
この辺りになると、ほぼどのモデルを使ったらいいのか見えてくるので、1,2個のモデルを使いつつ、モデルのパラメータを微調整していく。
そして、また、変数自体も微妙性していく。

なんだか、職人のような気もするが、そうしてくると、微々ではあるが精度は少しずつ上がっていくので、(もちろん、オーバフィットには注意しつつ)、後は、どれだけ時間を取れるかが、1%以下の精度の勝負の分かれ目になるんだろう。

2013年05月29日

The maximum memory for the 64 bit Modeler Client should not be capped.

IBM SPSS Modeler(Clementine)でメモリをたくさん増やすと、起動時にJAVAのエラーが出てしまう。
メモリをたくさん使う必要があったので、調べなおしたら、使えるメモリが増えていた。

http://www-01.ibm.com/support/docview.wss?uid=swg21487451

ちなみに、JAVAのエラーが出た場合
C:\Users\\AppData\Roaming\SPSSInc\Modeler\Defaults

ここにあるファイルの値を元の数字に戻せば起動できるようになります。

2013年05月28日

データ解析のための統計モデリング入門

最近、読み進めている本があります。


データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

  • 作者: 久保 拓弥
  • 出版社/メーカー: 岩波書店
  • 発売日: 2012/05/19
  • メディア: 単行本



非常に解りやすい本でオススメです。
Rを使ってGLM、GLMM、階層ベイズモデルを解りやすく説明しています。

Rを使う人を想定して書かれているので、実際にRをインストールして、読み進めていくのが良いかと思います。

分析をする際に統計モデルなんて不要だ、Modeler(Clementine)で十分だと思っている人も多いかと思います。
実際に、数理モデルを構築しなくても、クロス集計でたいていのことは解りますし。。。

とはいえ、知っていて損をすることはないですし、分析の流れとして、
クロス集計 → 決定木などの機械学習 → 数理モデル → 最適化
といった流れが良いんじゃないだろうか?とも思います。

また、最近、IBM SPSS Modelerのノードの中にもGLMやGLMMが実装されています。
このノード何の役に立つんだっけ?って場合にもこの本が良い参考書になりそうです。

2013年05月27日

IBM SPSS Modelerで一般化線形モデル(GLM):ガンマ分布のGLM

R と IBM SPSS Modeler(Clementine)との比較です。

ガンマ分布は、0以上の連続値をとる確率分布です。

ここで x と y がこのような関係になっていると考えます。


y が連続地値で正の値しかとらないとします。

ここで y が 平均 μ のガンマ分布に従っていると仮定すると、



A=exp(a)とおくと



RのGLMの書き方は、
fit.gamma <- glm(y ~ log(x), family = Gamma(link = "log"), data = d)
summary(fit.gamma)

そして、これを IBM SPSS Modeler(Clementine)でモデル作成するとどうなるか?

まず、フィールド作成ノードでlog(x)を計算しておきます。



そして、一般化線形ノードを使い
・分布:ガンマ
・リンク関数:対数
を設定して、実行すればOK。



得られる結果は、Rと同じ結果になります。

2013年05月26日

IBM SPSS Modelerで一般化線形モデル(GLM):オフセットフィールドの使い方

R と IBM SPSS Modeler(Clementine)との比較です。

単位時間あたりのアクション数や、単位面積あたりの店舗数などを扱う場合にオフセットフィールドが登場します。

こじつけの例として、ある期間Aにおけるアクション数 y があり、変数として x が与えられたとします。
その際、単位時間あたりのアクション数 y と x との関係をもモデリングするというものです。

単位時間あたりのアクション数 = アクション数(λ) / A
λ = A × 単位時間あたりのアクション数
= A exp(β1 + β2 x)
= exp(β1 + β2 x + log(A) )
となります。

logを取ると、
log(λ) = β1 + β2 x + log(A)
と線形で書けるようになります。

つまり、β1 + β2 x + log(A) を線形予測子とするポアソン分布として扱うことができます。
log(λ)ということなので、リンク関数は、対数になります。
log(A)は、パラメータがつかないので、オフセット項となります。

Rで書く場合は、
 fit.all <- glm(y ~ x, offset = log(A), family = poisson, data = d)
と書きます。

Modelerの場合の設定は、



と設定します。

実際は、Aというフィールドに面積やら時間が入っているかと思うのですが、Rでは、log(A)と書くのに対し、IBM SPSS Modeler(Clementine)では、いったん log(A) というフィールドを作成してあげる必要があります。

2013年05月24日

IBM SPSS Modelerで一般化線形モデル(GLM):二項分布

ポアソン回帰は、こちら。
http://skellington.blog.so-net.ne.jp/2013-05-23

二項分布の場合は、少々ややこしかったです。(^^;

N個の中からy個を選び出す場合どうするか?


Rで書く場合は、
 fit.xf <- glm(cbind(y, N - y) ~ x + f, data = d, family = binomial)
と書けばOKです。

リンク関数を正確に書くならば、
 fit.xf <- glm(cbind(y, N - y) ~ x + f, data = d, family = binomial(link = "logit"))
と書きます。

IBM SPSS Modeler(Clementine)でどう設定するのか?

まず、Nとyの設定ですが、フィールドタブでこの様に設定します。


エキスパートタブでは、こうです。


これで、RのアウトプットとModelerのアウトプットが同じになることが確認できました。

ちなみに、xとfの交互作用を扱う場合ですが、Rでは、
 fit.xf <- glm(cbind(y, N - y) ~ x * f, data = d, family = binomial)
と書きます。

Modelerの設定は、

モデルタブのモデルタイプ:
主効果のみ → 主効果およびすべての2方向交互作用
と変更します。

こちらも、Rと同じアウトプットが得られました。

2013年05月23日

IBM SPSS Modelerで一般化線形モデル(GLM):ポアソン回帰

GLMといえば、Rで分析していましたが、IBM SPSS Modeler(Clementine)でも同様のことができます。
本当に値って同じ結果が得られるのか?と検証しました。

結果は、RもModelerも同じ結果になっています。w

ポアソン回帰ですが、どういう場合に使うのか?
y <- x1 + x2
を考えた時に、yが上限のないカウントデータの場合にポアソン回帰を使います。

具体的な事例では、1年間にアクションする回数とかでしょうか。
たとえば、旅行サイトのアクション数を想定した場合、ある人は0回ですし、ある人は1回といったデータです。

Rで書く場合は、
 fit.all <- glm(y ~ x + f, data = d, family = poisson)
と書けばOKです。

リンク関数を正確に書くならば、
 fit.all <- glm( y ~ x + f, data = d, family = poisson(link = "log") )
と書きます。

Modelerの場合の設定は、わかりにくいですが、

と設定すれば、Rと同じ結果が得られます。

2013年04月24日

IBM SPSS Modelerのスーパーノード内にパラメータを渡す方法

久々に、IBM SPSS Modeler(旧Clementine)のネタ。

同僚からスーパーノード内のデータベースの設定ってどうするんですか?という質問があったので、作ってみた。

IBM SPSS Modeler Clementine クレメンタイン

まずは、スーパーノードなしの場合の書き方のおさらい。

set データベース.username = "********"

set データベース.password = "********"


 

execute 'テーブル1'



これをスーパーノード化した場合、どう書くのか?

set スーパーノード.parameters.'データベース.username' = "********"

set スーパーノード.parameters.'データベース.password' = "********"


 

execute 'テーブル2'



オブジェクト指向的に考えると簡単で、スーパーノード.parameters.と書けばスーパーノード内にパラメータとして値を渡すことができる。

実際に、スクリプトを実行してみると、

実行前
IBM SPSS Modeler Clementine クレメンタイン

実行後
IBM SPSS Modeler Clementine クレメンタイン

となっている。

パラメータとして、
データベース.username
データベース.password
がスーパーノード内に渡っていることが確認できる。

また、スーパーノードの外にデータベースという名前があり、スーパーノード内にもデータベースという名前がある。
通常、同じ名前のものがあると、スクリプトでエラーが発生するのだが、中と外ではきちんと分けて扱われるため、エラーは起きないようだ。

2013年04月22日

KDD Cup 2013

KDD Cup 2013 - Author-Paper Identification Challenge
https://www.kaggle.com/c/kdd-cup-2013-author-paper-identification-challenge

KDD Cup 2013 - Author Disambiguation
http://www.kaggle.com/c/kdd-cup-2013-author-disambiguation

データが遅れていましたが、KDD CUP 2013がようやく始まりました。

分析する期間が1か月半くらいしかありませんが、、、参加してみます。w

2013年04月18日

Analytics 2013 - SAS Forum Japan

Analytics 2013 - SAS Forum Japan に行ってきました。
http://www.sascom.jp/event/analytics2013

マッキンゼーのポール・マクナーニ氏の講演が面白かった。

なんでも、Amazon.comで出品されていた新品の本「The Making of a Fly」に2,300万ドル(約19億円)という価格が付けられたそうです。

「The Making of a Fly」で検索すると、この話がいっぱいヒットします。
http://www.michaeleisen.org/blog/?p=358

アマゾンでは他の出品者の価格をクロールして、自動で出品する価格を決定するアルゴリズムが利用できます。
通常は、他社よりも少しだけ低い価格に設定しますが、逆に、少しだけ高い価格にしても売れる場合もある。

この例では、
profnathはbordeebookの0.9983倍
bordeebookがprofnathの1.270589倍
となるように価格を設定したそうですが、これを繰り返していくと

0.9983×1.270589×0.9983×1.270589×・・・
どんどん値段が上がっていきます。

上限や下限を設定しておかないと、ただ同然の値段で売ったり、このような笑い話のような値段を設定したりしてしまいます。

2013年04月11日

Information On Demand Conference Japan 2013

Information On Demand Conference Japan 2013 に行ってきました。
http://www-06.ibm.com/software/jp/data/events/iodc2013/

なんかやけに多いなぁと思ったら、3000人も入ったそうです。
ビッグデータブームを象徴しているようです。

いくつか発表を聞きましたが、どの発表も得られるものがありました。

通常の業務の新しいアイデアにしたり、他社の分析者と話すことで、また1年間のやる気が出てきます。(爆

次は、秋にあるんでしょうかね?
次回も楽しみにしています。

2013年03月25日

2012年度、データ解析コンペの成果報告会

2012年度、データ解析コンペの成果報告会がありました。
最近の学生の活躍は本当にすばらしいものがあります。
社会人部門に出ても十分にやっていけるであろうチームもありました。

今年は、データを提供する側として1年を過ごしましたが、やはり見ているだけでは物足りなく、自分だったらこうしたいとか、なるほどそういう視点ですか、といった気持ちでした。

後は業務との兼ね合いですが、来年度のデータも面白そうなので、出て見ようかなと、考えています。