mei_13のPython講座 ロゴ

【解説】Pythonで学ぶ機械学習の強力なツール、LightGBM徹底解説




Pythonで学ぶ機械学習の強力なツール、LightGBM徹底解説


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!最近、データサイエンスやKaggleのコンペティションについて調べていたのですが、「LightGBM」という言葉をよく目にします。 これって、普通の機械学習のアルゴリズムと何が違うんでしょうか?僕のような初心者でも使えるものなのか、ぜひ教えてほしいです。


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。LightGBMに興味を持ったのですね。 そうですね...、LightGBMは今のデータ分析の現場では「必須」と言ってもいいくらい、とても人気があって強力なライブラリだと思います。 初心者の方には少し設定が難しく感じる部分もあるかもしれませんが、仕組みを理解すれば、これほど頼もしい味方はいないはずですよ。 今日は、LightGBMがなぜこれほど支持されているのか、その仕組みから具体的な使い方まで、一緒に見ていきましょう。

LightGBMとは何でしょうか?


Yukiのアイコン
【Yuki】 まず、LightGBMの正体についてお話ししますね。 LightGBMは、Microsoftが開発した勾配ブースティング決定木(Gradient Boosting Decision Tree, GBDT)というアルゴリズムを実装したライブラリです。 「決定木」というのは、データを条件分岐で分けていく手法のことですが、それをたくさん組み合わせて、少しずつ誤差を修正しながら学習していくのが「勾配ブースティング」という仕組みなんです。


Hirokiのアイコン
【Hiroki】 「決定木」をたくさん組み合わせる...。以前習った「ランダムフォレスト」に似ている気がしますが、違うものなんですか?


Yukiのアイコン
【Yuki】 いいところに気づきましたね。ランダムフォレストは、たくさんの木を「並列」に作って多数決を取るようなイメージです。 対してLightGBMなどのGBDTは、1つ目の木を作って、その「間違えた部分」を次の木が修正する、という風に「直列」に学習を進めていきます。 この「前の失敗を次に活かす」というプロセスを繰り返すことで、非常に高い精度を出すことができると言われています。


Hirokiのアイコン
【Hiroki】 なるほど、どんどん賢くなっていく感じなんですね。でも、なぜ名前に「Light(軽い)」がついているんですか?


Yukiのアイコン
【Yuki】 それは、このアルゴリズムが「高速で、メモリの消費量が少ない」ことを目指して設計されているからだと思います。 大量のデータを扱うとき、他のGBDTアルゴリズム(例えばXGBoostなど)に比べて、圧倒的に速く学習が終わることが多いんです。 控えめな名前ですが、その実力はとても力強いものですよ。

LightGBMの最大の特徴:Leaf-wise(リーフワイズ)


Yukiのアイコン
【Yuki】 LightGBMが他のアルゴリズムと決定的に違うのは、木の「成長のさせ方」にあるかもしれません。 多くの決定木アルゴリズムは「Level-wise(レベルワイズ)」といって、層ごとに水平に木を深くしていきます。 でも、LightGBMは「Leaf-wise(リーフワイズ)」という方式を採用しています。


Hirokiのアイコン
【Hiroki】 リーフワイズ...。葉っぱ(Leaf)ごとに成長させるということですか?


Yukiのアイコン
【Yuki】 その通りです。誤差が最も大きい「葉」を選んで、そこを重点的に深く掘り下げていくんです。 これにより、効率的に誤差を減らすことができるのですが、一方で木が特定の方向にだけ深く伸びすぎてしまうことがあるんです。 そうなると、「過学習(学習データにだけ慣れすぎて、新しいデータに対応できなくなる状態)」が起きやすくなるという弱点もあります。 ですので、データを扱うときは少し注意が必要かもしれませんね。

LightGBMを使うメリット


Hirokiのアイコン
【Hiroki】 速くて精度が高いのは魅力的ですが、他にもメリットはあるんでしょうか?


Yukiのアイコン
【Yuki】 はい、いくつか大きなメリットがあります。 まず、「カテゴリー変数をそのまま扱える」という点です。 通常、機械学習では「赤・青・緑」といった文字データを数値に変換(エンコーディング)する必要がありますが、LightGBMはその手間を省いて、直接カテゴリーデータとして指定することができるんです。


Hirokiのアイコン
【Hiroki】 それは便利ですね!準備の手間が減りそうです。


Yukiのアイコン
【Yuki】 そうですね。他にも、データの欠損値があってもそのまま学習できたり、大規模なデータセットでも動作が安定していたりと、実務に適した機能がたくさん詰まっています。 ...ええと、少し理論的な話が長くなってしまいましたね。実際にPythonのコードを見ながら、どうやって使うのか確認してみましょう。

LightGBMのインストールと基本的な使い方


Hirokiのアイコン
【Hiroki】 ぜひお願いします!まずはライブラリのインストールからですよね。


Yukiのアイコン
【Yuki】 はい。ターミナルやコマンドプロンプトで、以下のコマンドを実行するだけで準備完了です。

pip install lightgbm


Yukiのアイコン
【Yuki】 では、実際にPythonで動かしてみましょう。 今回は、有名な「乳がんデータセット」を使って、良性か悪性かを分類するモデルを作ってみることにしますね。

import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 1. データの読み込み
data = load_breast_cancer()
X, y = data.data, data.target

# 2. 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. LightGBM専用のデータセット形式に変換
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

# 4. パラメーターの設定
params = {
    'objective': 'binary',    # 二値分類
    'metric': 'binary_logloss',
    'verbosity': -1,          # ログ出力を控えめにする
    'boosting_type': 'gbdt',
    'random_state': 42
}

