【Python】XGBoostとディープラーニングの比較(タイタニック号データで)

機械学習

Kaggleで人気のXGBoostと、もう知らない人はいないほどのディープラーニング。ぶっちゃけ、どっちがいいのか、どのケースにはどっちを使うかってみなさん分かります?少なくとも、私はよく分かりませんでしたので、自分なりに比較をしてみます。

また、機械学習を勉強するための参考書を以下で紹介しています!よかったら見ていってください。

機械学習を勉強するためのオススメ参考書(理論・Python・Webアプリ)
統計・機械学習に関しては授業で習ったところありますが、結構忘れてしまっています(。また、Rの演習の授業はありましたが、Pythonは学生のころには使っていません。機械学習・データサイエンスを勉強するにあたり、私が参考にしている参考書を一挙ご紹介したいと思います。

XGBoostとは?

XGBoostとは勾配ブースティングとランダムフォレストを組み合わせたアンサブル学習による分類器です。詳しくは説明できません!勉強します。ブースティングに関しては以下の記事をご参照ください。

アンサンブル学習-バギングとブースティング-
ランダムフォレストや勾配ブースティング法などでは、アンサンブル学習が行われています。アンサンブル学習は簡単に言うと、”みんなで力を合わせていいモデルを作ろう”です。筆者の備忘録も含め、まとめてみたいと思います。

XGBoostとディープラーニングの比較

海外サイトも含むいろいろなサイトを訪問し、XGBoostとディープラーニングの比較を行いました。

  1. 実装の容易さ:XGBoostを含むツリーベースのアルゴリズムの場合、データの正規化(re-scale)が必要ありません。一方で、ディープラーニングでは基本的に正規化が必要になります。それゆえ、一般的に、ツリーベースのモデルの方が使うのが簡単と言われています。
  2. 扱えるデータの種類:XGBoostは、表形式のデータに対する回帰や分類は得意としますが、もう少し構造的なデータ(画像など)は苦手とします。一方でディープラーニングでは、CNN(Convolution Neural Network)などを使用することで、画像などの構造的なデータを扱うこともできます。私の勝手な見解ですが、XGBoostなどのツリーモデルでは3次以上のテンソル形式のデータを扱うのが苦手(もしくは無理)と理解しました。
  3. 結果の考察:ディープラーニングは、一般的にブラックボックスになりがちです。モデルが何を思ってその結果を出したのかが分かり辛く、推論結果の考察が必須であるところでは使いづらい欠点があります。一方で、XGBoostなどのツリーモデルでは、特徴量解析などを実施しやすいです。

XGBoostとディープラーニングを実装してみて比較

ここからは、XGBoostとディープラーニングを実装してみて、精度比較をやってみます。やってみて思ったことは、実は、公平な比較ができないということです。XGBoost・ディープラーニングともに各種ハイパーパラメータ(例えば、XGBoost:木の深さ、ディープラーニング:層の数など)を持ちますが、XGBoostではパラメータを特に設定しなくても使える一方、ディープラーニングでは層の数・各層のノードの数などを陽に設定する必要があります。とりあえず、今回はディープラーニングに関しては隠れ層は二層、各層のノードは10でやってみます。二つの手法を使いタイタニックの生死予測をやってみます(このデータはよく使われますが、古いとはいえたくさんの人が亡くなった事故のデータを使うのは個人的にはあまり好きではありません。じゃあなんで使うねん(;´・ω・))。ソースは以下のGitHubにあげています。

 

ライブラリのインポート/Google Driveへのマウント

まずは必要なライブラリをインポートします。XGBoostは一行でインポートできます。

今回もGoogle Colabを使うので、Google Driveへのマウントを取ります。

タイタニックデータの読み込み

タイタニックのデータを読み込みます。データも上のGitHubにdata.zipで上げています。

データの中身の説明を簡単にしておきます。

  • PassengetId:乗客ID
  • Survived:生死(1:生存、0:死亡)
  • Pclass:乗客の階級 (1が一番が高い)
  • Name:名前
  • Sex:性別
  • Age:年齢
  • SibSp:兄弟・配偶者の数
  • Parch:両親・子供の数
  • Ticket:チケット番号
  • Fare:乗船料金
  • Cabin:部屋番号
  • Embarked:乗船港(Cherbourg,Queenstown,Southampton)

Survived(生死)の二値分類問題になります。

予測に使うデータは、Pclass・Age・SibSp・Parch・Fareにとりあえずしました。また、欠損値(NaN)があるので、欠損値があるものは省いてやります。さらにデータを学習用とテスト用に8:2で分けます。

 XGBoostによるタイタニック号の生死予測

まずはパラメータを設定してやります。上述したようにパラメータは必要なものを除いて、ほとんど設定しません(=デフォルト設定になる)。

では生死予測をします。評価は単純にあっているか・間違っているかの正答率で行います。

正答率は約75%となりました。

ディープラーニングによるタイタニック号の生死予測

次にディープラーニングで予測してやります。まずはモデルを定義します。

次に学習を行います。

最後に予測させます。

正答率は約78%になりました。XGBoostよりは少しいいですね。

まとめ

やったはいいものの、やはりあまり公平な比較にはならなかったと思います。ちなみに、タイタニックの生死予測はKaggleで行われているコンペティションの一つであり、Maxのスコアは、100%でXGBoostが使われているようです(この記事とは使っているデータが少し違います(;´・ω・))XGBoostの応用例としては以下の記事で競艇予測をしています。よければぜひこちらも!

【Google Colab】XGBoostによる競艇予測(めっちゃ儲かる?)
XGBoostを使って何かいいことしてみようということで、競艇予測をしてみます!開発環境はお財布が寂しい人は大好き、Google Colaboratory! また、GitHubにもあげてます。そっちのが分かりやすいかも。

コメント