※ 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 |