본문 바로가기
DeepLearning Framework & Coding/Microsoft AzureML

[Microsoft AzureML - 16] 불균일 데이터 전처리(Sampling,SMOTE)

by 노마드공학자 2021. 7. 2.

※ 이전글

[Microsoft AzureML - 0] Intro https://limitsinx.tistory.com/113

[Microsoft AzureML - 1] 개발 환경 세팅 https://limitsinx.tistory.com/114

[Microsoft AzureML - 2] 학습할 데이터 불러오기 https://limitsinx.tistory.com/115

[Microsoft AzureML - 3] 데이터 전처리(Data pre-processing) - I https://limitsinx.tistory.com/116

[Microsoft AzureML - 4] 데이터 전처리(Data pre-processing) - II https://limitsinx.tistory.com/117

[Microsoft AzureML - 5] 학습모델 구현 및 검증 https://limitsinx.tistory.com/118

[Microsoft AzureML - 6] 여러 학습모델 동시에 성능비교 https://limitsinx.tistory.com/119

[Microsoft AzureML - 7] Binary Classification with Kaggle https://limitsinx.tistory.com/120

[Microsoft AzureML - 8] 모델 선정과 Hyper Parameter 자동튜닝 https://limitsinx.tistory.com/121

[Microsoft AzureML - 9] 학습데이터 CSV로 Export하기 https://limitsinx.tistory.com/122

[Microsoft AzureML - 10] 데이터 Feature Engineering https://limitsinx.tistory.com/123

[Microsoft AzureML - 11] 이미지 데이터학습 with Neural Network https://limitsinx.tistory.com/124

[Microsoft AzureML - 12] Train/Test 데이터 구분하기 https://limitsinx.tistory.com/125

[Microsoft AzureML - 13] Kaggle 사용법 https://limitsinx.tistory.com/126

[Microsoft AzureML - 14] Titanic Dataset 학습하기 https://limitsinx.tistory.com/127

[Microsoft AzureML - 15] Cross Validation https://limitsinx.tistory.com/128

 


 

불균일 데이터

출처 : https://www.allindata.org/bias-in-big-data-implications-for-multi-sector-data-sharing/

 

불균일 데이터란, 무엇일까요??

 

예를들어.. 진급심사 대상자가 1000명 있는데, 진급이 가능한사람이 10명이라고 치면

 

990명은 0(진급못함), 10명은 1(진급가능) 이겠죠??

 

이렇게 나뉘어진 데이터로 학습을 시키면.. 990명에 Bias가 생겨서 학습이 될것입니다. 즉, 예측을 제대로하기 힘들어질 수 있다는것이죠

 

이런류의 문제는 정말 많습니다.

 

이미지학습을 통해, 공장 품질 개선을 위한 프로젝트를 하고있다고 치면 20000개의 생산된 제품중 개선이 필요한 제품이 10000개씩 될까요?? 끽해야.. 200개정도? (이것도 1% 공정오류율로 아주 높게잡았을때입니다.)

 

그럼.. 19800개의 1(Pass)데이터와 200개의 0(Fail)데이터를 가지고 학습을 시키게되면

 

학습한 결과가 형편없이질지 모릅니다. 양질의 제품이 압도적으로 많기때문에 Bias가 생기기때문이죠

 

 

Data가 Bias가 있을시(불균일) 해결방안

1. Over Sampling : 데이터 갯수를 과도하게 부풀려준다. (불량품 200개 데이터를 뻥튀기해서 400개로)

2. Under Sampling : 데이터를 지운다(예를들면, 19800개 양품데이터중, 1만개를 버림)

 

보통 데이터싸이언티스트들이 데이터를 모으기 얼마나 어려운데... 기껏 모아놓은 데이터를 버리는일은 왠만하면 잘없고 보통 Over Sampling을 하려고 합니다.

 

이렇게 Over Sampling을 하는 수많은 방법들 중, 가장 많이쓰이는 테크닉중 하나가 바로 "SMOTE"인데요

 

SMOTE(Synthetic Minority OverSampling Technique)

출처 : https://john-analyst.medium.com/smote%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%88%EA%B7%A0%ED%98%95-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-5ab674ef0b32

 

Original 데이터의 초록색점이 갯수가 상당히 부족한걸 볼 수 있습니다.

 

SMOTE는 이 초록색 데이터들 사이를 선으로 연결하여, 그 선위에서 임의의 점들을 추가해주는 것입니다.

 

개념은 아주 간단하죠, AzureML에서도 바로 구현이 되도록 블록을 미리 만들어 놓았습니다.

 

일단은 SMOTE가 없는채로 Block Diagram을 실행해보니, 결과값들이 상기와 같이 나왔습니다.

 

True Positive / True Negative를 Confusion Matrix(혼돈행렬) 이라고 부르는데요,

 

True Positive : 긍정(1)으로 예측해서 실제값도 긍정일때

True Negative : 부정(0)으로 예측해서 실제값도 부정일때

 

입니다. True Positive가 True Negative와 숫자차이가 상당히 심한데요, 즉 True Negative쪽으로 Bias된 상태로 학습이 된다는것입니다.

 

이번에는, SMOTE를 진행하여 True Positive부분의 갯수를 늘려준채로 학습해보겠습니다.

 

SMOTE Block을 추가시켜줄때 중요한점은, Training Data에만 적용해야한다는 점입니다!

 

Test Dataset에도 적용하게되면... 데이터 뻥튀기된것 그대로 검증을 하게되니 정확도는 높게나오겠지만 의미가 없죠...

 

학습시킬때만 데이터 뻥튀기를하고 검증할때는 본데이터 그대로 진행해주셔야 합니다 :)

 

 

SMOTE Block의 Property입니다.

 

RandomSeed는 Cross Validation용이고(이전글 작성), 눈여겨볼건

 

1. SMOTE percentage : % 예를들어, 200개의 데이터를 100%로 SMOTE시 400개 데이터가됨

2. Number of Nearest Neighbors : N개의 점들을 연결한 직선들 사이에서 OverSampling

 

이 값들도 Hyper Parameter로 SMOTE를 써줄때는 이것들을 어떻게 조절해주느냐에 따라서도 상당히 값들이 많이 바뀝니다.

 

저는 Number of Nearest Neighbors는 3으로 두고, SMOTE percentage를 100% 와 1000% 두가지 시행해보겠습니다.

 

 

SMOTE Percentage 100%일때의 결과값입니다.

 

SMOTE를 적용하기전에는 True Positive의 갯수는 오히려 조금 줄었고, 정확도도 조금 내려갔네요

 

2배정도 뻥튀기 해준걸로는 크게 차이가 없어보입니다.

 

이번에는 10배 뻥튀기를 해주겠습니다. (SMOTE percentage 1000%)

 

 

확실히 True Positive의갯수가 많이 늘어났습니다.

 

하지만, 안타깝게도 Data 정확도는 점점 떨어지고 있는데요

 

데이터뻥튀기 과정이 아무래도 없는 데이터를 더욱 만들어주는 과정이다보니, 어떤때는 더욱 성능이 좋아지기도 하지만, 어떤때는 경우에따라 성능이 더 나빠지기도 합니다.

 

즉, 데이터 Oversampling은 반드시 "필수"가 아닌, "선택가능한 방안" 중 하나라는거죠! :)

댓글