Skip to main content

혼동 행렬(Confusion Matrix) 플롯 생성하기

Vega에서 처음부터 혼동 행렬 구축하기
Created on November 30|Last edited on February 16
このレポートは、Stacey Svetlichnayaによる「Custom Charts from Scratch」の翻訳です。


멀티 클래스 혼동 행렬을 W&B에 로그하기
W&B에서 멀티 클래스 혼동 함수를 생성하시려면, 우선, 여러분의 모델 개발 코드가 예측된 라벨 및 동일 예시 세트에 대해 상응하는 기준 참 값(ground truth)에 액세스할 수 있는 곳을 찾으시길 바랍니다.
  • plot_confusion_matrix()Python 함수에 전달하십시오. (현재 독립된 래퍼(wrapper)로 제공되며, 곧 wandb API에 추가될 예정)
  • Confusion Matrix v0 Vega spec을 통해 사용자 지정 차트를 생성합니다 (아래에 표시됨, 곧 wandb.plot하에 사전 설정으로 추가될 예정)
  • 쿼리 에디터를 통해 드롭다운 메뉴의 우측 영역에 연결하고 아래의 것과 같은 차트를 보거나 원하는 경우 추가 사용자 지정을 하실 수 있습니다!
  • 이 toy example에서, 저는 에포크 (E 또는 pretrain_epochs)의 수 및 훈련 예시 (NT 또는 num_train) 를 변경하는 동안 10가지 종류의 생물체(식물, 동물, 곤충)중 하나를 예측하기 위해 CNN을 미세조정 합니다. 아래의 실행 세트에서, 여러분은 각 실행의 옆에 있는 눈 모양 기호를 토글하여 표시하거나 숨기실 수 있습니다. 각 모델의 상대적 퍼포먼스를 한 눈에 확인하실 수 있으며, 다른 막대기에 마우스를 가져가면 정확한 수를 확인하실 수 있습니다.
놀랄 것도 없이, 너무 적은 수의 예시/에포크를 가진 모델은 더 많은 실수를 저지르는 경향이 있습니다 (가장 작은 모델의 경우, “Aves” 및 “Reptilla”를 가로지르는 파란색 줄이며, 두 번째로 작은 모델의 경우 “Animalia”를 가로지르는 빨간색 줄). 에포크 및 예시의 수가 증가함에 따라, 모델은 보다 정확한 예측을 합니다 (대각선을 따라 강해지는). 양서류(amphibian)대 파충류(retiles)는 이 모델들 중 가장 일반적으로 혼동 되는 부류 중 하나입니다.



Vary num train and num epochs
9


1단계: wandb.Table() 플로팅 하기 위한 Python 코드 추가하기

. Referencing the model I have trained so far in my validation callback, I call: 제 검증 단계에서, 저는 저의 전체 검증 예시에 대한 val_data 및 그에 상응하는 val_labels과 모델에 대한 가능한 라벨의 모든 리스트에 액세스 합니다: labels=["Amphibia", "Animalia", ... "Reptilia"] 이며, 이는 0 = Amphibia, 1 = Animalia, ... 9 = Reptilia 정수 클래스 라벨을 의미합니다. 제 검증 콜백에서 지금까지 제가 훈련한 model 모델을 참조하면, 다음을 호

val_predictions = model.predict(val_data)
ground_truth = val_labels.argmax(axis=1)
plot_confusion_matrix(ground_truth, val_predictions, labels)

여기서 plot_confusion_matrix()는 아래에 정의되어 있으며, 다음을 통해 추가 사용자 지정을 하실 수 있습니다.

  • 또는 pred_labels: 행렬의 행 또는 열로 나타낼 클래스의 하위집합을 줄일입니다.

  • normalize 플래그: 가공되지 않는 수 대신 정규화된 수(최대 1.0까지 올라감)를 표시합니다.

