Вопрос или проблема
Трассировка (самый последний вызов последним):
Файл "/usr/local/lib/python3.8/dist-packages/flask/app.py", строка 2073, в wsgi_app
ответ = self.full_dispatch_request()
Файл "/usr/local/lib/python3.8/dist-packages/flask/app.py", строка 1518, в full_dispatch_request
rv = self.handle_user_exception(e)
Файл "/usr/local/lib/python3.8/dist-packages/flask/app.py", строка 1516, в full_dispatch_request
rv = self.dispatch_request()
Файл "/usr/local/lib/python3.8/dist-packages/flask/app.py", строка 1502, в dispatch_request
вернуть self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
Файл "/home/ubuntu/marks_prediction/app.py", строка 150, в api
вывод = sem3_prediction()
Файл "/home/ubuntu/marks_prediction/app.py", строка 18, в sem3_prediction
результат = загруженная_модель.predict(new_df)
Файл "/usr/lib/python3/dist-packages/sklearn/tree/_classes.py", строка 419, в predict
X = self._validate_X_predict(X, check_input)
Файл "/usr/lib/python3/dist-packages/sklearn/tree/_classes.py", строка 387, в _validate_X_predict
если self.n_features_ != n_features:
AttributeError: объект 'DecisionTreeRegressor' не имеет атрибута 'n_features_'
Трассировка указывает на то, что вы используете flask и ссылается на loaded_model
. Учитывая комментарий @AlexSerraMarrugat, похоже, что вы обучали модель в sklearn>=1.0
(так что у неё есть атрибут n_features_in_
, но нет n_features_
), но ваша локальная копия имеет sklearn<1.0
(так что код предсказания ссылается на n_features_
).
Эта конкретная ошибка в стороне, вы всегда должны использовать одну и ту же версию sklearn
для обучения и предсказания, чтобы избежать неожиданных результатов: https://scikit-learn.org/stable/model_persistence.html#security-maintainability-limitations
Ответ или решение
Ошибка, с которой вы столкнулись, связана с несоответствием версий библиотеки scikit-learn
. Давайте подробнее рассмотрим причины и возможные решения данной проблемы.
Причина ошибки
В traceback указывается, что вы используете метод .predict()
у объекта DecisionTreeRegressor
, который не имеет атрибута n_features_
. Это может происходить по нескольким причинам:
-
Несоответствие версий
scikit-learn
:- Если вы обучали модель с использованием
scikit-learn
версии 1.0 или выше, она будет иметь атрибутn_features_in_
, тогда как в версиях ниже 1.0 используетсяn_features_
. Ваша текущая среда, в которой вы выполняете предсказания, может использовать более старую версию библиотеки, что и вызывает возникновение этой ошибки.
- Если вы обучали модель с использованием
-
Изменение конфигурации окружения:
- Возможно, модель была обучена в одном окружении, а предсказание происходит в другом, где версия
scikit-learn
отличается.
- Возможно, модель была обучена в одном окружении, а предсказание происходит в другом, где версия
Решения проблемы
Для устранения данной ошибки вы можете предпринять следующие шаги:
-
Проверьте версии
scikit-learn
:
Чтобы убедиться, что у вас корректные версии библиотеки, выполните следующие команды в вашей среде:pip show scikit-learn
Сравните версии, используемые для обучения и предсказания. Они должны быть одинаковыми.
-
Обновите библиотеку:
Если версияscikit-learn
в среде, где выполняется предсказание, ниже 1.0, вам нужно обновить её до последней стабильной версии:pip install --upgrade scikit-learn
-
Перепроверьте процесс сериализации модели:
Убедитесь, что вы правильно сериализуете (например, с помощьюjoblib
илиpickle
) и десериализуете вашу модель. Сохранение и загрузка модели должны происходить в идентичных версияхscikit-learn
. -
Создайте новое виртуальное окружение:
Если проблема продолжает возникать, создайте новое виртуальное окружение и установите необходимую версиюscikit-learn
, которая будет использоваться как для обучения, так и для предсказания. -
Тестируйте и валидируйте:
После того как вы исправили проблему с версиями, не забудьте протестировать вашу модель на небольшом наборе данных, чтобы убедиться, что предсказания выполняются правильно и без ошибок.
Заключение
Соблюдение согласованности версий библиотек при использовании моделей scikit-learn
критично для предотвращения ошибок. Регулярно проверяйте ваши окружения и следите за корреляцией библиотек, чтобы вашего ПО не возникали неожиданные проблемы. Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью.