LIME을 이용하여 기계 학습(회귀 모델)의 예측 결과를 해석해 보았다

  • 제조업 출신의 데이터 사이언티스트가 보내는 기사
  • 이번은 LIME을 이용해 기계 학습(회귀 모델)의 예측 결과를 해석해 보았습니다.

  • 소개



    지난번 기계 학습 예측 모델을 scikit-learn을 활용하여 구현 해 보았습니다. 또, 구축한 모델은 평가 지표 를 이용해 모델을 평가합니다.
    그러나 평가 지표만으로 모델의 좋고 나쁜 것을 판단하는 것은 위험하며, 구축한 모델이 실태와 괴리하고 있는 경우가 있습니다. 즉, 일반화 능력이 낮은 모델일 가능성이 있다는 것입니다.

    일반화 능력을 높이는 방법은 다양하지만, 제조 현장에서는 구축한 모델의 해석성을 요구하는 경우가 많습니다. 실제로는, 회귀 모델계이면 각 설명 변수의 회귀 계수의 정부하나 표준 편회귀 계수로 변수간의 영향도를 보고 고유 기술과 합치하고 있는지를 파악하기도 합니다. 또, 결정 목계의 모델이면 변수 중요도를 보고 판단을 합니다.

    그러나 결정 트리 모델 (RandomForest, GBDT 등)은 각 변수가 목표 변수에 미치는 영향의 긍정적 인 음수를 결정할 수 없습니다. 또, SVR에서는 커널을 linear 이외를 선택하면 회귀 계수도 변수 중요도도 산출할 수 없습니다(※scikit-learn의 라이브러리에 한정한 이야기입니다).

    그래서 이번에는 위와 같은 과제를 해결하는 수단의 하나로서 LIME을 이용하여 예측한 값에 대해 "각 변수가 어떤 영향을 미쳤는가?"를 가시화하는 기술을 정리 했습니다.

    덧붙여서 과거에 다른 수법으로서 SHAP 에 대해서도 정리하고 있습니다.

    LIME 구현



    이번에는 UCI Machine Learning Repository에서 공개된 보스턴 주택의 가격 데이터를 이용하여 예측 모델을 구축합니다.


    품목
    개요


    데이터 세트
    ・boston house-price

    샘플 수
    ・506개

    컬럼 수
    ・14개


    파이썬 코드는 다음과 같습니다.
    # ライブラリーのインポート
    import pandas as pd
    import numpy as np
    from sklearn.datasets import load_boston
    
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestRegressor
    from lime.lime_tabular import LimeTabularExplainer
    
    # データセットの読込み
    boston = load_boston()
    
    # データフレームの作成
    # 説明変数の格納
    df = pd.DataFrame(boston.data, columns = boston.feature_names)
    
    # 目的変数の追加
    df['MEDV'] = boston.target
    
    # カラム名
    feature_names = np.array(df.drop('MEDV', axis=1).columns)
    
    # データの中身を確認
    df.head()
    



    각 열 이름에 대한 설명은 생략합니다.
    ・설명 변수:13개
    ・목적 변수:1개(MEDV)

    그런 다음 예측 모델을 구축합니다. 이번에는 RandomForest 회귀를 활용합니다.
    # ライブラリーのインポート
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestRegressor
    
    # 学習データと評価データを作成
    x_train, x_test, y_train, y_test = train_test_split(df.iloc[:, 0:13], df.iloc[:, 13],
                                                        test_size=0.2, random_state=1)
    
    # モデルの学習
    RF = RandomForestRegressor()
    RF.fit(x_train, y_train)
    

    LIME에서 결과 해석



    이번에는 선형 모델을 사용하여 로컬 해석을 얻습니다.
    # 学習データやタスクの内容といった情報を渡してインスタンスを作成
    explainer = LimeTabularExplainer(training_data=np.array(x_train),
                                     feature_names=feature_names,
                                     training_labels=np.array(y_train),
                                     discretize_continuous=True,
                                     mode='regression',
                                     verbose=True,
                                    )
    
    # 予測値を返す関数の作成
    predict_proba = lambda x: np.array(list(zip(1-RF.predict(x), RF.predict(x))))
    
    # 線形モデルを使って近似させたときの切片と予測値、本来のモデルの予測値が出力
    exp = explainer.explain_instance(
        x_train.iloc[0], 
        predict_proba, 
        num_features=x_train.columns.shape[0]
    )
    

    아래와 같이 선형 모델을 사용하여 근사시켰을 때의 절편과 예측값, 그리고 본래의 모델의 예측값이 출력됩니다.
    Intercept -20.775610936690455
    Prediction_local [-26.36992196]
    Right: -24.018000000000008
    

    마지막으로 Jupyter Notebook에서 결과를 확인합니다.
    # Notebook 上で視覚的に確認
    exp.show_in_notebook(show_all=False)
    



    사이고에게



    끝까지 읽어 주셔서 감사합니다.
    이번에는 기계 모델의 결과를 해석하는 방법으로 LIME을 구현해 보았습니다.
    편리하게는 과거에 소개한 SHAP 쪽이 사용하기 쉽다고 합니다.

    정정 요망이 있으면, 연락 받을 수 있으면 다행입니다.

    좋은 웹페이지 즐겨찾기