본문 바로가기

Data/Data Science

[ML] Semi-Supervised Learning (label_propagation)

반응형

머신러닝에서는 크게 두가지로 나뉘는데

1. 지도학습(supervised learning)

2. 비지도학습(unsupervised learning)

 

지도학습중에서 추가로 나누자면 준지도학습(semi-supervised learning)이란 기법이있다.

이 기법은 우리가 흔히 데이터를 다룰때 일부한테만 정답지가 있고 일부한테는 정답지가 없을때 사용하는것인데

예를 들어서 다음 그림을 보자

위에 라벨링이 되어있는 데이터를 볼때 점선처럼 두개 부류로 나눌수가있다. 하지만 데이터가 적고, 단순한 모양으로인해 실제 데이터에서는 제대로 분류(작동)를 못할수가있다.

이때 추가로 라벨링이 되어있지않은 데이터를 넣을때 밑에그림과 같이 데이터 분포도를 띄우게되고. 여기서 semi-Supervised Learning을 하게되면 밑그림의 점선과 같이 분류하게 된다.

 

이러한 학습을 semi-supervised learning이라고 말한다.

 

나또한 데이터를 다룰때 라벨링이 안되어있는 경우가 많은데 해당 기법을 사용하면 라벨링을 편하게 나눌수있을꺼같다.

python 코드는 다음과 같다.

sklearn 라이브러리에 semi_supervised 클래스의 label_propagation함수를 사용하였다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
from sklearn.semi_supervised import label_propagation

rng = np.random.RandomState(0)

iris = datasets.load_iris()

X = iris.data[:, :2]
y = iris.target

# step size in the mesh
h = .02

y_30 = np.copy(y)
y_30[rng.rand(len(y)) < 0.3] = -1
y_50 = np.copy(y)
y_50[rng.rand(len(y)) < 0.5] = -1
# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
ls30 = (label_propagation.LabelSpreading().fit(X, y_30),
        y_30)
ls50 = (label_propagation.LabelSpreading().fit(X, y_50),
        y_50)
ls100 = (label_propagation.LabelSpreading().fit(X, y), y)
rbf_svc = (svm.SVC(kernel='rbf', gamma=.5).fit(X, y), y)

# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

# title for the plots
titles = ['Label Spreading 30% data',
          'Label Spreading 50% data',
          'Label Spreading 100% data',
          'SVC with rbf kernel']

color_map = {-1: (1, 1, 1), 0: (0, 0, .9), 1: (1, 0, 0), 2: (.8, .6, 0)}

for i, (clf, y_train) in enumerate((ls30, ls50, ls100, rbf_svc)):
    # Plot the decision boundary. For that, we will assign a color to each
    # point in the mesh [x_min, x_max]x[y_min, y_max].
    plt.subplot(2, 2, i + 1)
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    # Put the result into a color plot
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
    plt.axis('off')

    # Plot also the training points
    colors = [color_map[y] for y in y_train]
    plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors='black')

    plt.title(titles[i])

plt.suptitle("Unlabeled points are colored white", y=0.1)
plt.show()
반응형