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

Jay님의 프로필 이미지
Jay

작성한 질문수

스파크 머신러닝 완벽 가이드 - Part 1

인코딩 개요 및 레이블 인코딩 실습

StringIndexer와 IndexToString (vectorassembler)

작성

·

410

0

스파크 환경에서 모델링 단계(VectorAssembler부터 이해가 안되어서 일단 쭉 듣고 있습니다.) 대한 개념이 모호해서 쭉 몇회씩 돌린다는 느낌으로 듣는 중인데요,

[인코딩 개요 및 레이블 인코딩 실습]의 8:00 ~ 8:45 구간에서

(StringIndexer는 fit이 있지만)

"IndexToString 는 fit 없이 transform만 있다. VectorAssembler와 같이 transform만 있다."

라는 식으로 말씀을 주셨는데 이 transform만 가능하다는 점이 모호해서 질문드립니다.

fit을 해줘야 하는 경우(StringIndexer)와 transform만 해줘도 되는 경우(IndexToString)를 바로 구분할 수 있을 만한 포인트(차이점)가 있을지 궁금합니다. 이런 경우들을 일일히 다 외워줘야 하는걸까요, 아니면 어떤 규칙성 같은 게 있을까요?

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

스파크 머신러닝의 fit()과 transform()은 초기 버전에서 개선하면서 점차 사이킷런 API와 유사하게 만들려고 한것 같은데, 여전히 초기 버전과 혼합되어 있는 부분들이 있습니다.

어쩠든, 보통 Lable encoding을 할때는 fit()을 해서 코드값이 몇개가 있는지, 어떻게 만들어야 하는지를 먼저 결정해주는 것이 필요합니다. 왜냐하면 일반적으로 학습 데이터로 fit()한 모델을 이용해서 테스트 데이터를 transform() 해주는 것을 적용하는 것이 encoding입니다.

좀 더 복잡한 애기일 수 있지만, 학습 데이터를 label encoding 하기 위해서는 학습 데이터로 fit()하고 학습 데이터를 transform() 하면 됩니다. 하지만 테스트 데이터는 테스트 데이터로 fit() 하지 않고 학습 데이터로 fit()한 모델을 이용해서 transform() 해야 합니다. 그래야 학습 데이터 A, B, C가 0, 1, 2 로 변환되었다고 한다면 테스트 데이터도 A, B, C 가 0, 1, 2 로 변환이 됩니다. 때문에 인코딩 시에는 fit()과 transform()을 적용합니다.

그런데 인코딩 된 값을 다시 원본 값으로 만들때는 이런 부분을 고려할 필요가 거의 없기 때문에 transform()만 적용하는 것 같습니다.

결론적으로 말씀 드리자면, 이런 백그라운드 요건 사항을 이해하는 것도 필요하지만, 이걸 바로 구분할 수 있는 포인트로 간주하기는 어렵습니다. 어느정도 외우는 것이 생산성에 좀 더 도움이 될 수 있습니다.

감사합니다.

Jay님의 프로필 이미지
Jay

작성한 질문수

질문하기