귀하의 기능이 중요합니까? 그것이 그들이 좋다는 것을 의미하지는 않습니다 - KDnuggets

귀하의 기능이 중요합니까? 그것이 그들이 좋다는 것을 의미하지는 않습니다 - KDnuggets

소스 노드 : 2893531

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
[저자별 이미지]

 

"특성 중요도" 개념은 기계 학습에서 가장 기본적인 모델 설명 가능성 유형으로 널리 사용됩니다. 예를 들어 RFE(Recursive Feature Elimination)에서는 모델에서 가장 중요하지 않은 기능을 반복적으로 삭제하는 데 사용됩니다.

그러나 이에 대한 오해가 있습니다.

기능이 중요하다는 사실이 모델에 유익하다는 의미는 아닙니다.

실제로, 특성이 중요하다고 말할 때 이는 단순히 특성이 모델의 예측에 높은 기여를 한다는 것을 의미합니다. 하지만 우리는 그 점을 고려해야 합니다 그러한 기여는 잘못되었을 수 있습니다.

간단한 예를 들어보겠습니다. 데이터 과학자가 실수로 모델 기능 사이에 고객 ID를 잊어버렸습니다. 이 모델은 고객 ID를 고도의 예측 기능으로 사용합니다. 결과적으로 이 기능은 보이지 않는 데이터에서는 제대로 작동하지 않기 때문에 실제로 모델을 악화시키더라도 기능 중요도가 높습니다.

상황을 더 명확하게 하기 위해 두 가지 개념을 구별해야 합니다.

  • 예측 기여도: 예측의 어떤 부분이 특성으로 인한 것입니까? 이는 기능 중요도와 동일합니다.
  • 오류 기여: 예측 오류 중 모델의 특성으로 인해 발생하는 부분은 무엇입니까?

이 기사에서는 이러한 수량을 계산하는 방법과 이를 사용하여 예측 모델에 대한 귀중한 통찰력을 얻고 개선하는 방법을 살펴보겠습니다.

참고: 이 문서는 회귀 사례에 중점을 둡니다. 분류 사례에 더 관심이 있다면 다음을 읽어보세요. "귀하의 분류 모델에 유해한 기능은 무엇입니까?"

직업, 연령, 국적을 기준으로 사람들의 소득을 예측하는 모델을 구축했다고 가정해 보겠습니다. 이제 우리는 모델을 사용하여 세 사람을 예측합니다.

따라서 우리는 정답, 모델 예측 및 결과 오류를 얻었습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
Ground Truth, 모델 예측 및 절대 오류(단위: 수천 달러) [저자별 이미지]

 

예측 모델이 있으면 항상 모델 예측을 단일 특성이 가져온 기여로 분해할 수 있습니다. 이는 SHAP 값을 통해 수행할 수 있습니다. SHAP 값의 작동 방식을 모르는 경우 다음 기사를 읽어보세요. SHAP 가치는 누군가가 당신에게 설명해주기를 바랐던 방식으로 정확히 설명되었습니다.).

따라서 이것이 세 개인에 대한 모델과 관련된 SHAP 값이라고 가정해 보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
모델 예측에 대한 SHAP 값(천 달러 단위). [저자별 이미지]

 

SHAP 값의 주요 특성은 추가적이라는 것입니다. 이는 각 행의 합을 취하여 해당 개인에 대한 모델의 예측을 얻을 수 있음을 의미합니다. 예를 들어, 두 번째 행을 취하면 72k $ +3k $ -22k $ = 53k $이며 이는 정확히 두 번째 개인에 대한 모델의 예측입니다.

이제 SHAP 값은 예측에 특성이 얼마나 중요한지를 나타내는 좋은 지표입니다. 실제로 (절대) SHAP 값이 높을수록 해당 특정 개인에 대한 예측 기능의 영향력이 커집니다. 여기서 기호는 중요하지 않기 때문에 절대 SHAP 값에 대해 이야기하고 있다는 점에 유의하세요. 기능은 예측을 높이거나 낮추는 경우에도 똑같이 중요합니다.

따라서, 특성의 예측 기여도는 해당 특성의 절대 SHAP 값의 평균과 같습니다.. Pandas 데이터 프레임에 SHAP 값이 저장되어 있는 경우 이는 다음과 같이 간단합니다.

prediction_contribution = shap_values.abs().mean()

