기계 학습 - 학습/테스트
모델 평가
기계 학습에서 우리는 무게와 엔진 크기를 알고 있을 때 자동차의 CO2 배출량을 예측한 이전 장과 같이 특정 이벤트의 결과를 예측하는 모델을 만듭니다.
모델이 충분히 좋은지 측정하기 위해 Train/Test라는 방법을 사용할 수 있습니다.
훈련/시험이란
훈련/테스트는 모델의 정확도를 측정하는 방법입니다.
데이터 세트를 훈련 세트와 테스트 세트의 두 세트로 분할하기 때문에 훈련/테스트라고 합니다.
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()
결과:
테스트 세트는 원본 데이터 세트와도 유사합니다.
데이터 세트 맞추기
데이터 세트는 어떻게 생겼습니까? 제 생각에는 다항식 회귀가 가장 적합하다고 생각 하므로 다항식 회귀 선을 그려 보겠습니다.
데이터 포인트를 통해 선을 그리려면
plot()
matplotlib 모듈의 메서드를 사용합니다.
예시
데이터 포인트를 통해 다항식 회귀선을 그립니다.
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-제곱 점수는 어떻습니까? R-제곱 점수는 내 데이터 세트가 모델에 얼마나 잘 맞는지를 나타내는 좋은 지표입니다.
R2
R-제곱이라고도 하는 R2를 기억하십니까?
x축과 y축 사이의 관계를 측정하며 값의 범위는 0에서 1까지이며 0은 관계가 없음, 1은 완전히 관련됨을 의미합니다.
sklearn 모듈에는 r2_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는 OK 관계가 있음을 나타냅니다.
테스트 세트 가져오기
이제 우리는 적어도 훈련 데이터에 관해서는 괜찮은 모델을 만들었습니다.
이제 테스트 데이터로 모델도 테스트하여 동일한 결과가 나오는지 확인하려고 합니다.
예시
테스트 데이터를 사용할 때 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달러를 지출할 것으로 예측했습니다.