Courses
学習データではほぼ完璧な精度なのに、新しいデータではダメ?誰もが一度は経験することです。
それが過学習の大まかな定義です。モデルは実際のパターンを学ばず、学習データを丸暗記してしまいました。運用環境で未知のデータに対面すると、信頼できない予測をしてしまいます。実データが学習サンプルから乖離するほど、この問題は深刻になります。
正則化は損失関数にペナルティを加えることでこれを抑えます。このペナルティは複雑なモデルを嫌います。つまり、すべての点に過剰適合させるのを防ぎ、一般化を促す仕組みです。
この記事では、正則化の直感的な考え方、代表的な手法(L1、L2、Elastic Net)、そして用途に応じた選び方を解説します。
本番環境で機械学習モデルがなぜ、どのように失敗するのかを理解したい場合は、バイアス・バリアンストレードオフに関するブログ記事をご覧ください。
機械学習における正則化とは
正則化とは、モデルの損失関数にペナルティ項を追加して、複雑さを抑制する手法です。
このペナルティがないと、モデルは学習データにいくらでも柔軟にフィットできます。そこにはノイズや外れ値も含まれます。正則化はその柔軟性にコストを課します。モデルが複雑になるほど、受けるペナルティは大きくなります。
通常、損失関数は予測値と実測値の差を測ります。正則化はその式にもう一つ項を加え、係数が大きくなるほど増加するようにします。モデルは「学習データへの当てはまり」と「係数を小さく保つ」という二つの目的を両立させなければなりません。
このバランスがモデルの柔軟性を制御します。
柔軟すぎるモデルは、学習データに合わせてどんな形にも曲がれます。正則化はそれをより単純な形に滑らかに整えます——未知データでも通用しやすい形に。
正則化が必要な理由
学習したあらゆるモデルは、「単純すぎるモデル」と「複雑すぎるモデル」という二つの使えない極端の間のどこかに位置します。
単純すぎるモデルはデータの本当のパターンを「理解」できません。シグナルを逃します。これがアンダーフィッティングです——学習データでも新しいデータでも性能が低い状態です。
一方、複雑すぎるモデルは逆のことをします。学習データの細部、ノイズにまでフィットします。これがオーバーフィッティングです——学習データでは高性能でも、覚えるべきでないものを覚えたせいで新しいデータでは失敗します。
具体例として多項式回帰を考えましょう。緩やかな曲線を示すデータに3次の多項式を当てはめると、適切なパターンにフィットする可能性が高まります。しかし同じデータに15次の多項式を当てはめると過学習になります——曲線はすべての点を通りますが、その間はランダムな予測になります。
以下のチャートは実際の見え方を示しています。

ちょうど良いモデルと複雑すぎるモデル
これはバイアス・バリアンストレードオフです。
単純なモデルはバイアスが高い——強い仮定を置き、実際のパターンを見逃します。複雑なモデルはバリアンスが高い——見た学習サンプルに過度に敏感で、データが少し変わるだけでまったく別のモデルになります。
正則化はその両方の良さを引き出します。複雑さを消すわけではありませんが、罰します。その結果、モデルは本当のシグナルを学べる可能性が高くなります。
正則化の仕組み
あらゆるモデルは損失関数——予測がどれだけ誤っているかの指標——を最小化して学習します。正則化がない場合、モデルの唯一の仕事はその誤差を減らすことです。学習データにはフィットするが一般化しない大きな係数を作ることも、ためらいません。
正則化は目標を変えます。誤差だけを最小化するのではなく、モデルは次の量を最小化します:

正則化の仕組み
ペナルティ項はモデル係数の関数です。大きな係数はペナルティを押し上げます。総コストを抑えるために、モデルは係数を小さく保たざるを得ません——つまり、より単純で一般化しやすい解を選ぶようになります。
λ(ラムダ)はペナルティの重要度を制御します。λが大きいほど、モデルに単純さを保つ圧力が強まります。λが小さいほど、データへの当てはまりを優先できます。調整方法は後述の「正則化強度の選び方」で説明します。
機械学習における正則化の種類
モデルの複雑さにペナルティを課す方法はいくつかあります。どれも係数への圧のかけ方が異なるため、適した状況が違います。
L2 正則化(リッジ回帰)
L2 正則化は各係数の二乗値にペナルティを課します。係数が大きいほどペナルティへの寄与が大きくなり、モデルはそれを縮小しようとします。

