ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [분석/통계] 그리드 서치
    Study/Statistics 2019. 5. 29. 16:26
    여러 조합의 매개변수로 모델을 만들어 최고 성능을 내는 최적 매개변수를 찾아줌

     

    모델에서 중요한 매개변수(일반화 성능을 최대로 높여주는)의 값을 찾기는 어렵지만 꼭 해야하기 때문에 간단하게 알맞는 매개변수를 찾는 방법으로 그리드 서치를 이용

     

    그리드 서치란?

    관심 있는 매개변수들을 대상으로 가능한 모든 조합을 시도하여 최적의 매개변수를 찾는 방법

    매개변수를 튜닝하여 일반화 성능을 개선해줌

    python의 skit-learn에서 제공

     

    검증 세트

    매개변수를 조정할 때 훈련/테스트로만 나눠서 최적 매개변수를 찾게 되면 새로운 데이터에는 안맞을 수도 있어 테스트 데이터가 더 이상 모델 평가에 적합하지 않은 데이터가 될 수 있음

     

    때문에 훈련/검증/테스트세트로 나눠야함

     

    1. 매개 변수 바꿔가며 모델 학습 : 훈련 데이터 사용

    2. 1에서 학습한 모델 평가하여 최적 매개변수 선택 : 검증 데이터 사용

    3. 1,2 반복

    4. 최적 매개변수를 대입한 모델 학습 : 훈련 + 검증 데이터 사용

    5. 최적 매개변수를 대입한 모델 평가 : 테스트 데이터 사용

    python에서 skit-learn을 이용하여 구현한 코드

    from sklearn.svm import SVC
    
    # 데이터를 훈련+검증 세트 그리고 테스트 세트로 분할
    X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0)
    # 훈련+검증 세트를 훈련 세트와 검증 세트로 분할
    X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1)
    print("훈련 세트의 크기: {}   검증 세트의 크기: {}   테스트 세트의 크기:"
          " {}\n".format(X_train.shape[0], X_valid.shape[0], X_test.shape[0]))
    
    best_score = 0
    
    for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:
        for C in [0.001, 0.01, 0.1, 1, 10, 100]:
            # 매개변수의 각 조합에 대해 SVC를 훈련시킵니다
            svm = SVC(gamma=gamma, C=C)
            svm.fit(X_train, y_train)
            # 검증 세트로 SVC를 평가합니다
            score = svm.score(X_valid, y_valid)
            # 점수가 더 높으면 매개변수와 함께 기록합니다
            if score > best_score:
                best_score = score
                best_parameters = {'C': C, 'gamma': gamma}
    
    
    # 훈련 세트와 검증 세트를 합쳐 모델을 다시 만든 후
    # 테스트 세트를 사용해 평가합니다
    svm = SVC(**best_parameters)
    svm.fit(X_trainval, y_trainval)
    test_score = svm.score(X_test, y_test)
    print("검증 세트에서 최고 점수: {:.2f}".format(best_score))
    print("최적 파라미터: ", best_parameters)
    print("최적 파라미터에서 테스트 세트 점수: {:.2f}".format(test_score))

    * 테스트 데이터를 분석전에 보거나(데이터 탐색을 위한 시각화), 매개변수 선택 등 어떤 선택에 사용해서는 안됨!!!!!

     

     

    교차검증을 사용한 그리드 서치

    훈련 세트와 검증 세트에 교차 검증을 사용해서, 각 매개변수 조합의 성능을 평가하는 것이 일반화 성능을 잘 평가하는 방법임

     

    python에서 skit-learn을 이용하여 구현한 코드

    for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:
        for C in [0.001, 0.01, 0.1, 1, 10, 100]:
            # 매개변수의 각 조합에 대해 SVC를 훈련시킵니다
            svm = SVC(gamma=gamma, C=C)
            # 교차 검증을 적용합니다
            scores = cross_val_score(svm, X_trainval, y_trainval, cv=5)
            # 교차 검증 정확도의 평균을 계산합니다
            score = np.mean(scores)
            # 점수가 더 높으면 매개변수와 함께 기록합니다
            if score > best_score:
                best_score = score
                best_parameters = {'C': C, 'gamma': gamma}
                
              
    # 훈련 세트와 검증 세트를 합쳐 모델을 다시 만듭니다
    svm = SVC(**best_parameters)
    svm.fit(X_trainval, y_trainval)
    # 매개변수 그리드 만들기
    param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
                  'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
    print("매개변수 그리드:\n", param_grid)
    
    
    # GridSearchCV를 이용하여 교차검증 그리드 객체 만들기
    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import SVC
    grid_search = GridSearchCV(SVC(), param_grid, cv=5, return_train_score=True)
    # GridSearchCV(모델, 검색 대상 매개변수 그리드, cv=몇번 교차검증, return_train_score=True)
    
    
    # 데이터 나누기 훈련/테스트
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,random_state=0)
    
    
    # 최적의 매개변수로 전체 훈련 데이터 세트에 대한 새로운 모델을 자동으로 만듬
    grid_search.fit(X_train, y_train)
    
    
    # 최적의 매개변수를 사용한 모델의 테스트 정확도 확인
    print("테스트 세트 점수: {:.2f}".format(grid_search.score(X_test, y_test)))
    
    
    # 최적 매개변수 (테스트 사용되지 않음)
    print("최적 매개변수:", grid_search.best_params_)
    
    # 최상의 교차 검증 정확도 (테스트 사용되지 않음)
    print("최고 교차 검증 점수: {:.2f}".format(grid_search.best_score_))
    
    # 최고 성능의 모델 구성 요소 확인
    print("최고 성능 모델:\n", grid_search.best_estimator_)

     

    교차검증을 사용한 그리드 서치의 결과 분석

    교차검증을 사용한 그리드 서치는 시간이 매우 많이 들기 때문에 한번에 모든 범위를 검증하면 안됨!

    범위를 크게->좁게 하는 등 범위를 차근차근 조정해나가야함

     

    매개변수 조정에 따른 교차 검증 평균을 히트맵으로 나타내어 확인할 수 있음

    파이썬 구현 코드

    import pandas as pd
    pd.set_option('display.max_columns', None)
    # DataFrame으로 변환합니다
    results = pd.DataFrame(grid_search.cv_results_)
    # 처음 다섯 개 행을 출력합니다
    display(np.transpose(results.head()))
    
    scores = np.array(results.mean_test_score).reshape(6, 6)
    
    # 교차 검증 평균 점수 히트맵 그래프
    mglearn.tools.heatmap(scores, xlabel='gamma', xticklabels=param_grid['gamma'],
                          ylabel='C', yticklabels=param_grid['C'], cmap="viridis")

    감마와 c 매개변수에 따른 검증 평균 점수를 히트맵으로 본 결과

    37%~97%까지 매개변수에 따라 정확도가 많이 달라짐을 확인할 수 있음

     

     

     

     

     

     

     

     

     

    잘못된 범위를 선택한 경우 히트맵

    점수 변화가 없는 경우
    세로 띠 형태
    한쪽으로만 변화가 있는 경우

    스케일 범위를 잘못 정했을때

    or 매개변수가 중요하지 않을때

    하나의 매개변수만 정확도에 영향을 주는 경우(하나만 중요한 매개변수) or

    나머지 하나의 범위를 잘못 지정한 경우

    잘못된 범위를 포함한 경우
    극단적인 값 적용 -> 조금씩 바꿔보기   잘 선택한 쪽의 경계 너머로 범위 변경

     

    * 그리드 서치를 사용하기 전에 내가 분석하고자하는 데이터 특성과 모델에 맞는 매개변수가 무엇인지 정확히 파악한 후 필요한 매개변수로만 그리드 서치를 해야함

     

     

    중첩교차검증

    훈련/검증/테스트로 데이터를 나눠 교차검증을 사용한 그리드 서치를 하는 것

     

    특정 데이터셋에서 주어진 모델이 얼마나 잘 일반화 되었는지 평가할 때 사용 

    댓글

Designed by Tistory.