sklearnパラメータ最適化

二つのパラメータがあり、一般にモデルを学習する:一つのパラメータ推定値が得られたデータから学習することができ、クラス・パラメータがあるが、データから推定することができない人間の経験によってのみを指定することができ、パラメータの後者のタイプは、超パラメータと呼ばれています

例えば、C、カーネル、ガマでのサポートベクターマシン、ナイーブベイズは、その学習モデルの設計ではアルファ、など、に、我々は以下を通じて、超学習モデルのための最も合理的なパラメータを見つけるために、パラメータ空間上で検索します学習者モデルとパラメータリストの現在の値を得る方法:estimator.get_params()

、ネットワーク検索とランダムサンプリング:sklearnは、2つの一般的な最適化パラメータを提供します

  • グリッドサーチクロスバリデーション(GridSearchCV):網羅的方法におけるパラメータのすべての可能な組み合わせを介して
  • ランダムサンプリングのクロスバリデーション(RandomizedSearchCV):空間サンプリングに基づいて特定の分布パラメータ、ランダム候補パラメータのいくつかの組合せレジメンを取得します

sklearn.model_selection:GridSearchCV、RandomizedSearchCV、ParameterGrid、ParameterSampler、fit_grid_point

①GridSearchCV:

方法は、パラメータグリッド上の候補パラメータの網羅的組み合わせを提供します。パラメータは、パラメータparam_gridグリッドで指定され、例えば、以下のグリッドパラメータparam_gridの設定例を示しています。

param_grid = [

  { 'C':[1,10,100,1000]、 'カーネル':[ 'リニア']}、

  { 'C':[1,10,100,1000]、[ガンマ]:[0.001,0.0001]、 'カーネル':[ 'RBF']}

  ]

上記パラメータが検索される2つのグリッド(各グリッド辞書)を指定:4つのノードがあり、パラメータの最初の組み合わせを、パラメータノードの第4×2 = 8組み合わせがあります

ユニバーサル推定APIを達成GridSearchCV例:トレーニング時間に設定されたデータは、パラメータのすべての可能な組み合わせが評価される場合、トレーニングセットの完了後に推定に対応するパラメータの最適な組み合わせから選択されます。

コードをコピー
sklearnインポートSVMから、データセット
sklearn.model_selectionインポートGridSearchCVから

アイリス= datasets.load_iris()
パラメータ= { 'カーネル' :( 'RBF'、 'リニア')、 'C':[1,5,10]}
SVR = svm.SVC()
CLF = GridSearchCV(SVR、パラメータ)
clf.fit(iris.data、iris.target)
印刷(clf.best_estimator_)
コードをコピー

最終結果:

SVC(C = 1、CACHE_SIZE = 200、class_weight =なし、coef0 = 0.0、
  decision_function_shape =なし、度= 3、ガンマ= 'auto' で、カーネル= 'リニア'
  max_iter = -1、確率= Falseを、random_state =なし、真=縮小し、
  TOL = 0.001、冗長=偽)

②RandomizedSearchCV

可能性のRandomizedSearchCVクラスは、パラメータ値が一定の確率分布から抽出される、確率分布がすべての値がこのランダムサンプリングのパラメータに対応する場合について説明し、パラメータ空間上の機構のランダムな検索を実現しますグリッド徹底的な検索メカニズムと比較して、それは2つの利点があります。

  • 全体的なパラメータ空間と比較すると、パラメータの組み合わせの数が比較的少なく選択することができます
  • パフォーマンスには影響しませんパラメータノードを追加し、効率が低下することはありません

サンプリング範囲と指定されたパラメータの分布は、各パラメータについて、(パラメータの組み合わせの総数はサンプリングするか、何回反復ない)n_iterパラメータを指定することができる予算を計算するために、加えて、グリッド検索などで、辞書と完全なオープンすることができ、 (離散リストを均一にサンプリングされる)確率分布の範囲内とすることができる、あなたが離散的な値のリストを指定することができる使用することができます

{ 'C':scpiy.stats.expon(スケール= 100)、 'ガンマ':scipy.stats.expon(スケール= 0.1)、 'カーネル':[ 'RBF']、 'class_weight':[ 'バランス' :無し]}

上記の例では:C、指数分布、ガンマ指数分布、この例では、EXPON、ガンマ、均一またはrandintとして、原理をサンプリング点の分布を生成するために使用される有用なパラメータの数が含まscipy.statsモジュールを使用して、任意の関数であれば、彼がRVS(ランダム変量サンプル)サンプル値を返すための方法を提供するように、RVS連続呼び出しが独立同一分布のサンプルの値の関数を保証する必要があり、中に通すことができます。

