지도학습의 회귀 모델 중 하나인 선형회귀 모델을 배우다.
1. 선형 회귀
선형 회귀는 통계학적으로 보면 데이터 값이 평균과 같은 일정한 값으로 돌아가려는 경향을 이용한 통계학 기법이다. 예를 들면 사람의 키는 부모, 조부모의 평균 키로 회귀하려는 경향을 가진다 (자연의 법칙).
머신러닝 관점으로 보면, 여러개의 독립변수(문제)와 한 개의 종속변수(정답) 간의 상관관계를 모델링하는 기법으로 사용된다. 시간에 따라 변화하는 데이터나 영향, 가설적 실험, 인과 관계 모델링 등에서 자주 사용된다. 수치적 가치를 추정.
2. 선형 모델
우리는 회귀 모델중 선형 회귀 모델을 배울 것이다. 그렇다면 선형 모델은 무엇일까? 선형 모델은 입력 특성에 대한 선형 함수를 만들어 예측을 수행하고 다양한 선형모델을 사용할 수 있다. 선형 모델은 분류와 회귀모델 모두 사용 가능하다. 선형 모델은 데이터가 점으로 분포되어 있을 때 선을 그었을 때 데이터들을 가장 잘 설명할 수 있는 선을 구하는 것이다. 하지만 입력 데이터를 완벽하게 설명하는 선형함수를 찾는 것은 불가능하다. 따라서 오차가 가장 적은 선형함수를 찾아야 한다. 이때 오차는 평균제곱오차(MSE)인데 이것에 대한 설명은 이후에 하겠다. 오차가 가장 작은 함수를 찾는 것이 목표이다. 따라서 함수의 기울기(w) , 절편(편향)을 구하는 것이 선형 회귀의 목표이다.
x시간 공부했을 때 y점수가 나온다라는 데이터이다. 그럼 시간은 독립변수, 점수는 종속변수이다. 만약에 7시간 공부했다면 몇 점이 나온다고 예측할 수 있을까? 라고 해보자. 딱 보면 시간에 10을 곱하면 점수가 되니까 선형 함수의 기울기(w)는 10이 된다. 이것은 입력 데이터, 즉 독립 변수가 1개일 경우의 쉬운 형태의 선형 회귀 함수이다. 독립 변수는 여러 가지가 될 수 있기 때문에 선형 함수 일반식은 그림 4와 같다.
3. MSE가 최소가 되는 w와 b를 찾는 방법
3 - 2. 수학 공식을 이용한 해석적 모델
우리의 목적은 오차(MSE)가 가장 적게 나오는 선형 회귀 함수의 기울기와 절편을 구하는 것이다. 수학 공식을 이용해서 오차가 최소가 되는 w와 b를 구하는 방법이 있다.
- 장점) 공식을 이용해서 적은 계산으로 한 번에 최적의 선형 함수를 찾는 방법
- 단점) 공식이 완벽하지 않을 경우 최적의 선형함수를 잘 못 찾을 수 있다.
선형 회귀 모델에 coef_ 함수를 쓰면 최적의 기울기가 나오고, intercept_ 함수를 사용하면 최적의 절편이 나온다. 가중치의 변화에 따라 MSE의 변화를 시각적으로 그래프를 그려서 볼 것이다.
MSE란 평균제곱오차이다. 비용함수(cost)라고도 부른다. 평균제곱오차를 구하는 방법은 실제값에서 예측값을 빼든 예측값에서 실제값을 빼든 어차피 제곱하니까 똑같다. 그리고 총 갯수로 나눠주면 평균이니까 평균 제곱 오차를 구하는 것이다. 비용함수가 최솟값일 때를 구하면 된다.
그럼 임의로 시간에 따른 성적 데이터를 만들어서 수학공식을 이용해서 MSE의 최소가 되는 가중치를 구해보겠다.
# 성적데이터 생성을 위한 라이브러리 가져오기
import pandas as pd
import matplotlib.pyplot as plt
# 성적 데이터 생성
data = pd.DataFrame([[2, 20], [4, 40], [8, 80], [9, 90]],
index=['짱구', '철수', '맹구', '흰둥이'],
columns=['시간', '성적'])
시간에 따른 성적 데이터를 만들었다. 데이터를 가지고 선형 회귀 모델을 불러와서 모델을 학습 시켜보겠다.
# 모델 불러오기
from sklearn.linear_model import LinearRegression
# 모델 생성
lm = LinearRegression()
# 모델 학습
lm.fit(data[['시간']], data['성적']) # 문제는 2차원 정답은 1차원
fit함수를 사용해서 모델을 학습시키는 건 전과 동일하다. data 변수에 문제 데이터와 정답데이터 모두 있기 때문에 형태에 맞게 인덱싱 해서 매개변수로 넣어준다. 학습한 선형 회귀 모델의 기울기와 절편을 구해서 점수를 예측해 보자.
# 기울기(가중치) 출력
print("기울기 : ", lm.coef_)
# 절편(편향) 출력
print("절편 : ", lm.intercept_)
학습한 모델의 기울기는 10이고 절편은 0과 비슷하다. e-15(-15승)이니까 7 앞에 0이 14개가 있다는 의미이다.
# 가설 함수 정의
def h(w, x) :
return w*x + 0
가설 함수(H(x))를 만들어서 실제 오차를 구하는 함수인 cost함수까지 만들어보겠다. 가설함수는 수학 공식을 이용한 모델의 함수 식으로 생각하면 된다. 절편은 0이니까 0으로 하고 우리는 가중치에 따른 오차를 구하고 싶으니까 가중치는 매개변수로 받는다. 그리고 시간(x)도 사용자에 따라 다르니까 매개변수로 받아준다. w랑 x랑 곱하고 있으니까 가설함수를 적절하게 생성해 준다.
# 비용함수 정의
# data : 문제값
# target : 정답
# weight : 가중치
def cost(data, target, weight) :
# 예측
y_pre = h(weight, data)
# (예측값 - 실제값)**2 의 평균을 구하기
error = ((y_pre - target)**2).mean()
return error
# 가중치에 따른 오차값 확인
cost(data['시간'], data['성적'], 10)
MSE, 오차를 구하는 함수인 cost 함수를 만들어 보겠다. 오차를 구할 때 예측값에 실제값을 뺀다 했다. (그림 5)
예측값을 구하기 위해서 우리는 H(x)함수를 만든 것이다. H(x) 함수의 매개변수로 사용 될 가중치와 문제데이터를 cost함수의 매개변수로 받아야한다. H(x)함수는 cost함수 내에서 사용되기 때문이다. 그리고 실제값은 data안의 성적으로 볼 수 있다. 따라서 코드는 위의 코드블럭과 같다. 우리는 MSE를 구하는 함수인 cost까지 만들었다. 이제 우리는 가중치(w)에 따라 오차가 최소가 될 때의 가중치를 구해야 한다. -10 ~ 30 가중치 변화를 그래프로 시각화 할 것이다.
# 가중치 변화에 따른 비용함수의 변화를 그래프로 확인하기
cost_list = []
# -10 ~ 30 가중치 변화
for w in range(-10, 31) :
err = cost(data['시간'], data['성적'], w)
cost_list.append(err)
cost_list
가중치가 -10 ~ 30 범위의 MSE를 구할 것이기 때문에 for 반복문을 사용해서 가중치의 값을 변화하고 cost함수를 반복한다. cost 함수의 결과를 새로운 리스트 cost_list에 요소로 대입한다. cost_list의 각 요소들은 그래프의 y축이 된다. 왜냐하면MSE를 구하는 것이 목적이고 cost_list의 요소들이 MSE이기 때문이다. 그렇다면 가중치에 따른 MSE이기 때문에 가중치의 값이 x축이 되는 것이다.
# 비용함수(MSE) 그래프 그리기
plt.plot(range(-10, 31), cost_list)
plt.show
그림 9의 그래프를 분석하면 w(가중치)가 10일 때 그래프의 최솟값이기 때문에 w가 10일 때 오차가 0이 나오기 때문에 가장 적합한 선형함수의 w는 10이 된다.
분류 모델에서 score함수의 의미는 모델의 정확도였다. 회귀 모델에서 score함수의 의미는 유사도이다. 우리가 학습시킨 모델의 유사도를 문제데이터, 정답데이터를 매개변수로 주어 결과를 확인하면 유사한 것을 볼 수 있다.
선형 모델(회귀)에서의 평가지표는 정량적인 지표가중요하다. MSE(오차)의 값 범위는 0 ~ 무한대이다. score는 R2Score의 값의 범위는 -1 ~ 1이다. -1에 가까울수록 모델을 잘 설명하지 못하는 경우이고, 1에 가까울수록 모델을 잘 설명하는, 즉 모델의 성능이 괜찮은 것이다. 정확도가 아닌 %의 확률로 생각하면 된다.
'머신러닝' 카테고리의 다른 글
[머신러닝] 선형회귀 - 경사하강법(Gradient Descent) (0) | 2023.09.05 |
---|---|
[머신러닝] 특성 선택 (0) | 2023.08.29 |
[머신러닝] 교차검증 (cross_val_score) (0) | 2023.08.28 |
[머신러닝] 알고리즘 시각화 (graphviz) (0) | 2023.08.25 |
[머신러닝] 결정 트리 버섯데이터 실습 (One-hot 인코딩) (0) | 2023.08.25 |