スペクトルデータ処理:データ精度評価指標のPythonによる計算

一、R²相関係数の計算

(1) 定義の紹介

相関係数R²(決定係数とも呼ばれる)は、事物間の関係の密接さを測定する指標です。これはモデルがデータにどれだけ適合しているかを示す評価システムと考えることができます。スコアの範囲は0から1です。

(2) 完全なコード

まず、単純な線形相関を持つデータセットを生成します。次に、sklearnライブラリのLinearRegressionクラスを使用して線形回帰モデルを学習させます。r2_score関数はモデルの相関係数R²を計算し、モデルのデータへの適合度を評価するために使用されます。最後に、元のデータと適合線をプロットし、R²値を表示します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# 乱数のシードを設定して、毎回同じランダムデータが生成されるようにする
np.random.seed(0)
 
# 波長という特徴量と対応するスペクトル測定値を想定して100個のサンプルデータセットを生成
X = np.random.rand(100, 1) * 100  # 波長特徴量、0から100の範囲を想定
y = 3 * X.squeeze() + np.random.randn(100) * 8  # 真の値にランダムノイズを追加

# 線形回帰モデルを初期化
lin_model = LinearRegression()

# モデルを学習させ、最適な適合線を見つける
lin_model.fit(X, y)

# モデルを使用して予測を行う
predictions = lin_model.predict(X)

# 相関係数R²を計算し、モデルの適合効果を評価する
r2_value = r2_score(y, predictions)

# 元のデータと予測結果のグラフをプロット
plt.scatter(X, y, color='blue', label='元のデータ')  # 元のデータポイント
plt.plot(X, predictions, color='red', label='適合線')  # 適合直線
plt.title(f'線形回帰の適合度 (R²: {r2_value:.2f})')  # R²スコアを含むタイトル
plt.xlabel('波長')  # x軸ラベル
plt.ylabel('スペクトル測定値')  # y軸ラベル
plt.legend()  # 凡例を表示
plt.show()  # グラフを表示

(3) 実行結果

二、交差検証二乗平均平方根誤差(RMSECV)の計算

(1) 定義の紹介

交差検証二乗平均平方根誤差(RMSECV)は、モデルの予測精度を測定する指標です。この概念を理解するために、いくつかの部分に分解して説明します:交差検証(CV)、二乗平均誤差(MSE)、および二乗平均平方根誤差(RMSE)です。

まず、二乗平均誤差(MSE)は、予測値と実際の値の差の大きさを測定する方法です。的を射るターゲットを想像してみてください。あなたのタスクは弓矢を射ることで、矢が当たった位置が予測値、的の中心が実際の値です。毎回射るたびに、あなたの矢と的の中心との距離は、予測値と実際の値との誤差に相当します。二乗平均誤差は、すべての矢と的の中心との距離(誤差)を二乗して平均を取ることで計算されます。これにより、誤差が常に正の値になり、的から遠い矢(大きな誤差)をより重視することができます。

次に、二乗平均平方根誤差(RMSE)は、二乗平均誤差の平方根です。弓矢の例を続けると、MSEを計算すると、すべての矢と的の中心との距離の二乗値の平均が得られますが、これは二乗後の尺度上の値であり、元の距離の尺度ではありません。そのため、元の距離の尺度に戻すために平方根を取る必要があり、これにより予測値と実際の値との平均距離をより直感的に理解できます。

最後に、交差検証(CV)はモデルの汎化能力を評価する技術です。あなたが多くの矢を持っていると想像してください。毎回同じ矢を使って的に射るのではなく、毎回異なる矢を選んで射ることを決めます。これにより、すべての矢が射る機会を持ち、毎回異なる矢を使ってあなたの射撃技術を評価することができます。データモデルにおける交差検証は、データをいくつかの部分に分割し、それぞれの部分を順にテストデータとして使用し、残りを訓練データとして使用する方法です。これにより、データ分割による偶然性を減らし、より信頼性の高いモデル評価が得られます。

