报错1:
Traceback (most recent call last):
File “MPL.py”, line 502, in
File “Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_multiprocessing.py”, line 45, in _freeze_support
ValueError: not enough values to unpack (expected 2, got 1)
报错2:
!!! Traceback (most recent call last):
File “MPL_0.py”, line 46, in run
File “MPL\Master.py”, line 177, in train
File “MPL\Model_interpretation.py”, line 85, in call
File “MPL\Model_interpretation.py”, line 147, in gini_perm
File “sklearn\utils_param_validation.py”, line 213, in wrapper
File “sklearn\inspection_permutation_importance.py”, line 292, in permutation_importance
File “sklearn\utils\parallel.py”, line 67, in call
File “joblib\parallel.py”, line 1854, in call
File “joblib\parallel.py”, line 1332, in _initialize_backend
File “joblib_parallel_backends.py”, line 550, in configure
File “joblib\executor.py”, line 20, in get_memmapping_executor
File “joblib\executor.py”, line 42, in get_memmapping_executor
File “joblib_memmapping_reducer.py”, line 535, in init
File “joblib_memmapping_reducer.py”, line 539, in set_current_context
File “joblib_memmapping_reducer.py”, line 564, in register_new_context
File “joblib_memmapping_reducer.py”, line 580, in register_folder_finalizer
File “joblib\externals\loky\backend\resource_tracker.py”, line 178, in register
File “joblib\externals\loky\backend\resource_tracker.py”, line 95, in ensure_running
File “joblib\externals\loky\backend\resource_tracker.py”, line 170, in _check_alive
File “joblib\externals\loky\backend\resource_tracker.py”, line 197, in _send
OSError: [Errno 22] Invalid argument !!!
这个错误信息显示了在运行一个使用 joblib
和 sklearn
(scikit-learn)的机器学习管道时遇到的问题。具体来说,错误发生在计算模型特征重要性时,更准确地说是在使用 permutation_importance
函数时。此问题似乎涉及到 joblib
在尝试使用它的内存映射(executor)功能进行并行计算时的资源跟踪器。
错误 “OSError: [Errno 22] Invalid argument” 指示了某种形式的无效参数被传递到系统调用中。这可能是由多种原因造成的,包括但不限于:
-
环境问题: 可能与你的操作系统或环境设置有关,尤其是涉及文件系统和权限的。
-
资源限制: 系统资源限制(如文件描述符数量、内存等)可能导致此错误。
-
joblib
的版本问题: 某些版本的joblib
可能与其他库不兼容或存在已知的bug。
要解决这个问题,你可以尝试以下方法:
-
环境检查: 确保你的操作系统和环境配置正确。如果你在容器(如Docker)中运行代码,确保容器配置允许足够的资源使用并正确配置了临时文件存储。
-
更新库: 确保所有相关的库,包括
joblib
和sklearn
,都更新到最新版本。不同版本之间的不兼容可能会导致奇怪的错误。pip install --upgrade joblib scikit-learn
-
资源限制: 检查你的系统资源限制,尤其是如果你在一个受限或共享资源的环境下工作。在某些系统上,你可能需要调整ulimit设置或类似的配置来增加可用资源。
-
简化问题: 尝试简化代码以隔离问题。例如,先用非常小的数据集运行代码,看看问题是否仍然存在。
-
并行设置: 如果使用
joblib
进行并行处理,尝试调整并行执行的参数,比如减少并行工作的数量。这有时可以避免资源竞争或限制导致的问题。from sklearn.inspection import permutation_importance # 减少n_jobs的数量 result = permutation_importance(model, X, y, n_jobs=1)
-
探索替代方案: 如果可能,探索替代的实现方法。虽然
permutation_importance
提供了一种方便的方式来评估特征的重要性,但也许你可以找到或实现一个更适合你特定环境的方法。
如果上述方法都不能解决问题,建议查阅 joblib
和 sklearn
的文档或社区寻求更具体的帮助,可能需要更深入的调查来解决这个问题。
**
以上两次错误是在打包pyqt5中包含QThread情况下使用pyinstaller打包后运行exe文件时遇到的,具体错误原因不详,但已经通过两个方法合并修改得以解决:
**
方法一(参考多线程打包):利用Pyinstaller打包一个完整的python项目及注意事项
方法二: 就是上面提到的,修改“并行设置”,将permutation_importance(model, X, y, n_jobs=1)中的n_jobs值改为1,这样来避免窗体外的线程触发(如图)。
上面这个图示就是我当时代码的问题位置,里面的n_jobs为2,我改为1之后,就避免了窗体外线程触发,这也是导致反复弹窗和导致内存资源不足的原因
如果你也遇到同我一样的问题,并能得到我的帮助,是我的荣幸。
最后,也请不吝赐赞,谢谢!