Oracle Analytics Cloud で Titanic 80%を目指す

Oracle Cloud Advent Calendar 2018 - Adventar 11日目になります。
id:y-nakamori です。

Oracle Analytics Cloud(OAC) で Titanic 解きます。

  • グループ
  • ビン
  • 関数少し この辺りを用いて、前回できなかった前処理を頑張ってみます。

結論ですが79%でした><

OAC をゆるく使ってゆるく所感を出力しようと思っていたところ、以前書いた記事が本家本元 Oracle 様に補足していただけてしまいました。
blogs.oracle.com

こちらが前回の記事になるのですが
cloudii.atomitech.jp ちょっとした前処理は手元で作業してみたり、データフロー定義もたいしてせずに結果を出してみたりと雑なまま記事にしたのですが、Oralce の方の記事ではしっかりとその雑に済ませてしまった近辺を拾って記載されていました。大変勉強になりました。
本来書こうと思っていたことが全て盛り込まれているので、リンクだけ貼って終われてしまうのですが、せっかくの Advent Calendar なので、前処理についてより詳細に記事にしてみます。
今回は80%超えたら良いな。

Titanic のパラメータについてや Kaggle については、上記の記事を参照ください。
また、オラクルさんの記事を全面的に参照している記事になります。

敬称のグルーピング

OACにはグループ分けする機能があり、以前は使い方が分からず断念していましたが、とても便利な機能でした。カラムに対して分けたいグループごとに検索して追加してを繰り返し、好きなようにグルーピングできます。
まず、Name に焦点を当ててみます。どうやら名前には

  • Mr
  • Miss
  • Mrs
  • Master
  • Dr
  • Rev
  • Major, Capt...etc(軍階級)

等の敬称があるようで、性別も大きな要素ですが結婚/未婚や仕事の敬称の場合もあり、情報量としてはそこそこありそうです。これらを特徴量として取り出していきます。
と、張り切って項目を沢山出したのですが、5,6の項目を抽出している段階で

問題が発生した可能性があります。再試行してください。問題が解決しない場合、完全な製品を目指して対応いたします。 f:id:y-nakamori:20181210174243p:plain

と、手に負えなさそうなエラーに遭遇しましたが、何度か試しているとどうにか全ての項目がグルーピングできました。割とこの手のエラーは何回か試行すると通ったりするみたいです。 諦めたらそこで試合終了なんです。
最終的にはこんな感じに
f:id:y-nakamori:20181211161251p:plain 左の列でラベルを定義し、そのグループに所属させたい文字列を検索にかけ、すべて追加していきます。

年齢の補完

オラクルさんの記事で、なるほど敬称毎に補完する方法があるのか!と学びがありました。
確かに男性/女性/未婚/既婚/子供... とそれぞれ異なる年齢層になります。早速参考に上で分けたもの毎の平均で補完してみます。
列の追加より

IFNULL (Age, CASE
        WHEN Honorific='Mr'     THEN 32
        WHEN Honorific='Miss'   THEN 21
        WHEN Honorific='Mrs'    THEN 35
        WHEN Honorific='Master' THEN 4
        WHEN Honorific='Military' THEN 54
        WHEN Honorific='Rev'       THEN 43
        WHEN Honorific='Dr'        THEN 42
        ELSE 42 END)

家族周り

恐らく災害時には家族と一緒に行動するでしょう。
その際その人数が多ければ多いほど集まるまで時間がかかり初動が遅れます。また救命具の数やボートの定員にも影響してきます。つまり家族構成が生死に与える影響は少なくないと言えそうです。
また、60歳以上, 15歳以下が同一行動をする中にいると生死に影響しそうな気がしますが、こちらは OAC だけで完結させる力がなかったため断念しました。もし方法があればご教授ください。 イメージとしては、ファミリーネームを列として追加し、同一ファミリーネームを持つレコードが他にあればフラグを立てる、というようなことがしたいです。

家族サイズ

CAST(Parch AS numeric) + CAST(SibSp AS numeric)

これくらい簡単なものも、前回の記事ではサボっていたので申し訳ない気持ちになってきますが続けていきます。

年齢のグルーピング

代わり(?)に年齢はグループ化していきます。
先ほどと同様に考えて、~15歳, 15歳~40歳, 41歳~59歳, 60歳~ のざっくり4つのグループに分けたいと思います。
使用する機能は ビン です。こちらの機能は連続したデータに対して区間を区切ってグルーピングする機能 といったところでしょうか。

チケット番号, 客室番号

Cabin の情報は欠損値が多いのですが、Cabin の値がある人は生存率が高いように見えます。
先の記事を参考に、まず欠損を UNDEFINED(被らなさそうな文字列)で埋めた後、先頭2文字を取り出します。 Cabin の場合

  • Cabin 補完
IFNULL(Cabin, 'UNDEFINDE')
  • Cabin 前文字抽出
LEFT(CompCabin, 2)

最後にランダムフォレストのパラメータを弄ります。 Number Of Trees, Sample Size For A Tree, Number Of Features For A Tree...
辺りが影響してきそうですが、どれがどれくらい影響するかが見えるようになると素敵だなと思いました。
トライ&エラーで調整しました。

結果です。 f:id:y-nakamori:20181211164958p:plain 79%という、微妙なところで落ち着きました!

まとめ

やはり細かいことをしようとしだすと Python なんかを使いたいなと思うのですが、提供されている機能 + 簡易 SQL だけでかなりのことができるようでした。 コードを書かずに80%を超えるのも無理ではなさそうな雰囲気です。
機械学習をやっていくぞ!となると厳しいですが、所感を掴むだけや概念の理解にはもってこいだと思います。
また、このまま Visualization へも出力できるので、機能が拡充されていけば業務にも組み込めるかもしれません。