ハイパーパラメータの最適化 - ハーフグリッド検索 HalvingSearchCV

        

目次

1. ハーフグリッド検索の基本原理

2. ハーフグリッド検索の制限事項

3.HalvingGridSearchCV类

4. ハーフグリッド検索の実装

5. ランダムグリッド検索の実装


        前回の確率的グリッド検索では、列挙型グリッド検索操作の速度を決定する要因について学びました: ① パラメータ空間のサイズ: パラメータ空間が大きいほど、より多くのモデリングが必要になります; ② データ量のサイズ:データ量 値が大きいほど、各モデリング操作に必要な計算能力と時間が増加します。列挙グリッド検索が遅すぎるという問題に直面して、sklearn は 2 つの最適化方法を提示します。1 つは検索空間を調整することで、もう 1 つはトレーニングごとにデータを調整することです。探索空間を調整する方法はランダムグリッドサーチ、各学習データを調整する方法はハーフグリッドサーチです。

1. ハーフグリッド検索の基本原理

        データセットがありD、そのデータDセットdパラメータのセットがデータ セット全体でパフォーマンスが悪い場合、このパラメータのセットはDデータ セットのサブセットdでパフォーマンスが良くない可能性が高くなります。逆に、パラメータのセットがサブセットで適切にパフォーマンスを発揮しない場合、データ セット全体でのこのパラメータのセットのパフォーマンスはd信頼できません。サブセットと完全なデータ セットにフィードバックされたパラメーターのパフォーマンスは一貫しています。この仮定が正しい場合、グリッド検索では、毎回パラメーター セットを検証するためにすべてのデータを使用する代わりに、それを持ち込むことのみを検討できるかもしれません。データのサブセットを使用してハイパーパラメータをフィルタリングすると、操作が大幅に高速化されます。D

        ただし、実際のデータでは、この仮定は条件付きです。つまり、サブセットの分布は完全なデータセット D の分布に似ています。サブセットの分布が完全なデータ セットの分布に近い場合、サブセットと完全なデータ セットに対する同じパラメーター セットのパフォーマンスが一貫している可能性が高くなります。ランダム グリッド検索で得られた以前の結論によると、サブセットが大きくなるほど、その分布は完全なデータ セットの分布に近づくことがわかりますが、サブセットが大きいとトレーニング時間が長くなるため、全体的なトレーニング効率を考えると、サブセットを無限に増やすことはできません。これにより、大きなサブセットの結果の信頼性は高くなりますが、大きなサブセットの計算は遅くなるという矛盾が生じます。セミグリッド探索アルゴリズムは、サブセットのサイズと計算効率のバランスを考慮した絶妙なプロセスを設計しており、具体的なプロセスは次のとおりです。

① まず、完全なデータセットから非置換で小さなサブセットをランダムにサンプリングしd_{0}d_{0}すべてのパラメータの組み合わせのパフォーマンスを検証します。上記の検証結果に基づいてd_{0}、下位 1/2 のスコアが最も低いパラメータの組み合わせの半分が除外されます。

② 次に、全データセットからd_{0}2 倍の大きさのサブセットを非置換でサンプリングしd_{1}d_{1}残り半分のパラメータの組み合わせの性能を検証します。d_{1}上記の検証結果に基づいて、スコアが最も低い 1/2 のパラメータの組み合わせが除外されます。

d_{1}③ 次に、全データセットから2 倍の大きさのサブセットを非置換でサンプリングしd_{2}d_{2}残りの 1/4 パラメータの組み合わせのパフォーマンスを検証します。d_{2}上記の検証結果によると、スコアが最も低い 1/2 のパラメータの組み合わせは除外されます...

継続的なサイクル。S が最初の反復におけるサブセットのサンプル サイズを表し、C がすべてのパラメーターの組み合わせの数を表す場合、反復プロセス中にパラメーターの検証に使用されるデータ サブセットはますます大きくなり、必要なパラメーターの組み合わせの数は増加します。検証されることが増えています:

