기계 학습 - 훈련/테스트

모델 평가

기계 학습에서는, 우리는 특정 사건의 결과를 예측하기 위해 모델을 생성합니다. 예를 들어, 이전 장에서 중량과 엔진 배기량을 이해했을 때 자동차의二氧化碳 배출량을 예측했습니다.

모델이 충분히 좋은지 평가하기 위해 훈련/테스트라는 방법을 사용할 수 있습니다.

훈련/테스트는 무엇인가요?

훈련/테스트는 모델의 정확성을 측정하는 방법입니다.

훈련/테스트라고 불리는 이유는 데이터셋을 두 그룹으로 나누었기 때문입니다: 훈련 셋과 테스트 셋.

80%를 훈련에, 20%를 테스트에 사용합니다.

모델을 훈련하기 위해 훈련 셋을 사용할 수 있습니다.

모델을 테스트하기 위해 테스트 셋을 사용할 수 있습니다.

모델을 훈련하는 것은 모델을 생성하는 것입니다.

모델을 테스트하는 것은 모델의 정확성을 테스트하는 것입니다.

데이터셋에서 시작합니다.

테스트할 데이터셋에서 시작합니다.

우리의 데이터셋은 상점에서 100명의 고객 및 그들의 쇼핑 습관을 보여줍니다.

예제

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
plt.scatter(x, y)
plt.show()

결과:

x축은 구매 전의 분을 나타냅니다.

y축은 구매에 지출하는 금액을 나타냅니다.


예제 실행

훈련/테스트 분할

훈련 집합은 원래 데이터의 80%의 무작위 선택이어야 합니다.

테스트 세트는 20%여야 합니다.

train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]

훈련 집합을 표시합니다

훈련 집합과 동일한 산점도를 표시합니다:

예제

plt.scatter(train_x, train_y)
plt.show()

결과:

그것은 원래 데이터 집합과 유사하게 보이므로 합리적인 선택처럼 보입니다:


예제 실행

테스트 세트를 표시합니다

테스트 세트가 완전히 다른 것이 아니기를 확인하기 위해 테스트 세트도 확인해야 합니다.

예제

plt.scatter(test_x, test_y)
plt.show()

결과:

테스트 세트는 원래 데이터 집합과 유사하게 보입니다:


예제 실행

데이터 집합을 적합시킵니다

데이터 집합은 어떻게 보이나요? 저는 다항식 회귀가 가장 적합하다고 생각합니다. 따라서 다항식 회귀선을 그려보겠습니다.

데이터 포인트를 따라 선을 그리기 위해 matplotlib 모듈의 plott() 방법:

예제

데이터 포인트를 통과하는 다항식 회귀선을 그립니다:

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / 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(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()

결과:


예제 실행

이 결과는 데이터 집합에 대한 다항식 회귀를 적용하는 것을 지지할 수 있으며, 데이터 집합 밖의 값을 예측하려고 시도하면 이상한 결과를 초래할 수 있습니다. 예를 들어: 이 줄은 고객이 상점에서 6분을 쇼핑하면 200달러의 구매를 완료한다는 것을 의미합니다. 이는 과적합의 징후일 수 있습니다.

하지만 R-squared 점수는 어떻게 되나요? R-squared score는 데이터 집합이 모델에 대한 적합도를 잘 나타냅니다.

R2

R2, 또는 R square (R-squared)을 기억하시나요?

x축과 y축의 관계를 측정하며, 0에서 1 사이의 값을 가지며 0은 관계가 없고 1은 완전한 관계를 의미합니다.

sklearn 모듈에는 rs_score() 의 방법, 이 방법은 우리가 이 관계를 찾아내는 데 도움이 될 것입니다.

여기서, 고객이 상점에서 머무는 시간과 지출하는 돈 사이의 관계를 측정해야 합니다.

예제

우리의 훈련 데이터가 다항식 회귀에서 어떤 적합도를 가지고 있는지 알아보겠습니다.

import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / 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)

예제 실행

주의사항:결과 0.799은 관계가 좋다는 것을 보여줍니다.

테스트 세트를 도입합니다.

현재, 최소한 훈련 데이터 측면에서는 꽤 좋은 모델을 구축했습니다.

그런 다음, 모델을 테스트 데이터로 테스트하여 동일한 결과를 제공하는지 확인해야 합니다.

예제

따라서 테스트 데이터를 사용하여 R2 점수를 결정해 보겠습니다:

import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / 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(test_y, mymodel(test_x))
print(r2)

예제 실행

주의사항:결과 0.809은 이 모델이 테스트 세트에도 적합하다는 것을 의미하며, 이 모델을 미래의 값을 예측하는 데 사용할 수 있다고 확신합니다.

예측 값

우리의 모델이 좋은 모델임을 확인한 후, 새로운 값을 예측하기 시작할 수 있습니다.

예제

고객이 매장에서 5분 동안 머물렀을 때, 그는 얼마를 소비할까요?

print(mymodel(5))

예제 실행

이 예제에서는 고객이 22.88 달러를 소비했음을 예측했으며, 그림과 일치할 것 같습니다: