교차검증

Sam (토론 | 기여)님의 2021년 9월 3일 (금) 23:19 판 (새 문서: == 개요 == 크로스 밸리데이션(Cross validation). 데이터를 훈련 데이터와 검증 데이터로 분할한 다음 학습의 타당성을 검증하는 것. 데이터가...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

1 개요편집

크로스 밸리데이션(Cross validation). 데이터를 훈련 데이터와 검증 데이터로 분할한 다음 학습의 타당성을 검증하는 것.

데이터가 많지 않을 때 훈련데이터와 검증데이터로 나누면 운 좋게 비슷한 성격의 데이터들이 분리되어 오류율이 줄어들기도 한다. 이런 경우엔 학습을 할 때마다 오류비율이 달라지는데, 이를 방지하고 모든 데이터를 써서 정확한 오차를 판단하기 위해 사용하는 기법이다.(데이터가 충분히 큰 경우엔 그닥 사용하지 않는 방법이다.)

2 이론편집

2.1 K 분할 교차검증편집

K-fold cross validation. 데이터를 K개로 분할해 훈련과 테스트를 반복한다. 예컨대 데이터를 3개의 집합으로 분리한다면

  1. 집합 1을 테스터데이터로 쓰고 집합 2,3을 훈련데이터로 사용한다.
  2. 집합 2를 테이스테이터로 쓰고 집합 1,3을 훈련데이터로 사용한다.
  3. 집합 3을 테이스테이터로 쓰고 집합 1,2를 훈련데이터로 사용한다.

각각의 과정에서의 정밀도를 구하고 이를 평균내어 최종적인 분류 정밀도를 구한다.

데이터를 남김없이 학습에 활용할 수 있다는 장점이 있다.

다음과 같은 형태로 코드를 짜면 되는데... 일반적으로 인공지능 프레임워크에 이런 기능을 간단하게 수행할 수 있도록 구현해 둔다.

K = 5  # 몇 개의 데이터로 분할할 것인지 결정.
random.shuffle(데이터)  # 데이터를 섞는다.
listk = [ [] for i in range(K) ]  # K개의 리스트를 만든다.
for i in range(len(데이터)):  # 데이터 갯수만큼 반복
    listk[i % K].append(데이터[i])  # i번째 데이터를 i/K의 나머지번째에 해당하는 리스트에 넣는다.

3 사이킷런을 이용한 방법편집

의도 설명 방법
기본 사용법 모델과 데이터를 안에 넣고 돌린다.
from sklearn.model_selection import cross_val_score

score = -1 * cross_val_score(모델, X, y,
                              cv=5,
                              scoring='neg_mean_absolute_error')
-1을 곱해주는 것은 사이킷런에서 -는 부정의 의미로 쓰이기 때문이다. 평균절대값에러이지만 음수로 표현되기 때문에 -1을 붙여준다.
파이프라인을 쓰는 경우 다음과 같이 쓸 수 있다.

모델까지 담은 파이프라인을 그대로 넣고 순서대로 기입한다.

자세한 방법은 '파이프라인' 참고.

scores = -1 * cross_val_score(my_pipeline, X, y,
                                  cv=3,
                                  scoring='neg_mean_absolute_error')

3.1 사용하는 인자편집

인자 설명
cv 몇 개의 묶음으로 나눌 것인가. 5개라면 전체 데이터를 5개의 묶음으로 나눈 후 한 묶음씩 검증데이터로 떼어 5번의 검증을 진행한다.
scoring 어떤 방법으로 검증할 것인가. 사이킷런에서 제공하는 검증방법은 다음의 페이지에서 안내한다. 링크