다운로드
작성자: admin 작성일시: 2018-04-07 09:56:52 조회수: 1784 다운로드: 116
카테고리: 머신 러닝 태그목록:

비대칭 데이터 문제

데이터 클래스 비율이 너무 차이가 나면(highly-imbalanced data) 단순히 우세한 클래스를 택하는 모형의 정확도가 높아지므로 모형의 성능판별이 어려워진다. 즉, 정확도(accuracy)가 높아도 데이터 갯수가 적은 클래스의 재현율(recall-rate)이 급격히 작아지는 현상이 발생할 수 있다.

이렇게 각 클래스에 속한 데이터의 갯수의 차이에 의해 발생하는 문제들을 비대칭 데이터 문제(imbalanced data problem)이라고 한다.

In:
from sklearn.datasets import make_classification

X00, y00 = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, 
                               n_classes=2, n_clusters_per_class=1, class_sep=0.8, 
                               weights=[0.99, 0.01], random_state=0)

from sklearn.model_selection import train_test_split

X0, X_test, y0, y_test = train_test_split(X00, y00, test_size=0.25)
In:
from collections import Counter
from sklearn.svm import SVC

x1_min = X00[:, 0].min() - 2
x1_max = X00[:, 0].max() + 2
x2_min = X00[:, 1].min() - 2
x2_max = X00[:, 1].max() + 2

def plot_samples(X=None, y=None):
    XX, YY = np.mgrid[x1_min:x1_max:300j, x2_min:x2_max:300j]
    if X is None:
        X = X0
        model = SVC(kernel="linear").fit(X0, y0)
        Z = model.predict(np.c_[XX.ravel(), YY.ravel()])
        Z = Z.reshape(XX.shape)
        plt.contourf(XX, YY, Z, alpha=0.6)
        plt.scatter(X0[:, 0], X0[:, 1], marker='o', c=y0, s=40, 
                    linewidth=1, edgecolor='gray', alpha=0.7)
        plt.title(Counter(y0))
    else:
        plt.subplot(121)
        model = SVC(kernel="linear").fit(X0, y0)
        Z = model.predict(np.c_[XX.ravel(), YY.ravel()])
        Z = Z.reshape(XX.shape)
        plt.contourf(XX, YY, Z, alpha=0.6)
        plt.scatter(X0[:, 0], X0[:, 1], marker='o', c=y0, s=40, 
                    linewidth=1, edgecolor='gray', alpha=0.7)
        plt.xlim(-2, 4)
        plt.ylim(-3, 4)
        plt.title(Counter(y0))
        plt.subplot(122)
        model = SVC(kernel="linear").fit(X, y)
        Z = model.predict(np.c_[XX.ravel(), YY.ravel()])
        Z = Z.reshape(XX.shape)
        plt.contourf(XX, YY, Z, alpha=0.6)
        plt.scatter(X[:, 0], X[:, 1], marker='o', c=y, s=40, 
                    linewidth=1, edgecolor='gray', alpha=0.7)
        plt.xlim(-2, 4)
        plt.ylim(-3, 4)
        plt.title(Counter(y))
        plt.tight_layout()
    plt.show()
    
    return model.predict(X)
    
y_pred = plot_samples()
In:
from sklearn.metrics import classification_report

print(classification_report(y0, y_pred))
             precision    recall  f1-score   support

          0       0.99      1.00      0.99       737
          1       1.00      0.31      0.47        13

avg / total       0.99      0.99      0.98       750

해결 방법

비대칭 데이터는 다수 클래스 데이터에서 일부만 사용하는 언더 샘플링이나 소수 클래스 데이터를 증가시키는 오버 샘플링을 사용하여 데이터 비율을 맞추면 정밀도(precision)가 향상된다.

  • 오버샘플링(Over-Sampling)
  • 언더샘플링(Under-Sampling)
  • 복합샘플링(Combining Over-and Under-Sampling)

imbalanced-learn 패키지

imbalanced data 문제를 해결하기 위한 다양한 샘플링 방법을 구현한 파이썬 패키지

pip install -U imbalanced-learn

언더 샘플링

  • RandomUnderSampler: random under-sampling method
  • TomekLinks: Tomek’s link method
  • CondensedNearestNeighbour: condensed nearest neighbour method
  • OneSidedSelection: under-sampling based on one-sided selection method
  • EditedNearestNeighbours: edited nearest neighbour method
  • NeighbourhoodCleaningRule: neighbourhood cleaning rule
In:
from imblearn.under_sampling import *
In:
X, y = RandomUnderSampler(random_state=0).fit_sample(X0, y0)
y_pred = plot_samples(X, y)