2015년 8월 29일 토요일

대상을 새로운 차원으로 사상 시키는 SVM 비선형 분류 기법

1편 "대상을 바라보는 시선과 정량적 대상 비교"에서 우리의 시선과 다른 차원을 받아들이는 연습이 되었다면, 차원을 응용하는 다음 예제를 보자.

참고 : https://ko.wikipedia.org/wiki/서포트_벡터_머신

1. 2차원의 purple/green으로 분류된 학습 데이터를 SVM 비선형 분류 기법을 통해 학습 모델을 만든다.
* 커널(Kernel)은 RBF 방사형 함수를 사용하고, 새로운 차원으로 사상될 값의 크기를 시각적으로 표현하기 위해 확률값을 출력하도록 옵션을 주었다.
2. 커널함수의 실체를 시각화 하기 위해 그리드(Grid)한 테스트 데이터를 만들어, 실제 사상되는 값을 통해 3D 화면을 그린다.
* 커널(Kernel)은 새로운 차원 공간으로의 매핑 방법을 뜻한다.  OS가 커널을 통해서 S/W가 H/W라는 다른 차원을 조절하는 것도 같은 의미로 보인다.

참조 라이브러리 로딩
In [2]:
import pandas as pd
from sklearn import svm
from mpl_toolkits.mplot3d import Axes3D
학습(트레이닝) 데이터 생성
In [3]:
X1 = pd.DataFrame([(1,1),(1,-1),(-1,1),(-1,-1)],columns=['x','y'])
X1['c'] = 'purple'
X2 = pd.DataFrame([(2,2),(2,-2),(-2,2),(-2,-2)],columns=['x','y'])
X2['c'] = 'green'
df1 = pd.concat([X1,X2])
2D 플롯을 통해서 시각화
In [4]:
scatter(x=df1['x'],y=df1['y'],color=df1['c'],s=100)
axhline(y=0,xmin=-3,xmax=3,color='black')
axvline(x=0,ymin=-3,ymax=3,color='black')
text(x=3,y=0,s=' X Axis ')
text(x=0,y=3,s=' Y Axis ')
axis('off')
Out[4]:
(-3.0, 3.0, -3.0, 3.0)

학습 데이터를 서포트 벡터 머신(SVM)을 통해서 분류(Classification) 모델 생성
In [5]:
# 커널 함수로는 방사형을 사용
clf = svm.SVC(probability=True,kernel='rbf')
clf.fit(df1[['x','y']], df1['c'])  
Out[5]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  kernel='rbf', max_iter=-1, probability=True, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
분류 모델을 통한 데이터 분류 및 시각화를 위한 확률값 추출
In [6]:
# 시각화를 위해 학습 데이터에 대한 확률값(z축) 반영하기
df1['z'] = df1.apply(lambda r: clf.predict_proba((r[0],r[1]))[0][1],axis=1)
# 커널 함수에 대한 시각적인 이해를 위해 그리드(Grid)한 테스트 데이터 분류
net = []
for i in arange(-3,3,.1):
    for j in arange(-3,3,.1):
        net.append((i,j,clf.predict((i,j))[0],clf.predict_proba((i,j))[0][1]))
df2 = pd.DataFrame(net,columns=['x','y','c','z'])
In [7]:
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs=df1['x'],ys=df1['y'],zs=df1['z'],color=df1['c'],s=100)
ax.scatter(xs=df2['x'],ys=df2['y'],zs=df2['z'],color=df2['c'],alpha=.1,marker='.')
ax.set_zlabel('Z Axis')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
Out[7]:
<mpl_toolkits.mplot3d.art3d.Text3D at 0x7f2a085a7550>

SVM은 Z라는 새로운 차원 공간을 만들고 학습 데이터를 분류할 수 있는 최적의 커널함수 계수(coef)와 함께 모델을 만들었다. 모델(model)을 통한 분류(classification)의 확률치가 가장 높은 분류 군집을 예측치(predict)로 제공한다. 경계의 데이터는 작은 차이에도 다른 군집으로 들어갈 수 있으니, 학습 데이터의 정확성이 중요하다. 일반적으로, 학습형 분류에 있어서 학습 데이터의 가치는 80% 이상이라고 필자는 주장한다.

차원(dimension)의 계념은 우리의 일상을 정량화 할 수 있고, 다양한 기법들을 활용해 문제 해결에도 영향을 주며, 학문의 벽을 허무는 연결고리에 대한 아이디어를 준다. 일상과 IT의 경계의 연결고리를 발견하게 해준 Jerry 선배님께 이 글을 바친다.

0 개의 댓글:

댓글 쓰기