본문 바로가기
Learning-driven Methodology/ML (Machine Learning)

[Machine Learning] 무작위 탐색 (RandomizedSearchCV)

by goatlab 2023. 7. 10.
728x90
반응형
SMALL

무작위 탐색 (RandomizedSearchCV)

 

Random Search는 Grid Search의 단점들을 조금 보완하고자 나온 방법이다. 말 그대도 파라미터의 범위를 선정하고 값을 랜덤으로 설정하여 파라미터를 조합하고 평가하는 방식이다. Grid Search와 방식 자체는 유사하나 Grid Search보다 근사 최적값을 빨리 찾을 수 있다. 또한, 격자 형식의 Grid Search와 다르게 그 사이값들도 랜덤으로 탐색할 수 있기 때문에 그 안에서 더 좋은 값을 찾을 수 있다는 장점도 있다.

 

즉, 몇 번 학습과 평가를 반복할 것인지 시도의 수를 직접 설정할 수 있기 때문에 비교적 시간이 적게 걸린다. RandomizedSearchCV 가 사용하는 인자들은 GridSearchCV와 거의 동일하지만, n_iter라는 인자가 추가되었고 param_grid 대신 param_distributions를 사용한다.

 

매개 변수

 

estimator 모델 객체 지정
param_distributions 하이퍼파라미터 목록을 dictionary로 전달
n_iter 파라미터 검색 횟수
scoring 교차검증 시 fold 개수
cv 평가 지표
n_jobs 사용할 CPU 코어 개수 (1 : 기본값, -1 : 모든 코어 사용)

 

메서드

 

fit(X, y) 학습
predict(X) 베스트 모델 예측
predict_proba(X) 베스트 모델호출

 

결과 조회 변수

 

cv_results_ 파라미터 조합별 결과 조회
best_params_ 베스트 parameter 조합 조회
best_estimator_ 베스트 모델 반환

 

예제

 

import sklearn
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

iris = load_iris()
label = iris.target
data = iris.data

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=1)

dt_clf = DecisionTreeClassifier(random_state=1)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)

print('예측 정확도 : {0:.4f}'.format(accuracy))
print('DecisionTreeClassifier 하이퍼파라미터:\n', dt_clf.get_params())
param_dist = {
    'criterion':['gini','entropy'], 
    'max_depth':[None,2,3,4,5,6], 
    'max_leaf_nodes':[None,2,3,4,5,6,7], 
    'min_samples_split':[2,3,4,5,6], 
    'min_samples_leaf':[1,2,3], 
    'max_features':[None,'sqrt','log2',3,4,5]
}

rand_search = RandomizedSearchCV(dt_clf, param_distributions = param_dist, n_iter = 50, cv = 5, scoring = 'accuracy', refit=True)
rand_search.fit(X_train, y_train)

print('best parameters : ', rand_search.best_params_)
print('best score : ', round(rand_search.best_score_, 4))
df = pd.DataFrame(rand_search.cv_results_)
df
estimator = rand_search.best_estimator_

pred = estimator.predict(X_test)
print('score: ', round(accuracy_score(y_test,pred), 4))
728x90
반응형
LIST