데이터 불균형 | [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법 모든 답변

당신은 주제를 찾고 있습니까 “데이터 불균형 – [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 ‍김성범[ 소장 / 인공지능공학연구소 ] 이(가) 작성한 기사에는 조회수 8,613회 및 좋아요 191개 개의 좋아요가 있습니다.

데이터 불균형 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법 – 데이터 불균형 주제에 대한 세부정보를 참조하세요

불균형 데이터 분석을 위한 샘플링 기법을 언더샘플링과 오버샘플링로 나누어 설명한다.

데이터 불균형 주제에 대한 자세한 내용은 여기를 참조하세요.

불균형 데이터 (imbalanced data) 처리를 위한 샘플링 기법

불균형 데이터란 정상 범주의 관측치 수와 이상 범주의 관측치 수가 현저히 차이나는 데이터를 말합니다. 예를 들면, 암 발생 환자가 암에 걸리지 않은 사람보다 현저히 …

+ 더 읽기

Source: casa-de-feel.tistory.com

Date Published: 4/22/2022

View: 5224

데이터 불균형에 대응하기_1

데이터의 불균형이란, 특정 클래스의 데이터가 매우 높은 빈도로 등장하는 현상을 이야기합니다. 영상 인식 분야에서 많이 쓰이는 CIFAR-100 데이터셋 …

+ 더 읽기

Source: blog.mathpresso.com

Date Published: 7/26/2021

View: 188

Machine Learning Imbalanced Data(불균형 데이터)

데이터가 불균형하다는 말이 어떤 뜻일까요? 남/여, 구매여부 등 클래스 분포를 예측해야 하는 분류문제에서 예측 라벨 값의 분포가 100:1, 200:1 …

+ 여기에 자세히 보기

Source: shinminyong.tistory.com

Date Published: 10/2/2021

View: 1727

[논문]머신러닝을 위한 불균형 데이터 처리 방법 : 샘플링을 위주로

제안하는 방법은 샘플링 방법을 중심으로 다수 클래스(Major Class)의 모집단 분포를 효율적으로 추출하도록 검증하여 머신 러닝을 위한 불균형 데이터 문제를 해결한다.

+ 여기에 표시

Source: scienceon.kisti.re.kr

Date Published: 7/22/2022

View: 1388

[인사이드 머신러닝] 불균형 데이터 샘플링 – velog

불균형 데이터 문제. 모델을 학습시킴에 있어 클래스 간 샘플 수의 차이가 너무 크게 되면 분류기는 더 많은 샘플이 존재하는 클래스로 편향(bias, …

+ 더 읽기

Source: velog.io

Date Published: 1/11/2021

View: 8601

6. 불균형 데이터 해결하기 (주가 예측 프로젝트) – Inhovative AI

현재 전처리한 주식 데이터는 불균형이 심하기 때문에 모델링이 쉽지 않습니다. 이번 포스팅은 데이터 불균형을 해결하기 위한 여러가지 방법을 시도해 …

+ 여기에 보기

Source: inhovation97.tistory.com

Date Published: 7/8/2021

View: 1800

오버 샘플링 기법을 적용해 불균형 데이터 문제 해결하기 1편

불균형 데이터란? 머신러닝 모델을 학습시키기 위해서는 많은 양의 데이터가 필요합니다. 데이터가 아주 많아도 “정상”에 해당하는 데이터가 대부분 …

+ 여기에 보기

Source: blog.linewalks.com

Date Published: 1/29/2022

View: 2990

SMOTE로 데이터 불균형 해결하기 – John

이번에는 불균형 데이터(imbalanced data)의 문제를 해결할 수 있는 SMOTE(synthetic minority oversampling technique)에 대해서 설명해보고자 한다.

+ 여기에 더 보기

Source: john-analyst.medium.com

Date Published: 5/16/2022

View: 8055

불균형 데이터 처리를 통한 침입탐지 성능향상에 관한 연구

이러한 클래스 불균형을 해결하기 위해 주로 사. 용되는 방법으로 데이터 샘플링(Data Sampling). 기법이 있다. 데이터 샘플링은 불균형한 데이터셋. 에서 대부분을 …

+ 여기를 클릭

Source: www.koreascience.kr

Date Published: 2/26/2021

View: 7422

주제와 관련된 이미지 데이터 불균형

주제와 관련된 더 많은 사진을 참조하십시오 [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법
[핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법

주제에 대한 기사 평가 데이터 불균형

  • Author: ‍김성범[ 소장 / 인공지능공학연구소 ]
  • Views: 조회수 8,613회
  • Likes: 좋아요 191개
  • Date Published: 2020. 2. 10.
  • Video Url link: https://www.youtube.com/watch?v=Vhwz228VrIk

불균형 데이터 (imbalanced data) 처리를 위한 샘플링 기법

*해당 포스팅은 고려대학교 산업경영공학부 김성범 교수님의 Youtube 채널의 “[핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법” 자료를 보고 공부하며 작성한 글입니다. 그림들의 출처도 아래의 출처와 동일합니다.

출처: https://www.youtube.com/watch?v=Vhwz228VrIk&list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&index=7

안녕하세요! 이전에 신용카드 사기 검출 실습에서 불균형 데이터를 다뤘었는데 불균형 데이터를 처리하는 다른 방법들은 무엇이 있을까 궁금하여 찾아보다

제가 강의를 자주 듣던 김성범 교수님 채널에서 불균형 데이터 분석을 위한 샘플링 기법 강의를 보고 공부하여 포스팅하게 되었습니다.

그럼 불균형 데이터를 처리하는 여러 샘플링 기법들에 대해서 알아보겠습니다.

1. 불균형 데이터란?

1-1. 개념

1-2. 문제점

2. 데이터를 조정해서 불균형 데이터를 해결하는 샘플링 기법들

2-1. 언더 샘플링

2-1-1. Random Sampling

2-1-2. Tomek Links

2-1-3. CNN Rule

2-1-4. One Sided Selection

2-1-5. 언더 샘플링의 장단점

2-2. 오버 샘플링

2-2-1. Resampling

2-2-2. SMOTE

2-2-3. Borderline SMOTE

2-2-4. ADASYN

2-2-5. GAN

2-2-6. 오버 샘플링의 장단점

1. 불균형 데이터란?

1-1. 개념

불균형 데이터란 정상 범주의 관측치 수와 이상 범주의 관측치 수가 현저히 차이나는 데이터를 말합니다.

예를 들면, 암 발생 환자가 암에 걸리지 않은 사람보다 현저히 적고, 신용카드 사기 거래인 경우가 정상 거래인 경우보다 현저히 적습니다.

이런 데이터들을 불균형 데이터라 볼 수 있습니다.

1-2. 문제점

정상을 정확히 분류하는 것과 이상을 정확히 분류하는 것 중 일반적으로 이상을 정확히 분류하는 것이 더 중요합니다.

왜냐하면 보통 이상 데이터가 target값이 되는 경우가 많기 때문입니다.

그림을 봤을 때 파란색은 정상 관측치이고 빨간색은 이상 관측치, 회색은 실제 이상 데이터의 분포를 나타낸 것입니다.

즉, 회색 원은 아직 관측되지 않은 모르는 데이터입니다.

파란색과 빨간색의 데이터만 알고 있는 상태에서 학습을 시킬 경우 분류 경계선은 위의 그림과 같이 그어지게 됩니다.

하지만 경계선 왼쪽의 회색 원들은 실제로는 이상 데이터이기 때문에 정상 데이터로 오분류됩니다.

경계선은 파란색 원과 회색 원 사이에 그어져야 이상적인 경계선이라 할 수 있습니다.

즉, 불균형한 데이터 세트는 이상 데이터를 정확히 찾아내지 못할 수 있다는 문제점이 존재합니다.

2. 데 이터를 조정해서 불균형 데이터를 해결하는 샘플링 기법들

언더 샘플링과 오버 샘플링

2-1. 언더 샘플링

언더 샘플링이란 다수 범주의 데이터를 소수 범주의 데이터 수에 맞게 줄이는 샘플링 방식을 말합니다.

2-1-1. Random Sampling

Random Sampling이란 말 그대로 다수 범주에서 무작위로 샘플링을 하는 것입니다.

3번의 Random Sampling을 한 결과인데 무작위로 샘플링을 하기 때문에 할 때마다 다른 결과를 얻는다는 단점이 존재합니다.

이를 보완하기 위해 나온 샘플링 방법이 Tomek Links 방법입니다.

2-1 -2. Tomek Links

Tomek Links란 두 범주 사이를 탐지하고 정리를 통해 부정확한 분류경계선을 방지하는 방법입니다.

다른 클래스의 데이터 두 개를 연결했을 때 주변에 다른 임의의 데이터 Xk가 존재할 때

선택한 두 데이터에서 Xk까지의 거리보다 선택한 두 데이터 사이의 거리가 짧을 때 선택한 두 데이터 간의 링크를 Tomek Link라 부릅니다.

왼쪽의 경우 검은색 선은 Tomek Link가 될 수 없습니다.

왜냐하면 Xj 와 Xi 사이에 Xk 가 존재하게 되기 때문입니다.

오른쪽의 경우 Tomek Link라 볼 수 있습니다. 원본 데이터로 Tomek Link를 나타내면 다음과 같습니다.

보라색 묶음이 Tomek Link를 형성합니다. Tomek Links를 형성한 후, 다수 범주에 속한 관측치를 제거해 주어야 합니다.

다수 범주에 속한 관측치를 제거하여 언더 샘플링한 결과는 위의 그림과 같습니다.

2-1-3. CNN Rule

CNN Rule은 소수 범주에 속하는 데이터 전체와 다수 범주에 속하는 데이터 중 임의로 선택한 데이터 한 개 (A) 로 구성된 서브 데이터를 생성합니다.

그리고 다수 범주에 속하는 나머지 데이터들 중 하나씩 K=1 인 1-NN 방식을 이용하여

해당 데이터가 처음에 선택한 다수 범주 데이터 (A) 와 가까운지 아니면 소수 범주와 가까운지 확인하여 가까운 범주로 임시로 분류시킵니다.

이 과정이 끝나면 정상 분류된 다수 범주 관측치를 제거하여 언더 샘플링합니다.

K가 1이 아닌 K-NN 방식을 사용할 경우 모든 데이터가 이상 범주의 데이터로 분류되기 때문에 K는 1이어야 합니다.

CNN Rule을 통해 언더 샘플링한 결과는 위의 그림과 같습니다.

2-1-4. One Sided Selection

OSS (One Sided Selection) 방법은 Tomek Links 와 CNN Rule 을 합친 방법입니다.

OSS 방법을 이용하여 언더 샘플링한 결과는 위의 그림과 같습니다.

2-1-5. 언더 샘플링의 장단점

장점

다수 범주 데이터의 제거로 계산시간이 감소합니다.

단점

데이터 제거로 인한 정보 손실이 발생할 수 있습니다.

2-2. 오버 샘플링

오버 샘플링이란 소수 범주의 데이터를 다수 범주의 데이터 수에 맞게 늘리는 샘플링 방식을 말합니다.

2-2-1. Resampling

Resampling 방법은 소수 범주의 데이터 수를 다수 범주의 데이터 수와 비슷해지도록 증가시키는 방법입니다.

이때 소수 범주의 데이터는 무작위로 복제됩니다.

이 방법은 소수 범주에 과적합이 발생할 수 있다는 단점이 있고 이를 보완하기 위해 나온 방법이 SMOTE 방법입니다.

2-2-2. SMOTE

SMOTE 방법은 소수 범주에서 가상의 데이터를 생성하는 방법입니다.

K값을 정한 후 소수 범주에서 임의의 데이터를 선택한 후

선택한 데이터와 가장 가까운 K개의 데이터 중 하나를 무작위로 선정해 Synthetic 공식을 통해 가상의 데이터를 생성하는 방법입니다.

이 과정을 소수 범주에 속하는 모든 데이터에 대해 수행하여 가상의 데이터를 생성합니다.

초록색이 생성된 가상 데이터

주의할 점은 K값은 무조건 2 이상이어야 합니다.

왜냐하면 K가 1일 경우 데이터가 이상한 형태로 늘어나게 됩니다.

이 부분과 Synthetic 공식을 통해 가상의 데이터를 생성하는 과정에 대한 자세한 내용은 강의의 해당 부분을 참고하시면 좋을 것 같습니다.

2-2-3. Borderline SMOTE

Borderline SMOTE 방법은 Borderline 부분에 대해서만 SMOTE 방식을 사용하는 것입니다.

Borderline 을 찾는 것은 임의의 소수 범주의 데이터 한 개에 대해서 주변의 K개 데이터를 탐색하고 그중 다수 범주 데이터의 수를 확인합니다.

이때 다수 범주 데이터의 수가 K와 같을 경우 소수 범주의 데이터를 Noise 관측치라고 하며,

다수 범주 데이터의 수가 K/2 ~ K 에 속할 경우 Danger 관측치, 0 ~ K/2 에 속할 경우 Safe 관측치라고 합니다.

이 중 Danger 관측치에 대해서만 SMOTE를 적용하여 오버 샘플링을 진행합니다.

검은색이 Danger 관측치, 초록색이 생성된 가상 데이터

2-2-4. ADASYN

ADASYN 방법은 Borderline SMOTE 방법과 비슷하지만 샘플링 개수를 데이터 위치에 따라 다르게 설정하는 것이 차이점입니다.

먼저, 모든 소수 범주 데이터에 대해 주변의 K개의 데이터를 탐색하고 그중 다수 범주 데이터의 비율을 계산합니다.

계산된 각 비율들을 비율의 총합으로 나눠 스케일링을 진행합니다.

스케일링 방법

그 후 (다수 범주 데이터 수 – 소수 범주 데이터 수) 를 스케일링이 진행된 비율에 곱해주고

반올림된 정수의 값만큼 각 소수 범주 데이터 주변에 SMOTE 방식으로 가상 데이터를 생성합니다.

ADASYN 방식

이 방법은 소수 범주 데이터 주변의 다수 범주 데이터의 수에 따라 유동적으로 생성이 가능하다는 장점이 있습니다.

세 가지의 SMOTE 방식으로 불균형한 데이터를 오버 샘플링한 결과는 조금씩 다르고 결과는 다음과 같습니다.

2-2-5. GAN

GAN (Generative Adversarial Nets) 는 생성자와 구분자로 구성되어 있고 모델은 딥러닝을 사용하는 최신 오버 샘플링 기법입니다.

무작위로 노이즈를 생성하고 생성자를 통해 가짜 샘플을 만듭니다.

그 후 구분자에서 진짜 샘플과 가짜 샘플을 판별하고 너무 쉽게 판별될 경우 생성자에게 피드백을 줍니다.

그러면 생성자는 더욱 진짜 샘플과 비슷한 가짜 샘플을 만들어내고 구분자에게 판별을 시킵니다.

이렇게 생성자와 구분자가 서로 경쟁하며 업데이트되고 결국 가짜 샘플은 진짜 샘플과 매우 유사한 형태로 생성되게 됩니다.

참 재밌는 방식이라고 생각합니다.

2-2-6. 오버 샘플링의 장단점

장점

데이터를 증가시키기 때문에 정보 손실이 없습니다.

대부분의 경우 언더 샘플링에 비해 높은 분류 정확도를 보입니다.

단점

데이터 증가로 인해 계산 시간이 증가할 수 있으며 과적합 가능성이 존재합니다.

노이즈 또는 이상치에 민감합니다.

이렇게 데이터를 조정하여 불균형 데이터를 처리하는 여러 샘플링 기법들에 대해 알아보았습니다.

Machine Learning Imbalanced Data(불균형 데이터)

안녕하세요.

이번에 다룰 내용은 불균형 데이터에 대해서 다뤄보겠습니다.

먼저 분류문제를 해결할 때 데이터의 분포를 가장 먼저 확인합니다. 이 때 예측해야하는 결과값의 분포가 100:1, 200:1, 400:1 … 정도로 굉장히 불균형한 분포를 띄고 있는 데이터들을 많이 만나곤 하는데요. 불균형한 데이터를 그대로 예측하게 과적합문제가 발생할 가능성이 높아집니다.

그렇기 때문에 예측시 이러한 과적합 문제를 해결하기 위해서는 다양한 방법론이 있지만 기본적으로 데이터가 불균형하다면 불균형 문제를 해결한 뒤 문제에 접근을 해야합니다.

여담으로 최근에 참여했던 프로젝트에서 데이터의 불균형성을 인지하고 있지만 해결하지 않아서 Public Score와 Local 예측값과의 차이가 심하게 났던 과적합을 일으켰으며, 불균형 문제를 해결했을 때의 결과와 많은 차이를 보였던 경험이 있습니다. boosting모델 자체에서 class_weight = ‘balanced’ 를 통해서 어느정도 불균형 문제를 해결하려했고, 불균형 분포 차이가 1 : 0.04 였기 때문에 샘플링을 했을 때 발생할 수 있는 편향성 문제가 더 클 것이라고 예상했기 때문에 따로 샘플링 과정을 거치지 않았는데 거기서 문제가 발생했었습니다. 그래서 최종적으로 본선은 진출했지만 입선에 그치게 되었는데요. 이처럼 피부로 문제를 느껴보니 이부분에 대해서 한번 짚고 넘어갈 필요가 있다고 생각하게 되었습니다

1. 정의

데이터가 불균형하다는 말이 어떤 뜻일까요?

남/여, 구매여부 등 클래스 분포를 예측해야 하는 분류문제에서 예측 라벨 값의 분포가 100:1, 200:1 등으로 불균형하게 나타나는 상태를 말합니다. 아래의 그래프를 보시겠습니다.

위의 그래프는 결로현상을 예측해야하는 문제에서 결로현상(라벨 값)의 분포를 나타낸 것인데요. 보시는 것처럼 굉장히 불균형한 상태인 것을 알 수 있습니다. 저희는 이러한 문제를 해결하기 위해서 이제부터 소개할 일련의 과정들을 거쳐야 할 것입니다.

2. 불균형으로 발생하는 문제

불균형 데이터 상태 그대로 예측하게 된다면 위에서 말씀드린대로 과적합 문제가 발생할수 있습니다. 대표적으로 과적합은 변수가 많아서 생기는 모델 복잡성 증가, 데이터 불균형으로 생기는 문제 등의 다양한 발생 원인들이 존재하지만 이번 포스팅에서 소개해드릴 내용은 데이터 불균형으로 발생하는 과적합에 대해서 설명드리겠습니다.

데이터가 불균형하다면 분포도가 높은 클래스에 모델이 가중치를 많이 두기 때문에 모델 자체에서는 “분포가 높은 것으로 예측하게 된다면 어느정도 맞힐 수 있겠지?”라고 생각합니다. 따라서 불균형 문제를 해결하지 않으면 모델은 가중치가 높은 클래스를 더 예측하려고 하기 때문에 Accuracy는 높아질 수 있지만 분포가 작은 값에 대한 Precision은 낮을 수 있고, 분포가 작은 클래스의 재현율이 낮아지는 문제가 발생할 수 있습니다.

“예를들어서 분포가 100개의 데이터에서 1과 0값이 각각 97 : 3 비율을 가지고 있을 때 모든 값을 1로 예측한다 하더라도 정확도가 97% 나오게 됩니다.”

그리고 Train Set에서는 높은 성능을 보이지만 새로운 데이터 혹은 테스트 데이터에서는 예측 성능이 더 낮을 수 있습니다.

저희가 항상 모델을 만들 때 일반화 정도가 높은 모델을 만드는 것이 중요한데(어떠한 데이터에서도 비슷한 성능을 보여주는 모델) 과적합 문제는 이러한 부분을 즉, 일반화 정도를 낮출 수 있으므로 불균형 문제를 해결하는 것이 굉장히 중요하다고 할 수 있습니다.

자, 그러면 데이터 불균형성을 해결할 수 있는 방법론은 어떤 것이 있을까요?

3. 데이터 불균형성 해결 방법론

해결 방법론으로는 1. Under Sampling 2. Over Sampling 3. Data argumentaion(불균형 문제와는 좀 다른 부분이긴 합니다.) 이 존재합니다. 먼저 Under Sampling, Over Sampling에 대해서 살펴보겠습니다.

3-1. Under Sampling

Under Sampling은 Down Sampling라고도 불리며 데이터의 분포가 높은 값을 낮은 값으로 맞춰주는 작업을 거치는 것을 말합니다.

위의 그림처럼 데이터 분포를 확인한 후 분포가 높은 class를 낮은 분포의 class 크기에 맞춰주는 작업을 거칩니다.

이러한 과정을 거치면

장점으로는 유의미한 데이터만을 남길 수 있습니다

단점으로는 정보가 유실되는 문제가 생길 수 있습니다.

이제 Under Sampling 방법론 몇가지를 소개하겠습니다.

3-1.1. Random Under Sampling

말그대로 무작위 샘플링을 하는 방법인데요.

먼저 해결해야하는 불균형 데이터의 분포를 보겠습니다.

해당 9:1 데이터를 무작위 샘플링을 적용해 보겠습니다.

먼저 불균형 데이터 샘플을 만들어 보겠습니다.

n0 = 200; n1 = 20 rv1 = sp.stats.multivariate_normal([-1, 0], [[1, 0], [0, 1]]) rv2 = sp.stats.multivariate_normal([+1, 0], [[1, 0], [0, 1]]) X0 = rv1.rvs(n0, random_state=0) X1 = rv2.rvs(n1, random_state=0) X_imb = np.vstack([X0, X1]) y_imb = np.hstack([np.zeros(n0), np.ones(n1)]) x1min = -4; x1max = 4 x2min = -2; x2max = 2 xx1 = np.linspace(x1min, x1max, 1000) xx2 = np.linspace(x2min, x2max, 1000) X1, X2 = np.meshgrid(xx1, xx2) def classification_result2(X, y, title=””): plt.contour(X1, X2, rv1.pdf(np.dstack([X1, X2])), levels=[0.05], linestyles=”dashed”) plt.contour(X1, X2, rv2.pdf(np.dstack([X1, X2])), levels=[0.05], linestyles=”dashed”) model = SVC(kernel=”linear”, C=1e4, random_state=0).fit(X, y) Y = np.reshape(model.predict(np.array([X1.ravel(), X2.ravel()]).T), X1.shape) plt.scatter(X[y == 0, 0], X[y == 0, 1], marker=’x’, label=”0 클래스”) plt.scatter(X[y == 1, 0], X[y == 1, 1], marker=’o’, label=”1 클래스”) plt.contour(X1, X2, Y, colors=’k’, levels=[0.5]) y_pred = model.predict(X) plt.xlim(-4, 4) plt.ylim(-3, 3) plt.xlabel(“x1”) plt.ylabel(“x2″) plt.title(title) return model

그 다음 해당 불균형 데이터 셋을 무작위 언더 샘플링 과정을 통해서 균형있는 데이터 셋으로 변경해보겠습니다.

X_samp, y_samp = RandomUnderSampler(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

무작위 랜덤 샘플링 과정을 거치면 위와 같은 그림이 나오게 됩니다. 분포가 높은 클래스의 값을 어떠한 조건 없이 무작위로 삭제하는 과정이며 이와 같은 과정을 통해서 분포가 낮은 클래스의 데이터 크기와 맞출 수 있게 됩니다.

어떠한 조건 없이 데이터 분포를 맞추는 것이기 때문에 걸리는 시간이 굉장히 빠른 장점이 있습니다.

3-1.2. Tomek link

토멕링크 방법론은 분포가 작은 클래스의 데이터에서 가장 가까운 분포가 높은 데이터의 위치를 찾는 것입니다. 즉, 서로 다른 클래스가 있을 때 서로 다른 클래스끼리 가장 가까운 데이터들이 토멕링크로 묶여서 토멕링크 중 분포가 높은 데이터를 제거하는 방법론입니다.

토멕링크를 찾아서 제거하는 방법론이기 때문에 클래스를 나누는 TreshHold를 분포가 높은 쪽으로 밀어 붙이는 효과가 있습니다.

X_samp, y_samp = TomekLinks().fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

Tomek link는 분포가 높은 클래스의 중심분포는 어느정도 유지하면서 경계선을 조정하기 때문에 무작위로 삭제하는 샘플링보다 정보의 유실을 크게 방지할 수 있지만 토멕링크로 묶이는 값이 한정적이기 때문에 큰 언더 샘플링의 효과를 얻을 수 없다는 단점이 있습니다.

3-1.3. CNN(Condensed Nearest Neighbour)

CNN 방법은 최근접인 클래스 분포 데이터를 삭제하면서 샘플링하는 방법론입니다.

1. 분포가 작은 클래스르 S분포로 둡니다.

2. 분포가 큰 클래스를 랜덤으로 하나 선택한 뒤 그 데이터 위치에서 가장 가까운 데이터를 선택했을 때 S 분포에 포함 되어 있지 않은 데이터라면 제거합니다.

3. 가장 가까운 값이 S분포가 나올 때까지 2번을 반복합니다.

X_samp, y_samp = CondensedNearestNeighbour(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

이 과정을 거치면 분포가 큰 클래스 값을 효율적으로 제거할 수 있게 됩니다.

위의 Tomek link 방법론과 CNN방법론을 합쳐서 만든 One sided Selection 방법론이 있는데 토멕링크로 먼저 데이터를 제거한 후 분포가 큰 클래스 내부에서 CNN방법으로 데이터를 데이터를 제거하는 과정을 거치는 방법입니다.

X_samp, y_samp = OneSidedSelection(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

3-1.4. Edited Nearest Neighbours

ENN방식은 KNN방식이랑 비슷하며 소수 클래스 주변의 다중 클래스 값을 제거하는 방법론입니다. 해당 방법론은 토멕링크 방법론 처럼 클래스를 구분하는 임계점을 다중 클래스 쪽으로 밀어낼 수 있지만 제거 효과가 크지 않은 것을 알 수 있습니다.

X_samp, y_samp = EditedNearestNeighbours(kind_sel=”all”, n_neighbors=5, random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

마지막으로 CNN방법과 ENN방법을 섞은 Neighbourhood Cleansing Rule가 있습니다. 분포가 큰 데이터에 대한 제거 효과가 크지 않지만 좀 더 직관적으로 두 클래스를 나눌 수 있는 장점이 있습니다.

X_samp, y_samp = NeighbourhoodCleaningRule(kind_sel=”all”, n_neighbors=5, random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

3-2. Over Sampling

오버 샘플링은 Up Sampling라고도 불리며 분포가 작은 클래스의 값을 분포가 큰 클래스로 맞춰주는 샘플링 방법입니다.

위의 그림을 통해서 알 수 있듯이 분포가 작은 클래스 값을 일련의 과정을 거쳐 생성하는 방법을 뜻합니다.

이와 같은 과정을 거치게 되면

장점으로는 정보의 손실을 막을 수 있다

단점으로는 여러 유형의 관측치를 다수 추가하기 때문에 오히려 오버피팅을 야기할 수 있습니다.

따라서 새로운 데이터, Test 데이터에서의 성능이 나빠지는 결과를 초래할 수 있습니다.

3-2.1. Random Over Sampling

무작위로 분포가 작은 클래스의 데이터를 생성하는 것을 말합니다. 즉, 소수의 클래스 데이터를 반복해서 넣는 것으로 가중치를 증가시키는 것과 비슷합니다.

X_samp, y_samp = RandomOverSampler(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

무작위로 소수 클래스의 데이터를 반복해서 집어넣는 방법이기 때문에 반복 데이터 삽입으로 인한 오버피팅 문제가 발생할 수 있습니다.

3-2.2. ADASYN(Adaptive Synthetic Sampling)

ADASYN방법론은 분포가 작은 클래스 데이터와 그 데이터와 가장 가까운 무작위의 K개의 데이터 사이에 가상의 직선을 그려서 직선상에 존재하는 가상의 분포가 작은 클래스 데이터를 생성하는 것을 말합니다.

X_samp, y_samp = ADASYN(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

해당 방법론을 통해서 단순 무작위 오버샘플링으로 인해 발생하는 과적합 문제를 해결할 수 있습니다. 단순 오버 샘플링은 데이터를 무작위로 가중치를 기반하여 복제하는 것이기 때문에 해당 방법론을 통한 오버샘플링이 좀 더 나은 방법론이라고 말 할 수 있을 것 같습니다. 단점으로는 시간이 좀 걸리는 문제가 있습니다.

3-2.3. SMOTE

SMOTE는 ADASYN과 같은 방법론으로 데이터를 생성하지만 생성된 데이터가 분포가 적은 클래스에 포함되는 것이 아니라 분류 모형에 따라서 다르게 분류합니다.

X_samp, y_samp = SMOTE(random_state=4).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

3-3. Combine Sampling

복합 샘플링은 오버샘플링과 언더샘플링을 결합한 샘플링 방법론으로 두가지의 종류가 있습니다.

3-3.1. SMOTE + ENN

SMOTE와 ENN방법론을 결합한 방식입니다

X_samp, y_samp = SMOTEENN(random_state=0).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

3-3.2. SMOTE + TOMEK

SMOTE와 TOMEK방법론을 결합한 방식입니다.

X_samp, y_samp = SMOTETomek(random_state=4).fit_sample(X_imb, y_imb) plt.subplot(121) classification_result2(X_imb, y_imb) plt.subplot(122) model_samp = classification_result2(X_samp, y_samp)

번외) Data Argumentation

Data Argumentation은 주로 이미지 분석에서 사용되는 방법론으로 불균형 데이터 상태에서 방법론으로 사용되는 오버샘플링과 데이터를 생성하거나 증가시키는 원리는 비슷하지만 다른 부분이 존재합니다. 따라서 이부분은 추후에 자세히 다룰 내용이며 불균형 데이터 셋을 처리하는 방법론 외의 번외 부분으로 봐주시면 감사하겠습니다!

Data Argumentation은 이미지 분석에서 Over fitting을 방지하고 예측에 대한 신뢰성을 높이기 위한 추가적인 데이터를(이미지) 생성하는 방법론입니다. 따라서 이부분은 GAN으로 데이터를 generate하는 방식과 거의 비슷하다고 보시면 되겠습니다. 그림으로 보시면 편할텐데요

위와 같이 하나의 이미지를 가지고 다양한 구도와 각도로 새롭게 생성과정을 거치는 것이 Data Argumentation의 기본 개념입니다. 이 부분은 추후 포스팅에서 자세히 다뤄보겠습니다!!

이렇게 불균형 데이터 상태에서 처리할 수 있는 다양한 샘플링 기법들을 소개해드렸는데요. 저는 직접 불균형 데이터셋을 처리하지 않은 상태로 분석을 진행하여 좋지 못한 성능을 낸 경험을 몸소 느꼈기 때문에 불균형 데이터에 대한 처리 즉, 보간법에 대한 중요성을 배우게 되었습니다. 해당 포스팅을 보시는 데이터 분석에 관심을 가지고 계시거나, 관련 프로젝트를 진행하고 계시는 분들께서는 불균형 데이터에 대해서 좀 더 엄격하게 바라보는 시각이 필요할 것이라고 생각됩니다!

” 정조曰 모든 일에는 기본이 중요하다”

위의 말에서 느낄 수 있듯이 분석을 할 때도 기본에 충실한 분석을 진행해야 시작부터 결과까지의 과정이 탄탄하게 이뤄질 수 있다고 생각합니다. 기본에 충실한 분석가를 위해서 한걸음 한걸음 같이 나아갔으면 하는 바램입니다!

참고

https://datascienceschool.net/view-notebook/c1a8dad913f74811ae8eef5d3bedc0c3/

[논문]머신러닝을 위한 불균형 데이터 처리 방법 : 샘플링을 위주로

초록

최근 학계, 산업계 등에서 접하는 기존의 문제를 머신러닝을 통해 해결하려는 시도가 증가하고 있다. 이에 따라 이탈, 사기탐지, 장애탐지 등 일반적이지 않은 상황을 머신러닝으로 해결하기 위한 다양한 연구가 이어지고 있다. 대부분의 일반적이지 않은 환경에서는 데이터가 불균형하게 분포하며, 이러한 불균형한 데이터는 머신러닝의 수행과정에서 오류를 야기하므로 이를 해결하기 위한 불균형 데이터 처리 기법이 필요하다. 본 논문에서는 머신러닝을 위한 불균형 데이터 처리 방법을 제안한다. 제안하는 방법은 샘플링 방법을 중심으로 다수 클래스(Major Class)의 모집단 분포를 효율적으로 추출하도록 검증하여 머신 러닝을 위한 불균형 데이터 문제를 해결한다. 본 논문에서는 성능평가를 통해 제안하는 기법이 기존 기법에 비해 성능이 우수함을 보인다.

[인사이드 머신러닝] 불균형 데이터 샘플링

본 포스트는 고려대학교 김성범 교수님의 Youtube 강의 “[핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법”을 참고하였습니다. Boosting과 GAN은 별도로 다룰 예정입니다.

불균형 데이터 문제

모델을 학습시킴에 있어 클래스 간 샘플 수의 차이가 너무 크게 되면 분류기는 더 많은 샘플이 존재하는 클래스로 편향(bias, 바이어스)된다. 이 경우 전체적인 정확도는 높게 나올지라도 샘플 수가 적은 클래스에 대한 재현율(recall)이 작아지게 된다. (즉, 특정 클래스에 오버피팅 된다.) 이러한 문제를 데이터 불균형 문제 혹은 비대칭 문제라고 부른다.

암환자를 분류하는 문제를 생각해보자. 암에 걸린 사람보다는 암에 걸리지 않은 사람이 더 많기 때문에 암환자로부터 얻어진 샘플이 그렇지 않은 경우의 샘플보다 훨씬 적을 수 있다. 이 경우 데이터 불균형 문제를 해결하지 않고 학습하게 되면 분류기는 정상인의 샘플에 더 많은 가중치를 두고 학습할 것이고, [그림 1]과 같이 분류 경계면에 바이어스가 존재하게 되어 암환자를 정상인으로 잘못 분류할 수 있게 된다. 이러한 문제는 불량품과 양품을 구분하는 경우에도 발생할 것이다. 즉, 현실 세계에서 우리가 풀고자하는 많은 문제들은 클래스 간 데이터 불균형 문제가 항상 있으며, 보통은 더 중요하게 여겨지는 클래스(예를 들면, 암환자 클래스, 불량품 클래스)의 데이터가 더 적은 것이 일반적이다.

[그림 1] 클래스 간 데이터 불균형에 의한 오분류 예시

데이터 불균형이 심한 경우 모델의 일반화 성능을 이끌어내기 어렵기 때문에 데이터 불균형 문제를 먼저 해결하고 모델을 학습시켜야 한다. 더 많은 데이터를 수집하여 이 문제를 해결하면 좋겠지만 그렇지 못할 경우, 불균형 데이터 문제를 완화할 수 있는 기법들이 무엇이 있는지 알아보자.

해결 방안

클래스 간 데이터 불균형을 해결하는 방법들은 다양한데 크게 아래 [그림 2]와 같이 나눌 수 있다.

언더 샘플링

– 다수 범주의 데이터를 줄여서 소수 범주의 샘플 수와 비슷하게 만든다.

– 다수 범주 관측치 제거로 계산 시간 감소

– 데이터 클랜징으로 클래스 오버랩 감소

– 데이터 제거로 인한 정보 손실 발생 (중요 정보가 삭제될 시 치명적)

– 다수 범주의 데이터를 줄여서 소수 범주의 샘플 수와 비슷하게 만든다. – 다수 범주 관측치 제거로 계산 시간 감소 – 데이터 클랜징으로 클래스 오버랩 감소 – 데이터 제거로 인한 정보 손실 발생 (중요 정보가 삭제될 시 치명적) 오버 샘플링

– 소수 범주의 데이터를 증폭시켜서 다수 범주의 샘플 수와 비슷하게 만든다.

– 정보 손실이 없다.

– 보통 언더 샘플링보다 분류 정확도가 높다.

– 과적합 가능성이 있고, 계산 시간이 오래 걸리며, 노이즈나 이상치에 민감하다.

[그림 2] 불균형 데이터 해결 방안 ([1] 재구성)

언더 샘플링 기법들

Random Undersampling

다수 범주의 샘플들을 무작위로 선택

샘플 선택에 아무런 제약이 없기 때문에 처리 시간이 빠르다.

무작위 선택으로 인해 샘플링 결과에 따라 분류 경계면의 변동이 심하다. [그림 3] Random Undersampling (샘플링 할 때마다 분류 경계가 달라질 수 있음)

Tomek Link

두 범주에서 하나씩 추출한 포인트를 각각 x i x_i x i ​ 와 x j x_j x j ​ 라 할 때, d ( x i , x k ) < d ( x i , x j ) d(x_i, x_k) < d(x_i, x_j) d ( x i ​ , x k ​ ) < d ( x i ​ , x j ​ ) 또는 d ( x j , x k ) < d ( x i , x j ) d(x_j, x_k) < d(x_i, x_j) d ( x j ​ , x k ​ ) < d ( x i ​ , x j ​ ) 가 되는 관측치 x k x_k x k ​ 가 없는 경우, 두 샘플 x i x_i x i ​ 와 x j x_j x j ​ 가 Tomek Link를 형성한다고 한다. 와 라 할 때, 또는 가 되는 관측치 가 없는 경우, 두 샘플 와 가 Tomek Link를 형성한다고 한다. Tomek link를 형성하는 두 샘플 중 하나는 노이즈이거나 둘 다 경계선 근처에 있다. Tomek link를 형성한 샘플 중 다수 범주에 속한 샘플을 제거한다. [그림 4]는 Tomek link의 예제를 보여준다. 좌측과 같은 데이터 세트에 대하여 Tomek link를 형성하면 가운데 그림과 같이 된다. Tomek link를 형성한 파란색 샘플들을 제외하면 우측 그림과 같이 되는데 샘플을 제외하기 이전보다 두 범주의 구분이 보다 명확히 됨을 알 수 있다. 따라서 두 범주 간의 분류 경계면을 찾는데 도움이 된다. Tomek link는 다수 범주의 데이터의 중심 분포는 거의 유지하면서 분류 경계를 조정하는 효과를 얻기 때문에 random undersampling에 비해 정보의 유실을 크게 줄일 수 있지만, 제거되는 샘플이 한정적이기 때문에 큰 언더 샘플링의 효과를 얻을 수는 없다. [그림 4] Tomek Link 적용 예시 (source: [4]) Condensed Nearest Neighbor (CNN) 본래 KNN 알고리즘을 사용하기 위한 목적으로 데이터 세트의 크기를 줄이기 위해 고안되었다. 다수 범주에서는 하나의 샘플을 무작위로 선택하고 동시에 소수 범주에서는 모든 샘플을 선택하여 서브 데이터를 구성한다. 원데이터를 서브 데이터를 기준으로 1-nearest neighbor(1-NN) 분류한다. - 서브 데이터를 구성할 때, 다수 범주에서 하나의 샘플을 선택하였기 때문에 반드시 1-NN을 사용 하여야 한다. (그렇다면 3개의 샘플을 선택하면 3-NN을 해도 될까??) - 서브 데이터를 구성할 때, 다수 범주에서 하나의 샘플을 선택하였기 때문에 하여야 한다. (그렇다면 3개의 샘플을 선택하면 3-NN을 해도 될까??) 다수 범주에서 소수 범주로 분류된 샘플과 서브 데이터만을 남기고 나머지 샘플은 삭제한다. 위 과정을 통해 다수 범주의 데이터는 다운 샘플링 되며, 이렇게 얻어진 샘플들을 이용해 분류 경계면을 학습한다. 위 과정을 도식적으로 나타내면 아래 [그림 5]와 같다. [그림 5] Condensed Nearest Neighbor의 적용 예시 One-Sided Selection (OSS) Tomek link + CNN Tomek link로 다수 범주의 데이터를 제거 후 CNN을 사용하여 다시 한 번 언더 샘플링 수행한다. - Tomek link로 클래스의 경계면에 있는 데이터를 제거하고 CNN으로는 경계면에서 멀리 떨어진 다수 범주의 데이터를 제거한다. - Tomek link와 CNN의 한계를 상호 보완 [그림 6] One-Sided Selection의 적용 예시 (source: [6]) 오버 샘플링 기법들 Resampling 소수 범주의 데이터를 단순히 복제하여 데이터의 수를 늘린다. 단순 복제이므로 새로운 데이터를 생성하는 것은 아니다. 그렇지만 분류 경계면을 결정할 때 소수 클래스에 대한 가중치가 증가하기 때문에 성능 향상에 도움이 된다. 소수 범주의 데이터 세트가 전체 모집단을 대표한다는 보장이 없기 때문에 소수 범주에 과적합이 발생할 가능성이 있다. 아래 [그림 7]의 좌측은 원시 데이터이고 우측은 Resampling된 데이터 세트이다. 우측 그림의 숫자가 의미하는 바는 해당 샘플이 복제된 횟수이다. [그림 7] Resampling의 적용 예시 (source: [6]) Synthetic Minority Oversampling TEchnique (SMOTE) 소수 범주의 데이터를 단순 복제하는 Resampling 기법과는 다르게 소수 범주의 데이터를 가상으로 만들어 낸다. [그림 8]의 좌측과 같은 원시 데이터 세트가 있다고 할 때, SMOTE는 다음과 같은 절차로 이루어진다. 1. 소수 범주의 데이터 중 무작위로 하나를 선택한다. 선택된 데이터를 X X X 라 하자. 2. 무작위로 선택된 데이터를 기준으로 KNN을 수행한다. ( k > 1 k>1 k > 1 , [그림 8]에서는 k = 5 k=5 k = 5 )

3. 선택된 K-nearest neighbor 중 하나를 임의로 선택한다. 선택된 데이터를 X ( N N ) X(NN) X ( N N ) 이라고 하자. ([그림 8]의 우측 그림에서 보라색으로 표시)

4. 다음 수식을 통해 가상의 데이터를 생성한다. 여기서 μ \mu μ 은 0~1사이의 균일 분포에서 추출된 임의의 값이다. X S y n t h e t i c = X + μ ( X ( N N ) − X ) X_{Synthetic} = X+\mu\big(X(NN)-X\big) X S y n t h e t i c ​ = X + μ ( X ( N N ) − X ) 위 식의 의미는 X X X 와 X ( N N ) X(NN) X ( N N ) 를 잇는 라인의 임의의 위치에 가상의 데이터를 생성한다는 것이다.

5. 소수 범주 내 모든 데이터에 대하여 1~4과정을 반복한다.

[그림 8] SMOTE의 적용 예시

Borderline SMOTE

범주 간의 경계부분에만 오버 샘플링을 하는 것이 분류모델을 학습시킬 때 더 도움이 될 것이라는 생각에서 제안되었다.

소수 클래스 x i x_i x i ​ 에 대해서 k k k 개 주변을 탐색하고 k k k 개 중 다수 클래스의 수를 확인한다. 다수 클래스의 수를 m m m 이라고 할 때,

– k = m k=m k = m : Noise 관측치 (borderline이 아니다.)

– k / 2 < m < k k/2 < m < k k / 2 < m < k : Danger 관측치 (borderline이라고 판단) - 0 ≤ m ≤ k / 2 0 \leq m \leq k/2 0 ≤ m ≤ k / 2 : Sfe 관측치 (borderline이 아니다.) 에 대해서 개 주변을 탐색하고 개 중 다수 클래스의 수를 확인한다. 다수 클래스의 수를 이라고 할 때, - : Noise 관측치 (borderline이 아니다.) - : Danger 관측치 (borderline이라고 판단) - : Sfe 관측치 (borderline이 아니다.) 즉, k k k 개 모두 다수 클래스는 아니면서 절반 이상은 다수 클래스인 경우 x i x_i x i ​ 가 borderline에 위치해 있다고 판단한다. 개 모두 다수 클래스는 아니면서 절반 이상은 다수 클래스인 경우 가 borderline에 위치해 있다고 판단한다. Danger 관측치에 대하여만 SMOTE 적용한다. SMOTE 적용할 때 KNN 알고리즘 적용시에는 소수 관측치의 모든 데이터를 사용한다. 결과적으로 borderline 근처에만 새로운 데이터들이 생기게 된다. [그림 9] Borderline SMOTE의 적용 예시 (source: [7]) ADAptive SYNthetic sampling approach (ADASYN) Borderline SMOTE와 유사하지만 샘플링하는 개수를 위치에 따라 다르게 적용한다. 샘플링 개수를 정하는 규칙과 전체적인 알고리즘 과정은 다음과 같다. ([그림 10] 참고) - i i i 번째 소수 클래스 데이터 x i x_i x i ​ 를 기준으로 KNN 적용 후 다수 클래수의 수( m i m_i m i ​ )를 센다. 그리고 다수 클래스의 비율을 r i = m i / k r_i=m_i/k r i ​ = m i ​ / k 라고 정의한다. - 모든 i i i 에 대한 r i r_i r i ​ 의 계산이 끝나면 r i r_i r i ​ 의 합이 1이 되도록 정규화한다. - 정규화 된 r i r_i r i ​ 를 r ^ i \hat{r}_i r ^ i ​ 라 하고, 다수 클래수와 소수 클래스 간의 데이터 개수 차이를 G G G 라고 하면, 앞에서 계산된 r ^ i \hat{r}_i r ^ i ​ 에 G G G 를 곱하고, 반올림한다. 이렇게 주어진 숫자가 x i x_i x i ​ 를 기준으로 오버샘플링 될 데이터의 개수가 된다. - 모든 i i i 에 대하여 계산된 개수만큼 SMOTE 알고리즘을 적용하여 오버샘플링을 수행한다. - 번째 소수 클래스 데이터 를 기준으로 KNN 적용 후 다수 클래수의 수( )를 센다. 그리고 다수 클래스의 비율을 라고 정의한다. - 모든 에 대한 의 계산이 끝나면 의 합이 1이 되도록 정규화한다. - 정규화 된 를 라 하고, 다수 클래수와 소수 클래스 간의 데이터 개수 차이를 라고 하면, 앞에서 계산된 에 를 곱하고, 반올림한다. 이렇게 주어진 숫자가 를 기준으로 오버샘플링 될 데이터의 개수가 된다. - 모든 에 대하여 계산된 개수만큼 SMOTE 알고리즘을 적용하여 오버샘플링을 수행한다. ADASYN은 Borderline 뿐만 아니라 다수 클래스 쪽에 있는 소수 클래스 데이터 주변에도 많은 샘플을 생성한다. [그림 10] ADASYN의 적용 예시 (source: [1]) 참고 자료 [1] https://www.youtube.com/watch?v=Vhwz228VrIk&list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&index=7 [2] https://shinminyong.tistory.com/34 [3]https://datascienceschool.net/03%20machine%20learning/14.02%20%EB%B9%84%EB%8C%80%EC%B9%AD%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%AC%B8%EC%A0%9C.html [4] https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets [5] https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm [6] Gretel Fernández, "Balancing Techniques," (silde: https://slideplayer.com/slide/13128031/) [7] Han, Hui, Wen-Yuan Wang, and Bing-Huan Mao. "Borderline-SMOTE: a new over-sampling method in imbalanced data sets learning." International conference on intelligent computing. Springer, Berlin, Heidelberg, 2005.

6. 불균형 데이터 해결하기 (주가 예측 프로젝트)

학부 연구생으로서 진행한 주가 예측 프로그램의 일련의 과정을 차례로 포스팅합니다.

위 그림처럼 어떤 종목이든 10일간의 데이터로

다음날 종가 상승 여부를 예측하는 머신러닝 프로젝트입니다.

주식 데이터는 여기저기 예제들도 굉장히 많이 있고,

비교적 얻기 쉬운 빅데이터이기 때문에 여러가지 프로젝트를 하시는 분들은 굉장히 많을 거라고 생각합니다.

하지만 어려운 도메인인만큼 유의미한 모델링을 한 사례는 굉장히 적습니다.

특히 주식을 잘 모르시는 분들에게는 정말 어려운 데이터죠…

제가 얻은 인사이트를 기록합니다.

주식 데이터 수집 – EDA – 전처리 – 모델링 – 성능 개선

이전 포스팅은 주식 데이터의 특성에 맞는 최적의 스케일링을 선정했습니다.

현재 전처리한 주식 데이터는 불균형이 심하기 때문에 모델링이 쉽지 않습니다.

이번 포스팅은 데이터 불균형을 해결하기 위한 여러가지 방법을 시도해봅니다.

제가 사용할 모델은 LGBM입니다.

1. 데이터 불균형

2. 베이스 모델 (비교 대상) 지정하기

3. 데이터 불균형 처리하기

방법 1 – Under sampling & Over sampling

방법 2 – 모델 파라미터 이용

방법 3 – 앙상블

방법 4 – loss function ( focal loss )

1. 데이터 불균형

import matplotlib.pyplot as plt fig = plt.figure(figsize =(5,5), dpi = 100) labels = [‘label 0’, ‘label 1’] pd.Series(trainY).value_counts().plot.pie(colors = [‘steelblue’, ‘firebrick’], startangle=90, autopct=’%1.2f%%’, labels=labels, title =’stock_data’) plt.ylabel(“”) plt.show() print(‘ train 데이터 shape:’, trainX.shape) print(‘

test 데이터 shape:’, testX.shape)

라벨 1과 0의 불균형이 심한 imbalanced data

제 데이터는 여러가지 기준으로 전처리한 주식 데이터 입니다.

위 데이터는 불균형의 문제를 안고 있습니다.

이렇게 데이터가 불균형하면, 모델도 양이 많은 label 0쪽으로 과적합이 되기 마련입니다.

심지어는 testset을 전부 0으로 예측해버리면, accuracy는 93%인 겉으로는 학습 잘 돼 보이는 쓰레기 모델이 됩니다.

따라서 첫 번째로 할 수있는 방법은 평가 지표 auc, f1 score, precison(재현율), recall(정밀도)를 모두 따져가면서 데이터 불균형 문제를 처리해봅니다.

def plot_roc_curve(trainY, testY, train_pred, test_pred, train_prob, test_prob): from sklearn.metrics import roc_curve, roc_auc_score, f1_score, f1_score, accuracy_score, recall_score, precision_score fpr, tpr, thresholds = roc_curve(testY, test_prob) # output 3개가 나오는데, 각 threshhold 마다의 fpr, tpr값 인듯 train_f1 = f1_score(trainY, train_pred) test_f1 = f1_score(testY, test_pred) train_recall = recall_score(trainY, train_pred) test_recall = recall_score(testY, test_pred) train_pre = precision_score(trainY, train_pred) test_pre = precision_score(testY, test_pred) train_acc = accuracy_score(trainY, train_pred) test_acc = accuracy_score(testY, test_pred) plt.plot(fpr, tpr, color=’red’, label=’ROC’) plt.plot([0, 1], [0, 1], color=’green’, linestyle=’–‘) plt.xlabel(‘False Positive Rate’) plt.ylabel(‘True Positive Rate’) plt.title(‘test ROC : {}’.format(round(roc_auc_score(testY, test_prob),3)),fontsize=16) plt.legend() plt.show() print(‘train_f1 score: ‘,train_f1) print(‘test_f1 score: ‘,test_f1,’

‘) print(‘train_recall score: ‘,train_recall) print(‘test_recall score: ‘,test_recall,’

‘) print(‘train_pre score: ‘,train_pre) print(‘test_pre score: ‘,test_pre,’

‘) print(‘train acc score: ‘,train_acc) print(‘test acc score: ‘,test_acc, ‘

‘)

def confusion_matrix(testY, test_pred): TP, FP, TN, FN = 0 for (y,pred) in zip(testY, test_pred): if y == 1 and pred==1: TP+=1 elif y==0 and pred==1: FP+=1 elif y == 0 and pred==0: TN+=1 elif y==1 and pred==0: FN+=1 print(‘ y_true’) print(‘pred’,[TP, TN],’

‘,[FN,FP])

위 코드를 이용하여, 학습한 모델의 여러 지표들을 비교하여 모델 성능을 높여봅니다.

2. 베이스 모델 (비교 대상) 지정하기

from lightgbm import LGBMClassifier import os import time # pos 8.2 & lr 0.08하면 더 좋음 start_time=time.time() model = LGBMClassifier( learning_rate=0.1, num_iterations = 1000, # n_estimator 랑 같은 것 같음 max_depth = 4, n_jobs=-1, boost_from_average=False) trained_model = model.fit( trainX,trainY, eval_set=[(testX,testY)], early_stopping_rounds=25, verbose = 5, eval_metric = ‘auc’) train_pred = trained_model.predict(trainX) train_prob = trained_model.predict_proba(trainX)[:, 1] test_pred = trained_model.predict(testX) test_prob = trained_model.predict_proba(testX)[:, 1] plot_roc_curve(trainY, testY, train_pred, test_pred, train_prob, test_prob) confusion_matrix(testY, test_pred) print(“—%s seconds —” % (time.time() – start_time))

베이스 모델

현재 선정한 모델은 grid search로 얻은 적당한 모델입니다.

그나마 thresh hold를 변경하며 체크하는 ROC 커브는 나쁘지 않지만, f1 score같은 다른 지표들은 쓰레기입니다.

혼동 행렬을 보면, 양성이라고 예측하는 값도 고작 10개인데,

양성인 데이터 13,551개 (13,549 + 2)중에 2개 맞췄습니다.

주식 데이터의 특성 상 많은 데이터 중 신호를 찾기 어려운 점도 있지만, 데이터 불균형의 문제도 큰 것 같습니다.

이제 데이터 불균형을 해소해봅시다.

3. 데이터 불균형 처리하기

방법1 – under sampling & over sampling

위 방식은 불균형 데이터에 대해서 샘플링을 통해 양적으로 같게 만들어 주는 방식입니다.

먼저 undersampling부터 해볼 겁니다. (공식 홈페이지)

<언더 샘플링>

# Undersample imbalanced dataset with NearMiss-1 from imblearn.under_sampling import NearMiss # define dataset nearmiss = NearMiss(version=1, n_neighbors=3) trainX_under, trainY_under = nearmiss.fit_resample(trainX,trainY) print(‘nearmiss 적용 전 학습용 피처/레이블 데이터 세트: ‘, trainX.shape, trainY.shape) print(‘nearmiss 적용 후 학습용 피처/레이블 데이터 세트: ‘, trainX_under.shape, trainY_under.shape) print(‘

nearmiss 적용 전 레이블 값 분포:

‘, pd.Series(trainY).value_counts()) print(‘

nearmiss 적용 후 레이블 값 분포:

‘, pd.Series(trainY_under).value_counts())

undersampling은 구현 함수에 있어서 version이 3가지가 있습니다.

version 1 : 서로 가장 붙어있는 n개의 소수 클래스 데이터로부터 minimum avg distance인 다수 클래스로부터 샘플링

version 2 : 서로 가장 멀리있는 n개의 소수 클래스 데이터로부터 minimum avg distance인 다수 클래스로부터 샘플링

version 3 : 소수 클래스의 각 데이터 포인트마다 가장 가까운 다수 클래스 데이터를 샘플링

버전은 nearmiss에서 인자만 바꿔주면 됩니다.

어떤게 가장 좋을 지 모르니 3가지 전부 해봅니다.

링크에서 산점도까지 보고 오시면, 이해가 쉬울 겁니다.

( 51만개 정도 되는 데이터 포인트 전부 거리를 구하여 처리하다 보니까 시간이 생각보다 오래걸립니다. )

undersampling 결과

데이터 클래스의 균형이 딱 맞습니다.

위 데이터를 갖고 베이스 모델을 돌려봅시다.

언더 샘플링 결과

사실 under sampling은 데이터 정보 손실이라는 단점이 있어서 큰 기대는 안했습니다.

안하느니만 못하네요.

version 2는 자꾸 커널이 죽어서 실행이 안되네요.

결과도 아마 비슷할 거 같습니다.

<오버 샘플링>

from imblearn.over_sampling import SMOTE smote = SMOTE(random_state=42) trainX_over, trainY_over = smote.fit_resample(trainX,trainY) print(‘SMOTE 적용 전 학습용 피처/레이블 데이터 세트: ‘, trainX.shape, trainY.shape) print(‘SMOTE 적용 후 학습용 피처/레이블 데이터 세트: ‘, trainX_over.shape, trainY_over.shape) print(‘

SMOTE 적용 전 레이블 값 분포:

‘, pd.Series(trainY).value_counts()) print(‘

SMOTE 적용 후 레이블 값 분포:

‘, pd.Series(trainY_over).value_counts())

오버 샘플링 SMOTE

유명한 SMOTE를 이용하여 클래스 균형을 맞추었습니다.

SMOTE 설명 자료

공식 홈페이지 설명까지 하면 글도 난잡해지고 저도 처음해보는 거라 링크로 남깁니다.

오버 샘플링 결과

오버 샘플링이 확실히 언더 샘플링의 결과보다는 좋게 나왔습니다.

ROC curve는 감소했지만, 양성으로 예측하는 개수도 많아졌고 재현율도 높아졌습니다.

f1 score도 0.1 정도로 많이 올랐습니다.

과적합을 견제하는 람다같은 파라미터도 많이 넣어서 randomized search를 진행하면, 더 좋은 성능을 기대해 볼 수 있을 것 같습니다.

방법2 – 모델 파라미터 이용

from lightgbm import LGBMClassifier import os import time # pos 8.2 & lr 0.08하면 더 좋음 start_time=time.time() model = LGBMClassifier(scale_pos_weight=8, learning_rate=0.1, num_iterations = 1000, # n_estimator 랑 같은 것 같음 max_depth = 4, n_jobs=-1, boost_from_average=False, objective = ‘binary’) trained_model = model.fit( trainX,trainY, eval_set=[(testX,testY)], early_stopping_rounds=25, verbose = 5, eval_metric = ‘auc’) train_pred = trained_model.predict(trainX) train_prob = trained_model.predict_proba(trainX)[:, 1] test_pred = trained_model.predict(testX) test_prob = trained_model.predict_proba(testX)[:, 1] plot_roc_curve(trainY, testY, train_pred, test_pred, train_prob, test_prob) confusion_matrix(testY, test_pred) print(“—%s seconds —” % (time.time() – start_time))

LGBM(공식 홈페이지)에는 scale_pos_weight라는 하이퍼 파라미터가 있습니다.

positive 클래스에 원하는 만큼 가중치를 줄 수 있는 하이퍼 파라미터입니다.

위에서는 samping을 통해 데이터의 양적으로 불균형을 해소 했다면, 이번에는 열등한 클래스에 가중치를 부여하여 질적으로 불균형을 해소해주는 방법입니다.

보통은 양성 클래스와 음성 클래스를 완전히 동일하게 두기 위해 초기값을 negative_class/positive_class로 설정하며 조금씩 바꿔갑니다. 이것도 나중에 과적합을 고려하여 randomized나 grid search를 해야하긴 합니다.

결과

f1 score가 대략 0.2 정도까지 올라갔습니다!

재현율이 많이 올라갔네요.

여기까지하면, oversampling 데이터로 pos weight 인자를 추가한 모델도 궁금해집니다.

oversampling 데이터는 이미 양적으로 개수가 같기 때문에 Scale_pos_weight = 1.05로 아주 작게하는 것이 그냥 over sampling의 모델보다 더 나은 결과를 얻었습니다. ( 크게하면 과적합 위험이 너무 큼 )

Scale pos weight > Over sampling & Scale pos weight (작게) > over sampling >>> base 모델

사실 제 데이터가 주식 데이터라 신호와 잡음을 분리하기 힘든 케이스입니다.

아마 True positive로 나온 4497개의 데이터도 cv를 여러개 만들어 검증을 해봐야할 것 같습니다.

종속 변수와 독립 변수들이 강한 일반적인 데이터들은 이 정도 과정으로도 제 결과보다는 훨씬 나을 것 같습니다.

방법3 – 앙상블

위에서 유의미하게 나온 scale_pos_weight 인자를 넣은 모델과 oversample 데이터와 scale_pos_weight 인자를 넣은 두 모델은 각각 다른 패턴을 캐치하여 학습했을 수도 있습니다.

따라서 위에 잘 나온 두 모델을 각각 앙상블을 하는데,

1. 두 모델에서 testset을 prediction하여 나온 두 확률값을 평균하는 앙상블

2. 두 모델에서 testset을 prediction하여 나온 두 확률값중 max값으로 정하는 앙상블

마지막으로 이 두 앙상블을 비교해보겠습니다.

제 데이터셋에 한해서는 재현율과 정밀도가 너무 작기때문에 max값 앙상블도 괜찮을 것이라 생각했습니다.

앙상블 결과

max의 결과가 더 좋게나왔지만 그냥 Scale_pos_weight인자만 이용했던 모델이 가장 좋은 결과를 얻어냈네요.

그래도 재현율에 한해서는 가장 높게 나왔기 때문에 어떻게 좀 더 머리를 굴려볼 수 있을 것 같습니다.

다른 데이터들에서는 어떻게 나올지 모르니 일단은 포스팅하고 인사이트를 공유해봤습니다!

최종적으로는 Scale pos weight인자만 설정한 모델이 가장 좋게나왔습니다.

방법4 – loss function ( focal loss )

마지막 방법은 사실 제일 많이 서칭해보고 기대했던 야심작이었는데 결과가 정말 안좋았어서 아~ 이런 방법도 있구나 하고 번외로 보시면 될 것 같습니다.

GBM모델은 1차 Tree모델에서 오분류했던 데이터들의 잔차를 구해 개선해 나가면서 업데이트하는 방식입니다. 따라서 loss function이 꽤나 중요할 것입니다.

https://techblog-history-younghunjo1.tistory.com/191

컴퓨터 비전 객체 검출 모델에서는 이미지처럼 negative 클래스가 정말 많이 생기는 문제로 발명된게 focal loss입니다.

Cross entropy에 알파, 감마값을 조정하면서 잘 맞추는 class에는 점수를 조금 주고, 잘 틀리는 class에는 높은 페널티를 부여하는 것으로 공부했던 것 같은데…

저도 논문을 제대로 읽은 것은 아니라서 관심있으시면 링크로 가시면됩니다.

어쨌든 focal loss가 딥러닝에서는 imbalanced data에 아주 많이 쓰이는 loss function인데, 쓰일 수 있을 것 같아 찾아보니 LGBM이나 XGboost에도 쓰이더라구요!

결과는 좋지 않았지만, 코드를 공유합니다.

(코드를 참고했던 자료)

※ focal loss를 이용하려면, 커스텀해야하므로 lgbm.train 함수를 이용해야함 (lgbm.train 공식 홈페이지, lgbm.dataset 공식 홈페이지)

############### focal loss custom 함수 import numpy as np from scipy import optimize from scipy import special class FocalLoss: def __init__(self, gamma, alpha=None): self.alpha = alpha self.gamma = gamma def at(self, y): if self.alpha is None: return np.ones_like(y) return np.where(y, self.alpha, 1 – self.alpha) def pt(self, y, p): p = np.clip(p, 1e-15, 1 – 1e-15) return np.where(y, p, 1 – p) def __call__(self, y_true, y_pred): at = self.at(y_true) pt = self.pt(y_true, y_pred) return -at * (1 – pt) ** self.gamma * np.log(pt) def grad(self, y_true, y_pred): y = 2 * y_true – 1 # {0, 1} -> {-1, 1} at = self.at(y_true) pt = self.pt(y_true, y_pred) g = self.gamma return at * y * (1 – pt) ** g * (g * pt * np.log(pt) + pt – 1) def hess(self, y_true, y_pred): y = 2 * y_true – 1 # {0, 1} -> {-1, 1} at = self.at(y_true) pt = self.pt(y_true, y_pred) g = self.gamma u = at * y * (1 – pt) ** g du = -at * y * g * (1 – pt) ** (g – 1) v = g * pt * np.log(pt) + pt – 1 dv = g * np.log(pt) + g + 1 return (du * v + u * dv) * y * (pt * (1 – pt)) def init_score(self, y_true): res = optimize.minimize_scalar( lambda p: self(y_true, p).sum(), bounds=(0, 1), method=’bounded’ ) p = res.x log_odds = np.log(p / (1 – p)) return log_odds def lgb_obj(self, preds, train_data): y = train_data.get_label() p = special.expit(preds) return self.grad(y, p), self.hess(y, p) def lgb_eval(self, preds, train_data): y = train_data.get_label() p = special.expit(preds) is_higher_better = False return ‘focal_loss’, self(y, p).mean(), is_higher_better

#https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.train.html # <-LGBM.train 공식 홈페이지 #https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.Dataset.html # <- LGBM.Dataset 공식 홈페이지 ####################### focal loss로 학습하기 import lightgbm import numpy as np import pandas as pd from scipy import optimize from scipy import special from sklearn import metrics from sklearn import model_selection import time start_time=time.time() fl = FocalLoss(alpha=None, gamma=2) fit = lightgbm.Dataset( trainX, trainY, init_score=np.full_like(trainY, fl.init_score(trainY), dtype=float) ) val = lightgbm.Dataset( testX, testY, init_score=np.full_like(testY, fl.init_score(trainY), dtype=float), reference=fit # trainset 의미 ) model = lightgbm.train( params={ 'objective' : 'binary', # 'scale_pos_weight': 11, 'learning_rate': 0.1, 'num_iterations' : 1000, 'max_depth' : 4, 'n_jobs':-1, 'boost_from_average':False, 'metric' : 'auc'}, train_set=fit, valid_sets=(fit, val), valid_names=('fit', 'val'), early_stopping_rounds=25, verbose_eval = 5, fobj=fl.lgb_obj, feval=fl.lgb_eval ) train_prob = special.expit(fl.init_score(trainY) + model.predict(trainX)) train_pred = (train_prob >= 0.5).astype(‘int’) test_prob = special.expit(fl.init_score(trainY) + model.predict(testX)) test_pred = (test_prob >= 0.5).astype(‘int’) plot_roc_curve(trainY, testY, train_pred, test_pred, train_prob, test_prob) confusion_matrix(testY, test_pred) print(“—%s seconds —” % (time.time() – start_time))

focal loss 결과

focal loss를 이용한 모델은 scale pos weight 인자도 먹히지 않았습니다.

focal loss를 활용한 XGboost의 논문에서는 focal loss의 gamma = 2.0에서도 효과가 가장 좋았다고 합니다.

참고로 focalloss로 학습한 모델의 predict는 확률값이 아니라서 위 코드에 train_prob, test_prob 선언하는 부분을 잘 보셔야합니다.

혹시 focal loss때문에 이 글을 보셨거나 이용해보셨으면 공유 부탁드립니다.

focal loss를 활용한 GBM모델은 거의 외국 자료더라구요.

키워드에 대한 정보 데이터 불균형

다음은 Bing에서 데이터 불균형 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법

  • 불균형 데이터 처리
  • 머신러닝
  • 인공지능
  • 샘플링
  • 오버샘플링
  • 언더샘플링
  • SMOTE
  • 데이터마이닝
[핵심 #머신러닝] #불균형 #데이터 #분석을 #위한 #샘플링 #기법


YouTube에서 데이터 불균형 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [핵심 머신러닝] 불균형 데이터 분석을 위한 샘플링 기법 | 데이터 불균형, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment