다시 이음

실전 예측 분석 모델링 - 1 ML problems 본문

AI 일별 공부 정리

실전 예측 분석 모델링 - 1 ML problems

Taeho(Damon) 2021. 8. 24. 22:43

ML problems

 

안녕하세요.

 

오늘은 지금까지 배웠던 문제 해결방법이 아닌 그에 앞서 필요한 과정에 대해서 알아보려고 합니다.

 

이번 포스팅에서는 지도학습(Supervised Learning)에서 문제를 파악하고 타겟(종속변수)을 확인하는 방법을 보겠습니다.

 

 

 

1. 예측할 타겟 정하기, 문제 확인하기

 

 

- 이산형, 순서형, 범주형 타겟 특성도 회귀문제 또는 다중클래스분류 문제로도 볼 수 있습니다.

- 회귀, 다중클래스분류 문제들도 이진분류 문제로 바꿀 수 있습니다.

 

어제 포스팅했던 EDA와 겹치는 부분이 상당수 있으니 복습하는 느낌으로 나열해볼게요.

 

  • 칼럼명 정리
  • 결측치 확인
  • 타겟 예측하기 (데이터타입, 데이터분포 확인)
  • 데이터 전처리 ( 인코딩, 중복값 처리 , value 수정 등등)

 

Tip) 위에 다룬 것처럼 다중클래스 분류문제도 이진분류로 바꿀 수 있습니다.

예시 - 타겟으로 설정한 열의 값이 1~5까지로 나뉘는 다중 클래스 분류문제 일 경우,

특정 값을 기준으로 True, False의 값을 가지는 이진분류로 바꿀 수 있습니다.

 

 

2. 정보의 누수(Leakage) 확인하기

 

위의 과정을 거쳐 우리는 원본 데이터셋에서 타겟을 설정하고 데이터 전처리를 끝마친 상태입니다.

이 다음에 해야하는 과정으로는 기준모델을 설정하여 평가지표를 통해 점수를 확인하겠죠?

 

이렇게 확인한 score가 갑자기 100%에 가깝게 너무너무 잘나온다면,,, 당연히 의심을 해야합니다.

 

정보 누수가 일어나는 경우

  1. 타겟변수 외에 예측 시점에 사용할 수 없는 데이터가 포함되어 학습이 이루어 질 경우
  2. 훈련데이터와 검증데이터를 완전히 분리하지 못했을 경우입니다.

 

3. 문제에 적합한 평가지표 선택

 

-분류모델

 

타겟 클래스비율이 70% 이상 차이날 경우에는 정확도만 사용하면 판단을 정확히 할 수 없습니다.

정밀도, 재현율, ROC curve, AUC 등을 같이 사용하여야 합니다.

 

 

 

4. 불균형 클래스 ( Imbalanced Classes )

 

타겟 특성의 클래스 비율이 차이가 많이 날 경우

 

1. 분류모델

 

  1. 데이터가 적은 범주 데이터의 손실을 계산할 때 가중치를 더 곱하여 데이터의 균형을 맞추는 방법
  2. 적은 범주 데이터를 추가샘플링(oversampling)하거나 반대로 많은 범주 데이터를 적게 샘플링(undersampling)하는 방법

oversampling, undersampling

#직접 구하는 가중치
custom = len(y_train)/(2(클래스의 개수)*np.bincount(y_train))

# 가중치 적용
pipe = make_pipeline(
    OrdinalEncoder(), 
    DecisionTreeClassifier(max_depth=5, class_weight='balanced', random_state=2) # 1번
    DecisionTreeClassifier(max_depth=5, class_weight={False:custom[0],True:custom[1]}, random_state=2) 
)# 2번
1번,2번은 모두 같은 값이 도출됩니다.

 

 

타겟 분포가 비대칭 형태일 경우

 

