ファイナンス機械学習:交差検証による特徴量重要度 練習問題 グリッドサーチ
前章で用いたgetTestDataで特徴量10(有益:5、ノイズ:5)、サンプル数10,000の観測値データを作成し、10分割CVのグリッドサーチをRBFカーネルのSVCで、評価関数をneg_log_lossとし、最適なパラメータCと$${\gamma}$$を見つけ、グリッド内の点の数と最適解を見つけるまでのフィット数、経過時間、評価指標を求めよ。
前記事のclfHyperFit関数の返り値は最適パラメータを持つSVCで、グリッドサーチの経過時間、フィット数はわからないので、この関数は使わずに直接グリッドサーチを呼ぶ。
def printHSResult(clf, cv):
num_nodes = len(clf.cv_results_['rank_test_score'])
total_time = clf.refit_time_ * num_nodes * cv
best_scores, best_scores_idx, mean_score_time, mean_fit_time = [], 0, .0, .0
for i in np.arange(cv):
best_scores.append(clf.cv_results_["split"+ str(i) +"_test_score"][clf.best_index_])
idx = np.where(max(best_scores) == best_scores)[0][0] #always + 1 because index starts from 0 as default
best_scores_idx = (clf.best_index_ + 1) + len(clf.cv_results_['mean_score_time']) * idx
print("Best params for estimator:",clf.best_estimator_)
print("Best CV Score: %.6f" %max(best_scores))
print(f"The number of fitting until the best parameter was found is {best_scores_idx}")
print("Estimated time : %.2f seconds" %total_time)
print(f"Total number of nodes: {num_nodes}\n")
i = 0
while i < (clf.best_index_ + 1):
mean_score_time += clf.cv_results_['mean_score_time'][i]
mean_fit_time += clf.cv_results_['mean_fit_time'][i]
i+=1
print("Estimated total mean time:\nScore Time: {0:.2f}s\nFit Time: {1:.2f}s".format(mean_score_time, mean_fit_time))
n_features=10
n_informative=5
n_redundant=0
n_samples=10_000
X,y=fi.getTestData(n_features=n_features,n_informative=n_informative,
n_redundant=n_redundant,n_samples=n_samples,random_state=0)
cv = 10
param_grid = {'C':[1e-2, 1e-1, 1, 10, 100],
'gamma': [1e-2, 1e-1, 1, 10, 100]}
svm = SVC(kernel='rbf',probability=True)
clf = GridSearchCV(estimator = svm,
param_grid = param_grid,
scoring='neg_log_loss',
n_jobs=-1,
refit=True,
cv= cv,
verbose=10)
clf.fit(X,y['bin'],sample_weight = None)
printHSResults(clf,cv=cv)
経過時間、ノード数などの結果は以下のようになった。
スニペット9.3を使用して、評価関数はf1で、パージング付きで行った結果は以下の通りである。
fit_params={'sample_weight': None
#,'sample_weight': w[y]
}
clfH=clfHyperFit(feat=X, lbl=y['bin'],t1=y['t1'], pipe_clf=svm, param_grid=param_grid, cv = cv,
bagging= [0, None, 1.], n_jobs= -1,
pctEmbargo= 0.1,**fit_params)
clfH.get_params()