『過学習から卓越へ:正則化の力を活用する』

Overcoming Overfitting Harnessing the Power of Regularization

正則化の役割:機械学習における複雑さと一般化のバランス

出典:PixabayのAndrew Martinによる画像

機械学習において、私たちの目的は、学習されていないデータに対して最も良い予測を行うMLモデルを見つけることです。

そのために、私たちはトレーニングデータでMLモデルを訓練し、予測のパフォーマンスを確認します。そして、トレインセットとテストセット(新しいデータのセット)での予測のパフォーマンスを比較し、私たちが解決しようとしている問題に対して最良のMLモデルを選択します。

この記事では、正則化を機械学習で過学習を避ける方法として説明します。

機械学習における過学習の問題

過学習は、モデルが特定のデータに特化しすぎており、一般化がうまくできないという機械学習で起こる問題です。

機械学習における三つの状態(過学習、適合不足、良い適合)を説明する図を示します。

機械学習におけるデータの適合状態の三つの条件。出典:著者の画像。

過学習は、生徒が特定の問題の答えを暗記するようなものです。おそらく、彼らは科目を理解していないため、テストに失敗する可能性があります。彼らはただいくつかの問題に答える方法を覚えているだけです。

パフォーマンスの面では、一般的に、私たちが選んだ評価指標がトレインセットとテストセットの両方で非常に高い(100%に近い)場合に、MLが過学習していることがわかります。

したがって、過学習や適合不足は、データサイエンティストとして絶対に避ける必要があるものです。

過学習を避ける方法の一つは、正則化を使用することです。その方法を見てみましょう。

正則化による過学習の解決

正則化は、モデルの訓練中に損失関数にペナルティ項を追加することで実現されます。これにより、モデルが訓練データに過度に適合することを抑制します。

アイデアは、モデルが訓練データに過度に適合しすぎないよう制限することで、データのノイズやランダムな変動にも適合する能力を低下させることです。これにより、過学習を回避します。

したがって、以下のようにコスト関数を定義した場合:

私たちのコスト関数。出典:著者の画像。

ここで:

  • `Theta`は推定値です。
  • `x`と`y`は、それぞれモデルの特徴とラベルです。

正則化パラメータを`lambda`、正則化関数を`omega`と定義した場合、正則化された目的関数は次のようになります:

正則化された目的関数。出典:著者の画像。

したがって、研究する関数は、コスト関数と正則化関数の合計です。

正則化関数と正則化パラメータは、使用する正則化のタイプによって異なる場合があります。

次の段落では、機械学習で最もよく使用される2つの正則化関数について説明します。

LassoとRidge正則化の説明

Lasso正則化されたモデル

Lasso(最小絶対値と選択演算子)正則化は、係数の絶対値の大きさに等しいペナルティを追加するL1正則化を行います。この正則化手法は、正則化項を追加することで重みを原点に近づけます:

Lassoモデルの正則化項。出典:著者による画像。

たとえば、MSE(または任意の他のコスト関数)にL1正則化ペナルティを追加することができます:

Lasso正則化項を持つ平均二乗誤差(MSE)指標。出典:著者による画像。

ここで、以下のようなものがあります:

  • `n`は研究しているデータ/ポイントの総数です
  • `yi`は実際の値です
  • 「hat yi」はモデルによって予測された値です

Lasso正則化の幾何学的解釈

Lasso正則化は、内部で特徴選択と呼ばれるものを実行します。この事実を理解するために、Lasso正則化の幾何学的解釈を示します。単純化のために、2次元の描画を作成し、w_1とw_2の2つの重みを持ちます:

Lasso正則化の幾何学的解釈。出典:著者による画像。

オレンジ色の同心楕円は選択したコスト関数(この場合はMSE)の幾何学的表現であり、ライトブルーのひし形はペナルティ関数(L1)の幾何学的解釈です。

私たちの目標は損失関数を最小化することです。上記のイラストからわかるように、楕円はひし形の端に接することができます。これらの端では、重みの1つが0になります。次の画像では、関数の最小化は関数同士の交差ではなく、接点で行われるため、この接点がより良く視覚化されます:

損失関数とペナルティ関数の接点。出典:著者による画像。

