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
'데이터분석과 AI > 데이터분석과 AI 문법(Python)' 카테고리의 다른 글
수치형 데이터를 범주형으로 만드는 비닝(Binning)의 세 가지 방법 feat. Xverse (0) | 2023.07.06 |
---|---|
cross_val_score 할 때 scoring에 입력 가능한 파라미터 (0) | 2023.07.02 |
[Python] 그래프에서 한글 깨질 때, 폰트 확인, 한글 폰트 설정, 마이너스 표기 방법 (0) | 2023.06.28 |
Inplace=True 옵션을 썼는데, 데이터 변경이 안되는 경우 (0) | 2023.06.11 |
Label Encoidng 시 ValueError: y contains previously unseen labels:가 발생할 때 (0) | 2023.06.08 |
댓글