Variable Importance in Random Uniform Forests

Saïp Ciss∗
January 18, 2015

Abstract(개요)

Random Uniform Forests (Ciss, 2015a) 는 학습 데이터에서 많은 무작위 추출(randomized) 그리고 가지 치지 않는(unpruned) 이진 결정 트리(binary decision trees)를 사용하는 앙상블 모델(ensemble model)이다. 이것은 Random Forests (Breiman, 2001)의 변형이고 그리고 이 문서에서, 우리는 변수 중요도(variable importance)가 Random Uniform Forests에서 어떻게 접근하는지에 초점을 맞추었다. 우리는 변수 중요도의 많은 측정법을 제공하고 그리고 그들이 어떻게 데이터를 설명하는데 도움을 주는지 보여주고 그리고 어떻게 예측 작업을 향상할 수 있는지 보여준다. Random Uniform Forests에서 변수 중요도의 주요 목적은 어떤 것이, 언제, 어디서 그리고 어떻게(which, when, where and how) 문제에 영향을 미치는지 접근해야 한다. 우리는 모델에서 정의된 것으로, 전체적으로 포괄적인 예제 그리고 많은 시각화 도구를 가지고 수 중요도의 측정의 상세를 제공한다. 이것들은 변수 중요도 기술(techniques)의 그림자처럼 보일 것이다. 그리고 설명된 모든 도구는 randomUniformForest R 패키지에서 찾을 수 있다
Keywords : Random Uniform Forests, Variable importance, statistical learning, machine learning, ensemble learning, classification, regression, R package.

1 소개(Introduction)

기계 학습 도메인에서, 변수 중요도는 해결하기 위해 필요한 하나의 문제에 관계되는 모델의 이해와 변수를 설명하는 방법에서 증가하는 부분이다. 병렬처리를 위해, 선형 모델에서 특히 통계적 가설을 가질 때, 예측 작업이 완료되면 어떻게 공변량(covariates)이 예측을 어떻게 명하는지 알 필요가 있다; 정보는 통상적으로 회귀 작업의 계수에 접근함으로써 얻는다. 실 세계 문제에서, 버튼을 누르는 사람에게 분명한 정보를 제공해야 하기 때문에 이 작업이 필요하다. 게다가, 변화가 발생하면, 참 응답에서 오는 예측 편차, 모델은, 적어도 전역 설명(global explanation)을 제공해야 할 것이다. 예로, 산업 공정에서 기본값을 찾을 때, 어느 공변량(다른 것과 연결)이 가장 많이 기본값을 유도하는지는 예측 작업에서 동반되는 작업이다. 통계적 가설은 실세계의 특별한 경우를 제외하고 종종 기대 이상으로 유용하다. 비-선형 그리고 비-모수적 모델일 때, 데이터에서 찾아야만 하는 유용성으로 오로지 매우 적은 가설이 필요하다. 모델이 또한 무작위일 때, 변수 중요도 같은 개념은 모델과 데이터 둘 모두에 의존한다. 패러다임은 만약 예측이 일정하고 변수 중요도가 모델과 데이터 둘 모두에 의존한다면, 그러면 변수 중요도는 또한, 적어도, 일정하다는 것을 나타낸다.
Bagging (Breiman, 1996) 또는 Random Forests (Breiman, 2001) 같은 앙상블 모델에서, Breiman은 문제와 관련하여 공변량의 중요도, 모델 그리고 데이터에 접근할 수 있는 측정법을 소개했다. Friedman (2002) 또한 중요도 측정법, 부분 의존(partial dependence), 링크(link)를 허용, 대부분 직접적으로, 예측과 어떤(또는 많은) 공변량 측정을 제공했다. 이 글에서, 우리는 이러한 개념을 확장하고 Random Uniform Forests로 그들을 정의한다. 앙상블 모델은 변수 중요도 측정에 적합하다, 적어도, 3가지 근거:
  • 그들은, 보통, 랜덤 모델. 그러므로 첫번째로 기대되는 것은, 공변량 혹은 공변량과 목표 사이의 랜덤 관계(random relation)를 가져야 한다. 만약 이것이 발생하지 않으면, 정보를 강하게 동인하는 관계의 신뢰성을 고려해야 할 것이다.
  • 앙상블 모델은 많은 기본 학습자를 사용한다, 그러므로 이 데이터를 통해서 데이터를 평가할 수 있다, 충분한 정보를 동인함.
  • 그들은, 보통, 데이터에 대해서 매우 적은 가설을 가진다 그리고 같은 분석에서 많은 수의 변수를 다룰 수 있다.
우리는, 먼저, 2 절에서 Random Uniform Forests의 빠른 개요를 제공한다. 3 절에서, 우리는 전역 변수 중요도(global variable importance)에 대해 설명한다. 4 절에서 부분 중요도와 공변량 사이의 관계를 이끄는 지역 변수 중요도(local variable importance)를 설명한다. 5 절에서 부분 의존도를 얻을 수 있는 다른 대안을 제공한다. 6 절에서 2개의 실제 데이터셋에서 완전히 포괄적인 예를 제공한다 그리고 7 절이 결론이다.

2 An overview of Random Uniform Forests

