
382
2
fastai 애플리케이션 계층 이해하기
>>> def r_mse(pred,y): return round(math.sqrt(((pred-y)**2).mean()), 6)
>>> def m_rmse(m, xs, y): return r_mse(m.predict(xs), y)
>>> m_rmse(m, xs, y)
0.0
결과만 보면 완벽한 모델을 찾은 것처럼 보입니다. 그렇죠? 하지만 과적합이 발생하지 않는지
를 확인하려면
m
_
rmse
의 계산 대상이 학습용이 아닌 검증용 데이터셋이어야만 합니다.
>>> m_rmse(m, valid_xs, valid_y)
0.337727
이런! 꽤 높은 수준의 과적합이 발생했나 봅니다! 이유는 다음과 같습니다.
>>> m.get_n_leaves(), len(xs)
(340909, 404710)
리프 노드의 개수가 전체 데이터 개수만큼이나 존재합니다! 열정이 과한 모델이라고 할 수 있
을지도 모르겠네요. 사이킷런의 기본 설정은 각 리프 노드에 포함된 데이터가 하나가 될 때까
지 계속해서 분할을 만들어나가죠. 따라서 분할을 멈추도록 하는 규칙을 정해야만 합니다. 가
령 다음 코드는 각 리프 노드가 데이터를 최소
25
개 포함하도록 규칙을 지정합니다.
>>> m = DecisionTreeRegressor(min_samples_leaf=25 ...