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

joy10780님의 프로필 이미지
joy10780

작성한 질문수

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

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

작업형 2 고민끝에 정리하여 질문드립니다.

해결된 질문

작성

·

235

·

수정됨

0

안녕하세요 선생님 저는 작업형 2를 아래와 같은 매커니즘으로 푸려고 합니다.


train.info()를 통해서 object 컬럼 확인

→ 만약 범주형 데이터가 있다면?

→ 라벨인코딩

(여기서 cols = train.select_dtypes(include='object').columns 로 해서 푸려고 합니다.)

target = train.pop('타겟컬럼')

train = train.drop('ID',axis=1)

test_ID = test.pop('ID')

train_test_split을 통해 검증데이터 분리

train_test_split(train, target, test_size=0, random_state=0)

<여기서 train과 target으로만 쓰기 위해서 위에서 pop과 drop을 진행했습니다.>

모델 예측 및 검증

무조건 랜덤포레스트로 진행하고 그 후에 하이퍼파라메터 튜닝으로 성능 비교해볼 생각입니다.

평가지표에 따른 성능 비교

하이퍼파라메터 튜닝 적용해보기

DataFrame 만들기

csv만들기


매커니즘에 따른 코드는 다음과 같습니다.

 

train.info()

 

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])

 

target = train.pop('타겟컬럼')

train = train.drop('ID',axis=1)

test_ID = test.pop('ID')

 

from sklearn.model_selection import train_test_split

X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0, random_state=0)

 

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(random_state=0, max_depth = 5, n_estimators = 500)

rf.fit(X_tr,y_tr)

pred = rf.predict(X_val)

 

from sklearn.metrics import f1_score

print(f1_score(y_val, pred, average='macro'))

 

pred = rf.predict(test)

 

submit = pd.DataFrame({

'ID' : test_ID,

'타겟컬럼' : pred

})

 

submit.to_csv('0000.csv', index=False)


여기서 질문은

1. pop과 drop을 저 단계에서 해줘도 무방한가요?

cols를 라벨 인코딩에서 먼저 정의해주게 되는데 그 이후에 pop과 drop써도 무방한지 여쭤봅니다.

2. 물론 어떤 데이터를 주냐에 따라 다르겠지만 위와 같은 과정으로 진행해도 점수획득에 큰 무리 없겠죠?

(교차검증등등은 진행하고 싶지 않아서요)

3. 범주형 데이터가 하나도 없다면? 그럴일이 없을거 같긴한대 그러면 인코딩단계만 빼고 그대로 진행하면되나용?

 

답변 1

0

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

  1. target = train.pop('타겟컬럼') 위치는 전처리 가장 위에 해주세요


    타겟이 범주형이면 함께 인코딩될 수도 있고, 타겟이 숫자면 함께 스케일링 되어버릴 수 있어요
    그리고 마지막 csv생성에서 pred 한컬럼만 최근 제출받고 있어요 id컬럼은 없을 수도 있습니다.

  2. 네 , 그동안40점에 큰 전처리 필요 없었어요 무리 없어 보입니다.

  3. 네 맞습니다. 인코딩 단계가 필요 없어요

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

  1. 전처리 가장 위에 해주라는 말씀이


    라벨 인코딩 들어가기 전에 적어주란 말씀이신가요?


    추가칠문) EDA 과정 먼저 진행하고! (EDA 과정은 필수인가요? 결측치가 있다면 어떻게 처리해라는 문제에서 주어지나요?

     )

    target = train.pop('타겟컬럼')
    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_test_split 해주구요!
    -> 이게 맞다면 무조건 이 틀로 진행하려하는데 이번에 업데이트해주신 <작업형 2 한가지 방법으로 풀기>에서는 pop의 위치가 train_test_split 단계에 있는 경우도 있더라구요!!! 분류문제든 회귀문제든 간에 pop의 위치는 무조건 인코딩 하기 전으로 알고 있으면 될까요

    2. 그 다음 데이터셋에 id 컬럼이 있을 때만 drop 써서 해주고?
    없다면 바로 train_test_split 가면 된다는 말씀이시죠?


    3.csv에서도 pred 한 컬럼만 제출받는다하면 위에서 test_ID = test.pop('ID') 는 안해도 되는거구요!



    맞게 이해한 것인지 확인한번 부탁드립니다

     

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

  1. 네 맞습니다. 전처리 가장위에 하시죠!

    (추가질문) EDA는 필수 아닙니다. 결측치 처리 방식은 안내하지 않아요! 작업형1은 안내하지만 작업형2는 정답이 있는 문제가 아니라서 알아서 처리가 필요합니다.


    (추가질문) 무조건 인코딩 하기 전으로 알고 있으면 될까요
    스케일링까지 있으면 순서 어떻게 하실건가요?
    결론: target pop - 스케일링 - 인코딩 순으로 해주세요

    2. id 컬럼이 있을 때만 drop 써서 해주고?
    일반적으로는 드롭하나 id가 숫자면 드롭 하지 않아도 모델에서 중요도를 낮게 책정합니다.

     


    3. 네 맞습니다 test_ID는 나중에 사용을 위해 남겨두었는데 제출시 필요 없다면 train에서 삭제 한다면 함께 날려도 됩니다.

joy10780님의 프로필 이미지
joy10780

작성한 질문수

질문하기