두 번째 딥러닝 스터디 시간이 찾아왔따!
이번에도 주피터 노트북을 사용해 실습까지 이쁘게 무엇보다 꼼꼼히 진행해 보았다.
전 시간에는 최소 제곱법을 이용해 기울기 값과 y절편의 값을 구해 방정식을 세우고,
예측을 진행하는 단일 선형 회귀를 진행했다.
이번 시간에는 앞써 진행했었을 때의 오차를 떠올리며!
어떻게 오차를 최소화 시킬 수 있는가? 에 대한 solution 경사하강법에 다루고, 다중 선형 회귀 실습을 진행해 보았다.
실습 과정)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 공부 시간 x와 y의 성적 리스트 만들기
data = [[2,81],[4,93],[6,91],[8,97]]
# x와 y 리스트 선언
x = [i[0] for i in data]
y = [i[1] for i in data]
# 그래프로 나타내기
plt.figure(figsize=(8,5))
plt.scatter(x,y)
plt.show()
# 리스트로 되어 있는 x와 y 값을 넘파이 배열로 바꾸기
# => 인덱스를 주어 하나씩 불러와 계산하기 위해
x_data = np.array(x)
y_data = np.array(y)
# 기울기 a와 절편 b 초기화
a = 0
b = 0
# 학습률 정하기
lr = 0.03
# 몇 번 반복될지 설정
epochs = 2001
# 경사하강법 시작
for i in range(epochs): # 에포크 수만큼 반복
y_pred = a * x_data + b # y를 구하는 식 세우기
error = y_data - y_pred # 실제값 - 예측값, 오차를 구하는 식
# 평균 제곱 오차를 a로 미분한 결과
a_diff = -(2/len(x_data)) * sum(x_data *(error))
# 편균 제곱 오차를 b로 미분한 결과
b_diff = -(2/len(x_data)) * sum(error)
a = a - lr * a_diff # 미분 결과에 학습률 곱한 후 기존의 a 값 업데이트
b = b - lr * b_diff # 미분 결과에 학습률 곱한 후 기존의 b 값 업데이트
# 100번 반복될 때마다 현재의 a 값, b 값 출력
if i%100 == 0:
print("epoch=%.f, 기울기=%.04f, 절편=%.04f" %(i,a,b))
# 앞써 구한 기울기와 절편을 이용해 그래프를 다시 그리기
y_pred = a * x_data + b
plt.scatter(x,y)
plt.plot([min(x_data),max(x_data)],[min(y_pred),max(y_pred)])
plt.show()
|
cs |
실습 과정)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d # 3D 그래프 그리는 라이브러리
# 공부 시간 x와 y의 성적 리스트 만들기
data = [[2,0,81],[4,4,93],[6,2,91],[8,3,97]]
# x와 y 리스트 선언
x1 = [i[0] for i in data]
x2 = [i[1] for i in data]
y = [i[2] for i in data]
ax = plt.axes(projection='3d') # 그래프 유형 정하기
ax.set_xlabel('study_hours')
ax.set_ylabel('private_class')
ax.set_zlabel('Score')
ax.scatter(x1,x2,y)
plt.show()
x1_data = np.array(x1)
x2_data = np.array(x2)
y_data = np.array(y)
# 기울기 a와 절편 b 값 초기화
a1=0
a2=0
b=0
# 학습률
lr = 0.02
# 반복 횟수 + 1
epochs = 2001
# 경사하강법 시작
for i in range(epochs):
y_pred = a1 * x1_data + a2*x2_data +b # y 구하는 식 세우기
error = y_data - y_pred #오차 구하는 식
# 평균 제곱 오차를 a로 미분한 결과
a1_diff = -(2/len(x1_data)) * sum(x1_data *(error))
a2_diff = -(2/len(x2_data)) * sum(x2_data *(error))
# 편균 제곱 오차를 b로 미분한 결과
b_diff = -(2/len(x1_data)) * sum(y_data - y_pred)
a1 = a1 - lr * a1_diff # 미분 결과에 학습률 곱한 후 기존의 a1 값 업데이트
a2 = a2 - lr * a2_diff # 미분 결과에 학습률 곱한 후 기존의 a2 값 업데이트
b = b - lr * b_diff # 미분 결과에 학습률 곱한 후 기존의 b 값 업데이트
if i%100 == 0:
print("epoch=%.f, 기울기1=%.04f, 기울기2=%.04f, 절편=%.04f, a1편미분=%.04f,a2편미분=%.04f, b편미분=%.04f" %(i, a1 ,a2, b,a1_diff,a2_diff,b_diff))
#참고 자료, 다중 선형회귀 '예측 평면' 3D로 보기
import statsmodels.api as statm
import statsmodels.formula.api as statfa
#from matplotlib.pyplot import figure
X = [i[0:2] for i in data]
y = [i[2] for i in data]
X_1=statm.add_constant(X)
results=statm.OLS(y,X_1).fit()
hour_class=pd.DataFrame(X,columns=['study_hours','private_class'])
hour_class['Score']=pd.Series(y)
model = statfa.ols(formula='Score ~ study_hours + private_class', data=hour_class)
results_formula = model.fit()
a, b = np.meshgrid(np.linspace(hour_class.study_hours.min(),hour_class.study_hours.max(),100),
np.linspace(hour_class.private_class.min(),hour_class.private_class.max(),100))
X_ax = pd.DataFrame({'study_hours': a.ravel(), 'private_class': b.ravel()})
fittedY=results_formula.predict(exog=X_ax)
fig = plt.figure()
graph = fig.add_subplot(111, projection='3d')
graph.scatter(hour_class['study_hours'],hour_class['private_class'],hour_class['Score'],
c='blue',marker='o', alpha=1)
graph.plot_surface(a,b,fittedY.values.reshape(a.shape),
rstride=1, cstride=1, color='none', alpha=0.4)
graph.set_xlabel('study hours')
graph.set_ylabel('private class')
graph.set_zlabel('Score')
graph.dist = 11
plt.show()
# 3차원 '예측 평면'
|
cs |
이렇게 모두의 딥러닝 4장의 모든 과정 스터디를 마쳤다~ ㅎ
epochs도 나오고 이제 뭔가 진쨔 본격적으로 딥러닝으로 들어가는 것 같달까?
마직막으로 실습 예제 문제를 풀고 4장 공부를 마치겠다!!
p.s 이번 예제는 난도가 꽤 있으니!! 유의해서 공부하면서 풀어볼 것 !!!
실습 예제 문제)
전체 코드)
'AI & Data Analysis > 인공지능 스터디' 카테고리의 다른 글
[모두의 딥러닝] #8장: 오차는 다운! 정확도는 업! 오차역전파 (1) | 2022.01.22 |
---|---|
[모두의 딥러닝] #7장: XOR 문제의 극복, 다층 퍼셉트론 (0) | 2022.01.22 |
[모두의 딥러닝] #6장: 가장 작은 인공신경망 단위, 퍼셉트론 (0) | 2022.01.22 |
[모두의 딥러닝] #5장: 참 거짓 판단 장치, 로지스틱 회귀 (0) | 2022.01.19 |
[모두의 딥러닝] #3장: 가장 훌륭한 예측선 긋기: 선형 회귀 (1) | 2022.01.08 |