이 예에서는 결과가 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
예측 기여. [저자별 이미지]

 

보시다시피 직업은 평균적으로 최종 예측의 71.67k$를 차지하므로 가장 중요한 특성입니다. 국적과 연령은 각각 두 번째와 세 번째로 가장 관련성이 높은 특징입니다.

그러나 특정 특성이 최종 예측의 관련 부분을 설명한다는 사실은 해당 특성의 성능에 대해 아무 것도 알려주지 않습니다. 이 측면도 고려하려면 "오류 기여도"를 계산해야 합니다.

다음 질문에 대답하고 싶다고 가정해 보겠습니다. "특징이 없다면 모델은 어떤 예측을 하게 될까요?" ?” SHAP 값을 통해 이 질문에 답할 수 있습니다. 사실, 그것들은 가산적이기 때문에 특징에 상대적인 SHAP 값을 빼는 것만으로도 충분합니다.  모델이 예측한 결과입니다.

물론 각 기능에 대해 이 절차를 반복할 수 있습니다. 팬더에서:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

결과는 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
해당 기능을 제거하면 얻을 수 있는 예측입니다. [저자별 이미지]

 

즉, 해당 기능이 없으면 , 모델은 첫 번째 개인에 대해 20달러, 두 번째 개인에 대해 -19달러, 세 번째 개인에 대해 -8달러를 예측합니다. 대신 해당 기능이 없다면 나이, 모델은 첫 번째 개인에 대해 73달러, 두 번째 개인에 대해 50달러 등을 예측합니다.

보시다시피, 다양한 기능을 제거하면 각 개인에 대한 예측이 많이 달라집니다. 결과적으로 예측 오류도 매우 다를 수 있습니다. 우리는 이를 쉽게 계산할 수 있습니다:

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

결과는 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
해당 기능을 제거하면 발생하는 절대 오류입니다. [저자별 이미지]

 

이는 해당 기능을 제거할 경우 발생하는 오류입니다. 직관적으로 오류가 작다면 기능을 제거하는 것은 모델에 문제가 되지 않거나 유익할 수도 있습니다. 오류가 높으면 기능을 제거하는 것은 좋은 생각이 아닙니다.

하지만 우리는 이보다 더 많은 일을 할 수 있습니다. 실제로 전체 모델의 오류와 기능 없이 얻을 수 있는 오류 간의 차이를 계산할 수 있습니다.

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

어느 것이 :

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
모델의 오류와 기능이 없을 때 발생할 수 있는 오류의 차이입니다. [저자별 이미지]

 

이 번호가 다음과 같은 경우:

  • 음수인 경우 특성이 있으면 예측 오류가 감소하므로 해당 특성은 해당 관찰에 잘 작동합니다.
  • 긍정적인 경우 특성이 있으면 예측 오류가 증가하므로 해당 특성은 해당 관찰에 적합하지 않습니다.

각 기능에 대해 이러한 값의 평균으로 "오류 기여도"를 계산할 수 있습니다.. 팬더에서:

error_contribution = error_diff.mean()

결과는 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
오류 기여. [저자별 이미지]

 

이 값이 양수이면 평균적으로 모델에 특성이 있으면 오류가 더 높아진다는 의미입니다. 따라서 해당 기능이 없으면 예측이 일반적으로 더 좋았을 것입니다. 즉, 이 기능은 득보다 실이 더 많습니다!

반대로, 이 값이 음수일수록 해당 기능의 존재로 인해 오류가 줄어들기 때문에 해당 기능이 예측에 더 유리합니다.

실제 데이터 세트에서 이러한 개념을 사용해 보겠습니다.

이후에는 다음에서 가져온 데이터세트를 사용하겠습니다. 파이카렛 (아래의 Python 라이브러리 MIT 면허). 데이터 세트는 "Gold"라고 불리며 시계열 금융 데이터를 포함합니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
데이터 세트 샘플. 특성은 모두 백분율로 표시되므로 -4.07은 -4.07%의 수익률을 의미합니다. [저자별 이미지]

 

특징은 관찰 시점 22일, 14일, 7일, 1일 전 금융자산(“T-22”, “T-14”, “T-7”, “T-1”)의 수익률로 구성됩니다. 예측 기능으로 사용되는 모든 금융 자산의 전체 목록은 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
사용 가능한 자산 목록입니다. 각 자산은 -22, -14, -7 및 -1 시간에 관찰됩니다. [저자별 이미지]

 

