DEV Community

orca orcinus
orca orcinus

Posted on

머신러닝을 위한 데이터 전처리

1. 데이터 클리닝
-> 모델 학습에 방해가 되는 요소를 제거하거나 수정하여 데이터 품질을 올린다.

2. 데이터 트랜스포메이션
-> 데이터를 알고리즘이 다루기 좋은 형태/분포로 바꾼다.

3. 피처 엔지니어링
-> 모델 학습 성능을 높일 수 있는 새로운 변수를 만들어낸다.

내가 사용하려고 만든 작업 플로우는 아래와 같다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

0. 데이터 파악

수치형
문자열
수치 + 문자열
수치인척 문자열

어떤 컬럼들이 있는지 의미 확인

1. 정제

1-1. 중복값 삭제
1-2. 수치인척 문자열 -> 수치

1-3. 범주형 처리 (순서 있는 문자열 -> 수치)
1-4. 결측치 처리

a) 대체

숫자형 - 중앙값, 평균, 상수
범주형 - 최빈값, 'Unknown'(특히 의미있는 결측)

b) 삭제

행 - 결측치가 적을 때
-> 행 내에서 말고, 결측 행이 적을 때를 뜻함
-> 행 내에서 결측치가 많으면 지워야지

열 - 결측치가 많을 때
-> 단, 의미있는 결측의 경우 삭제하지 않고 위와 같이 대체한다

1-5. 이상치 처리 (에러 및 통계적 아웃라이어)

먼저 명백한 오류인, 논리적으로 불가능한 에러 값을 처리한다

박스플랏(IQR) - 히스트플랏kde(히스토그램) 순으로 모든 컬럼 확인.

통계적 아웃라이어 처리 방법
지도학습의 경우 타깃(y) - 피처(x) 분리해서 생각
타깃은 원래 성격을 최대한 보존. 변환까진 괜찮은데 삭제/대체 최소화

이후

  1. 대체 (클리핑)
  2. 변환 (로그)
  3. 삭제

2. 인코딩 - 원핫 (순서 없는 범주형)

지도학습은 타깃(y) 피처(x) 분리.

컬럼을 따로 지정할 수도 있지만
그냥 넣어도 수치형이 아닌 것들을 알아서 인코딩한다
표면적으로 수치형인데 개념적으로 범주형이라 인코딩하고 싶으면 수동으로 지정해야함

데이트타임이 좀 특이한데 그냥 겟더미즈에 넣으면 반응 안하고 무시함
근데 머신에 넣으면 오류남. 그래서 뭔가 변환을 해야하는데
그냥 통째로 겟더미즈 수동 변환 컬럼에 지정해버리면 날짜 시간 값마다 더미 만들어서 차원폭발 일어남
그래서 겟더미즈가 아니라 내가 데이트타임에서 원하는 값을 쪼개고 수치형으로 정리해놔야함

3. 스케일링

스케일링이 필요한 모델의 경우
적합한 스케일러를 고른다
수치형 컬럼만 골라서 넣는다.

4. 피처 엔지니어링

피처 엔지니어링은 데이터마다 접근 방식이 매우 다양해서 간단히 말할 수 없다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

공부하면서 가장 혼동이 왔던 부분은 값을 수정하는 메서드 3종이다.
이번 기회에 간단히 정리해봤다.

1) .apply(func)

replace, map으로 처리하기 어려운 복잡한 로직을 적용한다.
그래서 주로 함수와 같이 사용하는데 하나 알아둬야할 것이 있다.

함수의 x가 무엇이냐?
시리즈면 '스칼라'를 하나씩 가져와서 처리. 그걸 모아서 반환값은 시리즈.
데이터프레임이면 '시리즈'를 하나씩 가져와서 처리. 그걸 모아서 반환값은 데이터프레임.

주의! func 뒤에 () 쓰면 안됨. 안 써야 앞에 객체를 받음.

2) .replace()
값 치환.
지정하지 않은 것은 그대로 둔다. (중요)

3) .map()
이것도 매핑 규칙에 맞춰 값을 치환한다.
그런데 지정하지 않은 것들은 모조리 null로 바뀐다. (중요)

데이터를 null로 바꿔버리면 아주 위험할 것 같은데 이게 왜 있을까?
무슨 이유로 만들어진 메서드인지 궁금해서 알아봤다.

목적은 시리즈의 값들을 매핑 규칙에 따라 '재정의'!!
그래서 규칙에 없는 것들은 null로 바꾸는구나.

이렇게 말하면 조금 더 이해가 쉽다.
"내가 필요한 값만 재정의하고 나머지는 관심 없으므로 null"

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

데이터 전처리는 어느정도 틀이 정해져있는 반복 노동이다.
특히 클리닝과 트랜스포메이션이 그렇다.
따라서, 앞으로 ai에 의해 자동화될 가능성이 굉장히 높다.

ai가 해준다고 공부를 안해도 된다는 것은 아니다.
나는 ai가 대체할 수 없는 역량을 더 강화하는 것이 효율적이라 생각한다.
도메인 특화 피처 엔지니어링은 오랜 기간 ai가 대체할 수 없을 것 같다.

그럼 결국 무엇이 중요한가? 돌고돌아 도메인 지식이 또 중요해진다.
데이터 사이언스는 시작과 끝이 도메인 지식인 것 같다.

Top comments (0)