2016-08-13 10 views
1

私はHashingVectorizer [(n_features = 2 ** 24、binary = True、ngram_range =(1,2))を使用して、Sklearnの4709の別々のバイナリロジスティック回帰分類子をトレーニングしてマルチラベルテキスト分類を実装しています。 ]。Sklearn:Decision関数を高速化する方法

精度はかなり良いですが、予測待ち時間が巨大です。学習された行列の平均希薄化率は0.967であり、行列の形状は(1,16777216)1つのエントリのpredict_proba関数の予測時間でのビルドは147.9秒です(Intel Xeon E5 2630v4が1台搭載されているサーバーで)ほとんどの時間(80%)がscipy sparse csc_tocsr関数によって費やされます。

行列を前処理するとき:

cf[i] = sparse.csr_matrix(clf.coef_.T) 

確率を推論する(Iは正規化、確率のちょうど順序を必要としない)直接

prob[i] = x*cf[i] 

によってので、それは407(10%)の分類を推測するだけ0.043秒を要するが、メモリ消費量は25ギガバイトでありますすべての分類器をメモリに保存するには、約250GBのRAMが必要です。

行列を疎にしたり、あまりメモリを必要としない別の方法で前処理する方法はありますか?

答えて

0

私の質問に答えるために、私は簡単な解決策を見つけました。すべてのすべての係数行列を1つに結合(積み重ね)することができます。つまり、転置され、推論に使用されます。だから、ロード/準備コードは次のとおりです。

CLFSは、ロジスティック回帰分類されている
coefs = sparse.vstack([c.coef_ for c in clfs]) 
coefs = coefs.T 

(しかし、それはすべての線形分類器のために動作します)。推論コードは単純です

x = vectorizer.fit_transform([q]) 
r = x*coefs 

推論時間は私のケースでは4709個の分類器では1/10秒以下です。

関連する問題