728x90
Experimenting With Different Models
  • 이번 수업을 마치고 나면, 여러분은 언더피팅(underfitting)과 오버피팅(overfitting)의 개념에 대해 알고, 이러한 개념을 모델을 더 정확하게 만들기 위해 사용할 수 있을 것입니다.

Experimenting With Different Models

  • 이제 여러분은 모델의 정확도를 측정하는 적절한 방법을 갖고, 다른 모델과 비교하여 어떤 것이 제일 괜찮은 예측을 제공하는지 실험할 수 있습니다. 하지만 모델을 위한 대안은 어떻게 해야 할까요?

  • 여러분은 scikit-learn 문서에서 결정 트리 모델이 (여러분이 오랫동안 원하거나 필요로 하는 것 보다도 많은) 옵션을 제공하는 것을 볼 수 있습니다. 가장 중요한 옵션은 트리의 깊이를 결정하는 것입니다. 이 수업의 가장 첫 단원을 되돌아보면 트리의 깊이는 예측 이전에 얼마나 많은 분류가 이루어지는지에 대한 단위였습니다. 이것은 매우 얇은 트리입니다.

  • 실제로, 트리가 최상단(모든 집)에서 잎까지 10개의 분류를 갖는 것은 매우 흔하지 않은 일입니다. 이것이 깊어질수록, 데이터셋은 더 적은 집의 잎으로 나누어집니다. 만약 트리가 한 개의 분류만을 갖고 있다면, 그 트리는 데이터를 2개의 그룹으로 나눌 것입니다. 만약 한번 더 나누면, 우리는 4개의 집 그룹을 얻게 될 것입니다. 다시 나누면 8개의 그룹이 만들어질 것입니다. 만약 계속해서 그룹의 개수를 두배로 만들면서 각 단계마다 더 많은 분류를 추가한다면, 우리는 10단계에 이르렀을 때 2102^10개의 집의 그룹을 얻게 될 것입니다.

  • 우리가 집들을 매우 많은 잎으로 나누게 될 때, 우리는 각 잎에 매우 적은 집들이 남겨지게 됩니다. 매우 적은 집들을 갖는 잎은 실제 집값과 꽤나 가까운 예측을 하겠지만, 새로운 데이터에 대해서는 매우 적절하지 않은 예측을 하게 될 것입니다(각 예측은 매우 적은 집들에 기반하기 때문입니다).

  • 모델이 학습 데이터에 거의 정확하게 일치하게 되지만, 새로운 데이터나 검증 시에는 그렇지 못한 이 현상을 오버피팅이라고 부릅니다. 반면, 만약 트리가 매우 얕다면, 집들을 분명한 그룹으로 나누지 못할 것입니다.

  • 극단적으로, 만약 트리가 집들을 2~4개의 그룹으로 나눈다면, 각 그룹은 넓은 범위의 집을 갖게 될 것입니다. 예측 결과는 학습 데이터에도 불구하고, 대부분의 집에 대해 동떨어진 결과를 낼 것입니다(같은 이유로 검증 시에도 좋지 않은 결과가 나타날 것입니다). 모델이 중요한 특정이나 패턴을 데이터에서 찾지 못한다면, 학습 데이터일지라도 좋지 못한 성능을 나타낼 것입니다. 이를 언더피팅이라고 부릅니다.

  • 우리는 검증 데이터에서 예측하여야 하는 새로운 데이터에 대한 정확도에 집중하기 때문에, 우리는 언더피팅과 오버피팅 사이의 스위트 스팟을 찾아야 합니다. 시각적으로, 우리는 검증 커브(아래 붉은 색)의 최저점을 원하고 있습니다.

Example

  • 트리 깊이를 조절하기 위한 몇 가지 대안이 있고, 다른 경로보다 일부 경로가 더 깊은 깊이를 갖도록 하는 많은 방법이 있습니다. 하지만 max_leaf_nodes 매개변수는 매우 감각적으로 오버피팅과 언더피팅을 조절할 수 있도록 해줍니다. 모델에 더 많은 잎을 만들수록, 언더피팅 영역에서 오버피팅으로 이동하게 됩니다.
  • 우리는 max_leaf_nodes를 위한 다른 값들로부터 MAE 점수를 비교하기 위한 유틸리티 함수를 사용할 수 있습니다.
from sklearn.tree import DecisionTreeRegressor 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)
  • 이 데이타는 여러분이 본(그리고 이미 써본) 코드를 사용하여 train_X, val_X, train_y, val_y로 저장됩니다.
  • 우리는 for-루프를 이용하여 max_leaf_nodes에 따라 다른 값으로 만들어진 모델의 정확도를 비교해볼 수 있습니다.
# compare MAE with differing values of max_leaf_nodes for max_leaf_nodes in [5, 50, 500, 5000]: my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y) print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380 Max leaf nodes: 50 Mean Absolute Error: 258171 Max leaf nodes: 500 Mean Absolute Error: 243495 Max leaf nodes: 5000 Mean Absolute Error: 254983
  • 목록의 옵션에 따르면, 500이 최적화된 잎의 개수임을 알 수 있습니다.

Conclusion

  • 결론적으로:모델은 다음과 같은 문제를 겼을 수 있습니다:
    • 오버피팅 : 앞으로 일어나지 않거나, 덜 정확한 예측으로 이끄는 가짜 패턴을 잡는 경우 혹은
    • 언더피팅 : 연관된 패턴을 잡는데 실패하여, 덜 정확한 예측으로 가는 경우
  • 우리는 모델 학습에 사용되지 않은, 검증 데이터를 사용하여, 후보 모델의 정확도를 측정합니다. 이를 통해 우리가 많은 후보 모델을 시도해보고 가장 좋은 하나를 선택할 수 있습니다.
728x90

+ Recent posts