👉 오늘 한 일
- house price 피처 엔지니어링 실습 이어서
- house price 제출 실습
house price 이어서
💡Review
기술통계(describe()
)를 볼 때
- 결측치가 있는지
- 이상치가 있는지
- 표준편차는 어떤지
- 전체 피처에 대해 특이점이 없는지 확인
이상치 탐색 시
- 이상치를 평균이나 중앙값 등으로 대체하면 데이터에 왜곡이 될 수 있으니 주의
희소값 탐색 시
- one-hot-encoding으로 범주가 작은 값을 피처로 만들어 주면 연산에 시간이 더 오래 걸릴 수 있음
- 너무 작은 값을 일반화해서 학습하기 때문에 오버피팅의 문제도 있을 수 있음
- 너무 희소한 값이라면 이산화 하거나, '기타' 등으로 binning 하거나, 아예 결측치로 처리해서 인코딩하지 않음
피처 스케일링
- 트리기반 모델은 데이터의 절대적인 크기보다 상대적인 크기에 영향을 받기 때문에 스케일링을 해도 상대적 크기 관계는 같게 됨. 따라서 스케일링 필요 x
- 하지만 데이터의 분포를 정규분포 형태로 만들어 주는 것은 도움이 되므로 transformation은 진행하는 것이 좋음(회귀 문제일 때)
- 표준정규분포 형태로 만들기 위해서는 로그 변환(transformation)을 먼저 진행한 후 스케일링 진행
🤔왜 데이터를 정규분포 형태로 만들어주면 머신러닝이나 딥러닝에서 더 나은 성능을 낼까?
- 한쪽에 치우쳐져 있을 때보다 데이터가 고르게 분포되어 있다면 특성을 더 고르게 학습할 수 있음
모든 값이 양수이고 1보다 작은 값이 있을 때 => 1을 더하고 로그를 취함
🤔너무 큰 음수값이 있을때 음수인 값이 너무 뾰족하거나 치우쳐져 있어서 로그를 취하기 위해서는 어떻게 전처리 해야 할까? 예를 들어 -1000 이라면?
- -(|최소값| + 1) 에 로그 변환. 최소값이 1이 되도록
- e.g. -1000이라면 1001을 더하고 로그 변환 (
log(x+1001)
)
원래 값으로 되돌아 가기 위해서는 지수 함수로 변환하고 더한 값 만큼 빼줌
- e.g. 지수 함수 변환 후 -1001. (
np.exp(x) -1001
)
inverse_transform()
: 로그 변환, 인코딩한 값을 원래 값으로 복원하는 기능
이산화
- 연속된 수치 데이터를 구간화 => 머신러닝 알고리즘에 힌트를 줄 수도 있음
- 트리 모델이라면 너무 잘게 데이터를 나누지 않아 일반화 하는데 도움이 될 수 있음
- 데이터를 나누는 기준 => EDA를 통해 어떻게 나누는 것이 예측이 도움이 될지 확인
- 연속된 수치 데이터를 나누는 기준에 따라 모델의 성능에 영향을 줌. 잘못 나누면 성능이 떨어질수도 있음
인코딩
- Ordinal Encoding은 Label Encoding과 달리 변수에 순서를 고려한다는 점에서 큰 차이를 가짐. Label Encoding이 알파벳 순서 혹은 데이터셋에 등장하는 순서대로 매핑하는 것과 달리 Oridnal Encoding은 Label 변수의 순서 정보를 사용자가 지정해서 담을 수 있음.
sklearn.OneHotEncoder()
: 최신 버전에서 빈도가 적은 값에 대해 기타로 처리하는 min_frequency 기능이 추가됨. 기타 값에 대해 따로 전처리 해주지 않아도 기타로 알아서 처리해 주게됨
handle_unknown='infrequent_if_exist'
: test 에 train 에 들어있지 않은 값이 등장한다면 "기타" 등으로 처리함
파생변수
PolynomialFeatures
: 다항식 전개에 기반해서 파생변수를 만들게 되면 머신러닝 모델이 여러 Feature에 기반하게 되어 안정성이 높아짐
🤔구분이 잘 안 되는 값에 대해 power transform 을 해주기도 하는데 반대로 너무 차이가 많이 나는 값을 줄일 때 사용할 수 있는 방법?
- 꼭 정답이 있다기 보다는 EDA를 해보고 어떤 스케일링을 하면 머신러닝 모델이 값을 학습하는데 도움이 될지 고민해보기
- root, log transform 도 해볼 수 있지만 변환이 정답은 아님. 성능이 올라가고 안 올라가고는 EDA 등을 통해 확인해 보고 왜 점수가 오르고 내리는지 확인해 보는 습관을 길러보기
💡특성 선택
- 분산 기반 필터링
- 범주형 변수 중에 어느 하나의 값에 치중되어 분포되어있지 않은지 확인해서 값이 치중된 변수는 제외
- 상관관계 기반 필터링
house price 제출
train과 test 데이터셋을 concat으로 합쳐서 전처리 하기도 함
- 장점
- 단점
- test에만 등장하는 데이터를 피처에 사용하면 안 되는 대회 정책이 있을 때 정책 위반이 될 수 있음
- 대회 데이터이기 때문에 여기서는 test를 미리 알 수 있지만 현실세계에서는 불가능한 방법
메서드체이닝을 사용하면 도움말 보기가 잘 동작하지 않기 때문에 도움말을 보기 위해서는 변수에 할당하고 사용하는 것도 방법
💡왜도, 첨도
데이터가 정규분포를 따르는지 확인하기 위해 왜도, 첨도를 활용
왜도는 실수 값 확률 변수의 확률 분포 비대칭성을 나타내는 지표
첨도는 확률분포의 뾰족한 정도를 나타내는 척도. 관측치들이 어느 정도 집중적으로 중심에 몰려 있는가를 측정할 때 사용됨.
- 첨도값(K)이 3에 가까우면 산포도가 정규분포에 가까움.
- 3보다 작을 경우에는(K<3) 정규분포보다 더 완만하게 납작한 분포로 판단할 수 있음
- 첨도값이 3보다 큰 양수이면(K>3) 산포는 정규분포보다 더 뾰족한 분포로 생각할 수 있음
💡JD
🤔SQL로 관리하는 데이터와 파일로 관리하는 데이터는 어떻게 구분해서 관리할까?
- sql에 저장하는 데이터는 실시간으로 사용해야 하는 데이터
- 파일로 관리하는 데이터는 로그성 데이터
- 로그성 데이터라도 자주, 실시간으로 관리해야 한다면 DB(SQL)로 관리
🤔SQL 로 실시간으로 관리할 데이터를 저장한다면 어떤 데이터가 있을까?
- 장바구니, 로그인 정보, 결제정보, 회원가입 정보, 각종 status 값(게임 속 플레이어 위치, 게임머니, 인벤토리 정보) 등
🤔개인정보가 돈이 되는 이유?
- 개인정보를 통해서 맞춤형 광고를 노출시킬수 있기 때문에
테크 블로그, 현업자 인터뷰를 채용공고 내용과 연계해서 살펴보기
오늘의집 대표 인터뷰
https://eopla.net/magazines/18#
📌오늘의 회고
- 사실(Fact) : house price 실습을 통해 피처 엔지니어링 기법을 배웠다.
- 느낌(Feeling) : 변수가 정규분포를 따르는지 시각화를 통해서 확인해볼 수도 있었지만, 왜도와 첨도를 통해 확인해볼 수 있다는 것을 알았다.
- 교훈(Finding) : 앞으로 회귀 문제에서 타겟변수가 정규분포를 따르는지 점검하며 분석을 진행해야겠다.