2. 회귀모델

 

  1. 일반적으로 특성과 타겟간에 선형관계를 가정합니다.
  2. 특성 변수들과 타겟변수의 분포가 정규분포 형태일때 좋은 성능을 보입니다.
  3. 타겟변수가 왜곡된 형태의 분포(skewed)일 경우 예측 성능에 부정적인 영향을 미칩니다.

skewness(왜도) 시각화

 

- 왜도(skewness)란?

 확률변수의 확률분포 비대칭성을 나타내는 지표입니다.

 

skew = 어긋남, 빗나감

skewness = 왜도, 비대칭도

 

(a) 그래프는 왜도에서 skew가 음수 입니다.

(b) 그래프는 왜도에서 skew가 0입니다

(c) 그래프는 왜도에서 skew가 양수입니다.

 

아래의 코드를 통해 skew의 정도를 확인할 수 있습니다.

df['열이름'].skew
위의 코드로 확인가능한 skew가 -2 ~ +2 사이이면 치우침이 심하지 않다고 파악합니다.

 

 

- 해결방법

 

로그변환(Log-Transform)

 

  • 타겟이 right-skewed 상태라면 로그변환을 사용할 수 있습니다.
  • 로그변환은 비대칭 분포형태를 정규분포형태로 변환시켜줍니다.
  • 데이터의 소실을 막습니다.

# 원본데이터 - 로그변환 - 원본데이터 로 다시 변환되는 과정을 시각화
# 로그변환과 로그변환된 데이터를 원래대로 돌려놓기
plots=pd.DataFrame()
plots['original']=target
plots['transformed']=np.log1p(target) # np.log1p = 로그변환
plots['backToOriginal']=np.expm1(np.log1p(target)) # np.expm1 = 원본데이터로 변환

fig, ax = plt.subplots(1,3,figsize=(15,5))
sns.histplot(plots['original'], ax=ax[0]);
sns.histplot(plots['transformed'], ax=ax[1]);
sns.histplot(plots['backToOriginal'], ax=ax[2]);
# 회귀모델로 학습을 한 뒤에 TransformedTargetRegressor을 통해 쉽게 로그변환을 적용할 수 있습니다.
from sklearn.ensemble import RandomForestRegressor
from sklearn.compose import TransformedTargetRegressor

pipe = make_pipeline(
    OrdinalEncoder(), 
    SimpleImputer(),
    RandomForestRegressor(random_state=2)
)

tt = TransformedTargetRegressor(regressor=pipe,
                                func=np.log1p, inverse_func=np.expm1)

 

 

3. 불균형 데이터 올바르게 평가하기

 

1. 모델을 평가하기 위해 정확도(또는 오류율)를 사용하지 마세요. 

여기에는 두 가지 중요한 문제가 있습니다.

첫째, 정확도는 클래스 간에 결정하기 위해 0.50 임계값을 적용하며 클래스가 불균형한 경우 일반적으로 잘못됩니다. 

둘째, 분류 정확도는 오류의 단순 개수를 기반으로 하며, 어떤 클래스가 복잡하고, 어디에서 (score의 상단, 하단, 전반) 일어나는지 알고 있어야 합니다. ROC 곡선, 정밀도 재현율 곡선, 리프트 곡선 또는 이익(이득) 곡선을 사용하여 모델 성능을 시각화해야 합니다.

 

2.분류기에서 하드 분류(레이블)를 가져오지 마세요.( score3 또는 predict)

대신 proba또는 를 통해 확률 추정치를 얻으세요. predict_proba

 

3. 확률 추정치를 얻을 때 0.50 결정 임계값을 맹목적으로 사용하여 클래스를 구분하지 마십시오. 

성능 곡선을 보고 사용할 임계값을 스스로 결정하세요. 

 

4. 훈련을 위해 무엇을 하든 항상 모델이 작동할 자연적인(계층화된) 분포를 테스트하십시오. sklearn.cross_validation.StratifiedKFold. 을 사용하세요.

 

5. 확률 추정 없이 얻을 수 있지만 필요한 경우 보정을 사용합니다

참조 sklearn.calibration.CalibratedClassifierCV