L2 正則化
キーワードは「縮小」です。L2 はすべての係数をゼロに向かって押し下げますが、完全なゼロにはなりません。すべての特徴量はモデルに残り、重みが小さくなるだけです。多くの特徴量が有用だと考え、安定して扱いやすいモデルが欲しいとき、リッジは良いデフォルトになります。
L1 正則化(ラッソ回帰)
L1 正則化は二乗ではなく、各係数の絶対値にペナルティを課します。

L1 正則化
この小さな違いが大きな結果を生みます。L1 は係数をちょうどゼロまで押し下げることができ、つまり特徴量をモデルから削除できます。自動特徴選択とみなせます。言い換えると、ラッソ正則化は不要な特徴量を取り除いてモデルを単純化できます。
L1 と L2 の違い
核心の違いは疎性にあります。L1 は疎なモデルを生みます——一部の特徴量だけが残ります。L2 は密なモデルを生みます——すべての特徴量が小さな重みで残ります。
解釈性にも影響します。5つの有効特徴だけを持つラッソモデルは、50の特徴が少しずつ効いているリッジモデルより説明が容易です。一方で、特徴量同士が相関している場合は、リッジのほうが安定しがちです。重みを分散して割り当て、恣意的に一つを選ぶことが少ないからです。
違いの概要は次のとおりです:

L1 と L2 正則化の比較
Python での比較を見たい場合は、Lasso と Ridge 回帰の Python チュートリアルをご覧ください。
Elastic Net 正則化
Elastic Net は L1 と L2 を単一のペナルティ項に組み合わせます。

