導入
先日scikit-learn を使って分類問題を解いた際、
勾配ブースティング系のモデルである LightGBM よりも
Support Vector Machine(以下、SVM)の方がうまく分類できるケースに遭遇しました。
この記事では
どのような状況で SVM > LightGBM になったのか
を可視化してみます。
計算コード含めて詳細は以下のブログで解説しています。
データ生成
かなり恣意的ですが、乱数で2次元データを生成して2次曲線で境界を設定します。
簡単のため2クラス分類を行います。
$x_1$と$x_2$の2変数を$(0,1)$で乱数引いてサンプリングして、以下の条件でラベル付けします。
$$
x_2 > 2x_1^2 - 0.7
$$
分類モデル
生成したデータのすべてを使って学習を行い、分類境界を図示します。
本記事では分類性能評価目的ではないので、訓練データとテストデータの分割は行いません。
SVM
まずはSVMでカーネルに2次多項式を指定して学習を行います。
多項式カーネルを選択します。
LightGBM
LightGBMの学習を行います。
ハイパーパラメータのチューニングは特にしませんでした。
分類結果
SVMの分類境界
意図的に問題設定したこともありますが、綺麗に分類出来ています。
分類曲線が滑らかに変化します。
Cやcoef0の値を変えながら、分類領域を見ると理解が深まります。

LightGBMの分類境界
LightGBMの分類境界を示します。
よく分類出来ていますが境界がジグザグになっていて、境界に近い所で分類しきれないことが分かります。

考察
SVMの多項式カーネルは
今回の問題設定と相性が良かったと考えられます。
一方、LightGBM は内部的には 2値分割を繰り返して境界を作ります。
そのため、分類境界はどうしても 矩形の組み合わせのような形になりやすく、
今回のような滑らかな境界を表現するには不利だったと考えられます。
雑感
この話だとSVMがいいと聞こえるかもしれないですが、そうでもありません。
LightGBMは何も調整せずともそれなりに分類できましたが、SVMだとハイパーパラメータ等、気に掛ける項目が多くて手間がかかる印象を受けました。
今回の内容のPythonの計算コードを含めた詳細は以下のブログにて解説しています。
