상세 컨텐츠

본문 제목

머신러닝 (6) - Fine Tuning Model

IT/Machine Learning

by HarimKang 2020. 2. 12. 14:20

본문

Writer: Harim Kang

머신러닝 - 6. End-to-End Machine Learning Project (5)

해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고, 제 생각 또한 함께 포스팅한 내용입니다. 아래의 포스팅에 이어진 내용입니다.

2020/01/28 - [IT/Machine Learning] - 머신러닝 (5) - Cross Validation(교차검증)

 

머신러닝 (5) - Cross Validation(교차검증)

Writer: Harim Kang 머신러닝 - 5. End-to-End Machine Learning Project (4) 해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고,..

davinci-ai.tistory.com

오늘의 포스팅은 위의 포스팅에 이어지는 내용으로, Fine-tuning model에 대한 내용입니다. 해당 포스팅은 Hyperparameter, Grid Search, Randomized Search 에 대한 내용을 포함하고 있으며, Scikit-learn 라이브러리 메서드를 사용하여 코드를 작성하였습니다.

Fine-tuning the model

Fine-tunung은 최고의 성능을 내는 하이퍼 파라미터(Hyperparameter) 조합을 찾는 것을 목표로 합니다.

Hyperparameter란?

모델링을 위해서 모델에게 직접 세팅해주는 값을 의미합니다. 각 모델들이 필요로하는 매개변수들을 의미합니다. 예를 들면, learning rate나 SVM에서는 C값, KNN에서는 k값 등등 모델이 필요로 하는 값을 말합니다.

Grid Search

  • GridSearchCV()

    • sklearn에서는 해당 클래스를 제공하여 그리드 서치를 진행하도록 합니다.

    • estimator: sklearn estimator interface

    • param_grid: 찾고자하는 매개변수의 이름을 선언해줍니다. dict 또는 dict의 리스트 형태로 전달합니다.

    • cv: int, 교차검증 생성자 또는 반복자입니다.

    • Scoring: 평가 기준으로 할 함수를 의미합니다.

      from sklearn.model_selection import GridSearchCV
      
      param_grid = [
      {'n_estimators': [10, 30], 'max_features': [2, 4, 6, 8, 10]}
      ]
      
      forest_reg = RandomForestRegressor(random_state=42)
      
      #train across 5 folds, that's a total of 10*5=50 rounds of training
      grid_search = GridSearchCV(forest_reg, param_grid, cv=5, scoring='neg_mean_squared_error', return_train_score=True)
      grid_search.fit(housing_prepared, housing_labels)

      Housing Price Prediction 데이터를 사용하여 그리드 서치를 수행하는 코드입니다. param_grid를 통해서 각 매개변수 어떤 값을 써볼 것인지를 선언해줍니다. 위의 예제에서는 n_estimators 2개, max_features 5개 총 10개의 조합으로 그리드 서치를 진행합니다.
      RandomForestRegressor모델을 사용하였고, 이 모델을 사용하여 평가하는 과정입니다. cv는 fold의 수입니다. 데이터를 5개의 fold로 나누어서 학습을 진행하며, 조합 10가지와 5개의 fold이므로 총 50회의 학습을 진행합니다. fit을 통해서 데이터를 전달해주면 됩니다.

      cvres = grid_search.cv_results_
      for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):
      print(np.sqrt(-mean_score), params)

      10개의 조합마다 rmse를 확인한 결과입니다.

      max_features는 10, n_estimators는 30일 때, rmse가 가장 낮은 점수를 확인하였습니다. 해당 조합의 모델의 성능이 가장 좋다는 것을 알수 있습니다.
      최적의 조합은 grid_search.best_params_라는 메소드를 통해서 리턴받을 수도 있습니다.

