2017-08-25 6 views
0

私は分類作業に取り組んでいます。私のトレーニングファイルは約8GB(aporx 720万行と212列)のcsvです。まず、私のアプローチはすべてのcsvファイルパンダのデータフレームで、それから多次元配列として私の素朴なベイズ分類器を訓練するのですが、私がmemory error(私は8GBのRAMとPythonの64ビット版のマシンで作業しています) 。クラシファイアに合うときにメモリエラーが発生する

その後、dataframeを5つに分割して、partia_fit()メソッドを使用しましたが、まだメモリが不足しています。

これは、(目標値は、他のtxtファイルから抽出されている)、これまでに私のコードです:

from csv import DictReader 
from sklearn.naive_bayes import MultinomialNB 
import numpy 
from pandas import* 


target_values_train = [] 

with open('train.txt') as f: 
    reader = DictReader(f, delimiter='\t') 
    for row in reader: 
     target_values_train.append(int(row['human-generated'])) 

y_train = numpy.asarray(target_values_train) 
y_train = y_train[:, numpy.newaxis] 

tp = read_csv('train-indices.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
df_train = concat(tp, ignore_index=True) 
del df_train['id'] 
print(df_train) 
print(df_train.shape) 
print(y_train.shape) 
df1, df2, df3, df4 = np.array_split(df_train, 5) 
y1, y2, y3, y4, y5=np.array_split(y_train, 5) 
print(df1.shape) 
print(df2.shape) 
print(df3.shape) 


clf = MultinomialNB() 
clf.partial_fit(df1, y1) 
clf.partial_fit(df2, y2) 
clf.partial_fit(df3, y3) 
clf.partial_fit(df4, y4) 
clf.partial_fit(df5, y5) 

任意の提案は大歓迎です。

+0

ループ内にすべてを入れずに、各partial_fitに必要な行だけを保存し読み込むのはなぜですか? –

+0

本当にこのデータをすべて訓練する必要がありますか?データがホモジニアスであれば、記憶に合ったデータの部分を訓練し、良いスコアを生み出すことができます。それを試してみてください。トレーニングデータのすべての部分を訓練して予測し、予測をアバレージしてより良い結果を得ることができます。 – CrazyElf

+0

そして、使用直後に不必要なデータを削除しようとすることができます。 – CrazyElf

答えて

0

pd.concatを使用すると、すべてのデータがメモリに再度読み込まれるため、一度にファイルを読み込むのと同じことになります。

チャンクを1つずつ繰り返して学習する必要があります。たとえば、次のようにします。

tp = read_csv('training_data.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
clf = MultinomialNB() 
for chunk in tp: 
    clf.partial_fit(chunk[["train_col1", "train_col1",...]], chunk["y1"]) 
関連する問題