본문 바로가기
멋쟁이사자처럼 AIS7/오늘코드

[1026] Feature Engineering & K-fold Cross Validation

by YeonGun M 2022. 10. 26.

intro

  • 지난 수업(과제) 복습
  • 결측치를 처리하고 중요도를 시각화했을 때, insulin 의 중요도가 제일 크게 나옴
    => 개인이 설정한 하이퍼 파라미터에 따라 중요도는 상이
  • 정확도(스코어)가 높으면 성능이 좋다고 할 수 있으나, 데이터마다 상이

Feature Enginering

결측치 처리

  • IQR : raw data에 가까운 Insulin_nan을 기준으로 진행(Insulin_fill은 조작된 값)
    IQR = desc['75%'] - desc['25%']
    max_out = desc['75%'] + (IQR * 1.5)
    df[df["Insulin_fill"] < max_out]
    IQR = df['Insulin_nan'].quantile(0.75) - df['Insulin_nan'].quantile(0.25)
    outliers = df[df['Insulin_nan'] > df['Insulin_nan'].quantile(0.75) + 1.5 * IQR]
    df.drop(outliers.index)
  • 단순 부등호로 계산 ex.df[df['Insulin_fill'] < 600]
    => 결측치 처리 시 너무 많은 데이터를 지우는 건 아닌지 늘 주의!!

결정트리학습법

  • 장점 : 빠르다, 단순하다, 직관적이다
  • 단점 : 랜덤성에 따라 매우 달라 일반화 X, 계층적 접근 방식이기 때문에 중간에 에러 발생하면 다음 단계로 에러가 계속 전파

cf. 이력서 특강
cf. JD : B factory

랜덤포레스트

배깅 알고리즘

  • bagging(bootstrap aggreagating) : 표본 추출 집계
  • 부트스트랩을 통해 조금씩 다른 훈련 데이터에 대해 훈련된 기초 분류기(저성능 분류기, base learner)들을 결합(agg
  • bootstrap : 표본추출, ex.선거철 출구조사, 구체적으로 아래 링크 참고
    velog
    tistory
  • aggreagating : 집계(평균 등)

랜덤 포레스트

  • 랜덤성(randomness)에 의해 트리들이 서로 조금씩 다른 특성을 갖는다
    => 예측(prediction)들의 비상관화(decorrelation) => 일반화(generalization) 성능을 향상
  • 기본값은 트리 100개! => 트리가 너무 많기에 사이킷런에서는 시각화 불가능
    cf. 시각화 연구 중 : treeinterpreter
    cf. 사이킷런에서 boston 집값 데이터셋은 인종차별 이슈로 인해 제외됨 => 캘리포니아 데이터셋으로 대체 가능
  • 중요 매개변수 : 포레스트의 크기(트리의 개수, 사이킷런은 n_estimators), 최대 허용 깊이 등
  • 중복을 허용하여 부트스트래핑 진행
  • n_jons : 사용할 CPU 코어 수, '-1'은 모든 코어 사용을 의미함
    => 다른 환경에서 사용중인 코어를 모를 경우를 대비하기 위해 모든 코어를 사용하지 않음

앙상블 방법

  • 개선된 분류기를 생성하기 위해 일련의 저성능 분류기를 결합한 복합 모델
  • 배깅 접근법을 사용하여 분산을 줄이고, 부스팅 접근법을 사용하여 편향을 사용 or 스태킹 접근법으로 예측 개선

회귀 Regression

  • 결측치를 평균이나 중앙값으로 채우는 것이 아니라, 회귀값을 채우기도 함
  • 분류 모델은 정확도(accuracy)를 봤다면, 회귀 모델에서는 오차(error)를 본다.
  • 모의고사를 한 번밖에 보지 않았는데 수능(현실세계)도 잘 본다고 할 수 있을까?
    => 어떻게 해야 모의고사를 여러 번 볼 수 있을까?

Cross Validation

공부를 안한 게 test에 나오면 어떻게하는가?

  • Hold-out Validation : 훈련 데이터를 훈련데이터와 검증데이터 셋으로 나눔. 빠르게 평가가 가능함
  • Cross Validation : (k-fold cross-validiation)
    1) 훈련 데이터셋을 k개의 폴드로 랜덤하게 나눈다
    2) 첫번째 폴드로 검증을 하고 나머지는 훈련을 한다.
    3) 두번째 폴드로 검증을 하고 나머지는 훈련을 한다.
    4) 세번째 폴드로 검증을 하고 나머지는 훈련을 한다.
    ...
    k) k번째 폴드로 검증을 하고 나머지는 훈련을 한다.
    => 2) ~ k) 의 검증 결과를 기반으로 모델의 평균 성능을 계산한다.
  • 여러번 모의고사를 본다는 비유를 생각해보자(병렬적).

cross_val_predict

  • cv : fold 조각의 수
  • verbose : 로그의 단계별 출력
    => (y_train == y_predict).mean()이 0: 똑같이 예측한게 하나도 없음
    => 어떻게 차이를 구하는가?
  • regplot, jointplot, residplot, r2_score

r2_score

  • 결정계수라고 하며 상관 관계를 제곱한 값을 말한다(R-squared)
  • 1일 때 자기 자신을 의미하며 아래의 코드로 호출할 수 있다.
  • tistory
    from sklearn.metrics import r2_score
    r2_score(y_train, y_predict)
    >>> 0.3116994764197346

댓글