https://www.w3schools.com/python/python_ml_train_test.asp

 

Python Machine Learning Train/Test

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

https://conansjh20.tistory.com/87

 

Python, Machine Learning 배우기 (w3schools로부터) (5) Polynomial Regression, 다항 회귀

https://www.w3schools.com/python/python_ml_polynomial_regression.asp Python Machine Learning Polynomial Regression W3Schools offers free online tutorials, references and exercises in all the major l..

conansjh20.tistory.com

이번 시간은 polinomial regression(다항회귀)의 연장이라 볼 수도 있습니다.

Evaluate Your Model

어떠한 이벤트들에 대한 결과를 예측하는 모델을 만들었다면 이제 그 모델이 충분히 작동하는지 검증을 해야 합니다.

 

What is Train/Test

Train/Test 는 내 모델의 정확도를 측정하는 방법으로 전체 데이터셋에서 일부는 Train용 나머지 일부는 Test용으로 사용하기 때문에 그러한 이름을 붙입니다.

 

Start With a Data Set

각설하고 바로 한번 진행해봅니다.

1
2
3
4
5
6
7
8
9
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
 
= numpy.random.normal(31100)
= numpy.random.normal(15040100/ x
 
plt.scatter(x, y)
plt.show()
cs

numpy.random.seed(2)는 실제 랜덤값을 발생하는 난수의 파라미터를 2로 주어서 랜덤이지만 같은 값이 나오도록 합니다. 뭐 저렇게 설정하면 랜덤이 랜덤이 아닌셈이라고 할수도...

 

그리고 x좌표값 y좌표값을 만드는데 numpy.random.normal()을 적용하여 만듭니다. 이는 정규분포표 값을 랜덤하게 구성해주는 함수로 3개의 파라미터가 들어가 있는데 다음과 같습니다. 

numpy.random.normal(loc=0.0, scale=1.0, size=None)

loc값은 분포의 평균값이고 scale은 분포에 대한 표준편차 값입니다. 그리고 size는 영어로는 output shape로 상수 또는 상수들로 이루어진 튜플값이 들어가는데 튜플값이 들어가는 경우 다차원의 값으로 구성됩니다.

복잡해 지는데 위에서는 단순히 100이 들어가서 결과 값도 100개가 나온다고만 생각하면 됩니다.

 

그리고 결과값을 scatter plot으로 보여주면,

위와 같이 표현됩니다.

 

그리고 x값 100개, y값 100개를 각각 80개 20개로 나눕니다. 80개는 train용 그리고 20개는 test용입니다. 80개를 학습하여 예측하는 모델을 만들고 나머지 20개로 테스트해서 그 예측값의 정확도를 확인하는 것이지요.

1
2
3
4
5
train_x = x[:80]
train_y = y[:80]
 
test_x = x[80:]
test_y = y[80:]
cs

Fit the Data Set

실제 위의 분포된 scatter plot을 확인하면 polinomial regression (다항 회귀)의 곡선으로 대략 예측이 됩니다. 그리고 plot()함수를 이용하여 곡선을 그려 봅시다. 여기서 곡선은 위에서 구분한 train_x, train_y, 각 80개씩의 값만 이용하여 그래프를 그립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
 
= numpy.random.normal(31100)
= numpy.random.normal(15040100/ x
 
train_x = x[:80]
train_y = y[:80]
 
test_x = x[80:]
test_y = y[80:]
 
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
 
myline = numpy.linspace(06100)
 
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()
cs

위와 같이 polinimial regression으로 선을 그리는데 numpy.polyfit(x값,y값,상수)로 다항회귀 값을 반환하는데 세번째 파라미터인 상수값에 따라 곡선이 위로 또는 아래로 꺽이기 때문에 실제 데이터값을 벗어나는 6정도 값이후에는 예측 정도가 급격히 떨어진다는 것을 알 수 있습니다. 그리고 R-Squared를 이용, 예측값의 관계의 정확도를 알아봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
 
= numpy.random.normal(31100)
= numpy.random.normal(15040100/ x
 
train_x = x[:80]
train_y = y[:80]
 
test_x = x[80:]
test_y = y[80:]
 
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
 
r2 = r2_score(train_y, mymodel(train_x))
 
print(r2)
cs

r2값은 0.7988645544629795으로 0.8정도의 정확도를 보이고 이정도면 OK relationship이라 합니다.

그리고 이어서 r2_score값의 파라미터에 text_x값과 text_y값을 앞서 train_x, train_y값으로 만든 model로 돌려본다면 마찬가지로 정확도를 확인할 수 있습니다. 그리고 결과 값은 0.8086921460343677으로 비슷합니다. 마찬가지로 0.8정도로 신뢰할 수 있다는 것을 확인하였습니다.

 

사실 이러한 random으로 만들어진 분포값들을 가지고 하는것은 이론을 익히는데 도움될 뿐이지 실제로 우리 일상에서 값들을 가지고 이런저런 연습을 해야 더 친숙해지고 익숙해지는 것 같습니다.

+ Recent posts