Python

XGboostとは?理論とPythonとRでの実践方法!

ウマたん
ウマたん
当サイト【スタビジ】の本記事では、機械学習手法の中でも非常に有用で様々なコンペで良く用いられるXgboostについてまとめていきたいと思います。最後にはPythonとRで他の機械学習手法と精度比較を行っているのでぜひ参考にしてみてください。

こんにちは!

データサイエンティストのウマたん(@statistics1012)です!

Kaggleなどのデータ解析コンペでも頻繁に用いられているXGboost。

最近では、LightGBMに王座の場を奪われつつありますが、まだまだ現役で使われている名実ともに最強の教師あり学習手法です。

この記事では、そんなXGboostに関して簡単に見ていきたいと思います!

ウマたん
ウマたん
教師あり学習でとりあえずよく分からないけど精度出したければXGboost使っておけば問題ない!(安易)

XGboostとは

XGBoostについて簡単に見ていきましょう!動画でも解説していますよー!

XGboostは「eXtreme Gradient Boosting」の略で2014年に発表された手法です。

勾配ブースティングと呼ばれるアンサンブル学習決定木を組み合わせた手法で非常に高い汎化能力を誇ります。

アンサンブル学習とは、弱学習器(それほど性能の高くない手法)を複数用いて総合的に結果を出力する方法で、バギングとブースティングというタイプがあります。

バギングは弱学習器を並列に使うイメージ。決定木とバギングを組み合わせたのがランダムフォレストです。

ランダムフォレストの簡単なイメージが以下

並列に決定木モデルを扱ってそれぞれのモデルの結果を総合的に判断します。

一方でブースティングは弱学習器を直列に使います。

ブースティングと決定木を組み合わせたのがXGboostなのです。

最初の学習器で上手く分類・推定できなかった部分に対して重みを付けて次の弱学習器で学習を行います。

そうすることで、上手く推定できない部分もできるようになってきます。

最終的には、それぞれのモデルに対して精度の高さを基に重みを付けて集約し、モデルを作成します。

3人寄れば文殊の知恵的な感じですね!

XGboostの特徴

XGboostの特徴を見ていきましょう!

精度が比較的高い

冒頭でも書きましたが、Kaggleでもまだまだ用いられている精度の高い手法です。

一般的にバギングを用いたランダムフォレストよりも精度は高くなります。

学習に時間がかかる

ブースティングは直列に学習を行うため、バギングよりも学習に時間がかかります。

大規模データを解析するとなると、それなりの学習時間がかかるので注意が必要です。

実は、そんなXGboostの弱点を克服するためにリリースされたのがLightGBM(軽いXGboost的なイメージ)なのです。

XGboostでは決定木の階層が同時に深くなっていきますが、LightGBMでは階層は一定ではありません。片方のノードだけ深くなることもあります。

Light GBM
Light GBMの仕組みとPythonでの実装を見ていこう!当ブログ【スタビジ】の本記事では、最強の機械学習手法「Light GBM」についてまとめていきます。Light GBMは決定木と勾配ブースティングを組み合わせた手法で、Xgboostよりも計算負荷が軽い手法として注目を集めています。...

パラメータの数が多くチューニングが必要

XGboostには数々のパラメータが存在します。

精度を上げるためにはパラメータのチューニングが必要になってきます。

パラメータのチューニングの方法にはグリッドサーチなどがあります。

XGboostをRで実装してみよう!

XGboostはRやPythonで簡単に実装することができます。

まずは、実際にRを用いてXGboostを実装してみましょう!

今回は、Kaggleの公式サイトで提供されているTitanicのデータを使います。

データのクレンジングを行い、欠損値は削除、不要と考えられる項目は削除します。

生死(Survive)を目的変数としそれ以外を説明変数とします。

サンプル数714のうちランダムに400個のデータを取り出し学習データとし、残りの314を予測データとします。

学習データで予測モデルを作り、予測データにあてはめ真値と予測値の判別率を精度として比較します。

シミュレーション回数は1000回とし、上記の手順を1000回繰り返し、結果を平均したものを最終アウトプットとします。

シミュレーション回数は10回とし、上記の手順を10回繰り返し、結果を平均したものを最終アウトプットとします。シミュレーション回数をもっと増やせば精度の信頼性は上がります。