전체적으로 120개의 기능이 있습니다.

목표는 22일 전(“Gold_T+22”)의 금 가격(반환)을 예측하는 것입니다. 대상변수를 살펴보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
변수의 히스토그램. [저자별 이미지]

 

데이터 세트를 로드한 후 수행한 단계는 다음과 같습니다.

  1. 전체 데이터세트를 무작위로 분할합니다. 행의 33%는 훈련 데이터세트에, 또 다른 33%는 검증 데이터세트에, 나머지 33%는 테스트 데이터세트에 있습니다.
  2. 훈련 데이터 세트에서 LightGBM 회귀자를 훈련합니다.
  3. 이전 단계에서 훈련된 모델을 사용하여 훈련, 검증 및 테스트 데이터세트에 대한 예측을 수행합니다.
  4. Python 라이브러리 "shap"을 사용하여 훈련, 검증 및 테스트 데이터 세트의 SHAP 값을 계산합니다.
  5. 이전 단락에서 본 코드를 사용하여 각 데이터 세트(훈련, 검증 및 테스트)에 대한 각 기능의 예측 기여도와 오류 기여도를 계산합니다.

훈련 데이터 세트의 오류 기여도와 예측 기여도를 비교해 보겠습니다. 산점도를 사용하므로 점은 모델의 120개 특징을 식별합니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
예측 기여도와 오류 기여도(훈련 데이터세트에서). [저자별 이미지]

 

훈련 세트의 예측 기여도와 오류 기여도 간에는 매우 음의 상관관계가 있습니다.

그리고 이것은 의미가 있습니다: 모델은 훈련 데이터 세트를 학습하기 때문에 예측 오류(즉, 매우 부정적인 오류 기여도)를 크게 줄이는 기능에 높은 중요성(예: 높은 예측 기여도)을 부여하는 경향이 있습니다..

하지만 이것이 우리의 지식에 많은 도움을 주지는 않습니다. 그렇죠?

실제로 우리에게 정말로 중요한 것은 검증 데이터 세트입니다. 검증 데이터 세트는 실제로 기능이 새 데이터에서 어떻게 작동하는지에 대해 가질 수 있는 최고의 프록시입니다. 그럼 검증 세트에 대해서도 동일한 비교를 해보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
예측 기여도와 오류 기여도(검증 데이터 세트에서). [저자별 이미지]

 

이 플롯에서 우리는 훨씬 더 흥미로운 정보를 추출할 수 있습니다.

플롯의 오른쪽 하단에 있는 기능은 실제로 예측 오류를 줄이기 때문에 모델이 올바르게 높은 중요도를 할당하는 기능입니다.

또한, "Gold_T-22"(관찰 기간 22일 전 금 반환)는 모델이 부여하는 중요도에 비해 정말 잘 작동하고 있습니다. 이는 다음을 의미합니다. 이 기능은 과소적합일 수 있습니다.. 그리고 이 정보는 금이 우리가 예측하려는 자산이기 때문에 특히 흥미롭습니다(“Gold_T+22”).

반면에, 미국에서 체류를 연장하고자 이전의 승인을 갱신하려던  오류 기여도가 0보다 큰 기능은 예측을 더욱 악화시킵니다.. 예를 들어, "US Bond ETF_T-1"은 평균적으로 모델 예측을 0.092%(예측 기여도)만큼 변경하지만 해당 기능이 없을 때보다 모델이 평균 0.013%(오차 기여도) 더 나쁜 예측을 하도록 유도합니다. .

우리는 다음과 같이 가정할 수 있습니다. (예측 기여도와 비교하여) 오류 기여도가 높은 모든 기능은 아마도 과적합일 가능성이 높습니다. 또는 일반적으로 훈련 세트와 검증 세트에서 서로 다른 동작을 갖습니다.

어떤 기능이 오류 기여도가 가장 큰지 살펴보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
오류 기여도를 줄여 정렬된 기능입니다. [저자별 이미지]

 

이제 오류 기여도가 가장 낮은 기능은 다음과 같습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
오류 기여도를 높여 정렬된 기능입니다. [저자별 이미지]

 

흥미롭게도 오류 기여도가 높은 모든 기능은 T-1(관측 순간 1일 전)에 상대적인 반면, 오류 기여도가 더 작은 거의 모든 기능은 T-22(관측 순간 22일 전)에 상대적이라는 것을 관찰할 수 있습니다. ).

