티스토리 뷰
[Python] 선형회귀 (2) / 기울기 a와 y절편 b에 따른 평균 오차 제곱(MSE) 프로그래밍 하기, 선형회귀 실습
또야 2021. 3. 30. 17:54likethefirst.tistory.com/entry/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-Linear-Regression-Model-1
지난 선형회귀 (1) 포스팅에서
기울기 a와 y절편 b를 예측하여
x 값에 따른 y 값을 추정해
그래프로 간단히 나타내 보았다.
이번 포스팅에서는
평균 오차 제곱(MSE)의 개념과
왜 필요한지 등
프로그래밍화 방법을 소개한다.
1. 평균 오차 제곱(MSE)이란?
추측값에 대해서 정확성을 알 수 있다.
말 그대로 오차의 제곱의 평균인 것이다.
아래와 같다고 가정해보자.
(1) 예측값 : 10, 실제값 : 5이면 오차는 5이다.
(2) 예측값 : 8, 실제값 : 5이면 오차는 3이다.
이 경우 오차가 작은 (2)의 경우가
더 정확히 추측했다고 보는 것이다.
그러므로 평균 오차 제곱은
그 값이 작을 수록 정확하다고 본다.
공식 은 다음과 같다.
$ MSE = \frac{1}{n}\sum_{i=1}^n(\hat{Y}_{i}-Y_{i})^{2}$
2. 오차를 확인하는 과정, 왜 제곱의 합인가?
보통 그래프를 그려보고,
예측값과 실제값의 오차가
작아지는지를 확인하면서 값을 맞춰나간다.
평균 오차 제곱은 왜 제곱을 사용할까?
y_e(추정치), y(실제값)의 오차는
항상 양수가 아니다.
오차를 error라고 두면,
error = [1, -3, 2, 4, -4]인 경우
오차의 합은 1 + (-3) + 2 + 4 + (-4)이고,
이는 0이 되어 무의미한 판별 대상이 되는 것이다.
그러므로 이 오차들을 제곱한 합을
총 개수로 나누어 정확도를 판단하는 척도로 이용한다.
3. 프로그래밍화 하기
↓
3.1. 기울기 a와 y절편 b를 임의의 값으로 두기
1
|
fake_a_b = [3, 79]
|
cs |
- 3.1. 설명
a, b를 모른다고 생각하고
a = 3, b = 79로 가정하자.
3.2. 데이터셋 생성
1
2
3
|
data = [[2,81], [4,93], [6,91], [8,97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
|
cs |
- 3.2. 설명
data는 이전 포스팅의 값과 예제를
그대로 가져왔다.
x = [i[0] for i in data]는
data에 있는 [2,81]중 2,
[4,93] 중의 4처럼
첫 번째 값을 가져오고,
y는 두 번째 값을 가져온다.
x | 2 | 4 | 6 | 8 |
y | 81 | 93 | 91 | 97 |
↑
x와 y를 print하면 이처럼 나온다.
3.3. 점수를 예측하고 리스트에 추가하기
1
2
3
4
5
6
7
8
|
predict_result = []
def predict(x):
return fake_a_b[0] * x + fake_a_b[1]
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("공부 시간 = %.f, 실제 점수 = %.f, 예측 점수 = %.f" % (x[i], y[i], predict(x[i])))
|
cs |
- 3.3. 설명
predict(x) 함수에서는
임의로 설정했던 a와 b의 값을 이용해
x를 매개변수로 받아
y의 값을 예측하여 return 한다.
fake-a_b[0]은 3이고, (a)
fake-a_b[1]은 79인 셈이다. (b)
그 예측값을 predict_result라는
리스트를 선언하여 비워두고,
x의 길이만큼 인덱스를 반복하여
for 문으로 예측 값을 얻고,
그것을 predict_result 리스트에
append(추가) 한다.
- 3.3 결과 는 다음과 같다.
예측 점수는
y = 3x + 79에 맞게 나온
y의 추정치이다.
예측 점수만 따로 출력한 결과이다.
print("predict(x[%d]) : %f" % (i, predict(x[i])))
코드를 for문에 추가하여
결과를 확인할 수 있다.
4. MSE 구하기
1
2
3
4
5
|
def mse_val(predict_result, y):
return mse(np.array(predict_result), np.array(y))
def mse(y_hat, y):
return ((y_hat - y) ** 2).mean()
|
cs |
- 4. 설명
mse_val 함수에
예측 y값과 y값을 전달하여
np.array의 형식으로 변환하고,
이를 mse 함수의 매개변수로 전달한다.
mse 함수에서는
이 두 매개변수를 받아
((y_hat - y) ** 2).mean()인
평균 오차 제곱을 구한다.
★ 5. 코드를 합하여 결과 출력하기
5.1. a = 3, b = 79로 가정
- 5.1. 결과
- 5.1. 설명
3.3. 에서 설정한
a = 3, b = 79에 따른
mse 최종값은 23.0이 출력되었다.
x = 8일 때 예측 성적이 103으로 초과되었다.
오차가 많이 발생하였음을 추측할 수 있다.
mse가 작은 값일 수록
정확도가 높다고 판단한다고 하였으니,
a와 b를 조정하여보자.
a와 b를 이전 포스팅 선형회귀 (1) 에서
가장 오차가 적도록 구해봤던
a = 2.3, b = 79로 조정한다.
5.2. 최적의 값인 a = 2.3, b = 79로 가정
- 5.2. 결과
- 5.2. 설명
mse 최종값이 약 8.3으로 줄었고,
실제 점수와 예측 점수를 비교했을 때
오차가 줄었다는 것을 확인할 수 있다.
- 5.2. 그래프
청색 점 : 예측 값
적색 점 : 실제 값
- 마무리
이번 포스팅에서는
평균 제곱 오차(MSE)를 구하는 방법과
a, b를 가변적으로 가정한 후의
MSE의 최종값 변화를 알 수 있었다.
결론적으로 MSE 값이 작을 수록
예측 값과 실제 값의 오차가 작아진다는 것이
쌍방향으로 성립 가능하다는 것을 알았다.
'Programming Language > AI with Python' 카테고리의 다른 글
[Python] 경사 하강법 / 코딩으로 확인하기 (7) | 2021.04.09 |
---|---|
[Python] 선형회귀 (1) / 최소제곱법의 프로그래밍과 결과값 그래프로 나타내기 (0) | 2021.03.26 |
[Python] 선형회귀 / Linear Regression Model / Basic (0) | 2021.03.26 |
[Python] 로봇 기자가 쓰는 야구 기사 (0) | 2021.03.24 |
[Python] 텍스트 파일에 있는 단어의 개수를 세는 프로그램 (0) | 2021.03.24 |
- Thanks for comming.
- 오늘은
- 명이 방문했어요
- 어제는
- 명이 방문했어요