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

dksduswn22님의 프로필 이미지

작성한 질문수

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

3회 기출유형(작업형2)

작업형 2유형 확률 결과값

해결된 질문

24.06.17 04:34 작성

·

129

1

안녕하세요 선생님! 작업형 2유형 확률 문제를 풀다가 결과값 관련해서 문의드립니다

 

문제에 제시된 pred 예시형태는 소수점 형태인데 제가 코딩해서 제출한 csv 파일을 확인해보면 거의 매번 0 혹은 1로 나옵니다

스케일링은 안하고 object 인코딩만 해주고 있는데 제가 코딩을 잘못 하고 있는 것인지, 채점 관련해서 상관없을지 궁금해서 여쭤봅니다!

(roc_auc score는 0.7616337491337491 나왔습니다)


 

답변 2

1

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

2024. 06. 17. 17:20

안녕하세요!

혹시 어디선가 변수명을 잘 못 사용한 것은 아닌가 의심이 들어요

위 결과는 predict()의 결과이지

predict_proba의 결과가 아니거든요

 

예측부터 생성까지 코드를 코드 블럭을 사용해서 공유해 주시겠어요?

image

dksduswn22님의 프로필 이미지
dksduswn22
질문자

2024. 06. 18. 20:07

네 선생님!

말씀해주신대로 코드 올리려고 다시 작성해봤는데 결과값이 제대로 나와요...ㅜㅜ

제가 validation 돌릴 때는 제대로 작성했는데 test_predict 돌릴때 proba를 계속 안 쓰고 있었나봅니다

봐주셔서 감사합니다..!..

image

import pandas as pd
train = pd.read_csv("./sample_data/train.csv")
test = pd.read_csv("./sample_data/test.csv")

##EDA 데이터 확인

#train.shape
#test.shape
#train.head()
#test.head()

##결측치 확인 >>없음
#train.isnull().sum()
#test.isnull().sum()

#object 확인
#train.info() // object Employment Type, GraduateOrNot, FrequentFlyer, EverTravelledAbroad
#test.info() // object Employment Type, GraduateOrNot, FrequentFlyer, EverTravelledAbroad

#타겟값 >> TravelInsurance
#train.head()


##object 전처리
from sklearn.preprocessing import LabelEncoder
cols = train.select_dtypes(include='object').columns

for col in cols:
  le = LabelEncoder()
  train[col] = le.fit_transform(train[col])
  test[col] = le.transform(test[col])

#train.head()
#train.info()
#test.head()
#test.info()


##데이터 분리
from sklearn.model_selection import train_test_split

X_tr,X_val,y_tr,y_val = train_test_split(
                          train.drop('TravelInsurance',axis=1),
                          train['TravelInsurance'],
                          test_size = 0.2,
                          random_state = 2022
)

#X_tr.head()


##모델링
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=2022)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)[:,1]


##평가
from sklearn.metrics import roc_auc_score
roc_auc_score(y_val,pred)

pred = model.predict_proba(test)[:,1]
pred


##제출
submit = pd.DataFrame({
      'index':test.index,'y_pred':pred
}).to_csv('result.csv',index=False)

pd.read_csv('result.csv')


##y_test
#y_test = pd.read_csv("./sample_data/y_test.csv")
#roc_auc_score(y_test, pred)

1

인프런 AI 인턴님의 프로필 이미지

2024. 06. 17. 04:36

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

작업형 2유형에서 확률 값이 아닌 0 혹은 1로만 나오는 현상은 모델의 predict 함수 사용과 관련이 있을 수 있습니다. 일반적으로 분류 문제에서는 predict_proba 메서드를 사용하여 각 클래스에 대한 확률 값을 얻고, predict 메서드는 이 확률 값에 기반하여 최종적으로 예측된 클래스(0 혹은 1)를 반환합니다. 문제에서 예시로 제시된 pred 예시 형태가 소수점 형태라면, predict_proba를 사용해야 합니다.

성능 지표로 roc_auc score를 사용하는 경우, 모델이 클래스의 확률을 예측하는 방식이 중요합니다. AUC (Area Under the Curve)는 모델이 예측한 확률 값의 순위를 기반으로 합니다. 따라서 확률 값이 필요합니다. 이미 언급하신 roc_auc score는 실제로 모델이 어느 정도의 성능을 보이고 있는지 가늠할 지표가 됩니다. 제출해야 하는 값이 확률 값인지, 아니면 예측된 클래스 값(0 혹은 1)인지는 문제의 요구 사항에 따라 다를 수 있습니다.

해당 문제에 대한 직접적인 답변으로, 작업형 2유형 문제에서 확률 값을 요구하는 경우 predict_proba 함수의 사용이 적절하며, 제출하기 전에 결과값의 형태를 문제의 요구사항에 맞추어 조정할 필요가 있습니다. 예를 들어, 확률 값을 0과 1의 예측값으로 바꿀 필요가 없다면, predict_proba의 결과를 그대로 사용하면 됩니다.

어떤 모델을 사용하셨는지는 명시되어 있지 않으나, 모델이 반환해야 하는 값이 확률값인 경우 그대로 predict_proba 값을 제출 파일로 만들어야 하며, 이는 모델이 각 클래스에 속할 확률을 얼마나 잘 예측하는지를 평가하는 지표와 일치합니다. 스케일링을 하지 않고 진행한 것과 결과값에 대해 걱정하신 부분은, 스케일링은 모델 학습에 영향을 줄 수 있는 전처리 단계의 하나이기 때문에, 스케일링의 유무가 모델의 확률값 예측에도 영향을 줄 수 있습니다.

roc_auc score가 0.7616으로 나왔다면, 모델이 어느 정도 성능을 내고 있음을 나타냅니다. 다만, 최종적으로 제출해야 하는 값이 확률값인지 아니면 이진 분류 결과인지 확인하고, 문제의 요구사항에 따라 결과를 조정하여 제출해야 합니다.

비슴한 질문에 대한 자세한 설명이 필요하시면, 다음의 답변을 참조해 주세요:

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

dksduswn22님의 프로필 이미지
dksduswn22
질문자

2024. 06. 17. 04:55

답변 감사드립니다!

제가 사용한 모델은 RandomForestClassifier이고

평가지표가 roc_auc_score라서 predict_proba 메서드를 사용했습니다!

이미 predict_proba 메서드를 사용했는데도 결과값이 확률이 아니라 0 혹은 1 이진분류로 나왔다면 원인은 전처리 밖에 없을지 궁금합니다!