어떻게 Python 으로 불 균형 데이터 세트 를 처리 합 니까?

1.데이터 불 균형 이란 무엇 인가
데이터 불 균형(imbalanced data)이란 데이터 가 각 유형의 수량 분포 불 균형 을 집중 시 키 는 것 을 말한다.불 균형 데 이 터 는 현실 임무 에서 매우 흔히 볼 수 있다....와 같다
  • 신용카드 사기 데이터:99%가 정상 적 인 데이터 이 고 1%는 사기 데이터
  • 대출 기한 초과 데이터
  • 불 균형 데 이 터 는 일반적으로 데이터 가 발생 하 는 원인 으로 인해 발생 하 는데 유형 이 적은 견본 은 보통 발생 하 는 빈도 가 낮 고 긴 주기 로 수집 해 야 한다.
    기계 학습 임무(예 를 들 어 분류 문제)에서 불 균형 데 이 터 는 훈련 모델 의 예측 결 과 를 샘플 수량 이 많은 유형 에 치 우 칠 수 있다.이 럴 때 적당 한 평가 기준 을 선택 하 는 것 을 제외 하고 모델 의 성능 을 향상 시 키 려 면 데이터 와 모델 에 대해 예비 처 리 를 해 야 한다.
    데이터 불 균형 을 처리 하 는 주요 방법:
  • 미 샘플링
  • 과 샘플링
  • 종합 샘플링
  • 모델 통합
  • 분류 가중치 또는 견본 가중치 조정
    2.데이터 불 균형 처리 방법
    imbalanced-learn 라 이브 러 리 는 많은 불 균형 데이터 처리 방법 을 제공 하 였 으 며,본 고의 예 는 모두 imbalanced-learn 라 이브 러 리 로 이 루어 졌 다.
    
    pip install -U imbalanced-learn 
    https://github.com/scikit-learn-contrib/imbalanced-learn
    본 논문 의 사례 데 이 터 는 진행 중인 경기 산동성 제2회 데이터 응용 혁신 창업 대회-일조 분 경기장-적립금 대출 기한 초과 예측 에서 나 왔 다.
    일단 데 이 터 를 보 겠 습 니 다.
    
    import pandas as pd
    train_data = './data/train.csv'
    test_data = './data/test.csv'
    train_df = pd.read_csv(train_data)
    test_df = pd.read_csv(test_data)
    
    print(train_df.groupby(['label']).size())
    # label     , 1   , 0    
    #     label
    # 0    37243
    # 1     2757

    2.1 샘플링 부족
    샘플링 이 부족 하 다 는 것 은 수량 이 많은 유형(majority 로 기록)의 견본 을 샘플링 하여 수량 이 적은 유형(minority)의 수량 과 비슷 하 게 하여 수량의 균형 을 이 루 는 것 이다.

    샘플링 이 부족 한 것 은 일부 데 이 터 를 잃 어 버 렸 기 때문에 수량 여러 가지 견본 의 분포 에 변화 가 생 길 수 밖 에 없다(분산 이 커진다).좋 은 샘플링 정책 은 가능 한 한 원래 의 데이터 분 포 를 유지 해 야 한다.
    샘플링 이 부족 한 것 은 majority 의 견본 을 삭제 하 는 것 입 니 다.어떤 견본 을 삭제 할 수 있 습 니까?
  • 하 나 는 overlapping 의 데이터 이 고 나머지 데이터
  • 입 니 다.
  • 하 나 는 간섭 하 는 데이터 로 minority 의 분 포 를 방해 하 는
  • 이다.
    이 를 바탕 으로 두 가지 사고 로 샘플링 이 부족 하 다.
  • 경계 가 서로 인접 하여 일치 합 니 다.가 까 운 이웃 공간 에서 majority 샘플 을 삭제 하 는 방법 을 고려 합 니 다.예 를 들 어 TomekLinks,NearMiss
  • .
    아래 그림 은 6NN(6 개 최근 이웃)을 보 여 줍 니 다.

    여기 서 TomekLinks 에 중심 을 두 고 TomekLinks 방법 은 간단하게 말 하면 모든 minority 샘플 에 대해 1NN(가장 가 까 운 이웃)을 찾 습 니 다.만약 에 가장 가 까 운 이웃 이 majority 라면 tome-links 를 형성 합 니 다.이 방법 은 이 majority 를 방해 하고 삭제 합 니 다.
    
    from imblearn.under_sampling import TomekLinks
    
    X_train = train_df.drop(['id', 'type'], axis=1)
    y = train_df['label']
    tl = TomekLinks()
    X_us, y_us = tl.fit_sample(X_train, y)
    print(X_us.groupby(['label']).size())
    # label
    # 0    36069
    # 1     2757
    위 에서 알 수 있 듯 이 1174 개의 tomek-link 가 삭제 되 었 습 니 다.삭제 가 많 지 않 은 것 같 습 니 다.분류 결과 에 도움 이 되 는 지 테스트 할 수 있 습 니 다.주의해 야 할 것 은 최근 이웃 을 계산 해 야 하기 때문에 견본 속성 은 반드시 수치 속성 이 어야 하거나 수치 속성 으로 전환 할 수 있 습 니 다.
  • 집합
  • 이런 방법 은 여러 개의 집합 을 통 해 원시 견본 을 여러 개의 집합 으로 나 눈 다음 에 모든 집합 클 러 스 터 의 중심 으로 이 집합 클 러 스 터 의 특성 을 대체 하여 샘플링 의 목적 을 완성 한다.알 수 있 듯 이 이런 샘플링 의 견본 은 원시 견본 집 이 아니 라 집합 으로 생 성 된 것 이다.
    
    from imblearn.under_sampling import ClusterCentroids 
    
    cc = ClusterCentroids(random_state=42)
    X_res, y_res = cc.fit_resample(X_train, y)
    X_res.groupby(['label']).size()
    # label
    # 0    2757
    # 1    2757
    im-balance 가 제공 하 는 미 샘플링 방법 은 다음 과 같다.
  • Random majority under-sampling with replacement
  • Extraction of majority-minority Tomek links
  • Under-sampling with Cluster Centroids
  • NearMiss-(1 & 2 & 3)
  • Condensed Nearest Neighbour
  • One-Sided Selection
  • Neighboorhood Cleaning Rule
  • Edited Nearest Neighbours
  • Instance Hardness Threshold
  • Repeated Edited Nearest Neighbours
  • AllKNN
  • 2.2 샘플링
    샘플링 이란 수량 이 적은 유형(minority)의 견본 을 copy 하여 수량 이 많은 유형(majority)의 수량 과 비슷 하 게 하여 수량의 균형 을 이 루 는 것 이다.여러 개의 minoruty 샘플 을 복 사 했 기 때문에 샘플링 을 하면 minority 의 방 차 를 바 꿀 수 있 습 니 다.

    샘플링 을 통과 하 는 간단 한 방식 은 무 작위 copy minority 의 견본 이다.다른 하 나 는 기 존 견본 에 따라 인조 견본 을 생 성 하 는 것 이다.여기에 인조 견본 의 고전 알고리즘 인 SMOTE(Synthetic Minority Over-sampling Technique)를 소개 한다.
    SMOTE 는 minority 샘플 과 비슷 한 특징 공간 구 조 를 바탕 으로 새로운 인공 샘플 을 만 들 었 다.절 차 는 다음 과 같다.
  • minority 샘플 을 선택 하여 KNN 이웃
  • 을 계산 합 니 다.
  • K 개 이웃 중에서 무 작위 로 근린
  • 을 선택 하 십시오.
  • 특정한 특징 을 수정 하고 일정한 크기 로 이동 합 니 다.오프셋 의 크기 는 이 minority 견본 과 이 근린 차이 에 작은 랜 덤 비율(0,1)을 곱 하여 새로운 견본
  • 을 생 성 합 니 다.
    
    from imblearn.over_sampling import SMOTE
    smote = SMOTE(k_neighbors=5, random_state=42)
    X_res, y_res = smote.fit_resample(X_train, y)
    X_res.groupby(['label']).size()
    # label
    # 0    37243
    # 1    37243
    SMOTE 방법 에 대해 서 는 모든 minority 에 대해 새로운 샘플 을 구성 합 니 다.하지만 항상 그렇지 는 않 습 니 다.아래 A,B,C 세 가 지 를 고려 해 보 세 요.데이터 분 포 를 보면 C 점 은 이상 점(Noise)일 가능성 이 높 고 B 점 은 정상 분포 점(SAFE)이 며 A 점 은 경계 위치(DANGER)에 분포 한다.
    직관 적 으로 C 점 에 대해 우 리 는 새로운 견본 을 구성 해 서 는 안 된다.B 점 에 대해 새로운 견본 을 구성 하면 minority 유형의 분 포 를 풍부하게 하지 않 을 것 이다.A 점 만 있 고 새로운 견본 을 구성 하면 A 점 이(DANGER)에서(SAFE)까지 minority 유형의 분류 경 계 를 강화 할 수 있다.이게 바로 Borderline-Smote 입 니 다.
    
    from imblearn.over_sampling import BorderlineSMOTE
    bsmote = BorderlineSMOTE(k_neighbors=5, random_state=42)
    X_res, y_res = bsmote.fit_resample(X_train, y)
    X_res.groupby(['label']).size()
    # label
    # 0    37243
    # 1    37243
    ADASYN 방법 은 견본 의 분 포 를 유지 하 는 측면 에서 데 이 터 를 생 성 하 는 것 을 확정 하고 데 이 터 를 생 성 하 는 방식 은 SMOTE 와 같 으 며 각 minortiy 견본 이 견본 을 생 성 하 는 수량 이 다르다 는 데 있다.
  • 먼저 견본 을 생 성 할 수량 을 확정 한 베타 는[0,1]
  • 이다.
  • 은 모든 minortiy 샘플 에 대해 샘플 을 생 성 하 는 비율 을 확정 합 니 다.먼저 K 최근 이웃 을 찾 아 K 최근 이웃 중 majority 에 속 하 는 샘플 비율(즉 분자)을 계산 하고 Z 는 귀 일 화 된 인자 로 모든 minortiry 의 비율 과 1 을 확보 하 며 모든 분자 의 합 이 라 고 볼 수 있다.
  • 모든 minortiy 가 새로운 견본 을 생 성 하 는 수량
  • 을 계산 합 니 다.
  • SMOTE 방식 에 따라 샘플 생 성
  • 
    from imblearn.over_sampling import ADASYN 
    adasyn = ADASYN(n_neighbors=5, random_state=42)
    X_res, y_res = adasyn.fit_resample(X_train, y)
    X_res.groupby(['label']).size()
    
    # label
    # 0    37243
    # 1    36690
    im-balance 가 제공 하 는 샘플링 방법 은 다음 과 같 습 니 다(SMOTE 알고리즘 변종 포함).
  • Random minority over-sampling with replacement
  • SMOTE - Synthetic Minority Over-sampling Technique
  • SMOTENC - SMOTE for Nominal Continuous
  • bSMOTE(1 & 2) - Borderline SMOTE of types 1 and 2
  • SVM SMOTE - Support Vectors SMOTE
  • ADASYN - Adaptive synthetic sampling approach for imbalanced learning
  • KMeans-SMOTE
  • ROSE - Random OverSampling Examples
  • 2.3 종합 샘플링
    샘플링 은 minority 샘플 을 대상 으로 하고 샘플링 이 부족 한 것 은 majority 샘플 을 대상 으로 하 는 것 입 니 다.종합 샘플링 은 minority 샘플 과 majority 샘플 을 동시에 조작 하 는 방법 이다.주로 SMOTE+Tomek-links 와 SMOTE+Edited Nearest Neighbours 가 있 습 니 다.
    종합 적 으로 샘플 을 채취 하 는 방법 은 먼저 샘플 을 채취 하여 샘플 을 채취 하지 않 는 것 이다.
    
    from imblearn.combine import SMOTETomek
    
    smote_tomek = SMOTETomek(random_state=0)
    X_res, y_res = smote_tomek.fit_sample(X_train, y)
    X_res.groupby(['label']).size()
    # label
    # 0    36260
    # 1    36260
    2.4 모델 통합
    이곳 의 모델 통합 은 주로 데이터 에 나타난다.즉,여러 균형 적 인 데이터 세트(majortiry 의 샘플 로 샘플링 과 minority 샘플)로 여러 모델 을 훈련 시 킨 다음 에 집성 한다.imblearn.ensemble 은 Balanced RandomForestClassifier 와 같은 몇 가지 흔 한 모델 통합 알고리즘 을 제공 합 니 다.
    
    from imblearn.ensemble import BalancedRandomForestClassifier
    from sklearn.datasets import make_classification
    
    X, y = make_classification(n_samples=1000, n_classes=3,
                               n_informative=4, weights=[0.2, 0.3, 0.5],
                               random_state=0)
    clf = BalancedRandomForestClassifier(max_depth=2, random_state=0)
    clf.fit(X, y)  
    
    print(clf.feature_importances_)  
    print(clf.predict([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]))
    im-balance 가 제공 하 는 모델 통합 방법 은 다음 과 같다.
  • Easy Ensemble classifier
  • Balanced Random Forest
  • Balanced Bagging
  • RUSBoost
  • 2.5 유형 가중치 또는 견본 가중치 조정
    경사도 하강 방법 으로 학습 하 는 많은 기계 학습 방법 에 대해 서 는 유형 별 가중치 나 견본 의 가중치 를 조정 하 는 방식 으로 어느 정도 불 균형 데 이 터 를 균형 시 킬 수 있다.예 를 들 어 gbdt 모델 lightgbm 중 classweight
    
    import lightgbm as lgb
    clf = lgb.LGBMRegressor(num_leaves=31, 
                            min_child_samples= np.random.randint(20,25),
                            max_depth=25,
                            learning_rate=0.1, 
                            class_weight={0:1, 1:10},
                            n_estimators=500, 
                            n_jobs=30)
    3.총화
    본 고 는 흔히 볼 수 있 는 몇 가지 불 균형 데이터 세트 를 처리 하 는 방법 을 공유 하고 imbalanced-learn 의 간단 한 예 를 제공 합 니 다.총 결 은 다음 과 같다.
  • 샘플 부족:majoritry 샘플 감소
  • 과 샘플링:minority 샘플
  • 증가
  • 종합 샘플링:먼저 샘플링 을 하고 샘플링 이 부족 한
  • 모델 통합:균형 데이터(majoritry 샘플 미 샘플링+minority 샘플)를 제조 하고 여러 번 서로 다른 미 샘플링,서로 다른 모델 을 훈련 한 다음 에
  • 을 융합 시킨다.
  • 은 샘플링 이 부족 하 든 샘플링 이 부족 하 든 어느 정도 에 원시 데이터 의 분 포 를 바 꾸 었 기 때문에 모델 이 너무 적합 할 수 있다.실제 데이터 분포 에 부합 되 는 어떤 방법 을 시도 해 야 합 니까?물론 효과 가 있 는 것 은 아니 지만 용감하게 시도 해 보 세 요 just do it!
  • 4.참고 자료
  • Learning from Imbalanced Data
  • Two Modifications of CNN(Tomek links,CNN 언뜻 보기 에는 권 적 신경 망 인 줄 알 았 는데 사실은 condensed nearest-neighbor)
  • imbalanced-learn API: https://imbalanced-learn.org/stable/
  • 이상 은 파 이 썬 으로 불 균형 데이터 세트 를 어떻게 처리 하 는 지 에 대한 상세 한 내용 입 니 다.파 이 썬 이 불 균형 데이터 세트 를 처리 하 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기