ファイナンス機械学習:交差検証による特徴量重要度 練習問題 グリッドサーチ

前章で用いた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)

経過時間、ノード数などの結果は以下のようになった。

GridSearchCV

スニペット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()
clfHyperFit


いいなと思ったら応援しよう!