https://www.w3schools.com/python/python_ml_polynomial_regression.asp
Polynomial Regression
삶이 언제나 똑바로 가지 않듯이 모든 데이터를 선형회귀(Linear Regression)로 표현하기 어렵고 그럴때는 Polynomial Regression(다항 회귀)를 이용합니다. 실제 훨씬 더 일상에 응용하기 유용하다고 볼 수 있습니다.
이러한 다항 회귀의 예로 w3schools에서는 어떠한 tollbooth를 지나는 차량들의 시간에 따르는 속도들 각각 x값 y값으로 하여 이를 다항 회귀로 표현해보고자 하고 있습니다.
여기서 우리는 x값 y값을 통해 왜 다항회귀를 통하여 알아보고자 하는지 그 이유를 추정할 수 있습니다. 이번 예에서는 시간에 따라 tollbooth를 지나는 차량들의 경향성이 있는지를 알아보는 것입니다. 실제 우리가 고속도로 운전시 지나는 톨게이트 역시 이러한 경향성이 분명히 있을 것같은 생각이 듭니다.😁
일단 scatter plot으로 표현을 해보면 코드는 다음과 같습니다.
1
2
3
4
5
6
7
|
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
|
cs |
먼저 주어진 값들로 scatter plot을 만듭니다. 그리고 이제 polynomial Regression의 곡선을 추가해 봅니다.
mymodel 변수를 만드는 코드가 핵심인 듯 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
|
cs |
코드의 각 설명을 봅니다.
import numpy
import matplotlib.pyplot as plt
관련 라이브러리를 임포트 합니다. polynomial regression을 위한 numpy와 그래프를 그리기 위한 matplotlib입니다.
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
앞서 설명했듯 x값은 차량이 지나간 시간과 y는 지나갈때의 속도입니다.
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
먼저 numpy.polyfit(x,y,3) 을 통하여 다항 회귀를 위한 데이터를 반환합니다. x값, y값, 다음의 숫자 3은 3차 다항식 계수를 반환합니다. 복잡하게 생각할 필요 없이 1차는 직선 2차는 곡선 3차는 두번 꺾이는 곡선을 만들어 준다고 보시면 됩니다.
그 다음 numpy.poly1d()를 통하여 다항회귀 선에 대한 함수를 만듭니다. 여기서 mymodel은 함수입니다.
myline = numpy.linspace(1, 22, 100)
numpy.linspace()은 내가 입력한 구간 내에 일정한 값들을 채우는 것입니다.
1부터 2까지 100개의 숫자를 일정하게 채워 넣는 것이지요.
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
두번째 라인의 plt.plot(x축, y축)을 이용하여 그래프를 그려줍니다.
x축은 myline변수를 넣고 y축은 미리 만든 mymodel 함수를 통하여 나온 결과값을 넣습니다.
혹시나 해서 위의 numpy.polyfit(x, y, 3)의 3을 1과 2로 한번 넣어서 그래프를 확인해 봅니다.
확실히 분포된 점들과 다항회귀 선과의 가까운정도를 보면 3차 다항식으로 해야한다는 것을 알 수 있습니다.
예측은 mymodel 함수를 이용하면 쉽게 확인할 수 있습니다.
R-Squared
선형회귀와 마찬가지로 다항회귀 역시 x축과 y축간의 관계를 확인하여 어느정도 연관성이 있어 다항회귀를 적용가능한지 확인하는 것이 필요합니다. 실제 각 시간별 tollbooth를 지나는 차량들의 속도는 시간에 전혀 상관이 없으며 단지 우연히 저런 결과가 나온 것일 수 있기 때문입니다.
이러한 관계를 확인하는 값을 R-Squared(R제곱?)이라 부릅니다. 앞서 선형 회귀에서도 나왔듯이 r값이 0에 가까우면 연관성이 0%, 1에 가까우면 100%에 가깝다고 보면 됩니다.
그리고 이러한 r값을 정확히 확인하기 위하여 Sklearn 라이브러리를 사용합니다. 이제 좀 더 머신러닝에 더 가까워지는 라이브러리를 순차적으로 배우는 듯 합니다. (w3schools가 실제로 미국에서도 큰 명성을 가지고 있는듯 합니다.👍)
1
2
3
4
5
6
7
8
9
|
import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
|
cs |
sklearn.metrics의 r2_score 를 이용하여,
처음 주어진 y값들과 다항회귀로 예측한 y값들을 비교하여 점수를 매긴다고 보시면 됩니다.
결과값을 보면 약 0.94로 상당히 훌륭한 예측을 보입니다. numpy.polyfit(x,y,3)을 numpy.polyfit(x,y,2)로 바꿔 돌려보면 그 정확도 점수가 0.75까지 떨어지는 것을 볼 수 있습니다. (만약 3이 아닌 4로 한다면 0.95까지 올라가지만 큰 차이가 없어 그렇게 쓸모 있어보이진 않습니다.)
w3schools에서는 선형 회귀 부분과 마찬가지로 최초 주어진 x값, y값들이 전혀 연관성 또는 경향성이 없는 경우에는 다항회귀로 값을 예측하는 것이 전혀 의미없음을 설명하고 있습니다. R-squared 값이 터무니 없게 낮다면 그렇겠지요.
이제 선형회귀나 다항회귀에 대해 배웠는데 이정도만 배워도 충분히 실생활에 머신러닝을 적용해 볼 수 있으리라 생각됩니다.