강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

고동협님의 프로필 이미지
고동협

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

작업형2 모의문제1

코드 검토

작성

·

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

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

데이터를 잘못 불러왔어요

test 데이터에는 Attrition_Flag 컬럼 자체가 없어요

고동협님의 프로필 이미지
고동협
질문자

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

고동협님의 프로필 이미지
고동협
질문자

그리고 저렇게 코드 제출하면 문제가 많을까요

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

아니요 원인을 찾았어요

데이터를 합치려면 전처리 시작할 때

Attrition_Flag 컬럼은 target으로 분리가 필요한데 그 코드가 없네요

 

그대로 합치고 분리하다보니

Attrition_Flag컬럼이 테스트에도 생겼어요

 

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

꿀팁 섹션에서 작업형2 한가지 방법으로 풀기 확인 부탁드려요

0

안녕하세요, 인프런 AI 인턴입니다. 고동협님.

코드 검토 요청에 대해 자세히 안내드리겠습니다. 전반적으로 작성된 코드는 잘 구성되어 있으며, 데이터 전처리, 모델 학습 및 평가, 결과 제출까지의 흐름이 명확하게 나옵니다. 하지만 몇 가지 추가 설명과 포인트에 대해 말씀드리겠습니다.

코드 검토 및 설명

  1. Attrition_Flag 컬럼 드롭 관련

    • 문제 상황: Attrition_Flag 컬럼을 원본 test 데이터에서 드롭하도록 수정한 이유는, 테스트 데이터에서는 예측을 위한 입력 변수만 필요하고 타겟 변수가 존재할 필요가 없기 때문입니다. 만약 이 컬럼이 포함되어 있다면, 학습된 모델은 이 정보를 가지고 예측을 시도하게 되어 의미 없는 결과가 나오거나 오류를 발생시킬 수 있습니다.
    • 해결 방법: 모델의 최대한의 성능 발휘를 위해 레이블이 없는 상태로 입력 데이터를 제공하는 것이 올바른 접근 방식입니다.
  2. 원핫 인코딩과 데이터 병합

    • pd.get_dummies 를 사용하여 범주형 변수를 원-핫 인코딩 하셨습니다. train과 test를 합친 뒤 인코딩함으로써, 같은 컬럼 수를 유지할 수 있는 좋은 방법이 적용되었습니다.
    • 테스트와 학습 데이터가 올바르게 분리되어 있는지 확인하는 것이 중요하고, 이 과정은 잘 구성되어 있습니다.
  3. 예측 및 평가

    • 모든 주요 모델 평가 지표인 Accuracy, F1, Precision, Recall, ROC-AUC 등을 사용하였고, 이들은 모델의 다양한 측면을 평가할 수 있게 해 주어 적합합니다.
    • 평가 시 predict 대신 predict_proba를 사용하여 ROC-AUC를 계산한 것도 촉이 좋은 부분입니다.
  4. 제출 파일 생성

    • 결과물을 CSV 파일로 저장하는 단계에서 test 데이터의 CLIENTNUM을 예비하고 예측 확률을 Attrition_Flag로 저장하여 제출합니다. 이 부분도 제시된 문제 양식을 고려할 때 정확합니다.
  5. 검증 데이터 분할

    • train_test_split을 통해 데이터를 80:20으로 나눈 것은 데이터 과적합을 방지하고 일반화 성능을 평가하는 데에 효과적입니다.

추가 개선사항

  • 데이터 결측값: 현재 코드에는 isnull().sum()을 통해 결측치를 검사하고 있지만, 실제 결측치가 있다면 이를 처리하는 부분이 필요할 수 있습니다. fillna() 등을 사용하여 결측치를 처리해야 할 수 있습니다.
  • 랜덤 시드 고정: RandomForestClassifiertrain_test_split 에서 random_state 를 설정한 것처럼, 코드 전반적으로 실행의 재현성을 높일 수 있도록 추가적인 random_state 설정 가능성을 고려할 수 있습니다.

아래 링크에서 비슷한 문제 사례와 해결 방법을 참고하실 수 있습니다: 작업형2 모의문제1

질문해 주신 사항이 유익하길 바라며, 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

고동협님의 프로필 이미지
고동협
질문자

앞으로 다른 문제에서 제출단계에서 타겟변수를 항상 drop하여 진행하면 될까요 ??

고동협님의 프로필 이미지
고동협

작성한 질문수

질문하기