XGboostをランダムフォレストサポートベクターマシンナイーブベイズニューラルネットワークk近傍法の5手法と比較します!

基本的に引数は全部デフォルトで!果たして結果はどうなるでしょうか!

xgboostというパッケージに入っている関数を用いて解析を行っていきます。

XGboost以外は基本的にパッケージを読み込み関数を記述すれば問題ないのですが、XGboostだけ特別な型にするためにデータ加工をしています。

xgb.data<-xgb.DMatrix(data.matrix(train.data.xg),label=label.data.train)

他の機械学習手法は普通のデータフレーム型で扱えるんですが、XGboostは特殊な型にしなくてはいけないのが少し面倒なんですよねー!

結果は以下のようになりました!

それぞれBayes(ナイーブベイズ)、knn(k近傍法)、NN(ニューラルネットワーク)、RF(ランダムフォレスト)、SVM(サポートベクターマシン)、xgb(XGboost)と表示しています。

k近傍法が一番パフォーマンスが悪く、SVMが最もパフォーマンスが良いという結果になりました!

XGboostにはパラメータが非常にたくさんあるので注意が必要です。

今回は、二値の質的変数が目的変数なので

objective = binary:logistic

を使用しています。

分類なのか回帰なのか、マルチクラスなのかによってobjectiveを変えるようにしましょう!

他にもたくさんのパラメータがあります。

パラメータをチューニングすることで精度がだいぶ変わるので、是非試してみてください!

XGboostをPythonで実装してみよう!

macとsurface

XgboostはPythonでも簡単に実装できるんですよー!

先ほどはランダムフォレストサポートベクターマシンナイーブベイズニューラルネットワークk近傍法の5手法と比較しましたが、Pythonではもっと強力な機械学習手法と比較していきます!

その手法とは、Xgboostと同じ勾配ブースティング手法であるLight gbmCatboostの2つです。

精度比較に使用するのは、Mnistという文字の識別分類データです。

Mnistのデータセットの特徴は以下です。

・0~9の手書き数字がまとめられたデータセット
・6万枚の訓練データ用(画像とラベル)
・1万枚のテストデータ用(画像とラベル)
・白「0」~黒「255」の256段階
・幅28×高さ28フィールド

それでは、コードをみていきましょう!

まずは、Mnistのデータをインポートして分類するために加工していきます!

続いて、Xgboost用のデータ構造に変換します。

最後にパラメータをセットしてXgboostで学習を行っていきます!

こんなにカンタンに実装できるんですよー!

結果は・・・

Xgboost Mnist

精度・・0.976!!非常に高い!

実はLight gbmCatboostよりも高くなっています。

Light gbmは0.972、Catboostは0.9567!

ただ処理時間が他の手法よりも圧倒的に遅いんです。

以下の記事で比較しているので詳しくはチェックしてみてください!

勾配ブースティング
勾配ブースティング手法をPythonで実装して比較していく!当サイト【スタビジ】の本記事では、勾配ブースティングの各手法をPythonで実装して徹底比較していきます!勾配ブースティングの代表手法「Xgboost」「Light gbm」「Catboost」で果たしてどのような違いがあるのでしょうか?...

XGboost まとめ

XGboostについて見てきました。

XGboostは非常に精度の高い手法であり簡易的に実装してみてもその効果を確かめることはできました。

最後にXGboostについてまとめておきましょう!

・精度が非常に高い
・学習に時間がかかる
・パラメータの数が多くチューニングが大変

是非XGboostを試してみてください!

以下の記事で他の機械学習手法についてもまとめていますので興味があればご覧ください!

機械学習
機械学習入門に必要な知識と勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...

機械学習手法の実装にはPythonが最適です。

Pythonの習得方法に関しては以下の記事でまとめています!

Python 勉強
【入門】初心者が3か月でPythonを習得できるようになる勉強法!当ブログ【スタビジ】の本記事では、Pythonを効率よく独学で習得する勉強法を具体的なコード付き実装例と合わせてまとめていきます。Pythonはできることが幅広いので自分のやりたいことを明確にして勉強法を選ぶことが大事です。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!