티스토리 뷰

[딥러닝 express]의 연습문제 4장 풀이입니다. (개인적인 풀이기에 오답이 있을 수 있습니다!)

 

 

 

 

 

 

 

 

 

01. 선형 회귀는 주로 독립 변수와 종속 변수 간에 선형적인 관계가 성립할 때 많이 사용된다. 다음중에서 선형 회귀로 예측하기 어려운 문제는 어떤 문제인가?


(a) 온도와 출생률  (b) 공부 시간과 성적  (c) 체중과 달리기 기록

 

 

답 : 체중과 달리기 기록

어느 정도 체중을 적게 유지하면 달리기에 유리한 것은 맞으나, 무조건적으로 체중이 적게 나간다고 해서 달리기 기록이 향상되는 것은 아니다. 같은 체중이어도 선천적인 몸의 형질이나, 훈련정도에 따라 기록이 천차 만별이기 때문이다. 즉, 체중과 달리기 기록은 독립 변수와 종속 변수간 선형적인 관계가 성립하지 않기 때문에 선형회귀로 예측하기 어렵다. 

 

 

 

 

 

 

 

 

02. 다음의 2개의 데이터 세트중 MSE(평균 제곱 오차)가 더 높은 것은 무엇인가?

 

 

 

답 : 후자

MSE란 각 정답과 출력간 오차의 제곱의 평균을 구한 값으로, 작을수록 정답에 가까운 것이라 할 수 있다. 어떤것이 더 큰지 확인하기 위해 계산한 결과는 아래와 같다.

 


따라서 후자의 경우가 더 MSE가 높다.

 

 

 

 

 

 

 

 

03. 대량의 데이터 세트에서 경사 하강법을 수행할 때 배치 크기는 어느 정도로 하여야 할까?

 

답 : 1보다 크고 전체 데이터셋 보다는 작은 적당한 크기를 선택한다.

전체 데이터셋의 크기를 배치로 설정할 경우 안정적이지만, 모든 데이터를 한번에 처리 해야 하기 때문에 가중치 업데이트 시간이 길고 메모리가 부족한 경우 실행이 어려울거라 생각한다. 반대로 배치사이즈를 1로 설정한 경우에는 하나의 데이터 셋이 가중치에 미치는 영향이 커져 비교적 정확한 모델을 만드는 것이 어렵고, 계산의 효율성이 떨어질 것이다. 따라서 데이터의 크기에 따라 너무 작지도 크지도 않은 적절한 배치크기를 선택하여야 한다.

 

 

 

 

 

 

 

04. 본문의 참조 박스에서 이야기 한대로 독립 변수와 종속 변수가 각각 하나인 선형회귀에서 손실함수의 형태는 2차 함수로 단순하기 때문에 분석적인 방법으로도 최소값을 계산할 수 있다.

 

 

 

위의 수식 계산을 파이썬 프로그램으로 구현해 보자. 경사 하강법과 비교해보자. 차이가 있는가? 이렇게 분석적인 방법으로 계산할 수 있는데, 어떠한 경우에 경사하강법을 사용하는가?

 

 

# 최소 제곱법
x_bar = X.mean()
y_bar = y.mean()

W = ((X - x_bar) * (y - y_bar)).sum() / ((X - x_bar)**2).sum()
b = y_bar - W * x_bar
# 경사 하강법
for i in range(epochs):
    y_pred = W * X + b  # 예측값
    dW = (2 / n) * sum(X * (y_pred - y))
    db = (2 / n) * sum(y_pred - y)
    W = W - lrate * dW  # 기울기 수정
    b = b - lrate * db  # 절편 수정

 

독립 변수가 하나가 아니고 여러 개인 경우 분석적인 방법으로 계산하는 것은 복잡하고 비효율적이다. 이러한 경우 경사하강법을 사용한다. 또 경사하강법은 매개변수가 많아저도 쉽게 적용이 가능하며, 데이터가 추가된 경우 처음부터 다시 계산해야할 필요없이 점진적인 학습이 가능하다는 장점이 있다.

 

import numpy as np

X = np.array([0.0, 1.0, 2.0])
y = np.array([3.0, 3.5, 5.5])

