기계 학습 - 다항식 회귀
다항식 회귀
데이터 포인트가 선형 회귀(모든 데이터 포인트를 통한 직선)에 분명히 맞지 않으면 다항식 회귀에 이상적일 수 있습니다.
선형 회귀와 마찬가지로 다항식 회귀는 변수 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()
결과:
예시 설명
필요한 모듈을 가져옵니다.
NumPy Tutorial 에서 NumPy 모듈에 대해 배울 수 있습니다 .
SciPy Tutorial 에서 SciPy 모듈에 대해 배울 수 있습니다 .
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-제곱
x축과 y축 값 사이의 관계가 얼마나 좋은지 아는 것이 중요합니다. 관계가 없으면 다항식 회귀를 사용하여 아무 것도 예측할 수 없습니다.
관계는 r-제곱이라는 값으로 측정됩니다.
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는 매우 좋은 관계가 있음을 나타내며 향후 예측에서 다항식 회귀를 사용할 수 있습니다.
미래 가치 예측
이제 수집한 정보를 사용하여 미래 가치를 예측할 수 있습니다.
예: 오후 17시경에 요금소를 지나는 자동차의 속도를 예측해 보겠습니다.
그렇게 하려면 mymodel
위의 예와 동일한 배열이 필요합니다.
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
예시
오후 17시에 지나가는 자동차의 속도를 예측하십시오.
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제곱 값은?
예시
매우 낮은 r-제곱 값을 얻어야 합니다.
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는 매우 나쁜 관계를 나타내며 이 데이터 세트가 다항식 회귀에 적합하지 않음을 알려줍니다.