XGBoost 중요성의 결과를 해석하는 방법은 무엇입니까?


36

xgboost 모델을 실행했습니다. 의 출력을 해석하는 방법을 정확히 모르겠습니다 xgb.importance.

게인, 커버 및 주파수의 의미는 무엇이며 어떻게 해석합니까?

또한 Split, RealCover 및 RealCover %는 무엇을 의미합니까? 여기에 몇 가지 추가 매개 변수가 있습니다

기능 중요도에 대해 더 자세히 알려주는 다른 매개 변수가 있습니까?

R 문서에서 Gain은 Information gain과 비슷하며 Frequency는 모든 트리에서 기능이 사용되는 횟수입니다. 나는 표지가 무엇인지 전혀 모른다.

나는 링크에 주어진 예제 코드를 실행했고 (내가 작업중 인 문제에 대해서도 똑같이 시도했지만) 거기에 주어진 분할 정의는 내가 계산 한 숫자와 일치하지 않았다.

importance_matrix

산출:

           Feature         Gain        Cover    Frequence
  1:            xxx 2.276101e-01 0.0618490331 1.913283e-02
  2:           xxxx 2.047495e-01 0.1337406946 1.373710e-01
  3:           xxxx 1.239551e-01 0.1032614896 1.319798e-01
  4:           xxxx 6.269780e-02 0.0431682707 1.098646e-01
  5:          xxxxx 6.004842e-02 0.0305611830 1.709108e-02

214:     xxxxxxxxxx 4.599139e-06 0.0001551098 1.147052e-05
215:     xxxxxxxxxx 4.500927e-06 0.0001665320 1.147052e-05
216:   xxxxxxxxxxxx 3.899363e-06 0.0001536857 1.147052e-05
217: xxxxxxxxxxxxxx 3.619348e-06 0.0001808504 1.147052e-05
218:  xxxxxxxxxxxxx 3.429679e-06 0.0001792233 1.147052e-05

답변:


38

귀하의 질문에서, 이진 분류를 위해 부스트 트리를 맞추기 위해 xgboost를 사용하고 있다고 가정합니다. 중요도 매트릭스는 실제로 강화 된 트리에서 실제로 사용 된 모든 기능의 이름을 나열하는 첫 번째 열이있는 data.table 객체입니다.

중요도 데이터 테이블의 의미는 다음과 같습니다.

  1. 게인 모델의 각 트리에 대한 각 기능의 기여도를 고려하여 계산 모델에 해당 기능의 상대적 기여도를 의미한다. 다른 측정 항목과 비교할 때이 측정 항목의 값이 높을수록 예측 생성에 더 중요합니다.
  2. 커버 메트릭 수단이 기능과 관련된 관찰의 상대적 번호입니다. 예를 들어 100 개의 관측치, 4 개의 피쳐 및 3 개의 트리가 있고 feature1을 사용하여 tree1, tree2 및 tree3에서 각각 10, 5 및 2 개의 관측치에 대한 리프 노드를 결정한다고 가정합니다. 그러면이 측정 항목의 측정 항목이 10 + 5 + 2 = 17 개의 관측치로 계산됩니다. 이는 4 가지 기능 모두에 대해 계산되며 표지는 모든 기능의 표지 메트릭에 대한 백분율로 표시됩니다.
  3. 주파수 (/ 'Frequence')는 특정 기능이 모델의 나무에서 발생하는 시간의 상대적인 수를 나타내는 비율입니다. 위의 예에서 feature1이 2 개의 분할에서 발생하면 tree1, tree2 및 tree3 각각에서 1 개의 분할 및 3 개의 분할이 발생합니다. feature1의 가중치는 2 + 1 + 3 = 6입니다. feature1의 빈도는 모든 피쳐의 가중치에 대한 백분율 가중치로 계산됩니다.

게인은 각 기능의 상대적 중요성을 해석하는 데 가장 적합한 속성입니다.

측정 값은 모두 상대적이며 따라서 모두 합산됩니다. R의 적합 xgboost 모델의 예는 다음과 같습니다.

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1

1
커버는 리프 노드 또는 모든 분할을 기준으로 만 계산됩니까?
fanfabbb

3

자세한 답변을 보내 주셔서 감사합니다. 리프 노드뿐만 아니라 모든 분할에서 커버가 계산되는지 수정하고 싶습니다.

xgboost 라이브러리에서 제공하는 데이터를 사용하여 간단한 예를 살펴 보겠습니다.

library('xgboost')

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')

train <- agaricus.train
test <- agaricus.test

X = train$data

y = train$label

bst <- xgboost(data = X, label = y, max.depth = 2,
           eta = 1, nthread = 2, nround = 2,objective = "binary:logistic",
           reg_lambda = 0, reg_alpha = 0)

xgb.model.dt.tree(agaricus.train$data@Dimnames[[2]], model = bst)

xgb.importance(agaricus.train$data@Dimnames[[2]], bst)

출력-

트리 덤프

중요성 매트릭스

트리 덤프에서 중요도 매트릭스 (0.495768965)에서 odor = none의 커버를 계산해 봅시다.

odor = none이 사용되는 각 스플릿의 커버는 노드 ID 0-0에서 1628.2500이고 노드 ID 1-1에서 765.9390입니다.

모든 분할의 총 커버 (트리 덤프의 커버 열에 합산) = 1628.2500 * 2 + 786.3720 * 2

중요도 매트릭스에서 냄새의 커버 = 없음 = (1628.2500 + 765.9390) / (1628.2500 * 2 + 786.3720 * 2)

따라서 모든 분할에 대해 커버가 계산됩니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.