AI

新卒研修の機械学習コンペティションで2位を取った話

*本記事は旧TechblogからCOLORSに統合した記事です。

目次

  • はじめに
  • 自己紹介
  • SIGNATE課題内容
  • データの概要
  • 予測モデルの作成手順
  • SIGANTEへのアプローチ
  • 成果発表会
  • 最終結果

はじめに

こんにちは。エイアイ・フィールドのM.Tです。

新卒研修で初めて機械学習を勉強し、SIGNATEというデータサイエンスのコンペティションサービスで機械学習予測モデル作成を行い2位/ 491人中(2019年9月12日時点)を達成したお話です。

自己紹介

大学では情報通信を専攻していて、主に数学、物理を勉強していました。プログラミングの経験はC言語を1年間学んだ程度です。

2019年度新卒入社し入社後の4~6月まではJava等のプログラミング研修を行いました。そのあと7~10月まではデータ分析に特化した研修を受けました。

具体的にはSQL、Python、機械学習におけるアルゴリズムの勉強をしました。

SIGNATE課題内容

練習問題として無制限で参加できる、「タイタニック生存分析」という課題に取り組みました。

目的はタイタニック号の乗客データから、乗客が生存したかどうかを予測するモデルを作成します。この問題では機械学習のポイントを学べる内容になっているのでとても良い訓練になると思います。

データの概要

SGNATE,タイタニック号

それぞれの変数を説明すると

  • id:インデックス番号
  • survived:生存結果
  • pclass:客室クラス
  • sex:性別
  • age:年齢
  • sibsp:乗船していた兄弟、配偶者の数
  • parch:乗船していた両親、子供の数
  • fare:運賃
  • embarked:乗船していた港

このデータの「survived」というのが今回予想したい変数(目的変数)です。

これらのデータを用いて生存予測をしていきます!

詳しい課題内容や、データの詳細はSIGNATEのページで確認できます。

https://signate.jp/competitions/102

予測モデルの作成手順

私が行った分析の手順は大きく分けて4つになります。

1.データの観察
主にデータの可視化を行います。ここでデータの考察をして前処理の方針を立てます。

2. 前処理
データが欠損していれば補完を行ったり、より良いモデルを作成するために新たに変数を作ったりしてデータを加工します。

3.モデル作成
機械学習アルゴリズムに前処理したデータを投入し、予測モデルを作成します。

4.評価
予測結果の精度を算出します。

使用言語

Pythonを用いて予測モデルを作成しました。
Python歴は9月時点で約2ヶ月でした。それまでにPython基礎試験を受験し、ある程度基礎知識を備えたうえでSIGNATEに挑戦しました。

SIGNATE課題へのアプローチ

すべてを書いてしまうと膨大な量になるのでそれぞれの手順で大事だと思ったことや、注意する点などをピックアップして紹介したいと思います。

データ観察編

ポイント①:扱うデータの内容をきちんと理解しておくこと!

当たり前なことですが、モデル作成においてかなり重要だと思いました。

いくつか確認することを挙げてみると

  • 受け取ったデータのファイル形式
  • 変数名(カラム名)が日本語かどうか
  • データの型
  • データの文字コード
  • 学習データと評価データの数
  • 欠損値の有無

このほかにも確認することはあるのですが、多いですね。
日本語・英語の切り替えや、データ型の変更はコーディング中に何度も確認していると効率が悪くなってしまったりするので最初に確認しどこかに書いておくことが大事です!

今回の学習データをまとめると以下のようになります。

変数名データ型欠損値ユニーク数
idint640445
survivedint6402
pclassint6403
sexobject02
agefloat648580
sibspint6407
parchint6406
farefloat640175
embarkedobject23


age(年齢)がfloat64という型なので、おかしいなと思って確認してみると62.5歳のようなデータがありました。

のちのちこのデータを考察すると、死亡してしまったため推定された値だとわかりました。
この情報だけでも予測モデルに有効な情報なのでデータの確認はかなり重要です!

ポイント②:統計知識を付けておくこと!
データの可視化を行っていると「平均値と中央値と最頻値が同じ値だから正規分布かな?」、「この外れ値は意味のある値なのだろうか?」など、統計知識を駆使してデータを観察する場面が多々あります。
タイタニック号の分析を例に挙げると、fare(運賃)のヒストグラムを作成すると運賃0~50の範囲に属する人が多く、運賃が高くなるにつれて人数が減少していることが読み取れます。しかし、運賃が250~300以降は0人が続くのですが、運賃500~550のあたりに何人か存在しています。
これはデータの観察を続けていると「500以上払っている乗客は全員生存しているから、運賃を多く払った人は救助が優先された可能性がある」といった考察ができて前処理の方針としてかなり役に立ちました。

