2016-04-30 11 views
17

私は次のように構成され、「予測モデルとして-サービス」であるアプリケーションに取り組んでいます:patsy DesignInfoを永続化する方法は?

  • モデルオフライン
  • を養成定期的に「予測サーバーにモデルパラメータをアップロード「
  • が予測サーバは、入力として1つの観測を取り、予測

を出力し、私はパッツィを使用しようとしますが、次の問題に実行しているよ:単一の予測が入ってくるとき、私は変換しない方法それを正しい形にしてトレーニングデータの行のように見える?

トレーニングデータからDesignInfoがメモリに利用可能であるときパッツィドキュメントは例を提供する:http://patsy.readthedocs.io/en/latest/library-developers.html#predictions

# offline model training 
import patsy 

data = {'animal': ['cat','cat','dog','raccoon'],'cuteness': [3,6,10,4]} 
eq_string = "cuteness ~ animal" 


dmats = patsy.dmatrices(eq_string,data) 
design_info = dmats[1].design_info 
train_model(dmats) 


# online predictions 
input_data = {'animal': ['raccoon']} 

# if the DesignInfo were available, I could do this: 
new_dmat = build_design_matrices([design_info], 
             input_data) 
make_prediction(new_dmat, trained_model) 

そして出力:この行が同じ形状であることを

[DesignMatrix with shape (1, 3) 
    Intercept animal[T.dog] animal[T.raccoon] 
      1    0     1 
    Terms: 
    'Intercept' (column 0) 
    'animal' (columns 1:3)] 

お知らせ訓練データとして; animal[T.dog]の列があります。私のアプリケーションでは、DesignInfoにアクセスして新しいデータのDesignMatrixを構築する方法がありません。具体的には、予測サーバは、どのくらい多くの動物のカテゴリがトレーニングデータにあり、どのような順序であるかを知ることができますか?

は、私はちょうどそれをpickle化できると思っていたが、それは、これはまだサポートされていませんが判明:https://github.com/pydata/patsy/issues/26

私は、単に文字列として行列の列を持続し、そのオンラインから行列を再構築することができますが、これはそう脆弱なビット。

これを行うには良い方法がありますか?

+0

サーバーに 'design_info'を置くことはできますか? (それは自動的に起こるようです)。クライアントはサーバに新しい 'input_data'を送信し、サーバは' new_dmat'と 'make_prediction'行を実行します。または、再トレーニングせずにサーバーをシャットダウンして再起動できる必要がありますか?その場合、元の 'dmats'と' train_model() 'で見つかったパラメータの両方を保存する必要があるように思えます。それはあなたが探しているものですか? –

答えて

-1

あなたの目標は再訓練なしでサーバを再起動できるようにすることであると仮定すると、それはあなたの最良の選択肢のように見える(パ​​ッツィは、酸洗を実装するまで)train_modelによって算出されdataeq_stringとどんなパラメータ酸洗いすることであろう。その後、サーバーを再起動すると、dataeq_stringのメッセージが出され、dmats = patsy.dmatrices(eq_string,data)に再度コールすることができます。これはモデルを訓練するのではなく、データを前処理するだけなので、かなり速く実行する必要があります。 train_model(質問には表示されていません)で計算されたパラメータもまたアンピクルします。サーバーは新しい入力の予測を行う準備ができているはずです。

これをクライアントコンポーネントとサーバーコンポーネントに分割する場合、サーバーは上記で説明したすべてを実行する必要があります。クライアントは質問に定義されたinput_dataを送信するだけです。 (クライアントはdmatsまたはdesign_infoを参照する必要はありません)

関連する問題