어떻게 Python 으로 불 균형 데이터 세트 를 처리 합 니까?
데이터 불 균형(imbalanced data)이란 데이터 가 각 유형의 수량 분포 불 균형 을 집중 시 키 는 것 을 말한다.불 균형 데 이 터 는 현실 임무 에서 매우 흔히 볼 수 있다....와 같다
기계 학습 임무(예 를 들 어 분류 문제)에서 불 균형 데 이 터 는 훈련 모델 의 예측 결 과 를 샘플 수량 이 많은 유형 에 치 우 칠 수 있다.이 럴 때 적당 한 평가 기준 을 선택 하 는 것 을 제외 하고 모델 의 성능 을 향상 시 키 려 면 데이터 와 모델 에 대해 예비 처 리 를 해 야 한다.
데이터 불 균형 을 처리 하 는 주요 방법:
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 의 견본 을 삭제 하 는 것 입 니 다.어떤 견본 을 삭제 할 수 있 습 니까?
이 를 바탕 으로 두 가지 사고 로 샘플링 이 부족 하 다.
아래 그림 은 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 가 제공 하 는 미 샘플링 방법 은 다음 과 같다.샘플링 이란 수량 이 적은 유형(minority)의 견본 을 copy 하여 수량 이 많은 유형(majority)의 수량 과 비슷 하 게 하여 수량의 균형 을 이 루 는 것 이다.여러 개의 minoruty 샘플 을 복 사 했 기 때문에 샘플링 을 하면 minority 의 방 차 를 바 꿀 수 있 습 니 다.
샘플링 을 통과 하 는 간단 한 방식 은 무 작위 copy minority 의 견본 이다.다른 하 나 는 기 존 견본 에 따라 인조 견본 을 생 성 하 는 것 이다.여기에 인조 견본 의 고전 알고리즘 인 SMOTE(Synthetic Minority Over-sampling Technique)를 소개 한다.
SMOTE 는 minority 샘플 과 비슷 한 특징 공간 구 조 를 바탕 으로 새로운 인공 샘플 을 만 들 었 다.절 차 는 다음 과 같다.
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 견본 이 견본 을 생 성 하 는 수량 이 다르다 는 데 있다.
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 알고리즘 변종 포함).샘플링 은 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 가 제공 하 는 모델 통합 방법 은 다음 과 같다.경사도 하강 방법 으로 학습 하 는 많은 기계 학습 방법 에 대해 서 는 유형 별 가중치 나 견본 의 가중치 를 조정 하 는 방식 으로 어느 정도 불 균형 데 이 터 를 균형 시 킬 수 있다.예 를 들 어 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 의 간단 한 예 를 제공 합 니 다.총 결 은 다음 과 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.