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%를 남겨둔다. 남거진 이 데이터로 테스트를 하고 그 값들의 평균을 구한다.


중첩을 5개로 두어 데이터 전체를 사용해 테스트와 트레이닝을 한다.
중첩을 만들 때, 데이터의 균형이 중요하다. 이를테면, 한 중첩에 있는 모든 예제가 같은 범주라면, 결과를 신뢰할 수 없다. 
하지만 이것을 어떻게 구체적으로 나눌까 고민하지 말자. 
기계학습 패키지 sklearn 은 이 문제를 잘 처리해준다.


좀 더 복잡한 분류기 만들기

분류 모델은 무엇으로 구성되어 있는지 살펴보자.

1. 모델의 구조 : 모델은 어떻게 정확히 결정하나?
2. 검색 과정 : 우리가 사용한 모델을 어떻게 찾을까? 좋은 해결책을 찾기 위해 발전적인 최적화를 사용한다. (scikit-learn 에는 이를 위해 미리 구현되어 있고, 이를 사용하면 쉽다.)
3. 이득/손실 함수 : 반환할 테스트 확률이 무엇인지를 어떻게 결정할까?

댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리