Elastic Net 正則化
狙いは両者の良いとこ取り——L1 の特徴選択と L2 の安定性です。相関した特徴量があり、なおかつ一部は削りたい場合に便利です。ラッソ単独だと相関グループから一つだけを選んで他を無視しがちですが、Elastic Net は無関係なものを除外しつつ、いくつかを残す傾向があります。
さまざまなモデルにおける正則化
正則化は多くの機械学習モデルに登場しますが、形はさまざまです。いくつか紹介します。
線形回帰は多くの人が最初に正則化を見る場所です。線形回帰に L2 正則化を加えるとリッジ回帰になります。同様に L1 を加えるとラッソ回帰になります。数学的には前述のとおり、最小二乗の損失にペナルティ項を加えます。
ロジスティック回帰も同様に動作します。損失関数は二乗誤差ではなく交差エントロピーに変わりますが、ペナルティ項は同一です。多くの機械学習ライブラリはロジスティック回帰にデフォルトで L2 正則化を適用するため、scikit-learn には C というパラメータがあります。これは λ の逆数なので、C が小さいほど強い正則化を意味します。
ニューラルネットワークではいくつか別のアプローチを用います:
- 重み減衰(Weight decay):ネットワークの重みに対する L2 正則化——動作は同じで、規模が大きいだけです
- ドロップアウト:学習中に各反復で一定割合のニューロンをランダムに無効化し、特定の経路に依存しすぎるのを防ぎます。
どちらも過学習を抑えますが、手段は異なります。
木ベースのモデルは損失へのペナルティを使いません。代わりに刈り込み(pruning)で複雑さを制御します——木の深さを制限したり、予測改善が不十分な枝を削除します。scikit-learn の max_depth や min_samples_split のようなハイパーパラメータは、名称こそ違いますが正則化パラメータです。
正則化とバイアス・バリアンストレードオフ
正則化はトレードオフの話です。
ペナルティ項を追加すると、モデルに制約を課すことになります。もはや学習データに好きなだけ密着してフィットすることはできません。この制約はバイアスを導入します——単純さを保つよう指示したため、設計上わずかに誤った仮定を置くことになります。
しかし同じ制約はバリアンスを減らします。すべてのデータ点にフィットできないモデルは、学習サンプルの違いに対して敏感さが低くなります。少し異なるデータで学習しても、類似の結果が得られます。その安定性こそが本番での失敗を防ぐ鍵です。
正則化がないと、柔軟性の高いモデルになります。バイアスは低く(仮定が少なく学習データによくフィット)、バリアンスは高い(学習データが少し変わるだけで別のモデルになり、新しいデータに対して信頼できません)。
正則化はこのバランスを移動させます。少しのバイアス増加と引き換えに大きくバリアンスを減らすことで、未知データでの性能が向上することが多いのです。これがトレードオフであり、ほとんどの場合、受け入れる価値があります。
正則化強度の選び方
実務では、正則化の種類を選んだ後に、その強度を設定する必要があります。
強度はハイパーパラメータで制御します——数学的表記では通常 lambda (λ)、scikit-learn では alpha と呼ばれます。ペナルティ項の前に付く係数で、これを変えると単純さへの圧力の強さが変わります。
どちらの方向に外れても、本番で問題になります:
- 弱すぎる: ペナルティが弱く、意味をなしません。正則化なしと同様に過学習します。
- 強すぎる: ペナルティが支配的になります。制約が強すぎて、データの実パターンを理解できません。これはアンダーフィッティングです。
適切な値はその中間にあり、万能の答えはありません。データ、モデル、ノイズの多さに依存します。
標準的な探索方法は交差検証です。学習データを複数のフォールドに分割し、フォールドの組み合わせごとに学習、さまざまな alpha 値で検証性能を測定します。平均検証スコアが最も良い値を採用します。
scikit-learn では、RidgeCV と LassoCV がこれを自動で行います——alpha のグリッドで交差検証を実行し、最適値を選んでくれます。
from sklearn.linear_model import RidgeCV
model = RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0], cv=5)
model.fit(X_train, y_train)
print(model.alpha_)
出力された alpha は、交差検証で見つかった最適値を示します。まずは広い範囲から試し、最適域が見えたら徐々に絞り込んでください。
まとめ
正則化は、モデルが自分の賢さに溺れないようにする方法です。
複雑さにペナルティを課すことで、学習データの丸暗記ではなく一般化する解を選ばせます。L2 はすべての特徴量を残しつつ影響力を弱めます。L1 は無関係な特徴量を取り除きます。Elastic Net は両者を組み合わせます。線形モデル、ロジスティック回帰、ニューラルネット、アンサンブルモデルに至るまで、同じ考え方が形を変えて現れ、必ずしも「正則化」と呼ばれない場合もあります。
重要なのは、選ぶ手法と設定する強度です。ですから、やるべきことは実験です。異なる手法を、異なるパラメータ値で試してください。一つ選んで終わりにしないでください。
データが、何が効くかを教えてくれます。
より多くの正則化手法を実際に見たい場合は、Machine Learning Scientist in Python トラックにご参加ください。就業に直結する全85時間の教材を用意しています。
FAQs
機械学習における正則化とは何ですか?
正則化は、モデルの損失関数に複雑さを抑制するペナルティ項を追加する手法です。係数を小さく保つことをモデルに強制し、過学習を防ぎます。これにより、より単純で新しいデータにも汎化しやすい解が得られます。
いつ正則化を使うべきですか?
学習データでは良好だが、検証・テストデータで性能が悪いとき——そのギャップは過学習のサインなので、いつでも正則化を検討してください。また、高次元データや、特徴量数がサンプル数に近い・上回るようなデータセットでも標準的に有効です。
正則化は常にモデル性能を向上させますか?
常にではありません。すでにアンダーフィットしているモデルに正則化を加えると、さらに単純な解へと追いやり、状況を悪化させます。重要なのはバランスです——正則化はモデルが複雑すぎるときに効き、単純すぎるときには逆効果です。
ラッソの alpha とロジスティック回帰の C の違いは何ですか?
どちらも正則化強度を制御しますが、方向が逆です。ラッソの alpha はペナルティ自体をスケールし、値が大きいほど正則化が強くなります。scikit-learn のロジスティック回帰における C はペナルティ強度の逆数なので、C が小さいほど正則化が強くなります。両者を切り替える際は、alpha を増やすことと C を減らすことが同じ効果だと覚えておきましょう。
L1 と L2 を同時に使えますか?
はい——それが Elastic Net です。両方のペナルティ項を一つの目的関数に組み合わせ、L1 の特徴選択と L2 の安定性を同時に得られます。相関した特徴量があり、なおかつある程度の刈り込みもしたい場合に有用です。ラッソ単独だと相関グループから恣意的に一つだけ残しがちですが、Elastic Net は無関係なものを除外しつつ複数を残す可能性があります。