여러가지공부/머신러닝(Machine Learning)

[머신러닝] k-fold cross validation이란? 파이썬 예제 실습

끄적끄적아무거나 2023. 3. 31. 08:27
반응형

 

목차

     

     

     

     

     

    [머신러닝] k-fold cross validation이란?

     

    k-fold 교차 검증(k-fold cross validation)은 머신러닝에서 모델의 성능을 측정하고 검증하는 기술 중 하나입니다. 이 방법은 데이터 세트를 k개의 부분집합으로 분할하고, 이 중 하나를 검증 데이터(validation data)로 사용하고, 나머지 k-1개의 부분집합을 학습 데이터(training data)로 사용하여 모델을 학습시키는 과정을 k번 반복하는 것입니다.

     

    이 과정에서 k개의 모델이 생성되고 각각의 모델은 서로 다른 검증 데이터로 성능을 측정합니다. 이렇게 측정된 성능 지표를 k번 평균하여 최종 성능 지표를 계산합니다.

     

    위 그림의 경우 5-fold cross validation을 수행합니다. 데이터 세트는 5개의 부분집합으로 분할됩니다. 이 중 하나를 검증 데이터로 사용하고, 나머지 4개를 학습 데이터로 사용하여 모델을 학습시키는 과정을 5번 반복합니다. 각각의 모델은 서로 다른 검증 데이터를 사용하여 성능을 평가합니다. 이렇게 측정된 성능 지표를 평균하여 최종 성능 지표를 계산합니다.

     

     

    간단하게 정리하면 가지고 있는 데이터를 k 조각 내고 1조각은 validation에 쓰고 나머지는 training에 사용하고 조각을 바꾸면서 모델을 만들고 score를 측정하는 기술입니다.

     

     

     

    장점:

    1. 더 나은 모델 성능 측정: 모델의 일반화 성능을 더 정확하게 측정할 수 있습니다. 모든 데이터가 모델 성능 측정에 사용되기 때문입니다.

    2. Overfitting 방지: 모델이 Overfitting 되는 것을 방지할 수 있습니다. 검증 데이터와 학습 데이터를 나누어 사용하므로, 모델이 학습 데이터에 Overfitting 되는 것을 방지할 수 있습니다.

    3. 하이퍼파라미터 튜닝: 하이퍼파라미터의 최적값을 찾는 데 도움을 줍니다. 하이퍼파라미터의 최적값을 찾으면 모델의 성능을 최적화할 수 있습니다.

    단점:

    1. 계산 비용: 계산 비용이 높을 수 있습니다. 모델을 k번 학습해야 하기 때문입니다.

    2. 데이터 불균형: 데이터가 불균형한 경우, 즉 클래스 분포가 불균형한 경우, 검증 데이터가 대표성을 잃을 수 있습니다. 이는 모델의 성능을 과대평가할 가능성이 있습니다.


     

     

    [머신러닝] k-fold cross validation 종류

     

    위에서 설명한 종류는 대표적인 종류이고 그 외는 아래와 같습니다. 종류를 이해하기 전에 Class와 Group에 대한 설명을 하면 아래와 같습니다.

     

    Class는 일반적으로 분류 문제에서 사용되는 용어로, 데이터가 속한 범주를 나타냅니다. 예를 들어, 붓꽃 데이터 세트에서는 꽃의 종류가 세 가지(class)로 분류됩니다.

    반면, Group은 데이터의 그룹을 나타내는 용어입니다. 데이터가 어떤 그룹에 속하는지에 따라 데이터 간의 상관 관계나 종속성이 있을 수 있습니다. 예를 들어, 의료 연구에서는 환자들을 각각의 그룹으로 나눌 수 있으며, 한 그룹에 속한 환자들이 다른 그룹에 속한 환자들과는 다르게 반응할 수 있습니다.

    Group과 Class는 모두 머신러닝에서 데이터의 분할 및 모델링에서 중요한 역할을 합니다. Group을 고려하는 Group k-fold와 같은 기술은 데이터의 그룹 간 종속성을 고려하여 모델의 성능을 더욱 정확하게 평가할 수 있도록 합니다. Class는 일반적으로 분류 문제에서 중요한 역할을 하며, 분류 문제에서는 데이터의 클래스 불균형 문제를 고려해야 할 수 있습니다.




     

    Stratified k-fold

     

    Stratified k-fold는 k-fold cross validation의 한 종류로, 분류 문제에서 클래스 비율이 불균형한 경우 모델의 성능을 더 정확하게 측정할 수 있도록 하는 기술입니다. Stratified k-fold는 각각의 fold에서 학습 데이터와 검증 데이터가 각각의 클래스 비율을 잘 대표하도록 데이터를 분할합니다.

    일반적인 k-fold cross validation은 데이터 세트를 무작위로 분할하므로, 클래스 비율이 불균형한 경우 검증 데이터에 한 클래스가 적게 포함될 가능성이 높습니다. 이러한 경우 모델의 성능 측정이 정확하지 않을 수 있습니다. Stratified k-fold는 클래스 비율이 불균형한 경우에도 검증 데이터에 각각의 클래스가 적절하게 포함되도록 데이터를 분할하여 이 문제를 해결합니다.

     

    간단하게 클래스를 fold 개수에 맞춰서 분류해서 모든 클래스가 포함되도록 합니다.

     

     

     

     

     

     

    Group k-fold

     

     

    Group k-fold는 k-fold cross validation의 한 종류로, 데이터 세트에 그룹이 있는 경우 각각의 그룹이 한 fold에 속하는 것을 방지하여 모델의 성능을 보다 정확하게 측정할 수 있도록 하는 기술입니다. Group k-fold는 학습 데이터와 검증 데이터가 각각의 그룹을 공유하지 않도록 데이터를 분할합니다.

     

    간단하게 동일 그룹이 Testing과 Training 에 동시에 포함되지 않음

     

     

     

    Bootstrap

     

    간단하게 데이터를 조각내고 조각을 랜덤하게 선택해서 Train 시킵니다. 동일 조각이 Training Set에 포함될 수 있습니다.

     

     

     

     

     

    Python k-fold cross validation 예제

     

    예제 코드>>

    from sklearn.model_selection import KFold
    from sklearn.linear_model import LinearRegression
    from sklearn.datasets import load_diabetes
    import numpy as np
    
    diabetes = load_diabetes()
    X = diabetes.data
    y = diabetes.target
    
    # 5-fold cross validation 수행
    kf = KFold(n_splits=5)
    scores = []
    for train_index, test_index in kf.split(X):
        # 학습 데이터와 검증 데이터 분할
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        
        # 모델 학습 및 검증
        model = LinearRegression()
        model.fit(X_train, y_train)
        score = model.score(X_test, y_test)
        scores.append(score)
    
    # k-fold cross validation 결과 출력
    print("Cross validation scores: {}".format(scores))
    print("Average score: {}".format(np.mean(scores)))

     

    6~8번 라인: sklearn에서 diabete 정보를 불러와서 예측을 원하는 값을 target으로 입력은 data로 불러 옵니다.

    11번 라인: 5번의 k fold를 진행합니다.

    13~22번 라인: 각 폴더별 모델을 만들고 score를 계산합니다.

     

     

     

     

     

    결과>>

    Cross validation scores: [0.4295561538258378, 0.5225993866099365, 0.48268054134528227, 0.4264977611104024, 0.5502483366517519]
    Average score: 0.48231643590864215

     

    반응형