Python의 교차 검증: 알아야 할 모든 것
게시 됨: 2020-02-14데이터 과학에서 검증은 데이터 과학자가 ML 모델의 안정성을 검증하고 새 데이터에 얼마나 잘 일반화되는지 평가하는 데 사용하는 가장 중요한 기술 중 하나일 것입니다. 유효성 검사는 ML 모델이 데이터 세트의 노이즈를 성공적으로 제거하면서 데이터 세트에서 올바른(관련) 패턴을 선택하는지 확인합니다. 기본적으로 유효성 검사 기술의 목표는 ML 모델의 편향 분산 계수가 낮은지 확인하는 것입니다.
오늘 우리는 그러한 모델 검증 기술 중 하나인 교차 검증에 대해 길게 논의할 것입니다.
목차
교차 검증이란 무엇입니까?
교차 검증은 통계 분석(모델) 결과가 독립 데이터 세트로 일반화되는 방식을 평가하고 평가하기 위해 설계된 검증 기술입니다. 교차 검증은 주로 예측이 주요 목표인 시나리오에서 사용되며 사용자는 실제 상황에서 예측 모델이 얼마나 정확하고 잘 수행되는지 추정하고자 합니다.
교차 검증은 과적합 및 과소적합과 같은 문제를 최소화하는 데 도움이 되도록 훈련 단계에서 모델을 테스트하여 데이터 세트를 정의하려고 합니다. 그러나 검증 및 훈련 세트는 모두 동일한 분포에서 추출해야 한다는 점을 기억해야 합니다. 그렇지 않으면 검증 단계에서 문제가 발생할 수 있습니다.
세계 최고의 대학에서 데이터 과학 인증 과정 을 알아보십시오 . 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.
교차 검증의 이점
- 모델의 품질을 평가하는 데 도움이 됩니다.
- 과적합 및 과소적합 문제를 줄이거나 방지하는 데 도움이 됩니다.
- 이를 통해 보이지 않는 데이터에 대해 최상의 성능을 제공할 모델을 선택할 수 있습니다.
읽기: 초보자를 위한 Python 프로젝트
과적합과 과소적합이란?
과적합은 모델이 너무 데이터에 민감해지고 결국에는 보이지 않는 데이터로 잘 일반화되지 않는 많은 노이즈와 무작위 패턴을 포착하게 되는 조건을 나타냅니다. 이러한 모델은 일반적으로 훈련 세트에서 잘 수행되지만 테스트 세트에서는 성능이 저하됩니다.
Underfitting은 모델이 데이터 세트에서 충분한 패턴을 캡처하지 못하여 훈련 세트와 테스트 세트 모두에 대해 낮은 성능을 제공하는 문제를 나타냅니다.
이 두 극단을 거치면 완벽한 모델은 훈련 세트와 테스트 세트 모두에서 똑같이 잘 수행되는 모델입니다.
원천
교차 검증: 다양한 검증 전략
검증 전략은 데이터 세트에서 수행된 분할 수에 따라 분류됩니다. 이제 Python의 다양한 교차 검증 전략을 살펴보겠습니다.
1. 검증 세트
이 검증 접근 방식은 데이터 세트를 동일한 두 부분으로 나눕니다. 데이터 세트의 50%는 검증을 위해 예약되고 나머지 50%는 모델 훈련을 위해 예약됩니다. 이 접근 방식은 주어진 데이터 세트의 50%만 기반으로 모델을 훈련하기 때문에 데이터의 다른 50%에 숨겨진 관련성 있고 의미 있는 정보를 놓칠 가능성이 항상 남아 있습니다. 결과적으로 이 접근 방식은 일반적으로 모델에서 더 높은 편향을 생성합니다.
원천
파이썬 코드:
기차, 검증 = train_test_split(데이터, test_size=0.50, random_state = 5)
2. 훈련/테스트 분할
이 검증 접근 방식에서 데이터 세트는 훈련 세트와 테스트 세트의 두 부분으로 나뉩니다. 이것은 훈련 세트와 테스트 세트 사이의 겹침을 피하기 위해 수행됩니다(훈련 세트와 테스트 세트가 겹치면 모델에 결함이 있음). 따라서 모델에 사용된 데이터 세트에는 데이터 세트에 중복된 샘플이 포함되지 않아야 합니다. 훈련/테스트 분할 전략을 사용하면 모델의 하이퍼파라미터를 변경하지 않고 전체 데이터 세트를 기반으로 모델을 다시 훈련할 수 있습니다.
원천
그러나 이 접근 방식에는 한 가지 중요한 제한이 있습니다. 모델의 성능과 정확도는 주로 분할 방식에 따라 달라집니다. 예를 들어 분할이 무작위가 아니거나 데이터 집합의 하위 집합에 전체 정보의 일부만 있는 경우 과적합이 발생합니다. 이 접근 방식을 사용하면 어떤 데이터 포인트가 어떤 유효성 검사 세트에 있는지 확신할 수 없으므로 세트마다 다른 결과가 생성됩니다. 따라서 학습/테스트 분할 전략은 충분한 데이터가 있는 경우에만 사용해야 합니다.
파이썬 코드:
>>> sklearn.model_selection import train_test_split에서
>>> X, y = np.arange(10).reshape((5, 2)), 범위(5)
>>> X
배열([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> 목록(y)
[0, 1, 2, 3, 4]
3. K-폴드
앞의 두 가지 전략에서 볼 수 있듯이 데이터 세트에서 중요한 정보를 놓칠 가능성이 있어 바이어스로 인한 오류나 과적합의 가능성이 높아집니다. 이를 위해서는 모델 훈련을 위해 풍부한 데이터를 예약하는 동시에 검증을 위해 충분한 데이터를 남겨두는 방법이 필요합니다.
K-폴드 검증 기법을 입력합니다. 이 전략에서 데이터 세트는 'k'개의 서브세트 또는 폴드로 분할되며, 여기서 k-1 서브세트는 모델 교육용으로 예약되고 마지막 서브세트는 검증(테스트 세트)에 사용됩니다. 모델은 개별 접기에 대해 평균을 낸 다음 완성됩니다. 모델이 완성되면 테스트 세트를 사용하여 테스트할 수 있습니다.

원천
여기에서 각 데이터 포인트는 학습 세트 k-1에 여러 번 남아 있는 동안 유효성 검사 세트에 정확히 한 번 나타납니다. 대부분의 데이터가 피팅에 사용되기 때문에 과소적합 문제가 크게 줄어듭니다. 유사하게, 대부분의 데이터가 검증 세트에서도 사용되기 때문에 과적합 문제가 제거됩니다.
읽기: Python 대 Ruby: 완벽한 나란히 비교
K-fold 전략은 제한된 양의 데이터가 있고 접기 품질에 상당한 차이가 있거나 이들 간에 최적 매개변수가 다른 경우에 가장 적합합니다.
파이썬 코드:
sklearn.model_selection에서 가져오기 KFold # 가져오기 KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) # 배열 생성
y = np.array([1, 2, 3, 4]) # 다른 배열 생성
kf = KFold(n_splits=2) # 분할 정의 – 2개의 폴드로
kf.get_n_splits(X) # 교차 검증기에서 분할 반복 횟수를 반환합니다.
인쇄(kf)
KFold(n_splits=2, random_state=없음, 셔플=거짓)
4. 하나는 남겨두세요
LOOCV(leave one out cross-validation)는 k가 특정 데이터 세트의 샘플 수와 같을 때 K-폴드의 특별한 경우입니다. 여기에서 하나의 데이터 포인트만 테스트 세트에 예약되고 나머지 데이터 세트는 훈련 세트입니다. 따라서 "k-1" 개체를 훈련 샘플로 사용하고 "1" 개체를 테스트 세트로 사용하면 데이터 세트의 모든 샘플을 통해 계속 반복됩니다. 사용 가능한 데이터가 너무 적을 때 가장 유용한 방법입니다.
원천
이 접근 방식은 모든 데이터 포인트를 사용하므로 일반적으로 편향이 낮습니다. 그러나 검증 과정을 'n'번(n=데이터 포인트의 수) 반복할수록 실행 시간이 늘어납니다. 방법의 또 다른 주목할만한 제약은 하나의 데이터 포인트에 대해 모델을 테스트할 때 모델 효율성 테스트에서 더 큰 변동을 초래할 수 있다는 것입니다. 따라서 해당 데이터 포인트가 이상값이면 더 높은 변동 지수를 생성합니다.
파이썬 코드:
>>> numpy를 np로 가져오기
>>> sklearn.model_selection 가져오기 LeaveOneOut에서
>>> X = np.array([[1, 2], [3, 4]])
>>> y = np.array([1, 2])
>>> loo = LeaveOneOut()
>>> loo.get_n_splits(X)
2
>>> 인쇄(loo)
나가기()
>>> train_index의 경우, loo.split(X)의 test_index:
… print(“TRAIN:”, train_index, “TEST:”, test_index)
… X_train, X_test = X[train_index], X[test_index]
… y_train, y_test = y[train_index], y[test_index]
... 인쇄(X_train, X_test, y_train, y_test)
기차: [1] 테스트: [0]
[[3 4]] [[1 2]] [2] [1]
기차: [0] 테스트: [1]
[[1 2]] [[3 4]] [1] [2]
5. 계층화
일반적으로 학습/테스트 분할 및 K-폴드의 경우 데이터를 섞어서 임의의 학습 및 검증 분할을 생성합니다. 따라서 다른 접기에서 다른 대상 분포를 허용합니다. 유사하게, 계층화는 데이터를 분할하는 동안 다른 폴드에 대한 대상 분포를 용이하게 합니다.
이 프로세스에서 데이터는 각 폴드가 전체를 대표하도록 하는 방식으로 다른 폴드로 재배열됩니다. 따라서 각 클래스가 데이터의 50%로 구성된 이진 분류 문제를 처리하는 경우 계층화를 사용하여 각 클래스에 인스턴스의 절반이 포함되는 방식으로 데이터를 정렬할 수 있습니다.
계층화 프로세스는 다중 클래스 분류가 있는 작고 불균형한 데이터 세트에 가장 적합합니다.
파이썬 코드:
sklearn.model_selection 가져오기 StratifiedKFold에서
skf = StratifiedKFold(n_splits=5, random_state=없음)
# X는 기능 집합이고 y는 대상입니다.
train_index의 경우 skf.split(X,y)의 test_index:
print("기차:", train_index, "검증:", val_index)
X_train, X_test = X[train_index], X[val_index]
y_train, y_test = y[기차_색인], y[발_색인]
읽기: Python의 데이터 프레임 – 자습서
이 5가지 교차 검증 전략을 각각 언제 사용해야 합니까?
앞서 언급했듯이 각 교차 검증 기술에는 고유한 사용 사례가 있으므로 올바른 시나리오에 올바르게 적용할 때 최상의 성능을 발휘합니다. 예를 들어, 충분한 데이터가 있고 다른 분할에 대한 점수와 최적 매개변수(모델의)가 유사할 가능성이 있는 경우 학습/테스트 분할 접근 방식이 훌륭하게 작동합니다.
그러나 점수와 최적의 매개변수가 서로 다른 분할에 대해 다르다면 K-폴드 기술이 가장 좋습니다. 데이터가 너무 적은 경우에는 LOOCV 접근 방식이 가장 잘 작동하는 반면, 작고 불균형한 데이터 세트의 경우 계층화가 올바른 방법입니다.
이 자세한 기사가 Python의 교차 검증에 대한 심층적인 아이디어를 얻는 데 도움이 되었기를 바랍니다.
데이터 과학에 대해 자세히 알고 싶으시면 작업 전문가를 위해 만들어졌으며 10개 이상의 사례 연구 및 프로젝트, 실용적인 실습 워크샵, 업계 전문가와의 멘토링, 1 - 업계 멘토와 일대일, 400시간 이상의 학습 및 최고의 기업과의 취업 지원.
ML에서 '순열 테스트'란 무엇입니까?
데이터 세트에 대한 테스트 통계를 생성한 다음 해당 데이터의 많은 무작위 순열에 대해 순열 테스트를 사용하여 모델의 통계적 유의성을 평가합니다. 모형이 유의한 경우 초기 검정 통계 값은 귀무 가설 분포의 꼬리 중 하나에 속해야 합니다. p-값을 찾으려면 초기 테스트 통계만큼 심각하거나 더 극단적인 테스트 통계의 수를 계산한 다음 그 수를 우리가 계산한 테스트 통계의 총 수로 나누어야 합니다. 귀무 가설이 참인 경우 P-값은 최소한 검정 통계량만큼 심각한 결과를 얻을 확률입니다.
기계 학습에서 교차 검증의 단점은 무엇입니까?
1. Cross Validation은 훈련 기간을 상당히 연장시킵니다. 이전에는 하나의 훈련 세트에서만 모델을 훈련할 수 있었습니다. 이제 교차 검증을 사용하여 여러 훈련 세트에서 훈련할 수 있습니다.
2. 대부분의 경우 연구 중인 구조는 예측 모델링에서 시간이 지남에 따라 발전합니다. 결과적으로 훈련 및 검증 세트의 변형을 확인할 수 있습니다.
3. Cross Validation은 많은 컴퓨팅 파워를 필요로 합니다.
ML 모델에서 과적합을 감지하려면 어떻게 해야 합니까?
데이터를 평가하기 전에 과적합을 감지하는 것은 거의 불가능합니다. 과적합의 본질적인 특징인 데이터 세트를 일반화하는 어려움을 해결하는 데 도움이 될 수 있습니다. 결과적으로 데이터는 훈련과 테스트를 더 쉽게 하기 위해 별개의 하위 집합으로 나눌 수 있습니다. 두 데이터 세트에서 볼 수 있는 정확도의 비율을 사용하여 과적합이 존재하는지 여부를 결정할 수 있습니다. 모델이 테스트 세트보다 훈련 세트에서 더 잘 수행된다면 과적합일 가능성이 있습니다.
또 다른 제안은 기준 역할을 하는 매우 기본적인 ML 모델로 시작하는 것입니다. 나중에 복잡한 알고리즘을 테스트할 때 추가된 복잡성이 가치가 있는지 판단하기 위한 벤치마크를 갖게 됩니다.
정확도 및 손실과 같은 검증 수단을 사용하여 과적합을 감지할 수도 있습니다. 모델이 과적합의 영향을 받는 경우 유효성 검사 측정값은 일반적으로 정체되거나 감소하기 시작할 때까지 증가합니다.