Kaggleなどのデータ分析コンペでテーブルデータを扱う場合、最近は取りあえずLightGBMを利用する場合が多いです。
本記事では、初手の機械学習アルゴリズムとして「LightGBM」*1を採用する理由を紹介します。あくまで2019年10月末時点での個人の主観なので、ご参考までにご覧いただければと思います。
初手としては、手の混んだ特徴量を作らずに、まずは何かしらの予測結果を生成したい場合も多いです。LightGBMは既存のデータセットを極力加工せずに利用するという観点で、特徴量エンジニアリングの負担を軽減してくれる特徴があります。理由1〜3は、これらの特徴によるものです。
LightGBMは、欠損値を含む特徴量も入力として扱うことが可能です。
線形回帰モデルのロジスティック回帰などを用いる場合は欠損値を補完する処理が必要ですが、LightGBMを採用することでその処理を割愛できることになります。欠損値をどのように補完するかを考える時間を省略できる利点があります。
LightGBMは、カテゴリ変数に対して特別な処理を自動的に実行してくれます。
機械学習のカテゴリ変数の一般的な処理としては、「One-Hotエンコーディング」と呼ばれる下図のような手法があります。

一方で、One-Hotエンコーディングには、一つのカテゴリ変数が多くの値を取る場合に列数が増え過ぎてしまうデメリットがあります。
LightGBMでは「S、Q、C」を単に「0、1、2」という数値に変換しておき、カテゴリ変数として明示することで、そのまま扱うことが可能です。カテゴリ変数の処理に苦心する時間を省略できる利点があります。
import lightgbmas lgbcategorical_features = ['Embarked']lgb_train = lgb.Dataset(X_train, y_train, categorical_feature=categorical_features)lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train, categorical_feature=categorical_features)
LightGBMが欠損値とカテゴリ変数を処理する内部の仕組みについては「lightgbm カテゴリカル変数と欠損値の扱いについて+α」*2で詳しく解説されています。
LightGBMは、「決定木」を基にした機械学習アルゴリズムです。決定木では次の図のように、一つの特徴量に対し一つの閾値を定め、次々と条件分岐していきながら予測値を決定します。

学習用データセットからは、どの特徴量で、どういう閾値で、どのように判定するかを学びます。ここで大切なのは閾値なので、ロジスティック回帰のように特徴量を標準化する処理は不要となります。
LightGBMは、特徴量の重要度を計算する機能があります。特徴量の重要度を見ることで、次なる特徴量エンジニアリングの手を考えることが可能です。
fold_importance_df["importance"] = model.feature_importance(importance_type='gain')
LightGBMは過去のKaggleでの実績からも分かる通り、テーブルデータを扱う上で優秀な機械学習アルゴリズムです。最初からLightGBMを試しておくことで、手戻りの可能性を減らすことができます。
LightGBMは、比較的大きなデータも高速に扱える利点があります。開発者の一人である大元さんの「PyData.Tokyo Meetup #21」*3での発表資料には、「LightGBMが特に力を入れる2つ」として次の点が挙げられていました*4。
ひとまずの結果を得るために、学習を高速に終えてくれるのは非常に魅力的です。
こちらは個人的な理由ですが、LightGBMは過去にKaggleなどでの利用経験が多く、ハイパーパラメータの調整もある程度は勘所が付いています。先に紹介した大元さんの資料でも言及がある通り、LightGBMはハイパーパラメータのデフォルト設定があまりイケてないです。むしろ、ハイパーパラメータの知見がないとLightGBMの性能を十分に発揮できないかもしれません。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。