[Intro to Machine Learning] Underfitting and Overfitting

과적합(Overfitting)
트리의 경우 여러 부분 나눌 수 있다.
한 번 나눈다면 2(21)개의 leaf node가 생기게 되는 것이고
두 번 나눈다면 4(22)개의 leaf node가 생기게 되는 것이고
세 번 나눈다면 8(23)개의 leaf node가 생긴다.
그럼에 따라서 n번 트리를 분할한다면, leaf의 갯수는 2n개가 되는 것이다.
위의 그림의 경우 총 두 번 분할한 경우인데 평수를 기준으로 나누는 노드를 기준으로 보자면 8500 feet 이상의 평 수는 여러 집이 될 것이고 아닌 경우의 수도 여러개 된다.
11500 feet 보다 크거나, 아니면 작은 집의 평수의 경우도 여러가지가 된다.
하지만, 이보다 더 자세하게 기준을 나눠서 각 Leaf node에 1개의 데이터가 들어갈 수 있게 트리를 매우 촘촘하게 나눈다고 가정해보자.
그러면 모델을 평가할 때, 어떤 문제가 발생할까?
모델을 학습할 때 그 모델은 1개에 leaf node 데이터에 대해서만 학습한 경우이기 때문에 새로운 데이터가 들어온다면 새로운 데이터에 대해서 평가를 내릴 수 없는 상태가 될 것이다.다음 온도를 예측할려고 하는데 온도가 하나밖에 없다면 다음 온도를 예측하기 어렵듯이
그런 상태를 모델이 과적합되었다라고 말한다.
과소적합(Underfitting)
과소적합은 과적합과 상대되는 말로,
과적합의 경우에는 leaf node에 1개의 경우의 데이터 밖에 없었던 반면에,
과소적합은 leaf node에 너무 많은 데이터가 들어가 있어 모델이 검증 데이터에 대해 제대로 판단이 어려운 경우를 말한다.
어떤 방식으로 해결해야 할까?
과소적합(Underfitting), 과대적합(Overfitting)의 경우 모두 트리의 깊이(depth)에 큰 영향을 받는다는 사실을 알 수 있다.
그렇다면, 모델을 학습을 시키고 나서 여러가지 경우의 트리의 깊이를 모델에 대입을 해본후 가장적은 값의 MSE(Mean Absolute Error)를 최적의 모델로 추론하면 될 듯하다.
Exercise
# Mean Absolute Error 측정 함수
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return(mae)
candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
scores = {
leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) \
for leaf_size in candidate_max_leaf_nodes
}
best_tree_size = min(scores, key=scores.get)
# Fill in argument to make optimal size and uncomment
final_model = DecisionTreeRegressor(max_leaf_nodes=best_tree_size, random_state=1)
# fit the final model and uncomment the next two lines
final_model.fit(X, y)