コードをコピー
NPとしてnumpyのインポート
時間インポート時から
scipy.statsからsp_randintとしてrandintをインポート
sklearn.model_selectionインポートRandomizedSearchCVから
sklearn.datasetsからload_digitsをインポート
sklearn.ensemble輸入RandomForestClassifierから

デフレポート(結果、n_top = 3):
    iについての範囲(1、n_top + 1):
        候補= np.flatnonzero(結果[ 'rank_test_score'] == I)
        候補で候補者のために:
            プリント( "ランクのモデル:{0}" 形式(I))
            プリント( "検証スコア平均:{0:.3f}(STD:{1:.3f})" フォーマット(
                結果[ 'mean_test_score'] [候補]、
                結果[ 'std_test_score'] [候補]))
            印刷( "パラメータ:{0}" 形式(結果[ 'のparamsは'] [候補])。)
            印刷( "")


digis = load_digits()
X、Y = digis.data、digis.target

CLF = RandomForestClassifier(n_estimators = 20)
#セットハイパーその値と分布を最適化します
param_dist = { "MAX_DEPTH":[3、なし]
            "max_features":sp_randint(1,11)、
            "min_samples_split":sp_randint(2,11)、
            "min_samples_leaf":sp_randint(1,11)、
            "ブートストラップ":[TRUE、FALSE]、
            "基準":[ 'ジニ'、 'エントロピー']
            }
#パラメータ空間上でランダム探索を回し
n_iter_search = 20
random_search = RandomizedSearchCV(CLF、param_distributions = param_dist、n_iter = n_iter_search)
開始=時間()
random_search.fit(X、Y)
印刷( "RandomizedSearchCVは%d個の候補者のための秒.3f%を取りました"
      "パラメータの設定。" %((時間() - )を開始、n_iter_search))
レポート(random_search.cv_results_)
コードをコピー

最終結果:

コードをコピー
RandomizedSearchCVは20のcandidatesparameter設定に3.652秒かかりました。
ランクのモデル:1
検証スコアの平均:0.930(STD:0.019)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'エントロピ'、 'max_features':8、 'ブートストラップ':偽 'min_samples_split':10}

ランクのモデル:2
検証スコアの平均:0.928(STD:0.009)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'ジニ'、 'max_features':4 'ブートストラップ' 偽 'min_samples_split':10}

ランクのモデル:3
検証スコアの平均:0.924(STD:0.009)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':1、 '基準': 'ジニ'、 'max_features':9、 'ブートストラップ':真、 'min_samples_split':5}
コードをコピー

ランダム検索と③におけるパラメータ最適化を超える比較実験グリッドサーチランダムフォレスト分類子オブジェクトを最適化するために。超パラメータセットの結果の組み合わせが非常に似ているが、学習分類子に影響を与えるすべてのパラメータは、同じ超パラメータ空間上のランダムフォレスト分類子のために最適化された木、ランダム探索およびグリッド最適化の数を除いて、検索されましたしかし、ランダムな検索パラメータのランダム検索ウェブ検索大幅に少なく、超高性能の組み合わせよりも実行している時間が少し悪くなるが、これは、ノイズによるところが大きい、実際には、我々はわずか数より多くを選ぶことができます重要なパラメータの組み合わせを最適化することができます。

コードをコピー
NPとしてnumpyのインポート
時間インポート時から
scipy.statsからsp_randintとしてrandintをインポート
sklearn.model_selectionインポートRandomizedSearchCVから
sklearn.model_selectionインポートGridSearchCVから
sklearn.datasetsからload_digitsをインポート
sklearn.ensemble輸入RandomForestClassifierから

デフレポート(結果、n_top = 3):
    iについての範囲(1、n_top + 1):
        候補= np.flatnonzero(結果[ 'rank_test_score'] == I)
        候補で候補者のために:
            プリント( "ランクのモデル:{0}" 形式(I))
            プリント( "検証スコア平均:{0:.3f}(STD:{1:.3f})" フォーマット(
                結果[ 'mean_test_score'] [候補]、
                結果[ 'std_test_score'] [候補]))
            印刷( "パラメータ:{0}" 形式(結果[ 'のparamsは'] [候補])。)
            印刷( "")


digis = load_digits()
X、Y = digis.data、digis.target

CLF = RandomForestClassifier(n_estimators = 20)

印刷(「==========されている以下のRandomizedSearchCVテスト結果===============」)
#セットハイパーその値と分布を最適化します
param_dist = { "MAX_DEPTH":[3、なし]
            "max_features":sp_randint(1,11)、
            "min_samples_split":sp_randint(2,11)、
            "min_samples_leaf":sp_randint(1,11)、
            "ブートストラップ":[TRUE、FALSE]、
            "基準":[ 'ジニ'、 'エントロピー']
            }
