혼동 행렬(Confusion Matrix) 플롯 생성하기
- plot_confusion_matrix()Python 함수에 전달하십시오. (현재 독립된 래퍼(wrapper)로 제공되며, 곧 wandb API에 추가될 예정)
- Confusion Matrix v0 Vega spec을 통해 사용자 지정 차트를 생성합니다 (아래에 표시됨, 곧 wandb.plot하에 사전 설정으로 추가될 예정)
- 쿼리 에디터를 통해 드롭다운 메뉴의 우측 영역에 연결하고 아래의 것과 같은 차트를 보거나 원하는 경우 추가 사용자 지정을 하실 수 있습니다!
- 이 toy example에서, 저는 에포크 (E 또는 pretrain_epochs)의 수 및 훈련 예시 (NT 또는 num_train) 를 변경하는 동안 10가지 종류의 생물체(식물, 동물, 곤충)중 하나를 예측하기 위해 CNN을 미세조정 합니다. 아래의 실행 세트에서, 여러분은 각 실행의 옆에 있는 눈 모양 기호를 토글하여 표시하거나 숨기실 수 있습니다. 각 모델의 상대적 퍼포먼스를 한 눈에 확인하실 수 있으며, 다른 막대기에 마우스를 가져가면 정확한 수를 확인하실 수 있습니다.
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의 우측에서 실행 쿼리를 수정하여 실행 데이터를 혼동 행렬에 입력합니다:
summary를summaryTable로 변경합니다.- 사용자 지정 테이블 id를
tableKeys의 첫 번째 항목으로 입력합니다. 이것은wandb.Table를 로그한 키입니다. 제 경우,confusion_matrix입니다. - 커리 에디터의 드롭다운 메뉴를 사용하여, wandb.Table의 "Count"에 로그된 값이 Vega 차트의 “count” 필드, “actual” 필드의 “Actua”열로 읽히도록, 일치하는 필드를 연결합니다. 최종 쿼리는 다음과 같아야 합니다.
원하는 대로 사용자 지정하기
Vega spec을 편집함으로써, 차트의 높이, 폭, 색 배합을 조정할 수 있습니다. 예를 들어 이 차트는 색상에서 "scale" : {"scheme" : "rainbow"}를 사용하여 실행의 색상을 변경합니다.
여기서 파란색에 가까운 색상은 더 많은 훈련 예시/더 많은 에포크에 해당하며, 일반적으로 대각선을 따라 더 강력한 퍼포먼스를 보여줍니다. 단지 “animal(동물)”로 분류된 Mollusks(연체동물)과 Reptiles(파충류)로 분류된 Amphibians(양서류)는 가장 큰 모델 (10개 에포크 동안 10,000개의 예시에 대한 훈련) 에서의 가장 일반적인 두 가지 실수입니다. 특정 셀에서 심지어 10배나 적은 데이터를 가진 녹색 "NT 1000, E 10" 모델이 가장 큰 파란 색 "NT 10000, E 10" 모델을 능가하는 것을 확인하는 것은 정말 흥미롭습니다.