머신러닝 - 선형 회귀
회귀
변수 간의 관계를 찾으려고 할 때, '회귀'라는 용어가 사용됩니다.
기계 학습과 통계 모델링에서, 이 관계는 미래 사건의 결과를 예측하는 데 사용됩니다.
线性回归
线性回归 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)
사용하여 생성: slope
과 intercept
값의 함수는 새로운 값을 반환하며, 이 새로운 값은 해당 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은 관계가 매우 나쁘다는 것을 의미하며, 이 데이터셋이 선형 회귀에 적합하지 않음을 알려줍니다.