Kaggleコンペに参加してみました。(その2)

Keepdata株式会社 開発Divの瀧田です。
それでは前回に引き続き、kaggleコンペに参加した結果と感想の第二回をお伝えします。
今回はモデルの作成をしていきます。

データの確認

まず、前回で確認していなかったそれぞれのデータを確認します。
「Titanic: Machine Learning from Disaster」のコンペのDataメニューから、
今回提示されている3つのデータを確認します。

  1. train.csv
  2. test.csv
  3. gender_submission.csv

train.csvは、モデルを作成するために利用する訓練用データです。
test.csvは、作成したモデルの精度を確認するテストデータです。
gender_submission.csvは、女性は全て生き残ったと仮定する提出用サンプルデータです。

train.csvの内容には

  1. 乗客ID
  2. 生き残ったか
  3. チケットのクラス
  4. 名前
  5. 性別
  6. 年齢
  7. 兄弟や配偶者の数
  8. 親、子供の数
  9. チケットの番号
  10. 運賃
  11. キャビン番号
  12. 乗船した港

などが含まれます。 この訓練用データに対して様々な処理を施し学習に利用します。

訓練データの加工

訓練データから学習する前に、様々な処理を行います。 今回行った処理は次の3つです。

  1. 欠損値に対する処理を行う。
  2. 機械学習ライブラリに適用するために、文字列データを数値データに変換する。
  3. 学習に利用しないデータを削除する。

1. 欠損値に対する処理を行う。

サンプルデータの全てのレコードが完全な状態であることは稀です。
大体の場合、データが欠けていたり、他のレコードとは掛け離れた値になっていたり、
広範囲にデータが分布していたりします。
これらのデータを、うまく補間してやることは、学習モデルを作る上でとても重要です。

今回の訓練用データには、例えば年齢が欠けているレコードが含まれています。
このような場合、そのレコードを削除するか、何らかの値で補間する必要があります。
補間する場合、最も多いデータで埋めたり、平均値で埋めたりなどしますが、
今回は乗客の年齢の平均値で埋めました。
実は全体の平均で補間するこの方法は、あまりよろしくないのですが、
その理由は次回説明することとします。

2. 文字列データを数値データに変換する。

今回のpythonのライブラリを利用して学習を行う場合、
文字列データは利用出来ない為、数値に変換しておく必要があります。 例えば性別(male,female)のようなデータは、別の値に変換しておく必要があります。
今回は、maleを0、femaleを1に変換しました。

また、乗船した港のような識別子的な意味しか持たないデータを名義特徴量といいます。
名義特徴量の場合、ダミーの変数に変換する必要がありますが、
pythonでは、get_dummiesという便利な関数が用意されているので、
簡単に変換することが出来ます。この辺りのライブラリの充実している点が、
機械学習でpythonが選ばれている理由の1つですね。

3. 学習に利用しないデータを削除する。

今回、名前、チケット番号、キャビン番号のデータは特徴量として利用しなかった為、
dropメソッドを使い訓練用データから削除しました。

ランダムフォレストのアルゴリズムで予測する。

ここまでで、欠損値の補間、文字列データの数値変換、不要なデータの削除という
3つの前処理を訓練用データに対して行いました。 この訓練用から'Survived'列を除いたデータと'Survived'列のみのデータに分割して、 ランダムフォレストで学習を行います。 また、精度を測定する際に学習に利用したデータで検証を行うと 過学習してしまいかなり高い精度が出てしまいます。 そのような場合、K分割交差検証を行うことでより正しい検証結果を得られます。

今回はここまでです。
次回はモデルの改善のお話をしていければと思います。