from sklearn.metrics import confusion_matrix
def plot_confusion_matrix(y_true=None, y_pred=None, labels=None, true_labels=None,
                          pred_labels=None, normalize=False):
    """                   
    Computes the confusion matrix to evaluate the accuracy of a classification.
    """
    y_true = np.asarray(y_true)
    y_pred = np.asarray(y_pred)
    cm = confusion_matrix(y_true, y_pred)
    if labels is None:
        classes = unique_labels(y_true, y_pred)
    else:
        classes = np.asarray(labels)
            
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        cm = np.around(cm, decimals=2)
        cm[np.isnan(cm)] = 0.0
            
    if true_labels is None:
        true_classes = classes
    else:
        true_label_indexes = np.in1d(classes, true_labels)
        true_classes = classes[true_label_indexes]
        cm = cm[true_label_indexes]
            
    if pred_labels is None:
        pred_classes = classes
    else:
        pred_label_indexes = np.in1d(classes, pred_labels)
        pred_classes = classes[pred_label_indexes]
        cm = cm[:, pred_label_indexes]
            
    data=[]
    count = 0
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        if labels is not None and (isinstance(pred_classes[i], int)
                                    or isinstance(pred_classes[0], np.integer)):
            pred_dict = labels[pred_classes[i]]
            true_dict = labels[true_classes[j]]
        else:
            pred_dict = pred_classes[i]
            true_dict = true_classes[j]
        data.append([pred_dict, true_dict, cm[i,j]])
        count+=1
    wandb.log({"confusion_matrix" : wandb.Table(
                columns=['Predicted', 'Actual', 'Count'],
                data=data)}


2단계: 혼동 행렬에 대한 사용자 지정 차트 생성하기

W&B 사용자 지정 차트는, 강력하고 유연한 시각화 언어인 Vega,에서 작성됩니다. 다양한 예시와 자세한 설명을 온라인에서 찾으실 수 있으며, 이는 여러분이 원하는 사용자 지정 시각화와 가장 유사한 기존의 프리셋으로 시작하는데 도움이 됩니다. 저희 IDE의 작은 변경사항에서부터 반복하실 수 있으며, 이는 여러분이 IDE의 정의를 변경��에 따라 플롯을 렌더링합니다. 다음은 이 멀티 클래스 혼동 행렬에 대한 전체 Vega spec입니다.

  • 여러분의 프로젝트 작업공간 또는 리포트에서, “Add a visualization(시각화 추가)”를 클릭하고 “Custom chart(사용자 지정 차트)”를 선택하세요.
  • 기존의 프리셋을 선택하고 아래의 Vega spec으로 정의를 변경합니다.
  • "Save As(다른 이름으로 저장)"을 클릭하여 더 쉬운 참조를 위해 프리셋의 이름을 지정합니다. (권장: "confusion_matrix":)
{
  "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
  "description": "Multi-class confusion matrix",
  "data": {
    "name": "wandb"
  },
  "width": 40,
  "height": {"step":6},
  "spacing": 5,
  "mark" : "bar",
  "encoding": {
    "y": {"field": "name", "type": "nominal", "axis" : {"labels" : false}, 
         "title" : null, "scale": {"zero": false}},
    "x": {
      "field": "${field:count}",
      "type": "quantitative",
      "axis" : null,
      "title" : null
    },
    "tooltip": [
      {"field": "${field:count}", "type": "quantitative", "title" : "Count"},
      {"field": "name", "type": "nominal", "title" : "Run name"}
    ],
    "color": {
      "field": "name",
      "type": "nominal",
      "legend": {"orient": "top", "titleOrient": "left"},
      "title": "Run name"
    },
    "row": {"field": "${field:actual}", "title": "Actual", 
            "header": {"labelAlign" : "left", "labelAngle": 0}},
    "column": {"field": "${field:predicted}", "title": "Predicted"}
  }
}

3단계: 로그된 실행에서 차트로 관련 데이터 필드 매핑하기

시각화 IDE의 우측에서 실행 쿼리를 수정하여 실행 데이터를 혼동 행렬에 입력합니다:

  • summarysummaryTable로 변경합니다.
  • 사용자 지정 테이블 id를 tableKeys의 첫 번째 항목으로 입력합니다. 이것은 wandb.Table를 로그한 키입니다. 제 경우, confusion_matrix입니다.
  • 커리 에디터의 드롭다운 메뉴를 사용하여, wandb.Table의 "Count"에 로그된 값이 Vega 차트의 “count” 필드, “actual” 필드의 “Actua”열로 읽히도록, 일치하는 필드를 연결합니다. 최종 쿼리는 다음과 같아야 합니다.



Run set
0


원하는 대로 사용자 지정하기

Vega spec을 편집함으로써, 차트의 높이, 폭, 색 배합을 조정할 수 있습니다. 예를 들어 이 차트는 색상에서 "scale" : {"scheme" : "rainbow"}를 사용하여 실행의 색상을 변경합니다.

여기서 파란색에 가까운 색상은 더 많은 훈련 예시/더 많은 에포크에 해당하며, 일반적으로 대각선을 따라 더 강력한 퍼포먼스를 보여줍니다. 단지 “animal(동물)”로 분류된 Mollusks(연체동물)과 Reptiles(파충류)로 분류된 Amphibians(양서류)는 가장 큰 모델 (10개 에포크 동안 10,000개의 예시에 대한 훈련) 에서의 가장 일반적인 두 가지 실수입니다. 특정 셀에서 심지어 10배나 적은 데이터를 가진 녹색 "NT 1000, E 10" 모델이 가장 큰 파란 색 "NT 10000, E 10" 모델을 능가하는 것을 확인하는 것은 정말 흥미롭습니다.




Vary num train and num epochs
6

Iterate on AI agents and models faster. Try Weights & Biases today.