したがって、交差検証二乗平均平方根誤差(RMSECV)は、交差検証プロセス中に計算される各ラウンドのRMSEの平均値です。この平均値は、モデルが異なるデータサブセット上での平均的な挙動をどれだけ示しているかを教えてくれます。また、RMSEであるため、元のデータの尺度上にあるため、より直感的です。低いRMSECVは、モデルの予測誤差が小さく、モデルの予測性能が良好であることを示します。

(2) 完全なコード

まず、cross_val_score関数を使用して交差検証を実装し、各フォールドの二乗平均誤差(MSE)を計算します。次に、平均値を取り、平方根を取ってRMSECVを求めます。最後に、元のデータ点と線形回帰の予測結果をプロットし、計算されたRMSECV値を出力します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

# 乱数のシードを設定して、毎回同じランダムデータが生成されるようにする
np.random.seed(42)

# スペクトルデータをシミュレート生成、波長という特徴量と対応するスペクトル測定値を想定して100個のサンプルデータセットを生成
spectral_data = np.random.rand(100, 1) * 100  # 波長特徴量、0から100の範囲を想定
target_values = 4 * spectral_data.squeeze() + np.random.randn(100) * 12  # 真の値にランダムノイズを追加

# 線形回帰モデルを初期化
regression_model = LinearRegression()

# cross_val_scoreはデフォルトで負のMSEを計算するため、負の値を取って平方根を計算してRMSECVを求める
cv_scores = cross_val_score(regression_model, spectral_data, target_values, scoring='neg_mean_squared_error', cv=5)
rmsecv_result = np.sqrt(-cv_scores.mean())

# モデルを学習させ、最適な適合線を見つける
regression_model.fit(spectral_data, target_values)

# モデルを使用して予測を行う
model_predictions = regression_model.predict(spectral_data)

# 元のデータと予測結果のグラフをプロット
plt.scatter(spectral_data, target_values, color='blue', label='元のデータ')  # 元のデータポイント
plt.plot(spectral_data, model_predictions, color='green', label='予測結果')  # モデルの予測結果
plt.title(f'線形回帰モデル (RMSECV: {rmsecv_result:.2f})')  # グラフのタイトル
plt.xlabel('波長')  # x軸ラベル
plt.ylabel('スペクトル測定値')  # y軸ラベル
plt.legend()  # 凡例を表示
plt.show()  # グラフを表示

# RMSECV値を出力
print(f'交差検証二乗平均平方根誤差(RMSECV)の値: {rmsecv_result:.2f}')

(3) 実行結果

三、Clarke誤差グリッドの計算

(1) 定義の紹介

Clarke誤差グリッドは、2つの測定データセット間の関係を理解するためのグラフィカルツールです。理想的な測定装置が常に完璧な結果を与えてくれると想像してください。次に、実際の装置を使って同じものを測定し、一連の結果を得ました。この実際の装置の測定精度がどれくらい良いかを知りたいとします。

このとき、Clarke誤差グリッドが役立ちます。このグリッドはグラフをいくつかの領域に分割し、各領域は異なるレベルの精度に対応します:

  • Aゾーン:この領域のデータポイントは、実際の装置の測定結果が理想的な装置と非常に近いことを示しており、つまり測定は非常に正確です。
  • Bゾーン:ここにあるデータポイントは、実際の装置の測定結果が完璧ではありませんが、誤差が許容範囲内であることを意味します。
  • Cゾーン:この領域のデータポイントは、測定結果に一定の誤差があることを示しており、問題を引き起こす可能性があります。
  • DゾーンとEゾーン:これらの領域のデータポイントは、実際の装置の測定結果が理想的な装置と大きく異なり、深刻な結果を引き起こす可能性があることを示しています。

