본문 바로가기

딥러닝 학습

3장 머신러닝 기초 다지기-수치 예측 (1)

반응형

3-1 선형 회귀

- 문제 해결을 위해 당뇨병 환자의 데이터 준비하기

 

1. load_diabetes() 함수로 당뇨병 데이터 준비하기

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()

 

2. 입력과 타깃 데이터의 크기 확인하기

print(diabetes.data.shape, diabetes.target.shape)

##출력: (442, 10) (442,)

 

3. 입력 데이터 자세히 보기

diabetes.data[0:3]


##출력: array([[ 0.03807591,  0.05068012,  0.06169621,  0.02187235, -0.0442235 ,
         		-0.03482076, -0.04340085, -0.00259226,  0.01990842, -0.01764613],
       			[-0.00188202, -0.04464164, -0.05147406, -0.02632783, -0.00844872,
       			 -0.01916334,  0.07441156, -0.03949338, -0.06832974, -0.09220405],
       			[ 0.08529891,  0.05068012,  0.04445121, -0.00567061, -0.04559945,
        		 -0.03419447, -0.03235593, -0.00259226,  0.00286377, -0.02593034]])

 

4. 타깃 데이터 자세히 보기

diabetes.target[:3]


##출력: array([151.,  75., 141.])

 

- 당뇨병 환자 데이터 시각화하기

1. 맷플롯립의 scatter() 함수로 산점도 그리기

import matplotlib.pyplot as plt
plt.scatter(diabetes.data[:, 2], diabetes.target)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

2. 훈련 데이터 준비하기

x = diabetes.data[:, 2]
y = diabetes.target

 

반응형

3-2 경사 하강법

- 예측값으로 올바른 모델 찾기

1. w와 b 초기화하기

w = 1.0
b = 1.0

 

2. 훈련 데이터의 첫 번째 샘플 데이터로 y_hat 얻기

y_hat = x[0] * w + b
print(y_hat)


##출력: 1.0616962065186886

 

3. 타깃과 예측 데이터 비교하기

print(y[0])


##출력: 151.0

 

4. w값 조절해 예측값 바꾸기

w_inc = w +0.1
y_hat_inc = x[0] * w_inc + b
print(y_hat_inc)


##출력: 1.0678658271705574

 

5. w값 조정한 후 예측값 증가 정도 확인하기

w_rate = (y_hat_inc - y_hat) / (w_inc - w)
print(w_rate)


##출력: 0.061696206518688734

 

※ 변화율로 가중치 업데이트 하기

w_new = w+ w_rate
print(w_new)


##출력: 1.0616962065186888

 

※ 변화율로 절편 업데이트 하기

b_inc = b +0.1
y_hat_inc = x[0] *w +b_inc
print(y_hat_inc)


##출력: 1.1616962065186887



b_rate = (y_hat_inc - y_hat) / (b_inc - b)
print(b_rate)


##출력: 1.0



b_new = b + 1
print(b_new)


##출력: 2.0

 

- 오차 역전파로 가중치와 절편을 적절하게 업데이트

1. 오차와 변화율을 곱하여 가중치 업데이트하기

err = y[0] - y_hat
w_new = w + w_rate * err
b_new = b + 1 * err
print(w_new, b_new)


##출력: 10.250624555904514 150.9383037934813

 

2. 두번째 샘플을 통해 오차를 구하기 새로운 w, b 구하기

y_hat = x[1] * w_new + b_new
err = y[1] - y_hat
w_rate = x[1]
w_new = w_new + w_rate * err
b_new = b_new + 1* err
print(w_new, b_new)


##출력: 14.132317616381767 75.52764127612664

 

3. 전체 샘플 반복하기

for x_i, y_i in zip(x,y):
  y_hat = x_i * w + b
  err = y_i - y_hat
  w_rate = x_i
  w = w + w_rate * err
  b = b + 1 * err
print(w, b)


##출력: 587.8654539985689 99.40935564531424

 

4. 그래프를 그려 알아보기

plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

5. 여러 에포크를 반복하기

for i in range(1, 100):
  for x_i, y_i in zip(x,y):
    y_hat = x_i * w + b
    err = y_i - y_hat
    w_rate = x_i
    w = w + w_rate * err
    b = b + 1 * err
print(w, b)


##출력: 913.5973364345905 123.39414383177204



plt.scatter(x, y)
pt1 = (-0.1, -0.1 * w + b)
pt2 = (0.15, 0.15 * w + b)
plt.plot([pt1[0], pt2[0]], [pt1[1], pt2[1]])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

6. 모델로 예측하기

x_new = 0.18
y_pred = x_new * w + b
print(y_pred)


##출력: 287.8416643899983



plt.scatter(x, y)
plt.scatter(x_new, y_pred)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

 

 

 

※ 해당 내용은 <Do it! 딥러닝 입문>의 내용을 토대로 학습하며 정리한 내용입니다.

반응형