logo

Sensitivity Analysis in Data Science 📂Data Science

Sensitivity Analysis in Data Science

정의 1

(주로 회귀문제에서) 입력과 출력이 있는 모델이 있다고 하자. 모델에서 출력 불확실성을 입력 불확실성의 서로 다른 소스에 할당하는 것을 민감도 분석이라 한다. 특히 모델을 함수의 형태인 $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

기초 영향 기법은 위와 같이 $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)$ 개의 점이 필요하고, 그 점들을 나열한 것을 궤적이라 한다. 이렇게 얻어지는 $EE_{i}$ 는 평균이 수렴할 때까지 $r$ 번 반복해서 계산되며, 최종적으로 $EE_{i}$ 의 평균값 $\mu_{i}$ 를 $i$번째 독립변수의 민감도로 해석한다. 한편 캄포롱고 등은 $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 ↩︎