反復回数 サブセットのサンプルサイズ パラメータの組み合わせ数
1 S C
2 2S 1212C
3 4S 1414C
4 8S 1818C
……  Cが割り切れない場合は切り上げます

\frac{1}{n}C\leqslant 1代替パラメーターの組み合わせが 1 セットしか残っていない場合、または利用可能なデータが十分に残っていない場合、ループは停止します。具体的には、または nS > 全体のサンプル サイズになった場合        、検索は停止します。実際のアプリケーションでは、どの停止条件が最初にトリガーされるかは、実際のサンプル サイズとパラメーター空間のサイズによって異なります。同時に、各反復で増加するサンプルサイズと各反復で減少するパラメータの組み合わせを自由に設定できます。

        このモードでは、異なるサブセットで継続的に優れた結果が得られるパラメーターの組み合わせのみを反復の後の段階まで保持でき、最終的に選択されるパラメーターの組み合わせは、すべてのサブセットで良好なパフォーマンスを発揮するパラメーターの組み合わせである必要があります。このようなパラメーターの組み合わせは、データ全体で適切に機能する可能性が非常に高く、グリッド/ランダム検索によって取得されるパラメーターよりも優れた汎化能力を示す可能性もあります。

2. ハーフグリッド検索の制限事項

        サブセットが大きくなると、サブセットの分布と完全なデータ セット D はより類似しますが、ハーフハーフ検索アルゴリズム全体の開始時に、最も小さなサブセットがほとんどのパラメーターの組み合わせをフィルターで除外するために使用されます。初期サブセットの分布が完全なデータ セットの分布と大きく異なる場合、ハーフグリッド検索の最初の数回の反復で、完全なデータ セット D に有効な多くのパラメーターがフィルターで除外される可能性があるため、最初の半分は-grid search サブセットが小さすぎてはなりません。

ハーフグリッド検索プロセス中に、サブセットのサンプル サイズは指数関数的に増加します。

n = 10
for i in range(15):
    print(i,n*3**i)
0 10 
1 30 
2 90 
3 
270 
4 810 
5 2430 
6 7290 7 
21870 8 65610 
9 196830 
10 590490 
11 1771470 
12 5314410 
13 15943230 
14 47829690

初期サブセット サンプル サイズが 10、7、または 8 反復であると仮定すると、2500 以上のデータ リソースが消費されます。初期サブセットが小さすぎてはならず、半探索のサンプリングが非置換のサンプリングであるという前提の下では、データ全体のサンプル サイズは大きくなければなりません。経験的に、ハーフグリッド検索は、小さなデータセットに対してランダムグリッド検索や通常のグリッド検索よりもパフォーマンスが低下する傾向があり、検索時間が長くなります。しかし、大規模なデータセット (たとえば、サンプルサイズが w を超えるデータセット) では、ハーフグリッド検索は計算速度と精度において大きな利点を示します。

3.HalvingGridSearchCV类

        sklearn では、HalvingGridSearchCV クラスを使用してハーフグリッド検索を実装します。このクラスをインポートするときは、ハーフグリッド検索を有効にする補助関数enable_halving_search_cvもインポートする必要があります。HalvingGridSearchCV は、この関数がインポートされている場合にのみインポートして使用できます。

class sklearn.model_selection.HalvingGridSearchCV (estimator、param_grid、*、factor=3、resource='n_samples'、max_resources='auto'、min_resources='exhaust'、aggressive_elimination=False、cv=5、scoring=None、refit=True、error_score=nan、 return_train_score=True、random_state=None、n_jobs=None、verbose=0)

すべてのパラメータは次のとおりです。

