2024年版【GCP資格の勉強 PDE編】損失関数 – 回帰(最小二乗法)/ 分類(最尤推定法の二値分類と多値分類)とは?について解説します。
(★注意:GCP資格 Professional Data Engineer(PDE)試験の公式テキスト・問題集などを元に独自にまとめたものです)
Google Cloud Platform(GCP)のProfessional Data Engineer(PDE)試験では、機械学習モデルにおける損失関数の理解が重要です。損失関数はモデルの予測がどれだけ実際のデータから離れているかを測る指標で、モデルの学習において最小化されるべき対象です。ここでは、回帰と分類タスクにおける主な損失関数について説明します。
回帰:最小二乗法(Least Squares Method)
最小二乗法は、統計学と数学において、データをもっともよく表す直線を見つける方法の一つです。最小二乗法は特に、回帰分析という、一連のデータポイントを最もよく説明する関係性を見つけ出す過程でよく用いられます。
最小二乗法の基本概念
いくつかのデータポイント(例えば、家のサイズとその価格の関係)を持っているとき、各データポイントの点を最もよく通る直線を描きたいと思っています。最小二乗法は、この直線を見つけるのに役立ちます。
import numpy as np
import matplotlib.pyplot as plt
# Sample data generation
np.random.seed(0)
X = np.linspace(0, 10, 100) # 100 data points from 0 to 10
y_actual = 3 * X + 7 + np.random.randn(100) * 3 # Linear relation with some noise
# Simple linear regression model (least squares method)
def linear_regression(X, y):
# Adding a bias term (intercept)
X_b = np.c_[np.ones((len(X), 1)), X]
# Normal equation
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
return theta_best
# Training the model
theta_best = linear_regression(X, y_actual)
intercept, slope = theta_best
# Making predictions
y_pred = intercept + slope * X
# Plotting
plt.scatter(X, y_actual, label='Actual data')
plt.plot(X, y_pred, color='red', label='Fitted line')
plt.xlabel('Input Feature')
plt.ylabel('Output')
plt.title('Linear Regression using Least Squares Method')
plt.legend()
plt.show()
# Printing the model parameters
print(f"Model Intercept (Bias): {intercept}")
print(f"Model Slope (Weight): {slope}")
上記のPythonコードは、最小二乗法を使用して線形回帰モデルをトレーニングし、予測を行うサンプルです。コードでは以下のステップが実行されています。
- サンプルデータの生成:
X
は0から10までの100個のデータポイントです。y_actual
はX
に基づく線形関係(傾きが3、切片が7)に、ノイズを加えた実際の値です。 - 線形回帰モデルのトレーニング:
linear_regression
関数は、最小二乗法を使用してモデルのパラメータ(切片と傾き)を求めます。np.linalg.inv
とdot
メソッドを使用して、正規方程式を解いています。 - モデルによる予測:
トレーニングされたモデルを使用して、X
に基づく予測値y_pred
を計算しています。 - 結果のプロット:
実際のデータポイントとモデルによるフィッティング線(予測)をプロットしています。 - モデルパラメータの表示:
モデルの切片(バイアス)と傾き(重み)を表示しています。
このコードは、最小二乗法を用いた線形回帰の基本的な概念を示しており、大規模なデータセットでの効率的な計算方法の重要性を反映しています。
最小二乗法はどのように機能するか
- 誤差の計算:
各データポイントと直線との間の距離(誤差)を計算します。距離が短いほど、その直線はデータポイントをよく表していると言えます。 - 誤差の二乗和:
この距離(誤差)を二乗(掛け算の形で自分自身と掛け合わせる)し、すべてのデータポイントについての二乗した誤差の合計を求めます。 - 最小化:
この合計した誤差が最小となる直線が、データを最もよく表す直線とされます。
最小二乗法はなぜ重要か
最小二乗法は、さまざまなデータセットを解析し、理解するための強力なツールです。特に、ある変数(例:家のサイズ)が他の変数(例:家の価格)にどのように影響を与えるかを理解したい場合に有用です。最小二乗法は、データの基本的な傾向を簡単に視覚化し、より複雑な分析の基礎となります。
最小二乗法は、一連のデータポイントを最もよく説明する直線を見つけるための、シンプルで直感的な方法です。最小二乗法の直線は、データの基本的な傾向やパターンを理解するのに役立ちます。最小二乗法は、科学、経済学、社会科学など、さまざまな分野で広く利用されています。
最小二乗法と損失関数
損失関数
損失関数は、予測値と実際の値の違いを数値で表す方法です。最小二乗法において、この「違い」(または「誤差」)は、実際のデータポイントと予測された直線との間の距離です。
たとえば、家の大きさに基づいて家の価格を予測し、その予測が実際の価格とどれだけ異なるかを見ます。この差(誤差)を小さくすることが、最小二乗法の目標です。
最小二乗法と損失関数の関係
最小二乗法では、すべてのデータポイントに対する誤差(実際の値と予測値の差)を二乗し、それらを合計します。この合計値を最小にする直線が、データを最もよく表す直線とされます。つまり、最小二乗法の目標は、この損失関数(合計された誤差の二乗)を最小化することです。
最小二乗法とは、データに最もフィットする直線を見つける方法で、損失関数はその直線がどれだけデータに合っているかを数値で表します。最小二乗法と損失関数は、複雑な数学や統計学を知らなくても、データの基本的な傾向や関係性を理解するのに役立ちます。
- 特徴:: 回帰タスクでは、最小二乗法が一般的に用いられる損失関数です。
最小二乗法では、実際の値とモデルの予測値との差(誤差)の二乗和を最小化します。
数学的には、`損失 = Σ(y_i f(x_i))^2` の形で表され、ここで `y_i` は実際の値、`f(x_i)` はモデルによる予測値です。 - 計算コストの考慮:: 回帰モデルでは、通常はデータポイントごとに損失を計算し、平均を取ることで全体の損失を評価します。
計算コストはデータ量に比例するため、大規模なデータセットでは効率的な計算方法が重要になります。
分類:最尤推定法(Maximum Likelihood Estimation)
- 分類とは何か?
- 分類は、データを異なるカテゴリやグループに分けることです。例えば、メールが「スパム」か「非スパム」かを分類するのが一般的な例です。このような問題では、データ(この場合はメール)がどのカテゴリに属するかを予測します。
- 最尤推定法(Maximum Likelihood Estimation)
- 最尤推定法は、観測されたデータが発生する確率を最大にするパラメータを見つける方法です。どのモデル設定が見たデータを最もうまく説明するかを探します。
- 二値分類とロジスティック回帰
- 二値分類は、データを2つのカテゴリのいずれかに分類するタスクです。二値分類でよく使われるのがロジスティック回帰です。ロジスティック回帰は、データが特定のカテゴリに属する確率を予測します。
- シグモイド関数
- シグモイド関数は、ロジスティック回帰で使用される特殊な関数で、どんな実数値も0と1の間の値に変換します。シグモイド関数は、確率を表すのに適しています。
- クロスエントロピー損失(ログ損失)
- クロスエントロピー損失(またはログ損失)は、モデルがどれだけ実際のカテゴリラベルを正確に予測しているかを測定するために使用される損失関数です。クロスエントロピーの損失関数は、モデルの予測が実際のラベルとどれだけ「離れているか」を数値で示します。数値が小さいほど、モデルの予測は実際のラベルに近いことを意味します。
最尤推定法は、観測データをもっともよく説明するモデルのパラメータを見つける方法です。二値分類では、最尤推定法を使って、ロジスティック回帰モデルを訓練し、データが2つのカテゴリのどちらに属するかを予測します。クロスエントロピー損失は、モデルの予測がどれだけ正確かを測るために使われます。
最尤推定法のPythonコード
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# Generating sample data
np.random.seed(0)
X = np.linspace(-5, 5, 100)
y = 3 * X + 4 + np.random.randn(100) * 2 # Linear relationship with noise
# Likelihood function (assuming Gaussian noise)
def likelihood(params):
intercept, slope = params
pred = intercept + slope * X
return -np.sum(np.log(np.exp(-(y - pred)**2 / 2) / np.sqrt(2 * np.pi)))
# Finding parameters that maximize the likelihood
result = minimize(likelihood, [0, 0])
# Extracting the parameters
intercept, slope = result.x
# Plotting the data and the fitted line
plt.scatter(X, y, label='Data')
plt.plot(X, intercept + slope * X, color='red', label='Fitted line')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Maximum Likelihood Estimation')
plt.legend()
plt.show()
# Displaying the estimated parameters
print(f"Estimated Intercept: {intercept}")
print(f"Estimated Slope: {slope}")
上記のPythonコードは、最尤推定法を用いて線形回帰モデルのパラメータ(切片と傾き)を見つけるサンプルです。最尤推定法のPythonコードでは以下のステップが実行されています。
- サンプルデータの生成:
X
は -5 から 5 までの 100 個のデータポイントです。y
はX
に基づく線形関係に、ノイズが加えられた実際の値です(傾きが 3、切片が 4)。 - 尤度関数の定義:
尤度関数は、パラメータが与えられたときに観測データが発生する確率を示します。この例では、ガウス分布(正規分布)を仮定しています。 - 最尤推定の実行:
minimize
関数を用いて、尤度関数を最大化するパラメータ(この場合は最小化するために、尤度関数の負の値を使用)を見つけます。 - 結果のプロット:
実際のデータ点と、見つけたパラメータに基づいたフィッティング線をプロットしています。 - 推定されたパラメータの表示:
最尤推定法によって見つけた切片(intercept
)と傾き(slope
)を表示しています。
このコードは、観測データをもっともよく説明するモデルのパラメータを見つける最尤推定法のプロセスを示しています。この方法は、データの基本的な傾向をモデル化するのに役立ちます。
二値分類とロジスティック回帰のPythonコード
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
# Generating sample data for binary classification
np.random.seed(0)
X = np.random.randn(100, 1)
y = (X > 0).astype(np.int).ravel() # Label 1 if X > 0, otherwise 0
# Creating and training the logistic regression model
model = LogisticRegression()
model.fit(X, y)
# Making predictions
y_pred = model.predict(X)
# Generating a probability curve
x_test = np.linspace(-3, 3, 300)
probabilities = model.predict_proba(x_test.reshape(-1, 1))[:, 1]
# Plotting the data and the probability curve
plt.scatter(X, y, label='Data')
plt.plot(x_test, probabilities, color='red', label='Probability Curve')
plt.xlabel('Feature Value')
plt.ylabel('Probability')
plt.title('Logistic Regression for Binary Classification')
plt.legend()
plt.show()
# Displaying the classification report and confusion matrix
print("Classification Report:")
print(classification_report(y, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y, y_pred))
上記のPythonコードは、二値分類のためのロジスティック回帰モデルを構築し、訓練するサンプルです。このコードでは以下のステップが実行されています。
- サンプルデータの生成:
X
は標準正規分布から生成された 100 個のデータポイントです。y
はバイナリラベル(0 または 1)で、X
の値が 0 より大きい場合は 1、そうでない場合は 0 となります。 - ロジスティック回帰モデルの作成と訓練:
LogisticRegression
クラスを使用してモデルを作成し、サンプルデータで訓練します。 - 予測と確率曲線の生成:
モデルを使ってデータポイントの予測を行います。
さらに、確率曲線をプロットするために、predict_proba
メソッドを使用します。 - 結果のプロット:
実際のデータポイントと、モデルによって生成された確率曲線をプロットしています。 - 分類レポートと混同行列の表示:
classification_report
とconfusion_matrix
を使用して、モデルの性能を評価します。
このコードは、ロジスティック回帰を使用して二値分類問題を解く方法を示しており、モデルの性能を評価するための分類レポートと混同行列も提供しています。
シグモイド関数のPythonコード
import numpy as np
import matplotlib.pyplot as plt
# Define the sigmoid function
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Generate a range of values
x_values = np.linspace(-10, 10, 100)
# Apply the sigmoid function to these values
y_values = sigmoid(x_values)
# Plot the sigmoid function
plt.plot(x_values, y_values, label='Sigmoid Function')
plt.xlabel('x')
plt.ylabel('sigmoid(x)')
plt.title('Sigmoid Function')
plt.grid(True)
plt.legend()
plt.show()
上記のPythonコードは、シグモイド関数を実装し、プロットするサンプルです。このコードでは以下のステップが実行されています。
- シグモイド関数の定義:
sigmoid
関数は、与えられたx
値に対してシグモイド関数を適用します。
シグモイド関数の数式は1 / (1 + exp(-x))
です。 - 値の範囲の生成:
np.linspace
を使用して -10 から 10 までの 100 個の値を生成します。 - シグモイド関数の適用:
生成した値にシグモイド関数を適用し、結果をy_values
に格納します。 - 関数のプロット:
x_values
とy_values
を用いて、シグモイド関数のグラフをプロットします。
このコードにより、シグモイド関数がどのような形状をしているかが分かります。シグモイド関数は、入力された任意の実数値を 0 と 1 の間の値に変換し、ロジスティック回帰で確率を表すのに適しています。
クロスエントロピー損失(ログ損失)のPythonコード
import numpy as np
# Cross Entropy Loss (Log Loss) function
def cross_entropy_loss(y_true, y_pred):
# Avoid division by zero
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
# Calculate cross entropy loss
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
# Generating sample data
np.random.seed(0)
y_true = np.random.randint(0, 2, 10) # Random binary labels
y_pred = np.random.rand(10) # Random probabilities
# Calculate Cross Entropy Loss
loss = cross_entropy_loss(y_true, y_pred)
print("Actual Labels: ", y_true)
print("Predicted Probabilities: ", y_pred)
print("Cross Entropy Loss: ", loss)
Actual Labels: [0 1 1 0 1 1 1 1 1 1]
Predicted Probabilities: [0.64589411 0.43758721 0.891773 0.96366276 0.38344152 0.79172504
0.52889492 0.56804456 0.92559664 0.07103606]
Cross Entropy Loss: 1.0410608997826853
上記のPythonコードは、クロスエントロピー損失(ログ損失)を計算するサンプルです。このコードでは以下のステップが実行されています。
- クロスエントロピー損失関数の定義:
cross_entropy_loss
関数は、実際のラベル (y_true
) とモデルの予測確率 (y_pred
) を受け取ります。
予測確率はnp.clip
関数で 0 に近づかないように調整され、除算エラーを避けます。 - サンプルデータの生成:
y_true
はランダムなバイナリラベル(0 または 1)です。y_pred
はランダムな予測確率です。 - 損失の計算:
定義した関数を使ってクロスエントロピー損失を計算します。 - 結果の表示:
実際のラベル、予測確率、そして計算されたクロスエントロピー損失を表示します。
クロスエントロピー損失は、モデルが実際のラベルをどれだけ正確に予測しているかを測定するために使用される損失関数です。クロスエントロピー損失の数値が小さいほど、モデルの予測は実際のラベルに近いことを意味します。この例では、ランダムなデータを使用しているため、損失の値が高くなっています。
二値分類
- 特徴:: 二値分類では、シグモイド関数に基づくロジスティック回帰が一般的です。
- 損失関数は、通常、クロスエントロピー損失(またはログ損失)が用いられます。クロスエントロピー損失は、実際のカテゴリラベルとモデルの予測確率との間の不一致を測ります。
多値分類
- 特徴:: 多クラス分類の場合、ソフトマックス関数がよく用いられ、クロスエントロピー損失が適用されます。
ここでの損失は、各クラスに対する予測確率と実際のラベルとの不一致を評価します。 - 計算コストの考慮:: クロスエントロピー損失の計算も、特にクラス数が多い場合、計算コストが大きくなる可能性があります。
ミニバッチ勾配降下法などの効率的な最適化手法が用いられることが一般的です。
多値分類のPythonコード
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.utils.extmath import softmax
# Cross Entropy Loss for Multiclass Classification
def cross_entropy_multiclass(y_true, y_pred):
# Avoid division by zero
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
# Calculate cross entropy loss
return -np.sum(y_true * np.log(y_pred)) / y_true.shape[0]
# Generating sample data for multiclass classification
np.random.seed(0)
num_samples = 100
num_classes = 3
# Randomly generating sample features and labels
X = np.random.randn(num_samples, 2) # Sample features
y = np.random.randint(0, num_classes, num_samples) # Random class labels
# One-hot encoding the labels
encoder = OneHotEncoder(categories='auto', sparse=False)
y_true = encoder.fit_transform(y.reshape(-1, 1))
# Simulating model predictions using softmax
scores = np.random.randn(num_samples, num_classes) # Random scores
y_pred = softmax(scores)
# Calculate Cross Entropy Loss
loss = cross_entropy_multiclass(y_true, y_pred)
print("Cross Entropy Loss (Multiclass):", loss)
Cross Entropy Loss (Multiclass): 1.261427954551756
上記のPythonコードは、多値分類(多クラス分類)におけるクロスエントロピー損失を計算するサンプルです。このコードでは以下のステップが実行されています。
- 多クラス用クロスエントロピー損失関数の定義:
cross_entropy_multiclass
関数は、実際のラベル (y_true
) とモデルの予測確率 (y_pred
) を受け取り、クロスエントロピー損失を計算します。
予測確率はnp.clip
を用いて 0 に近づかないように調整されます。 - サンプルデータの生成:
ランダムに生成された特徴 (X
) とラベル (y
) を用いて、多クラス分類のサンプルデータを生成します。 - ラベルのワンホットエンコーディング:
実際のラベルをワンホットエンコード形式に変換します。これにより、各クラスのラベルがバイナリ形式になります。 - モデル予測のシミュレーション:
ランダムなスコアを生成し、softmax
関数を使用して、各クラスの予測確率を計算します。 - 損失の計算:
定義した関数を用いて、多クラス分類のクロスエントロピー損失を計算します。
このコードは、多値分類タスクにおけるクロスエントロピー損失の計算方法を示しており、ソフトマックス関数を使用して各クラスに対する予測確率を得ています。損失値が低いほど、モデルの予測が実際のラベルに近いことを意味します。この例では、ランダムなデータを使用しているため、損失値が比較的高くなっています。
まとめ
損失関数は、モデルのパラメータを調整する際の基準となり、勾配降下法や派生アルゴリズムを使用して最適化されます。
PDE試験では、損失関数がどのようにしてモデルの学習に用いられるか、またそれらが実際のデータサイエンスや機械学習の問題にどのように適用されるかについての理解が求められます。さらに、GCPの機械学習関連サービスでの実装方法についても知識が必要です。
▼AIを使った副業・起業アイデアを紹介♪