30
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

機械学習モデルのパラメーター・チューニング入門:過学習を防ぎ、予測精度を上げる考え方

30
Posted at

機械学習モデルのパラメーター・チューニングの基礎

機械学習モデルを使って予測モデルを作るとき、同じデータを使っていても、モデルの設定によって予測精度が大きく変わることがあります。

たとえば、ランダムフォレスト、XGBoost、LightGBM、CatBoostといったモデルには、木の数、木の深さ、学習率、サンプリング率、正則化など、さまざまなパラメーターがあります。

これらのパラメーターを調整することで、モデルの予測精度を改善していくことを パラメーター・チューニング と呼びます。

ただし、パラメーター・チューニングは、単に「精度が上がるまでいろいろな値を試す」作業ではありません。

本質的には、モデルがトレーニングデータに合わせすぎないようにしながら、まだ見ていないデータに対してより良い予測ができる設定を探す作業です。

この記事では、木(決定木)ベースの機械学習モデルを中心に、パラメーター・チューニングの基本的な考え方を紹介します。


良いモデルとは何か?

まず大切なのは、良いモデルとは「トレーニングデータで精度が高いモデル」ではないということです。

本当に良いモデルとは、まだ見ていないデータに対しても精度が高いモデルです。

機械学習では、モデルを作るために使うデータをトレーニングデータ、モデルの性能を確認するために使うデータをテストデータと呼びます。

データ 役割
トレーニングデータ モデルが学習に使うデータ
テストデータ モデルがまだ見ていないデータ

モデルがトレーニングデータで高い精度を出したとしても、それだけでは十分ではありません。なぜなら、そのモデルは単にトレーニングデータの特徴を覚えているだけかもしれないからです。

たとえば、従業員の離職を予測するモデルを作るとします。

目的変数は「離職したかどうか」、予測変数には勤続年数、残業時間、出張頻度、職種、婚姻ステータスなどを使います。

このとき重要なのは、過去の従業員データに対して正しく予測できるかだけではありません。これから新しく入ってくる従業員データに対して、どれくらい正しく離職リスクを予測できるかが重要です。

そのため、パラメーター・チューニングでは、AUCやROC曲線などを使って、テストデータでの予測性能を確認することが大切です。

チューニングの目的は、トレーニングデータへの当てはまりを良くすることではなく、テストデータでの予測精度を上げることです。


モデルは複雑にすればよいわけではない

機械学習モデルでは、モデルを複雑にすると、トレーニングデータの細かいパターンまで学習できるようになります。

たとえば、離職予測であれば、以下のようなパターンを学習できるかもしれません。

  • 勤続年数が短い人は離職しやすい
  • 残業時間が長い人は離職しやすい
  • 出張頻度が高い人は離職しやすい
  • 特定の職種では離職率が高い

こうしたパターンを学習すること自体は良いことです。

しかし、モデルが複雑になりすぎると、トレーニングデータにたまたま含まれていた細かすぎる特徴まで覚えてしまうことがあります。

たとえば、ある部署の特定の年齢層、特定の婚姻ステータス、特定の勤務年数の組み合わせが、たまたまトレーニングデータでは離職と強く関係していたとします。

モデルが複雑すぎると、そのような偶然のパターンまで重要なルールとして覚えてしまうことがあります。

これが 過学習 です。

過学習したモデルは、トレーニングデータでは高い精度を出しますが、テストデータでは精度が下がります。

モデルの状態を大きく分けると、以下のようになります。

モデルの状態 トレーニング精度 テスト精度
単純すぎる 低い 低い
ちょうど良い 高い 高い
複雑すぎる とても高い 低くなることがある

パラメーター・チューニングとは、この「ちょうど良い複雑さ」を探す作業です。

モデルを複雑にすれば、トレーニングデータには強くなります。しかし、複雑すぎると未知のデータには弱くなります。だから、テストデータでの精度を見ながら、ちょうど良い複雑さを探す必要があります。


パラメーター・チューニングで見る3つの視点

個別のパラメーター名を覚える前に、まずは「何を調整しているのか」を理解することが大切です。

パラメーター・チューニングでは、主に以下の3つの視点があります。

視点 調整すること 代表的なパラメーター
複雑さ どれだけ細かいパターンまで学習するか 木の深さ
学習量 どれくらい学習を進めるか 木の数、学習率
抑制 過学習をどう防ぐか サンプリング、正則化、早期停止

たとえば、木の深さはモデルの複雑さを直接コントロールします。木が深くなるほど、細かい条件分岐ができるようになります。

学習率や木の数は、XGBoostやLightGBMのように木を順番に追加していくモデルで、どれくらい学習を進めるかを決めます。

