본문 바로가기
기계학습(ML)/Interpreting Model

n231 Choose your ML problems

by kiimy 2021. 6. 26.
728x90
728x90
  • 예측모델을 위한 타겟을 올바르게 선택하고 그 분포를 확인할 수 있다.
  • 테스트/학습 데이터 사이 or 타겟과 특성들간 일어나는 정보의 누출(leakage)을 피할 수 있다.
  • 상황에 맞는 검증 지표(metrics)를 사용할 수 있다.

Data science Workflow

*데이터 사이언티스트 실무 프로세스

  1. 비즈니스 문제
    • 실무자들과 대화를 통해 문제를 발견
  2. 데이터 문제
    • 문제와 관련된 데이터를 발견
  3. 데이터 문제 해결
    • 데이터 처리, 시각화
    • 머신러닝/통계
  4. 비즈니스 문제 해결
    • 데이터 문제 해결을 통해 실무자들과 함께 해결

* Project process( 먼저 데이터 수집 Data Collection )

== * 해결하고자 하는문제는 무엇인가?

     * 답을 얻기 위해 필용한 data는? 

     * data와 결과는 어떤 상관관계 ?

  1.  예측해야하는 Target 명확히 설정, Target 분포확인(균형, 불균형(=대표적)) 왜?
  2.  회귀, 분류 문제인지 확인 ( 회귀의 경우 log transform )
  3.  해당 문제 평가지표 설정
  4.  특성공학 FE (= Descriptive Statistics 기술통계 ( barplot, violine ... )
  5.  E. D. A 탐구적 자료분석(= 특징( 패턴, 특이점 ) ) ==> clustering, classification, Deep learning ...
  6.  Hypothesis testing 가설검정(= P-value, T-test, Likelihood, cross-validation .....)
  7.  Estimation 추정
  8.  정보누수(leakage) 확인

* 정보누수(leakage)

  • Target 변수 외에 예측시점에 사용할 수 없는 data가 포함되어 학습이 이루어질 경우
  • train, val 완전히 분리가 안되었을때

==> 타겟을 통해서 새로운 특성을 만든 경우 원래 타겟 특성을 삭제 해줘야한다

*평가지표( Metrics )

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

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

  • 대부분 scikit-learn 분류기들은 class_weight 와 같은 클래스의 밸런스를 맞추는 파라미터를 가지고 있습니다.
  • ==> class_weight= 'balance'
    1. 데이터가 적은 범주 데이터의 손실을 계산할 때 가중치를 더 곱하여 데이터의 균형을 맞추거나
    2. 적은 범주 데이터를 추가샘플링(oversampling)하거나 반대로 많은 범주 데이터를 적게 샘플링(undersampling)하는 방법이 있습니다.
from sklearn.metrics import roc_auc_score

y_pred_proba = pipe.predict_proba(X_val)[:, -1]
print('AUC score: ', roc_auc_score(y_val, y_pred_proba))

from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt

fpr, tpr, thresholds = roc_curve(y_val, y_pred_proba)

plt.scatter(fpr, tpr, color='blue')
plt.plot(fpr, tpr, color='green')
plt.title('ROC curve')
plt.xlabel('FPR')
plt.ylabel('TPR')
# class weights 계산
# n_samples / (n_classes * np.bincount(y))
custom = len(y_train)/(2*np.bincount(y_train))
custom

* target 연속성= 회귀 ( 클래스 비율이 편중되어 있다면 log Transform 사용 )

==> 이상치 제거 안하고 진행 

==> TransformedTargetRegressor / (np.log1p, np.expm1) == inverse 무조건 해줘야함

from category_encoders import OrdinalEncoder
from sklearn.impute import SimpleImputer
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)

tt.fit(X_train, y_train)
tt.score(X_val, y_val)
728x90

댓글