Random Uniform Forests는 Breiman’s Random Forests에 근접하지만 이론과 알고리즘 수준에서 많이 다르다. 가장 중요한 하나는 random cut-points의 사용이다. 더 분명하게, Random Uniform Forests는 상당히 단순하게 설계되었다 그리고 전역 최적화의 어떤 종류로 데이터를 말하도록 한다. 점진적인 학습(incremental learning), 비감독 학습 또는 Bagging 같은 모델 또는 전체적인 무작위 트리의 앙상불 같은 기술을 허용하도록 충분히 가변적으로 설계되었다.
형식적으로, Random Uniform Forest는 무작위 균등 결정 트리(random uniform decision trees), 비-가지치기(unpruned) 그리고 연속적인 균등 분포(continuous Uniform distribution)를 사용하는 이진 랜덤 결정(binary random decision trees) 트리 의 앙상블이다. Dn = {(Xi, Yi), 1 ≤ i ≤ n}를 고려하자, 관측과 훈련 표본의 응답에 상응, (X, Y)가 ℜd × ν-값 무작위 쌍, i.i.d. 가정과 관련됨. 간결하게 하기 위해, Y ∈ {0, 1} 고려, 그러면, 이진 분류의 경우를 가정하자. 무작위 균등 결정 트리(random uniform decision tree)의 결정 규칙은 다음 식으로 작성될 수 있다.
A는 현재 종료 그리도 최적 범위(region) (노드), 재귀 분할 스킴(recursive partitioning scheme)에서 나옴.
gp는 트리의 결정 규칙.
회귀에서 우리는 다음으로 쓸 수 있다:
각 가능한 범위(region)을 정의하기 위해, 그리고 종료 하나, 우리는 변수와 cut-point가 필요하다 (하나의 경계를 넘는 하한과 상한 임계점 그리고 그것의 보완적인 하나를 정의했다). A는 random uniform decision tree의 최적 범위(optimal region)로 나타낸다: 만약
다음의 경우, 분류에서:
회귀에서
정보 획득 함수(Information Gain function) IG, 그리고 유클리드안 거리 함수(Euclidean distance function) L2를 가짐.
각 후보 변수의 지지도의 사용은 필요하지 않다는 점에 주목하라, 보다 편리하다, 특히 분류에서. IG와 L2는 반복 분할의 각 단계에서 가장 좋은 무작위 최적 노드를 선택하게 하는 특징이다. 우리는 다음을 얻는다:
H는 Shannon entropy (우리가 자연 로그를 가지고 그것을 사용함에 주목), 그리고
정의에서, 0 log 0 = 0, 그래서 H(Y) ≥ 0 을 가짐.
라 놓자, 그러면
그리고
회귀에서, 우리는 L2(j, Dn)를 다음으로 정의:
결정 규칙 정의가 남아있다, , Random Uniform Forest 분류기:
그리고 회귀에서:
Random Uniform Forest는 Breiman’s Random Forests의 모든 특징을 상속한다, 특히 수렴 그리고 Breiman’s 경계(bounds). 그들의 주요 이론적 주장은 트리 (또는 트리 잔차)의 낮은 상관관계를 달성하는 반면 평균 분산은 너무 많이 증가시키지 않는 것입니다. 그런데 한가지 더 자세한 내용(Ciss, 2015a)을 얻을 수 있다, 이 글에서 변수 중요도 개념을 연결할 수 있는 주요 주장은 IG와 L2에 근거한다.

3 Global Variable Importance

Random Forests에서처럼, 우리는 변수의 평가로 더 깊이 들어가기 전에 변수 중요도를 위한 비슷한 측정법을 제공한다. 우리는 이것을 전역 변수 중요도(global variable importance)라 부른다, 최적 기준을 직접적으로 사용하여 측정됨. 만약 VI가 중요도의 점수이면, 우리는 j번째 변수를 가진다, 1 ≤ j ≤ d, 최적이면 j*라 명명함.
그리고, 회귀에서
kb가 b 번째 트리에서 범위의 수인 경우, 1 ≤ b ≤ B.
우리는, 그러면, 계산되는 상대 영향(relative influence)을 정의하고 그리고 전역 변수 중요도(global variable importance) 측정법으로 알려진다.
variable importance는 모든 노드와 모든 트리에서 측정된다, 모든 변수가 값을 가지게 함, 분할 점(cut-points)는 무작위이기 때문. 따라서 각 변수는 선택될 동일한 기회를 가지지만 만약 각 노드에서 엔트로피가 가장 많이 감소하는 하나의 경우에만 중요도를 갖는다. 회귀의 경우에서, 중요한 변수는 실제로 그 자리를 차지해야 하므로 L2함수의 가장 낮은 값이 각 노드에서 선택된다, 트리가 더 깊어짐에 따라 점점 더 작아짐. 전역 변수 중요도는 예측 에러가 가장 낮은 변수를 생성한다 그러나 그것은 우리에게 어떻게 하나의 중요한 변수가 그 응답에서 영향을 주는지 어떤 것도 알려주지 않는다. 우리는 알기를 원한다, 예를 들어, 대부분을 차지하는 하나의 분류에 영향을 주는 특징 또는 Y의 높은 실현으로 이끄는 특징, 회귀의 경우에. 또는 우리는 변수의 상호작용에 대해 알기를 원할 것이다.

4 Local Variable Importance

정의(Definition). 예측자는 첫번째 순서에서 지역적으로 중요(locally important)하다 만약, 같은 관측에서, 그리고 전체 트리에서, 그것은 종료 노드에서 가장 높은 발생 빈도를 가지는 하나이다.
LVI(b)(j, i)를 주목, i-번째 관측의 지역 중요도 점수 그리고 X의 j-번째 변수, b-번째 트리에서,
  • LVI (j, i), 모든 트리에서 점수,
  • LVI (j, .), 모든 관측에서 X의 j-번째 변수의 점수,
  • R(j, αj) = {X | X(j) ≤ αj}, X(j)에 대해 모든 관측 값이 αj보다 작은 후보 종료 범위(candidate terminal region),
  • c(j, αj) = {X | X(j) > αj}, 보완적인 범위.
