Light GBM의 다중 클래스 분류/이진 분류를 시각화하는 Confusion Matrix Plot

Introduction



Summary



· scikit-learn 0.22 업데이트 인 confusion matrix의 plot을 시도했습니다.
・종래의 scikit-learn의 confusion matrix는 array로 출력하고 있었기 때문에 그래프 빛나지 않았다
· LightGBM을 사용하는 경우 함수의 인수 분류 모델
scikit-learn 인터페이스로 학습하지 않으면 할 수 없었다.
 scikit-learn의 저주?
・plot하는 메리트로서는, 함수내에서 y_pred를 마음대로 계산해 주기 때문에
조금 편하다고 보기 쉽고 빛난다

Dataset



모두 사랑 iris. 목적 변수는 물론 species.


Body



준비



우선 업데이트를 잊지 마세요.

라이브러리 업데이트
!pip install --upgrade scikit-learn

아래의 _plot_confusion_matrix가 이번 테마의 메인.

이번에 필요한 라이브러리 import
#default
import numpy as np
import pandas as pd
import seaborn as sns

#for_modeling
import lightgbm as lgb

#for_plot
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, plot_confusion_matrix
from sklearn.model_selection import train_test_split

iris 데이터 세트는 seaborn 라이브러리에서 가져옵니다.

데이터 세트 정리
df = sns.load_dataset('iris')

X=df.drop(["species"],axis=1)
y=df["species"]

SEED=5
X_train_tmp, X_test,y_train_tmp,y_test=train_test_split(X, y, test_size=0.2, random_state=SEED)
X_train, X_val, y_train, y_val=train_test_split(X_train_tmp, y_train_tmp, test_size=0.2, random_state=SEED)

오리지널 인터페이스로 학습한 패턴



Summary에서 쓴대로 실패하지만,
우선은 LightGBM 모델을 오리지날의 인터페이스로 기술한 케이스로 실행해 본다.

원래 인터페이스로 학습
#失敗例
lgb_params = {
    'objective':'multiclass',
    'n_estimators':1000,
    'seed': SEED,
    'early_stopping_rounds':100
} 

lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_val, y_val)

model = lgb.train(
            lgb_params,
            lgb_train,
            valid_sets=lgb_eval,
            verbose_eval = 15
            )

confusion matrix를 출력해 보자.
인수는 아래와 같이, estimator에게 학습시킨 모델, X에 검증 부분의 특징량(X_test), Y에 정답 데이터(Y_test)를 넣는 것으로 출력된다.
y_pred는 자동으로 계산되므로 선언이 필요하지 않습니다.

sklearn.metrics.plot_confusion_matrix(estimator, X, y_true, labels=None, sample_weight=None, normalize=None, display_labels=None, include_values=True, xticks_rotation='horizontal', values_format=None 없음)

인용 소스 : scikit-learn 공식 문서

플롯 출력
plot_confusion_matrix(model,X_test,y_test)

그러면 다음 오류가 반환됩니다.
estimator에 지정된 모델이 분류 모델로 인식되지 않는 것 같습니다.

오류 문
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-125-5b518d7bfee9> in <module>()
----> 1 plot_confusion_matrix(model,X_test,y_test)

/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_plot/confusion_matrix.py in plot_confusion_matrix(estimator, X, y_true, labels, sample_weight, normalize, display_labels, include_values, xticks_rotation, values_format, cmap, ax)
    183 
    184     if not is_classifier(estimator):
--> 185         raise ValueError("plot_confusion_matrix only supports classifiers")
    186 
    187     if normalize not in {'true', 'pred', 'all', None}:

ValueError: plot_confusion_matrix only supports classifiers

LightGBM을 scikit-learn 인터페이스로 작성하는 경우
LGBMClassifier라고 하는 그야말로 분류 모델인 것 같은 LightGBM의 기술 방법이 있었다는 것을 상기한다.
시험에 그 기술 방법으로 시험해 본다.

scikit-learn 인터페이스로 학습한 패턴



scikit-learn 인터페이스에서 학습
model2 = lgb.LGBMClassifier(objective='multiclass',
                        n_estimators=1000,
                        seed=SEED,
                        early_stopping_rounds=100)
model2.fit(X_train, y_train,
        eval_set=[(X_val, y_val)],
        verbose=50)

model2에서 다시 시도해 봅니다.

플롯 재출력
plot_confusion_matrix(model2,X_test,y_test)

나왔다.
seaborn에서의 plot과 같이 디폴트로 보기 쉬운 플롯이 출력되었다.



타이틀을 붙이는 경우는 아래와 같이 기재하면 출력된다.

제목 추가
disp=plot_confusion_matrix(model2,X_test,y_test)
disp.ax_.set_title("Confusion Matrix")
plt.show()



덧붙여서 코드는 할애하지만 titanic의 2치 분류에서도 똑같이 해 출력할 수 있었다.
반대로 종래의 confusion_matrix.confusion_matrix의 경우는 2치 분류 밖에 할 수 없고, 다클래스 분류라고 할 수 없었다.



Conclusion



・scikit-learn의 새로운 기능의 confusion matrix plot를 이용하는 것으로 꽤 간단한 기재로 묘화할 수 있었다.
· LightGBM의 경우는 현재, scikit-learn 인터페이스에서 학습시키는 것이 좋다.
・종래의 confusion_matrix.confusion_matrix와는 달리, 2치 분류에서도 다클래스 분류에서도 대응하고 있다.

좋은 웹페이지 즐겨찾기