SGNATE,タイタニック号
fare(運賃)のヒストグラム

前処理編

ポイント①:データ確認と前処理が機械学習の8割を占めることを意識すること!
機械学習はどのモデルを使ったかに注目しがちですが、作業量はデータ確認から前処理が一番多いです。この部分でモデルの精度が大きく関わってくるのでデータの確認と前処理は注意して行う必要があります。
また、実務でもグラフを見せることが多いのでわかりやすいようにグラフを可視化することも大事です。

ポイント②:データから分からないことを本やネットから情報収集することが大事!
機械学習を行う上で私自身一番学んだことだと思います。
「そもそもタイタニック号はどのように事故が起きたのか?」「乗客はどんな人が乗っていたのか?(データにはない国籍や身分)」など、予測モデルを作成するにあたってデータ以外の知識は新しい変数を作るときにかなり有効です。

例えば、タイタニック号の乗船場所の順番は「S→C→Q」の順序でした。

SGNATE,タイタニック号

乗船場所別の乗客数をヒストグラムに表示するとSが過半数を超えており、最初の乗船場所でかなりの人が乗ってきたことが分かります。
また、乗船場所別の生存率を算出すると「S」の生存率が一番低いです。

embarked(乗船場所)生存率
S35.0 %
Q41.0 %
C59.4 %


この結果から「最初に乗ったSの人たちが大半を占めていて、生存率が低いということは出口から奥のほうから客室は埋まっていった可能性があるなぁ…」という考察ができます。

このようにデータから分からないことを知るおかげで、データの理解度が深まっていきます。

モデル作成編・評価編

ポイント①:予測された結果を見て考察することが大事!
Pythonでモデルを作り、実際に評価データを与えると予測された結果が返ってきます。
そのデータを眺めると様々なことが分かります。
予測されたデータからどのような人を生存と予測しているのかわかりますし、今回のタイタニック号の乗客情報は学習データ445件、評価データ446件と機械学習においてデータの数は少ないほうです。少ないデータを用いると過学習をしてしまう可能性が大きくなります。学習データを用いたモデルの精度と検証データを用いたモデルの精度が離れている場合は過学習しているかもしれないと予想できるので予測されたデータを確認することは大事です。

ポイント②:単純なモデルから作っていくこと!
機械学習では単純なものから高度なものまで様々なアルゴリズムが存在します。
なぜここで単純なモデルから作成するかというと、精度の下限を知ることで目標までの自分の距離を知ることができます。
例として、ランダムフォレストというモデルを使う前に単純な決定木と呼ばれるモデルを使用しどのくらいの精度が出るか確認してみます。決定木での精度を下回るなら何かミスをしている可能性があるし、この精度からどのくらい上まで行けるか目安が立てやすくなります。(決定木は高精度ではないですが計算スピードや、結果のわかりやすさを優先すると良い場合もあります。)

成果発表会

約1ヶ月SIGNATEに取り組み、社内で成果発表を行いました。
新卒でSIGANATEに挑戦したのは自分を含め4名でそれぞれの取り組みを10人以上の人の前で発表しました。
資料を作っていると自分の理解度の浅さが分かることができて、アウトプットの大切さがわかりました。

機械学習を学ぶ上で大変だったこと、課題

研修を通して大変だったことは

  • データの変換・抽出のコーディングが難しい
  • 上位を目指すための地道な精度向上は自分一人では難しい
  • アルゴリズムの理解はかなり難易度が高い
  • 自分の言葉で説明することができない

データの変換・抽出はPythonでいうところのNumpy、Pandasと呼ばれるライブラリが多く使われます。これらの扱いを日々鍛錬することで改善できると思います。
また、SIGNATEやKaggle等で上位を目指すには小数点以降の精度を上げていくことが多くなっていきます。そのためにはいろいろな人にアドバイスを聞いたり、情報収集をしたりすることがカギとなってくるので大変でした。

下2つは今後も大きな課題となると思います。実際アルゴリズムはデータを投げれば予測結果が出てくるので使うというだけなら理解度はそこまで深く学ばなくてもいいですが、なぜこの結果になったのか説明するとなったときに困ってしまいます。そうなると理解度を深めなければ相手に説明するとき納得してもらうことができません。
機械学習は今でも研究が盛んで日々新しい手法が出てきますので、日々の勉強を怠らずに行っていきたいと思いました!

最終結果

一時期は1位を獲得できたのですが、夏季休暇中に2位になってしまいました…
かなり悔しいので時間があるときにまた挑戦したいと思っています。

SGNATE順位