Randomized Search

  • 그리드 서치에서는 grid_param과 같이 매개변수마다 특정 값을 지정해주었습니다. 만약에 변수 범위가 너무 다양하다면 하나하나 작성해주어야하는걸 까요?

  • 하이퍼 파라미터 검색 반영이 너무 클때 사용하는 방식이 Randomized Search입니다.

  • 이름 그대로 범위 사이의 랜덤한 변수들 조합을 사용하여 탐색합니다.

  • RandomizedSearchCV()

    • estimator: 그리드 서치와 동일합니다.

    • Param_distributions: dict, 변수 명과 해당 변수의 범위를 랜덤 값으로 선언하는 매개변수 입니다.

    • n_iter: int, 몇 번 반복하여 수행할 것인지에 대한 값입니다.

    • cv, Scoring: 그리드 서치와 동일합니다.

      from sklearn.model_selection import RandomizedSearchCV
      from scipy.stats import randint
      
      param_distribs = {
            'n_estimators': randint(low=1, high=200),
            'max_features': randint(low=1, high=8),
        }
      forest_reg = RandomForestRegressor(random_state=42)
      rnd_search = RandomizedSearchCV(forest_reg, param_distributions=param_distribs, n_iter=10, cv=5,           scoring='neg_mean_squared_error', random_state=42)
      rnd_search.fit(housing_prepared, housing_labels)

      param_distribs 부분과 RandomizedSearchCV를 사용한다는 점 외의 코드는 그리드 서치와 동일합니다. param_distribs에서 조합을 찾고자하는 변수들과 해당 변수의 범위를 가지고 randint를 통해 랜덤값을 주도록 하였습니다.

      cvres = rnd_search.cv_results_  
      for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):
        print(np.sqrt(-mean_score), params)

      10번의 랜덤 값 지정을 통해서 나온 결과입니다.

      max_features는 10, n_estimators는 30일 때, rmse가 가장 낮은 점수를 얻습니다. 해당 변수에서 최고의 성능을 보이는 모델이 생성됨을 확인 할 수 있습니다.

이후의 Fine-Tune Model

  • Ensemble Methods
    • 위의 방법 후, fine-tuning을 하는 방법에는 앙상블(Ensemble) 방법이 있습니다.
    • 이것은 최고의 성능을 내는 모델들을 결합하는 방식입니다.
    • 해당 방법은 적절한 케이스에 사용하면 각각의 모델이 내는 성능보다 뛰어난 성능을 보여줍니다.
    • 이 방식은 추후 더 자세히 포스팅하겠습니다.
  • 최고의 모델과 그것들의 오류들을 분석
    • Decision Tree와 같은 모델에서 사용하는 방법입니다.
    • 덜 중요한 요소들을 사용하지 않는(Dropping) 방법을 사용합니다.
    • feature_importnaces_를 사용하여 요소들의 중요도를 파악할 수 있습니다.
  • Test Set에서 평가하는 방법
    • 최종적인 모델을 테스트 세트를 사용하여 평가합니다.
    • 테스트 데이터세트를 full_pipeline을 사용하여 변환시킨 후에 해당 모델의 점수를 확인하여야합니다.
    • 훈련 또는 검증에서는 좋은 평가였지만, 테스트 데이터 세트에서는 나쁜 점수가 나온다면, 과적합(overfitting)일 가능성이 높습니다.

Fine-tuning을 포함한 예제 및 실습 코드는 아래의 깃허브 주소에 있습니다.

https://github.com/harimkang/Scikit-Learn-Example/blob/master/Housing%20Price%20Prediction.ipynb

 

harimkang/Scikit-Learn-Example

Analyze and predict various data to learn how to use Scikit-learn - harimkang/Scikit-Learn-Example

github.com

Reference

hyperparameter: https://machinelearningmastery.com/difference-between-a-parameter-and-a-hyperparameter/
 

What is the Difference Between a Parameter and a Hyperparameter?

It can be confusing when you get started in applied machine learning. There are so many terms to use and many of the terms may not be used consistently. This is especially true if you have come from another field of study that may use some of the same term

machinelearningmastery.com

관련글 더보기

댓글 영역