この問題について、過去 2 ~ 3 週間、頭を悩ませてきました。各サンプルが複数のラベルに属する可能性があるマルチラベル (マルチクラスではない) の問題があります。
トレーニング データとして約 450 万のテキスト ドキュメント、テスト データとして約 100 万のテキスト ドキュメントがあります。ラベルは約 35K です。
私はscikit-learnを使用しています。特徴抽出のために、以前はまったくスケーリングしない TfidfVectorizer を使用していましたが、現在は HashVectorizer を使用しています。これはより優れていますが、ドキュメントの数を考えるとそれほどスケーラブルではありません。
vect = HashingVectorizer(strip_accents='ascii', analyzer='word', stop_words='english', n_features=(2 ** 10))
SKlearn は、任意の推定器をフィードできる OneVsRestClassifier を提供します。マルチラベルの場合、LinearSVC と SGDClassifier のみが正しく機能していることがわかりました。私のベンチマークによると、SGD はメモリと時間の両方で LinearSVC より優れています。だから、私はこのようなものを持っています
clf = OneVsRestClassifier(SGDClassifier(loss='log', penalty='l2', n_jobs=-1), n_jobs=-1)
しかし、これにはいくつかの深刻な問題があります。
- OneVsRest には、コア外学習を不可能にする partial_fit メソッドがありません。そのための代替手段はありますか?
- HashingVectorizer/Tfidf はどちらも単一のコアで動作し、n_jobs パラメーターはありません。ドキュメントのハッシュ化に時間がかかりすぎています。代替案/提案はありますか?また、n_features の値は正しいですか?
- 100 万のドキュメントでテストしました。ハッシュには 15 分かかり、clf.fit(X, y) になると、OvR が内部で LabelBinarizer を使用し、次元 (yx クラス) のマトリックスを割り当てようとするため、MemoryError を受け取りますが、これはかなり割り当てが不可能です。私は何をすべきか?
- 信頼性が高くスケーラブルなマルチラベル アルゴリズムを備えた他のライブラリはありますか? Genism と mahout は知っていますが、両方ともマルチラベルの状況に対応するものはありませんか?