이는 다음을 나타내는 것 같습니다. 가장 최근의 특징은 과적합되기 쉬운 반면, 시간적으로 더 먼 특징은 더 잘 일반화되는 경향이 있습니다..

오류 기여가 없었다면 우리는 이 통찰력을 결코 알 수 없었을 것입니다.

기존의 RFE(Recursive Feature Elimination) 방법은 중요하지 않은 기능을 제거하는 데 기반을 둡니다. 이는 먼저 예측 기여도가 작은 특성을 제거하는 것과 같습니다.

그러나 이전 단락에서 말한 내용을 바탕으로 오류 기여도가 가장 높은 기능을 먼저 제거하는 것이 더 합리적입니다.

우리의 직관이 검증되었는지 확인하기 위해 두 가지 접근 방식을 비교해 보겠습니다.

  • 기존 RFE: 쓸모없는 기능을 먼저 제거 (가장 낮은 예측 기여도).
  • RFE: 유해한 기능 제거 먼저 (오류 기여도가 가장 높음).

검증 세트의 결과를 살펴보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
검증 세트에 있는 두 전략의 평균 절대 오차입니다. [저자별 이미지]

 

각 방법에 대한 최상의 반복은 원으로 표시되어 있습니다. 기존 RFE에 대한 19개 기능이 있는 모델(파란색 선)과 RFE에 대한 17개의 기능이 있는 모델(주황색 선)입니다.

일반적으로 우리의 방법은 잘 작동하는 것 같습니다. 오류 기여도가 가장 높은 기능을 제거하면 예측 기여도가 가장 높은 기능을 제거하는 것과 비교하여 MAE가 지속적으로 작아집니다.

그러나 검증 세트를 과적합했기 때문에 이것이 잘 작동한다고 생각할 수도 있습니다. 결국 우리는 테스트 세트에서 얻을 결과에 관심이 있습니다.

그럼 테스트 세트에서 동일한 비교를 살펴보겠습니다.

 

귀하의 기능이 중요합니까? 그들이 좋다는 뜻은 아니다
테스트 세트에 있는 두 전략의 평균 절대 오류입니다. [저자별 이미지]

 

결과는 이전과 유사합니다. 두 선 사이의 거리가 더 작더라도 가장 높은 오류 기여자를 제거하여 얻은 MAE는 가장 낮은 예측 기여자를 제거하여 얻은 MAE보다 분명히 더 좋습니다.

검증 세트에서 가장 작은 MAE로 이어지는 모델을 선택했으므로 테스트 세트에서 결과를 살펴보겠습니다.

  • RFE 예측 기여(19개 기능). 테스트 세트의 MAE: 2.04.
  • RFE-오류 기여(17개 기능). 테스트 세트의 MAE: 1.94.

따라서 우리 방법을 사용하는 최고의 MAE는 기존 RFE에 비해 5% 더 좋습니다!

특성 중요도 개념은 머신러닝에서 기본적인 역할을 합니다. 그러나 '중요함'이라는 개념은 종종 '선함'으로 오해됩니다.

이 두 가지 측면을 구별하기 위해 예측 기여와 오류 기여라는 두 가지 개념을 도입했습니다. 두 개념 모두 유효성 검사 데이터 세트의 SHAP 값을 기반으로 하며 기사에서는 이를 계산하는 Python 코드를 확인했습니다.

또한 실제 금융 데이터 세트(금 가격을 예측하는 작업)에서 이를 시도했으며 오류 기여를 기반으로 한 재귀 기능 제거가 예측 기여를 기반으로 한 기존 RFE에 비해 평균 절대 오류가 5% 더 우수하다는 것을 입증했습니다.

이 기사에 사용된 모든 코드는 다음에서 찾을 수 있습니다. 이 노트북.

읽어 주셔서 감사합니다!

 
 
사무엘레 마잔티 Jakala의 수석 데이터 과학자이며 현재 로마에 거주하고 있습니다. 그는 통계학을 전공했으며 그의 주요 연구 관심 분야는 업계의 기계 학습 응용 프로그램입니다. 그는 프리랜서 콘텐츠 제작자이기도 합니다.

 
실물. 허가를 받아 다시 게시했습니다.
 

타임 스탬프 :

더보기 너 겟츠