해결된 질문
작성
·
51
0
XGBClassifier 를 사용해서 target을 분류하려고 하는데, 아래와 같은 에러가 나타납니다 : ValueError: Invalid classes inferred from unique values of y
. Expected: [0 1 2 3], got [1 2 3 4]
LabelEncoder를 사용해서 processing 도 다 했고, LGBMClassifier랑 RandomForestClassifier는 다 잘 돌아가는데 XGBClassifier만 저런 오류가 나타나네요;;; 참고를 위해 지금까지 작성한 코드 하기로 공유 드립니다 :
import pandas as pd
train=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
train=train.drop('ID', axis=1)
test_id=test.pop('ID')
print(train.shape, test.shape)
print(train.head())
print(test.head())
print(train.info())
print(test.info())
print(train.isnull().sum())
print(test.isnull().sum())
y=train.pop('Segmentation')
y=y.astype('object')
y=y.astype('category')
print(y.info(), y.shape)
int_cols=train.select_dtypes(exclude='object').columns
train[int_cols].corr()
cat_cols=train.select_dtypes(include='object').columns
print(train[cat_cols].describe(include='object'))
print(test[cat_cols].describe(include='object'))
for i in cat_cols:
train[i]=train[i].astype('object')
test[i]=test[i].astype('object')
for i in cat_cols:
print(train[i].value_counts())
print(test[i].value_counts())
from sklearn.preprocessing import RobustScaler
scaler=RobustScaler()
for i in int_cols :
train[i]=scaler.fit_transform(train[[i]])
test[i]=scaler.transform(test[[i]])
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
for i in cat_cols:
train[i]=le.fit_transform(train[i])
test[i]=le.transform(test[i])
print(train.head())
print(test.head())
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val=train_test_split(train, y, test_size=0.2, random_state=2025)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)
y_val=y_val.astype('category')
y_tr=y_tr.astype('category')
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(n_estimators=100, max_depth=5, random_state=2025)
rf.fit(X_tr, y_tr)
y_pred_rf=rf.predict(X_val)
from lightgbm import LGBMClassifier
lgbm=LGBMClassifier()
lgbm.fit(X_tr, y_tr)
y_pred_lgbm=lgbm.predict(X_val)
from sklearn.metrics import f1_score
print(f1_score(y_val, y_pred_rf, average='weighted'))
print(f1_score(y_val, y_pred_lgbm, average='weighted'))
from xgboost import XGBClassifier
xgb=XGBClassifier()
xgb.fit(X_tr, y_tr)
y_pred_xgb=xgb.predict(X_val)
답변 3
1
안녕하세요, 인프런 AI 인턴입니다. yaejin1016님.
XGBClassifier를 사용할 때 발생하는 에러인 “ValueError: Invalid classes inferred from unique values of y
. Expected: [0 1 2 3], got [1 2 3 4]” 문제는 XGBoost가 클래스 레이블을 0부터 시작하는 정수형 값을 기대하기 때문에 발생합니다. 이 문제를 해결하기 위해서는 y 값의 클래스를 0부터 시작하도록 변경해야 합니다.
비슷한 문제를 다룬 질문이 있어서, 해당 링크를 확인하시면 해결 방법에 도움이 될 수 있을 것입니다:
- 4회 기출 유형(작업형2)의 xgb 에러 관련
해당 게시물의 내용을 요약하자면, XGBoost 모델은 타겟 레이블이 0부터 시작해야 하므로, 현재 가진 타겟 레이블 [1, 2, 3, 4]를 [0, 1, 2, 3]으로 변경하시면 됩니다. 이 작업은 다음과 같이 진행할 수 있습니다:
y = y - 1
이렇게 하면, XGBoost 클래스와의 미스매치가 해결될 것입니다.
정확한 도움을 위해 추가적인 정보를 제공해 드립니다. 공개한 코드 시퀀스 후, 예측 결과를 원래의 타겟 레이블로 맞추기 위해 다음과 같은 역변환이 필요할 것입니다:
y_pred_xgb = y_pred_xgb + 1
이렇게 하면 예측된 결과를 원래의 타겟 레이블로 돌릴 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
xgb 모델 학습시 레이블이 반드시 0부터 시작해야 하며 이진 분류일 때는 0, 1
다중 분류일 때는 0, 1, 2... 로 되어야 합니다.
xgb 모델은 다른 모델과 달리 예민해요!
따라서 시험 때는 xgb 모델 보다는 랜덤포레스트 또는 lightgbm 을 추천합니다.
응원합니다 🙂
0