본문 바로가기

Machine Learning/전처리(Preprocessing)

Machine Learning - valid와 test를 train으로 전처리

반응형

https://steadiness-193.tistory.com/256

 

Machine Learning - train_test_split

https://steadiness-193.tistory.com/253 Machine Learning - 랜덤으로 train과 test로 나누기 데이터 불러오기 seaborn의 iris 데이터셋을 불러온다. 150개의 행 중 100개를 train, 50개를 test로 나눠보자 단,..

steadiness-193.tistory.com

 

위에서 만든 데이터 셋을 이용한다.

 

 

 

숫자형 데이터는 train 데이터셋의 컬럼별 평균값으로,

 

범주형 데이터는 train 데이터셋의 컬럼별 최빈값으로 채워준다.

 

 

train과 valid, test 데이터셋의 결측값의 개수는 총 0개로 바뀌었다.

 

 

[test 데이터셋의 결측치도 train의 데이터로 채워준 이유]

train과 test는 같은 분포에서 추출되기 때문이다.

모델이 학습한 정보는 X_train의 평균과 최빈값을 반영한 데이터이기 때문에,
X_test의 평균과 최빈값으로 X_test에 대체하면 모델이 보기에 데이터 분포가 다르다고 인식한다.


하지만, train의 평균/최빈값으로 test를 채워넣었는데
test의 평균/최빈값으로 test를 채워넣은것보다 모델 성능이 좋지 않다 라고 한다면,
test의 분포가 바뀌었다라고 의심할 수 있다.

 

 

 

스케일링

 

StandardScale을 진행한다.

 

 

 

https://steadiness-193.tistory.com/242

 

Machine Learning - Scaling : Standard Scaling (Z-score)

[Z-score] 데이터를 통계적으로 표준정규분포화 평균= 0, 표준편차= 1 데이터(x)에서 평균을 뺀 값을 표준편차로 나눠준다. 데이터 불러오기 및 결측치 처리 결측치 처리는 아래 포스팅 참조 https://st

steadiness-193.tistory.com

 

여기서 재밌는 것은 train데이터셋만의

 

숫자형 컬럼 데이터들의 평균과 표준편차를 찾는 것이다.

(fit은 train의 데이터셋으로만!)

 

그 다음 valid와 test를 각각 transform해서 정규화된 데이터를 뽑아낸다.

 

 

이렇게 해주는 이유 또한 위에서 언급한 것 처럼

 

train과 test는 같은 분포에서 추출된다고 가정하기 때문이다.

 

 

 

 

 

스케일링된 데이터셋의 기술통계 확인

 

 

train의 평균과 표준편차를 이용했기 때문에

 

완전히 정확하게 평균이 0이고 표준편차가 1이 되지는 않았다.

 

다만, 이 정도의 오차는 감안할 수 있기에 그대로 진행한다.

 

 

만약 감안하기 힘들 정도로 X_valid와 X_test의 평균, 표준편차의 값이 이상하다면?


1. 우선은 그냥 넘어간다.

2. 학습 진행 후 X_valid 성능(경진대회라면 리더보드 성능)이 좋지 않다면 다시 확인한다.

3. train_test_split을 다시 해본다. (random_state 변경)


그래도 문제가 있다면 데이터 품질에 이상이 있다고 판단.

 

 

 

 

원핫인코딩

 

 

범주형 컬럼은 원핫인코딩을 해야하는데

 

제일 걱정되는 것은 Title 컬럼이다.

 

워낙 다양하다보니 train에 있는 Title이 valid나 test에 있는 title을 다 커버하지 못할 수 있다.

 

 

 

임시 진행

 

 

 

 

우선 train의 범주형 컬럼을 학습한뒤

 

 

 

 

valid와 test를 적용하려하니 에러가난다.

 

Found unknown categories 메시지를 보아,

 

역시 train의 범주형 데이터가 valid와 test의 범주형 데이터를 모두 커버하지 못한 것 같다.

 

 

 

 

 

 

해결 방법 : train, valid, test를 합친 뒤 원핫인코딩

 

 

 

이렇게 하면 모든 범주형 데이터를 처리한 것이니 에러는 발생하지 않는다.

 

다만, 위 transform된 배열을 데이터프레임으로 바꾼 뒤

 

원래 위치로 돌려줘야한다.

 

 

 

 

 

ohe.transform된 배열, 데이터프레임으로 바꾸기

 

 

 

 

또는 이렇게 해줘도 된다.

 

 

컬럼을 모두 준비해주고

 

 

 

 

데이터프레임 생성 완료

 

 

 

 

 

인덱스 살펴보기

 

 

pd.concat을 하기 전에 인덱스를 살펴보자

 

axis=1로 concat을 하게되면 인덱스를 기준으로 합치기 때문에

 

 

 

train, valid, test끼리 인덱스가 같아야한다.

 

따라서 ohe_train, ohe_valid, ohe_test의 인덱스를 초기화해주자

 

 

 

 

 

이제 train, valid, test끼리 인덱스가 같아졌으니 열 방향으로 합치면 된다.

 

 

 

 

원핫인코딩 완료 후 기존 범주형 컬럼은 제거해준다.

 

 

 

 

 

 

라벨 인코딩

 

 

label의 값이 0, 1 이기 때문에 라벨인코딩은 해줄 필요 없다.

 

 

반응형