[멋쟁이 사자처럼 AIS7][0503:0504]

HI,HYEN·2022년 11월 2일

멋쟁이 사자처럼 AIS7

목록 보기
13/33

0503

✔️ 서로 없는 데이터에 대해서는 어떻게 처리할까?
-> 한쪽에만 있는 데이터는 기타로 묶어줌

  • 데이터 전처리를 할 때는 train 기준
  • train에만 등장하는 데이터는 학습을 해도 test에 없기 때문에 예측에 큰 도움이 되지 않음
    train에만 등장하는 데이터를 피처로 만들어 주게 되면 피처의 개수가 늘어나는데
    불필요한 피처가 생기기도 하고 데이터의 크기도 커지기 때문에 학습에도 시간이 더 소요
    너무 적게 등장하는 값을 피처로 만들었을 때 해당 값에 대한 오버피팅 문제도 있을 수 있음
    train과 test의 피처 개수가 다르면 오류 발생

    원핫인코딩을 할 때 train, test 피처의 개수와 종류 같은지 확인이 필요
    예를 들어 train피처는 수학인데 test피처는 국어다 라고 하면 피처의 개수가 같더라도
    다른 종류 값이기 때문에 제대로 학습할 수 없음.
    피처를 컬럼명으로 만들 때도 제대로 만들어지지 않음
  • jupyter 단축키
    -> ESC + F : Find and Replace

One-Hot-Encoding

  • 순서가 있는 데이터라면 Ordinal-Encoding을 사용하는데 순서가 없는 데이터인데 이 방식을 사용하면 의도치 않은 연산이 될 수 있음
    순서가 없는 데이터라면 One-Hot-Encoding을 사용
    Pandas를 사용하는 이유는 수치형 데이터와 범주형 데이터를 함께 넣어주어도 수치형 데이터는 그대로 두고 범주형 데이터에 대해서만 인코딩

결측치 대체

-> 결측치가 있으면 머신러닝 알고리즘 내부에서 연산을 할 수 없어서 오류가 발생하기 때문에
결측치가 있는 피처를 사용하려면 사이킷런에서는 꼭 결측치를 대체
-> 현실세계에서 분석하는 데이터 함부로 결측치를 채우는 것은 꼭 ❗️주의❗️
-> 머신러닝 알고리즘에서 오류가 발생하지 않게 하기 위해 결측치를 채운것이라 분석할 때도 채운다고 오해하면 안 됨

-> train에는 결측치가 없지만, test에 결측치가 있어서 새로운 변수를 만들어 채우고자 한다면
train에도 test와 같은 변수를 만들어 줘야 함

✔️ 왜 valid 점수와 실제 캐글 점수가 다를까요?
-> vaild는 train 데이터셋에서 검증한것이고, 캐글에 있는 정답셋과 다시 비교하기 때문

✔️ train으로 측정한 validation 점수는 0.80인데 캐글 스코어가 0.73이라면 어떤 상황이라고 볼 수 있을까?
-> 과대적합(오버피팅)

교차검증(Cross Validate)

  • cross_validate : Evaluate metric(s) by cross-validation and also record fit/score times.
    - 학습결과에 대한 점수와 시간

    • 점수를 보고자 할 때는 편리하지만 지정한 metric에 의해서만 점수가 계산
  • cross_val_score : Evaluate a score by cross-validation.
    - cv 조각별 점수

  • cross_val_predict : Generate cross-validated estimates for each input data point.
    - 예측 값이 그대로 나와서 직접 계산해 볼 수 있음.

    • 직접 다양한 측정 공식으로 결과값을 비교해 볼 수 있음.

0504

  • .fillna(method='')

    	- method : {'backfill', 'bfill', 'pad', 'ffill', None}
    • pad / ffill : 앞에 값으로 채움
    • backfill / bfill : 뒤에 값으로 채움
  • .interpolate(method='', limit_direction='') -> (보간법)
    [https://pandas.pydata.org/docs/reference/api/pandas.Series.interpolate.html?highlight=interpolate]
    - limit_direction : {{'forward', 'backward', 'both'}}
    - both : 위 아래 결측치를 모두 채워주고 나머지는 채울 방향을 설정

  • ❗️결측치를 대체하는 방법에는 정답이 없다❗️
    데이터에 따라 다르기도 하고 도메인에 따라 다름

    - 결측치 행을 그냥 제거하는 방법
    - 결측치를 중앙값으로 대체하는 방법
    - 보간법으로 결측치를 대체하는 방법(보간법도 종류가 다양)

일반적으로 결정 트리를 이용한 방법의 경우, 그 결과 또는 성능의 변동 폭이 크다는 결점을 가지고 있다. 특히 학습 데이터에 따라 생성되는 결정 트리가 랜덤성에 따라 매우 다르기 때문에 일반화하여 사용하기에 어려움이 따른다. 특히, 결정 트리는 계층적 접근방식이기 때문에 만약 중간에 에러가 발생한다면 다음 단계로 에러가 계속 전파되는 특성을 가진다. 배깅(Bagging) 또는 랜덤 노드 최적화(Randomized node optimization)와 같은 랜덤화 기술은 결정 트리가 가진 이러한 단점을 극복하고 좋은 일반화 성능을 갖도록 한다.

  • Bagging = bootstrap + aggregating

  • from sklearn.ensemble import RandomForestClassifier
    RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
    -> n_setimators 기본값이 100
    -> n_jobs : CPU 코어의 수, -1일 땐 전부 다 사용

profile
Today I Learn

0개의 댓글