https://rk1993.tistory.com/entry/Ridge-regression%EC%99%80-Lasso-regression-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

  • Sensitivity(민감도): 질병이 있는 사람을 양성으로 검출하는 능력
  • Specificity(특이도): 질병이 없는 사람을 음성으로 검출하는 능력
  • Positive Predictive Value(양성예측치): 양성으로 나온 것 중에 실제로 질병이 있을 확률
  • Negative Predictive Value(음성 예측치): 음성으로 나온 것 중에 실제로 질병이 없을 확률

3months.tistory.com/318

참고하기 좋은 블로그

 

쉽게 이해하는 민감도, 특이도, 양성예측도

쉽게 이해하는 민감도, 특이도, False Positive, False Negative, 양성예측도 민감도 (Sensitivity), 특이도(Specificity), 양성 예측도(Positive Predictive Value, PPV) 는 바로 무언가를 예측하는 상황에서..

3months.tistory.com

 

'데이터분석 > 머신러닝' 카테고리의 다른 글

Decision tree  (0) 2022.06.29
LASSO 이해하기  (0) 2021.06.28
Upsampling방법 - SMOTE 알고리즘  (0) 2021.04.09
imbalance classification 다루는 방법 2  (0) 2021.04.05
Tree 모델과 R tree library  (0) 2021.01.27
  • up-sampling을 할때 이점과 영향
  • SMOTE 알고리즘

 

1.  up-sampling을 할때 이점과 영향

down-sampling은 데이터 수가 많다고 생각될 경우 사용을 하지만, 보통 데이터수가 많으면 많을수록 좋기때문에 

up-sampling을 down-sampling보다 선호합니다.

 

unsupervised machine learning model과 다르게 supervised model은 outcome의 확률분포를 학습하지 않습니다. 

따라서, training data의 outcome비율을 1:1로 맞추기 위해 up-sampling을 해주어도 절대! test data의 outcome 비율을 변경하기 위해 test data도 up-sampling을 해주지 않습니다!

 

'데이터의 비율을 달리하여 학습한 모델인데 test data도 비슷한 분포를 띄어야 학습결과가 좋게 나온다?'라고 쉽게 오해할 수 있습니다.

하지만, 기본적으로 test data는 변경하여 사용하는 것이 아닐 뿐더러

 

1) 모델이 학습할 때, supervised model의 경우 outocme의 비율을 학습하지 않습니다. 

upsampling의 목적은 imbalance한 데이터를 학습할 경우 모델이 한쪽 class로 판단하는 모델로 빠르게 도달하지 않도록 방해하는 역할을 합니다. up-sampling은 rare class의 데이터들을 복원추출하여 데이터를 늘리는것이기 때문에 다량의 학습데이터를 학습하는 효과를 주는것이 아닌, rare class의 특성을 반영한 데이터들이 늘어나서 over-fitting이 됩니다. 

 

2) test data의 분포를 모델이 체크하지 않습니다.

training data로 모델을 만들고 나서 test data를 이용해 모델의 성능을 평가하는데 이때, test data는 한개씩 들어가서 이를 (binary의 경우) 1,0중에 판단하여 결과값만 내기때문에 outcome의 분포는 상관하지 않습니다.  

 

 

2. SMOTE 알고리즘

Up-sampling의 하나의 종류로, k 최근접 이웃 method를 이용한 방법입니다.

우선, k 최근접 이웃 모델을 사용할때처럼 rare class의 데이터들중 하나의 데이터를 선택하고 그 주변에 얼마나 많은 k개의 이웃을 선택할 것인지 정해줍니다. 

 

예를 들어, k가 5개이면, 정해진 중심으로부터 5개의 이웃만 고려를 할것입니다.

 

그리고 간단히, SMOTE알고리즘이 구동되는 방식을 보자면,

X는 선택한 점, X(nn)은 그 주변에 선택된 하나의 근접이웃, u는 균등분포입니다. 

 

SMOTE 알고지름 가설

 

예를 들면, X가 (5,1)이고 X(nn)이 (2,3)인 경우 X(nn)부터 X까지의 거리를 표현하면 (-3,2)가 됩니다. 

 

 

 

