기계 학습 - 선형 회귀
회귀
회귀라는 용어는 변수 간의 관계를 찾으려고 할 때 사용됩니다.
기계 학습 및 통계 모델링에서 해당 관계는 미래 이벤트의 결과를 예측하는 데 사용됩니다.
선형 회귀
선형 회귀는 데이터 포인트 간의 관계를 사용하여 모든 데이터 포인트를 통해 직선을 그립니다.
이 선은 미래 값을 예측하는 데 사용할 수 있습니다.
머신 러닝에서 미래를 예측하는 것은 매우 중요합니다.
어떻게 작동합니까?
파이썬에는 데이터 포인트 간의 관계를 찾고 선형 회귀선을 그리는 방법이 있습니다. 수학 공식을 통하지 않고 이러한 방법을 사용하는 방법을 보여 드리겠습니다.
아래 예에서 x축은 나이를 나타내고 y축은 속도를 나타냅니다. 우리는 13대의 자동차가 요금소를 지나갈 때 나이와 속도를 등록했습니다. 수집한 데이터를 선형 회귀에 사용할 수 있는지 봅시다.
예시
산점도를 그리는 것으로 시작하십시오.
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
결과:
예시
선형 회귀 선을 가져 scipy
오고 그립니다.
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
결과:
예시 설명
필요한 모듈을 가져옵니다.
Matplotlib Tutorial 에서 Matplotlib 모듈에 대해 배울 수 있습니다 .
SciPy Tutorial 에서 SciPy 모듈에 대해 배울 수 있습니다 .
import matplotlib.pyplot as plt
from scipy
import stats
x 및 y 축의 값을 나타내는 배열을 만듭니다.
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
선형 회귀의 몇 가지 중요한 키 값을 반환하는 메서드를 실행합니다.
slope, intercept, r,
p, std_err = stats.linregress(x, y)
slope
및
intercept
값을 사용하여 새 값을 반환 하는 함수를 만듭니다 . 이 새 값은 y축에서 해당 x 값이 배치될 위치를 나타냅니다.
def myfunc(x):
return slope * x + intercept
함수를 통해 x 배열의 각 값을 실행합니다. 그러면 y축에 대한 새 값이 있는 새 배열이 생성됩니다.
mymodel = list(map(myfunc, x))
원래 산점도를 그립니다.
plt.scatter(x, y)
선형 회귀선을 그립니다.
plt.plot(x, mymodel)
다이어그램 표시:
plt.show()
관계에 대한 R
x축 값과 y축 값 사이의 관계가 어떻게 되는지 아는 것이 중요합니다. 관계가 없으면 선형 회귀를 사용하여 아무 것도 예측할 수 없습니다.
이 관계(상관 계수)라고
r
합니다.
값 범위 는 r
-1에서 1까지이며, 여기서 0은 관계가 없음을 의미하고 1(및 -1)은 100% 관련됨을 의미합니다.
Python과 Scipy 모듈이 이 값을 계산할 것입니다. x 및 y 값을 입력하기만 하면 됩니다.
예시
내 데이터가 선형 회귀에 얼마나 잘 들어맞습니까?
from scipy import stats
x =
[5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
참고: 결과 -0.76은 완전하지 않은 관계가 있음을 보여주지만 향후 예측에서 선형 회귀를 사용할 수 있음을 나타냅니다.
미래 가치 예측
이제 수집한 정보를 사용하여 미래 가치를 예측할 수 있습니다.
예: 10년 된 자동차의 속도를 예측해 보겠습니다.
그렇게 하려면 myfunc()
위의 예와 동일한 기능이 필요합니다.
def myfunc(x):
return slope * x + intercept
예시
10년 된 자동차의 속도를 예측하십시오.
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
이 예에서는 85.6의 속도를 예측했으며 이는 다이어그램에서도 읽을 수 있습니다.
몸에 맞지 않나요?
선형 회귀가 미래 값을 예측하는 가장 좋은 방법이 아닌 예를 만들어 보겠습니다.
예시
x축 및 y축에 대한 이러한 값은 선형 회귀에 매우 적합하지 않게 됩니다.
import matplotlib.pyplot as plt
from scipy import stats
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]
slope,
intercept, r, p, std_err = stats.linregress(x, y)
def
myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc,
x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
결과:
그리고 r
관계를 위해?
예시
r
매우 낮은 값 을 얻어야 합니다.
import numpy
from scipy import stats
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]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
결과: 0.013은 매우 나쁜 관계를 나타내며 이 데이터 세트가 선형 회귀에 적합하지 않음을 알려줍니다.