2016-03-23 7 views
1

私はpythonでscikit-learnライブラリのさまざまな分類子の精度を訓練して分析するために、1.6Mのつぶやきからなるsentiment140データセットを使用しています。私は次のコードスニペットを使って、ツイートを分類器に供給する前に特徴ベクトルにベクトル化しています。この後scikit-learnを使用して非常に大きなデータセットをトレーニング/アップスケールする方法はありますか?

vectorizer = CountVectorizer(max_features = 2000) 
train_set = (vectorizer.fit_transform(trainX)).toarray() 

私は、次のコードスニペットを使用してGaussianNB()MultinomialNB()BernoulliNB()LogisticRegression()LinearSVC()RandomForestClassifier()を含ん私classifierオブジェクト訓練:に私のベクトラの変換セットを変換するには、しかし

classifier.fit(train_vectors,trainy) 

trainsetのためにtoarray()関数を使用しています。私は、プログラムがfeaを持つ100kの例のために大量のメモリ(約4-5GB)各例のサイズ2000のベクトル、すなわち、100,000×2000の特徴ベクトルである。

私は8GBのRAMしか持っていないので、これは私のシステムができる最大のものです。誰かが、どのようにコードを修正することによって、利用可能なメモリを持つトレーニングデータセットの1.6M全体を訓練できるように、どのように進めるかについての提案を与えることができます。私が上記のコードを使ってやろうとすると、実行可能ではない約72ギガのRAMが必要になります。

私はまた、列車の一部を反復的に設定して特定の分類器を漸進的に訓練するための規定があることも理解しています。 MultinomialNB()BernoulliNB()などの分類子には(partial_fitを使用して)そのための規定がありますが、私が使用している他の分類子もそうでないので、これはオプションではありません。

答えて

3

質問は、最初に何を達成しようとしていますか?私が求めている理由は、ベクトル化されたテキストは、問題の性質上、非常に多くの次元を持っているということです。さらに、max_features=2000は、テキスト分類の適切なパフォーマンスの近くにあなたを得ることはできません。

かいつまん:あなたはスパースベクトルで仕事を述べた分類器のほとんどは、GaussianNB除いて、これは簡単に確認できます、私はお勧め

GaussianNB FAIL 
MultinomialNB PASS 
BernoulliNB PASS 
LogisticRegression PASS 
LinearSVC PASS 
GradientBoostingClassifier PASS 

こと:出力する

from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB 
from sklearn.linear_model import LogisticRegression 
from sklearn.svm import LinearSVC 
from sklearn.ensemble import GradientBoostingClassifier 
from scipy.sparse import csr_matrix 
from sklearn.datasets import load_digits 
digits = load_digits() 
X, y = digits.data, digits.target 

for CLF in [GaussianNB, MultinomialNB, BernoulliNB, LogisticRegression, LinearSVC, GradientBoostingClassifier]: 
    print(CLF.__name__, end='') 
    try: 
     CLF().fit(csr_matrix(X), y == 0) 
     print(' PASS') 
    except TypeError: 
     print(' FAIL') 

GaussianNBをあなたのリストから削除し、疎ベクトルをサポートする分類子で作業してください。少なくとも8gの範囲内でさらに多くのサンプルを扱うことができます。

はジェイクVanderplasを引用し、またscikitは、学ぶためthis issue参照してください:スパース入力がGaussianNBに実装されていません

一つの理由は、非常にまばらなデータがほぼ確実アルゴリズムの仮定を満たしていないということです - ときバルク単純なガウス分布はデータには適しておらず、有用な分類にはほとんどつながりません。

+0

ありがとうございます!私はこれらの分類器がまばらな配列で動作していることを知らなかった。 GaussianNB()分類器でテストしたので、列車をnumpy配列に変換しなければならなかったので、他の分類器でも同じことをする必要があると暗黙のうちに考えました。GaussianNBを削除すると、疎な配列を作成する必要がなくなり、高密度配列へのfit_transformから得て、私の問題を解決します。 – tedghosh

+0

あなたの質問については、私は2000語のフィーチャーセットを使用すると、私に良い精度を与えることはないことを認識しています。私はアルゴリズムを使って74-77%の範囲で精度を得ていました。しかし、大規模なフィーチャセットを使用するとメモリオーバーフローが発生したため、私は選択肢がありませんでした。しかし、あなたのソリューションは、メモリの問題がなくても大きなフィーチャセットを使用するのに役立ちました。 – tedghosh

+0

完璧、私が助けることができてうれしい。 :) – Matt

関連する問題