SW 개발

[스터디] 머신러닝 입문 – 03 : regression model

. . . 2018. 7. 5. 10:34
반응형

본자료는 머리털나고 처음으로 머신러닝을 공부하는 입장에서 정리한 머신러닝 스터디노트입니다.

  • 오픈소스 강의를 들으면서 정리 및 요약한 자료입니다.
  • 제가 이해한 내용을 중심으로 작성했기 때문에 개인적인 의견 및 오류가 있을수있습니다.
  • 원본 강의는 항상 링크를 올립니다. 본강의와 함께 스터디하시는걸 추천드립니다.

머신러닝_기본_스터디 리스트 :

강의개요

강의자료

강의요약

predicting exam score : regression

img

예) 공부한 시간대비 점수와의 상관관계

  • supervised learning 을 돌린다
    • regression 러닝을 시킨다. (0~100 넓은 범위)
    • x 는 input / y 는 output
  • 입력 및 학습을 하면 어떤 모델을 스스로 만든다.
    • 만약 7시간을 공부한 학생이 있다면… 예측 모델을 통해서… 점수를 예측가능하다.

regression 모델

x 와 y 의 상관관계를 굉장히 간단화 시키면 다음과 같이 표현할수있다,

img

아주 간략화한 regression 데이터

x y 와의 상관관계를 그래프로 표현하면 다음과 같다.

img

데이터를 실제화 시킴

가설을 세운다.

linear hypothesis (리니어한 가설)

위의 모델에 대해서 가설을 세우면…

  • “아무래도 해당 모델은 linear 한 데이터일것” 이라고 가설을 세운다.

linear 한 데이터들은 실생활에 굉장히 많다.

  • 집의 크기가 클수록 가격은 크다.
  • 공부를 오래하면 점수가 높다.

그럼… 위와같은 가설을 세웠으면 어떤 linear 모델에 맞는지 찾는과정이 필요하다.

img

데이터를 기준으로 linear 한 가설들을 세워본다. (1차원 데이터가설)

이전 그래프를 보면… 각종 가설을 바탕으로 해서 여러개의 linear 모델을 세울수있다.

  • 가설의 모델은 H(x) = Wx+b 이라고 가설을 세운다.
    • 1차원 모델일것이다.
    • W 값 과 b 의 값에 따라 모두 표현한다.
    • 세운가설중에 어떤 W 와 b 를 넣어야 할까?

어떤가설이 좋을까?

어떤가설을 세우고, 그 가설과 실제 데이터간의 상관관계를 본다.

img

데이터와 가설간의 거리

  • 거리가 멀면 나쁜가설 거리가 가까우면 좋은…
    • 그래서 거리를 계산한다.

Cost function

이와같이 실제 데이터와 가설을 세운것에 대한 거리(오차?)를 계산하는것을 cost function / loss function 이라고한다.

img

cost function 에 대한 계산 : 제곱을 해주는게 좋다.

  • 일단 위와같이 cost functiion 을 계산할때는 H(x)-y 처럼 계산하지 않는다.
    • 음수 혹은 양수가 나올수있다.
  • cost function 을 계산할때는 제곱을 한다.
    • (H(x)-y)^2
      • 항상 양수로 나오기 때문에 비교하기 좋다.
      • 제곱하기 때문에 차이가 많이날수록 가중치가 발생하여 비교가 더 쉽다.

3개의 데이터의 cost function 을 수식으로 나타내면… 다음과 같다.

img

cost function 의 수식화

  • 각각의 포인트의 cost functinon 의 값을 3개 모두 구해서 평균을 한다.

만약 3개가 아니라 더 많이 구하는것의 일반화 가능.

cost function 의 결론?

cost function 은 다음과 같이 표현가능하다.

img

위의 예제에서… hypothesis 함수는 다음과 같다.

img

즉 H() 부분에 hypothesis 함수를 대입하면 된다.

img

linear regression 의 goal

즉…일반화를 시키면…

linear regression 의 학습이란.. W와 b를 대입했을때 나오는 값이 가장작은것을 구하는과정이다.

img

linear regression 의 학습 일반화

img

linear regression 의 학습 일반화 - minimized : 학습의 목표

실습

linear regression 의 구현

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/ipynb/lab-02-1-linear_regression.ipynb

img

Lab-02-1 linear regression

  • import tensorflow as tf
  • tf.set_random_seed(777) # for reprducibilty

X and Y data

일단, 실제 x 와 y 값을 선언한다. (셈플데이터 supervised model)

  • x_train = [1, 2, 3]
  • y_train = [1, 2, 3]

  • train 의 뜻

    • 바뀔수있다. 라는 뜻…

Variable

변수를 세운다.

img

