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年を過ごしましたが、やはり見ているだけでは物足りなく、自分だったらこうしたいとか、なるほどそういう視点ですか、といった気持ちでした。

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

2013年03月13日

ABテストのコントロールグループ

最近、行ったフィジビリについてのお話。

ABテストを行う上で、Aグループ(通常グループ)とBグループ(新ロジックグループ)を分けました。

ここで、ちょっとした問題が。

AグループとBグループを抽出し、そのリストを提出しましたが、どうも効果の差が怪しい。

色々調べた結果、AグループとBグループでリストが提出された後、その中からさらに対象者の剪定が行われていたため、効果に別のバイアスがかかってしまっていました。

基本的なことですが、もろもろリストの剪定を行い、最後の最後でABのグループに分けることが大切です。
そうすることで、初めて効果が純粋に測定できます。

リストを提出した後に、剪定作業があるのか、ないのか、基本的なことですが、、、
きちんと確認しておかないと、変なバイアスがかかったまま、フィジビリの効果を測定するってことになりかねないので、注意が必要ですね。。。

2013年03月07日

データ解析コンペ、大阪の部会

データ解析コンペで大阪の予選に行ってきました。

OR学会と比べ、アプローチ方法がずいぶんと違い新鮮な気がしました。
学会(部会)の特徴なんでしょうね。

優勝して次に進まれたチームは、本戦でも頑張ってください。

2013年02月23日

2012年度 データ解析コンペ(OR学会の予選)

今日は、データ解析コンペOR学会の最終発表がありました。
課題編とフリー編の発表がありました。

課題編とフリー編で感じたことは、時間をかけて真摯にデータに向き合っているところは、やはり点数も高く、テキトーにやっているところは、点数も低かったのでは、と思いました。

学生にしろ、社会人にしろ、新たなことにチャレンジするためには、時間が取られる。
その時間を作るためには、何かを捨てて時間を作る必要があります。

捨てる覚悟、最後まで本気でやり切る思いが、最終的な差につながったのではと思います。

2012年12月18日

メールで one to one リコメンド

one to oneのレコメンド(例えばメルマガとか)を推進する上で、既に何らかの施策が行われている場合、
その効果ってどうなんだ?
と問われることが多いはず。

2つの場合に分けて考えてみたい。


1. 全員に送るのではなく、すでに何らかのロジックで抽出されている場合
こちらは、話は簡単で、ABテスト(フィジビリ)を行い、新しいロジックの方が優れていることを証明できれば良い。

例えば、化粧品などのレコメンドをする場合

A(既存):20代〜30代の女性に送っていた
B(新アルゴリズム): 男性でも興味がある人には送るし、女性でも興味がない人には送らない

シナリオとしては、下記2つが考えられる。
・A(既存)を同じ量のメールをBのグループに送り、アクション数や利益がAよりも高いことを証明する
・A(既存)を同じアクション数や利益を得るのに、Bの方が少ないメール(コスト)で同程度のアクション数や利益が得られることを証明する。


2. 全員に送ってしまっている場合
こちらは、少し面倒である。


A(既存)と同じ量のアクション数や利益を得るためには、Bも全員に送る必要があるからだ。
当然、全員に送っているので、効果の高い人もいれば、薄い人もいる。
薄い人は、ほとんどアクションしないのだが、送らなければ、絶対にアクションしないわけで、短期的な売り上げが減少するリスクがある。

となると、別の視点が必要になってくるのだが、某サイトとかだと、メルマガを登録すると、次の日から死ぬほどメールが送られてきたりするサイトもある。
送れば良いってものじゃなく、やはり適正なタイミングやメール数があるわけで、このあたりをきちんと考えていない輩も多い。。。

別の視点というのは、中長期の利益。
つまり、メールを送り過ぎることによる離反を加味し、中長期の利益を換算してみてはどうだろうか。


質 <------> 量

対象者を絞れば質が良くなり、対象者を広げれば量が増える。
Bのグループの対象者を変化させ、短期的な利益、離反者、長期的な利益の変化をシミュレーションすることで、リコメンドの落とし所がみえてくるのではと思う。

そもそも、長期的な視点を持たず、短期的な視点のみしか考慮しないのであれば、、、
結局は全員に送ることになり、意味がないのだが…。

2012年11月22日

数理システム ユーザーコンファレンス 2012

数理システム ユーザーコンファレンス 2012

「数理システム ユーザーコンファレンス 2012」に行ってきました。
http://www.msi.co.jp/userconf/

今週は、ステップ休暇が明けたということで、良い気分転換(?)になりました。
(´∀`)

2012年11月17日

平成24年度データ解析コンペティション 第1回研究部会

今日は、データ解析コンペティションの中間発表がありました。
フリー学生の部、フリー一般の部、課題の部と一日かけての発表会。

年々、学生のレベルが上がってきている気がしますが、今年も学生の部はキラリと光る発表が多かったです。

一般の部は、、、いつもスローな感じがしますが、今回もスロースタートなチームが多かったように思います。

さて、データ解析として、二つのステップがあると思います。
1. データや課題を理解する
2. 実際の施策(アクション)に落とし込む
です。

大学での研究ではなく、実際にビジネスの中でデータを解析するということは、2.の部分がとても大切なわけですが、例年の発表をみていると、1.で終わってしまっているチームが多いと感じます。

1.の部分にすごいパワーを使って、
「○○ということがわかった。」
としても、実際には、
「まぁ、そうだよね。」
となる場合が多い。

パワー配分としては、1.は、そこそこにしておいて、2.の具体的な施策部分に接続するための分析にパワーをかけた方が良いと感じています。