해결된 질문
작성
·
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)
위 사진은 제 코드를 실행하여 만든 csv파일의 내용입니다.
다음 사진은 강사님 코드의 실행 결과입니다.
답변 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 모의고사를 준비 중이시군요. 코드와 사진을 통해 제출 파일에서의 결과 차이에 대한 문제를 확인하고 싶으신 것 같습니다. 아래에서 발생할 수 있는 문제점과 해결책에 대해 안내드리겠습니다.
데이터 타입 변경
object
타입을 category
타입으로 변경하면 인코딩 과정은 필요치 않습니다. 이는 LightGBM의 장점 중 하나입니다.Target Label과 예측:
predict_proba
메서드를 사용할 때, pred[:, 1]
은 각 샘플이 클래스 1에 속할 확률을 반환합니다. 코드에서 추가적인 전처리나 설정이 없어도 될 것 같습니다.pred
로 부여되는 클래스 확률을 잘못 취급할 수도 있는 가능성을 확인해야 합니다. submit
데이터프레임 구성 시, submit = pd.DataFrame({'CLIENTNUM':test['CLIENTNUM'], 'Attrition_Flag':pred[:,1]})
라인이 올바르게 작성된 것으로 보고 있습니다.클라이언트 넘버 오차:
CLIENTNUM
을 포함시킬 때도 고려할 점이 있습니다. 만약 해당 열의 값이나 형식이 예기치 않게 변경된다면, 예측과 다른 방향의 결과가 나올 수 있습니다. 데이터 입력 시 CSV 파일의 해당 열을 올바르게 참조해야 합니다.랜덤 시드 및 모델 파라미터:
random_state=0
이 잘 설정되었지만, 외부에서 성능에 영향을 줄 수 있는 추가 파라미터 조정이 있었다면 확인이 필요합니다.강사님 코드와 차이:
추천 링크에서 유사한 문제를 다룬 답변이 도움이 될 수 있습니다:
- 작업형2 예시 문제 해결 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.