머신러닝 - 선형 회귀

회귀

변수 간의 관계를 찾으려고 할 때, '회귀'라는 용어가 사용됩니다.

기계 학습과 통계 모델링에서, 이 관계는 미래 사건의 결과를 예측하는 데 사용됩니다.

线性回归

线性回归 uses the relationship between data points to draw a straight line between all data points.

这条线 can be used to predict future values.


机器学习中,预测未来非常重要.

작동 원리

Python은 데이터 포인트 간의 관계를 찾고 선형 회귀선을 그리는 데 사용할 수 있는 몇 가지 방법을 제공합니다. 우리는 수학 공식이 아닌 이 방법을 사용하는 방법을 보여드리겠습니다.

아래의 예제에서, 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()

결과:


실행 예제

예제 설명

필요한 모듈을 가져오세요:

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)

사용하여 생성: slopeintercept 값의 함수는 새로운 값을 반환하며, 이 새로운 값은 해당 x 값이 y 축에 위치할 위치를 나타냅니다:

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-Squared

x 축의 값과 y 축의 값 사이의 관계가 얼마나 좋은지 알아야 합니다. 관계가 없다면 선형 회귀는 어떤 것도 예측할 수 없습니다.

이 관계는 r 제곱(r-squared) 값으로 측정됩니다.

r 제곱 값의 범위는 0에서 1이며, 0은 불관련을, 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-squared 값은?

예제

매우 낮은 r-squared 값이 나타나셨을 것입니다.

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은 관계가 매우 나쁘다는 것을 의미하며, 이 데이터셋이 선형 회귀에 적합하지 않음을 알려줍니다.