https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html

 

sklearn.model_selection.GridSearchCV

Examples using sklearn.model_selection.GridSearchCV: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.24, Feature agglomeration vs. univariate selection Feature agglom...

scikit-learn.org

 

머신러닝 라이브러리 중에서 Scikit Learn 라이브러리는 굉장히 많이 사용되고 있는 라이브러리입니다. 

또한 모델의 성능을 높이기 위한 방법 중 하이퍼 파라미터 튜닝은 효과적이지만, 일일이 입력하고 학습한다면 많은 노력과 시간이 필요한 작업입니다.

 

이를 위해 sklearn에서는 하이퍼 파라미터 튜닝과 함께, 교차검증을 지원하는 GridSearchCV라는 유용한 기능을 제공하고 있습니다. 

 

또한 GridSearchCV은 하나의 모델만 튜닝 가능한 것이 아니라 여러가지 모델을 한꺼번에 튜닝하고 그 중에서 최적의 모델을 선택할 수 있는 기능이 있습니다. 

 

from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
from sklearn import tree
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

#원하는 모델의 개수 만큼 선언해주세요.
clf1=RandomForestClassifier()
clf2=tree.DecisionTreeClassifier()
clf3=svm.SVC(probability=True )
clf4=GaussianNB()

#각각의 순서 별로 테스트할 하이퍼 파라미터를 설정해주세요.
#주의할 점은 __로 구분된 하이퍼 파라미터 키는 분류기 단어로 시작해야 합니다.
param1 = {}
param1['classifier__n_estimators'] = [100, 200]
param1['classifier__max_depth'] = [8, 10, 12, 14]
param1['classifier__min_samples_split'] = [10, 12, 14, 16]
param1['classifier__min_samples_leaf'] = [2, 4, 6, 8]
param1['classifier'] = [clf1]

param2 = {}
param2['classifier__max_depth'] =  [6,8,10,12]
param2['classifier__min_samples_split'] = [8,10, 12, 14]
param2['classifier__min_samples_leaf'] = [4, 6 ,8]
param2['classifier'] = [clf2]

param3 = {}
param3['classifier__C'] = [1, 10, 100, 1000]
param3['classifier__gamma']=[0.1,0.01,0.001]
param3['classifier'] = [clf3]

param4 = {}
param4['classifier__var_smoothing'] = np.logspace(0,-9, num=100)
param4['classifier'] = [clf4]

#파이프라인을 설정하고, classifier로 적어둔뒤, 첫번째 모델인 clf1를 넣어주세요
pipeline = Pipeline([('classifier', clf1)])
params = [param1, param2, param3, param4]
gs = GridSearchCV(pipeline, params, cv=5, n_jobs=-1, scoring='f1_micro').fit(X_data, y_data)

 

교차검증은 5로, 4개의 모델을 학습 시켜보겠습니다~ 

scoring은 f1 score로 하겠습니다.

 

학습 뒤에 best_params_ 와 best_score_를 통해 선택한 score에서 가장 높은 점수를 낸 파라미터와 점수를 알 수 있습니다. ( 디폴트는 acc입니다.)

print('GridSearchCV 최적 파라미터 :', gs.best_params_ )
print('GridSearchCV 최고 f1 score : ' , gs.best_score_)

저는 svm 모델이 최고 성능으로 나왔네요.

 

모두 GridSearchCV 사용해서 빠르게 하이퍼 파라미터 조정하세요~

1) numpy

arange() : 순차적인 ndarray를 만들 때 사용할 수 있다.

사용법 : np.arange()

→ 굳이 for문 돌려가며 만들 필요 없다.

ex) np.arange(5)을 하면 [0, 1, 2, 3, 4]의 ndarray를 반환해준다. 파이썬의 range와 비슷하게 돌아간다.

 

argsort() : 정렬된 행렬의 인덱스를 반환해준다.

사용법 : np.argsort()

→ 정렬한 다음에 굳이 for문 돌려서 인덱스를 따로 저장할 필요가 없음.

(이것 때문에 머리 좀 아파봤다. 미리 알았으면 좋았을 기능 중에 하나!..)

 

불린 인덱싱 : 조건 필터링과 검색을 동시에 할 수 있는 기능

사용법 : ndarray의 [ ] 내에 True/False를 반환하도록 조건문만 기재하면 된다.

ex) array[array>0] ,  그러면 0을 초과하는 array만 추출이 가능하다.

 

2) pandas

info() : 칼럼별로 데이터 개수, 타입, null 개수를 알려준다. 

사용법 : df.info()

→ 굳이 list로 바꿔서 len하고, print해서 확인할 필요 없음, 처음 df 만들고 데이터 확인할 때 유용하다.

 

describe() : count와 평균값, 표준편차 등등을 알려주는 메소드이다. 대략적인 분포도를 알 수 있다. 마찬가지로 처음 데이터 확인할 때 참고할 만하다.

사용법 : df.describe()

 

value_counts() : 해당 칼럼 별로 개수를 알 수 있음.

사용법 : df['해당칼럼이름']l.value_counts()

→ 굳이 조건문 써가면서 셀 필요 없다. 마찬가지로 이거 몰라서 노가다 함.

 

values.tolist() : df를 리스트로 변환

사용법 : df.values.tolist()

→ np.array()로 바꿔서 list로 바꿨던 거 같은데 이런 방법도 있었다.

 

sort_values() : 해당 칼럼을 기준으로 df 정렬

사용법 : df.sort_values(by=['해당칼럼이름'])

 

isna() : NaN인 데이터에 대해 true를 반환한다. 

사용법 : df.isna()

→ 보통 sum을 같이 사용해서 개수를 알 수 있다.

 

fillna() : NaN인 데이터를 다른 값으로  채워 넣는다.

사용법 : df.fillna('바꿀값', inplace=True)

 

apply() : lamda식을 적용할 수 있다. 코드를 깔끔하게 해 준다.

사용법 : df.apply(lamda ~)

ex) df.apply[lamda x : len(x))

+ Recent posts