Тип исключения: ValueError: массив узлов из pickle имеет несовместимый dtype
Итак, я скопировал проект DjangoML с Github. Модель ML - это, по сути, система диагностики, которая предсказывает, находится ли пациент в группе риска, основываясь на значениях его анализов крови.
Я выполняю этот проект локально в VSCode, но еще не развернул бэкэнд/ML-модель.
Я столкнулся с этой проблемой при попытке спрогнозировать исход в веб-браузере.
Я использую Python 3.11.0 для этого проекта.
The requirements.txt file includes:
asgiref==3.5.0
Django==4.0.3
joblib==1.1.0
numpy~=1.26.4
pandas==2.2.2
python-dateutil==2.8.2
pytz==2022.1
scikit-learn==1.0.2
scipy==1.8.0
six==1.16.0
sklearn==0.0
sqlparse==0.4.2
threadpoolctl==3.1.0
tzdata==2021.5
`Traceback (most recent call last):
File "D:\Django_MachineLearning_HealthcareApp-main\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request)
File "D:\Django_MachineLearning_HealthcareApp-main\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Django_MachineLearning_HealthcareApp-main\backend\views.py", line 76, in lpredictor result = ValuePredictor(llis, 7, mname)
File "D:\Django_MachineLearning_HealthcareApp-main\backend\views.py", line 60, in ValuePredictor trained_model = joblib.load(rf'{mdname}_model.pkl')
File "D:\Django_MachineLearning_HealthcareApp-main\venv\Lib\site-packages\joblib\numpy_pickle.py", line 658, in load obj = _unpickle(fobj, filename, mmap_mode)
File "D:\Django_MachineLearning_HealthcareApp-main\venv\Lib\site-packages\joblib\numpy_pickle.py", line 577, in _unpickle obj = unpickler.load()
File "C:\Users\vanda\AppData\Local\Programs\Python\Python311\Lib\pickle.py", line 1213, in load dispatch[key[0]](self)
File "D:\Django_MachineLearning_HealthcareApp-main\venv\Lib\site-packages\joblib\numpy_pickle.py", line 402, in load_build Unpickler.load_build(self)
File "C:\Users\vang\AppData\Local\Programs\Python\Python311\Lib\pickle.py", line 1718, in load_build setstate(state) File "sklearn\tree\_tree.pyx", line 865, in sklearn.tree._tree.Tree.setstate <source code not available>
File "sklearn\tree\_tree.pyx", line 1571, in sklearn.tree._tree._check_node_ndarray <source code not available>
Exception Type: ValueError at /diagnose/liver/report
Exception Location:sklearn\tree\_tree.pyx, line 1571, in sklearn.tree._tree._check_node_ndarray Exception Value: node array from the pickle has an incompatible dtype:
expected: {'names': ['left_child', 'right_child', 'feature', 'threshold', 'impurity', 'n_node_samples', 'weighted_n_node_samples', 'missing_go_to_left'], 'formats': ['<i8', '<i8', '<i8', '<f8', '<f8', '<i8', '<f8', 'u1'], 'offsets': [0, 8, 16, 24, 32, 40, 48, 56], 'itemsize': 64}
got : [('left_child', '<i8'), ('right_child', '<i8'), ('feature', '<i8'), ('threshold', '<f8'), ('impurity', '<f8'), ('n_node_samples', '<i8'), ('weighted_n_node_samples', '<f8')] `
Я новичок в Python и машинном обучении и буду благодарен за любую помощь и объяснения по этому вопросу.
Похоже, что вы пытаетесь распарсить модель, обученную и распикированную с помощью старых версий scikit-learn и joblib. Недавно формат моделей, распаковываемых joblib, изменился, и в результате совместимость со старыми файлами была нарушена.
Решением является простое понижение версии этих пакетов до правильной версии. Скорее всего, это scikit-learn==1.0.2 и joblib==1.1.0, как указано в требованиях, которые вы опубликовали. Возможно, вам придется понизить и версию Python, поскольку scikit-learn 1.0.2, похоже, требует python 3.10 (а не 3.11)