일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Counterfactual Explanations
- hadoop
- TensorFlow
- UDF
- grad-cam
- API
- 공분산
- 유튜브 API
- 상관관계
- Retry
- GCP
- requests
- flask
- login crawling
- BigQuery
- session 유지
- airflow subdag
- GenericGBQException
- subdag
- correlation
- gather_nd
- Airflow
- youtube data
- top_k
- chatGPT
- XAI
- API Gateway
- tensorflow text
- integrated gradient
- spark udf
- Today
- Total
데이터과학 삼학년
Imbalanced data approach 본문
[DATA]
credit card data
[Oversampling & algorithm]
- SMOTE, SMOTEEN, SMOTETOMEK, pandas upsampling, downsampling, algorithm
> 로짓 모형을 통한 각 샘플링 초기 실험결과
method |
Class |
precision |
recall |
downsampling |
Class 0 |
0.99 |
0.98 |
Class 1 |
0.06 |
0.86 |
|
pandas_upsampling |
Class 0 |
0.86 |
0.67 |
Class 1 |
0.34 |
0.61 |
|
smote |
Class 0 |
0.87 |
0.50 |
Class 1 |
0.29 |
0.73 |
|
smoteenn |
Class 0 |
0.87 |
0.43 |
Class 1 |
0.28 |
0.78 |
|
smotetomek |
Class 0 |
0.86 |
0.65 |
Class 1 |
0.33 |
0.63 |
|
adasyn |
Class 0 |
0.99 |
0.99 |
Class 1 |
0.10 |
0.86 |
|
boosting (GBT) (not oversampling) |
Class 0 |
0.99 |
0.99 |
Class 1 |
0.92 |
0.79 |
|
randomforest (RF) |
Class 0 |
0.99 |
0.99 |
Class 1 |
0.94 |
0.80 |
- SMOTEENN = SMOTE + ENN, This algorithm combined SMOTE with ENN(edited nearest neighbors). This generates minority class more than majority class as I know.
- SMOTETOMEK = SMOTE + TOMEK, This algorithm combined SMOTE with Tomek link
- Both are very similar to SMOTE
[Feature engineering]
- 목적 : data 탐색을 통해 새로운 feature를 생성하고, Class1과 Class0 을 구분할 수 있는 feature를 만듦
- 카테고리형, 연속형 Feature 존재 유무 확인
> 카테고리형 feature 존재하지 않음 → dataset이 임베딩한 data이기 때문으로 추정
- feature간 상관관계 확인
> feature간 상관관계가 0.5 이상인 feature 존재하지 않음
- 분포확인 : 시각화를 통해 feature에서 class0과 class1간 분포 차이 확인
> 큰 시사점은 찾지 못함
- 피처간 변동폭 확인
> class1(사기: red)이 정상 데이터(blue)에 비해 각 feature간 변동폭이 크다는 insight를 얻음
>> feature 간 변동폭을 이용하여 class간 구분을 지을 수 있는 feature 생성에 대해 탐색
- Feature engineering
> feature 간 변동폭을 이용해 새로운 feature를 생성하고 class간 분포 확인함
|
|
- oversampling
> 생성한 feature를 2차원으로 표현해 구분이 가능한지 확인
> oversampling의 영향 확인
|
|
원본 data |
smote를 거친 data |
> oversampling 전후 데이터 분포 비교
[Feature selection]
- feature engineering의 과정을 거쳐 총 10개의 feature를 생성함
[ 'V14pV12','V2pV11','V17-V11','sqV3-V2','V10pV3','V17pV14','V4pV2','sqV8','sqV2','sqV17' ]
- oversampling 단계에서 성능이 좋았던 GBT의 feature importance를 통해 5개의 feature를 추가함 → ['V17','V14','V10','V26','V7' ]
>> 총 15개의 feature를 선택함(원본데이터 30개 features)
[Dataset transform]
- Train data
1. Data cleaning : outlier delete
2. Feature engineering
3. Data augmentation : oversampling(smote etc.)
- Valid data
1. feature engineering
- Test data
1. feature engineering
[Model & Result]
- estimator의 DNN Classifier를 사용
> layer = [30,30,30]
> adam optimizer, batch normalization
> step = 10000
- oversampling을 사용하지 않음
> 실험결과, oversampling 사용시 모델의 predict 결과가 trial마다 매우 상이함
> 정제한 feature에서 oversampling이 오히려 좋지 않은 영향을 미칠거라 판단
- 예측 결과
> confusion matrix
sampling |
Class |
Class 0 |
Class 1 |
not oversampling |
Class 0 |
56796 |
62 |
Class 1 |
20 |
84 |
|
smote (class1 == class0) |
Class 0 |
56828 |
30 |
Class 1 |
22 |
82 |
|
smoteenn (class1 > class0) |
Class 0 |
56713 |
145 |
Class 1 |
79 |
25 |
|
smotetomek (class1 == class0) |
Class 0 |
55244 |
1614 |
Class 1 |
57 |
47 |
|
adasyn (class1 > class0) |
Class 0 |
56855 |
3 |
Class 1 |
79 |
25 |
> precision, recall, fbeta score
DNN |
Class |
precision |
recall |
fbeta_score(beta=5) |
not oversampling |
Class0 |
0.99 |
0.99 |
0.99 |
Class1 |
0.58 |
0.81 |
0.80 |
|
smote |
Class0 |
0.99 |
0.99 |
0.99 |
Class1 |
0.73 |
0.79 |
0.79 |
|
smoteenn |
Class0 |
0.99 |
0.99 |
0.99 |
Class1 |
0.15 |
0.24 |
0.23 |
|
smotetomek |
Class0 |
0.99 |
0.97 |
0.97 |
Class1 |
0.03 |
0.45 |
0.29 |
|
adasyn |
Class0 |
0.99 |
0.99 |
0.99 |
Class1 |
0.89 |
0.24 |
0.25 |
- 번외 : 머신러닝 모델 결과(not oversampling)
1. LogisticRegression
> confusion matrix
Class 0 |
Class 1 |
|
Class 0 |
48348 |
8510 |
Class 1 |
9 |
95 |
> Class1
precision : 0.011040092969203951
recall : 0.9134615384615384
fbeta_score(beta=5) : 0.22043730477465417
2. Gradient Boosting Tree
> confusion matrix
Class 0 |
Class 1 |
|
Class 0 |
556851 |
7 |
Class 1 |
22 |
82 |
> Class1
precision : 0.9213483146067416
recall : 0.7884615384615384
fbeta_score(beta=5) : 0.792859799181852
3. Random Forest
> confusion matrix
Class 0 |
Class 1 |
|
Class 0 |
56853 |
5 |
Class 1 |
21 |
83 |
> Class1
precision : 0.9431818181818182
recall : 0.7980769230769231
fbeta_score(beta=5) : 0.802827380952381
[Impression]
- 불균형 데이터에 대한 접근 방법에 대해 리서치하는 기회
> over sampling(nearmiss, smote 등), algorithm, autoencoder를 이용한 분류기법 등
- 데이터 탐색을 통해 새로운 피처를 만들어내고 가능성을 탐색해보는데 의의가 있었음
> 데이터에 대한 도메인 지식없이 분포만을 가지고 피처 엔지니어링에 접근해보니 쉽지않은 작업임을 체감
> 도메인 지식의 중요성을 느낌
- 불균형 데이터의 레이블된 데이터가 많지않아 딥러닝보다는 머신러닝이 유의미한 결과를 나타낸 것으로 보임
- 비지니스 목적에 따라 평가척도를 세우는 것의 중요성을 느낌
> fbeta score로 볼것인지, recall, precision을 볼 것인지
[References]
-oversampling 기법 : nearmiss, adasyn, smote 등 https://medium.com/james-blogs/handling-imbalanced-data-in-classification-problems-7de598c1059f
- algorithm :
https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/
- 불균형 데이터 일반적인 핸들링 방법
https://towardsdatascience.com/handling-imbalanced-datasets-in-machine-learning-7a0e84220f28
- sampling 방법(한글)
https://datascienceschool.net/view-notebook/c1a8dad913f74811ae8eef5d3bedc0c3/
'Statistical Learning' 카테고리의 다른 글
[기초통계] Maximum Likelihood (0) | 2020.08.12 |
---|---|
[기초통계] Probability vs Likelihood (0) | 2020.08.12 |
[ISLR] Unsupervised Learning (0) | 2020.04.08 |
[ISLR] Support Vector Machines (0) | 2020.04.02 |
[기초통계] 왜도(Skewness)와 첨도(Kurtosis) (0) | 2020.03.28 |