강의

멘토링

로드맵

Inflearn brand logo image

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

윤소연님의 프로필 이미지
윤소연

작성한 질문수

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

작업형2 모의문제1

작업형2, 모의고사1, lightgbm

해결된 질문

작성

·

45

0

마지막 팁 부분을 먼저 보고 기출 연습을 하고 있는데요, lightgbm을 하는 경우 object 자료형을 category 자료형으로 바꿔주면 인코딩을 따로 할 필요가 없다고 하여 이 방법으로 연습을 진행하고 있습니다. 또, 성능평가를 구하지 않아도 감점되지 않는다고 하여 오류가 나지 않은 한 인코딩과 성능평가 없이 lightgbm으로 푸는 방법으로 연습 중인데, 아래 코드가 제가 작성한 코드입니다. 오류가 나지 않지만, 제출 파일의 내용을 확인한 결과 강사님의 최종 결과와 차이가 있었습니다. (Attrition_Flag 값의 차이)
뭐가 잘 못된 건가요...?

import pandas as pd

train = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ceredit%20card/train.csv")
test =  pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ceredit%20card/test.csv")
# train = pd.read_csv("train.csv")
# test =  pd.read_csv("test.csv")

# #문제 정의
# 평가: ROC-AUC, 정확도(Accuracy), F1, 정밀도(Precision), 재현율(Recall)을 구하시오
# target : Attrition_Flag (1:이탈, 0:유지)
# csv파일 생성 : 수험번호.csv
# ROC-AUC -> 분류

# eda
# print(train.shape, test.shape) # (8101, 21) (2026, 20)
# print(train.info())
# print(test.info())
# print(test.head())

# object -> category
cols = train.select_dtypes(include='object')
for col in cols:
  train[col] = train[col].astype('category')
  test[col] = test[col].astype('category')
# 검증 데이터 분리
y_train = train.pop('Attrition_Flag')
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, test_size=0.2, random_state=0)
# lightgbm 학습 및 예측
import lightgbm as lgb
model = lgb.LGBMClassifier(random_state=0, verbose=-1)
model.fit(X_tr, y_tr)
pred = model.predict_proba(X_val)
# print(model.classes_) # target : Attrition_Flag (1:이탈, 0:유지)
# 결과: [0 1] -> 유지 이탈 (이 순서임)

# 성능 평가

# test 예측 및 제출
pred = model.predict_proba(test)
# print(pred.shape)
# print(test.shape)
# print(pred)
submit = pd.DataFrame(
    {'CLIENTNUM':test['CLIENTNUM'],
    'Attrition_Flag':pred[:,1]})
submit.to_csv('수험번호.csv', index=False)
# 제출 파일 확인
# print(pd.read_csv('수험번호.csv').shape) # (2026, 1) -> test.shape(2026, 20)
image.png

위 사진은 제 코드를 실행하여 만든 csv파일의 내용입니다.

다음 사진은 강사님 코드의 실행 결과입니다.

image.png

 

답변 2

0

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

제가 해도 똑같은 결과를 만들기 어려워요!

작업형1과 3은 정확한 정답이 있음

작업형2는 평가지표로 채점합니다.

각 개별 값의 비교는 큰 의미가 없고 제 결과가 정답이 아니에요!

 

그리고

성능 평가를 생략할 생각이라면

from sklearn.model_selection import train_test_split 
X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, test_size=0.2, random_state=0) 

가 필요가 없어요

import lightgbm as lgb 
model = lgb.LGBMClassifier(random_state=0, verbose=-1) 
model.fit(train, y_train)

으로 가는 것이 맞고

 

성능을 평가 한다면 데이터를 분할 하는 것이 맞습니다.

0

안녕하세요, 인프런 AI 인턴입니다. 윤소연님.

lightGBM을 이용해 작업형2 모의고사를 준비 중이시군요. 코드와 사진을 통해 제출 파일에서의 결과 차이에 대한 문제를 확인하고 싶으신 것 같습니다. 아래에서 발생할 수 있는 문제점과 해결책에 대해 안내드리겠습니다.

주요 문제 및 개선 사항

  1. 데이터 타입 변경

    • 작성하신 대로, object 타입을 category 타입으로 변경하면 인코딩 과정은 필요치 않습니다. 이는 LightGBM의 장점 중 하나입니다.
  2. Target Label과 예측:

    • LightGBM 모델의 predict_proba 메서드를 사용할 때, pred[:, 1]은 각 샘플이 클래스 1에 속할 확률을 반환합니다. 코드에서 추가적인 전처리나 설정이 없어도 될 것 같습니다.
    • 그러나 결과 파일의 차이가 있다는 점에서, pred로 부여되는 클래스 확률을 잘못 취급할 수도 있는 가능성을 확인해야 합니다. submit 데이터프레임 구성 시, submit = pd.DataFrame({'CLIENTNUM':test['CLIENTNUM'], 'Attrition_Flag':pred[:,1]}) 라인이 올바르게 작성된 것으로 보고 있습니다.
  3. 클라이언트 넘버 오차:

    • CLIENTNUM을 포함시킬 때도 고려할 점이 있습니다. 만약 해당 열의 값이나 형식이 예기치 않게 변경된다면, 예측과 다른 방향의 결과가 나올 수 있습니다. 데이터 입력 시 CSV 파일의 해당 열을 올바르게 참조해야 합니다.
  4. 랜덤 시드 및 모델 파라미터:

    • random_state=0이 잘 설정되었지만, 외부에서 성능에 영향을 줄 수 있는 추가 파라미터 조정이 있었다면 확인이 필요합니다.
  5. 강사님 코드와 차이:

    • 작성한 예측과 강사님의 예측 값이 다르다면, 이는 전체적인 데이터 전처리나 모델 세부 설정 차이에서 기인할 수 있습니다. 전처리 과정의 미세한 차이도 큰 영향을 줄 수 있습니다.

제안

  • 전처리 혹은 데이터 불러오기 부분에서 미세한 차이를 확인하시고, 강사님의 구체적인 설정이나 파라미터들을 확인해야 합니다.
  • 만약 다른 영역(예: 데이터셋 링크)이 바뀌는 등의 문제가 발생한 것이 아니라면, 이러한 차이를 체크리스트 형태로 점검해 보시는 것이 좋습니다.
  • 유사한 코드나 강사님의 답안을 참고하여 차이점, 특히 전처리 및 모델 설정의 미세한 부분을 비교해 보세요.

추천 링크에서 유사한 문제를 다룬 답변이 도움이 될 수 있습니다:
- 작업형2 예시 문제 해결 방법

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

윤소연님의 프로필 이미지
윤소연

작성한 질문수

질문하기