#パラメータ空間上でランダム探索を回し
n_iter_search = 20
random_search = RandomizedSearchCV(CLF、param_distributions = param_dist、n_iter = n_iter_search)
開始=時間()
random_search.fit(X、Y)
印刷( "RandomizedSearchCVは%d個の候補者のための秒.3f%を取りました"
      "パラメータの設定。" %((時間() - )を開始、n_iter_search))
レポート(random_search.cv_results_)

印刷(「==========されている以下のGridSearchCVテスト結果===============」)
#すべてのパラメータの検索、すべてのネットワークノードを検索
param_grid = { "MAX_DEPTH":[3、なし]
            "max_features":[1,3,10]、
            "min_samples_split":[2,3,10]、
            "min_samples_leaf":[1,3,10]、
            "ブートストラップ":[TRUE、FALSE]、
            "基準":[ 'ジニ'、 'エントロピー']
            }
#パラメータ空間のスーパーグリッドサーチを有効にします
grid_search = GridSearchCV(CLF、param_grid = param_grid)
開始=時間()
grid_search.fit(X、Y)
印刷(「GridSearchCVは%d個の候補のパラメータ設定のための秒.2f%を取りました。」
     %(時間() - 開始、LEN(grid_search.cv_results _ [ 'paramsは'])))
レポート(random_search.cv_results_)
コードをコピー

最終結果:

コードをコピー
==========以下は===============の試験結果RandomizedSearchCVあります
RandomizedSearchCVは20のcandidatesparameter設定に3.874秒かかりました。
ランクのモデル:1
検証スコアの平均:0.928(STD:0.010)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'エントロピ'、 'max_features':10、 'ブートストラップ':偽 'min_samples_split':2}

ランクのモデル:2
検証スコアの平均:0.920(STD:0.007)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':4 '基準': 'ジニ'、 'max_features':6、 'ブートストラップ':偽 'min_samples_split':2}

ランクのモデル:2
検証スコアの平均:0.920(STD:0.009)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'エントロピ'、 'max_features':7、 'ブートストラップ':真、 'min_samples_split':10}

==========以下は===============の試験結果GridSearchCVあります
GridSearchCVは216の候補のパラメータ設定のための37.64秒かかりました。
ランクのモデル:1
検証スコアの平均:0.928(STD:0.010)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'エントロピ'、 'max_features':10、 'ブートストラップ':偽 'min_samples_split':2}

ランクのモデル:2
検証スコアの平均:0.920(STD:0.007)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':4 '基準': 'ジニ'、 'max_features':6、 'ブートストラップ':偽 'min_samples_split':2}

ランクのモデル:2
検証スコアの平均:0.920(STD:0.009)
パラメータ:{ 'MAX_DEPTH':なし、 'min_samples_leaf':2 '基準': 'エントロピ'、 'max_features':7、 'ブートストラップ':真、 'min_samples_split':10}
コードをコピー

パラメータ空間にわたる検索のヒント

  • モデルを推定するために、適切なターゲット指標を指定するためのスキル

    デフォルトでは、スコア推定関数モデルを使用してパラメータ検索は、特定のパラメータの性能を評価します:

      分類器対応sklearn.metrics.accuracy_score

      回帰はsklearn.metrics.r2_scoreに対応します

  ただし、一部のアプリケーションでは、他のスコアリング関数は、より適切な取得します。(例えば、非平衡分類問題では、精度のsccuracy_scoreは、通常は動作しません。この時点で、あなたは得点により、当社独自のスコアリング関数のパラメータを持つ内部RandomizedSearchCV GridSearchCVクラスまたはクラスを指定することができます)

  • スキルII、SKlearnの推定とその組み合わせパラメータ空間を使用するパイプライン
  • スキルIII、データセットの合理的な部門:(GridSearchCV用)セット+テストセットの開発(テスト)を取得するためにmodel_selection.train_test_split()関数を使用して!
  • 四つのスキル、並列:(GridSearchCV)及び(RandomizedSearchCV)計算パラメータは、並列計算ノードで行うことができ、すなわち、パラメータ「n_jobs」によって指定されます。
  • エラーが特定のパラメータのノードで発生したときに堅牢性を向上させるための5つのヒント:エラー上のノードにのみ警告を促し。パラメータerror_score = 0を設定することにより(または= np.NaN)を取得するには!

おすすめ

転載: www.cnblogs.com/cmybky/p/11772664.html