У меня есть эта модель и внутренняя функция, которая собирается создать модель обучения scikit, обучить ее сохранить, затем связать ее с файловым полем, чтобы я мог извлечь ее и использовать позже, чтобы делать прогнозы.
class StockTrainModel(models.Model):
trained_model = models.FileField(upload_to="training_model", blank=True)
...
def __str__(self):
return str(self.stock)
def train_model(self):
...
clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X_train, y_train)
self.training_score = clf.score(X_test, y_test) * 100
filepath = 'media/uploads/training_model/{0}.sav'.format(self.stock.symbol)
joblib.dump(clf, filepath)
f = open(filepath)
self.trained_model.save('{0}.sav'.format(self.stock.symbol), File(f, 'rb'))
return self.trained_model
проблема в том, как показано в приведенной ниже ошибке, она завершается с ошибкой кодирования ошибки utf-8, и в этом случае я не совсем уверен, какую кодировку joblib использует модель scikit-learn для кодирования файла, я предположил, что это всего лишь байтыи попытался использовать rb
«чтение байтов» при открытии файла, но он по-прежнему возвращает ту же ошибку.
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-5-3b847b21decc> in <module>
----> 1 train_model.train_model()
~/code/coder/common/models.py in train_model(self)
159
160 f = open(filepath)
--> 161 self.trained_model.save('{0}.sav'.format(self.stock.symbol), File(f, 'rb'))
162
163 return self.trained_model
....
~/code/envs/coder/lib/python3.6/codecs.py in decode(self, input, final)
319 # decode input (taking the buffer into account)
320 data = self.buffer + input
--> 321 (result, consumed) = self._buffer_decode(data, self.errors, final)
322 # keep undecoded input until the next call
323 self.buffer = data[consumed:]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
Если ничего не помогло, мне пришлось бы сохранить путь к файлу в CharField
, но этобудь хакером, и я бы предпочел использовать как можно меньше хаков.