작성
·
42
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를 합친 뒤 인코딩함으로써, 같은 컬럼 수를 유지할 수 있는 좋은 방법이 적용되었습니다.예측 및 평가
predict
대신 predict_proba
를 사용하여 ROC-AUC를 계산한 것도 촉이 좋은 부분입니다.제출 파일 생성
test
데이터의 CLIENTNUM
을 예비하고 예측 확률을 Attrition_Flag
로 저장하여 제출합니다. 이 부분도 제시된 문제 양식을 고려할 때 정확합니다.검증 데이터 분할
train_test_split
을 통해 데이터를 80:20으로 나눈 것은 데이터 과적합을 방지하고 일반화 성능을 평가하는 데에 효과적입니다.isnull().sum()
을 통해 결측치를 검사하고 있지만, 실제 결측치가 있다면 이를 처리하는 부분이 필요할 수 있습니다. fillna()
등을 사용하여 결측치를 처리해야 할 수 있습니다.RandomForestClassifier
와 train_test_split
에서 random_state
를 설정한 것처럼, 코드 전반적으로 실행의 재현성을 높일 수 있도록 추가적인 random_state 설정 가능성을 고려할 수 있습니다.아래 링크에서 비슷한 문제 사례와 해결 방법을 참고하실 수 있습니다: 작업형2 모의문제1
질문해 주신 사항이 유익하길 바라며, 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
test 데이터에 Attrition_Flag 컬럼 자체가 없어서 drop을 안시켰는데 혹시 어느 부분에서 틀린걸까요 ..?