さて、すべての重みw_iに対してこのプロセスを行うと、初期モデルを簡素化するためにいくつかの特徴量が0に設定される、スパースなモデルと呼ばれるものが得られます。これは、Lasso正則化が最も大きな重みを0に設定することで、特徴選択を実行したことを意味します。

数学的には、関数を最小化するために関数の勾配を計算する必要があることを思い出して、以下の計算を行う必要があります:

勾配を持つLasso正則化の式。出典:著者による画像。

この文脈では、スパース性とは、一部のパラメータがゼロの最適値を持つという事実を指します。言い換えれば、この方程式には数値解があります:いくつかの特徴量は0になり、これが特徴選択と呼ばれます。

リッジ正則化モデル。

リッジモデルは、係数の大きさの2乗に等しいペナルティを追加するL2正則化を行います。この正則化戦略は、重みw_iを原点に近づけるために正則化項を追加します。

Ridgeモデルの正則化項。出典:著者による画像。

例えば、MSE(または他の任意のコスト関数)にL2正則化ペナルティを追加することができます:

Ridge正則化項を持つ平均二乗誤差(MSE)メトリック。出典:著者による画像。

Ridge正則化の幾何学的解釈

この事実を理解するために、Ridge正則化のグラフィカルな解釈を示します。簡単のため、2次元の図を作成し、2つの重み、w_1とw_2を考えます:

Ridge正則化の幾何学的解釈。出典:著者による画像。

Lasso正則化とは異なり、Ridgeは特徴量の選択を行いません。Ridgeは、係数の値を0に収束させることなく、モデルの複雑さを減らすため、独立変数の数を減らすことなくモデルの複雑さを減らします。以下の画像を使用して視覚的に説明します:

損失関数とペナルティ関数の接点。出典:著者による画像。

上記の画像を見ると、楕円が円(L2ペナルティの幾何学的解釈)といつでも接することができることがわかります。つまり、モデルは大きな重みを罰則するが、それらを0に縮小しません。これは、最終的なモデルにすべての独立変数が含まれることを意味します。

また、この場合、最小化するために関数の勾配を計算する必要があることを思い出してください。次のように計算する必要があります:

勾配を持つRidge正則化の式。出典:著者による画像。

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モデルよりもさらに優れたパフォーマンスを発揮します。

結論

この記事では、過学習の問題とその解決方法である正則化について説明しました。

ただし、どの正則化モデルを使用するかはいつですか。以下のルールを参考にしてください:

  1. 特徴量が強く相関している場合は、Ridge正則化を使用する方が良いです。したがって、問題の研究から削除する特徴量を決定する前に、相関行列を調査することが重要です。
  2. Lasso正則化はデータセット内の特徴量を減らすのに役立ちます。Lasso正則化は自動的に最も重要な特徴量のサブセットを選択し、同時に重要でない特徴量の係数をゼロに縮小します。したがって、Lasso正則化は以下の場合に有用です:
  3. 高次元のデータセットの場合。
  4. 多くの特徴量が相関している場合。
  5. モデルの係数にスパース性を課す場合。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

生成型AIによる検索のスーパーチャージ

私たちは、ジェネレーティブAIを使用するSGE(Search Generative Experience)という名前の検索ラボの実験から始めます

機械学習

「オーディオ機械学習入門」

「現在、音声音声認識システムを開発しているため、それに関する基礎知識を再確認する必要がありましたこの記事はその結果で...

AI研究

SalesForce AI 研究 BannerGen マルチモダリティ バナー生成のためのオープンソース ライブラリ

効果的なグラフィックデザインは成功したマーケティングキャンペーンの基盤です。それはデザイナーと視聴者の間のコミュニケ...

データサイエンス

データを持っていますか?SMOTEとGANが合成データを作成する方法

合成データは、開発者やデータサイエンティストにとって大きな課題であるAI/MLモデルの訓練に十分でクリーンなデータを持つこ...

人工知能

「AI時代における組織の価値を引き出す」

「AIはAIに脅かされるのではなく、より能力を高め、自主性を増し、強い関係を築くことによって、個人の自己決定力を向上させ...

人工知能

「2023年版AI音声生成器の究極ガイド」

導入 人工知能(AI)の導入により、さまざまな産業で画期的な進歩が生まれています。AI音声生成器の登場は、AIが人間の振る舞...