Synthetic 계산 예제 

 

두 점사이 거리에서 0부터 1사이의 값이 랜덤으로 곱해져서 둘 사이에 위치하는 새로운 데이터가 생성이 될 것입니다. 

 

이 방법은 rare class의 있는 데이터를 고르는것이 아닌, 비슷한 데이터를 생성해내기 때문에 약간의 차이는 있지만 

그래도 over-fitting의 문제를 고려해야합니다. 

 

 

reference: www.youtube.com/watch?v=Vhwz228VrIk

 

'데이터분석 > 머신러닝' 카테고리의 다른 글

LASSO 이해하기  (0) 2021.06.28
Sensitivity, Specificity, PPV, NPV  (0) 2021.04.26
imbalance classification 다루는 방법 2  (0) 2021.04.05
Tree 모델과 R tree library  (0) 2021.01.27
Cross-validation (교차검증)  (0) 2021.01.07

 

인공지능공학연구소 김성범소장님의 자료 

 

위에 그림에서 보듯이, 정상데이터는 파란색, 이상데이터는 빨간색, 나중에 test data로 쓰일 이상데이터들은 회색으로 표현이 됩니다. 

잘 분류한다는 것은 파란색과 실제 이상관측치 분포를 구분해 내는것인데 모델은 아래처럼 다르게 학습됩니다. 

오분류하는 모델의 예시 (인공지능공학연구소 김성범소장님의 자료) 

 

이렇듯, 데이터가 압도적으로 많은 정상데이터로 분류를 잘하는 모델을 만들 수 있지만, 이와 반면, 이상데이터를 잘 분류하지 못하는 모델을 만들더라도, accuracy를 계산하였을 때 매우 높은 값이 나올 수 있지만 이 사실을 믿어서는 안됩니다. 

 

특히, 타겟이 1%의 굉장히 소수인 데이터에 대해서 이러한 문제를 개선할 방법들이 존재합니다. 예를 들면, 위조지폐를 찾아낼때 outcome의 수가 적기 때문에 이를 개선하기 위해 많은 방법들이 고안되어 왔습니다.

 

Class imbalance Problem?

- 각 클래스의 개수비가 현저히 차이나는 것을 말합니다. 

fraud detection, medical diagnosis, anomaly detection, facial recognition 등에서 주로 생기는 문제입니다. 

 

크게 두가지 접근 방법으로 imbalanced problem을 해결합니다. 

  •  Cost function based approach: rare class에 가중치를 더 주거나, rare class를 잘못분류 했을때 cost, loss, param을 조정하는 방법
  •  Sampling based approach: 데이터 자체를 늘리고 줄이는 방법 ex) 업샘플링, 다운샘플링, SMOTE

 

오늘은 abnormal을 detection하는 classifier를 학습하는데 좋은방법들을 고려해보았습니다.

  • 적절한 metrixs를 사용하여 평가하기
  • resample the training set: under sampling and over sampling
  • 서로다른 데이터셋으로 학습 후 앙상블하기
  • clustering하여 rare class와 모델 학습하기
  • 딥러닝을 이용한 학습과 클래스 가중치주기

 

1. 적절한 metrix사용해서 평가하기 

no information rate이 높은 경우 기본적으로 model의 error와 함께, FN rate을 비교해서 전체 1중에 0이라고 예측한 비율을 줄이는 방향으로 해석해야합니다. 또한, 모델의 accuracy로 평가하되, 이또한, accuracy가 no information rate보다 낮게 나왔다고 나쁜 모델이라고 말할수는 없습니다.  

예를 들면, 달리기 선수에게 역도를 시켰는데 능률이 평균 이하로 나온다고 역도선수를 운동을 못한다고 판단할 수 없습니다.

이럴때는, sensitivity와 specificity를 확인하여 모델이 정말로 학습을 해서 분류를 잘한것인지, 혹은 하나의 classification으로 판단을 하는지 확인해야합니다.   

또한, accuracy와 sensitivity, specificity 모두 낮은 모습을 보였지만, 어느정도 AUC값이 높게 나온다면 무시해도 될 정도의 수준이라고 할 수 있습니다.  

 

