logo

データサイエンスにおける感度分析 📂データサイエンス

データサイエンスにおける感度分析

定義 1

(主に回帰問題で)入力と出力を持つモデルmodelがあるとしよう。モデルにおける出力outputの不確実性uncertaintyを入力不確実性の異なるソースに割り当てることを感度解析sensitivity analysisという。特にモデルを関数の形 $f : \mathbb{R}^{n} \to \mathbb{R}$ と表すとき、$k = 1, \cdots , n$番目の入力変数に応じた出力の変化を計量したものを$k$番目の変数の感度と呼ぶこともある。

説明

言葉では難しいが簡単に言えば「どの入力に対して出力が最も大きく変化するか」を調べるのが感度解析である。

線形回帰分析で

$$ f \left( x_{1} , \cdots , x_{n} \right) = \beta_{0} + \beta_{1} x_{1} + \cdots + \beta_{n} x_{n} $$ 古典的な統計学で述べられる線形回帰分析は上記のように独立変数の線形結合で従属変数を表現する。このとき回帰係数 $\beta_{k}$ はそれ自体で $k$番目の入力変数 $x_{k}$ の感度として解釈できる。

基礎影響手法 2 3

alt text

基礎影響手法elementary effectは上のように $f$ の定義域 $\Omega$ をハイパーキューブに対応させて次元ごとに $p$ 個のグリッドに分割し、その格子点を辿りながら関数値の変化を測定する方法である。$i$番目の独立変数についての基礎影響 $EE_{i}$ は次のように計算される。 $$ EE_{i} = {\frac{ f \left( x_{1} , \cdots , x_{i} + \Delta_{i} , \cdots , x_{n} \right) - f \left( x_{1} , \cdots , x_{i} , \cdots , x_{n} \right) }{ \Delta_{i} }} $$ ここで $\Delta_{i}$ は $i$番目の独立変数の変化量である。格子点を辿りながら変化量を見るということは $n$ 個の独立変数ごとに $2$ 個の点が必要なので次元ごとに一つずつ変えていくため $(n+1)$ 個の点が必要であり、それらの点を列挙したものを軌跡trajectoryという。このように得られる $EE_{i}$ は平均が収束するまで $r$ 回繰り返して計算され、最終的に $EE_{i}$ の平均値 $\mu_{i}$ を $i$番目の独立変数の感度として解釈する。一方でCampolongoCampolongoらは $EE_{i}$ に絶対値を取った後に平均を取る $\mu_{i}^{\ast}$ を提案した4。この方法は $\mu_{i}$ が計算される過程で正負が混在して重要な変数であっても平均が低く出てしまう場合を防げる。

基礎影響手法は $f$ の形状に関係なく入力変数の絶対的な感度を算出できる利点があるが、その数値自体の解釈まで導くのは難しい点に注意する必要がある。

実装

以下は基礎影響手法を줄리아で実装したものである。

p = 4; p -= 1
Ω = extrema.(eachcol(data))
function elementary_effect(f, Ω, p = 4)
    p -= 1
    a_ = minimum.(Ω)
    b_ = maximum.(Ω)
    Δ_ = (b_ .- a_) ./ p

    x_ = [rand(0:p, n)]
    for k in 1:n
        x = deepcopy(x_[end])  
        if x[k] == 0
            x[k] = 1
        elseif x[k] == p
            x[k] -= 1
        else
            x[k] += rand([-1, 1])
        end
        push!(x_, x)
    end
    return abs.(diff(only.(f.([a_ + (Δ_ .* x) for x in x_]))) ./ Δ_)
end
EE = inv.(1:500)' .* cumsum(stack([elementary_effect(f, Ω, p) for _ in 1:500]), dims = 2)

関数値の範囲を利用した手法 5

関数値の範囲を利用する場合はまずデータから各独立変数ごとに平均 $\bar{x}_{1} , \cdots , \bar{x}_{n}$ を求め、次に次のように $i$番目の独立変数だけを変えてすべての関数値を計算する。 $$ Y_{i} = \left\{ f \left( \bar{x}_{1} , \cdots , x_{i} , \cdots , \bar{x}_{n} \right) : x_{i} \in X_{i} \right\} $$ ここで $X_{i}$ は $i$番目の独立変数から得られるすべてのデータ集合を意味する。そして次のように $i$番目のレンジ $R_{i}$ を定義する。 $$ R_{i} = \max Y_{i} - \min Y_{i} $$ レンジは負になり得ず、最終的に次のようにパーセンテージで $i$番目の独立変数に対する感度を算出する。 $$ S_{i} = \frac{R_{i}}{\sum_{j=1}^{n} R_{j}} \times 100 \left( \% \right) $$

この方法は領域がハイパーキューブの形でなくても使用でき、ある入力に対して出力が変化するかを相対的に評価するため解釈が容易という利点がある。しかし入力変数の平均 $\bar{x}$ を固定する点で領域全体を考慮したとは言えず、その $S_{i}$ 自体は意味がない点に注意する必要がある。

実装

以下は範囲ベース手法を줄리아で実装したものである。

x̄ = mean.(eachcol(data[:, last(vrbl)]))
R_ = []
for k in 1:n
    X̄ = stack(fill(x̄, nrow(data)))
    X̄[k, :] = data[:, last(vrbl)][:, k]
    push!(R_, [extrema(only.(f.(eachcol(X̄))))...])
end
R = only.(diff.(R_))
R = R ./ sum(R)

  1. Saltelli, A., Ratto, M., Andres, T., Campolongo, F., Cariboni, J., Gatelli, D., … & Tarantola, S. (2008). Global sensitivity analysis: the primer. John Wiley & Sons: p1. ↩︎

  2. Saltelli, A., Ratto, M., Andres, T., Campolongo, F., Cariboni, J., Gatelli, D., … & Tarantola, S. (2008). Global sensitivity analysis: the primer. John Wiley & Sons: p110. ↩︎

  3. Naozuka, G.T., Rocha, H.L., Silva, R.S. et al. SINDy-SA framework: enhancing nonlinear system identification with sensitivity analysis. Nonlinear Dyn 110, 2589–2609 (2022). https://doi.org/10.1007/s11071-022-07755-2 ↩︎

  4. Campolongo, F., Cariboni, J., & Saltelli, A. (2007). An effective screening design for sensitivity analysis of large models. Environmental modelling & software, 22(10), 1509-1518. ↩︎

  5. Aneela Bibi, Hang Xu, Naeem Ullah; Intelligent prediction of non-Newtonian hybrid nanoparticle-enhanced fluid flow and heat transfer behaviours in a trapezoidal enclosure: Integrated simulation approach. Physics of Fluids 1 March 2024; 36 (3): 033610. https://doi.org/10.1063/5.0197679 ↩︎