ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #20 : KT_AIVLE_SCHOOL : DX_4th : 데이터 분석 표현_Shap
    KT_AIVLE_SCHOOL_DX_4th 2023. 10. 30. 00:09

     

    지난 세션에서는 스트림릿(웹)과 PowerBI(툴)을 이용해서 데이터분석 표현을 해보았다.

    https://datawithu.tistory.com/30

     

    #19 : KT_AIVLE_SCHOOL : DX_4th : 데이터 분석 표현_Streamlit & Power_BI

    그렇게 게임GTA영상을 분석했던 미프( https://datawithu.tistory.com/29 )가 끝나고 다시 강의로 무한 회귀/// // 쉬고싶다 이번에는 약 3일 동안 허신 강사님과 스트림릿& PowerBI를 배우게 되었다. 2일동안은

    datawithu.tistory.com

    즉 시각화에 특화된 작업들을 했었다 

    이번 세션은 하루동안 한기영강사님과 함께

    AI 모델링 후에 변수들의 중요도에 대해서 알아보고, 시각화하는 방법을 배운다. 

    그리고 아쉽지만, 한기영 강사님이 이번 시간이 마지막이라고 하셨다.

    남은 강의들은 아마도 새로운 강사님들과 함께 할 것 같다.


    # Intro )

    강의 하루는 금방 잊어먹는 것 같다.

    지금 며칠이 지났다고  내가 뭘 했는지 까먹다니... 강사님이 멀리서 눈물 흘리질 지도...

    사실 고백하자면, 내가 따로 준비하고 있는 공모전들이 있어서(IT계통 아님 ㅜㅜㅜㅜ

    하루종일 정신이 따른 곳에 가있었다.  아마 11월 내내.. 그러면 안될테지만... 

    강의 중간 중간, 아 이건 이렇게 고쳐야지 ㅎㅎ 이러다보니, 강의도 중간중간 놓치고..

    물론 코드는 다 따라갔지만, 베낀다고 내 지식이 되는 것은 아니기 때문에.. 

    매순간을 최선을 다하자고 다짐을 하면, 3초 금붕어도 아닌데 잊어먹는 나란 인간은 조금 글렀나?싶긴했다.

     

    한편, 강사님은 AI모델이 얼마나 잘 뽑혔는지 보다, 컨설턴트/마케팅/비즈니스 영역이라면, 

    얼마큼 해당 영역에서 그 모델이 문제를 잘 설명할 수 있는 지에 대해 더 초점을 맞춰 주었으면 하셨고,

    그렇게 떄문에 이번 세션을 준비하신 것이라고 판단된다. 

     


    1. AI 모델에서 변수 중요도 (Feature_importance)

     

    변수중요도 feature importance는 Tree기반의 AI알고리즘들에서 제공을 하는데

    • Decision Tree
      • Tree전체에서 지니불순도가 감소한 정도로 판단
    • Random Forest
      • 개별 Tree의 변수 중요도(지니불순도 감소)의 평균으로 판단
    • XGBoost 
      • weight : 모델전체에서 변수가 분리될 때 사용된 횟수의 합
      • gain : 변수별 평균 정보획득 정도
      • cover : 변수가 분리될 때, 샘플 수의 평균 
    # weight
    plot_importance(xgb_model)
    plt.show()
    
    #gain
    plot_importance(xgb_model, importance_type='gain')
    plt.show()
    
    #cover
    plot_importance(xgb_model,, importance_type='cover')
    plt.show()

    등등이 있다.

    한편, 그외 모델들은 PFI(Permutaion Feature Importanace)를 통해 중요도를 파악할 수 있다고 한다. 

    물론 Tree모델들도 사용하능하다. 


    PEI : Permutation Feature ImportanceImportance

    from sklearn.inspection import permutation_importance
    
    #모델 생성 & 학습
    model = #........
    model.fit(x_train, y_train)
    pfi = permutaion_importance(model, x_val, y_val, n_repeats=10, random_state=)

    결과는 array로 나온다

    #

    ## deep learning 모델에 대해서는 명시적으로 scoring = 'r2'을 지정해 줄것!!!!
    
    pfi =permutation_importance(model, x_val_s, y_val, n_repeats=10, scoring = 'r2', random_state=2022)

    내가 아는 r2는 회귀쓰 문제에서 쓰이던 것 아니였는가?

    그래서 그냥 일반적인 ML 모델들에서 회귀면 scoring='r2'를 쓰고, 분류면 'f1'를 사용했지만

    DeepLearing에서 'r2'라고 명시를 하지 않으면 오류가 났었다.. 

    원래 강의에서는 DeepLearning 까지는 실습이 아니였는데, 그냥 궁금해서 해봤고, 결과는 에러였으니...

    구글 박사님의 도움을 받아서 해결 했다. 

     


    2. 시각화 : SHAP(개별 변수 설명)

     

    Shapley Value는 기여도 평가를 의미하는데,

    각 변수가 전체 평균에 얼마큼의 기여를 했는지 알아볼 때 쓴다. 

    예측값의 전체 평균(base value(js.)아래 그림참고)이  예측값에서 얼마큼 멀어졌는지를 볼 수있는데

    아래의 코드를 돌리면 이런 식으로 나온다.

    각 변수별로 얼마큼 기여를 했는지 알수 있다.

    기여도는 해당 그래프에서 각 간격의 길이와 같다.

    예를 들면 rm이 lower(값 하락)에 가장 많이 기여한 것을 알 수 있다. 

     

    코드는 아래와 같다.

    !pip install shap
    import shap
    
    ###Shapley Value 만들기  
    # SHAP 값으로 모델의 예측 설명
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(x)
    
    ###그래프 만들기
    #전체 예측값의 평균
    explainer.expected_value
    
    # javascript 시각화 라이브러리
    # colab 모든 셀에 포함시킬것.
    shap.initjs()
    
    # force_plot(전체평균, shapley_values, input)
    shap.force_plot(explainer.expected_value, shap_values1[0, :], x.iloc[0,:])

    인덱스를 따로 정해서 넣을 수도 있었다.

     

    확실히, 코드로 짜서 array로 나오는 숫자들의 난리부르스 보다는

    시각적으로 딱하고 나타나는 것들이 휠씬 보기도 좋고 

    이해도 빨라지는 것 같다. 

     

    비록 하루정도의 강의 였지만,  제대로 집중이 안되어서 잘 못 들은 것 같긴하지만, 그래도 유의미했다고 생각한다. ㅎㅎ

Designed by Tistory.