[TIL] 22.11.14

문종현·2022년 11월 14일
0

TIL

목록 보기
38/119
post-custom-banner

👉 오늘 한 일

  • 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 등을 통해 확인해 보고 왜 점수가 오르고 내리는지 확인해 보는 습관을 길러보기

💡특성 선택

  1. 분산 기반 필터링
  • 범주형 변수 중에 어느 하나의 값에 치중되어 분포되어있지 않은지 확인해서 값이 치중된 변수는 제외
  1. 상관관계 기반 필터링
  • 상관계수가 너무 높다면 제외

house price 제출

train과 test 데이터셋을 concat으로 합쳐서 전처리 하기도 함

  • 장점
    • 전처리를 한 번만 해도 됨
  • 단점
    • test에만 등장하는 데이터를 피처에 사용하면 안 되는 대회 정책이 있을 때 정책 위반이 될 수 있음
    • 대회 데이터이기 때문에 여기서는 test를 미리 알 수 있지만 현실세계에서는 불가능한 방법

메서드체이닝을 사용하면 도움말 보기가 잘 동작하지 않기 때문에 도움말을 보기 위해서는 변수에 할당하고 사용하는 것도 방법

💡왜도, 첨도
데이터가 정규분포를 따르는지 확인하기 위해 왜도, 첨도를 활용

왜도는 실수 값 확률 변수의 확률 분포 비대칭성을 나타내는 지표

  • 왜도가 음수일 경우에는 확률밀도함수의 왼쪽 부분에 긴 꼬리를 가지며 중앙값을 포함한 자료가 오른쪽에 더 많이 분포해 있음.

  • 왜도가 양수일 때는 확률밀도함수의 오른쪽 부분에 긴 꼬리를 가지며 자료가 왼쪽에 더 많이 분포해 있다는 것을 나타냄.

  • 평균과 중앙값이 같으면 왜도는 0이 됨.

첨도는 확률분포의 뾰족한 정도를 나타내는 척도. 관측치들이 어느 정도 집중적으로 중심에 몰려 있는가를 측정할 때 사용됨.

  • 첨도값(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) : 앞으로 회귀 문제에서 타겟변수가 정규분포를 따르는지 점검하며 분석을 진행해야겠다.
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글