Building Machine Learning System with Python ch.2.2
평가 : 홀드아웃 데이터와 교차 검증
우리가 정말 하고 싶은 작업은 새로운 데이터에 대해 일반화하는 모델의 능력을 측정하는 것이다.
알고리즘이 훈련 시 보지 못한 인스턴스에 대한 성능을 측정해야한다.
이를 테스트하기 위해 두 부분으로 나누어, 하나는 모델을 훈련시키고 다른 하나는 데스트에 사용했다.
이상적으로는 훈련할 때와 테스트할 때 모든 데이터를 사용하는 것이 좋다.
이를 교차 검증이라하며, 단순한 교차 검증의 형태는 단일 잔류라 한다.
하나의 예제를 제외한 모든 데이터로 모델을 학습하고, 이 모델로 남은 하나의 예제를 잘 분류하는 지 보는 것이다.
from threshold import fit_model, predict
correct = 0.0
for ei in range(len(features)):
training = np.ones(len(features), bool)
training[ei] = False
testing = ~training
model = fit_model(features[training], is_virginica[training])
predict(model, features[testing])
predictions = predict(model, features[testing])
correct += np.sum(predictions == is_virginica[testing])
acc = correct/float(len(features))
print('Accuracy: {0:.1%}'.format(acc))
fit_model 과 predit 함수들을 통해 단일 잔류로 검증을 할 수 있었다.
하지만 단일 잔류의 중요한 문제점은 몇 배 더 가중된 일을 해야한다는 점이다.
그래서 x 중첨 교차 검증을 사용해 작은 비용으로 단일 잔류의 장점을 얻을 수 있다.
x 는 작은 숫자로, 이를 테면 5정도이다. 하나의 원소를 대신해 전체 데이터의 20%를 남겨둔다. 남거진 이 데이터로 테스트를 하고 그 값들의 평균을 구한다.
중첩을 만들 때, 데이터의 균형이 중요하다. 이를테면, 한 중첩에 있는 모든 예제가 같은 범주라면, 결과를 신뢰할 수 없다.
하지만 이것을 어떻게 구체적으로 나눌까 고민하지 말자.
기계학습 패키지 sklearn 은 이 문제를 잘 처리해준다.
좀 더 복잡한 분류기 만들기
분류 모델은 무엇으로 구성되어 있는지 살펴보자.
1. 모델의 구조 : 모델은 어떻게 정확히 결정하나?
2. 검색 과정 : 우리가 사용한 모델을 어떻게 찾을까? 좋은 해결책을 찾기 위해 발전적인 최적화를 사용한다. (scikit-learn 에는 이를 위해 미리 구현되어 있고, 이를 사용하면 쉽다.)
3. 이득/손실 함수 : 반환할 테스트 확률이 무엇인지를 어떻게 결정할까?
1. 모델의 구조 : 모델은 어떻게 정확히 결정하나?
2. 검색 과정 : 우리가 사용한 모델을 어떻게 찾을까? 좋은 해결책을 찾기 위해 발전적인 최적화를 사용한다. (scikit-learn 에는 이를 위해 미리 구현되어 있고, 이를 사용하면 쉽다.)
3. 이득/손실 함수 : 반환할 테스트 확률이 무엇인지를 어떻게 결정할까?
댓글
댓글 쓰기