2017-12-12 21 views
0

私はこのPythonコードを実行しようとしているときに私は、 をCIFAR-10データのための単純な分類器を作成しようとしているが、よ:サイズ限りscikit-学ぶフィット関数エラー

import cPickle 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.svm import LinearSVC 


def unpickle(file): 
    with open(file, 'rb') as fo: 
     dict = cPickle.load(fo) 
    return dict 


def main(): 
    s="data_batch_" 
    dicts=[None]*5 
    for i in xrange(1,6): 
     dicts[i-1]=unpickle(s+str(i)) 

    X, y = dicts[0]['data'], dicts[0]['labels'] 
    for i in xrange(1,5): 
     X = np.concatenate((X, dicts[i]['data'])) 
     y = np.concatenate((y, dicts[i]['labels'])) 
    classifier=OneVsRestClassifier(LinearSVC(random_state=0)).fit(X, y) 

をXとYのサイズがあまりにも大きくない - 10000、多かれ少なかれ、それは正常に動作します。しかし、私は2つのバッチ(またはすべての5つのバッチから50000サンプル)から20000サンプルを試したとき、私は "Python.exeの動作を停止"のポップアップウィンドウを得た。コード自体やメモリが不足していますか?

メモリが不足している場合、どうすればよいですか? fit(X、y)を各バッチに対して5回、各ループ実行することは可能ですか?

答えて

-1

いくつかのアプリケーションでは、従来のアプローチでは、例、機能(またはその両方)、および/または処理速度が問題になります。このような場合、scikit-learnにはシステムの規模を拡大するために考慮できるいくつかのオプションがあります。

アウトオブコア(または「外部メモリ」)学習は、コンピュータのメインメモリ(RAM)に収まらないデータから学習するための手法です。インスタンス 2.にインスタンス 3.増分アルゴリズム

ストリーミングインスタンス 基本的には、1から特徴を抽出する方法をスト​​リーミングする方法 1: は、ここでは、この目標を達成するために設計されたシステムのスケッチです。ハードドライブ、データベース、ネットワークストリームなどのファイルからインスタンスを生成する読者かもしれませんが、これを達成する方法の詳細はこのドキュメントの範囲を超えています。

は機能 2を抽出する学習scikitでサポートされているさまざまな特徴抽出方法のうちの特徴を抽出するための任意の関連する方法であるかもしれません。ただし、ベクトル化が必要なデータを扱う場合や、機能や値のセットがあらかじめわかっていない場合は、明示的に注意する必要があります。良い例は、学習中に未知の用語が見つかる可能性があるテキスト分類です。データの複数のパスをアプリケーションの観点から妥当なものにすると、ステートフル・ベクタライザを使用することは可能です。それ以外の場合は、ステートレスな特徴抽出機能を使用して難易度を上げることができます。現在、これを行うための好ましい方法は、sklearn.feature_extraction.FeatureHasherで実装されているいわゆるハッシュトリックを、Python dictsのリストまたはテキスト文書のsklearn.feature_extraction.text.HashingVectorizerとして表されるカテゴリ変数を持つデータセットに対して使用することです。

増分学習 最後に、私たちはscikit-learnの中にいくつかのオプションがあります。すべてのアルゴリズムが段階的に(すなわち、一度にすべてのインスタンスを見ることなく)学習することはできないが、partial_fit APIを実装するすべての推定子が候補である。実際、インスタンスのミニバッチから段階的に学習する能力(「オンライン学習」と呼ばれることもある)は、いつでもどこでも少数のインスタンスが存在することを保証するために、アウトオブコア学習の鍵ですメインメモリ。関連性とメモリフットプリントのバランスをとるミニバッチに適したサイズを選択するには、チューニングが必要です[1]。

分類のために、ステートレスな特徴抽出ルーチンが新しい/目に見えない属性に対処できるかもしれないが、インクリメンタル学習者自身が新しい/見えないターゲットクラスに対処できないかもしれないことに注意することが重要である。この場合、classes =パラメータを使用して、すべての可能なクラスを最初のpartial_fit呼び出しに渡す必要があります。

適切なアルゴリズムを選択する際に、すべてが時間の経過とともに各例で同じ重要性を持たないということも考慮する必要があります。つまり、Perceptronは、SGD *およびPassiveAggressive *ファミリがこの種のアーティファクトに対してより堅牢であるのに対して、多くの例の後でも、ひどくラベル付けされた例に依然として敏感です。逆に後者は、時間の経過とともに学習率が低下するにつれて、ストリームの後半に来る際に、著しく異なるが、適切にラベル付けされた例をあまり重要視しない傾向がある。

Good Luck!

0

クラシファイアLinearSVCは(ミニ)バッチをサポートしていません。

this listのいずれかを選択する必要があります。

これらのうち、SGDClassifierは、リニアSVMとして機能するようにパラメータ化することができます(デフォルト!)。

したがって、すべてのデータに直接使用するか、入力データの生成を抽象化して、partial_fitを手動で使用することができます。しかし、前処理/正規化を使用し、ハイパーパラメータ(学習率と学習率のスケジュール)も確認してください。

関連する問題