仕事は一度だけ行い、証明できるようにする
研究は繰り返されます。同じ設定のグリッドを同じフォールドで試し、同じ特徴量テーブルを実験のたびに作り直します。joblib はその無駄を省きます。Parallel(n_jobs=k)(delayed(f)(x) for x in items) は独立した呼び出し f(x) を k 個のワーカーで実行し、要素の順に結果を返します。n_jobs=-1 は全コアを使い、n_jobs=1 は順番に実行します(ブラウザはこちら)。ジョブのコストはワーカーへデータを送るコストより大きくなければならないので、小さすぎるジョブはまとめます。グリッド探索はぴったりです。5 個のalphaと 5 個の時系列フォールドで独立な当てはめが 25 回あり、結果は何個のワーカーが実行したかに依存しません。
Memory(location).cache(f) は f をディスクキャッシュで包みます。ある引数での最初の呼び出しは f を実行して結果を引数のハッシュの下に保存し、同じ引数での次の呼び出しはファイルを読みます。キャッシュはプログラムの終了後も残り、f や引数が変わると気づきます。DataFrameではなくNumPy配列をハッシュしてください。DataFrameのハッシュは内部のメモリ配置に依存することがあり、内容が等しい2つの表が異なるハッシュになってキャッシュが外れます。joblib.hash(array) は内容の指紋で、コピーでは等しく、少しでも変わると異なり、2つの実験が同じデータを使ったことの証明になります。最後に joblib.dump(model, path, compress=3) は当てはめたモデルを圧縮ファイルに書き、joblib.load(path) はまったく同じ予測をするオブジェクトを返します。ラボでは25個のジョブがどのalphaでも零から 0.06 以内の時系列順位相関を与え、slow_features はキャッシュされた2回の呼び出しで1回だけ実行され、読み込み直したRidgeは同一の予測をします。
- 独立なジョブは
Parallelとdelayedで実行する。答えはn_jobsに依存してはならない。 Memory.cacheは引数のハッシュをキーに結果をディスクへ保存する。表ではなく配列を渡す。joblib.hashは2回の実行が同じデータを使った証拠になり、dumpとloadは同一の予測をするモデルを保存する。
ラボ:採点される内容
- フォールド1つのジョブ15点
- ジョブのグリッド25点
- ディスクキャッシュ15点
- 指紋10点
- モデルの保存15点
- 研究20点