# 5. モデルの学習
model = lgb.train(
    params,
    train_data,
    valid_sets=[train_data, test_data],
    num_boost_round=100,
    callbacks=[lgb.early_stopping(stopping_rounds=10)] # 10回改善がなければ終了
)

# 6. 予測
y_pred_prob = model.predict(X_test)
y_pred = [1 if p >= 0.5 else 0 for p in y_pred_prob]

# 7. 精度の確認
accuracy = accuracy_score(y_test, y_pred)
print(f'精度: {accuracy:.4f}')


Hirokiのアイコン
【Hiroki】 おぉ、意外とシンプルに書けるんですね! lgb.Dataset というので専用のデータ形式に変換するのがポイントでしょうか。


Yukiのアイコン
【Yuki】 ええ、その通りです。この形式にすることで、メモリ消費を抑えて高速に処理できるようになるんですよ。 また、学習時の callbacks に指定した early_stopping も大切です。 これは「テストデータの精度が上がらなくなったら、途中で学習を切り上げる」という機能で、無駄な計算を防ぎ、過学習も抑えてくれるんです。

知っておきたい重要なパラメーター


Hirokiのアイコン
【Hiroki】 コードの中に params という辞書がありましたが、あの中身を調整するのが「チューニング」という作業になるんですか?


Yukiのアイコン
【Yuki】 はい。LightGBMには非常に多くのパラメーターがありますが、初心者のうちにこれだけは押さえておきたいというものを紹介しますね。

  1. objective モデルの目的を指定します。二値分類なら binary、多クラス分類なら multiclass、回帰なら regression を使います。
  2. num_leaves 先ほどお話しした「葉」の最大数です。LightGBMで最も重要なパラメーターの一つで、大きくすると精度が上がりますが、過学習しやすくなります。
  3. learning_rate 学習率です。一回の学習でどれくらいモデルを更新するかを決めます。小さくして、その分学習回数(num_boost_round)を増やすのが一般的ですね。
  4. feature_fraction 木を作る際に、データの列(特徴量)をランダムに間引く割合です。これも過学習を防ぐために使われます。
  5. min_data_in_leaf 一つの葉に含まれる最小のデータ数です。これも過学習を抑えるのに役立ちます。


Hirokiのアイコン
【Hiroki】 たくさんありますね...。最初はデフォルトのままでも大丈夫でしょうか?


Yukiのアイコン
【Yuki】 ええ、最初はデフォルトでも十分高い性能を発揮すると思います。 慣れてきたら、少しずつ数値をいじってみて、精度がどう変わるか観察してみると面白いかもしれませんね。

過学習を防ぐためのポイント


Hirokiのアイコン
【Hiroki】 さっきから何度か「過学習」という言葉が出てきていますが、LightGBMは特に気をつける必要があるんですか?


Yukiのアイコン
【Yuki】 そうですね...、Leaf-wiseという性質上、データが少ないときに複雑な木を作ってしまうと、すぐに過学習してしまいます。 これを防ぐためには、以下のようなことを意識するといいかもしれません。

  • num_leaves を大きくしすぎない(目安として $2^{depth}$ 未満にするなど)。
  • min_data_in_leaf を適切に設定する(データ数が多いなら大きくする)。
  • early_stopping を必ず使う。
  • 学習データを増やす。


Yukiのアイコン
【Yuki】 特に early_stopping は、わたしもよく助けられています。 学習を自動で止めてくれるので、自分で「何回繰り返せばいいんだろう」と悩まなくて済むんです。

特徴量の重要度を確認する


Hirokiのアイコン
【Hiroki】 学習が終わった後、どのデータが予測に役立ったのかを知る方法はありますか?


Yukiのアイコン
【Yuki】 ありますよ。LightGBMには、モデルがどの特徴量を重視したかを可視化する機能が備わっています。

import matplotlib.pyplot as plt

# 特徴量の重要度をプロット
lgb.plot_importance(model, figsize=(10, 6))
plt.show()


Yukiのアイコン
【Yuki】 これを使うと、「ああ、このデータが分類に大きく貢献しているんだな」ということが一目で分かります。 データの中身を理解するのにも役立ちますし、不要なデータを見つけるヒントにもなるはずです。

まとめ:これからの学習に向けて


Hirokiのアイコン
【Hiroki】 Yukiさん、ありがとうございます!LightGBMがなぜ人気なのか、少し分かった気がします。 「速くて、賢くて、でも少し扱いには注意が必要」という、プロ仕様の道具みたいなイメージですね。


Yukiのアイコン
【Yuki】 ふふ、素敵な表現ですね。その通りだと思います。 最初は難しく感じるパラメーターも、実際に色々なデータで試していくうちに、なんとなく感覚が掴めてくるはずですよ。 もしもっと詳しく知りたくなったら、公式サイトのドキュメントも読んでみてくださいね。英語ですが、非常に詳しく書いてあります。


Yukiのアイコン
【Yuki】 機械学習の世界は奥が深いですが、LightGBMのような強力なツールを使いこなせるようになれば、きっとできることが大きく広がると思います。 Hirokiくんのペースで、一歩ずつ進んでいきましょう。 何か分からないことがあったら、またいつでも聞いてくださいね。わたしで良ければ、力になりますから...。


Hirokiのアイコン
【Hiroki】 ありがとうございます、Yukiさん!さっそく自分のデータでも試してみます!



< ランダムフォレスト
コラム一覧に戻る
Ansible >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki