220921

AIVILLAIN·2022년 9월 21일
0

오공완

목록 보기
11/25

실습 코드

평가

머신러닝 모델의 성능 평가 지표는 일반적으로 모델이 분류이냐 회귀이냐에 따라 여러 종류로 나뉨
회귀의 경우 대부분 실제값과 예측값의 오차 평균값에 기반함
분류의 평가방법도 일반적으로는 실제 결과와 예측 결과가 얼마나 정확하고 오류가 적게 발생하는가에 기반하나 정확도만 가지고 판단했다가는 잘못된 평가 결과에 빠질 수 있음

  • 정확도(Accuracy)
  • 오차 행렬(Confusion Matrix)
  • 정밀도(Precision)
  • 재현율(Recall)
  • F1 score
  • ROC AUC

정확도

실제 데이터에서 예측 데이터가 얼마나 같은지를 판단하는 지표
예측 결과가 동일한 데이터 수 / 전체 예측 데이터 수
직관적으로 모델 예측 성능을 나타내는 평가 지표
이진 분류의 경우 데이터의 구성에 따라 ML 모델 성능을 왜곡할 수 있음
불균형한 레이블 데이터 세트에서는 성능 수치로 사용돼서는 안됨

오차 행렬

학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고 있는지 보여주는 지표
예측 오류와 더불어 어떤 유형의 오류가 발생하는지 함께 나타냄
TN, FP, FN, TP

  • TN은 예측값을 Negative(0)으로 예측, 실제 값은 Negative(0)
  • FP는 예측 값을 Positive(1)으로 예측, 실제 값은 0
  • FN은 예측 값을 0, 실제 값은 1
  • TP는 예측 값을 1, 실제 값은 1

사이킷런은 오차 행렬을 구하기 위해 confusion_matrix() API 제공
ndarray 형태 출력
정확도 = (TN + TP)/(TN+TP+FN+TP)
일반적으로 불균형한 레이블 클래스를 갖는 이진 분류 모델에서는 적은 결과에 Positive를 설정하여 1을 부여, 그렇지 않은 경우를 0 값을 부여하는 경우가 많음

정밀도와 재현율

Positive 데이터 세트의 예측 성능에 초점을 맞춘 평가 지표
정밀도 = TP / (FP + FN)
재현율 = TP / (FN + TP)
정밀도는 예측을 Positive로 한 대상 중 예측과 실제 값이 일치한 데이터의 비율
Positive 예측 성능을 더욱 정밀하게 측정하기 위한 평가 지표로 양성 예측도라고도 불림
재현율은 실제 값이 Positive인 대상 중 예측과 실제 값이 Positive로 일치한 데이터의 비율
민감도, TPR이라고도 불림

  • 재현율이 상대적으로 더 중요한 경우는 Positive인 데이터를 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우
  • 정밀도가 상대적으로 더 중요한 경우는 실제 Negative인 데이터를 잘못 판단하게 되면 업무 상 큰 영향이 발생하는 경우

재현율과 정밀도 모두 TP를 높이는 데 동일하게 초점을 두지만, 재현율은 FN을 낮추는 데, 정밀도는 FP를 낮추는 데 초점을 둠
서로 보완적인 지표로 분류 성능 평가에 적용됨

정밀도/재현율 트레이드오프

정밀도 또는 재현율이 특별히 강조돼야 할 경우 분류의 결정 임계값(Threshold)을 조정하여 해당 수치를 높일 수 있음
하지만 서로 상호 보완적인 평가 지표이기 때문에 어느 한쪽을 강제로 높이면 다른 하나의 수치는 떨어지기 쉬움
예측 데이터가 특정 레이블에 속하는지를 계산하기 위해 먼저 개별 레이블별로 결정 확률을 구하고 예측 확률이 큰 레이블 값으로 예측하게 됨

사이킷런은 개별 데이터별로 예측 확률을 반환하는 메서드인 predict_proba()를 제공
predict_proba() 메서드는 학습이 완료된 사이킷런 Classifier 객체에서 호출이 가능하며 테스트 피처 데이터 세트를 파라미터로 입력하면 테스트 피처 레코드의 개별 클래스 예측 확률을 반환
반환 결과인 ndarray는 0과 1에 대한 확률을 나타내므로 두 값을 더하면 1이 됨
두 칼럼 중 더 큰 확률 값으로 최종 예측하게 됨

predict() 메서드는 predict_proba() 메서드에 기반해 생성된 API
사이킷런의 predict()는 predict_proba() 출력인 확률 값에서 정해진 임계값(이진 분류의 일반적인 경우 0.5)을 만족하는 ndarray의 칼럼 위치를 최종 예측 클래스로 정함

threshold 변수를 특정 값으로 설정하고 Binarizer 클래스로 객체 생성
해당 객체의 fit_transform() 메서드를 이용하여 넘파이 ndarray를 입력하면 ndarray의 값을 지정된 threshold보다 같거나 작으면 0, 크면 1로 반환

predict_prob() 메서드로 구한 각 클래스별 예측 확률값인 pred_proba 객체 변수에 분류 결정 임곗값을 지정한 Binarizer 클래스를 적용해 최종 예측값을 구하는 방식

사이킷런은 위 과정과 유사한 precision_recall_curve() API 제공

precision_recall_curve(y_true[실제 레이블값 배열], probas_pred[Positive 컬럼 예측 확률 배열])

반환 값은 임곗값별 정밀도, 재현율을 배열로 반환

정밀도와 재현율의 맹점

Positive 예측의 임곗값을 변경함에 따라 정밀도와 재현율의 수치가 변경됨
임곗값의 이러한 변경은 업무 환경에 맞게 두 개의 수치를 상호 보완할 수 있는 수준에서 적용

정밀도와 재현율 성능 수치도 어느 한쪽만 참조하면 극단적인 수치 조작이 가능
하나만 스코어가 좋고 다른 하나는 스코어가 나쁜 분류는 성능이 좋지 않은 분류로 간주할 수 있음
정밀도와 재현율의 수치가 적절하게 조합되어 분류의 종합적인 성능 평가에 사용될 수 있는 평가 지표가 필요

F1 Score

정밀도와 재현율을 결합한 지표
정밀도와 재현율이 어느 한 쪽으로 치우치치 않는 수치를 나타낼 때 상대적으로 높은 값을 가짐
F1 = 2 (precision recall) / (precision + recall)
A 모델이 정밀도가 0.9, 재현율이 0.1로 극단적인 차이가 나고 B 모델은 0.5, 0.5로 두 값의 큰 차이가 없다면 A 예측 모델의 F1 score는 0.18, B 모델의 F1 score는 0.5로 B 모델이 A 모델에 비해 우수한 F1 score를 갖게 됨
사이킷런은 F1 스코어를 구하기 위해 f1_score() API 제공

ROC, AUC

ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류 예측 성능 측정에 중요하게 사용되는 지표

ROC(Receiver Operation Characteristic Cruve)

FPR이 변할 때 TPR이 어떻게 변하는지를 나타내는 곡선
FPR을 X축, TPR을 Y축

TPR은 True Positive Rate의 약자 (재현율, 민감도)
TP / (FN + TP)
TNR인 특이성은 TN / (FP + TN)
FPR은 FP / (FP + TN) == 1 - TNR

ROC 곡선이 가운데 직선에 가까울수록 성능이 떨어지는 것이며 멀어질수록 성능이 뛰어난 것

사이킷런은 ROC 곡선을 구하기 위해 roc_curve() API 제공
precision_recall_curve()와 유사

일반적으로 ROC 곡선 자체는 FPR과 TPR의 변화 값을 보는데 이용하며 분류의 성능 지표로 사용되는 것은 ROC 곡선 면적에 기반한 AUC 값으로 결정

AUC(Area Under Curve)

ROC 곡선 밑의 면적을 구한 것으로써 일반적으로 1에 가까울수록 좋은 수치
AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 관건
가운데 직선에서 멀어지고 왼쪽 상단 모서리 쪽으로 가파르게 곡선이 이동할수록 직사각형에 가까운 곡선이 되어 면적이 1에 가까워지는 좋은 ROC AUC 성능 수치를 얻게 됨
대각선 직선은 랜덤 수준의 이진 분류 AUC 값으로 0.5
보통의 분류는 0.5 이상의 AUC 값을 가짐
사이킷런은 ROC AUC를 구하기 위해 roc_auc_score() API 제공

피마 인디언 당뇨병 예측

피마 인디언 당뇨병 데이터세트를 이용하여 당뇨병 여부를 판단하는 머신러닝 예측 모델 수립 및 위의 평가 지표 적용

  • Pregnancies : 임신 횟수
  • Glucose : 포도당 부하 검사 수치
  • BloodPressure : 혈압
  • SkinThickness : 피하지방 측정값
  • Insulin : 혈청 인슐린
  • BMI : 체질량지수
  • DiabetesPedigreeFunction : 당뇨 내력 가중치
  • Age : 나이
  • Outcom : 클래스 결정값 (0 또는 1)

실습 코드

분류 (Classification)