名前 説明
推定者 パラメータ調整対象、評価者
パラメータグリッド パラメータ空間。辞書または辞書のリストを指定できます。
要素 各反復における新しいサンプル サイズの比率は、各反復後に残されるパラメーターの組み合わせの比率でもあります。
リソース 各反復で追加される検証リソースのタイプを設定します
max_resources 反復内のパラメータの任意の組み合わせを検証するために使用できる最大サンプル サイズ。
min_resources 最初の反復でパラメーターの組み合わせを検証するために使用されるサンプル サイズ r0
積極的な排除 番号全体が使用されているかどうかは、検索を終了する指標として使用されます。使用されていない場合は、アクションを実行します。
履歴書 相互検証のフォールド
得点 評価指標、複数パラメータの同時出力をサポート
修理する 評価指標と最適なパラメーターを選択し、完全なデータセットでトレーニングします
エラースコア グリッド検索がエラーを報告すると、結果が返されます。「上げる」を選択すると、エラーが直接報告され、トレーニング プロセスが中断されます。それ以外の場合は、警告メッセージが表示され、トレーニングは続行されます
。完成すること。
return_train_score 交差検証でトレーニングセットのパラメータスコアを表示するかどうか
ランダム状態 ランダムにサンプリングされたデータセットのランダム性の制御
n_jobs 作業中の計算に関与するスレッドの数を設定します
冗長な 作業ログの出力形式

▶ 要因

        各反復における新しいサンプル サイズの比率は、各反復後に残されるパラメーターの組み合わせの比率でもあります。たとえば、factor=2 の場合、次の反復のサンプル サイズは前のラウンドの 2 倍になり、パラメーターの組み合わせの 1/2 が各反復後に残ります。Factor=3 の場合、次の反復のサンプル サイズは前のラウンドの 3 倍になり、パラメーターの組み合わせの 1/3 が各反復後に残ります。通常、このパラメータは 3 に設定するとより適切に機能します。

▶ リソース

        各反復で追加される検証リソースのタイプを文字列として入力して設定します。デフォルトはサンプル サイズで、入力は「n_samples」です。「n_estimators」や「n_iteration」など、アンサンブル アルゴリズムで正の整数を入力する弱分類器にすることもできます。

▶ 最小リソース

        最初の反復でパラメーターの組み合わせを検証するために使用されるサンプル サイズ r0。正の整数、または「最小」と「すべて」の 2 つの文字列を入力できます。

① 正の整数 n を入力します。これは、最初の反復で n 個のサンプルが使用されることを示します。

② 「最小」と入力すると、ルールに従って r0 が計算されます: リソース タイプがサンプル サイズの場合、回帰アルゴリズムの場合、r0 = 相互検証フォールド n_splits * 2、リソース タイプがサンプル サイズの場合、分類アルゴリズムの場合、r0 = カテゴリ番号 n_classes_ * 交差検証フォールド n_splits * 2; リソース タイプがサンプル サイズでない場合は 1 に等しくなります。

③ 「exhaust」と入力すると、最後の反復ラウンドで利用可能な最大リソースに基づいて r0 を回帰します。たとえば、factor=2 の場合、サンプル サイズは 1000、反復は合計 3 回あり、反復の最後のラウンドで利用可能な最大リソースは 1000、最後から 2 番目のラウンドは 500、最後から 3 番目のラウンドは (最初のラウンド)は250です。このときr0=250となります。「Exhaust」モードが最も良い結果が得られますが、計算量が若干多くなり、計算時間も若干長くなります。

▶ アグレッシブ・エリミネーション

        ブール値を入力します。デフォルトは False です。データの合計サンプル サイズが小さすぎて、代替パラメータの最後のセットだけが残るまでサイクルをサポートできない場合、このパラメータをオンにできます。このパラメーターが True に設定されている場合、残りのデータがサンプル サイズの増加をサポートするのに十分になるまで、代替パラメーターの最後のセットのみが残るまで、最初の反復のサンプル サイズが再利用されます。このパラメーターが False に設定されている場合、すべてのサンプルが使い果たされると、検索が終了したことを示します。

4. ハーフグリッド検索の実装

import re
import sklearn
import numpy as np
import pandas as pd
import matplotlib as mlp
import matplotlib.pyplot as plt
import time
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import KFold, HalvingGridSearchCV, cross_validate, RandomizedSearchCV

data=pd.read_csv('F:\\Jupyter Files\\机器学习进阶\\datasets\\House Price\\big_train.csv',encoding='utf-8')
data.drop('Unnamed: 0', axis=1, inplace=True)
X=data.iloc[:,:-1]
y=data.iloc[:,-1]

