2016-01-07 54 views
0

每當我開始擁有更多的類(1000以上)時,MultinominalNB會變得非常慢並且需要千兆字節的RAM。對於支持.partial_fit()(SGDClassifier,Perceptron)的所有scikit學習分類算法也是如此。 使用卷積神經網絡時,10000個班級沒有問題。但是當我想在相同的數據上訓練MultinominalNB時,我的12GB RAM是不夠的,而且速度非常慢。 從我對樸素貝葉斯的理解,即使有很多類,它應該快很多。 可能這是scikit-learn實現的問題(可能是.partial_fit()函數)?我如何在10000+課程(分批)上培訓MultinominalNB/SGDClassifier/Perceptron?具有Multinominal樸素貝葉斯的大量類(scikit-learn)

+0

給我們一些更多的信息。你的訓練數據的形狀是什麼?你有多少個樣本和多少個特徵? –

+0

訓練數據大約是5 Mio文本文檔。我正在使用HashingVectorizer機智number = 2^18。 – jasmok

回答

1

簡短的回答沒有太多的信息:

  • 的MultinomialNB適合的獨立模型到每個班的,因此,如果你有C=10000+類它將適合C=10000+模型,因此,只有模型參數將是[n_classes x n_features],如果n_features很大,這將是相當多的內存。

  • scikits-learn的SGDClassifier使用OVA(one-versus-all)策略來訓練多類模型(因爲SGDC本質上不是多類型的),因此需要對另一個C=10000+模型進行培訓。

  • 而且感知,從文檔scikits學習:

感知和SGDClassifier共享相同的底層實現。事實上,Perceptron()相當於SGDClassifier(loss =「perceptron」,eta0 = 1,learning_rate =「constant」,罰分=無)。

因此,您提到的所有3個分類器都不適用於大量的類,因爲需要爲每個類訓練獨立模型。我會建議你嘗試一些固有支持多類分類的東西,例如RandomForestClassifier

+0

感謝迄今爲止的答案。不幸的是,RandomForestClassifier不能被批量訓練(沒有.partial_fit()方法)。由於訓練數據是5個Mio樣本,我必須進行批次式訓練。我怎麼能這樣做? – jasmok

+0

@jasmok您可以使用['LogisticRegression'](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression)設置'multiclass ='multinomial' '(而不是默認的「ovr」代表'one-versus-rest',與'one-versus-all'相同)。欲瞭解更多信息:http://scikit-learn.org/stable/modules/multiclass.html。但是,對於您擁有的所有數據,需要很長的培訓時間和內存需求。 –

+0

但LogisticRegression不支持批量訓練。所以我將不得不將所有的數據放入內存。這對於5 Mio樣品不起作用。 SGDRegressor將支持批量培訓,但它沒有多項選項。 – jasmok