早いもので今年も12月になってしまいました。
今回は、いつものブログと少し趣を変えまして、Oracle Cloud Advent Calendar 2018との連動企画として少し砕けた感じで執筆します。
さて、テーマですが、前回紹介したOracle Analytics Cloud(OAC)を使った機械学習にしようと思い、オラクルお馴染みのInsuranceデモを準備していたのですが、Cloudii様のブログでOACによるタイタニック生存予測の記事を見つけまして、勝手にコンペしてみよう企画にします。
題材は、同じkaggleのTitanic。目標精度は73%以上を目指します。
【Cloudii様の記事一部抜粋】
さて、何はともあれまずは「データの理解」から始めたいと思います。
今回のデータセットは、タイタニック号に搭乗された方がどのような属性であったかを表しているデータになります。
TrainデータとtestデータをデータセットとしてOACにアップロードした後、目的変数である「Survived」がどのような項目であるか確認します。
Survivedを右クリックして「Suvrivedの説明」をクリックすると、OACが基礎情報を教えてくれます。
Trainデータには、891件あり約4割が生存(1)していることがわかります。
キードライバを確認すると、Survivedに相関が強い項目は性別やチケットクラス、出港地、同乗者数などのようです。
何も考えずに、これらの項目を説明変数としてRandomForrestでモデルを作成したところ74%の精度がでました。(目標達成!)
と、ここでこのブログを終わらせるのも忍びないので、精度向上のために少し工夫をしていきたいと思います。
データを眺めていると、AgeやCabinなどは使えそうではあるものの欠損値があるためにNull埋めしてあげる必要がありそうです。
また、性別が強い相関を示していたため、特徴量を増やすために名前から敬称(Mr. Mrs. Missなど)を抽出すれば使えそうな気がします。
さらに、同乗者数がSibSPとparchに別れているため、これらを合算した項目なども良いのではと推察します。
このような、分析前の前処理部分をデータフローで作成していきます。
・敬称(Honorific)の抽出
グループ化機能を利用して、Nameに含まれる敬称別に分類します。
・Ageのnull埋め
列の追加でCase文を利用し敬称毎の平均年齢で補完しました。
・家族人数の算出
これも同様に列の追加で、単純に足し算しています。
・Fareのビン化
料金はそのまま使うと計算量が多くなりそうなので、ビン化機能で4つの区分に分けます。グラフ見ながらビン数変えたり、手動で位置を変えれたりするのでかなり便利な機能ですね。
・チケット番号やキャビン番号からのグループ抽出
チケット番号を眺めていると349905とか347742とか、左2桁で共通項がありそうだったので、そこを抽出します。
キャビンも同じようにしました。(nullが多いのであまり意味はなさそう)
ALONEは、家族人数が0であればばフラグを立てるようにしています。(一人だけで乗船している方が助かっている確率が高い)
・データセットの保存と実行
別の名前でデータセットを保存し「データフロー」の実行をクリックすると、データの準備が完了です。
忘れないようにtestデータにも同じ処理を行ってあげます。
いよいよモデルを作成していきます。ここでもデータフロー機能を利用します。
まずは、学習に使う項目だけ「列の選択」で選びます。
・アルゴリズムを選択
Random Forrestを選択しTargetに「Survived」Positive Case に「1」を入力します。
・モデルの保存と実行
モデル名を入力しデータフローを実行することで、モデルが作成されます。
・モデルの適用
同じくデータフローで、testデータを呼び出し「モデルの適用」を選択します。
「モデル」欄で先ほど作成したモデル名を選択し、出力項目PredictedValue(予測値)を「Survived」という項目で出力するように設定します。
・提出用フォーマットに整形
Kaggleで答え合わせ出来るようにPassengerIdとSurvivedだけにします。
・データセットに保存&実行
保存する名前を入力しデータフローを実行することでテストデータにモデルが適用され予測値が付加されたデータセットが完成します。
OACからデータをダウンロードし、Kaggleに提出します。
ちなみに落としたデータの雰囲気。
気になる結果は。。。。
78.4%
よかった。。。一応目標達成です。
もう少し粘って80%を目指したかったのですが、今回は時間切れなのでここまで。
さらなる工夫の余地としては、年齢やキャビンのnull埋めを予測モデル作って行ったり、アルゴリズムのパラメータチューニングなどが考えられます。
Python書ける人から見るとOACを使った機械学習は少しまどろっこしく見えるかもしれません。しかし、セルフサービスBIツールであるDVだからこそ、データの会話という意味ではスクリプトより効率が良いと思いました。今回の作業もExcel操作できる方であれば、2時間程度で行えるものです。データ分析の民主化という意味では、非常に有効なツールと言えるのではないでしょうか。
それでは、良いクリスマスをっ!