Multi-class

ro_ot ㅣ 2020. 1. 29. 12:21

※ multi-class 클래스가 2개보다 많을 때

* 클래스 2개 초과 될때

  • 2진 분류(클래스 2개일때)에서는 타겟(찾고 싶은 y)만 찾으려고 했따.
  • x > model(x) = x의 클래스가 1일 확률, x 가 클래스 0일 확률 = 1 - p(x, y=1)
  • 클래스 갯수 k=3 개다.
  • model(x) = x가 클래스 0일 확률, x가 클래스 1일 확률, x가 클래스 2일 확률
import numpy as np
def sigmoid(x):
    return 1 / (1+np.exp(-x))
np.exp(0), np.exp(1), np.exp(2) 
# exponencial 지수 함수
# exp와 ()사이에는 2.71이 있다.

→ (1.0, 2.7182818284590451, 7.3890560989306504)

np.exp(-1), np.exp(-2), np.exp(-3) # exponencial 지수 함수

 (0.36787944117144233, 0.1353352832366127, 0.049787068367863944)

np.set_printoptions(6, suppress=True)
y = [0, 1]
# h =WX + b
# y = sigmoid(h)
h = np.array([-10, 10])
sigmoid(h)

 array([ 0.000045, 0.999955])

# 클래스 3개가 존재할 때 한 샘플에 대해서 다음과 같은 예측이 나왔습니다.
h = np.array([[2.0, 1.0, 0.1]]) # 한 샘플에 대한 예측 값, 확률로 바꾸자
norm = h/np.sum(h)
norm

 array([[ 0.645161, 0.322581, 0.032258]])

h_e = np.exp(h)
h, h_e

 (array([[ 2. , 1. , 0.1]]), array([[ 7.389056, 2.718282, 1.105171]]))

softmax = h_e/np.sum(h_e)
softmax

 array([[ 0.659001, 0.242433, 0.098566]])

  y   = [0,1,2]
y_hot = [[1,0,0],[0,1,0],[0,0,1]] # one-hot 인코딩
  h   = [[0.999,0.0001, 0],[0,0.99,0],[0.001,0.1,0.88]] # 정확한 예측이 나왔다

* 붓꽃 데이터 전부를 뉴럴 네트워크로 학습시켜 봅시다

from sklearn.datasets import load_iris
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression
x, y = load_iris(True)
x.shape, y.shape, set(y)

 ((150, 4), (150,), {0, 1, 2})

x_norm = (x - np.min(x, 0))/(np.max(x,0) - np.min(x,0))
model = LogisticRegression(max_iter=3000). fit(x_norm, y) # underfitting 과소적합
model.score(x_norm, y)#accuracy

 0.84666666666666668

model.coef_, model.intercept_

 (array([[-1.447303, 2.28175 , -3.147653, -3.114571], [-0.040715, -2.750697, 0.987238, -0.352712], [ 0.787822, -0.774795, 1.898194, 3.049504]]), array([ 1.081347, 0.165013, -3.331455]))

# 첫번째 샘플로 테스트해봅시다.
x0 = x_norm[0]
y0 = y[0]
x0, y0

 (array([ 0.222222, 0.625 , 0.067797, 0.041667]), 0)

# y = (softmax)WX + b
h = np.sum(model.coef_ * x0, axis=1) + model.intercept_
h # 점수

 array([ 1.842644, -1.510985, -3.384876])

h_e = np.exp(h)
h_e / np.sum(h_e)

 array([ 0.961239, 0.033602, 0.005159])

from sklearn.datasets import load_digits
from sklearn.linear_model import LinearRegression
model = LinearRegression()
x, y = load_digits(return_X_y=True)
x.shape, y.shape, len(x)
m = len(x)//2
x_train = x[:m]
y_train = y[:m]
x_test = x[m:]
y_test = y[m:]

* 학습용 : 테스트용 50:50 나눠서 학습용으로만 학습, 테스트셋 성능을 측정해보세요 성능이 95%이상 되도록 레이어를               디자인

