-
하이퍼 파라미터 튜닝 - GridSearchCV카테고리 없음 2022. 6. 22. 15:27
사용할 데이터
import seaborn as sns dia = sns.load_dataset("diamonds") #seaborn에서 diamonds샘플 데이터를 가져옵니다 dia.columns Index(['price', 'cut', 'color', 'clarity', 'depth', 'table', 'carat', 'x', 'y', 'z'], dtype='object') # price : 종속변수 , 다이아몬드 가격 # 'x' : 다이아몬드 x 축 길이 # 'y' : 다이아몬드 y 축 길이 # 'z' : 다이아몬드 z 축 길이 dia.head()
price cut color clarity depth table carat x y z 326 Ideal E SI2 61.5 55.0 0.23 3.95 3.98 2.43 326 Premium E SI1 59.8 61.0 0.21 3.89 3.84 2.31 327 Good E VS1 56.9 65.0 0.23 4.05 4.07 2.31 334 Premium I VS2 62.4 58.0 0.29 4.20 4.23 2.63 335 Good J SI2 63.3 58.0 0.31 4.34 4.35 2.75 #전처리는 범주형 변수만 원핫인코딩 진행 dia = pd.get_dummies(data = dia, columns=['cut','color','clarity']) #종속변수 설정 y = dia['price'] #독립변수 설정 x_list = [] for x in dia.columns: if x != 'price': x_list.append(x) x = dia[x_list]
1. 사이킷런 model_selection 패키지의 GridSearchCV 클래스를 불러옵니다
from sklearn import model_selection #from sklearn.model_selection import GridSearchCV
2. 모델과 파라미터를 정의 합니다
dtr = DecisionTreeRegressor(random_state=42) grid_params = {'max_depth':[None,10,15,20,25,30,35], 'min_samples_leaf':[10,20,30]}
하이퍼 파라미터는 딕셔너리 형태로 key 를 파라미터, value를 해당 값으로 설정합니다.
3. GridSearchCV 객체를 생성합니다
grid_dtr = model_selection.GridSearchCV(model, params, scoring='neg_root_mean_squared_error', cv=5, return_train_score=True)
더보기GridSearchCV 주요 파라미터
estimator : 자신이 정의 한 모델
param_grid : 우리가 완전 탐색할 파라미터(딕셔너리)
scoring : 평가지표
cv : fold 수 ( 교차검증 횟수)
return_train_score : True 로 설정시 결과값 속성을 불러올 때 훈련 점수까지 불러 올 수 있습니다.
refit : 최고 점수로 설정된 하이퍼 파라미터로 다시 전체 데이터를 학습시킵니다.4. 적합시킵니다.
grid_dtr.fit(x_train,y_train)
5. best_estimator_속성을 다시 할당합니다.
#주요 속성 print(grid_dtr.best_score_) -654.3322993618057 print(grid_dtr.best_estimator_) DecisionTreeRegressor(min_samples_leaf=12, random_state=42) #모델에 파라미터값 전달 dtr = grid_dtr.best_estimator_
5. 성능이 가장 좋은 파라미터를 가진 학습기로 모델을 훈련시킵니다.
#train 전체 데이터를 적합 dtr.fit(x_train,y_train) #예측 y_pred = dtr.predict(x_test) #테스트 세트에 대한 rmse값 from sklearn import metrics print(np.sqrt(metrics.mean_squared_error(y_pred,y_test))) 629.6115576448587
전체 코드#1 from sklearn import model_selection from sklearn.tree import DecisionTreeRegressor #2 dtr = DecisionTreeRegressor(random_state=42) grid_params = {'max_depth':[None,10,15,20,25,30,35], 'min_samples_leaf':[10,20,30]} #3 grid_dtr = model_selection.GridSearchCV(model, params, scoring='neg_root_mean_squared_error', cv=5, return_train_score=True) #4 grid_dtr.fit(x_train,y_train) #5 dtr = grid_dtr.best_estimator_ dtr.fit(x_train,y_train) dtr.predcit(x_test)
추가 : 그리드 서치한 교차 검증 셋의 스코어 보기
#grid_dtr.cv_results_ : 딕셔너리 형태로 점수가 할당 되어 있어 데이터 프레임으로 변환 grid_result = pd.DataFrame(grid_dtr.cv_results_) grid_result[['params','mean_test_score','mean_train_score']].head() #train_score의 경우 return_train_score=True 설정을 해야함.
RandomizedSearchCV 함수를 사용하여 탐색 범위를 먼저 줄이고 완전 탐색하는 것(GridSearchCV)을 권장합니다.