단순하게, 우리는 분류에 의존하여 LVI(b)(j, i)를 정의
위의 관계는 변수가 종료 노드(leaf node)로 떨어질 때 셈을 표현한다, 어떤 트리와 어떤 관측이 관계되는지. 이 표현에서 첫번째 조건은 우리에게 셈하는 변수는 리프(leaf)로 이끄는 노드에서 최적이여야 한다는 것을 말한다. 두번째와 마지막 조건은 두개의 가능한 잎(leaf node) 노드 중 하나를 셈하는 것을 표현한다, 트리가 데이터를 동인하는 경우. 따라서, j-번째 변수에서 우리는 j-번째 관측이 떨어지는 잎에서 최적이 될 때만 그것을 셈한다. 더 분명하게 하기 위해, LVI 함수는 잎으로 이어지는 변수를 셈하고 그리고 관측이 떨어질 위치에만 의존하여 이런 변수를 찾는다. 우리는 훈련 딱지( training labels)를 사용하지 않음에 주목할 수 있다, 그러므로 오로지 forest 그 자신에 의존하는 모든 측정을 원한다. 다음으로 주어진, 모든 트리 함수 LVI(j, i)에서 셈할 수 있음을 알고 있다
그리고 모든 트리와 관측 그리고 j-번째 변수는,
다음 단계는 j-번째 변수가 두번째, 세번째, 또는 더 많이 나타날 수 있는지 고려하는 것이다, 모든 점수를 셈하고 그리고 그들을 정열 했을 때 다른 모두에서 위치. 주목, 여기서, 위치와 순서는 같은 조건을 나타낸다. 예로, 하나의 변수는 관측의 절반의 두번째 위치에서 그리고 다른 반의 마지막 위치에서 나타날 것이다. 우리는 관측에 너무 근접하는 것을 원하지 않는다, 그러므로 실제로 검증 집합의 접근은 훈련 집합에서 (만약 많지 않으면) 접근하는 만큼 중요하다. 그래서, LVI(j, .) 계산으로 지역 점수를 단지 집계하는 대신에, 우리는 변수가 만약 그것이 높은 순위를 가지면 전체 트리와 전체 관측에서 지역적으로 중요하다고 고려한다. 과정은 따라오는 절차로 정의되었다.
  1. 각 관측과 변수에서, 우리는 LVI(j, i)를 계산하고 그리고 높은 발생 수를 가지는 변수의 이름을 보고한다, 그러면 두번째로 높은 빈도 수를 가지는 변수의 이름 등등.
  2. 첫번째 단계는 우리에게 테이블을 제공한다, n 관측과 d 컬럼을 가짐. 각 행에서 우리는 높은 발생 빈도수를 가지는 변수에서 가장 낮은 값을 가지는 변수 까지 정열된 변수의 이름을 가진다. 단지 변수의 이름만 보고되고, 그러므로 각 컬럼은 position이라 불리는 메타-변수이다 그러므로 그것은 각 관측에서 어떤 변수의 순위를 제공한다.
  3. 세번째 단계는 변수가 위치(position) q에 얼마나 많은지 셈한다, 1 ≤ q ≤ d. 어쨌든, 우리는 알기를 원한다, 만약 우리가 j-번째 변수가 어떤 값인지 알기 위해 위치 q를 선택한다면. 이 함수를 위치 q, 1 ≤ q ≤ d, 에서 지역 변수 점수(local importance score)라 부른다. 모든 관측 그리고 j-번 째 변수에서 SLIq(j, .). 이것은 다음으로 정의된다

    LVI(d – q + 1)은 LVI 함수에서 (d – q + 1)-번째 요구 통계량, 어떤 단일 관측에서 모든 변수를 요구함. 그러므로, 우리는 만약 j-번째 변수의 위치 q를 선택하면, 우리는 j-번째 변수가 위치 q에 오는 모든 경우(모든 트리와 모든 관측)에 일치하는 점수를 얻는다. 그러나 우리는 d 변수를 가진다, 그래서 그들 중 어떤 것의 점수를 아는 것은 우리에게 가장 큰 지역 중요도를 알려주지 않는다, 왜냐하면 우리가 고정한 위치이고 모든 변수를 고려할 때 실제 위치가 아니기 때문.
  4. 그러므로, 마지막 단계는 가장 큰 영향에서 가장 작은 영향까지 순위를 매긴 모든 지역 변수 중요도 변수를 얻어야 한다, 우리에게 허용함, 그런데, 공변량 사이의 상호작용을 정의하기 위해. j-번째 변수의 실제 위치 (그것의 순위), 고정된 위치 q, 다음으로 주어진다

    q*j의 계산은 변수가 동일한 고정 위치 q에서 다른 변수의 영향과 그것을 비교할 때 오로지 영향을 줄 수 있음을 의미한다. 이것은 전역 변수 영향에서 정의된 상대적인 영향이 동일한 민감도로 지역 중요도라 함축적으로 정의한다. 예로, q*j = 1, 첫번째 정의 q가 모든 변수에서 1이 됨을 의미, 그러면 j-번째는 첫번째 요구에서 가장 큰 지역 중요도이다.

4.1 Partial importance

부분 중요도(Partial importance)는 표기(label) Y가 고정되었을 때 공변량의 중요도에 접근하는 방법이다(또는 회귀의 경우에 임계점 상한 또는 하한의 Y의 실제 값에서).
정의(Definition). 예측자는 부분적으로 중요하다 만약, 동일한 관측과 하나의 분류, 그리고 다른 모두에서, 그것은 종료 노드에 가장 높은 빈도를 가지는 하나이다.
위의 정의 또한 회귀의 경우에도 일치함에 주목. 부분 중요도의 점수는 다음으로 주어진다
부분 중요도를 이해하기 위해 2개의 요점으로 접근 해야한다:
  1. 예측자의 발생 건수의 셈은 흥미롭다 그러나 단지 비도 수를 제공한다,
  2. 종료 노드에서 만나는 각각의 관측에서, 우리는 분류기로 추정된 값을 기록한다. 이것은 우리에게 강도를 제공한다(또는 분류의 경우에 표기).
그러므로, 우리는 각 관측에서 어떤 공변량의 점수를 가진다, 모든 위치에서, 그리고 분류기는 추정한다. 그러면, 부분 중요도가 제공된다, 각 분류에서 또는 임계점 위(또는 아래)의 어떤 응답에서, 가장 높은 상관을 가지는 예측자. 다시, 우리는 모덜에 더 근접한 상관 점수를 계산한다. 명백히, 부분 중요도는 (회귀) 응답의 변화를 설명하는 변수가 무엇인지 말한다 또는 하나의 분류가 다른 (분류)보다 더 잘 설명. 이것은 우리에게 전역 변수 중요도에 관하여 새로운 정보를 제공한다. 우리가 후자의 범위를 볼 때 어떻게 공변량이 응답 벡터를 설명하는지 관찰 할 수 있는 회귀 분석에서 흥미로운 경우가 있음을 알 수 있음에 주목.

4.2 Interactions

