기계 학습 - 다항 회귀
多项式回归(Polynomial Regression)
如果你的数据点显然不适合线性回归(穿过数据点之间的直线),那么多项式回归可能是理想的选择。
적대 회귀와 마찬가지로, 다항식 회귀는 변수 x와 y의 관계를 사용하여 데이터 포인트를 연결하는 최적의 방법을 찾습니다.

작동 원리
Python은 데이터 포인트 사이의 관계를 찾고 다항식 회귀선을 그리는 방법을 제공합니다. 수학 공식을 사용하지 않고 이 방법을 보여드리겠습니다.
아래의 예제에서는 특정 통행소를 지나는 차 18대를 등록했습니다.
차의 속도와 통행 시간(시간)을 기록했습니다.
x축은 하루 중의 시간을, y축은 속도를 나타냅니다:
예제
먼저 산점도를 그리겠습니다:
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()
결과:

예제
가져옵니다: numpy
와 matplotlib
그래서 다항식 회귀선을 그리겠습니다:
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()
결과:

예제 설명
필요한 모듈을 가져옵니다:
import numpy import matplotlib.pyplot as plt
x축과 y축의 값을 나타내는 배열을 생성합니다:
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]
NumPy는 다항식 모델을 만들 수 있는 방법을 제공합니다:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
그런 다음 행의 표시 방식을 지정합니다. 위치 1에서 시작하여 위치 22까지:
myline = numpy.linspace(1, 22, 100)
원래의 산점도를 그리겠습니다:
plt.scatter(x, y)
다항식 회귀선을 그리겠습니다:
plt.plot(myline, mymodel(myline))
그래프 표시:
plt.show()
R-Squared
x축과 y축의 값 사이의 관계가 얼마나 좋은지 알아야 합니다. 관계가 없다면, 다항식 회귀는 어떤 것도 예측할 수 없습니다.
이 관계는 r 제곱(r-squared) 값으로 측정됩니다.
r 제곱 값의 범위는 0에서 1이며, 0은 불관련, 1은 100% 관련을 의미합니다.
Python과 Sklearn 모듈은 이 값을 계산해 주며, 필요한 것은 x와 y 배열을 입력하는 것입니다:
예제
다항식 회귀에서 제 데이터의 설명도는 어떻게 되나요?
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)))
비고:결과 0.94는 좋은 관계가 있음을 나타내며, 미래의 예측에 다항식 회귀를 사용할 수 있습니다.
미래 값 예측
지금, 수집한 정보를 사용하여 미래의 값을 예측할 수 있습니다.
예를 들어: 밤 5시 부근에 통행소를 지나는 차의 속도를 예측해 보겠습니다:
이를 위해 위의 예제와 같은 mymodel 배열:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
예제
오후 5시 넘어서 차의 속도를 예측하겠습니다:
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)) speed = mymodel(17) print(speed)
예제의 예측 속도는 88.87입니다. 그리고 그림에서도 볼 수 있습니다:

나쁜 설명도?
다항식 회귀가 미래 값을 예측하는 최적의 방법이 아니라는 예제를 만들어 보겠습니다.
예제
이러한 x와 y 축의 값은 다항 회귀의 가소도가 매우 나쁘게 될 것입니다:
import numpy import matplotlib.pyplot as plt x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40] y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15] mymodel = numpy.poly1d(numpy.polyfit(x, y, 3)) myline = numpy.linspace(2, 95, 100) plt.scatter(x, y) plt.plot(myline, mymodel(myline)) plt.show()
결과:

r-squared 값이 무엇인가요?
예제
매우 낮은 r-squared 값이 나와야 합니다.
import numpy from sklearn.metrics import r2_score x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40] y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15] mymodel = numpy.poly1d(numpy.polyfit(x, y, 3)) print(r2_score(y, mymodel(x)))
결과: 0.00995은 관계가 매우 나쁘다는 것을 나타내며, 이 데이터셋이 다항 회귀에 적합하지 않다는 것을 알려줍니다.