학습 데이터로 주어진 데이터의 피처와 레이블값을 머신러닝 알고리즘으로 학습하여 모델을 생성하고 생성된 모델에 새로운 데이터 값이 주어졌을 때 미지의 레이블을 예측하는 것
기존 데이터가 어떤 레이블에 속하는지 패턴을 알고리즘으로 인지한 뒤 새롭게 관측된 데이터에 대한 레이블을 판별

  • 베이즈 통계와 생성 모델에 기반한 나이브 베이즈 모델
  • 독립변수와 종속변수의 선형 관계성에 기반한 로지스틱 회귀
  • 데이터 균일도에 따른 규칙 기반의 결정 트리
  • 개별 클래스 간 최대 분류 마진을 효과적으로 찾는 서포트 벡터 머신
  • 근접 거리를 기준으로 하는 최소 근접 알고리즘
  • 심층 연결 기반의 신경망
  • 서로 다른 머신러닝 알고리즘을 결합한 앙상블

앙상블은 분류에서 가장 각광을 받는 방법 중 하나
이미지, 영상, 음성, NLP 영역에서 신경망에 기반한 딥러닝이 머신러닝계를 선도하고 있으나, 이를 제외한 정형 데이터 예측 분석 영역에서는 앙상블이 매우 높은 예측 성능으로 인해 많은 분석가와 데이터 과학자들에게 애용되고 있음

앙상블은 서로 다른/또는 같은 알고리즘을 단순히 결합한 형태도 있으나 일반적으로는 배깅과 부스팅 방식으로 나뉨
배깅 방식의 대표인 랜덤 포레스트는 뛰어난 예측 서능, 상대적으로 빠른 수행 시간, 유연성 등으로 많은 분석가가 애용
근래 앙상블 방법은 부스팅 방식으로 지속해서 발전하고 있음
부스팅의 효시라고 할 수 있는 그래디언트 부스팅의 경우 뛰어난 예측 성능을 가지고 있으나 수행 시간이 오래걸리는 단점으로 인해 최적화 모델 튜닝이 어려움
XgBoost와 LightGBM 등 기존 그래디언트 부스팅의 예측 성능을 발전시키면서도 수행 시간을 단축시킨 알고리즘이 계속 등장하면서 정형 데이터의 분류 영역에서 가장 활용도가 높은 알고리즘으로 자리잡음

결정 트리(Decision Tree)

실습 코드

ML 알고리즘 중 직관적으로 이해하기 쉬운 알고리즘
데이터에 있는 규칙을 학습을 통해 찾아내어 트리 기반의 분류 규칙을 만듬
규칙 노드는 규칙의 조건
리프 노드는 결정된 클래스 값
새로운 규칙 조건마다 서브 트리가 생성됨
데이터 세트에 피처가 있고 이러한 피처가 결합해 규칙 조건을 만들 때마다 규칙 노드가 만들어짐
많은 규칙이 있다는 것은 곧 분류를 결정하는 방식이 더욱 복잡해진다는 얘기이고, 이는 곧 과적합으로 이어지기 쉬움
트리의 깊이가 깊어질수록 결정 트리의 예측 성능이 저하될 가능성이 높음

가능한 적은 결정 노드로 높은 예측 정확도를 가지려면 데이터를 분류할 때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 함
최대한 균일한 데이터세트를 구성할 수 있도록 분할하는 것이 필요

결정 노드는 정보 균일도가 높은 데이터세트를 먼저 선택할 수 있도록 규칙 조건을 만듬
균일도가 데이터 세트로 쪼개질 수 있도록 조건을 찾아 서브 데이터 세트를 만들고, 다시 이 서브 데이터 세트에서 균일도가 높은 자식 데이터 세트로 쪼개는 방식을 내려가면서 반복

정보의 균일도를 측정하는 대표적인 방법은 엔트로피를 이용한 정보 이득 지수와 지니 계수가 있음

  • 정보 이득은 엔트로피를 기반으로 함
    엔트로피는 주어진 데이터 집합의 혼잡도를 의미
    서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮음
    정보 이득 지수는 1 - 엔트로피 지수
    결정 트리는 이 정보 이득 지수로 분할 기준을 설정
  • 지니 계수는 경제학에서 불평등 지수를 나타낼 때 사용하는 계수
    0이 가장 평등, 1로 갈수록 불평등
    데이터가 다양한 값을 가질수록 평등, 특정 값으로 쏠릴 경우 불평등한 값이 됨
    다양성이 낮을 수록 균일도가 높다는 의미로 1로 갈수록 균일도가 높으므로 지니 계수가 높은 속성을 기준으로 분할

DecisionTreeClassifier는 기본으로 지니 계수를 이용하여 데이터 세트를 분할
결정 트리의 일반적인 알고리즘은 데이터 세트를 분할하는데 가장 좋은 조건, 즉 정보 이득이나 지니 계수가 높은 조건을 찾아 자식 트리 노드에 걸쳐 반복적으로 분할한 뒤 데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 결정