그러나 우리는 공변량이 그들 모두를 고려할 때 문제에 어떻게 관여하는지 알기를 원할 것이다. 예로, 어떤 공변량은 문제에서 낮은 상관 영향을 가질 것이다 그러나 더 많은 공변량에는 강한 영향. 또는 이 공변량은 다른 것들과 많은 상호작용을 가질 것이다, 변수에 영향을 끼침. 그래서, 우리는 상호작용(interactions)을 위한 정의가 필요하다.
정의(Definition). 예측자는 다른 하나와 상호작용한다 만약, 동일한 관측에서, 그리고 모든 트리에서, 둘 모두 각기 종료 노드에서 첫번째 두번째의 높은 발생 빈도를 가진다.
만약 VII가 상호작용의 점수이면, 우리는 X(j)와 X(j')를 가진다,
값 1과 2는 첫번째 두번째 순서를 나타내고 그리고 상호작용 순서에서 첫번째로 오는 어떤 변수(2개)를 찾기 위해 첫번째 계산 q*j와 q*j’로 주어진다. 그러면, 가장 중요한 변수에서 우리는 SLI1(j, .)라 정의한다, j 는 고정, 그리고 고정 위치 q = 2에서 그리고 남은 d – 1 변수에서 j’-번째 변수는 선택. 만약 첫번째와 두번째 순서를 얻지 못하면, 그러면 상호작용은 2개의 변수에서 널(null)이 될 것이다. 상호작용(Interactions)은 유일한 수단으로 모든 공변량의 영향을 보기 위해 시각화 도구로 동작한다.
마지막 단계는 VII(1, 2)(j, j’)를 계산하고 그리고 VII(1, 2)와 VII(2, 1)의 모든 변수를 표현하는 분할표(contingency table)를 생성한다. 이것은 모든 공변량의 상호작용 시각화 도구(interactions visualization tool)를 제공한다. 게다가, 세분화된 뷰를 가지는 낮은 영향도를 가지는 공변량을 병합할 수 있다. 상호작용은 어떻게 모든 변수가 어떤 쌍의 공변량에서 문제에 의존하는지 큰 그림을 제공하기 때문에 관심이 있다.
그들은 또한 상호작용에 기반한 변수 중요도 측정을 유도한다, 다음으로 주어짐:
우리는 여기서 j-번째 변수에서 상호작용에 기반한 변수 중요도는 어떻게 이 변수가 다른 모든 변수와 의존성을 가지는지 그리고 어떻게 그것이 지역 변수 중요도에 영향을 가지는지를 측정한다.
우리가 소개한 요점은, 지역 변수 중요도에 의존하는 모든 측정에서, 우리는 관측 전체에서 평균 점수를 원하지 않는다, 그러므로 forest classifier 는 관측, 차원 그리고 트리를 언급한다. 더 일반적인 뷰를 얻기 위해, 위치에 기반한다, 각 변수가 단일 관측에서 측정을 계산되는 매 번 획득된 순위에 의존하는 영향을 의미, 전체 트리를 사용. 순위는 1부터 변수의 전체 수까지 이다 그리고 높은 순위는 단순히 높은 발생 수이다. 그러면, 순위는 우리가 얻은 측정에서 유도되는 모든 관측은 일반화된다.

5 Partial dependencies

이것들은 어떻게 각 공변량(또는 공변량 짝)의 영향이 응답 변수에 영향을 미치는지 측정하도록 허용하는 도구이다, 모든 다른 공변량 값을 알고 있음. 더 명확하게, 부분 의존도 플롯은 응답 값에서 공변량의 한계 효과(marginal effect) 이다. 부분 의존도(partial dependence)의 아이디어는 Gradient Boosting Machines (GBM)에서 그것을 사용한 Friedman (2002)으로부터 나왔다; 그러나 Random Uniform Forests에서 다르게 구현되었다.
pD(j)q를 j-번째 변수의 위치 q에서 부분 의존도라 하자. 우리는 다음을 가진다:
는 각 관측에서 평가된 포레스트 분류기(forest classifier)인 경우, j-번째 변수는 현재 추정된 관측에서 지역 중요도를 알고 있음. 지역 중요도는, 그래서 모든 점에서 SLIq 함수로 나타낸다. 예측을 위한 종료 노드에서 단순히 보기에 다른 무엇은 공변량은 각 관측에 영향을 미친다는 것이다. 그러므로 예측된 값과 관측 둘 모두 값이 더 이상 이용 가능하지 않는 어떤 점까지 부분 의존도 플롯에 강조될 것이다. 공변량과 목표값 사이에 너무 약한 관계가 있는 것을 피하기 위해, 전체 순서로 부분 의존 함수를 정의한다. 다음으로 주어짐:
함수는 공변량의 모든 범위에서 필요한 모든 포인트를 제공하고 그리고 무작위로 증가한다. 각 포인트 X(j)i는 의존도에 접근하기 위해 forest classifier의 적어도 d 값을 가질 것이다. 이것은 더 일관적이고 해석 가능한 결과를 얻는 이점을 가진다. 만약 공변량과 목표가 관계가 없으면, 표현된 포인트는 맵(map)에 균등 분포(Uniform distribution)를 가질 것이다. 그렇지 않으면, 그들의 관계의 형상을 얻을 것이다. 부분 의존도에서 흥미로운 점의 하나는 추청을 가능하게 하는 그들의 능력이다. 나중에 Random (Uniform) Forests의 한계로 알려진다 왜냐하면 그들의 추정자는 훈련 표본에서 Y의 범위를 넘어서는 보이지않는 값을 만들 수 없다. 부분 의존 함수에서 모수적 모델의 꼬리를 계산해야 한다. 일반적으로 이들은 선형 모델이 좋은 근사(approximation)를 넘어서는 올바른 임계점을 선택하기 위해 공변량과 추정(covariate and extrapolation)을 가지는 선형이 될 것이다. 다수의 공변량이 영향을 미치면, 다차원 부분 의존 함수에서 모수적 모델을 결국 계산할 수 있다. Random Uniform Forests의 주요 주장은 그들이 추정(extrapolation)과 닮은 그런 목적을 위해 많은 특징을 가진다.
우리는 여러 가지 방법으로 변수의 중요성을 평가하는 많은 방법을 제공했으며 큰 그림을 얻기 위해 한 화면에서 대부분을 시각화 할 수 있다. 그것은 선택과 해석 모두에 연결된다. 우리의 관점에서 볼 때, Random (Uniform) Forests는 블랙 박스가 아니기 때문에 이 후자의 점은 필수적이다. 그러면 Random Uniform Forests에서 주요 특징을 요약할 수 있다.
  1. 제공되는 모든 도구는, 전연 변수 중요도 제외, 훈련과 검증 표본 둘 모두에서 동작한다. 그 결과로, forest classifier를 제외한 표기 (또는 응답)을 사용하지 않는다.
  2. 모든 도구는 보완적이다. 특징이 중요한 것으로 판명되었을 때를 의미한다. 설명은 각 측정을 분리하여 사용하거나 또는 그들을 결합할 때 찾을 수 있다.
  3. 변수 중요도의 주요 목적은 어떤 것, 언제, 어디서 그리고 어떻게 공변량이 문제에서 영향이 있는지 접근할 수 있어야 한다.
  4. Random Uniform Forests 참조에서, 우리는 따라오는 전략으로 변수 중요도를 정의할 수 있다: importance = contribution + interactions, 분포가 예측 에러에서 변수의 영향(모든 영향이 상대적)인 곳에서 그리고 상호작용(interactions)은, 적어도, 다른 공변량에 그것의 영향이다.

6 Experiments

이 절에서, 다양한 시각화 도구와 아래에 설명된 측정 방법을 제공한다. 재현성을 높이기 위해, 모든 R 코드는 실세계 데이터셋으로 분류와 회귀 둘 모두가 제공되었다.

6.1 Classification

분류에서, UCI repository에서 자유롭게 접근 가능한 자동차 평가(Car evaluation) 데이터셋을 선택했다. 또는 randomUniformForest 패키지에 있음. 데이터셋은 1728개의 행, 6개의 속성, 모두 범주형, 그리고 4개의 식별(class)을 가진다. 작업의 목적은 개별 자동차(행으로 주어짐)를 구별해야 한다, unacceptable (unacc, 수용 불가), acceptable (acc 수용), good(좋음) or very good (vgood, 매우 좋음). 변수는 buying, priceOfMaintenance, nbDoors, nbPersons, luggageBoot, safety이다. 변수 중요도의 맥락에서 우리는 공변량이 하나의 식별 또는 다른 식별을 어떻게 구분하는지 알기를 원한다. randomUniformForest은 확률론적임에 주목해야 한다. 그러므로, 같은 (데이터 그리고 ) 시드에서 조차 완벽하게 재현할 수 없을 것이다; 어쨌든, 수렴은 발생하고, 분석을 변경할 필요가 없는 단지 약간의 변화가 있을 것이다.
먼저, 우리는 (설치하고 그리고) R 소프트웨어(>= 3.0.0) 하에 패키지를 적재한다.
# Install package
install.packages("randomUniformForest")

# load it
library(randomUniformForest)
그다음, 데이터를 로드하고, 표기 열(labels column)을 추출하고, 데이터의 무작위 하위 집합을 가지고 그리고 모델을 훈련시켜라. 범주형 변수를 처리해야 함에 주목.
data(carEvaluation)
XY = carEvaluation
classColumn = ncol(XY)
Y = extractYFromData(XY, whichColForY = classColumn)$Y
X = extractYFromData(XY, whichColForY = classColumn)$X

# view a summary
str(X)

# or summarize
summary(X)
# see the distribution of the labels
table(Y)

# then train the model, using a subset (half) of the data
set.seed(2014)
n = nrow(X)
subsetIdx = sample(n, floor(n/2))
car.model.ruf = randomUniformForest(X, Y,
subset = subsetIdx, ntree = 500, categoricalvariablesidx = 1:6)
forest에서 트리의 수를 선택함에 주목, ntree, 500, 그리고 각 노드의 추출될 특징의 수는 기본값이다, ‘4/2 × dimension’. 이후에 우리는 선택해야 한다, 무작위로 교체되는, 8개의 후보 노드에 상응하는 8개의 변수, 트리 성장의 각 단계에서 최적의 무작위 노드를 얻기 위해 (최적화 기준 사용) 선택될 단지 하나의 변수로부터.
categoricalvariablesidx = 1:6 사용은 범주형으로 모든 변수를 고려하라고 알고리즘에 강요한다, 이것은 이런 변수에 전용인 엔진을 사용하도록 한다. 정밀도는 약간 떨어질 것이다, 순수한 숫자형으로 변수들이 처리되었을 때와 비교, 그러나 변수 중요도 평가는 전체 과정에서 일정하게 될 것이다.
평가 결과를 볼 수 있다, 훈련 모델을 호출하여:
car.model.ruf
  • 그러나, 우리는 공변량 평가에 관심이 있기 때문에, 2개의 블록에 있는 global Variable Importance를 보자:
    summary(car.model.ruf)
    
    #displays :
    
    Variables summary:
               variables score class class.frequency percent percent.importance
    1 priceOfMaintenance  3171 acc              0.51  100.00                 26
    2             buying  2736 acc              0.50   86.27                 23
    3            nbDoors  2335 acc              0.50   73.64                 19
    4        luggageBoot  1962 acc              0.48   61.87                 16
    5          nbPersons  1353 unacc            0.46   42.66                 11
    6             safety   555 unacc            0.85   17.51                  5
    
    이 첫번째 테이블은 모든 변수의 전역 변수 중요도의 점수를 제공한다, 각 변수의 주요 분류와 빈도 그리고 상관 영향. 여기서 요점은 덜 영향이 있는 safety(안전성)이다, 모든 분류를 고려했을 때, 가장 큰 변수, 훨씬, 수용 불가능한(unacceptable) 자동차를 고려한 경우. 변수 중요도는 합이 1일 필요가 없음에 주목할 수 있다, 각 변수는 다른 변수와 분리해서 고려도기 때문이다, 주요 분류를 보기 보단 첫번째 변수의 중요도 점수를 얻음. 분류와 변수 사이의 연결은 Random Uniform forests에서 중요하다. 그러나, 우리에게 전역 변수 중요도의 전체 플롯을 첫번째로 보게 한다.

    Figure 1: Car evaluation 데이터셋에서 (하위 집합의) 전역 변수 중요도

    이 플롯은 단순하게 앞의 테이블에서 추출했다, 모든 변수가 같은 영향도를 가진다면 각 변수의 중요도가 있는 위치를 가리키는 회색의 수직선을 가짐. Breiman's Random Forests에서 결과를 가지고 이 플롯과 비교하면 가장 중요한 변수로써 safety와 nbPersons이 보일 것이다. 만약 우리가 분류 분포를 계산하면, unacceptable 자동차는 가장 큰 비도(사건의 69%)이고 그리고 위의 테이블에서 보여주는 것처럼, 분류 당 사건의 수가 얼마나 많은지 궁금할 것이다. Random Uniform Forest에서 관점은 예측과 분류 분포 측면 모두 계산이다.
    • 전역 변수 중요도 플롯은 분류 분포에 거의 의존하지 않고 가장 잘 예측하는 변수의 영향을 보여주는 측정이다.
    • 전역 변수 중요도 테이블은 각 변수가 분류에 어떻게 의존하는지 보여주는 측정과 유사하다, 동일한 예측적 관점에서.
    그러므로, 각 분류의 빈도에 따라 변수를 정렬한 테이블을 요구하면 randomForest 알고리즘과 동일한 순서를 얻는다.
  • 다음 단계는 큰 그림을 얻어야 한다. 간단한 결과 플롯보다 알고리즘의 중요도(importance) 함수를 호출해야 한다. 이 함수는 검증 집합을 적용한다.
    car.importance.ruf = importance(car.model.ruf, Xtest = X[subsetIdx,],
    maxInteractions = 6)
    # that leads to many details which can be summarized with :
    plot(car.importance.ruf, Xtest = X[subsetIdx,])
    
    아래의 명령은 기본이다, 그리고 세분화 정도를 조절할 수 있다. 특히 maxInteractions의 큰 값 사용은 상세(지역 변수 중요도의 파라메터 q )에 가능한 더 가깝게 한다. 우리는 앞에서 정의되고 설명된 도구에 해당하는 그림(R 메뉴의 사용 필요, 윈도우를 수직으로 바둑판 모양으로 정열, 모든 그림을 보기 위함)을 얻을 것이다.
    첫번째 플롯은 아래에 보이는 상호작용 시각화 도구(interactions visualization tool)이다:

    Figure 2: Car evaluation datase의 (하위집합의) 공변량간 상호작용

    위에 플롯은 모든 공변량에서 1차와 2차 순서로 상호작용을 제공한다, 우리가 정의한 상호작용에서. 그림의 영역은 하나의 상호작용이다. 1차 순서는 공변량(영향도 내림차순으로 정열)은 만약 결정이 첫번째 그것에서 오직 하나의 변수를 취해야 한다면 가장 중요하다, safety는 처음에 있다, 자동차를 평가할 때 평가하는 첫번째임을 의미한다. 2차 순서는 만약 알지 못하는 변수가 1차에서 이미 선택 된다면, 그러면 두번째 가장 변수는 2차 순서에서 이들 중 하나가 됨을 의미한다. 2차 순서에서 buying (price)는 첫번째 있다, 가장 중요한 변수가 선택되고 알지 못한다면, buying 은 2차 가장 중요하게 될 것이다.

    더 분명하게, 상호작용은 가능성으로 정렬된 테이블을 제공한다. 1차 순서는 가장 중요한 변수로 정렬된 순서를 제공한다. 2차 순서는 두번째 가장 중요한 변수로 정렬된 가능성를 제공한다. 변수의 짝 교차는 모든 가능한 상호작용에서 그들의 상대적인 상호작용을 제공한다. 그것들은 모델과 데이터 의존 둘 모두 측정함에 주목해야 한다. 그러므로, 측정에서 신뢰도는 예측에서 신뢰도를 직접적으로 나타낸다. Others features 명명된 메타-변수가 나타남에 주목한다, 알고리즘에 시각화의 기본 뷰에 보이도록 명령함을 의미, 덜 연관있는 변수의 그룹화.
  • 상호작용은 그들의 상대 상호영향으로써 변수의 순위를 매긴 그들의 변수 중요도 측정에 나타난다. 아래에 보여줌:

    Figure 3: Car evaluation datase의 (하위집합의) 상호작용에 기반한 변수 중요도

    위의 그래프는 각 변수가 어떤 다른 변수와 그것의 상호-영향을 집계했을 때 어떻게 표현되는지 보여준다. 한가지 중요한 사실은 첫번째 변수가 가장 중요하지 않지만 다른 변수와 가장 큰 상호-영향을 가지는 변수라는 것이다.
  • 우리는 집계된 상호작용이 각 구분(Class)에 어떻게 영향을 주는지 보기(View)를 제공하는 표기에서 변수 중요도(Variable Importance over labels)를 정의했다:

    Figure 4: Car evaluation 데이터셋에서 각 (고정된) 구분(fixed class)에 기반한 표기에서 변수 중요도

    safety는 수용 불가능한 자동차(unacceptable cars)와 강하게 연결되어 있다, 훨씬, 가장 중요한 구분(Class), 그래서, 상호 작용 또는 다른 연산(algorithm)에서 (전역) 변수 중요도의 최상단에 있다. 표기에서 변수 중요도는 지역 관점을 제공한다: 분류는 고정됨, 먼저 변수가 제약 조건 같은 문제나 영향을 확인하기위해 구분(Class)를 고정하여 결정을 내린다, 그러면 각 분류에서 변수 중요도를 볼 수 있다. 그러므로 각 변수는 다른 분류는 존재하지 않는 것과 같은 중요도를 가진다. 예로, 매주 좋은(vgood) 자동차는 문의 충분한 수와 짐을 싣는 공간을 넉넉하게 제공되는 변수이다. 그러나 그것을 얻기 전에, 자동차가 매우 좋은지 아닌지를 나타내는 (결국) 다른 변수로 결정을 이미 내렸다.
    여기서, 우리는 분류가 선택되게 이끄는 변수에 관심이 없다, 그러나 분류 내에서 문제가 되는 변수로써, 나중에 선택됨. 변수의 순서는 각 구별(Class)에서 그들의 순위로 연관되는 집계된 순위를 제공한다, 구별(Class)의 중요도를 고려함 없이. 예를 들어, nbDoors는 첫번째 나타난다 왜냐하면 그것은 각 구별 내에서 놓이기 때문이다. safety는 대부분 마지막에 온다 왜냐하면 그것은 하나의 구분(class)에서만 높은 순위를 가진다, 그 중요성에도 불가하고. 중요한 내용은 보여준 모자이크 플롯에서, 알고리즘은 보이는 변수와 관계된 값을 계산한다. 이것은 변수를 배제함으로써 정보를 획득할 수 있음을 의미한다. 그러므로 플롯은 buying 변수가 존재하지 않는 것처럼 보여준다. 그러나 나중에 마치 그것의 집계된 순위가 높거나 또는 우리가 그것을 특별하게 여기는 것처럼 보여준다.
  • 부분 의존도(partial dependencies)를 호출하기 전에, 부분 중요도를 요청함으로써 위의 플롯을 재검토해야 안다. 다른 말로, 부분 의존도가 만약 자기자신으로 구별(Class)을 고정하여 결정하면, 변수가 구분(Class) 내에서 얼마나 문제가 되는가?에 대한 동일한 정보를 얻을 것이다. 구분(Class) 당 하나의 R 코드 라인이 필요하다:
    car.partialImportance.ruf = partialImportance(X[subsetIdx,],
                                                  car.importance.ruf, whichClass = "good")
    
    Figure 5: Car evaluation(의 하위집합)에서 구분 good의 부분 중요도

    분류에서, 부분 중요도(partial importance)는 각 요청된 구분(class)에서 모든 변수를 보여주는 기본 인수(default parameter)를 덮어쓰는 점을 제외하면 표기에서 변수 중요도와 거의 동일하다. 우리는 이미 좋은 것으로 간주되는 차량을 평가하기로 결정할 때 buying이 두 번째 위치에 오는 것을 볼 수 있습니다.
  • 부분 중요도의 분석은 부분 의존도를 호출함으로써 더 깊게 들어갈 수 있다. 간결하게, 우리는 단일 변수를 위해 그것을 호출한다, 여기서는 safety.
    car.partialDependence.ruf = partialDependenceOverResponses(X[subsetIdx,], 
                                                               car.importance.ruf,
                                                               whichFeature = "safety", 
                                                               whichOrder = "all")
    
    Figure 6: Car evaluation 데이터셋(의 하위집합)에서 부분 의존도 플롯

    부분 중요도 플롯은 높은 세분화 수준을 제공한다, 그러므로 우리는 각 변수 내부로 접근한다, 각 구분(class)에 그것의 한계 효과(marginal effect)를 관찰함. 위에서 우리는 변수의 효과를 볼 수 있다, 가장 큰, 안전도의 가장 낮은 값인 unacceptable 자동차. 명백한 것처럼 보일 수 있지만, 알고리즘이 변수에 평가하는 방법의 결과라는 것을 너무 많이 기억한다. 다른 구분은 어떤 낮은 안전도를 평가하지 않는다, 다른 구분이 선택되었거나 관측되었다는 의미, 그것은 safety라는 장벽을 첫번째로 지나갈 것이다. 수용 가능하거나 좋은 자동에서 중간 정도의 안전도는 수용 가능할 것이다, 매우 좋은 자동차에서, 안전도(safety)는 높고 높은 수준이어야 합니다.
요약하면, Random Uniform Forests에서 변수 중요도는 세분화 정도가 고수준에서 저수준까지 있다. 먼저, 우리는 어느 변수가 중요한지 얻고, 각 구분(class)의 가중치와 비슷함. 그러면, 우리는 무엇이 그들에게 영향을 주는지 찾는다, 상호작용을 확인하고 첫번째로 변수를 선택되게 만드는 선택, 한번에 모든 구분을 고려함. 다음 단계는 어디서 그들이 영향이 나타나는지 알야야한다, 각 구분을 일단 고정된 상태에서 찾음. 마지막으로, 부분 의존도를 확인함으로써 언제 어떻게 변수가 문제가 되는지 얻은다. 모든 측정은, 전역 변수 중요도 제외, 훈련이나 또는 검증 집합에서 작동한다.

6.2 Regression

회귀에서, 절차는 연속적인 값을 계산하는 약간의 그래픽을 제외하면 대부분 동일하다. 간결함을 위해, 분류 예제 처럼 R 명령어나 플롯을 보여주지 않을 것이다.
우리는 UCI 저장소 또는 randomUniformForest 패키지에서 자유롭게 이용 가능한 콘크리트 압축 강도(Concrete compressive strength) 데이터셋을 선택했다. 데이터셋은 1030의 열과 9개의 속성을 가진다. 이 작업의 목적은 콘크리트 압축 강도의 평가이다 (“도시 공학에서 가장 중요한 물질”). 압축 강도는 예측자에 의존한다, Cement, Blast Furnace Slag, Fly Ash, Water, Superplasticizer, Coarse Aggregate, Fine Aggregate and Age. 로 명명됨. 변수 중요도 맥락에서 우리는 효과적으로 콘크리트 압축 강도를 생성하는 물질에 대해 알기를 원한다.
  • 우리는 회귀에서와 같은 동일한 분석을 사용했다, 무직위 하위집합(동일한 시드)을 얻음, 중요기본 인수를 가지는 모델 훈련(단 트리 집합의 수를 500으로 설정) 그다음 중요도 계산. 분류의 경우와 유일하게 다른 점은 평가 객체에 있다. 우리는 훈련 집합 보다는 검증 집합을 평가할 것이다.
    먼저, 전체 분석에서 나오는 전역 변수 중요도를 계산한다:

    Figure 8: Concrete compressive strength 데이터셋에서 전역 변수 중요도

    모델에 주어진 상대 영향은 GBM 또는 Random Forests와 일치한다, 첫번째 위치에 있는 순위 Age를 둘 제외. 그러므로, Random Uniform Forests에서, 분할점(cut-points)은 이것을 설명하는 응답에 독립적이다. 우리에게 상세가 어떻게 문제가 되는지 보여준다.
  • 우리는 상호작용(interactions)을 호출한다, 모두 가능한 예측자와 상호작용에 기반한 변수 중요도의 결과를 얻음. 우리가 검증 집합을 평가함을 기억, 상호작용은 다른 변수들(그리고 가장 중요한 변수가 아님)과 가장 큰 상호-영향을 가지는 변수를 보여준다.

    Figure 8: Concrete compressive strength 데이터셋에서 상호작용에 기반한 변수 중요도

    우리는 다른 변수들과 가장 큰 상호작용을 가지는 변수로써 Coarse Aggregate와Fine Aggregate을 확인한다. 실제에서, 콘크리트 압축 강도가 최대로 하기를 원한다면, 이런 변수들은, Cement와 Age처럼 결정적이지는 않지만, 어떤 설명을 도출할 것이다. 예로, 만약 콘크리트 압축 강도는 너무 낮다면. 우리에게 그것을 평가하는 부분 중요도를 호출하게 만든다.
  • 우리가 높게 또는 낮게 콘크리트 압축 강도를 이끄는 변수가 무엇인지 알기를 원한다고 가정하자. 훈련 집합에서 조건없이 콘크리트 압축 강도의 평균은 35.38(MPA, 압력 단위)이다 그리고 그것의 표준 편차는 16.86이다. 높은 콘크리트 압축 강도는 평균 + 표준 편차 보다 커야 됨을 우리에게 나타낸다; 낮은 것은 평균 – 표준 편차 보다 작음.
    우리는 다음 플롯을 얻는다:

    Figure 9: Concrete compressive strength 데이터셋에서 부분 중요도

    상호작용과 전역 변수 중요도는 지금 (부분적으로) 설명되었다. Coarse Aggregate와 Fine Aggregate는 낮은 압축 강도에 강하게 포함되었다, 하지만 Age (날짜)는 강도를 증가시키는 주요 성분이다. 어쨌든, 우리는 여전히 후자의 전체 범위를 어떻게 설명되는지 알지 못한다. 그러므로 모든 공변량은 콘크리트 강도를 획득하기 위한 혼합물의 일부이므로 올바른 선택을 하게 하는 값이 필요하다.
  • 관점을 얻기 위해, 우리는 각 고정된 변수에서 변수 중요도를 호출했다, 다른 변수들은 잊어버리고 그리고 응답(콘크리트 압축 강도)이 고정된 변수에서 어떻게 분포하는지 확인. 결과는 지역 변수 중요도 설계의 결과이다 그래서, 고정된 변수는 전체 forest가 평가되었을 때 다른 변수들이 무엇에 의존하여 발생하는지에 대한 결과를 보게 될 것이다.

    Figure 10: Concrete compressive strength 데이터셋에서 의존도

    위에서, 각 변수는 (알파벳 순서로) 보여진다 그리고 각 박스 플롯은 그 변수에서 압축 강도의 분포이다. 만약, 예로, 높은 값에 관심이 있다면 어떤 변수가 이 값으로 이어지고 변수의 사용을 중지해야 할 때를 간단하게 볼 수 있다. 더 분명하게, 위의 플롯은 부분 중요도 측정에서 나온다, 모든 위치에서 그리고 부분이 아닌 전체 응답 값의 범위에서 각 변수를 고려. 그러나 여전히 무엇인가 잘못되었다. 분포는 방향이나 잠재적인 예측자의 범위 어느 것도 제공하지 않는다.
  • 분석의 마지막 단계는, 그러면, 어떤 예측자와 결합하는지 종속 변수를 평가하기 위해, 변수들의 양쪽 범위 모두에서. 부분 의존도는 이러한 결과를 제공하는 도구이다. 우리는 모든 변수에서 또는 더 나은(또는 증가하는) 압축 강도로 이끄는 변수에서 그것을 플롯할 수 있다.

    Figure 11: Concrete compressive strength 데이터셋에서 부분 의존도

    부분 의존도는 고정된 변수 및 다른 변수의 모든 가능한 알려진 값에 따라서 압축 강도에 얼마나 포함되는지 보여준다. 5절에 주어진 정의에 따라, 변수는 고정된고 우리는 어떤 예측자가 이런 변수에 포함되는지 전체 forest에서 확인한다. Age에서, 우리는 압축 강도를 최고로 하는 최적 값을 얻는다, 하지만 그것은 시멘트 값에 따라 (평균에서) 증가 함수이다. Age에서, 이산 값으로써 그것을 표현하기로 선택한다. 부분 의존도는, Random Uniform Forests에서, 변수가 어떻게 평가되는지에 대해 추가적인 층(layer)을 사용함으로써 포인트의 최대값을 얻도록 설계되었다. 이것은 보간(interpolation), 외삽(extrapolation, 새로은 패러다임의 훈련 모델 또는 꼬리와 결측 값의 전가를 결합하는 모수적 결합을 요구), 그리고 모든 변수에서 모델 의존도(모델 연결부)를 제공하는 상당히 유연한 도구가 되도록 한다, 하지만 현재 구현에서는 쌍으로 제한되지만.

    Age와 Cement의 (보간을 사용) 의존을 우리에게 보여준다:

    Figure 12: Concrete compressive strength 데이터셋에서 Age와 Cement의 부분 의존도

    2개의 변수 간에 의존도를 어떻게 이끄는지 보여준다, 평균에서, 압축 강도를 향상하기 위해. 변수를 독립적으로 취하더라도 동일한 개선이 이루어지지 않는다. 일관된 결과를 얻기 위해 이상점을 제거했음에 주목해라. 우리는 변수의 쌍으로 모든 의존도를 시각화할 수 있다, 그러나 만약 작업의 목적(예측이 아닌)을 이미 알고 있으면, 하나는 올바른 방향을 향한 가장 중요한 변수에 초점을 맞추고 나머지는 가변성을 제한하는 역할을 한다.

7 Discussion

이 글에서는 많은 분석 및 시각화 도구를 제공했다. 두 가지 유형 모두 가변적 중요성에 대한 완전한 분석을 유도한다. 그들이 무엇인지에서 어떻게 반응하는지 까지. 제공되는 도구의 모든 가능성을 보여주지는 않았지만 그러나 보여준 예는 심도있는 분석이 가능하다. Variable Importance를 더 잘 이해하기 위해 Random Uniform Forests의 경우는 예측과 직접 연결해야 한다. 이들이 매우 정확하다면 그러면 변수 중요성에 대한 신뢰를 갖기 시작할 수 있다 왜냐하면 모든 측정 값이 예측이나 학습 과정에서 파생되기 때문에. 필요한 경우, 여전히 충분하지 않으며 두 번째로 강한 보증은 모델의 확률적 특성에 의존한다. 따라서 임의의 결과를 얻을 것으로 예상되며 모든 측정 값이 균일한 분포를 암시한다. 여기서 볼 수 있듯이, 특히 데이터를 여러 번 학습할 때, 변수 중요성의 주요 효과는 영향이 무작위 영향을 생성하는 모델에 얼마나 가깝거나 먼지를 보여주는 것을 의미한다. 통계적 가설은 선형 및 파라메트릭 모델에서 사용되므로, 무작위는 Random Uniform Forests에서 동일한 수준으로 작용한다, 신호와 잡음을 분리. 더욱이, 앙상블 모델이 최소한 단순한 선형 모델, 적어도 동일한 수준의 해석을 통해 더 많은 세부 사항을 제공하는 방법을 보여 주었다. 전역 변수 중요성은 전체에서 예측 오차를 낮추는데 가장 큰 영향을 미치는 변수를 설명하기 위해 기술되었다. 지역 변수 중요성은 변수를 다른 변수와의 상호 작용을 이용하여 영향력 있는 변수가 무엇인지 설명했다. 이것은 언제 변수가 많은 문제가 되는지 보여주는 부분 중요도로 이끈다. 변수 중요성 분석의 마지막 단계는, 부분 의존성, 각 변수가 응답과 연결된 위치/장소를 정의한다.

댓글 없음:

댓글 쓰기