Pythonで自作!損失関数の作り方とその活用方法を徹底解説

損失関数の基本的な説明

機械学習において、損失関数はモデルの性能を評価するために使われます。損失関数は、モデルが予測した値と実際の値の差を表現する指標で、モデルがどの程度正確に予測できているかを測るために使われます。

Pythonでの損失関数の使用例

Pythonには、様々な損失関数が用意されています。例えば、平均二乗誤差(MSE)や交差エントロピー誤差(CEE)などがあります。以下は、PythonでMSEを計算する例です。

import numpy as np
# 予測値
y_pred = np.array([1, 2, 3, 4, 5])
# 実際の値
y_true = np.array([2, 3, 4, 5, 6])
# 平均二乗誤差
mse = np.mean((y_pred - y_true) ** 2)
print("MSE:", mse)

出力結果:

MSE: 1.0

自作損失関数の作り方

Pythonで自作の損失関数を作ることもできます。自作の損失関数を作る際には、以下の2つの条件を満たす必要があります。

  • 入力として予測値と実際の値を受け取ることができる
  • 出力として損失値を返すことができる

以下は、自作の損失関数を作るための例です。ここでは、平均絶対誤差(MAE)を自作しています。

import numpy as np
def mean_absolute_error(y_true, y_pred):
    return np.mean(np.abs(y_pred - y_true))
# 実際の値
y_true = np.array([2, 3, 4, 5, 6])
# 予測値
y_pred = np.array([1, 3, 4, 6, 7])
# 平均絶対誤差
mae = mean_absolute_error(y_true, y_pred)
print("MAE:", mae)

出力結果:

MAE: 0.6

自作損失関数の具体的なコード例

以下は、自作の損失関数の具体的なコード例です。ここでは、フーバー損失関数を自作しています。

import numpy as np
def huber_loss(y_true, y_pred, delta=1.0):
    error = y_true - y_pred
    abs_error = np.abs(error)
    quadratic = np.minimum(abs_error, delta)
    linear = abs_error - quadratic
    return np.mean(0.5 * quadratic ** 2 + delta * linear)
# 実際の値
y_true = np.array([2, 3, 4, 5, 6])
# 予測値
y_pred = np.array([1, 3, 4, 6, 7])
# フーバー損失関数
huber = huber_loss(y_true, y_pred, delta=1.0)
print("Huber Loss:", huber)

出力結果:

Huber Loss: 0.3

自作損失関数の活用例

自作の損失関数は、機械学習においてモデルの評価に使うことができます。以下は、自作の損失関数を使って線形回帰モデルを評価する例です。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score
import numpy as np
# 自作の損失関数
def huber_loss(y_true, y_pred, delta=1.0):
    error = y_true - y_pred
    abs_error = np.abs(error)
    quadratic = np.minimum(abs_error, delta)
    linear = abs_error - quadratic
    return np.mean(0.5 * quadratic ** 2 + delta * linear)
# データの準備
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]])
y = np.array([3, 5, 7, 9, 11])
# 線形回帰モデル
model = LinearRegression()
# 自作の損失関数を使って交差検証を行う
score = cross_val_score(model, X, y, cv=5, scoring=make_scorer(huber_loss, greater_is_better=False))
print("Huber Loss:", -score.mean())

出力結果:

Huber Loss: 1.0255191767873154e-30

自作損失関数を用いたモデルの評価方法

自作の損失関数を用いたモデルの評価方法は、交差検証を行うことです。交差検証を行うことで、複数のデータセットに対してモデルの性能を測定することができます。

以下は、自作の損失関数を用いたモデルの評価方法の例です。ここでは、線形回帰モデルを評価しています。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score
import numpy as np
# 自作の損失関数
def huber_loss(y_true, y_pred, delta=1.0):
    error = y_true - y_pred
    abs_error = np.abs(error)
    quadratic = np.minimum(abs_error, delta)
    linear = abs_error - quadratic
    return np.mean(0.5 * quadratic ** 2 + delta * linear)
# データの準備
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]])
y = np.array([3, 5, 7, 9, 11])
# 線形回帰モデル
model = LinearRegression()
# 自作の損失関数を使って交差検証を行う
score = cross_val_score(model, X, y, cv=5, scoring=make_scorer(huber_loss, greater_is_better=False))
print("Huber Loss:", -score.mean())

出力結果:

Huber Loss: 1.0255191767873154e-30

まとめ

Pythonには、様々な損失関数が用意されていますが、自作の損失関数を作ることもできます。自作の損失関数を使うことで、モデルの評価をより正確に行うことができます。

自作の損失関数を使った線形回帰モデルの評価方法を紹介しましたが、他のモデルでも同様に自作の損失関数を使って評価することができます。