param_grid_simple = {"criterion": ["squared_error","poisson"]
                     , 'n_estimators': [*range(20,100,5)]
                     , 'max_depth': [*range(10,25,2)]
                     , "max_features": ["log2","sqrt",16,32,64,"auto"]
                     , "min_impurity_decrease": [*np.arange(0,5,10)]
                    }
# 定义函数
#评估指标RMSE
def RMSE(cvresult,key):
    return (abs(cvresult[key])**0.5).mean()

#计算参数空间大小
def count_space(param):
    no_option = 1
    for i in param_grid_simple:
        no_option *= len(param_grid_simple[i])
    print(no_option)
    
#在最优参数上进行重新建模验证结果
def rebuild_on_best_param(ad_reg):
    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    result_post_adjusted = cross_validate(ad_reg,X,y,cv=cv,scoring="neg_mean_squared_error"
                                          ,return_train_score=True
                                          ,verbose=True)
    print("训练RMSE:{:.3f}".format(RMSE(result_post_adjusted,"train_score")))
    print("测试RMSE:{:.3f}".format(RMSE(result_post_adjusted,"test_score")))
count_space(param_grid_simple)
1536年
X.shape
(29062, 80)

どの停止条件がトリガーされますか?

#2.9w个样本在factor=2, min_resource = 100的情况下可以迭代多久?
for i in range(100):
    if 100*2**i > 29062:
        break
    print(i+1,100*2**i)
