모델 튜닝(2)

우수민·2021년 8월 9일
0

ML 관련 정리

목록 보기
8/10
post-thumbnail
post-custom-banner

특징 선택과 중요도

  • 주어진 데이터의 특징과 생성한 특징에는 모델의 성능에 기여하지 않는 것도 많다. 그러한 노이즈가 되는 특징이 많으면 성능은 떨어진다. 또한 특징이 너무 많으면 메모리 부족으로 학습하지 못하거나 계산 시간이 지나치게 소요되기도 한다.
  • 이때 특징 선택(feature selection)을 활용하면 유효 특징은 최대한 남겨둔 채 특징의 수를 줄일 수 있다.
  1. 단변량 통계(univariate statistics)를 이용하는 방법
    : 상관계수, 카이제곱과 같은 통계량으로 구하는 방법
  2. 특징의 중요도를 이용하는 방법
  3. 반복 탐색하는 방법

단변량 통계를 이용하는 방법

  • 각 특징과 목적변수로부터 어떤 통계량을 계산하고 그 통계량의 순서대로 특징을 선택한다.
  • 단변량 통계는 어디까지나 특징과 목적변수의 일대일 관계를 보는 만큼 특징의 상호작용을 고려하지 않고 비교적 단순한 관계성을 추출한다.
  1. 상관 계수
  • 각 특징과 목적변수와의 상관계수를 계산하여 상관계수의 절댓값이 큰 쪽부터 특징을 선택하는 방법
# argsort을 사용하면 배열 값이 작은 순서/큰 순서로 인덱스를 정렬할 수 있음
ary = np.array([10, 20, 30, 0])
idx = ary.argsort()
print(idx)        # 내림차순 - [3 0 1 2]
print(idx[::-1])  # 오름차순 - [2 1 0 3]
  1. 카이제곱 통계량
  • 카이제곱 검정의 통계량을 계산하고 통계량이 큰쪽에서부터 특징을 선택하는 방법
  • 이 방법을 이용할 때는 특징값이 0이상이어야 하고 분류 문제여야 한다.
  • 특징값을 MinMaxScaler 함수로 스케일링해두는 편이 좋다.
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler

# 카이제곱 통계량
x = MinMaxScaler().fit_transform(train_x)
c2, _ = chi2(x, train_y)

# 중요도의 상윗값을 출력(상위 5개까지).
idx = np.argsort(c2)[::-1]
top_cols, top_importances = train_x.columns.values[idx][:5], corrs[idx][:5]
print(top_cols, top_importances)
  1. 상호 정보량
  • 각 특징과 목적변수와의 상호 의존 정보를 계산하여 큰 쪽부터 특징으로 선택하는 방법
  • 상호 정보량은 한쪽을 알면 다른 한쪽을 더 잘 추측할 수 있을 때 값이 커진다. X와 Y가 완전하 종속될 때는 어느 한쪽 특징의 정보량과 동일해지며 독립적일 때는 0이 된다.
from sklearn.feature_selection import mutual_info_classif

# 상호정보량
mi = mutual_info_classif(train_x, train_y)

# 중요도의 상위를 출력(상위 5개까지).
idx = np.argsort(mi)[::-1]
top_cols, top_importances = train_x.columns.values[idx][:5], corrs[idx][:5]
print(top_cols, top_importances)

특징 중요도를 이용하는 방법

  1. 랜덤 포레스트의 특징 중요도
  2. GBDT의 특징 중요도
  • xgboost 예시
    1. Gain: 특징의 분기로 얻은 목적함수의 감소
    2. Cover: 특징에 따라 분기된 데이터 수
    3. Frequency: 특징이 분기에 나타난 회수
  • 이때 파이썬의 디폴트의 값은 Frequency가 지정되어 결과가 출력되지만, Gain으로 출력하는 편이 좋다. Gain이 특징의 값이 중요한지 아닌지를 더 잘 표현하기 때문이다.
import xgboost as xgb

# xgboost
dtrain = xgb.DMatrix(train_x, label=train_y)
# params = {'objective': 'binary:logistic', 'silent': 1, 'random_state': 71}  # 기존
params = {'objective': 'binary:logistic', 'verbosity': 0, 'random_state': 71}  # 이슈 대응 수정 2021/02/28
num_round = 50
model = xgb.train(params, dtrain, num_round)

# 중요도의 상위를 출력
fscore = model.get_score(importance_type='total_gain')
fscore = sorted([(k, v) for k, v in fscore.items()], key=lambda tpl: tpl[1], reverse=True)
print('xgboost importance')
print(fscore[:5])
  1. 순열 중요도
  2. null 중요도
  3. 보루타 알고리즘
    • 보루타란 순열 중요도나 null 주요도와는 또 다른 방법으로 섞에서 특징 선택을 수행하는 방법
  4. 특징의 대량 생성과 선택

    GBDT에는 단순한 노이즈가 된는 특징이 있더라도 성능이 쉽게 떨어지지는 않는다. 대량 생산되는 특징 중에서는 노이즈가 되는 특징이 있을 수 있고 완전하지 않을 수 있다.

  5. xgbfir

반복 탐색하는 방법

  • 탐욕적 전진 선택

편중된 클래스 분포의 대응

  1. 언더샘플링
  2. 기본 모델링 : 양성인지 음성인지 판정하는 임곗값의 설정에 따라 모두 양성 또는 모두 음성이 될 가능성이 있는 만큼 평가지표나 목적에 따라 임곗값을 조정하는게 좋다.
  3. 가중치
  4. 오버 샘플링
  5. 확률 예측의 주의점

    경진 대회에서는 언더샘플링 또는 특별히 가공하지 않은 기본 모델링 방법을 주로 사용하며 오버샘플링은 그다지 쓰이지 않는다.(캐글에서 SMOTE 잘 쓰이지 않음.)

참고 : 데이터가 뛰어노는 AI 놀이터, 캐글

profile
데이터 분석하고 있습니다
post-custom-banner

0개의 댓글