Cox Proportional Hazards Model on Azure Machine Learning with R

このアーティクルはTokyo-Rでのプレゼンをベースに書き起こしたものになります。

本アーティクルではCox回帰を例題に説明を行いますが、一般化線形回帰のときのケースは.NET ラボの7月のLTでやっておりますので、Azure Machine Learningのアーティクルをご活用ください。

Microsoft Azure プラットフォーム上に構築された機械学習のためのPaaSであるAzure Machine Learningを使って、Cox回帰をやってみます。Azure Machine Learningの環境はML Studioというもので完全にWebベースでモダンブラウザなら大方のブラウザで操作できます。環境のスクリーンショットを示します。

ML Studio Screen shot

Azure Machine LearningはMicrosoftのプロプライエタリなビルディングブロックとRベースの分析環境の複合で実現されています。プロプライエタリなビルディングブロックにはSVMなど多くの分析手法が実装されていますが、生存時間など実装されていないモデルもたくさんあります。

まず、生存時間分析を実施する場合、データ量が大きくなると問題になるのはデータセットの準備です。生存時間分析ではイベント発生までの時間が必要になりますから、データを走査してイベント発生までの時間を抽出するのはわりと大変です。

さらに、その部分ができたとして、実際に適正なモデルを得るにはクロスバリデーションなどを含め考える必要があります。

今回はRの標準的な配布の中に含まれるsurvivalを使うので問題はありませんが、パッケージをインストールしなければならない場合には、ちっと対応が要ります。基本的にはパッケージ及び依存先を上げておいて、明示的にローカルからinstall.packageします。

Rに組み込まれているデータセット kidneyをエクスポートして、Azure Machine Learningでモデリングする例を示します。

この場合のExecute R Script ブロックに書くコードを示します。

library(survival)

kidney <- maml.mapInputPort(1) # class: data.frame

kidney.cox <- coxph( Surv(time, status) ~ sex+disease, data=kidney) 
kidney.fit <- survfit(kidney.cox)

plot(kidney.fit)

mamlというのはAzure Machine Learningで組み込まれているパッケージで自動的に読み込まれます。mapInputPortはデータの読み込みに使う関数でブロックへの入力データをデータフレームとして吐き出します。plotなどの作図は何も書かなくてもブロックからの出力に含まれるのでこのような単純な例ではRのコード側での対応は要りません。また、先の線形回帰の例で示していますが、データフレームを出力するとデータとして拾えます。

Chart of survival

今回の例ではデータセットが小さいため、全データをそのままモデリングしていることもあり、特に考慮していませんが。大きなデータで複数のセットを作って、学習を進める場合には複数のExecute R Scriptブロックを用いて、Azure ML側のデータの分割などの機能セットを使ったほうがよいと思われます。

また、データを走査してのイベント発生日の検出にはHDInsightに含まれる、Hadoop環境で行うのもありえるでしょう。

また、モデルそのものの適用については Azure Machine Learningでは実行環境をAPI化する機能をサポートしているのでRServeとかを考えなくても展開ができます。とはいえ、これでポンだけでは結局、predictを叩いているのと差がないのでもうちっとあがいてみます。車輪の再発明とも言いまが。

生存時間そのものは以下のようなモデルです。

h(t)=\lim_{\Delta t \to 0} \frac{S(t)-S(t - \Delta t)}{\Delta t} \cdot \frac{1}{S(t)}
H(t)=\int_0^{t} h(t)du=-\log S(t)
h(t)=h_0(t) \cdot \mathrm{e}^{(\alpha + \beta_{1} X_{1} + \beta_{2} X_{2} + \ldots + \beta_{p} X_{p})} = h_0(t) \cdot RISK

従って、時間を無視してパラメトリックに表されたリスクの効き具合だけを単純に議論するならば、係数を説明変数かけて合計してエクスポネンシャルするのと同じです。ただし、Rのcoxphでは説明変数は内部で平均を引き算して用いているので適用する場合にはそこも実装しないと同じ値にはなりません。適用をC#で実装した事例はC#によるCox回帰の適用の実装で書いたのでご確認ください。

コメントを残す