Building Machine Learning System with Python ch.1.3

데이터 다시 보기


그래프를 다시 한 번 봐보자. 
3주차 4주차 사이에 변곡점이 존재한다.
그래서 3.5주차를 기준으로 데이터를 둘로 나누어 따로 훈련해야겠다.

inflection = 3.5 * 7 * 24
xa = x[:inflection]
ya = y[:inflection]
xb = x[inflection:]
yb = y[inflection:]

fa = sp.poly1d(sp.polyfit(xa, ya, 1))
fb = sp.poly1d(sp.polyfit(xb, yb, 1))

plot_models(x, y, [fa, fb], os.path.join(CHART_DIR, "1400_01_05.png"))

그래프를 그려보면 아래와 같다. 
위와 같이 3.5주차를 기준으로 다른 차수들로 그래프를 그려보면 또 아래와 같다.
위 그래프를 보면 고차 다항식은 다소 과적합화 되어 있고
저차 다항식은 과소적합화 되어 있다. 
그렇다면 어떻게 미래를 예측할 수 있는 모델을 찾을 수 있을까?


훈련과 테스트

미래를 볼 수 없더라고 부분 데이터로 유사한 영향을 가정할 수 있고, 해야만 한다. 
그 예로, 일정 부분의 데이터를 제거하고 나머지로 훈련해보자.

변곡점 이후로부터 훈련된 모델의 테스트 오차는 현저한 차이가 있다.

Error d=1: 6397694.386394
Error d=2: 6010775.401243
Error d=3: 6047678.658525
Error d=10: 7037666.529344
Error d=53: 7052608.109674

오차가 가장 작은 2차 다항식이 최후의 승자이다.


최초 질문에 대답하기

큰 흐름을 잘 반영하는 2차 다항식 모델을 찾았다. 
이 함수를 어떻게 현실에 적용할 것인가.
만약 시간당 100,000 요청이 언제쯤 될지 찾는 일 같은 일을 수행할 수 있을 것이다.

다항식에서 100,000을 빼고 이 결과 다항식의 근을 찾으면 된다.
Scipy optimize 모듈의 fsolve 함수로 근을 구할 수 있다. 

from scipy.optimize import fsolve
print(fbt2)
print(fbt2 - 100000)
reached_max = fsolve(fbt2 - 100000, x0=800) / (7 * 24)
print("100,000 hits/hour expected at week %f" % reached_max[0])

위 코드에 의해 결과는 9.616071 주차임을 예상할 수 있다.

좀 더 먼 미래를 예상할 때는 분산 같은 정교한 통계를 이용해야한다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리