サンプリング、正則化、早期停止は、モデルがトレーニングデータに合わせすぎないようにするための仕組みです。

パラメーター名を暗記するより、「この設定はモデルの何を変えているのか」を理解することが大切です。


木の数:どれくらい学習するか

ランダムフォレスト、XGBoost、LightGBMなどのモデルでは、複数の決定木を使って予測を行います。

ただし、「木の数」の意味は、モデルによって少し異なります。

モデル 木の数の意味
ランダムフォレスト 独立した木をたくさん作り、それらの予測を組み合わせる
XGBoost / LightGBM 木を順番に追加し、前の予測の間違いを修正する

ランダムフォレストでは、たくさんの木を独立に作り、それらの予測を組み合わせます。分類であれば、多数決のようなイメージです。

image.png

木の数を増やすと、予測は安定しやすくなります。ただし、計算時間は長くなります。また、ある程度以上増やしても、精度の改善は小さくなることがあります。

一方、XGBoostやLightGBMでは、木を1本ずつ順番に追加していきます。新しく追加される木は、前の木の間違いを補正するように学習されます。

image.png

そのため、XGBoostやLightGBMにおける木の数は、学習回数 と考えることもできます。

早期停止を使わない場合、指定した学習回数まで木を作ります。たとえば、学習回数が100であれば、基本的には100本の木を作って学習を終了します。

一方、早期停止を使う場合、木の数は「最大で作ってよい木の数」として使われます。検証データで精度が改善しなくなった場合は、指定した木の数に到達する前に学習が止まることがあります。

XGBoostやLightGBMでは、木の数は「何回学習を進めるか」を決める重要なパラメーターです。


学習率:1回あたりどれくらい学習するか

XGBoostやLightGBMで特に重要なのが 学習率 です。

XGBoostやLightGBMでは、木を1本ずつ追加しながらモデルを改善していきます。最初の木が予測を行い、その予測で間違えた部分を、次の木が少し修正します。さらに、その次の木がまた少し修正します。

image.png

このように、前の予測の間違いを次の木が少しずつ補正していくことで、モデル全体の予測精度を高めていきます。

このとき、1本の木の結果を、モデル全体にどれくらい強く反映するか を決めるのが学習率です。

image.png

学習率が高い場合、1本1本の木の影響が大きくなります。つまり、モデルは一回ごとに大きく修正されます。そのため、少ない木の数でも早く学習が進みます。

しかし、一回あたりの修正が大きすぎると、トレーニングデータに合わせすぎてしまい、テストデータでの精度が下がることがあります。

一方、学習率が低い場合、1本1本の木の影響は小さくなります。モデルは少しずつ慎重に修正されていきます。そのため、学習は安定しやすくなりますが、十分に学習するためにはより多くの木が必要になります。

学習率を低くしたのに木の数が少ないままだと、モデルが十分に学習できず、精度が上がらないことがあります。

つまり、学習率は単独で考えるのではなく、木の数とセットで考える必要があります。

学習率 木の数 起きやすいこと
高い 少ない 速く学習するが、不安定になりやすい
高い 多い 学習しすぎて過学習しやすい
低い 少ない 学習不足になりやすい
低い 多い 慎重に学習し、安定しやすい

一般的な初期値としては、学習率を0.1前後、学習回数を100〜300程度から始めることが多いです。

より慎重に学習させたい場合は、学習率を0.05や0.01に下げ、その代わりに木の数を増やします。

学習率は「1回あたりの学習の強さ」、木の数は「何回学習するか」です。この2つはセットで考える必要があります。


木の深さ:モデルの複雑さを決める

木の深さは、1本の決定木がどこまで細かく条件分岐するかを決めるパラメーターです。

たとえば、浅い木は大まかなパターンだけを学習し、一方、深い木では、より細かい条件分岐ができます。

image.png

木が深くなるほど、モデルは複雑なパターンを学習できます。

しかし、深すぎると、トレーニングデータにしか通用しない細かいパターンまで覚えてしまう可能性があります。

そのため、木の深さは、モデルの複雑さをコントロールする非常に重要なパラメーターです。

木の深さ モデルの状態
浅い シンプル。学習不足になる可能性がある
適度 重要なパターンを学習しやすい
深い 複雑。過学習しやすい

木の深さは、モデルの複雑さを直接コントロールするパラメーターです。


サンプリング:あえて全部使わない

XGBoostやLightGBMでは、各木を作るときに、すべての行や列を使うのではなく、一部だけを使うように設定できます。

代表的なものは以下です。

パラメーター 意味
行のサンプル率 各木を作るときに使うデータ行の割合
列のサンプル率 各木を作るときに使う変数の割合

たとえば、行のサンプル率を0.8に設定すると、各木を作るときにデータ行の80%を使います。

列のサンプル率を0.8に設定すると、各木を作るときに変数の80%を使います。

ここで重要なのは、常に全部のデータや全部の変数を使えばよいというわけではない、ということです。

すべてのデータと変数を毎回使うと、モデルがトレーニングデータに合わせすぎることがあります。そこで、あえて一部だけを使うことでランダム性を入れ、過学習を抑えやすくします。

値を小さくすると、ランダム性が増えます。その結果、過学習を抑えやすくなることがあります。

ただし、小さくしすぎると、各木が使える情報が少なくなります。重要な変数が使われにくくなったり、学習が不安定になったりして、精度が下がることがあります。

起きやすいこと
大きい より多くの情報を使うため安定しやすいが、過学習しやすくなることがある
小さい ランダム性が増えて過学習を抑えやすいが、小さすぎると精度が下がることがある

サンプリングは、あえて全部のデータや変数を使わないことで、未知のデータに強いモデルを作るための仕組みです。


早期停止:学習しすぎを防ぐ安全装置

XGBoostやLightGBMでは、木を1本ずつ追加しながらモデルを改善していきます。

最初は、木を追加するたびに検証データでのAUCが改善していくかもしれません。しかし、ある時点を過ぎると、木を追加しても検証データでの精度が改善しなくなることがあります。

以下は横軸に学習回数(木の数)、縦軸にAUCのスコアにし、学習回数が増えるに連れてAUCがどのように上がっていくかを表したチャートです。

image.png

これを見ると、ある程度のところでAUCは収束化することがわかります。

学習を続けると、トレーニングデータにはより合うようになりますが、未知のデータに対する予測性能は改善しない、あるいは悪化することがあります。

そこで使うのが 早期停止 です。

早期停止は、検証データの評価指標が一定回数改善しなかった場合に、学習を止める仕組みです。

たとえば、早期停止の反復回数を30に設定したとします。この場合、検証データのAUCが30回連続で改善しなければ、そこで学習を停止します。

早期停止の値 解釈 起きやすいこと
小さい 少し改善しないだけですぐ止める 学習不足になりやすい
大きい 改善しなくても長く待つ 実行時間が長くなりやすい
適度 一時的な停滞は許しつつ、学習しすぎを防ぐ バランスが良い

実務では、木の数を少し多めに設定し、早期停止でちょうど良いところで止めるという使い方をよくします。

たとえば、以下のような設定です。

パラメーター
木の数 1000
学習率 0.05
早期停止の反復回数 30

この場合、最大では1000本まで木を作ることができます。しかし、検証データのAUCが30回続けて改善しなければ、途中で学習が止まります。

つまり、木の数は「必ず作る木の数」ではなく、「最大で作ってよい木の数」ということになります。

ただし、早期停止には検証データが必要です。検証データを使わず、早期停止も使わない場合、XGBoostやLightGBMは指定された学習回数まで木を作って終了します。

木の数を多めに設定し、早期停止でちょうど良いところで止める、という使い方が実務的です。


正則化:モデルへのブレーキ

正則化は、モデルが複雑になりすぎないようにするためのブレーキです。

モデルは、予測精度を高めようとして、トレーニングデータの細かいパターンまで学習しようとします。正則化は、そのような学習に対してブレーキをかけ、モデルが極端になりすぎないようにします。

イメージとしては、モデルをたくさんの調整ノブがついた機械だと考えると分かりやすいです。

image.png

それぞれのノブは、変数やルールの影響度を表しています。ノブを大きく回すほど、その変数やルールを強く使います。

正則化なしの場合、モデルはトレーニングデータに合わせるために、いろいろなノブを大きく回しすぎてしまうことがあります。

正則化は、これらのノブを大きく回しすぎないようにする仕組みです。

代表的な正則化には、L1正則化とL2正則化があります。

正則化 イメージ 起きやすいこと
L1正則化 弱いノブをOFFにする モデルが使う要素を減らしやすい
L2正則化 全部のノブを少しずつ締める 極端な影響を抑えやすい

L1正則化は、影響の小さい要素をゼロにしやすいという特徴があります。つまり、モデルが使う変数やルールを減らし、よりシンプルなモデルにしやすくします。

image.png

L2正則化は、影響度を全体的に小さくする方向に働きます。特定の変数やルールに頼りすぎることを防ぎ、モデルを安定させやすくします。

image.png

値を大きくすると、正則化のブレーキは強くなります。その結果、過学習を抑えやすくなります。