データポイントがこのグリッド上でどのように分布しているかを見ることで、装置の測定精度を迅速に判断できます。ほとんどのデータポイントがAゾーンにある場合、その装置は非常に信頼性が高いです。データポイントがC、D、またはEゾーンに散らばっている場合、その装置は重要な測定タスクには適していない可能性があります。

要するに、Clarke誤差グリッドは成績報告書のようなもので、装置のパフォーマンスを教えてくれ、その装置の測定結果を信頼できるかどうかを決定するのに役立ちます。

(2) 完全なコード

Clarke誤差グリッドの計算には通常、以下の4つのステップがあります:

  1. シミュレートデータの生成:コードはまずnumpyライブラリを使用して2つのデータセットを生成します。reference_valsは0から300の間に一様に分布する100個の値で、理想的なスペクトル測定値をシミュレートします。measured_valsreference_valsに正規分布のランダムノイズ(平均0、標準偏差10)を加えて生成され、実際のスペクトル測定値をシミュレートします。
  2. Clarke誤差グリッドのプロット関数の定義clarke_error_grid_plot関数はClarke誤差グリッドを作成し、その上にシミュレートデータポイントをプロットします。関数内部ではまず、Clarke誤差グリッドの5つの領域(A、B、C、D、E)の境界点を定義します。次に、matplotlibライブラリのfill関数を使用してこれらの境界点に基づいてグリッド領域の色を塗りつぶし、scatter関数を使用してシミュレートデータポイントをグラフ上にプロットします。
  3. グラフプロパティの設定:関数内でグラフのタイトル、x軸とy軸のラベル、凡例、座標軸のアスペクト比(x軸とy軸のスケールを一致させる)、x軸とy軸の表示範囲、グリッド線を設定します。
  4. 結果の表示:最後に、clarke_error_grid_plot関数を呼び出し、シミュレートされた参照値と測定値を渡して実行し、Clarke誤差グリッドとデータポイントをプロットして表示します。結果は、データポイントが異なる精度領域にどのように分布しているかを示すグラフです。

完全なコードは以下の通りです:

import matplotlib.pyplot as plt
import numpy as np

# スペクトルデータをシミュレート生成
np.random.seed(42)
reference_vals = np.linspace(0, 300, 100)  # 参照スペクトル測定値
measured_vals = reference_vals + np.random.normal(0, 12, reference_vals.shape)  # 実際のスペクトル測定値に若干の誤差を追加


# Clarke誤差グリッドをプロットする関数
def clarke_error_grid_plot(ref_values, meas_values):
    # Clarke誤差グリッドの境界点を定義
    zone_boundaries = {
        'A': [(0, 70), (0, 70), (70, 290), (70, 260), (130, 180), (180, 340), (260, 290), (340, 390)],
        'B': [(0, 70), (0, 55), (70, 70), (180, 70), (260, 115), (260, 70)],
        'C': [(70, 70), (180, 70), (240, 70), (240, 30), (70, 30)],
        'D': [(240, 70), (240, 30), (300, 0), (390, 0), (390, 70)],
        'E': [(260, 70), (390, 70), (390, 390), (260, 390)]
    }

    # Clarke誤差グリッドの領域をプロット
    for region in zone_boundaries:
        boundary_points = np.array(zone_boundaries[region])
        plt.fill(boundary_points[:, 0], boundary_points[:, 1], label=f'領域 {region}')

    # データポイントをプロット
    plt.scatter(meas_values, ref_values, marker='o', color='black')

    plt.title('Clarke誤差グリッド分析')
    plt.xlabel('測定濃度')
    plt.ylabel('参照濃度')
    plt.legend(loc='upper right')
    plt.axis('equal')
    plt.xlim(0, 400)
    plt.ylim(0, 400)
    plt.grid(True)
    plt.show()


# Clarke誤差グリッド分析を実行
clarke_error_grid_plot(reference_vals, measured_vals)

(3) 実行結果

タグ: スペクトル解析 データ評価 Python 線形回帰 交差検証

6月11日 18:11 投稿