すっかり参加レポートが遅くなりましたが、9月15日に開催された、オラクルさん主催の「R中級編」勉強会です。14日の初級と2日続けての参加となりました。

概要

初級編につづき、講師は日本オラクル 小川幹雄(オガワミキオ)さん
ゴールは、Kaggle に提供されているタイタニック号 生存者分析の予測モデルを作成し、アップロードするところまで。当日の資料はコチラ

まずは Rstudio を入れよう!

  • ひとりで使用するなら無償で使える
    • スクリプト実行や、タブ補完、データフレームの表示、グラフの保存などなど、ちょー便利な機能が揃っている
  • マルチユーザーで使うには有償版が必要

機械学習において直面する現実

初級でも言われてましたが、データサイエンティストは華やかな部分だけでなく、泥くさーい部分が多々ある

  • 法務レビュー
    • 例えば、人事情報って使っていいの?顧客情報って使っていいの?といったところ
  • 品質検証
    • ひとつの対象でも、同じ形式で入力されているとは限らない
    • 男性、男、Male、1:男性 ・・・といったようにバラバラになっているデータを整形する
  • 特徴抽出
  • 新規データ
    • どこからどこを新規ととらえるのか?
    • そもそも、どれくらいのデータ量が溜まっていれば良しとするのか?
  • ビジュアライズ
    • アルゴリズムを使っている部分は「なんか難しいことやってる感」(キラキラ感)があるけど、大事なのはあくまで結果
    • 結果は数字でしかないので「キラキラ感」は伝わりにくい
    • なので、どのようにビジュアライズして伝えるかは大事
  • 顧客フィードバック
    • 機械学習によって、どんな効果がえられたか

Kaggle とは

企業などがデータを提供し、参加者が最適な予測モデルを競いあっているプラットフォーム。コンペティションでは賞金をGETできる(当日閲覧したときには、RedHat社がコンペを開催しており、賞金 $50,000 が提示されてました) また、優秀なデータサイエンティストならば、kaggle 経由で企業からオファーがくることもあるそうです。

日本企業としては、リクルートがおそらく日本で初めての賞金付きコンペを開催されていたとか。(あとでググってみたところ、ボンパレの過去購買データから、クーポン購買予測のコンペだったようで、賞金は1位:$30,000 2位:$15,000 3位 $5,000 でした)

kaggle に挑戦!

ということで、参加者全員で kaggle アカウントを作成し、いざ分析データのGETです。
今回使用したのは、「Machine Learning from Disaster」というタイトルで、タイタニック号の搭乗者情報、生存者情報をもとに、生存者の予測モデルを作成するという内容です(ちなみに賞金はなく、kaggle の入門編的な扱いのようです)

これらのデータには、次のような情報が含まれています。生存情報、渡航者クラス、名前、性別、年齢、兄弟・配偶者の数、親・子供の数、チケット番号、運賃、キャビン(船室)、乗船所 など。
これらを元にどんな人が生き残ったのかを予測するワケですね。

Kaggle の仕組み

予測モデルに対して、kaggle はどのように評価をするのか。
kaggle は元データを分割して提供している。1つは学習データ(このケースでは生存情報ありのデータ)、もう1つはテストデータ(生存情報なし)参加者は学習データをもとに予測モデルを作成し、テストデータの誰が生存したかを予測し、その結果を kaggle にアップロードする。kaggle 側には、テストデータのうち誰が生存していたかの情報があるので、突き合わせをして答え合わせをするとのこと。(全データが採点対象ではなく、採点対象となるデータが決まっているらしい)
ちなみに、このケースの上位ランカーは 100% の正解率となっているが、ズルをしているだけとのこと(タイタニック号の生存者情報を探せば、手入力でアップロードデータは作れてしまうので、、)

「R」のデータ整備

  • データの整備の仕方で、精度に差がつく
  • Mr、Mrs、Miss などの肩書を列に追加する(他に Drや、Sir、Don、Capt など名前に称号などが含まれていることに気づければ、新たなグルーピングができる)
  • Mlle(マドモワゼル)、Mme(マダム)などフランス語は、Mr や Mrs にまとめることができる
  • full$Title <- 関数とした場合、full(データストア) に Title 列 がなければ、そのまま Title 列として追加される
    • ただし、既に Title 列が存在する場合は、上書きしてしまうので注意
  • gsub
    • 一括置換をした結果を返す。sub もあるが、こちらは一致した単一置換結果のみを返す
  • 少ないデータはレアケースとしてまとめる
    • 例えば、ドクターの搭乗数が1名で、仮に生存した場合、「ドクターは必ず生き残る」という間違った学習データを与えてしまうことになる
  • キャビンの番号から宿泊位置を想像する
    • キャビンの値の先頭がアルファベット1文字のものが多い → 船室の位置によってネーミングされているなら分析データとして使えるかもしれない → 先頭のアルファベット1文字を船室位置として抽出し列に追加してみよう
  • sapply
    • 複数データに対して一括処理を実施する
    • for 文でも書けるが遅い
  • function(x)
    • functoin で独自関数を作ることができる
  • 欠損値の状態を確認して、補完する
    • md.pattern関数 ざっくり欠損値を確認する関数(ざっくり??)
    • mice関数 欠損値を補完する

予測モデルを作成/予測結果

予測モデルは、初級で演習したランダムフォレストを使いました。(今回のメインは、あらなたアルゴリズムを学ぶことではなく、機械学習におけるデータ整備の泥くささを体験するということなのでしょう)

いざ、Kaggleに提出

予測モデルによって導きだされた予測結果の csv ファイルを、kaggle にアップして採点を待ちます。スコアは 0.78947 となり 1618位/5152人中でした(笑)

さいごに、Oracle R Enterprise デモ

の予定でしたが、お約束のように時間切れとなりデモは割愛。自社製品の紹介を削って、ハンズオンに時間を割いてくださった講師の小川さんはやっぱり男前ですね!


R中級編、さすがに内容は難しく、データ整備後半は入力に必死でついていくのがやっとでした(;・∀・)だもんで、関数ひとつひとつの理解には及んでいません。。が、機械学習の一般的なイメージ(数式やアルゴリズムを使って、これが導きだされた予測結果です!( ー`дー´)キリッ みたいな)とは違って、好き勝手に入力されたデータを統一したり、分類したり、正規表現などを使って文字を抽出したり、置換したり、無いデータを補ったり、地道な作業のうえに成り立っているということを、体験させていただきました。
一方で、泥臭い部分ではあるけれども、数式やアルゴリズムより、「与えられたデータをどう整備するか」「どのように想像・仮説をたてて分類するか」といった部分のほうが、より良い予測結果を導きだすのには重要なんじゃないかとも思いました。


10月18日に「Oracle Cloud Developers Meetup@関西 – 機械学習でお客様が他にも買いそうな商品を予測しようじゃないか。」が開催されますので、早速こちらにも登録いたしましたので、またヨロシクお願いします!

https://oracleclouddevelopersk.doorkeeper.jp/events/52288