У меня есть файл поезда 3 Gb и тестовый файл 350 Мб, оперативная память 6 Гб. Эти файлы кажутся не слишком большими, чтобы удерживать их в памяти, но я даже не могу их добавить (произошла ошибка памяти).Как применить однострунное кодирование к большим файлам?
Мой текущий Подход выглядит следующим образом:
# reading files
dtypes = {'Semana' : 'int32',
'Agencia_ID' :'int32',
'Canal_ID' : 'int32',
'Ruta_SAK' : 'int32',
'Cliente-ID' : 'int32',
'Producto_ID':'int32',
'Venta_hoy':'float32',
'Venta_uni_hoy': 'int32',
'Dev_uni_proxima':'int32',
'Dev_proxima':'float32',
'Demanda_uni_equil':'int32'}
train = pd.read_csv('train.csv', dtype = dtypes, usecols=["Semana", "Agencia_ID", "Canal_ID", 'Ruta_SAK', 'Cliente_ID', 'Producto_ID','Demanda_uni_equil'])
test = pd.read_csv('test.csv',dtype = dtypes)
ids = test['id']
test.drop(['id'], axis =1, inplace = True)
shapeTrain = train.shape[0]
shapeTest = test.shape[0]
train = train.append(test) # raises memory error
#applying one-hot encoding
train = pd.concat([train, pd.get_dummies(train['Semana'],sparse=True)], axis=1, join_axes=[train.index])
train.drop([11,'Semana'],axis=1, inplace = True)
train = pd.concat([train, pd.get_dummies(train['Producto_ID'],sparse=True)], axis=1, join_axes=[train.index])
train.drop([123,'Producto_ID'],axis=1, inplace = True)
train = pd.concat([train, pd.get_dummies(train['Canal_ID'],sparse=True)], axis=1, join_axes=[train.index])
train.drop([11,'Canal_ID'],axis=1, inplace = True)
# separating back to train and test
test = train[shapeTrain:shapeTrain+shapeTest]
train = train[0:shapeTrain]
test['id'] = ids
train.to_csv('train_1.csv', index=False)
test.to_csv('test_1.csv', index=False)
Я вижу 2 пути решения:
1) Как-то перебирать файлы:
df_train = pd.read_csv('train.csv', chunksize=1500)
for chunk in df_train:
#apply one-hot encoding
2) Для того, чтобы уменьшить количество столбцов, применяя однострунное кодирование только для обучения, а затем для тестирования, но для нового категориального значения, устанавливающего все столбцы на 0.
3) Используйте the hashing trick!
Как я могу решить проблему?
Отметьте «хеш-трюк». Таким образом, (1) вам не нужно будет перебирать весь текст дважды и заранее знать все слова (2), вы будете контролировать количество ящиков. –