5.2 グリッドサーチ
(45m)09:30~10:15
5.2グリッドサーチ
5.2.3交差検証を使用したグリッドサーチ
SVCのCとgammaで一番汎化性能が高いモデルを探る。
①:for inで総当たり。
for gamma in[0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm =SVC(gamma=gamma,C=C)
svm.fit(X_train,y_train)
score =svm.score(X_test,y_test)
if score>best_score:
best_score=score
best_parameters={"C":C,"gamma":gamma}
print(f"Best score:{best_score:.2f}")
print(f"Best parameters:{best_parameters}")
②:汎化性能検証で使ったデータとテストデータが同じではだめだ
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)
for gamma in[0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm =SVC(gamma=gamma,C=C)
svm.fit(X_train,y_train)
score =svm.score(X_valid,y_valid)
if score>best_score:
best_score=score
best_parameters={"C":C,"gamma":gamma}
test_score=svm.score(X_test,y_test)
③さらに交差検証も行う
for gamma in[0.001,0.01,0.1,1,10,100]:
for C in[0.001,0.01,0.1,1,10,100]:
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}
④これをまとめたのがGridSearchCV
param_grid = {"C":[0.001,0.01,0.1,1,10,100],"gamma":[0.001,0.01,0.1,1,10,100]}
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
grid_search =GridSearchCV(SVC(),param_grid,cv=5)
grid_search.fit(X_train,y_train)
#この時点ですべてが計算されてベストの形になる。以下はその説明
「IN」
print(f"best parameters:{grid_search.best_params_}")
print(f"best cross-validation score :{grid_search.best_score_:.2f}")
print(f"best estimator:\n{grid_search.best_estimator_}")
「OUT」
best parameters:{'C': 100, 'gamma': 0.01}
best cross-validation score :0.97
best estimator:
SVC(C=100, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma=0.01, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
パラメータを設定して
param_grid = {"C":[0.001,0.01,0.1,1,10,100],"gamma":[0.001,0.01,0.1,1,10,100]}
GridSearchCVをつかえ。
交差検証もしてくれる。
GridSearchCVはcvパラメータを渡せる。訓練とテストの分割を一度にするにはShuffleSplitかStratifiedShuffelSpitを使ってn_iter=1にすると良い。
# 一番下は正直意味わからん。
・ヒートマップでもチェックできる
import pandas as pd
results = pd.DataFrame(grid_search.cv_results_)
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")
・場合分けでパラメータを渡すこともできる。
param_grid=[{"kernel":["rbf"],"C":[0.001,0.01,0.1,1,10,100],"gamma":[0.001,0.01,0.1,1,10,100]},
{"kernel":["linear"],"C":[0.001,0.01,0.1,1,10,100]}]grid_search=GridSearchCV(SVC(),param_grid,cv=5)
#SVCはkernelによって"C","gamma"が関わる場合とそうでない場合がある。その事前パラメータ分け
5.2.3.3異なる検証手法を用いたグリッドサーチ
GridSearchCVはcvパラメータを渡せる。訓練とテストの分割を一度にするにはShuffleSplitかStratifiedShuffelSpitを使ってn_iter=1にすると良い。
# 正直意味わからん。
5.2.3.4
scores =cross_val_score(GridSearchCV(SVC(),param_grid,cv=5),iris.data,iris.target,cv=5)
グリッドサーチしたパラメータで交差検証。
5.2.3.5交差検証とグリッドサーチの並列化
GridSearchCVとcross_val_scoreはn_jobsで複数コア使用可(n_jobs=-1で最大限使用)
ただしscikit-learnではサポートされていないのでsklearnのモデルでは不可。