W = 0  # 기울기
b = 0  # 절편

lrate = 0.01  # 학습률
epochs = 1000  # 반복 횟수

n = float(len(X))  # 입력 데이터의 개수

# 경사 하강법
for i in range(epochs):
    y_pred = W * X + b  # 예측값
    dW = (2 / n) * sum(X * (y_pred - y))
    db = (2 / n) * sum(y_pred - y)
    W = W - lrate * dW  # 기울기 수정
    b = b - lrate * db  # 절편 수정

# 기울기와 절편을 출력한다. 
print(W, b)


# 최소 제곱법
x_bar = X.mean()
y_bar = y.mean()

W = ((X - x_bar) * (y - y_bar)).sum() / ((X - x_bar)**2).sum()
b = y_bar - W * x_bar

# 기울기와 절편을 출력한다. 
print(W, b)

 

1.2532418085611319 2.745502230882486
1.25 2.75

# 결과에 큰차이는 발생하지 않았다.

 

 

 

 

 

 

 

 

05. 다음 표는 어떤 회사의 연도별 매출 실적을 정리한 표이다.

 

x(연도) 2015 2016 2017 2018 2019
y(억원) 12 19 28 37 46

 

 

 

(a) 선형회귀로 분석하여 직선의 방정식 y = mx+b를 찾아 보자. 본문의 프로그램을 이용해도 좋다.

import matplotlib.pylab as plt
from sklearn import linear_model

reg = linear_model.LinearRegression()

X = [[2015], [2016], [2017], [2018], [2019]]       
y = [12, 19, 28, 37, 46]   

reg.fit(X, y)        # 학습

print(reg.coef_,",",reg.intercept_)
[8.6] , -17317.8

답 : \(y = 8.6x - 17317.8\)

 

 

 

 

 

(b) 선형회귀를 이용하여 2020년의 매출을 예측해보자.

...
print(reg.predict([[2020]]))
[54.2]

답 : 54.2억원

 

 

 

 

 

 

 

 

 

06. 다음표는 출생연도와 기대수명을 정리한 표이다.

 

x(연도) 1930 1940 1950 1960 1970 1980 1990 2010 2016
y(기대수명) 59 62 70 69 71 74 75 76 78

 

 

(a) 선형회귀로 분석하여 직선의 방정식 y= mx+b를 찾아보자. 본문의 프로그램을 이용해도 좋다.

import matplotlib.pylab as plt
from sklearn import linear_model

reg = linear_model.LinearRegression()

X = [[1930], [1940], [1950], [1960], [1970], [1980], [1990], [2010],  [2016]]       
y = [59, 62, 70, 69, 71, 74, 75, 76 ,78]   

reg.fit(X, y)        # 학습

print(reg.coef_,",",reg.intercept_)  # 기울기와 y절편 출력
[0.19907865] , -322.09442245857053

 

답 : \(y = 0.19x - 322.09\)

 

 

 

 

 

 

(b) 1962년생의 기대수명은 얼마인가?

...
print(reg.predict([[1962]]))
[68.4978976]

 

답 : 약 68.47세

 

 

 

 

 

 

 

 

 

07. 우리는 간단한 실습으로 선형회귀에 대한 개념을 잡아보자, 학생들의 시험 공부 시간과 성적은 어느정도 비례할 것으로 예측된다. 시험공부 시간을 x라고 하고 성적을 y로 나타내자. x와 y사이의 관계를 설명하는 직선을 찾아보자.

 

학생 아이디 시험 공부 시간 \(x_i\) 성적 \(y_i\)
1 30 90
2 35 95
3 20 70
4 15 40
5 3 10
103 305
평균 20.60 61.00

 

import matplotlib.pylab as plt
from sklearn import linear_model

reg = linear_model.LinearRegression()

X = [[30], [35], [20], [15], [3]]       
y = [90, 95, 70, 40, 10]   

reg.fit(X, y)        # 학습

print(reg.coef_,",",reg.intercept_)  # 기울기와 y절편 출력
[2.78091651] , 3.71311989956056

 

답 : \(y = 2.78x + 3.71\)

 

 

 

 

감사합니다.

 


공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

 

댓글
«   2024/11   »
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
Total
Today
Yesterday