(Scikit-learn) F1 점수 계산

잘 문서화된 F1 점수에 대한 링크:

https://towardsdatascience.com/the-f1-score-bec2bbc38aa6

F1 점수

기계 학습의 F1 점수에 대해 알아야 할 모든 것. Python에서 F1 점수를 적용하는 예와 함께.

를 향하여datascience.com

* 세그먼테이션 결과와 GT의 정확도를 비교해야 해서 다시 검색해서 정리했습니다.

파일의 클래스가 균형이 맞지 않기 때문에 단순 정확도보다는 F1 점수로 비교하는 것이 더 적절해 보입니다.

아래 두 가지 방법 중 하나를 선택할 수 있습니다.

  • f1_score: 점수 평균 계산(매크로 단순 평균, 많음 또는 적음에 따른 가중 평균)
  • classification_report: 클래스별 점수 계산

1. 사용할 nifti 파일을 불러옵니다.

(Ground Truth, Segmentation Result)

import nibabel as nib
import numpy as np

### nifti open
gt_nii = nib.load(gt_path)
res_nii = nib.load(res_path)

### flatten
gt_data = np.ravel(gt_nii.get_fdata())
res_data = np.ravel(res_nii.get_fdata())

2. f1_score 계산

from sklearn.metrics import f1_score

### use f1_sgt_path, input_pathcore method in sklearn.metrics for calculating f1 score
f1 = f1_score(gt_data, res_data, labels=range({num of classes}), average="weighted") # OR macro
print(f1)

3. 또는 classification_report를 사용하여 각 클래스의 점수를 계산합니다.

from sklearn.metrics import f1_score, classification_report

f1 = classification_report(gt_data, res_data, labels=range({num of classes}), output_dict=True)
print(f1)

출력은 딕셔너리 형태로 반환되며 Pandas Library를 이용하여 데이터 프레임으로 만들어 저장할 수 있습니다.

+ 각 클래스의 실제 숫자를 세어본 결과, 정확도와 마찬가지로 필요하지 않아 지원 부분이 제거되었습니다.

++ Dictionary Type으로 반환된 결과값의 index는 0, 1, 2, …등의 값으로 표시된다.

class_list로 변경하여 이름을 변경하였다.

++ pop() 방식.. 시간낭비 하기 싫고 귀찮아서 그냥 꼼수를 써봤는데 다른 방법이 없을까요?

import pandas as pd

f1.pop('accuracy') # remove accuracy part(no needed)

class_list = ("Class1", "Class2", "Class3", "Class4", "Class5")
avg_dict = {"macro avg": "Average (Macro)", "weighted avg": "Average (Weighted)"}

### not necessary
for i in range(5): f1(class_list(i)) = f1.pop(str(i))
for j in avg_dict.keys(): f1(avg_dict(j)) = f1.pop(j)

### dict to json or csv(pandas.dataframe format) > save
df = pd.DataFrame.from_dict(f1, orient="index")
df = df.drop(('support'), axis=1) # remove support part(no needed)

### save dataframe as CSV file to the output path
df.to_csv(output_path, encoding='UTF-8')

### Output sample ###
                    precision    recall  f1-score
Class1               0.984853  0.987019  0.985934
Class2               0.906874  0.873714  0.889986
Class3               0.953823  0.967866  0.960793
Class4               0.939222  0.945311  0.942257
Class5               0.915214  0.902075  0.908597
Average (Macro)      0.939997  0.935197  0.937513
Average (Weighted)   0.970451  0.970622  0.970515