결정 트리 모델의 특징

정보의 균일도라는 룰을 기반으로 하고 있어 알고리즘이 쉽고 직관적
룰이 매우 명확하고 이에 기반해 어떻게 규칙 노드와 리프 노드가 만들어지는지 알 수 있고, 시각화할 수 있음
정보의 균일도만 신경 쓰면 되므로 특별한 경우를 제외하고는 각 피처의 스케일링과 정규화 같은 전처리 작업이 필요 없음
가장 큰 단점은 과적합으로 정확도가 떨어진다는 점
피처 정보의 균일도에 따른 룰 규칙으로 서브트리를 계속 만들다 보면 피처가 많고 균일도가 다양하게 존재할수록 트리의 깊이가 커지고 복잡해질 수밖에 없음

모든 데이터 상황을 만족하는 완벽한 규칙은 만들지 못하는 경우가 더 많음에도 결정 트리는 학습 데이터 기반 모델의 정확도를 높이기 위해 계속해서 조건을 추가하면서 트리 깊이가 계속 커지고 결과적으로 복잡한 학습 모델에 이르게 됨
복잡한 학습 모델은 결국 실제 상황에 유연하게 대처할 수 없어 예측 성능이 떨어질 수밖에 없음
트리 크기를 사전에 제한하는 것이 오히려 성능 튜닝에 도움을 줌

결정 트리 파라미터

사이킷런은 DecisionTreeClassifier와 DecisionTreeRegressor 클래스 제공
사이킷런의 결정 트리 구현은 CART(Classification and Regression Trees) 알고리즘 기반
CART는 분류뿐만 아닌 회귀에서도 사용될 수 있는 트리 알고리즘

  • min_sample_split
    노드를 분할하기 위한 최소한의 샘플 데이터 수, 과적합 제어에 사용됨
    디폴트는 2, 작게 설정할수록 분할되는 노드가 많아져 과적합 가능성 증가
  • min_samples_leaf
    말단 노드가 되기 위한 최소한의 샘플 데이터 수
    비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우 작게 설정 필요
  • max_features
    최적의 분할을 위해 고려할 최대 피처 개수
    default=None으로 데이터 세트의 모든 피처를 사용해 분할
    int형으로 지정하면 대상 피처의 수, float형으로 지정하면 전체 피처 중 대상 피처의 퍼센트
    sqrt는 루트 전체 피처 개수만큼 선정
    auto는 sqrt와 동일
    log는 log2(전체 피처 개수) 선정
    None은 전체 피처 선정
  • max_depth
    트리의 최대 깊이 규정
    default=None
    완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나 노드가 가지는 데이터 개수가 min_sample_split보다 작아질 때까지 계속 깊이를 증가시킴
    깊이가 깊어지면 min_samples_split 설정대로 최대 분할하여 과적합할 수 있으므로 적절한 값으로 제어 필요
  • max_leaf_nodes
    말단 노드의 최대 개수

결정 트리 모델 시각화

Graphviz 패키지를 사용
Graphviz는 원래 그래프 기반 dot 파일로 기술된 다양한 이미지를 쉽게 시각화할 수 있는 패키지
Graphviz 패키지와 쉽게 인터페이스할 수 있도록 export_graphviz() API 제공
인자로 학습이 완료된 Estimator, 피처의 이름 리스트, 레이블 이름 리스트를 입력하면 학습된 결정 트리 규칙을 실제 트리 형태로 시각화해 보여줌

Graphviz는 파이썬으로 개발된 패키지가 아닌 C/C++로 운영 체제에 포팅된 패키지이므로 이를 파이썬 기반의 모듈과 인터페이스해주기 위해서는 먼저 Graphviz를 설치 후 파이썬과 인터페이스할 수 있는 파이썬 래퍼 모듈을 별도로 설치해야 함

리프 노드는 최종 클래스(레이블) 값이 결정되는 노드
자식 노드가 있는 노드는 브랜치 노드이며 자식 노드를 만들기 위한 분할 규칙 조건을 가지고 있음

사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는데 있어 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 featureimportances 속성으로 제공
ndarray 형태로 값을 반환
값이 높을수록 해당 피처의 중요도가 높다는 의미

결정 트리 과적합

과적합 문제를 시각화를 통해 확인
사이킷런은 분류를 위한 테스트 데이터를 쉽게 만들 수 있도록 make_classification() 함수 제공
2개의 피처가 3가지 유형의 클래스 값을 가지는 데이터세트를 만들고 그래프로 시각화
트리 생성 조건을 제약하는 경우 학습 데이터에만 지나치게 최적화된 분류 기준에 의한 과적합을 방지할 수 있음

profile
소신있는 오픈마인드

0개의 댓글