참고도서 : 모두의 딥러닝, 제2판(조태호, 2020)
개발환경 : google colab
데이터를 입력하고 분석하는 과정을 training이라고한다. 텅빈 좌표평면에 data를 하나씩 놓고 이를 분류하는 과정이다.
이 data들을 분류하는 과정을 training하여 분류 경계선을 찾는 것이 machine learning의 목표다.
# 파일 선택을 통해 예제 데이터를 내 컴퓨터에서 불러옵니다.
from google.colab import files
uploaded = files.upload()
my_data = 'ThoraricSurgery.csv'
# keras function
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# library
import numpy as np
import tensorflow as tf
# 라이브러리는 가져올 때 import를 사용
# 실행마다 같은 결과 출력하기 위해 설정한다.
np.random.seed(3)
tf.random.set_seed(3)
# patient data upload
Data_set = np.loadtxt(my_data, delimiter = ",")
# delimiter가 data구분해주는 문자
# X,Y dataset distributing
X = Data_set[:,0:17]
Y = Data_set[:,17]
# deeplearning structure setting and run
model = Sequential()
model.add(Dense(30, input_dim = 17, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
# deeplearning running
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X, Y, epochs = 100, batch_size = 10)
google colab의 경우 만드시 colab 내부 라이브러리를 이용해 data file을 호출해야한다. 안그럼 에러뜬다...
from google.colab import files
uploaded = files.upload()
my_data = 'ThoraricSurgery.csv'
딥러닝에서 가장 기본적인 연산 두가지 : 선형회귀, 로지스틱회귀 (linear regression, logistic regression)
예측선을 긋는다는 것이 결국엔 선형회귀이다.
하나의 종속변수와 이에 영향을 주는 독립변수가 있다고 할 때
독립변수가 하나면 simple linear regression
여러개면 multiple linear regression
예측선은 y = ax + b로 표현될 것이다. 여기서 a, b의 값을 알아야한다.
a, b 값을 구하는 방법 중 자주 쓰이는 방법은 아니지만... 최소제곱법 공식을 소개한다. (Least_Square_Method, LSM)
a = net(x편차*y편차)/net(x편차^2)
b = y의평균 - (x의평균*a)
import numpy as np
# x 값과 y값
x=[2, 4, 6, 8]
y=[81, 93, 91, 97]
# x와 y의 평균값
mx = np.mean(x)
my = np.mean(y)
print("x의 평균값:", mx)
print("y의 평균값:", my)
# 기울기 공식의 분모
# 아래 링크 참고할 것
# https://stackoverflow.com/questions/47464211/what-does-the-x-for-x-in-syntax-mean
# https://web.archive.org/web/20180309053826/http://www.secnetix.de/olli/Python/list_comprehensions.hawk
divisor = sum([(mx - i)**2 for i in x])
# 기울기 공식의 분자
def top(x, mx, y, my):
d = 0
for i in range(len(x)):
d += (x[i] - mx) * (y[i] - my)
return d
dividend = top(x, mx, y, my)
print("분모:", divisor)
print("분자:", dividend)
# 기울기와 y 절편 구하기
a = dividend / divisor
b = my - (mx*a)
# 출력으로 확인
print("기울기 a =", a)
print("y 절편 b =", b)
# x의 평균값: 5.0
# y의 평균값: 90.5
# 분모: 20.0
# 분자: 46.0
# 기울기 a = 2.3
# y 절편 b = 79.0
divisor = sum([(mx - i)**2 for i in x])
이 부분에 관해선 아래 링크를 참고하는 것이 좋을 것이다.
stackoverflow.com/questions/47464211/what-does-the-x-for-x-in-syntax-mean
web.archive.org/web/20180309053826/www.secnetix.de/olli/Python/list_comprehensions.hawk
최소제곱법은 입력이 여러개일 때에는 사용하기 어렵다. 그래서 다중 입력이 발생할 경우 선을 긋고 그 선의 오차값을 iterational한 방법으로 줄여나간다. 이를 평균 제곱 오차(Mean Square Error, MSE)라고 한다.
평균 제곱 오차를 사용하는 과정은 일단 선긋고 점점 오차를 맞춰가는 과정을 따른다.
오차를 보정한 선이 앞선 선보다 더 좋은지 판단하는 과정이 필요하다 = 오차가 작은 쪽으로 바꾸는 알고리즘이 필요하다 = 편차 제곱의 합이 작아지게 한다
오차의 합 = NET((y - y_avg)^2)
이 식을 또 평균으로 나눠주면 평균 제곱 오차(MSE)라고 한다..
선형회귀는 이 MSE를 찾아 경사하강법(gradient descent)를 통해 작게 만들어주는 작업.
import numpy as np
#가상의 기울기 a와 y 절편 b
fake_a_b=[3,76]
# x 값과 y값
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
# y=ax + b에 a,b 값 대입하여 결과를 출력하는 함수
def predict(x):
return fake_a_b[0]*x + fake_a_b[1]
# MSE 함수
# y, y_hat은 array가 입력될 수도 있다.
def mse(y, y_hat):
return ((y - y_hat) ** 2).mean()
# MSE 함수를 각 y값에 대입하여 최종 값을 구하는 함수
def mse_val(predict_result,y):
return mse(np.array(predict_result), np.array(y))
# 예측값이 들어갈 빈 리스트
predict_result = []
# 모든 x값을 한 번씩 대입하여 predict_result 리스트완성.
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))
# 최종 MSE 출력
print("MSE 최종값: " + str(mse_val(predict_result,y)))
# 출력
# 공부시간=2, 실제점수=81, 예측점수=82
# 공부시간=4, 실제점수=93, 예측점수=88
# 공부시간=6, 실제점수=91, 예측점수=94
# 공부시간=8, 실제점수=97, 예측점수=100
# MSE 최종값: 11.0
'AI > 모두의 딥러닝' 카테고리의 다른 글
[Deep Learning : 딥러닝] 오차 역전파와 XOR 문제 (0) | 2021.06.09 |
---|---|
[Deep Learning : 딥러닝] 퍼셉트론과 XOR 문제 (0) | 2021.06.09 |
[Deep Learning : 딥러닝] 로지스틱 회귀(Logistic Regression) (0) | 2021.05.16 |
[Deep Learning : 딥러닝] 다중 선형 회귀(Multiple linear regression) (0) | 2021.05.16 |
[Deep Learning : 딥러닝] 경사하강법, 선형 회귀(Gradient descent, Linear Regression) (0) | 2021.05.15 |