『過学習から卓越へ:正則化の力を活用する』
Overcoming Overfitting Harnessing the Power of Regularization
正則化の役割:機械学習における複雑さと一般化のバランス
機械学習において、私たちの目的は、学習されていないデータに対して最も良い予測を行うMLモデルを見つけることです。
そのために、私たちはトレーニングデータでMLモデルを訓練し、予測のパフォーマンスを確認します。そして、トレインセットとテストセット(新しいデータのセット)での予測のパフォーマンスを比較し、私たちが解決しようとしている問題に対して最良のMLモデルを選択します。
この記事では、正則化を機械学習で過学習を避ける方法として説明します。
機械学習における過学習の問題
過学習は、モデルが特定のデータに特化しすぎており、一般化がうまくできないという機械学習で起こる問題です。
- 「5分でPythonとTkinterを使用してシンプルなユーザーフォームを作成する-初心者ガイド」
- 映画チャットをご紹介しますビデオの基礎モデルと大規模な言語モデルを統合した革新的なビデオ理解システムです
- ベイズ深層学習への優しい入門
機械学習における三つの状態(過学習、適合不足、良い適合)を説明する図を示します。
過学習は、生徒が特定の問題の答えを暗記するようなものです。おそらく、彼らは科目を理解していないため、テストに失敗する可能性があります。彼らはただいくつかの問題に答える方法を覚えているだけです。
パフォーマンスの面では、一般的に、私たちが選んだ評価指標がトレインセットとテストセットの両方で非常に高い(100%に近い)場合に、MLが過学習していることがわかります。
したがって、過学習や適合不足は、データサイエンティストとして絶対に避ける必要があるものです。
過学習を避ける方法の一つは、正則化を使用することです。その方法を見てみましょう。
正則化による過学習の解決
正則化は、モデルの訓練中に損失関数にペナルティ項を追加することで実現されます。これにより、モデルが訓練データに過度に適合することを抑制します。
アイデアは、モデルが訓練データに過度に適合しすぎないよう制限することで、データのノイズやランダムな変動にも適合する能力を低下させることです。これにより、過学習を回避します。
したがって、以下のようにコスト関数を定義した場合:
ここで:
- `Theta`は推定値です。
- `x`と`y`は、それぞれモデルの特徴とラベルです。
正則化パラメータを`lambda`、正則化関数を`omega`と定義した場合、正則化された目的関数は次のようになります:
したがって、研究する関数は、コスト関数と正則化関数の合計です。
正則化関数と正則化パラメータは、使用する正則化のタイプによって異なる場合があります。
次の段落では、機械学習で最もよく使用される2つの正則化関数について説明します。
LassoとRidge正則化の説明
Lasso正則化されたモデル
Lasso(最小絶対値と選択演算子)正則化は、係数の絶対値の大きさに等しいペナルティを追加するL1正則化を行います。この正則化手法は、正則化項を追加することで重みを原点に近づけます:
たとえば、MSE(または任意の他のコスト関数)にL1正則化ペナルティを追加することができます:
ここで、以下のようなものがあります:
- `n`は研究しているデータ/ポイントの総数です
- `yi`は実際の値です
- 「hat yi」はモデルによって予測された値です
Lasso正則化の幾何学的解釈
Lasso正則化は、内部で特徴選択と呼ばれるものを実行します。この事実を理解するために、Lasso正則化の幾何学的解釈を示します。単純化のために、2次元の描画を作成し、w_1とw_2の2つの重みを持ちます:
オレンジ色の同心楕円は選択したコスト関数(この場合はMSE)の幾何学的表現であり、ライトブルーのひし形はペナルティ関数(L1)の幾何学的解釈です。
私たちの目標は損失関数を最小化することです。上記のイラストからわかるように、楕円はひし形の端に接することができます。これらの端では、重みの1つが0になります。次の画像では、関数の最小化は関数同士の交差ではなく、接点で行われるため、この接点がより良く視覚化されます:
さて、すべての重みw_iに対してこのプロセスを行うと、初期モデルを簡素化するためにいくつかの特徴量が0に設定される、スパースなモデルと呼ばれるものが得られます。これは、Lasso正則化が最も大きな重みを0に設定することで、特徴選択を実行したことを意味します。
数学的には、関数を最小化するために関数の勾配を計算する必要があることを思い出して、以下の計算を行う必要があります:
この文脈では、スパース性とは、一部のパラメータがゼロの最適値を持つという事実を指します。言い換えれば、この方程式には数値解があります:いくつかの特徴量は0になり、これが特徴選択と呼ばれます。
リッジ正則化モデル。
リッジモデルは、係数の大きさの2乗に等しいペナルティを追加するL2正則化を行います。この正則化戦略は、重みw_iを原点に近づけるために正則化項を追加します。
例えば、MSE(または他の任意のコスト関数)にL2正則化ペナルティを追加することができます:
Ridge正則化の幾何学的解釈
この事実を理解するために、Ridge正則化のグラフィカルな解釈を示します。簡単のため、2次元の図を作成し、2つの重み、w_1とw_2を考えます:
Lasso正則化とは異なり、Ridgeは特徴量の選択を行いません。Ridgeは、係数の値を0に収束させることなく、モデルの複雑さを減らすため、独立変数の数を減らすことなくモデルの複雑さを減らします。以下の画像を使用して視覚的に説明します:
上記の画像を見ると、楕円が円(L2ペナルティの幾何学的解釈)といつでも接することができることがわかります。つまり、モデルは大きな重みを罰則するが、それらを0に縮小しません。これは、最終的なモデルにすべての独立変数が含まれることを意味します。
また、この場合、最小化するために関数の勾配を計算する必要があることを思い出してください。次のように計算する必要があります:
Lasso正則化との違いは、上記の方程式が常に数値解を持たないことであり、これが特徴量の選択を行わない理由です。
PythonでRidgeおよびLasso正則化モデルを実装する
それでは、これらの正則化手法を実装する方法を見てみましょう。
まず、Lasso正則化から始めましょう:
import numpy as npfrom sklearn.datasets import make_regressionfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import r2_scorefrom sklearn.linear_model import Lassofrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.pipeline import make_pipelinefrom sklearn.linear_model import LinearRegression#warningsimport warnings#警告を無視するwarnings.filterwarnings('ignore')#データセットを作成するX, y = make_regression(n_samples=100, n_features=5, noise=10, random_state=42)#特徴量をスケーリングするscaler = StandardScaler()X = scaler.fit_transform(X)#データをトレーニングセットとテストセットに分割するX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)#トレーニングデータに6次の多項式をフィットするpoly = PolynomialFeatures(degree=6)X_train_poly = poly.fit_transform(X_train)#6次の多項式をトレーニングデータにフィットするpoly_reg = LinearRegression()poly_reg.fit(X_train_poly, y_train)#トレーニングデータとテストデータで多項式を評価するX_test_poly = poly.transform(X_test)y_pred_train = poly_reg.predict(X_train_poly)y_pred_test = poly_reg.predict(X_test_poly)r2_score_poly_train = r2_score(y_train, y_pred_train)r2_score_poly_test = r2_score(y_test, y_pred_test)print(f'トレーニングセットでの6次多項式のR二乗値:{r2_score_poly_train: .3f}')print(f'テストセットでの6次多項式のR二乗値:{r2_score_poly_test: .3f}')#トレーニングデータに正則化された6次多項式をフィットするlasso_reg = make_pipeline(PolynomialFeatures(degree=6), Lasso(alpha=1))lasso_reg.fit(X_train, y_train)#テストデータで正則化された多項式を評価するy_pred_lasso = lasso_reg.predict(X_test)r2_score_lasso = r2_score(y_test, y_pred_lasso)print(f'テストセットでの正則化された6次多項式のR二乗値:{r2_score_lasso: .3f}')
そして、私たちは以下の結果を得ます:
トレーニングセット上の6次多項式のR二乗値: 1.000テストセット上の6次多項式のR二乗値: -84.110テストセット上の正則化された6次多項式のR二乗値: 0.827
したがって、見てわかるように、「標準」の6次多項式はトレーニングセット上でR²が1であり、テストセット上で負の値を持つため、過学習しています。
一方、6次正則化モデルはテストセット上で受け入れ可能なR²を持っており、良好な汎化性能を持っています。したがって、正則化により正則化されていないモデルのパフォーマンスが改善されました。
では、Ridgeモデルを使用した類似の例を作成しましょう:
import numpy as npfrom sklearn.datasets import make_regressionfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import r2_scorefrom sklearn.linear_model import Ridgefrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.pipeline import make_pipelinefrom sklearn.linear_model import LinearRegression# データセットを作成するX, y = make_regression(n_samples=100, n_features=3, noise=5, random_state=42)# 特徴量をスケーリングするscaler = StandardScaler()X = scaler.fit_transform(X)# データをトレーニングセットとテストセットに分割するX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# トレーニングデータに6次多項式をフィットするpoly = PolynomialFeatures(degree=6)X_train_poly = poly.fit_transform(X_train)# トレーニングデータに6次多項式をフィットするpoly_reg = LinearRegression()poly_reg.fit(X_train_poly, y_train)# トレーニングデータとテストデータで多項式を評価するX_test_poly = poly.transform(X_test)y_pred_train = poly_reg.predict(X_train_poly)y_pred_test = poly_reg.predict(X_test_poly)r2_score_poly_train = r2_score(y_train, y_pred_train)r2_score_poly_test = r2_score(y_test, y_pred_test)print(f'トレーニングセット上の6次多項式のR二乗値: {r2_score_poly_train}')print(f'テストセット上の6次多項式のR二乗値: {r2_score_poly_test}')# 正則化された6次多項式をトレーニングデータにフィットするridge_reg = make_pipeline(PolynomialFeatures(degree=6), Ridge(alpha=1))ridge_reg.fit(X_train, y_train)# テストデータ上で正則化された多項式を評価するy_pred_ridge = ridge_reg.predict(X_test)r2_score_ridge = r2_score(y_test, y_pred_ridge)print(f'正則化された6次多項式のR二乗値(テストセット上): {r2_score_ridge}')
そして、私たちは以下の結果を得ます:
トレーニングセット上の6次多項式のR二乗値: 1.0テストセット上の6次多項式のR二乗値: -1612.4842791834997テストセット上の正則化された6次多項式のR二乗値: 0.9266258222037977
したがって、このケースでもRidge正則化は正則化されていない多項式モデルのパフォーマンスを向上させました。また、Lassoモデルよりもさらに優れたパフォーマンスを発揮します。
結論
この記事では、過学習の問題とその解決方法である正則化について説明しました。
ただし、どの正則化モデルを使用するかはいつですか。以下のルールを参考にしてください:
- 特徴量が強く相関している場合は、Ridge正則化を使用する方が良いです。したがって、問題の研究から削除する特徴量を決定する前に、相関行列を調査することが重要です。
- Lasso正則化はデータセット内の特徴量を減らすのに役立ちます。Lasso正則化は自動的に最も重要な特徴量のサブセットを選択し、同時に重要でない特徴量の係数をゼロに縮小します。したがって、Lasso正則化は以下の場合に有用です:
- 高次元のデータセットの場合。
- 多くの特徴量が相関している場合。
- モデルの係数にスパース性を課す場合。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles