Я сталкиваюсь с ошибкой: объект DecisionTreeRegressor не имеет атрибута n_features.

Вопрос или проблема

Трассировка (самый последний вызов последним):
  Файл "/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_. Это может происходить по нескольким причинам:

  1. Несоответствие версий scikit-learn:

    • Если вы обучали модель с использованием scikit-learn версии 1.0 или выше, она будет иметь атрибут n_features_in_, тогда как в версиях ниже 1.0 используется n_features_. Ваша текущая среда, в которой вы выполняете предсказания, может использовать более старую версию библиотеки, что и вызывает возникновение этой ошибки.
  2. Изменение конфигурации окружения:

    • Возможно, модель была обучена в одном окружении, а предсказание происходит в другом, где версия scikit-learn отличается.

Решения проблемы

Для устранения данной ошибки вы можете предпринять следующие шаги:

  1. Проверьте версии scikit-learn:
    Чтобы убедиться, что у вас корректные версии библиотеки, выполните следующие команды в вашей среде:

    pip show scikit-learn

    Сравните версии, используемые для обучения и предсказания. Они должны быть одинаковыми.

  2. Обновите библиотеку:
    Если версия scikit-learn в среде, где выполняется предсказание, ниже 1.0, вам нужно обновить её до последней стабильной версии:

    pip install --upgrade scikit-learn
  3. Перепроверьте процесс сериализации модели:
    Убедитесь, что вы правильно сериализуете (например, с помощью joblib или pickle) и десериализуете вашу модель. Сохранение и загрузка модели должны происходить в идентичных версиях scikit-learn.

  4. Создайте новое виртуальное окружение:
    Если проблема продолжает возникать, создайте новое виртуальное окружение и установите необходимую версию scikit-learn, которая будет использоваться как для обучения, так и для предсказания.

  5. Тестируйте и валидируйте:
    После того как вы исправили проблему с версиями, не забудьте протестировать вашу модель на небольшом наборе данных, чтобы убедиться, что предсказания выполняются правильно и без ошибок.

Заключение

Соблюдение согласованности версий библиотек при использовании моделей scikit-learn критично для предотвращения ошибок. Регулярно проверяйте ваши окружения и следите за корреляцией библиотек, чтобы вашего ПО не возникали неожиданные проблемы. Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...