본문 바로가기
데이터분석과 AI/데이터분석과 AI 문법(Python)

데이터분석 초보자가 자주하는 실수- 정확도, 정밀도, 재현율, F1-score 까지 모든 성능지표가 1인 경우

by 우공80 2023. 6. 30.
728x90

초보자의 실수

 

데이터 분석과 머신러닝을 처음 했을 접할 무렵에, 희한하게 모든 성능지표가 1이거나 1에 매우 가까운 경우를 종종 발견합니다. 분명히 무언가 잘못되었을 텐데, 처음에는 성능이 높다고 생각하기 쉽죠. 

 

오류 메시지가 나오지 않지만, 코딩 오류이며, 일종의 과적합입니다.

예시로 두 가지를 들어보겠습니다.

 

1. 검증 데이터가 학습 데이터의 부분집합이 되면 발생합니다.

예를 들어 train_test_split 안 쓰고 행수 기준 20% 잘라서 쓰면서,  80%, 20%로 안 쓰고, 100%, 20% 쓰는 경우 발생합니다.

import pandas as pd

#학습데이터에서 검증데이터를 분리하고, 삭제하지 않음
X_train=pd.DataFrame({
    'ID':[1,2,3,4,5,6,7,8,9,10],
    'age':[10,20,30,40,50,60,70,80,90,100]})  


y_train=[0,1,0,1,0,1,0,1,0,1]

X_val=pd.DataFrame({
    'ID':[1,2,3],
    'age':[10,20,30]})

y_val=[0,1,0]

from sklearn.tree import DecisionTreeClassifier

dt=DecisionTreeClassifier()

dt.fit(X_train,y_train)

pred=dt.predict(X_val)

from sklearn.metrics import f1_score,accuracy_score,recall_score,precision_score

print("f1_score:",f1_score(y_val,pred))
print("accuracy:",accuracy_score(y_val,pred))
print("recall:",recall_score(y_val,pred))
print("precision:",precision_score(y_val,pred))

Output:

f1_score: 1.0
accuracy: 1.0
recall: 1.0
precision: 1.0

1. 데이터에서 label 값을 제대로 분리하지 않으면 발생합니다.

아래에서는 X_train에서 y_train을 분리하면서, X_train에서 y_train을 제거하지 않았습니다. 이런 경우에는 학습데이터에서 이미 정답을 알고 있게 되므로 성능지표가 높게 나타납니다. 혹은 label값과 상관관계가 매우 높은 변수가 존재하는 경우에도 높게 나타납니다. 

import pandas as pd

X_train=pd.DataFrame({
    'ID':[4,5,6,7,8,9,10],
    'age':[40,50,60,70,80,90,100],
    'label':[1,0,1,0,1,0,1]})  # label을 제거하지 않음

y_train=[1,0,1,0,1,0,1]

X_val=pd.DataFrame({
    'ID':[1,2,3],
    'age':[10,20,30],
    'label':[0,1,0]}) # label을 제거하지 않음

y_val=[0,1,0]

from sklearn.tree import DecisionTreeClassifier

dt=DecisionTreeClassifier()

dt.fit(X_train,y_train)

pred=dt.predict(X_val)

from sklearn.metrics import f1_score,accuracy_score,recall_score,precision_score

print("f1_score:",f1_score(y_val,pred))
print("accuracy:",accuracy_score(y_val,pred))
print("recall:",recall_score(y_val,pred))
print("precision:",precision_score(y_val,pred))

Output:

f1_score: 1.0
accuracy: 1.0
recall: 1.0
precision: 1.0

간단하지만, 초보자 때 한 번쯤 겪을 만한 실수라 정리해 보았습니다.

728x90

댓글