https://steadiness-193.tistory.com/256
위에서 만든 데이터 셋을 이용한다.
숫자형 데이터는 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
여기서 재밌는 것은 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 이기 때문에 라벨인코딩은 해줄 필요 없다.
'Machine Learning > 전처리(Preprocessing)' 카테고리의 다른 글
Machine Learning - train_test_split (0) | 2020.09.08 |
---|---|
Machine Learning - 랜덤으로 train과 test로 나누기 (0) | 2020.09.04 |
Machine Learning - PCA (Principal Component Analysis, 주성분 분석) (0) | 2020.08.31 |
Machine Learning - One-Hot Encoding (원핫 인코딩) (0) | 2020.08.26 |
Machine Learning - Label Encoding (라벨 인코딩) (0) | 2020.08.26 |