1 100 
2 200 
3 400 
4 800 
5 1600 
6 3200 
7 6400 
8 12800 
9 25600
#1536种参数组合在factor=2的情况下可以迭代多久?
for i in range(100):
    if 1536//2**i < 1:
        break
    print(i+1,int(1536//2**i+1)) #向上取整
1 1537 
2 769 
3 385 
4 193 
5 97 
6 49 
7 25 
8 13 
9 
7 10 4 
11 2

因数 = 2 の場合、データセット不足の条件が最初にトリガーされ、それが最大 9 回までしか反復できないことを見つけるのは難しくありません。言い換えれば、唯一の最適なパラメーターが見つかるまで検索を続けるのではなく、最終的に 7 つのパラメーター セットの中から最もパフォーマンスの高いパラメーター セットを選択します。

        セミグリッド検索アプリケーションの場合、最も難しい部分は、検索自体のパラメーターの複雑な組み合わせを決定することです。パラメーターを調整するとき、パラメーター空間内のすべての代替の組み合わせを完全に検証できることを望む場合、反復回数が小さすぎてはならず (たとえば、反復が 3 回だけ)、係数が大きすぎてもいけません。ただし、係数が小さすぎると、反復回数が増加し、検索全体の実行時間が長くなります。同時に、反復回数は、最終的に使用できるデータの量や、反復の完了後にさらに検証する必要があるパラメーターの組み合わせの数にも影響しますが、どちらも小さすぎることはできません。したがって、一般にハーフグリッド検索を使用する場合は、次の 3 つの点を考慮する必要があります。

① min_resources の値は小さすぎることはできません。反復プロセス全体が終了する前に、できるだけ多くのデータを使用したいと考えています。
② イテレーション終了後、残る検証パラメータの組み合わせは多すぎないようにし、10 以下がベストですが、それが無理な場合は 30 以下でも構いません。
③ 反復回数が多すぎてはならず、時間がかかりすぎる可能性があります。

factor = 1.5
n_samples = X.shape[0]
min_resources = 500
space = 1536
for i in range(100):
    if (min_resources*factor**i > n_samples) or (space/factor**i < 1):
        break
    print(i+1,"本轮迭代样本:{}".format(min_resources*factor**i)
          ,"本轮验证参数组合:{}".format(space//factor**i + 1))
1 このラウンドの反復サンプル: 500.0 このラウンドの検証パラメーターの組み合わせ: 1537.0 
2 このラウンドの反復サンプル: 750.0 今回の検証パラメーターの組み合わせ: 1025.0 
3 今回の反復サンプル: 1125.0 今回の検証パラメーターの組み合わせ: 683.0 
4 これ反復サンプルのラウンド: 1687.5 このラウンドの検証パラメーターの組み合わせ: 456.0 
5 このラウンドの反復サンプル: 2531.25 このラウンドの検証パラメーターの組み合わせ: 304.0 
6 このラウンドの反復サンプル: 3796.875 このラウンドの検証パラメーターの組み合わせ: 203.0 
7 の反復サンプル今回のラウンド: 5695.3125 今回のラウンドの検証パラメータの組み合わせ: 135.0 
8 今回のラウンドの反復サンプル: 8542.96875 今回の検証ラウンドのパラメーターの組み合わせ: 90.0 
9 今回のラウンドの反復サンプル: 12814.453125 今回のラウンドの検証パラメーターの組み合わせ: 60.0 10 今回の
反復サンプルラウンド: 19221.6796875 このラウンドの検証パラメータの組み合わせ: 40.0 
11 このラウンドの反復サンプル: 28832.51953125 このラウンドの検証パラメータの組み合わせ: 27.0
#建立回归器、交叉验证
reg = RFR(random_state=1412,verbose=True)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)

#定义对半搜索
search = HalvingGridSearchCV(estimator=reg
                            ,param_grid=param_grid_simple
                            ,factor=1.5
                            ,min_resources=500
                            ,scoring = "neg_mean_squared_error"
                            ,verbose = True
                            ,random_state=1412
                            ,cv = cv)
#训练对半搜索评估器
#=====【TIME WARNING】=====#
start = time.time()
search.fit(X,y)
end = time.time() - start
print(end/60)
#查看最佳评估器
search.best_estimator_
RandomForestRegressor(max_ Depth = 22、max_features = 16、min_impurity_decrease = 0、
                      n_estimators = 90、n_jobs = -1、random_state = 1412、
                      verbose = True)
abs(search.best_score_)**0.5
1068.281607238587
rebuild_on_best_param(search.best_estimator_)
トレーニング RMSE: 475.740
テスト RMSE: 1082.916

5. ランダムグリッド検索の実装

param_grid_simple = {"criterion": ["squared_error","poisson"]
                     , 'n_estimators': [*range(20,100,5)]
                     , 'max_depth': [*range(10,25,2)]
                     , "max_features": ["log2","sqrt",16,32,64,"auto"]
                     , "min_impurity_decrease": [*np.arange(0,5,10)]
                    }

reg = RFR(random_state=1412,verbose=True)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
# 定义随机搜索
search = RandomizedSearchCV(estimator=reg
                            ,param_distributions=param_grid_simple
                            ,n_iter = 800 #使用全域空间的一半作为子空间
                            ,scoring = "neg_mean_squared_error"
                            ,verbose = True
                            ,random_state=1412
                            ,cv = cv)
#训练随机搜索评估器
#=====【TIME WARNING: 1个半小时~2小时】=====#
start = time.time()
search.fit(X,y)
end = time.time()-start
print(end/60)
#查看最佳评估器
search.best_estimator_
RandomForestRegressor(max_ Depth = 24、max_features = 16、min_impurity_decrease = 0、
                      n_estimators = 85、n_jobs = -1、random_state = 1412、
                      verbose = True)
abs(search.best_score_)**0.5
1055.5552571413887
rebuild_on_best_param(search.best_estimator_)
トレーニング RMSE: 465.198
テスト RMSE: 1054.359
HPO法 ランダム検索 半分検索
サーチスペース/グローバルスペース 800/1536 1536/1536
実行時間 (分) 103.20 25.638(↓)
最適な検索 (RMSE) 1055.555 1068.281
最適な再構成 (RMSE) 1054.359 1082.916

ランダムグリッド検索の結果が若干優れていることがわかりますが、試行できるパラメータの組み合わせは 800 通りしかなく、所要時間はハーフ検索の 4 倍になります。ハーフグリッド検索の場合、パラメータ空間全体を微調整し続け、より良いパラメータをさらに見つけることができます。

おすすめ

転載: blog.csdn.net/weixin_60200880/article/details/131871993
おすすめ