ただし、値を大きくしすぎると、モデルが十分に学習できなくなり、精度が下がることがあります。

また、L1 / L2正則化の値は、サンプル率のような0〜1の割合ではありません。基本的には0以上の数値で、0、0.1、1、5、10などを試すことが多いです。

モデルによって、サポートされる正則化は異なります。

モデル L1正則化 L2正則化
XGBoost あり あり
LightGBM あり あり
CatBoost 通常なし あり
決定木 / ランダムフォレスト 通常なし 通常なし

決定木やランダムフォレストでは、L1 / L2正則化ではなく、木の深さ、最小ノードサイズ、分岐の条件、変数サンプリングなどでモデルの複雑さを抑えます。

正則化は、モデルを強くするためではなく、強くなりすぎて不安定になるのを防ぐための仕組みです。


モデルごとに使えるパラメーターは違う

ここまで見てきたように、すべてのモデルで同じパラメーターが使えるわけではありません。

モデルによって、過学習を抑える方法や、学習をコントロールする方法は少しずつ違います。

モデル 代表的なチューニング項目
決定木 木の深さ、最小ノードサイズ、分岐の最小改善
ランダムフォレスト 木の数、木の深さ、分岐ごとに使う変数の数
XGBoost 木の数、学習率、木の深さ、行サンプリング、列サンプリング、L1/L2正則化、早期停止
LightGBM 木の数、学習率、木の深さ、行サンプリング、列サンプリング、Bagging頻度、L1/L2正則化、早期停止
CatBoost 木の数、学習率、木の深さ、L2正則化、ランダム性、早期停止

たとえば、XGBoostとLightGBMでは、L1 / L2正則化を使うことができます。一方、CatBoostでは主にL2正則化を使います。

LightGBMには、Baggingの頻度というパラメーターがあります。これは、何回ごとに行のサンプリングを行うかを指定するものです。一方、XGBoostには、これに直接対応する一般的なパラメーターはありません。XGBoostでは、主に行のサンプル率を使ってサンプリングを調整します。

このように、同じ「過学習を防ぐ」という目的でも、モデルによって使うパラメーターは少しずつ違います。

重要なのは、パラメーター名を丸暗記することではなく、そのパラメーターが「複雑さ」「学習量」「抑制」のどれを調整しているのかを理解することです。


チューニングの実務的な進め方

パラメーター・チューニングでは、いきなり多くのパラメーターを同時に変えると、どの変更が精度に効いたのか分からなくなります。

そこで実務では、以下のように少しずつ進めるのがおすすめです。

1. まずデフォルト設定でモデルを作る

最初から複雑なチューニングをするのではなく、まずはデフォルト設定でモデルを作ります。

これがベースラインになります。

2. テストデータでAUCやROC曲線を見る

次に、テストデータで予測性能を確認します。

トレーニングデータのAUCとテストデータのAUCの差を確認します。トレーニングAUCは高いのにテストAUCが低い場合は、過学習の可能性があります。

3. 木の深さを調整する

木の深さは、モデルの複雑さに直接影響します。

過学習が疑われる場合は、木を浅くすることを検討します。逆に、トレーニングAUCもテストAUCも低い場合は、モデルが単純すぎる可能性があるため、木を少し深くすることを検討します。

4. XGBoost / LightGBMでは、学習率と木の数をセットで調整する

XGBoostやLightGBMでは、学習率と木の数をセットで考えます。

最初は、学習率0.1、木の数100〜300程度から始めると分かりやすいです。

より慎重に学習させたい場合は、学習率を0.05に下げ、木の数を300〜500に増やす、といった調整をします。

早期停止を使う場合は、木の数を500〜1000のように多めに設定し、検証データで改善しなくなったところで止めるのが実務的です。

5. 過学習が疑われる場合は、サンプリング、正則化、早期停止を使う

トレーニングAUCは高いのにテストAUCが低い場合、モデルがトレーニングデータに合わせすぎている可能性があります。

この場合、以下のような調整を検討します。

  • 木を浅くする
  • 行のサンプル率を下げる
  • 列のサンプル率を下げる
  • L1 / L2正則化を強める
  • 早期停止を使う

6. 最後に、精度・安定性・実行時間のバランスで選ぶ

AUCが最も高いモデルが、常に一番良いモデルとは限りません。

たとえば、AUCの差がごくわずかであるにもかかわらず、実行時間が大幅に長くなるモデルは、実務では使いにくいかもしれません。

最終的には、以下を総合的に見て判断します。

  • テストAUC
  • ROC曲線
  • トレーニングAUCとテストAUCの差
  • 実行時間
  • モデルの安定性
  • 運用しやすさ

