작성
·
36
답변 1
0
네 이 에러는 훈련시에는 없었던 새로운 카테고리가 테스트 할때 포함되서 나오는 오류 입니다. 이 에러가 나면 훈련시 컬럼과 테스트 컬럼을 비교해보셔야합니다. 아마도 문자를 숫자로 변환하는 과정에서 훈련과 테스트간에 데이터 불일치가 있어보입니다. 전체 코드가 어떻게 되죠?
네 ~ 아래와 같이 모델을 만들어보았습니다.
훈련데이터에 unknown 을 포함시키면 해결되는데요.
실제 시험때 이렇게 나오면 아마 많은 수강생들이 못풀거라서 이렇게 문제가 나오지는
않을것 같습니다.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
# 데이터 로드
train = pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/data/main/exam/7_2_train.csv')
test = pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/data/main/exam/7_2_test.csv')
# 데이터 분리
X_train = train.drop(['ID', 'Target'], axis=1)
y_train = train['Target']
X_test = test.drop(['ID', 'Target'], axis=1)
# 카테고리 변수 처리
for col in X_train.select_dtypes(include='object').columns:
train_values = set(X_train[col])
X_test[col] = X_test[col].apply(lambda x: 'UNKNOWN' if x not in train_values else x)
le = LabelEncoder()
le.fit(list(X_train[col]) + ['UNKNOWN'])
X_train[col] = le.transform(X_train[col])
X_test[col] = le.transform(X_test[col])
# 피처 엔지니어링 (성적 비율)
if 'Curricular units 1st sem (approved)' in X_train.columns:
X_train['approval_rate'] = X_train['Curricular units 1st sem (approved)'] / (X_train['Curricular units 1st sem (enrolled)'] + 1)
X_test['approval_rate'] = X_test['Curricular units 1st sem (approved)'] / (X_test['Curricular units 1st sem (enrolled)'] + 1)
# 결측치 처리 및 스케일링
X_train = X_train.fillna(X_train.median())
X_test = X_test.fillna(X_train.median())
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 앙상블 모델 (성능 UP!)
rf = RandomForestClassifier(n_estimators=100, class_weight='balanced', random_state=42)
lr = LogisticRegression(class_weight='balanced', random_state=42)
ensemble = VotingClassifier([('rf', rf), ('lr', lr)], voting='soft')
# 성능 확인
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
ensemble.fit(X_tr, y_tr)
val_pred = ensemble.predict(X_val)
print(f"검증 Macro F1-score: {f1_score(y_val, val_pred, average='macro'):.4f}")
# 전체 학습 및 예측
ensemble.fit(X_train, y_train)
pred = ensemble.predict(X_test)
# 제출 파일
result = pd.DataFrame({'ID': test['ID'], 'pred': pred})
result.to_csv('submission.csv', index=False)
print("완료!")
강사님 강의 기출문제는 모두 풀고 연습을 하여 다른 교재를 사서 풀이하던중에 오류가 나서 질문을 드렸는데 실례가 안되면 답변 주시면 많은 도움 될 것 같습니다.,,ㅜㅜ
아래 문제입니다