# 히든 레이어를 디자인 할 수 있습니다.
model = MLPClassifier(hidden_layer_sizes=(124,90,60),max_iter=300).fit(x_train,y_train)
model.score(x_train,y_train), model.score(x_test, y_test)

 (1.0, 0.95439377085650723)

x0 = x[0]
x0

 array([ 0., 0., 5., 13., 9., 1., 0., 0., 0., 0., 13., 15., 10., 15., 5., 0., 0., 3., 15., 2., 0., 11., 8., 0., 0., 4., 12., 0., 0., 8., 8., 0., 0., 5., 8., 0., 0., 9., 8., 0., 0., 4., 11., 0., 1., 12., 7., 0., 0., 2., 14., 5., 10., 12., 0., 0., 0., 0., 6., 13., 10., 0., 0., 0.])

import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(x[0].reshape((8,8)), cmap='gray')

x0 = x[0].reshape((8,8))
x1 = x[1].reshape((8,8))
x2 = np.concatenate((x0,x1), axis=1)
x0.shape, x1.shape, x2.shape

 ((8, 8), (8, 8), (8, 16))

plt.imshow(x2, cmap='gray')

# 데이터 2개 준비
x0 = np.concatenate((x[0].reshape((8,8)),x[1].reshape((8,8))), axis=1)
x1 = np.concatenate((x[2].reshape((8,8)),x[3].reshape((8,8))), axis=1)
y0 = y[:2]
y1 = y[2:4]
# 데이터 묶기
x0 = np.reshape(x0,[-1])
x1 = np.reshape(x1,[-1])
x_train = np.stack((x0, x1),0)
y_train = np.stack((y0, y1),0)
x_train.shape, y_train.shape

 ((2, 128), (2, 2))

from sklearn.linear_model import LogisticRegression
from sklearn.multioutput import MultiOutputClassifier
model = MultiOutputClassifier(MLPClassifier()).fit(x_train, y_train)
model.predict(x_train), model.score(x_train, y_train)

 (array([[0, 1], [2, 3]]), 1.0)

# x0 = (8,8),(8,8) > (8,2,8)
plt.title('Y' + str(y1))
plt.imshow(x1.reshape((8,16)))

☆ 문제

from sklearn.neural_network import MLPClassifier
from sklearn.multioutput import MultiOutputClassifier
model = MultiOutputClassifier(MLPClassifier()).fit(x_train, y_train)
model.predict(x_train), model.score(x_train, y_train)
x, y = load_digits(return_X_y=True)
m = len(y)//2
x_train = x[:m]
y_train = y[:m]
x_test = x[m:m*2]
y_test = y[m:m*2]
x_train.shape, y_train.shape

 ((898, 64), (898,))

 

* for 문 사용

# for 으로 테이터 만들기 github.com/sogangori/choongang20
x_list = []
y_list = []
for i in range(len(y_train)//2):
    xx= np.stack((x_train[i*2], x_train[i*2+1]),0)
    yy= np.stack((y_train[i*2], y_train[i*2+1]),0)
    x_list.append(xx.reshape([-1]))
    y_list.append(yy.reshape([-1]))
x_train = np.stack(x_list, 0)
y_train = np.stack(y_list, 0)
x_train.shape, y_train.shape

 ((449, 128), (449, 2))

# reshape만으로 데이터 만들기

x_train = np.reshape(x_train, [m//2, -1])
y_train = np.reshape(y_train, [m//2, 2])
x_test = np.reshape(x_test, [m//2, -1])
y_test = np.reshape(y_test, [m//2, 2])
x_train.shape, y_train.shape, x_test.shape, y_test.shape

 ((449, 128), (449, 2), (449, 128), (449, 2))

mlp = MLPClassifier(hidden_layer_sizes=(1000,100), max_iter=1000)
model = MultiOutputClassifier(mlp).fit(x_train, y_train)
model.score(x_train, y_train), model.score(x_test, y_test)

 (1.0, 0.68819599109131402)

'Deep learning > Code' 카테고리의 다른 글

gradientDescent  (0) 2020.01.29
Convolution  (0) 2020.01.29
분류2 classification  (0) 2020.01.28
분류 classification  (0) 2020.01.23
2020_01_23 KNN  (0) 2020.01.23