Модель Django сохраняет модель scikit-learn в файле. Ошибка: UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0x80 в позиции 0: недопустимый начальный байт - PullRequest
0 голосов
/ 30 октября 2019

У меня есть эта модель и внутренняя функция, которая собирается создать модель обучения 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, но этобудь хакером, и я бы предпочел использовать как можно меньше хаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...