
前言上一篇我们用一个线性回归案例认识了机器学习的基本流程。代码本身并不长但要让它真正运行起来电脑还需要合适的 Python、NumPy 和 scikit-learn。很多初学者遇到的第一个困难并不是算法而是“明明安装过为什么还是提示找不到”“终端能运行PyCharm 却报错”。这些问题通常与 Python 环境有关。环境决定了程序使用哪个 Python 解释器、能够导入哪些库以及这些库分别是什么版本。先理解环境管理后面学习 NumPy、Pandas 和各种模型时排错会轻松许多。为什么机器学习需要独立环境一个 Python 项目不只包含自己写的代码还会依赖许多第三方库。数据处理可能使用 NumPy 和 Pandas训练模型可能使用 scikit-learn绘图可能使用 Matplotlib。它们彼此之间也有版本要求。首先不同项目可能要求不同的 Python 版本。一个旧项目也许只能在 Python 3.9 下正常运行新项目则可能使用 Python 3.11 才支持的语法。如果电脑里只有一个全局 Python升级后旧项目可能无法启动停留在旧版本又会限制新项目。其次库也会发生版本冲突。假设项目 A 依赖某个库的 1.x 版本项目 B 需要 2.x 版本把两套依赖都装进同一个环境后一次安装可能替换前一次的版本。结果是项目 B 能运行了项目 A 却突然报错。还有一种常见情况为了尝试教程不断安装新包。时间久了环境里混入大量与当前项目无关的依赖。即使程序今天能运行也很难说清它究竟依赖什么换一台电脑时便不容易复现。因此不建议把所有内容都安装到同一个环境。更稳妥的做法是让不同项目使用相互隔离的环境并记录关键依赖版本。环境并不能消除所有兼容性问题但能把问题限制在一个项目内避免一次升级影响整台电脑上的全部代码。Python、Conda、Anaconda 分别是什么这三个名称经常同时出现但它们不是同一种东西。Python是一种编程语言。我们编写的.py文件由 Python 解释器读取并执行。解释器可以理解为真正负责运行 Python 代码的程序同一台电脑上可以同时存在多个版本的解释器。Conda是环境管理和包管理工具。它可以创建相互独立的环境为每个环境选择 Python 版本还能安装、更新和移除软件包。Conda 不只管理 Python 包也能管理一些非 Python 依赖。Anaconda是面向科学计算和数据分析的集成发行版。安装 Anaconda 后通常会得到 Python、Conda、基础环境以及一批常用工具和库。它像一套已经配好的工具箱而 Conda 是工具箱中负责管理环境和包的重要工具。所以三者的关系可以概括为我们用 Python 编写和运行程序用 Conda 管理不同的 Python 环境与依赖Anaconda 则把 Python、Conda 和常用科学计算工具打包在一起降低初次配置成本。安装 Anaconda 不等于只能使用它自带的基础环境我们仍然可以通过 Conda 为不同项目创建新环境。什么是虚拟环境虚拟环境Virtual Environment是一组相对独立的运行配置。它通常拥有自己的 Python 解释器和第三方库目录。激活某个环境后终端中的python、pip或conda命令会优先指向该环境对应的位置。环境隔离解决的是“项目之间不要互相干扰”。例如房价预测项目可以使用 Python 3.11 和新版 scikit-learn另一个需要维护的旧项目可以保留 Python 3.9 和旧版依赖。两者各自运行不必反复卸载和重装。“一个项目一个环境”不是绝对规则但很适合作为入门习惯。课程中的几个简单脚本可以共用一个学习环境当项目的依赖、用途或版本要求明显不同时再为它建立独立环境。虚拟环境也是复现实验的重要基础。只保存代码还不够如果没有记录 Python 和库版本其他人可能无法得到相同结果。后续可以使用conda env export或维护requirements.txt记录依赖。环境文件不保证跨平台完全一致但比“在我电脑上可以运行”更容易检查和复现。安装 Anaconda 后的基本操作在 Windows 上可以打开 Anaconda Prompt如果 PowerShell 已完成 Conda 初始化也可以直接在 PowerShell 中执行这些命令。查看已有环境conda env list输出中会列出环境名称和所在路径名称旁边的星号表示当前激活的环境。排查问题时先运行这条命令确认自己到底在哪个环境中。创建名为ml、使用 Python 3.11 的环境conda create -n ml python3.11-n ml指定环境名python3.11指定 Python 主次版本。执行前应看清待安装的软件包和目标路径再确认操作。激活环境conda activate ml激活后命令行提示符通常会出现(ml)。此时运行python或安装包目标应当是ml环境。环境名出现在提示符中只是线索仍可用python -c import sys; print(sys.executable)核对解释器路径。退出当前环境conda deactivate这条命令会返回上一层环境或未激活状态不会删除环境及其中的文件。删除不再需要的环境conda remove -n ml --all--all表示删除该环境的全部内容。这是不可逆的清理操作必须先确认环境名正确并确保项目代码和需要保留的数据不在环境目录中。正在使用的环境应先退出再考虑删除。创建第一个机器学习环境下面以ml_demo为例。先创建环境并指定 Python 3.11conda create -n ml_demo python3.11 conda activate ml_demo激活后安装本系列前几篇会用到的库conda install numpy pandas scikit-learn matplotlib这四个库的分工不同NumPy 提供数组和数值计算能力Pandas 用于读取、整理和分析表格数据scikit-learn 提供常用机器学习算法、数据拆分工具和评估指标Matplotlib 用于绘制数据和结果图表。把这些包写在同一条安装命令中Conda 会尝试为它们寻找一组相互兼容的版本。安装完成后不要只看“成功”提示还应在该环境中实际导入一次。本文后面的检测程序就是为此准备的。如果电脑上已经有满足项目要求的环境不必为了名字一致而重复创建。环境名只是标识真正需要核对的是解释器路径、Python 版本和依赖版本。本篇代码验证使用现有的base环境没有新建或升级环境。Python 解释器是什么Python 解释器是执行代码的程序文件。在 Windows 的 Conda 环境中它通常位于类似Anaconda安装目录\envs\环境名\python.exe的位置基础环境的路径则通常直接位于 Anaconda 安装目录下。IDE集成开发环境只是帮助我们编辑和运行代码的工具。PyCharm 中的 Python Interpreter 设置决定点击“运行”时调用哪个解释器VS Code 中的“Python: Select Interpreter”也在做同样的选择。终端已经激活ml_demo并不一定代表 IDE 当前项目自动选择了它。解释器选错时最典型的现象是在 Anaconda Prompt 中可以import pandas在 PyCharm 或 VS Code 中却出现ModuleNotFoundError。包可能安装得完全正确只是安装在环境 A而 IDE 使用的是环境 B。遇到这种情况先让程序打印sys.executable再与 IDE 显示的解释器路径、终端中的where python结果比较。三者指向同一环境后再继续检查包版本比反复安装依赖更有效。第一个环境检测程序将下面代码保存为02_environment_check.py。程序不访问网络只读取当前解释器和已安装包的信息如果 Python 版本过低、包缺失或导入过程损坏会输出明确错误并以非零状态结束。检查当前 Python 解释器和机器学习入门依赖。 from __future__ import annotations import importlib import sys PACKAGES ( (NumPy, numpy), (Pandas, pandas), (Scikit-learn, sklearn), ) def read_package_versions() - dict[str, str]: 导入所需包并返回版本失败时给出容易理解的错误。 versions: dict[str, str] {} for display_name, import_name in PACKAGES: try: module importlib.import_module(import_name) except ModuleNotFoundError as exc: raise RuntimeError( f缺少 {display_name}当前解释器无法导入 {import_name!r}。 ) from exc except Exception as exc: raise RuntimeError( f{display_name} 已被找到但导入失败{exc} ) from exc version getattr(module, __version__, None) if not version: raise RuntimeError(f无法读取 {display_name} 的版本号。) versions[display_name] str(version) return versions def main() - None: 输出 Python、直接依赖和当前解释器信息。 if sys.version_info (3, 8): raise RuntimeError(本示例需要 Python 3.8 或更高版本。) versions read_package_versions() print(fPython: {sys.version.split()[0]}) print(fNumPy: {versions[NumPy]}) print(fPandas: {versions[Pandas]}) print(fScikit-learn: {versions[Scikit-learn]}) print(fInterpreter: {sys.executable}) if __name__ __main__: try: main() except RuntimeError as exc: print(f环境检查失败{exc}, filesys.stderr) sys.exit(1)在项目根目录运行python 02_environment_check.py本文已在现有 Condabase环境中实际运行程序正常结束输出如下Python: 3.11.4 NumPy: 1.24.3 Pandas: 1.5.3 Scikit-learn: 1.3.0 Interpreter: C:\Users\32981\anaconda3\python.exe版本号不是越新越好在此仅作示例。更重要的是程序使用的解释器确实属于预期环境所需库能够成功导入项目也记录了自己验证过的版本范围。常见环境问题1.ModuleNotFoundError它表示当前解释器没有找到要导入的模块。先确认模块的安装名和导入名例如安装使用scikit-learn代码使用import sklearn。然后核对sys.executable在同一解释器对应的环境中安装缺少的包不要急着在多个终端重复安装。2. 安装成功但是无法import最常见的原因是安装命令和运行命令属于不同环境。可以分别执行python -m pip --version、python -c import sys; print(sys.executable)查看路径。若路径一致仍失败再检查错误信息中是否出现动态库缺失、版本不兼容或同名本地文件遮蔽。例如项目中自己创建了pandas.py就可能干扰真正的 Pandas 导入。3. PyCharm 运行环境错误打开项目设置中的 Python Interpreter确认所选路径属于项目计划使用的 Conda 环境。修改解释器后重新运行检测程序不要仅凭状态栏名称判断。运行配置也可能单独指定解释器因此还要检查具体脚本的 Run Configuration。4. CUDA 环境混乱CUDA 是 NVIDIA 提供的并行计算平台深度学习常用它调用显卡。CUDA 驱动、工具包、深度学习框架及其编译版本之间存在兼容关系。初学传统机器学习时通常不需要先配置 CUDANumPy、Pandas 和多数 scikit-learn 入门示例使用 CPU 就能完成。以后确实需要 GPU 时应按照所用框架的官方兼容说明建立单独环境不要随意混装多个 CUDA 版本。5. 不同项目为什么不要共用环境共用环境看似节省空间却会扩大改动范围。项目 A 升级一个底层库项目 B 可能在没有修改代码的情况下失效。独立环境让升级、回退和删除都有明确边界也方便用环境配置文件交接。对于长期项目这点比少占用一些磁盘空间更重要。总结Python 是编写和运行程序的语言与解释器Conda 负责管理环境和包Anaconda 提供了包含 Python、Conda 与科学计算工具的集成发行版。虚拟环境把不同项目的解释器和依赖隔离开是控制版本冲突、定位导入错误和复现实验的重要基础。开始一个机器学习项目时可以养成三个习惯确认当前环境核对解释器路径记录依赖版本。遇到导入错误时也按这个顺序检查而不是立即升级所有软件。下一篇预告下一篇是《NumPy 入门机器学习中的数组和矩阵》。我们会从数组的形状、索引和常用计算开始理解机器学习代码为什么经常把数据组织成二维矩阵。