인프런 커뮤니티 질문&답변
코드 검토
작성
·
61
0
안녕하세요 혼자 문제 풀이를 해보다가 제가 작성한 코드들이 문제가 없는지 여쭤보고싶습니다.
그리고 마지막 제출단계에서 test 데이터에 'Attritino_Flag'를 삭제했는데 (drop을 안시키고 작성했는데 오류가 뜨더니 자동으로 drop시키는 코드로 수정되었습니다.) 왜 삭제해야 오류가 안나는지 궁금합니다.
# 1. 문제 정의 (분류) target: Atrrition_Flag(1: 이탈, 0: 유지)
# 2. 데이터 불러오기
# 3. 탐색적 데이터 분석(EDA)
# train.info() # dtypes: float64(5), int64(11), object(5)
# train.isnull().sum() # 0
# train.describe(include='O')
# test.info() # dtypes: float64(5), int64(10), object(5)
# test.isnull().sum() # 0
# train['Attrition_Flag'].value_counts() # 0: 6815, 1: 1286
# 4. 데이터 전처리(인코딩, 데이터 전처리)
# 4-1. 원핫인코딩
data = pd.concat([train, test], axis = 0)
data = pd.get_dummies(data)
train = data.iloc[:len(train)].copy()
test = data.iloc[len(train):].copy()
# train.info() # bool(23), float64(6), int64(10)
# test.info() # bool(23), float64(6), int64(10)
# 5. 검증 데이터 나누기
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(
train.drop('Attrition_Flag',axis=1), train['Attrition_Flag'], test_size = 0.2, random_state = 0
)
# 6. 모델 학습 및 평가
# 6-1. 모델불러오기
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state=0)
# 6-2. 학습(fit)
rf.fit(X_tr, y_tr)
# 6-3. 예측(predict)
pred = rf.predict(X_val)
# 6-4. 예측 결과 확인
# pred[:10]
# rf.classes_
# pred
# 6-5. 평가
# 평가: ROC-AUC, 정확도(Accuracy), F1, 정밀도(Precision), 재현율(Recall)
from sklearn.metrics import roc_auc_score, accuracy_score, f1_score, precision_score, recall_score
accuracy = accuracy_score(y_val, pred)
print('accuracy:',accuracy) # accuracy: 0.9549660703269587
f1 = f1_score(y_val, pred)
print('f1:',f1) # f1: 0.8381374722838137
precision = precision_score(y_val, pred)
print('precision:',precision) # precision: 0.9264705882352942
recall = recall_score(y_val, pred)
print('recall:',recall) # recall: 0.7651821862348178
pred = rf.predict_proba(X_val)
roc_auc = roc_auc_score(y_val, pred[:,1])
print('roc_auc:',roc_auc) # roc_auc: 0.9860421123349186
# 7. 제출
pred = rf.predict_proba(test.drop('Attrition_Flag', axis=1))
pred
submit = pd.DataFrame({
'CLIENTNUM': test['CLIENTNUM'],
'Attrition_Flag': pred[:,1]
})
submit.to_csv('000000.csv',index=False)답변 2
0
안녕하세요, 인프런 AI 인턴입니다. 고동협님.
코드 검토 요청에 대해 자세히 안내드리겠습니다. 전반적으로 작성된 코드는 잘 구성되어 있으며, 데이터 전처리, 모델 학습 및 평가, 결과 제출까지의 흐름이 명확하게 나옵니다. 하지만 몇 가지 추가 설명과 포인트에 대해 말씀드리겠습니다.
코드 검토 및 설명
Attrition_Flag 컬럼 드롭 관련
- 문제 상황:
Attrition_Flag컬럼을 원본test데이터에서 드롭하도록 수정한 이유는, 테스트 데이터에서는 예측을 위한 입력 변수만 필요하고 타겟 변수가 존재할 필요가 없기 때문입니다. 만약 이 컬럼이 포함되어 있다면, 학습된 모델은 이 정보를 가지고 예측을 시도하게 되어 의미 없는 결과가 나오거나 오류를 발생시킬 수 있습니다.
- 해결 방법: 모델의 최대한의 성능 발휘를 위해 레이블이 없는 상태로 입력 데이터를 제공하는 것이 올바른 접근 방식입니다.
- 문제 상황:
원핫 인코딩과 데이터 병합
pd.get_dummies를 사용하여 범주형 변수를 원-핫 인코딩 하셨습니다. train과 test를 합친 뒤 인코딩함으로써, 같은 컬럼 수를 유지할 수 있는 좋은 방법이 적용되었습니다.
- 테스트와 학습 데이터가 올바르게 분리되어 있는지 확인하는 것이 중요하고, 이 과정은 잘 구성되어 있습니다.
예측 및 평가
- 모든 주요 모델 평가 지표인 Accuracy, F1, Precision, Recall, ROC-AUC 등을 사용하였고, 이들은 모델의 다양한 측면을 평가할 수 있게 해 주어 적합합니다.
- 평가 시
predict대신predict_proba를 사용하여 ROC-AUC를 계산한 것도 촉이 좋은 부분입니다.
- 모든 주요 모델 평가 지표인 Accuracy, F1, Precision, Recall, ROC-AUC 등을 사용하였고, 이들은 모델의 다양한 측면을 평가할 수 있게 해 주어 적합합니다.
제출 파일 생성
- 결과물을 CSV 파일로 저장하는 단계에서
test데이터의CLIENTNUM을 예비하고 예측 확률을Attrition_Flag로 저장하여 제출합니다. 이 부분도 제시된 문제 양식을 고려할 때 정확합니다.
- 결과물을 CSV 파일로 저장하는 단계에서
검증 데이터 분할
train_test_split을 통해 데이터를 80:20으로 나눈 것은 데이터 과적합을 방지하고 일반화 성능을 평가하는 데에 효과적입니다.
추가 개선사항
- 데이터 결측값: 현재 코드에는
isnull().sum()을 통해 결측치를 검사하고 있지만, 실제 결측치가 있다면 이를 처리하는 부분이 필요할 수 있습니다.fillna()등을 사용하여 결측치를 처리해야 할 수 있습니다.
- 랜덤 시드 고정:
RandomForestClassifier와train_test_split에서random_state를 설정한 것처럼, 코드 전반적으로 실행의 재현성을 높일 수 있도록 추가적인 random_state 설정 가능성을 고려할 수 있습니다.
아래 링크에서 비슷한 문제 사례와 해결 방법을 참고하실 수 있습니다: 작업형2 모의문제1
질문해 주신 사항이 유익하길 바라며, 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






test 데이터에 Attrition_Flag 컬럼 자체가 없어서 drop을 안시켰는데 혹시 어느 부분에서 틀린걸까요 ..?