2. resample the training set: under sampling and over sampling (drawback가능성 있음)

- under sampling의 경우 (=down-sampling), abundant class에서 무작위추출을 통해 rare class의 수와 1:1의 outcome의 비율을 만들 수 있으나, 데이터 수를 떨어트림으로 학습효율을 줄어들게 할 수 있습니다.

중요한 정상데이터를 잃어버리는 경우가 생길수도 있습니다. 

(어느정도 데이터가 적절할까? 누가봐도 변수에 비해 데이터가 적지않다고 생각되는 정도수준)  

 

- over sampling의 경우(=up-sampling), outcome에서 rare class의 데이터를 증축시켜 abundant class의 데이터를 늘리는 방법입니다. 적은 rare class에서 복원추출로 abundant class와 비율을 맞춰주는 것입니다. 

무작위로 소수의 데이터를 복제해서 늘리는 방법이 있어 정보가 손실되지는 않지만 overfitting의 가능성이 큽니다. 

 

* over-sampling을 하기전, 무조건 k-cross validation을 수행하여야합니다. (over-sampling은 rare sample기반으로 distribution function을 통해 random data를 생성하기 때문에)

 

https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets

그런데 어떻게? 데이터의 수를 늘릴까요? 

 

<SMOTE(Synthetic Minority Over-sampling Technique 개념>

 

낮은 비율의 클래스 데이터를 최근접 이웃을 이용해서 생성합니다. 

일반적으로 성공적인 인스턴스 생성을 하지만, 소수데이터들 사이에서 보간하여 작동하기 때문에 모델링셋의 소수데이터들 사이의 

특성을 반영하여 새로운 데이터 예측에 취약할수도 있습니다. 

 

https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets

 

간략한 SMOTE코드

* SMOTE방법 python코드

mkjjo.github.io/python/2019/01/04/smote_duplicate.html 

 

[Python] SMOTE를 통한 데이터 불균형 처리

* 본 포스트는 개인연구/학습 기록 용도로 작성되고 있습니다. 데이터 분석시 쉽게 마주하게 되는 문제 중 하나가 데이터의 불균형이다. 우리가 찾고자하는 데이터의 타겟의 수가 매우 극소수인

mkjjo.github.io

 

그 외에 repitition, bootstraping 등의 방법이 있습니다.

하나의 리샘플링 방법이 다른 리샘플링보다 월등히 좋은 것은 없습니다. 

각 데이터별로 다르게 작용하기 때문에 모두 시도해보는 것을 추천합니다. 

 

3. 서로 다른 데이터셋으로 앙상블하기

가장 간단하고 쉬운 방법이며, rare class에 맞게 abundant class를 n개로 나눈뒤, 각각 abundant class와  rare class를 합쳐,

n번의 모델학습을 하여 결과를 합치거나 ,평균내서 사용합니다. 

 

 

4. clustering하여 rare class와 학습하기

clustering을 통해, abundant class를 r groups로 clustering하는 것을 제안합니다. classes의 개수를 r로하고, 각 그룹에 대해 

medoid(center of cluster)에 유지됩니다. 모델을 학습할 땐 rare class와 medoid로 학습하면 됩니다.   

 

5. 딥러닝을 이용한 학습과 class 가중치 주기

=> 소수 클래스에서 정답을 맞추지 못한 경우, loss에 패널티를 더 줘서 학습을 시킴

=> auc를 최적화하는 방향으로도 학습시킬 수 있음

 

클래스 가중치 주기

reference cite: 

ourcstory.tistory.com/240

 

Imbalanced data를 처리하는 기술 7가지

7 Techniques to Handle Imbalanced Data intrusion detection real-time bidding Introduction fraud detection in banking real-time bidding in marekting intrusion detection in networks 위 분야에서는 1%보..

ourcstory.tistory.com

불러오는 중입니다...

 

 

  • 간단히 Tree 모델이란
  • 모델을 만드는 과정
  • 알고리즘
  • R tree library (tree, rpart, ctree)

 

1. tree 모델

결정트리 (Decision tree)는 분류와 회귀 모두 가능한 지도학습 모델입니다. 

특정 질문에 따라 예, 아니오로 구분하는 모델을 결정트리모델이라고 합니다. 

 

예를 들면, 강아지와 고양이, 새를 구분하는데 질문으로 '날개는 있나요?'라고 한다면

강아지와 고양이는 날개가 없으므로 '아니오', 새는 날개가 있으니 '예'로 두가지로 구분합니다. 

 

따라서 한번 질문을 던질때, 우리는 이것을 분기라고 부를 것인데, 이때마다 두개의 영역으로 구분합니다. 

 

 

 

앞으로, 질문이나 정답을 담은 네모상자는 Node라고 부를 것인데, 

가장 첫 질문이 되는 node를 Root Node라고하고 맨 마지막 node를 Terminal Node or Leaf Node라고 합니다. 

중간마디는 말 그대로 Intermediate Node라고 합니다. 

이런 모습을 거꾸로 뒤짚어놓은 나무같다고 해서 Decision Tree라고 합니다. 

 

 

 

2. 트리모델을 만드는 과정

 

 

가장 위에서부터 아래까지 node의 깊이를 hyperparameter로 주고 학습을 시키는데, 

깊이가 너무 깊다면, 오버피팅 될 가능성이 높습니다. 

 

이럴때, 가지치기(Prunning)으로 오버피팅을 막을 수 있습니다. 

 

우리가 hyperparameter로 정할 수 있는 것은, 최대 깊이, 터미널 노드의 최대개수, 한 노드가 분할하기위한 최소 데이터수를 제한하는 것입니다. 

 

R과 파이썬에서 hyperparameter를 부르는 명칭은 각 library별로 다르지만,

예를 들어, sklearn에서 min_sample_split (한 노드가 분할하기 위한 최소데이터 설정변수)를 10으로 해준다면, 데이터가 10개 이하가 되면 더이상 분할하지 않습니다. 

또한, max_depth를 통해 최대 깊이를 정해주고, 만일 값이 4라면 4보다 크게 가지를 치지 않습니다. 

 

3. 알고리즘

 

엔트로피(Entropy)와 불순도(Impurity)

불순도란 해당 범주 안에 서로 다른 데이터가 얼마나 섞여있는지를 뜻합니다. 

불순도가 높다는 것은 순도가 낮다고 말할 수 있습니다. 

 

예를 들어, 아래 그림에서 윗 부분은 불순도가 낮다고 말할 수 있습니다. 

 

엔트로피는 이런 불순도를 수치적으로 나타낸 척도입니다. 

엔트로피가 높다는 것은 불순도가 높다는것이고, 낮은건 불순도가 낮다는 뜻입니다. 

엔트로피는 0,1사이에 값을 가지는데 1이면 불순도가 최대입니다. 

이 뜻은 한 범주안에 데이터가 정확히 반반 있다는 뜻입니다. 

 

정보획득(Information gain)

 

엔트로피가 1인 상태에서 0.7인 상태로 바뀌었다면 정보획득은 0.3입니다. 

분기 이전의 엔트로피에서 분기 이후의 엔트로피를 뺀 수치를 정보획득이라고 합니다. 

 

Information gain = entropy(parent) - [weighted average] entropy(children)

 

4. R library

 

의사결정나무를 생성하는 3가지 방법이 있습니다.

tree()함수, rpart()함수, ctree()함수

각각, 다른 라이브러리의 함수입니다. 

 

각각, 살펴보면

  1. tree()함수: binary recursive partitioning방법을 사용합니다. 불순도의 측도로 엔트로피지수를 사용하며, tree()함수는 엔트로피가 높은 상태에서 낮은상태가 되도로고 나무모양을 생성합니다.
  2. CART(Classification And Regression Trees)방법을 사용합니다. Gini index가 작아지는 방향으로 움직이며 가장 많이 감소시켜주는 변수가 영향을 가장 많이 끼치는 변수가 됩니다.
  3. Unbiased recursive partitioning based on permutation test방법을 사용합니다. p-test를 거친 significance를 기준으로 가지치기를 할 변수를 결정하기 때문에 biased될 위험이 없어서 별도로 가지치리를 할 필요가 없는 모델입니다. 

ctree같은 경우 앞에 두, tree와 part함수의 단점을 보완해줍니다. 

 

 

 

 

 

 

1. cross-validation은 무엇이고 왜 사용할까? 

 

train과 test를 8:2 혹은 7:3으로 나누어서 train data로 학습을 시키고, test data를 이용해 얼마나 답을 잘 맞추는지 확인합니다. 

그런데, 여기서 중요한 점은 한가지 test data에 맞춰서 다른 파라메터들을 조정해주면 test data에만 맞는 모델로 점차 발전할 것입니다. 

이를 test data에 overfitting(과적합)되었다고 합니다. 

 

그래서 실제 데이터를 사용해서 모델에 넣으면 엉망인 결과가 나올수도 있습니다.

 

이를 해결하고자 하는 과정이 cross-validation (교차검증)입니다. 

 

cross-validation을 하지않고, train과 test데이터를 나누는 과정

위처럼 train과 test를 나누는 과정을 데이터 구간 k에 대해서 subset을 만들고 k구간을 평가하는 방식으로 진행합니다. 

cross-validation

k개의 test data에 대해서 모두 결과를 검증합니다. 예를 들면, k개에 대한 accuracy의 평균을 사용해서 모델의 성능을 평가해주는 방식으로 수행합니다. 

 

2. cross-validation의 장점과 단점

장점

  • 평가 데이터가 편향되는 것을 방지할 수 있다. 
  • 정확도를 향상시킨다.
  • 데이터가 부족해서 underfitting되는 것을 막을 수 있다.

단점

 

  • 학습시간이 오래걸린다.

 

3. 교차검증 방법들

 

몇가지 유명한 방법이 있지만, 가장 많이 사용하는 k-fold validation에 대해서 설명하려고 합니다. 

 

k개의 데이터 폴드를 만들어서, 한번의 iteration에 다른 test data를 사용하고 나머지 k-1개의 train data로 학습을 하여 

데이터 폴드 세트(train k-1개와 test 1개)에서 나온 검증 결과들을 평균내어 사용합니다.  

 

 

 

본인이 가진 데이터가 편향되지 않고 결과가 robustness함을 증명함으로서 한쪽 데이터에 치중되는 것을 방지해줍니다. 

 

CV는 모델을 평가하기 때문에 각 데이터별로 모델의 결과가 다르게 나온다고 데이터를 변형하는 방법은 맞지 않습니다. 

데이터셋은 우리가 갖고있는 데이터이고, 모델이 더 좋게 나올 수 있는 방향으로 하이퍼파라메터 튜닝을 한다던가, 변수선택을 잘 한다던가 이런방식으로 모델을 수정하여 정확도를 높이는 방향으로 나아가야합니다. 

 

예제가 좋은 블로그가 있어서 가져와봅니다. 

참고하시면 좋은 블로그인것 같아요.

 

daryan.tistory.com/21

 

001 교차 검증 (cross validation)의 예제 R 코드

안녕하세요 본 강의(포스팅)은 아래의 사이트 내용을 일부 번역하고 필자의 의견을 추가 구성한 글임을 미리 밝혀드립니다. https://www.analyticsvidhya.com/blog/2015/11/improve-model-performance-cross-valid..

daryan.tistory.com

 

  • 의사결정나무란?
  • 모델의 종류
  • R의 tree로 학습한 결과 해석

 

 

(1) 의사결정나무란?

 

머신러닝 기법 중 하나로 대표적인 화이트박스 모델입니다. 그렇기에 분석과정을 직관적으로 이해하기 좋은 모델이죠.

이 기법은 특정변수에 대해 결정규칙을 만들고 나무형태로 분류해나가는 기법을 사용하고 있습니다.

 

모델의 장점은 연산비용이 작다는 것(모델 학습이 빠르다는 것), 수치형, 문자형 변수에 대해 모두 적용이 가능하다는 점 입니다.

 

(2) 모델의 종류

 

통계학을 기반한 카이스퀘어, T검정, F검정 등이 있고, CART와 CHAID알고리즘, 기계학습계열인 ID3, C4.5, C5.0 등이 존재합니다.

이런 모델을 구현한 R 라이브러리는 크게 세가지가 있는데 =>  tree, rpart, party

라이브러리마다 방법론의 차이가 있기때문에 선택을 중요시 해야합니다. 

tree와 rpart는 과적합의 우려가 있지만 연산속도가 빠르고, party같은 경우 과적합의 우려는 없지만 변수 사용개수의 제한(31개)이 있기 때문입니다.

 

  • tree: binary recursive partitioning 
  • rpart: CART(classification and regression tree)
  • party

 

참고 블로그: 

rpubs.com/jmhome/DecisionTree

 

RPubs - R을 사용한 의사결정나무 분석

 

rpubs.com

 

(3) R의 tree로 학습한 결과 해석

 

일단, 우리가 본인이 가진 data의 y변수(종속변수)기준으로 train data롸 test data를 나눠줍니다.

caret에 createDatatPartition함수를 사용해서 index를 무작위추출로 뽑아 준 뒤,

함수 내에 p는 비율을 의미하고, list는 list로 반환할지 말지를 의미합니다. (주로 matrix로 받기 위해 F를 사용한다.)

 

library(caret)

train_idx = createDataPartition(y=data$outcome, p=0.7, list=F)
train = data[train_idx,]
test = data[-train_idx,]

 

그리고 tree모델을 적용할 library를 불러와서, tree모델을 적용해봅니다.

그 후 결과를 plot하는데 이때, plot과 text로 간편히 tree 모델을 시각화 할 수 있습니다.

library(tree)
tree_mod = tree(outcome ~ .,data=train)

plot(tree_mod)
text(tree_mod)

 

 

 

하지만, 앞에서도 언급했듯이 tree 모델은 과적합의 우려가 있어 가지치기 작업(prunning) 이 필요합니다.

 이 작업에서 주로 에러가 많이 나는데,

 

FUN을 사용할때 

error in storage.mode(y) - double 에러가 날 수 있습니다.

이건 tree모델의 output은 수치가 아니라 문자 혹은 categorical형이어야 하는데 수치형이기 때문에 나는 에러이기 때문입니다.

 

prun_cv = cv.tree(tree_mod, FUN = prune.misclass)
plot(prun_cv)

 

아래 plot은 가지치기를 몇개로 하냐에 따라 분산을 보여주는 것인데

대략 4-6사이의 가지가 분산이 가장 낮음으로 나왔습니다.

 

 

이를 선택해주고 다시 모델을 만들면,

tree_prune = prune.misclass(tree_mod,best=5)
plot(tree_prune)
text(tree_prune,pretty=0)

 

 

과적합 오류를 제외하고 모델을 만들었습니다.

 

이제 모델의 결과를 본격적으로 해석해봅시다.

필요한 라이브러리 e1071과 Epi를 불러온다. 그리고 모델의 예측을 수행하고, ROC커브도 그려봅니다.

 

library(e1071)
library(Epi)

tree_pred = predict(prune_tree, test, type='class')
confusionMatrix(tree_pred, test$outcome)

ROC(test=test$outcome, stat=tree_pred, plot='ROC', AUC=T, main='Decision Tree')

 

그 결과 confusionMatrix로 결과를 보여줍니다.

 

 

저는 tree모델만 사용해보았지만, 데이터에 따라 rpart, party의 정확성이 더 높을 수도 있습니다. 

 

 

모델을 사용하면서 개인적으로 겪은 문제

  • Sensitivity, Specificity가 1,0으로 나옴 => 아무리 outcome 데이터 비율이 7:3, 8:2 더라도, 저런 문제를 겪는다면 예측 자체에 문제가 있습니다. 이럴 때, 모델에 변수개수가 너무 적거나 많은건 아닌지 의심을 해보는 것도 좋습니다.

woosa7.github.io/R-%ED%86%B5%EA%B3%84%EB%B6%84%EC%84%9D-%EB%8B%A4%EC%A4%91%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D/

 

R을 활용한 통계분석 - 5.다중회귀분석

 

woosa7.github.io

 

+ Recent posts