パラメーター・チューニングは、一度で正解を探す作業ではなく、テストデータで確認しながら少しずつ改善する作業です。


よくある失敗

パラメーター・チューニングでは、いくつかよくある失敗があります。

失敗 問題
トレーニング精度だけで判断する 過学習に気づきにくい
一度に多くのパラメーターを変える 何が効いたのか分からない
学習率だけを下げる 木の数が足りず学習不足になる
木の数だけを増やす 学習しすぎて過学習しやすい
正則化を強くしすぎる モデルが学習不足になる
サンプル率を下げすぎる 重要な情報が使われず精度が下がる
AUCのわずかな差だけで判断する 実務的な意味が小さい場合がある
実行時間を無視する 運用しにくいモデルになる

特に注意したいのは、トレーニング精度だけで判断することです。

トレーニングデータでの精度が高いモデルは、一見すると良いモデルに見えます。しかし、テストデータでの精度が低ければ、実際の予測には使いにくいモデルです。

また、AUCの差が0.001や0.002程度の場合、その差が実務的に意味のある差なのかを考える必要があります。

パラメーター・チューニングでは、精度だけでなく、過学習のサインや実行時間も見ることが大切です。


まとめ

パラメーター・チューニングで大切なのは、すべてのパラメーターを覚えることではありません。

重要なのは、以下の考え方です。

  • 良いモデルは、テストデータで良い結果を出すモデル
  • モデルは複雑にすればよいわけではない
  • 複雑すぎるモデルは、トレーニングデータを覚えすぎることがある
  • 木の深さは、モデルの複雑さを決める
  • XGBoost / LightGBMでは、木の数と学習率をセットで考える
  • サンプリング、正則化、早期停止は、過学習を抑えるための仕組み
  • 最終的には、精度・安定性・実行時間のバランスで判断する

パラメーター・チューニングは、モデルをむやみに強くする作業ではありません。

モデルがトレーニングデータに合わせすぎないようにしながら、未知のデータに対してより良い予測ができるように調整する作業です。

パラメーター・チューニングとは、モデルを強くする作業ではなく、未知のデータに強くする作業です。

Exploratoryを使ってパラメーター・チューニングする

Exploratory v15.5より、XGBoost、LightGBM、CatBoost、ランダムフォレストなどの機械学習モデルにおけるパラメーター設定のダイアログがリデザインされ、パラメーター・チューニングがより行いやすくなりました。

image.png

今回のリデザインでは、各パラメーターを役割や目的ごとにグループ分けし、機械学習モデル間でできるだけ一貫した並びになるように整理しています。

これにより、たとえば以下のような観点で、必要なパラメーターを探しやすくなりました。

  • モデルの複雑さを調整するもの
  • 学習の進み方を調整するもの
  • 行や列のサンプリングを調整するもの
  • 過学習を抑えるためのもの
  • 検証データや早期停止に関するもの

さらに、それぞれのパラメーターには、推奨値やヒントを表示するようにしました。

たとえば、「値を大きくすると何が起きやすいのか」「値を小さくするとどのような影響があるのか」といった情報を確認しながら設定できるため、パラメーター名に詳しくなくても、モデル改善に取り組みやすくなっています。

image.png

機械学習モデルは、作って終わりではありません。AUCやROC曲線などの評価結果を見ながら、モデルが複雑すぎないか、学習が足りているか、過学習していないかを確認し、必要に応じて調整していくことが重要です。

Exploratoryでは、こうしたモデル作成、評価、パラメーター調整の流れを、UI上で繰り返し行えるようになっています。

データサイエンス・ブートキャンプで機械学習を実践的に学ぶ

機械学習モデルのパラメーター・チューニングを含め、統計学、機械学習、データ加工、可視化、分析結果の解釈までを体系的に学びたい方には、Exploratoryの「データサイエンス・ブートキャンプ」もおすすめです。

このブートキャンプでは、単にツールの使い方を学ぶだけではありません。問いを立て、データを準備し、可視化し、分析し、その結果をどう解釈して意思決定につなげるかまでを、実際に手を動かしながら3日間で集中的に学びます。

機械学習についても、モデルを作るだけでなく、予測精度をどのように評価するのか、テストデータでの結果をどう解釈するのか、そしてパラメーターをどのように調整してモデルを改善していくのかを、実践的な流れの中で学ぶことができます。

実務のデータ分析で、統計学や機械学習の手法をより自信を持って使えるようになりたい方は、ぜひ以下のページをご覧ください。

👉 データサイエンス・ブートキャンプの詳細を見る

https://exploratory.io/training-jp

30
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?