# Try to find value for W and b to compute y_data = x_data * W + b
# We know that W should be 1 and b should be 0
# But let's TensorFlow figure it out
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
  • tf.Variable : 텐스플로에서 자체적으로 바뀔수있다는 값들을 의미한다.
    • 즉 텐서플로는 자기자신의 값을 업데이트 하여 그래프를 스스로 바꾼다.
    • trainable 한 variable 이다.
  • tf.random_normal([1]) : 텐서플로에서 W와 b에 들어갈 값을 일일이 줄수없으니 랜덤한 1차원 값을 주도록 한다.

Our Model

모델(그래프)을 코딩한다.

# Out hypothesis XW+b
hypothesis = x_train * W + b
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
hypothesis = x_train * W + b

img
- linear regression 의 모델을 코딩화 시킨것이다.

tf.square(hypothesis - y_train)

  • cost 함수를 코딩화 시킨것이다.
    • 텐서플로 안의 함수를 통해서 위의 내용을 간단히 표현가능
  • 특이사항은.. H(x) 부분에 바로 hypothesis 변수 (linear regression 모델함수) 를 넣었다 ㄷㄷ

tf.reduce_mean()

  • 평균을 내는 함수.

ex) 1.2.3.4 의 평균을 구한다고 하면..

Minimize

위에서 코딩한 값을 가장 작은 값을 구한다.

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
  • tf.train.GradientDescentOptimizer()
    • 텐서플로의 미니마이즈 작업의 여러방법중하나
  • optimizer.minimize(cost)
    • 텐서플로의 W 와 b를 스스로 조정하면서 미니마이즈한다.

여기까지 그래프를 구현한것이다.

Prepare session

그래프의 실행

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
  • 그래프에 세션을 연결하여 실행시키기전에.. 우리가 정의한 variable 을 초기화해야한다.
    • tf.global_variables_initializer()

Fit the line

for step in range(2001):
  sess.run(train)
if step % 200 == 0:
  print(step, sess.run(cost), sess.run(W), sess.run(b))
  • train 일종의 하나의 node 다
    • sess.run(train) : train 노드를 실행한다.

img

  • 결국 위와같은 그래프를 만든거다.
  • train 을 실행시킨다는거는 아래의 W, b 까지 내려가서 값을 조정하면서 실행한다는것이다.

실행결과

실행한 결과는… 다음과 같다.

실행할수록 점점 값이 근사치에 가까워진다.

0 2.82329 [ 2.12867713] [-0.85235667]
200 0.0699668 [ 1.30721486] [-0.69837117]
400 0.0267167 [ 1.18983996] [-0.4315508]
600 0.0102017 [ 1.11730957] [-0.26667204]
800 0.00389553 [ 1.07249022] [-0.16478711]
1000 0.0014875 [ 1.04479456] [-0.10182849]
1200 0.000567998 [ 1.02768016] [-0.06292368]
1400 0.000216891 [ 1.01710474] [-0.03888312]
1600 8.28196e-05 [ 1.01056981] [-0.02402747]
1800 3.16242e-05 [ 1.00653136] [-0.01484741]
2000 1.20761e-05 [ 1.00403607] [-0.00917497]

Learns best fit W:[ 1.], b:[ 0.]

0 3.51465 [-0.03875808] [ 0.40560108]
200 0.0286106 [ 0.80354649] [ 0.44658491]
400 0.010925 [ 0.87860364] [ 0.27596244]
600 0.00417169 [ 0.92498434] [ 0.17052816]
800 0.00159296 [ 0.95364493] [ 0.10537602]
1000 0.000608266 [ 0.97135544] [ 0.06511588]
1200 0.000232263 [ 0.98229945] [ 0.04023758]
1400 8.86917e-05 [ 0.98906201] [ 0.02486444]
1600 3.38653e-05 [ 0.99324113] [ 0.01536462]
1800 1.2932e-05 [ 0.99582338] [ 0.00949448]
2000 4.9383e-06 [ 0.99741906] [ 0.00586706]

LINEAR REGRESSION 의 구현2 - placeholder

위의 예제를 placeholder를 사용하여 구현할수있다.

  • placeholder : 상수값이 아닌 변수처럼 선언하여 계속 변화시킬수있다.

img

  • 기존의 코드와 같으나 데이터를 placeholder 를 지정한다음에..
  • 실행시점에서 feed_dict=[] 부분을 통해서 데이터를 입력해준다.
  • 실행할때 sess.run([...]) 와 같이 리스트로 한번에 실행할 수 있다.

regression 모델에서 placehodler 를 사용하는 이유

만들어진 모델을 바로 활용한다. 펙터값을 지정하면서 손쉽게 이용가능

img

  • 위의 예제는 … lineina 모델을 먼저 모델을 만들어놓은 다음에
  • x, y 값을 적절히 변경시키면서 그 모델을 바로 사용가능하다.

결론

img

  1. build graph
    • 그래프를 코드로 작성하고..
  2. feed data and run graph
    • 작성한 그래프에 placeholder 의 자료형으로 된곳에 feed_dict 정보로 데이터를 넘겨준다.
  3. update variable in the graph
    • 그래프를 스스로 업데이트하면서 근사치에 가까워질것이다.
반응형