AI/Deep Learning

[Tensorflow2.x] Linear Regression(선형회귀) 란?

Jeong Jeon
반응형

데이터를 해석하여 다음번에 어떤 일이 발생할지 예측하기 위해 머신러닝을 사용한다.

이 때 활용할 수 있는 가장 간단한 모델은 바로 직선이라고한다.

이때 데이터를 가장 잘 대표하는 1개의 직선은 Linear Regression이다.

Linear Regression 알고리즘은 학습 데이터가 주어졌을 때, Cost 값을 최소화 시켜주는 Hypothesis의 Parameter(W, b)를 찾는 알고리즘이다

 

1). Poinsts and Lines (점,선)

하나의 직선은 slope과 intercept에 의해 정의될 수 있다.

수식

  • y = mx +b

여기서 m이 slope이고, b가 intercept이다. Linear Regression을 수행하는 최종 목표는 입력한 데이터들을 가장 잘 표현할 수있는 m과 b를 찾아내는 것이다.

 

우리는 앞으로 H(x) = Wx + b 이렇게 사용할 것이다.

 

2). Loss

Loss란 각 데이터들에 대해 우리가 만든 model이 예측한 직선값이 얼마나 잘못되었는지 나타내는 것이다.

Loss 값은 각 점(데이터)에서 선까지의 거리를 통해 구할 수있는데, 음수가 나올수 있기 때문에 제곱을 하여 절대값으로 바꿔주어야한다.

 

그러므로!!!

각 점(데이터)과 직선 사이의 거리를 계산해서 평균을 낸 값을 최소화 했을때 그려지는 직선이 데이터를 가로지르는 직선들 중 데이터를 가장 ‘잘’ 나타냈다고 볼 수 있다. => 본 직선으로 미래 데이터를 예측하는것이다.!!!

 

자 여기서 Loss는 왜 알아야되는가?

Loss 값이 작을 수록 데이터를 잘 나타낸다고 했다. => 그럼 최소화된 Loss값을 찾아가는 과정을 알아보자

수리시간은 아니니 ...패스

이 함수가 바로 Loss(Cost)가 최저가 되는 Parameter W와 b를 찾아낼 수 있게 도와준다.

일반 적으로 Gradient Descent 알고리즘을 사용하여 최저값을 찾아간다고하는데, 일단 간단하게 그래프를 그려서 이해해보자

위 그림에서는 기울기가 음수이기 때문에 W값을 증가시키면 점점 cost 값이 낮아짐을 알 수 있다.

 

자세한 설명은 좀 생략하고... 여튼 ! 그러므로 Gradient Descent를 통해 Loss가 가장 작은! W와 b값을 얻어 낼수 있는것이다.

 

자 그럼 코드에 주석을 자세히 달아놓고 한번 쳐보자

 

  • 필요한 것들을 가져오자

  • 파라미터들을 정리해주자

  • 훈련시킬 데이터들을 정의하자
    • shape를 찍어보면 17이란걸 알 수있다.

  • 우리의 ㅁ모델이 사용할 W와 b를 정의해주자
    • W와 b값은 random값으로 설정해주었다. => 변수에 담아주자

  • 선형회귀함수를 작성한다.

  • 손실함수의 수식을 정의하고 Optimizer에게 경사하강법 알고리즘을 입혀주자

  • 최적화 시키는 학습 알고리즘을 실행하는 함수를 작성하자
    • 위 설명한 내용을 코드로 옮긴거니 참고!

  • matplotlib를 통해 시각화표현한다.
    • 우리가 처음 지정한 파라미터에 맞추어 실행

tf.Tensor( [1.6031597 1.8875159 2.1718721 2.484664 2.5415351 1.8275427 3.2780178 2.3481731 2.712149 1.3102728 2.5704877 3.5396256 2.1235316 2.8173606 2.2116818 3.1464386 1.5514586], shape=(17,), dtype=float32) step: 200, loss: 0.154151, W: 0.258506, b: 0.750091

tf.Tensor( [1.6131835 1.8946302 2.1760767 2.485668 2.5419571 1.8352704 3.2709038 2.3505735 2.7108252 1.3232934 2.5706136 3.5298347 2.1282308 2.8149605 2.2154791 3.140671 1.5620114], shape=(17,), dtype=float32) step: 400, loss: 0.153969, W: 0.255861, b: 0.768844

tf.Tensor( [1.6193483 1.8990054 2.1786625 2.4862854 2.5422168 1.8400233 3.2665288 2.35205 2.710011 1.3313016 2.5706909 3.5238132 2.131121 2.8134842 2.2178144 3.1371238 1.5685016], shape=(17,), dtype=float32) step: 600, loss: 0.153900, W: 0.254234, b: 0.780377

tf.Tensor( [1.6231397 1.9016963 2.1802528 2.486665 2.542376 1.8429463 3.2638378 2.3529577 2.7095103 1.3362266 2.5707383 3.5201097 2.1328983 2.8125763 2.2192507 3.134942 1.5724931], shape=(17,), dtype=float32) step: 800, loss: 0.153874, W: 0.253233, b: 0.787470

tf.Tensor( [1.6254718 1.9033514 2.181231 2.4868987 2.5424745 1.8447441 3.2621827 2.3535166 2.7092023 1.3392558 2.5707676 3.517832 2.1339915 2.812018 2.2201343 3.1336005 1.5749482], shape=(17,), dtype=float32) step: 1000, loss: 0.153864, W: 0.252618, b: 0.791833

 

독학하기 어렵지만... 재밌다...

반응형